<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/rss/rss.xsl"?>
<rss version="2.0">
  <how_styling_rss_works style="display: none;" xml:lang="en-us" type="html">
# Styling RSS w XLS notes

XML files can include both xml-stylesheets (XSLT) and normal stylesheets (CSS).
XSLT files are transformations, and allow you to process an XML doc into an HTML doc (among other things).
In this case, it doesn't matter if we import the CSS here or via /rss/rss.xsl -- it gets applied either way.
The XSLT will output HTML for us, but the HTML content from the RSS feed (i.e., the bodies of posts) must be unescaped.
There's a special attribute (`disable-output-escaping`) which will do that.
However, we need to run some JS, too, because not every browser supports decoding html like that.

* firefox does not seem to support `disable-output-escaping="yes"`, so it requires the JS in rss.js
* chrome does support `disable-output-escaping="yes"`, so don't remove those attrs

The JS works by testing `#cometestme`, and then (if needed) looping over elements matching `[name=decodable]` and basically `el.innerHTML = el.textContent`.

Note, `disable-output-escaping="yes"` is a legacy feature from XSLT v1.0; the new way to do it is with character maps.
When I tried those, they didn't seem to work in firefox (which is when I tried the original JS).
IDK if chrome support character maps, but if it does, then that is a good update to implement. TODO I guess.

</how_styling_rss_works>
  <channel>
    <title>Max's Microblog</title>
    <description type="html" xml:lang="en-us">&lt;p&gt;Self-hosted replacement for &lt;curi.us/2380&gt;&lt;/p&gt;
</description>
    <categoryTags>
    </categoryTags>
    <link>https://xk.io/n/2380</link>
    <item>
      <title>I was so very wrong about morality and interpersonal harm.</title>
      <description type="html" xml:lang="en-us">
&lt;div class="cg-cv w-full max-w-full"&gt;
    &lt;div class="cg-cv__version"&gt;

        &lt;div class="content markdown"&gt;
          &lt;p&gt;I&amp;#39;ve read Galt&amp;#39;s speech.&lt;/p&gt;

&lt;p&gt;In &lt;a class="autolink autolink-node" href="https://xk.io/n/10017"&gt;n/10017&lt;/a&gt; (the parent of this post) I said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sometimes those projects/decisions only impact a single person, in which case they&amp;#39;re probably amoral -- that&amp;#39;s okay. Morality is about interpersonal harm, [...].&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was so very wrong about this. Morality does concern one&amp;#39;s actions, since some actions are right and some are wrong. But morality is not &lt;em&gt;about&lt;/em&gt; harm (interpersonal or otherwise), at least, no more so than it is about rocks.&lt;/p&gt;

&lt;p&gt;I am starting to understand.&lt;/p&gt;

&lt;p&gt;I&amp;#39;m not sure enough, yet, to say what morality is about -- I could try, but I don&amp;#39;t want to rush it. I want &lt;em&gt;know&lt;/em&gt; it before I &lt;em&gt;claim&lt;/em&gt; to know it. Soon, I will be sure enough.&lt;/p&gt;

&lt;p&gt;I&amp;#39;m grateful that &lt;a href="https://discuss.criticalfallibilism.com/u/JustinCEO"&gt;JustinCEO&lt;/a&gt; (on the CF forum) noticed this part of &lt;a class="autolink autolink-node" href="https://xk.io/n/10017"&gt;n/10017&lt;/a&gt; and &lt;a href="https://discuss.criticalfallibilism.com/t/whether-morality-is-primarily-about-social-interpersonal-stuff-or-about-dealing-with-reality-effectively/372"&gt;challenged me on it&lt;/a&gt;, and I&amp;#39;m grateful that he and &lt;a href="https://discuss.criticalfallibilism.com/u/ingracke"&gt;ingracke&lt;/a&gt; found it worth their time to discuss it with me.&lt;/p&gt;

&lt;p&gt;I am grateful for Ayn Rand -- her life, her works, and most of all: her mind. Right now, I&amp;#39;m grateful particularly for &lt;em&gt;Atlas Shrugged&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I have a special gratitude for &lt;a href="https://discuss.criticalfallibilism.com/u/Elliot"&gt;Elliot&lt;/a&gt;, not only for his participation in the above-linked thread (among many other things, too many to list here), but also -- and, right now, primarily -- for his labor, dedication and ideas that safeguard the closest thing I&amp;#39;ve ever known to a &lt;em&gt;sanctuary&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Why do I express my gratitude? I admire their virtues. Why am I grateful? Their virtues have allowed me to profit, and I will continue to. And I know that they have and will, too.&lt;/p&gt;

        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

</description>
      <categoryTags>
        <item>
          <text>CF</text>
        </item>
        <item>
          <text>philosophy</text>
        </item>
      </categoryTags>
      <pubDate>Tue, 18 Jan 2022 06:17:34 +0000</pubDate>
      <link>https://xk.io/n/10025</link>
      <guid>https://xk.io/n/10025</guid>
      <author>u/max</author>
      <authorLink>/a/1</authorLink>
      <nodeId>10025</nodeId>
    </item>
    <item>
      <title>sydney boulder series 2021 results archive</title>
      <description type="html" xml:lang="en-us">
