<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>Tad Website - Tad Blog</title>
      <link>https://tad-lispy.com/blog/</link>
      <description>A personal website and blog of Tad Lispy.</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://tad-lispy.com/blog/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Fri, 21 Mar 2025 00:00:00 +0000</lastBuildDate>
      <item>
          <title>The plan for a co-op</title>
          <pubDate>Fri, 21 Mar 2025 00:00:00 +0000</pubDate>
          <author>Tad Lispy</author>
          <link>https://tad-lispy.com/blog/2025-03-21-the-plan-for-a-co-op/</link>
          <guid>https://tad-lispy.com/blog/2025-03-21-the-plan-for-a-co-op/</guid>
          <description xml:base="https://tad-lispy.com/blog/2025-03-21-the-plan-for-a-co-op/">&lt;p&gt;A hopeful sci-fi story in which I invite you to join a network of smart and kind professionals, who support one another both in their work and personally 🧑‍🚀 We want to set up a co-operative sometime within the next 12 months and conquer the world with our kindness within 10 years. What brings us together and guides our efforts is our shared desire for fairness and freedom, and our concern about dependence on big tech oligopolies 👾 That&#x27;s why we want to support businesses in a transition to free software and European digital services.&lt;&#x2F;p&gt;</description>
      </item>
      <item>
          <title>Guiding principles for a co-op</title>
          <pubDate>Thu, 20 Mar 2025 00:00:00 +0000</pubDate>
          <author>Tad Lispy</author>
          <link>https://tad-lispy.com/blog/2025-03-20-guiding-principles-for-a-co-op/</link>
          <guid>https://tad-lispy.com/blog/2025-03-20-guiding-principles-for-a-co-op/</guid>
          <description xml:base="https://tad-lispy.com/blog/2025-03-20-guiding-principles-for-a-co-op/">&lt;p&gt;So it really seems like &lt;a href=&quot;&#x2F;blog&#x2F;the-plan-for-a-co-op&#x2F;&quot;&gt;I am starting a business&lt;&#x2F;a&gt; with a bunch of beautiful strangers. What a fantastic feeling! The kind and sometimes weird interactions I had with you over the past two weeks inspired me to get to work early every morning. And now that we are going to work together, we need to figure out how to do it.&lt;&#x2F;p&gt;</description>
      </item>
      <item>
          <title>Tad Co-op</title>
          <pubDate>Sun, 16 Mar 2025 00:00:00 +0000</pubDate>
          <author>Tad Lispy</author>
          <link>https://tad-lispy.com/blog/2025-03-16-tad-co-op-and-manifesto/</link>
          <guid>https://tad-lispy.com/blog/2025-03-16-tad-co-op-and-manifesto/</guid>
          <description xml:base="https://tad-lispy.com/blog/2025-03-16-tad-co-op-and-manifesto/">&lt;p&gt;I wrote the following manifesto as a guide to how and with whom I want to work. It&#x27;s my personal statement, and I have no right to impose it on anyone else, but if you significantly disagree with any part of it, then we probably shouldn&#x27;t work together. That is unless you can change my mind first.&lt;&#x2F;p&gt;</description>
      </item>
      <item>
          <title>Why is `this` so terrible</title>
          <pubDate>Thu, 16 Jan 2020 00:00:00 +0000</pubDate>
          <author>Tad Lispy</author>
          <link>https://tad-lispy.com/blog/2020-01-16-why-is-this-so-terrible/</link>
          <guid>https://tad-lispy.com/blog/2020-01-16-why-is-this-so-terrible/</guid>
          <description xml:base="https://tad-lispy.com/blog/2020-01-16-why-is-this-so-terrible/">&lt;p&gt;Recently at a meetup in Utrecht I gave a short presentation: &lt;em&gt;Elements of Functional Programming for React.js Developers&lt;&#x2F;em&gt;. See &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tad-lispy.gitlab.io&#x2F;why-is-this-so-terrible&#x2F;&quot;&gt;the slides&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Shape Up by Ryan Singer from Basecamp</title>
          <pubDate>Tue, 27 Aug 2019 00:00:00 +0000</pubDate>
          <author>Tad Lispy</author>
          <link>https://tad-lispy.com/blog/2019-08-27-shape-up-by-ryan-singer/</link>
          <guid>https://tad-lispy.com/blog/2019-08-27-shape-up-by-ryan-singer/</guid>
          <description xml:base="https://tad-lispy.com/blog/2019-08-27-shape-up-by-ryan-singer/">&lt;blockquote&gt;
