<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Josh Austin&#39;s Blog</title>
    <link>https://jaustin.io/index.xml</link>
    <description>Recent content on Josh Austin&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 27 Nov 2016 09:00:00 -0500</lastBuildDate>
    <atom:link href="https://jaustin.io/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>hugo blog issues</title>
      <link>https://jaustin.io/posts/2016/11/27/hugo-blog-issues</link>
      <pubDate>Sun, 27 Nov 2016 09:00:00 -0500</pubDate>
      
      <guid>https://jaustin.io/posts/2016/11/27/hugo-blog-issues</guid>
      <description>

&lt;p&gt;The conversion to a Hugo based blog from a Wordpress based blog went pretty smoothly, but there were a few issues that came up during the conversion. I was able to work through some of the issues, but some are still pending.&lt;/p&gt;

&lt;h3 id=&#34;export-from-wordpress&#34;&gt;Export From Wordpress&lt;/h3&gt;

&lt;p&gt;The first issue I encountered was that the plugin to export a Wordpress blog to Hugo wasn&amp;rsquo;t very easy to use. The Hugo documentation suggested that an easier path would be to use the &lt;a href=&#34;https://wordpress.org/plugins/jekyll-exporter/&#34;&gt;Jekyll-Exporter&lt;/a&gt; plugin and then import using the built-in &amp;ldquo;Import from Jekyll&amp;rdquo; command in Hugo. Fortunately this worked really well. All of my pictures were imported to the appropriate Hugo static path and all the links seemed to work great.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m not 100% certain but I think I would need to install the &amp;ldquo;Export to Hugo&amp;rdquo; plugin from the terminal by copying its files directly into the correct Wordpress directory location. The plugin readme also recommends running the export from the terminal and for some folks that might be a bridge too far. As a comparison I was able to install the Jekyll-Exporter plugin from inside the Wordpress admin interface and run it from there. It seems like this is an easier approach and I would recommend it over using the &amp;ldquo;Export to Hugo&amp;rdquo; plugin for most people.&lt;/p&gt;

&lt;p&gt;I consider this issue solved since the Jekyll-Exporter plugin worked so well.&lt;/p&gt;

&lt;h3 id=&#34;css-issues&#34;&gt;CSS Issues&lt;/h3&gt;

&lt;p&gt;The next issue I noticed was some of my links and images were running off the page and causing horizontal scroll bars. I don&amp;rsquo;t remember if I had to tweak the CSS on the Wordpress site to get the look I wanted or if it looked that way by default.&lt;/p&gt;

&lt;p&gt;This issue is still pending and I suspect I&amp;rsquo;ll have to add a few tweaks to my CSS to get the correct look for the new site.&lt;/p&gt;

&lt;h3 id=&#34;mobile-workflow&#34;&gt;Mobile Workflow&lt;/h3&gt;

&lt;p&gt;One of the great things about the Wordpress ecosystem is that there are a bunch of options for writing posts and managing the site from a mobile device. I need to figure out some sort of workflow so I can compose/edit and publish from my mobile device.&lt;/p&gt;

&lt;p&gt;One issue that has been pretty easy to sort out is a mobile Markdown editor. I&amp;rsquo;m writing this on the &lt;a href=&#34;http://1writerapp.com/&#34;&gt;1Writer&lt;/a&gt; app which has been excellent so far. I&amp;rsquo;m not sure how to handle the TOML front-matter Hugo needs but I think I may be able to write a script to generate it.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;m storing my Hugo source folder on Dropbox so accessing my content folder is super easy and any documents I compose or edit will be synced back to my Linux workstation when I save them. Right now I&amp;rsquo;m thinking I&amp;rsquo;ll SSH into my workstation and run &lt;code&gt;hugo&lt;/code&gt; then &lt;code&gt;rsync&lt;/code&gt; to update the site on the Digital Ocean droplet where it&amp;rsquo;s hosted.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>license</title>
      <link>https://jaustin.io/license/</link>
      <pubDate>Mon, 21 Nov 2016 10:12:44 -0500</pubDate>
      
      <guid>https://jaustin.io/license/</guid>
      <description>&lt;p&gt;&lt;a rel=&#34;license&#34; href=&#34;http://creativecommons.org/licenses/by-sa/4.0/&#34;&gt;&lt;img alt=&#34;Creative Commons License&#34; style=&#34;border-width:0&#34; src=&#34;https://i.creativecommons.org/l/by-sa/4.0/88x31.png&#34; /&gt;&lt;/a&gt;&lt;br /&gt;This work is licensed under a &lt;a rel=&#34;license&#34; href=&#34;http://creativecommons.org/licenses/by-sa/4.0/&#34;&gt;Creative Commons Attribution-ShareAlike 4.0 International License&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>new blog</title>
      <link>https://jaustin.io/posts/2016/11/21/new-blog</link>
      <pubDate>Mon, 21 Nov 2016 09:08:48 -0500</pubDate>
      
      <guid>https://jaustin.io/posts/2016/11/21/new-blog</guid>
      <description>

&lt;p&gt;I&amp;rsquo;m updating my blog to run as a &amp;ldquo;static&amp;rdquo; website using the static site generator &lt;a href=&#34;https://gohugo.io&#34;&gt;Hugo&lt;/a&gt; instead of &lt;a href=&#34;https://wordpress.org/&#34;&gt;WordPress&lt;/a&gt; like I&amp;rsquo;ve used in the past. There are several reasons for this, but largely it&amp;rsquo;s that maintaining an active site is kind of a pain and I&amp;rsquo;ve got plenty of other stuff to do.&lt;/p&gt;

&lt;p&gt;In order to get this off the ground, I&amp;rsquo;m using the Hugo &lt;a href=&#34;https://gohugo.io/overview/quickstart/&#34;&gt;Quick Start Guide&lt;/a&gt;. I&amp;rsquo;m going to try and just follow the instructions they provide and we&amp;rsquo;ll see how easy it is to move from an old WordPress site to a new Hugo site.&lt;/p&gt;

&lt;p&gt;After getting the content moved over I&amp;rsquo;ll need to worry about comments. I don&amp;rsquo;t see a good way to import existing comments but I figure I can make this transition once and use some sort of &amp;ldquo;comments-as-a-service&amp;rdquo; service to deal with the issue of commenting going forward. But if I can&amp;rsquo;t get that to work in a way that makes me happy I won&amp;rsquo;t worry about it. The comments were mostly spam anyway.&lt;/p&gt;

&lt;h3 id=&#34;themes&#34;&gt;Themes&lt;/h3&gt;

&lt;p&gt;When choosing a theme I had a bit of trouble figuring out which of the available themes was well maintained and had responsive templates. I ended up just cloning the entire theme repository and using &lt;code&gt;ack&lt;/code&gt; to track down some themes with keywords that I was looking for. I ended up using &lt;a href=&#34;https://github.com/zyro/hyde-x&#34;&gt;hyde-x&lt;/a&gt; which seems like a reasonably well maintained clone of the classic &lt;a href=&#34;https://github.com/poole/hyde&#34;&gt;hyde&lt;/a&gt; theme for &lt;a href=&#34;http://jekyllrb.com/&#34;&gt;Jekyll&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&#34;embedded-code&#34;&gt;Embedded Code&lt;/h3&gt;

&lt;p&gt;Just a quick test of what embedded Elixir source code might look like:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-elixir&#34;&gt;@spec new([redis_pool_option]) :: {:ok, pool} | {:error, reason}
def new(opts) when is_list(opts) do
  worker_opts = [
    id: :erlang.make_ref()
  ]
  child_spec = worker(ExRedisPool.RedisPool, [opts], worker_opts)
  {:ok, pid} = Supervisor.start_child(ExRedisPool.Supervisor, child_spec)
  pid
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That is really not too bad.&lt;/p&gt;

&lt;h3 id=&#34;next&#34;&gt;Next&amp;hellip;&lt;/h3&gt;

