<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
 <title>graysky</title>
 <link href="http://graysky.org/atom.xml" rel="self" />
 <link href="http://graysky.org/" />
 <updated>2009-09-27T18:48:30-04:00</updated>
 <id>http://graysky.org</id>
 <author>
   <name>Mike Champion</name>
   <email>mike@graysky.org</email>
 </author>
  
 
   
	 <link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/2.0/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry>
	   <title>Mac OS X Setup</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/NDS426JGu_o/mac-osx-setup" />
	   <updated>2009-07-27T00:00:00-04:00</updated>
	   <id>http://graysky.org/osx-setup</id>
	   <content type="html">&lt;p&gt;I just did the whole setup-a-new-Mac dance and thought I'd crash a faux-installment of 
&lt;a href="http://usesthis.com/"&gt;The Setup&lt;/a&gt; to share my notes. My current machine is a 15" MacBookPro with 4GB RAM purchased two weeks ago. Overall a fast, shiny new machine. Which, coincidently, is my biggest complaint. The glossy screen is sooo reflexive that it is often like staring at myself in a mirror. (Why do they have a matte option only on the 17" MBPs?) The feel of the keyboard and battery life are a nice step up from my previous Apple laptop.&lt;/p&gt;

&lt;p&gt;Most of my days are spent inside &lt;a href="http://macromates.com/"&gt;TextMate&lt;/a&gt;. I was an Emacs junkie with a giant elisp configuration, but found the corded key combos took a toll on my hands and I left it for Eclipse (back when writing Java). TextMate is a solid editor, with reasonable defaults and similar enough key combos for common tasks to keep me happy. I use a customized version of the Sunburst theme. I like &lt;a href="http://ciaranwal.sh/2008/08/05/textmate-plug-in-projectplus"&gt;ProjectPlus&lt;/a&gt; as a replacement drawer for better sorting options. I don't extensively use TM bundles, but found the &lt;a href="http://github.com/drnic/copy-as-rtf-tmbundle/tree/master"&gt;Copy as RTF&lt;/a&gt; bundle helpful for making slides. The other place I spend a lot of time is Terminal. It is passable, and better after changing it to send Ctrl-H as Backspace and turning off the audible bell.

&lt;p&gt;I like &lt;a href="http://mailplaneapp.com/"&gt;MailPlane&lt;/a&gt; for work email, &lt;a href="http://toolbar.google.com/gmail-helper/notifier_mac.html"&gt;Google Notifier&lt;/a&gt; for personal email, &lt;a href="http://adium.im/"&gt;Adium&lt;/a&gt; for IM'ing, &lt;a href="http://www.atebits.com/tweetie-mac/"&gt;Tweetie&lt;/a&gt; for Twitter, &lt;a href="http://colloquy.info/"&gt;Colloquy&lt;/a&gt; for IRC, &lt;a href="http://www.newsgator.com/INDIVIDUALS/NETNEWSWIRE/"&gt;NetNewsWire&lt;/a&gt; for password protected RSS feeds, and have been trying &lt;a href="http://www.google.com/quicksearchbox/"&gt;Google Quick Search Box&lt;/a&gt; as a launcher.&lt;/p&gt;

&lt;p&gt;Music helps the code flow so I use the shareware &lt;a href="http://wincent.com/a/products/synergy-classic/"&gt;Synergy&lt;/a&gt; to control iTunes from global keyboard shortcuts without leaving what I'm working on. &lt;a href="http://www.deusty.com/software/mac.php"&gt;Mojo&lt;/a&gt; is great to share music with friends. I prefer listening to albums more than random mixes so I customize the iTunes view options to include &lt;em&gt;Track Number&lt;/em&gt; and &lt;em&gt;Last Played&lt;/em&gt; (which are inherited by later created playlists) for easier sorting.

&lt;p&gt;I primarily browse with FireFox, but end up using Safari and Opera (and now Chromium) as well. I'm most comfortable with FireFox but the memory leakage is frustrating enough to tempt me to switch. Often I find that videos are smoother to watch in Safari, as well as feeling snappier. I use FireBug, YSlow and Google's &lt;a href="http://code.google.com/speed/page-speed/"&gt;Page Speed&lt;/a&gt; for measuring web performance, &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/271"&gt;ColorZilla&lt;/a&gt; to get the hex for colors and &lt;a href="http://agilewebsolutions.com/products/1Password"&gt;1Password&lt;/a&gt; helps keep my passwords slightly less insecure. Also, I really enjoy the bookmarklets for &lt;a href="http://www.instapaper.com/"&gt;Instapaper&lt;/a&gt; to read something later, and &lt;a href="http://lab.arc90.com/experiments/readability/"&gt;Readability&lt;/a&gt; for clean and enjoyable web reading.

&lt;p&gt;The customization steps that I always have to dig up again are:
	&lt;ul&gt;
		&lt;li&gt;Stop the Dock from growing and shrinking. Then get rid of the drop shadows via: &lt;br /&gt; &lt;code&gt;defaults write com.apple.dock no-glass -boolean YES &amp;&amp; killall Dock&lt;/code&gt;
		&lt;li&gt;Re-map Caps Lock to Cmd in the Keyboard Modifier Keys preferences. I never need Caps Lock and it makes a lot of shortcuts easier for my hands to type.
		&lt;li&gt;Switch the keyboard shortcuts to enable "Full Keyboard access" for "All Controls" so pressing Tab will land on Submit buttons. As a keyboard fan this is a must.
	&lt;/ul&gt;
&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/NDS426JGu_o" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/mac-osx-setup</feedburner:origLink></entry>
		
 
   
	 <entry>
	   <title>Jekyll Transformation</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/JNxcx4JZFsM/jekyll" />
	   <updated>2009-07-21T00:00:00-04:00</updated>
	   <id>http://graysky.org/2009/07/jekyll</id>
	   <content type="html">&lt;p&gt;Yesterday I switched this blog over to run on &lt;a href="http://jekyllrb.com/"&gt;Jekyll&lt;/a&gt;. I'd been thinking about moving away from Wordpress for a while, and a short talk by &lt;a href="http://litanyagainstfear.com/"&gt;Nick Quaranto&lt;/a&gt; at the &lt;a href="http://bostonrb.org/"&gt;Boston Ruby group&lt;/a&gt; that mentioned a Wordpress importer pushed me over the edge. So what is interesting about Jekyll?&lt;/p&gt;

&lt;p&gt;Jekyll statically generates your site using the &lt;a href="http://www.liquidmarkup.org/"&gt;Liquid markup language&lt;/a&gt; and html/markdown/textile.
No need for a database, with everything versioned as files (in git). No upgrade/backup headaches nor a need to cache anything. Trivial to set up a development version for writing and previewing site changes. I've been enamored with the idea of statically generating more and doing the
rest in Javascript. So now the comments have been imported into &lt;a href="http://disqus.com/"&gt;Disqus&lt;/a&gt;.

&lt;p&gt;There are still some rough edges, though. Enough that it likely isn't ready for the non-hacker masses just yet. The documentation could be more complete, but helped by looking at &lt;a href="http://wiki.github.com/mojombo/jekyll/sites"&gt;other Jekyll-based sites&lt;/a&gt; like &lt;a href="http://github.com/qrush/litanyagainstfear/tree/master"&gt;Nick's for examples&lt;/a&gt;. The Wordpress importer didn't preserve the categories, but the permalinks worked perfectly. I've found running &lt;code&gt;jekyll --server --auto&lt;/code&gt; lagging my edits to be a little frustrating. Still, I moved my site to Jekyll in about 2 hours without breaking a link. 
	
