<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2titles.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemtitles.css"?><rss 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:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Todd Huss</title>
	
	<link>http://gabrito.com</link>
	<description>Anecdotes on Technology Leadership, Ruby, Java, Scala, Cloud Computing, Open-Source, SEO, and Design</description>
	<lastBuildDate>Wed, 18 Aug 2010 23:33:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/thuss" /><feedburner:info uri="thuss" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>37.758434</geo:lat><geo:long>-122.435126</geo:long><image><link>http://gabrito.com</link><url>http://gabrito.com/face-small.gif</url><title>Todd Huss' blog</title></image><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><item>
		<title>Code readability through conciseness</title>
		<link>http://feedproxy.google.com/~r/thuss/~3/-tVwb-nW1j8/code-readability-through-conciseness</link>
		<comments>http://gabrito.com/post/code-readability-through-conciseness#comments</comments>
		<pubDate>Tue, 10 Aug 2010 22:06:51 +0000</pubDate>
		<dc:creator>Todd Huss</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[Software Engineering]]></category>

		<guid isPermaLink="false">http://gabrito.com/?p=286</guid>
		<description>One of the things I love about newer languages like Ruby and Scala (and to a degree Python and Groovy) are the language features that allow you to dial conciseness up or down for readability. Take for instance the typical &amp;#8230; &lt;a href="http://gabrito.com/post/code-readability-through-conciseness"&gt;Continue reading &lt;span class="meta-nav"&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
			<content:encoded><![CDATA[<p><img src="http://gabrito.com/wp-content/uploads/2010/08/lambda.jpeg" alt="" title="lambda" width="72" height="80" class="alignleft size-full wp-image-287" />One of the things I love about newer languages like  Ruby and Scala (and to a degree Python and Groovy) are the language features that allow you to dial conciseness up or down for readability. Take for instance the typical one liner for summing numbers in languages that support anonymous functions (which can be a bit cryptic in terms of readability):</p>
<p><code><strong>Ruby</strong><br />
sum = [1,2,3,4].inject(0) {|result, value| result + value}<br />
<strong>Scala</strong><br />
val sum = Array(1,2,3,4).foldLeft(0) ((result, value) => result + value)<br />
<strong>Groovy</strong><br />
sum = [1,2,3,4].inject(0) { result, value -> result + value }<br />
<strong>Python</strong><br />
sum = reduce(lambda result, value: result + value, [1,2,3,4])</code></p>
<p>One of the jobs of a good programmer<span id="more-286"></span> is to make their code readable and in this case by naming the variable sum it&#8217;s obvious what&#8217;s going on to the right so if you can simplify the anonymous function or use syntactic sugar to reduce the amount of code there&#8217;s a good chance you can improve the readability as follows:</p>
<p><code><strong>Ruby</strong><br />
sum = [1,2,3,4].inject(:+)<br />
<strong>Scala can either reduce the anonymous function</strong><br />
val sum = Array(1,2,3,4).reduceLeft(_+_)<br />
<strong>or in Scala 2.8 they added the sum method</strong><br />
val sum = Array(1,2,3,4).sum<br />
<strong>Groovy can't reduce the anonymous function but has a sum method</strong><br />
sum = [1,2,3,4].sum<br />
<strong>Python can't reduce the anonymous function but has a sum function</strong><br />
sum = sum([1,2,3,4])</code></p>
<p>Then even if the programmer reading the code is coming from another language and doesn&#8217;t know :+ or _+_ you&#8217;ll still have improved readability because they certainly understand how a sum is computed and can move past the line of code instead of having to read 3-4 lines of a for loop for something as simple as a summing operation. I love the balance of being very concise with the simple stuff so that I can be more verbose with the complex stuff, whereas in Java even the simple stuff is often extremely verbose.</p>
<p>There is of course the extreme of making your code too concise. Look no further than <a target="_blank" href="http://en.wikipedia.org/wiki/Write-only_language">write-only languages</a> like Perl to see where too much conciseness and obfuscation can lead to unmaintainable code.</p>
<p>This example is only trivial and somewhat contrived but I find that newer languages like Ruby and Scala give you significantly better tools to elegantly dial up or down the conciseness than Java or C# resulting in <em>less code + more readable code = easily maintainable code</em>.</p>
<p>As an example, I used just about every conciseness trick in the book I knew of when composing <a target="_blank" href="http://github.com/thuss/rpcfn-3-shortest_path">my submission</a> for the <a target="_blank" href="http://rubylearning.com/blog/2009/10/30/rpcfn-short-circuit-3/">3rd Ruby Challenge&#8217;s Shortest Path Algorithm</a> and I only discarded the ones that I thought obfuscated the intent. I like to think the reason my submission won was precisely because it was concise while still being readable. Writing that same algorithm with the same level of readability in Scala would be easy but in Java it would have tripled the lines of code hurting readability somewhat.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thuss?a=-tVwb-nW1j8:RmoSI4jDhRg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thuss?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=-tVwb-nW1j8:RmoSI4jDhRg:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/thuss?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=-tVwb-nW1j8:RmoSI4jDhRg:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thuss?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=-tVwb-nW1j8:RmoSI4jDhRg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/thuss?i=-tVwb-nW1j8:RmoSI4jDhRg:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=-tVwb-nW1j8:RmoSI4jDhRg:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thuss?i=-tVwb-nW1j8:RmoSI4jDhRg:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://gabrito.com/post/code-readability-through-conciseness/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://gabrito.com/post/code-readability-through-conciseness</feedburner:origLink></item>
		<item>
		<title>Mac OS X gem cleanup failing</title>
		<link>http://feedproxy.google.com/~r/thuss/~3/JWsVP2SNc5o/mac-os-x-gem-cleanup-failing</link>
		<comments>http://gabrito.com/post/mac-os-x-gem-cleanup-failing#comments</comments>
		<pubDate>Sat, 07 Aug 2010 23:04:04 +0000</pubDate>
		<dc:creator>Todd Huss</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://gabrito.com/?p=260</guid>
		<description>After upgrading to Snow Leopard I started noticing that whenever I would run sudo gem cleanup it would fail with many errors about being unable to uninstall various gems. I ignored it until the list grew unbearably long but the &amp;#8230; &lt;a href="http://gabrito.com/post/mac-os-x-gem-cleanup-failing"&gt;Continue reading &lt;span class="meta-nav"&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
			<content:encoded><![CDATA[<p><a target="_blank" href="http://rubygems.org/" ><img src="http://gabrito.com/wp-content/uploads/2010/08/ruby-logo.jpeg" alt="Ruby Gems" title="ruby-logo" width="72" height="83" class="alignleft size-full wp-image-267" /></a>After upgrading to Snow Leopard I started noticing that whenever I would run <strong>sudo gem cleanup</strong> it would fail with many errors about being unable to uninstall various gems. I ignored it until the list grew unbearably long but the only solutions I could find on the web were to go through one gem at a time. The errors looked like this:</p>
<p><code>...<br />
Attempting to uninstall rails-2.3.5<br />
Unable to uninstall rails-2.3.5:<br />
Gem::InstallError: cannot uninstall, check `gem list -d rails`<br />
...</code></p>
<p>Following the instructions I then ran<span id="more-260"></span> <strong>gem list -d rails</strong> noting the install path for newer gems was now /Library/Ruby/Gems/1.8 whereas the older gems that cleanup was failing on were in /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8. So the solution was to run cleanup once while overriding GEM_HOME as follows:</p>
<pre style="overflow:auto"><code>sudo sh -c 'GEM_HOME=/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8 gem cleanup'</code></pre>
<p>That allowed cleanup to remove the older gems in the old path and now <strong>sudo gem cleanup</strong> is once again working.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thuss?a=JWsVP2SNc5o:uG0BAIHfe_w:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thuss?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=JWsVP2SNc5o:uG0BAIHfe_w:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/thuss?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=JWsVP2SNc5o:uG0BAIHfe_w:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thuss?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=JWsVP2SNc5o:uG0BAIHfe_w:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/thuss?i=JWsVP2SNc5o:uG0BAIHfe_w:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=JWsVP2SNc5o:uG0BAIHfe_w:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thuss?i=JWsVP2SNc5o:uG0BAIHfe_w:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://gabrito.com/post/mac-os-x-gem-cleanup-failing/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://gabrito.com/post/mac-os-x-gem-cleanup-failing</feedburner:origLink></item>
		<item>
		<title>iPhone development the easy way</title>
		<link>http://feedproxy.google.com/~r/thuss/~3/4nWSn4gRIcc/iphone-development-the-easy-way</link>
		<comments>http://gabrito.com/post/iphone-development-the-easy-way#comments</comments>
		<pubDate>Wed, 08 Jul 2009 23:23:59 +0000</pubDate>
		<dc:creator>Todd Huss</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://gabrito.com/?p=250</guid>
		<description>Update 8/7/2010 PhoneGap apps are still being allowed in the app store! It&amp;#8217;s not the right solution for every app (for example we went native with the Common Sense Media app), but I still think PhoneGap is really cool. I&amp;#8217;ve &amp;#8230; &lt;a href="http://gabrito.com/post/iphone-development-the-easy-way"&gt;Continue reading &lt;span class="meta-nav"&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
			<content:encoded><![CDATA[<p><img src="http://gabrito.com/wp-content/uploads/2009/07/iphone.png" alt="iphone" title="iphone" width="76" height="104" class="alignleft size-full wp-image-251" /> <strong>Update 8/7/2010</strong> PhoneGap apps are <a href="http://blogs.nitobi.com/jesse/2010/04/14/phonegap-and-the-apple-developer-license-agreement/">still being allowed in the app store</a>! It&#8217;s not the right solution for every app (for example we went native with the <a href="http://www.commonsensemedia.org/iphone">Common Sense Media app</a>), but I still think PhoneGap is really cool.</p>
<p>I&#8217;ve been doing some iPhone and iPod Touch development and if like me you&#8217;re used to web development in languages like Ruby, Java, and Python, the learning curve to build a native iPhone app in Objective C is quite steep. Since my applications are online (in that you need to be connected for them to be useful) I was pysched to find a much easier way using two great open-source tools:</p>
<p><a href="http://code.google.com/p/iui/">iUI</a> consists of Javascript/CSS/images that allow you to build a mobile version of your app that looks and feels just like a native iPhone app</p>
<p><a href="http://phonegap.com/">PhoneGap</a> lets you create an iPhone application (that can be submitted to the app store) that displays a framed mobile version of your site</p>
<p>To build your iPhone app:<span id="more-250"></span></p>
<p>1. Make an iPhone/iPod Touch friendly version of your site with iUI (which your users can access in mobile safari)</p>
<p>2. Bundle it as an iPhone application (so the user has an app store version they can install) using PhoneGap and submit it to the app store. What&#8217;s even better is that with PhoneGap you can also target Blackberry and Android devices.</p>
<p>As a web developer I&#8217;m not sure how they could make it any easier for me, sweet! Plus you get the double exposure of the app store or when users visit your site with their iPhones they get the mobile version of your site.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thuss?a=4nWSn4gRIcc:lTIDJY0j5_o:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thuss?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=4nWSn4gRIcc:lTIDJY0j5_o:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/thuss?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=4nWSn4gRIcc:lTIDJY0j5_o:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thuss?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=4nWSn4gRIcc:lTIDJY0j5_o:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/thuss?i=4nWSn4gRIcc:lTIDJY0j5_o:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=4nWSn4gRIcc:lTIDJY0j5_o:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thuss?i=4nWSn4gRIcc:lTIDJY0j5_o:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://gabrito.com/post/iphone-development-the-easy-way/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://gabrito.com/post/iphone-development-the-easy-way</feedburner:origLink></item>
		<item>
		<title>Production MySQL performance tuning</title>
		<link>http://feedproxy.google.com/~r/thuss/~3/FagWDTKPLCU/mysql-performance-tuning</link>
		<comments>http://gabrito.com/post/mysql-performance-tuning#comments</comments>
		<pubDate>Fri, 16 Jan 2009 04:22:00 +0000</pubDate>
		<dc:creator>Todd Huss</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Systems Administration]]></category>

		<guid isPermaLink="false">http://gabrito.com/?p=235</guid>
		<description>For the past 9 years I&amp;#8217;ve been working almost exclusively with MySQL (with a little PostgreSQL thrown in) and while I don&amp;#8217;t do nearly as much DBA work these days, I still find myself troubleshooting a query or tuning my.cnf. &amp;#8230; &lt;a href="http://gabrito.com/post/mysql-performance-tuning"&gt;Continue reading &lt;span class="meta-nav"&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
			<content:encoded><![CDATA[<p><a href="http://www.mysql.com"><img src="http://gabrito.com/wp-content/uploads/2009/01/mysql.gif" alt="mysql" title="mysql" width="114" height="68" class="alignleft size-full wp-image-236" /></a> For the past 9 years I&#8217;ve been working almost exclusively with MySQL (with a little PostgreSQL thrown in) and while I don&#8217;t do nearly as much DBA work these days, I still find myself troubleshooting a query or tuning my.cnf. While in general I find MySQL to be a lot more straightforward to work with, it&#8217;s still equally important to tune it for your applications needs.</p>
<p>To that end one of the tools I want to give a shout out to is the <a href="http://www.day32.com/MySQL/">MySQL Performance Tuning Primer Script</a>. You <a href="http://www.day32.com/MySQL/tuning-primer.sh">download and run it</a> against a production system <span id="more-235"></span>(that has preferably been running under normal load for a day or two so that it&#8217;s gathered stats). It&#8217;s a read-only script so you don&#8217;t need to worry about it changing anything but it makes some great recommendations about which tuning parameters may need adjustment. Here&#8217;s a snippet from from a production server:</p>
<p><strong>KEY BUFFER</strong><br />
Current MyISAM index space = 173 M<br />
Current key_buffer_size = 1 G<br />
Key cache miss rate is 1 : 1003<br />
Key buffer fill ratio = 7.00 %<span style="color:red"><br />
Your key_buffer_size seems to be too high.<br />
Perhaps you can use these resources elsewhere</span><br />
&#8230;<br />
&#8230;<br />
&#8230;</p>
<p>It&#8217;s no replacement for a DBA but if you want to get a somewhat sane my.cnf going for your particular application it&#8217;s a great place to start!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thuss?a=FagWDTKPLCU:ny50qqrzYEI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thuss?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=FagWDTKPLCU:ny50qqrzYEI:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/thuss?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=FagWDTKPLCU:ny50qqrzYEI:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thuss?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=FagWDTKPLCU:ny50qqrzYEI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/thuss?i=FagWDTKPLCU:ny50qqrzYEI:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=FagWDTKPLCU:ny50qqrzYEI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thuss?i=FagWDTKPLCU:ny50qqrzYEI:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://gabrito.com/post/mysql-performance-tuning/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://gabrito.com/post/mysql-performance-tuning</feedburner:origLink></item>
		<item>
		<title>Selenium Continuous Integration Runner</title>
		<link>http://feedproxy.google.com/~r/thuss/~3/nSGHH75skZg/selenium-continuous-integration-runner</link>
		<comments>http://gabrito.com/post/selenium-continuous-integration-runner#comments</comments>
		<pubDate>Sat, 10 Jan 2009 20:34:47 +0000</pubDate>
		<dc:creator>Todd Huss</dc:creator>
				<category><![CDATA[Agile Development]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Quality Assurance]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://gabrito.com/?p=227</guid>
		<description>At Common Sense Media I wanted to get some functional testing up and running that didn&amp;#8217;t require a lot of user training for the QA folks. I also wanted those tests to run in our Rightscale/Amazon EC2 hosted Hudson continuous &amp;#8230; &lt;a href="http://gabrito.com/post/selenium-continuous-integration-runner"&gt;Continue reading &lt;span class="meta-nav"&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
			<content:encoded><![CDATA[<p><a href="http://seleniumhq.org/" target="_blank"><img src="http://gabrito.com/wp-content/uploads/2009/01/selenium1.png" alt="selenium" title="selenium" width="200" height="181" class="alignleft size-full wp-image-226" /></a> At <a href="http://www.commonsensemedia.org/">Common Sense Media</a> I wanted to get some functional testing up and running that didn&#8217;t require a lot of user training for the QA folks. I also wanted those tests to run in our <a href="http://www.rightscale.com/">Rightscale</a>/<a href="http://aws.amazon.com/ec2/">Amazon EC2</a> hosted <a href="https://hudson.dev.java.net/">Hudson continuous integration server</a>. As a result I&#8217;ve published the:</p>
<p><a href="http://github.com/thuss/selenium-continuous-integration-runner/tree/master"> Selenium Selenese Continuous Integration Runner</a> </p>
<p>on GitHub in the hopes that it will save other people time when trying to get their Selenese tests running from a continuous integration server. It&#8217;s very simple but one thing I battled with was that I had to patch the selenium JAR to get it to work with Firefox 3.0. It should work fine in any continuous integration server regardless if it&#8217;s <a href="https://hudson.dev.java.net/">Hudson</a>, <a href="http://studios.thoughtworks.com/cruise-continuous-integration">Cruise</a>, <a href="http://cruisecontrol.sourceforge.net/">Cruise Control</a>, <a href="http://www.atlassian.com/software/bamboo/">Bamboo</a>, etc.</p>
<p>The functional testing products I&#8217;ve used that drive a real browser include <a href="http://www.automatedqa.com/">Test Complete (commercial)</a>, <a href="http://seleniumhq.org/">Selenium</a>, and <a href="http://wtr.rubyforge.org/">Watir</a>. I think all 3 do a good job but one thing I like about Selenium is that it&#8217;s dirt simple to get a user productive with the Selenium IDE Firefox plugin. However, that benefit is also the most limiting factor of the <a href="http://seleniumhq.org/">Selenium IDE</a> which is that to be able to re-open tests in Selenium IDE you have to save them as Selenese (which is the most limited of the testing languages that Selenium supports). Still, I think Selenese is a reasonable choice for a lot of organizations that need a moderately sophisticated functional test suite.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thuss?a=nSGHH75skZg:FbgJhSVM3Pw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thuss?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=nSGHH75skZg:FbgJhSVM3Pw:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/thuss?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=nSGHH75skZg:FbgJhSVM3Pw:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thuss?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=nSGHH75skZg:FbgJhSVM3Pw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/thuss?i=nSGHH75skZg:FbgJhSVM3Pw:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=nSGHH75skZg:FbgJhSVM3Pw:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thuss?i=nSGHH75skZg:FbgJhSVM3Pw:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://gabrito.com/post/selenium-continuous-integration-runner/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://gabrito.com/post/selenium-continuous-integration-runner</feedburner:origLink></item>
		<item>
		<title>Standalone Migrations: Using Rails migrations in non Rails projects</title>
		<link>http://feedproxy.google.com/~r/thuss/~3/Fpls5l5hhmo/standalone-migrations-using-rails-migrations-in-non-rails-projects</link>
		<comments>http://gabrito.com/post/standalone-migrations-using-rails-migrations-in-non-rails-projects#comments</comments>
		<pubDate>Tue, 23 Dec 2008 01:15:47 +0000</pubDate>
		<dc:creator>Todd Huss</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://gabrito.com/?p=194</guid>
		<description>Update 8/7/2010: Standalone migrations is now a gem (sudo gem install standalone_migrations) so disregard the outdated installation instructions below Update 7/8/2009: With the latest batch of contributed patches standalone migrations now works just like Rails migrations Update 12/26/2008: I switched &amp;#8230; &lt;a href="http://gabrito.com/post/standalone-migrations-using-rails-migrations-in-non-rails-projects"&gt;Continue reading &lt;span class="meta-nav"&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
			<content:encoded><![CDATA[<p><a href="http://github.com/thuss/standalone-migrations/tree/master"><img src="http://gabrito.com/wp-content/uploads/2008/12/github.png" alt="Standalone Migrations" title="Standalone Migrations" width="157" height="60" class="alignleft" /></a><strong>Update 8/7/2010</strong>: Standalone migrations is now a gem (sudo gem install standalone_migrations) so disregard the outdated installation instructions below</p>
<p><strong>Update 7/8/2009</strong>: With the latest batch of contributed patches standalone migrations now works just like Rails migrations<br />
<strong>Update 12/26/2008</strong>: I switched standalone migrations to use a Rakefile instead of a Ruby script.</p>
<p>In my work managing websites I end up working in Ruby, Java, and PHP. In everything but Rails managing the schema requires rolling your own solution. As a result I&#8217;ve started using Rails migrations in non-Rails projects to manage the schema. It&#8217;s not much code but I figured others might benefit from it so I created a little Github project called <a target="_blank" href="http://github.com/thuss/standalone-migrations/tree/master">standalone migrations</a>. </p>
<p>It&#8217;s based on Lincoln Stoll&#8217;s blog post titled <a target="_blank" href="http://lstoll.net/2008/04/stand-alone-activerecord-migrations/">Stand-alone ActiveRecord migrations</a> and David Welton&#8217;s blog post titled <a target="_blank" href="http://journal.dedasys.com/2007/01/28/using-migrations-outside-of-rails">Using Migrations Outside of Rails</a>.</p>
<p>Assuming you have Ruby and Gem installed on your machine, here&#8217;s how to use it:</p>
<pre>
gem install -y activerecord rake mysql
wget http://github.com/thuss/standalone-migrations/zipball/master (or fetch it using <a target="_blank" href="http://git.or.cz/">git</a>)
unzip it, and mv to something like my_non_rails_project/db
cd my_non_rails_project/db/ (or wherever you put it)
cp config/database_sample.yml config/database.yml
vi config/database.yml
./new_migration some_user_story
vi migrations/*_some_user_story.rb
rake db:migrate (this applies your newly created migration)
</pre>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thuss?a=Fpls5l5hhmo:dCn-M2h_P2o:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thuss?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=Fpls5l5hhmo:dCn-M2h_P2o:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/thuss?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=Fpls5l5hhmo:dCn-M2h_P2o:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thuss?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=Fpls5l5hhmo:dCn-M2h_P2o:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/thuss?i=Fpls5l5hhmo:dCn-M2h_P2o:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=Fpls5l5hhmo:dCn-M2h_P2o:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thuss?i=Fpls5l5hhmo:dCn-M2h_P2o:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://gabrito.com/post/standalone-migrations-using-rails-migrations-in-non-rails-projects/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://gabrito.com/post/standalone-migrations-using-rails-migrations-in-non-rails-projects</feedburner:origLink></item>
		<item>
		<title>Moving to 64 bit Ubuntu</title>
		<link>http://feedproxy.google.com/~r/thuss/~3/rTuQfgfCaUM/moving-to-64-bit-ubuntu</link>
		<comments>http://gabrito.com/post/moving-to-64-bit-ubuntu#comments</comments>
		<pubDate>Fri, 14 Nov 2008 20:45:51 +0000</pubDate>
		<dc:creator>Todd Huss</dc:creator>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://gabrito.com/?p=183</guid>
		<description>After 3 Ubuntu upgrades on my primary workhorse (a Lenovo Thinkpad z61t) I decided it was time for a fresh install to remove all the cruft. In the past I&amp;#8217;ve always used 32 bit Ubuntu (even though my laptop is &amp;#8230; &lt;a href="http://gabrito.com/post/moving-to-64-bit-ubuntu"&gt;Continue reading &lt;span class="meta-nav"&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
			<content:encoded><![CDATA[<p><a href="http://www.ubuntu.com"><img class="alignleft" src="/files/ubuntu.jpg" alt="Ubuntu Logo" /></a>After 3 Ubuntu upgrades on my primary workhorse (a <a href="http://www.geek.com/articles/chips/lenovo-thinkpad-z61t-notebook-2007044/">Lenovo Thinkpad z61t</a>) I decided it was time for a fresh install to remove all the cruft. In the past I&#8217;ve always used 32 bit Ubuntu (even though my laptop is a 64 bit Core 2 duo) because of issues with the Flash plugin, Java plugin, and Skype. After backing up my files I bit the bullet and did a fresh install of <a href="http://releases.ubuntu.com/8.10/">64 bit Ubuntu Intrepid Ibex</a> and in the process also decided to give <a href="http://www.debian-administration.org/articles/388">XFS a shot instead of EXT3</a> as my primary filesystem.</p>
<p>I&#8217;m pleased to say that after 3 hours I had the install done and all of my software installed and working including Jetbrains IDEA, Netbeans, Skype, VirtualBox, Flash plugin, Java plugin, Web Developer Toolbar, and Firebug. Apparently things have gotten a little better for 64 bit Linux over the past year and a half! However, I&#8217;m still running into odd issues every now and again related to both Sun&#8217;s 64 bit Java (IDE <del>and Jetty</del> occasionally hangs) and the the Open JDK browser plugin which is still buggy. Hopefully future updates will help address these issues. Anyhow, I thought I&#8217;d throw out the links I used to get everything working:</p>
<p><strong>Fonts</strong><br />
<a href="http://www.ubuntu-unleashed.com/2008/05/howto-install-mac-fonts-on-ubuntu.html">Howto: Install Mac Fonts on Ubuntu</a><br />
<a href="http://stdout-dev-null.blogspot.com/2007/03/make-firefox-in-ubuntu-look-much-better.html">Make Firefox in Ubuntu look much better</a></p>
<p><strong>Skype</strong><br />
<a href="https://help.ubuntu.com/community/Medibuntu">Add the Medibuntu repository</a><br />
sudo apt-get install skype-static</p>
<p><strong>Flash plugin</strong><br />
<a href="http://www.cyberciti.biz/tips/install-flash-10-ubuntu-linux-64bit.html">Install Flash 10 Under Ubuntu Linux 64 bit Edition</a></p>
<p><strong>Java plugin</strong><br />
sudo apt-get install openjdk-6-jre icedtea-gcjwebplugin</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thuss?a=rTuQfgfCaUM:IYQTkN1bHLI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thuss?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=rTuQfgfCaUM:IYQTkN1bHLI:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/thuss?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=rTuQfgfCaUM:IYQTkN1bHLI:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thuss?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=rTuQfgfCaUM:IYQTkN1bHLI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/thuss?i=rTuQfgfCaUM:IYQTkN1bHLI:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=rTuQfgfCaUM:IYQTkN1bHLI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thuss?i=rTuQfgfCaUM:IYQTkN1bHLI:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://gabrito.com/post/moving-to-64-bit-ubuntu/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://gabrito.com/post/moving-to-64-bit-ubuntu</feedburner:origLink></item>
		<item>
		<title>8 months off to Mexico and back</title>
		<link>http://feedproxy.google.com/~r/thuss/~3/KDD83tv3x5c/8-months-off-to-mexico-and-back</link>
		<comments>http://gabrito.com/post/8-months-off-to-mexico-and-back#comments</comments>
		<pubDate>Sun, 08 Jun 2008 23:03:19 +0000</pubDate>
		<dc:creator>Todd Huss</dc:creator>
				<category><![CDATA[Sailing]]></category>
		<category><![CDATA[Travel]]></category>

		<guid isPermaLink="false">http://gabrito.com/?p=181</guid>
		<description>From 20080511AguaV&amp;#8230; October 4th, 2007 was my last day as the VP of Technology at GreatSchools when I handed the reigns over to Chris Pickslay so that Susan, Sequoia, and I could take off on our sailboat to Mexico for &amp;#8230; &lt;a href="http://gabrito.com/post/8-months-off-to-mexico-and-back"&gt;Continue reading &lt;span class="meta-nav"&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
			<content:encoded><![CDATA[<table class="alignleft" style="width:auto;">
<tr>
<td><a href="http://picasaweb.google.com/todd.huss/20080511AguaVerde/photo#5202911746072650386"><img src="http://lh5.ggpht.com/todd.huss/SDR0qrZeIpI/AAAAAAAAMnM/XxXz53kDgCY/s144/IMG_4322.JPG" /></a></td>
</tr>
<tr>
<td style="font-family:arial,sans-serif; font-size:11px; text-align:right">From <a href="http://picasaweb.google.com/todd.huss/20080511AguaVerde">20080511AguaV&#8230;</a></td>
</tr>
</table>
<p> October 4th, 2007 was my last day as the VP of Technology at <a href="http://www.greatschools.net">GreatSchools</a> when I handed the reigns over to Chris Pickslay so that Susan, Sequoia, and I could take off on our sailboat to Mexico for 6-12 months. It was a great 4 years leading the tech team at GreatSchools and I was sad to leave such a terrific job and group of people but both Susan and I were really feeling the itch for some adventure under sail. Our plan was to explore the Baja peninsula, mainland Mexico, and of course the lovely Sea of Cortez.<br />
<span id="more-181"></span><br />
8 months have passed and we had some great fun and adventures which you can read about on our <a href="http://sailsugata.com">sailing blog</a> if you&#8217;re interested, <a href="http://sailsugata.com/post/weve-moved-onto-the-boat">it all starts here when we moved aboard the boat</a>. However, with hurricane season approaching we decided to put the boat into <a href="http://www.marinasancarlos.com/seca.html">dry storage in San Carlos Mexico</a> for the summer and return home for 6 months to work and catch up with friends and family. </p>
<p>Starting June 10th I&#8217;ll be back at GreatSchools 3 days a week as a contractor until we go back to Mexico and this time I&#8217;ll be working for Chris instead of the other way around!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thuss?a=KDD83tv3x5c:DWrMqFtw8o8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thuss?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=KDD83tv3x5c:DWrMqFtw8o8:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/thuss?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=KDD83tv3x5c:DWrMqFtw8o8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thuss?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=KDD83tv3x5c:DWrMqFtw8o8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/thuss?i=KDD83tv3x5c:DWrMqFtw8o8:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=KDD83tv3x5c:DWrMqFtw8o8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thuss?i=KDD83tv3x5c:DWrMqFtw8o8:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://gabrito.com/post/8-months-off-to-mexico-and-back/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://gabrito.com/post/8-months-off-to-mexico-and-back</feedburner:origLink></item>
		<item>
		<title>Transcending CSS</title>
		<link>http://feedproxy.google.com/~r/thuss/~3/sPDXdhcgSOg/transcending-css</link>
		<comments>http://gabrito.com/post/transcending-css#comments</comments>
		<pubDate>Wed, 15 Aug 2007 16:14:51 +0000</pubDate>
		<dc:creator>Todd Huss</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://gabrito.com/post/transcending-css</guid>
		<description>Working at GreatSchools we do a lot of CSS work and we have a number of CSS books on our library shelf. However, last month we picked up a copy of Transcending CSS and it&amp;#8217;s far and away the most &amp;#8230; &lt;a href="http://gabrito.com/post/transcending-css"&gt;Continue reading &lt;span class="meta-nav"&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
			<content:encoded><![CDATA[<p><a href="http://www.amazon.com/gp/product/0321410971?ie=UTF8&#038;tag=marinewireles-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0321410971"><img border="0" src="http://ecx.images-amazon.com/images/I/61lTMGoALtL._SL160_.jpg" class="alignleft"></a><img src="http://www.assoc-amazon.com/e/ir?t=marinewireles-20&#038;l=as2&#038;o=1&#038;a=0321410971" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />Working at <a href="http://www.greatschools.net/">GreatSchools</a> we do a lot of CSS work and we have a number of CSS books on our library shelf. However, last month we picked up a copy of <a href="http://www.amazon.com/gp/product/0321410971?ie=UTF8&#038;tag=marinewireles-20&#038;link_code=as3&#038;camp=211189&#038;creative=373489&#038;creativeASIN=0321410971">Transcending CSS</a> and it&#8217;s far and away the most enlightening book on CSS I&#8217;ve read. We&#8217;re already changing the way we do our CSS for the better as a result.</p>
<p>Having worked with a lot of front-end<span id="more-180"></span> developers I can confirm that almost all of them would benefit from this book since most still </p>
<ul>
<li>use floats for layout as opposed to <a href="http://css-discuss.incutio.com/?page=AbsoluteLayouts">position absolute</a> (which is easily misunderstood because it&#8217;s positioning relative to the containing block)</li>
<li>few seem to regularly run their XHTML through a validator (a pet peeve of mine)</li>
<li>and even fewer seem to know to employ the concept of a <a href="http://developer.yahoo.com/yui/reset/">CSS reset</a></li>
</ul>
<p>It&#8217;s hard to convey all of the great stuff in this book but I can almost guarantee that if you work with CSS this book will open your eyes to a better way of doing things.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thuss?a=sPDXdhcgSOg:_apWAsrdZNY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thuss?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=sPDXdhcgSOg:_apWAsrdZNY:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/thuss?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=sPDXdhcgSOg:_apWAsrdZNY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thuss?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=sPDXdhcgSOg:_apWAsrdZNY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/thuss?i=sPDXdhcgSOg:_apWAsrdZNY:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=sPDXdhcgSOg:_apWAsrdZNY:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thuss?i=sPDXdhcgSOg:_apWAsrdZNY:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://gabrito.com/post/transcending-css/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://gabrito.com/post/transcending-css</feedburner:origLink></item>
		<item>
		<title>Simple CMS using Google Spreadsheet API</title>
		<link>http://feedproxy.google.com/~r/thuss/~3/8He500mX6-k/simple-cms-using-google-spreadsheet-api</link>
		<comments>http://gabrito.com/post/simple-cms-using-google-spreadsheet-api#comments</comments>
		<pubDate>Tue, 12 Jun 2007 17:05:05 +0000</pubDate>
		<dc:creator>Todd Huss</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Software Engineering]]></category>

		<guid isPermaLink="false">http://gabrito.com/post/simple-cms-using-google-spreadsheet-api</guid>
		<description>Update 6/14/2007: Dion Almaer has published a nice Javascript helper which makes working with spreadsheets much nicer, I&amp;#8217;ve moved my stuff to it and it&amp;#8217;s a big improvement over using the Google JSON api directly. Publishing dynamic content on your &amp;#8230; &lt;a href="http://gabrito.com/post/simple-cms-using-google-spreadsheet-api"&gt;Continue reading &lt;span class="meta-nav"&gt;&amp;#8594;&lt;/span&gt;&lt;/a&gt;</description>
			<content:encoded><![CDATA[<p><strong>Update 6/14/2007:</strong> <a href="http://www.almaer.com/blog/archives/001516.html">Dion Almaer has published a nice Javascript helper</a> which makes working with spreadsheets much nicer, I&#8217;ve moved my stuff to it and it&#8217;s a big improvement over using the Google JSON api directly.</p>
<p>Publishing dynamic content on your website in a format that you can style with CSS has gotten a whole lot easier with Google&#8217;s simple JSON based Javascript API&#8217;s. The two I&#8217;ve found myself playing with lately are the <a href="http://code.google.com/apis/ajaxfeeds/">Google Ajax Feed API</a> for publishing RSS and Atom feeds and the <a href="http://code.google.com/apis/spreadsheets/overview.html">Google Spreadsheet API<br />
</a> for publishing little snippets of text that should be easily editable.</p>
<p>Say you want a simple headline on your homepage that you can change daily. Here&#8217;s how you&#8217;d do it with the Google Spreadsheet API:</p>
<p><strong>1.</strong> Create a spreadsheet making the first row the column headers (important because you&#8217;ll refer to the cell by the column header):</p>
<p><img src='http://gabrito.com/wp-content/uploads/2007/06/easycmsspreadsheet.png' alt='easycmsspreadsheet.png' /><br />
<span id="more-178"></span><br />
<strong>2.</strong> Go to the publish tab and publish the spreadsheet: <a href="http://spreadsheets.google.com/pub?key=pouqRkV5D_eZT_VdOKu7CQA">http://spreadsheets.google.com/pub?key=pouqRkV5D_eZT_VdOKu7CQA</a>. Note in this example the key is <strong>pouqRkV5D_eZT_VdOKu7CQA</strong></p>
<p><!--adsense--></p>
<p><strong>3.</strong> Use a simple container div and some javascript to display the field:</p>
<pre><code>&lt;div id="headline"&gt;&lt;/div&gt;
&lt;script type="text/javascript"&gt;
function displayContent(json) { document.getElementById('headline').innerHTML = json.feed.entry[0].gsx$html.$t; }
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://spreadsheets.google.com/feeds/list/<b>pouqRkV5D_eZT_VdOKu7CQA</b>/od6/public/values?alt=json-in-script&amp;callback=displayContent"&gt;
&lt;/script&gt;
</code></pre>
<p><strong>Note:</strong> the spreadsheet key in the URL that needs to be replaced. Also, entry[0] refers to row 2 in the spreadsheet (because row 1 contains the column headers and is not considered an entry):</p>
<p><strong>4.</strong> The text appears dynamically on the page:</p>
<p>Palm releases Linux based <a href="http://www.palm.com/us/products/mobilecompanion/foleo/">Foleo</a></p>
<p><strong>5.</strong> When it&#8217;s time to update, make your changes to the spreadsheet, go the publish tab, and republish it and the changes will appear on your site!</p>
<p>The only real downside I can think of with this simple approach is that it&#8217;s not SEO friendly so if you want all search engine crawlers to follow those links you publish, you&#8217;re better off with a non-javascript solution. The <a href="http://groups.google.com/group/Google-Spreadsheets-Data-API">Spreadsheets API google group</a> is a good resource and <a href="http://imagine-it.org/google/spreadsheets/gadgets_all.html">Pamela Fox has some examples to look at</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/thuss?a=8He500mX6-k:3VJEMOAtuxY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/thuss?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=8He500mX6-k:3VJEMOAtuxY:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/thuss?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=8He500mX6-k:3VJEMOAtuxY:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/thuss?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=8He500mX6-k:3VJEMOAtuxY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/thuss?i=8He500mX6-k:3VJEMOAtuxY:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/thuss?a=8He500mX6-k:3VJEMOAtuxY:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/thuss?i=8He500mX6-k:3VJEMOAtuxY:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://gabrito.com/post/simple-cms-using-google-spreadsheet-api/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://gabrito.com/post/simple-cms-using-google-spreadsheet-api</feedburner:origLink></item>
	</channel>
</rss>