&lt;div class="cg-cv w-full max-w-full"&gt;
    &lt;div class="cg-cv__version"&gt;

        &lt;div class="content markdown"&gt;
          &lt;p&gt;archiving for my own future purposes + i don&amp;#39;t know if this is replicated anywhere else on the web.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;round 1: https://web.archive.org/web/20210512150518/https://syd.blochaus.com.au/wp-content/uploads/sites/4/2021/03/sbs2021results_round01.pdf&lt;/li&gt;
&lt;li&gt;round 2: https://web.archive.org/web/20211217124144/https://syd.blochaus.com.au/wp-content/uploads/sites/4/2021/04/BHAU-61424-Sydney-Boulder-Series-Round-2-Results_DC03.pdf&lt;/li&gt;
&lt;li&gt;round 3: https://web.archive.org/web/20211217124126/https://syd.blochaus.com.au/wp-content/uploads/sites/4/2021/04/BHAU-61424-Sydney-Boulder-Series-Round-3-Results_DC02-3.pdf&lt;/li&gt;
&lt;li&gt;round 4: https://web.archive.org/web/20211217124114/https://syd.blochaus.com.au/wp-content/uploads/sites/4/2021/05/BHAU-61492-Sydney-Boulder-Series-Round-4-Results_DC02.pdf&lt;/li&gt;
&lt;li&gt;combined 1,2,3,4: https://web.archive.org/web/20211217124059/https://syd.blochaus.com.au/wp-content/uploads/sites/4/2021/05/BHAU-61424-SBS-Combined-Round-1_2_3_4-Results_DC02.pdf&lt;/li&gt;
&lt;li&gt;combined 1,2,3: https://web.archive.org/web/20211217124859/https://syd.blochaus.com.au/wp-content/uploads/sites/4/2021/04/BHAU-61424-SBS-Combined-Round-1_2_3-Results_DC02-2.pdf&lt;/li&gt;
&lt;li&gt;participant info pack: https://web.archive.org/web/20210512144534/https://syd.blochaus.com.au/wp-content/uploads/sites/4/2021/03/sbs2021info-1.pdf&lt;/li&gt;
&lt;/ul&gt;

        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

</description>
      <categoryTags>
        <item>
          <text>climbing</text>
        </item>
      </categoryTags>
      <pubDate>Fri, 17 Dec 2021 12:50:31 +0000</pubDate>
      <link>https://xk.io/n/10024</link>
      <guid>https://xk.io/n/10024</guid>
      <author>u/max</author>
      <authorLink>/a/1</authorLink>
      <nodeId>10024</nodeId>
    </item>
    <item>
      <title>ffmpeg script: mod-video-speed</title>
      <description type="html" xml:lang="en-us">
&lt;div class="cg-cv w-full max-w-full"&gt;
    &lt;div class="cg-cv__version"&gt;

        &lt;div class="content markdown"&gt;
          &lt;p&gt;this script will speed up (or slow down) video and audio via ffmpeg.&lt;/p&gt;

&lt;p&gt;put the following in e.g., &lt;code&gt;~/.local/bin/mod-video-speed&lt;/code&gt; and &lt;code&gt;chmod +x&lt;/code&gt; it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;

&lt;span class="n"&gt;this_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;this_file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;'Error: need 3 args but you provided &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\t&lt;/span&gt;&lt;span class="s"&gt;USAGE: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; INFILE OUTFILE SPEED'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\t&lt;/span&gt;&lt;span class="s"&gt;INFILE: input file (source)&lt;/span&gt;&lt;span class="se"&gt;\n\t&lt;/span&gt;&lt;span class="s"&gt;OUTFILE: output file (destination)'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s"&gt;SPEED: the speed of the output video in the format `2x` or `1.43x` -- must end with `x`'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;in_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;out_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;speed_raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;speed_pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s"&gt;'([0-9]+\.?[0-9]*)x'&lt;/span&gt;
&lt;span class="n"&gt;speed_re&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;speed_pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;speed_raw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;speed_re&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;"Error: SPEED argument did not match `&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;speed_pattern&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;`&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;Examples: `1x`, `0.5x`, `123.456x`, `99x`"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;speed_re&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;pts_speed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;speed&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;"Processing &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;in_file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; and modifying video speed to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, outputting to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;out_file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;ffmpeg_cmd_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'ffmpeg'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'-i'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'-filter_complex'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;"[0:v]setpts=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pts_speed&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;*PTS[v];[0:a]atempo=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;[a]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="s"&gt;'-map'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'[v]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'-map'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'[a]'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out_file&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;"Running ffmpeg cmd: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ffmpeg_cmd_list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ffmpeg_cmd_list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;br&gt;
license: public domain&lt;/p&gt;

        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