&lt;p&gt;Ironically, the very first iteration of my site some 10 years back when it was a "news" site (pre-"blog"-era terminology) was a folder with html "stories" that I wrote some Perl to munge with a header, footer and copy to a special directory. Before it moved on to Perl CGI based, Movable Type, Wordpress, etc. The circle is complete. 
	
	&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/JNxcx4JZFsM" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/2009/07/jekyll</feedburner:origLink></entry>
		
 
   
	 <entry>
	   <title>Photography Portfolio</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/xCRiaLc7TJY/photography-portfolio" />
	   <updated>2009-07-16T00:00:00-04:00</updated>
	   <id>http://graysky.org/2009/07/photography-portfolio</id>
	   <content type="html">&lt;p&gt;In addition to photos that I (occasionally) &lt;a href="http://www.flickr.com/photos/downtree"&gt;post to Flickr&lt;/a&gt; the other night I put together a &lt;a href="http://graysky.org/photography/"&gt;portfolio collection&lt;/a&gt; of photos that I like for one reason or another at &lt;a href="http://graysky.org/photography/"&gt;graysky.org/photography&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The page is built with &lt;a href="http://devkick.com/lab/galleria/"&gt;Galleria&lt;/a&gt;, a slick JavaScript image gallery plugin written for &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;. I started with one of the demo examples and hacked it into a design I liked. The plugin appears to be frozen to an older version of jQuery, but I preferred its style over &lt;a href="http://blueprintds.com/2009/01/20/top-14-jquery-photo-slideshow-gallery-plugins/"&gt;the many alternatives&lt;/a&gt;. I wanted to have a set with more flexible sorting options that Flickr's sets allow and a simple presentation (without requiring Flash).&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/xCRiaLc7TJY" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/2009/07/photography-portfolio</feedburner:origLink></entry>
		
 
   
	 <entry>
	   <title>On Mobile Photography</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/Of_DY4_AKl0/mobile-photography" />
	   <updated>2009-07-09T00:00:00-04:00</updated>
	   <id>http://graysky.org/2009/07/mobile-photography</id>
	   <content type="html">&lt;div&gt;&lt;img src="http://files.snapmylife.com/pictures/4694162/838330_large_thumb.jpg" /&gt; &lt;img src="http://files.snapmylife.com/pictures/5570290/938643_large_thumb.jpg" /&gt; &lt;img src="http://files.snapmylife.com/pictures/578107/792486_large_thumb.jpg" /&gt;&lt;/div&gt;


&lt;div style="margin-bottom: 10px"&gt;&lt;img src="http://files.snapmylife.com/pictures/2015201/38978_large_thumb.jpg" /&gt; &lt;img src="http://files.snapmylife.com/pictures/1296164/21668_large_thumb.jpg" /&gt; &lt;img src="http://files.snapmylife.com/pictures/519383/611161_large_thumb.jpg" /&gt;&lt;/div&gt;


&lt;p&gt;I was recently looking through my shots from a year &lt;a href="http://www.snapmylife.com/pictures/user/46016"&gt;experimenting with mobile-phone photography&lt;/a&gt;. As something of a photo snob I'm surprised at how quickly it is becoming "good enough" for many snapshots. Duncan Davidson has a &lt;a href="http://blog.duncandavidson.com/2009/07/sunset-along-interstate-5.html"&gt;fantastic example that illustrates&lt;/a&gt; that pros and cons of this trend. (Or, more humorously The Onion captures the zeitgeist perfectly with their report about &lt;a href="http://www.theonion.com/content/node/95143"&gt;40,000 insipid party pics of a dorm fire&lt;/a&gt;.)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The mobile camera is one that is always with you. Try as I might I'm not often disciplined enough of a photographer to have a better camera on me and want to dig it out. Having a camera at the ready is certainly critical to capturing a shot (as &lt;a href="http://photo.net/learn/point-and-shoot-tips"&gt;Phil Greenspun describes well&lt;/a&gt; on the benefits of points-and-shoots) that may only last for a moment.

&lt;li&gt;Mobile phones are already on the network, so it is relatively simple to share. The time between snapping a picture on my iPhone and sharing it with friends is measured in seconds. Compare that to the slow pace of taking the SD card out of my 50d, importing onto my computer and then uploading. This can take between hours and days. There is real value to the immediacy of sharing a moment with friends and family. Products like the fantastic &lt;a href="http://www.eye.fi/"&gt;Eye-Fi&lt;/a&gt; are an improvement for traditional point-and-shoots but they are playing catch up in this arena. 

&lt;li&gt;This likely only appeals to nerds, but I love that my iPhone can provide geolocation information in the EXIF data. I really enjoy having a record of where my pictures were taken, but this may not be of mass appeal. Again, the Eye-Fi improves this for point-and-shoot cameras but lags the capabilities of my iPhone.

&lt;li&gt;The lens leaves a lot to be desired, as Duncan's comparison shows. The iPhone 3GS "tap-to-focus" and 3MP image are a step up, but shooting in low light conditions mostly yields poor results. Perhaps good enough to share with a friend, but likely to be blurry. Of course mobile cameras won't likely be ever used for fine art, but there is value to &lt;a href="http://twitpic.com/135xa"&gt;even technically flawed images&lt;/a&gt;.
&lt;/ul&gt;


&lt;p&gt;Like the mobile phone itself, the mobile phone camera is often worse than the traditional alternatives but has a few killer features. It seems similar to the appeal of the instant Polaroid picture for a prior generation. And next up is video.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/Of_DY4_AKl0" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/2009/07/mobile-photography</feedburner:origLink></entry>
		
 
   
	 <entry>
	   <title>Planet Money on On Point</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/mMnjS9mni3Q/planet-money-on-point" />
	   <updated>2009-06-25T00:00:00-04:00</updated>
	   <id>http://graysky.org/2009/06/planet-money-on-point</id>
	   <content type="html">&lt;div class="video-frame"&gt;
&lt;object type="application/x-shockwave-flash" width="600" height="338" data="http://www.flickr.com/apps/video/stewart.swf?v=71377" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"&gt; &lt;param name="flashvars" value="intl_lang=en-us&amp;photo_secret=8d94589b29&amp;photo_id=3659137146&amp;hd_default=true"&gt;&lt;/param&gt; &lt;param name="movie" value="http://www.flickr.com/apps/video/stewart.swf?v=71377"&gt;&lt;/param&gt; &lt;param name="bgcolor" value="#000000"&gt;&lt;/param&gt; &lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/video/stewart.swf?v=71377" bgcolor="#000000" allowfullscreen="true" flashvars="intl_lang=en-us&amp;photo_secret=8d94589b29&amp;photo_id=3659137146&amp;hd_default=true" height="338" width="600"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/div&gt;


&lt;p&gt;Last night we attended a live recording of &lt;a href="http://www.onpointradio.org/"&gt;&lt;em&gt;On Point&lt;/em&gt;&lt;/a&gt; with Adam Davidson and David Kestenbaum of NPR's &lt;a href="http://www.npr.org/blogs/money/"&gt;&lt;em&gt;Planet Money&lt;/em&gt;&lt;/a&gt; podcast. The recording, held in &lt;a href="http://www.longwoodevents.com/Venues/StateRoom/"&gt;The State Room&lt;/a&gt; in downtown Boston, was a fundraiser for &lt;a href="http://www.wbur.org/"&gt;WBUR&lt;/a&gt;. The &lt;a href="http://www.onpointradio.org/2009/06/planet-money"&gt;episode aired today&lt;/a&gt; and was a good conversation on how they've tried to explain complex economic news in an understandable and engaging way. I captured a &lt;a href="http://www.flickr.com/photos/downtree/3659137146/"&gt;quick video&lt;/a&gt; from the evening's conversation.&lt;/p&gt;

&lt;p&gt;Like many others I was extremely impressed with This American Life's &lt;a href="http://www.thislife.org/radio_episode.aspx?episode=355"&gt;"The Giant Pool of Money"&lt;/a&gt; episode last year - even buying the CD version so I could give it to family not familiar with podcasts - and have listened to Planet Money since last fall's economic meltdown. They've managed onto a winning formula of both being more explanatory and less formal than typical economic reporting. For example, Planet Money hasn't shied away from dry subjects like explaining collateralized debt obligations or credit default swaps. And after spending time on Capital Hill Kestenbaum was rather forthright that he felt unconvinced that many lawmakers really understand the complexity of the financial markets they oversee. But perhaps the best aspect of the show is that they themselves are struggling to truly understand complicated economic issues along with the listeners. The quote of the night was from Davidson, who when asked about the difficulty of covering economic news after the crisis compared it to his feelings about Iraq, saying that "America went from fascination with Iraq to boredom without ever passing through knowledge." Hopefully shows like Planet Money are small steps to helping actually learn about how the real economy works.&lt;/p&gt;