&lt;p&gt;I&amp;rsquo;m going to give this &lt;a href=&#34;https://github.com/SchumacherFM/wordpress-to-hugo-exporter&#34;&gt;Wordpress-to-Hugo-Exporter&lt;/a&gt; mentioned on the Hugo &lt;a href=&#34;https://gohugo.io/tools/&#34;&gt;Tools&lt;/a&gt; page a try to move my old posts from the WordPress site over to the new Hugo Site. We&amp;rsquo;ll see how it goes.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Dell m3800 Developer Edition</title>
      <link>https://jaustin.io/2015/05/dell-m3800-developer-edition/</link>
      <pubDate>Fri, 15 May 2015 14:12:45 +0000</pubDate>
      
      <guid>https://jaustin.io/2015/05/dell-m3800-developer-edition/</guid>
      <description>&lt;p&gt;A developer has different priorities than a general user when selecting a laptop, especially for work. Right now IMHO the most exiting option is the &lt;a href=&#34;http://www.dell.com/us/business/p/precision-m3800-workstation/pd&#34;&gt;Dell m3800&lt;/a&gt; in &lt;a href=&#34;http://www.dell.com/learn/us/en/555/campaigns/xps-linux-laptop?c=us&amp;amp;#038;l=en&amp;amp;#038;s=biz&#34;&gt;developer edition&lt;/a&gt; trim. Here is a picture of my new m3800 in developer edition trim at the coffee shop!&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://joshaust.in/wp-content/uploads/2015/05/my_m3800_small.jpg&#34;&gt;&lt;img src=&#34;http://joshaust.in/wp-content/uploads/2015/05/my_m3800_small.jpg&#34; alt=&#34;my_m3800_small&#34; width=&#34;800&#34; height=&#34;600&#34; class=&#34;alignnone size-full wp-image-895&#34; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the last several years I&amp;#8217;ve had a MacBook Pro as my primary workstation and like most recent Apple products, it is quite polished. The main issue is that I generally don&amp;#8217;t write software designed to run on OS X. I write software designed to run on Linux. A bunch of options like &lt;a href=&#34;https://www.vagrantup.com/&#34;&gt;Vagrant&lt;/a&gt; and more recently &lt;a href=&#34;http://www.docker.com/&#34;&gt;Docker&lt;/a&gt; have cropped up to help provide a Linux environment on OS X. And of course there is always the option of simply running a plain old virtual machine.&lt;/p&gt;

&lt;p&gt;These solutions are fine and work well for many things, but one place they fall short is debugging. Does anyone like using a remote debugger? They are better now than ever, but the experience still isn&amp;#8217;t great and that might push a developer toward using Linux as their primary desktop OS rather than something like OS X.&lt;/p&gt;

&lt;p&gt;I probably don&amp;#8217;t need to mention the host of other reasons that Linux makes a nice desktop OS but the other main issue for me is that as nice as &lt;a href=&#34;https://www.macports.org/&#34;&gt;MacPorts&lt;/a&gt; and &lt;a href=&#34;http://brew.sh/&#34;&gt;Homebrew&lt;/a&gt; are, they really don&amp;#8217;t compare to the package managers available in Linux.&lt;/p&gt;

&lt;p&gt;As much as I would like to think that the good folks at Dell are working on providing machines like the m3800 with Linux pre-installed because they just love developers so much, I have to think that the real reason the suits green-lighted the Sputnik program is because &lt;strong&gt;they smell blood in the water&lt;/strong&gt; due to Apple&amp;#8217;s tendency to move OS X closer and closer to the idiot proof experience provided in iOS. With each new release, OS X has added behaviors clearly targeted at getting iOS users to buy a Mac.&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s not a bad business decision on Apple&amp;#8217;s part, but improvements that power users would like seem to be ignored. There are basic things missing from the OS X experience like window management because the average OS X user doesn&amp;#8217;t have multiple large format external displays on their desk. Additionally Apple doesn&amp;#8217;t seem to trust outside developers with reasonable access to the bug reporting system. Let&amp;#8217;s not kid ourselves, Darwin is not really an open-source project. And with basic features like Window management and package management missing from OS X, developers often look to Linux as an alternative.&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s what makes the Sputnik project at Dell so exciting to me. Linux has always suffered from a rough user experience on laptops because the integration work is not trivial to get a desktop environment running well, with reasonable battery life, and working track-pad drivers. Let&amp;#8217;s not even get started on suspend/resume functionality or getting the graphics stack working properly.&lt;/p&gt;

&lt;p&gt;The m3800 experience is not like that. It&amp;#8217;s not rough at all. It&amp;#8217;s not the padded room experience like OS X, but it&amp;#8217;s very nice. The experience with the m3800 is the experience I hoped I would have the last time I tried to install Linux on my MacBook Pro.&lt;/p&gt;

&lt;p&gt;My only suggestion to Dell is to make sure enough resources are allocated to maintain and improve the user experience with Linux. With the business support structure already in place it&amp;#8217;s easy to imagine 75 of these m3800 laptops provisioned for our engineering group. The m3800 developer edition does not need to be less expensive than the Windows version of the same laptop. I would gladly pay the extra $100 for the computer without the windows license if that extra money could be reinvested into the Sputnik Project.&lt;/p&gt;

&lt;p&gt;If the developer edition laptops run a higher profit margin for Dell that would hopefully provide a good incentive for them to produce the very best laptop for running Linux. Who knows they might even design laptops from the ground up to run Linux rather than just making sure it runs properly on the most suitable variants of the machines designed to run Windows. I know not everyone may agree with that, but if your reasons for using Linux are strictly financial, your priorities are different than mine.&lt;/p&gt;

&lt;p&gt;Anyway, kudos to Dell for a great job bringing this product to market!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Setting up WiFi on Ubuntu 14.04 Server from the Terminal</title>
      <link>https://jaustin.io/2014/12/setting-up-wifi-on-ubuntu-14-04-server-from-the-terminal/</link>
      <pubDate>Sat, 27 Dec 2014 21:56:57 +0000</pubDate>
      
      <guid>https://jaustin.io/2014/12/setting-up-wifi-on-ubuntu-14-04-server-from-the-terminal/</guid>
      <description>&lt;p&gt;I was setting up a server today and I didn&amp;#8217;t have a wired ethernet drop available for it but I did have WiFi. So I decided to just setup WiFi for today and get it plugged into the network on Monday. I mean how hard could it be to set up wifi right?&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://joshaust.in/wp-content/uploads/2014/12/misc-are-you-fucking-kidding-me-clean-l.png&#34;&gt;&lt;img style=&#34;display: block; margin-left: auto; margin-right: auto; max-width: 100%; width: 200px;&#34; class=&#34;alignnone size-full wp-image-880&#34; src=&#34;http://joshaust.in/wp-content/uploads/2014/12/misc-are-you-fucking-kidding-me-clean-l.png&#34; alt=&#34;misc-are-you-fucking-kidding-me-clean-l&#34; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I started with this article on the Ubuntu community help portal:&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;httphttps://help.ubuntu.com/community/NetworkConfigurationCommandLine/Automatic#WPA_supplicant&#34;&gt;https://help.ubuntu.com/community/NetworkConfigurationCommandLine/Automatic#WPA_supplicant&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have to admit this got me most of the way, but for my machine there was a crucial piece of configuration missing. It turns out there are two driver options available for wifi cards, &lt;strong&gt;wext&lt;/strong&gt; and &lt;strong&gt;nl80211&lt;/strong&gt;. It took me far too many &lt;del datetime=&#34;2014-12-27T21:38:44+00:00&#34;&gt;minutes&lt;/del&gt; hours of googling to discover this. Here was the page that explained it for me:&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://unix.stackexchange.com/questions/97828/driver-d-option-under-wpa-supplicant&#34;&gt;http://unix.stackexchange.com/questions/97828/driver-d-option-under-wpa-supplicant&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After updating the driver, here is what my &lt;strong&gt;wpa.sh&lt;/strong&gt; file looks like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/bin/bash