</description>
      <categoryTags>
        <item>
          <text>cli</text>
        </item>
        <item>
          <text>programming</text>
        </item>
        <item>
          <text>script</text>
        </item>
      </categoryTags>
      <pubDate>Wed, 08 Dec 2021 01:32:55 +0000</pubDate>
      <link>https://xk.io/n/10023</link>
      <guid>https://xk.io/n/10023</guid>
      <author>u/max</author>
      <authorLink>/a/1</authorLink>
      <nodeId>10023</nodeId>
    </item>
    <item>
      <title>self limiting lets you maintain excap</title>
      <description type="html" xml:lang="en-us">
&lt;div class="cg-cv w-full max-w-full"&gt;
    &lt;div class="cg-cv__version"&gt;

        &lt;div class="content markdown"&gt;
          &lt;p&gt;e.g., &lt;a href="https://en.wikipedia.org/wiki/Governor_(device)"&gt;governor&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;relevant to learning&lt;/li&gt;
&lt;li&gt;redlining in a controlled env can be useful for like measuring progress or something, but that shouldn&amp;#39;t be the norm&lt;/li&gt;
&lt;li&gt;by maintaining excap one can ensure there&amp;#39;s room to move -- buffer. that&amp;#39;s important while learning b/c you&amp;#39;re focusing on creating new organization of knowledge and reorganizing existing knowledge. trying to learn without excap is like trying to do tetris with no v-space. with lots of v-space tetris is manageable, but it gets hyperbolically harder as you approach the top.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;re long-running learning conflict: the more exploratory side means exhausting excap quickly (manageable when surveying, but not when trying to complete a project).&lt;/p&gt;

        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

</description>
      <categoryTags>
        <item>
          <text>learning</text>
        </item>
        <item>
          <text>excap</text>
        </item>
        <item>
          <text>learning-conflict</text>
        </item>
      </categoryTags>
      <pubDate>Thu, 25 Nov 2021 08:27:47 +0000</pubDate>
      <link>https://xk.io/n/10021</link>
      <guid>https://xk.io/n/10021</guid>
      <author>u/max</author>
      <authorLink>/a/1</authorLink>
      <nodeId>10021</nodeId>
    </item>
    <item>
      <title/>
      <description type="html" xml:lang="en-us">
&lt;div class="cg-cv w-full max-w-full"&gt;
    &lt;div class="cg-cv__version"&gt;

        &lt;div class="content markdown"&gt;
          &lt;p&gt;Of those two problem purples, I sent one on Monday evening, and one on Thursday evening.
There were 6 new purples this week (3x set on Tuesday, and 3x on Thursday). On Wednesday morning I sent the 3x new purples that were set on Tuesday, and on Thursday evening I sent the 3x purples that were set that day (and 2x of the blacks that were set that day, too).&lt;/p&gt;

        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

</description>
      <categoryTags>
        <item>
          <text>climbing</text>
        </item>
      </categoryTags>
      <pubDate>Sat, 23 Oct 2021 07:34:25 +0000</pubDate>
      <link>https://xk.io/n/10020</link>
      <guid>https://xk.io/n/10020</guid>
      <author>u/max</author>
      <authorLink>/a/1</authorLink>
      <nodeId>10020</nodeId>
    </item>
    <item>
      <title>`giphy-dl` script (in the style of youtube-dl for giphy)</title>
      <description type="html" xml:lang="en-us">
&lt;div class="cg-cv w-full max-w-full"&gt;
    &lt;div class="cg-cv__version"&gt;

        &lt;div class="content markdown"&gt;
          &lt;p&gt;make sure to &lt;code&gt;chmod +x&lt;/code&gt; it and should just work (provided you have curl and extended grep support)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="nv"&gt;FILENAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;GIPHY_CODE_OR_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FILENAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"usage: &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt; GIF_NAME GIPHY_URL_OR_CODE"&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nv"&gt;CODE_FROM_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GIPHY_CODE_OR_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | egrep &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'media\/([A-Za-z0-9]{12,})\/giphy'&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'/'&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; 2&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CODE_FROM_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nv"&gt;CODE_FROM_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$GIPHY_CODE_OR_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | egrep &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'[A-Za-z0-9]{12,}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"saving to: &lt;/span&gt;&lt;span class="nv"&gt;$FILENAME&lt;/span&gt;&lt;span class="s2"&gt;.mp4"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"dling gif from: &lt;/span&gt;&lt;span class="nv"&gt;$GIPHY_CODE_OR_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"giphy code: &lt;/span&gt;&lt;span class="nv"&gt;$CODE_FROM_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

curl &lt;span class="s2"&gt;"https://media.giphy.com/media/&lt;/span&gt;&lt;span class="nv"&gt;$CODE_FROM_URL&lt;/span&gt;&lt;span class="s2"&gt;/giphy.mp4"&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FILENAME&lt;/span&gt;&lt;span class="s2"&gt;.mp4"&lt;/span&gt;

xdg-open &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FILENAME&lt;/span&gt;&lt;span class="s2"&gt;.mp4"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

</description>
      <categoryTags>
        <item>
          <text>programming</text>
        </item>
        <item>
          <text>script</text>
        </item>
        <item>
          <text>cli</text>
        </item>
      </categoryTags>
      <pubDate>Thu, 21 Oct 2021 00:41:37 +0000</pubDate>
      <link>https://xk.io/n/10019</link>
      <guid>https://xk.io/n/10019</guid>
      <author>u/max</author>
      <authorLink>/a/1</authorLink>
      <nodeId>10019</nodeId>
    </item>
    <item>
      <title>I made a video of 43 attempts at a particular boulder, played over the top of eachother at the same time.</title>
      <description type="html" xml:lang="en-us">