&lt;p&gt;(But what is it that makes radio personalities look quite different than from how their voices lead you to expect? When I saw Adam Davidson in a &lt;a href="http://www.pbs.org/wgbh/pages/frontline/breakingthebank/"&gt;Frontline special&lt;/a&gt; I was somehow rather surprised that a public radio economic reporter was a bit nerdish. What are the odds?)&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/mMnjS9mni3Q" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/2009/06/planet-money-on-point</feedburner:origLink></entry>
		
 
   
	 <entry>
	   <title>TextMate Project Tree Refresh</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/oIp8dsr9qRM/textmate-project-refresh-focus" />
	   <updated>2009-06-21T00:00:00-04:00</updated>
	   <id>http://graysky.org/2009/06/textmate-project-refresh-focus</id>
	   <content type="html">&lt;p&gt;One small annoyance of using &lt;a href="http://macromates.com/"&gt;TextMate&lt;/a&gt; is how it refreshes the project tree when it regains focus. If you have a large source tree this can lead to waiting for many seconds while TextMate is frozen or showing the dreaded &lt;a href="http://en.wikipedia.org/wiki/Spinning_wait_cursor"&gt;beach ball&lt;/a&gt;. Normally switching back from another application to TextMate has about a half second delay, but when the directory contents are changed it can be considerably longer when the project is large (presumably stat info is cached in the first case.) Our current project setup contains about 150MB of source code (including plugins and vendor'd rails) and a data directory that can be ~1GB, leading to some frustrating wait times.&lt;/p&gt;

&lt;p&gt;Until the mythic &lt;a href="http://blog.macromates.com/2009/working-on-it/"&gt;TextMate 2 is released&lt;/a&gt; and fixes &lt;a href="http://fixedbytm2.com/"&gt;each and every TextMate issue&lt;/a&gt;, here are a few workarounds:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Change Project Structure&lt;/strong&gt; - Move that huge data directory out from under the project hierarchy. For some projects this might be harder than others, especially for those projects with very large source trees.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;ReMate&lt;/strong&gt; - There are 2 version of ReMate, a plugin that disables the automatic refreshing of the project tree. The &lt;a href="http://ciaranwal.sh/remate/"&gt;original version&lt;/a&gt; adds a menu item to &lt;em&gt;Disable Refresh on Regaining Focus&lt;/em&gt;. This makes TextMate instantly responsive during app switching, but I can't get the option to remain enabled between TextMate sessions. And, obviously, changes made in the filesystem are not reflected in the TextMate project drawer and the manual &lt;em&gt;Refresh All Projects&lt;/em&gt; menu item is broken as well. (This might be due to an interaction with &lt;a href="http://ciaranwal.sh/2008/08/05/textmate-plug-in-projectplus"&gt;ProjectPlus&lt;/a&gt; plugin.) 

&lt;br /&gt;&lt;p&gt;The &lt;a href="http://ciaranwal.sh/2007/11/07/remate-update"&gt;updated version of ReMate&lt;/a&gt; will disable automatic refresh for specific mounted volumes and is designed for those editing files over networked filesystems like SFTP or WebDAV.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Remove Folder Reference&lt;/strong&gt; - Within TextMate a folder pattern can be removed from the tree. The advantage over ReMate is to remove the huge data directory but still have TextMate automatically pick up other filesystem changes. This will only stick if you have a TextMate Project (right click on the top level directory &gt; &lt;em&gt;Show Information&lt;/em&gt;) or make the change globally (&lt;em&gt;Preferences&lt;/em&gt; &gt; &lt;em&gt;Advanced&lt;/em&gt; &gt; &lt;em&gt;Folder References&lt;/em&gt;). Within the dialog modify the &lt;em&gt;Folder Pattern&lt;/em&gt; &lt;a href="http://manual.macromates.com/en/regular_expressions"&gt;regular expression&lt;/a&gt; to exclude the "big_data" directory like:

&lt;br /&gt;&lt;pre lang="bash"&gt;
!.*/(\.[^/]*|CVS|big_data|.*~\.nib|.*\.(xcode(proj)?))$
&lt;/pre&gt;

After making this change TextMate should be much snappier when bouncing between TM and other applications. 
&lt;/ol&gt;

&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/oIp8dsr9qRM" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/2009/06/textmate-project-refresh-focus</feedburner:origLink></entry>
		
 
   
	 <entry>
	   <title>Harry Parker Boathouse</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/5JtWxxDjyQM/harry-parker-boathouse" />
	   <updated>2009-06-01T00:00:00-04:00</updated>
	   <id>http://graysky.org/2009/06/harry-parker-boathouse</id>
	   <content type="html">&lt;div class="flickr-frame"&gt;&lt;a href="http://www.flickr.com/photos/downtree/sets/72157617638779824/" title="Harry Parker Boathouse by graysky., on Flickr"&gt;&lt;img src="http://graysky.org/images/harry_parker_boathouse.jpg" alt="Harry Parker Boathouse" /&gt;&lt;/a&gt;&lt;/div&gt;


&lt;p&gt;The best addition to my morning commute is driving past &lt;a href="http://www.communityrowing.org/"&gt;Community Rowing Inc.'s&lt;/a&gt; Harry Parker Boathouse along the Charles River in Brighton, MA. The &lt;a href="http://www.gocrimson.com/ViewArticle.dbml?DB_OEM_ID=9000&amp;amp;ATCLID=1580207"&gt;$15 million dollar, 30,000 sq. ft.&lt;/a&gt; boathouse was designed by &lt;a href="http://www.anmahian-winton.com"&gt;Anmahian Winton Architects&lt;/a&gt; to support public access to rowing. The choice of material and cross-hatching pattern for the exterior add to the striking yet inviting feel of the structure. [&lt;a href="http://www.flickr.com/photos/downtree/sets/72157617638779824/"&gt;more pics&lt;/a&gt;]&lt;/p&gt;

&lt;div class="flickr-frame"&gt;&lt;a href="http://www.flickr.com/photos/downtree/sets/72157617638779824/" title="Community Rowing"&gt;&lt;img src="http://graysky.org/images/community_rowing.jpg" alt="Community Rowing" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/5JtWxxDjyQM" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/2009/06/harry-parker-boathouse</feedburner:origLink></entry>
		
 
   
	 <entry>
	   <title>Memorial Day</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/Qwai1t0CubM/memorial-day" />
	   <updated>2009-05-25T00:00:00-04:00</updated>
	   <id>http://graysky.org/2009/05/memorial-day</id>
	   <content type="html">&lt;div class="flickr-frame"&gt;&lt;a href="http://www.flickr.com/photos/downtree/3563197960/"&gt;&lt;img src="http://graysky.org/images/veterans_lot.jpg" class="flickr-photo" /&gt;&lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;The flags along the Veterans' Lots in Cambridge Cemetery, in advance of the &lt;a href="http://www.cambridgema.gov/VET/NewsDetail.cfm?story_id=2149"&gt;Cambridge Memorial Day Observance&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/Qwai1t0CubM" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/2009/05/memorial-day</feedburner:origLink></entry>
		
 
   
	 <entry>
	   <title>Banning Non-Competes in Massachusetts</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/Ekhv0wqSPqA/non-compete-clauses-massachusetts" />
	   <updated>2009-04-13T00:00:00-04:00</updated>
	   <id>http://graysky.org/2009/04/non-compete-clauses-massachusetts</id>
	   <content type="html">&lt;p&gt;I recently wrote to my State Representative, &lt;a href=" http://www.mass.gov/legis/member/j_h1.htm"&gt;Jonathan Hecht&lt;/a&gt;, to support banning noncompete clauses in Massachusetts. House Bill 1794 would abolish non-competes clauses in employment agreements and has been &lt;a href="http://opencompetition.wordpress.com/supporters/"&gt;endorsed by those in the "Alliance for Open Competition"&lt;/a&gt; and other tech founders like &lt;a href="http://innocuous.org/articles/2008/12/30/ban-non-competes-in-massachusetts"&gt;Richard Tibbets of StreamBase&lt;/a&gt;. I believe changing the law in the Commonwealth to ban non-competes would help make our state more attractive to tech workers by ensuring their ability to make the best use of their skills and new businesses to hire the best talent. Even if they are rarely enforced they can contribute to a chilling effect that can make Massachusetts less competitive with states like California, &lt;a href="http://en.wikipedia.org/wiki/Non-compete_clause#Enforceability_in_the_State_of_California"&gt;where they are not enforced.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In reading up on the issue, I came across a few sites that I thought were interesting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rep. Brownsberger, who sponsored the bill in the House, maintains a site with links to the legistlative proposal, discussions in the press and background information at the (unfortunately named but very useful): &lt;a href="http://prohibitrestrictiveemploymentcovenants.net"&gt;prohibitrestrictiveemploymentcovenants.net&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;Bijan Sabet has an &lt;a href="http://bijansabet.com/post/22575311/matt-marx-is-a-researcher-and-doctoral-candidate"&gt;interesting interview with Harvard Business School researcher  Matt Marx&lt;/a&gt; about effects of noncompetes agreements (and &lt;a href="http://www.boston.com/business/articles/2007/12/30/why_noncompete_means_dont_thrive_/"&gt;related Globe column by Scott Kirsner&lt;/a&gt;.)&lt;/li&gt;

&lt;li&gt;An article by Russell Beck, of Foley &amp; Lardner, on what &lt;a href="http://www.masshightech.com/stories/2008/09/01/focus4-Noncompete-agreements-that-dont-mean-what-they-say.html"&gt;non-compete agreements actually mean&lt;/a&gt;. Michael Rosen, also of Foley Hoag, maintains an interesting blog about noncompete law and other labor &amp; employment law in Massachusetts at &lt;a href="http://www.massachusettsnoncompetelaw.com/"&gt;massachusettsnoncompetelaw.com&lt;/a&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/Ekhv0wqSPqA" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/2009/04/non-compete-clauses-massachusetts</feedburner:origLink></entry>
		
 
   
	 <entry>
	   <title>Dynamically Loading Javascript</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/lq8i11Xmg8Q/dynamically-loading-javascript" />
	   <updated>2009-04-02T00:00:00-04:00</updated>
	   <id>http://graysky.org/2009/04/dynamically-loading-javascript</id>
	   <content type="html">&lt;p&gt;Recently I added a few ads to &lt;a href="http://whoshouldifollow.com"&gt;WhoShouldiFollow&lt;/a&gt; to cover our hosting costs and ran into a Javascript issue I hadn't hit before. Specifically, trying to dynamically load a third party script that uses &lt;tt&gt;document.write&lt;/tt&gt; to add HTML to the DOM was &lt;b&gt;erasing the whole page&lt;/b&gt;! I found a (slightly-evil) solution after much hacking around and no luck finding anything similar in Google. Hopefully there is a cleaner solution out there, but thought I'd write up my fix.&lt;/p&gt;

&lt;p&gt;The way that the ad network supplies the ad is for publishers to include a short snippet like this:&lt;/p&gt;

&lt;pre lang="html"&gt;
&amp;lt;script src="http://thirdparty.com/ad.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Within the ad javascript it does something like this (simplified for this example):
&lt;pre lang="javascript"&gt;
document.write("Click on this ad!");
&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Nice and simple to drop in to HTML, but our results page is built dynamically from an AJAX call that fetches JSON. At first I thought I could just built a new script tag and append it to the div I wanted, but that resulted in a blank page with just the ad in the DOM. I'm assuming that without an enclosing context that the &lt;tt&gt;document.write&lt;/tt&gt; is overwriting the root html node.&lt;/p&gt;

&lt;p&gt;Instead what worked was to temporarily override &lt;tt&gt;document.write&lt;/tt&gt; just before the ad is loaded and write the content of the ad into the DOM where I wanted. This works, but feels a bit evil. I'd be interested in finding a prettier solution than this.&lt;/p&gt;

&lt;pre lang="javascript"&gt;
var original_write = document.write;

// Re-assign doc.write while the ad is loaded.
document.write = function(ad_html) {
  // Append the contents of the ad to a special div.
  $('#my_ad_row').append(ad_html);

  // restore original write
  document.write = original_write; 
}
  
// Create a script element in the DOM to load the ad.
var e = document.createElement("script");
e.src = "http://thirdparty.com/ad.js";
e.type="text/javascript";
document.getElementsByTagName("head")[0].appendChild(e);
&lt;/pre&gt;

&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/lq8i11Xmg8Q" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/2009/04/dynamically-loading-javascript</feedburner:origLink></entry>
		
 
   
	 <entry>
	   <title>Rails i18n Talk at Boston.rb</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/s1IJ1VGufRI/rails-internationalization-bostonrb" />
	   <updated>2009-03-11T00:00:00-04:00</updated>
	   <id>http://graysky.org/2009/03/rails-internationalization-bostonrb</id>
	   <content type="html">&lt;p&gt;Last night I gave a talk at the &lt;a href="http://bostonrb.org/"&gt;Boston Ruby Group&lt;/a&gt; on lessons learned working to internationalization our Rails application. I don't claim to be a i18n (or Iñtërnâtiônàlizætiøn) guru, but have done my time in the trenches in Java-land and now in Rails. The good news is that the &lt;a href="http://guides.rubyonrails.org/i18n.html"&gt;i18n story has gotten much better with Rails 2.2&lt;/a&gt;, but there still are pitfalls and pain points. I gave an overview of i18n concerns, how Rails supports i18n and, of course, plugged my plugin, &lt;a href="/2009/03/translator-rails-i18n/"&gt;Translator&lt;/a&gt; that aims to make it a little simpler.&lt;/p&gt;

&lt;p&gt;The slides from the talk are below, &lt;a href="http://www.slideshare.net/graysky/rails-internationalization"&gt;on slideshare&lt;/a&gt; or &lt;a href="/public/rails_i18n_talk.pdf"&gt;in pdf format&lt;/a&gt;.&lt;/p&gt;

&lt;div class="slideshare-container"&gt;
&lt;div class="slideshare" id="__ss_1130834"&gt;&lt;a href="http://www.slideshare.net/graysky/rails-internationalization?type=presentation" title="Rails Internationalization"&gt;Rails Internationalization&lt;/a&gt;
&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=i18ntalk-090311080557-phpapp02&amp;rel=0&amp;stripped_title=rails-internationalization" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=i18ntalk-090311080557-phpapp02&amp;rel=0&amp;stripped_title=rails-internationalization" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/s1IJ1VGufRI" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/2009/03/rails-internationalization-bostonrb</feedburner:origLink></entry>
		
 
   
	 <entry>
	   <title>Translator - Rails i18n Simplifier</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/SN1b6f95Z-g/translator-rails-i18n" />
	   <updated>2009-03-09T00:00:00-04:00</updated>
	   <id>http://graysky.org/2009/03/translator-rails-i18n</id>
	   <content type="html">&lt;p&gt;Internationalization (&lt;a href="http://en.wikipedia.org/wiki/Internationalization"&gt;i18n&lt;/a&gt;) is one of those potentially necessary but not exactly thrilling tasks, so it is best when it is as simple as possible (related: I gave a &lt;a href="/2009/03/rails-internationalization-bostonrb/"&gt;recent talk at the Boston Ruby group on Rails i18n&lt;/a&gt;.) To that end I've made &lt;a href="http://github.com/graysky/translator/"&gt;Translator&lt;/a&gt;, a Rails plugin to simplify the i18n process. It is an extraction from what we've learned as we've been working to internationalize &lt;a href="http://www.snapmylife.com/"&gt;our Rails application&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So what does it do?&lt;/p&gt;

&lt;h5&gt;Automatic Scoping, or Keep Your Keys DRY&lt;/h5&gt;


&lt;p&gt;The first thing it does is make the process of finding keys in localized bundles easier. The &lt;a href=" http://api.rubyonrails.org/classes/I18n.html"&gt;I18n module&lt;/a&gt; introduced in Rails 2.2 is a great help but it hasn't (yet) been incorporated in a very &lt;em&gt;Rails-y&lt;/em&gt; way. Translator defines a convention for keys that follows a similar layout to a Rails project's &lt;tt&gt;app&lt;/tt&gt; folder. The benefit is that the code stays &lt;a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;DRY&lt;/a&gt; when fetching localized strings, saving precious typing. (Rails 2.3 recently added some &lt;a href=" http://guides.rubyonrails.org/2_3_release_notes.html#partial-scopingfor-translations"&gt;partial scoping for views&lt;/a&gt;.) An example, starting with the &lt;tt&gt;en.yml&lt;/tt&gt; that contains the strings for a fake blog app:&lt;/p&gt;

&lt;pre lang="ruby"&gt;
en:
  blog_posts: # controller
    show: # action
      title: "My Awesome Blog Post"
&lt;/pre&gt;


&lt;p&gt;The code to fetch the title string in the view is just &lt;tt&gt;t('title')&lt;/tt&gt; and Translator determines the implied scoping of &lt;tt&gt;"blog_posts.show"&lt;/tt&gt;. It provides the same automatic scoping for mailers, models, controllers and views.&lt;/p&gt;

&lt;h5&gt;Testing Help, or The Case of the Missing Key&lt;/h5&gt;


&lt;p&gt;When extracting boatloads of strings from view templates, mail templates, flash &amp;amp; validation error messages it is easy to make mistakes. The default handling for for a missing translation in a view is to add a span tag with a "missing translation" error message. A reasonable handling in production, but during development and testing it is better to find any missing translations early. Translator adds a &lt;tt&gt;strict_mode&lt;/tt&gt; that will fail any tests that encounter a missing translation, and it can be enabled for manually testing as well. Better to fail fast than find out later there was a typo in a key name.&lt;/p&gt;

&lt;p&gt;To help with forgetting to extract strings into locale bundles, Translator adds a &lt;tt&gt;pseudo_translate&lt;/tt&gt; mode that will make it obvious which strings did not come from a bundle. In &lt;tt&gt;pseudo_translate&lt;/tt&gt; mode every string from a bundle has a marker character prepended and appended to it. This makes it easy to quickly eyeball a page and see if anything isn't surrounded in brackets, like "[My Blog]". Also, this can be useful to see how a layout will look if localized to a more verbose language. German, for example, tends to use something like 30% more characters than English, so you could pad each string with 10 characters and see how the layout looks.&lt;/p&gt;

&lt;h5&gt;Graceful Locale Fallback, or No Hablo Espanol Hoy&lt;/h5&gt;


&lt;p&gt;Translator adds a simple locale fallback mechanism that will first try the set locale, say &lt;tt&gt;:de&lt;/tt&gt;, and if a string isn't found will fallback to the &lt;tt&gt;default_locale&lt;/tt&gt; set in I18n (&lt;tt&gt;:en&lt;/tt&gt; by default). This can bridge the gap between rolling out new site changes even if all the translations aren't ready for every language.&lt;/p&gt;

&lt;h5&gt;Finally&lt;/h5&gt;


&lt;p&gt;We've been using &lt;a href="http://github.com/graysky/translator/"&gt;Translator&lt;/a&gt; in production so it should be ready for others to use. If you do I'd be interested in feedback and suggestions. The &lt;a href="http://github.com/graysky/translator/"&gt;Github page&lt;/a&gt; has more detailed examples, &lt;a href="http://graysky.github.com/translator/rdoc/"&gt;RDocs&lt;/a&gt; and how to get started.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/SN1b6f95Z-g" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/2009/03/translator-rails-i18n</feedburner:origLink></entry>
		
 
   
	 <entry>
	   <title>Wordpress on OS X</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/N5WgCyzr0bo/wordpress-mac-os-x" />
	   <updated>2009-03-07T00:00:00-05:00</updated>
	   <id>http://graysky.org/2009/03/wordpress-mac-os-x</id>
	   <content type="html">&lt;p&gt;This here blog just got a facelift. The design had been feeling too busy and I wanted something cleaner and simpler. It remains to be seen whether this change will lead to me &lt;em&gt;actually&lt;/em&gt; posting more often. As part of creating a new theme I decided to setup a copy of my blog on my Mac for easier developing. The live version is hosted on an Ubuntu slice which makes it hard to easily edit, as well as &lt;a href="http://wordpress.org/"&gt;Wordpress&lt;/a&gt; only supporting one active theme at a time. And my blog has enough cruft that I wanted to test the new theme with real data, not just &lt;em&gt;lorem ipsum&lt;/em&gt; filler. These are the steps I followed to get it working, including a few wrinkles to be worked around:
&lt;ul&gt;&lt;/p&gt;

&lt;p&gt;&lt;li&gt;All the assets are stored in Git -- source control is your friend, after all. I cloned the git repo to &lt;tt&gt;~/Sites/graysky&lt;/tt&gt; where the stock OS X version of Apache will pick it up. To have Apache process the &lt;tt&gt;.htaccess&lt;/tt&gt; files that Wordpress typically uses I had to change 2 lines in &lt;tt&gt;httpd.conf&lt;/tt&gt;. For both Directory "/" and "/Library/WebServer/Documents" the &lt;tt&gt;AllowOverride None&lt;/tt&gt; option needs to be changed to &lt;tt&gt;AllowOverride All&lt;/tt&gt;. Next, in the users folder I edited my personal conf file with an entry like this to set up my site to respond to requests for "graysky.test" (more on that next.)&lt;/p&gt;

&lt;pre lang="bash"&gt;
&lt;VirtualHost *:80&gt;
  Options FollowSymLinks
  ServerName graysky.test 
  DocumentRoot /Users/mchampion/Sites/graysky
&lt;/VirtualHost&gt;
&lt;/pre&gt;


&lt;p&gt;&lt;li&gt;Open &lt;tt&gt;/etc/hosts&lt;/tt&gt; and a line to map 127.0.0.1 to "graysky.test". While it should work through using just an IP, I've found Wordpress works better if there is a true domain to match how it is configured. Make sure Apache is restarted through the command line or enabling "Web Sharing" in Preferences. Apache should now be ready to serve Wordpress locally.&lt;/p&gt;

&lt;p&gt;&lt;li&gt;Next, on the production site I took a backup of the MySQL database using something like &lt;tt&gt;mysqldump --add-drop-table &gt; blog.sql&lt;/tt&gt; and stored the .sql file in git as well for save keeping. Before importing it, I opened it and did a blog replace of "graysky.org" with "graysky.test" for the local environment. While it should be possible to change the domain name from Wordpress itself, I found it was troublesome because it kept redirecting me to the actual "graysky.org" since that is what it thought it was serving. Finally import the sql file into MySQL after creating the correct database and appropriate user with privileges.&lt;/p&gt;

&lt;p&gt;The last hurdle was changing &lt;tt&gt;wp-config.php&lt;/tt&gt; to handle a difference in where PHP-MySQL searches for the sock file.&lt;/p&gt;

&lt;pre lang="php"&gt;
// For OSX (development)
if ('graysky.test' == $_SERVER['SERVER_NAME']) {
  define('DB_HOST', 'localhost:/var/run/mysqld/mysqld.sock');
}
else {
  // Normal linux install (production)
  define('DB_HOST', 'localhost');
}
&lt;/pre&gt;


&lt;p&gt;&lt;li&gt;After I tweaked fonts and color schemes, I checked in my new theme to git and it was just a matter of &lt;tt&gt;git push&lt;/tt&gt; from my Mac, a &lt;tt&gt;git pull&lt;/tt&gt; on Linux and activating the theme. And voilà, the blog has a new look!&lt;/p&gt;

&lt;p&gt;&lt;/ul&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/N5WgCyzr0bo" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/2009/03/wordpress-mac-os-x</feedburner:origLink></entry>
		
 
   
	 <entry>
	   <title>Shepard Fairy "Supply &amp; Demand"</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/M73z9zdrRcU/tufts-shepard-fairy" />
	   <updated>2009-02-26T00:00:00-05:00</updated>
	   <id>http://graysky.org/2009/02/tufts-shepard-fairy</id>
	   <content type="html">&lt;div class="flickr-frame"&gt;
&lt;a href="http://www.flickr.com/photos/downtree/3285653871/" title="Shepard Fairy Mural at Tufts"&gt;&lt;img src="http://farm4.static.flickr.com/3292/3285653871_0efdb079df.jpg" width="500" height="216" alt="Shepard Fairy Mural at Tufts" class="flickr-photo" /&gt;&lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;We recently went to the &lt;a href="http://www.icaboston.org/"&gt;Institute of Contemporary Art&lt;/a&gt; to see the &lt;a href="http://obeygiant.com/"&gt;Shepard Fairy&lt;/a&gt; exhibit, "Supply &amp;amp; Demand". He is best known for his iconic &lt;a href="http://obeygiant.com/headlines/obama"&gt;Obama "Hope"&lt;/a&gt; image, and made headlines for being &lt;a href="http://www.boston.com/news/local/massachusetts/articles/2009/02/07/obama_hope_poster_artist_arrested_in_boston/"&gt;arrested by the Boston police for vandalism warrants&lt;/a&gt;. I'd been aware of some of his work - the "Andre Has a Posse", the &lt;a href="http://en.wikipedia.org/wiki/Mozilla"&gt;red Mozilla.org dinosaur logo&lt;/a&gt; -- but didn't know they were from one artist.&lt;/p&gt;

&lt;div class="flickr-frame flickr-float-right"&gt;&lt;a href="http://www.flickr.com/photos/downtree/3286481690/" title="Obey at Tufts"&gt;&lt;img src="http://farm4.static.flickr.com/3542/3286481690_53c3835feb_m.jpg" width="160" height="240" alt="Obey at Tufts" class="flickr-photo-right"/&gt;&lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;I've found I really like the borrowed style of &lt;a href="http://en.wikipedia.org/wiki/Constructivism_(art)"&gt;Constructivist&lt;/a&gt; and propaganda art, and Fairey nails that. In particular, there is one room of the exhibit that features several huge paintings &amp;amp; a wall of smaller works that was amazing. That alone made the visit it worth it (plus I like the ICA building itself.) The exhibit also features a series of portraits that were not as engaging, except for the striking Obama portrait. Overall, I agreed with &lt;a href="http://www.newyorker.com/arts/critics/artworld/2009/02/23/090223craw_artworld_schjeldahl?printable=true"&gt;recent New Yorker review&lt;/a&gt; that salutes his design more than a unifying message of the work. (Also, my inner-Holden-Caulfield gets triggered when I'm looking at capitalist-questioning art that certainly sells for a lot and that everyone has paid at least $12 to see. Or that it is street art that was often put up without permission but now has large signs next to it forbidding photography of it.)&lt;/p&gt;