&lt;p&gt;2024 Update: To large extent &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;software.garden&#x2F;&quot;&gt;Software Garden&lt;&#x2F;a&gt; was an attempt to implement the ideas from Singer&#x27;s book, but adapted to working with clients.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Oh my! This book is the best. I want to work like that! You can &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;basecamp.com&#x2F;shapeup&quot;&gt;read the book here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Is there an equivalent of `cd -` for `cp` or `mv`?</title>
          <pubDate>Sun, 31 Mar 2019 00:00:00 +0000</pubDate>
          <author>Tad Lispy</author>
          <link>https://tad-lispy.com/blog/2019-03-31-move-files-to-previously-visited-directory/</link>
          <guid>https://tad-lispy.com/blog/2019-03-31-move-files-to-previously-visited-directory/</guid>
          <description xml:base="https://tad-lispy.com/blog/2019-03-31-move-files-to-previously-visited-directory/">&lt;p&gt;Perhaps you know that in Unix shell you can go back and forth between current and previous directory using handy shortcut for the &lt;code&gt;cd&lt;&#x2F;code&gt; command:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; -&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;But this is &lt;code&gt;cd&lt;&#x2F;code&gt; specific. Is there a way to copy or move a file from current directory to the previous? Turns out there is. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;superuser.com&#x2F;q&#x2F;1419624&#x2F;195460&quot;&gt;Read more&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Using `Promise.race` in Node.js to enforce a timeout</title>
          <pubDate>Fri, 04 Aug 2017 00:00:00 +0000</pubDate>
          <author>Tad Lispy</author>
          <link>https://tad-lispy.com/blog/2017-08-04-node-promise-race-timeout/</link>
          <guid>https://tad-lispy.com/blog/2017-08-04-node-promise-race-timeout/</guid>
          <description xml:base="https://tad-lispy.com/blog/2017-08-04-node-promise-race-timeout/">&lt;p&gt;It is a little bit more tricky than this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; task&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; Promise&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;resolve&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; reject&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  setTimeout&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;resolve&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 5000&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;done&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; timeout&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; Promise&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;resolve&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; reject&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  setTimeout&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;reject&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 100&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;timed out&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;Promise&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;race&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;    timeout&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;    task&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;then&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;log&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;catch&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;error&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If you run this, you will find out that the process terminates only after both promises are done (i.e. after around 5 seconds):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ time node src&#x2F;race.js &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;timed out&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;node src&#x2F;race.js  0,36s user 0,03s system 7% cpu 5,370 total&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In fact, if one of them is never resolved (and that&#x27;s exactly what we expect, otherwise we would not introduce a timeout here), the process will hang forever. Seems like `Promise.race` is not doing a proper cleanup. The `task` promise remains pending (event though it&#x27;s eventual value will never propagate through the chain). This makes the runtime wait for it&#x27;s resolution before it terminates.&lt;&#x2F;p&gt;
&lt;p&gt;Unfortunately I don&#x27;t know of any elegant workaround for this. Currently I simply call `process.exit` somewhere down the chain:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;Promise&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;race&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;    timeout&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;    task&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;then&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;log&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;catch&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;error&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;then&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;process&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;exit&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In my book it&#x27;s not an elegant solution.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Passing `undefined` to a JavaScript promise</title>
          <pubDate>Fri, 04 Aug 2017 00:00:00 +0000</pubDate>
          <author>Tad Lispy</author>
          <link>https://tad-lispy.com/blog/2017-08-04-promise-then-undefined/</link>
          <guid>https://tad-lispy.com/blog/2017-08-04-promise-then-undefined/</guid>
          <description xml:base="https://tad-lispy.com/blog/2017-08-04-promise-then-undefined/">&lt;p&gt;Consider this simple snippet:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;Promise&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;resolve&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;JavaScript, why are you doing this to me?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;then&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;logg&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;catch&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;error&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Note that &lt;code&gt;console.logg&lt;&#x2F;code&gt; is &lt;code&gt;undefined&lt;&#x2F;code&gt;. What will be printed?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Nothing&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The promise will silently resolve to the value of&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;JavaScript, why are you doing this to me?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Which is a good question. I think it&#x27;s because it hates me.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s obviously a developer&#x27;s mistake. My first thought was that introducing type system (like Flow) would solve this - and it would. But why isn&#x27;t &lt;code&gt;then&lt;&#x2F;code&gt; method of a &lt;code&gt;Promise&lt;&#x2F;code&gt; just throwing a type error as soon as anything other than &lt;code&gt;function&lt;&#x2F;code&gt; is passed to it?&lt;&#x2F;p&gt;
