<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Bryan Writes]]></title>
  <link href="https://bryanwrit.es/atom.xml" rel="self"/>
  <link href="https://bryanwrit.es/"/>
  <updated>2023-04-12T12:35:51+00:00</updated>
  <id>https://bryanwrit.es/</id>
  <author>
    <name><![CDATA[Bryan J Swift]]></name>
    <email><![CDATA[mail@bryanwrit.es]]></email>
  </author>

  
  <entry>
    <title type="html"><![CDATA[Crafting Commits and the Importance of Commit Messages]]></title>
    <link href="https://bryanwrit.es/here/2014/crafting-commits-and-the-importance-of-commit-messages/"/>
    <updated>2014-09-26T17:05:03+00:00</updated>
    <id>https://bryanwrit.es/here/2014/crafting-commits-and-the-importance-of-commit-messages</id>
    <content type="html"><![CDATA[<p>The tricky thing about commit messages is they seem unimportant when you are writing them because you know what changes you just made and why you made them and the code is right there so it is obvious. Those are incorrect assumptions.</p>

<p>Commit messages are important because when someone is reviewing your work they set the stage for what the changeset contains, they set the mood for the diff someone is about to read. The code is not always ‘right there’, the <code class="language-plaintext highlighter-rouge">git log</code> command does not show patch information by default, nor does the GitHub pull request page, nor the GitHub commits page. In all these cases you can get to the diff for the commit but it is an extra step. If you write good commit messages it is one the reviewer only needs to take for a commit in which they are particularly interested.</p>

<p>A part of writing good commit messages is creating good commits. It is <em>exceedingly</em> difficult to think in terms of good commits while doing the work, so don’t make the attempt. Start a task from a clean working copy and work on the task until a meaningful change has been made. A meaningful change could be a new screen, it could be a re-factoring, it could be the addition of a feature. A meaningful change is a self-contained unit of work but it is not necessarily a single commit. In order to craft a good commit you will likely need to break up the self-contained unit of work into several commits. The need to break down units of work into commits is why git provides <code class="language-plaintext highlighter-rouge">git add --patch</code> and <code class="language-plaintext highlighter-rouge">git reset --patch</code> commands. <code class="language-plaintext highlighter-rouge">git add --patch</code> steps through all of the changes that show up in <code class="language-plaintext highlighter-rouge">git diff</code> and lets you stage them, or not. <a href="http://www.git-tower.com">Tower</a> provides this functionality when you select a changed file (not check the box), it will show you all the changes as ‘hunks’ (<code class="language-plaintext highlighter-rouge">git add --patch</code> calls them hunks as well) and let you stage them independently. It is possible to break down hunks even further by editing them to stage stage individual lines (<code class="language-plaintext highlighter-rouge">e</code> or edit on the command line, in Tower you do it by selecting the line numbers).</p>

<p><img src="/assets/posts/2014-09-26-crafting-commits-and-the-importance-of-commit-messages/tower-screenshot.png" alt="Screenshot of Tower illustrating Stage Hunk" /></p>

<p>When crafting commits I try to build up to the full functionality by creating commits for the supporting pieces first, my goal is to have every commit compile or run. I don’t test for this, it isn’t important if you are working in feature branches but it does provide a guideline for how much to include in a commit. For example, I’m adding a new screen to an Android application and the new screen in <code class="language-plaintext highlighter-rouge">Activity#onCreate</code> calls an API method I’ve created for the <code class="language-plaintext highlighter-rouge">Activity</code>. In this overly simplistic case, I would first commit the change that creating the new API method and then commit the change creating the new screen (<code class="language-plaintext highlighter-rouge">Activity</code> and associated layout files). That’s one unit of work but at least two commits.</p>

<p>Creating good commits and writing good commit messages is tough to learn because no one teaches it. It is a skill built up over time through experience and the occaisionally heavy handed guidance of team leads. Team leads harp on it because they are the people reading the output of <code class="language-plaintext highlighter-rouge">git log</code> and reviewing pull requests to see what has changed, make their lives easier write good commits and messages.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using Local DNS Server for Device Testing]]></title>
    <link href="https://bryanwrit.es/here/2014/using-local-dns-server-for-device-testing/"/>
    <updated>2014-05-03T12:29:03+00:00</updated>
    <id>https://bryanwrit.es/here/2014/using-local-dns-server-for-device-testing</id>
    <content type="html"><![CDATA[<h2 id="tldr">TL;DR</h2>

<p>I used <a href="http://unbound.net">unbound</a> to set up a local DNS server then pointed my wireless router at it. This made it easy to test changes from my development machine right on the device on the my local wifi network without a noticeable affect on standard browsing performance.</p>

<h2 id="motivation">Motivation</h2>

<p>The web application I’ve been working on (<a href="https://www.lynr.co">Lynr, a cloud based inventory management tool for car dealerships</a>) is targeted primarily for mobile use cases. In this case mobile translates (mostly) to small viewport and moving but not necessarily distracted. To facilitate rapid development, all my local testing had thus far been done in Google Chrome with a narrow (640 pixels wide) viewport. This was fine for a while but inevitably there were rendering differences between desktop Chrome, Mobile Safari, Android Browser and Android Chrome. The nearer to launch we got (and now post-launch) the more important these small differences became. I needed a way to test local application changes without first pushing them to a staging server<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>.</p>

<h2 id="assumptions">Assumptions</h2>

<p>I’m running OS X 10.9 (Mavericks) and have access to the admininstration panel of my wireless router. Unbound should work with any Linux based OS and the DNS changes can be done per device (at least for iOS) rather than on the router but making the DNS change on the router makes it one change for all devices and one change to revert when you’re done testing<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup> as opposed to having to manage settings on multiple devices<sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">3</a></sup>. Linux software packages are installed via <a href="http://brew.sh">Homebrew</a>.</p>

<h2 id="setup">Setup</h2>

<p>The first thing to do is install <a href="http://unbound.net">Unbound</a> which is the crux of this the whole solution.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ brew install unbound

==&gt; Downloading https://downloads.sf.net/project/machomebrew/Bottles/unbound-1.4.22.mavericks.bottle.tar.gz
######################################################################## 100.0%
==&gt; Pouring unbound-1.4.22.mavericks.bottle.tar.gz
==&gt; Caveats
To have launchd start unbound at startup:
	sudo cp -fv /usr/local/opt/unbound/*.plist /Library/LaunchDaemons
Then to load unbound now:
    sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.unbound.plist
==&gt; Summary
🍺  /usr/local/Cellar/unbound/1.4.22: 52 files, 3.4M
</code></pre></div></div>

<p>I don’t like software always running in the background if it isn’t necessary so I did not run the <code class="language-plaintext highlighter-rouge">launchctl</code> command. Instead I am starting unbound when I want it running using <a href="http://dtach.sourceforge.net"><code class="language-plaintext highlighter-rouge">dtach</code></a><sup id="fnref:4" role="doc-noteref"><a href="#fn:4" class="footnote" rel="footnote">4</a></sup>. You could alternatively use <code class="language-plaintext highlighter-rouge">screen</code>, <code class="language-plaintext highlighter-rouge">tmux</code>, <code class="language-plaintext highlighter-rouge">launchctl</code> or even an open and ignored terminal window; whatever you are most comfortable with.</p>

<p>The next thing to do is configure <code class="language-plaintext highlighter-rouge">unbound</code>. The configuration file, when installed via homebrew, is located at <code class="language-plaintext highlighter-rouge">/usr/local/Cellar/unbound/1.4.22/etc/unbound/unbound.conf</code>. My <a href="/assets/posts/2014-05-03-using-local-dns-server-for-device-testing/unbound.conf">full unbound.conf</a> is not embedded because I modified the default file and, including comments, it is 650 lines. The important bits are included below and in this <a href="/assets/posts/2014-05-03-using-local-dns-server-for-device-testing/abbreviated-unbound.conf">abbreviated unbound.conf file</a>.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># The server clause sets the main parameters.
server:
  # Allow network connections outside
  # of localhost
  interface: 0.0.0.0
  # Don't automatically run in the background
  # because I want to be able to kill it without
  # hunting a pid
  do-daemonize: no
  # TODO: Change this to your network range,
  # like `192.168.0.0/16 allow`
  access-control: 10.0.0.0/16 allow
  # TODO: Change this to your username, or
  # whatever user you want to run/own the
  # `unbound` process
  username: "bryanjswift"
  # TODO: The DNS records for your local site
  local-zone: "lynr.co.bimac." static
  local-data: "lynr.co.bimac. 10800 IN NS localhost."
  local-data: "lynr.co.bimac. 10800 IN SOA localhost. nobody.invalid. 1 3600 1200 604800 10800"
  local-data: "lynr.co.bimac. 10800 IN A 10.0.1.7"
# Forward zones
forward-zone:
  # This forwards all DNS requests not found in
  # `local-zone` data to another DNS provider
  name: "."
  # NOTE: if you don't want to use Google Public
  # DNS changes these IP addresses
  forward-addr: 8.8.8.8
  forward-addr: 8.8.4.4
</code></pre></div></div>

<p>The things to make sure you change are <code class="language-plaintext highlighter-rouge">access-control:</code>, <code class="language-plaintext highlighter-rouge">username:</code> and the <code class="language-plaintext highlighter-rouge">local-zone:</code>. Search for these properties in <code class="language-plaintext highlighter-rouge">/usr/local/Cellar/unbound/1.4.22/etc/unbound/unbound.conf</code> and change them. <code class="language-plaintext highlighter-rouge">username:</code> is the easiest to change, it should be whatever your username is when you are logged in. If you don’t know this you can find out by executing the <code class="language-plaintext highlighter-rouge">whoami</code> command in a Terminal window. Regarding <code class="language-plaintext highlighter-rouge">local-zone:</code>, during development I run local applications with names like <code class="language-plaintext highlighter-rouge">production.domain.com.local</code> because it makes both what I’m working on and where it is hosted obvious at a glance. The domain name (lynr.co.bimac from my abbreviated configuration file) in <code class="language-plaintext highlighter-rouge">unbound.conf</code> can be changed to whatever convention you’ve adopted for yourself. <code class="language-plaintext highlighter-rouge">access-control:</code> is an IP mask for your router’s internal IP addresses. Internal IPs typically start with <code class="language-plaintext highlighter-rouge">192.168.</code> or <code class="language-plaintext highlighter-rouge">10.0.</code>. To find out which your router uses open the Network panel in System Preferences and look for the text ‘and has the IP address’ under ‘Status: Connected’ when looking at the Wi-Fi panel. The first two numbers (dots included) should replace the <code class="language-plaintext highlighter-rouge">10.0.</code> on line 8 of <a href="/assets/posts/2014-05-03-using-local-dns-server-for-device-testing/abbreviated-unbound.conf">abbreviated unbound.conf</a>. The whole IP address should replace <code class="language-plaintext highlighter-rouge">10.0.1.7</code> on line 15.</p>

<p><img src="/assets/posts/2014-05-03-using-local-dns-server-for-device-testing/system-preferences-network-internalip.png" alt="Example of internal IP address in System Preferences" /></p>

<p>Unbound should now be appropriately configured to direct requests for your web application to the machine where your local development server is running. All you have to do is start it. Starting unbound will require <code class="language-plaintext highlighter-rouge">sudo</code> or superuser/admin privileges<sup id="fnref:5" role="doc-noteref"><a href="#fn:5" class="footnote" rel="footnote">5</a></sup>. I start <code class="language-plaintext highlighter-rouge">unbound</code> via <code class="language-plaintext highlighter-rouge">dtach</code> by executing <code class="language-plaintext highlighter-rouge">dtach -c unbound.sock sudo /usr/local/opt/unbound/sbin/unbound -c /usr/local/Cellar/unbound/1.4.22/etc/unbound/unbound.conf</code>, if you are using <code class="language-plaintext highlighter-rouge">screen</code>, <code class="language-plaintext highlighter-rouge">tmux</code> or something else you only need <code class="language-plaintext highlighter-rouge">sudo /usr/local/opt/unbound/sbin/unbound -c /usr/local/Cellar/unbound/1.4.22/etc/unbound/unbound.conf</code>.</p>

<p>On the topic of your development server, make sure it is binding to <code class="language-plaintext highlighter-rouge">0.0.0.0</code> or your internal IP address (e.g. 10.0.1.7) and not <code class="language-plaintext highlighter-rouge">127.0.0.1</code> (localhost). If your development server is bound to localhost it will not be able to accept connections that do not originate from your local machine. Lynr is built on a Ruby/Rack stack and by default the <code class="language-plaintext highlighter-rouge">rackup</code> command binds to <code class="language-plaintext highlighter-rouge">0.0.0.0</code>. However, if you’re changing Ruby files you’re likely to be using something like <a href="https://github.com/rtomayko/shotgun">shotgun</a> which binds to <code class="language-plaintext highlighter-rouge">127.0.0.1</code> by default. <code class="language-plaintext highlighter-rouge">shotgun</code> accepts a <code class="language-plaintext highlighter-rouge">-o</code> option to change host, so <code class="language-plaintext highlighter-rouge">shotgun -o 0.0.0.0</code> will change the host to which the ruby process binds. If you’re developing with <a href="http://nodejs.org">Node.js</a> the <a href="http://nodejs.org/api/http.html#http_server_listen_port_hostname_backlog_callback"><code class="language-plaintext highlighter-rouge">server.listen</code></a> does the right thing (binding to 0.0.0.0) by default.</p>

<p>The last thing to do on your development machine is to make sure the OS firewall is either disabled or allowing connections by the <code class="language-plaintext highlighter-rouge">unbound</code> process and whatever process is running your site (ruby in my case). Firewall settings are found in System Preferences in the Security &amp; Privacy panel on the Firewall tab. When the firewall is on the panel says ‘Firewall: On’ with a green dot.</p>

<p><img src="/assets/posts/2014-05-03-using-local-dns-server-for-device-testing/system-preferences-security-firewall.png" alt="Example of System Preferences Firewall panel" /></p>

<p>If the firewall is on go into Firewall Options… and make sure the <code class="language-plaintext highlighter-rouge">unbound</code> and your server process have green dots saying ‘Allow incoming connections’.</p>

<p><img src="/assets/posts/2014-05-03-using-local-dns-server-for-device-testing/system-preferences-security-firewall-options.png" alt="Example of System Preferences Firewall options" /></p>

<p>Your development machine is now ready to respond to DNS requests and serve your application to devices on the network. The last thing we have to do is tell the devices to use your shiny new, local DNS server. I did this by changing my router settings to use my development machine for DNS queries first and <a href="https://developers.google.com/speed/public-dns/">Google Public DNS</a> second. I have an Apple Airport Extreme so I was able to do this with the Airport Utility application. If you change the DNS settings on the router they will propogate to all devices connected to the network<sup id="fnref:6" role="doc-noteref"><a href="#fn:6" class="footnote" rel="footnote">6</a></sup> via that router.</p>

<p><img src="/assets/posts/2014-05-03-using-local-dns-server-for-device-testing/router-dns-settings.png" alt="Example of Airport Utility DNS Servers" /></p>

<p>The DNS server settings can also be changed one a device-by-device basis. On iOS 7, for example, go into Settings &gt; Wi-Fi and tap the blue information circle next to your wireless connection. About two thirds of the way down the screen is a field which says DNS where you can add the internal IP address of your development machine.</p>

<p><img src="/assets/posts/2014-05-03-using-local-dns-server-for-device-testing/settings-wifi-network.png" alt="Example of iOS 7 Network DNS Servers" /></p>

<p>If anyone knows how to change this on an individual Android device I’d appreciate it if you <a href="mailto:mail@bryanwrit.es">let me know</a>.</p>

<p>I’ve been running this setup for a couple of days and I haven’t noticed any degraded network performance, even when my development machine is asleep and not able to serve DNS requests. This has been a huge win for me, vastly improving my workflow and front-end testing on devices.</p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>Lynr is hosted on Heroku and I didn’t want to create a commit and push to staging to test every change. I did this for a couple of changes and it was a pain in the ass. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2" role="doc-endnote">
      <p>for the day, because you’re never done testing. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:3" role="doc-endnote">
      <p>Assuming you’re testing on multiple devices. You <em>are</em> testing on multiple devices right? <a href="#fnref:3" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:4" role="doc-endnote">
      <p><code class="language-plaintext highlighter-rouge">dtach</code> hasn’t been updated in years but it continues to run just fine. <a href="#fnref:4" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:5" role="doc-endnote">
      <p><code class="language-plaintext highlighter-rouge">unbound</code> binds to port 53 which requires root access. <a href="#fnref:5" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:6" role="doc-endnote">
      <p>Provided those devices are getting IP addresses from DHCP. <a href="#fnref:6" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[My Long Year's Journey]]></title>
    <link href="https://bryanwrit.es/here/2014/my-years-long-journey/"/>
    <updated>2014-04-10T02:42:01+00:00</updated>
    <id>https://bryanwrit.es/here/2014/my-years-long-journey</id>
    <content type="html"><![CDATA[<p>On February 11th of last year I made the first commit to the git repository that would eventually turn into <a href="https://lynr.co">lynr.co</a>. The first commit was a markdown file laying out an as yet undeveloped API. The API it described may never be developed but that commit and that markdown file represents the start of a journey which has just reached the milestone of fledgling product.</p>

<p>This past (just over a) year was mentally and emotionally challenging for me. The cause of which I do not and may never understand. I struggled through what I can only describe as a dark pit of depression while taking on too much client work until I had a mental collapse. The mental collapse preceded three months of extreme inactivity over the summer during which time I did zero work and played pointless video games nearly non-stop all while telling myself I was making an effort to snap myself out of my ‘funk’. Ultimately it took the woman for whom I care deeply saying she was so unhappy she thought she could no longer be with me to get me back in the vicinity of functional adult.</p>

<p>At first, her words only made my mental state worse but with the lens of hindsight I can see they put enough of the fear in me to muster the effort to shamble forward. I took on a small amount of new client work, rented office space at <a href="http://workattheyard.com/locations/lower-east-side/">The Yard</a>, and slowly started making commits to Lynr, my then side-project. I continued shambling slowly forward for several months until I felt myself mentally stumbling again. Those stumbles and the continued fear I would fall back down the dark pit and lose the woman I’m foolishly not in bed next to right now convinced me I needed to make a genuine change in the way I spent my time. The change I decided to make was ceasing client work while I focused my efforts on making Lynr a reality.</p>

<p>Now, Lynr is a reality and I feel good about something I’ve accomplished for the first time in years. As of this writing, Lynr has zero customers but I saw it through and I am unable to get my brain to stop working on it; even when it should be sleeping. I’m excited to be seeking customers, to be thinking about what they need from Lynr to improve their business, because improving their business is now my business. I don’t know where the journey leads but I’m grateful to be trodding the path.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[2013? I'm Indifferent.]]></title>
    <link href="https://bryanwrit.es/here/2013/2013-im-indifferent/"/>
    <updated>2013-12-22T23:48:39+00:00</updated>
    <id>https://bryanwrit.es/here/2013/2013-im-indifferent</id>
    <content type="html"><![CDATA[<p>Financially, this past year was a crummy one for me. I invoiced about 1/3 less than I did last year and I did less work on payroll so taxes are likely to hit me harder at the end of it (I paid less into income tax so far).</p>

<p>To be fair, I invoiced less because I spent less time working on billable projects and more time traveling and visiting with my parents in California. As a consequence of those choices I was concerned about money and whether or not I had enough for Mai and I to continue living in the manner to which we have become accustomed for the last third of 2013 . For the most part these worries have been unfounded. We scaled back on fancy dinners out but have not had to make any drastic changes. The change in my financial standing has remained largely hidden from everyone who knows me, other than Mai, until now — assuming anyone who knows me is reading this (hi friend).</p>

<p>Emotionally, this past year was a depressing one for me. My emotional state is certainly impacted by the financial worries resulting from me working less but the reasons I worked less took a toll as well.</p>

<p>When I left IPG in February I had an understanding with my then boss (and still friend) – work, in the form of a new branch of an existing client services company, would be forthcoming shortly. From our conversations about this new company, I was under the impression I would be the technical leader of the newly minted branch and work directly with him as the technology half of a technologist/designer pairing (much like the copywriter/art director pairings of traditional advertising). To top off this sweet deal the company wanted our new branch to work on the development of products and intellectual property in addition to spending time on traditional client services projects. I held myself back from taking much client work while awaiting word the company was ready to fund this adventure. I did some work for Wondersauce on the Champion website during this time, though I handled the most important launch — from Wondersauce’s perspective — poorly.</p>

<p>After the launch mis-fire I retreated further from client work and tried to focus on Lynr, a project started in February and intended to be a little side-gig money maker. After about a month of working on Lynr I agreed to do more work for Wondersauce on the Champion property, this time for a new contest. The billable work suspended effort on Lynr until shortly after the Champion launch on June 17th. While working on Champion the funding we (my friend from IPG and I) were hoping for never materialized but the dream job continued to tempt me in the form of a role with a company being started by my friend (same one) in partnership with two others. When the four of us sat down to talk about whether or not I would be interested in joining this new venture — I now realize — I carried over too many assumptions about my role from the from the last (almost) venture. As a result of my assumptions, I did not ask enough or the right questions about the role they expected me to have nor did I make the appropriate assertions regarding what I wanted my role to be. My assumptions and my lack of assertions directly resulted in me waiting nearly two months for an offer that was neither what I expected nor what I wanted. When I made a counter-offer outlining what I did want they said no and ended the discussion. I sunk further into my quagmire of negative emotions.</p>

<p>After a tough talk with Mai and a concerted mental effort at getting my shit back together over the last three months of 2013 I am back to near normal mental and emotional state but it has been difficult to get here and likely will continue to be a struggle.</p>

<p>After review, maybe I’m not so indifferent after all.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Interacting with a Redis Cluster]]></title>
    <link href="https://bryanwrit.es/here/2012/interacting-with-a-redis-cluster/"/>
    <updated>2012-03-15T17:32:25+00:00</updated>
    <id>https://bryanwrit.es/here/2012/interacting-with-a-redis-cluster</id>
    <content type="html"><![CDATA[<p><em>This is a thing I wrote seven years ago and was stuck in drafts unfinished. I’m “publishing” it now unchanged except for this note, mostly to highlight for myself I was thinking about horizontal scalability for systems I was writing seven years ago.</em></p>

<p>After an interview with the folks at <a href="http://www.knewton.com/">Knewton</a> served as a reminder for an aspect of <a href="http://persnicketly.com">Persnciketly’s</a> architecture which was not capable of scaling horizontally. This specific limitation was due to the choice of <a href="http://www.rabbitmq.com/">RabbitMQ</a> as a message broker. Previous versions of RabbitMQ did not have support for <a href="http://www.rabbitmq.com/ha.html">Mirrored Queues</a> though it has since been remedied.</p>

<p>In an effort to make Persnicketly easier to scale out the decision was made to change out RabbitMQ for Redis. Redis is not in and of itself a message broker though it supports data structures which lend it being used as one.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Dad's Chili]]></title>
    <link href="https://bryanwrit.es/here/2012/dads-chili/"/>
    <updated>2012-03-13T18:44:54+00:00</updated>
    <id>https://bryanwrit.es/here/2012/dads-chili</id>
    <content type="html"><![CDATA[<p>My Dad makes some of the most wonderful chili I’ve ever had, and I love chili. This is the recipe my Mom provided when I asked about it. They use a pressure cooker to do it but it can be done in a large stew pot but will take longer.</p>

<h2 id="ingredients">Ingredients</h2>

<ul>
  <li>1 lb. ground turkey</li>
  <li>1 lb. turkey sausage</li>
  <li>1 medium onion, sliced</li>
  <li>1 medium bell pepper (orange, yellow, red)</li>
  <li>1 tablespoon (T) chili powder</li>
  <li>1 teaspoon (t) salt</li>
  <li>¼ teaspoon (t) garlic powder</li>
  <li>1 ½ teaspoon (t) parsley</li>
  <li>1 ½ teaspoon (t) oregano or sage</li>
  <li>½ teaspoon (t) thyme</li>
  <li>1 bay leaf</li>
  <li>2 teaspoons (t) cumin</li>
  <li>¼ cup vinegar</li>
  <li>16 oz tomato sauce</li>
  <li>16 oz stewed tomatoes</li>
  <li>½ cup corn</li>
</ul>

<h2 id="instructions">Instructions</h2>

<ol>
  <li>Brown and drain turkey and turkey sausage in large pan</li>
  <li>Add onion and pepper, sauté until onion and pepper are soft</li>
  <li>Combine all ingredients <em>except corn</em></li>
  <li>Stir</li>
  <li>Close pressure cooker and cooke for about 15 minutes</li>
  <li>Allow to cool</li>
  <li>Add corn and simmer</li>
  <li>Stir until corn and chili are evenly heated</li>
</ol>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Run For Japan]]></title>
    <link href="https://bryanwrit.es/here/2012/run-for-japan/"/>
    <updated>2012-03-10T13:48:39+00:00</updated>
    <id>https://bryanwrit.es/here/2012/run-for-japan</id>
    <content type="html"><![CDATA[<p><img src="/assets/img/posts/run-for-japan/run_for_japan.jpeg" alt="Run for Japan on March 11th at 10:00 AM in Central Park" /></p>

<p>Tomorrow is the one year anniversary of the earthquake and tsunami which devastated the east coast of northern Japan. And so <a href="http://www.facebook.com/runforjapan">DoSoKai is putting on Run for Japan</a> for people to come out and show support the recovery and raise funds for earthquake / tsunami victims.</p>

<p>As you may be aware Mai and I have already donated time and travel to go to Japan and do volunteer work with <a href="http://hands.org/">All Hands</a> in Ofunato and I am happy to be able to continue helping even if only in this small way.</p>

<p>Tomorrow I’ll be donating some money and time to run (hopefully) 10k. Mai and I will be at the <a href="http://maps.google.com/maps?q=72nd+street+%26+5th+Ave,+new+york,+ny&amp;hl=en&amp;sll=40.694504,-73.956555&amp;sspn=0.037744,0.055189&amp;hnear=5th+Ave+%26+E+72nd+St,+New+York,+10021&amp;t=m&amp;z=16">72nd St &amp; 5th Ave entrance to Central Park</a> tomorrow bright and early-ish at 09:00 to get registered and warmed up. I would be super grateful if folks would come and show their support as well. Either for me or for Japan or both.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Creating Long Form Journalism MATTERs]]></title>
    <link href="https://bryanwrit.es/here/2012/creating-long-form-journalism-matter/"/>
    <updated>2012-02-23T09:26:52+00:00</updated>
    <id>https://bryanwrit.es/here/2012/creating-long-form-journalism--matter</id>
    <content type="html"><![CDATA[<iframe class="kick-card" frameborder="0" height="380px" src="http://www.kickstarter.com/projects/readmatter/matter/widget/card.html" width="220px"></iframe>

<p>There has been talk around the internet lately about long form journalism and its merits, particularly compared to short blog posts (like this one) which are largely a rehash of information. The lack of long form writing and therefore long form reading implies people are taking bits of information someone else has already read and analyzed without checking the sourcing. As a result we, the collective denizens of the Internet, have largely outsourced the burden of weighty reading and analysis to other people.</p>

<p>A new <a href="http://www.kickstarter.com/projects/readmatter/matter">project on Kickstarter called MATTER</a> is trying to change the status quo by focusing on publishing one weighty investigative piece every week. <a href="http://readmatter.com">MATTER</a> claimes to be reader, rather than advertiser focused, and so they will charge a nominal fee (99¢) per article.</p>

<p>I think the whole model is brilliant and I’m pleased to say I’ve backed the venture on Kickstarter and I think you should too.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[#Rethink the Network by Anil Dash]]></title>
    <link href="https://bryanwrit.es/here/2012/rethink-the-network-by-anil-dash/"/>
    <updated>2012-02-14T09:56:37+00:00</updated>
    <id>https://bryanwrit.es/here/2012/rethink-the-network-by-anil-dash</id>
    <content type="html"><![CDATA[<p>This morning at <a href="http://grindspaces.com">grindspaces</a> <a href="http://anildash.com">Anil Dash</a> gave a talk titled “#Rethink the Network”. The talk followed a metaphor about about highways and the interesting things which can occur at and how societies and industries are built up around the intersections of highways. Anil’s premise is today’s online network in general and the big social networks specifically have largely eliminated these types intersections from the web.</p>

<p>According to Anil these intersections are imitated in the worst way by the web of today because internet denizens get the least appealing parts of the things happening at intersections, the angry flash mobs, without the great things – the serendipitous meetings of people and ideas. The loss of serendipity stems in part by how easy it has become to share things socially, tweeting or liking a story are such frictionless acts they require little investment by the person doing the tweeting or liking.</p>

<p>In addition to removing the friction from sharing, and thus the investment and commitment of the sharer, these social networks also inhibit an individual’s ability to misbehave or stand apart. Everyone’s branding is the same on Facebook and Twitter and Google+ and this makes it difficult to like someone’s style in these places. Everyone’s got the same look. Anil called this Captive Atria, calling something a public space but applying a strict set of rules to how this public space can be utilized.</p>

<p>Some of Anil’s message resonates strongly with me, specifically the brief bit at the end about owning your presence on the web. More and more lately I’ve been identifying people by Twitter rather than by their web sites and that isn’t appropriate. Not everyone sees their Twitter page as their home on the web, in fact I don’t see it as my home on the web either. But it is probably the best place to start looking for a way to communicate with me.</p>

<p>It was also interesting to have Anil point out the values projected by the creators of the big social networks. I am typical of the audience or at least similar in path to some of the founders of these companies and so I don’t run into what have clearly been identified by the founders as edge cases. The fact is they aren’t edge cases though. It is perfectly reasonable to have two jobs simultaneously and to have not completed a college degree and the networks calling those things oddities projects values onto the consumers of their data the same way conference having only privileged white male speakers projects values on the attendees.</p>

<p>I’m glad there are people like Anil calling for more open networks online and calling out the value judgements software creators are projecting onto their consumers. Hopefully observations such as these will help improve products for us all.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Persnicketly v1.2.0]]></title>
    <link href="https://bryanwrit.es/here/2012/persnicketly-v120/"/>
    <updated>2012-01-26T23:10:44+00:00</updated>
    <id>https://bryanwrit.es/here/2012/persnicketly-v120</id>
    <content type="html"><![CDATA[<p>A new version of Persnicketly just went up and it includes a few changes in code organization but more importantly the RSS feeds are ready for prime time. They are now linked in the head sections of each listing page. In addition to the RSS feed links a new article time period was added enabling a peek into the, theoretically more volatile, last seven days of Readability articles.</p>

<p>The RSS feeds are accessed by adding <code class="language-plaintext highlighter-rouge">.rss</code> or <code class="language-plaintext highlighter-rouge">.atom</code> to as the extension of the list pages. The links are:</p>

<ul>
  <li><a href="http://persnicketly.com/article/list.rss">60 day feed</a></li>
  <li><a href="http://persnicketly.com/article/recent.rss">14 day feed</a></li>
  <li><a href="http://persnicketly.com/article/week.rss">7 day feed</a></li>
</ul>

<p>These feeds have already made article discovery easier for the human so hopefully they are useful to others as well.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Bourbon Sausage Gravy]]></title>
    <link href="https://bryanwrit.es/here/2012/bourbon-sausage-gravy/"/>
    <updated>2012-01-23T11:10:43+00:00</updated>
    <id>https://bryanwrit.es/here/2012/bourbon-sausage-gravy</id>
    <content type="html"><![CDATA[<h2 id="ingredients">Ingredients</h2>

<ul>
  <li>½ med. onion diced</li>
  <li>½ tablespoon olive oil</li>
  <li>pinch of salt</li>
  <li>¾ lb of ground sausage</li>
  <li>4 oz of bourbon</li>
  <li>5 tablespoons all purpose flour</li>
  <li>3 cups whole milk</li>
</ul>

<h2 id="instructions">Instructions</h2>

<p>In a small skillet over medium heat add the onions oil and salt, then fry until the onions are translucent. Once they are translucent set them aside.</p>

<p>In a large skillet over medium-low heat:</p>

<ol>
  <li>Add the ground sausage and 2 oz of bourbon</li>
  <li>Fry the sausage until browned</li>
  <li>Once browned add the cooked onions</li>
  <li>Add one tablespoon of flour and stir until the sausage and flour are incorporated together</li>
  <li>Repeat 4 times until all flour is used</li>
  <li>Slowly add one cup of milk until it begins to thicken</li>
  <li>Repeat 2 times until all milk is used</li>
  <li>Add the last of the bourbon and stir it together</li>
</ol>

<p>Reposted from <a href="/etc/bourbon-sausage-gravy/">old blog</a></p>

<p>Summarized from <a href="http://www.accidentalhedonist.com/index.php/2007/09/24/bourbon_sausage_gravy_and_biscuits">Accidental Hedonist</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Wilson Miner - When We Build]]></title>
    <link href="https://bryanwrit.es/here/2012/wilson-miner-when-we-build/"/>
    <updated>2012-01-23T11:07:56+00:00</updated>
    <id>https://bryanwrit.es/here/2012/wilson-miner--when-we-build</id>
    <content type="html"><![CDATA[<p>I just watched <a href="http://twitter.com/wilsonminer">@wilsonminer</a>’s <a href="http://vimeo.com/34017777">talk for build conf 2011</a><sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>. It is an inspiring and nourishing talk about why the job of software design and development is awesome and world changing and wonderful. It is one of the best things I could have spent forty minutes watching.</p>

<p>Thanks <a href="https://twitter.com/beep/status/161463650014597120">@beep</a></p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>http://2011.buildconf.com/ <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Persnicketly v1.1.8]]></title>
    <link href="https://bryanwrit.es/here/2012/persnicketly-v118/"/>
    <updated>2012-01-23T00:51:15+00:00</updated>
    <id>https://bryanwrit.es/here/2012/persnicketly-v118</id>
    <content type="html"><![CDATA[<p>This was a quick cycle because it only includes one feature and one bug fix. The recent articles list has it’s own RSS feed as of v1.1.8 and the links for the RSS entries now successfully go to the Persnicketly read pages which send the user to the article.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Persnicketly v1.1.7]]></title>
    <link href="https://bryanwrit.es/here/2012/persnicketly-v117/"/>
    <updated>2012-01-22T20:21:52+00:00</updated>
    <id>https://bryanwrit.es/here/2012/persnicketly-v117</id>
    <content type="html"><![CDATA[<p>Version 1.1.7 of <a href="http://persnicketly.com">Persnicketly</a> was just deployed. It contains changes to the way data is retrieved from the <a href="https://www.readability.com/publishers/api">Readability API</a>. Prior to v1.1.7 Persnicketly used <a href="http://dispatch.databinder.net">Dispatch</a> to communicate with Readability but it was far too confusing when trying to maintain code written using it. Persnicketly is now using <a href="https://github.com/fernandezpablo85/scribe-java">scribe-java</a> which is an open source library created by <a href="https://twitter.com/fernandezpablo">@fernandezpablo</a>.</p>

<p>Dispatch is a ‘cooler’ piece of software, written in Scala and capable of doing non-blocking IO but it is also difficult for my brain to parse after some downtime. scribe-java on the other hand uses HttpUrlConnection but works fine and abstracts the requests away in a perfectly understandable way. scribe-java seems to be the simplest solution that works right out of the box.</p>

<p>Persnicketly was also using Dispatch to do JSON parsing of the responses from Readability. The response parsing is now being handled by <a href="http://github.com/codahale/jerkson">Jerkson</a> written by <a href="http://twitter.com/coda">@coda</a>. Jerkson was already included in the dependency tree so it was a no brainer choice to replace Dispatch’s JSON parsing. Switching to Jerkson had the benefit of doing faster parsing while keeping nearly the same level of readability.</p>

<p>The new version of Persnicketly also includes an RSS feed of the top articles in the last sixty days. The RSS feature is not linked too yet because it needs some real word testing first but it should be releasable in the next couple of days assuming articles don’t get republished to the feed when they shouldn’t.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Shredded Chicken Tacos]]></title>
    <link href="https://bryanwrit.es/here/2012/chicken-tacos/"/>
    <updated>2012-01-22T19:38:33+00:00</updated>
    <id>https://bryanwrit.es/here/2012/chicken-tacos</id>
    <content type="html"><![CDATA[<h2 id="ingredients">Ingredients</h2>

<ul>
  <li>2 - 8 oz. cans tomato sauce</li>
  <li>2 t. white distilled vinegar</li>
  <li>2 t. minced garlic</li>
  <li>3 ½ t. ancho chile powder</li>
  <li>1 t. ground cumin</li>
  <li>2 t. oregano</li>
  <li>½ t. sugar</li>
  <li>2 T. virgin olive oil</li>
  <li>2 lbs. bone-in, skin-on chicken breasts (boneless/skinless is fine too)</li>
  <li>Adobo to taste</li>
  <li>1 - 10 oz. pkg corn tortillas, warmed</li>
</ul>

<h2 id="instructions">Instructions</h2>

<p>For  garnishes - onion, 1 lime cut into wedges, chopped cilantro, lettuce, tomatoes, avocados, salsa</p>

<p>In medium bowl, mix together tomato sauce, vinegar, garlic, chili powder, cumin, oregano, and sugar. Season with Adobo; set aside. (this is really a guess and personal preference. I usually cover the surface with a thin sprinkling).</p>

<p>Heat oil n large skillet, over medium-high heat. Season chicken with Adobo. Cook chicken, turning once, until light golden brown on both sides, about 5 minutes. Add tomato sauce mixture to skillet; bring to boil (be careful, tomato sauce splatters.) Lower heat to medium low. Simmer, covered, until cooked through (thermometer will register 170 degrees F when inserted into thickest part of breast), flipping once - cooking time is about 20 minutes.</p>

<p>Transfer chicken to cutting board; reserve sauce in pan. Remove and discard bones and skin. Using two forks, shred chicken breasts. Transfer shredded chicken to skillet with sauce, mixing to combine; continue to cook until sauce reduces and blends into chicken, and mixture begins to caramelize - about 10 minutes.
Transfer chicken mixture to serving bowl. Spoon into warmed corn tortillas. Garnish.</p>

<p>Prep Time: 10 minutes. Cook time: 40 minutes - serves 4</p>

<p>slightly modifed from <a href="http://blogchef.net/shredded-chicken-tacos-recipe/">blogchef.net</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Continued SOPA/PIPA Reading]]></title>
    <link href="https://bryanwrit.es/here/2012/continued-sopapipa-reading/"/>
    <updated>2012-01-20T23:56:13+00:00</updated>
    <id>https://bryanwrit.es/here/2012/continued-sopapipa-reading</id>
    <content type="html"><![CDATA[<p>Last night after writing my daily I got somewhat politically motivated as a result of <a href="/here/2012/fight-hollywood-fight-sopa/">Hollywood taking money away from Obama and his re-election campaign</a> in reaction to the position of the Obama administration on SOPA / PIPA. This really bothers me because it highlights almost all of the things I see as being wrong with the American government and it’s electoral system. SOPA and PIPA are terrible pieces of legislation which threaten the fabric of the internet. The lobbyists of big media put these pieces of legislation together because they want absolute control over how their content is distributed and if they can’t have it their way on the internet they would apparently rather there wasn’t a medium for the distribution of content which of course means no medium for the easy distribution of information either.</p>

<p>SOPA / PIPA legislation would be giving the powers of censorship, not to the American government, but to the lawyers of big media companies. Now SOPA and PIPA both seem to have met their end in their current form and so people are celebrating, but they are also talking about what comes next and the fundamental mis-understandings allowing the legislation to get as far as it did.</p>

<p>There has been some great writing about these issues today. Notably:</p>

<ul>
  <li><a href="http://www.shirky.com/weblog/2012/01/pick-up-the-pitchforks-david-pogue-underestimates-hollywood/">Pick up the pitchforks: David Pogue underestimates Hollywood</a> by <a href="http://twitter.com/cshirky">@cshirky</a> who talks about just how extreme the SOPA and PIPA legislation is and how much power it would give big media</li>
  <li><a href="http://www.jonathancoulton.com/2012/01/21/megaupload/">MegaUpload</a> where <a href="http://twitter.com/jonathancoulton">@jonathancoulton</a> questions the real impact of piracy.</li>
  <li><a href="http://www.marco.org/2012/01/20/the-next-sopa">The next SOPA</a> in which <a href="http://twitter.com/marcoarment">@marcoarment</a> talks about the root of SOPA and the views media companies must have of their consumers in order to believe SOPA/PIPA are good ideas.</li>
  <li><a href="http://meyerweb.com/eric/thoughts/2012/01/20/vigilance-and-victory/">Vigilance and Victory</a> is <a href="http://twitter.com/meyerweb/">@meyerweb</a> reminding all of us that just because SOPA / PIPA is down for now does not mean it won’t be back. Because the same ideas will be back.</li>
</ul>

<p>Of all of the words written on the issue the Jonathan Coulton wrote the ones which resonate the most for me.</p>

<blockquote>
  <p>Make good stuff, then make it easy for people to buy it. There’s your anti-piracy plan.<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup></p>
</blockquote>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p><a href="http://www.jonathancoulton.com/2012/01/21/megaupload/">http://www.jonathancoulton.com/2012/01/21/megaupload/</a> <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Fight Hollywood, Fight SOPA]]></title>
    <link href="https://bryanwrit.es/here/2012/fight-hollywood-fight-sopa/"/>
    <updated>2012-01-20T03:19:47+00:00</updated>
    <id>https://bryanwrit.es/here/2012/fight-hollywood-fight-sopa</id>
    <content type="html"><![CDATA[<h3 id="tldr">&lt;TL;DR&gt;</h3>

<blockquote>
  <p><a href="http://www.whitehouse.gov/blog/2012/01/14/obama-administration-responds-we-people-petitions-sopa-and-online-piracy">Obama’s reaction</a> to the SOPA/PIPA legislation may have had <a href="http://www.deadline.com/2012/01/exclusive-hollywood-moguls-stopping-obama-donations-because-of-administrations-piracy-stand/">a direct, negative impact on his ability to get re-elected</a>. Hollywood and other media moguls are hitting the Obama administration where it hurts most, in the wallet (or, as it is termed at election time, in the war chest). It would be terrible if getting the Obama administration to take a stand on an issue important to us, the community of internet makers, cost the administration money to fund a re-election campaign. Obama’s position was encouraged by our community and it would be wonderful if we could help him out by voting with our dollars the same way Hollywood and big media are voting with theirs. <a href="https://donate.barackobama.com/page/outreach/view/2012/antisopa">Donate to the Obama campaign</a>.</p>
</blockquote>

<h3 id="tldr-1">&lt;/TL;DR&gt;</h3>

<p>There was quite the kerfuffel over the <a href="http://sopastrike.com/">internet blackout / strike</a> Wednesday (January 18th). In the blackout, a fair number of sites, most notably Wikipedia, blocked access to their content with an anti-<a href="http://www.opencongress.org/bill/112-h3261/show">SOPA</a> message. The point was to raise awareness with people who do not closely follow technology news. And it worked. At least well enough to have a Twitter account, <a href="https://twitter.com/herpderpedia">@herpderpedia</a>, retweeting some under informed reactions.</p>

<p>More important than the antics on Twitter, the <a href="http://www.whitehouse.gov/blog/2012/01/14/obama-administration-responds-we-people-petitions-sopa-and-online-piracy">White House responded</a> to a <a href="https://wwws.whitehouse.gov/petition-tool/petition/veto-sopa-bill-and-any-other-future-bills-threaten-diminish-free-flow-information/g3W1BscR">petition to stop SOPA</a>. The response stated:</p>

<blockquote>
  <p>We must avoid creating new cybersecurity risks or disrupting the underlying architecture of the Internet.</p>
</blockquote>

<p>There was a great deal more to the White Hourse statement and everyone is encouraged to read it but this is the crux. We can’t burn the field to get the mouse.</p>

<p>The combination of these events, as well as the continued phone calls and letters from constituents, had a direct impact on the <a href="http://projects.propublica.org/sopa/">supporters of SOPA as tracked by propublica.org</a>. The impact is well illustrated by <a href="http://s3.amazonaws.com/propublica/assets/images/sopa-opera-count.png">screenshots of propublica.org on the 18th next to the 19th</a>.<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup><sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup><sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">3</a></sup></p>

<p>Unfortunately, Obama’s reaction may have had <a href="http://www.deadline.com/2012/01/exclusive-hollywood-moguls-stopping-obama-donations-because-of-administrations-piracy-stand/">a direct, negative impact on his ability to get re-elected</a><sup id="fnref:4" role="doc-noteref"><a href="#fn:4" class="footnote" rel="footnote">4</a></sup>. Hollywood and other media moguls are hitting the Obama administration where it hurts most in the wallet or, as it is termed at election time, in the war chest. It would be terrible if Obama’s administration taking a stand on an issue important to us, the community of internet makers, cost them the money to fund a re-election campaign. He did it for us and it would be wonderful if we could help him out by voting with our dollars the same way Hollywood and big media are voting with theirs. <a href="https://donate.barackobama.com/page/outreach/view/2012/antisopa">Donate to the Obama campaign</a>.</p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1" role="doc-endnote">
      <p>via <a href="http://twitter.com/joestump/statuses/160107054386782209">@joestump</a> <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2" role="doc-endnote">
      <p>via <a href="http://twitter.com/jamespoling/statuses/160222834893914112">@jamespoling</a> <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:3" role="doc-endnote">
      <p>I wish I could find the original source of this image. If you have it please let me know - <a href="mailto:mail@bryanwrit.es">mail@bryanwrit.es</a> <a href="#fnref:3" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:4" role="doc-endnote">
      <p>via <a href="http://twitter.com/cshirky/statuses/160129411276996608">@cshirky</a> <a href="#fnref:4" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CaseClassSigParser Exceptions in SBT Console]]></title>
    <link href="https://bryanwrit.es/here/2012/caseclasssigparser-exceptions-in-sbt-console/"/>
    <updated>2012-01-19T00:24:52+00:00</updated>
    <id>https://bryanwrit.es/here/2012/caseclasssigparser-exceptions-in-sbt-console</id>
    <content type="html"><![CDATA[<p>When doing something in an <a href="http://code.google.com/p/simple-build-tool">SBT</a> console which requires the loading of Case Class instances via <a href="http://github.com/codahale/fig">fig</a> or <a href="http://github.com/codahale/jerkson">jerkson</a> ClassNotFoundExceptions will be generated because the console runs in a different ClassLoader than the one responsible for loading other classpath classes. As a result the ClassLoader reflection used to make this bit of <code class="language-plaintext highlighter-rouge">case class</code> magic doesn’t work unless the code is executed within a Thread which has had it’s ClassLoader set to the original. This is where <code class="language-plaintext highlighter-rouge">inClassLoader</code> comes in. Code executed within this beautiful function will produce a result rather than a <code class="language-plaintext highlighter-rouge">ClassNotFoundException</code>.</p>

<p>For example in <a href="http://github.com/bryanjswift/persnicketly">Persnicketly</a>:</p>

<script src="https://gist.github.com/1637690.js?file=inClassLoaderExample.scala"></script>

<div class="noscript">
  <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>val articles = inClassLoader(classOf[com.persnicketly.persistence.Connection$]) {
  ScoredArticleDao.select(from = 60, count = 100)
}
</code></pre></div>  </div>
</div>

<p>Will successfully load MongoDB configuration from <code class="language-plaintext highlighter-rouge">config.json</code>, access the db and retrieve articles.</p>

<p>Source of <code class="language-plaintext highlighter-rouge">inClassLoader</code>:</p>

<script src="https://gist.github.com/1637690.js?file=inClassLoader.scala"></script>

<div class="noscript">
  <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>def inClassLoader[T](cls: Class[_])(f: =&gt; T): T = {
  val prev = Thread.currentThread.getContextClassLoader
  try {
    Thread.currentThread.setContextClassLoader(
       cls.getClassLoader
    )
    f
  } finally {
    Thread.currentThread.setContextClassLoader(prev)
  }
}
</code></pre></div>  </div>
</div>

<p>Code provided by <a href="http://github.com/softprops">softprops</a> in <a href="https://github.com/codahale/jerkson/issues/38">issue #38 of jerkson</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Fucking Reality TV]]></title>
    <link href="https://bryanwrit.es/here/2012/fucking-reality-tv/"/>
    <updated>2012-01-18T23:16:08+00:00</updated>
    <id>https://bryanwrit.es/here/2012/fucking-reality-tv</id>
    <content type="html"><![CDATA[<p>Reality television is one of the most loathesome things to happen to television programming. The whole show is engineered to continually feed into the viewer’s naiveté and curiosity. Each break is set up as a cliffhanger and the constant camera view switching is the same trick movies frequently use in the opening scenes to grab the viewer’s attention. Except reality shows do it throughout the entire program. The whole genre is designed to use your brain’s survival programming to suck you into paying attention. And it works. Of course it works.</p>

<p>The only way to avoid being sucked in is to not turn it on but it is so prolific it is nearly impossible to avoid if you are flipping through channels on regular cable. Hell my girlfriend was watching a ten minute short of reality television on her phone, I couldn’t see the screen only hear the music and the dialog, and just that was enough to completely sap my focus from the task at hand. I had to leave the room until it was over.</p>

<p>Credit where it is due, reality television programs are insidiously and ingeniously using psychology to draw an audience in. And keep them attached. It plays like a psychological addiction and that realization is the most disturbing of all.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Good Reads - December 31st]]></title>
    <link href="https://bryanwrit.es/here/2012/good-reads-december-31st/"/>
    <updated>2012-01-01T02:39:02+00:00</updated>
    <id>https://bryanwrit.es/here/2012/good-reads-december-31st</id>
    <content type="html"><![CDATA[<p>There was a lot of excellent writing out there for consumption today. Below are some good ones.</p>

<ol>
  <li><em><a href="http://meghanagain.tumblr.com/post/14844563285/lessons-learned-in-2011">Lessons Learned in 2011</a></em> adds commentary to a wonderful list of things you shouldn’t waste your brain grapes on. <em>Like at all.</em> And some pointers on the kinds of writing you should pay attention to and even seek out. — via <a href="http://www.kungfugrippe.com/post/14845286162/how-you-gonna-keep-em-down-lessons-learned-in-2011">@hotdogsladies</a></li>
  <li><em><a href="http://teddziuba.com/2011/12/process.html">Who Needs Process</a></em> in which our hero rants about process and how it is introduced to level the effects of the slow end of the bell curve. It is a good read about being agile without the <em>Agile</em>.</li>
  <li><em><a href="http://www.lamag.com/features/Story.aspx?ID=1568281">Between the Lines</a></em> makes learning about economics of parking lots and metered parking fascinating. It forces reflection on and outlines the consequences of the ‘free parking everywhere’ mentality.</li>
  <li><em><a href="http://blog.davidtate.org/2011/12/the-dangerous-effects-of-reading/">The Dangerous Effects of Reading</a></em> posits an idea where our constant need to consume and link to increasingly more interesting content can make it too difficult for any idea to get past our own ‘good enough’ filter. TL;DR - don’t just consume, <em>create</em>.</li>
  <li><em><a href="http://www.doctornerdlove.com/2011/11/nerds-and-male-privilege/all/1/">Nerds and Male Privilege</a></em> is a well considered treatise on why geek culture is so heavily male and likely to stay that way without a lot of individuals changing their attitudes and understanding the effects they have on geek girls.</li>
  <li><em><a href="http://www.nytimes.com/2012/01/01/magazine/tara-parker-pope-fat-trap.html?_r=2&amp;pagewanted=print&amp;pagewanted=all">The Fat Trap</a></em> was a depressing and enlightening article about how the body and the brain respond to weight loss. Who hasn’t wondered why it is so easy for skinny people to stay skinny? <em>The Fat Trap</em> illuminates some research attempting to explain the phenomenon.</li>
</ol>
]]></content>
  </entry>
  
</feed>

