<?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[Stories by Dossy Shiobara on Medium]]></title>
        <description><![CDATA[Stories by Dossy Shiobara on Medium]]></description>
        <link>https://medium.com/@dossy?source=rss-4e6c56ec7253------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*xUke0w_svWHJDVkJ.jpg</url>
            <title>Stories by Dossy Shiobara on Medium</title>
            <link>https://medium.com/@dossy?source=rss-4e6c56ec7253------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 20:52:33 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@dossy/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Do seat belts really save lives?]]></title>
            <link>https://medium.com/@dossy/do-seat-belts-really-save-lives-74f4c0b79444?source=rss-4e6c56ec7253------2</link>
            <guid isPermaLink="false">https://medium.com/p/74f4c0b79444</guid>
            <category><![CDATA[statistics]]></category>
            <category><![CDATA[data]]></category>
            <category><![CDATA[seat-belt-safety]]></category>
            <dc:creator><![CDATA[Dossy Shiobara]]></dc:creator>
            <pubDate>Fri, 15 May 2020 20:23:19 GMT</pubDate>
            <atom:updated>2025-05-09T14:57:04.723Z</atom:updated>
            <content:encoded><![CDATA[<p>It’s generally accepted conventional wisdom that “seat belts save lives.”</p><p>But, is this <strong><em>really</em></strong> true?</p><p>I often recite this quote when the subject of seat belts comes up:</p><blockquote>“Seat belts don’t save lives, they just make the bodies easier to find.”</blockquote><p>Let’s start by looking at some data. Here’s the <a href="https://en.wikipedia.org/wiki/Motor_vehicle_fatality_rate_in_U.S._by_year">motor vehicle deaths in U.S. by year</a> according to Wikipedia. I’ve created a <a href="https://docs.google.com/spreadsheets/d/1wGjiOs0kzbnfzpCFemsqtHhaJqvYkcuuRbczYBeWZGM/edit?usp=sharing">Google sheet</a> with the data, in order to visualize it. Here’s the graph:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/680/1*L0dR2PtSNFdPLYk50WLRgA.png" /></figure><p>I’ve called out 3 important dates in the graph, with colored symbols.</p><p>The left-most marker, the purple triangle, is the year 1958. This was the first year when Saab included seat belts as standard in its vehicles — prior to this, they were available as an option by Ford and others.</p><p>The middle marker, the orange square, is the year 1968. This was the year the law requiring safety belts in all vehicles signed by President Johnson.</p><p>The right-most marker, the red star, is the year 1984, when New York signed mandatory seat belt use into law. There is no federal law requiring seat belt use, and even today, there is no primary or secondary law in New Hampshire requiring adults wear seat belts in any seat.</p><p>These dates are interesting because they are pivotal points in time where we would naturally expect inflections in the graph that correlate to seat belts, if seat belts have a causative effect on motor vehicle fatalities. But, as you can see from the graph, there do not appear to be any. Are seat belts <strong><em>really</em></strong> saving lives?</p><p>Maybe the effect of seat belts is so subtle, it wouldn’t be easily detectable in a coarse graph of fatalities by year. What if we take a really close look at the data?</p><p>According to <a href="https://www.nhtsa.gov/risky-driving/seat-belts#issue-consequences">the NHTSA</a>, they report:</p><blockquote>“Of the 37,133 people killed in motor vehicle crashes in 2017, 47% were not wearing seat belts. In 2017 alone, seat belts saved an estimated 14,955 lives and could have saved an additional 2,549 people if they had been wearing seat belts.”</blockquote><p>What? How do you go from “47% were not wearing seat belts” to “[… seat belts] could have saved an additional 2,549 people […]”?</p><p>Just think about this for a moment: if 47% were not wearing seat belts, that means 53% were — and still died. Looking at this simply, for every 100 people who died in a car accident, 47 were unrestrained while 53 were wearing seat belts. More people who died were wearing seat belts than not. Period.</p><p>How do you make the leap from the fact that more people die while wearing seat belts to “more lives could have been saved if more people wore seat belts”? I don’t think that’s how it works.</p><p>Perhaps the decline in overall deaths by motor vehicles over the years isn’t attributable to seat belt use. Maybe it’s largely driven by safer motor vehicle designs, advances in safety technology, more reliable manufacturing processes, etc., that simply result in safer motor vehicles. But, the data doesn’t seem to support the statement that “seat belts save lives” when more deaths involve people wearing seat belts than not.</p><p>Of course, I’m going to continue wearing my seat belt: in New Jersey, it’s the law. But, I’m not doing it because it’s actually safer, at least not according to the data.</p><p><strong>May 2025 Update:</strong> I’m honestly surprised that I didn’t get completely dog-piled telling me all the ways I was wrong, as per usual on the Internet.</p><p>As an experiment, I asked ChatGPT o3 to tell me why I was wrong, and it did a fantastic job:</p><p><a href="https://chatgpt.com/share/681e16dd-f69c-8008-ab5a-e6805facdb53">ChatGPT - Seat Belt Effectiveness Analysis</a></p><blockquote><strong><em>Bottom line</em></strong></blockquote><blockquote>Your headline question has a clear empirical answer:<em> seat belts </em><strong><em>do</em></strong><em> save lives, cutting a belted person’s chance of dying in a crash roughly in half.</em></blockquote><blockquote><em>The apparent contradiction you spotted (more belted than unbelted deaths) vanishes once you account for the fact that almost everyone now wears a belt, so they dominate the pool of crash victims. The statistical frame — not the seat belts — was the issue.</em></blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=74f4c0b79444" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Pokémon GO EX raids in northern NJ]]></title>
            <link>https://medium.com/@dossy/pok%C3%A9mon-go-ex-raids-in-northern-nj-e52a4373a4a9?source=rss-4e6c56ec7253------2</link>
            <guid isPermaLink="false">https://medium.com/p/e52a4373a4a9</guid>
            <category><![CDATA[new-jersey]]></category>
            <category><![CDATA[pokémon-go]]></category>
            <dc:creator><![CDATA[Dossy Shiobara]]></dc:creator>
            <pubDate>Fri, 17 Aug 2018 20:46:24 GMT</pubDate>
            <atom:updated>2018-08-24T15:00:41.725Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/685/1*ZlerT0tGTDXcyjjkdupjNw.png" /></figure><p>Since I couldn’t find a good list of EX raid eligible gyms in northern NJ, I decided to start one, especially since it seems like Niantic sent out <a href="https://www.pokemongolive.com/en/post/exclusiveraids">EX raid invites</a> today, August 17th, and people are posting their invites.</p><h3>The list:</h3><ul><li><a href="https://www.pokemongomap.info/gym/vander-sande-field/4650813">Vander Sande Field</a> (Rochelle Park)<br>+ August 25 @ 4:30 PM — 5:15 PM</li><li><a href="https://www.pokemongomap.info/gym/nutley-memorial-parkway/4685298">Nutley Memorial Parkway</a> (Nutley)<br>+ August 18 @ 1:00 PM — 1:45 PM</li><li><a href="https://www.pokemongomap.info/gym/tennis-court/3635174">Tennis Court</a> (Ridgefield Park)<br>+ August 25 @ 4:00 PM — 4:45 PM</li><li><a href="https://www.pokemongomap.info/gym/find-shiny-deals-at-sprint/49084354">Find shiny deals at Sprint</a> (Union City)<br>+ August 25 @ 1:00 PM — 1:45 PM</li><li><a href="https://www.pokemongomap.info/gym/rotary-memorial-gazebo/2972914">Rotary Memorial Gazebo</a> (Rockaway)<br>+ August 25 @ 3:30 PM — 4:15 PM</li><li><a href="https://www.pokemongomap.info/gym/parsippany-veterans-memorial-park/4649608">Parsippany Veteran’s Memorial Park</a> (Parsippany)<br>+ August 25 @ 5:30 PM — 6:15 PM</li><li><a href="https://www.pokemongomap.info/gym/eternal-flame-war-memorial/2973467">Eternal Flame War Memorial</a> (Roxbury Township)<br>+ August 18 @ 1:30 PM — 2:15 PM</li><li><a href="https://www.pokemongomap.info/gym/morristown-world-war-i-memoria/4171015">Morristown World War I Memoria</a> (Morristown)<br>+ August 18 @ 12:00 PM — 1:15 PM</li><li><a href="https://www.pokemongomap.info/gym/michael-obrien-memorial/4170678">Michael O’Brien Memorial</a> (Morris Plains)<br>+ August 25 @ 3:00 PM — 3:45 PM</li><li><a href="https://www.pokemongomap.info/gym/jared-percevault-well/2973471">Jared Percevault Well</a> (Succasunna)<br>+ August 25 @ 3:00 PM — 3:45 PM</li><li><a href="https://www.pokemongomap.info/gym/edward-j-macksoud-memorial-entrance/7044868">Edward J. Macksoud Memorial Entrance</a> (Ridgewood)<br>+ August 25 @ 1:00 PM — 1:45 PM</li><li><a href="https://www.pokemongomap.info/gym/rotary-park-playground/2985021">Rotary Park Playground</a> (Park Ridge)<br>+ August 25 @ 12:00 PM — 12:45 PM</li><li><a href="https://www.pokemongomap.info/gym/westwood-town-gazebo/7043701">Westwood Town Gazebo</a> (Westwood)<br>+ August 25 @ 3:00 PM — 3:45 PM</li><li><a href="https://www.pokemongomap.info/gym/historic-new-bridge-landing/3266621">Historic New Bridge Landing</a> (River Edge)<br>+ August 25 @ 1:00 PM — 1:45 PM</li><li><a href="https://www.pokemongomap.info/gym/edreich-family-memorial-bench/4650816">Edreich Family Memorial Bench</a> (Rochelle Park)<br>+ August 25 @ 1:00 PM — 1:45 PM</li><li><a href="https://www.pokemongomap.info/gym/the-longo-family-memorial-bench/4650805">The Longo Family Memorial Bench</a> (Rochelle Park)<br>+ August 25 @ 1:30 PM — 2:15 PM</li><li><a href="https://www.pokemongomap.info/gym/the-wall-of-harmony/3268273">The Wall of Harmony</a> (River Edge)<br>+ August 25 @ 1:00 PM — 1:45 PM</li><li><a href="https://www.pokemongomap.info/gym/tree-of-peace/3268291">Tree of Peace</a> (River Edge)<br>+ August 25 @ 4:30 PM — 5:15 PM</li><li><a href="https://www.pokemongomap.info/gym/to-honor-the-men-and-women-of-maywood-who-served-our-country-during-world-war-two-memorial/4650976">To Honor the Men and Women of Maywood Who Served Our Country during World War Two Memorial</a> (Maywood)<br>+ August 25 @ 5:30 PM — 6:15 PM</li><li><a href="https://www.pokemongomap.info/gym/the-campbell-christie-house/3266622">The Campbell Christie House</a> (River Edge)<br>+ August 18 @ 6:00 PM — 6:45 PM</li><li><a href="https://www.pokemongomap.info/gym/in-loving-memory-of-doris-messmer-jay-dederick/3264688">In Loving Memory of Doris Messmer Jay Dederick</a> (Leonia)<br>+ August 25 @ 11:30–12:15 PM</li><li><a href="https://www.pokemongomap.info/gym/tennis-court/3635174">Tennis Court</a> (Ridgefield Park)<br>+ August 25 @ 4:00 PM — 4:45 PM</li></ul><p>If you’re not sure what an EX raid is, or want to learn more about them, <a href="https://www.imore.com/pokemon-go-ex-raids">iMore.com has a thorough write-up</a> on what they are, strategies for doing them, and other useful information about them.</p><p>If you got an EX raid invite that isn’t on this list, leave a comment with a screenshot of the invite and I’ll update the list. Thanks!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e52a4373a4a9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <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-4e6c56ec7253------2</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:38 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[WordPress Performance Optimization Case Study: all-things-andy-gavin.com]]></title>
            <link>https://medium.com/@dossy/wordpress-performance-optimization-case-study-all-things-andy-gavin-com-f89aa1e4d99f?source=rss-4e6c56ec7253------2</link>
            <guid isPermaLink="false">https://medium.com/p/f89aa1e4d99f</guid>
            <category><![CDATA[wordpress-plugins]]></category>
            <category><![CDATA[website-performance]]></category>
            <category><![CDATA[performance-optimization]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[wordpress]]></category>
            <dc:creator><![CDATA[Dossy Shiobara]]></dc:creator>
            <pubDate>Mon, 12 Mar 2018 04:57:24 GMT</pubDate>
            <atom:updated>2018-03-12T04:57:24.905Z</atom:updated>
            <content:encoded><![CDATA[<p>I recently had the good fortune to do a WordPress performance optimization project for Andy Gavin (yes, <em>that</em> <a href="https://en.wikipedia.org/wiki/Andy_Gavin">Andy Gavin</a>), on his site, <a href="https://all-things-andy-gavin.com/">all-things-andy-gavin.com</a>. Here’s a screenshot of the homepage:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XG4_RMwDyVHgiQSDKCfTEA.png" /><figcaption>all-things-andy-gavin.com</figcaption></figure><p>The site was experiencing some pretty bad page execution times, often upwards of 11 seconds, which was most noticeable in the WordPress admin area. With the help of the <strong>WP Super Cache</strong> plugin, once pages were rendered and cached, requests were pretty reasonable, although still a bit on the slow side, a full page load taking around 2.7 seconds. Here’s a <strong>GTMetrix</strong> performance report before I started:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/972/1*xgqbsG3K_Pro25YYWJ0dQA.png" /></figure><p>Right away, I noticed that the <strong>SmugMug Embed</strong> plugin he was using was trying to embed some files that didn’t exist, resulting in HTTP 404 responses. Unfortunately, these requests won’t get cached, and given the slow page execution times, would take up to a few seconds to generate the 404 page and respond to the requests. I modified the plugin to no longer reference these missing files. This cut down on the overall amount of time the server spent executing code to serve the page.</p><p>Another source of unnecessary page execution time came from his use of the <strong>Quick Page/Post Redirect Plugin</strong> to redirect a few canonical URLs to their desired locations. Again, each of these requests required the entire WordPress machinery to execute, just to return a 301 or 302 HTTP redirect — that’s a lot of overhead for something extremely simple. Since Andy’s a programmer, editing a text file is something he’s very comfortable doing, so we moved the redirects into his .htaccess file, eliminating all that unnecessary processing time.</p><p>WordPress provides a task scheduling mechanism called <a href="https://developer.wordpress.org/plugins/cron/"><strong>WP-Cron</strong></a>, which by default uses a slice of the page execution time to determine if there’s a task that needs to be executed, and kicks it off by making an HTTP request back to itself to run the task in a separate execution thread. For lightweight sites with a simple theme and only a few plugins, this is perfectly fine. For a site that’s already heavy, this can be considerable overhead. Fortunately, <a href="https://developer.wordpress.org/plugins/cron/hooking-into-the-system-task-scheduler/">WordPress provides an alternative</a>: disable this behavior and use an alternate scheduling mechanism, such as the operating system’s task scheduler, to kick off the same HTTP request. We went ahead and did that.</p><p>Andy’s site also the <strong>Jetpack by WordPress.com</strong> plugin, which offers a bunch of different and useful functionality, but it’s a take-it-or-leave-it kind of proposition, all of its functionality is bundled together. While you can turn parts of it on or off through its settings, all of its code still gets read in, even if you’re not using it all. Unfortunately, <a href="https://jetpack.com/support/what-data-does-jetpack-sync/">Jetpack Sync</a> is part of that kitchen sink, and it’s not obvious to me how to disable it or turn it off. This was an issue for us because it, too, makes outbound XML-RPC API requests during the page execution to <a href="https://jetpack.wordpress.com/">https://jetpack.wordpress.com</a>, even though it should be using the <strong>WP-Cron</strong> machinery. I didn’t dig too deeply into this, since deactivating the plugin wasn’t an option, so we just have to live with this, but it’s something to be aware of if doing a performance optimization of a WordPress site that doesn’t really need to use the Jetpack plugin.</p><p>Speaking of having all that code to read in and parse, there’s another kind of cache that we can leverage to reduce the amount of time we have to spend reading and parsing the same code: the <a href="http://php.net/manual/en/intro.opcache.php"><strong>Zend OPcache</strong></a>. This extension is now bundled with PHP as of 5.5, but Andy’s hosting setup is still on 5.4, so I went ahead and installed the extension. I went with the default settings because they’re a good place to start, and can be tuned if and as needed later on. Using the OPcache should significantly improve the page requests that aren’t cached by WP Super Cache, as well as the WordPress admin interface.</p><p>Moving onto the actual page size, we can see it’s clocking in at a whopping 2.06 MB across 153 requests. Here, we were able to leverage Google’s <a href="https://www.modpagespeed.com/">PageSpeed Module</a>, specifically, mod_pagespeed for Apache 2.4, to do a bunch of rewriting and optimization of the WordPress-generated HTML, JavaScript and CSS. It took a fair amount of experimentation to come up with the set of filters that yielded the results I wanted, but eventually I was able to achieve a 59.9% reduction in page size, reducing it down to 826 KB, a savings of 1,223 KB from 2,060 KB, with 18.3% fewer requests, 125 instead of 153.</p><p>In addition to all of this optimization work, we took the opportunity to reconfigure the site from HTTP to HTTPS, since Google has leveraged its considerable marketshare of its Chrome browser to encourage folks to make the change through <a href="https://security.googleblog.com/2018/02/a-secure-web-is-here-to-stay.html">clever social engineering</a>: <em>Beginning in July 2018 with the release of Chrome 68, Chrome will mark all HTTP sites as “not secure”.</em> We decided to use a free SSL certificate from <strong>LetsEncrypt</strong>. Unfortunately, there were a few plugins that needed to be adjusted to embed their resources via HTTPS URLs to avoid the “mixed content” security warnings, so that we could get the green “Secure” padlock to display in the browser.</p><p>After all this work, here is what the <strong>GTMetrix</strong> report looks like:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/967/1*6QUs7zRboxkIDI5TvaAppg.png" /></figure><p>You’ll immediately notice the improvement in the Performance Scores, from what were previously F grades for both PageSpeed and YSlow, to now C and D, respectively. While it would be great to get both of those up to an A, it’s unfortunately not possible, since the remaining significant contributors to the score are external resources which we have no control over, such as display ads and social sharing widgets.</p><p>What you might notice is that our <strong>Time-to-First-Byte</strong> (TTFB) has actually gotten “worse,” increasing from 190 milliseconds to 449 ms. That’s to be expected since the PageSpeed Module is doing a bunch of work, parsing the response and rewriting it. Despite the slightly longer TTFB, you’ll see that our paint times are around 100 ms faster, our DOM phase is around 300 ms faster, and the onload event fires a full 1.1 second sooner. While the report shows the Fully Loaded Time difference as only 0.5 seconds, from 2.7 sec to 2.2 sec, this 44% improvement in the onload time has a significant impact on a user’s perception of the page load, since the user can now interact with the page a full 1.1 sec sooner.</p><p>Granted, these kinds of results aren’t exactly typical, since every site’s needs are different and the mix of theme, plugins and hosting environment can have a significant impact on the overall page execution time and user experience. However, the process and approach to optimizing a WordPress website is repeatable and when you know what you’re looking for, you can achieve great results.</p><p>Are you struggling with performance issues with your WordPress website? Have you or others tried to optimize your site and left you wondering if it could be even better? <a href="https://panoptic.com/">Get in touch with me</a> and I’ll perform an initial evaluation of your WordPress website <em>for free</em> and let you know what I can do to help.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f89aa1e4d99f" width="1" height="1" alt="">]]></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-4e6c56ec7253------2</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:36:21 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-4e6c56ec7253------2</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-4e6c56ec7253------2</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:32 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-4e6c56ec7253------2</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 01:48:35 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>
        <item>
            <title><![CDATA[Medium, PLEASE bring back the old feed!]]></title>
            <link>https://medium.com/@dossy/medium-please-bring-back-the-old-feed-6d524157d9ce?source=rss-4e6c56ec7253------2</link>
            <guid isPermaLink="false">https://medium.com/p/6d524157d9ce</guid>
            <category><![CDATA[medium]]></category>
            <dc:creator><![CDATA[Dossy Shiobara]]></dc:creator>
            <pubDate>Thu, 21 Sep 2017 14:43:01 GMT</pubDate>
            <atom:updated>2017-09-21T14:43:01.887Z</atom:updated>
            <content:encoded><![CDATA[<p>As soon as Medium announced their new feed, and I checked it out, I had to switch back to the old feed. The new feed is terribad. Even if it was just a matter of taste, the new feed is actually broken. Look at this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hrdatRvY5OUUE2ex8_VxIA.png" /><figcaption>Look, LOOK at that scroll bar on the right!</figcaption></figure><p>Yes, the “New from your network” view has ONE post, and of course it’s a Benjamin P. Hardy post, natch. Where’s all the rest of the content? Why can’t I just scroll down to see the older stuff, like in my old feed? If I click on the “People” or “Publications” tabs, I do get more content, but I don’t want to have to click back and forth between tabs just to see newly posted stuff — isn’t that what “All” means, in English?</p><p>Medium has apparently pivoted from what could have been an amazing LiveJournal 2.0, where I could follow a river-style timeline of quality posts that I can curate by controlling who I follow … to … I don’t even have words to describe it. All I know is that in this new Medium 2.0, “All” means Benjamin P. Hardy, and that’s it.</p><p>Medium just took away the old newsfeed functionality from all of us and have forced us into this new one. I was hoping that they were split testing the old vs. new, and the data would prove out that engagement and daily uniques on the new feed would show it was a mistake, but I guess I was wrong, or they are just ignoring the data and are moving forward with this new approach regardless?</p><p>Am I alone in feeling this way about the new feed? Was I the only user who opted to keep the old feed when given the choice, and now I’m the only one who finds the new feed a horrible user experience?</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6d524157d9ce" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Why the Medium paywall is a bad idea]]></title>
            <link>https://medium.com/@dossy/why-the-medium-paywall-is-a-bad-idea-645383f6008d?source=rss-4e6c56ec7253------2</link>
            <guid isPermaLink="false">https://medium.com/p/645383f6008d</guid>
            <category><![CDATA[medium]]></category>
            <category><![CDATA[community]]></category>
            <category><![CDATA[publishing]]></category>
            <category><![CDATA[business-strategy]]></category>
            <dc:creator><![CDATA[Dossy Shiobara]]></dc:creator>
            <pubDate>Tue, 09 May 2017 22:26:59 GMT</pubDate>
            <atom:updated>2017-05-09T22:29:43.495Z</atom:updated>
            <content:encoded><![CDATA[<p>I’ve heard that Medium has rolled out their paywall, introducing a new pay-to-read model around exclusive members-only content. I hadn’t encountered it in the wild, until now. Here’s what it looks like, in action:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*pr2VQXE-b0oWAb4ff2xO3g.png" /></figure><p>If this were a members-only post, this is where you’d stop reading… unless you were lucky enough to be part of the limited members program AND were willing to pay whatever the fee is.</p><h3>But, lots of content providers monetize content with a paywall successfully, right?</h3><p>I suppose. AOL made millions with their “<a href="https://en.wikipedia.org/wiki/Closed_platform">walled garden</a>” approach to access to content. But, that was the 1990s, where you could still make money simply selling access. In modern times, however, even one of the bastions of Old Media, the New York Times, who has traditionally employed a paywall, has abandoned that <a href="https://www.thestreet.com/story/13242007/1/paywalls-are-not-the-future--just-ask-the-new-york-times.html">outdated practice</a>.</p><h3>Well, people love Medium and its content enough to pay, so why not?</h3><p>Because there are better ways to monetize the value that Medium has built in ways that benefits everyone involved: the readers AND the writers.</p><p>Generally, when you believe your value is your content, monetizing that value means restricting access to it: paywalls. <strong>But, what if I told you that Medium’s actual value <em>isn’t the content at all</em>?</strong></p><p>Medium built an excellent platform to enable writers to create beautiful content easily, and for readers to discover, follow and consume that content enjoyably. They’ve <a href="http://mediashift.org/2017/02/wordpress-vs-medium-case-study/">successfully displaced</a> many contenders (I wouldn’t go so far as to say “disrupted”) in the space occupied by classic content management systems and web publishing platforms like WordPress and Drupal and Joomla, simply by building a better mousetrap. That beautiful relationship that Medium was able to create between writers and readers has enabled them to accumulate a wealth of content. Some of it is even pretty good… ;-)</p><p>To stop here and see the content as value is so short-sighted, though. The value is that <em>relationship</em> that Medium has been able to facilitate and grow. Monetizing the <em>content</em> means putting an obstacle between the reader and the writer, interfering with that relationship. Monetizing the <em>relationship</em>, giving the writer more options for creating and <em>distributing</em> their content and ways for them to monetize their content, and giving the reader more options for <em>consuming</em> and enjoying that content, is win-win-win for Medium, their writers, and their readers.</p><h3>In short: Medium should look to displace (or, even disrupt) the classic publisher model.</h3><p>Medium has elegantly solved the problem of building a platform for writers and readers in the web space. But, there’s lots of other channels for content that content creators want to reach and audiences want to consume: e-books, physical books, audiobooks. These are channels that traditional publishers, agents, and commerce marketplaces (Amazon, Barnes &amp; Nobles, Audible, etc.) control, and for content creators to get their content into those channels means leaving Medium for those things. <strong>Medium can change that, and I think they should.</strong></p><p>Medium could build the necessary platform for its existing writers to be able to create or modify their content and publish them to those other channels. Instead of charging writers for that privilege, Medium could establish a revenue-sharing model, which is again win-win, aligning Medium and content creators goals instead of orienting Medium in a position of trying to extract the most money from the subset of writers who would be willing to pay for such a service. In a revenue-sharing model, writers and Medium benefit when more content is consumed by the audience — and, not ads, but the content.</p><p>Medium could then focus on helping writers by increasing their distribution, figuring out ways to get their content in front of the right consumers in the audience, and facilitating the valuable relationship they’ve already built between the two.</p><p>Medium could build even better experiences for audiences looking to discover, access and consume content across those various channels, with all of the great features that the platform provides for web content: highlighting, annotations, sharing, commenting, etc. They could even create new ways for consumers to interact with the content and their authors, furthering that valuable relationship.</p><p><strong>The possibilities are really endless when you take an approach that looks to continue to improve the real value that Medium has accumulated, instead of putting obstacles in the way, like a paywall.</strong></p><p>Look, <em>I know I’m just some nobody on the Internet</em> with wild ideas and no real successes to my name, so maybe I’m wrong about all of this. But, it’d really make my day if <a href="https://medium.com/u/268314bb7e7e">Ev Williams</a> saw this, and replaced Medium’s membership paywall approach with what I’ve suggested. It’s not like I could really take credit for being the catalyst for that change — after all, he’s the successful one, and if this is the direction Medium does eventually go in, he probably had the idea before I did — but in my mind, I’d like to pretend like it was because of me and this post… ;-)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=645383f6008d" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>