&lt;p&gt;This leads to silent and hard to spot bugs. Unfortunately in JS community there is a strong attitude of ignoring the errors and going on as if nothing ever happened.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Weird AWS region bug</title>
          <pubDate>Fri, 04 Aug 2017 00:00:00 +0000</pubDate>
          <author>Tad Lispy</author>
          <link>https://tad-lispy.com/blog/2017-08-04-weird-aws-region-bug/</link>
          <guid>https://tad-lispy.com/blog/2017-08-04-weird-aws-region-bug/</guid>
          <description xml:base="https://tad-lispy.com/blog/2017-08-04-weird-aws-region-bug/">&lt;p&gt;I&#x27;ve been fighting a weird error coming from AWS SDK for Node.js:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ConfigError: Missing region in config&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I was setting the region like that:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; Setup AWS SDK&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; AWS&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;aws-sdk&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;AWS&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;config&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;update&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  region&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; aws_region&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Turns out that despite the fact that AWS is a singleton, it&#x27;s config passed to service instances is not.&lt;&#x2F;p&gt;
&lt;p&gt;What is a &lt;em&gt;service instance&lt;&#x2F;em&gt;. E.g. this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; AWS&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;SQS&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In other words, SQS instance will have it&#x27;s config baked in, and subsequent changes to AWS.config won&#x27;t affect it.&lt;&#x2F;p&gt;
&lt;p&gt;So the order of execution is important. Consider:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;AWS&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;config&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;update&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span&gt; region&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; A&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; sqs&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; AWS&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;SQS&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;AWS&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;config&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;update&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span&gt; region&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; B&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;sqs&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;sendMessage&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;...&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; the region from the sqs perspective is A!&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</description>
      </item>
      <item>
          <title>Running Facebook&#x27;s Flow in an Alpine Node Container</title>
          <pubDate>Fri, 21 Jul 2017 00:00:00 +0000</pubDate>
          <author>Tad Lispy</author>
          <link>https://tad-lispy.com/blog/2017-07-21-facebook-flow-in-an-alpine-node-docker-container/</link>
          <guid>https://tad-lispy.com/blog/2017-07-21-facebook-flow-in-an-alpine-node-docker-container/</guid>
          <description xml:base="https://tad-lispy.com/blog/2017-07-21-facebook-flow-in-an-alpine-node-docker-container/">&lt;p&gt;Create a &lt;code&gt;Dockerfile&lt;&#x2F;code&gt; and an &lt;code&gt;npmrc&lt;&#x2F;code&gt; template&lt;&#x2F;p&gt;
