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

 <title>Chris Dzombak</title>
 <link href="http://chris.dzombak.name/atom.xml" rel="self"/>
 <link href="http://chris.dzombak.name"/>
 <updated>2013-05-13T11:27:51-04:00</updated>
 <id>http://chris.dzombak.name</id>
 <author>
   <name>Chris Dzombak</name>
   <email>chris@chrisdzombak.net</email>
 </author>

 
 <entry>
   <title>CDZLinkOpenManager</title>
   <link href="http://chris.dzombak.name/blog/2013/04/cdzlinkopenmanager.html"/>
   <updated>2013-04-02T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2013/04/cdzlinkopenmanager</id>
   <content type="html">&lt;p&gt;While developing &lt;a href=&quot;https://github.com/cdzombak/BuyVMManager-iOS&quot;&gt;BuyVM Manager&lt;/a&gt;, I built a little framework that allows your app&#39;s users to select a default browser, and open links from your app in that browser.&lt;/p&gt;

&lt;p&gt;It&#39;s now on Github under the MIT license: &lt;a href=&quot;https://github.com/cdzombak/CDZLinkOpenManager&quot;&gt;CDZLinkOpenManager&lt;/a&gt;. It&#39;s also &lt;a href=&quot;https://github.com/CocoaPods/Specs/blob/master/CDZLinkOpenManager/1.0/CDZLinkOpenManager.podspec&quot;&gt;available via CocoaPods&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Feedback is welcomed: &lt;a href=&quot;https://github.com/cdzombak/CDZLinkOpenManager/issues&quot;&gt;GitHub Issues&lt;/a&gt; or &lt;a href=&quot;https://www.twitter.com/cdzombak&quot;&gt;Twitter (@cdzombak)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Have fun!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Where is this awesome airplane playground?</title>
   <link href="http://chris.dzombak.name/blog/2013/03/airplane-playground.html"/>
   <updated>2013-03-21T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2013/03/airplane-playground</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;Updated:&lt;/strong&gt; some additional Googling reveals that this is at the &quot;Lugansk aviation museum&quot;. Some relevant links: &lt;a href=&quot;http://www.irp.lg.ua/eng/content.php?type=24354623_0100&amp;amp;filename=2010_09_15_15_35_50.html&amp;amp;name=Aviation+Technology+museum&quot;&gt;a biography/history of the museum&lt;/a&gt;; &lt;a href=&quot;http://www.aviationmuseum.eu/World/Europe/Ukraine/Lugansk/Aviation_Museum.htm&quot;&gt;additional information about the museum&lt;/a&gt;; &lt;a href=&quot;http://fulbright-scholarship-luhansk-ukraine.blogspot.com/p/luhansk-aviation-museum.html&quot;&gt;notes and many photos from someone&#39;s blog&lt;/a&gt;; &lt;a href=&quot;http://silver.io.ua/album79282_0&quot;&gt;another large photo gallery&lt;/a&gt;. Googling &quot;Lugansk aviation museum&quot; will let you find some more info.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Original post follows:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I ran across &lt;a href=&quot;https://twitter.com/AirplaneGeeks/status/314713324975689729&quot;&gt;this tweet&lt;/a&gt; from &lt;a href=&quot;https://www.twitter.com/AirplaneGeeks&quot;&gt;@AirplaneGeeks&lt;/a&gt;, retweeted by &lt;a href=&quot;https://www.twitter.com/NYCAviation&quot;&gt;@NYCAviation&lt;/a&gt;, this morning. It asks where this awesome airplane playground is:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/blog/2013/27_161510_ab54bdb6130acda.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;https://twitter.com/HIAairport/status/314713569918861312&quot;&gt;best reply so far&lt;/a&gt; suggests it&#39;s somewhere in the Ukraine; &lt;a href=&quot;https://twitter.com/soapyhb/status/314717170867257345&quot;&gt;another Twitterer notes&lt;/a&gt; there&#39;s &quot;a lot of Russian hardware in the area&quot;. The watermark at the bottom of the image says it&#39;s from RussianPlanes.net.&lt;/p&gt;

&lt;p&gt;Let&#39;s start with &lt;a href=&quot;http://images.google.com/search?tbs=sbi:AMhZZiui1oOHORo0E4H_1cyLN7N_1j0YK_1LlsADnS0XiZmEsy3Rgf2eiERDaeqfUrVCeMaGUVWfsyykK2Y9sb9eY4joPmEaAZ6-_1-0SYfUvXCqcWH2AfalRavNXpnQnW5_1RvLzkZVY3gWJY-RnCVFQmZAKPExu3jA4Mvbt4fZawSfUwC2V6JmtmFubtAh_1ON_1aANOoXy7FyYKPND66VjGI0h_1n3JX6AY00DSoOL4vSrMgBjKF0kZ-lyOFHHzv_1FeCAnzqqb3yRx26C2CcBqbYzFUfgZ-jw2iFP-Uf4xwXkPPhFsQ8hw4HrADKnupYC0Omd_1XIZHwkZ0lyCviD8dn478o6-FdUet5aoUrnSh5V-n47oz3GleKs-hGlCKEBeb3M65aTV8Sd3RmxNHbdai8uEGMaI2GwznGBVdvIRPQ5TvB_1-92TqCPh3pCzwc8W8eu0mKsaZ8aknkNokLJtnWaiJBuHtzg7GbjU_11YkabrQ0v5kKgX-XlcMe7s5xL-w9t2JXPQRh89A86hj57XU1Z6u_1VG5letJ0_1szG-L8L4PdJGDy5JMeeDv7qjETy_1oH5AaKo8IT3Lbf6C1-7JFUVNsyB9K60X2gCJszH4N7w6FBlJYNZyaRq5kVUgqRRqO9AyxW4i8VGwsj1hp9ggLuWwPGSVeJHcNxpzszpPDWrmF11TR6GkbHhxeH4rYHavUbPIzfogxkEuXrlN6QoGfY6YnTXFGqEl2fgGiSVbeOgV05hzyinnuxQbUbBZ7k508OgSb1R6-aRT-8MlW15z5_1qxIVRJswHKyU38LPDRgfSawlewLSEm1UF21LfIR6OkbdjmJNl4u8TO7tbswfObP-hArk0kbQ7JGti3Y-MwU1QsrfYFRCvWjtVuHUBil04DARWB6i0KiddthE8v0LRaW4Qe3an2y9KOjz2OO3Glcc9qDvFIXCQ_1_1RFwJ5U-6y0rYidIGo2p36P4bjwmVW20jYFnMdWpty_1Bwx5toA7LBsGoNQAT2Djo4npS7WT4YqWElDFuke0v9--OnDCCT0O7RlK4u3b6algLIPh-JrWqe4uUs4tM0u8IIOmeUSb-2e3ePbIWz479ozNrTw11maPnnnfnwNIAsysg2zkF0B2dXWfZ8sqrIbHWsTMg6KQe2SFQOkfKOp4ixnr_1EQjeQ5bYERtnF2emSskDILwQQqhyJKRNhWmhzql6T17OFjXeqbibx1suQ_1df6_1-ml1dZy62oGfxzAIji6Cvy00PXJwFM8vPksqoarcgzcg9tuBrNLERzUeNStn-sBDM0ySrByimVmqzCpphixoVS7Xc-Gg_1NN1UAyJd-UD7yw65uns6h9o&amp;amp;hl=en&amp;amp;bih=733&amp;amp;biw=1440&quot;&gt;a Google image search&lt;/a&gt; for the Tweeted image. It looks like it originated on &lt;a href=&quot;http://www.fyjs.cn/bbs/html/27/1303/871751.html&quot;&gt;this Chinese forum&lt;/a&gt;, and we can grab &lt;a href=&quot;http://translate.google.com/translate?hl=en&amp;amp;sl=zh-CN&amp;amp;u=http://www.fyjs.cn/bbs/html/27/1303/871751.html&quot;&gt;an English translation from Google&lt;/a&gt;. That post says it&#39;s in &quot;Wukelanlu Ganske&quot;. &lt;a href=&quot;https://www.google.com/search?q=Wukelanlu+Ganske&amp;amp;aq=f&amp;amp;oq=Wukelanlu+Ganske&quot;&gt;A Google search for that term&lt;/a&gt; reveals several references to Ukraine, and finally I found &lt;a href=&quot;http://www.education-guide.net/2012/08/ukrainian-students-scholarships-apply-raiders/&quot;&gt;this page&lt;/a&gt; which suggests that &quot;Wukelanlu Ganske&quot; is related to a Ukranian university, LTSNU. Searching Google for &quot;LTSNU&quot; links to &lt;a href=&quot;https://www.google.com/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=11&amp;amp;cad=rja&amp;amp;ved=0CDIQFjAAOAo&amp;amp;url=http%3A%2F%2Fwww.acronymgeek.com%2FLTSNU%2FLuhansk_Taras_Shevchenko_National_University&amp;amp;ei=QxxLUZvrNaXCyAGyvoDoBg&amp;amp;usg=AFQjCNFwKAqIzE2N2IEOaTjPLNoEAh-d4g&quot;&gt;this page&lt;/a&gt;, which gives us no useful information, but Google&#39;s cached description tells us this school&#39;s name is &quot;Luhansk Taras Shevchenko National University&quot;. Finally, I have &lt;a href=&quot;http://en.wikipedia.org/wiki/University_of_Luhansk&quot;&gt;a Wikipedia page&lt;/a&gt; in English that I can actually read!&lt;/p&gt;

&lt;p&gt;I&#39;m pretty confident that the image is from somewhere near that university. Let&#39;s go to Google maps. We can see several other planes in the background of the original photo, along with a long hangar-type building, so it&#39;s pretty clear we&#39;re looking for an airport, maybe with some sort of outdoor display. We can easily find &lt;a href=&quot;http://maps.google.com/maps?q=Luhansk+Taras+Shevchenko+National+University&amp;amp;hl=en&amp;amp;ll=48.589283,39.399333&amp;amp;spn=0.009964,0.022659&amp;amp;sll=42.268163,-83.737793&amp;amp;sspn=0.17835,0.362549&amp;amp;t=h&amp;amp;hq=Luhansk+Taras+Shevchenko+National+University&amp;amp;radius=15000&amp;amp;z=16&quot;&gt;the university on Google Maps&lt;/a&gt;. Approximately 4 miles south, &lt;a href=&quot;http://maps.google.com/maps?q=Luhansk+Taras+Shevchenko+National+University&amp;amp;hl=en&amp;amp;ll=48.528343,39.388046&amp;amp;spn=0.019951,0.045319&amp;amp;sll=42.268163,-83.737793&amp;amp;sspn=0.17835,0.362549&amp;amp;t=h&amp;amp;hq=Luhansk+Taras+Shevchenko+National+University&amp;amp;radius=15000&amp;amp;z=15&quot;&gt;there&#39;s an airport&lt;/a&gt; with what seems to be a collection of planes on display!&lt;/p&gt;

&lt;p&gt;I think the airplane circled in the satellite image below is the plane in the original photo. The red-orange lines indicate the left and edges of the photo. The hangar and other artifacts in the photo line up with what we can see in the satellite image. Notice especially the blue sight line drawn from the photographer&#39;s vantage point through the center of the airplane and the north end of the hangar; this aligns perfectly with what&#39;s shown in he original photo, and we can see that in both images, the nose of a large white airplane is visible beyond the hangar.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/blog/2013/airport-display-satellite.png&quot; alt=&quot;satellite image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So there&#39;s your answer: this plane playground is at &lt;a href=&quot;http://maps.google.com/maps?q=Luhansk+Taras+Shevchenko+National+University&amp;amp;hl=en&amp;amp;ll=48.528343,39.388046&amp;amp;spn=0.019951,0.045319&amp;amp;sll=42.268163,-83.737793&amp;amp;sspn=0.17835,0.362549&amp;amp;t=h&amp;amp;hq=Luhansk+Taras+Shevchenko+National+University&amp;amp;radius=15000&amp;amp;z=15&quot;&gt;this airport in Luhans&#39;k, Луганская, Ukraine&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thoughts? Get at me: &lt;a href=&quot;https://www.twitter.com/cdzombak&quot;&gt;@cdzombak&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updated:&lt;/strong&gt; after I did this, I managed to find &lt;a href=&quot;http://russianplanes.net/id101259&quot;&gt;the image on RussianPlanes.net&lt;/a&gt;. It&#39;s listed as being in Lugansk, so it seems like I&#39;m probably right (even if I did take a roundabout method to find the answer)!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>CDZPinger</title>
   <link href="http://chris.dzombak.name/blog/2013/03/cdzpinger.html"/>
   <updated>2013-03-15T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2013/03/cdzpinger</id>
   <content type="html">&lt;p&gt;While writing &lt;a href=&quot;https://github.com/cdzombak/BuyVMManager-iOS&quot;&gt;BuyVM Manager&lt;/a&gt;, I was disappointed to find there was no good, easy-to-use ICMP ping library for iOS projects. Apple provides &lt;a href=&quot;http://developer.apple.com/library/mac/#samplecode/SimplePing/Introduction/Intro.html&quot;&gt;a SimplePing code sample&lt;/a&gt; that you can adapt into your codebase, which seemed to be the best code I could find.&lt;/p&gt;

&lt;p&gt;I built a nice wrapper around that code that enhances (re)usability, and I recently posted it on Github under the MIT license: &lt;a href=&quot;https://github.com/cdzombak/CDZPinger&quot;&gt;CDZPinger&lt;/a&gt;. It&#39;s also &lt;a href=&quot;https://github.com/CocoaPods/Specs/blob/master/CDZPinger/1.0/CDZPinger.podspec&quot;&gt;available via CocoaPods&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Feedback is welcomed, via &lt;a href=&quot;https://github.com/cdzombak/CDZPinger/issues&quot;&gt;GitHub Issues&lt;/a&gt; or &lt;a href=&quot;https://www.twitter.com/cdzombak&quot;&gt;Twitter (@cdzombak)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The UGLi</title>
   <link href="http://chris.dzombak.name/blog/2013/01/the-ugli.html"/>
   <updated>2013-01-07T00:00:00-05:00</updated>
   <id>http://chris.dzombak.name/blog/2013/01/the-ugli</id>
   <content type="html">&lt;p&gt;Students, faculty, staff, and community members have long known the University of Michigan&#39;s &lt;a href=&quot;http://www.lib.umich.edu/shapiro-undergraduate-library&quot;&gt;Shapiro Undergraduate Library&lt;/a&gt; as the &quot;UGLi&quot;. It&#39;s clear enough where the name comes from (&lt;strong&gt;U&lt;/strong&gt;nder&lt;strong&gt;g&lt;/strong&gt;raduate &lt;strong&gt;Li&lt;/strong&gt;brary), but how far back does it date?&lt;/p&gt;

&lt;p&gt;I &lt;a href=&quot;https://twitter.com/cdzombak/status/286963267027476480/photo/1&quot;&gt;discovered&lt;/a&gt; the phrase &quot;the UGLI&quot; in &lt;a href=&quot;http://news.google.com/newspapers?nid=aGxtzYPGyQEC&amp;amp;dat=19691014&amp;amp;printsec=frontpage&amp;amp;hl=en&quot;&gt;the October 14, 1969 edition of the Michigan Daily&lt;/a&gt; and began wondering just how long it&#39;s had that name - did it go further back than 1969?&lt;/p&gt;