&lt;p&gt;Fairey has &lt;a href="http://www.tuftsdaily.com/popular_artist_creates_mural_on_campus"&gt;installed several murals around Boston&lt;/a&gt;, including at Tufts University. I took a trip over to Somerville to my old stomping grounds to take a few shots of it.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/M73z9zdrRcU" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/2009/02/tufts-shepard-fairy</feedburner:origLink></entry>
		
 
   
	 <entry>
	   <title>Pseudo Cursors in Rails</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/kx-46DtEFBo/pseudo-cursors-rails" />
	   <updated>2009-02-23T00:00:00-05:00</updated>
	   <id>http://graysky.org/2009/02/pseudo-cursors-rails</id>
	   <content type="html">&lt;p&gt;This morning &lt;a href="http://twitter.com/d2h/status/1240490606"&gt;DHH twittered&lt;/a&gt; about adding &lt;a href=" http://github.com/rails/rails/blob/d13623ca46c82120c398f4634e206422fc3ad7ea/activerecord/lib/active_record/batches.rb"&gt;"batch find"&lt;/a&gt; to ActiveRecord in 2.3. Mike Gunderloy has a &lt;a href="http://afreshcup.com/2009/02/23/rails-23-batch-finding/"&gt;good explanation of how batch finding can be used&lt;/a&gt;. Definitely a nice improvement, but there is perhaps a better alternative already out there.&lt;/p&gt;