&lt;div class="cg-cv w-full max-w-full"&gt;
    &lt;div class="cg-cv__version"&gt;

        &lt;div class="content markdown"&gt;
          &lt;p&gt;Video: &lt;a href="https://youtu.be/Vr6X2Z6Ag2w"&gt;https://youtu.be/Vr6X2Z6Ag2w&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source code: &lt;a href="https://github.com/XertroV/43-attempts/"&gt;https://github.com/XertroV/43-attempts/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The method is documented in the repo readme.&lt;/p&gt;

        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

</description>
      <categoryTags>
        <item>
          <text>programming</text>
        </item>
        <item>
          <text>climbing</text>
        </item>
      </categoryTags>
      <pubDate>Sat, 16 Oct 2021 09:26:29 +0000</pubDate>
      <link>https://xk.io/n/10018</link>
      <guid>https://xk.io/n/10018</guid>
      <author>u/max</author>
      <authorLink>/a/1</authorLink>
      <nodeId>10018</nodeId>
    </item>
    <item>
      <title/>
      <description type="html" xml:lang="en-us">
&lt;div class="cg-cv w-full max-w-full"&gt;
    &lt;div class="cg-cv__version"&gt;

        &lt;div class="content markdown"&gt;
          &lt;p&gt;I sent just 1 of the remaining 3 purples on Friday.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The current goal I&amp;#39;ve settled on is to send every grade 3 climb (in the gym) in a week&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;WRT this goal, I could go again this weekend, but I think it&amp;#39;d be better to rest.
That means I&amp;#39;ll fail the goal.
What happens wrt the goal then?&lt;/p&gt;

&lt;p&gt;The purpose of the goal was to build consistency and mastery of a particular grade.
Or maybe, &lt;em&gt;that&amp;#39;s what the goal aligned with&lt;/em&gt; -- it wasn&amp;#39;t, in and of itself, to master the grade.
Rather, it was a breakpoint that I &lt;em&gt;chose&lt;/em&gt; which aligned with master.
If I didn&amp;#39;t meet it, then it&amp;#39;s a criticism of the idea that I&amp;#39;ve mastered that grade.
Mastering a grade isn&amp;#39;t a quality I&amp;#39;d lose unless I stopped climbing, though (or had some injury or something).
So what does failing this goal really mean?&lt;/p&gt;

&lt;p&gt;Well, I&amp;#39;m not &lt;em&gt;yet&lt;/em&gt; inconsistent when it comes to purples (since I had been sending them all prior to lockdown) -- so more time&amp;#39;s needed to determine that.
It &lt;em&gt;is&lt;/em&gt; a criticism of mastery though; it means there are still bottlenecks at this grade.&lt;/p&gt;

&lt;p&gt;The reason I chose the original parameters that I did -- 1 week to send every new purple for a full cycle -- was that 1 week allowed for reasonable buffer, and a full cycle meant ~25 new climbs.
New routes are set Tuesday-Thursday, so 4 days of the week were &lt;em&gt;the period of stability before the next wave.&lt;/em&gt;
Once those new climbs were set, a failure to send one that was taken down is a decisive criticism of both consistency and mastery.
Also, sending all the new routes (before the next wave was set) meant that I&amp;#39;d have &lt;em&gt;excess capacity&lt;/em&gt; to try new climbs, or work on bottlenecks.&lt;/p&gt;

&lt;p&gt;Even without sending every purple, I still have excess capacity -- different climbs use different resources.
And since I shouldn&amp;#39;t &lt;em&gt;lose&lt;/em&gt; the ability to send-every-purple if I keep improving, why would I ever stop?&lt;/p&gt;