### BEGIN INIT INFO
# Provides: wpa
# Required-Start: $network $syslog $local_fs
# Required-Stop: $network $syslog $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start/stop script for wpa supplicant
# Description: Custom start/stop script for wpa_supplicant.
### END INIT INFO

SELF=`basename $0`
WPA=wpa_supplicant
PROGRAM=/sbin/${WPA}
CONF=/etc/${WPA}.conf
INTERFACE=wlan0
DRIVER=nl80211
DAEMONMODE=&amp;quot;-B&amp;quot;
LOGFILE=/var/log/$WPA.log

function start() {

# TODO: Support multiple interfaces and drivers
OPTIONS=&amp;quot;-c $CONF -i $INTERFACE -D $DRIVER $DAEMONMODE&amp;quot;

## You can remove this if you are running 8.10 and up.
# Ubuntu 8.10 and up doesn&#39;t need the -w anymore..
# And the logfile option is not valid on 8.04 and lower
local ver=$(lsb_release -sr | sed -e &#39;s/\.//g&#39;);
[ $ver -lt 810 ] &amp;amp;&amp;amp; OPTIONS=&amp;quot;$OPTIONS -w&amp;quot; &amp;amp;&amp;amp; LOGFILE=&amp;quot;&amp;quot;
##

# Log to a file
[ -n &amp;quot;$LOGFILE&amp;quot; ] &amp;amp;&amp;amp; OPTIONS=&amp;quot;$OPTIONS -f $LOGFILE&amp;quot;

echo &amp;quot; * Starting wpa supplicant&amp;quot;
eval $PROGRAM $OPTIONS
}

function stop() {
echo &amp;quot; * Stopping wpa supplicant&amp;quot;
pkill $PROGRAM
}

function debug() {
stop
DAEMONMODE=&amp;quot;-ddd&amp;quot;
start
}

function restart() {
stop
start
}

function status() {
pgrep -lf $PROGRAM
}

function usage() {
echo &amp;quot;Usage: $SELF &amp;lt;start|stop|status|debug&amp;gt;&amp;quot;
return 2
}

case $1 in
start|stop|debug|status) $1 ;;
*) usage ;;
esac
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That&amp;#8217;s it. At least it was a Saturday so no one saw&amp;#8230;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Convert Numbers from Base 16 to Base 64 in Python</title>
      <link>https://jaustin.io/2014/10/convert-numbers-from-base-16-to-base-64-in-python/</link>
      <pubDate>Fri, 17 Oct 2014 14:38:51 +0000</pubDate>
      
      <guid>https://jaustin.io/2014/10/convert-numbers-from-base-16-to-base-64-in-python/</guid>
      <description>

&lt;h3 id=&#34;the-problem&#34;&gt;The Problem&lt;/h3&gt;

&lt;p&gt;A web app that I built for a client uses tokens to keep track of user activity.  We email URLs to users with links that have these tokens in the query string.  They look like this:&lt;/p&gt;

&lt;pre&gt;https://super-long-domain.com/a-long-file-name.html?token=54410e10571a4a067e624293&lt;/pre&gt;

&lt;p&gt;The problem is that older versions of Outlook wrap long URLs like this to a new line, but don&amp;#8217;t include any of the characters on the 2nd line in the hyperlink. So when a user clicks on the link, the wrapped text is not included. Obviously this breaks the web app. Grr.&lt;/p&gt;

&lt;h3 id=&#34;the-solution&#34;&gt;The Solution&lt;/h3&gt;

&lt;p&gt;Microsoft recommends that you &lt;a href=&#34;http://support.microsoft.com/kb/197878&#34; target=&#34;_blank&#34;&gt;educate your users on how to repair the broken link&lt;/a&gt; themselves. This is not a great solution. Another option would be to send full HTML messages, but that seems like overkill and we like plain text just fine.&lt;/p&gt;

&lt;p&gt;Instead we want to shorten the URL so it will fit on a single line in most email clients. There are a couple places we can attack it:&lt;/p&gt;

&lt;h4 id=&#34;the-html-file-name&#34;&gt;The HTML File Name&lt;/h4&gt;

&lt;p&gt;This web app is running on an &lt;a href=&#34;http://nginx.org&#34; target=&#34;_blank&#34;&gt;Nginx&lt;/a&gt; web server so we can define a custom location for this file that has a shorter path. Now when we enter this in the browser:&lt;/p&gt;

&lt;pre&gt;https://super-long-domain.com/at/&lt;/pre&gt;

&lt;p&gt;We will be redirected automatically to here:&lt;/p&gt;

&lt;pre&gt;https://super-long-domain.com/a-long-file-name.html&lt;/pre&gt;

&lt;h4 id=&#34;the-token&#34;&gt;The Token&lt;/h4&gt;

&lt;p&gt;Next we need to deal with the token itself. Again we can employ URL rewriting in Nginx to get started. We rewrite this:&lt;/p&gt;

&lt;pre&gt;https://super-long-domain.com/at/54410e10571a4a067e624293&lt;/pre&gt;

&lt;p&gt;We will be redirected automatically to here:&lt;/p&gt;

&lt;pre&gt;https://super-long-domain.com/a-long-file-name.html?token=54410e10571a4a067e624293&lt;/pre&gt;

&lt;p&gt;Shortening the length of the token itself would be even better. My first though was to convert the Token, which is a Hexadecimal number, to a base64 representation of the same number. I found a lot of examples of how to change encoding formats for text strings, but that doesn&amp;#8217;t help. We need to convert the Hex number to a binary format and then to base16 to get a shorter result. In Python that looks like this:&lt;/p&gt;