&lt;p&gt;Creating the Dockerfile was more chalanging than expected. To make flow work in Alpine we need &lt;code&gt;glibc&lt;&#x2F;code&gt;. To get glibc from GitHub we need &lt;code&gt;wget&lt;&#x2F;code&gt; with SSL support (and ca-certs).&lt;&#x2F;p&gt;
&lt;p&gt;All in all this &lt;code&gt;Dockerfile&lt;&#x2F;code&gt; works:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;docker&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;FROM&lt;&#x2F;span&gt;&lt;span&gt; node:8-alpine&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; Install bash (required by scripts&#x2F;*) and GNU wget&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;RUN&lt;&#x2F;span&gt;&lt;span&gt; apk update \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;amp;&amp;amp; apk add \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    bash \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    wget \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ca-certificates&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; Install glibc comaptibility for alpine (required by flow)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;RUN&lt;&#x2F;span&gt;&lt;span&gt; wget \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    --quiet \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    --output-document=&#x2F;etc&#x2F;apk&#x2F;keys&#x2F;sgerrand.rsa.pub \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    https:&#x2F;&#x2F;raw.githubusercontent.com&#x2F;sgerrand&#x2F;alpine-pkg-glibc&#x2F;master&#x2F;sgerrand.rsa.pub \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;amp;&amp;amp; wget \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    --quiet \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    https:&#x2F;&#x2F;github.com&#x2F;sgerrand&#x2F;alpine-pkg-glibc&#x2F;releases&#x2F;download&#x2F;2.25-r0&#x2F;glibc-2.25-r0.apk \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;amp;&amp;amp; apk add glibc-2.25-r0.apk&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; Slim the image by removing APK cache&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;RUN&lt;&#x2F;span&gt;&lt;span&gt; rm -rf &#x2F;var&#x2F;cache&#x2F;apk&#x2F;*&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;USER&lt;&#x2F;span&gt;&lt;span&gt; node&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; This build time argument should be passed by build script.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; See common.sh, jenkins-build.sh and .npmrc files&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;ARG&lt;&#x2F;span&gt;&lt;span&gt; npm_token&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;WORKDIR&lt;&#x2F;span&gt;&lt;span&gt;                               &#x2F;home&#x2F;node&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span&gt; package.json                     .&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span&gt; package-lock.json                .&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span&gt; .flowconfig                      .&#x2F;.flowconfig&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span&gt; npmrc.template                   .&#x2F;.npmrc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span&gt; src                              .&#x2F;src&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span&gt; scripts                          .&#x2F;scripts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;RUN&lt;&#x2F;span&gt;&lt;span&gt; npm install&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;RUN&lt;&#x2F;span&gt;&lt;span&gt; rm .&#x2F;.npmrc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;CMD&lt;&#x2F;span&gt;&lt;span&gt; npm start&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Sources:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;facebook&#x2F;flow&#x2F;issues&#x2F;3649&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;facebook&#x2F;flow&#x2F;issues&#x2F;3649&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;google&#x2F;cadvisor&#x2F;issues&#x2F;1131&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;google&#x2F;cadvisor&#x2F;issues&#x2F;1131&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>How to Setup SSH Key limited to Creating a Tunnel</title>
          <pubDate>Thu, 20 Jul 2017 00:00:00 +0000</pubDate>
          <author>Tad Lispy</author>
          <link>https://tad-lispy.com/blog/2017-07-20-how-to-setup-ssh-key-limited-to-creating-a-tunnel/</link>
          <guid>https://tad-lispy.com/blog/2017-07-20-how-to-setup-ssh-key-limited-to-creating-a-tunnel/</guid>
          <description xml:base="https://tad-lispy.com/blog/2017-07-20-how-to-setup-ssh-key-limited-to-creating-a-tunnel/">&lt;p&gt;For a given key I was intending to prevent &lt;strong&gt;any&lt;&#x2F;strong&gt; interaction &lt;strong&gt;except&lt;&#x2F;strong&gt; for starting an SSH tunnel to a particular local port. Turns out that for each key in &lt;code&gt;~&#x2F;.ssh&#x2F;authorized_keys&lt;&#x2F;code&gt; you can add so called &lt;em&gt;login options&lt;&#x2F;em&gt;, by preppending them to the key, like that:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;option=&amp;quot;value&amp;quot;,option-without-value,another-option &amp;lt;KEY ...&amp;gt; &amp;lt;COMMENT&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This combination of options seem to do the trick:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;command=&amp;quot;&amp;quot;,restrict,port-forwarding,permitopen=&amp;quot;localhost:80&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Let me go through each of them individually:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;command=&quot;&quot;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;disallows any command to be executed using this key&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;restrict&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Disable all options, such as TTY allocation, port forwarding, agent forwarding, user-rc, and X11 forwarding all at once.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;port-forwarding&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Enables TCP port forwarding, but see below.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;permitopen=&quot;localhost:80&quot;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Limits TCP port forwarding to local port &lt;code&gt;80&lt;&#x2F;code&gt;. That&#x27;s the &lt;strong&gt;only&lt;&#x2F;strong&gt; thing this key should allow.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;So in total it&#x27;s:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;command=&amp;quot;&amp;quot;,restrict,port-forwarding,permitopen=&amp;quot;localhost:80&amp;quot; ssh-rsa AAAAB3NzaC1yc2EAAA[...]3c7rmJT5&#x2F; tunnel@a.example.com&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Make sure it&#x27;s all in one line and there are is no whitespace between the options.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve been able to figure this out mainly by reading &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikibooks.org&#x2F;wiki&#x2F;OpenSSH&#x2F;Client_Configuration_Files&quot;&gt;Client Configuration Files chapter of OpenSSH WikiBook&lt;&#x2F;a&gt;, so the majority of credit goes to it&#x27;s authors (Lars Noodén et al.). Missing part was &lt;code&gt;port-forwarding&lt;&#x2F;code&gt; - without it forwarding is forbidden even though &lt;code&gt;permitopen&lt;&#x2F;code&gt; would suggest otherwise.&lt;&#x2F;p&gt;