&lt;p&gt;I think mb goals like this are sometimes motivating (they have been to me) but there&amp;#39;s a problem if you get invested in them.
That&amp;#39;s because failing a goal is, like, something to take personally.
But that isn&amp;#39;t what these sort of goals are really about.
A goal like this is a regular opportunity to take a benchmark -- and mb find a weakness in your abilities that you didn&amp;#39;t know was there.
Knowing about that is a good thing!
If you don&amp;#39;t know it&amp;#39;s there (or if you know and ignore it) then it becomes &lt;em&gt;a thing you can&amp;#39;t rely on.&lt;/em&gt;
That&amp;#39;s a problem if it ever needs to be &lt;em&gt;foundational&lt;/em&gt; to other, more advanced knowledge.
(Like, it&amp;#39;s a dependency.)&lt;/p&gt;

&lt;p&gt;This is consistent (and I think related) with a different idea: achievement of goals is pointless if you&amp;#39;re not challenged.
There&amp;#39;s no point in me setting a goal if I know it&amp;#39;s already too easy.
The achievement is hollow.&lt;/p&gt;

&lt;p&gt;Moreover, if there &lt;em&gt;are always&lt;/em&gt; &lt;strong&gt;meaningful&lt;/strong&gt; goals to choose -- &lt;strong&gt;meaningful&lt;/strong&gt; problems to solve -- then choosing goals that are foregone conclusions &lt;em&gt;must be meaningless.&lt;/em&gt;
My guess is that -- for some projects -- it is moral to choose meaningful goals, and immoral to deliberately choose meaningless goals when meaningful ones could be chosen instead.
(Sometimes those projects/decisions only impact a single person, in which case they&amp;#39;re probably amoral -- that&amp;#39;s okay. Morality is about interpersonal harm, and people are free to live their own lives (wrt themselves) how they wish. People are also under no obligation to maximize morality -- just to not act &lt;em&gt;immorally&lt;/em&gt; -- so provided there&amp;#39;s no malice, most goals are okay.)&lt;/p&gt;

&lt;p&gt;Getting back to purples: I think &lt;em&gt;new climbs&lt;/em&gt; is an important breakpoint, so I&amp;#39;m going to monitor that going forward.
I&amp;#39;m also thinking I&amp;#39;ll adopt the send-every-purple-every-week goal again, indefinitely -- it&amp;#39;s a useful warning sign of bottlenecks, and means there&amp;#39;s some variance in my excess capacity (which I can use to my advantage).
Maybe a good breakpoint to re-evaluate at is some level of consistency with blacks, like sending &amp;gt;50% each week.
That seems reasonable atm.&lt;/p&gt;

        &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="cg-cv__version cg-cv__version--addendum"&gt;
        &lt;div class="cg-cv__head"&gt;
            &lt;span class="cg-cv__by"&gt;
              Addendum by &lt;a href="/a/1"&gt;u/max&lt;/a&gt; after
              &lt;span class="has-tooltip"&gt;
                &lt;span class="tooltip"&gt;2021-10-23 03:59:29 UTC&lt;/span&gt;
                7 days
              &lt;/span&gt;
            &lt;/span&gt;
        &lt;/div&gt;

        &lt;div class="content markdown"&gt;
          &lt;p&gt;There is a discussion about the morality stuff at the end of this post on the CF forum: &lt;a href="https://discuss.criticalfallibilism.com/t/whether-morality-is-primarily-about-social-interpersonal-stuff-or-about-dealing-with-reality-effectively/372"&gt;https://discuss.criticalfallibilism.com/t/whether-morality-is-primarily-about-social-interpersonal-stuff-or-about-dealing-with-reality-effectively/372&lt;/a&gt;&lt;/p&gt;

        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

</description>
      <categoryTags>
        <item>
          <text>climbing</text>
        </item>
      </categoryTags>
      <pubDate>Sat, 16 Oct 2021 09:16:50 +0000</pubDate>
      <link>https://xk.io/n/10017</link>
      <guid>https://xk.io/n/10017</guid>
      <author>u/max</author>
      <authorLink>/a/1</authorLink>
      <nodeId>10017</nodeId>
    </item>
    <item>
      <title/>
      <description type="html" xml:lang="en-us">
&lt;div class="cg-cv w-full max-w-full"&gt;
    &lt;div class="cg-cv__version"&gt;

        &lt;div class="content markdown"&gt;
          &lt;p&gt;Correction: I sent 13 / 25 purples (grade 3) on Monday.&lt;/p&gt;

&lt;p&gt;I sent 9 of the remaining 12 this morning. so only 3 left for Friday morning -- lots of buffer!&lt;/p&gt;

&lt;p&gt;I also sent my first grade 5 (yellow)! &lt;a href="https://www.instagram.com/p/CU8YxTrBmeU/"&gt;https://www.instagram.com/p/CU8YxTrBmeU/&lt;/a&gt;&lt;/p&gt;

        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

</description>
      <categoryTags>
        <item>
          <text>climbing</text>
        </item>
      </categoryTags>
      <pubDate>Tue, 12 Oct 2021 22:43:58 +0000</pubDate>
      <link>https://xk.io/n/10016</link>
      <guid>https://xk.io/n/10016</guid>
      <author>u/max</author>
      <authorLink>/a/1</authorLink>
      <nodeId>10016</nodeId>
    </item>
    <item>
      <title>climbing goals - gyms reopen</title>
      <description type="html" xml:lang="en-us">
&lt;div class="cg-cv w-full max-w-full"&gt;
    &lt;div class="cg-cv__version"&gt;

        &lt;div class="content markdown"&gt;
          &lt;p&gt;Climbing gyms (and everything else) have just reopened (for the vaccinated) in Sydney, following a ~3.5 month lockdown.
Now that climbing is frequent and regular again, I&amp;#39;ve been reconsidering climbing goals.&lt;/p&gt;

&lt;p&gt;Before lockdown, my goal was to send every new grade 3&lt;sup id="fnref1"&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt; (out of 6) problem, every week, for 6 weeks (I&amp;#39;d done 5 weeks when lockdown started).
6 weeks is a full rotation, so achieving this means that I would have &lt;em&gt;consistently&lt;/em&gt; been able to project any purple in 2-3 sessions.
The purpose of this goal was to emphasise &lt;em&gt;consistency over results&lt;/em&gt; (better to do be capable of &lt;em&gt;any&lt;/em&gt; grade 3 problem than some grade 3 and some grade 4).&lt;/p&gt;

&lt;p&gt;The current goal I&amp;#39;ve settled on is to send every grade 3 climb (in the gym) in a week -- there&amp;#39;s about 24 or so (give or take depending on what gets set).
I sent 10 this morning (over about 2hrs).
I don&amp;#39;t think I&amp;#39;d have been able to do that if I hadn&amp;#39;t done some outdoor climbing during lockdown, tho.
So far, so good.
I have been going through them methodically, with a few exceptions (picking ones I thought I could do towards the end of the session, for example).
So far no grade 3 has been particularly challenging, though crowd-beta has helped a bit.
Major bottleneck atm (session-to-session) is probably endurance -- going to monitor that and take corrective action if it doesn&amp;#39;t improve this week.&lt;/p&gt;

&lt;div class="footnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;the problems are color-graded, so grade 3 of 6 is purple, and 4 of 6 is black. there&amp;#39;s no precise conversion to V-grades, but I guess purple is V2-5 and black is V4-? (6 or 7, maybe).&amp;nbsp;&lt;a href="#fnref1"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/div&gt;

        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

</description>
      <categoryTags>
        <item>
          <text>climbing</text>
        </item>
      </categoryTags>
      <pubDate>Mon, 11 Oct 2021 10:25:53 +0000</pubDate>
      <link>https://xk.io/n/10015</link>
      <guid>https://xk.io/n/10015</guid>
      <author>u/max</author>
      <authorLink>/a/1</authorLink>
      <nodeId>10015</nodeId>
    </item>
    <item>
      <title/>
      <description type="html" xml:lang="en-us">
&lt;div class="cg-cv w-full max-w-full"&gt;
    &lt;div class="cg-cv__version"&gt;

        &lt;div class="content markdown"&gt;
          &lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=2GVO3u7TR8I&amp;list=PLyqNe7EpSQmkLZqf1UY4J4FopM-tBkocC&amp;index=11"&gt;Sent my first outdoor V3 on Sunday&lt;/a&gt;&lt;/p&gt;

        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

</description>
      <categoryTags>
        <item>
          <text>climbing</text>
        </item>
      </categoryTags>
      <pubDate>Tue, 21 Sep 2021 11:07:22 +0000</pubDate>
      <link>https://xk.io/n/10013</link>
      <guid>https://xk.io/n/10013</guid>
      <author>u/max</author>
      <authorLink>/a/1</authorLink>
      <nodeId>10013</nodeId>
    </item>
    <item>
      <title>*Freedom* and *Universality* are linked</title>
      <description type="html" xml:lang="en-us">
&lt;div class="cg-cv w-full max-w-full"&gt;
    &lt;div class="cg-cv__version"&gt;

        &lt;div class="content markdown"&gt;
          &lt;p&gt;I think freedom and universality must have some deep connection.&lt;/p&gt;

&lt;p&gt;If you have the &lt;em&gt;freedom&lt;/em&gt; to do something, that means -- wrt that context -- you can do whatever you like. You&amp;#39;re &lt;em&gt;unconstrained&lt;/em&gt;; that aspect &lt;em&gt;cannot&lt;/em&gt; (or at least should not) be a &lt;em&gt;bottleneck&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That gives you some unboundedness wrt method, or content, or whatever the freedom relates to. Freedom of speech removes a bound on speech. Freedom of thought removes a bound on thought.&lt;/p&gt;

&lt;p&gt;Freedom &lt;em&gt;enables&lt;/em&gt; universality; and without certain freedoms, you cannot have certain universalities.&lt;/p&gt;

&lt;p&gt;I thought that freedom and thinking were like orthogonal; both necessary for philosophy and good life, but neither sufficient. Now I suspect there&amp;#39;s more there than I realized.&lt;/p&gt;

        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

</description>
      <categoryTags>
        <item>
          <text>CF</text>
        </item>
        <item>
          <text>philosophy</text>
        </item>
      </categoryTags>
      <pubDate>Tue, 21 Sep 2021 11:05:35 +0000</pubDate>
      <link>https://xk.io/n/10012</link>
      <guid>https://xk.io/n/10012</guid>
      <author>u/max</author>
      <authorLink>/a/1</authorLink>
      <nodeId>10012</nodeId>
    </item>
    <item>
      <title>Louis Rossmann Vids</title>
      <description type="html" xml:lang="en-us">
&lt;div class="cg-cv w-full max-w-full"&gt;
    &lt;div class="cg-cv__version"&gt;

        &lt;div class="content markdown"&gt;
          &lt;p&gt;I like a lot of &lt;a href="https://www.youtube.com/channel/UCl2mFZoRqjw_ELax4Yisf6w"&gt;Louis Rossmann&amp;#39;s videos&lt;/a&gt; and his thoughts.&lt;/p&gt;

&lt;p&gt;This topic is for discussing and collecting good ones. Here&amp;#39;s two; one recent, one old&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;(2021-09) &lt;a href="https://www.youtube.com/watch?v=3VPk-ojOCp4"&gt;Rossmann vid on covid+society; seems good&lt;/a&gt; - perspective on being a business owner, masks, lockdowns, etc.&lt;/li&gt;
&lt;li&gt;(2013-07) &lt;a href="https://www.youtube.com/watch?v=MyZnKjFWrxo"&gt;The $30,000 pocket dial&lt;/a&gt; - a story from Rossmann&amp;#39;s early days&lt;/li&gt;
&lt;/ul&gt;

        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

</description>
      <categoryTags>
        <item>
          <text>list</text>
        </item>
      </categoryTags>
      <pubDate>Sun, 19 Sep 2021 23:02:40 +0000</pubDate>
      <link>https://xk.io/n/10011</link>
      <guid>https://xk.io/n/10011</guid>
      <author>u/max</author>
      <authorLink>/a/1</authorLink>
      <nodeId>10011</nodeId>
    </item>
    <item>
      <title>Optimal encoding of permutations</title>
      <description type="html" xml:lang="en-us">
&lt;div class="cg-cv w-full max-w-full"&gt;
    &lt;div class="cg-cv__version"&gt;

        &lt;div class="content markdown"&gt;
          &lt;p&gt;This is a repost of &lt;a href="https://www.reddit.com/r/AskComputerScience/comments/6gxa3e/how_to_describe_a_permutation_of_a_list_in_as_few/"&gt;a post I made to reddit&lt;/a&gt; on June 13th 2017. I found it again recently and wanted to document it here.&lt;/p&gt;

&lt;h4 id="the-problem-whats-the-optimal-encoding"&gt;The Problem (what&amp;#39;s the optimal encoding?)&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;You have a known list of n candidates on a ballot. In the act of voting, the voter must number each candidate from 1 to n, using each number once. The voter is thus describing a transformation on the list of candidates into a particular permutation. What is the minimum number of bits needed to exactly describe any order, and the method?&lt;/p&gt;

&lt;p&gt;My naive approach is to count (from the left) the number of &amp;#39;jumps&amp;#39; each candidate must take to arrive in their ranked position &lt;u&gt;skipping any previously ranked candidates&lt;/u&gt;.&lt;/p&gt;

&lt;p&gt;So if we had 3 candidates: &lt;code&gt;cs = [&amp;#39;c1&amp;#39;, &amp;#39;c2&amp;#39;, &amp;#39;c3&amp;#39;]&lt;/code&gt; and a list of ranks &lt;code&gt;rs = [2, 3, 1]&lt;/code&gt; we&amp;#39;d do this (where &lt;code&gt;zip(cs, rs)&lt;/code&gt; matches candidates to ranks):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First, &lt;code&gt;c1&lt;/code&gt; should be in the 2nd position, which is 1 move from the far left open spot. Since &lt;code&gt;c1&lt;/code&gt; &lt;u&gt;could&lt;/u&gt; move 2 positions though we need to use 2 bits. Record &lt;code&gt;01&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Second, &amp;#39;c2&amp;#39; needs to be in 3rd position, which is also 1 move from the far left open spot (since we skip over the filled position from step 1). Because &amp;#39;c2&amp;#39; could &lt;u&gt;only&lt;/u&gt; move a maximum of 1 jump, we only need 1 bit: record &lt;code&gt;1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Third, &amp;#39;c3&amp;#39; trivially fits into the last space, so we need 0 bits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our final result is &lt;code&gt;011&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To decode the permutation, take N bits in the sequence &lt;code&gt;ceil(log(2, n)), ceil(log(2, n-1)), ceil(log(2, n-2)), ..., ceil(log(2, 2))&lt;/code&gt;, which is [2, 1, 0] in our case. Use those bits (in this case &lt;code&gt;[&amp;#39;01&amp;#39;, &amp;#39;1&amp;#39;]&lt;/code&gt;) to move each candidate into open spots.&lt;/p&gt;

&lt;p&gt;By numerical analysis this method very closely fits O(n Log n) space complexity. (&lt;code&gt;total_bits = 0.89 * n * log(2, n)&lt;/code&gt; seems to describe the pattern very closely).&lt;/p&gt;

&lt;p&gt;The exact number of bits used will be &lt;code&gt;t = Sigma(i=2, n)( ceil(log(2, i)) )&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It occurs to me that simply listing the positions is &lt;code&gt;O(n log n)&lt;/code&gt; too, but the exact number of bits required is &lt;code&gt;t = ceil(log(2, n))*n&lt;/code&gt; which is more than my method.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Reddit user &lt;a href="https://www.reddit.com/user/tilrman"&gt;tilrman&lt;/a&gt; &lt;a href="https://www.reddit.com/r/AskComputerScience/comments/6gxa3e/how_to_describe_a_permutation_of_a_list_in_as_few/ditwrht/"&gt;pointed out&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;With n candidates, there are P(n) = n! permutations. Each voter selects one of these permutations, so a vote can be represented by an integer [0, n!-1].&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;2 more comments follow in that branch before I posted my soln&lt;/p&gt;

&lt;h4 id="my-solution"&gt;My Solution&lt;/h4&gt;

&lt;p&gt;clarification: in &lt;code&gt;&amp;quot;base factorial&amp;quot;&lt;/code&gt; I&amp;#39;m using &lt;q&gt;base&lt;/q&gt; in the same way as &lt;q&gt;base 10&lt;/q&gt; (our number system) or &lt;q&gt;base 2&lt;/q&gt; (binary numbers).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Basic idea is to use &lt;a href="https://en.wikipedia.org/wiki/Factorial_number_system"&gt;factoradics&lt;/a&gt; - sort of like &lt;q&gt;base factorial&lt;/q&gt; where the k&lt;sup&gt;th&lt;/sup&gt; integer is in [0, k] and to convert back to base 10 you&amp;#39;d multiply it by &lt;code&gt;k!&lt;/code&gt;. e.g.: &lt;code&gt;3210&lt;/code&gt; is &lt;code&gt;0*1! + 1*2! + 2*3! + 3*4!&lt;/code&gt;. Also &lt;code&gt;4321 + 1 = 10000&lt;/code&gt; which is &lt;code&gt;1*5! = 120&lt;/code&gt; in base 10.&lt;/p&gt;

&lt;p&gt;These numbers uniquely enumerate permutations for a list of n unique elements and allow one to &amp;#39;read&amp;#39; the permutation from the number. e.g. &lt;code&gt;[a, b, c, d, e]&lt;/code&gt; in permutation &lt;code&gt;2310&lt;/code&gt; leads to &lt;code&gt;[d, c, a, e, b]&lt;/code&gt;. Put &lt;code&gt;a&lt;/code&gt; in 2+1th free slot, put &lt;code&gt;b&lt;/code&gt; in 3+1th free spot, put &lt;code&gt;c&lt;/code&gt; in 1+1th free slot, put &lt;code&gt;d&lt;/code&gt; in 0+1th free slot, put &lt;code&gt;e&lt;/code&gt; in the last spot.&lt;/p&gt;

&lt;p&gt;This means we can map all integers in [0, n!-1] to a unique permutation (via modulo-ing and subtracting successive factorials), and back again quickly and efficiently (though arbitrarily sized integers (e.g. in python or haskell) make this much easier than small integers - &lt;code&gt;150!&lt;/code&gt; is like 110 bytes long as a raw integer)&lt;/p&gt;

&lt;p&gt;Finally a sanity check: for a list of k elements we have a maximum count of &lt;code&gt;(k-1) (k-2) ... (k-k+1)&lt;/code&gt; where each bracketed expression is a digit. If we add 1 we end up with 1 followed by k zeros, which corresponds to &lt;code&gt;k!&lt;/code&gt;, and so our maximum integer is 1 less at &lt;code&gt;k!-1&lt;/code&gt; which is what we expect :)&lt;/p&gt;
&lt;/blockquote&gt;

        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

</description>
      <categoryTags>
        <item>
          <text>historical</text>
        </item>
        <item>
          <text>maths</text>
        </item>
        <item>
          <text>programming</text>
        </item>
      </categoryTags>
      <pubDate>Thu, 16 Sep 2021 05:42:44 +0000</pubDate>
      <link>https://xk.io/n/10010</link>
      <guid>https://xk.io/n/10010</guid>
      <author>u/max</author>
      <authorLink>/a/1</authorLink>
      <nodeId>10010</nodeId>
    </item>
    <item>
      <title>climbing update (28 aug)</title>
      <description type="html" xml:lang="en-us">
&lt;div class="cg-cv w-full max-w-full"&gt;
    &lt;div class="cg-cv__version"&gt;

        &lt;div class="content markdown"&gt;
          &lt;p&gt;I started doing outdoor bouldering about a week ago (we&amp;#39;ve been in lockdown for the last ~2 months). I found an unclimbed wall that&amp;#39;s close enough to home (for current exercise-distance restrictions) and have been working on that recently. I&amp;#39;ve posted some videos of this to my &lt;a href="https://www.youtube.com/playlist?list=PLyqNe7EpSQmkLZqf1UY4J4FopM-tBkocC&amp;index=5"&gt;max&amp;#39;s bouldering&lt;/a&gt; playlist on YT. I&amp;#39;ve also documented the wall on theCrag: https://www.thecrag.com/climbing/australia/new-south-wales-and-act/sydney-metropolitan/area/5156697663&lt;/p&gt;

&lt;p&gt;Before lockdown I was 4-5 weeks in to my &amp;#39;send all the purples&amp;#39; goal at my gym (purples are bouldering routes of a particular grade) -- my gym resets a few sections of wall every week and has a 6 week cycle.&lt;/p&gt;

        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

</description>
      <categoryTags>
        <item>
          <text>climbing</text>
        </item>
      </categoryTags>
      <pubDate>Sat, 28 Aug 2021 09:07:52 +0000</pubDate>
      <link>https://xk.io/n/10003</link>
      <guid>https://xk.io/n/10003</guid>
      <author>u/max</author>
      <authorLink>/a/1</authorLink>
      <nodeId>10003</nodeId>
    </item>
  </channel>
</rss>
