<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Workin' on it.</title>
	<atom:link href="http://jameshalberg.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://jameshalberg.com</link>
	<description></description>
	<lastBuildDate>Mon, 01 Mar 2010 03:02:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='jameshalberg.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/d6a237c3e92002b1021b5a1e47cc6c99?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>Workin' on it.</title>
		<link>http://jameshalberg.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://jameshalberg.com/osd.xml" title="Workin' on it." />
	<atom:link rel='hub' href='http://jameshalberg.com/?pushpress=hub'/>
		<item>
		<title>MySQL Triggers w/Rails</title>
		<link>http://jameshalberg.com/2010/02/28/mysql-triggers-wrails/</link>
		<comments>http://jameshalberg.com/2010/02/28/mysql-triggers-wrails/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 02:54:24 +0000</pubDate>
		<dc:creator>Jim</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Test Driven Development (TDD)]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[triggers]]></category>

		<guid isPermaLink="false">http://jameshalberg.com/?p=391</guid>
		<description><![CDATA[I recently incorporated db-triggers with a Rails app to maintain some counts that were otherwise fairly expensive to retrieve.  Rails wasn&#8217;t super-pumped about the idea (what with the &#8220;keep all the logic in the app&#8221; approach and all), but sometimes&#8230; you know&#8230; you know better than your framework. Some things I was aiming for: Set them [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=391&subd=jameshalberg&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I recently incorporated db-triggers with a Rails app to maintain some counts that were otherwise fairly expensive to retrieve.  Rails wasn&#8217;t super-pumped about the idea (what with the &#8220;keep all the logic in the app&#8221; approach and all), but sometimes&#8230; you know&#8230; you know better than your framework.</p>
<p>Some things I was aiming for:</p>
<ol>
<li>Set them up with normal migrations.</li>
<li>Test them with the normal test suite/normal fixtures.</li>
<li>Make recovery/reset simple for when the table (inevitably) is somehow out of sync.</li>
</ol>
<p><strong>The &#8220;frequent counts&#8221; table</strong></p>
<p>I&#8217;ll have multiple counts but not TOO many &#8212; enough that I don&#8217;t want to have a column per count but not enough that I mind using &#8220;LIKE&#8221; to lookup patterns, so my table has: id, code, current_count.</p>
<p>Code will be a unique key (important later) and be formatted like &#8220;style_ABC_size_456&#8243;.</p>
<p>So, when a new item is added it&#8217;ll be associated with a style and some sizes &#8211; each combination will either need to be setup (with a current_count = 1) or an existing combo will be found and +=1.</p>
<p>The FrequentCount class has the fairly straightforward finders that you&#8217;d expect + methods to reset each of the counts that it contains.  The reset methods follow the pattern &#8220;reset_frequent_count_COUNT_NAME&#8221; -&gt; they clear the existing counts that they maintain before repopulating them.</p>
<p>I also threw in a reset_all method that looks for anything on the class following the &#8220;reset_frequent_count_COUNT_NAME&#8221; pattern and runs them.</p>
<p><strong>The trigger-SQL</strong></p>
<p>The SQL for creating the triggers will be needed by the migration as well as the test suite.  In fact, the test suite will need to run them somewhat often due to the way the standard tests &#8221;prepare&#8221; the database.</p>
<p>I ended up throwing it in lib/trigger_sql.rb.  Methods there are named with the pattern &#8220;sql_for_TABLE_OPERATION_TRIGGER_NAME&#8221; ex: sql_for_items_insert_style_and_size</p>
<div id="_mcePaste">Many of the triggers could not rely on pre-existing rows.  i.e. a new style/size combination needs to INSERT where an existing combo could update ( +=1 ).  To get around this, I relied on the unique key setup earlier on the &#8220;code&#8221; field for the frequent counts table.  &lt;&#8211; that allowed me to lean on insert statements with &#8220;ON DUPLICATE KEY&#8221; clauses with update statements.  Something like this&#8230;</div>
<blockquote style="margin:25px 0;">
<div>create trigger items_insert_style_and_size after insert on items<br />
for each row<br />
begin<br />
insert into frequent_counts(code, current_count)<br />
values (concat(&#8216;style_&#8217;, new.style, &#8216;_size_&#8217;, new.size), 1)<br />
on duplicate key update current_count = current_count + 1;<br />
end;</div>
</blockquote>
<div><strong><span style="font-weight:normal;"><strong>The Migration</strong></p>
<div id="_mcePaste">I&#8217;ve already given away most of the fun stuff about the migration.  It just needs to run through the triggers that are being setup at this specific time, doing things like:</div>
<blockquote style='margin:25px 0;'>
<div>TriggerSql.connection.execute(TriggerSql.sql_for_items_insert_items_by_style_and_size)</div>
</blockquote>
<div>and then make sure to populate it all (with that reset_all) method when we&#8217;re done. &lt;&#8211; next time out I may want to call specific methods to reset just the ones I care about but this first time, I can just do the whole table.</div>
<div></div>
<p></span></strong></div>
<div><strong>Testing with Fixtures</strong></div>
<div>Rails goes a little too far when running the default test tasks for us &#8211; it ends up nuking the triggers on us, but not to fear: it&#8217;s a quick hack in the Rakefile.</div>
<div></div>
<div>I&#8217;m going to spare you some details (drop me a line if you want them) but I basically overrode the db:test:prepare method to call a special version of the clone_structure task.  My version has a dependent task that does:</div>
<blockquote style='margin:25px 0;'>
<div>
<div># find methods that follow our pattern of &#8220;methods providing trigger sql&#8221; and execute the contents of each</div>
<div>TriggerSql.methods.select{ |m| m =~ /sql_for_.+/ }.each do |method_name|</div>
<div>ActiveRecord::Base.connection.execute(TriggerSql.send(method_name))</div>
<div>end</div>
</div>
</blockquote>
<div>As you see there, it&#8217;s leaning on that naming convention &#8220;sql_for_TABLE_OPERATION_TRIGGER_NAME&#8221; to find the sql to (re)apply.</div>
<div></div>
<div style='margin-top:10px;'><strong>That&#8217;s it!</strong></div>
<div>Migrations set them up and share the code to do so with the fixtures that can repeat the tests whenever we need.  Those reset methods also come in handy not only for the initial population (by the migration) but we can call them manually should we need them.</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jameshalberg.wordpress.com/391/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jameshalberg.wordpress.com/391/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jameshalberg.wordpress.com/391/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jameshalberg.wordpress.com/391/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jameshalberg.wordpress.com/391/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jameshalberg.wordpress.com/391/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jameshalberg.wordpress.com/391/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jameshalberg.wordpress.com/391/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jameshalberg.wordpress.com/391/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jameshalberg.wordpress.com/391/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=391&subd=jameshalberg&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://jameshalberg.com/2010/02/28/mysql-triggers-wrails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jameshalberg</media:title>
		</media:content>
	</item>
		<item>
		<title>Friend&#8217;s Price</title>
		<link>http://jameshalberg.com/2009/11/25/friends-price/</link>
		<comments>http://jameshalberg.com/2009/11/25/friends-price/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 06:56:18 +0000</pubDate>
		<dc:creator>Jim</dc:creator>
				<category><![CDATA[Recommended Sites]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[heroku]]></category>

		<guid isPermaLink="false">http://jameshalberg.com/?p=377</guid>
		<description><![CDATA[A friend was asking the other day about getting a little site up and running for his small business.  Seems like the scope is going to be quite small (famous last words) and there are a few things I&#8217;ve been meaning to checkout lately, so I think I&#8217;m going to give it a stab. Night [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=377&subd=jameshalberg&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>A friend was asking the other day about getting a little site up and running for his small business.  Seems like the scope is going to be quite small (famous last words) and there are a few things I&#8217;ve been meaning to checkout lately, so I think I&#8217;m going to give it a stab.</p>
<p>Night one went something like this:</p>
<p>I got an invite (did they do invites?) to checkout <a href="http://heroku.com/">Heroku</a> really early on.  At the time, I remember devoting a night to it &#8211; working with an online editor (or maybe I was ssh&#8217;d in with vi or something?) and basically just getting a little &#8220;Hello World&#8221; up and running.  Ever since bumping into <a href="http://www.writebetterbits.com/2009/10/picture-downloader-small-study-in.html">Jim Fiorato&#8217;s app/case study</a> the other day, I&#8217;ve been meaning to revisit a bit.</p>
<p>It&#8217;s entirely likely that the friend&#8217;s site will actually not need anything but static HTML, but hey: I can always tune the caching and free hosting can&#8217;t be argued with, right?</p>
<p>So, I opened an account out at herku.com and grabbed the heroku gem; installed git (officially taking me off the short list of people that still hadn&#8217;t given it a chance) and set to work on getting my app out there.</p>
<p>I hadn&#8217;t written anything, so I was just wanting to throw the &#8220;welcome to Rails&#8221; app out there to make sure everything was setup correctly.  The first bump was some fun with SSH keys.  I&#8217;m actually still not sure exactly what the issue was but there seemed to be some commands that were respecting the path to the key that I had setup but some others that seemed to be looking in the default location (~/.ssh).  I am actually thinking now that I probably could have got around it with a little more effort put into the config but I ended up just using the default key location &#8212; no probs after that.</p>
<p>At that point + some very simple/standard Rails app config, it was incredibly early to push the app out there, setup a few tables (via migrations) and get to work.</p>
<p>A little effort into a pretty basic layout and we&#8217;re underway.  It&#8217;s nothing spectacular to checkout at the moment &#8211; generic copy, placeholder colors/blocks and text&#8230; but someday it&#8217;ll be a star.</p>
<p style="text-align:center;"><a href="http://jameshalberg.files.wordpress.com/2009/11/firstpass.png"><img class="aligncenter size-full wp-image-384" title="firstpass" src="http://jameshalberg.files.wordpress.com/2009/11/firstpass.png?w=500&#038;h=299" alt="" width="500" height="299" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jameshalberg.wordpress.com/377/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jameshalberg.wordpress.com/377/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jameshalberg.wordpress.com/377/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jameshalberg.wordpress.com/377/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jameshalberg.wordpress.com/377/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jameshalberg.wordpress.com/377/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jameshalberg.wordpress.com/377/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jameshalberg.wordpress.com/377/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jameshalberg.wordpress.com/377/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jameshalberg.wordpress.com/377/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=377&subd=jameshalberg&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://jameshalberg.com/2009/11/25/friends-price/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jameshalberg</media:title>
		</media:content>

		<media:content url="http://jameshalberg.files.wordpress.com/2009/11/firstpass.png" medium="image">
			<media:title type="html">firstpass</media:title>
		</media:content>
	</item>
		<item>
		<title>Online Office?  or Goog Docs?</title>
		<link>http://jameshalberg.com/2009/07/13/online-office-or-goog-docs/</link>
		<comments>http://jameshalberg.com/2009/07/13/online-office-or-goog-docs/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 03:55:47 +0000</pubDate>
		<dc:creator>Jim</dc:creator>
				<category><![CDATA[Usability]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google docs]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[office]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://jameshalberg.com/?p=372</guid>
		<description><![CDATA[I&#8217;m sure you&#8217;ve seen that Microsoft announced it will be bringing a free version of Office to the web.  It looks like that may actually still be a year out, but nevertheless it&#8217;s got me thinking about whether I&#8217;ll be a customer. Google Docs is great but let&#8217;s face it, the best part about it [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=372&subd=jameshalberg&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p style="font:12px Helvetica;margin:0;">I&#8217;m sure you&#8217;ve seen that Microsoft announced it will be bringing a free version of Office to the web.  It looks like that may actually still be <a href="http://gigaom.com/2009/07/13/want-microsoft-office-web-dont-hold-your-breath">a year out</a>, but nevertheless it&#8217;s got me thinking about whether I&#8217;ll be a customer.</p>
<p style="font:12px Helvetica;min-height:14px;margin:0;">
<p style="font:12px Helvetica;margin:0;">Google Docs is great but let&#8217;s face it, the best part about it is plain and simple: It groks .docs (and xls and whatever else).  If it didn&#8217;t&#8230; I imagine I might have a few docs out there &#8212; some random things people &#8220;shared&#8221; with me and what not, but add in the ability to handle .doc files and it becomes an essential tool for anyone lacking a copy of Office.</p>
<p style="font:12px Helvetica;min-height:14px;margin:0;">
<p style="font:12px Helvetica;margin:0;">So, Microsoft&#8217;s announcement that Office will be available FREE online is a Goog Docs killer, right?  &#8230; nah.  I really think it would be but the thing about &#8220;Free online Office&#8221; is&#8230; it&#8217;s <a href="http://www.appleinsider.com/articles/09/07/13/microsoft_takes_aim_at_google_with_online_office_suite.html">only free if you&#8217;re already paying</a>&#8230; and while 400M people are &#8212; YOU, my friend, are not.</p>
<p style="font:12px Helvetica;min-height:14px;margin:0;">
<p style="font:12px Helvetica;margin:0;">So, what will it take for this to be a success amongst the 2 groups of people I care about?  Let&#8217;s label them (1) Me and (2) My Uncle Rob.</p>
<p style="font:12px Helvetica;min-height:14px;margin:0;">
<p style="font:12px Helvetica;margin:0;"><strong>Me.</strong></p>
<p style="font:12px Helvetica;margin:0;">I love having things online and everything that goes along with it, but&#8230; gotta be free.  Google&#8217;s online offerings are far from having perfect interfaces, but as any good 36-signals-following kid will tell you: free + simple = winner.  I just can&#8217;t justify paying $50/yr (to make up a number) to have Word online.  I know it&#8217;s $4 a month&#8230; but sorry: I&#8217;m out.</p>
<p style="font:12px Helvetica;min-height:14px;margin:0;">
<p style="font:12px Helvetica;margin:0;"><strong>Uncle Rob</strong></p>
<p style="font:12px Helvetica;margin:0;">Uncle Rob doesn&#8217;t really get the whole online thing.  That&#8217;s not to say he doesn&#8217;t use/like technology.  or that he doesn&#8217;t like his Y! Mail and playing some online Euchre.  It literally means: he doesn&#8217;t know what it means to have documents hosted online.  If you give him Office online, he&#8217;s going to wonder why he can&#8217;t go to his harddrive to copy all his files to his fancy new flash drive.</p>
<p style="font:12px Helvetica;min-height:14px;margin:0;">
<p style="font:12px Helvetica;margin:0;">But here&#8217;s the thing: he wants Office.  He doesn&#8217;t want something that can read and write doc files via &#8220;Save As&#8221; (or even worse &#8220;Export As&#8221;.  He just wants it to work &#8211; and look like the thing he uses at work.  THIS is why this whole plan may work.</p>
<p style="font:12px Helvetica;min-height:14px;margin:0;">
<p style="font:12px Helvetica;margin:0;">So, what will it take to make me recommend it to him?  &#8230; gotta be free.  If he has to pay $50/year &#8212; no question about it: I&#8217;m telling him to have his kid buy him the $150 Student copy for his own machine.  It&#8217;ll be easier for him to understand and it doesn&#8217;t force him to send all his Uncle-Robby-Friends &#8220;share links&#8221; or use that pesky &#8220;Export As&#8221;.  If the prices are even close (and they really are), it&#8217;s the obvious choice for him.</p>
<p style="font:12px Helvetica;margin:0;">
<p style="font:12px Helvetica;margin:0;">Maybe they&#8217;ll figure these things out?  &#8230; or maybe they won&#8217;t AND the interface will suck.  It&#8217;ll be interesting to see how things look when we actually get closer to the release.</p>
<div><span style="font-family:Helvetica;font-size:small;"><span style="line-height:normal;"><br />
</span></span></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jameshalberg.wordpress.com/372/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jameshalberg.wordpress.com/372/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jameshalberg.wordpress.com/372/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jameshalberg.wordpress.com/372/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jameshalberg.wordpress.com/372/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jameshalberg.wordpress.com/372/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jameshalberg.wordpress.com/372/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jameshalberg.wordpress.com/372/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jameshalberg.wordpress.com/372/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jameshalberg.wordpress.com/372/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=372&subd=jameshalberg&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://jameshalberg.com/2009/07/13/online-office-or-goog-docs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jameshalberg</media:title>
		</media:content>
	</item>
		<item>
		<title>iPhone Contact Synch Troubleshooting</title>
		<link>http://jameshalberg.com/2009/04/03/iphone-contact-synch-troubleshooting/</link>
		<comments>http://jameshalberg.com/2009/04/03/iphone-contact-synch-troubleshooting/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 17:38:44 +0000</pubDate>
		<dc:creator>Jim</dc:creator>
				<category><![CDATA[Utility]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[Address Book]]></category>
		<category><![CDATA[contacts]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[synching]]></category>
		<category><![CDATA[troubleshooting]]></category>

		<guid isPermaLink="false">http://jameshalberg.com/?p=361</guid>
		<description><![CDATA[I recently undertook a (failed) journey into synching my Gmail contacts with my Address Book. The end result was much annoyance, followed by a day (ok probably 20 minutes) of cleanup to get my list back to normal. FINE. The cleanup got done &#8211; I re-synched with my iPhone and viola: contacts restored to normal&#8230; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=361&subd=jameshalberg&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I recently undertook a (failed) journey into synching my Gmail contacts with my Address Book.  The end result was much annoyance, followed by a day (ok probably 20 minutes) of cleanup to get my list back to normal.  FINE.  The cleanup got done &#8211; I re-synched with my iPhone and viola: contacts restored to normal&#8230; or were they?</p>
<p>10 minutes later I received a text from someone not in my contacts list.  Upon further inspection, it was a good friend of mine (who I frequently trade messages with) &#8212; what the heck?  His number isn&#8217;t in my address book?</p>
<p>A quick check of my laptop revealed that he was still there but wasn&#8217;t properly being synched to my phone.  It wasn&#8217;t just him &#8211; 25ish contacts were mysteriously not showing up properly.  Editing individual entries and resynching got the job done but finding these 25 people was really getting annoying &#8211; I needed a truer solution.</p>
<p>The winner:<br />
iSynch -&gt; Preferences -&gt; Reset Sync History</p>
<p><a href="http://jameshalberg.files.wordpress.com/2009/04/isync.jpg"><img class="aligncenter size-full wp-image-362" title="isync" src="http://jameshalberg.files.wordpress.com/2009/04/isync.jpg?w=472&#038;h=436" alt="isync" width="472" height="436" /></a></p>
<p>That, plus one more &#8220;synch&#8221; through iTunes &#8211; and I was back on track.  Hope that helps if you&#8217;re in that same boat!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jameshalberg.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jameshalberg.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jameshalberg.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jameshalberg.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jameshalberg.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jameshalberg.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jameshalberg.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jameshalberg.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jameshalberg.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jameshalberg.wordpress.com/361/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=361&subd=jameshalberg&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://jameshalberg.com/2009/04/03/iphone-contact-synch-troubleshooting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jameshalberg</media:title>
		</media:content>

		<media:content url="http://jameshalberg.files.wordpress.com/2009/04/isync.jpg" medium="image">
			<media:title type="html">isync</media:title>
		</media:content>
	</item>
		<item>
		<title>Feel better about your body, with Readability</title>
		<link>http://jameshalberg.com/2009/03/16/feel-better-about-your-body-with-readability/</link>
		<comments>http://jameshalberg.com/2009/03/16/feel-better-about-your-body-with-readability/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 03:01:10 +0000</pubDate>
		<dc:creator>Jim</dc:creator>
				<category><![CDATA[Recommended Sites]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[readability]]></category>

		<guid isPermaLink="false">http://jameshalberg.com/?p=335</guid>
		<description><![CDATA[I didn&#8217;t think much about using Readability&#8230; until I came upon this guy today (click for full size at own risk): Much much better. Ah, what can be prettier than a screen full of baseball stat projections!  The print is a bit small but that&#8217;s by choice: make sure to play with the settings when you grab this [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=335&subd=jameshalberg&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I didn&#8217;t think much about using <a href="http://lab.arc90.com/experiments/readability/">Readability</a>&#8230; until I came upon this guy today (click for full size at own risk):</p>
<p style="text-align:left;"><a href="http://jameshalberg.files.wordpress.com/2009/03/gross.png"><img class="size-medium wp-image-336 aligncenter" title="gross" src="http://jameshalberg.files.wordpress.com/2009/03/gross.png?w=300&#038;h=224" alt="gross" width="300" height="224" /></a></p>
<p style="text-align:left;">Much much better.<br />
<a href="http://jameshalberg.files.wordpress.com/2009/03/perty.png"><img class="size-medium wp-image-337 aligncenter" title="perty" src="http://jameshalberg.files.wordpress.com/2009/03/perty.png?w=300&#038;h=180" alt="perty" width="300" height="180" /></a></p>
<p>Ah, what can be prettier than a screen full of baseball stat projections!  The print is a bit small but that&#8217;s by choice: make sure to play with the settings when you grab <a href="http://lab.arc90.com/experiments/readability/">this thing</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jameshalberg.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jameshalberg.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jameshalberg.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jameshalberg.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jameshalberg.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jameshalberg.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jameshalberg.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jameshalberg.wordpress.com/335/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jameshalberg.wordpress.com/335/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jameshalberg.wordpress.com/335/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=335&subd=jameshalberg&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://jameshalberg.com/2009/03/16/feel-better-about-your-body-with-readability/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jameshalberg</media:title>
		</media:content>

		<media:content url="http://jameshalberg.files.wordpress.com/2009/03/gross.png?w=300" medium="image">
			<media:title type="html">gross</media:title>
		</media:content>

		<media:content url="http://jameshalberg.files.wordpress.com/2009/03/perty.png?w=300" medium="image">
			<media:title type="html">perty</media:title>
		</media:content>
	</item>
		<item>
		<title>Baseball Draft</title>
		<link>http://jameshalberg.com/2009/03/09/baseball-draft/</link>
		<comments>http://jameshalberg.com/2009/03/09/baseball-draft/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 03:34:15 +0000</pubDate>
		<dc:creator>Jim</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[fantasy baseball]]></category>
		<category><![CDATA[fastercsv]]></category>
		<category><![CDATA[hpricot]]></category>
		<category><![CDATA[screen scraping]]></category>
		<category><![CDATA[spreadsheet]]></category>
		<category><![CDATA[yaml]]></category>

		<guid isPermaLink="false">http://jameshalberg.com/?p=323</guid>
		<description><![CDATA[Ah yes, it&#8217;s that wonderful time of year again: fantasy baseball time.  Anyone who plays fantasy sports can tell you that other than getting a check for winning your league (something I would know nothing about), the best part of the season is the draft. My fantasy draft preparation always involves the creation of a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=323&subd=jameshalberg&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Ah yes, it&#8217;s that wonderful time of year again: fantasy baseball time.  Anyone who plays fantasy sports can tell you that other than getting a check for winning your league (something I would know nothing about), the best part of the season is the draft.</p>
<p>My fantasy draft preparation always involves the creation of a spreadsheet.  This nugget of gold will start with ratings and stats from various sites and sources before getting my own personal notes, organization, and shuffling (aka &#8220;messing it up&#8221;).  and what kind of card-carrying software engineer would do such a compilation by hand&#8230;</p>
<p>My basic strategy for compiling this sucker this year:</p>
<ol>
<li>Scrape some stats and rankings from a few popular sites and dump them locally.</li>
<li>Load the stats from local, merge em, and kick out a csv.</li>
<li>Mess with stuff in the spreadsheet.</li>
<li>Win millions.</li>
</ol>
<h3 style='color:black;'>Scraping</h3>
<p>I&#8217;ve used <a href="http://wiki.github.com/why/hpricot">hpricot</a> in the past but wanted a bit of a refresher &#8212; Man, this thing makes this task nice and easy.  Most of the sites have a fairly sane markup scheme for the tables they store players data in, so it&#8217;s normally as simple as (this is Ruby btw):</p>
<pre style="color:green;"><span style="font-family:mceinline;">doc = Hpricot(open(url))
players = doc.search(".playerDataRow")
players.each do |player|
  meta = player.search("td .playerMeta")
  stats = player.search("td .playerStats")
  &lt; do stuff &gt;
end</span></pre>
<p>&nbsp;</p>
<div style='background-color:#F3F3E0;margin-bottom:10px;padding:15px;'>
<h3 style='color:black;'>Update: <span style="font-weight:normal;">Here are a couple example files (they should be .rb files, but are docs to make WordPress happy)</span></h3>
<p><span style="font-weight:normal;"><br />
<a href="http://jameshalberg.files.wordpress.com/2009/03/yahoo_parserrb.doc">Yahoo Parser</a></span></p>
<p><a href="http://jameshalberg.files.wordpress.com/2009/03/scraperb.doc">Something to invoke the parser</a>
</div>
<h3 style='color:black;'>Local Storage</h3>
<p>Last year, I wrote this as a single script (scrape -&gt; csv).  Things got hairy when I needed to tweak the merger and thus had to re-run the whole thing (annoying) or hack it to run only a portion&#8230; and the same portion on each site (annoying).  So, this year I got a little smart and wanted to dump the scrape results locally.</p>
<p>I fully intended to evaluate a few options here but as it turns out, the first try was just dead simple and worked perfectly: yaml.  My scrapers each end up with a couple Arrays: one for hitters and one for pitchers.  Each entry is a Hash of player data.  I considered skipping the Array here but didn&#8217;t want to have the logic for name collisions in the scraper.</p>
<p>How hard was it to write my +player_data+ Hash to yaml?</p>
<pre style="color:green;">YAML.dump(player_data, File.open(File.dirname(__FILE__) + "/yaml/" + filename, "w"))</pre>
<h3 style='color:black;'>Merging the scrape sources</h3>
<p>This is a separate script here now&#8230;</p>
<p>Resurrecting the player data proved as simple as storing it in the first place.</p>
<pre style="color:green;">YAML.load(File.open(File.dirname(__FILE__) + "/yaml/" + filename))</pre>
<p>First pass I just wanted to merge based on player names &#8211; ignoring the imperfections that surely come with that&#8230; I was pleasantly surprised at how well things actually came out.  I wrote a little throwaway script (as if this whole thing isn&#8217;t throwaway) to tell me how much of a problem I actually have.  Basically: how many players in the top 400 of any site don&#8217;t have a match from the other sites?  The answer was basically: a lot of Latin guys and a few others.</p>
<p>So, one problem I had was character sets used in the Latin player names.  This is an area where &#8220;you&#8217;re going to throw this away&#8221; came into play: I just grabbed the few codes that I was having trouble with and regex&#8217;d to replace them with their friendlier counterparts.  This is now on my list of &#8220;things to figure out how to do right&#8221;.</p>
<p>That out of the way, I re-ran and found that I really only had problems with about 20 guys.  People with names like &#8220;Mike Smith&#8221;, that were &#8220;Michael Smith&#8221; in the other set.  Here again: cheated.  20 guys?  I can handle typing 20 names instead of figuring this one out, so I just modified the yaml manually here (this immediately breaks down if I have to re-run the scraper, but&#8230; I didn&#8217;t).</p>
<p>After determining which of the dumped data I wanted to keep (and which site could trump the others when they both had something like HRs), I created my csv with <a href="http://fastercsv.rubyforge.org/">FasterCSV</a> and I was rockin&#8217;.</p>
<h3 style='color:black;'>In the spreadsheet</h3>
<p>At this point, I was realizing that I should have created some new fields in that script&#8230; maybe look for things like big differences between sources (why does Y! think this guy is #20 and ESPN thinks he&#8217;s #100?) or even just: what&#8217;s the average of all the sites scraped.  I was enamored with my spreadsheet though and haven&#8217;t <del>had to</del> been able to work with formulas in spreadsheets since my consulting-at-AmFam days, so I thought I&#8217;d give it a spin&#8230; and was quickly reminded of how easy they make it&#8230; to bash your head against the wall:</p>
<pre style="color:green;">=IF(AND(P13="n/a";F13="");M13;IF(P13="n/a";(M13+F13)/2;IF(F13="";(M13+P13)/2;(M13+P13+F13)/3)))</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jameshalberg.wordpress.com/323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jameshalberg.wordpress.com/323/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jameshalberg.wordpress.com/323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jameshalberg.wordpress.com/323/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jameshalberg.wordpress.com/323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jameshalberg.wordpress.com/323/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jameshalberg.wordpress.com/323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jameshalberg.wordpress.com/323/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jameshalberg.wordpress.com/323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jameshalberg.wordpress.com/323/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=323&subd=jameshalberg&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://jameshalberg.com/2009/03/09/baseball-draft/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jameshalberg</media:title>
		</media:content>
	</item>
		<item>
		<title>Gmail Game Changer</title>
		<link>http://jameshalberg.com/2009/01/27/gmail-game-changer/</link>
		<comments>http://jameshalberg.com/2009/01/27/gmail-game-changer/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 03:17:46 +0000</pubDate>
		<dc:creator>Jim</dc:creator>
				<category><![CDATA[Recommended Sites]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[gmail]]></category>

		<guid isPermaLink="false">http://jameshalberg.com/?p=314</guid>
		<description><![CDATA[I&#8217;ve been a happy gmail user for 4+ years now.  The story of why I like it is incredibly simple: It allowed me to throw away my email filing cabinet and replace it with &#8220;just search&#8221;.  It really doesn&#8217;t sound like a huge deal but it&#8217;s basically given me a personal secretary for my correspondence.  [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=314&subd=jameshalberg&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been a happy gmail user for 4+ years now.  The story of why I like it is incredibly simple: It allowed me to throw away my email filing cabinet and replace it with &#8220;just search&#8221;.  It really doesn&#8217;t sound like a huge deal but it&#8217;s basically given me a personal secretary for my correspondence.  I don&#8217;t care what filing cabinet you stored the memo in: just find it!  &#8230; and you have 1.25 seconds.</p>
<p>But while that&#8217;s the real story, the reason I&#8217;m writing is I finally dedicated 15 seconds to actually clicking on the &#8220;lab&#8221; icon to check out what kind of features they had to offer.  And there it was.  Queue the bright light and the &#8220;heavenly sound&#8221;&#8230;.</p>
<p>Send &amp; Archive</p>
<p>Every once in a while you find a feature in a product that makes you say &#8220;hey, I bet these guys actually use this product themselves&#8221;.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jameshalberg.wordpress.com/314/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jameshalberg.wordpress.com/314/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jameshalberg.wordpress.com/314/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jameshalberg.wordpress.com/314/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jameshalberg.wordpress.com/314/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jameshalberg.wordpress.com/314/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jameshalberg.wordpress.com/314/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jameshalberg.wordpress.com/314/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jameshalberg.wordpress.com/314/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jameshalberg.wordpress.com/314/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=314&subd=jameshalberg&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://jameshalberg.com/2009/01/27/gmail-game-changer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jameshalberg</media:title>
		</media:content>
	</item>
		<item>
		<title>Drop Box</title>
		<link>http://jameshalberg.com/2009/01/17/drop-box/</link>
		<comments>http://jameshalberg.com/2009/01/17/drop-box/#comments</comments>
		<pubDate>Sat, 17 Jan 2009 19:55:39 +0000</pubDate>
		<dc:creator>Jim</dc:creator>
				<category><![CDATA[Recommended Sites]]></category>
		<category><![CDATA[amazon s3]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[photo sharing]]></category>

		<guid isPermaLink="false">http://jameshalberg.com/?p=310</guid>
		<description><![CDATA[You can&#8217;t give someone a digital picture frame for Christmas without filling it up with a starter set of pictures.  I mean, you can&#8230; but you&#8217;ve given them the present of having to do some up-front work.  So, I set out early this month to grab pics of the family, some scenic overlooks we&#8217;ve bumped [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=310&subd=jameshalberg&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>You can&#8217;t give someone a digital picture frame for Christmas without filling it up with a starter set of pictures.  I mean, you can&#8230; but you&#8217;ve given them the present of having to do some up-front work.  So, I set out early this month to grab pics of the family, some scenic overlooks we&#8217;ve bumped into, and maybe a few other miscelaneous shots to get Mom&#8217;s Christmas present ready.</p>
<p>It takes a couple hour to get a good set of 100-150.  I need to sort through my collection, head out to my brother&#8217;s Flickr account, try some friends accounts, and just generally &#8220;gather&#8221;.</p>
<p>After having <a href="https://www.getdropbox.com/">DropBox</a> recommended by a few friends, I think we may be on to something that not only makes the process simpler &#8211; the resulting collection is much higher quality as well.</p>
<p>The premise is pretty simple: you get a magic folder that looks to be almost the same as any other folder on your machine, but DropBox is keeping it in sync with it&#8217;s remote storage location: <a href="http://aws.amazon.com/s3/">Amazon S3</a>.  So, it&#8217;s obviously handy for just backing things up, but it doesn&#8217;t end there.  It makes it simple to share.  I share a directory with my parents, and my sister-in-law and immediately we all can put in our good/new pics and immediately have them broadcast to everyone else.</p>
<p>The strongest point of DropBox though is the Python-based client.  It&#8217;s incredibly intuitive &#8211; just drop things in and it&#8217;ll take care of business.  Looks just like a &#8220;real folder&#8221; to anyone who is used to any flavor of Windows.  No worries about telling it when to synch, easy visual indicators on whether it&#8217;s actively working on anything.  It&#8217;s just really real nice.</p>
<p>Dead simple and a great solution to a common problem.  It&#8217;s free for the first 2GB, so take the <a href="https://www.getdropbox.com/tour">tour here</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jameshalberg.wordpress.com/310/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jameshalberg.wordpress.com/310/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jameshalberg.wordpress.com/310/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jameshalberg.wordpress.com/310/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jameshalberg.wordpress.com/310/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jameshalberg.wordpress.com/310/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jameshalberg.wordpress.com/310/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jameshalberg.wordpress.com/310/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jameshalberg.wordpress.com/310/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jameshalberg.wordpress.com/310/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=310&subd=jameshalberg&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://jameshalberg.com/2009/01/17/drop-box/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jameshalberg</media:title>
		</media:content>
	</item>
		<item>
		<title>Web Development Project Estimator</title>
		<link>http://jameshalberg.com/2009/01/14/web-development-project-estimator/</link>
		<comments>http://jameshalberg.com/2009/01/14/web-development-project-estimator/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 12:12:03 +0000</pubDate>
		<dc:creator>Jim</dc:creator>
				<category><![CDATA[Recommended Sites]]></category>
		<category><![CDATA[astuteo]]></category>

		<guid isPermaLink="false">http://jameshalberg.com/?p=300</guid>
		<description><![CDATA[A couple friends of mine, Matt Everson of Astuteo and Todd Lekan, have gone in together to create a Web Development Project Estimator. It&#8217;s really intuitive, well designed, and implemented in a very clean way.  Great work guys!<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=300&subd=jameshalberg&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>A couple friends of mine, Matt Everson of <a href="http://astuteo.com">Astuteo</a> and <a href="http://toddlekan.com">Todd Lekan</a>, have gone in together to create a <a href="http://astuteo.com/estimator">Web Development Project Estimator</a>.</p>
<p>It&#8217;s <strong>really</strong> intuitive, well designed, and implemented in a very clean way.  Great work guys!</p>
<p><img class="aligncenter size-full wp-image-301" title="astuteo-calc" src="http://jameshalberg.files.wordpress.com/2009/01/astuteo-calc.png?w=500&#038;h=518" alt="astuteo-calc" width="500" height="518" /></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jameshalberg.wordpress.com/300/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jameshalberg.wordpress.com/300/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jameshalberg.wordpress.com/300/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jameshalberg.wordpress.com/300/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jameshalberg.wordpress.com/300/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jameshalberg.wordpress.com/300/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jameshalberg.wordpress.com/300/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jameshalberg.wordpress.com/300/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jameshalberg.wordpress.com/300/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jameshalberg.wordpress.com/300/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=300&subd=jameshalberg&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://jameshalberg.com/2009/01/14/web-development-project-estimator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jameshalberg</media:title>
		</media:content>

		<media:content url="http://jameshalberg.files.wordpress.com/2009/01/astuteo-calc.png" medium="image">
			<media:title type="html">astuteo-calc</media:title>
		</media:content>
	</item>
		<item>
		<title>New Tunes</title>
		<link>http://jameshalberg.com/2009/01/07/new-tunes/</link>
		<comments>http://jameshalberg.com/2009/01/07/new-tunes/#comments</comments>
		<pubDate>Wed, 07 Jan 2009 06:24:47 +0000</pubDate>
		<dc:creator>Jim</dc:creator>
				<category><![CDATA[Recommended Sites]]></category>
		<category><![CDATA[new tunes]]></category>

		<guid isPermaLink="false">http://jameshalberg.com/?p=305</guid>
		<description><![CDATA[Looking for new music?  Something that normally may not normally be on your radar? newtunes.com has launched and is open for business.  The beta label is still on so there may be some bumps and bruises to be had but it should definitely be checked out. And while you&#8217;re new-tunesing, add Music Streaker to your [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=305&subd=jameshalberg&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Looking for new music?  Something that normally may not normally be on your radar?</p>
<p><img class="aligncenter size-full wp-image-306" title="newtunes" src="http://jameshalberg.files.wordpress.com/2009/01/newtunes.png?w=329&#038;h=53" alt="newtunes" width="329" height="53" /></p>
<p><a href="http://newtunes.com">newtunes.com</a> has launched and is open for business.  The beta label is still on so there may be some bumps and bruises to be had but it should definitely be checked out.</p>
<p>And while you&#8217;re new-tunesing, add <a href="http://musicstreaker.wordpress.com/">Music Streaker</a> to your RSS reader.  The blog provides much more than NewTunes updates (although you&#8217;ll get that too) and is run by my friend Jon Friesch.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jameshalberg.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jameshalberg.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jameshalberg.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jameshalberg.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jameshalberg.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jameshalberg.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jameshalberg.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jameshalberg.wordpress.com/305/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jameshalberg.wordpress.com/305/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jameshalberg.wordpress.com/305/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jameshalberg.com&blog=160606&post=305&subd=jameshalberg&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://jameshalberg.com/2009/01/07/new-tunes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">jameshalberg</media:title>
		</media:content>

		<media:content url="http://jameshalberg.files.wordpress.com/2009/01/newtunes.png" medium="image">
			<media:title type="html">newtunes</media:title>
		</media:content>
	</item>
	</channel>
</rss>