&lt;p&gt;Here is some more background: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;superuser.com&#x2F;a&#x2F;1231232&#x2F;195460&quot;&gt;https:&#x2F;&#x2F;superuser.com&#x2F;a&#x2F;1231232&#x2F;195460&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Managing access to private NPM repositories</title>
          <pubDate>Thu, 29 Jun 2017 00:00:00 +0000</pubDate>
          <author>Tad Lispy</author>
          <link>https://tad-lispy.com/blog/2017-06-29-managing-access-to-npm-private-packages/</link>
          <guid>https://tad-lispy.com/blog/2017-06-29-managing-access-to-npm-private-packages/</guid>
          <description xml:base="https://tad-lispy.com/blog/2017-06-29-managing-access-to-npm-private-packages/">&lt;p&gt;Make private package accessible to members of deployment team from command line:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; access&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; grant&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; read-only&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; your-organisation:deployment&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; @your-organisation&#x2F;your-package&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</description>
      </item>
      <item>
          <title>How to Test if a Given Value is a React.js Component</title>
          <pubDate>Wed, 29 Jul 2015 00:00:00 +0000</pubDate>
          <author>Tad Lispy</author>
          <link>https://tad-lispy.com/blog/2015-07-29-react-component-testing/</link>
          <guid>https://tad-lispy.com/blog/2015-07-29-react-component-testing/</guid>
          <description xml:base="https://tad-lispy.com/blog/2015-07-29-react-component-testing/">&lt;blockquote&gt;
&lt;p&gt;2024 Update: Some links to external content are unfortunately outdated. The content in this post doesn&#x27;t seem relevant to me anymore, except for archival reasons, so I&#x27;m not going to update those broken links.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;It may seem trivial, but it&#x27;s a bit tricky to test for that. The documentation for React&#x27;s Test Utils&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#broken-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; is lacking examples (as of the time of writing).&lt;&#x2F;p&gt;
&lt;p&gt;By comparing it with Virtual DOM glossary&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#broken-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; one can assume that instantiating it with new keyword and then checking with &lt;code&gt;TestUtils.isCompositeComponent&lt;&#x2F;code&gt; is a way to go.&lt;&#x2F;p&gt;
&lt;p&gt;That&#x27;s how I do it in CoffeScript:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;coffee&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;it&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;is a react component&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt; -&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;  #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; ReactComponents can be instantiated with new keyword for test purposes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;  #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; See https:&#x2F;&#x2F;facebook.github.io&#x2F;react&#x2F;docs&#x2F;glossary.html#react-components&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  expect &lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;TestUtils&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;isCompositeComponent&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; CheckboxSelect&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;to&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;be&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;ok&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;broken-1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;&#x2F;sup&gt;
&lt;p&gt;Broken link to https:&#x2F;&#x2F;facebook.github.io&#x2F;react&#x2F;docs&#x2F;test-utils.html&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;broken-2&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;2&lt;&#x2F;sup&gt;
&lt;p&gt;Broken link to https:&#x2F;&#x2F;facebook.github.io&#x2F;react&#x2F;docs&#x2F;glossary.html#react-components&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
</description>
      </item>
      <item>
          <title>An idea for a blog</title>
          <pubDate>Sun, 12 Jul 2015 00:00:00 +0000</pubDate>
          <author>Tad Lispy</author>
          <link>https://tad-lispy.com/blog/2015-07-12-an-idea-for-a-blog/</link>
          <guid>https://tad-lispy.com/blog/2015-07-12-an-idea-for-a-blog/</guid>
          <description xml:base="https://tad-lispy.com/blog/2015-07-12-an-idea-for-a-blog/">&lt;p&gt;Obviously I have this, or some other idea for a long while. Now it&#x27;s time to pinpoint it.&lt;&#x2F;p&gt;
