<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[This Old Code - Medium]]></title>
        <description><![CDATA[Working on Open Source, one project at a time. - Medium]]></description>
        <link>https://medium.com/this-old-code?source=rss----c84a34dd891c---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>This Old Code - Medium</title>
            <link>https://medium.com/this-old-code?source=rss----c84a34dd891c---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 21:14:55 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/this-old-code" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Installing PHP 7.2 using Homebrew on OSX using OpenSSL and not Apple's Secure Transport]]></title>
            <link>https://medium.com/this-old-code/installing-php-7-2-bc779b23dce8?source=rss----c84a34dd891c---4</link>
            <guid isPermaLink="false">https://medium.com/p/bc779b23dce8</guid>
            <category><![CDATA[homebrew]]></category>
            <category><![CDATA[php]]></category>
            <category><![CDATA[ssl]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[ftfy]]></category>
            <dc:creator><![CDATA[Dossy Shiobara]]></dc:creator>
            <pubDate>Sat, 02 Jun 2018 21:03:54 GMT</pubDate>
            <atom:updated>2018-11-07T06:03:57.526Z</atom:updated>
            <content:encoded><![CDATA[<h3>Installing PHP 7.2 using Homebrew on OSX using OpenSSL and not Apple’s Secure Transport for PHP’s curl module</h3><p>There’s a few very good reasons why we may want to build <a href="http://php.net/manual/en/book.curl.php">PHP’s curl module</a> using OpenSSL and not Apple’s Secure Transport, such as needing to <a href="https://github.com/curl/curl/issues/283">use PEM format client certificates</a> or <a href="https://daniel.haxx.se/blog/2016/08/01/curl-and-h2-on-mac/">wanting to use HTTP/2</a>, for example.</p><p>Up until <a href="https://brew.sh/2018/01/19/homebrew-1.5.0/">March 2018</a>, this was pretty straightforward to do: you would brew install curl --with-openssl and brew install php72 --with-homebrew-curl and that was it. Slightly inconvenient, but easy. 👍</p><p>In their quest to “improve” things by rendering inconvenient but easy things into the downright impossible, the Homebrew maintainers moved the PHP formula from the <a href="https://github.com/Homebrew/homebrew-php/commit/8771c68f3ddfee62d9e97177449010c2968f91d1">homebrew-php</a> tap to the <a href="https://github.com/Homebrew/homebrew-core/commit/4dbb4adf8ebdccc947c2f20f08e8e3ca06c023a3">homebrew-core</a> tap.</p><p>“Sounds harmless,” you might think? Sure, except they didn’t simply move the formula as-is. They changed it in significant ways, including removing the ability to control how PHP’s modules are built. 😡 This means you no longer have the ability to control whether PHP’s curl module is built against the system-provided libcurl library which uses Apple’s Secure Transport, or Homebrew’s libcurl library built against OpenSSL, depending on your preference or needs.</p><p>This effectively prevented me from being able to upgrade to a newer PHP using Homebrew’s PHP formula. 😢</p><p>Checking StackOverflow, I’m apparently <a href="https://stackoverflow.com/questions/50273638/php-7-2-curl-with-openssl-not-securetransport">not</a> <a href="https://stackoverflow.com/questions/50259893/home-brew-php-7-2-5-install-with-curl">alone</a>. Since I had a personal need to get PHP 7 installed using this new version of the Homebrew PHP formula on my dev environment, I needed to solve this problem for myself.</p><p><strong>Good news:</strong> I have a working solution. Let me tell you the story of my people …</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2FBU8H7pea0K1DW%2Ftwitter%2Fiframe&amp;url=https%3A%2F%2Fmedia.giphy.com%2Fmedia%2FBU8H7pea0K1DW%2Fgiphy.gif&amp;image=https%3A%2F%2Fmedia.giphy.com%2Fmedia%2FBU8H7pea0K1DW%2Fgiphy.gif&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=giphy" width="435" height="313" frameborder="0" scrolling="no"><a href="https://medium.com/media/48a4d914466bee73a3ae3bfce35cf522/href">https://medium.com/media/48a4d914466bee73a3ae3bfce35cf522/href</a></iframe><p>I’ve modified the php.rb formula to build PHP against the Homebrew-installed libcurl which you’ll still need to install with brew install curl --with-openssl after installing Homebrew’s OpenSSL with brew install openssl.</p><p><a href="https://github.com/dossy/homebrew-core/commit/b75fe286f79e2b89548c5ed1bbe1958313c5c103">build against homebrew curl, openssl · dossy/homebrew-core@b75fe28</a></p><p>To apply it, do this:</p><pre>$ cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core<br>$ curl -s https://github.com/dossy/homebrew-core/commit/b75fe286f79e2b89548c5ed1bbe1958313c5c103.patch | patch -p1</pre><p>Depending on what changes the Homebrew folks make to the php.rb formula between now and when you go to apply this change, it may or may not apply cleanly. I may update the patch periodically, if my change doesn’t make it into the upstream official repository.</p><blockquote><strong>Updated 2018–11–07:</strong> I’ve created an updated patch against Homebrew’s current php.rb which is for PHP 7.2.11. Use this instead:</blockquote><pre>$ curl -s https://github.com/dossy/homebrew-core/commit/d0681b61.patch | patch -p1</pre><p>Once you’ve applied the patch, you’ll need to force an install from source rather than using the precompiled “bottled” binary:</p><pre>$ brew install php --build-from-source</pre><p>Depending on your system, this could take a while. But, it should work. When it’s done, you can confirm whether it’s using the correct libcurl and openssl with this command:</p><pre>$ /usr/local/bin/php -r &quot;var_dump(phpversion(), curl_version()[&#39;ssl_version&#39;]);&quot;<br>string(5) &quot;7.2.6&quot;<br>string(14) &quot;OpenSSL/1.0.2o&quot;</pre><p>If it didn’t work, instead of OpenSSL/X.Y.Zn you’ll see SecureTransport or LibreSSL. If that happens, something went wrong. Crying at this point wouldn’t be inappropriate nor a terrible idea. Once you’ve regained your composure, double-check your work and if you still can’t get it to work, let me know and maybe I can help you.</p><p>For those of you who experienced success, congratulations! I hope this was helpful and saves you a bunch of time and aggravation. I know I sure would have appreciated it …</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bc779b23dce8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/this-old-code/installing-php-7-2-bc779b23dce8">Installing PHP 7.2 using Homebrew on OSX using OpenSSL and not Apple&#39;s Secure Transport</a> was originally published in <a href="https://medium.com/this-old-code">This Old Code</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How using boolean values in SQL can lead to unintended results]]></title>
            <link>https://medium.com/this-old-code/how-using-boolean-values-in-sql-can-lead-to-unintended-results-c117e005134f?source=rss----c84a34dd891c---4</link>
            <guid isPermaLink="false">https://medium.com/p/c117e005134f</guid>
            <category><![CDATA[php]]></category>
            <category><![CDATA[mysql]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[Dossy Shiobara]]></dc:creator>
            <pubDate>Mon, 26 Feb 2018 17:53:11 GMT</pubDate>
            <atom:updated>2018-02-26T17:36:21.167Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*OPdNX28bfkAnzSxPm5FMBg.png" /><figcaption>We all trip over the small details, sometimes…</figcaption></figure><p>First, let’s start with a quick quiz. Given the following SQL and pseudocode, how many rows do you expect will be affected?</p><pre>/* Using MySQL 5.6.23 */</pre><pre>CREATE TABLE t (<br>    x VARCHAR(32),<br>    y INT<br>);</pre><pre>INSERT INTO t (x, y)<br>VALUES (&#39;a&#39;, 1), (&#39;b&#39;, 2), (&#39;c&#39;, 3);</pre><pre>$value = &#39;b&#39;;</pre><pre>$statement = $db-&gt;prepare(&#39;UPDATE t SET y = 123 WHERE x = :value&#39;)<br>$statement-&gt;bind(&#39;:value&#39;, $value)<br>$statement-&gt;execute()</pre><p>If you answered 1, then congratulations: you’re right. Easy, right?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/225/1*GzWUhNAPbdE6tO13IUV67g.png" /><figcaption>Someone call Staples, ‘cuz that was easy.</figcaption></figure><h3>So, what’s the issue with using boolean values?</h3><p>Using the same SQL, but with this slight change in the pseudocode, how many rows do you expect will be affected?</p><pre>$value = false;</pre><pre>$statement = $db-&gt;prepare(&#39;UPDATE t SET y = 123 WHERE x = :value&#39;)<br>$statement-&gt;bind(&#39;:value&#39;, $value)<br>$statement-&gt;execute()</pre><p>If you answered 0, then you, like me, are wrong.</p><p>“But, <em>no row</em> in the table has a value for x that equals false, so how can this be,” you ask?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*dp50K4uQArrKP-B4WVX1OA.png" /><figcaption>Tell me about it, Debbie. I had no idea! (The <a href="https://991.com/Buy/ProductInformation.aspx?StockNumber=17476">song</a> is actually completely unrelated.)</figcaption></figure><h3>Here is where you, and I, learn how <em>wrong</em> we are.</h3><p>The answer is: <a href="https://en.wikipedia.org/wiki/Type_conversion">type coercion</a> (aka “implicit type conversion”).</p><p>More specifically, it has to do with MySQL’s <a href="https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html">BOOLEAN</a> type, and how it’s implemented:</p><blockquote><a href="https://dev.mysql.com/doc/refman/5.7/en/integer-types.html">BOOL</a>, <a href="https://dev.mysql.com/doc/refman/5.7/en/integer-types.html">BOOLEAN</a></blockquote><blockquote>These types are synonyms for <a href="https://dev.mysql.com/doc/refman/5.7/en/integer-types.html">TINYINT(1)</a>. A value of zero is considered false. Nonzero values are considered true:</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/482/1*5oVa6CO5ukzJHCrV8A1DnQ.png" /><figcaption>wat</figcaption></figure><h3>Are you thoroughly confused now? Good, you should be. That was a mouthful of gibberish.</h3><p>While the documentation is perfectly clear and succinctly explains the situation, it might be non-obvious as to why we observed what we saw.</p><p>(Oh, and don’t get me started about how “gibberish” is spelled wrong based on how it’s commonly pronounced: it should be spelled “jibberish.” But, anyway…)</p><p>Under the hood, MySQL implements BOOLEAN types as TINYINT(1) values, and more specifically, where TRUE is 1 and FALSE is 0. Okay, fine, but still, no value of x in our table was equal to 0 … or, were they? 😈</p><p>This is where type coercion comes into play: when comparing a string, in this case, our x which is defined as VARCHAR(32), with a BOOLEAN value, in other words, a TINYINT(1) value of 0, exactly what happens? Let’s see:</p><pre>mysql&gt; SELECT CAST(&#39;a&#39; AS UNSIGNED) AS a,<br>              CAST(&#39;b&#39; AS UNSIGNED) AS b,<br>              CAST(&#39;c&#39; AS UNSIGNED) AS c;<br>+---+---+---+<br>| a | b | c |<br>+---+---+---+<br>| 0 | 0 | 0 |<br>+---+---+---+<br>1 row in set, 3 warnings (0.04 sec)</pre><pre>mysql&gt; show warnings;<br>+---------+------+----------------------------------------+<br>| Level   | Code | Message                                |<br>+---------+------+----------------------------------------+<br>| Warning | 1292 | Truncated incorrect INTEGER value: &#39;a&#39; |<br>| Warning | 1292 | Truncated incorrect INTEGER value: &#39;b&#39; |<br>| Warning | 1292 | Truncated incorrect INTEGER value: &#39;c&#39; |<br>+---------+------+----------------------------------------+<br>3 rows in set (0.04 sec)</pre><p>Oh, damn. MySQL, in its effort to be helpful and “user friendly,” will quietly, but not silently, as evidenced by the warnings, transform our string values into integer 0 values. So, how many rows would be affected? <em>All 3 of them!</em></p><pre>mysql&gt; UPDATE t SET y = 123 WHERE x = FALSE;<br>Query OK, 3 rows affected, 3 warnings (0.00 sec)<br>Rows matched: 3  Changed: 3  Warnings: 3</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/316/1*VCzAn94iLR7-Tmr3jpvOOA.png" /><figcaption>You said it, Kendrick. DAMN.</figcaption></figure><p>Interestingly enough, if we had made a similar “mistake” and used NULL instead of FALSE, the outcome would have been more in line with our expectations:</p><pre>mysql&gt; INSERT INTO t (x, y) VALUES (NULL, 4);<br>Query OK, 1 row affected (0.00 sec)</pre><pre>mysql&gt; UPDATE t SET y = 123 WHERE x = NULL;<br>Query OK, 0 rows affected (0.00 sec)<br>Rows matched: 0  Changed: 0  Warnings: 0</pre><p>This is because, in SQL, nothing “equals” NULL. Values can <em>be</em> NULL, but NULL is never equal to anything, even NULL. To compare values to NULL, SQL provides the IS NULL and IS NOT NULL operators for this very purpose:</p><pre>mysql&gt; UPDATE t SET y = 123 WHERE x IS NULL;<br>Query OK, 1 row affected (0.00 sec)<br>Rows matched: 1  Changed: 1  Warnings: 0</pre><pre>mysql&gt; UPDATE t SET y = 123 WHERE x IS NOT NULL;<br>Query OK, 0 rows affected (0.00 sec)<br>Rows matched: 3  Changed: 0  Warnings: 0</pre><h3>Conclusion</h3><p>Even in strongly typed languages like SQL, conveniences like type coercion can create dangerous pitfalls. Imagine if that was a DELETE statement instead of an UPDATE statement — poof, there go all your rows where the key’s resulting type conversion results in a 0 value.</p><p>Have you been hurt by accidentally using a boolean value in a MySQL query and affected more rows than you intended? Share your stories in the comments below. It’s okay, you’re not alone.</p><p>Did you learn something from this post? Share it with your friends and colleagues who might benefit from it, too!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c117e005134f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/this-old-code/how-using-boolean-values-in-sql-can-lead-to-unintended-results-c117e005134f">How using boolean values in SQL can lead to unintended results</a> was originally published in <a href="https://medium.com/this-old-code">This Old Code</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[JavaScript unit test framework weigh-in]]></title>
            <link>https://medium.com/this-old-code/javascript-unit-test-framework-weigh-in-b042b552e381?source=rss----c84a34dd891c---4</link>
            <guid isPermaLink="false">https://medium.com/p/b042b552e381</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[npm]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[open-source]]></category>
            <dc:creator><![CDATA[Dossy Shiobara]]></dc:creator>
            <pubDate>Fri, 06 Oct 2017 21:22:29 GMT</pubDate>
            <atom:updated>2017-10-06T21:22:29.166Z</atom:updated>
            <content:encoded><![CDATA[<p>It really annoys me how the Node.js community seems to pretty much ignore, or at least accept, how kitchen-sinky everything is, as in, packages have dependency trees that include “everything and the kitchen sink.” It’s not uncommon for a package to have 50 MB worth of dependencies. Compare that to the source for the <a href="https://www.kernel.org/pub/linux/kernel/v1.0/">Linux 1.0 kernel</a> at only 5.7 MB, and that’s the source code for a whole OS kernel’s worth of functionality.</p><p>I’ve been examining different unit testing framework options, and I decided to do a basic weigh-in: see how much each one “weighs” in bytes with all their dependencies. I chose five of the more popular options out there today: <a href="http://jasmine.github.io/">Jasmine</a>, <a href="https://facebook.github.io/jest/">Jest</a>, <a href="https://karma-runner.github.io/">Karma</a>, <a href="https://mochajs.org/">Mocha</a>, <a href="https://github.com/tapjs/node-tap">TAP</a>.</p><p>Here’s how I weighed them:</p><pre>$ <strong>mkdir weigh-in</strong><br>$ <strong>cd weigh-in/</strong></pre><pre>$ <strong>npm_config_prefix=$(pwd) npm ls -g</strong><br>/Users/dossy/Desktop/weigh-in/lib<br>└── (empty)</pre><pre>$ <strong>npm init -y</strong><br>Wrote to /Users/dossy/Desktop/weigh-in/package.json:</pre><pre>{<br>  &quot;name&quot;: &quot;weigh-in&quot;,<br>  &quot;version&quot;: &quot;1.0.0&quot;,<br>  &quot;main&quot;: &quot;index.js&quot;,<br>  &quot;scripts&quot;: {<br>    &quot;test&quot;: &quot;echo \&quot;Error: no test specified\&quot; &amp;&amp; exit 1&quot;<br>  },<br>  &quot;keywords&quot;: [],<br>  &quot;author&quot;: &quot;&quot;,<br>  &quot;license&quot;: &quot;ISC&quot;,<br>  &quot;description&quot;: &quot;&quot;<br>}</pre><pre>$ <strong>for i in jasmine jest karma mocha tap; do npm_config_prefix=$(pwd) npm i $i --no-save --no-package-lock; mv node_modules node_modules.$i; done<br></strong>npm WARN weigh-in@1.0.0 No description<br>npm WARN weigh-in@1.0.0 No repository field.</pre><pre>+ jasmine@2.8.0<br>added 14 packages in 1.057s</pre><pre>&gt; fsevents@1.1.2 install /Users/dossy/Desktop/weigh-in/node_modules/fsevents<br>&gt; node install</pre><pre>[fsevents] Success: &quot;/Users/dossy/Desktop/weigh-in/node_modules/fsevents/lib/binding/Release/node-v57-darwin-x64/fse.node&quot; already installed<br>Pass --update-binary to reinstall or --build-from-source to recompile<br>npm WARN weigh-in@1.0.0 No description<br>npm WARN weigh-in@1.0.0 No repository field.</pre><pre>+ jest@21.2.1<br>added 486 packages in 40.777s</pre><pre>&gt; fsevents@1.1.2 install /Users/dossy/Desktop/weigh-in/node_modules/fsevents<br>&gt; node install</pre><pre>[fsevents] Success: &quot;/Users/dossy/Desktop/weigh-in/node_modules/fsevents/lib/binding/Release/node-v57-darwin-x64/fse.node&quot; already installed<br>Pass --update-binary to reinstall or --build-from-source to recompile<br>npm WARN weigh-in@1.0.0 No description<br>npm WARN weigh-in@1.0.0 No repository field.</pre><pre>+ karma@1.7.1<br>added 296 packages in 16.364s<br>npm WARN weigh-in@1.0.0 No description<br>npm WARN weigh-in@1.0.0 No repository field.</pre><pre>+ mocha@4.0.1<br>added 24 packages in 1.99s<br>npm WARN weigh-in@1.0.0 No description<br>npm WARN weigh-in@1.0.0 No repository field.</pre><pre>+ tap@10.7.2<br>added 338 packages in 17.905s</pre><p>Any guesses as to how much each of these packages weigh? See if your guesses line up with their actual weights:</p><pre>$ <strong>paste -d &#39;#&#39; &lt;(du -s node_modules.*) &lt;(du -sh node_modules.*) | sort -nk 1,1 | cut -d&#39;#&#39; -f2</strong><br>856K node_modules.jasmine<br>2.2M node_modules.mocha<br> 34M node_modules.tap<br> 35M node_modules.karma<br> 54M node_modules.jest</pre><p>Jasmine’s the lightest at 856 KB followed by Mocha at 2.2 MB, and Jest is the heaviest at 54 MB, with TAP and Karma a close second at 34 MB and 35 MB.</p><p>Obviously, weight is only one dimension to consider. But, I hope more people start making it part of their selection process. I know choosing between packages that provide similar functionality and capability, I will certainly favor the one that’s lighter.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b042b552e381" width="1" height="1" alt=""><hr><p><a href="https://medium.com/this-old-code/javascript-unit-test-framework-weigh-in-b042b552e381">JavaScript unit test framework weigh-in</a> was originally published in <a href="https://medium.com/this-old-code">This Old Code</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[There’s a first time for everything]]></title>
            <link>https://medium.com/this-old-code/theres-a-first-time-for-everything-9d754249c8e5?source=rss----c84a34dd891c---4</link>
            <guid isPermaLink="false">https://medium.com/p/9d754249c8e5</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[live-streaming]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[streaming]]></category>
            <category><![CDATA[twitch]]></category>
            <dc:creator><![CDATA[Dossy Shiobara]]></dc:creator>
            <pubDate>Wed, 04 Oct 2017 04:24:41 GMT</pubDate>
            <atom:updated>2017-10-04T04:24:32.656Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/901/1*6SV0PIW2NtuXcvSy9Y1w8g.png" /><figcaption>It was actually a lot of fun!</figcaption></figure><p>So, earlier this evening I said I was going to start streaming, and rather than let procrastination get in the way, I decided to just pull the trigger before I changed my mind: I did <a href="https://www.twitch.tv/videos/179555268">my first live stream</a> tonight.</p><p>I didn’t know what I was going to do, or even if I had everything set up right — the stream starts with me figuring out how to get my earbud’s mic audio working — but I think I managed to get it all working!</p><p>I was also incredibly lucky that someone decided to come check out the stream: thank you so much, <strong>will_50</strong>, for joining me this evening. You made it an incredibly rewarding experience for me, and I’m really looking forward to doing this again!</p><p>It’s late, I’m tired, but I wanted to get this out there to memorialize this event. I’m really looking forward to learning how to improve, both as a streamer and as a developer, through this process.</p><p>Come <a href="https://twitch.tv/dossy">follow me on Twitch</a> and watch me stream. I’d love to hear from you!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9d754249c8e5" width="1" height="1" alt=""><hr><p><a href="https://medium.com/this-old-code/theres-a-first-time-for-everything-9d754249c8e5">There’s a first time for everything</a> was originally published in <a href="https://medium.com/this-old-code">This Old Code</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ThisOldCode.tv]]></title>
            <link>https://medium.com/this-old-code/thisoldcode-tv-459ef9bfa76b?source=rss----c84a34dd891c---4</link>
            <guid isPermaLink="false">https://medium.com/p/459ef9bfa76b</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[twitch]]></category>
            <category><![CDATA[streaming]]></category>
            <dc:creator><![CDATA[Dossy Shiobara]]></dc:creator>
            <pubDate>Wed, 04 Oct 2017 04:12:32 GMT</pubDate>
            <atom:updated>2017-10-04T01:48:35.159Z</atom:updated>
            <content:encoded><![CDATA[<p>So, back in 2007 — okay, wow, 10 years ago — I grabbed a few domain names: <a href="http://thisoldcode.com/">ThisOldCode.com</a> and <a href="http://thisoldcode.tv/">ThisOldCode.tv</a>, etc. The idea was to do a video series (thus, the “.tv” domain) where I would fix or rehab old open source software projects and improve them, a la This Old House.</p><p>I still think it was a good idea, but 2007 was definitely not the right time. Fast forward to today, 10 years later, and people are live-streaming all kinds of things, here on Facebook, on YouTube, and especially Twitch.</p><p>I think it’s finally time. I’m going to start live-streaming myself working on open source projects and basically any non-private/non-client work, and have a go at it. If you’re interested, head on over to my Twitch channel follow it to get notifications of when I’m streaming.</p><p><a href="https://twitch.tv/dossy">https://twitch.tv/dossy</a></p><p>Obviously, it’s going to be really rough in the beginning, but I’m really excited about being able to finally do this. Hope to see some of you there!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=459ef9bfa76b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/this-old-code/thisoldcode-tv-459ef9bfa76b">ThisOldCode.tv</a> was originally published in <a href="https://medium.com/this-old-code">This Old Code</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>