<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2620284925999610084</id><updated>2012-01-31T23:59:07.412-08:00</updated><category term='the residents'/><category term='jokes'/><category term='javascript'/><category term='ai'/><category term='web'/><category term='books'/><category term='perl'/><category term='projects'/><category term='algorithms'/><category term='maryland'/><category term='cocoa'/><category term='objective-c'/><category term='iphone'/><category term='css'/><category term='python'/><category term='video'/><category term='vim'/><category term='physics'/><category term='hofstadter'/><category term='c++'/><category term='greasemonkey'/><category term='probability'/><category term='dtrace'/><category term='hardware'/><category term='facebook'/><category term='kurzweil'/><category term='visualization'/><category term='java'/><category term='php'/><category term='security'/><category term='politics'/><category term='programming'/><category term='graphics'/><category term='music'/><category term='school'/><category term='philosophy'/><category term='larry wall'/><category term='networks'/><category term='creative'/><category term='credulous hackery'/><category term='jquery'/><category term='tests'/><category term='opinion'/><category term='unix'/><category term='hobby'/><category term='history'/><category term='project euler'/><category term='bad blogs'/><category term='coffee'/><category term='open graph'/><category term='debt'/><title type='text'>Alan Fineberg</title><subtitle type='html'>If you blog it they will come?</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>42</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-776675241373962842</id><published>2012-01-31T22:00:00.001-08:00</published><updated>2012-01-31T23:59:07.427-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debt'/><category scheme='http://www.blogger.com/atom/ns#' term='history'/><title type='text'>brief notes from graeber talk</title><content type='html'>30% of the world's mined gold exists underground Manhattan, and you can take tours!&lt;br /&gt;"You can tour the trading rooms, the museum and the Fed's vault, which holds 900 tons of gold."&lt;br /&gt;&lt;br /&gt;In many ways, war gave rise to capitalism and not vice versa.&lt;br /&gt;&lt;br /&gt;Modern coinage and money arose largely out of the enormous challenge of feeding and paying a medieval army.&lt;br /&gt;&lt;br /&gt;Kings would print money and distribute it to their populace, then ask for some of it back. Markets arose out of the need to pay this tax, and it benefitted soldiers who had lots of spending power. So it was governments creating the markets, not regulating them once they'd come to fruition.&lt;br /&gt;&lt;br /&gt;Additionally, it was unwise to do business with armed passerbys with IOUs, so cash was the logical material of exchange, especially since the soldiers had most likely recently looted some gold/silver/whatever on their way to visit your humble market.&lt;br /&gt;&lt;br /&gt;Precise exchange rates were born of violence, for instance to stem a blood feud, exact legal damages were conferred, and substitutions were made when necessary. Otherwise, most trades were conducted with rough equivalency, with shame or death as a possible punishment for underhanded-ness.&lt;br /&gt;&lt;br /&gt;Also the anarchism of Barcelona&lt;br /&gt;&lt;br /&gt;also the war debt that is circulating from the king of england and the british bank notes that act as IOUs&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-776675241373962842?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/776675241373962842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=776675241373962842' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/776675241373962842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/776675241373962842'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2012/01/brief-notes-from-graeber-talk.html' title='brief notes from graeber talk'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-2942334388809873413</id><published>2011-12-16T00:07:00.001-08:00</published><updated>2011-12-16T00:10:11.138-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>The power and insanity of C++ templates</title><content type='html'>exhibit 12941b: analog literals&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;it is possible for this to compile as valid c++ code:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  assert( ( o-------------o&lt;br /&gt;            |L             \&lt;br /&gt;            | L             \&lt;br /&gt;            |  L             \&lt;br /&gt;            |   o-------------o&lt;br /&gt;            |   !             !&lt;br /&gt;            !   !             !&lt;br /&gt;            o   |             !&lt;br /&gt;             L  |             !&lt;br /&gt;              L |             !&lt;br /&gt;               L|             !&lt;br /&gt;                o-------------o ).volume == ( o-------------o&lt;br /&gt;                                              |             !&lt;br /&gt;                                              !             !&lt;br /&gt;                                              !             !&lt;br /&gt;                                              o-------------o ).area * int(I-------------I) );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;here's more: &lt;a href="http://weegen.home.xs4all.nl/eelis/analogliterals.xhtml"&gt;analog literals&lt;/a&gt;&lt;br /&gt;still more: &lt;a href="http://cpptruths.blogspot.com/2005/11/c-templates-are-turing-complete.html"&gt;yep, they're turing complete&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;why, bjorne, why?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-2942334388809873413?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/2942334388809873413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=2942334388809873413' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/2942334388809873413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/2942334388809873413'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2011/12/power-and-insanity-of-c-templates.html' title='The power and insanity of C++ templates'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-3728965764178547600</id><published>2011-11-21T22:30:00.000-08:00</published><updated>2011-11-21T22:32:13.546-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Don't use defaultCStringEncoding</title><content type='html'>It isn't exactly news that this innocuous-sounding parameter is "considered harmful." &lt;br /&gt;But this fact needs a bit more SEO-juice, so here's another voice speaking out against defaultCStringEncoding:&lt;br /&gt;&lt;br /&gt;(from NSString.h):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/* User-dependent encoding who value is derived from user's default language &lt;br /&gt;and potentially other factors. The use of this encoding might sometimes be needed&lt;br /&gt; when interpreting user documents with unknown encodings, in the absence of other hints.  &lt;br /&gt;This encoding &lt;b&gt;should be used rarely, if at all.&lt;/b&gt;  Note that some potential values &lt;br /&gt;here &lt;b&gt;might result in unexpected encoding conversions of even fairly straightforward &lt;br /&gt;NSString content&lt;/b&gt; --- for instance, punctuation characters with a bidirectional encoding.&lt;br /&gt;*/&lt;br /&gt;+ (NSStringEncoding)defaultCStringEncoding; //&lt;b&gt;Should be rarely used&lt;/b&gt;&lt;/pre&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://dealbreaker.com/_old/images/thumbs/drudge-siren.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 70px; height: 71px;" src="http://dealbreaker.com/_old/images/thumbs/drudge-siren.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-3728965764178547600?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/3728965764178547600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=3728965764178547600' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/3728965764178547600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/3728965764178547600'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2011/11/dont-use-defaultcstringencoding.html' title='Don&apos;t use defaultCStringEncoding'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-1864185473850325328</id><published>2011-04-01T01:36:00.000-07:00</published><updated>2011-04-01T01:41:39.937-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='creative'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>write about a song in 400 words or less</title><content type='html'>Coast to Coast is the first track on Elliot Smith's final, posthumous album "From a Basement on a Hill," and it sets the tone for the rest of the album: disjointed, dense, fraying and beautiful.&lt;br /&gt;&lt;br /&gt;&lt;iframe title="YouTube video player" width="480" height="390" src="http://www.youtube.com/embed/bAvqZsRhjwk" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;http://www.youtube.com/watch?v=bAvqZsRhjwk&amp;fmt=6&lt;br /&gt;&lt;br /&gt; Coast to Coast begins with a portion of the song played in reverse. Enter twin lumbering drum tracks and an out of tune slide guitar lead. I've listened over 50 times and just now realized that Elliot's whistling along with the guitar track. His first line: "Last stop for a resolution." &lt;br /&gt;&lt;br /&gt;The lyrics are juvenile, but cognizant and self-examining. Elliot has no new ideas and is therefore useless to those who are expecting more (including you!). Instead of deliberate invention, he takes a "kitchen sink approach," and shovels all of his recording and songwriting reserves into the studio cauldron (did he know beforehand that this would be his final effort?).&lt;br /&gt;&lt;br /&gt;This "kitchen-sink" approach explains why there's at least 3 guitar tracks, a piano track, a distorted bass, 2 drum tracks, 3 separate vocal tracks, several additional "background" tracks featuring a lightning-speed poetry reading (and whistling). It's chaotic, but its beauty is evident in the way "Coast to Coast" grows and reveals itself with every subsequent listen.&lt;br /&gt;&lt;br /&gt;At any moment, the wheels could detach from the wagon and the barely-together instruments which compose the song could careen into the abyss. Yet "Coast to Coast" marches ahead with minor regard for refrain or repetition, as Elliot bemoans that he's "got no new act to amuse you." Its structure is unconventional, and the rapidity of changes suggests a songwriter who is easily bored, or seeking to outdo himself. The droning piano, which would normally have a centering effect, somehow edges us closer to the brink.&lt;br /&gt;&lt;br /&gt;At around the 4 minute mark, the poetry track which was submerged in the mix bubbles up. Is it the outside world leaking in? The spoken words supplant us from a musical trance, especially if we reacted to them by yanking off our headphones.&lt;br /&gt;&lt;br /&gt;As the instruments slide into a black hole, these voices take over, and the track ends. We missed the last stop; nothing is resolved.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-1864185473850325328?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/1864185473850325328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=1864185473850325328' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/1864185473850325328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/1864185473850325328'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2011/04/write-about-song-in-400-words-or-less_01.html' title='write about a song in 400 words or less'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/bAvqZsRhjwk/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-4657149492912094223</id><published>2010-11-23T01:24:00.001-08:00</published><updated>2010-11-23T01:24:23.360-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ai'/><title type='text'>Here's a fun quote about AI</title><content type='html'>&lt;blockquote&gt;JORDAN POLLACK &lt;br /&gt;Computer Science and Complex Systems Professor at Brandeis University&lt;br /&gt;&lt;br /&gt;A persistent belief is that human symbolic intelligence is the highest form of intelligence around. This leads directly to both creationism and good old-fashioned AI which seeks to model cognition using Lisp programs.&lt;br /&gt;&lt;br /&gt;Evolution can design machines of such great complexity that the space shuttle with half a million parts looks like a tinker toy construction. In order to explain the design intelligence of evolution, most Republicans are convinced that a superintelligent creator was involved. Developmental intelligence which manufactures machines with 10 billion moving parts without any factory supervisors is another area where nature outstrips the best human performance. Immunological Intelligence, telling self from non-self, is another AI-complete problem. And human intelligence itself is so vastly complex that we've made up stories of conscious symbol processing, like logic and grammar, to try to explain what goes on in our heads.&lt;br /&gt;&lt;br /&gt;The mind, like the weather, envelopes the brain like a planet and requires dynamical and integrated explanations rather than just-so stories.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;from a fascinating thread over at &lt;a  href="http://www.edge.org/3rd_culture/thaler10/thaler10_index.htm"&gt;http://www.edge.org/3rd_culture/thaler10/thaler10_index.html&lt;/a&gt; by way of &lt;a href="http://www.marginalrevolution.com/marginalrevolution/2010/11/richard-thalers-question.html"&gt;http://www.marginalrevolution.com/marginalrevolution/2010/11/richard-thalers-question.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-4657149492912094223?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/4657149492912094223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=4657149492912094223' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/4657149492912094223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/4657149492912094223'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2010/11/heres-fun-quote-about-ai.html' title='Here&apos;s a fun quote about AI'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-1862741043126397947</id><published>2010-05-20T01:41:00.000-07:00</published><updated>2010-05-20T02:16:15.714-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='greasemonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><title type='text'>flickr fixr</title><content type='html'>&lt;a href="http://flickr.com"&gt;Flickr&lt;/a&gt; is great but I am impatient, and strangely aggrieved that the page reloads on each new photo view. And I don't care about user comments, tags, etc., only looking at pictures.&lt;br /&gt;&lt;br /&gt;I also needed an excuse to finally try out &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/748/"&gt;greasemonkey&lt;/a&gt; and lo and behold, &lt;a href="http://userscripts.org/scripts/review/77155"&gt;flickr fixr&lt;/a&gt; is born. It feels a bit snappier than the current flickr photostream, but otherwise is a pretty modest first script (~6 lines of jQuery).&lt;br /&gt;&lt;br /&gt;That's right, I was able to write jQuery thanks to &lt;a href="http://www.joanpiedra.com/jquery/greasemonkey"&gt;Joan Piedra&lt;/a&gt;, which was a huge timesaver.&lt;br /&gt;&lt;br /&gt;Anyway, try it out, see the difference: &lt;a href="http://www.flickr.com/photos/floridapfe/2211054334/in/photostream/"&gt;http://www.flickr.com/photos/floridapfe/2211054334/in/photostream/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-1862741043126397947?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/1862741043126397947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=1862741043126397947' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/1862741043126397947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/1862741043126397947'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2010/05/flickr-fixr.html' title='flickr fixr'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-8056106313438074933</id><published>2010-05-16T23:43:00.001-07:00</published><updated>2010-05-17T01:42:42.626-07:00</updated><title type='text'>My dev environment</title><content type='html'>I wanted to describe my dev environment and work processes but it wouldn't make sense unless I describe the shape of my work so let me do that first:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Dev Cycle&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Our dev cycle is pretty simple: create and checkout a branch associated with a ticket, make changes to that branch, merge it into a master branch, test it on a staging environment, push it live. It's common for a single developer to have several branches in progress at once.&lt;br /&gt;&lt;br /&gt;I'm primarily concerned with reading/editing the stack of html/javscript/python/SQL. When I have questions, I lean heavily on log files, ipython, the mysql command line client, git, grep, &lt;a href="http://github.com/Yelp/Testify"&gt;testify&lt;/a&gt;, and a slew of other odds-n-ends. I also run virtual machines, mostly for browser compatibility testing.&lt;br /&gt;&lt;br /&gt;In other words there's a set of varied tasks I need to be able to do efficiently and cohesively. Mental "context switching" is expensive so there's value in grouping related work and quarantining anything not immediately relevant. That's the idea, at least, for how I try to manage to complexity of multiple files, branches, documentation, etc. with minimal overhead.&lt;br /&gt;&lt;br /&gt;All of this is done using Terminal on a MacBook Pro:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://sphotos.ak.fbcdn.net/hphotos-ak-sjc1/hs086.snc3/15333_821186398818_10712315_46472525_5015251_n.jpg"&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Dev Environment&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;So the smallest unit is a solitary file, in a lone buffer, in a single tab in vim, .... No file is an island, however, and if I'm doing anything reasonably interesting I'll probably need to view at least 2 files at once.&lt;br /&gt;&lt;br /&gt;The next step up then is a vertical split (:vs in vim). If I'm working on a large screen I may split one more time for a grand total of three files sharing the same space. I've got shortcuts mapped in vim so that I can traverse them using Ctrl+H, Ctrl+J, etc.&lt;br /&gt;&lt;br /&gt;As I open more files, I start opening tabs (:tabnew). They may stay open, or I may close them again immediately to reduce clutter (I mapped ,tn and ,tc to tab new/close so it's faster to do so).&lt;br /&gt;  &lt;br /&gt;I may evict existing screen splits and move them into a new tab if it makes life easier. I mapped Ctrl+I and Ctrl+O for navigating through tabs left and right. Again, judicious closing of tabs can make life easier.&lt;br /&gt;&lt;br /&gt;Ctags is also useful for navigating, as are other plugins such as NERDTree. I use a few vim plugins; they should be a separate post though.&lt;br /&gt;&lt;br /&gt;I am also doing all of this in a screen session. Each branch I'm actively working in will have its own virtual terminal, which I navigate using Ctrl+a. When you return to the original branch you were working in, it'll be just as you left it, and therefore easier to resume.&lt;br /&gt;&lt;br /&gt;I'll also use screen to keep separate terminals open for tailing logs, running ipython/bash/sql commands, etc.&lt;br /&gt;&lt;br /&gt;Also, all this work is taking place on a remote machine. If I need to work locally or connect to a different machine, I open a new tab in terminal (cmd+T) and proceed from there. I switch terminal tabs using cmd+{ or cmd+}.&lt;br /&gt;&lt;br /&gt;The stack tops out with Expose/Spaces. I rarely need to use it extensively but I'll use different spaces for different browsers and running virtual machines. These are navigated using Ctrl+(arrow keys).&lt;br /&gt;&lt;br /&gt;Oh, and I also use terminal in transparent mode (the "Pro" color scheme specifically). You can read documentation or examples without turning your head!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Here's what it looks like in action:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://2.bp.blogspot.com/_K6GCpupL2Io/S_D340DkNMI/AAAAAAAAAW0/MxrfNmKrmdM/s1600/devenv.jpg"&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;2 files side-by-side&lt;/li&gt;&lt;br /&gt;&lt;li&gt;2 other tabs open (the gray tabs on the top)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Another active screen session (green bar)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Another tab open in Terminal&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Transparent terminal for readin' docs&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;the full stack / hotkeys:&lt;br /&gt;&lt;br /&gt;vim file &lt; vim split screen &lt; vim tabs  &lt; screen vterms &lt; terminal tabs &lt; spaces&lt;br /&gt;n/a        &lt; ctrl+h/j/k/l        &lt; ctrl + i/o &lt; ctrl+a n/p/#   &lt; cmd+{/}          &lt; ctrl+(arrow keys)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-8056106313438074933?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/8056106313438074933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=8056106313438074933' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/8056106313438074933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/8056106313438074933'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2010/05/i-wanted-to-describe-my-dev-environment.html' title='My dev environment'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_K6GCpupL2Io/S_D340DkNMI/AAAAAAAAAW0/MxrfNmKrmdM/s72-c/devenv.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-7955807604021350678</id><published>2010-04-22T01:24:00.000-07:00</published><updated>2010-04-22T03:46:26.906-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='open graph'/><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><title type='text'>Automated tests saved my project from chaos and ruination</title><content type='html'>File this one under "Obvious" but I wanted to specifically describe how tests made developing against a brand new platform not just easier, but possible.&lt;br /&gt;&lt;br /&gt;Over the past few weeks I've been developing against the spanking new &lt;a href="http://www.time.com/time/business/article/0,8599,1983721,00.html"&gt;Facebook Open Graph API&lt;/a&gt; that was released yesterday (the &lt;a href="http://officialblog.yelp.com/2010/04/here-at-yelp-were-always-excited-to-announce-feature-and-site-improvements-with-the-help-of-great-partners-today-weve-been.html"&gt;Like button&lt;/a&gt; specifically).&lt;br /&gt;&lt;br /&gt;Facebook was developing the API at the same time we were. Many things were subject to change, including feature designs, the external API, and our own API wrapper. Chaos may have ensued, but for one rock upon which I clung: the tests I wrote early on (but not first!) for the Like button.&lt;br /&gt;&lt;br /&gt;When when things shifted, it was a simple matter of fixing test failures. If the specification changed, I already had a solid test framework that was easy to reuse in order to account for new or different behavior.&lt;br /&gt;&lt;br /&gt;It may seem obvious but those tests were worth their (figurative) weight in gold. We had little time and changes came frequently. We couldn't afford to miss the fact that we left something broken. And manually verifying the feature became infeasible and would take precious hours we didn't have.&lt;br /&gt;&lt;br /&gt;Best of all, when Facebook flipped the switch and the feature went live following the keynote, I could breathe easily knowing that I had tested the hell out of it before millions of Facebook users would get to do the same. Yet another reason in a sea of reasons why tests are valuable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-7955807604021350678?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/7955807604021350678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=7955807604021350678' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/7955807604021350678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/7955807604021350678'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2010/04/automated-tests-saved-my-project-from.html' title='Automated tests saved my project from chaos and ruination'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-2343131253362592962</id><published>2009-12-27T03:35:00.000-08:00</published><updated>2009-12-27T17:17:51.940-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opinion'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='philosophy'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='larry wall'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>What's wrong with PHP?</title><content type='html'>Just as it's easy to completely write off a band you don't care for (because they sold out? or their singer meets with world leaders and has a terrible op-ed album in the New York Times), the same often happens with technologies and languages.&lt;br /&gt;&lt;br /&gt;For example, there was some point in my life where I told myself I would avoid any project heavily involving PHP.&lt;br /&gt;&lt;br /&gt;But why? What's wrong with PHP? Yahoo and Facebook use it...and I haven't used it enough to warrant such strong feelings.&lt;br /&gt;&lt;br /&gt;I wanted to explore this (baseless?) apprehension further, and I thought of this characteristically absurd/profound quote from Perl creator Larry Wall:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;"Perl is worse than Python because people wanted it [to be] worse."&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.catonmat.net/blog/wp-content/uploads/2008/11/larry-wall-quick-and-dirty.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 450px; height: 561px;" src="http://www.catonmat.net/blog/wp-content/uploads/2008/11/larry-wall-quick-and-dirty.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;  Larry Wall&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;The goodness of Perl v. Python is a common religious argument. The above quote squelches the debate once and for all, but begs further questions.&lt;br /&gt;&lt;br /&gt;Who is they? Why did they want Perl to be worse? Do the words I added ([to be]) change what Larry actually meant?&lt;br /&gt;&lt;br /&gt;Consider this Mind Hacks post about &lt;a href="http://www.mindhacks.com/blog/2009/12/trend_setters_may_on.html"&gt;trends and their origins&lt;/a&gt;; the concepts extend to any sort of idea that can grow legs. Trends in technology are the same way, and spread because a distant idea reached some critical mass of connectivity and settled in with your own circle of peers.&lt;br /&gt;&lt;br /&gt;Developers can vote for or against any technology by speaking for or against it, but their most powerful influence is in choosing which technologies to devote their energies toward learning and improving. Enthusiasm for a project leads to expertise contribution, and contribution leads to enthusiasm. &lt;br /&gt;&lt;br /&gt;Conversely, people who have a distaste for a technology will discourage others. They (the technologies) will languish if their community does not grow.&lt;br /&gt;&lt;br /&gt;In other words, labeling a technology good or bad is a self-fulfilling prophecy given enough influence and/or critical mass. Soon companies using the "good" technology will flourish with resumes and job postings for "bad" technologies will receive lesser attention, serving only to reinforce existing stereotypes.&lt;br /&gt;&lt;br /&gt;I'm largely paraphrasing Paul Graham. He wrote a great essay on this phenomenon, which he calls &lt;a href="http://www.paulgraham.com/pypar.html"&gt;"The Python Paradox"&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I believe this is what Larry was getting at. And it explains my own PHP aversion, as my experiences were underwhelming at worst, but the number of developers I've heard lament PHP convinced me to stay away, as if it's the bad part of town.&lt;br /&gt;&lt;br /&gt;Arguing over which language is better or worse is a waste of time; what matters is the consensus of the larger community (&lt;a href="http://www.urbandictionary.com/define.php?term=wikiality"&gt;see&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Cultural_impact_of_The_Colbert_Report#Wikipedia_references"&gt;wikiality&lt;/a&gt;). Even if it's unjustified. But just like a neighborhood can turn around, opinions change, and that's why phrases like &lt;a href="http://www.google.com/search?hl=en&amp;client=firefox-a&amp;rls=org.mozilla:en-US:official&amp;hs=2BD&amp;ei=j083S-jnAobKsQO_05XOBA&amp;sa=X&amp;oi=spellfullpage&amp;resnum=0&amp;ct=result&amp;cd=2&amp;ved=0CAcQvwUoAQ&amp;&amp;q=javascript+renaissance&amp;spell=1"&gt;"JavaScript Renaissance"&lt;/a&gt; are thrown around. And although I can't shake all the PHP prejudice, I wouldn't make a point of avoiding it (PHP that is), either.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-2343131253362592962?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/2343131253362592962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=2343131253362592962' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/2343131253362592962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/2343131253362592962'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/12/whats-wrong-with-php.html' title='What&apos;s wrong with PHP?'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-5181394224326959571</id><published>2009-12-24T16:34:00.000-08:00</published><updated>2009-12-24T17:33:29.681-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='hobby'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>Easy hexagonal tiles with css</title><content type='html'>I just started building an online game with appengine as a learning exercise, and I'm attempting to do so without flash, java, or any other plugin.&lt;br /&gt;&lt;br /&gt;There's nothing to play yet, but I already have something that is generically useful: a hexagonal tile layout purely in html and css. It's pretty clean too, check it out:&lt;br /&gt;&lt;br /&gt;The Django Template:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;{% load mod %}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;       &amp;lt;link type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;/stylesheets/board.css&amp;quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&amp;lt;body&amp;gt;                                                                                      &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;   &amp;lt;div id=&amp;quot;board-container&amp;quot;&amp;gt;                                                                     &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;       {% for i in rows %}                                                                        &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;           &amp;lt;div class=&amp;quot;row {% if i|mod:2 %}offset{% endif %}&amp;quot;&amp;gt;                                    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;           {% for j in rows %}                                                                    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;               &amp;lt;span class=&amp;quot;hex&amp;quot;&amp;gt;                                                                 &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;                   &amp;lt;img src=&amp;quot;/img/hexagon.png&amp;quot; /&amp;gt;                                                 &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;               &amp;lt;/span&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;           {% endfor %}                                                                           &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;           &amp;lt;/div&amp;gt;                                                                                 &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;       {% endfor %}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;   &amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The mod filter came from &lt;a href="http://thebuckpasser.com/index.cfm/2007/10/22/Modulo-In-Django-Templates"&gt;here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;All this does is create a grid of hex images (100x100 transparent pngs, edited from &lt;a href="http://giraffian.com/pictionary-files/h/hexagon.png"&gt;this source image&lt;/a&gt;). Every other row is "offset" so that the hex pieces nest together.&lt;br /&gt;&lt;br /&gt;Here's the css:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#board-container {&lt;br /&gt;    border: solid black 5px;&lt;br /&gt;    width: 875px;&lt;br /&gt;    height: 700px;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.row {&lt;br /&gt;    /* This has to be .hex width * # of cols */&lt;br /&gt;    width: 800px;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.hex {&lt;br /&gt;    /* The width and height depend on the size of the hex image. */&lt;br /&gt;    width: 80px;&lt;br /&gt;    height: 65px;&lt;br /&gt;    border: none;&lt;br /&gt;    float: left;&lt;br /&gt;}           &lt;br /&gt;.offset {       &lt;br /&gt;    position: relative;&lt;br /&gt;    /* half of the hex width. */&lt;br /&gt;    left: 40px;&lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And the final result for a 10x10 grid:&lt;br /&gt;&lt;img src=""http://1.bp.blogspot.com/_K6GCpupL2Io/SzQR768_LQI/AAAAAAAAAVo/RB1RlpGJnJo/s400/hexes.png" alt="hex tiles" /&gt;&lt;br /&gt;&lt;br /&gt;The next step is to implement the game rules, ajax calls, and draw a sidebar with the playable pieces.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_K6GCpupL2Io/SzQTMzBPSlI/AAAAAAAAAVw/C7YOC5UuZSM/s1600-h/hexes.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 321px;" src="http://1.bp.blogspot.com/_K6GCpupL2Io/SzQTMzBPSlI/AAAAAAAAAVw/C7YOC5UuZSM/s400/hexes.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5418977362208311890" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-5181394224326959571?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/5181394224326959571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=5181394224326959571' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/5181394224326959571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/5181394224326959571'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/12/easy-hexagonal-tiles-with-css.html' title='Easy hexagonal tiles with css'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_K6GCpupL2Io/SzQTMzBPSlI/AAAAAAAAAVw/C7YOC5UuZSM/s72-c/hexes.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-8143769611895874105</id><published>2009-12-03T00:44:00.000-08:00</published><updated>2009-12-03T01:04:37.485-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opinion'/><category scheme='http://www.blogger.com/atom/ns#' term='credulous hackery'/><category scheme='http://www.blogger.com/atom/ns#' term='bad blogs'/><title type='text'>TechFlash's credulous hackery</title><content type='html'>&lt;a href="http://www.techflash.com/"&gt;TechFlash&lt;/a&gt; is dedicated to covering the Seattle tech scene, just as &lt;a href="www.techcrunch.com"&gt;TechCrunch&lt;/a&gt; is focused on the Silicon Valley tech scene.&lt;br /&gt;&lt;br /&gt;Unfortunately TechFlash is TechCrunch's insecure younger step-sibling and apparently needs to issue one-sided press releases poorly disguised as blog post reportage in order to maintain its insider access.&lt;br /&gt;&lt;br /&gt;Case in point:&lt;br /&gt;&lt;a href="http://www.techflash.com/seattle/2009/12/microsoft_esclates_war_on_piracy.html?ana=from_rss&amp;utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+TechFlash+%28TechFlash+-+Seattle%27s+Technology+News+Source%29&amp;utm_content=Google+Reader"&gt;Microsoft escalates war on piracy&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;War on piracy? Really? Is that like the war on terror? Or the war on drugs? Or the war on poverty?&lt;br /&gt;&lt;br /&gt;Anyway, the article quotes Microsoft only, and offers no analysis or commentary on why piracy is rampant or whether this strategy is the an intelligent one. It offers no commentary beyond Microsoft's slant on the story.&lt;br /&gt;&lt;br /&gt;The Microsoft source claims that everyday consumers are opposed to piracy "because they're increasingly frustrated and angry about the connection to viruses and malware."&lt;br /&gt;&lt;br /&gt;Actually maybe the problem is that users can have something for free instead of paying for it, and it dents the bottom line of Microsoft's current business approach (which may or may not still be relevant). But you won't see such a nuanced view in this article, or any other quid-pro-quo TechFlash articles to be frank.&lt;br /&gt;&lt;br /&gt;I criticize because I care--I want the Seattle tech scene to flourish, I want TechFlash to be informative and critical instead of parroting the mouthpieces of the region's big players. And I speak for myself only, of course.&lt;br /&gt;&lt;br /&gt;In summary, I just posted a critical blog post, about a blog. What has my life come to?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-8143769611895874105?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/8143769611895874105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=8143769611895874105' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/8143769611895874105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/8143769611895874105'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/12/techflashs-credulous-hackery.html' title='TechFlash&apos;s credulous hackery'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-7229327897566079712</id><published>2009-11-07T18:46:00.001-08:00</published><updated>2009-11-07T19:38:07.858-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ai'/><category scheme='http://www.blogger.com/atom/ns#' term='hofstadter'/><category scheme='http://www.blogger.com/atom/ns#' term='philosophy'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>I just finished reading Goedel Escher Bach</title><content type='html'>GEB alternates dialogues and essays on the author's staggering range of fixations and obsessions in which Hofstadter adds his own remarkable insights and comparisons on topics including music, art, mathematics, genetics and philosophy. GEB's sprawling nature follows tangled paths but eventually loops back to the question of intelligence, souls, free will and self-awareness.&lt;br /&gt;&lt;br /&gt;The unorthodox structure is what sets the book apart, but the braiding of ideas may lead to a takeaway of: "Ok, that's interesting, and you're clever, but what is the chief takeaway here?" &lt;br /&gt;This is a common criticism which led led Hofstadter to author the psuedo-sequel "I Am a Strange Loop" (which I haven't read), in which he distills his arguments more directly and concisely (and personally -- he imagines a low-resolution "simulation" of his wife's mind within his own after her death).&lt;br /&gt;&lt;br /&gt;Anyone who completes GEB comes away with an honorary computer science degree, as there's a heavy focus on computability theory, data and data structures, natural language processing, AI, recursion, memory, hardware, software, all under the guise of philosophy and investigating what gives rise to self-awareness and intelligence.&lt;br /&gt;&lt;br /&gt;On top of this, the GEB reader receives an introduction to the art of Escher, Magritte, Bach, John Cage, as well as some basics of neuroscience, boolean logic, zen philosophy, number theory, music theory and molecular biology. &lt;br /&gt;&lt;br /&gt;Although the number theory and biology chapters dragged, I was fascinated by the discussion of the Goedel incompleteness proof and the implications it had for the mathematics community at the turn of the century. There is also a fascinating section on AI that starts with Turing tests and pattern recognition and ends with the remarkable conclusion that a truly AI may be terrible at all the things that people may struggle with as well, such as rapid computation or chess playing.&lt;br /&gt;&lt;br /&gt;At the least, GEB presents a multitude of ideas and food for thought. At its best, it instills lucid notions of how our minds work and what gives rise to life, language and intelligence.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-7229327897566079712?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/7229327897566079712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=7229327897566079712' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/7229327897566079712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/7229327897566079712'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/11/i-just-finished-reading-goedel-escher.html' title='I just finished reading Goedel Escher Bach'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-4952235522504020881</id><published>2009-09-17T22:28:00.000-07:00</published><updated>2009-09-17T22:35:15.766-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Zip those lists</title><content type='html'>A lot of people know about zip() in python but did you know it operates on a variable argument list?&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;a = [1,2,3]&lt;br /&gt;b = [4,5,6]&lt;br /&gt;c = [7,8,9]&lt;br /&gt;&lt;br /&gt;&gt;&gt;zip(a, b, c)&lt;br /&gt;[(1, 4, 7), (2, 5, 8), (3, 6, 9)]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Don't roll your own list transposition functions....&lt;br /&gt;It's also useful for iterating over a couple of related lists: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;for message, email in (messages, emails):&lt;br /&gt;    hdrs, body = parse_email(email)&lt;br /&gt;    assert message in body&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-4952235522504020881?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/4952235522504020881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=4952235522504020881' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/4952235522504020881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/4952235522504020881'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/09/zip-those-lists.html' title='Zip those lists'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-1907694365619403985</id><published>2009-08-16T23:47:00.000-07:00</published><updated>2009-08-17T01:18:04.602-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='hobby'/><title type='text'>When a band I like comes to town, I'll know</title><content type='html'>&lt;a href="http://www.foopee.com/punk/the-list/"&gt;The List&lt;/a&gt; is a comprehensive listing of all the known shows coming to the Bay Area listed by artist and by venue.&lt;br /&gt;&lt;br /&gt;There are hundreds of concerts and nearly 1500 bands in the list so I threw together a script to scrape it and intersect those bands with the artists in my iTunes library.&lt;br /&gt;&lt;br /&gt;The result is, I now know that these acts are playing in the near future:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;atmosphere&lt;br /&gt;bat for lashes&lt;br /&gt;beirut&lt;br /&gt;blink 182&lt;br /&gt;butthole surfers&lt;br /&gt;calexico&lt;br /&gt;cat power&lt;br /&gt;collective soul&lt;br /&gt;dan deacon&lt;br /&gt;deerhoof&lt;br /&gt;deerhunter&lt;br /&gt;dropkick murphys&lt;br /&gt;elvis costello&lt;br /&gt;fever ray&lt;br /&gt;flipper&lt;br /&gt;ghostface killah&lt;br /&gt;girl talk&lt;br /&gt;green day&lt;br /&gt;grizzly bear&lt;br /&gt;in flames&lt;br /&gt;kenny rogers&lt;br /&gt;lil wayne&lt;br /&gt;m.i.a.&lt;br /&gt;mastodon&lt;br /&gt;meat puppets&lt;br /&gt;mirah&lt;br /&gt;modest mouse&lt;br /&gt;mstrkrft&lt;br /&gt;no age&lt;br /&gt;nofx&lt;br /&gt;pearl jam&lt;br /&gt;placebo&lt;br /&gt;porcupine tree&lt;br /&gt;sunny day real estate&lt;br /&gt;tenacious d&lt;br /&gt;thievery corporation&lt;br /&gt;tv on the radio&lt;br /&gt;weezer&lt;br /&gt;yo la tengo&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The next step is to scrape the concert details as well, use fuzzy matching, run it automatically, and set up alerts. &lt;br /&gt;&lt;br /&gt;But this only took 15 minutes to write in python and it would have taken me way longer to parse manually.&lt;br /&gt;&lt;br /&gt;EDIT:&lt;br /&gt;&lt;br /&gt;Instead of doing a set intersect, I now use &lt;a href="http://docs.python.org/library/difflib.html"&gt;difflib&lt;/a&gt; to find "close matches." It's slower but still runs start to finish in about 10 seconds, which is fine considering especially that the data changes infrequently.&lt;br /&gt;&lt;br /&gt;I also unescape the ampersand in the iTunes xml, and filter out "The " because:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; import difflib&lt;br /&gt;&gt;&gt;&gt; difflib.get_close_matches('foo', ['the foo', 'foods'], n=1)&lt;br /&gt;['foods']&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;...an exact match preceded by 'the' is penalized more than a suffix. So 'pixies' would match 'pixiestickers' instead of 'the pixies' in the case where I only select the top match (since ideally there's a one-to-one mapping). &lt;br /&gt;&lt;br /&gt;Instead of writing my own fuzzy matching algorithm, for now I'll just chop off 'The ' and live with the results. Although some of the matches aren't useful, it does better at finding bands such as &lt;strong&gt;...and you will know us by the trail of dead&lt;/strong&gt; and &lt;strong&gt;The Ting Tings&lt;/strong&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-1907694365619403985?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/1907694365619403985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=1907694365619403985' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/1907694365619403985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/1907694365619403985'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/08/when-band-i-like-comes-to-town-ill-know.html' title='When a band I like comes to town, I&apos;ll know'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-2109244272380666641</id><published>2009-08-11T00:06:00.000-07:00</published><updated>2009-08-11T00:12:12.666-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><category scheme='http://www.blogger.com/atom/ns#' term='visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>timsort visualization</title><content type='html'>This blog post is quite effective at illustrating the &lt;a href="http://www.hatfulofhollow.com/posts/code/timsort/index.html"&gt;timsort&lt;/a&gt; algorithm, found in python (&lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6804124"&gt;and soon java&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-2109244272380666641?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/2109244272380666641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=2109244272380666641' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/2109244272380666641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/2109244272380666641'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/08/timsort-visualization.html' title='timsort visualization'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-5875300065003349884</id><published>2009-08-08T01:46:00.000-07:00</published><updated>2009-08-08T02:57:06.142-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><title type='text'>vim zen moment</title><content type='html'>There comes a certain time in one's life to put aside the variety of editors they might use or sometimes dabble in, and perhaps choose one they like best, or see the most potential with down the road, and work monogamously toward advanced proficiency in this editor, regardless of the bumps in the road or hardships which may provoke longing for other editors along the way.&lt;br /&gt;&lt;br /&gt;I've made this commitment to vim recently and I'm still a novice.&lt;br /&gt;But I just had what may be my first true zen moment with the editor!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The problem:&lt;/strong&gt;&lt;br /&gt;* I needed to fix a single spacing annoyance in a set of over 40 php files.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The solution:&lt;/strong&gt;&lt;br /&gt;* Open all php files rooted in foo, luckily 90% were all at the same leaf level&lt;br /&gt;&lt;code&gt;vim /foo/*/*/*\.php&lt;/code&gt;&lt;br /&gt;* Start recording a macro in register a&lt;br /&gt;&lt;code&gt;qa&lt;/code&gt;&lt;br /&gt;* Make edits&lt;br /&gt;&lt;code&gt;[a fair bit of jj and dd and i etc.]&lt;/code&gt;&lt;br /&gt;* Write changes&lt;br /&gt;&lt;code&gt;:w&lt;/code&gt;&lt;br /&gt;* Open next file&lt;br /&gt;&lt;code&gt;:bn&lt;/code&gt;&lt;br /&gt;* Stop recording&lt;br /&gt;&lt;code&gt;q&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;After pressing &lt;code&gt;@a&lt;/code&gt; a few times to execute the macro, or &lt;code&gt;:bn&lt;/code&gt; if the file could be left alone, I was done.&lt;br /&gt;&lt;br /&gt;I've always wanted to be able to do this sort of thing so easily, but it's elusive or cumbersome with most GUI editors. Many UNIX text munging tools exist too, but it's often easier to take direct route of &lt;emph&gt;showing&lt;/emph&gt; the machine what you want, rather than, say, building a DFA.&lt;br /&gt;&lt;br /&gt;So, I'm liking the taste of vim kool-aid thus far.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-5875300065003349884?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/5875300065003349884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=5875300065003349884' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/5875300065003349884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/5875300065003349884'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/08/vim-zen-moment.html' title='vim zen moment'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-3757134076007990844</id><published>2009-07-19T00:53:00.001-07:00</published><updated>2009-07-19T00:56:09.711-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ai'/><category scheme='http://www.blogger.com/atom/ns#' term='kurzweil'/><category scheme='http://www.blogger.com/atom/ns#' term='hofstadter'/><category scheme='http://www.blogger.com/atom/ns#' term='philosophy'/><title type='text'>Smack talkin' D.R. Hofstadter delivers sick iceburn on R. Kurzweil</title><content type='html'>&lt;a href="http://tal.forum2.org/hofstadter_interview?"&gt;This&lt;/a&gt; is a profound interview with Douglas Hofstadter, author of &lt;span style="font-weight:bold;"&gt;Goedel Escher Bach&lt;/span&gt; and &lt;span style="font-weight:bold;"&gt;I Am a Strange Loop.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Money Quote/Excerpt:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;I think Ray Kurzweil is terrified by his own mortality and deeply longs to avoid death. I understand this obsession of his and am even somehow touched by its ferocious intensity, but I think it badly distorts his vision. As I see it, Kurzweil's desperate hopes seriously cloud his scientific objectivity.&lt;br /&gt;&lt;br /&gt;...Kurzweil sees technology as progressing so deterministically fast (Moore's Law, etc.) that inevitably, within a few decades, hardware will be so fast and nanotechnology so advanced that things unbelievable to us now will be easily doable. A key element in this whole vision is that no one will need to understand the mind or brain in order to copy a particular human's mind with perfect accuracy, because trillions of tiny “nanobots” will swarm through the bloodstream in the human brain and will report back all the “wiring details” of that particular brain, which at that point constitute a very complex table of data that can be fed into a universal computer program that executes neuron-firings, and presto — that individual's mind has been reinstantiated in an electronic medium...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Rather ironically, this vision totally bypasses the need for cognitive science or AI, because all one needs is the detailed wiring plan of a brain and then it's a piece of cake to copy the brain in other media.&lt;/b&gt; And thus, says Kurzweil, we will have achieved immortal souls that live on (and potentially forever) in superfast computational hardware — and Kurzweil sees this happening so soon that he is banking on his own brain being thus “uploaded” into superfast hardware and hence he expects (or at least he loudly proclaims that he expects) to become literally immortal — and not in the way Chopin is quasi-immortal, with just little shards of his soul remaining, but with his whole soul preserved forever.&lt;br /&gt;&lt;br /&gt;Well, the problem is that a soul by itself would go crazy; it has to live in a vastly complex world, and it has to cohabit that world with many other souls, commingling with them just as we do here on earth. To be sure, Kurzweil sees those things as no problem, either — we'll have virtual worlds galore, “up there” in Cyberheaven, and of course there will be souls by the barrelful all running on the same hardware. And Kurzweil sees the new software souls as intermingling in all sorts of unanticipated and unimaginable ways.&lt;br /&gt;&lt;br /&gt;Well, to me, this “glorious” new world would be the end of humanity as we know it.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Hopefully you're hooked by now, so &lt;a href="http://tal.forum2.org/hofstadter_interview?"&gt;read the rest!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-3757134076007990844?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/3757134076007990844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=3757134076007990844' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/3757134076007990844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/3757134076007990844'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/07/smack-talkin-hofstadter-lays-smackdown.html' title='Smack talkin&apos; D.R. Hofstadter delivers sick iceburn on R. Kurzweil'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-2991289117576441872</id><published>2009-07-16T23:54:00.000-07:00</published><updated>2009-07-17T01:15:24.221-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ai'/><category scheme='http://www.blogger.com/atom/ns#' term='probability'/><category scheme='http://www.blogger.com/atom/ns#' term='physics'/><title type='text'>Loblaw's law</title><content type='html'>When you have numbers that are really really really big, you can stop talking about probabilities and start talking about laws.&lt;br /&gt;&lt;br /&gt;Statistics are often unintuitive for people, and the &lt;a href="http://www.codinghorror.com/blog/archives/001278.html"&gt;Monty Hall Problem&lt;/a&gt; is a famous example of that un-intuition in action.&lt;br /&gt;&lt;br /&gt;And of course, as humans, we distrust machines. And statistics are, so far, the best tool machines have for imitating humans in areas such as language and vision. How we hate these machines, with their statistics.&lt;br /&gt;&lt;br /&gt;Yes, so if you are a human reading this, you may feel a certain amount of smugness knowing that language is a built-in feature for you; you can read an article and comprehend with absolute certainty its key points and discuss it in an intelligent and natural way. Even if a computer were able to analyze the same article, it could only offer up soulless suggestions of meaning with varying degrees of certainty, and with little or no actual intelligence.&lt;br /&gt;&lt;br /&gt;But as it turns out, you and I live in a crazy universe not governed by laws so much as statistics. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Mandatory Djikstra quote: &lt;/b&gt;&lt;em&gt;The question of whether a computer can think is no more interesting than the question of whether a submarine can swim.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;On their own, atoms can be in several possible states, each with varying probabilities, where the most probable state has lowest energy. &lt;br /&gt;&lt;br /&gt;With more heat added to a closed system such as a gas, the likelihood that each atom is in a higher energy state increases. Each macro state view of the entire system is equally likely, keeping in mind that particles are coaxed from lower micro energy levels with likelihood directly linked to the work performed on the system. All arrangements of molecules in the container are equally likely and they are all interchangeable with one another.&lt;br /&gt;&lt;br /&gt;Now if you were to take each of these equally likely macro energy states and group them in buckets by total energy level of the system, the distribution would produce a bell curve. So, looking at this bell curve, you could state with some amount of certainty the likely range of energy (temperature actually).&lt;br /&gt;&lt;br /&gt;EXCEPT, that's not how the universe actually works!!  &lt;br /&gt;&lt;br /&gt;The contradiction arises because the number of particles is on the order of 10^23.&lt;br /&gt;&lt;br /&gt;So there's still a bell curve, but it's not really a curve so much as an extremely tall spike with almost zero width and almost no variance. Temperature and entropy and the first and second "laws" of thermodynamics all work because 10^23 is an enormous, enormous number, and the expected value (the center of the curve) is the only value anyone actually ever experiences. &lt;br /&gt;&lt;br /&gt;To illustrate I'll create a law right now, named after a &lt;a href="http://web.archive.org/web/20070612223914/http://appellatedecisions.blogspot.com/"&gt;brilliant attorney&lt;/a&gt;, called Loblaw's law. Loblaw's law states that it is not possible to flip a (normal) coin 10^23 times and produce only heads each time. You may say, well technically that is still possible, so how can it be a law? &lt;br /&gt;&lt;br /&gt;Well, technically it is (&lt;a href="http://en.wikipedia.org/wiki/Maxwell%27s_demon"&gt;sort of&lt;/a&gt;) also possible for the entropy of the universe to decrease for a few minutes. Technically, it is also possible that heat could flow from a cold object to a hot object. Technically, a broken egg could assemble itself from the floor and leap back into my hand...blah blah blah, Loblaw's law is a law because these events are so unlikely that it they will never happen. &lt;br /&gt;&lt;br /&gt;That's the way it goes with ginormous numbers, and that's why we can call them the &lt;strong&gt;laws&lt;/strong&gt; of thermodyamics, although a better name for the field is actually &lt;a href="http://en.wikipedia.org/wiki/Statistical_mechanics"&gt;Statistical Mechanics&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Back to computers, the point is that statistics is a strength, not a weakness of computers which may perform natural language processing, image recognition, or other tasks wherein humans naturally have the upper hand. Feed a somewhat sophisticated AI a few petabytes of salient data and I believe suddenly that Dijkstra quote will ring true.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-2991289117576441872?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/2991289117576441872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=2991289117576441872' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/2991289117576441872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/2991289117576441872'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/07/loblaws-law.html' title='Loblaw&apos;s law'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-2799087327676705418</id><published>2009-07-10T00:11:00.000-07:00</published><updated>2009-07-10T09:44:56.289-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='dtrace'/><title type='text'>Dtrace</title><content type='html'>Up until very recently I had never heard of &lt;a href="http://wikis.sun.com/display/DTrace/Introduction"&gt;Dtrace&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Sun Microsystems, makers of brilliant software but not money, created Dtrace for their Solaris OS. It allows you to create probes and listen on a port where syscalls or other OS events are reported.&lt;br /&gt;&lt;br /&gt;This is awesome and also ported over to Mac OS X. &lt;a href="http://www.brendangregg.com/DTrace/dtrace_oneliners.txt"&gt;This set of one-liners&lt;/a&gt; gives a small example of what's possible. If you're on a mac or FreeBSD or Solaris (!) and looking for a good time try running a few of these.&lt;br /&gt;&lt;br /&gt;And if you have Instruments installed, you can launch apps and monitor their calls, file I/O, memory leakage, etc...&lt;br /&gt;&lt;br /&gt;For my own personal Rube Goldberg machine, I might write a Dtrace script which listens for whenever files of a certain type are opened, and pipe them to a script which automatically backs them up using some version control.&lt;br /&gt;&lt;br /&gt;Or similarly, automating other tasks such as running make whenever code files are written.&lt;br /&gt;&lt;br /&gt;I was excited to learn about and had never heard of Dtrace, so I thought I'd share, enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-2799087327676705418?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/2799087327676705418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=2799087327676705418' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/2799087327676705418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/2799087327676705418'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/07/dtrace.html' title='Dtrace'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-8577225552999311772</id><published>2009-06-04T00:30:00.000-07:00</published><updated>2009-06-08T01:57:37.135-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='school'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>11 week Project Manager Manifesto</title><content type='html'>If you are taking a project course that lasts 11 weeks, and you are leading a group of 5-8 software engineers, congratulations, you are a project manager for &lt;a href="http://www.cs.washington.edu/education/courses/cse403/09sp/"&gt;CSE 403&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Read this post-mortem fresh from the source, the project manager on &lt;a href="http://www.assembla.com/wiki/show/cse403/UserDoc"&gt;Robot Rock&lt;/a&gt;. Robot Rock is an open-source interactive music framework built in 11 weeks by 5 UW undergrads for &lt;a href="http://www.cs.washington.edu/education/courses/cse403/09sp/"&gt;CSE 403&lt;/a&gt;, a software engineering course.&lt;br /&gt;&lt;br /&gt;Suggested reading:&lt;br /&gt;&lt;a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1244451318&amp;sr=8-1"&gt;The Pragmatic Programmer&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/How-Win-Friends-Influence-People/dp/0671027034/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1244451344&amp;sr=8-1"&gt;How To Win Friends and Influence People&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;At the beginning&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;You are the one to set the tone. Work as hard as it takes to get the project off the ground, and demonstrate what your expectations are. The sooner you demonstrate that the project could be a success, the sooner you win the rest of the team's dedicated efforts, and you can't get far without that.&lt;br /&gt;&lt;br /&gt;This is the time for experimentation--it will never get easier to test out different concepts!&lt;br /&gt;&lt;br /&gt;For example, Robot Rock started with separate demos of drum sounds in a loop and a trivial non-functional UI. Mashing these together was a major milestone and morale boost, demonstrating the fact that all of our technologies can live and work together in the same environment in a doubtful time when we still struggled to set it all up.&lt;br /&gt;&lt;br /&gt;It also provided a tangible way to demonstrate that a lot of the hard work was already done, and was useful for settling disputes through experimentation instead of abstract arguments (for example, when designing architecture based on the performance limitations of our libraries).&lt;br /&gt;&lt;br /&gt;Establish regular meeting times during the week, and hold onto this inertia. Meeting often is the best thing your group can do.&lt;br /&gt;&lt;br /&gt;Don't think of yourself as any sort of authority, think of yourself as the sniffable glue keeping your team happy and productive and it's up to you to figure out exactly how to make that happen! If you read Dune you know that as soon as you start giving orders, people stop acting autonomously, so don’t command, lead instead.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Testing&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Write lots of tests in the beginning, but keep them fairly general/flexible since things will be fairly tumultuous at the start and tests will die quick and noisy deaths. &lt;br /&gt;&lt;br /&gt;You need the tests for just two purposes: to verify and enlighten. Tests help maintain confidence and momentum, and allow you to breath easy knowing that you aren't breaking anything as you hurtle with breakneck speed through the rapid development which takes place after the design is settled. Of course, with all this code, you need a way to demonstrate what it all does. Tests are a great way to communicate to your team mates how to actually use the code you're writing.&lt;br /&gt;&lt;br /&gt;Don't let tests prevent refactoring--accept that you will have to some tedious effort fixing them up. If you hate the thought of this, don't go hog wild writing tests for things likely to change, and write professional tests which don't have lots of repeated code. &lt;br /&gt;&lt;br /&gt;Don't leave your tests broken. &lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Planning&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Assembla is a hugely valuable tool. It integrates a ticket system, file hosting, milestone tracking, wiki, and repository with online code browsing.&lt;br /&gt;&lt;br /&gt;Use the wiki to maintain your documentation and deliverables. Use the milestone tracking to organize and shuffle your tickets around in time. &lt;br /&gt;&lt;br /&gt;As soon as you think of something that needs to be done, create a ticket for it.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Design&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;So, you're in 403, which means you're writing code for 11 weeks, then throwing it away, right? There's some truth to this, but if you write ugly code you can't use it to convince people to hire you. Often job postings require an example of code you've written to solve a non-trivial problem, and so this is your chance to shine to all future employers.&lt;br /&gt;&lt;br /&gt;There are a lot of general things which constitute a good design, such as modularity, simplicity, modules which are decoupled, interfaces, etc.&lt;br /&gt;&lt;br /&gt;This isn't really about bad design/good design though. You want a design which will make your high level goals natural to achieve.&lt;br /&gt;&lt;br /&gt;For example, we knew at the start that it was critical for Robot Rock's music to feel very responsive and sensitive to user manipulations. &lt;br /&gt;&lt;br /&gt;We also knew that we wanted the audio generation to have no influence over the rest of the design, in case we wanted to drastically change the way we generate the actual musical tones.&lt;br /&gt;&lt;br /&gt;From these first principles, we could evaluate each potential design (everyone came up with a rough design as a homework assignment) and examine if it allowed for real time responsiveness, as well as decoupled abstract song data from the underlying generation. Once these requirements were met, we went on to examine other more general qualitative characteristics, such as separation of components and simplicity.&lt;br /&gt;&lt;br /&gt;If we started with an arbitrary design goal, such as simplicity, we may have locked ourselves into a design where real time responsiveness was anything but natural, despite whatever other elegance is achieved. In other words, we would have picked A Good Design, but it'd be The Wrong Design.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Features&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Build the simplest thing that meets the requirements. &lt;br /&gt;&lt;br /&gt;If there's a feature you want to add, consult your users first. Make a prototype before investing the time in something which the user may not actually care about. &lt;br /&gt;&lt;br /&gt;No optimization until feature complete, or later even.&lt;br /&gt;&lt;br /&gt;Understand when code is good enough...I'm just parroting The Pragmatic Programmer at this point, so just read that instead.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Grow Experts&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Assign each group member an area of ownership. It doesn't have to be something they are familiar with, just something they care the most about ideally. There should be no part of the project without an associated leader. Everyone can just refer to this person for questions, and it will deepen their understanding of the respective area. It also provides resume bullet points.&lt;br /&gt;&lt;br /&gt;Not everyone will have the same knowledge level of the languages you use. It helps to have at least one person experienced with each language utilized, and they should oversee code reviews with the less experienced members, at least during the initial stages. It goes without saying that the instruction and learning are the crucial goals for these code reviews, never judgment.&lt;br /&gt;Teamwork&lt;br /&gt;&lt;br /&gt;I forget where I read this, but the difference between a team and a group is that a group all leaves a meeting at its deadline regardless of where things stand, whereas a team will stay as long as it takes to get things to a satisfactory point.&lt;br /&gt;&lt;br /&gt;In practice this makes no sense. Sometimes people really do have to be somewhere at a certain time, and sometimes despite your best efforts, you have to force a less than ideal resolution. But the idea is not to leave things open and unresolved at the end of the day. Make some sort of plan for the next session, or if someone can stay and play cleanup, they should and earn the gratitude of the group. Make sure it's not the same person every week.&lt;br /&gt;&lt;br /&gt;Get the entire group involved. If someone's quiet, explicitly invite them to weigh in with their position. Assign homework to the whole group to prepare a decision on items which affect the overall team course. Send around status updates during times when everyone's too busy on different areas to meet.&lt;br /&gt;&lt;br /&gt;Code and documentation is communal. If any problem is found, it's your problem to fix, regardless of its origin. No drawing territorial boundary lines, if it's someone else's code, take it as an opportunity to learn about its inner workings.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;When Conflict Occurs&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Let everyone speak their minds, and focus on the ideas, not the person. &lt;br /&gt;&lt;br /&gt;Try to be the first to find and acknowledge the weaknesses of your own idea, and the strengths of each opposing idea.&lt;br /&gt;&lt;br /&gt;Find common ground. Find and point out things about ideas you disagree that are positive, and be sincere.&lt;br /&gt;&lt;br /&gt;If the discussion drags on, put it to a group vote. Once the group decides, that's it, no revisiting the topic until taking action to make things work as they stand.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Think Big&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Able developers seek worthy, difficult projects to grow their skills. Give yourselves a difficult and interesting project, so you'll attract hungry developers, and everyone will rise to meet the challenge.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-8577225552999311772?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/8577225552999311772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=8577225552999311772' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/8577225552999311772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/8577225552999311772'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/06/11-week-project-manager-manifesto.html' title='11 week Project Manager Manifesto'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-7370815628081247233</id><published>2009-06-02T12:21:00.000-07:00</published><updated>2009-06-02T13:02:50.752-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='coffee'/><title type='text'>How to buy coffee</title><content type='html'>If you're a consumer in the market for 'specialty' coffee (i.e. anything above Folger's grade) then there are a myriad of options, brands, and considerations designed to address concerns ranging from taste, to environmental impact, and social justice.&lt;br /&gt;&lt;br /&gt;Fair Trade is the most well-known label, designed to protect the price points of workers on small coffee farms. Although it guarantees a floor price for the coffee and other protections for the workers, even experts who support Fair Trade, such as Mark Pendergrast, are quick to point out its limitations.&lt;br /&gt;&lt;br /&gt;Fair Trade can only offer protections to a small percentage of the workers in the coffee trade since large and medium farms aren't eligible, and quality is left to its purchasers to determine.&lt;br /&gt;&lt;br /&gt;Certified organic coffee may seem likely to benefit the health of coffee consumers, but its real impact lies elsewhere. In a speaking engagment at the University of Washington, Pendergrast noted that the pesticides affect the cherry hulls, and don't penetrate to the bean itself. Drinking organic coffee, then, does not necessarily offer a health benefit over traditional methods, but it does benefit the workers who harvest the cherries by hand, and are exposed to the poisons.&lt;br /&gt;&lt;br /&gt;Beyond fair trade and organic, there is direct trade, which has no certification, and several bird friendly/shade grown certifications which have numerous variants.&lt;br /&gt;&lt;br /&gt;With careful research, you may learn about the organizations and certifications involved for these different brands and labels, or discover a roaster which participates in Direct Trade practices which are agreeable with your purchasing habits.&lt;br /&gt;&lt;br /&gt;Yet, for whichever stories come printed on the label or distributed in information on certification practices, however, they simply remain stories. The truth about the chain from the farm to the cup often remains unknowable opaque, and is spun by marketing professionals looking to cash in on the conscientious consumer of specialty roasts. &lt;br /&gt;&lt;br /&gt;For a glimpse of what could be the reality of direct trade coffee, for example, look no further than &lt;a href="http://www.yelp.com/biz/zoka-coffee-roaster-and-tea-company-seattle#hrid:SFtIj-SpJ7EwctZqmutKcw"&gt;this review&lt;/a&gt; of Zoka coffee roasters (my emphasis):&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;I worked for Zoka for a little over a year and in that time I saw: sexual harassment (from the head of the company which made the girl move out of town), &lt;b&gt;failure to pay coffee farmers&lt;/b&gt;, threats from various upper management to the employees (I can't tell you how many times I heard the head of the company say "You have to like me, I'm your boss!", firing people for calling in sick and finally their finniest and latest: embezzlement of employees tips to make up for the money that was lost during a break in. &lt;b&gt;The owner does not care about anything but himself and his money &lt;/b&gt;which he has no idea how to manage.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Although I'd like to believe that purchasing specialty coffee with certifications from international organizations is making the world a better place, clearly there is still a certain amount faith involved and the actual results are difficult to know.&lt;br /&gt;&lt;br /&gt;My recommendation to the truly conscientious consumer: buy organic Hawaiian coffee. It may be expensive, but:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; You are buying American products, backed by American labor laws. &lt;/li&gt;&lt;br /&gt;&lt;li&gt; It is delicious coffee. &lt;/li&gt;&lt;br /&gt;&lt;li&gt; The farmers are not exposed to harmful pesticides, and neither is the environment. &lt;/li&gt;&lt;br /&gt;&lt;li&gt; You can visit the farm yourself, or &lt;a href="http://www.flickr.com/search/?q=kona+coffee+farm"&gt;see pictures from tourists&lt;/a&gt;. I highly recommend visiting, though! &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt; &lt;br /&gt;&lt;br /&gt;Otherwise, prepare to invest plenty of time reading literature about different biodiversity certifications or getting to know your local importer better than they may be comfortable with.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-7370815628081247233?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/7370815628081247233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=7370815628081247233' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/7370815628081247233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/7370815628081247233'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/06/how-to-buy-coffee.html' title='How to buy coffee'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-5385992225449463245</id><published>2009-03-24T13:58:00.001-07:00</published><updated>2009-03-24T14:04:53.340-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Project Euler</title><content type='html'>I started working on &lt;a href="http://projecteuler.net"&gt;Project Euler&lt;/a&gt; since I had some down time during spring break.&lt;br /&gt;&lt;br /&gt;I started working yesterday evening and did some more problems this morning. I've solved the first 10 but still am not even halfway to completing 'Level 1.' The good news is that most of the problems don't take longer than 10 minutes to start to finish, especially when using Python. Generators, list slice assignments and list comprehensions made things like iterating Fibonacci sequences and computing prime numbers fast and easy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-5385992225449463245?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/5385992225449463245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=5385992225449463245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/5385992225449463245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/5385992225449463245'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/03/project-euler.html' title='Project Euler'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-2584965133656829343</id><published>2009-03-14T18:35:00.000-07:00</published><updated>2009-03-14T18:54:57.219-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='school'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='networks'/><title type='text'>What I've learned in each course this quarter</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Networks:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now that I've taken Networks, I believe I could describe, at some points in excruciating detail, everything that occurs when a user clicks 'Go' to load a webpage, to the page displaying on their screen.&lt;br /&gt;&lt;br /&gt;This includes all the Operating System considerations, sockets, threading, buffering, packets/segments, error detection schemes, framing, Ethernet, DHCP, ARQ, NAT, STUN, TCP, IP, reliability, ordering, congestion control, routing, forwarding, heterogeneity of network topology, BGP; plus real-time application support, wireless protocol, and RFID thrown in just for fun.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Things we didn't learn about:&lt;/span&gt; DNS. But I can fill in most of the blanks on this one myself. And we didn't spend much time on application layer protocol such as HTTP, though we touched on SMTP some.&lt;br /&gt;&lt;br /&gt;We covered so much in this class that my understanding of network principles didn't congeal until it was time to review for the final.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Algorithms:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We surveyed a suite of useful problems solved using Greedy algorithms, Divide and Conquer techniques, and Dynamic Programming. We also learned how to show that a problem is NP complete or prove that an algorithm is correct and/or efficient.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Key takeaways:&lt;/span&gt; the incredibly useful technique of &lt;A href="http://alanfineberg.blogspot.com/2009/02/dynamic-programming.html"&gt;dynamic programming&lt;/a&gt; to exploit redundant subproblems to solve a larger problem efficiently, and firm understanding of the definition of NP and NP-complete.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Technical Communication:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This class sharpened my understanding for and gave me practice with presenting technical information. Still, the one liner for this class remains:&lt;br /&gt;Tell them what you're about to tell them, tell them, then tell them what you just told them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-2584965133656829343?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/2584965133656829343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=2584965133656829343' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/2584965133656829343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/2584965133656829343'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/03/what-ive-learned-in-each-course-this.html' title='What I&apos;ve learned in each course this quarter'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-7591540588160500650</id><published>2009-03-05T22:20:00.000-08:00</published><updated>2009-03-05T22:37:00.477-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><category scheme='http://www.blogger.com/atom/ns#' term='school'/><category scheme='http://www.blogger.com/atom/ns#' term='networks'/><category scheme='http://www.blogger.com/atom/ns#' term='history'/><title type='text'>Warfare and network algorithms</title><content type='html'>How much does computer science owe to the military?&lt;br /&gt;&lt;br /&gt;Well let's see...&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;The Department of Defense &lt;a href="http://en.wikipedia.org/wiki/Internet_Protocol"&gt;basically invented the internet&lt;/a&gt;, and with it "our entire field" to paraphrase the UW CSE department chair during one of the lectures he gave...on operating systems.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The Ford-Fulkerson network flow algorithm used to route traffic through nodes was invented in 1956. Not for sending oil along pipelines or routing civilian traffic--to determine if the Russian military could successfully move enough troops into neighboring countries using the roads currently in place to successfully invade them. The Cold War is responsible for so much useful science!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The limitations of reliable communication with TCP were known long before, based on the notion of two separate armies coordinating an attack on a territory from two fronts. If only one attacks alone, devastating losses are incurred. If both strike simultaneously, the territory is easily conquered. The only problem? Trying to agree on a time to strike, with an unreliable messenger running back and forth "routing" messages between the two on horseback or foot. What protocol would you use?&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;It's nice to think that most of the early computer science leaps and bounds were born out of the circle surrounding the hippie 60's XEROX PARC culture, but the truth is far more...crew cut.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-7591540588160500650?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/7591540588160500650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=7591540588160500650' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/7591540588160500650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/7591540588160500650'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/03/warfare-and-network-algorithms.html' title='Warfare and network algorithms'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-2051742038165501909</id><published>2009-03-03T23:13:00.000-08:00</published><updated>2009-03-03T23:18:44.695-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='jokes'/><title type='text'>Write-Only Memory</title><content type='html'>It is real.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Write_Only_Memory"&gt;Here it is, in all its Wikipedia glory&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Out of frustration with the long and seemingly useless chain of approvals required of component specifications, during which no actual checking seemed to occur, an engineer at Signetics once created a specification for a write-only memory and included it with a bunch of other specifications to be approved. This inclusion came to the attention of Signetics management only when regular customers started calling and asking for pricing information. Signetics published a corrected edition of the data book and requested the return of the 'erroneous' ones.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;And here is the April Fool's prank pulled by Signetics:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_K6GCpupL2Io/Sa4qjz8TxPI/AAAAAAAAASU/yp0fpsjPQ0c/s1600-h/wom13sx.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:left;cursor:pointer; cursor:hand;width: 273px; height: 400px;" src="http://3.bp.blogspot.com/_K6GCpupL2Io/Sa4qjz8TxPI/AAAAAAAAASU/yp0fpsjPQ0c/s400/wom13sx.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5309227805443343602" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_K6GCpupL2Io/Sa4qkJABDhI/AAAAAAAAASc/xQBJw2tgzeQ/s1600-h/wom23ul.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:left;cursor:pointer; cursor:hand;width: 271px; height: 400px;" src="http://2.bp.blogspot.com/_K6GCpupL2Io/Sa4qkJABDhI/AAAAAAAAASc/xQBJw2tgzeQ/s400/wom23ul.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5309227811096038930" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-2051742038165501909?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/2051742038165501909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=2051742038165501909' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/2051742038165501909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/2051742038165501909'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/03/write-only-memory.html' title='Write-Only Memory'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_K6GCpupL2Io/Sa4qjz8TxPI/AAAAAAAAASU/yp0fpsjPQ0c/s72-c/wom13sx.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-1470761260584015381</id><published>2009-02-21T22:33:00.000-08:00</published><updated>2009-02-21T23:10:21.816-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='school'/><title type='text'>Dynamic Programming</title><content type='html'>Dynamic programming is one of the more interesting Computer Science techniques I've learned in my time as an undergrad. And I can't believe I almost received my diploma without really knowing what it means.&lt;br /&gt;&lt;br /&gt;An Algorithms course isn't required to graduate, and I didn't realize at first exposure to the term that dynamic programming has nothing to do with writing code or dynamic languages. It's an optimization technique to simplify problems which could otherwise blow up exponentially.&lt;br /&gt;&lt;br /&gt;It applies to nearly ever other subject I've held interest in, such as computer vision (with convolutions) or graphics (culling) or optimization in game theory. Never mind that Algorithms has crucial implications for other topics such as Networks, Databases, AI...every computer science topic is some goal-oriented application of specific algorithms. But before I digress....&lt;br /&gt;&lt;br /&gt;Formally learning dynamic programming and its technique of solving subproblems with memoization has only increased my interest in the technique:&lt;br /&gt;&lt;br /&gt;Until now, we've focused on greedy and recurrent algorithms in this algorithms course. Although we began by defining an efficient algorithm as any that ran in polynomial time, until this point the aim was to achieve O(n) or O(n logn) at worst, and rarely O(n^2) solutions as acceptable.&lt;br /&gt;&lt;br /&gt;With dynamic programming we are not nearly as optimistic. The problems have constraints or conditions which render prior techniques as overly simplistic and ineffective. We creatively combine both greedy and and recurrent techniques and use swaths of storage space in hopes of achieving polynomial runtime, meaning that O(n^3) or O(n^4) is not only acceptable--sometimes it's the best we can hope for.&lt;br /&gt;&lt;br /&gt;Despite the pessimism, dynamic programming drastically reins in very difficult problems and occasionally leads to slick O(n) solutions for problems which may otherwise run as O(2^n). It's now one of the most sophisticated, versatile tools I have in my belt--I only wish I knew it before taking several other courses.&lt;br /&gt;&lt;br /&gt;So back to ranting, on my disbelief that the algorithms course is not required to graduate from the department. I realize it's a difficult time-consuming proof-based (everyone hates proofs, although I hate them a little less finally) course that must compete with other "essential" courses in a limited schedule space. But the thought that I nearly graduated without taking this course is scary given how fundamental it is to everything other course and topic in computer science.&lt;br /&gt;&lt;br /&gt;True, I may never prove anything about the runtime to an algorithm I invent in The Real World. But any amount of formal reasoning is far more valuable than being "pretty sure" the solution works. Not to mention using solved problems as templates for real world stuff, or just making positive impressions at job interviews. I'm glad I'm taking algorithms now, especially since I can't travel back in time and take it any sooner.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-1470761260584015381?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/1470761260584015381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=1470761260584015381' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/1470761260584015381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/1470761260584015381'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/02/dynamic-programming.html' title='Dynamic Programming'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-529805068895305479</id><published>2009-02-20T23:46:00.000-08:00</published><updated>2009-02-21T00:13:42.144-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>9 hours of messing with iPhone SDK</title><content type='html'>The iPhone feels like a new frontier, at least for non-early adopters such as myself.&lt;br /&gt;&lt;br /&gt;After learning about &lt;a href="http://walkscore.com"&gt;Walk Score&lt;/a&gt;, I was in a bit of disbelief that their application was not available on the iPhone. Their lookup simply requires a latitude and longitude, which the iPhone readily provides. I dreamed of running around while looking for an apartment and pressing a button on my phone to get its walk score.&lt;br /&gt;&lt;br /&gt;So knowing nothing about Objective C, mobile development, XCode, or much else related to Apple development I set out to whip up a simple mashup of iPhone + Walk Score today and went at it for about 9 hours.&lt;br /&gt;&lt;br /&gt;Unfortunately I haven't yet produced anything close to finished. &lt;br /&gt;&lt;br /&gt;But I learned quite a bit.&lt;br /&gt;&lt;br /&gt;For example, I learned that diving straight into the iPhone samples was a fruitless, frustrating process. The interface builder was not intuitive and I spent over an hour trying to add functionality to a button.&lt;br /&gt;&lt;br /&gt;After downloading a 50-page tutorial on "Your First iPhone Application," I learned how rigorously the SDK enforces the Model-View-Controller principles, such that a simple Hello World app requires substantial scaffolding (50 pages worth!).&lt;br /&gt;&lt;br /&gt;Additionally I got a taste of Objective C, a taste I have not yet acquired. It's more verbose than Java, yet is dynamically typed with difficult syntax and a reasonable number of dependency issues.  &lt;br /&gt;&lt;br /&gt;I learned that Objective C prefers a SAX style XML parsing. &lt;br /&gt;&lt;br /&gt;I figured out how to send HTTP queries to Walk Score, parsed their XML response, and displayed a score for a fixed latitude and longitude.&lt;br /&gt;&lt;br /&gt;After this I wondered if a browser based approach held more advantages. It would spare XML parsing and simply direct users to the search results page for their coordinates. This idea held appeal, since I would reuse the existing browser functionality, and some scores took time to calculate and would require a redirect anyway.&lt;br /&gt;&lt;br /&gt;As my networks professor mused a couple of days ago, "Perhaps one of the best programmers I've met is also one of the laziest programmers I've met, he never does more than he has to for his code to get the job done. Maybe his laziness is what makes him so good." (He was relating it to the design decisions behind NAT)&lt;br /&gt;&lt;br /&gt;After learning how to load web pages using an embedded browser, it came time to retrieve live GPS coordinates. Unfortunately, this is not as simple as a one-line API call. Using GPS is expensive battery-wise and is best done sparingly according the dev docs. For this reason a custom manager is required, which I was hooking up before deciding to call it a day and write this developer diary entry.&lt;br /&gt;&lt;br /&gt;Perhaps later this week I will wrap up the GPS retrieval and integrate it into the iPhone app browser call. But I also learned it might not be worth it:&lt;br /&gt;--Walk Score's heat maps show certain places, such as San Francisco, have near universal scores of 80-90 with only small pockets of lower quality. If the result is nearly uniform, is the experience of walking around with this app anything like I imagined?&lt;br /&gt;--Apple has a certification program in place. Testing and verifying the app might be a costly endeavor, and it might not even find its way into the Apple store.&lt;br /&gt;--Now that I learned some basics, I find myself less interested in this project versus what I could now begin working on.&lt;br /&gt;&lt;br /&gt;All in all, a great experience. I'm still very excited to see what I can produce on this platform, even if I have to hold my nose to write Objective C...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-529805068895305479?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/529805068895305479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=529805068895305479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/529805068895305479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/529805068895305479'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/02/9-hours-of-messing-with-iphone-sdk.html' title='9 hours of messing with iPhone SDK'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-2090293778700091657</id><published>2009-01-28T23:41:00.001-08:00</published><updated>2009-01-28T23:56:22.056-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='creative'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Company Profiles</title><content type='html'>Ever since working for software companies which were spinoffs of other software companies which were spinoffs of other software companies, I've wondered what a tech company family tree would look like.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Although it runs slowly in the browsers I've tried, &lt;a href="http://wtia.micromaps.com/"&gt;this map&lt;/a&gt; reveals an amazingly thorough time and space relationship graph for Puget Sound tech companies.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On top of this, &lt;a href="http://linkedin.com"&gt;LinkedIn&lt;/a&gt; has beefed up their company profile pages with illuminating statistics such as incoming and outgoing career paths. Plus, statistics on  median age of employees and breakdown of which titles constitute which percentage of company employees sheds light on facts which previously would have required some form of insider knowledge.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, for example, I know that prior to joining Microsoft, employees often worked for HP or Oracle, and after leaving tend to arrive at Amazon or Yahoo. I also learned that median age of a Microsoft employee is 34 years old and 13% of its nearly 90,000 employees are software engineers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Its juicy information like this which I covet for visualization purposes--perhaps simultaneously depicting the flow of workers in and out of a company as well as size and age. I'll have to see if I can snag myself an API partnership.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-2090293778700091657?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/2090293778700091657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=2090293778700091657' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/2090293778700091657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/2090293778700091657'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/01/company-profiles.html' title='Company Profiles'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-6209730588088955976</id><published>2009-01-13T15:50:00.000-08:00</published><updated>2009-01-13T23:37:41.070-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='graphics'/><title type='text'>"Artifacts" of taking Graphics/Computer Vision courses</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm1.static.flickr.com/43/99025844_ac3675d1e2.jpg?v=0"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 357px; height: 500px;" src="http://farm1.static.flickr.com/43/99025844_ac3675d1e2.jpg?v=0" border="0" alt="from http://flickr.com/photos/csb13/99025844/" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; When I am in a restaurant I sometimes notice the reflection and refraction of lights and objects through my water glass and try to trace the beams or other objects back to their origin. This is especially true in restaurants with colored lighting.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;When I am walking around areas with lots of solid geometry like between passageways of buildings on campus, I sometimes imagine that the world is translating or transforming instead of me, the viewer (since they produce equivalent images often the approach in graphics is to shift the entire world). I might sometimes figure out where the vanishing points are relative to all the edges and corners.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;I am aware of my internal &lt;a href="http://en.wikipedia.org/wiki/Edge_detection"&gt;edge sharpening&lt;/a&gt; and occasionally notice the effects of &lt;a href="http://en.wikipedia.org/wiki/Mach_band"&gt;mach banding&lt;/a&gt;, both phenomenons which occur as the result of signal processing built into the wiring of the rods and cones of the eye itself.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-6209730588088955976?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/6209730588088955976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=6209730588088955976' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/6209730588088955976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/6209730588088955976'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/01/artifacts-of-taking-graphicscomputer.html' title='&quot;Artifacts&quot; of taking Graphics/Computer Vision courses'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-7691870537009333339</id><published>2009-01-12T23:20:00.000-08:00</published><updated>2009-01-13T00:06:57.954-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Diving into "Dive Into Python"</title><content type='html'>Well I'm now five chapters deep in &lt;a href="http://diveintopython.org/"&gt;Dive Into Python&lt;/a&gt;, which is available completely for free as a &lt;a href="http://diveintopython.org/download/diveintopython-pdf-5.4.zip"&gt;PDF&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It's an older book, but still relevant for its unusual and fantastic approach of teaching a new language to experienced programmers. The approach seems so obvious, and yet it's difficult to come up with examples of other titles which follow the same approach.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://sunsite.uakom.sk/sunworldonline/swol-02-1998/images/guido_van_rossum.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 147px; height: 188px;" src="http://sunsite.uakom.sk/sunworldonline/swol-02-1998/images/guido_van_rossum.jpg" border="0" alt="Guido" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Each chapter begins with a short code example which highlights the power of Python while performing non-trivial tasks such as outputting the language's own documentation or displaying directory listings with file metadata. &lt;br /&gt;&lt;br /&gt;These examples highlight the succinctness of the language while including a new language concept per chapter, effectively booting the reader into a frigid pond of fresh semi-obtuse language constructs ('Get thrown into freezing cold pond of python' doesn't have quite the same ring though).&lt;br /&gt;&lt;br /&gt;The remainder of the chapter is always devoted simply to exposing the constructs and syntax of the example; both &lt;i&gt;what&lt;/i&gt; and &lt;i&gt;how&lt;/i&gt; it all works, line-by-line if necessary. Code samples are available from the website, and the chapter encourages a hands-on approach of running and modifying sample code. &lt;br /&gt;&lt;br /&gt;At each chapter's conclusion, a checklist of concepts is presented and the semi-obtuse sample seen at its start reads as clearly as a language you've known all along.&lt;br /&gt;&lt;br /&gt;It makes perfect sense that the best way to learn a language is by dissecting code beyond one's current reading level and then changing and authoring examples to reinforce it all. It's a bit strange that fewer books go as far as this one, but it's possible the "by Example" series follows a similar tack.&lt;br /&gt;&lt;br /&gt;Dive Into Python's chief drawback is it's age--the book was written way back in 2003, the time of Python 2.3 (it's now the age of 2.6 and the dawn of 3.0). Still, this is a much more fun way to learn than reading, for example, &lt;a href="http://oreilly.com/catalog/9780596100469/"&gt;Python in a Nutshell&lt;/a&gt;, as I was doing (it's more of a reference manual anyway, though more up to date).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-7691870537009333339?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/7691870537009333339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=7691870537009333339' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/7691870537009333339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/7691870537009333339'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2009/01/diving-into-dive-into-python.html' title='Diving into &quot;Dive Into Python&quot;'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-6291590669080731252</id><published>2008-12-23T19:52:00.000-08:00</published><updated>2008-12-23T20:32:39.510-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='creative'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Python Imaging Library</title><content type='html'>I've been diving into Python and trying to craft short little programs to improve my skillz.&lt;br /&gt;&lt;br /&gt;One of the first Python extensions I made a move for was the Python Imaging Library. The PIL packs in an impressive amount of file format compatibility; loading and creating images could hardly be simpler.&lt;br /&gt;&lt;br /&gt;For 90% of your typical use cases I'd say PIL does great, since loading saving and doing simple transformations on images is ridiculously simple. The PIL even supports drawing directly on images with polygons and other primitives. This is where my list of annoyances begins.&lt;br /&gt;&lt;br /&gt;When you're drawing on an image, it seems only natural to desire transparency of shapes. Strangely, this is not possible. After some digging it seems the closest hack is to draw on a buffer image and then blend() or paste() with the original to achieve transparency. This is alright as long as the number of shapes are limited.&lt;br /&gt;&lt;br /&gt;However, if you're trying to create multi-layered vector art, PIL isn't really up to the task.&lt;br /&gt;&lt;br /&gt;In order to achieve the incremental layering of these shapes with true alpha values, I had to write my own pixel-by-pixel merge function, which was ridiculously slow. I'm sure there might have been a better way to do it but I found some of the documentation lacking, and on further investigation it's just literal comments from the source code, with few usage examples.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_K6GCpupL2Io/SVG4TywYXdI/AAAAAAAAAQA/9evcTxTXL6o/s1600-h/base4.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 261px;" src="http://3.bp.blogspot.com/_K6GCpupL2Io/SVG4TywYXdI/AAAAAAAAAQA/9evcTxTXL6o/s320/base4.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5283206488064024018" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_K6GCpupL2Io/SVG4e5rnHCI/AAAAAAAAAQI/xd6wzBXLsvU/s1600-h/base7.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 261px;" src="http://2.bp.blogspot.com/_K6GCpupL2Io/SVG4e5rnHCI/AAAAAAAAAQI/xd6wzBXLsvU/s320/base7.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5283206678901627938" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_K6GCpupL2Io/SVG4nN3w9RI/AAAAAAAAAQQ/71bhhuJfQp8/s1600-h/base9.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 261px;" src="http://4.bp.blogspot.com/_K6GCpupL2Io/SVG4nN3w9RI/AAAAAAAAAQQ/71bhhuJfQp8/s320/base9.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5283206821760267538" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The above images took about a minute each to render, so there goes my plan to create a fun hill-climbing afternoon evolutionary image grinder. I might give this another stab with some Python OpenGL libraries.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-6291590669080731252?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/6291590669080731252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=6291590669080731252' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/6291590669080731252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/6291590669080731252'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2008/12/python-imaging-library.html' title='Python Imaging Library'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_K6GCpupL2Io/SVG4TywYXdI/AAAAAAAAAQA/9evcTxTXL6o/s72-c/base4.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-4961080677026519268</id><published>2008-12-03T17:08:00.001-08:00</published><updated>2008-12-03T17:48:11.060-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='the residents'/><category scheme='http://www.blogger.com/atom/ns#' term='school'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Graphics class final project.</title><content type='html'>Well, I'm slowly but surely taking my tuition money back out of the department by snatching their various prize giveaways. Yesterday I received an Amazon gift certificate in my inbox from "The CSE Department" for &lt;a href="http://alanfineberg.blogspot.com/2008/11/acm-programming-contest.html"&gt;qualifying in the regional ACM programming contest.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Today I took away a WALL-E &lt;b&gt;3-DISC Special Edition&lt;/b&gt;, an excellent and relevant reward for coming in second place in our graphics class' animation short festival. My graphics partner Robert and I built a strange little one-eyed &lt;a href="http://en.wikipedia.org/wiki/The_Residents"&gt;Residents-style&lt;/a&gt; toaster creature which likes dancing and creating toast. Here's the full clip:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/tUv_4IjWA8I&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/tUv_4IjWA8I&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I'm also adding the original dancing clip below because unfortunately we didn't match up our video resolutions and it clipped out a lot of the detail. Here it is:&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="300"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2422310&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=2422310&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/2422310"&gt;Dancing eye ball toaster&lt;/a&gt; from &lt;a href="http://vimeo.com/user891937"&gt;a f&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-4961080677026519268?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/4961080677026519268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=4961080677026519268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/4961080677026519268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/4961080677026519268'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2008/12/graphics-class-final-project.html' title='Graphics class final project.'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-1286970036964106120</id><published>2008-12-02T20:32:00.001-08:00</published><updated>2008-12-02T20:34:48.534-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Last summer's big ol' DNS scare</title><content type='html'>An entertaining and well-written article about a crucial internet security flaw last summer:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.wired.com/techbiz/people/magazine/16-12/ff_kaminsky?currentPage=all"&gt;Dan Kaminsky destroys, saves internet etc.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A scary reminder of how the entire web hinges on the security of e-mail of all things.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-1286970036964106120?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/1286970036964106120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=1286970036964106120' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/1286970036964106120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/1286970036964106120'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2008/12/last-summers-big-ol-dns-scare.html' title='Last summer&apos;s big ol&apos; DNS scare'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-4680302428113726369</id><published>2008-12-01T00:11:00.000-08:00</published><updated>2008-12-01T00:27:48.506-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><title type='text'>Opencongress.org</title><content type='html'>I just discovered &lt;a href="http://opencongress.org"&gt;Open Congress&lt;/a&gt;, a pretty sweet site for bringing clarity and perspective to US politics + legislation.&lt;br /&gt;&lt;br /&gt;For example, check out the page for HR 2082, the CIA funding bill vetoed by Bush for its interrogation tactics restrictions:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.opencongress.org/bill/110-h2082/show"&gt;H.R. 2082&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can see who voted Aye, Nay or abstain, its amendments, its trajectory through Congress (ending in a failed override) and related bills and news articles. &lt;br /&gt;&lt;br /&gt;For example, these 4 Senators voted "Nay" on the bill:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.opencongress.org/roll_call/sublist/3504?party=Republican&amp;vote=Nay"&gt;Waterboarding fans&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately I could not locate a convenient "Contact this politician" button so that I could quickly dispatch an appropriate nastygram. At the least, it could link me to their Facebook profile (seeing as how I can "share" Senator Chambliss with all my friends on Facebook...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-4680302428113726369?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/4680302428113726369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=4680302428113726369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/4680302428113726369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/4680302428113726369'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2008/12/opencongressorg.html' title='Opencongress.org'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-918047547094079993</id><published>2008-11-17T01:03:00.000-08:00</published><updated>2008-11-17T01:09:56.275-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='school'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>ACM Programming Contest</title><content type='html'>It was a lot of fun to compete in the ACM Pacific Northwest regional programming contest. We didn't qualify to go on to the finals but our school (University of Washington) swept the top three spots at our site (University of Oregon in Eugene) and my team snagged the second place spot at the site with 7/11 problems correctly solved.&lt;br /&gt;&lt;br /&gt;It was an exciting finish too--we had only solved four problems with less than an hour to go in the five hour contest, and we got 3 correct submissions in the final 45 minutes to boost our standing to the top three.&lt;br /&gt;&lt;br /&gt;I really enjoyed the contest, they challenged our problem solving and debugging skills and I especially enjoy working with the guys who were on my team. It was also a chance for people who didn't know me as well to discover the true extent of my nerd-dom as I missed an excellent party or two to travel to Eugene and write code instead. Carpe Diem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-918047547094079993?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/918047547094079993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=918047547094079993' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/918047547094079993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/918047547094079993'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2008/11/acm-programming-contest.html' title='ACM Programming Contest'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-46164237087060902</id><published>2008-11-11T23:31:00.000-08:00</published><updated>2008-11-11T23:41:11.476-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Sweet they made an instructional video too!</title><content type='html'>I'm still really excited about the coverage Google Ad Planner is receiving.&lt;br /&gt;&lt;br /&gt;Now that it's open to everyone, they made an instructional video specifically for my feature:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/EX5HXLY1j2g&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/EX5HXLY1j2g&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Ok so the visualization has an instructional video, does this mean it's difficult to use? Not necessarily, it's powerful since there are 4 axes of control and the video helps people realize the potential sitting right at their fingertips that they may not otherwise realize!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://google.com/adplanner"&gt;Once again you can check it out here.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-46164237087060902?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/46164237087060902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=46164237087060902' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/46164237087060902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/46164237087060902'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2008/11/sweet-they-made-instructional-video-too.html' title='Sweet they made an instructional video too!'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-4812463005084094341</id><published>2008-11-11T23:03:00.000-08:00</published><updated>2008-11-11T23:14:02.249-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Tech Crunch write up!</title><content type='html'>My summer internship product / feature was written up on Tech Crunch!&lt;br /&gt;&lt;br /&gt;Google Ad Planner is now open to everyone:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.techcrunch.com/2008/11/11/google-ad-planner-opens-up-to-everyone-with-fresh-features/"&gt;Check out the sweet video demo then go check it out.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I worked on the bubble chart mentioned. There was a bit more to it then hooking up the Trendalyzer API. Scale and performance were big considerations as well as prototyping and researching different audience visualization concepts.&lt;br /&gt;&lt;br /&gt;Here's a custom close-up of the feature at work:&lt;br /&gt;&lt;img src="http://cs.washington.edu/homes/af/adplanner.jpg" alt="Motion Chart!"&gt;&lt;br /&gt;&lt;br /&gt;I'll provide another link right here so you can jump right to it:&lt;br /&gt;&lt;a href="http://google.com/adplanner"&gt;Google Ad Planner&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-4812463005084094341?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/4812463005084094341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=4812463005084094341' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/4812463005084094341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/4812463005084094341'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2008/11/tech-crunch-write-up.html' title='Tech Crunch write up!'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-4162655125173993390</id><published>2008-11-09T13:01:00.000-08:00</published><updated>2008-11-17T19:15:34.572-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='school'/><title type='text'>What's Happening?</title><content type='html'>From the past--a project my HCI team worked on for a whole quarter, with a sweet video prototype as well as a very limited interactive demo.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cs.washington.edu/education/courses/cse440/07au/project_files/whatshappening/"&gt;&lt;img src="http://www.cs.washington.edu/education/courses/cse440/07au/project_files/whatshappening/img/wh_new_logo.jpg" width=512 height=100 alt="What's Happening?"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cs.washington.edu/education/courses/cse440/07au/project_files/whatshappening/"&gt;What's Happening?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-4162655125173993390?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/4162655125173993390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=4162655125173993390' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/4162655125173993390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/4162655125173993390'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2008/11/whats-happening.html' title='What&apos;s Happening?'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-4931253479861776064</id><published>2008-11-05T23:39:00.000-08:00</published><updated>2008-11-05T23:48:12.328-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='school'/><title type='text'>UWcourses.com</title><content type='html'>&lt;a href="http://uwcourses.com"&gt;Uwcourses.com &lt;/a&gt; is a site made by my friend Sergey which came out of data we gathered for Statistics final project. &lt;br /&gt;&lt;br /&gt;We scraped data from the UW Course Evaluation catalog (visible only to students) and even archived evals using the &lt;a href="http://archive.org"&gt;wayback machine&lt;/a&gt; and related it with public state employee salary data (not on the page itself). &lt;br /&gt;&lt;br /&gt;The result of the statistics project was a wealth of relational data, and the site Sergey made hooks it up to an interface that is far easier to navigate than scrolling through alphabetical pages of the eval data.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://uwcourses.com"&gt;Check it out, especially if you attend the UW&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-4931253479861776064?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/4931253479861776064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=4931253479861776064' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/4931253479861776064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/4931253479861776064'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2008/11/uwcoursescom.html' title='UWcourses.com'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-1848327422960020371</id><published>2008-11-03T18:32:00.000-08:00</published><updated>2008-11-03T18:36:11.165-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maryland'/><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><title type='text'>Bowie, MD</title><content type='html'>Over 96% of the campaign donations from my hometown of Bowie, MD donated to Obama. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.obamaps.com/top-100-cities-for-obama-campaign-contributors.aspx"&gt;Here's the amazing chart&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tomorrow will be the first time I vote in a presidential election, I'm doing it early because I'm sure the line will be around the block here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-1848327422960020371?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/1848327422960020371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=1848327422960020371' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/1848327422960020371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/1848327422960020371'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2008/11/bowie-md.html' title='Bowie, MD'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-6763369507312254687</id><published>2008-11-02T20:38:00.001-08:00</published><updated>2008-11-02T21:04:49.531-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='school'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>The results are in</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;My group placed 3rd out of 21 teams in our school's ACM programming contest! We'll go on to represent the University of Washington at the regional tournament, along with the other two top teams from the UW.&lt;br /&gt;&lt;br /&gt;The contest was to complete as many of 8 challenges as possible in 4 hours. Only three teams including ours completed 5 problems right, but we had the slowest time to do so. Some of the problems were actually kind of fun.&lt;br /&gt;&lt;br /&gt;For example, &lt;a href="http://www.cs.washington.edu/homes/reges/acm/f.html"&gt;this problem&lt;/a&gt; involved finding a specific kind of prime number variant named an "H-number semi-prime."&lt;br /&gt;&lt;br /&gt;The regional tournament is on November 15 at the University of Oregon, can't wait!&lt;br /&gt;&lt;br /&gt;(The rest of the problems/solutions are &lt;a href="http://www.cs.washington.edu/homes/reges/acm/results.html"&gt;here&lt;/a&gt;.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-6763369507312254687?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/6763369507312254687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=6763369507312254687' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/6763369507312254687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/6763369507312254687'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2008/11/results-are-in.html' title='The results are in'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2620284925999610084.post-9182276762438047583</id><published>2008-11-02T00:35:00.000-07:00</published><updated>2008-11-02T00:49:05.662-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='creative'/><title type='text'>Hello world first post etc.</title><content type='html'>Ah it's the fresh new blog smell. Love the smell of that new blog.&lt;br /&gt;&lt;br /&gt;Here's a stop motion animation video we made for no good reason. It was lots of fun to create and also to make music for, and escalated quickly after some faces were drawn on fruit. May be mildly traumatizing:&lt;br /&gt;&lt;br /&gt;&lt;object height="300" width="400"&gt;    &lt;param name="allowfullscreen" value="true"&gt;    &lt;param name="allowscriptaccess" value="always"&gt;    &lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2120507&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1"&gt;    &lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=2120507&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="300" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/2120507?pg=embed&amp;amp;sec=2120507"&gt;Untitled&lt;/a&gt; from &lt;a href="http://vimeo.com/user619582?pg=embed&amp;amp;sec=2120507"&gt;. .&lt;/a&gt; on &lt;a href="http://vimeo.com/?pg=embed&amp;amp;sec=2120507"&gt;Vimeo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2620284925999610084-9182276762438047583?l=alanfineberg.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://alanfineberg.blogspot.com/feeds/9182276762438047583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2620284925999610084&amp;postID=9182276762438047583' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/9182276762438047583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2620284925999610084/posts/default/9182276762438047583'/><link rel='alternate' type='text/html' href='http://alanfineberg.blogspot.com/2008/11/hello-world-first-post-etc.html' title='Hello world first post etc.'/><author><name>alan f</name><uri>http://www.blogger.com/profile/03633829336408007481</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