&lt;p&gt;Several friends (&lt;a href=&quot;https://twitter.com/umtrey/status/286963516378853377&quot;&gt;Trey&lt;/a&gt;, whose parents were &#39;81 grads; &lt;a href=&quot;https://twitter.com/awdotz/status/286970435843788800&quot;&gt;Abby&lt;/a&gt;, whose parents attended in the early &#39;70s; and &lt;a href=&quot;https://twitter.com/kylelady/status/287189178893099008&quot;&gt;Kyle&lt;/a&gt;, who did a little research) noted that the community considered the building ugly before its remodeling in 1995. (&lt;a href=&quot;https://twitter.com/peterhoneyman/status/287035329804906496&quot;&gt;Prof. Honeyman noted&lt;/a&gt; that it was known as the Ugli in fall 1970, but didn&#39;t comment on the building&#39;s beauty.)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://umhistory.dc.umich.edu/mort/original/1975/Undergraduate%20Library/index.html&quot;&gt;This page&lt;/a&gt; has several undated but older photos of the Ugli inside and out, including one of a &quot;typing room with coin operated typewriters and ashtrays&quot;); The Bentley Historical Library &lt;a href=&quot;http://bentley.umich.edu/exhibits/campus_tour/chronology.php&quot;&gt;dates &quot;Shapiro Library Major Remodeling and Addition&quot;&lt;/a&gt; to 1995. (This &lt;a href=&quot;http://www.lib.umich.edu/media/brief-history-university-michigan-library&quot;&gt;brief history of the library system&lt;/a&gt; didn&#39;t mention the remodeling at all.)&lt;/p&gt;

&lt;p&gt;Ed Vielmetti &lt;a href=&quot;https://twitter.com/vielmetti/status/287036248613343232&quot;&gt;found&lt;/a&gt; a use of the &quot;UGLI&quot; name &lt;a href=&quot;http://news.google.com/newspapers?id=tw9KAAAAIBAJ&amp;amp;sjid=ph4NAAAAIBAJ&amp;amp;dq=ugli%20library&amp;amp;pg=916%2C139283&quot;&gt;in the August 27, 1963 edition of the Michigan Daily&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Whoever runs the Ugli&#39;s Twitter account (&lt;a href=&quot;https://www.twitter.com/UGLTweets&quot;&gt;@UGLTweets&lt;/a&gt;) &lt;a href=&quot;https://twitter.com/UGLTweets/status/286965171505733633&quot;&gt;says&lt;/a&gt; that the nickname must be older than 1969, &lt;a href=&quot;https://twitter.com/UGLTweets/status/286969711818838016&quot;&gt;noting&lt;/a&gt; that &quot;Some books surviving from the late 50s and early 60s have UGLi written on the spine.&quot; It seems likely, then, that the Ugli&#39;s nickname has been with it since the building was built in 1959.&lt;/p&gt;

&lt;p&gt;Still reading? These days, the Ugli has a webcam which streams live video of the Diag. &lt;a href=&quot;http://shapiro.cam.lib.umich.edu/view/index.shtml&quot;&gt;Check it out here.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Updated:&lt;/em&gt; &lt;a href=&quot;https://www.twitter.com/juliewbee&quot;&gt;@juliewbee&lt;/a&gt; &lt;a href=&quot;https://twitter.com/juliewbee/status/288470436935766016&quot;&gt;found&lt;/a&gt; some cool 1970s-era Ugli photosets on Flickr: &lt;a href=&quot;http://www.flickr.com/photos/uglib/sets/72157607795400437/&quot;&gt;1972 Library Orientation&lt;/a&gt; and &lt;a href=&quot;http://www.flickr.com/photos/uglib/sets/72157607789582646&quot;&gt;Reserves in 1972&lt;/a&gt;. Both are part of the &lt;a href=&quot;http://www.flickr.com/photos/uglib/collections/72157607793998621/&quot;&gt;UGL History collection&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Elegant UITableView row selection behavior based on edit state</title>
   <link href="http://chris.dzombak.name/blog/2012/10/elegant-uitableview-selection-edit-state.html"/>
   <updated>2012-10-09T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2012/10/elegant-uitableview-selection-edit-state</id>
   <content type="html">&lt;p&gt;If you&#39;re a Cocoa Touch developer, you&#39;ve undoubtedly implemented &lt;code&gt;-[UITableViewDelegate tableView:didSelectRowAtIndexPath:]&lt;/code&gt; a few hundred times. I did this recently and needed different behavior based on whether the table view was in its editing state (whether &lt;code&gt;-[UITableView isEditing]&lt;/code&gt;). In this particular case, the best solutions I could figure out were variants of nested conditionals, which are just ugly.&lt;/p&gt;

&lt;p&gt;Then I stumbled on something else which, depending on your use case, may be more elegant. Take a look, then I&#39;ll go into more detail. (For purposes of this example, assume &lt;code&gt;CDZType&lt;/code&gt; is a typedef&#39;d enum containing two values: &lt;code&gt;CDZTypePhone, CDZTypeEmail&lt;/code&gt;.) &lt;em&gt;I&#39;ve added an important update about how to define this enum at the end of this post.&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;objc&quot;&gt;&lt;span class=&quot;k&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;tableView:&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;UITableView&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;tableView&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;didSelectRowAtIndexPath:&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NSIndexPath&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;indexPath&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;CDZType&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rowType&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dataSource&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;rowTypeAtIndexPath:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;indexPath&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;

    &lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;define&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CDZTVEditing&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;NSUInteger&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rowTypeEditing&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rowType&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tableView&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isEditing&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CDZTVEditing&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rowTypeEditing&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;CDZTypePhone:&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// do stuff for phone selection in non-editing state&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;CDZTypeEmail:&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// do stuff for email selection in non-editing state&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CDZTypePhone&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CDZTVEditing&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// do stuff for phone selection in editing state&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tableView&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;deselectRowAtIndexPath:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;indexPath&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;animated:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;YES&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In this case, I wanted to take some action when (a phone or email row was selected and the table view was NOT in edit mode) or (a phone row was selected AND the table view was in edit mode). This can obviously be accomplished by nesting conditionals or writing complex conditional statements, but I didn&#39;t like the style of either of those choices (and there&#39;s a lot more to this code in &lt;a href=&quot;http://nutshell.com&quot;&gt;our app&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;This solution is really simple.&lt;/p&gt;

&lt;p&gt;I take advantage of the fact that there are very few values in this enum, and of the fact that C enum values are integers. I create a bitmask which is simply the integer 2&lt;sup&gt;9&lt;/sup&gt;. It seems heavy-handed, but the bitmask must be &lt;code&gt;#define&lt;/code&gt;d; the compiler insists that it must know all values which will be used in case statements, so a &lt;code&gt;static NSUInteger&lt;/code&gt; won&#39;t work.&lt;/p&gt;

&lt;p&gt;If the table view is in editing mode, I bitwise-OR the row type enum with the bitmask and switch on that value; otherwise I bitwise-OR the row type with 0 (which doesn&#39;t change the value). Then I just switch on that slightly-modified integer!&lt;/p&gt;

&lt;p&gt;A few additional notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This strategy will obviously cause problems if there are ever 2&lt;sup&gt;9&lt;/sup&gt; values in the enum; in this case I am guaranteed that will never happen. If you do get up to 2&lt;sup&gt;9&lt;/sup&gt; (If you&#39;re paranoid, you might add a final &quot;count&quot; value to the enum, and use a quick preprocessor rule in this method to break the build if that count ever exceeds 2&lt;sup&gt;9&lt;/sup&gt;.)&lt;/li&gt;
&lt;li&gt;If you ever hit 2&lt;sup&gt;9&lt;/sup&gt; values, change the bitmask to &lt;code&gt;1 &amp;lt;&amp;lt; 10&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Note that I&#39;ve taken care to namespace that bitmask, so that it won&#39;t conflict with anything after the preprocessor handles this file..&lt;/li&gt;
&lt;li&gt;I couldn&#39;t come up with a better title for this post. (Naming is hard.)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Update: defining your enum&lt;/h2&gt;

&lt;p&gt;As pointed out by &lt;a href=&quot;https://www.twitter.com/peterhoneyman&quot;&gt;@peterhoneyman&lt;/a&gt; and &lt;a href=&quot;https://www.twitter.com/andrewa2&quot;&gt;@andrewa2&lt;/a&gt;, to avoid assuming details about the data type underlying the enum (and therefore to stay within the realm of documented behavior) you have to specify that your enum should be backed by an &lt;code&gt;NSUInteger&lt;/code&gt;. See &lt;a href=&quot;https://gist.github.com/3860927&quot;&gt;this Gist from Andrew&lt;/a&gt; for an example.&lt;/p&gt;

&lt;p&gt;You&#39;ll notice that Apple does this in their header files wherever an enum is defined. Look up, for example, the definition of &lt;code&gt;UITableViewCellStyle&lt;/code&gt;, and you&#39;ll notice that it&#39;s backed by an &lt;code&gt;NSInteger&lt;/code&gt;. (You can also look at the definition of &lt;code&gt;NS_ENUM&lt;/code&gt; in &lt;code&gt;NSObjCRuntime.h&lt;/code&gt; to see what they&#39;re doing.)&lt;/p&gt;

&lt;h2&gt;Feedback&lt;/h2&gt;

&lt;p&gt;Feedback is welcome; comment here or contact me &lt;a href=&quot;https://www.twitter.com/cdzombak&quot;&gt;@cdzombak&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Collaborating with Git and Github</title>
   <link href="http://chris.dzombak.name/talks/2012-09-collaborating-with-git.html"/>
   <updated>2012-09-19T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/talks/collaborating-with-git</id>
   <content type="html">&lt;p&gt;Introduction to collaboration using Git and Github. I gave this talk for Michigan Hackers in September 2012.&lt;/p&gt;

&lt;p&gt;The slides, with speakers&#39; notes, are &lt;a href=&quot;/talks/pdf/2012-09-collaborating-with-git.pdf&quot;&gt;available in PDF&lt;/a&gt;. I&#39;ve also posted &lt;a href=&quot;https://vimeo.com/49731028&quot;&gt;a screen recording of the presentation, with audio&lt;/a&gt;.&lt;/p&gt;

&lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;6e639a706e420130dd541231381d4928&quot; data-ratio=&quot;1.33333333333333&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;

</content>
 </entry>
 
 <entry>
   <title>Avoiding shared credit card numbers across services</title>
   <link href="http://chris.dzombak.name/blog/2012/08/sharing-credit-card-numbers.html"/>
   <updated>2012-08-08T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2012/08/sharing-credit-card-numbers</id>
   <content type="html">&lt;p&gt;News broke last weekend of &lt;a href=&quot;http://www.wired.com/gadgetlab/2012/08/apple-amazon-mat-honan-hacking&quot;&gt;a high-profile hack which destroyed Mat Honan&#39;s digital life&lt;/a&gt;. The attacker used some clever maneuvering with Amazon and Apple&#39;s customer support policies (which have &lt;a href=&quot;http://www.wired.com/gadgetlab/2012/08/amazon-changes-policy-wont-add-new-credit-cards-to-accounts-over-the-phone/&quot;&gt;supposedly&lt;/a&gt; &lt;a href=&quot;http://www.wired.com/gadgetlab/2012/08/apple-icloud-password-freeze&quot;&gt;changed&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;A key vulnerability the attacker exploited with both Amazon and Apple was the use of credit card data to &quot;prove&quot; identity over the phone. Using CC numbers – especially just the last four digits – to prove identity is a bad idea. Credit card numbers are hardly private; every waiter in Ann Arbor could easily obtain mine, and anyone who finds a receipt in my trash can obtain the last 4 digits. This is a policy which both Apple and Amazon needed to fix, and they (apparently) have, at least temporarily.&lt;/p&gt;

&lt;p&gt;But such a vulnerability still likely exists with other high-value targets, especially for an attacker with social engineering expertise. For this set of targets, I consider using the same CC number just as bad a security issue as using a shared password. It is therefore prudent for users to attempt to defend themselves against these attacks, though I concede that the real responsibility to fix this class of CC-as-identity vulnerabilities lies with service providers.&lt;/p&gt;

&lt;p&gt;Tools like &lt;a href=&quot;https://agilebits.com/onepassword&quot;&gt;1Password&lt;/a&gt;, &lt;a href=&quot;https://lastpass.com/&quot;&gt;LastPass&lt;/a&gt;, and &lt;a href=&quot;http://keepass.info/&quot;&gt;Keepass&lt;/a&gt; let users generate and store a unique password for each site. After &lt;a href=&quot;https://www.twitter.com/mat&quot;&gt;@mat&lt;/a&gt; was hacked, I was inspired to figure out how one might use unique CC numbers for high-value targets such as Apple, Google, and Amazon accounts. Using unique CC numbers for Amazon and Apple would&#39;ve prevented &lt;a href=&quot;https://www.twitter.com/mat&quot;&gt;@mat&lt;/a&gt;&#39;s attacker from gaining access to his iCloud account.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;As a side note, you should enable &lt;a href=&quot;http://support.google.com/accounts/bin/answer.py?hl=en&amp;amp;answer=180744&quot;&gt;Google&#39;s two factor auth&lt;/a&gt;, which would defeat another vector used in this attack.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A solution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Must provide a unique credit/debit card number for each site.&lt;/li&gt;
&lt;li&gt;Must provide reusable numbers; numbers will be on file with Amazon/Apple and should therefore not be one-time-use or severely credit-limited.&lt;/li&gt;
&lt;li&gt;Would preferably not involve opening several different credit cards, due to bookkeeping/management complexity and credit rating concerns.&lt;/li&gt;
&lt;li&gt;Would preferably link to my checking account, not my credit card (I prefer not to use a credit card for much of anything; YMMV).&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Some research, including a call for help on Twitter, provided several suggestions, which I describe in the remainder of this post. With luck, you may find one useful.&lt;/p&gt;

&lt;h2&gt;Get another credit card&lt;/h2&gt;

&lt;p&gt;I didn&#39;t personally want to go this route for a few reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increased management and bookkeeping complexity&lt;/li&gt;
&lt;li&gt;Just another attack surface for fraudsters, etc.&lt;/li&gt;
&lt;li&gt;Concern over a hit on my credit score&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;This would, however, be a decent (and easy) solution for someone who&#39;s comfortable managing several credit cards and isn&#39;t as paranoid as I.&lt;/p&gt;

&lt;p&gt;(I have exactly one credit card, which I rarely use; I use my debit card and &lt;a href=&quot;https://www.mint.com/&quot;&gt;Mint&lt;/a&gt; for everything, and I&#39;m considering moving to &lt;a href=&quot;https://www.simple.com/&quot;&gt;Simple&lt;/a&gt; full time in the near future.)&lt;/p&gt;

&lt;h3&gt;Amazon store card&lt;/h3&gt;

&lt;p&gt;Amazon &lt;a href=&quot;http://www.amazon.com/Credit-Cards/b?ie=UTF8&amp;amp;node=1266766011&quot;&gt;offers several different branded credit cards&lt;/a&gt;, all of which have the same disadvantages for me as getting any other credit card.&lt;/p&gt;

&lt;h2&gt;Discover Secure Online Account Numbers&lt;/h2&gt;

&lt;p&gt;My one credit card is a Discover card, and Discover offers a service called &lt;a href=&quot;https://www.discovercard.com/cardmembersvcs/helpcenter/action/viewCategoryMain?topic=2&amp;amp;category=93&quot;&gt;Secure Online Account Numbers&lt;/a&gt; (link requires Discover login). This service:&lt;/p&gt;

&lt;p&gt;Per Discover:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Secure Online Account Numbers is a free service that offers you added security by protecting your account number while shopping online, and the convenience of automatically filling online checkout forms. By using a secure number in place of your actual Discover Card account number, your actual account number is not revealed on the Internet or stored in an online retailer&#39;s files. If they don&#39;t have your number, it can&#39;t be lost or stolen.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;You can log into Discover and use a (horrible) Flash widget to generate up to 50 unique credit card numbers linked to your real credit card. These numbers don&#39;t expire until your real card does, and they don&#39;t impose an additional credit limit. You can find this widget after logging in by clicking Account Profile, then scrolling down to &quot;Secure Online Account Numbers&quot;. &lt;em&gt;(&lt;a href=&quot;http://dl.dropbox.com/u/13359762/Screenshots/secureonlineaccountnumbers.png&quot;&gt;preview&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That sounds exactly like the solution I&#39;m looking for! I&#39;d prefer if my bank offered a similar solution for debit cards, but I couldn&#39;t find one. &lt;strong&gt;This is the solution I&#39;m currently using.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;Simple&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://www.simple.com/&quot;&gt;Simple&lt;/a&gt; &lt;a href=&quot;https://twitter.com/simplify/status/233337368671838208&quot;&gt;says they&#39;ve had a lot of requests for a similar feature, and that they&#39;re interested&lt;/a&gt;, but it sounds like it&#39;ll be a while before they implement this feature for their checking accounts.&lt;/p&gt;

&lt;h3&gt;Capital One&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://www.twitter.com/zigziggityzoo&quot;&gt;@zigziggityzoo&lt;/a&gt; &lt;a href=&quot;https://twitter.com/zigziggityzoo/statuses/233361732318408705&quot;&gt;reports&lt;/a&gt; that Capital One will also provide &quot;virtual&quot; card numbers, similar to Discover&#39;s Secure Online Account Numbers.&lt;/p&gt;

&lt;h2&gt;Reloadable prepaid cards&lt;/h2&gt;

&lt;p&gt;Visa, Mastercard, et al offer prepaid debit cards, which each have their own number and could therefore be used to mitigate this attack. Unfortunately, this solution violates several of my goals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It introduces increased management and bookkeeping complexity: I have to keep track of these cards, worry about adding money to them regularly, etc.&lt;/li&gt;
&lt;li&gt;It introduces another surface for future attacks.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Amazon/Apple gift cards&lt;/h3&gt;

&lt;p&gt;Amazon or Apple gift cards have all the disadvantages of reloadable prepaid cards, with additional lock-in on your money.&lt;/p&gt;

&lt;h2&gt;Bank routing/account numbers&lt;/h2&gt;

&lt;p&gt;Amazon allows you to keep your banking information on file, but… no.&lt;/p&gt;

&lt;p&gt;I&#39;m fairly sure this was suggested in jest.&lt;/p&gt;

&lt;h2&gt;Hilarious Twitter account&lt;/h2&gt;

&lt;p&gt;See: &lt;a href=&quot;https://www.twitter.com/NeedADebitCard&quot;&gt;@NeedADebitCard&lt;/a&gt;. (&lt;a href=&quot;https://twitter.com/andrewa2/status/232947814433435649&quot;&gt;via&lt;/a&gt; &lt;a href=&quot;https://www.twitter.com/andrewa2&quot;&gt;@andrewa2&lt;/a&gt;)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>1.5 Years of UMich Magic Bus Data</title>
   <link href="http://chris.dzombak.name/blog/2012/07/umich_magicbus_data.html"/>
   <updated>2012-07-02T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2012/07/umich_magicbus_data</id>
   <content type="html">&lt;p&gt;The University of Michigan runs a service called &lt;a href=&quot;http://mbus.pts.umich.edu/&quot;&gt;Magic Bus&lt;/a&gt; which lets users track the UMich bus system in real time. You can pretty easily find and reverse-engineer the XML file that powers the site, and armed with that data you can build whatever you want. I built, several years ago, a service you could text to find out when your bus would arrive.&lt;/p&gt;

&lt;p&gt;For research and reference (to see what bus routes disappeared at what times and what error states the system exhibited), I set up a script in 2010 to pull down a copy of the Magic Bus XML data every 15 minutes or so. I found this archive while cleaning off an old server recently, and I thought it might be interesting/useful to throw it online and see what people do with it.&lt;/p&gt;

&lt;p&gt;So, &lt;a href=&quot;http://c387937.r37.cf1.rackcdn.com/mbus-public_feed-June2010-Jan2012.zip&quot;&gt;here you go: 1.5 years (June 2010 - January 2012) of UMich bus data&lt;/a&gt;. Not quite &quot;big data&quot;, but maybe &quot;medium data&quot;? Have fun. Let me know what you do: &lt;a href=&quot;https://www.twitter.com/cdzombak&quot;&gt;@cdzombak&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Shooting Theatre, Dance, and Music</title>
   <link href="http://chris.dzombak.name/talks/2012-04-shooting-theatre-dance-music.html"/>
   <updated>2012-04-22T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/talks/shooting-theatre-dance-music</id>
   <content type="html">&lt;p&gt;Intro to photographing plays/musicals/dance/opera/concerts, with particular focus on plays, musicals, and dance. I gave this talk for the Michigan Daily&#39;s photostaff in 2012.&lt;/p&gt;

&lt;p&gt;Alternative title: &quot;Shooting Things That Move Fast in the Dark&quot;.&lt;/p&gt;

&lt;p&gt;The slides, with speakers&#39; notes, are &lt;a href=&quot;/talks/pdf/2012-04-shooting-theatre-dance-music.pdf&quot;&gt;available in PDF&lt;/a&gt;. I&#39;ve also posted &lt;a href=&quot;https://vimeo.com/39599542&quot;&gt;a screen recording of the presentation, with audio&lt;/a&gt;.&lt;/p&gt;

&lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;3a22b1e06e3f01300e351231381d503e&quot; data-ratio=&quot;1.33333333333333&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;

</content>
 </entry>
 
 <entry>
   <title>Fixing 'Corrupted MAC On Input' Error with Git/SSH/VirtualBox 4.1.6</title>
   <link href="http://chris.dzombak.name/blog/2011/12/fixing-corrupted-mac-on-input-error.html"/>
   <updated>2011-12-19T00:00:00-05:00</updated>
   <id>http://chris.dzombak.name/blog/2011/12/fixing-corrupted-mac-on-input-error</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; try configuring your VM to use a bridged network interface instead of NAT.&lt;/p&gt;

&lt;p&gt;I&#39;m working on a software engineering project inside a Windows 7 (64-bit) VirtualBox 4.1.6 VM on my iMac (running OS X Lion). When trying to push to a Github repo (via SSH), I was presented with this puzzling error:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git push origin master
Counting objects: 441, done.
Compressing objects: 100% (189/189), done.
Writing objects: 100% (441/441), 1.60 MiB, done.
Total 441 (delta 245), reused 441 (delta 245)
Received disconnect from 207.97.227.239: 2: Corrupted MAC on input.
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This means there&#39;s some network hardware, somewhere, corrupting the encrypted connection. It could be any router or NIC anywhere between the VM and the Github server (including those machines themselves). For more info on this error, &lt;a href=&quot;http://blogs.oracle.com/janp/entry/ssh_messages_code_bad_packet&quot;&gt;check out this blog post from Oracle&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;My VM was configured to connect to the network through VirtualBox&#39;s NAT engine. In my particular case, it looks like that engine was the problem. (Your mileage may vary; remember, &lt;em&gt;any&lt;/em&gt; hardware between you and your server could be causing this). I configured VirtualBox to use a bridged connection, and suddenly everything works:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git push origin master
Counting objects: 441, done.
Compressing objects: 100% (189/189), done.
Writing objects: 100% (441/441), 1.60 MiB, done.
Total 441 (delta 245), reused 441 (delta 245)
To git@github.com:cdzombak/gsctl
 * [new branch]      master -&amp;gt; master
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Hopefully someone else finds this useful when troubleshooting this error with the same VirtualBox configuration (VirtualBox 4.1.6, network through NAT).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>UMich Google Calendar Updated for Winter 2012</title>
   <link href="http://chris.dzombak.name/blog/2011/12/umich-google-calendar-updated-for-winter-2012.html"/>
   <updated>2011-12-07T00:00:00-05:00</updated>
   <id>http://chris.dzombak.name/blog/2011/12/umich-google-calendar-updated-for-winter-2012</id>
   <content type="html">&lt;p&gt;I have updated my public &lt;a href=&quot;http://chris.dzombak.name/umich-calendar/&quot;&gt;Google Calendar for the University of Michigan&lt;/a&gt; for the winter 2012 semester.&lt;/p&gt;
&lt;p&gt;Find information about the calendar and how to use it &lt;a href=&quot;http://chris.dzombak.name/umich-calendar/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Capturing Lightning</title>
   <link href="http://chris.dzombak.name/talks/2011-10-capturing-lightning.html"/>
   <updated>2011-10-18T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/talks/capturing-lightning</id>
   <content type="html">&lt;p&gt;I built an analog circuit to trigger a DSLR camera when it detected lightning. I was invited to speak about it for an informal gathering of &lt;a href=&quot;http://engin.umich.edu&quot;&gt;Michigan Engineering&lt;/a&gt; students.&lt;/p&gt;

&lt;p&gt;There is no video, but the slides are &lt;a href=&quot;/talks/pdf/2011-10-capturing-lightning.pdf&quot;&gt;available in PDF&lt;/a&gt;.&lt;/p&gt;

&lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;aba8bde040c50130f49312313d32085b&quot; data-ratio=&quot;1.74446337308348&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;

</content>
 </entry>
 
 <entry>
   <title>Biking Safely, Sanely, and Respectfully in Ann Arbor</title>
   <link href="http://chris.dzombak.name/blog/2011/09/biking-in-ann-arbor.html"/>
   <updated>2011-09-12T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2011/09/biking-in-ann-arbor</id>
   <content type="html">&lt;p&gt;This guide is intended primarily for students who may not be avid cyclists but want to ride their bikes around the UM campus. The few blocks surrounding campus are often flooded with these cyclists, many of whom are riding on sidewalks or on the wrong side of the street. I don&#39;t think most of them are intentionally being unlawful or disrespectful – they&#39;ve simply never learned how to ride downtown. Let&#39;s fix that.&lt;/p&gt;

&lt;h2&gt;Where To Ride&lt;/h2&gt;

&lt;p&gt;Ninety percent of the time: ride on the street. Your bike does not belong on the sidewalk along State Street. Riding along a sidewalk, especially a busy one, is stupid, dangerous, and disrespectful.&lt;/p&gt;

&lt;p&gt;On a bike, you are subject to the same rights (and responsibilities) as the driver of a car. Ride on the right side of the road. Many students think they can/should ride in the opposite direction of traffic. This is an excellent way to get yourself killed. Drivers are not expecting a small, hard-to-see vehicle to be coming toward them, in their lane, at 20 mph. Do not be that small, hard-to-see-vehicle.&lt;/p&gt;

&lt;p&gt;On busier, faster, and larger roads, likes Fuller and Plymouth, riding on the sidewalk is generally allowed and encouraged for most cyclists. (Along Fuller, if I recall correctly, the sidewalk is designated as the bike path.) If you are confident that you can safely ride in traffic and more-or-less keep up with the traffic, by all means ride in the road. But if you&#39;re reading this post, you probably aren&#39;t sufficiently experienced to do that.&lt;/p&gt;

&lt;p&gt;See &quot;Coexisting With Pedestrians&quot;, below, for additional info on riding on sidewalks.&lt;/p&gt;

&lt;h2&gt;Riding Safely&lt;/h2&gt;

&lt;p&gt;I often see students biking the wrong way down one-way streets, at night, with no helmet and no lights. These students are suicidal.&lt;/p&gt;

&lt;h3&gt;Ride with the Cars&lt;/h3&gt;

&lt;p&gt;This means riding on the road, in the same direction as traffic. Do not ride down the wrong side of a road or the wrong way down a one-way street. Riding toward oncoming traffic is an excellent way to get yourself killed.&lt;/p&gt;

&lt;h3&gt;Wear a Helmet&lt;/h3&gt;

&lt;p&gt;I don&#39;t care how good you (think you) are; you will eventually crash. When you crash, you really want to keep your brains inside your skull. Helmets cost $20 and accomplish that goal pretty nicely.&lt;/p&gt;

&lt;p&gt;I guarantee that, eventually, you will crash, look up, and notice a brick wall or something similarly unforgiving two feet (or, if you&#39;re unlucky, less) from your head. If you weren&#39;t wearing a helmet, that should scare you into starting. Why not cut out the near-death learning experience and start now?&lt;/p&gt;

&lt;h3&gt;Use Lights&lt;/h3&gt;

&lt;p&gt;Put a blinking white light on front of your bike and a blinking red one on back. These are cheap (or free!), and they let drivers see you at night.&lt;/p&gt;

&lt;p&gt;Bikes without lights are &lt;strong&gt;absolutely invisible&lt;/strong&gt; at night. Those tiny reflectors on your pedals don&#39;t make any difference whatsoever. No drivers can see them. A blinking light is the &lt;strong&gt;only&lt;/strong&gt; way to draw attention to yourself. You really want to do that.&lt;/p&gt;

&lt;h3&gt;Watch for cars turning&lt;/h3&gt;

&lt;p&gt;As you approach an intersection, if you&#39;re in the bike lane or just to the right of the traffic, watch for cars turning right. Drivers do not usually look right before turning right; they check that nothing&#39;s coming from the left, then go. You need to be alert for that and avoid right-turning cars.&lt;/p&gt;

&lt;p&gt;In some cases, it is easier just to leave the bike lane and merge into automobile traffic as you approach an intersection. This is safe – it means you&#39;re exactly in the right place for cars to see you, because you&#39;re right where a car would be. (As always, look over your shoulder for traffic behind you before changing lanes.)&lt;/p&gt;

&lt;p&gt;Watch for cars going the opposite direction and turning left in front of you. You&#39;re smaller than a car, so they might not see you.&lt;/p&gt;

&lt;p&gt;Do not ever trust turn signals.&lt;/p&gt;

&lt;h2&gt;Coexisting With Cars&lt;/h2&gt;

&lt;p&gt;Follow the safety rules outlined above, and follow traffic laws. You are subject to red lights, stop signs, etc. Disobeying traffic laws is an excellent way to get everybody mad at you and, eventually, be hit by a car whose driver assumed you were going to stop for that stop sign.&lt;/p&gt;

&lt;p&gt;Assume that the cars around you can see you and are trying to kill you. This means you need to be alert and constantly watching your surroundings for drivers doing really stupid things. &lt;em&gt;(This bit of wisdom comes from &lt;a href=&quot;http://www.jwz.org/blog/2008/05/the-collected-jwz-bicycle-wisdom/&quot;&gt;here&lt;/a&gt;.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When a car hits a bike, &lt;a href=&quot;http://en.wikipedia.org/wiki/Kinetic_energy&quot;&gt;the car wins&lt;/a&gt;. There are no exceptions. Don&#39;t let one hit you.&lt;/p&gt;

&lt;h2&gt;Coexisting With Pedestrians&lt;/h2&gt;

&lt;p&gt;At crosswalks, pedestrians have the right of way – you&#39;re treated like a car&#39;s driver, remember? You&#39;ll notice, however, that you&#39;re much smaller than a car and can therefore get through busy crosswalks much faster than any car could. (Just don&#39;t hit anyone.)&lt;/p&gt;

&lt;p&gt;If you must ride on a sidewalk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ride slowly:&lt;/strong&gt; ride at the speed a runner would be jogging. People are not expecting a cyclist to blow past them on the sidewalk, and doing that is really unsafe.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Slow down even more:&lt;/strong&gt; when you&#39;re approaching a corner, a doorway, or anywhere that pedestrians could pop out and surprise you, you must slow down to walking speed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Look around:&lt;/strong&gt; constantly be looking around for doorways, interseting sidewalks, and pedestrians. Being alert and aware of your surroundings is more important on the sidewalk than it is on the road.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don&#39;t be a jerk.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;A Quick Note&lt;/h2&gt;

&lt;p&gt;Following all these rules is annoying. Indeed, you can get places faster if you ignore one-way streets, stop signs, traffic lights, and blast down the sidewalk along South U. Unfortunately, if you ride like that, you &lt;em&gt;will&lt;/em&gt; eventually injure some innocent pedestrian or end up in the emergency room.&lt;/p&gt;

&lt;p&gt;Consider this: even following all these rules, you still get where you&#39;re going many, many times faster than if you were walking.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Craigslist Scammers</title>
   <link href="http://chris.dzombak.name/blog/2011/08/craigslist-scammers.html"/>
   <updated>2011-08-20T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2011/08/craigslist-scammers</id>
   <content type="html">&lt;p&gt;The following are names (likely fake) and email addresses of people who&#39;ve tried to scam me and others on Craigslist. If any of these people send you an email, ignore it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;frank smith: frankmith001@gmail.com&lt;/li&gt;
&lt;li&gt;Jason Smith: spankeydon@yahoo.com, capt.abramovich3@gmail.com, capt.rocha3@gmail.com, metropolitant6@gmail.com, bbbcrz68@gmail.com&lt;/li&gt;
&lt;li&gt;Julie Corbin: juliecorbin01@gmail.com&lt;/li&gt;
&lt;li&gt;stacey justins: stajus068@gmail.com&lt;/li&gt;
&lt;li&gt;Jane Lewis: jannylewis01@gmail.com&lt;/li&gt;
&lt;li&gt;Joyce Mae Hillier Wood: sex20joy@gmail.com&lt;/li&gt;
&lt;li&gt;Smith Ray: smithcray2@gmail.com&lt;/li&gt;
&lt;li&gt;joe harick: jojo4holy07@gmail.com, jojo4holy01@gmail.com&lt;/li&gt;
&lt;li&gt;Mark Wilson: libertyismine@o2.pl&lt;/li&gt;
&lt;li&gt;Karen Scott: arebdajgd@googlemail.com, karensc14@gmail.com&lt;/li&gt;
&lt;li&gt;Betty Clerk: bettyclerk@ymail.com&lt;/li&gt;
&lt;li&gt;Janet Diana janet.diana17@hotmail.com&lt;/li&gt;
&lt;li&gt;mark alonso: markalonso10a@gmail.com&lt;/li&gt;
&lt;li&gt;goerge leslie: goergeleslie12@gmail.com&lt;/li&gt;
&lt;li&gt;mark richards: markrichards2011@live.com&lt;/li&gt;
&lt;li&gt;richards mark: richardsmark35@gmail.com&lt;/li&gt;
&lt;li&gt;Patrick Reed: patreed9090@gmail.com&lt;/li&gt;
&lt;li&gt;Patrick Reed: patreed7070@gmail.com&lt;/li&gt;
&lt;li&gt;janet.diana31@hotmail.com&lt;/li&gt;
&lt;li&gt;James: jwestend74s@gmail.com&lt;/li&gt;
&lt;li&gt;Miguel Renfrow: miguelrenfrow55@live.com&lt;/li&gt;
&lt;li&gt;Mary Washington: bronx4life86@gmail.com, bronx4life92@gmail.com&lt;/li&gt;
&lt;li&gt;Sandra Ellawee: sadllawee17@gmail.com, rene.massivehair.howard@gmail.com&lt;/li&gt;
&lt;li&gt;Ganny Mang: ganny.mangs@gmail.com&lt;/li&gt;
&lt;li&gt;Stella Rodriguez: arnoldbruce78@gmail.com, stella.rodriguez00@gmail.com&lt;/li&gt;
&lt;li&gt;Perry Smith: james.ope01@gmail.com, tannerrh9@gmail.com, &lt;a href=&quot;https://www.facebook.com/odukoya.temitopepeter&quot;&gt;Odukoya Temitope Peter on Facebook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;theo jordan: ttheo.jordan@gmail.com, rikhow01@gmail.com&lt;/li&gt;
&lt;li&gt;&quot;1&quot;: pherrysmith02@gmail.com, kristal0cp1@gmail.com&lt;/li&gt;
&lt;li&gt;Sandy powell: loon42@gmail.com, lizwaxxy8@gmail.com&lt;/li&gt;
&lt;li&gt;Phillip Nast: jayceeeer@gmail.com, phillipnast300@gmail.com&lt;/li&gt;
&lt;li&gt;James Dykes: haleywxl@gmail.com, james.ope202@gmail.com&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Remember, anyone asking you to ship something you&#39;re selling on Craigslist is a scammer. Don&#39;t fall for it.&lt;/p&gt;

&lt;p&gt;(The most popular scam right now is to offer to pay you slightly more than your asking price, via Paypal, for you to ship the item (usually to Africa). The scammer is using a stolen credit card number, and weeks or months down the road when the cardholder finds and reports the fraud, you&#39;ll be on the hook to return the money.)&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>UMich Google Calendar Updated for Fall 2011</title>
   <link href="http://chris.dzombak.name/blog/2011/08/umich-google-calendar-updated-for-fall-2011.html"/>
   <updated>2011-08-12T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2011/08/umich-google-calendar-updated-for-fall-2011</id>
   <content type="html">&lt;p&gt;I have updated my public &lt;a href=&quot;http://chris.dzombak.name/umich-calendar/&quot;&gt;Google Calendar for the University of Michigan&lt;/a&gt; for the fall 2011 semester.&lt;/p&gt;
&lt;p&gt;Find information about the calendar and how to use it &lt;a href=&quot;http://chris.dzombak.name/umich-calendar/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>How Rdio Can Kill Spotify (and vice-versa)</title>
   <link href="http://chris.dzombak.name/blog/2011/08/rdio-spotify.html"/>
   <updated>2011-08-03T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2011/08/rdio-spotify</id>
   <content type="html">&lt;p&gt;A couple cool new subscription music services have recently appeared: &lt;a href=&quot;http://rdio.com&quot;&gt;Rdio&lt;/a&gt; and &lt;a href=&quot;http://spotify.com&quot;&gt;Spotify&lt;/a&gt;. There are a ton of similarities between the two – they offer instant access to a world of music, they have capable mobile apps, and they share a nearly-identical pricing structure.&lt;/p&gt;

&lt;p&gt;There are several notable differences between them, though. I&#39;ve been trying for weeks to figure out which one I want to use primarily (in fact, I&#39;m currently paying for subscriptions to both). This is maddening because each has little shortcomings when compared to the other. If I could just combine the best of both, I&#39;d have an absolutely killer subscription music service. But I can&#39;t.&lt;/p&gt;

&lt;p&gt;A few days ago, I was really thinking hard and posted &lt;a href=&quot;https://twitter.com/#!/cdzombak/status/97834108067135488&quot;&gt;a&lt;/a&gt; &lt;a href=&quot;https://twitter.com/#!/cdzombak/status/97838709734514688&quot;&gt;series&lt;/a&gt; &lt;a href=&quot;https://twitter.com/#!/cdzombak/status/97845460621983744&quot;&gt;of&lt;/a&gt; &lt;a href=&quot;https://twitter.com/#!/cdzombak/status/97848215562502145&quot;&gt;Tweets&lt;/a&gt; &lt;a href=&quot;https://twitter.com/#!/cdzombak/status/97877655210307585&quot;&gt;about&lt;/a&gt; &lt;a href=&quot;https://twitter.com/#!/cdzombak/status/97879062994882560&quot;&gt;this&lt;/a&gt;. Here&#39;s a more in-depth comparison between the two. There&#39;s no conclusion about which is better – because neither is. I maintain that if either service did what I outline here, it would kill the other. It would certainly get my exclusive business.&lt;/p&gt;

&lt;h2&gt;How Rdio could kill Spotify&lt;/h2&gt;

&lt;p&gt;Rdio is newer than Spotify; it was launched in mid-2010. It&#39;s a US company (while Spotify is based in Europe and has been there for a number of years, Spotify only launched in the US in July 2011). It has subscription plans for $4.99 or $9.99 a month, and it offers a 7-day trial.&lt;/p&gt;

&lt;p&gt;I started using Rdio in spring 2011 when Spotify wasn&#39;t yet available in the US. I really, really want to like Rdio – it&#39;s a newer, smaller, more accessible company; I&#39;ve had good interactions with them on &lt;a href=&quot;https://twitter.com/#!/rdio&quot;&gt;Twitter&lt;/a&gt; and via more traditional support channels. And I think (or hope) that Rdio&#39;s newness and smallness means they&#39;re more agile, more open to changes in their product, and more able to make those changes quickly. They&#39;ve already incorporated one of my suggestions into their native apps.&lt;/p&gt;

&lt;p&gt;But some rough edges and missing features have found me using Spotify more and more lately, and I&#39;m considering downgrading my Rdio subscription next month. I&#39;m really hoping Rdio listens to at least some of my suggestions.&lt;/p&gt;

&lt;h3&gt;Better Native App&lt;/h3&gt;

&lt;p&gt;Spotify&#39;s native desktop app experience kills Rdio&#39;s. It&#39;s an all-around better user experience.&lt;/p&gt;

&lt;p&gt;Rdio&#39;s is a webapp in a separate browser window with a few specialized buttons. Spotify&#39;s is an actual native application. That means Rdio&#39;s native app feels clunky, slow, and unresponsive &lt;em&gt;in comparison to Spotify&#39;s&lt;/em&gt; – I was pretty happy with Rdio&#39;s native app on OS X and Windows, until I started using Spotify. If Rdio&#39;s going to compete, it needs a better native app experience – one that feels faster than a webapp.&lt;/p&gt;

&lt;p&gt;Spotify does a lot of clever, aggressive caching to ensure that when you hit &quot;play&quot;, the music stream starts instantly. Seeking through an album on Spotify doesn&#39;t mean listening to seconds of silence between each song. On Rdio, in comparison, I have to wait a while until music actually starts playing.&lt;/p&gt;

&lt;p&gt;Finally, Spotify&#39;s native apps integrate the user&#39;s own music seamlessly into the library. This isn&#39;t necessarily a must-have killer feature, but it&#39;s certainly nice to be able to include in my playlists local artists who aren&#39;t on Spotify. And the mobile Spotify app includes MP3s I&#39;ve already put on my phone. This feature just adds to the list of reasons Spotify&#39;s native app experience is better.&lt;/p&gt;

&lt;p&gt;I should note that Rdio has a very nice webapp – in fact, it launched as one. This is cool because I can visit it from any computer, anywhere, and have my music ready to go. Spotify doesn&#39;t have a webapp.&lt;/p&gt;

&lt;h3&gt;Improve Playlist Management&lt;/h3&gt;

&lt;p&gt;Rdio&#39;s playlist management sucks. I&#39;ve barely used it because it&#39;s just painful.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why can&#39;t I create a playlist then add stuff to it?&lt;/li&gt;
&lt;li&gt;Why can&#39;t I drag and drop anything, anywhere? I kind of see why this is missing in the Web UI, but in the native app?&lt;/li&gt;
&lt;li&gt;Why can&#39;t I add a whole album to a playlist? I recently built an 8-hour playlist of albums for a road trip – using Spotify, because on Rdio I would have had to add each track indivudually.&lt;/li&gt;
&lt;li&gt;Why can&#39;t I build a playlist from any conext other than looking at an album&#39;s page?&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Go build a cool playlist on Rdio. Then build the same playlist on Spotify. Spotify wins, hands down.&lt;/p&gt;

&lt;h3&gt;Don&#39;t Duplicate my Social Graph&lt;/h3&gt;

&lt;p&gt;Rdio should improve its integration with my already-extant social graphs on Facebook, Twitter, or Google+. Rdio already has great social features, but there&#39;s little point in duplicating my social graph when it&#39;s already well-documented elsewhere on the Web.&lt;/p&gt;

&lt;p&gt;At least, Rdio&#39;s already-capable friend finder should be more prominent so that more people will set it up with their online accounts, and then every month it should tell you, &quot;Hey! We found 16 of your Facebook friends who also use Rdio!&quot;&lt;/p&gt;

&lt;h3&gt;Remove the Pricing/Trial Barrier&lt;/h3&gt;

&lt;p&gt;This last suggestion doesn&#39;t really affect existing users, but it will be crucial to let Rdio remain competitive with Spotify. Spotify offers a free, ad-supported, feature-limited plan. Rdio offers a 7-day free trial, after which your only options are $5 or $10 a month.&lt;/p&gt;

&lt;p&gt;I believe Rdio should either offer a longer free trial or a free plan (ad-supported, feature-limited, and/or playback-time-limited). A 7-day trial just is not long enough for someone to really get to know your product, utilize its features, and explore how it best fits into his daily routines and workflow. To convince someone that your service is a good fit for his life, you need more than a single week.&lt;/p&gt;

&lt;p&gt;A lot of people are happily using Spotify&#39;s free, ad-supported plan. These people will never even try Rdio. And even more importantly, these people tend to be younger users in the 13-21 year old range. Capturing these users is crucial for your service. Their opinions on how music should work are shaped by illegal file sharing, but they are also young and flexible and open to change. If you get them on the subscription-service bandwagon now, with a free account, they won&#39;t just look at this as an alternative to buying CDs like older demographics will (many of them have never bought a CD in their lives and have only ever swapped MP3s). They will see this as &lt;strong&gt;the&lt;/strong&gt; legal way to get music, and they will be your customers for years to come. Spotify is capturing them; Rdio isn&#39;t.&lt;/p&gt;

&lt;h2&gt;How Spotify could kill Rdio&lt;/h2&gt;

&lt;p&gt;Spotify has been popular in Europe for a couple years and only recently launched in the US. It&#39;s become pretty popular in the US. Its pricing model is basically identical to Rdio&#39;s ($4.99 or $9.99 per month), with the addition of an ad-supported free plan. Spotify is available exclusively as a native app; there is no webapp like Rdio&#39;s.&lt;/p&gt;

&lt;p&gt;I&#39;ve been using Spotify a lot since it launched, and I generally like it. But there are a few things that Rdio does much better.&lt;/p&gt;

&lt;h3&gt;Better Library/Collection System&lt;/h3&gt;

&lt;p&gt;I hate the way I have to collect music in Spotify. The only way to add music to my library is by adding it to a playlist or &quot;starring&quot; it. You can&#39;t just put music in your library like you can in Rdio. I can sort of see why Spotify is designed like this, but it&#39;s painful to use unless you&#39;re used to collecting and organizing music using exclusively playlists. And nobody does that.&lt;/p&gt;

&lt;p&gt;I want to be able to add music to my library without adding it to a playlist. I should be able to find and collect music without thinking about whether to add certain tracks to playlists &lt;em&gt;x&lt;/em&gt;, &lt;em&gt;y&lt;/em&gt;, and/or &lt;em&gt;z&lt;/em&gt;. Then I want to browse through that music.&lt;/p&gt;

&lt;p&gt;(As a side note, it&#39;s not clear exactly what starring a track is supposed to do. I assume I&#39;m supposed to star my favorite tracks, but I don&#39;t actually know.)&lt;/p&gt;

&lt;h3&gt;Add Usable Social Features&lt;/h3&gt;

&lt;p&gt;I &lt;strong&gt;love&lt;/strong&gt; how Rdio lets me see what music is popular overall in my social network and what my friends are listening to. I&#39;ve discovered a lot of music that way. Spotify doesn&#39;t let me do that. If I&#39;m curious, in Spotify, I can see what one user&#39;s top tracks and artists are, and I have to go out of my way to see even that. Rdio is a much, much more social experience – so much so that you can be social without even thinking about it. This is how people discover music. Spotify fails at helping me discover music.&lt;/p&gt;

&lt;p&gt;If Spotify wants to compete with Rdio, it will basically need to copy Rdio&#39;s social features, because Rdio&#39;s social features are perfect.&lt;/p&gt;

&lt;p&gt;(Before arguing that Spotify&#39;s social features are good, you should go find some people on Rdio for a week and use it. You&#39;ll hate Spotify.)&lt;/p&gt;

&lt;h3&gt;Better Music Discovery with Radio Stations&lt;/h3&gt;

&lt;p&gt;Rdio lets me listen to a &quot;radio station&quot; built upon virtually any list of music: music that&#39;s popular in my social network, an artist&#39;s page, etc. It&#39;s amazing. This makes discovering music a pleasure. Spotify has no such thing. Discovering music on Spotify is next to impossible.&lt;/p&gt;

&lt;p&gt;Spotify has to improve its artist radio feature, and add a radio station based on what&#39;s popular in my social network. It should go even further and let me listen to a radio station built upon any list of music (or user&#39;s page) that&#39;s displayed, anywhere. Or at the very least, it should let me create a new playlist filled with recommendations.&lt;/p&gt;

&lt;h3&gt;Improve Music Finding on Mobile App&lt;/h3&gt;

&lt;p&gt;Spotify&#39;s mobile app will not let you listen to an album by selecting an artist/album from an alphabetical list. Instead, you must open a playlist that you already know contains the album, then type in the album&#39;s name to filter the list. WTF, right?&lt;/p&gt;

&lt;p&gt;At some level, this design makes sense. This is how you select music in the Spotify desktop app (and in iTunes, from which Spotify&#39;s interface copies). But on a mobile device, &lt;strong&gt;typing is hard&lt;/strong&gt;, and this design sucks.&lt;/p&gt;

&lt;p&gt;This makes sense when considering Spotify&#39;s overall playlist-centric design. If you collect and organize music using exclusively playlists, this won&#39;t matter. But &lt;em&gt;nobody does that&lt;/em&gt; – everyone sometimes wants to find and listen to a whole album.&lt;/p&gt;

&lt;p&gt;Spotify&#39;s mobile app should have more traditional artist/album lists for finding music in addition to the type-to-filter functionality. Rdio&#39;s mobile app gets this right.&lt;/p&gt;

&lt;h2&gt;With a Cherry on Top&lt;/h2&gt;

&lt;p&gt;There are a few things that neither of these services do, but which could be huge competitive advantages.&lt;/p&gt;

&lt;h3&gt;Free Accounts for College Students&lt;/h3&gt;

&lt;p&gt;This sounds crazy. Hear me out:&lt;/p&gt;

&lt;p&gt;Amazon gives away free one-year Prime memberships to college students. Why? It works really, really well.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;As I said above (in the Rdio section), young peoples&#39; minds are flexible and open to change, especially when it comes to Internet services. Amazon Prime is a new way of looking at buying stuff online – shipping costs are (or at least seem to be) zero, and buying small items online is commonplace.&lt;/li&gt;
&lt;li&gt;College students are new to having disposable income, or at least they will soon graduate and suddenly have more disposable income than they&#39;re used to.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Giving away one-year music subscriptions to college students will work &lt;em&gt;better&lt;/em&gt; than giving away Amazon Prime memberships.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;College kids will quickly get really addicted to having access to a huge music library.&lt;/li&gt;
&lt;li&gt;quoting myself: College students&#39; &quot;opinions on how music should work are shaped by illegal file sharing, but they are also young and flexible and open to change. If you get them on the subscription-service bandwagon now, with a free account, they won&#39;t just look at this as an alternative to buying CDs&lt;em&gt;...&lt;/em&gt;They will see this as &lt;strong&gt;the&lt;/strong&gt; legal way to get music, and they will be your customers for years to come.&quot;&lt;/li&gt;
&lt;li&gt;Subscriptions are cheap. At the end of the user&#39;s free year of subscription the barrier to becoming a paying customer is low – just one or two coffees per month.&lt;/li&gt;
&lt;li&gt;They will tell their friends. You&#39;ll gain thousands of users overnight.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Integrate with Google Music&lt;/h3&gt;

&lt;p&gt;Integrating the music that&#39;s already on my computer into your app is nice, but in the future the music I own won&#39;t be stored on my computer. It certainly won&#39;t be stored in duplicate on my computers, tablet, phone, and car.&lt;/p&gt;

&lt;p&gt;If your native apps (for desktops/laptops and phones) integrate local music the user already owns, they should also integrate cloud-stored music the user already owns.&lt;/p&gt;

&lt;h3&gt;Last.fm Love Button&lt;/h3&gt;

&lt;p&gt;This is a small one, but I always like my music players to have a Last.fm &quot;love this track&quot; button :)&lt;/p&gt;

&lt;h2&gt;Footnote: Pandora&lt;/h2&gt;

&lt;p&gt;Pandora is dead.&lt;/p&gt;

&lt;p&gt;Rdio&#39;s &quot;radio&quot; feature, which lets you discover music based on an artist or on what your social network is listening to, kills Pandora.  Once Rdio has a free, ad-supported plan, there will be no reason for anybody to use Pandora. As a bonus, Rdio lets you listen to a specific track if you want, which Pandora has never been able to do.&lt;/p&gt;

&lt;p&gt;Rdio&#39;s UI is far superior to Pandora&#39;s Y2K-esque Flash-based monstrosity. Pandora&#39;s recent announcement that they&#39;re developing a nice HTML5-based player is too late; they sat for years while literally doing nothing, and they&#39;re going to pay a steep price for that.&lt;/p&gt;

&lt;p&gt;Pandora has no usable social fatures; Rdio has some really, really nice ones.&lt;/p&gt;

&lt;p&gt;And as soon as Spotify gets a clue and adds usable radio features, it will have all the same advantages as Rdio (vs Pandora).&lt;/p&gt;

&lt;h2&gt;Footnote: Last.fm Radio&lt;/h2&gt;

&lt;p&gt;Nobody really uses Last.fm&#39;s radio; it&#39;s been dead for a long time. Pandora has better recommendations and plays a better cross-section of music, and the Last.fm radio UI is clunky.&lt;/p&gt;

&lt;p&gt;I&#39;ve been bitterly disappointed with Last.fm in general; it will be the subject of another post in the near future. There&#39;s so much potential there and the Last.fm team is literally doing nothing with it.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;There&#39;s no winner in the Spotify vs. Rdio battle. At least, not yet. I want to like Rdio, but I&#39;ve found myself using Spotify more and more lately – I&#39;m really hoping Rdio reads this post.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://mortenjust.com/2011/02/20/side-by-side-spotify-and-rdio-for-iphone/&quot;&gt;Here&#39;s a comparison of Rdio&#39;s and Spotify&#39;s iPhone apps&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Finally, no matter what happens, it will be fun to look back at this post in a couple years.&lt;/p&gt;

&lt;p&gt;Comments are welcome.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Removing AT&T Mobile Web Bookmark from Android Phones</title>
   <link href="http://chris.dzombak.name/blog/2011/08/remove-att-mobile-bookmark-android.html"/>
   <updated>2011-08-02T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2011/08/remove-att-mobile-bookmark-android</id>
   <content type="html">&lt;p&gt;AT&amp;amp;T adds a bunch of software and bookmarks to all the phones it sells. Once you&#39;ve rooted your Android phone, it&#39;s pretty simple to remove most of the provider&#39;s crapware.&lt;/p&gt;

&lt;p&gt;AT&amp;amp;T also adds a &quot;Mobile Web&quot; bookmark to the Android phones it sells. I finally figured out how to remove it. Note that you&#39;ll need a rooted phone and the Android development tools (or at least &lt;code&gt;adb&lt;/code&gt;) to follow these instructions.&lt;/p&gt;

&lt;p&gt;Get to your phone&#39;s shell with &lt;code&gt;adb shell&lt;/code&gt;. Then execute these commands:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ su
# sqlite3 /data/data/com.android.browser/databases/browser.db
sqlite&amp;gt; DELETE FROM bookmarks WHERE _id=1;
sqlite&amp;gt; .quit
# exit
$ exit
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;That&#39;s all!&lt;/p&gt;

&lt;p&gt;I&#39;ve tested this on an LG Thrive. If sqlite3 isn&#39;t found, you&#39;ll need to figure out where it is on your phone. Most rooting procedures install it somewhere for you.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Making a Private Gist Public</title>
   <link href="http://chris.dzombak.name/blog/2011/05/making-private-gist-public.html"/>
   <updated>2011-05-11T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2011/05/making-private-gist-public</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;https://gist.github.com&quot;&gt;Gist&lt;/a&gt; is a really nice tool for sharing and storing snippets of code, notes, and any other text you want. It lets you create private or public Gists - basically, sets of text files.&lt;/p&gt;

&lt;p&gt;Sadly, it&#39;s not easy to switch a Gist from private to public (or vice versa). You can do this with a little Git-fu, since each Gist is its own Git repo. Here&#39;s how to do it.&lt;/p&gt;

&lt;p&gt;Copy the Private Clone URL from the Gist&#39;s page and clone the Gist to a temporary directory:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;~ &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git clone git@gist.github.com:PRIVATEGIST.git gist-private-temp
~ &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;git-private-temp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;From the Gist Web interface, create a new public Gist. You will need to add some dummy text to a file in the Gist since you can&#39;t create a totally empty Gist. This file will be deleted in the next step, though.&lt;/p&gt;

&lt;p&gt;Copy the Private Clone URL from this &lt;em&gt;new&lt;/em&gt; repo. Add the public Gist as a remote in your cloned copy of the private Gist, and push to it. (You&#39;ll need to do a forced push since the public Gist has the dummy file in it.)&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;~/gist-private-temp/ &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git remote add public git@gist.github.com:PUBLICGIST.git
~/gist-private-temp/ &lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git push -f public
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Finally, to get the new Gist content to appear on your Gist home page, go to the Gist&#39;s page, edit it, and resave it (without making any changes).&lt;/p&gt;

&lt;p&gt;I was thinking about making a script to do this, but my understanding is that the necessary Gist API methods are only available in the Github API v3, which is not yet stable; and I couldn&#39;t find any Github API libraries that support it yet.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The Twitter Busyness Average</title>
   <link href="http://chris.dzombak.name/blog/2011/04/twitter-busyness-average.html"/>
   <updated>2011-04-06T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2011/04/twitter-busyness-average</id>
   <content type="html">&lt;p&gt;At some point last week, I &lt;a href=&quot;https://twitter.com/#!/cdzombak/status/55128208626032640&quot;&gt;realized&lt;/a&gt; that I could measure roughly how busy I was based on the inverse of the frequency of my posts to &lt;a href=&quot;https://twitter.com/cdzombak&quot;&gt;Twitter&lt;/a&gt;. Based on that, I&#39;ve created the Twitter Busyness Average (similar to the familiar &lt;a href=&quot;http://en.wikipedia.org/wiki/Load_%28computing%29&quot;&gt;UNIX load average&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;This measurement shows how busy somebody was in the last 2 days. The average = (k) / (hourly frequency of Tweets during the last 2 days).&lt;/p&gt;

&lt;p&gt;The constant k is unique to each person; this should be adjusted to match the user&#39;s Twitter usage pattern. A target value for &quot;standard&quot;, not particularly stressful, busyness is around 2. (For me, k ~= 0.75.)&lt;/p&gt;

&lt;p&gt;To avoid division by zero, if you haven&#39;t Tweeted in the last 2 days, calculate the frequency as if you had Tweeted once.&lt;/p&gt;

&lt;p&gt;This should require sufficiently few requests to the Twitter API that calculating it client-side is appropriate. I&#39;ve created &lt;a href=&quot;https://github.com/cdzombak/tba/blob/master/js/jquery.tba.js&quot;&gt;a quick jQuery plugin&lt;/a&gt; for this, and when I have some time, I&#39;ll also whip up a PHP script.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Shooting Concerts with Strobe Lights</title>
   <link href="http://chris.dzombak.name/blog/2011/04/shooting-concerts-with-strobes.html"/>
   <updated>2011-04-06T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2011/04/shooting-concerts-with-strobes</id>
   <content type="html">&lt;p&gt;Many concerts these days - mainly rock/pop shows - rely heavily on strobe lights as part of the experience. Photographing these shows is challenging, even though there&#39;s (at times) plenty of light.&lt;/p&gt;

&lt;p&gt;I ran into this problem at an &lt;a href=&quot;http://dancethink.com/&quot;&gt;Ella Riot&lt;/a&gt; show at Ann Arbor&#39;s &lt;a href=&quot;http://www.blindpigmusic.com&quot;&gt;Blind Pig&lt;/a&gt; a while ago, and I figured out how to fix it. Hopefully you find this useful.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post assumes knowledge of the basics of electronic flash and flash sync. See &lt;a href=&quot;http://www.youtube.com/watch?v=hvZ6VujbhjM&quot;&gt;this great video&lt;/a&gt; for an excellent explanation of these concepts.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;The Problem&lt;/h2&gt;

&lt;p&gt;During a show, I&#39;m typically shooting at ISO 1600-3200, f/2.8, and anywhere from 1/80 to 1/1000 second, depending on the light. I shoot in manual exposure mode; concerts tend to have extreme highlights and shadows which require careful exposure, and the lighting is usually rapidly changing. (Aside: the &lt;a href=&quot;http://www.nikonusa.com/Nikon-Products/Product/Digital-SLR-Cameras/25444/D700.html&quot;&gt;Nikon D700&lt;/a&gt; is &lt;em&gt;amazing&lt;/em&gt; at low-light photography.)&lt;/p&gt;

&lt;p&gt;Strobe lights wreak havoc on that method, especially if they&#39;re the primary lighting at the show. I&#39;ll focus on that situation here (the same principles apply even if the strobes aren&#39;t the primary light source). With that shooting style, most of your photos will be dark because the exposure simply didn&#39;t catch a strobe. If a photo did catch a strobe flash, it&#39;s overexposed, and chances are there&#39;s a dark band at the top or bottom of the photo (as if you tried to use a flash with a shutter speed faster than your camera&#39;s sync speed).&lt;/p&gt;

&lt;p&gt;The key to fixing this: you can think of the strobe light just like an electronic flash you&#39;d attach to your camera - because they&#39;re basically &lt;em&gt;exactly&lt;/em&gt; the same kind of light source. When you mix strobe lights with the concert shooting style I described above, there are two issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You&#39;re not exposing properly for a flash/strobe&lt;/li&gt;
&lt;li&gt;You&#39;re not syncing your camera with the flash/strobe properly&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;The Solution&lt;/h2&gt;

&lt;p&gt;You can fix the first problem by exposing as if you were shooting a flash photo. Flash exposure is determined by exactly two factors: aperture and ISO. (You can think of the flash as being infinitely fast, so the shutter speed has no impact.) Instead of ISO 1600 and f/2.8, you might use ISO 200 and f/11 (strobes are &lt;em&gt;bright&lt;/em&gt;). Strobe lights vary concert-to-concert, so obviously this is just an example. Some trial-and-error will be required.&lt;/p&gt;

&lt;p&gt;The second problem - flash sync - is a little harder to solve, since you&#39;re not triggering the strobes yourself as you would in a studio. &lt;em&gt;(Review &lt;a href=&quot;http://www.youtube.com/watch?v=hvZ6VujbhjM&quot;&gt;the flash sync video I linked above&lt;/a&gt; if you don&#39;t remember exactly why SLRs have maximum sync speeds.)&lt;/em&gt; You have to use a long exposure, for two reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To increase your chance of catching a strobe flash. At 1/500 second, your shutter is open for 2 milliseconds. Each strobe flash lasts about 1 ms. Even if you&#39;re shooting at 8 fps, your chances of catching a strobe at 1/500 s are virtually zero. At 1/50 s, your shutter is open for 20 ms, giving you a much better chance of catching a flash.&lt;/li&gt;
&lt;li&gt;To increase the chance that, when you do catch a strobe, it occurs when neither shutter curtain is traveling in front of the sensor. If you&#39;re shooting at 1/200 s, the shutter curtains are traveling across the sensor for most of the exposure, so if you catch a flash you&#39;ll probably end up with a dark band on the top or bottom of the photo. At 1/50 second, the curtains are only traveling for a small fraction of the exposure, so you&#39;re more likely to get good results.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;That explanation may be difficult to understand, so I put together some pictures to help. Suppose there&#39;s a strobe flashing 5 times per second:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://chris.dzombak.name/img/blog/2011/04/strobe.png&quot; alt=&quot;Strobe flashing 5 times per second&quot;&gt;&lt;/p&gt;

&lt;p&gt;Now suppose you&#39;re using short exposures. Your chance of catching a flash is very small, and even if you do, you&#39;ll probably have a dark band somewhere because there&#39;s almost no time during which the sensor is entirely exposed:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://chris.dzombak.name/img/blog/2011/04/strobe-short.png&quot; alt=&quot;Strobe flashing 5 times per second; short exposures&quot;&gt;&lt;/p&gt;

&lt;p&gt;Finally, suppose you&#39;re using long exposures. You have a better chance of catching a flash, and when you do catch one, the shutter curtains probably aren&#39;t traveling in front of the sensor:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://chris.dzombak.name/img/blog/2011/04/strobe-long.png&quot; alt=&quot;Strobe flashing 5 times per second; long exposures&quot;&gt;&lt;/p&gt;

&lt;p&gt;Keep in mind that your shutter speed is also affected by the ambient light - if there are light sources other than the strobes, you want them to contribute to the exposure. Luckily, with the aperture and ISO settings you&#39;re using for the strobe, you&#39;ll need a long exposure to catch much ambient light. That works nicely in this case, since catching strobes also requires long-ish exposures.&lt;/p&gt;

&lt;p&gt;Note that even with the long-exposure method, you should shoot as many frames/second as your camera lets you, because your chances of catching a flash in any individual photo are still suboptimal.&lt;/p&gt;

&lt;p&gt;I put together a video with every frame I shot during an Ella Riot show (back when they were called My Dear Disco). &lt;a href=&quot;http://vimeo.com/17494380&quot;&gt;Watch it on Vimeo&lt;/a&gt;. You can see that even though I was shooting 8 fps for basically the entire show and using the long-exposure technique, I still got plenty of dark frames and photos with dark bands.&lt;/p&gt;

&lt;h2&gt;That&#39;s all!&lt;/h2&gt;

&lt;p&gt;Good luck with this. I&#39;d love to see any photos you shoot using this technique; let me know about them on Twitter (&lt;a href=&quot;https://www.twitter.com/cdzombak&quot;&gt;@cdzombak&lt;/a&gt;).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Find open CAEN computers using your phone</title>
   <link href="http://chris.dzombak.name/blog/2011/02/find-open-caen-computers-using-your-phone.html"/>
   <updated>2011-02-23T00:00:00-05:00</updated>
   <id>http://chris.dzombak.name/blog/2011/02/find-open-caen-computers-using-your-phone</id>
   <content type="html">&lt;p&gt;Any University of Michigan engineering student is familiar with the process of finding an open CAEN (UM&#39;s engineering computer network) computer in the library or other engineering buildings - you walk around for 5 or 10 minutes until you find one.&lt;/p&gt;

&lt;p&gt;After using that process a few hundred times, I finally got annoyed enough to do something about it. I skipped a Theory of Computation recitation one afternoon to implement an email/SMS interface which one can use to check the utilization of all CAEN labs in a building.&lt;/p&gt;

&lt;p&gt;CAEN &lt;a href=&quot;http://www.engin.umich.edu/htbin/wwwhostinfo&quot;&gt;provides realtime computer status here&lt;/a&gt;. The HTML is kind of ugly and scraping it was messy; my scraper uses a combination of HTML Tidy and PHP&#39;s DOM/XPath functionality. My service pulls an updated status from CAEN every two minutes.&lt;/p&gt;

&lt;p&gt;I&#39;ve posted directions on using the service &lt;a href=&quot;http://magictxt.net/caen&quot;&gt;on this page&lt;/a&gt;. Any issues can be reported to me at &lt;a href=&quot;mailto:chris@chrisdzombak.net&quot;&gt;chris@chrisdzombak.net&lt;/a&gt;. The service should work with most US cell phone providers.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Moving from Wordpress to Jekyll (and a new design)</title>
   <link href="http://chris.dzombak.name/blog/2011/02/moving-from-wordpress-to-jekyll.html"/>
   <updated>2011-02-09T00:00:00-05:00</updated>
   <id>http://chris.dzombak.name/blog/2011/02/moving-from-wordpress-to-jekyll</id>
   <content type="html">&lt;p&gt;Over the last few months, I got really tired of the old design and terrible performance of this site. A redesign was clearly in order. We use Jekyll at Nutshell, and I&#39;ve started to like it, so I figured I&#39;d try using it for this site.&lt;/p&gt;

&lt;p&gt;I had decided a long time ago that the next iteration of this site would focus on my activity across various social networks, since that&#39;s where most of my online activity is. (I rarely blog.) I created a clean, new design with a social-network-focused home page and lightweight content pages. To all the designers reading this: any critique is welcomed!&lt;/p&gt;

&lt;p&gt;The site is now nearly done. I have some content updates to complete, and eventually I might clean up some of the CSS (it&#39;s a mess right now), but I&#39;m content with this site as it is now.&lt;/p&gt;

&lt;p&gt;I figured I would share some useful things in the hope that I help someone else deploy a Jekyll-based site on Dreamhost. I assume basic familiarity with Jekyll and Liquid templating; I just cover some of the trickier points here. I&#39;ll also refer you to &lt;a href=&quot;http://www.delicious.com/cdzombak/jekyll&quot;&gt;my delicious boookmarks about Jekyll&lt;/a&gt; for &lt;strong&gt;a lot&lt;/strong&gt; of useful info.&lt;/p&gt;

&lt;p&gt;I&#39;ll update this post over the next week or so as I remember important stuff (I really should have started writing this two weeks ago when I started redoing the site).&lt;/p&gt;

&lt;h2&gt;Importing from Wordpress&lt;/h2&gt;

&lt;p&gt;To get my posts from Wordpress to Jekyll, I had to export from Wordpress to an XML file. I initially tried importing from MySQL using the importer included with Jekyll, but I couldn&#39;t get the importer to run on my (Windows) machine. (I blame that mainly on my unfamiliarity with Ruby, etc.)&lt;/p&gt;

&lt;p&gt;I then used the Ruby script from &lt;a href=&quot;https://gist.github.com/500506&quot;&gt;this Gist&lt;/a&gt; to convert from the XML into post files (with Textile markup). They required some manual cleanup, but it wasn&#39;t too bad.&lt;/p&gt;

&lt;p&gt;For comments, I simply installed the Disqus Wordpress plugin and let it import all my comments. I knew I&#39;d be keeping the post URLs the same, and this is how Disqus identifies posts on your Jekyll-based site. You will run into horrible issues if you try to change your post URLs. To keep the URLs the same, you&#39;ll need to add a line to your &lt;code&gt;_config.yml&lt;/code&gt; with something that matches your current permalink structure:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;permalink: /blog/:year/:month/:title.html
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Generating a Sitemap&lt;/h2&gt;

&lt;p&gt;Generating a sitemap was easy thanks to &lt;a href=&quot;http://recursive-design.com/projects/jekyll-plugins/&quot;&gt;the generate_sitemap plugin from recursive design&lt;/a&gt;. Remember to edit the plugin to use your own domain!&lt;/p&gt;

&lt;p&gt;I did, however, find that Jekyll wouldn&#39;t run the plugin unless you run Jekyll from the site source directory.&lt;/p&gt;

&lt;h2&gt;Deploying on DreamHost&lt;/h2&gt;

&lt;p&gt;I wanted something like Github Pages, where I could checkout my site&#39;s source from anywhere and the site would be regenerated whenever I push to the source repo. This works really well for me since I do a lot of work from my desktop, netbook, and the computers in UMich&#39;s libraries.&lt;/p&gt;

&lt;p&gt;First, you&#39;ll need to get Jekyll installed on your Dreamhost account. This requires a newer version of gem than is installed by default (as of Feb 8, 2011). This isn&#39;t too difficult; &lt;a href=&quot;http://wiki.dreamhost.com/RubyGems&quot;&gt;these instructions on the Dreamhost wiki&lt;/a&gt; should get you started.&lt;/p&gt;

&lt;p&gt;I needed to add my gems bin directory to my path in order to run Jekyll. After installing everything, the relevant part of my &lt;code&gt;.bashrc&lt;/code&gt; looks like this:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;$HOME/local/bin:$HOME/local/gems/bin:$PATH&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;$HOME/local/lib&amp;quot;&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;GEM_HOME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;$HOME/local/gems&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;GEM_PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;$GEM_HOME:/usr/lib/ruby/gems/1.8&amp;quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;RUBYLIB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;$HOME/local/lib:$RUBYLIB&amp;quot;&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PYTHONPATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;$HOME/local/lib/python:/usr/lib/python2.5&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;(I install everything to &lt;code&gt;~/local&lt;/code&gt; instead of just &lt;code&gt;~&lt;/code&gt; to keep my home directory cleaner; I don&#39;t need to see &lt;code&gt;bin&lt;/code&gt;, &lt;code&gt;lib&lt;/code&gt;, etc. all the time.&lt;/p&gt;

&lt;p&gt;You should make sure that you modify the path in &lt;code&gt;.bashrc&lt;/code&gt; and &lt;code&gt;.bash_profile&lt;/code&gt; so that these changes take effect for both interactive and non-interactive shells. I usually do this by making all my changes in &lt;code&gt;.bashrc&lt;/code&gt; and including something like this in &lt;code&gt;.bash_profile&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; -f ~/.bashrc &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
    . ~/.bashrc
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You can follow &lt;a href=&quot;http://tatey.com/2009/04/29/jekyll-meets-dreamhost-automated-deployment-for-jekyll-with-git/&quot;&gt;these instructions from Tate Johnson&lt;/a&gt; to set up the git hook for deployment. Note that you&#39;ll want to use Python 2.5 for Pygments (not 2.3 as indicated) and the latest version of Pygments.&lt;/p&gt;

&lt;p&gt;I made two important changes to the generation script from Tate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Change to the temporary clone directory before generating. I found that jekyll won&#39;t execute plugins unless you&#39;re running it from the site source directory.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;$RANDOM&lt;/code&gt; to the temporary clone directory name to reduce the chances of a naming conflict.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Here&#39;s the updated generation script:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;GIT_REPO&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/site.src/chris.dzombak.name.git
&lt;span class=&quot;nv&quot;&gt;TMP_GIT_CLONE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/temp/chris.dzombak.name.&lt;span class=&quot;nv&quot;&gt;$RANDOM&lt;/span&gt;/
&lt;span class=&quot;nv&quot;&gt;PUBLIC_WWW&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/web/chris.dzombak.name/

git clone &lt;span class=&quot;nv&quot;&gt;$GIT_REPO&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$TMP_GIT_CLONE&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;pushd&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$TMP_GIT_CLONE&lt;/span&gt;
jekyll &lt;span class=&quot;nv&quot;&gt;$PUBLIC_WWW&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;popd&lt;/span&gt;

rm -Rf &lt;span class=&quot;nv&quot;&gt;$TMP_GIT_CLONE&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;High Performance with Jekyll&lt;/h2&gt;

&lt;p&gt;Thanks to Jekyll, I have achieved my goal of a high-performance site. This graph shows the time (in milliseconds) it took Google to download pages from the site for indexing:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/blog/2011/02/name-timedownloading-ms.png&quot; title=&quot;Time spent downloading a page (in milliseconds)&quot; alt=&quot;Time spent downloading a page (in milliseconds)&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The precipitous drop at the end of January is when I made the switch from Wordpress to Jekyll.&lt;/p&gt;

&lt;h2&gt;Comments Welcomed&lt;/h2&gt;

&lt;p&gt;Any comments/questions are welcomed.&lt;/p&gt;

&lt;p&gt;I know I wanted to write about more than is included in this post, but at the moment I can&#39;t remember what else I wanted to include. I&#39;ll update this post over the next week or so as I think of additional topics to cover.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>UMich Google Calendar Updated for Winter 2011</title>
   <link href="http://chris.dzombak.name/blog/2010/12/umich-google-calendar-updated-for-winter-2011.html"/>
   <updated>2010-12-09T00:00:00-05:00</updated>
   <id>http://chris.dzombak.name/blog/2010/12/umich-google-calendar-updated-for-winter-2011</id>
   <content type="html">&lt;p&gt;I have updated my public &lt;a href=&quot;http://chris.dzombak.name/umich-calendar/&quot;&gt;Google Calendar for the University of Michigan&lt;/a&gt; for the winter 2011 semester.&lt;br /&gt;
Find information about the calendar and how to use it &lt;a href=&quot;http://chris.dzombak.name/umich-calendar/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Michigan Asst. AG Shirvell appeared at protest in May to defame Armstrong</title>
   <link href="http://chris.dzombak.name/blog/2010/09/shirvell-armstrong-protest.html"/>
   <updated>2010-09-29T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2010/09/shirvell-armstrong-protest</id>
   <content type="html">&lt;p&gt;You may have heard (since &lt;a href=&quot;http://www.cnn.com/2010/US/09/28/michigan.justice.blog/index.html?iref=allsearch&quot;&gt;Anderson Cooper recently reported on this story&lt;/a&gt;) that an assistant attorney general for the state of Michigan, Andrew Shirvell, has undertaken a personal campaign to defame and harass the Michigan Student Assembly&amp;#8217;s current president, openly gay student Chris Armstrong.&lt;/p&gt;
&lt;p&gt;If you haven&amp;#8217;t heard about this yet, a simple &lt;a href=&quot;http://news.google.com/news/search?aq=f&amp;pz=1&amp;cf=all&amp;ned=us&amp;hl=en&amp;q=shirvell&quot;&gt;Google News search&lt;/a&gt; &lt;a href=&quot;http://www.annarbor.com/news/cox-rebukes-worker-whose-blog-slams-gay-student-read-more-cox-rebukes-worker-whose-blog-slams-michig/&quot;&gt;turns up&lt;/a&gt; &lt;a href=&quot;http://www.huffingtonpost.com/2010/09/29/andrew-shirvell-assistant_n_743953.html&quot;&gt;plenty&lt;/a&gt; &lt;a href=&quot;http://www.salon.com/news/politics/war_room/2010/09/29/anderson_cooper_anti_gay_shirvell/&quot;&gt;of&lt;/a&gt; &lt;a href=&quot;http://www.advocate.com/News/Daily_News/2010/09/16/State_Official_Bullies_College_Student/&quot;&gt;articles&lt;/a&gt;.  Many of these were written &lt;a href=&quot;http://www.cnn.com/2010/US/09/28/michigan.justice.blog/index.html?iref=allsearch&quot;&gt;after Anderson Cooper talked with Shirvell on Cooper&amp;#8217;s show AC360°&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As I read about this, I recalled something from a news story I photographed several months ago.&lt;/p&gt;
&lt;p&gt;In May 2010, local theatre company Ann Arbor Civic Theatre staged a production of &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Laramie_Project&quot;&gt;The Laramie Project&lt;/a&gt;.  A group from the (in)famous Westboro Baptist Church, well-known for its anti-homosexual agenda, travels the country to picket outside productions of this play, and they planned to picket the A2CT show in May.  Ultimately, they didn&amp;#8217;t show up, but a crowd of about 100 people did show up to counter-protest and spread their message of love.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If you&amp;#8217;d like, you can &lt;strong&gt;&lt;a href=&quot;#downloadphotos&quot;&gt;skip ahead to download these photos&lt;/a&gt;&lt;/strong&gt;. Please share them wherever you&amp;#8217;d like.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Then-newly-elected &lt;span class=&quot;caps&quot;&gt;MSA&lt;/span&gt; President Chris Armstrong was to appear at the counter-protest, and unlike the &lt;span class=&quot;caps&quot;&gt;WBC&lt;/span&gt; he did show up to speak to the crowd.&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;Chris Armstrong&quot; src=&quot;/img/blog/2010/09/CDZ_8930.jpg&quot; alt=&quot;&quot; width=&quot;500&quot; height=&quot;338&quot; /&gt;&lt;/p&gt;
&lt;p&gt;While I was there, I noticed some guy who didn&amp;#8217;t seem to fit with the rest of the crowd.  He seemed to have a personal agenda of hating Chris Armstrong for no particular reason.&lt;/p&gt;
&lt;p&gt;So when I watched the story on &lt;span class=&quot;caps&quot;&gt;CNN&lt;/span&gt;, I thought to myself, &amp;#8220;Hmm&amp;#8230;could that be the same guy?&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;Andrew Shirvell&quot; src=&quot;/img/blog/2010/09/CDZ_8959-2.jpg&quot; alt=&quot;&quot; width=&quot;500&quot; height=&quot;386&quot; /&gt;&lt;/p&gt;
&lt;p&gt;As it turns out, it is the same guy.  Assistant Attorney General for the state of Michigan, Andrew Shirvell, made the trip from Lansing to Ann Arbor on a Saturday afternoon to hold this sign stating that the University of Michigan Student Assembly president, Chris Armstrong, is a racist and a liar.  Yes, Michigan citizens, your tax dollars pay this guy&amp;#8217;s salary (thanks to Attorney General Mike Cox, who as of this writing has spoken against Shirvell&amp;#8217;s actions but refused to fire him).&lt;/p&gt;
&lt;p&gt;Here are a few more photos I had originally published from the counter-protest showing Chris Armstrong and Andrew Shirvell in the same photo:&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;Armstrong @ WBC Counterprotest&quot; src=&quot;/img/blog/2010/09/CDZ_8959.jpg&quot; alt=&quot;&quot; width=&quot;500&quot; height=&quot;344&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;Armstrong @ WBC Counterprotest&quot; src=&quot;/img/blog/2010/09/CDZ_8972.jpg&quot; alt=&quot;&quot; width=&quot;500&quot; height=&quot;335&quot; /&gt;&lt;/p&gt;
&lt;p&gt;And one last photo of Shirvell, standing against the crowd of love-supporters:&lt;/p&gt;
&lt;p&gt;&lt;img title=&quot;Shirvell @ WBC Counterprotest&quot; src=&quot;/img/blog/2010/09/CDZ_8937.jpg&quot; alt=&quot;&quot; width=&quot;500&quot; height=&quot;335&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The folks at PrideSource &lt;a href=&quot;http://www.pridesource.com/article.html?article=41510&quot;&gt;noticed and reported on Shirvell at this protest back in May&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;downloadphotos&quot;&gt;View and Download These (and more) Photos&lt;/h2&gt;
&lt;p&gt;All my published photos from this counterprotest are &lt;a href=&quot;http://www.flickr.com/photos/chrisdzombak/sets/72157624024214410/&quot;&gt;viewable on Flickr&lt;/a&gt; and &lt;a href=&quot;http://www.demotix.com/news/326463/pro-gay-rally-production-laramie-project&quot;&gt;available on Demotix&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Additionally, I&amp;#8217;m making the (high-res) photos published in this post free for anyone to download and use. You can download them here: &lt;a href=&quot;/files/shirvell_wbc_counterprotest_may2010.zip&quot;&gt;shirvell_wbc_counterprotest_may2010.zip&lt;/a&gt;. Post them wherever; pass them along.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>You can't read everything.</title>
   <link href="http://chris.dzombak.name/blog/2010/08/you-cant-read-everything.html"/>
   <updated>2010-08-25T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2010/08/you-cant-read-everything</id>
   <content type="html">&lt;p&gt;Information is flying everywhere these days.  The mainstream adoption of RSS/Atom feeds and (more recently) &lt;a href=&quot;https://www.twitter.com/Twitter&quot;&gt;@Twitter&lt;/a&gt; has led to the production - and consumption - of more content than at any time in the past.&lt;/p&gt;

&lt;p&gt;That&#39;s a bit of a problem.  I like to read, and over the last several years my reading has increasingly taken place online.&lt;/p&gt;

&lt;p&gt;My Google Reader subscriptions, for example, include many (probably over a hundred; I&#39;m not sure) blogs which all constantly produce high-quality content.  Most of them are photography blogs, but I also read many blogs about computers, graphic design, the Web, chemistry, medicine, and politics/news.  I try to keep myself a well-rounded person, and indeed I find all these blogs interesting. (I&#39;ll admit that many of &lt;a href=&quot;http://pipeline.corante.com/&quot;&gt;Derek Lowe&lt;/a&gt;&#39;s musings on organic chemistry in the pharmaceutical world are above my head, but I quite enjoy the blog nonetheless.)&lt;/p&gt;

&lt;p&gt;At least, that was my Google Reader situation until very recently, when I realized there was so much information coming in on a weekly basis I couldn&#39;t possibly read it all.  I also realized that (partly because of this) I hadn&#39;t even bothered reading many of my favorite blogs in months.&lt;/p&gt;

&lt;p&gt;Therein lies the problem.  Clearly, I needed to unsubscribe from many of those feeds, and I also had to give up on reading all the posts which had queued up while I ignored Reader.  Doing this was hard, since as I noted before, each of these blogs interested me and had a pretty high signal-to-noise ratio.  But I had to realize that there was no way I could possibly read all of them.  It was kind of difficult to accept this at first, but really there&#39;s nothing else one could do.&lt;/p&gt;

&lt;p&gt;Since the majority of the blogs I subscribed to were photography-related, I started cutting there and then moved on to the rest of my feeds.  I&#39;m still working on cutting out all but the very best blogs - with high signal-to-noise ratios and consistently informative, high-quality content - but still I&#39;ve made very good progress.&lt;/p&gt;

&lt;p&gt;I&#39;m also doing something similar (though on a lesser scale) with my Twitter account (&lt;a href=&quot;https://www.twitter.com/cdzombak&quot;&gt;@cdzombak&lt;/a&gt;).  That one isn&#39;t as crowded because I don&#39;t subscribe to many &quot;noisy&quot; people/sites on Twitter.  It helps that I also have a private Twitter account I use solely for communicating with close personal friends, so achieving a really good signal-to-noise ratio with my public account doesn&#39;t seem as important.&lt;/p&gt;

&lt;p&gt;And in a similar vein, I&#39;ve been unsubscribing from nearly every mass mailing that finds its way to my email inbox.  I&#39;ve been thinking recently that email ought to be more like the telephone or snail mail (minus telemarketers and junk mail) - reserved for communication between actual people. Weeding out everything else lets me focus better on communicating quickly and effectively with people who actually need my attention.&lt;/p&gt;

&lt;p&gt;(Exception: I still subscribe to daily news emails from the New York Times and NPR.)&lt;/p&gt;

&lt;p&gt;I hope that accepting the idea that I can&#39;t read everything, and drastically narrowing the number of content-producers I follow online, will allow (and motivate) me to spend more time consuming offline media - that is, reading books and magazines. I subscribe to two magazines (National Geographic and American Photo) and I almost find time to read them in detail; one of my goals for the next few months is to put more time into reading National Geographic in particular.  Another of my near-future goals is to read more books; I have a few in mind (Richard Florida&#39;s &lt;em&gt;The Rise of the Creative Class&lt;/em&gt; and Max Gergel&#39;s autobiographies are some of the items on my reading list).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Further, probably better-written, reading: &lt;a href=&quot;http://www.diovo.com/2010/08/books-vs-blogs/&quot;&gt;Books and Blogs&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Datasheet for RadioShack Phototransistor</title>
   <link href="http://chris.dzombak.name/blog/2010/08/datasheet-for-radioshack-phototransistor.html"/>
   <updated>2010-08-19T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2010/08/datasheet-for-radioshack-phototransistor</id>
   <content type="html">&lt;p&gt;As far as I can tell, RadioShack sells exactly &lt;a href=&quot;http://www.radioshack.com/product/index.jsp?productId=2049724&quot;&gt;one infrared phototransistor&lt;/a&gt;. (They&#39;ve really moved away from selling electronic parts in recent years, which in my opinion is too bad.) I recently bought one for a project; I didn&#39;t have the time to order it from one of my usual suppliers (plus, shipping would cost many times the cost of the part). The RadioShack part number is 276-145 or 276-0145, depending on which part of the website you&#39;re looking at.&lt;/p&gt;

&lt;p&gt;Of course, this phototransistor comes with no documentation, and there&#39;s no manufacturer specified so you have essentially no hope of finding a complete datasheet. I did some digging on the Web, though, and I was able to find a little more information about this part.&lt;/p&gt;

&lt;p&gt;On the RadioShack site, I found &lt;a href=&quot;http://support.radioshack.com/support_supplies/doc32/32130.htm&quot;&gt;some specifications for the phototransistor&lt;/a&gt; as well as &lt;a href=&quot;http://support.radioshack.com/support_supplies/doc32/32129.htm&quot;&gt;a short summary of features&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I am also going to reproduce the data here, in case that site is reorganized or the data becomes unavailable for some other reason.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Phototransistor
(276-0145)                   Specifications           Faxback Doc. # 32130

ABSOLUTE MAXIMUM RATINGS (25 Degrees C)

Collector to Emitter Sustaining Voltage (Vce):........................30 V
Emitter to Collector Breakdown Voltage:................................5 V
Collector Current:...................................................25 mA
Operating Temperature Range:..........................-40 to +85 Degrees C
Storage Temperature Range:............................-40 to +85 Degrees C
Lead Soldering Temperature (1/16 inch from case for 5 sec):..240 Degrees C
Relative Humidity at 85 Degrees C:.....................................85%
Power Dissipation at or below 25 Degrees C Free Air Temperature:....100 mW

ELECTRICAL CHARACTERISTICS

Dark Current (Vce = 15 V):..........................................100 nA
Light Current (Vce = 5 V, H = 20 mW/cm):.............................20 nA
Collector to Emitter Saturation Voltage:.............................0.4 V
Rise Time (10 to 90%):............................................5 microS
Fall Time (90 to 10%):............................................5 microS

Specifications are typical; individual units might vary.  Specifications
are subject to change without notice.

(IR-04/22/96)



Phototransistor
(276-0145)                   Features                 Faxback Doc. # 32129

This is a Silicon Nitride Passivated NPN planar phototransistor with
exceptional stable characteristics and high illumination sensitivity;
spectrally and mechanically matched with IR emitter.
(IR-04/22/96)
&lt;/code&gt;&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>New PNC Bank Overdraft Solutions</title>
   <link href="http://chris.dzombak.name/blog/2010/07/new-pnc-bank-overdraft-solutions.html"/>
   <updated>2010-07-22T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2010/07/new-pnc-bank-overdraft-solutions</id>
   <content type="html">&lt;p&gt;With the new consumer financial protections that are going into effect very soon, PNC Bank will no longer offer overdraft coverage by default on checking accounts.  You&#39;ll need to opt-in if you want any sort of overdraft coverage.&lt;/p&gt;

&lt;p&gt;In researching the options, I found that PNC offers two forms of overdraft &quot;solutions&quot; that you can opt into.  (The information on these is found &lt;a href=&quot;https://www.pnc.com/webapp/unsec/Blank.do?siteArea=/pnccorp/PNC/pncbk/Overdraft+Solutions&amp;amp;WT.ac=ODP_0510_P_LN&quot;&gt;here on the PNC site&lt;/a&gt;.)  One of the options seems much more consumer-friendly than the other, and it seems like PNC is making it as difficult as possible to find information about it and opt into it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: you should double-check everything with the PNC site and talk with one of their customer service people before taking any action based on this info. I&#39;m presenting information here based on my own experience with PNC and the questions I&#39;ve asked their customer service people.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;Option 1: Overdraft Coverage&lt;/h2&gt;

&lt;p&gt;The first option PNC offers, and the one they seem to really want you to use, is called &quot;Overdraft Coverage&quot;.  This is the coverage that we&#39;re used to from before the consumer protections: if you overdraft, the bank charges you an exorbitant fee (around $35) and gives you a short-term loan that covers the amount of the overdraft.&lt;/p&gt;

&lt;p&gt;There&#39;s a lot of information on their site (linked above) about this option, and it&#39;s easy to opt into it from the online banking interface.&lt;/p&gt;

&lt;h2&gt;Option 2: Overdraft Protection&lt;/h2&gt;

&lt;p&gt;The second, more consumer-friendly solution is called &quot;Overdraft Protection&quot;.  With this option, when you overdraft your checking account, PNC will deduct the overdraft from your savings account.  The fee for this is $10 per overdraft - less than 1/3 the fee for &quot;overdraft coverage&quot;.  (This is presumably because the bank isn&#39;t technically loaning you money. They just charge you $10 for the benefit of using your own money - how nice! &lt;em&gt;&lt;/sarcasm&gt;&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;There&#39;s not much information on the PNC site about this option.  PNC mentions that it exists and provides a basic summary, but there is &lt;em&gt;no&lt;/em&gt; in-depth information online.  You&#39;re told to contact customer service for information or to opt-in.  You can&#39;t opt into this protection from the online banking interface, either.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;It&#39;s pretty clear to me that PNC would like you to enroll in &quot;overdraft coverage&quot; - they have much more information about this option on their site, and you can get information and opt in using the online banking interface.  It&#39;s obvious why this might be - the bank makes more than 3 times the profit if you overdraft using this coverage rather than &quot;overdraft protection&quot;.&lt;/p&gt;

&lt;p&gt;If you&#39;re looking for some form of overdraft solution, I&#39;d recommend that you ask customer service for information about &quot;overdraft protection&quot; and strongly consider that option - it&#39;s much, much more consumer-friendly.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Building OpenSSL with Symbol Versioning</title>
   <link href="http://chris.dzombak.name/blog/2010/03/building-openssl-with-symbol-versioning.html"/>
   <updated>2010-03-14T00:00:00-05:00</updated>
   <id>http://chris.dzombak.name/blog/2010/03/building-openssl-with-symbol-versioning</id>
   <content type="html">&lt;p&gt;I compiled OpenSSL on my Dreamhost account to support my local installation of Git, PHP, Rails, and Redmine, among other things.&lt;/p&gt;

&lt;p&gt;However, whenever I ran git (or a few other programs which depended on OpenSSL), I got several messages like the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git: /home/chris/local/lib/libcrypto.so.0.9.8: no version information available (required by git)
git: /home/chris/local/lib/libssl.so.0.9.8: no version information available (required by git)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The software worked properly, but the these messages were quite annoying, and it was clear that something wasn&#39;t quite right.  I won&#39;t go into the details of symbol versioning here.&lt;/p&gt;

&lt;p&gt;Some research revealed that some people have had similar issues, but many solutions simply involved copying &quot;working&quot; versions of these libraries over the nonworking ones, which isn&#39;t possible in this situation (and is a hackish solution at best).  The closest to a solution I found was &lt;a href=&quot;http://lists.alioth.debian.org/pipermail/pkg-openssl-devel/2006-December/001021.html&quot;&gt;this December 2006 post&lt;/a&gt; on the Debian mailing list in which one of Debian&#39;s OpenSSL maintainers mentions that you should add a line to Configure and that you need the file openssl.ld.&lt;/p&gt;

&lt;p&gt;I&#39;ve now figured out how to build OpenSSL 0.9.8l on Debian (specifically, in my home directory at Dreamhost) with symbol versioning.&lt;/p&gt;

&lt;p&gt;The patch file mentioned below is very simple and changes a few lines in the Makefile and the Configure script; &lt;a href=&quot;http://chris.dzombak.name/files/openssl/openssl-0.9.8l-symbolVersioning.diff&quot;&gt;click here&lt;/a&gt; to download the file and look at it yourself to see exactly what changes.  This patch file is not specific to Dreamhost&#39;s environment; it should work wherever you want to build OpenSSL.&lt;/p&gt;

&lt;p&gt;This procedure will install OpenSSL in your &lt;code&gt;~/local/lib&lt;/code&gt;.  You should create the directory tree &lt;code&gt;~/local/src&lt;/code&gt; if it doesn&#39;t exist already.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; ~/local/src
wget http://www.openssl.org/source/openssl-0.9.8l.tar.gz
tar xzvf openssl-0.9.81.tar.gz
wget http://chris.dzombak.name/files/openssl/openssl-0.9.8l-symbolVersioning.diff
patch -p0 &amp;lt; openssl-0.9.8l-symbolVersioning.diff
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;openssl-0.9.81
./config shared zlib --prefix&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/local
make
make &lt;span class=&quot;nb&quot;&gt;test&lt;/span&gt;
make install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This solution seems to be working for me, and I&#39;ve documented it here in the hopes that it&#39;ll save someone the time it took me to figure it out.  The patch file should be pretty easily adapted to future versions of OpenSSL as well.&lt;/p&gt;

&lt;h2&gt;Additional Links&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://rt.openssl.org/Ticket/Display.html?id=1222&amp;amp;user=guest&amp;amp;pass=guest&quot;&gt;OpenSSL bug #1222&lt;/a&gt; (adding versioned symbols)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://packages.debian.org/lenny/openssl&quot;&gt;Debian OpenSSL package&lt;/a&gt; (Looking at the patch from here is how I eventually got this working.)&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Perfect ViewVC On Dreamhost</title>
   <link href="http://chris.dzombak.name/blog/2009/07/perfect-viewvc-on-dreamhost.html"/>
   <updated>2009-07-07T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2009/07/perfect-viewvc-on-dreamhost</id>
   <content type="html">&lt;p&gt;I recently set up an installation of ViewVC on my Dreamhost account.  I also found out how to implement a few useful features, and I&#39;m going to share this process here in the hope that you find it useful and in the hope that I can find it when I want to do it again.&lt;/p&gt;

&lt;p&gt;This guide will require that you are comfortable doing basic things in the Linux shell (like creating directories, moving files, and basic text editing).  They assume that you are logged into the shell; that&#39;s required for the installation.&lt;/p&gt;

&lt;h2&gt;Part 1: Install ViewVC&lt;/h2&gt;

&lt;p&gt;I recommend creating three folders; &lt;code&gt;src&lt;/code&gt;, &lt;code&gt;bin&lt;/code&gt;, and &lt;code&gt;opt&lt;/code&gt;; in your home directory.  Keep program sources and installation files in &lt;code&gt;src&lt;/code&gt;, installed programs in &lt;code&gt;opt&lt;/code&gt;, and program binaries in &lt;code&gt;bin&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Download ViewVC to your server (in your &lt;code&gt;~/src&lt;/code&gt; folder):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;wget http://viewvc.tigris.org/files/documents/3330/46029/viewvc-1.1.1.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Extract the archive, change to the new directory, and then run:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;./viewvc-install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For the installation path, enter &lt;code&gt;/home/username/opt/viewvc-1.1.1&lt;/code&gt; or something like that.  Don&#39;t enter anything for &lt;code&gt;DESTDIR&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To make ViewVC Web-accessible, first create the subdomain and parent folder where you want ViewVC to reside.&lt;/p&gt;

&lt;p&gt;Note, though, that if you want &lt;code&gt;example.com/browse&lt;/code&gt; (for example) to be ViewVC, you don&#39;t need to actually create a folder called &lt;code&gt;browse&lt;/code&gt; - that folder is sort of a virtual directory we&#39;ll &quot;create&quot; in a few moments.  Also note that if you want ViewVC to be private, you need to create a (real) directory that will be password-protected (in Part 2).&lt;/p&gt;

&lt;p&gt;Then, copy &lt;code&gt;/home/username/opt/viewvc-1.1.1/bin/cgi/viewvc.cgi&lt;/code&gt; to that Web-accessible directory.&lt;/p&gt;

&lt;h2&gt;Part 2: Configuring ViewVC&lt;/h2&gt;

&lt;p&gt;You can follow &lt;a href=&quot;http://wiki.dreamhost.com/Password-protecting_directories&quot;&gt;Dreamhost&#39;s instructions on password-protecting directories&lt;/a&gt; to password-protect the directory in which you just installed &lt;code&gt;viewvc.cgi&lt;/code&gt;.  Easy as pie.&lt;/p&gt;

&lt;p&gt;Next, edit &lt;code&gt;/home/username/opt/viewvc-1.1.1/viewvc.conf&lt;/code&gt;.  The file is very well-documented; configure and customize as you see fit.&lt;/p&gt;

&lt;h2&gt;Part 3: Pretty URLs&lt;/h2&gt;

&lt;p&gt;There are two parts to pretty-URL setup.  First, go to the folder that contains viewvc.cgi and put this code into &lt;code&gt;.htaccess&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;apache&quot;&gt;&lt;span class=&quot;nb&quot;&gt;RewriteEngine&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;on&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;RewriteRule&lt;/span&gt; ^browse$ viewvc.cgi
&lt;span class=&quot;nb&quot;&gt;RewriteRule&lt;/span&gt; ^browse/(.*)$ viewvc.cgi/$1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Second, you have to tell ViewVC what its new name is.  In the same directory, edit &lt;code&gt;viewvc.cgi&lt;/code&gt;.  Go down, almost to the bottom of the file, and just before the comment &lt;code&gt;go do the work&lt;/code&gt; add:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;perl&quot;&gt;&lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;environ&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;#39;SCRIPT_NAME&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;/browse&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;Part 4: Template Modifications&lt;/h2&gt;

&lt;p&gt;This is entirely personal preference, but I wanted my name in ViewVC&#39;s footer with my email address.  To do this, edit &lt;code&gt;/home/username/opt/viewvc-1.1.1/templates/include/footer.ext&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I also wanted to get rid of the huge ViewVC logo on each page.  To do this, I just edited it out of &lt;code&gt;header.ext&lt;/code&gt; in the same folder.&lt;/p&gt;

&lt;h2&gt;Part 5: Pretty Code Colors&lt;/h2&gt;

&lt;p&gt;ViewVC uses the Pygments module for code coloring.  Of course, Dreamhost doesn&#39;t have this installed, but Python makes it easy to create a virtual environment and install &quot;eggs&quot; into it.&lt;/p&gt;

&lt;p&gt;First, tell bash to look for binaries in your custom &lt;code&gt;bin&lt;/code&gt; directory:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;${HOME}/bin:${PATH}&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And add this line to &lt;code&gt;~/.bash_profile&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;${HOME}/bin:${PATH}&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Change to your &lt;code&gt;~/src&lt;/code&gt; directory and download virtualenv:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;wget http://pypi.python.org/packages/2.4/v/virtualenv/virtualenv-1.3.3-py2.4.egg
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Create a new directory called virtualenv-1.3.3-py2.4 and move &lt;code&gt;virtualenv-1.3.3-py2.4.egg&lt;/code&gt; into it.  Change into the directory.  These commands will then set up virtual environments for Python 2.5 and Python 2.4.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;unzip virtualenv-1.3.3-py2.4.egg
/usr/bin/python2.5 virtualenv.py &lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;
/usr/bin/python2.4 virtualenv.py &lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Python 2.5 at Dreamhost doesn&#39;t have Subversion bindings; 2.4 does.  We&#39;ll set up Pygments for 2.4:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;easy_install-2.4 Pygments
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Finally, change to the Web directory containing &lt;code&gt;viewvc.cgi&lt;/code&gt;.  Edit that file; change the top line to read:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;perl&quot;&gt;&lt;span class=&quot;c1&quot;&gt;#!/home/username/bin/python2.4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And your pretty code colors magically happen.&lt;/p&gt;

&lt;h2&gt;Part 6: Make It Faster&lt;/h2&gt;

&lt;p&gt;You can make Apache serve static content like images and stylesheets; this is faster than letting &lt;code&gt;viewvc.cgi&lt;/code&gt; handle it.  Edit &lt;code&gt;/home/username/opt/viewvc-1.1.1/viewvc.conf&lt;/code&gt; and set the option &lt;code&gt;docroot = /viewvc_static&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In the Dreamhost control panel, go to Domains =&gt; Remap Sub-Dir and create a mapping from &lt;code&gt;(your ViewVC domain/folder)/viewvc_static&lt;/code&gt; to &lt;code&gt;/home/username/opt/viewvc-1.1.1/templates/docroot&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Enjoy.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>University of Michigan Google Calendar</title>
   <link href="http://chris.dzombak.name/blog/2009/06/university-of-michigan-google-calendar.html"/>
   <updated>2009-06-26T00:00:00-04:00</updated>
   <id>http://chris.dzombak.name/blog/2009/06/university-of-michigan-google-calendar</id>
   <content type="html">&lt;p&gt;I have created a public Google Calendar which mirrors the University of Michigan&amp;#8217;s academic calendar.&lt;br /&gt;
The page for the project, including details on using the calendar, is here: &lt;a href=&quot;/umich-calendar&quot;&gt;UM Academic Calendar&lt;/a&gt;.&lt;br /&gt;
This makes schedule management much easier for those of us who use Google Calendar (or any iCal-compatible application) to track our calendars.  Go check it out today, and let me know if it&amp;#8217;ll be useful next year!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Very Simple Dynamic DNS Client</title>
   <link href="http://chris.dzombak.name/blog/2009/01/very-simple-dynamic-dns-client.html"/>
   <updated>2009-01-25T00:00:00-05:00</updated>
   <id>http://chris.dzombak.name/blog/2009/01/very-simple-dynamic-dns-client</id>
   <content type="html">&lt;p&gt;I have recently found a need for a Dynamic DNS client for my desktop.  This, based on &lt;a href=&quot;http://jeremy.zawodny.com/blog/archives/010835.html&quot;&gt;a script from Jeremy Zawodny&lt;/a&gt;, is what I&#39;ve come up with:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;T_USER&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;TWITTER_USER
&lt;span class=&quot;nv&quot;&gt;T_PASS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;TWITTER_PASSWORD
&lt;span class=&quot;nv&quot;&gt;T_URL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;http://twitter.com/statuses/update.xml

&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;LAST_IP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;cat .last_ip&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;IP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;curl -s -o - http://ip.cdzombak.net/index.php&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$LAST_IP&lt;/span&gt; !&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$IP&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Twitter @$T_USER...&amp;quot;&lt;/span&gt;
    curl -s -o /dev/null -u &lt;span class=&quot;nv&quot;&gt;$T_USER&lt;/span&gt;:&lt;span class=&quot;nv&quot;&gt;$T_PASS&lt;/span&gt; -d &lt;span class=&quot;nv&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;$IP&amp;quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$T_URL&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;FreeDNS...&amp;quot;&lt;/span&gt;
    curl -s http://freedns.afraid.org/dynamic/update.php?FREEDNS_UPDATE_KEY
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;$IP&amp;quot;&lt;/span&gt; &amp;gt; .last_ip
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Updated FreeDNS and @$T_USER to $IP&amp;quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This is, of course, a bash script - meaning it is for Linux systems.  It&#39;s supposed to be run via a cron job (mine is set to run every 5 minutes).  The script is very self-explanatory.&lt;/p&gt;

&lt;p&gt;Right now, it updates FreeDNS and a Twitter account with my latest IP.&lt;/p&gt;

&lt;p&gt;One note: if you use this, make sure that &lt;code&gt;~/.last_ip&lt;/code&gt; is not empty, even the first time you run the script.  This will cause the script to fail on line 12 - bash ends up trying to run something like &lt;code&gt;if [ != 67.186.45.67 ]&lt;/code&gt;, which is obviously not correct.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>The New Whitehouse.gov</title>
   <link href="http://chris.dzombak.name/blog/2009/01/the-new-whitehousegov.html"/>
   <updated>2009-01-20T00:00:00-05:00</updated>
   <id>http://chris.dzombak.name/blog/2009/01/the-new-whitehousegov</id>
   <content type="html">&lt;p&gt;Right around noon, the Twitterverse was buzzing with links to the new &lt;a href=&quot;http://whitehouse.gov&quot;&gt;whitehouse.gov&lt;/a&gt;.  Kottke has a few geeky notes about it: &lt;a href=&quot;http://www.kottke.org/09/01/the-countrys-new-robotstxt-file&quot;&gt;The Country&amp;#8217;s New Robots.txt&lt;/a&gt;&lt;br /&gt;
He also &lt;a href=&quot;http://www.kottke.org/09/01/new-white-house-site&quot;&gt;notes &lt;/a&gt;that Wikipedia is &lt;a href=&quot;http://en.wikipedia.org/wiki/President_of_the_United_States&quot;&gt;updated&lt;/a&gt;, that third-party content on whitehouse.gov &lt;a href=&quot;http://www.whitehouse.gov/copyright/&quot;&gt;is CC-licensed&lt;/a&gt;, and that there&amp;#8217;s a &lt;a href=&quot;http://twitter.com/whitehouse_gov&quot;&gt;Twitter account&lt;/a&gt;.&lt;br /&gt;
I have homework to do now.&lt;/p&gt;</content>
 </entry>
 

</feed>