&lt;p&gt;The blog will be about web craftsmanship. I want to write on regular basis (no less then once a week) about things I&#x27;m learning in this field.&lt;&#x2F;p&gt;
&lt;p&gt;I want to create and maintain my own engine for this. The reasons are:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;it will be a nice playground development,&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;I will have everything my way.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;I will be able to write about developing my blog on my blog.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;technical-considerations&quot;&gt;Technical considerations&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Isomorphic app&lt;&#x2F;p&gt;
&lt;p&gt;Rendered to static files on build time. Raw markdown and metadata should be hosted along compiled HTML for client side routing and rendering.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Adhere to &lt;em&gt;progressive enhancement&lt;&#x2F;em&gt; principles&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Git integrated&lt;&#x2F;p&gt;
&lt;p&gt;Both engine and content should be version controlled. There should be two separate repos. Eventually I want to post and update via &lt;code&gt;git push&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;As much metadata as possible should be gathered from repo. This would ideally include:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Publication date (i.e. the &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;11327535&#x2F;finding-the-date-time-a-file-appeared-in-a-git-branch&quot;&gt;date given post was merged to master&lt;&#x2F;a&gt;?)&lt;&#x2F;li&gt;
&lt;li&gt;Editing history&lt;&#x2F;li&gt;
&lt;li&gt;Authors (if there were changes merged from pull requests)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;nice-to-have-features&quot;&gt;Nice to have features&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Twitter integration&lt;&#x2F;p&gt;
&lt;p&gt;Display my tweets and retweets in a feed among blog posts.&lt;&#x2F;p&gt;
&lt;p&gt;Post updates to Twitter automatically.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Stack Exchange integration&lt;&#x2F;p&gt;
&lt;p&gt;Display my Stack Exchange activity (questions and answers) in a feed among blog posts.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>How to Install NPM Packages Written in CoffeeScript from a Git Repo</title>
          <pubDate>Tue, 28 Apr 2015 00:00:00 +0000</pubDate>
          <author>Tad Lispy</author>
          <link>https://tad-lispy.com/blog/2015-04-28-npm-install-coffee-from-git/</link>
          <guid>https://tad-lispy.com/blog/2015-04-28-npm-install-coffee-from-git/</guid>
          <description xml:base="https://tad-lispy.com/blog/2015-04-28-npm-install-coffee-from-git/">&lt;blockquote&gt;
&lt;p&gt;2024 Update: Some links to external content are unfortunately outdated. The content in this post doesn&#x27;t seem relevant to me anymore, except for archival reasons, so I&#x27;m not going to update those broken links.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;2017 update: Working on this problem eventually lead me to create &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lzrski&#x2F;npm-git-install&quot;&gt;npm-git-install&lt;&#x2F;a&gt; helper. The program should not be needed since the introduction of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.npmjs.com&#x2F;cli&#x2F;v10&#x2F;using-npm&#x2F;scripts#prepare-and-prepublish&quot;&gt;the &lt;code&gt;prepare&lt;&#x2F;code&gt; NPM script&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;IDEA: Use npm &lt;code&gt;install&lt;&#x2F;code&gt; script with value same as &lt;code&gt;prepublish&lt;&#x2F;code&gt;, but this would have to be changed before publishing to registry.&lt;&#x2F;p&gt;
&lt;p&gt;It is said to be an anti-pattern&lt;&#x2F;p&gt;
&lt;p&gt;See &lt;del&gt;https:&#x2F;&#x2F;docs.npmjs.com&#x2F;misc&#x2F;scripts#common-uses&lt;&#x2F;del&gt; (broken link)&lt;&#x2F;p&gt;
&lt;p&gt;An issue by isaacs &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;npm&#x2F;npm&#x2F;issues&#x2F;3055&quot;&gt;run &lt;code&gt;prepublish&lt;&#x2F;code&gt; for git url packages&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Installing it from a directory (&lt;code&gt;..&#x2F;package&#x2F;&lt;&#x2F;code&gt;) runs &lt;code&gt;prepublish&lt;&#x2F;code&gt;. WTF?&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;IDEA: Make a gitinstall gulp task, which will:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;npm install (to get dev dependencies)&lt;&#x2F;li&gt;
&lt;li&gt;run build task&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Would it be possible use .npmignore then?&lt;&#x2F;p&gt;
&lt;p&gt;The problem is that gulp is in dev-dependencies. So npm install has to be in install script, which seems a little strange.&lt;&#x2F;p&gt;
&lt;p&gt;Result: endless loop (npm install triggers install script; obviously).&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;NOTE: Installing from local directory triggers prepublish&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Maybe installing from git should work like that:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;clone to tmp dir&lt;&#x2F;li&gt;
&lt;li&gt;install from tmp dir&lt;&#x2F;li&gt;
&lt;li&gt;remove tmp dir&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;This doesn&#x27;t seem very hard to do.&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