&lt;pre&gt;base64.urlsafe_b64encode(bytes.fromhex(&#39;54410e10571a4a067e624293&#39;)).decode()&lt;/pre&gt;

&lt;p&gt;Then instead of a 24 character token you have a nice 16 character token:&lt;/p&gt;

&lt;pre&gt;VEEOEFcaSgZ-YkKT&lt;/pre&gt;

&lt;h4 id=&#34;the-result&#34;&gt;The Result&lt;/h4&gt;

&lt;p&gt;Now the links look like this:&lt;/p&gt;

&lt;pre&gt;https://super-long-domain.com/at/VEEOEFcaSgZ-YkKT&lt;/pre&gt;

&lt;p&gt;Hopefully that will make super old versions of Outlook happier.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Lifeproof iPhone 5s Nüüd Case Review</title>
      <link>https://jaustin.io/2014/09/lifeproof-iphone-5s-nuud-case-review/</link>
      <pubDate>Mon, 01 Sep 2014 02:13:28 +0000</pubDate>
      
      <guid>https://jaustin.io/2014/09/lifeproof-iphone-5s-nuud-case-review/</guid>
      <description>&lt;p&gt;I held off on purchasing another Lifeproof case because of some of the issues I had with my previous Lifeproof case.  You can read about my experience with that case in my &lt;a href=&#34;http://joshaust.in/2012/12/lifeproof-iphone-5-case-review/&#34; title=&#34;Lifeproof iPhone 5 Case Review&#34;&gt;Lifeproof iPhone 5 Case Review&lt;/a&gt;.  I decided to take the plunge with a the Nüüd case because it removes the barrier between my finger and the touch screen.&lt;/p&gt;

&lt;div style=&#34;width: 2299px&#34; class=&#34;wp-caption aligncenter&#34;&gt;
  &lt;img src=&#34;https://dl.dropboxusercontent.com/s/3byja1lr7zsyvsi/lifeproof-nuud-box.jpeg&#34; alt=&#34;Lifeproof Nüüd Case&#34; width=&#34;2289&#34; height=&#34;2727&#34; /&gt;
  
  &lt;p class=&#34;wp-caption-text&#34;&gt;
    Lifeproof Nüüd Case
  &lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;The Nüüd case comes with an assortment of things in the box, including a block of plastic shaped like an iPhone so you can leak test the case without putting your phone in it first. That&amp;#8217;s nice.&lt;/p&gt;

&lt;div style=&#34;width: 1610px&#34; class=&#34;wp-caption aligncenter&#34;&gt;
  &lt;a href=&#34;https://dl.dropboxusercontent.com/s/3prhajs7yf6v4so/contents-of-the-box.jpeg&#34;&gt;&lt;img src=&#34;https://dl.dropboxusercontent.com/s/3prhajs7yf6v4so/contents-of-the-box.jpeg&#34; width=&#34;1600&#34; height=&#34;1199&#34; alt=&#34;contents of the box&#34; class /&gt;&lt;/a&gt;
  
  &lt;p class=&#34;wp-caption-text&#34;&gt;
    contents of the box
  &lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;As you can see from the picture of the front and back of the case, there is no screen protector built into the front half of the case. Lifeproof does include a stick-on screen protector that you can apply if you want, but that sort of defeats the purpose. If you want to cover your screen, maybe you should consider the Lifeproof Frē instead.&lt;/p&gt;

&lt;div style=&#34;width: 1610px&#34; class=&#34;wp-caption aligncenter&#34;&gt;
  &lt;a href=&#34;https://dl.dropboxusercontent.com/s/3xyinvvje4eh9ha/front-and-back.jpeg&#34;&gt;&lt;img src=&#34;https://dl.dropboxusercontent.com/s/3xyinvvje4eh9ha/front-and-back.jpeg&#34; width=&#34;1600&#34; height=&#34;1549&#34; alt=&#34;front and back of the Nüüd&#34; class /&gt;&lt;/a&gt;
  
  &lt;p class=&#34;wp-caption-text&#34;&gt;
    front and back of the Nüüd
  &lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Just like other Lifeproof cases, there is a door covering the Lightning port.&lt;/p&gt;

&lt;div style=&#34;width: 1610px&#34; class=&#34;wp-caption aligncenter&#34;&gt;
  &lt;a href=&#34;https://dl.dropboxusercontent.com/s/s8e5gg81x036n55/bottom-of-inside-back.jpeg&#34;&gt;&lt;img src=&#34;https://dl.dropboxusercontent.com/s/s8e5gg81x036n55/bottom-of-inside-back.jpeg&#34; width=&#34;1600&#34; height=&#34;784&#34; alt=&#34;close up of the back&#34; class /&gt;&lt;/a&gt;
  
  &lt;p class=&#34;wp-caption-text&#34;&gt;
    close up of the back
  &lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;I had a really hard time getting the camera cover clean. It is a very stretchy bit of plastic that seems to love little specs of dust. I tried to use the cloth that came with the case, but I think that made it worse.&lt;/p&gt;

&lt;div style=&#34;width: 1610px&#34; class=&#34;wp-caption aligncenter&#34;&gt;
  &lt;a href=&#34;https://dl.dropboxusercontent.com/s/bnnl5o57k3dhaps/camera-cover.jpeg&#34;&gt;&lt;img src=&#34;https://dl.dropboxusercontent.com/s/bnnl5o57k3dhaps/camera-cover.jpeg&#34; width=&#34;1600&#34; height=&#34;1200&#34; alt=&#34;camera cover&#34; class /&gt;&lt;/a&gt;
  
  &lt;p class=&#34;wp-caption-text&#34;&gt;
    camera cover
  &lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;The same sort of stretchy film covers the home button (as near as I can tell). Be careful that you don&amp;#8217;t trap any air under the film when you put the case together, otherwise it cause a bubble that doesn&amp;#8217;t go away.&lt;/p&gt;

&lt;div style=&#34;width: 1610px&#34; class=&#34;wp-caption aligncenter&#34;&gt;
  &lt;a href=&#34;https://dl.dropboxusercontent.com/s/isdmrxvsfphqrjs/home-button-cover.jpeg&#34;&gt;&lt;img src=&#34;https://dl.dropboxusercontent.com/s/isdmrxvsfphqrjs/home-button-cover.jpeg&#34; width=&#34;1600&#34; height=&#34;1200&#34; alt=&#34;home button cover&#34; class /&gt;&lt;/a&gt;
  
  &lt;p class=&#34;wp-caption-text&#34;&gt;
    home button cover
  &lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;The speaker cover was another area that I had a little trouble with on the Frē because sometimes it would vibrate like a kazoo with certain frequencies of sound. I haven&amp;#8217;t experienced that yet with this case, but I&amp;#8217;ll update the post if I hear it happen.&lt;/p&gt;

&lt;div style=&#34;width: 1610px&#34; class=&#34;wp-caption aligncenter&#34;&gt;
  &lt;a href=&#34;https://dl.dropboxusercontent.com/s/6snv38z4rd6ys35/inside-speaker-cover.jpeg&#34;&gt;&lt;img src=&#34;https://dl.dropboxusercontent.com/s/6snv38z4rd6ys35/inside-speaker-cover.jpeg&#34; width=&#34;1600&#34; height=&#34;1200&#34; alt=&#34;inside speaker cover&#34; class /&gt;&lt;/a&gt;
  
  &lt;p class=&#34;wp-caption-text&#34;&gt;
    inside speaker cover
  &lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;My very favorite improvement to this case is the tether for the headphone plug cover. I could never keep track of those little plugs on the older case and they always fell out of the little holder on the extension cable. Losing one of those plugs was the worst. This tether is the best!&lt;/p&gt;

&lt;div style=&#34;width: 1610px&#34; class=&#34;wp-caption aligncenter&#34;&gt;
  &lt;a href=&#34;https://dl.dropboxusercontent.com/s/qph5a6jhdr09b3i/headphone-plug-tether.jpeg&#34;&gt;&lt;img src=&#34;https://dl.dropboxusercontent.com/s/qph5a6jhdr09b3i/headphone-plug-tether.jpeg&#34; width=&#34;1600&#34; height=&#34;1197&#34; alt=&#34;headphone plug tether&#34; class /&gt;&lt;/a&gt;
  
  &lt;p class=&#34;wp-caption-text&#34;&gt;
    headphone plug tether
  &lt;/p&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>how-i-know-im-getting-older</title>
      <link>https://jaustin.io/2014/08/how-i-know-im-getting-older/</link>
      <pubDate>Sat, 23 Aug 2014 18:23:09 +0000</pubDate>
      
      <guid>https://jaustin.io/2014/08/how-i-know-im-getting-older/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.hermanmiller.com/products/seating/performance-work-chairs/embody-chairs.html&#34; title=&#34;Embody Chair&#34;&gt;&lt;img src=&#34;https://dl.dropboxusercontent.com/s/e9sosik0h0nzb27/2014-02-22%2012.22.37.jpg&#34; alt=&#34;Embody Chair&#34; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My favorite thing in my office is my very fancy chair.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s an Embody Chair from Herman Miller.  Yes that means that many interns could be equipped with perfectly serviceable chairs for what a single Embody chair costs.  But now, after nearly six months of writing code while sitting in one I can confidently say that this chair has nearly ruined my ability to sit in any other chair.&lt;/p&gt;

&lt;p&gt;To me it also shows that I&amp;#8217;m not a kid anymore.  In earlier days, having the fastest CPU or the most Memory would have been much more important than a chair.  But now, the most important things are the &lt;a href=&#34;http://www.amazon.com/gp/product/B002IX5YHQ/ref=as_li_tl?ie=UTF8&amp;amp;#038;camp=1789&amp;amp;#038;creative=390957&amp;amp;#038;creativeASIN=B002IX5YHQ&amp;amp;#038;linkCode=as2&amp;amp;#038;tag=joshain-20&amp;amp;#038;linkId=ALIPY6QJVGX745RH&#34;&gt;chair&lt;/a&gt;&lt;img src=&#34;http://ir-na.amazon-adsystem.com/e/ir?t=joshain-20&amp;#038;l=as2&amp;#038;o=1&amp;#038;a=B002IX5YHQ&#34; width=&#34;1&#34; height=&#34;1&#34; border=&#34;0&#34; alt=&#34;&#34; style=&#34;border:none !important; margin:0px !important;&#34; /&gt;, the &lt;a href=&#34;http://www.amazon.com/gp/product/B009H0XQQY/ref=as_li_tl?ie=UTF8&amp;amp;#038;camp=1789&amp;amp;#038;creative=390957&amp;amp;#038;creativeASIN=B009H0XQQY&amp;amp;#038;linkCode=as2&amp;amp;#038;tag=joshain-20&amp;amp;#038;linkId=HJ3SKD4YL7CLUHBP&#34;&gt;display&lt;/a&gt;&lt;img src=&#34;http://ir-na.amazon-adsystem.com/e/ir?t=joshain-20&amp;#038;l=as2&amp;#038;o=1&amp;#038;a=B009H0XQQY&#34; width=&#34;1&#34; height=&#34;1&#34; border=&#34;0&#34; alt=&#34;&#34; style=&#34;border:none !important; margin:0px !important;&#34; /&gt;, the &lt;a href=&#34;http://www.amazon.com/gp/product/B0036FQ23A/ref=as_li_tl?ie=UTF8&amp;amp;#038;camp=1789&amp;amp;#038;creative=390957&amp;amp;#038;creativeASIN=B0036FQ23A&amp;amp;#038;linkCode=as2&amp;amp;#038;tag=joshain-20&amp;amp;#038;linkId=3KW2SDBET6M7O4IB&#34;&gt;display arm&lt;/a&gt;&lt;img src=&#34;http://ir-na.amazon-adsystem.com/e/ir?t=joshain-20&amp;#038;l=as2&amp;#038;o=1&amp;#038;a=B0036FQ23A&#34; width=&#34;1&#34; height=&#34;1&#34; border=&#34;0&#34; alt=&#34;&#34; style=&#34;border:none !important; margin:0px !important;&#34; /&gt;, the &lt;a href=&#34;http://www.amazon.com/gp/product/B00CKJ2EZI/ref=as_li_tl?ie=UTF8&amp;amp;#038;camp=1789&amp;amp;#038;creative=390957&amp;amp;#038;creativeASIN=B00CKJ2EZI&amp;amp;#038;linkCode=as2&amp;amp;#038;tag=joshain-20&amp;amp;#038;linkId=EDC333GZCWDBTM5N&#34;&gt;keyboard&lt;/a&gt;&lt;img src=&#34;http://ir-na.amazon-adsystem.com/e/ir?t=joshain-20&amp;#038;l=as2&amp;#038;o=1&amp;#038;a=B00CKJ2EZI&#34; width=&#34;1&#34; height=&#34;1&#34; border=&#34;0&#34; alt=&#34;&#34; style=&#34;border:none !important; margin:0px !important;&#34; /&gt;, and the &lt;a href=&#34;http://www.amazon.com/gp/product/B002HWRJBM/ref=as_li_tl?ie=UTF8&amp;amp;#038;camp=1789&amp;amp;#038;creative=390957&amp;amp;#038;creativeASIN=B002HWRJBM&amp;amp;#038;linkCode=as2&amp;amp;#038;tag=joshain-20&amp;amp;#038;linkId=7GO7EZDIENMX335I&#34;&gt;mouse&lt;/a&gt;&lt;img src=&#34;http://ir-na.amazon-adsystem.com/e/ir?t=joshain-20&amp;#038;l=as2&amp;#038;o=1&amp;#038;a=B002HWRJBM&#34; width=&#34;1&#34; height=&#34;1&#34; border=&#34;0&#34; alt=&#34;&#34; style=&#34;border:none !important; margin:0px !important;&#34; /&gt;.  Basically anything I touch or have to look at for long periods of time.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Chromebook to Ubuntubook with help from Codestarter.org</title>
      <link>https://jaustin.io/2014/08/chromebook-to-ubuntubook-with-help-from-codestarter-org/</link>
      <pubDate>Sun, 10 Aug 2014 00:18:56 +0000</pubDate>
      
      <guid>https://jaustin.io/2014/08/chromebook-to-ubuntubook-with-help-from-codestarter-org/</guid>
      <description>

&lt;p&gt;I came across Tom Preston-Werner&amp;#8217;s &lt;a href=&#34;http://blog.codestarter.org/post/93985346780/how-we-turn-199-chromebooks-into-ubuntu-based-code&#34; title=&#34;How we turn $199 Chromebooks into Ubuntu-based code learning machines for kids&#34;&gt;blog post&lt;/a&gt; about installing &lt;a href=&#34;http://www.ubuntu.com&#34; title=&#34;Ubuntu&#34;&gt;Ubuntu&lt;/a&gt; on a &lt;a href=&#34;http://www.google.com/intl/en/chrome/devices/&#34; title=&#34;Chromebook&#34;&gt;Chromebook&lt;/a&gt; the other day while reading &lt;a href=&#34;https://news.ycombinator.com/item?id=8143844&#34; title=&#34;Hacker News&#34;&gt;Hacker News&lt;/a&gt; and since I happen to have an &lt;a href=&#34;http://www.amazon.com/gp/product/B00FNPD1VW/ref=as_li_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B00FNPD1VW&amp;amp;linkCode=as2&amp;amp;tag=joshain-20&amp;amp;linkId=TQRUEI3UJT6KBCGP&#34;&gt;Acer C720&lt;/a&gt;&lt;img style=&#34;border: none !important; margin: 0px !important;&#34; src=&#34;http://ir-na.amazon-adsystem.com/e/ir?t=joshain-20&amp;l=as2&amp;o=1&amp;a=B00FNPD1VW&#34; alt=&#34;&#34; width=&#34;1&#34; height=&#34;1&#34; border=&#34;0&#34; /&gt;&lt;/p&gt;

&lt;p&gt;and some kids who might enjoy it, I took the plunge and used &lt;a href=&#34;https://codestarter.org&#34; title=&#34;Codestarter.org&#34;&gt;Codestarter&lt;/a&gt;&amp;#8216;s &lt;a href=&#34;https://github.com/codestarterorg/ubuntu-chromebook-installer&#34; title=&#34;ubuntu-chromebook-installer&#34;&gt;installation scripts&lt;/a&gt; to install Ubuntu on my Chromebook.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://codestarter.org&#34;&gt;&lt;img class=&#34;alignnone size-full wp-image-837&#34; src=&#34;http://joshaust.in/wp-content/uploads/2014/08/logo-b427d6d3ff7be31fb8eafda9de284166.png&#34; alt=&#34;CodeStarter.org&#34; width=&#34;1153&#34; height=&#34;388&#34; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I had thought of installing linux on the chromebook before reading Preseton-Werner&amp;#8217;s blog post, but I didn&amp;#8217;t take the plunge before because&amp;#8230;&lt;/p&gt;

&lt;h3 id=&#34;the-linux-kernel-does-not-support-the-trackpad&#34;&gt;the Linux kernel does not support the trackpad.&lt;/h3&gt;

&lt;p&gt;The thought of compiling a customer kernel with the trackpad driver&amp;#8217;s didn&amp;#8217;t sound like very much fun. The &lt;a href=&#34;https://wiki.archlinux.org/index.php/Acer_C720_Chromebook&#34; title=&#34;Arch Linux Wiki&#34;&gt;Arch Linux Wiki&lt;/a&gt; I read suggested some instructions to patch the kernel. Anyway, I never really got to the point where I wanted to do all that to get Linux running on the chromebook.&lt;/p&gt;

&lt;p&gt;Looking at the codestarter.org script I wondered how many hours they must have spent trying to get it exactly right. Despite the relative brevity of the scripts, it looks like a lot of time went into them.&lt;/p&gt;

&lt;h3 id=&#34;the-first-step&#34;&gt;The first step&lt;/h3&gt;

&lt;p&gt;involved making a backup of ChromeOS because there is a non-zero chance that this sort of hacking around in the internals of the c720 will result in a device that will no longer boot. I&amp;#8217;ve mostly stopped using removable media in the past few years so after considerable searching I found an SD card that could function as the backup media. After making the backup image I read the next instruction which said to download the installation script to some other removable media. :/&lt;/p&gt;

&lt;h3 id=&#34;much-later&#34;&gt;Much later&lt;/h3&gt;

&lt;p&gt;I found an old USB stick that would work and loaded the installer onto the USB drive. Following the instructions provided, I activated Developer Mode on the c720.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://joshaust.in/wp-content/uploads/2014/08/2014-08-09-15.19.01.jpg&#34;&gt;&lt;img class=&#34;alignnone size-full wp-image-848&#34; src=&#34;http://joshaust.in/wp-content/uploads/2014/08/2014-08-09-15.19.01.jpg&#34; alt=&#34;activating-dev-mode&#34; width=&#34;800&#34; height=&#34;600&#34; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next I plugged in the thumb drive, and executed the command &lt;code&gt;sudo bash main.sh&lt;/code&gt; kicked off the installation process.&lt;/p&gt;

&lt;p&gt;The installer did somethings, which I think included formatting the hard drive and then rebooted the c720. The same &lt;code&gt;sudo bash main.sh&lt;/code&gt; is run again and this time it installs Ubuntu in the space it formatted.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://joshaust.in/wp-content/uploads/2014/08/2014-08-09-15.33.27.jpg&#34;&gt;&lt;img class=&#34;alignnone size-full wp-image-849&#34; src=&#34;http://joshaust.in/wp-content/uploads/2014/08/2014-08-09-15.33.27.jpg&#34; alt=&#34;downloading-ubuntu&#34; width=&#34;800&#34; height=&#34;600&#34; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Overall I think the installation process is very smooth, but there are a few areas where it might have been made more clear. I&amp;#8217;ve modified the instructions to reflect this:&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://joshaust.in/wp-content/uploads/2014/08/codestarter-instructions.png&#34;&gt;&lt;img class=&#34;alignnone size-full wp-image-839&#34; src=&#34;http://joshaust.in/wp-content/uploads/2014/08/codestarter-instructions.png&#34; alt=&#34;codestarter-instructions&#34; width=&#34;1318&#34; height=&#34;553&#34; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&#34;i-kept-thinking-this-is-too-easy&#34;&gt;I kept thinking this is too easy&lt;/h3&gt;

&lt;p&gt;while installing Ubuntu. Then My c720 froze the first time I attempted to boot into linux. Given how long some of the other steps took, I thought this too was just taking a long time.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://joshaust.in/wp-content/uploads/2014/08/skitch.jpg&#34;&gt;&lt;img class=&#34;alignnone size-full wp-image-845&#34; src=&#34;http://joshaust.in/wp-content/uploads/2014/08/skitch.jpg&#34; alt=&#34;not-booting&#34; width=&#34;800&#34; height=&#34;600&#34; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eventually I ran out of patience, and rebooted to try again. Here we go, I thought. Now it will take hours to get it working again.&lt;/p&gt;

&lt;h3 id=&#34;boom&#34;&gt;Boom.&lt;/h3&gt;

&lt;p&gt;This time it booted right up into Ubuntu. After settings my timezones I was presented with the desktop.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://joshaust.in/wp-content/uploads/2014/08/2014-08-09-16.38.28.jpg&#34;&gt;&lt;img class=&#34;alignnone size-full wp-image-842&#34; src=&#34;http://joshaust.in/wp-content/uploads/2014/08/2014-08-09-16.38.28.jpg&#34; alt=&#34;ubuntu-desktop&#34; width=&#34;800&#34; height=&#34;1067&#34; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m still more than a little shocked it was that easy. I was certain that it would take longer, and be crazy difficult to get this working. The script from Codestarter.org make a huge difference and in the end it was pretty easy to get Ubuntu installed on the chromebook.&lt;/p&gt;

&lt;h3 id=&#34;how-does-it-all-fit-together&#34;&gt;How does it all fit together?&lt;/h3&gt;

&lt;p&gt;Now that the little chromebook is running Ubunutu, I&amp;#8217;ll right the rest of this post using the chromebook itself.&lt;/p&gt;

&lt;p&gt;It is not a fast computer. My primary computer is a quad-core MacBook Pro, so to say I&amp;#8217;m a little spoiled is an understatement, but opening the Chrome browser for the first time under Ubuntu was certainly an exercise in patience. I think it&amp;#8217;s safe to say that the c720 isn&amp;#8217;t any sort of speed demon, but that isn&amp;#8217;t what Codestarter.org was aiming for.&lt;/p&gt;

&lt;h3 id=&#34;they-were-aiming-for-a-developer-laptop&#34;&gt;They were aiming for a developer laptop.&lt;/h3&gt;

&lt;p&gt;There are other things that are important to developers, like a good keyboard which the c720 certainly has. The keys have a decent amount of travel, and are spaced widely enough that I didn&amp;#8217;t find myself hitting the wrong key very much.&lt;/p&gt;

&lt;p&gt;Additionally, SublimeText works well. It started up quickly and stayed responsive.&lt;/p&gt;

&lt;div id=&#34;attachment_853&#34; style=&#34;width: 1376px&#34; class=&#34;wp-caption alignnone&#34;&gt;
  &lt;a href=&#34;http://joshaust.in/wp-content/uploads/2014/08/Screenshot-from-2014-08-09-201242.png&#34;&gt;&lt;img class=&#34;size-full wp-image-853&#34; src=&#34;http://joshaust.in/wp-content/uploads/2014/08/Screenshot-from-2014-08-09-201242.png&#34; alt=&#34;solarized-terminal&#34; width=&#34;1366&#34; height=&#34;768&#34; /&gt;&lt;/a&gt;
  
  &lt;p class=&#34;wp-caption-text&#34;&gt;
    Solarized, the one true color scheme.
  &lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Over all the c720 with Linux is a heck of a deal. I only paid $200 for this little computer and it feels like I could use it in largely the same way I used my MacBook Pro. That&amp;#8217;s high praise.&lt;/p&gt;

&lt;p&gt;I think some kids are going to have the time of their lives learning to build with these chromebooks! I would have loved a computer like this when I was young.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I don&amp;#8217;t mind iterating</title>
      <link>https://jaustin.io/2014/07/i-dont-mind-iterating/</link>
      <pubDate>Tue, 29 Jul 2014 05:00:30 +0000</pubDate>
      
      <guid>https://jaustin.io/2014/07/i-dont-mind-iterating/</guid>
      <description>&lt;p&gt;One of the things I like best about running a start-up business is that I am often given the opportunity to iterate. By that, I mean I often screw something up so badly that I am forced to change how I do it in order to get the result I was looking for.&lt;/p&gt;

&lt;p&gt;I don&amp;#8217;t mind it. I don&amp;#8217;t mind making changes. I&amp;#8217;ll change if I need to in order to win.&lt;/p&gt;

&lt;p&gt;But, what I find and endlessly frustrating is failing and not understanding what I did wrong. How can I improve if I don&amp;#8217;t understand what I did wrong?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Can You Deal With That Much Frustration?</title>
      <link>https://jaustin.io/2014/05/can-you-deal-with-that-much-frustration/</link>
      <pubDate>Mon, 05 May 2014 10:36:36 +0000</pubDate>
      
      <guid>https://jaustin.io/2014/05/can-you-deal-with-that-much-frustration/</guid>
      <description>&lt;p&gt;I have an experience that always surprises me is when someone sits down with me to watch me write some code. Most of the time the person will turn to me after a few minutes and say something to the effect of,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I can&amp;#8217;t believe that you sit here all day just Googling how to do things on the Internet. I thought you were actually like really smart or something. You do everything wrong four or five times before you get it right.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;And just like that the magic is gone&amp;#8230;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I had this experience again just the other day after spending some time with someone who wanted to learn how to program. We wrote a few simple programs together and during the course of our time, I Googled &amp;#8220;how to do something&amp;#8221; every few minutes. I watched for the &amp;#8220;ah-ha&amp;#8221; moment when they would realize how easy it is. After about twenty minutes I saw the expression I was watching for. What my previously eager guest said surprised me at first,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Maybe I&amp;#8217;m just not a computer person&amp;#8230;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Huh? I didn&amp;#8217;t understand so I said,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;But I just showed you how easy it is to figure out how to do anything!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And they responded,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I don&amp;#8217;t think I can deal with that much frustration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then I realized that it wasn&amp;#8217;t the process of writing the code that kept this person from being a developer. It was the experience of the code not working 100 or 1000 times before you got it right. Each of those &amp;#8220;failures&amp;#8221; can be an extremely painful experience for some folks. My guest then said,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In my mind you sit at your computer and just write out this program. That&amp;#8217;s where you spend most of your time, typing the actual code. Then you spend 5 or 10 minutes fixing any bugs. But, in reality, you spend 1% of the time writing the program and 99% of the time fixing the bugs. I could never deal with that much failure.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It made me sad, but I think this is not a particularly uncommon scenario.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Has anyone else had this experience?&lt;/strong&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Boring is Best</title>
      <link>https://jaustin.io/2014/04/boring-is-best/</link>
      <pubDate>Thu, 17 Apr 2014 10:56:03 +0000</pubDate>
      
      <guid>https://jaustin.io/2014/04/boring-is-best/</guid>
      <description>&lt;p&gt;I really like this blog post by Matt Jaynes about building solid business on proven technologies:&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://devopsu.com/blog/boring-systems-build-badass-businesses/&#34;&gt;https://devopsu.com/blog/boring-systems-build-badass-businesses/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I struggle with this myself, the desire to use the latest and greatest tech in our systems at MaaSive.net, but fortunately I have some really smart people around that help me realize when that&amp;#8217;s not the best idea for the business.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>It Requires Super Human Discipline to Write Readable Code in Callbacks</title>
      <link>https://jaustin.io/2014/02/it-requires-super-human-discipline-to-write-readable-code-in-callbacks/</link>
      <pubDate>Sat, 01 Feb 2014 00:35:12 +0000</pubDate>
      
      <guid>https://jaustin.io/2014/02/it-requires-super-human-discipline-to-write-readable-code-in-callbacks/</guid>
      <description>

&lt;p&gt;Callbacks can be messy, as &lt;a href=&#34;http://en.wikipedia.org/wiki/Guido_van_Rossum&#34;&gt;Guido Van Rossum&lt;/a&gt; said in his recent &lt;a href=&#34;http://www.youtube.com/watch?v=1coLC-MUCJc&#34;&gt;asyncio talk&lt;/a&gt; (@ 56:27 in the YouTube video):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;It requires super human discipline to write readable code in callbacks and if you don&amp;#8217;t believe me look at any piece of JavaScript code.&amp;#8221; ~ &lt;cite&gt;Guido Van Rossum&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Fortunately you don&amp;#8217;t have to write callbacks if you don&amp;#8217;t want to. You need only look to &lt;a href=&#34;http://www.tornadoweb.org&#34;&gt;Tornado&lt;/a&gt; and &lt;a href=&#34;http://motor.readthedocs.org/en/stable/&#34;&gt;Motor&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://dl.dropboxusercontent.com/u/19725222/joshaust.in/tornado-motor/tornado-plus-motor.png&#34; alt=&#34;tornado and motor&#34; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://www.python.org/download/releases/3.3.3/&#34;&gt;Python&lt;/a&gt; has some neat features that let allow &lt;a href=&#34;http://stackoverflow.com/questions/564060/python-generators-and-co-routines&#34;&gt;generators to be used as coroutines&lt;/a&gt;. The &lt;a href=&#34;http://www.tornadoweb.org&#34;&gt;Tornado Web Framework&lt;/a&gt; includes &lt;a href=&#34;http://www.tornadoweb.org/en/stable/gen.html&#34;&gt;decorators to make this dead simple&lt;/a&gt;. For me, the biggest drawback to using Tornado was the lack of a good asynchronous db driver. Using a blocking db driver sort of defeats the purpose of a non-blocking web server. Fortunately for those of us who don&amp;#8217;t love writing callbacks, now there is a good solution.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;http://motor.readthedocs.org/en/stable/&#34;&gt;Motor&lt;/a&gt; is a first class asynchronous &lt;a href=&#34;http://www.mongodb.com/&#34;&gt;MongoDB&lt;/a&gt; driver written by &lt;a href=&#34;http://emptysqua.re/blog/about/&#34;&gt;Jesse Jiryu Davis&lt;/a&gt; from MongoDB that will soon take advantage of &lt;a href=&#34;http://docs.python.org/3.4/library/concurrent.futures.html&#34;&gt;Futures&lt;/a&gt; to present an easy to use, but still asynchronous, interface with MongoDB.&lt;/p&gt;

&lt;p&gt;Jesse announced some &lt;a href=&#34;http://emptysqua.re/blog/motor-progress-report-the-road-to-0-2/&#34;&gt;changes&lt;/a&gt; that make using Motor even easier by incorporating Futures into the syntax, just like recent versions of Tornado. We are waiting on MongoDB v2.6 RC, which &lt;a href=&#34;https://jira.mongodb.org/browse/SERVER#selectedTab=com.atlassian.jira.plugin.system.project%3Aroadmap-panel&#34;&gt;roadmap&lt;/a&gt; indicates will be released on 2/11/14 and the associated version of PyMongo.&lt;/p&gt;

&lt;p&gt;In anticipation of this release, I thought it would be fun to look at just how far asynchronous db drivers for Tornado have come. Despite Jesse&amp;#8217;s warnings that we should wait until the changes are official, we&amp;#8217;ve been using these techniques at &lt;a href=&#34;https://maasive.net&#34;&gt;MaaSive.net&lt;/a&gt; to supercharge developer productivity and increase clarity in our asynchronous code.&lt;/p&gt;

&lt;h3 id=&#34;inthebeginning&#34;&gt;In the Beginning&lt;/h3&gt;

&lt;p&gt;When I started using Motor v0.1 about a year ago this is what trivial DB access looked like for a simple handler that returns some JSON:&lt;/p&gt;

&lt;p&gt;If I only ever had to make one db call, and only had to write one callback handler this would not be so bad. The problem is that in reality I need to make several db calls, and may need to wait until two or more are complete to do anything useful. The callbacks get out of hand quickly.&lt;/p&gt;

&lt;p&gt;The worst problem is that debugging becomes a nightmare of epic proportions. The entire reason we use Tornado is to enable &lt;a href=&#34;http://en.wikipedia.org/wiki/Push_technology#Long_polling&#34;&gt;long-polling&lt;/a&gt; with lots of connections at the same time, and it becomes very hard to tell exactly where the problems are when lots of connections are active at the same time. Most developers (myself included) rely on stack-traces to debug our programs, but with callbacks like this you can kiss that nice stack-trace goodbye.&lt;/p&gt;

&lt;h3 id=&#34;thepresent&#34;&gt;The Present&lt;/h3&gt;

&lt;p&gt;Motor v0.1.2 has come a long way since that time. Today a trivial DB access looks like this:&lt;/p&gt;

&lt;p&gt;Technically you could also write it like this using &lt;strong&gt;motor.Op&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;This is much, &lt;em&gt;much&lt;/em&gt; better than before. Tornado&amp;#8217;s &lt;strong&gt;tornado.gen&lt;/strong&gt; module does a great job putting together a &amp;#8220;stack-trace&amp;#8221; when an exception is thrown and while this is certainly acceptable and useable, it still feels a little clunky. Why do we have to write &lt;strong&gt;motor.Op&lt;/strong&gt; for example?&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;motor.Op&lt;/strong&gt; class exists because motor has a forward looking maintainer who was planning for the &lt;strong&gt;Future&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id=&#34;thefutures&#34;&gt;The Future(s)&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;disclaimer &amp;ndash; this api is not released for Motor yet. It will come out with Motor v0.2 along with MongoDB 2.6 RC0 and PyMongo 2.7.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;With Futures, we get to write the same thing like this:&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;cursor.to_list&lt;/strong&gt; method returns a &lt;strong&gt;Future&lt;/strong&gt; directly and yielding the &lt;strong&gt;Future&lt;/strong&gt; blocks this coroutine, returning control to the event loop, until the result is ready. It does not get any easier than that.&lt;/p&gt;

&lt;h3 id=&#34;developercyclesareprecious&#34;&gt;Developer Cycles are Precious&lt;/h3&gt;

&lt;p&gt;For many projects the most expensive component is the time put in by the developers, or as I prefer to call them, developer cycles. One of the main reasons we use Python is for the &lt;a href=&#34;http://redmonk.com/dberkholz/2013/03/25/programming-languages-ranked-by-expressiveness/&#34;&gt;expressiveness&lt;/a&gt; of the language. In my experience we can ship more features that our customers want, more quickly by developing in Python than we can in any other language.&lt;/p&gt;

&lt;p&gt;Tornado and Motor are making it much easier to deploy asynchronous web servers than it has been in the past. The new &lt;a href=&#34;http://docs.python.org/3.4/library/asyncio.html&#34;&gt;AsyncIO&lt;/a&gt; library will likely continue to accelerate that trend and that&amp;#8217;s a good thing because I really don&amp;#8217;t have time to write a bunch of callbacks.&lt;/p&gt;

&lt;p&gt;What business needs are you solving with asynchronous web servers?&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Markdown 2 HTML Helper</title>
      <link>https://jaustin.io/2013/10/markdown-2-html-helper/</link>
      <pubDate>Sun, 06 Oct 2013 02:17:40 +0000</pubDate>
      
      <guid>https://jaustin.io/2013/10/markdown-2-html-helper/</guid>
      <description>&lt;p&gt;Sometimes I think I love markdown to much. Here is a handlebars helper for loading markdown files with AJAX and rendering them as HTML in the browser.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>How-To Setup DNSMadeEasy Dynamic DNS on a Synology</title>
      <link>https://jaustin.io/2013/09/how-to-setup-dnsmadeeasy-dynamic-dns-on-a-synology/</link>
      <pubDate>Sat, 21 Sep 2013 19:27:06 +0000</pubDate>
      
      <guid>https://jaustin.io/2013/09/how-to-setup-dnsmadeeasy-dynamic-dns-on-a-synology/</guid>
      <description>

&lt;p&gt;I had a lot of trouble finding any help to get Dynamic DNS (DDNS) set up between a &lt;strong&gt;&lt;a href=&#34;http://www.synology.com/&#34;&gt;Synology&lt;/a&gt;&lt;/strong&gt; NAS (&lt;em&gt;a great product!&lt;/em&gt;) and &lt;strong&gt;&lt;a href=&#34;http://www.dnsmadeeasy.com/&#34;&gt;DNSMadeEasy.com&lt;/a&gt;&lt;/strong&gt; DDNS service so I thought I would post the solution that I worked out in case anyone else was looking.&lt;/p&gt;

&lt;h3 id=&#34;setupyourddnsdomainondnsmadeeasy.com&#34;&gt;1. Set up your DDNS domain on DNSMadeEasy.com&lt;/h3&gt;

&lt;p&gt;&lt;a href=&#34;https://dl.dropboxusercontent.com/u/19725222/joshaust.in/synology-ddns/dnsmadeeasy-ddns-setup.jpg&#34;&gt;&lt;img src=&#34;https://dl.dropboxusercontent.com/u/19725222/joshaust.in/synology-ddns/dnsmadeeasy-ddns-setup.jpg&#34; alt=&#34;DDNS setup on dnsmadeeasy.com&#34; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The wrinkle that DNSMadeEasy.com throws in the mix is that instead of the domain being updated, they use a unique ID number that&amp;#8217;s generated when you save a record with the &amp;#8220;Dynamic DNS&amp;#8221; box checked.&lt;/p&gt;

&lt;p&gt;After creating the record keep track of the password and the ID. You&amp;#8217;ll need them later.&lt;/p&gt;

&lt;h3 id=&#34;addtheddnsproviderfordnsmadeeasy.comonyoursynologynas&#34;&gt;2. Add the DDNS provider for DNSMadeEasy.com on your Synology NAS&lt;/h3&gt;

&lt;p&gt;If you open the DDNS control panel on your Synology (Control Panel &amp;gt; ezCloud &amp;gt; DDNS) you will notice that there is no DNSMadeEasy.com option on the service provider menu.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://dl.dropboxusercontent.com/u/19725222/joshaust.in/synology-ddns/synology-ddns-control-panel.jpg&#34;&gt;&lt;img src=&#34;https://dl.dropboxusercontent.com/u/19725222/joshaust.in/synology-ddns/synology-ddns-control-panel.jpg&#34; alt=&#34;Synology DDNS control panel&#34; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To add the Service Provider you need to SSH into the terminal. If you need help setting up terminal access check out &lt;strong&gt;&lt;a href=&#34;http://forum.synology.com/wiki/index.php/Enabling_the_Command_Line_Interface&#34;&gt;this tutorial on the Synology wiki&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once you have terminal access use &lt;em&gt;vi&lt;/em&gt; to edit the /etc.defaults/ddns_provider.conf file with this command.&lt;/p&gt;

&lt;pre&gt;$ sudo vi /etc.defaults/ddns_provider.conf&lt;/pre&gt;

&lt;p&gt;The vi editor can be found on almost every POSIX system. It can be confusing for people who have never used it before, so if you need help with vi check out this &lt;strong&gt;&lt;a href=&#34;http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html&#34;&gt;cheat-sheet and tutorial&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Add the DNSMadeEasy.com entry to the end of your ddns_provider.conf file as shown in the following Gist on Github:&lt;/p&gt;

&lt;p&gt;We are actually using the same provider as DynDNS and only using the &amp;#8220;hostname&amp;#8221; variable to support DNSMadeEasy.com&amp;#8217;s &amp;#8220;id&amp;#8221; variable. I was a little concerned that the Synology would do some sort of validation on the HostName field and bounce the string of numbers as invalid. But fortunately they don&amp;#8217;t and we can use that field to supply the ID without any further customization.&lt;/p&gt;

&lt;p&gt;Save the file and reopen the DDNS control panel on the Synology.&lt;/p&gt;

&lt;h3 id=&#34;setupddnsonyoursynologynas&#34;&gt;3. Setup DDNS on your Synology NAS&lt;/h3&gt;

&lt;p&gt;Now you should have the DNSMadeEasy.com option in the &amp;#8220;Service Provider&amp;#8221; field. Put your &amp;#8220;Dynamic DNS ID&amp;#8221; from DNSMadeEasy.com into the &amp;#8220;Hostname&amp;#8221; field. Use the email address associated with your DNSMadeEasy.com account for the &amp;#8220;Username&amp;#8221; field, and the &amp;#8220;Dynamic DNS Password&amp;#8221; from the DNSMadeEasy.com record in the &amp;#8220;Password&amp;#8221; field and &amp;#8220;Confirm password&amp;#8221; field. Hit apply and if your status says &amp;#8220;success&amp;#8221; you are in business!&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://dl.dropboxusercontent.com/u/19725222/joshaust.in/synology-ddns/dnsmadeeasy-ddns-setup-2.jpg&#34;&gt;&lt;img src=&#34;https://dl.dropboxusercontent.com/u/19725222/joshaust.in/synology-ddns/dnsmadeeasy-ddns-setup-2.jpg&#34; alt=&#34;complete DDNS setup on your Synology&#34; /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>