<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Blog | Jonas Neubert</title><link>https://blog.jonasneubert.com/posts/</link><description>Recent content in Posts on Blog | Jonas Neubert</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://blog.jonasneubert.com/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>So you think this library can validate email addresses</title><link>https://blog.jonasneubert.com/2026/02/02/email-address-validation/</link><pubDate>Mon, 02 Feb 2026 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2026/02/02/email-address-validation/</guid><description>&lt;blockquote>
&lt;p>Let&amp;rsquo;s add some validation for this email address form field!&lt;/p>&lt;/blockquote>
&lt;p>I usually write software for automation, but like every software developer I&amp;rsquo;m not immune to email address validation.&lt;/p>
&lt;h2 id="so-you-think-you-can-validate-email-addresses">So you think you can validate email addresses&lt;/h2>
&lt;p>The FOSDEM 2018 talk &amp;ldquo;So you think you can validate email addresses&amp;rdquo; by &lt;a href="https://www.stavros.io">Stavros&lt;/a> has become a canonical reference for expressing the futility of all attempts to validate email addresses.
&lt;a href="https://www.youtube.com/watch?v=xxX81WmXjPg">You can watch it on Youtube&lt;/a>.
In the talk, Stavros shows a series of email addresses and asks the audience to shout &amp;ldquo;valid&amp;rdquo; or &amp;ldquo;invalid&amp;rdquo; for each one.
After 26 examples (that include 32 @ symbols) Stavros recommends a two step process for email address validation:&lt;/p></description></item><item><title>Migrating Projective Set from AngularJS v2 to VueJS v3</title><link>https://blog.jonasneubert.com/2023/08/14/migrating-projective-set-v2/</link><pubDate>Mon, 14 Aug 2023 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2023/08/14/migrating-projective-set-v2/</guid><description>&lt;p>Today I updated &lt;a href="https://projectiveset.jonemo.de/">a small web app&lt;/a> that I created a decade ago and haven&amp;rsquo;t touched since then.&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/p>
&lt;p>The tech stack of the old version was this:&lt;/p>
&lt;ul>
&lt;li>Bootstrap 2.3.2 (minified version included in repo)&lt;/li>
&lt;li>AngularJS 1.2.16 (embedded from &lt;a href="http://ajax.googleapis.com">http://ajax.googleapis.com&lt;/a> CDN URL)&lt;/li>
&lt;li>jQuery 1.8.3 (also from CDN)&lt;/li>
&lt;li>Github Pages for hosting (using legacy deployment method)&lt;/li>
&lt;/ul>
&lt;p>In total there were five files in the repo:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-txt" data-lang="txt">&lt;span style="display:flex;">&lt;span>CNAME # config for Github Pages hosting
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>README.md # to make something show up on the Github repo page
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>bootstrap.min.css # minified Bootstrap
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>controller.js # all logic, 152 lines including whitespace
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>index.html # template and inline CSS, 156 lines incl. whitespace
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>There was no build step. Just put these files into a web server directory and done.&lt;/p></description></item><item><title>How not to get Google Fiber in Salt Lake City</title><link>https://blog.jonasneubert.com/2023/03/05/google-fiber-in-salt-lake-city/</link><pubDate>Sun, 05 Mar 2023 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2023/03/05/google-fiber-in-salt-lake-city/</guid><description>&lt;p>This blog post is my (not sponsored) writeup of the experience of not getting a Google Fiber internet connection in Salt Lake City.
Spoiler: I published this in March 2023 over a Comcast Xfinity connection.&lt;/p>
&lt;p>We moved to Salt Lake City in the middle of last year and in January we bought a house here.
Salt Lake City is one of the 25 or so cities in the US where Google Fiber internet service is available.
It&amp;rsquo;s impossible not to know about that when you live here.
While living at our previous address, we received Google Fiber flyers in the mail almost weekly, saw annoyingly frequent repeats of their Youtube ads, so many online ads, full-page ads in the free local newspaper, billboards, etc.&lt;/p></description></item><item><title>The Best Python Packages for Reading Barcodes</title><link>https://blog.jonasneubert.com/2022/09/30/the-best-python-packages-for-reading-barcodes/</link><pubDate>Fri, 30 Sep 2022 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2022/09/30/the-best-python-packages-for-reading-barcodes/</guid><description>&lt;p>Three years ago I published a blog post on &lt;a href="https://blog.jonasneubert.com/2019/01/23/barcode-generation-python/">how to &lt;em>generate&lt;/em> barcodes using Python&lt;/a>. It&amp;rsquo;s one of the most visited posts on the blog! Occasionally a reader emails to ask: &amp;ldquo;But what if I want to &lt;em>read&lt;/em>/&lt;em>decode&lt;/em>/&lt;em>scan&lt;/em>&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> a barcode, not write it?&amp;rdquo;&lt;/p>
&lt;p>Here is the answer:&lt;/p>
&lt;h2 id="dont-use-python-for-barcode-decoding">Don&amp;rsquo;t use Python for Barcode Decoding!&lt;/h2>
&lt;p>You really shouldn&amp;rsquo;t be using pure Python to decode barcodes from images or videos or, worse, from camera streams.&lt;/p></description></item><item><title>List of US National Parks Twitter Accounts</title><link>https://blog.jonasneubert.com/2022/06/12/national-park-twitter-accounts/</link><pubDate>Sun, 12 Jun 2022 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2022/06/12/national-park-twitter-accounts/</guid><description>&lt;p>Apropos of nothing, here is a list of the official Twitter accounts of each US National Park.
It&amp;rsquo;s also available as a &lt;a href="https://twitter.com/i/lists/1533282194466058241?t=5Z-0-yrpYL0i7WAhyOjt8Q&amp;amp;s=09">Twitter List&lt;/a>.&lt;/p>
&lt;h2 id="the-list">The List&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>&lt;/th>
 &lt;th>Twitter Account&lt;/th>
 &lt;th>Twitter verified?&lt;/th>
 &lt;th>Followers&lt;/th>
 &lt;th>Tweets&lt;/th>
 &lt;th>Established in&lt;/th>
 &lt;th>Visitors in 2021&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Acadia&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/AcadiaNPS">@AcadiaNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>42343&lt;/td>
 &lt;td>2348&lt;/td>
 &lt;td>1919&lt;/td>
 &lt;td>4069098&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>American Samoa&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/NPamericansamoa">@NPamericansamoa&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>2565&lt;/td>
 &lt;td>528&lt;/td>
 &lt;td>1988&lt;/td>
 &lt;td>8495&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Arches&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/ArchesNPS">@ArchesNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>131174&lt;/td>
 &lt;td>3885&lt;/td>
 &lt;td>1971&lt;/td>
 &lt;td>1806865&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Badlands&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/BadlandsNPS">@BadlandsNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>187772&lt;/td>
 &lt;td>4547&lt;/td>
 &lt;td>1978&lt;/td>
 &lt;td>1224226&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Big Bend&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/BigBendNPS">@BigBendNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>14905&lt;/td>
 &lt;td>895&lt;/td>
 &lt;td>1944&lt;/td>
 &lt;td>581220&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Biscayne&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/BiscayneNPS">@BiscayneNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>20552&lt;/td>
 &lt;td>2723&lt;/td>
 &lt;td>1980&lt;/td>
 &lt;td>705655&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Black Canyon of the Gunnison&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/BlackCanyonNPS">@BlackCanyonNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>33491&lt;/td>
 &lt;td>1422&lt;/td>
 &lt;td>1999&lt;/td>
 &lt;td>308910&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Bryce Canyon&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/BryceCanyonNPS">@BryceCanyonNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>116597&lt;/td>
 &lt;td>2439&lt;/td>
 &lt;td>1928&lt;/td>
 &lt;td>2104600&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Canyonlands&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/CanyonlandsNPS">@CanyonlandsNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>90092&lt;/td>
 &lt;td>1711&lt;/td>
 &lt;td>1964&lt;/td>
 &lt;td>911594&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Capitol Reef&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/CapitolReefNPS">@CapitolReefNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>64018&lt;/td>
 &lt;td>1689&lt;/td>
 &lt;td>1971&lt;/td>
 &lt;td>1405353&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Carlsbad Caverns&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/CavernsNPS">@CavernsNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>13251&lt;/td>
 &lt;td>2677&lt;/td>
 &lt;td>1930&lt;/td>
 &lt;td>349244&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Channel Islands&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/CHISNPS">@CHISNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>7076&lt;/td>
 &lt;td>1574&lt;/td>
 &lt;td>1980&lt;/td>
 &lt;td>319252&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Congaree&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/CongareeNPS">@CongareeNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>202269&lt;/td>
 &lt;td>15438&lt;/td>
 &lt;td>2003&lt;/td>
 &lt;td>215181&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Crater Lake&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/CraterLakeNPS">@CraterLakeNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>37952&lt;/td>
 &lt;td>2329&lt;/td>
 &lt;td>1902&lt;/td>
 &lt;td>647751&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Cuyahoga Valley&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/CVNPNPS">@CVNPNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>12562&lt;/td>
 &lt;td>2238&lt;/td>
 &lt;td>2000&lt;/td>
 &lt;td>2575275&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Death Valley&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/DeathValleyNPS">@DeathValleyNPS&lt;/a>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>97930&lt;/td>
 &lt;td>1740&lt;/td>
 &lt;td>1994&lt;/td>
 &lt;td>1146551&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Denali&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/DenaliNPS">@DenaliNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>94631&lt;/td>
 &lt;td>5907&lt;/td>
 &lt;td>1917&lt;/td>
 &lt;td>229521&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Dry Tortugas&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/DryTortugasNPS">@DryTortugasNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>27006&lt;/td>
 &lt;td>1454&lt;/td>
 &lt;td>1992&lt;/td>
 &lt;td>83817&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Everglades&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/EvergladesNPS">@EvergladesNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>58393&lt;/td>
 &lt;td>5698&lt;/td>
 &lt;td>1934&lt;/td>
 &lt;td>942130&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Gates of the Arctic&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/GatesArcticNPS">@GatesArcticNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>21831&lt;/td>
 &lt;td>193&lt;/td>
 &lt;td>1980&lt;/td>
 &lt;td>7362&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Gateway Arch&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/GatewayArchNPS">@GatewayArchNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>4238&lt;/td>
 &lt;td>638&lt;/td>
 &lt;td>2018&lt;/td>
 &lt;td>1145081&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Glacier&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/GlacierNPS">@GlacierNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>317622&lt;/td>
 &lt;td>5877&lt;/td>
 &lt;td>1910&lt;/td>
 &lt;td>3081656&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Glacier Bay&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/GlacierBayNPS">@GlacierBayNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>59158&lt;/td>
 &lt;td>1629&lt;/td>
 &lt;td>1980&lt;/td>
 &lt;td>89768&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Grand Canyon&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/GrandCanyonNPS">@GrandCanyonNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>215701&lt;/td>
 &lt;td>14529&lt;/td>
 &lt;td>1919&lt;/td>
 &lt;td>4532677&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Grand Teton&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/GrandTetonNPS">@GrandTetonNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>142194&lt;/td>
 &lt;td>1834&lt;/td>
 &lt;td>1929&lt;/td>
 &lt;td>3885230&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Great Basin&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/GreatBasinNPS">@GreatBasinNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>47894&lt;/td>
 &lt;td>1612&lt;/td>
 &lt;td>1986&lt;/td>
 &lt;td>144875&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Great Sand Dunes&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/GreatDunesNPS">@GreatDunesNPS&lt;/a>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>788&lt;/td>
 &lt;td>84&lt;/td>
 &lt;td>2004&lt;/td>
 &lt;td>602613&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Great Smoky Mountains&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/GreatSmokyNPS">@GreatSmokyNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>100729&lt;/td>
 &lt;td>2698&lt;/td>
 &lt;td>1934&lt;/td>
 &lt;td>14161548&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Guadalupe Mountains&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/GuadalupeMtnsNP">@GuadalupeMtnsNP&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>7360&lt;/td>
 &lt;td>284&lt;/td>
 &lt;td>1966&lt;/td>
 &lt;td>243291&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Haleakalā&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/HaleakalaNPS">@HaleakalaNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>11511&lt;/td>
 &lt;td>1263&lt;/td>
 &lt;td>1961&lt;/td>
 &lt;td>853181&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Hawaiʻi Volcanoes&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/Volcanoes_NPS">@Volcanoes_NPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>39934&lt;/td>
 &lt;td>1669&lt;/td>
 &lt;td>1916&lt;/td>
 &lt;td>1262747&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Hot Springs&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>1921&lt;/td>
 &lt;td>2162884&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Isle Royale&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>2019&lt;/td>
 &lt;td>25844&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Indiana Dunes&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/IndianaDunesNPS">@IndianaDunesNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>5984&lt;/td>
 &lt;td>1624&lt;/td>
 &lt;td>1940&lt;/td>
 &lt;td>3177210&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Joshua Tree&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/JoshuaTreeNPS">@JoshuaTreeNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>108247&lt;/td>
 &lt;td>7251&lt;/td>
 &lt;td>1994&lt;/td>
 &lt;td>3064400&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Katmai&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/KatmaiNPS">@KatmaiNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>109981&lt;/td>
 &lt;td>3853&lt;/td>
 &lt;td>1980&lt;/td>
 &lt;td>24764&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Kenai Fjords&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/KenaiFjordsNPS">@KenaiFjordsNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>35446&lt;/td>
 &lt;td>2380&lt;/td>
 &lt;td>1980&lt;/td>
 &lt;td>411782&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Kings Canyon&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/SequoiaKingsNPS">@SequoiaKingsNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>142693&lt;/td>
 &lt;td>3265&lt;/td>
 &lt;td>1940&lt;/td>
 &lt;td>562918&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Kobuk Valley&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>1980&lt;/td>
 &lt;td>11540&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Lake Clark&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/LakeClarkNPS">@LakeClarkNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>39274&lt;/td>
 &lt;td>3638&lt;/td>
 &lt;td>1980&lt;/td>
 &lt;td>18278&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Lassen Volcanic&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/LassenNPS">@LassenNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>47704&lt;/td>
 &lt;td>1387&lt;/td>
 &lt;td>1916&lt;/td>
 &lt;td>359635&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Mammoth Cave&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/MammothCaveNP">@MammothCaveNP&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>12503&lt;/td>
 &lt;td>1405&lt;/td>
 &lt;td>1941&lt;/td>
 &lt;td>515774&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Mesa Verde&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>1906&lt;/td>
 &lt;td>548477&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Mount Rainier&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/MountRainierNPS">@MountRainierNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>76662&lt;/td>
 &lt;td>7887&lt;/td>
 &lt;td>1899&lt;/td>
 &lt;td>1670063&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>New River Gorge&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/NewRiverNPS">@NewRiverNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>6673&lt;/td>
 &lt;td>1297&lt;/td>
 &lt;td>2020&lt;/td>
 &lt;td>1682720&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>North Cascades&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/NCascadesNPS">@NCascadesNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>31836&lt;/td>
 &lt;td>810&lt;/td>
 &lt;td>1968&lt;/td>
 &lt;td>17855&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Olympic&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/OlympicNP">@OlympicNP&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>38985&lt;/td>
 &lt;td>1669&lt;/td>
 &lt;td>1938&lt;/td>
 &lt;td>2718925&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Petrified Forest&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/PetrifiedNPS">@PetrifiedNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>66885&lt;/td>
 &lt;td>6604&lt;/td>
 &lt;td>1962&lt;/td>
 &lt;td>590334&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Pinnacles&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/PinnaclesNPS">@PinnaclesNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>31280&lt;/td>
 &lt;td>1712&lt;/td>
 &lt;td>2013&lt;/td>
 &lt;td>348857&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Redwood&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/RedwoodNPS">@RedwoodNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>69059&lt;/td>
 &lt;td>1707&lt;/td>
 &lt;td>1968&lt;/td>
 &lt;td>435879&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Rocky Mountain&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/rockynps">@rockynps&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>71208&lt;/td>
 &lt;td>18248&lt;/td>
 &lt;td>1915&lt;/td>
 &lt;td>4434848&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Saguaro&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/SaguaroNPS">@SaguaroNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>37957&lt;/td>
 &lt;td>2971&lt;/td>
 &lt;td>1994&lt;/td>
 &lt;td>1079786&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Sequoia&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/SequoiaKingsNPS">@SequoiaKingsNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>142693&lt;/td>
 &lt;td>3265&lt;/td>
 &lt;td>1890&lt;/td>
 &lt;td>1059548&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Shenandoah&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/ShenandoahNPS">@ShenandoahNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>40479&lt;/td>
 &lt;td>2457&lt;/td>
 &lt;td>1935&lt;/td>
 &lt;td>1592312&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Theodore Roosevelt&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/TRooseveltNPS">@TRooseveltNPS&lt;/a>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>13966&lt;/td>
 &lt;td>2008&lt;/td>
 &lt;td>1978&lt;/td>
 &lt;td>796085&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Virgin Islands&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>1956&lt;/td>
 &lt;td>323999&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Voyageurs&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/VoyageursNPS">@VoyageursNPS&lt;/a>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>300&lt;/td>
 &lt;td>25&lt;/td>
 &lt;td>1975&lt;/td>
 &lt;td>243042&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>White Sands&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/WhiteSandNps">@WhiteSandNps&lt;/a>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>48&lt;/td>
 &lt;td>4&lt;/td>
 &lt;td>2019&lt;/td>
 &lt;td>782469&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Wind Cave&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/WindCaveNPS">@WindCaveNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>3185&lt;/td>
 &lt;td>226&lt;/td>
 &lt;td>1903&lt;/td>
 &lt;td>709001&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Wrangell–St. Elias&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/WrangellStENPS">@WrangellStENPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>21377&lt;/td>
 &lt;td>2233&lt;/td>
 &lt;td>1980&lt;/td>
 &lt;td>50189&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Yellowstone&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/YellowstoneNPS">@YellowstoneNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>903759&lt;/td>
 &lt;td>6598&lt;/td>
 &lt;td>1872&lt;/td>
 &lt;td>4860242&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Yosemite&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/YosemiteNPS">@YosemiteNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>764114&lt;/td>
 &lt;td>8922&lt;/td>
 &lt;td>1890&lt;/td>
 &lt;td>3287595&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Zion&lt;/td>
 &lt;td>&lt;a href="https://twitter.com/ZionNPS">@ZionNPS&lt;/a>&lt;/td>
 &lt;td>✓&lt;/td>
 &lt;td>173459&lt;/td>
 &lt;td>3945&lt;/td>
 &lt;td>1919&lt;/td>
 &lt;td>5039835&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="whats-not-included">What&amp;rsquo;s not included&lt;/h2>
&lt;p>If you go on Twitter and search for National Parks lists, you will find many lists that contain many more entries than the 54 shown above.
What causes the discrepancy?&lt;/p></description></item><item><title>Further Reading (vol 2): Research Breakthroughs that led to mRNA COVID-19 Vaccines</title><link>https://blog.jonasneubert.com/2021/02/06/further-reading-2-research-breakthroughs-mrna-covid-19-vaccines/</link><pubDate>Sat, 06 Feb 2021 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2021/02/06/further-reading-2-research-breakthroughs-mrna-covid-19-vaccines/</guid><description>&lt;p>It’s been quite exhilarating for &lt;a href="https://www.linkedin.com/in/cornelia-scheitz/">Conny&lt;/a> and I to see our article about &lt;a href="https://blog.jonasneubert.com/2021/01/10/exploring-the-supply-chain-of-the-pfizer-biontech-and-moderna-covid-19-vaccines/">the vaccine supply chain&lt;/a> go viral (no pun intended). The most exciting part of it all are the emails from readers who share insights or ask questions. And as a result we continue to read and find more interesting articles.&lt;/p>
&lt;p>My previous &lt;a href="https://blog.jonasneubert.com/2021/01/22/further-reading-behind-the-scenes-pfizer-biontech-moderna-supply-chains/">list of links for further reading&lt;/a> was, inadvertently, focused on activities that happened during 2020 and what happened behind the scenes at Pfizer, BioNTech, and Moderna. This week’s set of links looks further back into history and introduces people and events related to mRNA research going as far back as the 1970s.&lt;/p></description></item><item><title>Further Reading: Behind the Scenes of the Pfizer-BioNTech and Moderna Supply Chains</title><link>https://blog.jonasneubert.com/2021/01/22/further-reading-behind-the-scenes-pfizer-biontech-moderna-supply-chains/</link><pubDate>Fri, 22 Jan 2021 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2021/01/22/further-reading-behind-the-scenes-pfizer-biontech-moderna-supply-chains/</guid><description>&lt;p>For our in-depth article about &lt;a href="https://blog.jonasneubert.com/2021/01/10/exploring-the-supply-chain-of-the-pfizer-biontech-and-moderna-covid-19-vaccines/">the supply chain of the Pfizer-BioNTech and Moderna COVID-19 vaccines&lt;/a>, my co-author and better half &lt;a href="https://www.linkedin.com/in/cornelia-scheitz/">Conny&lt;/a> and I read hundreds of articles, data sheets, and press releases. Some of them were captivating reads full of interesting behind-the-scenes stories and background information, but only appear as a small footnote in the main article. The following is a selection of some of these articles (and one video). Most are quite long, so make sure to reserve an hour of reading time before you start clicking the links!&lt;/p></description></item><item><title>Exploring the Supply Chain of the Pfizer/BioNTech and Moderna COVID-19 vaccines</title><link>https://blog.jonasneubert.com/2021/01/10/exploring-the-supply-chain-of-the-pfizer-biontech-and-moderna-covid-19-vaccines/</link><pubDate>Sun, 10 Jan 2021 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2021/01/10/exploring-the-supply-chain-of-the-pfizer-biontech-and-moderna-covid-19-vaccines/</guid><description>&lt;p>&lt;em>Sections of this post were co-authored by &lt;a href="https://www.linkedin.com/in/cornelia-scheitz/">Cornelia Scheitz&lt;/a>.&lt;/em>
&lt;em>Noah Leidinger created a &lt;a href="https://www.noahleidinger.com/unlisted/covid19">German translation&lt;/a>.&lt;/em>
&lt;em>Piotr Kwapin created a &lt;a href="https://wpunkt.org/analiza-lancucha-dostaw-szczepionek-pfizer-biontech-i-moderna-przeciwko-covid-19/">Polish translation&lt;/a>.&lt;/em>
&lt;em>Last updated on February 7, 2021.&lt;/em>&lt;/p>
&lt;p>Bert Hubert’s excellent and widely shared article about &lt;a href="https://berthub.eu/articles/posts/reverse-engineering-source-code-of-the-biontech-pfizer-vaccine/">Reverse Engineering the source code of the Pfizer-BioNTech SARS-CoV-2 Vaccine&lt;/a> is all it took to turn hundreds of software engineers and other Silicon Valley types into armchair vaccine experts overnight! Jokes aside, the article explains the 4284 base long mRNA inside the Pfizer-BioNTech’s COVID-19 vaccine for those who are more familiar with software than molecular biology.&lt;/p></description></item><item><title>Using pymodbus to communicate with a PLC</title><link>https://blog.jonasneubert.com/2019/11/02/using-pymodbus-to-communicate-with-a-plc/</link><pubDate>Sat, 02 Nov 2019 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2019/11/02/using-pymodbus-to-communicate-with-a-plc/</guid><description>&lt;p>&lt;em>This post is part 4 of &lt;a href="https://blog.jonasneubert.com/2019/10/27/what-is-a-plc-and-how-do-i-talk-python-to-it/">a series&lt;/a> covering material I presented in a &lt;a href="https://jonasneubert.com/talks/python2019.html">talk at PyCon 2019&lt;/a>.&lt;/em>&lt;/p>
&lt;p>In the previous parts of this series, I covered &lt;a href="https://blog.jonasneubert.com/2019/10/28/what-is-a-programmable-logic-controller/">what a PLC is&lt;/a>, and &lt;a href="https://blog.jonasneubert.com/2019/10/29/ladder-logic/">how PLCs are programmed&lt;/a>.
In industry, the Python developer is usually not involved in the purchasing, installing, and programming of a PLC.
If you find yourself working with PLCs in academia or for a hobby project, you might actually be the one doing these things yourself.
Either way, I assume that you somehow found yourself with a programmed PLC and now want to connect to it using Python.&lt;/p></description></item><item><title>Ladder Logic‽</title><link>https://blog.jonasneubert.com/2019/10/29/ladder-logic/</link><pubDate>Tue, 29 Oct 2019 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2019/10/29/ladder-logic/</guid><description>&lt;p>&lt;em>This post is part 3 of &lt;a href="https://blog.jonasneubert.com/2019/10/27/what-is-a-plc-and-how-do-i-talk-python-to-it/">a series&lt;/a> covering material I presented in a &lt;a href="https://jonasneubert.com/talks/python2019.html">talk at PyCon 2019&lt;/a>.&lt;/em>&lt;/p>
&lt;p>Most software engineers are used to writing text-based code using a text editor &lt;a href="https://en.wikipedia.org/wiki/Editor_war">of their choice&lt;/a>.
Things work a little bit differently in the world of PLCs.
To program a Programmable Logic Controller (PLC), you can&amp;rsquo;t just open up your favorite text editor and start typing away PLC code.
First, PLC logic isn&amp;rsquo;t programmed in text (exceptions apply, see below).
Second, you can&amp;rsquo;t use your favorite programming software; instead you will be using the one programming software that the vendor of your PLC provides.&lt;/p></description></item><item><title>What is a Programmable Logic Controller?</title><link>https://blog.jonasneubert.com/2019/10/28/what-is-a-programmable-logic-controller/</link><pubDate>Mon, 28 Oct 2019 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2019/10/28/what-is-a-programmable-logic-controller/</guid><description>&lt;p>&lt;em>This post is part 2 of &lt;a href="https://blog.jonasneubert.com/2019/10/27/what-is-a-plc-and-how-do-i-talk-python-to-it/">a series&lt;/a> covering material I presented in a &lt;a href="https://jonasneubert.com/talks/python2019.html">talk at PyCon 2019&lt;/a>.&lt;/em>&lt;/p>
&lt;p>I have prepared three different conference talks about PLCs for Python programmers.
Annoyingly, you can&amp;rsquo;t assume that every Python programmer knows what a PLC is, so I always have to sacrifice a few minutes of my time slot&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> to convey the basics before diving into my actual topic.
This blog post is the content I have settled on for those first five minutes of my talks.&lt;/p></description></item><item><title>What is a PLC and how do I talk Python to it?</title><link>https://blog.jonasneubert.com/2019/10/27/what-is-a-plc-and-how-do-i-talk-python-to-it/</link><pubDate>Sun, 27 Oct 2019 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2019/10/27/what-is-a-plc-and-how-do-i-talk-python-to-it/</guid><description>&lt;p>&lt;em>This post is part 1 of a series. Scroll down for a table of contents.&lt;/em>&lt;/p>
&lt;p>If you&amp;rsquo;ve found your way to this blog, chances are you already know that I&amp;rsquo;ve given a few conference talks about using Python in automation.
You are right now reading the blog post version of content I presented at PyCon 2019.
I started my talk there by answering the question:
&lt;strong>Why do I keep talking about this topic?&lt;/strong>&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/p></description></item><item><title>List of PLC brands and products</title><link>https://blog.jonasneubert.com/2019/04/27/list-of-plc-brand-names-and-products/</link><pubDate>Sat, 27 Apr 2019 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2019/04/27/list-of-plc-brand-names-and-products/</guid><description>&lt;p>tl;dr: &lt;a href="https://docs.google.com/spreadsheets/d/15R6rOn6HexPPkxQu_sHcqVbk_W1myLeLFAvGkUWLZfw/edit?usp=sharing">Here&amp;rsquo;s the link to the spreadsheet&lt;/a>.&lt;/p>
&lt;p>I&amp;rsquo;ve been thinking about Programmable Logic Controllers (PLC) again recently, not least because I am preparing &lt;a href="https://us.pycon.org/2019/schedule/presentation/237/">a conference talk&lt;/a> about them. While putting together the presentation I thought to myself &amp;ldquo;Why not make a list of PLC products out there, I wonder how many there are‽&amp;rdquo;&lt;/p>
&lt;p>Turns out, there are quite a few! After three evenings of research I had a spreadsheet of 144 product lines. That number shouldn&amp;rsquo;t be a surprise given that this is a 50-year-old technology that is ubiquitous in factories, infrastructure, and machinery.&lt;/p></description></item><item><title>My US Travel Map</title><link>https://blog.jonasneubert.com/2019/03/22/my-us-travel-map/</link><pubDate>Fri, 22 Mar 2019 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2019/03/22/my-us-travel-map/</guid><description>&lt;p>I have wanted to create a visualization of some of my travels for a long time but always got stuck procrastinating the details: Which arbitrary geographical divisions to use? Countries? Cities? Do transfer airports count?&lt;/p>
&lt;p>&lt;a href="https://www.reddit.com/r/MapPorn/comments/a9cu33/finally_finished_a_map_of_everywhere_ive_been_i/">This random Reddit post&lt;/a>&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> gave me the motivation to finally do &lt;em>something&lt;/em>. Following the example of the Redditor who posted this, I used &lt;a href="https://mapchart.net/usa-counties.html">mapchart.net&lt;/a> to color-code the counties&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup> of the US according to whether I had been there.&lt;/p></description></item><item><title>The Best Python Packages for Generating Barcodes</title><link>https://blog.jonasneubert.com/2019/01/23/barcode-generation-python/</link><pubDate>Wed, 23 Jan 2019 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2019/01/23/barcode-generation-python/</guid><description>&lt;p>Barcodes are a cheap and ubiquitous way to add machine-readable information to an object. I think of barcodes as the real-world equivalent of browser cookies: For example, when you arrive at airport departures, the airline hands you a boarding pass with a barcode (the cookie). From that point onward you&amp;rsquo;re asked to show your barcode at every interaction: at security, the duty-free shop, and the boarding gate. And just like the information stored in browser cookies, the information in barcodes isn&amp;rsquo;t in plain sight but easily made visible.&lt;/p></description></item><item><title>Hiking in Vall de Boí</title><link>https://blog.jonasneubert.com/2018/09/23/hiking-in-vall-de-boi/</link><pubDate>Sun, 23 Sep 2018 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2018/09/23/hiking-in-vall-de-boi/</guid><description>&lt;p>I travel to Germany to visit family approximately once every 18 months. This year, I mixed things up a little bit and asked my mother and my sister to meet me in Spain for a hiking vacation. We ended up spending five days in Vall de Boí, a dead end mountain valley in the Pyrenees. One valley to the west is the border between Catalonia and Aragon, 50 miles to the north is the border to France.&lt;/p></description></item><item><title>The PyCon Speaker Experience (is phenomenal)</title><link>https://blog.jonasneubert.com/2017/11/20/the-pycon-speaker-experience/</link><pubDate>Mon, 20 Nov 2017 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2017/11/20/the-pycon-speaker-experience/</guid><description>&lt;p>The &lt;a href="https://us.pycon.org/2018/">PyCon 2018&lt;/a> website is up and the January 3rd deadline for &lt;a href="https://us.pycon.org/2018/speaking/">talk proposals&lt;/a> is approaching steadily. Could there be a better time than this to reflect on my experience as a first-time speaker at PyCon 2017 and maybe encourage someone else to be a first-time speaker in 2018?&lt;/p>
&lt;p>I&amp;rsquo;m not a seasoned public speaker by any measure, but I have talked in front of audiences while waving my arms at slideshows a hand-full of times, and somewhat regularly go to events where others do the same. I&amp;rsquo;ve also been humbled by how hard it is to stage even a small speaking event while co-organizing &lt;a href="http://ignitetalks.io">Ignite&lt;/a> Ithaca.&lt;/p></description></item><item><title>Publishing your First PyPI Package by/for the Absolute Beginner</title><link>https://blog.jonasneubert.com/2017/09/13/publishing-your-first-pypi-package/</link><pubDate>Wed, 13 Sep 2017 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2017/09/13/publishing-your-first-pypi-package/</guid><description>&lt;p>The process for packaging and publishing Python packages is subject to much community discussion and frequent change. That leads to a lot of outdated information about it floating around the interwebs.&lt;/p>
&lt;p>As part of &lt;a href="https://blog.jonasneubert.com/2017/06/10/pycon-2017-video/">my PyCon 2017 talk&lt;/a> preparations I wrote &lt;a href="https://github.com/jonemo/microscan-driver">a driver for a barcode reader&lt;/a> that was part of the live demo in my presentation. Having never published a package to PyPI before&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>, I thought this would be a good opportunity to learn about the Python Package Index (PyPI) and how to use it.&lt;/p></description></item><item><title>PyCon 2017 Talk</title><link>https://blog.jonasneubert.com/2017/06/10/pycon-2017-video/</link><pubDate>Sat, 10 Jun 2017 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2017/06/10/pycon-2017-video/</guid><description>&lt;iframe width="853" height="480" src="https://www.youtube-nocookie.com/embed/cEyVfiix1Lw?rel=0" frameborder="0" allowfullscreen>&lt;/iframe>
&lt;p>The PyCon talk which I&amp;rsquo;ve been preparing for with steadily increasing stress levels since February happened three weeks ago at PyCon 2017 in Portland. Time to post a quick retrospective!&lt;/p>
&lt;p>The recording of the talk is up &lt;a href="https://www.youtube.com/watch?v=cEyVfiix1Lw">on Youtube&lt;/a>. Huge props to the PyCon organizers for posting all talk recordings publicly every year. This year the videos were up less than 24 hours after the talk!&lt;/p>
&lt;p>I also put together &lt;a href="https://gist.github.com/jonemo/b276f6fb1d5b189ffbcae3569b999b36#file-presentation-md">Github Gist with links and notes&lt;/a> to go along with the talk, and the slide deck is up &lt;a href="https://speakerdeck.com/jonemo/factory-automation-with-python-pycon-2017">on Speakerdeck&lt;/a> (although the slide deck only covers what was on screen for half of the talk, the other half consisting of the demo).&lt;/p></description></item><item><title>PyCon Talk Progress Update: Hindsight is 80/20</title><link>https://blog.jonasneubert.com/2017/04/27/hindsight-is-80-20/</link><pubDate>Thu, 27 Apr 2017 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2017/04/27/hindsight-is-80-20/</guid><description>&lt;p>The high level update on my PyCon talk prep is that I&amp;rsquo;m currently making the transition from making steady deliberate progress to a more panic-driven hair-on-fire style of working. Three weeks from today this thing better works&amp;ndash;on stage, and in Portland.&lt;/p>
&lt;p>On a more technical level, the status is that I have a working prototype of my demo and am confident that I can construct a good talk narrative around it. Here&amp;rsquo;s what the prototype currently looks like (cat for scale):&lt;/p></description></item><item><title>I took a shower on a train and I liked it</title><link>https://blog.jonasneubert.com/2017/04/17/california-zephyr/</link><pubDate>Mon, 17 Apr 2017 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2017/04/17/california-zephyr/</guid><description>&lt;p>Conny and I recently took Amtrak&amp;rsquo;s California Zephyr train from Chicago back home to San Francisco. Knowing the troubled relationship the US has with railway travel, I was anxious about being on a train for 48 hours. But the small inconveniences of living on a train were far outweighed by the enjoyment of watching the countryside pass by outside the window.&lt;/p>
&lt;p>Since regularly crossing Germany by train to get to an from boarding school, I enjoy trains as one of the few places where I experience boredom, albeit only in homeopathic doses. This time, I had the serendipitous idea to &amp;ldquo;tweet-storm&amp;rdquo; a series of 29 photos from the 2,438 miles long trip. Here are the tweets:&lt;/p></description></item><item><title>PyCon Talk Progress Update: What needs to be in a Robotics Demo?</title><link>https://blog.jonasneubert.com/2017/03/13/whats-in-a-robotics-demo/</link><pubDate>Mon, 13 Mar 2017 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2017/03/13/whats-in-a-robotics-demo/</guid><description>&lt;p>It&amp;rsquo;s been a month since &lt;a href="https://blog.jonasneubert.com/2017/02/12/tap-tap-tap/">my factory automation talk got accepted into PyCon&lt;/a>. If you&amp;rsquo;ve been following along by means of this blog you&amp;rsquo;ve seen that I &lt;a href="https://blog.jonasneubert.com/2017/02/26/intro-to-barcode-readers/">bought a barcode reader on Ebay&lt;/a>, &lt;a href="https://blog.jonasneubert.com/2017/03/06/ms3-serial-adapter/">made an adapter for it&lt;/a> and wasted some time figuring out &lt;a href="https://blog.jonasneubert.com/2017/03/07/serial-to-usb-on-mac/">how to do Serial-to-USB on a Mac&lt;/a>.&lt;/p>
&lt;p>Barcode readers are cool stuff, but when you promised a factory automation demo, reading a few barcodes doesn&amp;rsquo;t really cut it. The same goes for a lot of other automation equipment like pushers, shakers, label printers and so on: It might technically be factory automation, but nobody comes to PyCon to see tech that contains fewer transistors than the blender in their kitchen at home.&lt;/p></description></item><item><title>One simple trick for USB-to-Serial on MacOS X</title><link>https://blog.jonasneubert.com/2017/03/07/one-simple-trick-usb-to-serial-macos-x/</link><pubDate>Tue, 07 Mar 2017 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2017/03/07/one-simple-trick-usb-to-serial-macos-x/</guid><description>&lt;p>Call me a Luddite if you wish, but I lament the lack of serial ports in modern laptops.&lt;/p>
&lt;p>My relationship with USB-to-Serial cables has been one of disappointments, crashed computers, and garbled data. The one I pulled out of a drawer this week randomly flipped the most significant bit of every character. How do I know this? Because I wasted three long nights debugging the problem.&lt;/p>
&lt;p>But I&amp;rsquo;m a changed person now because I learned this one amazing trick for making USB-to-Serial &lt;em>just work&lt;/em> on macOS:&lt;/p></description></item><item><title>MS3 Adapter for Serial Port and Power</title><link>https://blog.jonasneubert.com/2017/03/06/ms3-serial-adapter/</link><pubDate>Mon, 06 Mar 2017 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2017/03/06/ms3-serial-adapter/</guid><description>&lt;p>In last week&amp;rsquo;s post
&lt;a href="https://blog.jonasneubert.com/2017/02/26/intro-to-barcode-readers/">about barcode readers&lt;/a>
I mentioned that I purchased an &lt;a href="http://www.microscan.com/en-us/products/laser-barcode-scanners/ms-3-compact-laser-barcode-scanner">MS3 from Microscan&lt;/a> for my PyCon demo.
What I had forgotten from last time I worked with the MS3 is that the pin-out of cable attached to the barcode reader is not just a DB9 (nine pin) serial port connector but a DB15 (VGA style) plug.
Those extra pins are used for sending power to the device and to accommodate a few extra features, namely trigger and reset inputs.&lt;/p></description></item><item><title>Intro to Barcode Readers</title><link>https://blog.jonasneubert.com/2017/02/26/intro-to-barcode-readers/</link><pubDate>Sun, 26 Feb 2017 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2017/02/26/intro-to-barcode-readers/</guid><description>&lt;p>If you read &lt;a href="https://blog.jonasneubert.com/2017/02/12/tap-tap-tap/">last week&amp;rsquo;s blog post&lt;/a> you already know that I&amp;rsquo;ve got three months to put together a physical demo for a &lt;a href="https://us.pycon.org/2017/schedule/presentation/747/">PyCon talk about factory automation&lt;/a>. This post is the first in a series of progress updates.&lt;/p>
&lt;p>In robotics and automation, the smallest realistic demo has three parts: Sensing, control, and actuation. I spent Week 1 selecting and bargain hunting for an industrial barcode reader to cover the &lt;em>sensing&lt;/em> part of the demo. As I went along I wrote up my notes as an &amp;ldquo;Introduction to Barcode Readers&amp;rdquo;; if you only want to know what I ended up buying, scroll down to the end!&lt;/p></description></item><item><title>Tap, Tap, Tap</title><link>https://blog.jonasneubert.com/2017/02/12/tap-tap-tap/</link><pubDate>Sun, 12 Feb 2017 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2017/02/12/tap-tap-tap/</guid><description>&lt;p>&amp;hellip; is this thing still on?&lt;/p>
&lt;p>Besides &lt;a href="http://manufacturingporn.com/archive">that Tumblr blog where I collect factory flicks on a NSFW domain&lt;/a>, I haven&amp;rsquo;t produced much written content for public consumption over the past three years. Looks like they even shut down Google Reader because this blog dried up!&lt;/p>
&lt;p>But things are about to change! Here&amp;rsquo;s the plan:&lt;/p>
&lt;p>My talk proposal for &lt;a href="https://us.pycon.org/2017/">PyCon 2017&lt;/a> just got accepted (via a detour through the backup talks list). The title that my &lt;a href="http://www.cppasiapacific.com/content/Look%20Inside/4278.pdf">pressure prompted&lt;/a> brain came up with a few hours before the submission deadline:&lt;/p></description></item><item><title>Robotics Journals Comparison</title><link>https://blog.jonasneubert.com/2014/01/05/robotics-journals/</link><pubDate>Sun, 05 Jan 2014 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2014/01/05/robotics-journals/</guid><description>&lt;p>I didn&amp;rsquo;t get a chance to do a lot of writing during my time in grad school. Ironically, recently I had to do a lot of writing to be formally left out of grad school.&lt;/p>
&lt;p>One of the first steps of the actual writing process for a journal paper is to select a journal to publish in. Things to consider are the relevance and impact of the journal, and mechanical details such as limits on page count. None of this info is easy to find, so I set down for a few hours and compiled the following table for seven of the better known robotics journals.&lt;/p></description></item><item><title>Manufacturers are also just Middle Men</title><link>https://blog.jonasneubert.com/2012/05/06/manufacturers-are-also-just-middlemen/</link><pubDate>Sun, 06 May 2012 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2012/05/06/manufacturers-are-also-just-middlemen/</guid><description>&lt;blockquote>
&lt;p>Any market where unnecessary middlemen stand between customers and their successful use of a solution is about to be disrupted.&lt;/p>&lt;/blockquote>
&lt;p>This quote is from &lt;a href="http://www.fastcompany.com/1835983/the-simplicity-thesis">an article&lt;/a> by Box.net founder Aaron Levi on FastCompany.com. It got me thinking about how bad life must be as a Middle Man.&lt;/p>
&lt;p>In the article, Levi mentions Amazon and Ebay as examples for simplicity through disintermediation. Both companies drastically improved processes by removing intermediate parties, aka “Middle Men”. Ebay did it with private sales, and Amazon did it with book sales, then sales of everything, then server commissioning, then book authorship, and so on. Today the trend to kill middle men keeps most of the world&amp;rsquo;s tech startups busy: Uber, Exec, Spotify, 23andMe, etc—everybody is trying to kill some sort of middle man. Who are these unfortunate people in the middle?&lt;/p></description></item><item><title>Why I stopped using GMail</title><link>https://blog.jonasneubert.com/2012/02/07/why-i-stopped-using-gmail/</link><pubDate>Tue, 07 Feb 2012 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2012/02/07/why-i-stopped-using-gmail/</guid><description>&lt;p>I am a fan of Google products. When Google Voice first came out I went around begging people to invite me and have been using it ever since as my primary number. I can't even remember how I read RSS feeds before there was Google Reader. And Gmail! I was a little hesitant when it was first released but for the past years Gmail was the first browser tab I opened in the morning and the last one I closed at night. The list goes on. According to my &lt;a href="https://www.google.com/settings/products">Google Accounts page&lt;/a> I use 30 different Google services.&lt;/p></description></item><item><title>The Cubelets arrived!</title><link>https://blog.jonasneubert.com/2011/07/18/the-cubelets-arrived/</link><pubDate>Mon, 18 Jul 2011 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2011/07/18/the-cubelets-arrived/</guid><description>&lt;p>Exciting times in modular robotics land! A &lt;a href="http://www.modrobotics.com/eric/">former coworker of mine&lt;/a> started a company aptly named "&lt;a href="http://www.modrobotics.com/">Modular Robotics&lt;/a>" who, over the past years, developed a modular robotic &lt;strike>toy&lt;/strike> construction kit named &lt;a href="http://www.modrobotics.com/cubelets">Cubelets&lt;/a>. After spending years &lt;a href="http://www.modrobotics.com/blog/?p=195">finding out how hard developing a hardware product is&lt;/a>, they finally shipped the first batch of 100 beta release kits recently shipped. Being excited about having modular robots around that (unlike my own research modular robots) function reliably, I couldn't resist shooting a short video of my first experiments with Cubelets.&amp;nbsp;&lt;/p></description></item><item><title>How to enable developer mode on a HP TouchPad</title><link>https://blog.jonasneubert.com/2011/07/16/how-to-enable-developer-mode-on-a-hp-touchpad/</link><pubDate>Sat, 16 Jul 2011 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2011/07/16/how-to-enable-developer-mode-on-a-hp-touchpad/</guid><description>&lt;p>This might be a no-brainer for developers who developed for webOS phones in the past. But if you are getting started programming for webOS with a HP Touchpad and the (relatively) new Enyo framework like I am doing right now, you'll have a hard time figuring out how to test your app on the actual device.&lt;/p>
&lt;p>&lt;strong>Step 1: Put your device in developer mode&lt;/strong>&lt;/p>
&lt;p>&lt;span>In "Just Type" enter&amp;nbsp;&lt;em>webos20090606&lt;/em>. If you happen to have a lot of time on your hands you can also enter&amp;nbsp;&lt;em>upupdowndownleftrightleftrightbastart &lt;/em>(the &lt;a href="http://en.wikipedia.org/wiki/Konami_Code" title="Konami Code on Wikipedia">Konami Code&lt;/a>).&amp;nbsp;Both secret phrases will result in a otherwise hidden button appearing:&lt;/span>&lt;/p></description></item><item><title>Fluidinfo API: Likes &amp; Dislikes</title><link>https://blog.jonasneubert.com/2011/04/24/fluidinfo-api-likes-and-dislikes/</link><pubDate>Sun, 24 Apr 2011 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2011/04/24/fluidinfo-api-likes-and-dislikes/</guid><description>&lt;p>I spent the last two weekends[1] working with the Fluidinfo API (&lt;a href="https://blog.jonasneubert.com/2011/04/16/hello-fluidinfo-api-competition/">here is why&lt;/a>). Using Fluidinfo is pretty easy, I found two weekends enough to discover most of what is possible with Fluidinfo.[2] Here&amp;rsquo;s my collection of likes and dislikes which accumulated while working with Fluidinfo. In the spirit of a true pessimist, I start with dislikes.&lt;/p>
&lt;h2 id="dislikes">Dislikes&lt;/h2>
&lt;ol>
&lt;li>Among the very first things I learned while playing with Fluidinfo: You can delete your root namespace but you can&amp;rsquo;t re-create it. If you sign up with the username skillshelv.es your root namespace will be &lt;code>skillshelv.es&lt;/code> (big surprise) meaning that all your tags will be in the format &lt;code>skillshelv.es/tagname&lt;/code> or &lt;code>skillshelv.es/subnamespace/tagname&lt;/code>. Because you have the ability to manage sub-namespaces under your root namespace, Fluidinfo exposes the ability to delete namespaces. When I first tried out the Python Library, the first thing I managed to do successfully was to delete my root namespace &lt;code>skillshelv.es&lt;/code>. Trying to recreate it results in a permission error. That&amp;rsquo;s why all Skillshelv.es related tags now live in the alternate namespace &lt;code>skillshelves&lt;/code> which I obtained after creating a second account.&lt;/li>
&lt;li>There is no results pagination and no way of limiting the result count. &lt;a href="http://doc.fluidinfo.com/fluidDB/queries.html#query-result-limits">The heading of the docs chapter on query results limits&lt;/a> sounds promising, but only talks about hard limits imposed by Fluidinfo, not limits set in the query. &lt;a href="http://fluiddb.fluidinfo.com/values?query=has%20oreilly.com/title&amp;amp;tag=oreilly.com/title&amp;amp;tag=oreilly.com/author-names">Try querying for the titles and author names of all O&amp;rsquo;Reilly books stored in Fluidinfo&lt;/a>. You get 2373 book titles and their respective authors, totaling half a megabyte of data. If you only want to show the first ten, you&amp;rsquo;ll still have to query all of them.&lt;/li>
&lt;li>Fluidinfo (sometimes) is slooooooooow. &lt;a href="http://fluiddb.fluidinfo.com/values?query=has%20oreilly.com/title&amp;amp;tag=oreilly.com/title&amp;amp;tag=oreilly.com/author-names">The query mentioned above&lt;/a> takes somewhere between 8 seconds and forever to return results. That&amp;rsquo;s a long time if you know that your user is waiting for a page to display. It&amp;rsquo;s an even longer time if you are using Google App Engine: GAE has a hard limit of 10 seconds on how long an outgoing HTTP request may wait for a response. On Skillshelv.es I work around long load times by running all Fluidinfo GET queries in Javascript. That way I can display a loading indicator while the Fluidinfo data is loading. This gives the user something to see and shifts the blame to Fluidinfo :-) More generally, though, it means that Fluidinfo shouldn&amp;rsquo;t be the datastore you query when generating pages. A potential solution might be allowing to limit the result count (see #2) which might reduce processing time on the Fluidinfo side and reduces the amount of data to be transferred.&lt;/li>
&lt;li>Object IDs can&amp;rsquo;t be used in queries. It&amp;rsquo;s easy to get a list of all tag names that are attached to an object. It&amp;rsquo;s not so easy getting the values of all those tags. Fluidinfo only provides a clear method to retrieve exactly one tag value associated with a specific object at a time, e.g. &lt;a href="http://fluiddb.fluidinfo.com/objects/83b8917f-e078-43c8-96fd-0007a6835009/oreilly.com/title">the title of a certain O&amp;rsquo;Reilly book&lt;/a>. If you want multiple tag values at the same time, you&amp;rsquo;ll have to use the /values API endpoint, like in &lt;a href="http://fluiddb.fluidinfo.com/values?query=oreilly.com/title+matches+%22python%22&amp;amp;tag=oreilly.com/title&amp;amp;tag=oreilly.com/author-names">this example which gives you title and price of all O&amp;rsquo;Reilly books whose title contains &amp;ldquo;PHP&amp;rdquo;&lt;/a>. Fluidinfo gives you a pretty neat query language to define which objects are included in the response for a query to &lt;code>/values&lt;/code>, but querying for an object ID isn&amp;rsquo;t part of that query language. Therefore, you can&amp;rsquo;t retrieve multiple tag values for a single object at a time, unless you already know one tag value that uniquely identifies this object. For O&amp;rsquo;Reilly books the contents of &lt;code>oreilly.com/id&lt;/code> seem to be unique and Skillshelv.es uses it equivalently to a primary ID. &lt;em>Update: I mentioned this in the Fluidinfo IRC channel and apparently this is now a ticket and might become a feature in future.&lt;/em>&lt;/li>
&lt;li>While &lt;a href="http://blogs.fluidinfo.com/fluidinfo/2011/03/21/examples-of-fluidinfo-oreilly-api-queries/">this Fluidinfo blog post&lt;/a> suggests that Fluidinfo&amp;rsquo;s &lt;code>matches&lt;/code> operator for text matching works like MySQL&amp;rsquo;s &lt;code>LIKE&lt;/code>, it doesn&amp;rsquo;t actually. &lt;code>matches&lt;/code> only matches full words. That&amp;rsquo;s not unsurprising but was a little disappointing when I tried building an auto-complete feature that pulls data directly from Fluidinfo.&lt;/li>
&lt;/ol>
&lt;h2 id="likes">Likes&lt;/h2>
&lt;ol>
&lt;li>First class user support! When I &lt;a href="https://twitter.com/jonemo/status/56951196916776961">reported #1 of the dislikes above via Twitter&lt;/a>, Fluidinfo&amp;rsquo;s CEO &lt;a href="https://twitter.com/terrycojones/status/57177719225589761">replied within a few hours acknowledging the issue&lt;/a>. Later I figured out that most the action is going on in Fluidinfo&amp;rsquo;s IRC channel where the folks behind Fluidinfo seem to always be hanging out waiting for people to approach them with their problems. When one of my (valid) queries wouldn&amp;rsquo;t work one day, the problem was fixed in no time and on top I got a ton of useful advice.&lt;/li>
&lt;li>&lt;a href="https://explorer.fluidinfo.com/fluidinfo/oreilly.com">Fluidinfo Explorer&lt;/a>. This tool didn&amp;rsquo;t seem very useful to me at first but then I discovered the context menu and the login button :-) Once you have some data in Fluidinfo and you want to quickly check or change a few entries, nothing beats this tool.&lt;/li>
&lt;li>There are &lt;del>a million&lt;/del> lots of ways to access Fluidinfo. Libraries are available for &lt;a href="http://github.com/maxapps/FluidDBServer">Adobe AIR&lt;/a>, &lt;a href="http://github.com/hugoduncan/clj-fluiddb">Clojure&lt;/a>, &lt;a href="http://github.com/micrypt/GoFluidDB">Go&lt;/a>, &lt;a href="http://github.com/ntoll/JFluidDB">Java&lt;/a>, &lt;a href="http://github.com/ecarnevale/jsFluidDB">Javascript&lt;/a>, &lt;a href="http://github.com/hdurer/cl-fluiddb">Lisp&lt;/a>, &lt;a href="http://github.com/ntoll/FluidDB.NET">.NET&lt;/a>, &lt;a href="http://github.com/fxn/net-fluidinfo">Perl&lt;/a>, &lt;a href="http://github.com/paparent/phpFluidDB">PHP&lt;/a>, &lt;a href="https://github.com/fluidinfo/fluidinfo.py">Python&lt;/a>, &lt;a href="https://github.com/gridaphobe/fluidinfo.rb">Ruby&lt;/a> and &lt;a href="http://www.squeaksource.com/FluidDB.html">Smalltalk&lt;/a>. And Fluidinfo supports JSONP and CORS. It&amp;rsquo;s really nice to be able to hit the ground running in whatever language you like best. Compare this to &lt;a href="https://developers.google.com/products/?csw=1">some big companies who have tens of APIs, each with libraries available in another random selection of two or three languages&lt;/a>.&lt;/li>
&lt;/ol>
&lt;h2 id="footnotes">Footnotes:&lt;/h2>
&lt;p>[1] Like every good grad student I did not devote the entire weekend but also did some &lt;del>real&lt;/del> research work on these weekends.&lt;/p></description></item><item><title>Fluidinfo API Contest: Design Decisions</title><link>https://blog.jonasneubert.com/2011/04/18/fluidinfo-api-contest-design-decisions/</link><pubDate>Mon, 18 Apr 2011 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2011/04/18/fluidinfo-api-contest-design-decisions/</guid><description>&lt;p>I announced yesterday that I am currently working on a submission to the O&amp;rsquo;Reilly/Fluidinfo API contest. You should check out the other submissions so far:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://www.bookchirpa.com/">BookChirpa&lt;/a> by Mark McSpadden is a data mashup project showing recent tweets about O&amp;rsquo;Reilly books enriched with information about these books which is pulled from Fluidinfo. There is an &lt;a href="http://www.bookchirpa.com/about">About page with a whole bunch of technical info&lt;/a>. Ironically, the top entry on the &lt;a href="http://www.bookchirpa.com/books">Bookchirpa library page&lt;/a> is &amp;ldquo;21 Recipes for Mining Twitter&amp;rdquo;.&lt;/li>
&lt;li>David Karapetyan opts for a submission which only adds data to the Fluidinfo data store but doesn&amp;rsquo;t have a frontend. That&amp;rsquo;s legit by the contest rules. &lt;a href="http://articulationstudy.posterous.com/oreilly-writable-api-competition">Here&amp;rsquo;s a blog post about how he added Amazon Suggestions to each book&lt;/a>. 90% of his post are crossed out indicating that the story behind his submission isn&amp;rsquo;t exactly linear.&lt;/li>
&lt;li>Eric Seidel&amp;rsquo;s submission is really similar to Skillshelv.es. Shockingly similar. &lt;a href="http://eseidel.org/blog/2011/04/fluidinfo-oreilly-competition/">Read about it in his blog&lt;/a>. By the looks of it he&amp;rsquo;s been a Fluidinfo aficionado before because his prior project FluidCV is based on it. His submission to the contest is to let people add O&amp;rsquo;Reilly books to their FluidCV to - hold your breath - show their skills based on the books they own. Disclaimer: I hadn&amp;rsquo;t seen his project when I started working on &lt;a href="http://www.skillshelv.es/">Skillshelv.es&lt;/a>.&lt;/li>
&lt;li>Michael Hawes noticed that the books which Fluidinfo imported into their database are only those English language ones sold in the USA. But O&amp;rsquo;Reilly also publishes books in other languages in the small part of the earth known as ROTW to Americans (the acronym stands for both Rest of the World and Rim of the World). He embarked on the mission to add links to the foreign language equivalents to all existing Fluidinfo book objects. Like David K.&amp;rsquo;s entry, Michael&amp;rsquo;s has no front page, &lt;a href="http://www.gottahavacuppamocha.com/about/oreilly-fluidinfo-api-competition/">but extensive documentation on his blog&lt;/a>.&lt;/li>
&lt;li>Rachel Willmer &lt;a href="http://luzme.com/blog/2011/04/luzme-enters-fluidinfos-writable-api-competition/">wrote an extension&lt;/a> to her eBook price aggregator &lt;a href="http://www.luzme.com/">Luzme.com&lt;/a> to send up to date eBook pricing details into the Fluidinfo data store. She writes that she will only sync this data for the duration of the competition but I sure hope she continues to do so after the deadline on Sunday night.
It strikes me how open everyone is about what their entry is and how they went about creating it. So I won&amp;rsquo;t hold back either and write up the details on my submission, predominantly in this blog and maybe later on as part of the Skillshelv.es site. Today, let&amp;rsquo;s talk about the design decision that had to be made before I started touching my keyboard.&lt;/li>
&lt;/ul>
&lt;h2 id="quick-recap">Quick Recap&lt;/h2>
&lt;p>Here&amp;rsquo;s the quick technical summary of what my submission will do: Each book will be tagged with one or more skills representing the expertise conveyed in the book. Each book will also be tagged with usernames to represent ownership. Based on this info, users&amp;rsquo; skill levels and some other derivative data will be computed.&lt;/p></description></item><item><title>Hello Fluidinfo API Competition</title><link>https://blog.jonasneubert.com/2011/04/16/hello-fluidinfo-api-competition/</link><pubDate>Sat, 16 Apr 2011 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2011/04/16/hello-fluidinfo-api-competition/</guid><description>&lt;p>How does a small startup get the word out about their API? The people at Fluidinfo probably thought that a full page ad in the New York Times is a bad idea. They decided to run a contest instead. If things go well, contests are great because tens or hundreds or thousands of people (&amp;ldquo;contest participants&amp;rdquo;) create value according to your specification but you only have to pay a few of them (&amp;ldquo;lucky winners&amp;rdquo;). If all goes wrong only a few people create very little value and you have to pay all of them. That&amp;rsquo;s really all there is to know about contests.&lt;/p></description></item><item><title>Hello World!</title><link>https://blog.jonasneubert.com/2011/04/16/hello-world/</link><pubDate>Sat, 16 Apr 2011 00:00:00 +0000</pubDate><guid>https://blog.jonasneubert.com/2011/04/16/hello-world/</guid><description>&lt;p>Today is the day I start text blogging. Text blogging is a new thing for me. I’ve had two photo blogs before: &lt;a href="http://jonemo.de/thedailylondonphoto/">The Daily London Photo&lt;/a> and &lt;a href="http://ithacadailyphoto.blogspot.com/">The Daily Ithaca Photo&lt;/a> (together with &lt;a href="http://www.corneliascheitz.com/">Conny&lt;/a> and &lt;a href="https://twitter.com/#!/alicere">Alice&lt;/a>). For most photos I usually wrote a short text, sometimes &lt;a href="http://ithacadailyphoto.blogspot.com/2010/04/547-street-light.html">descriptive&lt;/a>, occasionally &lt;a href="http://ithacadailyphoto.blogspot.com/2009/10/379-stop-it.html">unrelated&lt;/a> and often &lt;a href="http://ithacadailyphoto.blogspot.com/2010/03/529-new-carshare-car.html">completely made up&lt;/a>. But times have changed.&lt;/p>
&lt;p>Let’s quickly looks at blogs with Venn Diagrams. First, there’s the personal blog where one person writes about all the things that are going on in their head. “Personal blog” is actually a bit of a misnomer because the odd, the embarrassing and the stuff that’s actually personal doesn’t appear on most personal blogs.&lt;/p></description></item></channel></rss>