&lt;p&gt;Stepping back, one of the attractive aspects to Rails is the simple abstraction it wraps around the database. It works beautifully until the &lt;a href="http://www.joelonsoftware.com/articles/LeakyAbstractions.html"&gt;abstraction leaks&lt;/a&gt; and you're left wondering why your code is running slow and Mongrel is chewing up memory.  The problem is the same query that used to find 500 rows now find 50,000 and pulling in that many records will fill the available memory and slow everything down. So you hack up something with limits &amp;amp; offsets or borrow Jamis Buck's trick for &lt;a href="http://weblog.jamisbuck.org/2007/4/6/faking-cursors-in-activerecord"&gt;fast MySQL "cursors"&lt;/a&gt; to get things working again. (And hopefully think about whether it might be better moved to an &lt;a href="http://axonflux.com/building-and-scaling-a-startup "&gt;offline queue&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;Another solution is the handy &lt;a href="http://rubyforge.org/projects/pseudocursors/"&gt;pseudo cursors&lt;/a&gt; plugin. It has been around a while but has never appeared to get much attention. It adds a single &lt;tt&gt;find_each&lt;/tt&gt; method that behaves like the usual &lt;tt&gt;find&lt;/tt&gt; except of returning an array it takes a block that yields for each record.  An example:&lt;/p&gt;

&lt;pre lang="ruby"&gt;
User.find_each(:conditions =&gt; ["created_at &gt; ?", 3.weeks.ago]) do |user|
  user.send_welcome_message!
end
&lt;/pre&gt;


&lt;p&gt;Under the hood it executes the query like normal, except that it only fetches the ids of the records. Even for a very large dataset having just the ids in memory is acceptable. Then in batches it requests the full state of the records and yields them. One advantage over the new "batch" methods is that pseudo cursors supports normal &lt;tt&gt;:order&lt;/tt&gt; clause. And it can be easily chained with other scopes like &lt;tt&gt;BlogPost.recent.find_each(:conditions =&gt; "views &gt; 100", :order =&gt; "created_at DESC", :include =&gt; [:comments])&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;A while back I pulled this plugin (which is stable but not actively developed) &lt;a href="http://github.com/sml/pseudo_cursors/tree/master"&gt;to Github for easier hacking&lt;/a&gt;. I made one enhancement to have it honor the &lt;tt&gt;:include&lt;/tt&gt; option for eager loading associations.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/kx-46DtEFBo" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/2009/02/pseudo-cursors-rails</feedburner:origLink></entry>
		
 
   
	 <entry>
	   <title>Breville Kettle &amp; Good Design</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/PJj6S8uqGBY/breville-electric-kettle" />
	   <updated>2009-01-18T00:00:00-05:00</updated>
	   <id>http://graysky.org/2009/01/breville-electric-kettle</id>
	   <content type="html">&lt;div class="flickr-frame flickr-float-right"&gt;&lt;a href="http://www.flickr.com/photos/downtree/2268719253/" title="Fancy Pants Kettle"&gt;&lt;img src="http://farm3.static.flickr.com/2395/2268719253_58f82068fc_m.jpg" width="160" height="240" alt="Fancy Pants Kettle" class="flickr-photo-right"/&gt;&lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Having just watched &lt;a href="http://www.objectifiedfilm.com/objectified-trailer/"&gt;the trailer for &lt;i&gt;Objectified&lt;/i&gt;&lt;/a&gt; I was thinking about a device I enjoy everyday largely because of its design, our &lt;a href="http://www.amazon.com/gp/product/B000A790X6/graysky-20"&gt;Breville SK500XL Ikon Electric Kettle&lt;/a&gt;. In terms of functionality it does little beyond a normal tea kettle -- sure, it is a bit faster to heat up and will automatically turn itself off, but that hardly justifies the cost. Instead it is among a handful of devices where the satisfaction from using it far exceeds the the pure capabilities of the thing. Another example in this select group is the &lt;a href="https://www3.tivo.com/store/merchandise.do"&gt;Tivo Premium remote&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The kettle has a pleasant look, done in stainless steel with a sturdy, black handle and blue backlight to show how much water is in it. The weight distribution feels right, even when very full, and the size of the mouth makes it easy to pour. But any list of features and specific design elements misses the overall feeling one gets from using a device, since it is people that assign attitudes &amp;amp; tastes to inanimate objects. Perhaps I'm positively biased because the Breville kettle is part of my daily coffee addiction, but it is rare to find a gadget that so nicely fulfills its function.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/PJj6S8uqGBY" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/2009/01/breville-electric-kettle</feedburner:origLink></entry>
		
 
   
	 <entry>
	   <title>Proxying a Subdomain in Apache</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/pwmCIcNkHUA/proxy-apache-subdomain" />
	   <updated>2009-01-07T00:00:00-05:00</updated>
	   <id>http://graysky.org/2009/01/proxy-apache-subdomain</id>
	   <content type="html">&lt;p&gt;I recently moved a project to the latest &amp;amp; greatest in Rails deployment configurations, &lt;a href="http://www.modrails.com"&gt;mod_rails&lt;/a&gt;. Overall I've pleased with simplicity of the setup, the memory savings and tools like &lt;code&gt;passenger-memory-stats&lt;/code&gt;, especially for a &lt;a href="http://whoshouldifollow.com/"&gt;small project&lt;/a&gt; on a not-too-beefy instance. With mod_rails comes Apache, which can do everything. But, perhaps for that exact reason, it can be more complicated to do the simple things than with &lt;a href="http://www.lighttpd.net/"&gt;lighty&lt;/a&gt; or &lt;a href="http://wiki.codemongers.com/Main"&gt;nginx&lt;/a&gt;. The answer is often to use &lt;a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html"&gt;mod_rewrite&lt;/a&gt; which is like a Swiss Army knife -- but have you ever tried to cut anything with the saw on that thing? Not so easy.&lt;/p&gt;

&lt;p&gt;That is a long way of saying it took me longer than I thought it should have to figure out to proxy a certain request in Apache. I'm not an Apache expert, so maybe someone will point a better way of doing this (which would be great). Since it took me much googling and experimenting, I thought I'd post this for the next person to come along.&lt;/p&gt;

&lt;p&gt;My setup has a main site running Rails on the primary domain, say "foo.com", and a subdomain, "sub.foo.com", that proxies to a backend server running Jetty. The responses from Jetty should go directly to the client. Here's the section from my httpd.conf that makes it happen:&lt;/p&gt;

&lt;pre lang="bash"&gt;
&lt;VirtualHost *:80&gt;
  # usual setup for Rails ...
  ServerName foo.com
  ServerAlias www.foo.com
  DocumentRoot /var/www/foo/current/public
 
  # Proxy requests to sub.foo.com to Jetty running locally
  #
  # typically turned off for reverse proxy according to apache docs
  ProxyRequests Off
  # If turned off, url written in browser to "http://localhost:9091/blah"
  ProxyPreserveHost On
  
  &lt;Proxy&gt;
     Order deny,allow
     Allow from localhost
  &lt;/Proxy&gt;

  RewriteEngine   on
  
  # Rewrite requests if domain matches. 
  RewriteCond %{HTTP_HOST} ^sub\.foo\.com$
  # Forward entire request URI to server. The "[P]" is for proxy!
  RewriteRule (.*) http://localhost:9091$1 [P]
&lt;/VirtualHost&gt;
&lt;/pre&gt;

&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/pwmCIcNkHUA" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/2009/01/proxy-apache-subdomain</feedburner:origLink></entry>
		
 
   
	 <entry>
	   <title>Favorite Albums of 2008</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/3aP2Jzhamaw/favorite-albums-2008" />
	   <updated>2008-12-31T00:00:00-05:00</updated>
	   <id>http://graysky.org/2008/12/favorite-albums-2008</id>
	   <content type="html">&lt;p&gt;Like &lt;a href="http://graysky.org/2007/12/top-ten-albums-2007/"&gt;last year&lt;/a&gt;, I put together a quasi-objective list of my favorite music of 2008. The list is based largely on what I actually listened to (via iTunes playcounts) rather than what I &lt;em&gt;wished&lt;/em&gt; I listened to. This year had several followup albums that were mildly disappointing compared to how much I liked previous albums, from the likes of Death Cab, The Hold Steady and Kings of Leon. Still some good finds, but like with this year's movies, overall not the best year in recent memory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honorable Mentions:&lt;/strong&gt; Gaslight Anthem's &lt;a href="http://www.amazon.com/dp/B001DWXUWY/ref=nosim?tag=graysky-20"&gt;&lt;em&gt;The '59 Sound&lt;/em&gt;&lt;/a&gt; is straightforward, and perhaps not very interesting, but enjoyable. I've liked Okkervil River's &lt;a href="http://www.amazon.com/dp/B001F5I2Y0/ref=nosim?tag=graysky-20"&gt;&lt;em&gt;The Stand Ins&lt;/em&gt;&lt;/a&gt; but haven't loved it the way I did &lt;em&gt;The Stage Names&lt;/em&gt;. I came across Bon Iver's &lt;a href="http://www.amazon.com/dp/B0013IKUIK/ref=nosim?tag=graysky-20"&gt;&lt;em&gt;For Emma, Forever Ago&lt;/em&gt;&lt;/a&gt; only recently, but it has been getting heavy rotation recently as &lt;a href="http://en.wikipedia.org/wiki/Bon_Iver"&gt;"good winter"&lt;/a&gt; music.

&lt;ul&gt;
&lt;li&gt;M83, &lt;a href="http://www.amazon.com/dp/B0016CS0IK/ref=nosim?tag=graysky-20"&gt;&lt;em&gt;Saturdays=Youth&lt;/em&gt;&lt;/a&gt; - expansive, synth-driven wouldn't usually be my thing, but makes for great life-soundtrack music.

&lt;li&gt;Kanye West, &lt;a href="http://www.amazon.com/dp/B001L99XQQ/ref=nosim?tag=graysky-20"&gt;&lt;em&gt;808s &amp; Heartbreak&lt;/em&gt;&lt;/a&gt; - surprisingly melancholy &amp; atmospheric for Kanye, but it works (even with the overused &lt;a href="http://en.wikipedia.org/wiki/Auto-Tune"&gt;auto-tune effect&lt;/a&gt;). At least as a studio album, his performance on SNL was less than amazing.

&lt;li&gt;Tilly &amp; the Wall, &lt;a href="http://www.amazon.com/dp/B001D5043O/ref=nosim?tag=graysky-20"&gt;&lt;em&gt;o&lt;/em&gt;&lt;/a&gt; - sure they likely appeal to 15-year-old crowd and were even featured on the &lt;em&gt;90210&lt;/em&gt; remake, but I can't help tapping along with songs like &lt;a href="http://hypem.com/track/629736/Tilly+And+The+Wall-I+Found+You"&gt;"I Found You"&lt;/a&gt;.

&lt;li&gt;Raconteurs, &lt;a href="  http://www.amazon.com/dp/B0016CQCMQ/ref=nosim?tag=graysky-20"&gt;&lt;em&gt;Consolers Of The Lonely&lt;/em&gt;&lt;/a&gt; - solid, well-built rock and I like the layering and instrumentation.

&lt;li&gt;Cut Copy, &lt;a href="http://www.amazon.com/dp/B0017I7390/ref=nosim?tag=graysky-20"&gt;&lt;em&gt;In Ghost Colours&lt;/em&gt;&lt;/a&gt; - again, I would not have though more synth-pop would end up as one of my favorite albums. However songs like "Strangers in the Wind" are infectious and even the more clubby tracks like "Lights &amp; Music" are fun.

&lt;li&gt;Beck, &lt;a href=" http://www.amazon.com/dp/B001BW1SZC/ref=nosim?tag=graysky-20"&gt;Modern Guilt&lt;/a&gt; - the album has a throw-back sound that makes it feel of a skinny-tie era. Made for an infectious summer soundtrack. 

&lt;li&gt;Sigur Rós, &lt;a href="http://www.amazon.com/dp/B001AGHC1I/ref=nosim?tag=graysky-20"&gt;&lt;em&gt;Með suð í eyrum við spilum endalaust&lt;/em&gt;&lt;/a&gt; - my favorite Sigur Rós album in a few years thanks to the dynamic range on songs like "Vid spilum endalaust" and "Gobbledigook".

&lt;li&gt;Vampire Weekend, &lt;a href="http://www.amazon.com/dp/B0011BGY66/ref=nosim?tag=graysky-20"&gt;&lt;em&gt;Vampire Weekend&lt;/em&gt;&lt;/a&gt; - over-hyped but it is certainly an enjoyable 31 minutes of college rock.

&lt;li&gt;Girl Talk, &lt;a href="http://www.amazon.com/dp/B001ELBVLG/ref=nosim?tag=graysky-20"&gt;&lt;em&gt;Feed the Animals&lt;/em&gt;&lt;/a&gt; - lots has been &lt;a href="http://www.pitchforkmedia.com/article/record_review/51537-girl-talk-feed-the-animals"&gt;written about this album&lt;/a&gt;, but when it works it is greater than the sum of its samples. At times it can be distracting when I'm trying to &lt;a href="http://waxy.org/2008/09/girl_turk/"&gt;identify all the references&lt;/a&gt;.

&lt;li&gt;Fleet Foxes, &lt;a href="http://www.amazon.com/dp/B001A3AA0G/ref=nosim?tag=graysky-20"&gt;&lt;em&gt;Fleet Foxes&lt;/em&gt;&lt;/a&gt; - a beautiful and uniquely blended sound, perfect for Sunday mornings with a cup of coffee and laptop open to a "newspaper".
&lt;/ul&gt;

&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/3aP2Jzhamaw" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/2008/12/favorite-albums-2008</feedburner:origLink></entry>
		
 
   
	 <entry>
	   <title>Farewell tourb.us</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/NmbTrfWGsaI/tourbus" />
	   <updated>2008-12-28T00:00:00-05:00</updated>
	   <id>http://graysky.org/2008/12/tourbus</id>
	   <content type="html">&lt;div class="flickr-frame"&gt;
&lt;img src="http://graysky.org/images/tourbus.png" width="286" height="81" alt="tourb.us" title="tourb.us" class="flickr-photo"/&gt;
&lt;/div&gt;


&lt;p&gt;It is finally time to pull the plug on &lt;a href="http://tourb.us"&gt;tourb.us&lt;/a&gt;, a concert tracker &lt;a href="http://twitter.com/gary"&gt;Gary Elliott&lt;/a&gt; and I launched in 2006. The site has been on auto-pilot for quite some time, but until recently was still at least useful at sending notifications about upcoming shows. Now the number of shows it finds has fallen too low to justify keeping it running.&lt;/p&gt;

&lt;p&gt;So it goes.&lt;/p&gt;

&lt;p&gt;Although tourb.us never gained the traction we'd hoped, it was successful in ways I hadn't anticipated. The project began as a side project in 2005 -- back when people used the phrase "web 2.0" without much irony or a grimace -- to solve a simple problem of knowing when bands are playing nearby. Developing the site introduced me to &lt;a href="http://www.rubyonrails.org"&gt;Ruby on Rails&lt;/a&gt;. Sharing all the responsibilities from design to marketing to user support taught me a ton. Beginning with &lt;a href="http://www.paulgraham.com"&gt;Paul Graham's&lt;/a&gt; first &lt;a href="http://startupschool.org/"&gt;Startup School&lt;/a&gt; it lead to meeting a bunch of interesting, like-minded people around Boston. Not to mention receiving several job offers, a surreal, all-expenses-paid trip to L.A.,  and some other unique experiences. So I remain bullish on side projects.&lt;/p&gt;

&lt;p&gt;Have no fear, there are still plenty of concert trackers out there. A quick list includes &lt;a href="http://www.tourfilter.com"&gt;Tourfilter&lt;/a&gt;, &lt;a href="http://last.fm"&gt;Last.fm&lt;/a&gt;, &lt;a href="http://sonicliving.com"&gt;SonicLiving&lt;/a&gt;, &lt;a href="http://www.songkick.com/"&gt;Songkick&lt;/a&gt;, &lt;a href="http://www.bandsintown.com"&gt;Bandsintown&lt;/a&gt;, &lt;a href="http://www.ilike.com"&gt;iLike&lt;/a&gt;, &lt;a href="http://www.iconcertcal.com/"&gt;iConcertCal&lt;/a&gt;, &lt;a href="http://www.jambase.com"&gt;JamBase&lt;/a&gt;, &lt;a href="http://www.ontour.net/"&gt;OnTour&lt;/a&gt;, &lt;a href="http://track50.com/"&gt;track50&lt;/a&gt;, &lt;a href="http://www.eventful.com"&gt;Eventful&lt;/a&gt;/&lt;a href="http://upcoming.org"&gt;Upcoming&lt;/a&gt;/&lt;a href="http://zvents.com"&gt;Zvents&lt;/a&gt;, &lt;a href="http://www.ticketmaster.com"&gt;TicketMaster&lt;/a&gt;/&lt;a href="http://www.livenation.com"&gt;LiveNation&lt;/a&gt; and likely &lt;a href="http://rocketsurgeon.squarespace.com/articles/2007/6/1/concert-20-12-personalized-concert-listing-tools.html"&gt;more&lt;/a&gt;. I'm not sure which one(s) I'll use yet, and have been kicking the tires on several. For me, the most important factors are the concert coverage and how easy it is to keep my list of bands up-to-date (preferably with a Last.fm integration since I scrobble my iTunes listening.) But I might be just a &lt;em&gt;tiny bit&lt;/em&gt; biased toward wanting a particular set of features.&lt;/p&gt;

&lt;p&gt;A big thanks to those who have made building &amp;amp; running tourb.us such a great experience.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/NmbTrfWGsaI" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/2008/12/tourbus</feedburner:origLink></entry>
		
 
   
	 <entry>
	   <title>Creative Commons Discussion</title>
	   <link href="http://feedproxy.google.com/~r/graysky/~3/DAP7YJaueJQ/creative-commons-larry-lessig" />
	   <updated>2008-12-13T00:00:00-05:00</updated>
	   <id>http://graysky.org/2008/12/creative-commons-larry-lessig</id>
	   <content type="html">&lt;div class="flickr-frame"&gt;
&lt;a href="http://www.flickr.com/photos/downtree/3103330717/" title="The Commons"&gt;&lt;img src="http://farm4.static.flickr.com/3001/3103330717_1ab6bab853.jpg" width="500" height="333" alt="The Commons" class="flickr-photo" /&gt;&lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Tonight the &lt;a href="http://cyber.law.harvard.edu/events/2008/12/creativecommons"&gt;Creative Commons&lt;/a&gt; held a panel discussion entitled "Celebrating Accomplishments, Discerning Futures" hosted by the &lt;a href="http://cyber.law.harvard.edu/"&gt;Berkman Center&lt;/a&gt; at Harvard (&lt;a href="http://flickr.com/photos/downtree/sets/72157611123386381/"&gt;photos&lt;/a&gt;). The panel, consisting of Larry Lessig, Jamie Boyle,  Joi Ito, Molly Van Houweling, shared some stories from the early days of the CC when they were deciding how they wanted to promote easier sharing - would it be a central repository, what type of licenses would be available, how would it grow beyond the U.S., etc. In addition to the anecdotes, there were several parts I found interesting:&lt;/p&gt;

&lt;div class="flickr-frame flickr-float-right"&gt;
&lt;a href="http://www.flickr.com/photos/downtree/3103323611/" title="Larry Lessig"&gt;&lt;img src="http://farm4.static.flickr.com/3072/3103323611_5981f6f44e_m.jpg" width="160" height="240" alt="Larry Lessign" class="flickr-photo-right" /&gt;&lt;/a&gt;
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Joi Ito mentioned &lt;a href="http://wiki.creativecommons.org/RDFa"&gt;RDFa&lt;/a&gt; as a way to build CC metadata into xhtml/xml for content discovery. Sounded like a possible way to deliver on the "machine" part of the "human", "legal", "machine" versions of Creative Common licenses. (With the caveat that I'm always skeptical of semantic web projects, but hope to be wrong.) There is a microformat, &lt;a href="http://wiki.creativecommons.org/RelLicense"&gt;RelLicense&lt;/a&gt;, that seems potentially useful but I'm not sure if it could indicate that it should be attached to linked media (an mp3, for example) that is not the current URI. 

&lt;li&gt;Another point made was the effective way to get people to care about the CC is by lowering the barriers to sharing. Simply trying to convince people that they should license content in an open way often falls on deaf ears, unless it solves a problem they are facing. And when asked about commercial publishers Ito said (if I remember correctly) they were more likely swayed by seeing that opening up content lead to making more money or being more effective, and gave an example of mangas in Japan being remixed &amp; re-released.

&lt;li&gt;The discussion left me thinking about how much for granted I take it in the software world that there are the mechanisms (GPL, APL), tools (code hosting) and social norms (OSS contributions are respected) for producing  open software. That in so many other arenas there is far less history of appreciating the "option value" of openness and the possibilities that come from that freedom. 
&lt;/ul&gt;

&lt;img src="http://feeds.feedburner.com/~r/graysky/~4/DAP7YJaueJQ" height="1" width="1"/&gt;</content>
	 <feedburner:origLink>http://graysky.org/2008/12/creative-commons-larry-lessig</feedburner:origLink></entry>
		
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
   
 
 
</feed>
