<?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 Mikeal Rogers on Medium]]></title>
        <description><![CDATA[Stories by Mikeal Rogers on Medium]]></description>
        <link>https://medium.com/@mikeal?source=rss-70d203660866------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*_-5rnJ0WUpo3OJ-W.jpeg</url>
            <title>Stories by Mikeal Rogers on Medium</title>
            <link>https://medium.com/@mikeal?source=rss-70d203660866------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 12:39:10 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@mikeal/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[The New Data]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@mikeal/the-new-data-d6b5e392da43?source=rss-70d203660866------2"><img src="https://cdn-images-1.medium.com/max/1370/1*rhuNWZiWtwhKIn9VeJGzQg.jpeg" width="1370"></a></p><p class="medium-feed-snippet">IPLD: The data layer of a decentralized web.</p><p class="medium-feed-link"><a href="https://medium.com/@mikeal/the-new-data-d6b5e392da43?source=rss-70d203660866------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@mikeal/the-new-data-d6b5e392da43?source=rss-70d203660866------2</link>
            <guid isPermaLink="false">https://medium.com/p/d6b5e392da43</guid>
            <category><![CDATA[ipfs]]></category>
            <category><![CDATA[database]]></category>
            <category><![CDATA[blockchain]]></category>
            <category><![CDATA[decentralization]]></category>
            <dc:creator><![CDATA[Mikeal Rogers]]></dc:creator>
            <pubDate>Wed, 18 Nov 2020 22:27:20 GMT</pubDate>
            <atom:updated>2020-11-19T17:24:27.792Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Uber for cursing in China]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/oss-trends/uber-for-cursing-in-china-17e894c9e24f?source=rss-70d203660866------2"><img src="https://cdn-images-1.medium.com/max/800/1*d3DZ2vbarwyDbEf9Tn6pEw.gif" width="800"></a></p><p class="medium-feed-snippet">Highlights from recent GitHub data.</p><p class="medium-feed-link"><a href="https://medium.com/oss-trends/uber-for-cursing-in-china-17e894c9e24f?source=rss-70d203660866------2">Continue reading on OSS Trends »</a></p></div>]]></description>
            <link>https://medium.com/oss-trends/uber-for-cursing-in-china-17e894c9e24f?source=rss-70d203660866------2</link>
            <guid isPermaLink="false">https://medium.com/p/17e894c9e24f</guid>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[github]]></category>
            <category><![CDATA[anime]]></category>
            <category><![CDATA[open-source]]></category>
            <dc:creator><![CDATA[Mikeal Rogers]]></dc:creator>
            <pubDate>Mon, 14 Oct 2019 04:41:51 GMT</pubDate>
            <atom:updated>2019-10-14T04:41:51.556Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Who do npm users depend on?]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/oss-trends/who-do-npm-users-depend-on-da66c3db019d?source=rss-70d203660866------2"><img src="https://cdn-images-1.medium.com/max/1795/1*J8fxO_662y1wIyBxld53Rw.jpeg" width="1795"></a></p><p class="medium-feed-snippet">A new way to look at npm data to find who we depend on the most.</p><p class="medium-feed-link"><a href="https://medium.com/oss-trends/who-do-npm-users-depend-on-da66c3db019d?source=rss-70d203660866------2">Continue reading on OSS Trends »</a></p></div>]]></description>
            <link>https://medium.com/oss-trends/who-do-npm-users-depend-on-da66c3db019d?source=rss-70d203660866------2</link>
            <guid isPermaLink="false">https://medium.com/p/da66c3db019d</guid>
            <category><![CDATA[data]]></category>
            <category><![CDATA[npm]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[open-source]]></category>
            <dc:creator><![CDATA[Mikeal Rogers]]></dc:creator>
            <pubDate>Tue, 08 Oct 2019 19:37:36 GMT</pubDate>
            <atom:updated>2019-10-09T18:49:40.114Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[How to terrify people about scooters.]]></title>
            <link>https://medium.com/bad-data/how-to-terrify-people-about-scooters-14a8bfaa96e8?source=rss-70d203660866------2</link>
            <guid isPermaLink="false">https://medium.com/p/14a8bfaa96e8</guid>
            <category><![CDATA[scooters]]></category>
            <category><![CDATA[data]]></category>
            <category><![CDATA[electric-scooters]]></category>
            <category><![CDATA[media-criticism]]></category>
            <category><![CDATA[cycling]]></category>
            <dc:creator><![CDATA[Mikeal Rogers]]></dc:creator>
            <pubDate>Mon, 24 Sep 2018 21:39:28 GMT</pubDate>
            <atom:updated>2018-09-24T21:44:47.183Z</atom:updated>
            <content:encoded><![CDATA[<p>Washington Post gives just enough data to scare you away from scooter share.</p><p>Headline: <a href="https://www.washingtonpost.com/technology/2018/09/24/hospital-er-reports-percent-spike-visits-involving-e-scooters/?utm_term=.aa506085fccb">“Hospital ER reports 161 percent spike in visits involving electric scooters.”</a></p><blockquote>Between June and September 2017, physicians at University of Utah Health’s emergency room treated eight patients injured by scooters, although each of those were probably people’s personal devices and not the electric fleet vehicles owned by companies such as Bird, Lime and Skip.</blockquote><blockquote>During the same period this year, that number had climbed to 21, according to Troy Madsen, a doctor who practices at the University of Utah Health’s Emergency Department.</blockquote><p>So, an increase from 8 to 21.</p><blockquote>“Most of the patients with these injuries specifically reported that they were riding an e-scooter or a rental scooter,” Madsen said, noting that they ranged in age from 20 to 50 years old and were often injured attempting to catch themselves in a fall. “Interestingly, more than 80 percent of the injuries this year happened between Aug. 15 and Sept. 15, which would correspond with the increasing popularity and availability of the e-scooters.”</blockquote><p>The article notes that the increase in injuries is related to the increase in ridership but makes no mention of how much the ridership has increased. It also makes no attempt to quantify what the rate of injury is per rider or per ride.</p><p>In July it was estimated than <a href="https://www.sltrib.com/news/politics/2018/07/30/scooter-wars-come-salt/">as many as 1000 new scooters</a> were dropped on SLC. We don’t know if there have been more since then, or what the use rate of the scooters is, but it’s safe to say that total scooter use is up by far more than 161% from what it was before these services were available.</p><p>In other words, the rate of injury is <strong>probably significantly down</strong> from what it was before scooter rental companies came in. This is the opposite impression from what the article presents by simply excluding any numbers about the increase in use or what at what estimated rate riders are being injured. It only uses the increase in ridership to connect the new injuries to the introduction of scooter share services.</p><p>It’s well documented that for <a href="https://en.wikipedia.org/wiki/Safety_in_numbers#In_road_traffic_safety">bicycles and pedestrians that in urban areas there is “safety in numbers.”</a> The default assumption here should be that the greater the number of people riding scooters the lower the injury and fatality rate. This is left out, and because scooters are “new” the article uses a benign and potentially <strong>positive</strong> statistic to increase potential riders fears.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5dFMMCubggxd8YeLLsRFDw.jpeg" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=14a8bfaa96e8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/bad-data/how-to-terrify-people-about-scooters-14a8bfaa96e8">How to terrify people about scooters.</a> was originally published in <a href="https://medium.com/bad-data">Bad Data</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Vue.js & Electron: The easy way.]]></title>
            <link>https://medium.com/@mikeal/vue-js-electron-the-easy-way-adc3ca09234a?source=rss-70d203660866------2</link>
            <guid isPermaLink="false">https://medium.com/p/adc3ca09234a</guid>
            <category><![CDATA[electron]]></category>
            <category><![CDATA[webpack]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[vuejs]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Mikeal Rogers]]></dc:creator>
            <pubDate>Tue, 24 Apr 2018 22:47:26 GMT</pubDate>
            <atom:updated>2018-04-24T22:47:26.398Z</atom:updated>
            <content:encoded><![CDATA[<p>A simpler way to build electron apps w/ vue using vue-cli 3.</p><p>There’s quite a few tutorials out there for using Vue.js and Electron but they all seem to require a huge amount of effort and boiler generation to get started.</p><p>In vue-cli 3 the need for boiler generation has been greatly reduced and the entire developer workflow is much simpler. I sat down to greenfield what it would be like to integrate this simpler setup into Electron and was pleasantly surprised.</p><p>Let’s get started.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/84ac34e88801d170ff06f392ec531c08/href">https://medium.com/media/84ac34e88801d170ff06f392ec531c08/href</a></iframe><p>Now that we’ve got Electron and Vue.js setup, we’ll need a JavaScript file that initializes the Electron app.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/1eb8f21fc54d748cd5a12a447d4612d0/href">https://medium.com/media/1eb8f21fc54d748cd5a12a447d4612d0/href</a></iframe><p>As you can see, there’s a development mode that loads the page from the webpack development server and a production version that uses the static assets generated by webpack.</p><p>First, let’s get the dev server up and running by adding a script to <em>package.json</em>.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ee98c7114ad998e821dd4e5e6122984c/href">https://medium.com/media/ee98c7114ad998e821dd4e5e6122984c/href</a></iframe><p>You can adjust the sleep command based on how long it typically takes to startup webpack in the vue-cli-service.</p><pre>npm run dev</pre><p>Your site will pop up now and you get all the development environment goodies that Vue.js and webpack have to offer.</p><p>For the “production” build we need a little more. By default webpack will use relative URLs for all the static assets. This is no good for Electron, which will need full file paths instead.</p><p>In the old vue-cli 2 days, boiler generators would spit out a bunch of config files be like <strong>“have fun maintaining these!”</strong> Today, with vue-cli 3, there’s a programmable way to mutate webpack config options using a <em>vue.config.js</em> file and it’s wonderful.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/684d996f0c0dd57c0bfbbed22512d738/href">https://medium.com/media/684d996f0c0dd57c0bfbbed22512d738/href</a></iframe><p>That’s about it. You can test this build out pretty easily by just running the vue-cli build and Electron.</p><pre>npm run build<br>electron app.js</pre><p>Now you’re ready to build the final Electron app in whatever builder you choose (there’s like half a dozen of them).</p><p>All this code is up <a href="https://github.com/mikeal/vuejs-electron-demo">on GitHub as well</a>. If you have any suggestions or improvements got ahead and log issues or pull requests in that repo.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=adc3ca09234a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sweet Potatoes]]></title>
            <link>https://medium.com/@mikeal/sweet-potatoes-76c521205494?source=rss-70d203660866------2</link>
            <guid isPermaLink="false">https://medium.com/p/76c521205494</guid>
            <category><![CDATA[recipe]]></category>
            <dc:creator><![CDATA[Mikeal Rogers]]></dc:creator>
            <pubDate>Tue, 03 Apr 2018 17:14:17 GMT</pubDate>
            <atom:updated>2018-04-03T17:14:17.925Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Cooking a peculiar shape.</em></p><p>It’s best not to consider sweet potatoes as you would other potatoes.</p><p>When I’m looking at a Yukon, Gold, Red or Fingerling potato I think about all the different ways I can fry and crisp it, but none of that works too well with Sweet Potatoes.</p><p>I’ve tried all manor of sweet potato fries and hash browns but they always end up a little flat or lame. Look closely at the crispy sweet potato fries in your favorite restaurant, you’ll notice they are coated in a dry flour before being fried, a trick I’m not too eager to replicate in my own kitchen.</p><p>Sweet Potatoes land in farm boxes most of the year but rarely in the summer which is fine as their sweet and savory character pair poorly with the warm days of summer.</p><p>The best way to pull out the sweet caramel notes of the sweet potato is to roast them. Wash them first if they are quite dirty, as to not fill your home with smell of the dirt burning in the oven, but if they come relatively clean there’s no need to wash as the skin will be eventually be discarded.</p><p>As sweet potatoes roast moisture is released. To help this process along and allow the core to heat more evenly with the rest of the potato its best to pierce it all over prior to roasting. You can use a fork if it’s sharp and deep enough but these days I just use the end of a chefs knife to penetrate about a third of the way through. These cuts should be about an inch apart around the entire surface of the sweet potato.</p><p>When the roast is finished you’ll see a discharge that burns after leaking onto the surface of the roasting pan. If you cut off the tips of the sweet potato this discharge will come out the end, if you don’t you can’t predict where this will happen and the process could split the potato prematurely and make it roast unevenly.</p><p>Coating a sweet potato in fat before roasting aids in the carmelization of sugars that come to the surface. I use ghee as it won’t burn easily and the flavor won’t conflict with butter I add after the roast. Roasting in ghee fills your kitchen with a pleasant buttered caramel smoke.</p><p>There’s no exact roasting time and temperature for sweet potatoes as each one varies so widely in size and shape. Some are bulbous and round while others are long and skinny. Larger potatoes I roast at <strong><em>350f</em></strong> for at least 80 minutes while longer ones I roast at <strong><em>400f</em></strong> for an hour. The surface should be dark but not black, once the surface blackens the char extends well under the surface and only the core will be edible.</p><p>After removing them from the oven let them cool for a few minutes but not all the way. I usually wear a pair of gloves for the next part so that I can work with them while they are still too hot for my bare hands.</p><p>With a knife in one hand pull the skin from the soft flesh and place the flesh in a bowl and discard the skin. While still hot melt in a good grass-fed butter. I use Kerrygold butter and the bright yellow makes the final result intensely orange.</p><p>Now it’s time to add spices. Any number of pumpkin spices will do. These rich mashed sweet potatoes are great with cinnamon, all spice, nutmeg, even curry. But my personal favorite is cardamom. In fact, I stopped adding other spices and just grind up a few cardamom pods. There seems to be no amount of cardamom that is too much for them to handle. I add one or two when serving them as a large portion and 7 or 8 when I want to smear the sweet potato across a plate so that food can be dipped in it like you would a demi-glace.</p><h3>Cardamom Sweet Potato Summary</h3><ul><li>Wash if noticeably dirty.</li><li>Pierce the skin all over.</li><li>Cover in fat.</li><li>Roast at <em>350f–400f</em> for 60–120 minutes depending on size and shape.</li><li>Cool for a few minutes.</li><li>Pull flesh from skin.</li><li>Mix &amp; melt butter into the flesh until it’s a consistent paste.</li><li>Crack a few cardamom pods, pull out the seed, grind in a mortar and pestle, and add it the puree.</li></ul><p>* Wash if noticably dirty.<br>* Pierce the skin all over.<br>* Cover in fat.<br>* Roast at 350–400 for 60–120 minutes depending on size and shape.<br>* Cool for a few minutes.<br>* Pull flesh from skin.<br>* Mix &amp; melt butter into the flesh until its a consistent paste.<br>* Crack a few cardamom pods, pull out the seed ,grind it in a mortar and pestle, and add it the puree.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=76c521205494" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Constraint based APIs for async/await]]></title>
            <link>https://medium.com/@mikeal/constraint-based-apis-for-async-await-a07a4005ea5d?source=rss-70d203660866------2</link>
            <guid isPermaLink="false">https://medium.com/p/a07a4005ea5d</guid>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Mikeal Rogers]]></dc:creator>
            <pubDate>Wed, 08 Nov 2017 18:19:14 GMT</pubDate>
            <atom:updated>2017-11-08T19:21:20.242Z</atom:updated>
            <content:encoded><![CDATA[<p>New patterns enabled by async functions.</p><p>The more I live with async/await the more I discover new patterns and leave behind many old ones.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/850/1*Ioh7PPcMQ2EQCg7S44sHxg.jpeg" /></figure><p>One constraint of working with async/await is that we <strong>only have a single return value from async functions</strong>. In the old callback world, you could pass more than one success object to the callback.</p><p>In addition to multiple callback results, you also had the option of returning a stream from your function (while still accepting a callback) which allowed you to do hybrid APIs that accepted steam input/output in addition to function parameters and callbacks.</p><p>I used this heavily in <a href="https://github.com/request/request"><strong><em>request</em></strong></a>. The goal of request was always to reduce the amount of typing you had to do in order to use HTTP. But even as flexible as this API became, there was some common boilerplate you can find almost everywhere people use request.</p><pre>request(url, {json: true}, (err, resp, body) =&gt; {<br>  if (err) return cb(err)<br>  if (resp.statusCode !== 200) return cb(new JSONError(body))<br>  // success!<br>  console.log(body)<br>})</pre><p>In practice, I tend to write small functions on top of request to handle this boilerplate. But as I started taking async/await for granted these constraints began to weigh on me more and more. Eventually, I started thinking about an alternative approach.</p><h3>Constraints instead of features.</h3><p><strong><em>request</em></strong> implements many, many, features which you enable with different input options. When enabled, some of these features also impose constraints (enabling JSON decoding means non-JSON responses will fail) but these features are so general purpose that the constraints can’t expand enough to what you normally want (enabling JSON decoding <strong>DOES NOT</strong> impose that the status code must be 200).</p><p>When I wrote request I had already spent a lot of time with HTTP. I had done a lot in Python and eventually worked on Node.js Core HTTP adding features that also impacted request. request has always been an <strong>HTTP client from the perspective of someone who knows HTTP</strong>. But after 8 years of <em>using</em> request I have a much better idea of what a better pattern is for everyday use.</p><p>One big shift in my thinking is that the client<strong> shouldn’t offer features, it should offer constraints</strong>. I want to tell the client what is acceptable and build a single narrow path to success the client can impose without any other code on my part.</p><p>This fits well with the constraints of async/await. The more we constrain the success path the easier it is to get to a single return value and the closer that return value is to what the user wants it to be.</p><h3>Introducing <a href="https://github.com/mikeal/bent">bent</a></h3><pre>let request = bent()<br>let response = await request(url)</pre><p>This looks like nothing, but it’s actually already quite constrained by bent’s defaults. The method is GET, the status code <strong>must be</strong> 200, the return value is the response object (which is also a stream). But let’s do a bit more.</p><pre>let api = bent(&#39;https://api.site.com/v1&#39;, &#39;json&#39;)<br>let obj = await api(&#39;/entry/point.json&#39;)</pre><p>This is something I’m surprised I’ve never seen in HTTP clients given how common it is for a client to only operate on a single API service in a given code file. With bent, we create an async function prepared just for this API service, which is a JSON service at a base URL. The return values are now decoded JSON, any other response will generate an error.</p><p>Maybe there’s already a fancy computer science term for “function that returns an async function” but that’s not the part of this pattern that interests me. I’m much more interested in moving towards APIs that ask for “what is allowed” rather than just “what do you want to add.”</p><pre>let put = bent(&#39;PUT&#39;, &#39;https://api.site.com/v1&#39;, 201)<br>await put(&#39;/upload&#39;, Buffer.from(&#39;example&#39;))</pre><p>This function will also accept a stream.</p><pre>await put(&#39;/upload&#39;, fs.createReadStream(&#39;./file.txt&#39;))</pre><p>Another interesting thing about async/await is that we get to normalize input values (Buffer, JSON, or Stream). With callbacks you had an incentive to use the pipe interface when working with streams because it could often get you out of also requiring a callback. With async/await there’s no such benefit. In fact, you want the return value to remain the same between different input types so stream just becomes another parameter.</p><p>P.S. Like all the modules I write now, there’s 100% code coverage and automated releases w/ semantic-release. While this module is new, it’s actually pretty solid and on good footing 😀</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a07a4005ea5d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Perfect avatars w/ <compretend-img>]]></title>
            <link>https://medium.com/@mikeal/perfect-avatars-w-compretend-img-970c7679f773?source=rss-70d203660866------2</link>
            <guid isPermaLink="false">https://medium.com/p/970c7679f773</guid>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[css]]></category>
            <category><![CDATA[how-to]]></category>
            <dc:creator><![CDATA[Mikeal Rogers]]></dc:creator>
            <pubDate>Fri, 03 Nov 2017 22:51:53 GMT</pubDate>
            <atom:updated>2017-11-03T22:51:53.107Z</atom:updated>
            <content:encoded><![CDATA[<p>How-to create perfect avatars against any image, powered by Machine Learning.</p><p>One thing you see often are rounded avatar buttons. These are easy to add to your own app when the service, like Twitter, present images people already expect to be rounded.</p><p>But other login services, like Facebook, may not be giving an image that easily round-able or centered around the user’s face. <strong>Enter: &lt;compretend-img&gt;, an HTML Element powered by machine learning.</strong></p><p>Using facial detection, we can take almost any image a user gives us and create a perfect avatar.</p><p>I’ve put together a great <a href="https://glitch.com/edit/#!/compretend-img-quote">Glitch tutorial</a>, but I’ll also spell out the basics here.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1-loUx22yQHv-pcoszKUhw.png" /></figure><blockquote>1. &lt;script&gt; include the element.</blockquote><p>Add this to the &lt;head&gt; section of your website.</p><pre>&lt;script src=&quot;<a href="https://cdn.jsdelivr.net/npm/compretend-img/dist/compretend-img.min.js">https://cdn.jsdelivr.net/npm/compretend-img/dist/compretend-img.min.js</a>&quot;&gt;&lt;/script&gt;</pre><blockquote>2. Add style for image.</blockquote><p>Add the following CSS to the &lt;head&gt; section of your website for a 50px avatar.</p><pre>compretend-img img {<br>  width: 50px;<br>  border-radius: 50px;<br>}</pre><p>Note that there’s an image that loads <em>within</em> the &lt;compretend-img&gt; element.</p><p>3. Add a &lt;compretend-img&gt; element that crops faces.</p><p>Add the following HTML to your webpage.</p><pre>&lt;compretend-img crop=&quot;faces&quot; width=&quot;100&quot; margin=&quot;25&quot; scaled=&quot;2&quot; src=&quot;IMAGEURL&quot;&gt;<br>&lt;/compretend-img&gt;</pre><p>Let’s talk about the properties we’re setting here.</p><ul><li><strong><em>crop=”faces”</em></strong> Tells compretend to crop the image around facial detections</li><li><strong><em>width=”100&quot;</em></strong> Tells compretend that the target width is 100 pixels.</li><li><strong><em>margin=”25&quot;</em></strong> Tells compretend to add a 25 pixel margin around the detection cropping. This is so that when we round the image it doesn’t cut out the actual face.</li><li><strong><em>scaled=”2&quot;</em></strong> Tells compretend to scale the image to 2x the target width. This is so that the image still looks good on high resolution devices like iPhones.</li></ul><p>And that’s it!</p><p>You can check out the project on <a href="https://github.com/compretend/compretend-img">GitHub</a> and sign up to learn about more <a href="http://www.compretend.com/">stuff we’re doing at Compretend</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=970c7679f773" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Stop supporting old releases.]]></title>
            <link>https://medium.com/@mikeal/stop-supporting-old-releases-70cfa0e04b0c?source=rss-70d203660866------2</link>
            <guid isPermaLink="false">https://medium.com/p/70cfa0e04b0c</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[nodejs]]></category>
            <dc:creator><![CDATA[Mikeal Rogers]]></dc:creator>
            <pubDate>Fri, 03 Nov 2017 18:20:08 GMT</pubDate>
            <atom:updated>2017-11-03T18:31:22.378Z</atom:updated>
            <content:encoded><![CDATA[<p>A call to action for maintainers to support themselves and move forward.</p><p>Big notable projects like Linux and Node.js have comforting long term support cycles that ensure Enterprises and other production users can continue to use a release for years without migrating to a new one.</p><p>The ecosystems built on top of these projects tend to try and follow a similar cycle. They keep old releases in their CI configuration and <strong>block PR’s</strong> from being merged if they don’t work on older release lines.</p><p>I’m just going to come out and say it, <strong>this is a destructive practice for smaller projects.</strong></p><blockquote>1. This isn’t how LTS is done in big projects.</blockquote><p>You can send a pull request to Node.js today and get it merged without a single test on an old release line. In fact, it is only merged to the CURRENT release line and your review will likely only mention that release line.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GWcKN17PZz0PocFwBch4wA.gif" /><figcaption>Node.js LTS gif from 2016.</figcaption></figure><p>The LTS Working Group periodically takes recent changes and prepares a backport to an old release line. <strong>Who is the LTS Working Group?</strong> <em>Vendors</em>.</p><p>More specifically, it’s a collection of contributors that care about Long Term Support. All of them happen to work at companies with a strategic interest in Enterprise Node.js users (Google, IBM, NodeSource, Nearform).</p><p>LTS didn’t exist in Node.js until the Foundation brought these vendors into the process. It wouldn’t still exist without their involvement, and we’re all better for it.</p><p>You, in your GitHub project, <em>probably don’t have this kind of investment from vendors.</em></p><p>You, in your GitHub project, <em>probably don’t have the time or resources to manage more than one release line of development.</em></p><p>And yet, you’re putting up <strong><em>more</em></strong> of a barrier to contributions than big projects with lots of contributors and investment. <strong>Stop.</strong></p><blockquote>2. You’ll never get LTS contributions unless you stop providing them for free.</blockquote><p>Contributors to projects tend to be users of newer releases. This is partly because people that are willing to dig into the internals of a module they use are closer to the bleeding edge.</p><p>But another reason we don’t get as many users of older releases contributing is that we aren’t really asking them to. <strong>If they can’t use anything new, what is their incentive to contribute?</strong></p><p>If you cut support for an older release people <em>will</em> show up to complain, but how many of them are willing to contribute?<em> How many of them have ever even considered it necessary?</em></p><p><strong>We’ve cultivated a class of passive open source consumers</strong> who are disconnected from the realities facing the projects they depend on. If we are open to contributions to continue to support them,<em> then we should also require that they step up to do this work.</em></p><blockquote>3. You’re burning out maintainers.</blockquote><p>I’ve talked to a lot of open source developers about burnout. A common theme is that they feel like there are far too many expectations on too few people.</p><p>In particular, people feel an obligation to do work they don’t even personally care about or are connected to.</p><p>If people who care about long term support are part of your contributorship, you can empathize with their needs and work with them <em>as a peer</em>. But because so few of the users of old releases are involved in the development process, maintainers see them as freeloaders with unreasonable demands and expectations.</p><p>The fastest path to fix this is to simply <strong>stop supporting use cases for which nobody concerned with that case is willing to contribute</strong>. If you don’t want the burden of these expectations burning out contributors, just stop considering these requirements until people are willing to step in and do the work.</p><blockquote>4. Enterprise does not deserve a free ride.</blockquote><p>There’s a lot of money coming from Enterprise into open source. Many companies are willing and able to put resources in when necessary.</p><p>The reason they haven’t spent nearly as much time with smaller projects is because they just don’t need to, these projects are already bending over backwards to support them for free.</p><p>These companies have no problem pitching in when they have no other choice. If Enterprise companies depend on your software, there’s a vendor selling to them that will do whatever it takes to make them happy.</p><p>Saying you won’t do the work to support an old release isn’t saying “I don’t care about you being a user.” Instead, you’re saying that there are two ways they <em>can</em> be a user.</p><ul><li>Upgrade.</li><li>Help me keep it running for people who won’t upgrade.</li></ul><p><strong>Nobody is entitled to use software they don’t pay for without <em>any</em> effort whatsoever on their part.</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=70cfa0e04b0c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Calling Bulls**t on Blockchain]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@mikeal/calling-bulls-t-on-blockchain-80215d45f8f1?source=rss-70d203660866------2"><img src="https://cdn-images-1.medium.com/max/640/1*XJ1t6Rqx1xRvcvVrmrq1AQ.png" width="640"></a></p><p class="medium-feed-snippet">Notes on separating fact from fiction in the world of ICOs.</p><p class="medium-feed-link"><a href="https://medium.com/@mikeal/calling-bulls-t-on-blockchain-80215d45f8f1?source=rss-70d203660866------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@mikeal/calling-bulls-t-on-blockchain-80215d45f8f1?source=rss-70d203660866------2</link>
            <guid isPermaLink="false">https://medium.com/p/80215d45f8f1</guid>
            <category><![CDATA[blockchain]]></category>
            <category><![CDATA[ico]]></category>
            <category><![CDATA[investment]]></category>
            <category><![CDATA[ethereum]]></category>
            <category><![CDATA[investing]]></category>
            <dc:creator><![CDATA[Mikeal Rogers]]></dc:creator>
            <pubDate>Thu, 02 Nov 2017 17:23:22 GMT</pubDate>
            <atom:updated>2017-11-02T17:23:22.359Z</atom:updated>
        </item>
    </channel>
</rss>