<?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/"
	>

<channel>
	<title>A Noted Path by Theodore Nguyen-Cao &#187; geekery</title>
	<atom:link href="http://www.theodorenguyen-cao.com/category/geekery/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.theodorenguyen-cao.com</link>
	<description>Personal blog of Theodore Nguyen-Cao</description>
	<lastBuildDate>Wed, 21 Jul 2010 15:40:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=abc</generator>
		<item>
		<title>Running IntelliJ 9 Public Preview Community Edition on Mac OSX</title>
		<link>http://www.theodorenguyen-cao.com/2009/10/15/running-intellij-9-public-preview-community-edition-on-mac-osx/</link>
		<comments>http://www.theodorenguyen-cao.com/2009/10/15/running-intellij-9-public-preview-community-edition-on-mac-osx/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 20:56:30 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.theodorenguyen-cao.com/?p=334</guid>
		<description><![CDATA[JetBrains just announced they are open sourcing IntelliJ in a community edition with a subset of features from their commercial product. Having used Eclipse almost exclusively in my Java work, I was interested in trying it out and went to download the .dmg file. I unpacked everything and tried to run the poorly named Maia-IC-90.94.app [...]]]></description>
			<content:encoded><![CDATA[<p>JetBrains just <a href="http://blogs.jetbrains.com/idea/2009/10/intellij-idea-open-sourced/">announced</a> they are open sourcing IntelliJ in a community edition with a subset of features from their commercial product.</p>
<p>Having used Eclipse almost exclusively in my Java work, I was interested in trying it out and went to <a href="http://www.jetbrains.com/idea/nextversion/free_java_ide.html">download the .dmg</a> file. I unpacked everything and tried to run the poorly named Maia-IC-90.94.app</p>
<p>Nothing came up. Lame.</p>
<p>I dug into the package and executed idea.sh which prompted me that I need to set the environment variable IDEA_SDK or JDK_HOME.</p>
<p>Ah ha!</p>
<p>In my .bash_profile, I set</p>
<pre class="console">export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home
export IDEA_JDK=$JAVA_HOME</pre>
<p>And ran idea.sh again and IntelliJ came up.</p>
<p><a href="http://www.theodorenguyen-cao.com/wp-content/uploads/2009/10/Picture-1.png"><img class="aligncenter size-full wp-image-336" title="Picture 1" src="http://www.theodorenguyen-cao.com/wp-content/uploads/2009/10/Picture-1.png" alt="Picture 1" width="450" height="270" /></a></p>
<p>Running Maia-IC.90.94.app still doesn&#8217;t run the app but at least now I can play around with IntelliJ.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2009/10/15/running-intellij-9-public-preview-community-edition-on-mac-osx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linode API for Java</title>
		<link>http://www.theodorenguyen-cao.com/2009/10/11/linode-api-for-java/</link>
		<comments>http://www.theodorenguyen-cao.com/2009/10/11/linode-api-for-java/#comments</comments>
		<pubDate>Sun, 11 Oct 2009 06:06:36 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.theodorenguyen-cao.com/?p=331</guid>
		<description><![CDATA[I&#8217;ve been really happy with my recent move over to http://www.linode.com.  I was checking out their API and noticed there wasn&#8217;t any Java client.  I wanted a do a small pet project so I took a couple hours this weekend and wrote a Java client for the API. The API leverages Apache HTTP Client and [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been really happy with my recent move over to <a href="http://www.linode.com/?r=742e79d1ce5f2a9cf8f7f0fe34d858d7ec99ada5">http://www.linode.com</a>.  I was checking out their <a href="http://www.linode.com/api/">API</a> and noticed there wasn&#8217;t any Java client.  I wanted a do a small pet project so I took a couple hours this weekend and wrote a Java client for the API.</p>
<p>The API leverages <a href="http://hc.apache.org/httpclient-3.x/index.html">Apache HTTP Client</a> and <a href="http://json.org/java/">JSON.org Java</a> libraries and is built using <a href="http://maven.apache.org/">Maven</a>.</p>
<p>The project source code can be found <a href="http://github.com/theo/linode-api">here</a>.</p>
<p>If anyone runs into any problems with using it, please feel free to ping me! </p>
<p><strong>Update:</strong> Linode was nice enough to update their <a href="http://www.linode.com/api/">API page</a> with a reference to my project.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2009/10/11/linode-api-for-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recursive Remote Login</title>
		<link>http://www.theodorenguyen-cao.com/2009/10/04/recursive-remote-login/</link>
		<comments>http://www.theodorenguyen-cao.com/2009/10/04/recursive-remote-login/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 17:38:00 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>

		<guid isPermaLink="false">http://www.theodorenguyen-cao.com/?p=325</guid>
		<description><![CDATA[Trippy.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.theodorenguyen-cao.com/wp-content/uploads/2009/10/recursive-remote-login.png"><img class="aligncenter size-full wp-image-326" title="recursive-remote-login" src="http://www.theodorenguyen-cao.com/wp-content/uploads/2009/10/recursive-remote-login.png" alt="recursive-remote-login" width="350" height="263" /></a></p>
<p>Trippy.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2009/10/04/recursive-remote-login/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Terracotta acquires Ehcache</title>
		<link>http://www.theodorenguyen-cao.com/2009/08/18/terracotta-acquires-ehcache/</link>
		<comments>http://www.theodorenguyen-cao.com/2009/08/18/terracotta-acquires-ehcache/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 19:40:16 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>

		<guid isPermaLink="false">http://www.theodorenguyen-cao.com/?p=323</guid>
		<description><![CDATA[Pretty big news in the Java world today. Open-source with a business model company, Terracotta, acquired Ehcache, the very popular caching library. The creator and maintainer of Ehcache, Greg Luck, had these things to say about the acquisition: What this means for Ehcache Users Ehcache remains under the Apache 2 license New feature development is [...]]]></description>
			<content:encoded><![CDATA[<p>Pretty big news in the Java world today.</p>
<p>Open-source with a business model company, Terracotta, acquired Ehcache, the very popular caching library.</p>
<p>The creator and maintainer of Ehcache, Greg Luck, had these things to say about  the acquisition:</p>
<blockquote><p>What this means for Ehcache Users</p>
<ul>
<li><span style="background-color: #ffffff;">Ehcache remains under the Apache 2 license</span></li>
<li><span style="background-color: #ffffff;">New feature development is accelerated with the addition of a team of engineers working full-time on Ehcache</span></li>
<li><span style="background-color: #ffffff;">I am full-time on Ehcache. I have not had the time I would have liked to devote to Ehcache (I have been doing a miserly 10-15 hours per week for the past 6 years) but now I do. Look out!</span></li>
<li><span style="background-color: #ffffff;">Ehcache extends its standards support. There are multiple emerging standards in this area and I plan to work with the community to lead further standardisation efforts. A lack of time has been my biggest obstacle in doing more on this to date.</span></li>
<li><span style="background-color: #ffffff;">Ehcache gets new hosting at ehcache.org with state-of-the-art forums, source control and bug reporting. The changes will happen slowly and carefully.</span></li>
<li><span style="background-color: #ffffff;">File release at sourceforge.net is retained</span></li>
<li><span style="background-color: #ffffff;">Maven deployment to oss.sonatype.org and Maven Central is retained.</span></li>
<li><span style="background-color: #ffffff;">Distributed caching via Terracotta is seamless. Ehcache users can have full confidence that they can start single node and scale as high as they need to with Enterprise features.</span></li>
<li><span style="background-color: #ffffff;">Enterprise support, training and professional services for Ehcache. I have provided these for a few years now, but now we will have the full Terracotta organisation behind them with the usual SLAs.</span></li>
</ul>
<p>What this means for Terracotta Users</p>
<ul>
<li><span style="background-color: #ffffff;">Ehcache APIs will replace Terracotta distributed cache APIs as a single caching interface / standard for Terracotta distributed caching</span></li>
<li><span style="background-color: #ffffff;">a single-node version of Terracotta ala Ehcache will be available for the first time</span></li>
<li><span style="background-color: #ffffff;">Full freedom to run on the latest version of Ehcache at all times, knowing it will work with Terracotta</span></li>
<li><span style="background-color: #ffffff;">Single vendor support structure for caching interfaces / libraries as well as their scalability / reliability runtime.</span></li>
<li><span style="background-color: #ffffff;">the investment protection of standards</span></li>
</ul>
</blockquote>
<p>It&#8217;s pretty cool to see open source companies like SpringSource (recently acquired by VMWare) and Terracotta making big moves. I look forward to seeing what&#8217;s next for these guys.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2009/08/18/terracotta-acquires-ehcache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The JSON Saga</title>
		<link>http://www.theodorenguyen-cao.com/2009/08/14/the-json-saga/</link>
		<comments>http://www.theodorenguyen-cao.com/2009/08/14/the-json-saga/#comments</comments>
		<pubDate>Fri, 14 Aug 2009 20:40:43 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>

		<guid isPermaLink="false">http://www.theodorenguyen-cao.com/?p=319</guid>
		<description><![CDATA[Working with JSON all day and implementing my own URL shortening app, diminutiveurl.com using Base32 encoding, I really admire Douglas Crockford&#8217;s smart and simple approach to these topics. I stumbled upon Crockford&#8217;s talk on the JSON Saga, where he tells the story of how JSON came about. He is a really smart guy and a [...]]]></description>
			<content:encoded><![CDATA[<p>Working with <a href="http://www.json.org">JSON</a> all day and implementing my own URL shortening app, <a href="http://www.diminutiveurl.com">diminutiveurl.com</a> using <a href="http://www.crockford.com/wrmg/base32.html">Base32 encoding</a>, I really admire Douglas Crockford&#8217;s smart and simple approach to these topics.</p>
<p>I stumbled upon Crockford&#8217;s talk on the JSON Saga, where he tells the story of how JSON came about.  He is a really smart guy and a talented speaker. Check out the video:</p>
<div><object width="576" height="358" allowFullScreen="true"><param name="movie" value="http://cosmos.bcst.yahoo.com/up/ypp/default/player.swf"></param><param name="flashVars" value="vid=14846971&#038;siteHostUrl=http%3A//video.yahoo.com"></param><param name="wmode" value="transparent"></param><embed width="576" height="358" allowFullScreen="true" src="http://cosmos.bcst.yahoo.com/up/ypp/default/player.swf" type="application/x-shockwave-flash" flashvars="vid=14846971&#038;siteHostUrl=http%3A//video.yahoo.com"></embed></object></div>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2009/08/14/the-json-saga/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google App Engine adds Java support (Review)</title>
		<link>http://www.theodorenguyen-cao.com/2009/04/08/google-app-engine-adds-java-support-review/</link>
		<comments>http://www.theodorenguyen-cao.com/2009/04/08/google-app-engine-adds-java-support-review/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 20:30:32 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[appengine]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://www.theodorenguyen-cao.com/?p=293</guid>
		<description><![CDATA[Last night Google announced Java support on Google App Engine. After a bit of toying around, here are my findings. The Eclipse plugin is pretty slick. Deploying and build is simple. The dev server that you spin up locally looks to be jetty under the hood. Objects intended for storage are JDO annotated and after [...]]]></description>
			<content:encoded><![CDATA[<p>Last night Google <a href="http://googleappengine.blogspot.com/2009/04/seriously-this-time-new-language-on-app.html">announced</a> Java support on Google App Engine.</p>
<p>After a bit of toying around, here are my findings.</p>
<p>The Eclipse plugin is pretty slick. Deploying and build is simple.</p>
<p>The dev server that you spin up locally looks to be jetty under the hood.</p>
<p>Objects intended for storage are JDO annotated and after compiling, you run the .class files through the DataNucleus Enhancer which adds additional metadata so Google can map it to BigTable.  The Eclipse plugin automatically performs this step for you after compiling. The examples provide a bunch of ant macros to help facilitate building/deploying.</p>
<p>One issue that I had was that the project was building with Java 1.6 and I would get an error after compiling:</p>
<pre class="console">Caused by: java.lang.UnsupportedClassVersionError: Bad version number in .class file</pre>
<p></p>
<p>Even though they say they support Java 1.5 and 1.6, I guess this doesnâ€™t work on the Java 1.6 for the Mac.  Switching the build to 1.5 allows the DataNucleus Enhancer to run successfully. </p>
<p>Even though they are using JPA, some features have not yet been implemented or supported ( see <a href="http://code.google.com/appengine/docs/java/datastore/usingjpa.html#Unsupported_Features_of_JPA">http://code.google.com/appengine/docs/java/datastore/usingjpa.html#Unsupported_Features_of_JPA</a>)</p>
<p>Overall, I like what I see so far and think this would be great for quick prototypes of web apps/services.</p>
<p>Going through the tutorial, my awesome <a href="http://notedpath.appspot.com/guestbook.jsp">Guestbook</a> application has been created and deployed.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2009/04/08/google-app-engine-adds-java-support-review/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Custom field names in Rails error messages</title>
		<link>http://www.theodorenguyen-cao.com/2009/04/06/custom-field-names-in-rails-error-messages/</link>
		<comments>http://www.theodorenguyen-cao.com/2009/04/06/custom-field-names-in-rails-error-messages/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 03:36:28 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>

		<guid isPermaLink="false">http://www.theodorenguyen-cao.com/?p=286</guid>
		<description><![CDATA[The defaults in Rails with ActiveRecord is beautiful when you are just getting started and are created everything for the first time. But once you get into it and your database schema becomes a little more solidified, the things that would have been easy to do by relying on the conventions of Rails require a [...]]]></description>
			<content:encoded><![CDATA[<p>The defaults in Rails with ActiveRecord is beautiful when you are just getting started and are created everything for the first time.  But once you get into it and your database schema becomes a little more solidified, the things that would have been easy to do by relying on the conventions of Rails require a little bit more work.</p>
<p>In my case, I had a form where there was a database column named &#8220;num_guests&#8221;, representing the number of guests.  When the field fails to pass validation, the error messages is something like</p>
<blockquote><p>Num guests is not a number</p></blockquote>
<p>Not quite the text that we want.  It would be better if it said</p>
<blockquote><p>Number of guests is not a number</p></blockquote>
<p>After doing a little bit of digging, I found the <a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002244">human_attribute_name</a> method. You can override this method in your model class to provide alternative names for fields.  To change our error message, I did the following</p>
<pre name="code" class="ruby">
class Reservation < ActiveRecord::Base
  ...
  validates_presence_of :num_guests
  ...
  HUMAN_ATTRIBUTES = {
      :num_guests    => "Number of guests"
  }

  def self.human_attribute_name(attr)
      HUMAN_ATTRIBUTES[attr.to_sym] || super
  end
end
</pre>
<p>Since Rails 2.2, this method is used to support <a href="http://rails-i18n.org/wiki/pages/i18n-rails-guide">internationalization</a> (<a href="http://en.wikipedia.org/wiki/Internationalization_and_localization">i18n</a>).  Looking at it, it reminds me of Java&#8217;s <a href="http://java.sun.com/javase/6/docs/api/java/util/ResourceBundle.html">Resource Bundles</a> and <a href="http://static.springframework.org/spring/docs/2.5.5/reference/validation.html#validation-conversion">Spring MVC&#8217;s error messages</a>. Messages are defined based off a key and there&#8217;s a chain of look ups that get applied to resolve an error&#8217;s message.  </p>
<p>Although, I don&#8217;t see myself doing any i18n work in the near-term, it is cool that we have that option now in Rails.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2009/04/06/custom-field-names-in-rails-error-messages/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Checkboxes in Stripes and Spring MVC</title>
		<link>http://www.theodorenguyen-cao.com/2009/03/29/checkboxes-in-stripes-and-spring-mvc/</link>
		<comments>http://www.theodorenguyen-cao.com/2009/03/29/checkboxes-in-stripes-and-spring-mvc/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 06:42:01 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[stripes]]></category>

		<guid isPermaLink="false">http://www.theodorenguyen-cao.com/?p=270</guid>
		<description><![CDATA[When building dynamic web sites with lots of javascript UI components being created on the client, understanding how the web framework you&#8217;re using will process the request and what must be done to update fields accordingly is even more important. Specifically, checkboxes have always been a pain to deal with. The gotcha with checkboxes are [...]]]></description>
			<content:encoded><![CDATA[<p>When building dynamic web sites with lots of javascript UI components being created on the client, understanding how the web framework you&#8217;re using will process the request and what must be done to update fields accordingly is even more important.</p>
<p>Specifically, checkboxes have always been a pain to deal with.  The gotcha with checkboxes are if a checkbox isn&#8217;t checked, the request doesn&#8217;t send the parameter so it requires some additional checks to detect that the user deselected something that was there to update the field accordingly.  I&#8217;ve been playing around with the <a href="http://www.stripesframework.org">Stripes framework</a> and ran into this issue.  </p>
<p>With Stripes, you can render a checkbox using their JSP tag:</p>
<pre name="code" class="html">
&lt;stripes:checkbox checked="true" name="property1" value="yes"/&gt;
&lt;stripes:checkbox checked="true" name="property2" value="no"/&gt;
</pre>
<p>When the &#8220;checked&#8221; value is equal to &#8220;value&#8221; value, Stripes will render the checkbox as checked.  So with the code shown, two checkboxes will be shown with the first checked and the second unchecked. </p>
<p>If a user reverses this by unchecking the first, checking the second, and submit the form, the HTTP request will only see that <code>property2=no</code>.  Before the form was submitted, &#8220;property1&#8243; had a value of &#8220;yes&#8221;. Now, &#8220;property1&#8243; won&#8217;t even appear in the request parameters, so we have to do special handling to check for the absent of the parameter to update &#8220;property1&#8243; to whatever value it should be when it is not checked.</p>
<p>In Spring MVC with form binding, checkboxes are dealt with a little differently. Using Spring MVC&#8217;s <a href="http://static.springframework.org/spring/docs/2.0.x/reference/spring-form.tld.html">form JSP tag</a>, you can do:</p>
<pre name="code" class="html">
  &lt;form:checkbox path="property1" value="yes"/&gt;
  &lt;form:checkbox path="property2" value="no"/&gt;
</pre>
<p>Assuming your command bean is named &#8220;person&#8221;, this will generate the following HTML:</p>
<pre name="code" class="html">
        &lt;input name="person.property1" type="checkbox" value="yes"/&gt;
        &lt;input type="hidden" value="1" name="_person.property1"/&gt;
        &lt;input name="person.property2" type="checkbox" value="no"/&gt;
        &lt;input type="hidden" value="1" name="_person.property2"/&gt;
</pre>
<p>As noted by the <a href="http://static.springframework.org/spring/docs/2.5.5/reference/mvc.html">docs</a>, </p>
<blockquote><p>What you might not expect to see is the additional hidden field after each checkbox. When a checkbox in an HTML page is not checked, its value will not be sent to the server as part of the HTTP request parameters once the form is submitted, so we need a workaround for this quirk in HTML in order for Spring form data binding to work. The checkbox tag follows the existing Spring convention of including a hidden parameter prefixed by an underscore (&#8220;_&#8221;) for each checkbox. By doing this, you are effectively telling Spring that â€œthe checkbox was visible in the form and I want my object to which the form data will be bound to reflect the state of the checkbox no matter whatâ€.</p></blockquote>
<p>Spring MVC  also provides a <a href="http://static.springframework.org/spring/docs/2.0.x/reference/spring-form.tld.html#spring-form.tld.checkboxes">&#8220;checkboxes&#8221; tag</a> which allows you to render a list of checkbox boxes without having to wrap the &#8220;checkbox&#8221; tag around a JSTL forEach.</p>
<p>Hopefully, that gives you some insight into how to work with checkboxes in Stripes and Spring MVC.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2009/03/29/checkboxes-in-stripes-and-spring-mvc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Moving wordpress to another host</title>
		<link>http://www.theodorenguyen-cao.com/2009/01/21/moving-wordpress-to-another-host/</link>
		<comments>http://www.theodorenguyen-cao.com/2009/01/21/moving-wordpress-to-another-host/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 04:57:35 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.theodorenguyen-cao.com/?p=196</guid>
		<description><![CDATA[If you&#8217;ve been following my blog for awhile, you might have noticed I moved this blog from blog.notedpath.com to theodorenguyen-cao.com as it was more fitting domain. I originally just registered the domain, added the DNS record, and updated my apache config to have theodorenguyen-cao.com to be an server alias to blog.notedpath.com. This allowed requests to [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;ve been following my blog for awhile, you might have noticed I moved this blog from <a href="http://blog.notedpath.com">blog.notedpath.com</a> to <a href="http://www.theodorenguyen-cao.com">theodorenguyen-cao.com</a> as it was more fitting domain.  I originally just registered the domain, added the DNS record, and updated my apache config to have <a href="http://www.theodorenguyen-cao.com">theodorenguyen-cao.com</a> to be an server alias to blog.notedpath.com.</p>
<p>This allowed requests to blog.notedpath.com/* and theodorenguyen-cao/* respond with the same content.  I thought I was done.  I discovered this wasn&#8217;t the case when I saw blog.notedpath.com as a direct traffic source in my google analytics for <a href="http://www.theodorenguyen-cao.com">theodorenguyen-cao.com</a>.  To fix the screwed up analytics, I needed to make it so that all requests that go to blog.notedpath.com are permanently redirected (301) to <a href="http://www.theodorenguyen-cao.com">theodorenguyen-cao.com</a>.</p>
<p>To do this I had to apply an Apache mod_alias <a href="http://httpd.apache.org/docs/1.3/mod/mod_alias.html#redirect" target="_blank">redirect directive</a> as such:</p>
<pre name="code" class="xml" >
&lt;VirtualHost *:80&gt;
        VirtualDocumentRoot /var/www/blog
        ServerName blog.notedpath.com
        Redirect permanent / http://www.theodorenguyen-cao.com/
        ErrorLog /var/log/apache2/wp-error.log
        TransferLog /var/log/apache2/wp-access.log
&lt;/VirtualHost&gt;
</pre>
<p>The virtual host for <a href="http://www.theodorenguyen-cao.com">theodorenguyen-cao.com</a> looks like:</p>
<pre name="code" class="xml" >
&lt;VirtualHost *:80&gt;
    VirtualDocumentRoot /var/www/blog
    ServerName www.theodorenguyen-cao.com
    ServerAlias theodorenguyen-cao.com
    CustomLog /var/log/apache2/theodorenguyen-cao.com_access.log Combined
    ErrorLog /var/log/apache2/theodorenguyen-cao_error.log
&lt;/VirtualHost&gt;
</pre>
<p>At first I thought this would only fix the simple case of blog.notedpath.com redirecting to <a href="http://www.theodorenguyen-cao.com">theodorenguyen-cao.com</a>, but blog.notepath.com/foobar not being translated to theodorenguyen-cao.com/foobar.  However, this does exactly what I want. All blog.notedpath.com URLs will be replaced with <a href="http://www.theodorenguyen-cao.com">theodorenguyen-cao.com</a> URLs.  Old bookmarks will simply redirect to a theodorenguyen-cao.com URL and not 404.</p>
<p>Success!</p>
<p>I&#8217;m still waiting to see if Google will update the search result links that point to blog.notedpath.com to be <a href="http://www.theodorenguyen-cao.com">theodorenguyen-cao.com</a> URLs.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2009/01/21/moving-wordpress-to-another-host/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using validates_presence_of on a boolean field? Should use validates_inclusion_of!</title>
		<link>http://www.theodorenguyen-cao.com/2009/01/12/using-validates_presence_of-on-a-boolean-field-should-use-validates_inclusion_of/</link>
		<comments>http://www.theodorenguyen-cao.com/2009/01/12/using-validates_presence_of-on-a-boolean-field-should-use-validates_inclusion_of/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 05:38:43 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.theodorenguyen-cao.com/?p=191</guid>
		<description><![CDATA[rsvp.theoandpat.com had boolean flag to marked whether or not a visitor was going to be able to make it to our wedding. Unfortunately, if you selected you were not able to make it and submit the form, the application would return saying it could not process your submission because you have to say that you [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://rsvp.theoandpat.com">rsvp.theoandpat.com</a> had boolean flag to marked whether or not a visitor was going to be able to make it to our wedding. Unfortunately, if you selected you were not able to make it and submit the form, the application would return saying it could not process your submission because you have to say that you are going to make it. I argued, this is an RSVP form so you have to accept if you are RSVPing. That&#8217;s the point of the RSVP! Only people RSVP would bother submitting the form!Â  Pat wasn&#8217;t too happy about that and ask/told me to fix it.Â  </p>
<p>Digging into it, it turns out the wayÂ  for <code><a href="http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M001893">validates_presence_of</a></code> relies on <code>Object#blank</code> which of course when sent</p>
<pre name="code" class="ruby">
false.blank? # returns true
</pre>
<p>Reading up on the documentation, it is suggested to use <code><a href="http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M001898">validates_inclusion_of</a></code> when dealing with booleans.</p>
<p>The one line change solved the problem:</p>
<pre name="code" class="ruby">
validates_inclusion_of :accepted, :in => [true, false]
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2009/01/12/using-validates_presence_of-on-a-boolean-field-should-use-validates_inclusion_of/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>tiny URLs? HA! diminutive URLs for the win!</title>
		<link>http://www.theodorenguyen-cao.com/2009/01/11/tiny-urls-ha-diminutive-urls-for-the-win/</link>
		<comments>http://www.theodorenguyen-cao.com/2009/01/11/tiny-urls-ha-diminutive-urls-for-the-win/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 04:19:10 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>
		<category><![CDATA[humor]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.theodorenguyen-cao.com/?p=171</guid>
		<description><![CDATA[Inspired by a discussion of URL shortening, I took a weekend and implemented one of my own. When thinking about tiny URLs, a quote always came to mind. Don&#8217;t use a big word where a diminutive one will suffice. So after finding out the domain was available, diminutiveurl.com was born. Yes, it&#8217;s poking a little [...]]]></description>
			<content:encoded><![CDATA[<p>Inspired by a <a href="http://www.codinghorror.com/blog/archives/000935.html">discussion</a> of URL shortening, I took a weekend and implemented one of my own.  When thinking about tiny URLs, a <a href="http://www.quotationspage.com/quote/264.html">quote</a> always came to mind.</p>
<blockquote><p>Don&#8217;t use a big word where a diminutive one will suffice.</p></blockquote>
<p>So after finding out the domain was available, <a href="http://www.diminutiveurl.com">diminutiveurl.com</a> was born.  Yes, it&#8217;s poking a little fun at the idea of a tiny url but it was fun to hack on.  It&#8217;s very minimilistic at this point but I hope to add some interesting features.<br />
<center><a href="http://www.diminutiveurl.com"><img class="size-full wp-image-172" title="diminutiveurl.com" src="http://www.theodorenguyen-cao.com/wp-content/uploads/2009/01/wt496ac2561d2a0-thumb_medium.jpg" alt="diminutiveurl.com" width="320" height="240" /></a></center></p>
<p>For no other reason than to build something, I hope you enjoy it! I am glad to present <a href="http://www.diminitiveurl.com">diminitiveurl.com</a>!  Please <a href="http://diminutiveurl.uservoice.com/">let me know what you think</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2009/01/11/tiny-urls-ha-diminutive-urls-for-the-win/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setting up Phusion Passenger (mod_rails) with Capistrano support</title>
		<link>http://www.theodorenguyen-cao.com/2008/12/06/setting-up-phusion-passenger-mod_rails-with-capistrano-support/</link>
		<comments>http://www.theodorenguyen-cao.com/2008/12/06/setting-up-phusion-passenger-mod_rails-with-capistrano-support/#comments</comments>
		<pubDate>Sun, 07 Dec 2008 00:27:18 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.theodorenguyen-cao.com/?p=144</guid>
		<description><![CDATA[I had heard of mod_rails awhile back but never had the time to take a closer look at it. While setting up a new rails app, I was getting frustrated with all of the configuration I needed to do to get the mongrel clusters and proxy balancers setup. So I decided to give passenger a [...]]]></description>
			<content:encoded><![CDATA[<p>I had heard of mod_rails awhile back but never had the time to take a closer look at it.  While setting up a new rails app, I was getting frustrated with all of the configuration I needed to do to get the mongrel clusters and proxy balancers setup.  So I decided to give passenger a chance.  I&#8217;m a fan now <img src='http://www.theodorenguyen-cao.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>The process was dead simple.</p>
<ol>
<li>Install the passenger gem
<pre class="console" name="code">sudo gem install passenger</pre>
</li>
<li>Install passenger as an Apache module
<pre class="console" name="code">passenger-install-apache2-module</pre>
</li>
<li>Load the passenger apache module by editing the Apache config
<pre class="console" name="code">
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.0.5/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.0.5
PassengerRuby /usr/bin/ruby1.8
</pre>
</li>
<li>Restart Apache</li>
</ol>
<p>If all things went well, you have everything installed you need. If there were some missing dependencies, you should be presented with how to install those dependencies.</p>
<p>In the installation output, it tells you how to mod_railsify your apps by creating a vhost as such:</p>
<pre class="console" name="code">
&lt;VirtualHost *:80&gt;
    ServerName www.mywebsite.com
    DocumentRoot /home/deploy/mywebsite/public
&lt;/VirtualHost&gt;
</pre>
<p>That&#8217;s it! No more of this proxy balancer and mongrel_cluster.yml configuration.</p>
<p>There&#8217;s some magic going on in the background.  As requests come in, passenger will spin up more application instances.  For more tweaking your configuration options check out the <a href="http://www.modrails.com/documentation/Users%20guide.html#_resource_control_and_optimization_options">user guide</a>.</p>
<p>Go to your website and you should see your rails app up and running.</p>
<p>So now we have your app up and running, how do we update or restart our app?  Passenger provides two ways for us to do this. </p>
<p>The first is whenever apache is restarted, your application is restarted.</p>
<p>The second way allows us to restart a specified application without affecting Apache.  Whenever passenger detects <code>tmp/restart.txt</code>, it will restart the application instances for us.  We can integrate this into our Capistrano deploy flow by adding the following  our <code>config/deploy.rb</code></p>
<pre name="code" class="ruby">
namespace :passenger do
  desc "Restart Application"
  task :restart do
    run "touch #{current_path}/tmp/restart.txt"
  end
end

after :deploy, "passenger:restart"
</pre>
<p>This will create that restart.txt after the cap:deploy task gets executed, causing the application to restart.</p>
<p>Finally, passenger comes with some pretty useful utilities.</p>
<p>Check out <code>passenger-status</code> which produces output showing current passenger server statuses.</p>
<p>Sample output: </p>
<pre name="code" class="console">
----------- General information -----------
max      = 6
count    = 1
active   = 0
inactive = 1
Using global queue: no
Waiting on global queue: 0

----------- Applications -----------
/home/deploy/www.myapp.com/releases/20081206183156:
  PID: 30784     Sessions: 0
</pre>
<p>Another utility <code>passenger-memory-status</code> gives you insight into how much memory is being used by apache and passenger.</p>
<p>Sample output:</p>
<pre name="code" class="console">
-------------- Apache processes ---------------
PID    PPID   Threads  VMSize    Private  Name
-----------------------------------------------
12841  1      1        225.9 MB  0.0 MB   /usr/sbin/apache2 -k start
28294  12841  1        248.4 MB  21.4 MB  /usr/sbin/apache2 -k start
28300  12841  1        243.7 MB  0.5 MB   /usr/sbin/apache2 -k start
28306  12841  1        248.4 MB  4.4 MB   /usr/sbin/apache2 -k start
28357  12841  1        249.1 MB  19.8 MB  /usr/sbin/apache2 -k start
29400  12841  1        249.4 MB  3.7 MB   /usr/sbin/apache2 -k start
29788  12841  1        249.3 MB  21.7 MB  /usr/sbin/apache2 -k start
29834  12841  1        245.8 MB  18.9 MB  /usr/sbin/apache2 -k start
29836  12841  1        245.8 MB  9.3 MB   /usr/sbin/apache2 -k start
29868  12841  1        245.8 MB  2.4 MB   /usr/sbin/apache2 -k start
29870  12841  1        246.5 MB  5.2 MB   /usr/sbin/apache2 -k start
### Processes: 11
### Total private dirty RSS: 107.44 MB

--------- Passenger processes ----------
PID    Threads  VMSize    Private  Name
----------------------------------------
28031  10       15.3 MB   0.1 MB   /usr/lib/ruby/gems/1.8/gems/passenger-2.0.5/ext/apache2/ApplicationPoolServerExecutable 0 /usr/lib/ruby/gems/1.8/gems/passenger-2.0.5/bin/passenger-spawn-server  /usr/bin/ruby1.8  /tmp/passenger_status.12841.fifo
28032  2        48.7 MB   0.6 MB   Passenger spawn server
29161  1        114.8 MB  0.7 MB   Passenger FrameworkSpawner: 2.1.2
30461  1        122.8 MB  32.3 MB  Passenger ApplicationSpawner: /home/deploy/www.myapp.com/releases/20081206183156
30784  1        129.3 MB  33.4 MB  Rails: /home/deploy/www.myapp.com/releases/20081206183156
### Processes: 5
### Total private dirty RSS: 67.08 MB
</pre>
<p>Pretty sweet.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2008/12/06/setting-up-phusion-passenger-mod_rails-with-capistrano-support/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>2 ways to fix transparent PNG files in IE6</title>
		<link>http://www.theodorenguyen-cao.com/2008/11/09/2-ways-to-fix-transparent-png-files-in-ie6/</link>
		<comments>http://www.theodorenguyen-cao.com/2008/11/09/2-ways-to-fix-transparent-png-files-in-ie6/#comments</comments>
		<pubDate>Sun, 09 Nov 2008 23:51:15 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[how-to]]></category>

		<guid isPermaLink="false">http://www.theodorenguyen-cao.com/?p=139</guid>
		<description><![CDATA[I fired up Photoshop for the first time in a long time. I created a transparent PNG for an image that would be used as a CSS background-image. It keeps displaying with a gray background even though the page background color was something else. This is a pretty well documented bug. Luckily, there are a [...]]]></description>
			<content:encoded><![CDATA[<p>I fired up Photoshop for the first time in a long time.  I created a transparent PNG for an image that would be used as a CSS background-image.  It keeps displaying with a gray background even though the page background color was something else.</p>
<p>This is a pretty well documented <a href="http://support.microsoft.com/kb/294714">bug</a>. Luckily, there are a couple of ways to fix this.  </p>
<p>Here are my two favorites:</p>
<p>The first solution is well documented:</p>
<p>Download <a href="http://www.twinhelix.com/css/iepngfix/">iepngfix.zip</a>. The development version 2.0 Alpha 3 has support for background position and repeat.  Extract the zip and copy  <code>iepngfix.htc</code> and <code>blank.gif</code> somewhere.  I put in under <code>stylesheets</code>.</p>
<p>Add the following snippet to your CSS stylesheet:</p>
<pre name="code" class="css">
img {
	behavior: url(/stylesheets/iepngfix.htc);
}
</pre>
<p>And you&#8217;re done! Hit refresh in IE6 and transparent PNG images should render correctly now.</p>
<p>You can add apply this fix to other elements that may be using PNG images as CSS background images as such:</p>
<pre name="code" class="css">
img, #logo {
	behavior: url(/stylesheets/iepngfix.htc);
}
</pre>
<p>where logo is a div that has a background-image that is a transparent PNG.</p>
<p>Note: If you are using v2.0 and want to take advantage of background-repeat and position support, copy <code>iepngfix_tilebg.js</code> to your javascripts folder and include the js file in the HTML files you need it for.</p>
<p>The second way to fix this is to <a href="http://www.stopie6.org/">get everyone off IE6</a> but I guess that&#8217;s just wishful thinking&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2008/11/09/2-ways-to-fix-transparent-png-files-in-ie6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>undefined local variable or method `remote_gemspecs&#8217;</title>
		<link>http://www.theodorenguyen-cao.com/2008/11/08/undefined-local-variable-or-method-remote_gemspecs/</link>
		<comments>http://www.theodorenguyen-cao.com/2008/11/08/undefined-local-variable-or-method-remote_gemspecs/#comments</comments>
		<pubDate>Sat, 08 Nov 2008 17:50:45 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[how-to]]></category>

		<guid isPermaLink="false">http://www.theodorenguyen-cao.com/?p=136</guid>
		<description><![CDATA[I decided I wanted to dedicate some time this weekend working on some side projects. Of course before I start, I needed to get the latest and greatest updates so I ran gem update and got the following error theo@theo~/dev $ sudo gem update Updating installed gems ... Updating rubygems-update Successfully installed rubygems-update-1.3.1 ERROR: While [...]]]></description>
			<content:encoded><![CDATA[<p>I decided I wanted to dedicate some time this weekend working on some side projects. Of course before I start, I needed to get the latest and greatest updates so I ran <code>gem update</code> and got the following error</p>
<pre class="console">
theo@theo~/dev $ sudo gem update
Updating installed gems
...
Updating rubygems-update
Successfully installed rubygems-update-1.3.1
ERROR:  While executing gem ... (NameError)
    undefined local variable or method `remote_gemspecs' for #<Gem::Commands::UpdateCommand:0x12cfb2c>
</pre>
<p>Reading the <a href="http://rubyforge.org/forum/forum.php?forum_id=28071">release notes</a>:</p>
<blockquote><p>NOTE: RubyGems 1.1 and 1.2 have problems upgrading when there is no<br />
rubygems-update installed. You will need to follow the second set of update<br />
instructions if you see &#8220;Nothing to update&#8221;.
</p></blockquote>
<p>shows that we need to install and run the rubygem-update gem to get this fixed</p>
<pre class="console">
  theo@theo~/dev $ sudo gem install rubygems-update
Successfully installed rubygems-update-1.3.1
1 gem installed
  theo@theo~/dev $ sudo update_rubygems
Installing RubyGems 1.3.1
mkdir -p /Library/Ruby/Site/1.8
mkdir -p /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin
install -c -m 0644 rbconfig/datadir.rb /Library/Ruby/Site/1.8/rbconfig/datadir.rb
install -c -m 0644 rubygems/builder.rb /Library/Ruby/Site/1.8/rubygems/builder.rb
install -c -m 0644 rubygems/command.rb /Library/Ruby/Site/1.8/rubygems/command.rb
install -c -m 0644 rubygems/command_manager.rb /Library/Ruby/Site/1.8/rubygems/command_manager.rb
install -c -m 0644 rubygems/commands/build_command.rb /Library/Ruby/Site/1.8/rubygems/commands/build_command.rb
install -c -m 0644 rubygems/commands/cert_command.rb /Library/Ruby/Site/1.8/rubygems/commands/cert_command.rb
install -c -m 0644 rubygems/commands/check_command.rb /Library/Ruby/Site/1.8/rubygems/commands/check_command.rb
install -c -m 0644 rubygems/commands/cleanup_command.rb /Library/Ruby/Site/1.8/rubygems/commands/cleanup_command.rb
install -c -m 0644 rubygems/commands/contents_command.rb /Library/Ruby/Site/1.8/rubygems/commands/contents_command.rb
install -c -m 0644 rubygems/commands/dependency_command.rb /Library/Ruby/Site/1.8/rubygems/commands/dependency_command.rb
install -c -m 0644 rubygems/commands/environment_command.rb /Library/Ruby/Site/1.8/rubygems/commands/environment_command.rb
install -c -m 0644 rubygems/commands/fetch_command.rb /Library/Ruby/Site/1.8/rubygems/commands/fetch_command.rb
install -c -m 0644 rubygems/commands/generate_index_command.rb /Library/Ruby/Site/1.8/rubygems/commands/generate_index_command.rb
install -c -m 0644 rubygems/commands/help_command.rb /Library/Ruby/Site/1.8/rubygems/commands/help_command.rb
install -c -m 0644 rubygems/commands/install_command.rb /Library/Ruby/Site/1.8/rubygems/commands/install_command.rb
install -c -m 0644 rubygems/commands/list_command.rb /Library/Ruby/Site/1.8/rubygems/commands/list_command.rb
install -c -m 0644 rubygems/commands/lock_command.rb /Library/Ruby/Site/1.8/rubygems/commands/lock_command.rb
install -c -m 0644 rubygems/commands/mirror_command.rb /Library/Ruby/Site/1.8/rubygems/commands/mirror_command.rb
install -c -m 0644 rubygems/commands/outdated_command.rb /Library/Ruby/Site/1.8/rubygems/commands/outdated_command.rb
install -c -m 0644 rubygems/commands/pristine_command.rb /Library/Ruby/Site/1.8/rubygems/commands/pristine_command.rb
install -c -m 0644 rubygems/commands/query_command.rb /Library/Ruby/Site/1.8/rubygems/commands/query_command.rb
install -c -m 0644 rubygems/commands/rdoc_command.rb /Library/Ruby/Site/1.8/rubygems/commands/rdoc_command.rb
install -c -m 0644 rubygems/commands/search_command.rb /Library/Ruby/Site/1.8/rubygems/commands/search_command.rb
install -c -m 0644 rubygems/commands/server_command.rb /Library/Ruby/Site/1.8/rubygems/commands/server_command.rb
install -c -m 0644 rubygems/commands/sources_command.rb /Library/Ruby/Site/1.8/rubygems/commands/sources_command.rb
install -c -m 0644 rubygems/commands/specification_command.rb /Library/Ruby/Site/1.8/rubygems/commands/specification_command.rb
install -c -m 0644 rubygems/commands/stale_command.rb /Library/Ruby/Site/1.8/rubygems/commands/stale_command.rb
install -c -m 0644 rubygems/commands/uninstall_command.rb /Library/Ruby/Site/1.8/rubygems/commands/uninstall_command.rb
install -c -m 0644 rubygems/commands/unpack_command.rb /Library/Ruby/Site/1.8/rubygems/commands/unpack_command.rb
install -c -m 0644 rubygems/commands/update_command.rb /Library/Ruby/Site/1.8/rubygems/commands/update_command.rb
install -c -m 0644 rubygems/commands/which_command.rb /Library/Ruby/Site/1.8/rubygems/commands/which_command.rb
install -c -m 0644 rubygems/config_file.rb /Library/Ruby/Site/1.8/rubygems/config_file.rb
install -c -m 0644 rubygems/custom_require.rb /Library/Ruby/Site/1.8/rubygems/custom_require.rb
install -c -m 0644 rubygems/defaults.rb /Library/Ruby/Site/1.8/rubygems/defaults.rb
install -c -m 0644 rubygems/dependency.rb /Library/Ruby/Site/1.8/rubygems/dependency.rb
install -c -m 0644 rubygems/dependency_installer.rb /Library/Ruby/Site/1.8/rubygems/dependency_installer.rb
install -c -m 0644 rubygems/dependency_list.rb /Library/Ruby/Site/1.8/rubygems/dependency_list.rb
install -c -m 0644 rubygems/digest/digest_adapter.rb /Library/Ruby/Site/1.8/rubygems/digest/digest_adapter.rb
install -c -m 0644 rubygems/digest/md5.rb /Library/Ruby/Site/1.8/rubygems/digest/md5.rb
install -c -m 0644 rubygems/digest/sha1.rb /Library/Ruby/Site/1.8/rubygems/digest/sha1.rb
install -c -m 0644 rubygems/digest/sha2.rb /Library/Ruby/Site/1.8/rubygems/digest/sha2.rb
install -c -m 0644 rubygems/doc_manager.rb /Library/Ruby/Site/1.8/rubygems/doc_manager.rb
install -c -m 0644 rubygems/exceptions.rb /Library/Ruby/Site/1.8/rubygems/exceptions.rb
install -c -m 0644 rubygems/ext/builder.rb /Library/Ruby/Site/1.8/rubygems/ext/builder.rb
install -c -m 0644 rubygems/ext/configure_builder.rb /Library/Ruby/Site/1.8/rubygems/ext/configure_builder.rb
install -c -m 0644 rubygems/ext/ext_conf_builder.rb /Library/Ruby/Site/1.8/rubygems/ext/ext_conf_builder.rb
install -c -m 0644 rubygems/ext/rake_builder.rb /Library/Ruby/Site/1.8/rubygems/ext/rake_builder.rb
install -c -m 0644 rubygems/ext.rb /Library/Ruby/Site/1.8/rubygems/ext.rb
install -c -m 0644 rubygems/format.rb /Library/Ruby/Site/1.8/rubygems/format.rb
install -c -m 0644 rubygems/gem_openssl.rb /Library/Ruby/Site/1.8/rubygems/gem_openssl.rb
install -c -m 0644 rubygems/gem_path_searcher.rb /Library/Ruby/Site/1.8/rubygems/gem_path_searcher.rb
install -c -m 0644 rubygems/gem_runner.rb /Library/Ruby/Site/1.8/rubygems/gem_runner.rb
install -c -m 0644 rubygems/indexer.rb /Library/Ruby/Site/1.8/rubygems/indexer.rb
install -c -m 0644 rubygems/install_update_options.rb /Library/Ruby/Site/1.8/rubygems/install_update_options.rb
install -c -m 0644 rubygems/installer.rb /Library/Ruby/Site/1.8/rubygems/installer.rb
install -c -m 0644 rubygems/local_remote_options.rb /Library/Ruby/Site/1.8/rubygems/local_remote_options.rb
install -c -m 0644 rubygems/old_format.rb /Library/Ruby/Site/1.8/rubygems/old_format.rb
install -c -m 0644 rubygems/package/f_sync_dir.rb /Library/Ruby/Site/1.8/rubygems/package/f_sync_dir.rb
install -c -m 0644 rubygems/package/tar_header.rb /Library/Ruby/Site/1.8/rubygems/package/tar_header.rb
install -c -m 0644 rubygems/package/tar_input.rb /Library/Ruby/Site/1.8/rubygems/package/tar_input.rb
install -c -m 0644 rubygems/package/tar_output.rb /Library/Ruby/Site/1.8/rubygems/package/tar_output.rb
install -c -m 0644 rubygems/package/tar_reader/entry.rb /Library/Ruby/Site/1.8/rubygems/package/tar_reader/entry.rb
install -c -m 0644 rubygems/package/tar_reader.rb /Library/Ruby/Site/1.8/rubygems/package/tar_reader.rb
install -c -m 0644 rubygems/package/tar_writer.rb /Library/Ruby/Site/1.8/rubygems/package/tar_writer.rb
install -c -m 0644 rubygems/package.rb /Library/Ruby/Site/1.8/rubygems/package.rb
install -c -m 0644 rubygems/platform.rb /Library/Ruby/Site/1.8/rubygems/platform.rb
install -c -m 0644 rubygems/remote_fetcher.rb /Library/Ruby/Site/1.8/rubygems/remote_fetcher.rb
install -c -m 0644 rubygems/require_paths_builder.rb /Library/Ruby/Site/1.8/rubygems/require_paths_builder.rb
install -c -m 0644 rubygems/requirement.rb /Library/Ruby/Site/1.8/rubygems/requirement.rb
install -c -m 0644 rubygems/rubygems_version.rb /Library/Ruby/Site/1.8/rubygems/rubygems_version.rb
install -c -m 0644 rubygems/security.rb /Library/Ruby/Site/1.8/rubygems/security.rb
install -c -m 0644 rubygems/server.rb /Library/Ruby/Site/1.8/rubygems/server.rb
install -c -m 0644 rubygems/source_index.rb /Library/Ruby/Site/1.8/rubygems/source_index.rb
install -c -m 0644 rubygems/source_info_cache.rb /Library/Ruby/Site/1.8/rubygems/source_info_cache.rb
install -c -m 0644 rubygems/source_info_cache_entry.rb /Library/Ruby/Site/1.8/rubygems/source_info_cache_entry.rb
install -c -m 0644 rubygems/spec_fetcher.rb /Library/Ruby/Site/1.8/rubygems/spec_fetcher.rb
install -c -m 0644 rubygems/specification.rb /Library/Ruby/Site/1.8/rubygems/specification.rb
install -c -m 0644 rubygems/test_utilities.rb /Library/Ruby/Site/1.8/rubygems/test_utilities.rb
install -c -m 0644 rubygems/timer.rb /Library/Ruby/Site/1.8/rubygems/timer.rb
install -c -m 0644 rubygems/uninstaller.rb /Library/Ruby/Site/1.8/rubygems/uninstaller.rb
install -c -m 0644 rubygems/user_interaction.rb /Library/Ruby/Site/1.8/rubygems/user_interaction.rb
install -c -m 0644 rubygems/validator.rb /Library/Ruby/Site/1.8/rubygems/validator.rb
install -c -m 0644 rubygems/version.rb /Library/Ruby/Site/1.8/rubygems/version.rb
install -c -m 0644 rubygems/version_option.rb /Library/Ruby/Site/1.8/rubygems/version_option.rb
install -c -m 0644 rubygems.rb /Library/Ruby/Site/1.8/rubygems.rb
install -c -m 0644 ubygems.rb /Library/Ruby/Site/1.8/ubygems.rb
cp gem /tmp/gem
install -c -m 0755 /tmp/gem /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/gem
rm /tmp/gem
rm -f /Users/theo/.gem/source_cache
rm -f /Library/Ruby/Gems/1.8/source_cache
Removing old RubyGems RDoc and ri
rm -rf /Library/Ruby/Gems/1.8/doc/rubygems-1.2.0
Installing rubygems-1.3.1 ri into /Library/Ruby/Gems/1.8/doc/rubygems-1.3.1/ri
Installing rubygems-1.3.1 rdoc into /Library/Ruby/Gems/1.8/doc/rubygems-1.3.1/rdoc

------------------------------------------------------------------------------

= Announce: RubyGems Release 1.3.0

NOTE:  RubyGems 1.1 and 1.2 have problems upgrading when there is no
rubygems-update installed.  You will need to follow the second set of update
instructions if you see "Nothing to update".

Release 1.3.0 fixes some bugs.

Bugs fixed:

* Disregard ownership of ~ under Windows while creating ~/.gem.  Fixes
  issues related to no uid support under Windows.
* Fix requires for Gem::inflate, Gem::deflate, etc.
* Make Gem.dir respect :gemhome value from config.  (Note: this feature may be
  removed since it is hard to implement on 1.9.)
* Kernel methods are now private.  Patch #20801 by Stefan Rusterholz.
* Gem::location_of_caller now behaves on Windows.  Patch by Daniel Berger.
* Silence PATH warning.

Deprecation Notices:

* Gem::manage_gems will be removed on or after March 2009.

For a full list of changes to RubyGems and the contributor for each change, see
the ChangeLog file.

Special thanks to Chad Wooley for backwards compatibility testing and Luis
Lavena for continuing windows support.

== How can I get RubyGems?

NOTE:  If you have installed RubyGems using a package system you may want to
install a new RubyGems through the same packaging system.

If you have a recent version of RubyGems (0.8.5 or later), then all
you need to do is:

  $ gem update --system   (you might need to be admin/root)

NOTE:  RubyGems 1.1 and 1.2 have problems upgrading when there is no
rubygems-update installed.  You will need to follow the second set of update
instructions if you see "Nothing to update".

NOTE: You may have to run the command twice if you have any previosly
installed rubygems-update gems.

If you have an older version of RubyGems installed, then you can still
do it in two steps:

  $ gem install rubygems-update  (again, might need to be admin/root)
  $ update_rubygems              (... here too)

If you don't have any gems install, there is still the pre-gem
approach to getting software ... doing it manually:

1. DOWNLOAD FROM: http://rubyforge.org/frs/?group_id=126
2. UNPACK INTO A DIRECTORY AND CD THERE
3. INSTALL WITH:  ruby setup.rb  (you may need admin/root privilege)

== To File Bugs

The RubyGems bug tracker can be found on RubyForge at:

http://rubyforge.org/tracker/?func=add&#038;group_id=126&#038;atid=575

When filing a bug, `gem env` output will be helpful in diagnosing the issue.

If you find a bug where RubyGems crashes, please provide debug output. You can
do that with `gem --debug the_command`.

== Thanks

Keep those gems coming!

-- Jim &#038; Chad &#038; Eric (for the RubyGems team)

------------------------------------------------------------------------------

RubyGems installed the following executables:
	/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/gem

If `gem` was installed by a previous RubyGems installation, you may need
to remove it by hand.
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2008/11/08/undefined-local-variable-or-method-remote_gemspecs/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Pair Programming &gt; Code Reviews</title>
		<link>http://www.theodorenguyen-cao.com/2008/10/29/pair-programming-greater-than-code-reviews/</link>
		<comments>http://www.theodorenguyen-cao.com/2008/10/29/pair-programming-greater-than-code-reviews/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 04:29:20 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>

		<guid isPermaLink="false">http://www.theodorenguyen-cao.com/?p=132</guid>
		<description><![CDATA[With the rise in popularity of agile software methodologies, the practice of formal code reviews has been often put against pair programming. There are proponents for both and some even recommend practicing both. As time goes on, I&#8217;ve been able to do a little bit of both and I&#8217;ve developed a strong preference for pair [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">With the rise in popularity of agile software methodologies, the practice of formal <a href="http://en.wikipedia.org/wiki/Code_review" target="_blank">code reviews</a> has been often put against <a href="http://en.wikipedia.org/wiki/Pair_programming" target="_blank">pair programming</a>.  There are proponents for both and some even recommend practicing both.</p>
<p style="text-align: left;">As time goes on, I&#8217;ve been able to do a little bit of both and I&#8217;ve developed a strong preference for pair programming over code reviews.</p>
<p style="text-align: left;">With code reviews, you get one or more other persons to review the code you just wrote and feel ready is to be checked in, deployed, or whatever the next step is.  These reviews can be very formal or just as simple as a line-by-line walk through the code.  The goal is to find any bugs or fixes before the code gets to the next step.  This is very analogous to the writer/editor/publisher workflow (kind of like this blog entry).  Writer writes the article, editor proofreads, and the article gets published.  Programmer writes the code, other developers review the code, and the code gets deployed.  It almost seems like the idea of code reviews came out of software methodologies like the <a href="http://en.wikipedia.org/wiki/Waterfall_model" target="_blank">Waterfall model</a>.  Everything is very sequential and done in distinct stages.</p>
<p style="text-align: left;">In pair programming, the focus is on developing &#8220;good&#8221; code the first time around.  We do this by having more than one pair of eyes on the working code as it is being written.  One person is the &#8220;driver&#8221; who is writing the code and the other is the guide or observer who is verifying the code being written and thinking of potential improvements. The developers switch roles whenever it makes sense which in many cases causes one developer to immediate use or have to work with the code that was written by their partner. It places emphasis on the idea that two heads are better than one.</p>
<p style="text-align: left;">Two things come to my mind when I think about pair programming and code reviews. First, code reviews seem to be a just-in-the-nick-of-time fix for finding bugs in code before it goes out the door.  The initial development effort as already been completed and now we are evaluating the work.  And realistic, this is code we&#8217;re looking at. Everyone has their opinion as how things should be structured, design philosophies, coding styles, etc.  Many times code review sessions end up focusing on higher level concepts like those previously listed and not on the code itself. These kind of debates are related to decisions that should have been made prior to writing this code.  Why are we asking ourselves why we did this this way now after we&#8217;ve already spent time and effort to write code for it? And the people part of the code review are not neccessarily the people that will be working with that piece of code.</p>
<p style="text-align: left;">That brings me to my second thought which is this is all reminiscent of Scrum pigs and chickens.</p>
<p><a href="http://www.theodorenguyen-cao.com/wp-content/uploads/2008/10/060911-scrumtoon.jpg"><img class="aligncenter size-full wp-image-133" title="060911-scrumtoon" src="http://www.theodorenguyen-cao.com/wp-content/uploads/2008/10/060911-scrumtoon.jpg" alt="" width="500" height="176" /></a><br />
In code reviews, people sit down to review someone&#8217;s code.  Everyone has an opinion but not everyone is going to be working with the code on a daily basis. At the time, everyone seems to be involved in the process but there is no vested interest. They are just looking at some code and asking themselves &#8220;does this code look good and is it correct?&#8221;.  It&#8217;s a very passive standpoint. On the other hand, pair programmers are completely invested (committed?) in the task at hand.  They immediately are using the code they are writing together and collobarating their thoughts on design, code layout, etc. Both programmers are taking on an active role and are emotionally invested in the task at hand because they are attacking the same problem together.</p>
<p>Most of the cons of pair programming can be attributed to developer social/ego issues. And they are not specific to pair programming.  Going down the list of drawbacks listed on Wikipedia:</p>
<blockquote>
<ul>
<li> Developer egos: Experienced developers may find it tedious to tutor a less experienced developer in a paired environment.</li>
<li> Developer intimidation: A less experienced developer may feel intimidated pairing with a more experienced developer which may result in less participation.</li>
<li> Developer work preference: Some engineers prefer to work alone, and may find the paired environment cumbersome.</li>
<li> Tutoring cost: Experienced developers working alone may be capable of producing code that is clean and accurate at the outset, and the additional theoretical gain from pairing might not be worth the cost of an additional developer. This is especially true when producing more trivial parts of the system.</li>
<li> Potential conflict: Differences in coding style may result in conflict, and personality conflicts can result in one or both developers feeling awkward or uncomfortable.</li>
<li> Chat sessions: Sometimes employees might talk together too much, straying excessively into off-topic subjects, such as major news events, personal problems, etc.</li>
<li> Annoying personal habits: Sometimes people can find each other much more annoying when working up close than at separate workstations.</li>
</ul>
</blockquote>
<p>Developer egos, intimidation, work preference, and tutoring costs are things that should be checked at the door.  As an experience developer, you should look for opportunities to help your fellow developers to learn and improve their skills.  As a more junior developer, the opportunity to take chances and try to prove yourself is one of the best ways to learn and develop better skills. I don&#8217;t know about other people but collaborative work environments seem to be a plus. Being able to discuss your ideas openly is one of the best ways to make what you&#8217;re building better than it is. As for potential conflicts, chat sessions, and annoying personal habits, these have more to do with personalities and mannerism in the work place. All of this can happen in code reviews as well but the point is being self-aware and respectful of your coworkers is just as important as writing awesome code.</p>
<p>While I&#8217;m not against code reviews, I feel that pair programming is better suited to improve both code and team quality.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2008/10/29/pair-programming-greater-than-code-reviews/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Eclipse Ganymede + Subclipse = Unable to load default SVN client???</title>
		<link>http://www.theodorenguyen-cao.com/2008/09/26/eclipse-ganymede-subclipse-unable-to-load-default-svn-client/</link>
		<comments>http://www.theodorenguyen-cao.com/2008/09/26/eclipse-ganymede-subclipse-unable-to-load-default-svn-client/#comments</comments>
		<pubDate>Fri, 26 Sep 2008 14:46:21 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.theodorenguyen-cao.com/2008/09/26/eclipse-ganymede-subclipse-unable-to-load-default-svn-client/</guid>
		<description><![CDATA[I like Shiny New Things. So when I heard Eclipse Ganymede SR1 was available, I proceeded to replace the Stream Stable Build I was currently running. This, of course, ended up causing me problems. After installing Subclipse and attempting to pull up any SVN history, I get an error dialog box that states: &#8220;Unable to [...]]]></description>
			<content:encoded><![CDATA[<p>I like <a href="http://onstartups.com/home/tabid/3339/bid/6739/Entrepreneurs-and-Hey-There-s-A-Shiny-New-Thing.aspx">Shiny New Things</a>. So when I heard <a href="http://www.eclipse.org/downloads/packages/release/ganymede/sr1-rc2/">Eclipse Ganymede SR1</a> was available, I proceeded to replace the <a href="http://www.theodorenguyen-cao.com/2008/02/27/eclipse-leopard-crash/">Stream Stable Build</a> I was currently running.</p>
<p>This, of course, ended up causing me problems.  After installing Subclipse and attempting to pull up any SVN history, I get an error dialog box that states:<br />
&#8220;Unable to load default SVN client&#8221;</p>
<p>Confused, I <a href="http://en.wikipedia.org/wiki/RTFM">RTFM</a> and saw that &#8220;Subclipse 1.4.x requires Subversion 1.5.0 version of JavaHL/SVNKit&#8221;</p>
<p>Seeing the SVN I was running was in fact not 1.5,</p>
<pre class="console">
  theo@notedpath~ $ svn --version
svn, version 1.4.4 (r25188)
   compiled Nov 25 2007, 08:20:33</pre>
<p>I went <a href="http://www.collab.net/downloads/apple/download.html">here</a>, downloaded and installed Subversion 1.5, restarted Eclipse and things are looking good now.</p>
<p>Stupid shiny new things.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2008/09/26/eclipse-ganymede-subclipse-unable-to-load-default-svn-client/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Surprise your users</title>
		<link>http://www.theodorenguyen-cao.com/2008/09/03/surprise-your-users/</link>
		<comments>http://www.theodorenguyen-cao.com/2008/09/03/surprise-your-users/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 05:54:44 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>
		<category><![CDATA[inspiration]]></category>

		<guid isPermaLink="false">http://www.theodorenguyen-cao.com/2008/09/03/surprise-your-users/</guid>
		<description><![CDATA[With the launch of Chrome today, the net is all the buzz around how great Chrome is/can be. But this isn&#8217;t yet another post about chrome. This is about me wanting to track the flight status of my parent&#8217;s airline that just came in from Cali. Of course I could go to the American Airlines [...]]]></description>
			<content:encoded><![CDATA[<p>With the launch of <a href="http://www.google.com/chrome" target="_blank">Chrome</a> today, the net is all the buzz around how great Chrome is/can be.  But this isn&#8217;t <a href="http://www.techcrunch.com/2008/09/02/giving-google-chrome-a-spin-this-thing-moves-fast/" target="_blank">yet</a> <a href="http://mashable.com/2008/09/02/chrome-windows/" target="_blank">another</a> <a href="http://googleblog.blogspot.com/2008/09/google-chrome-now-live.html" target="_blank">post</a> <a href="http://lifehacker.com/5044484/google-chrome-first-look">about</a> <a href="http://www.wired.com/techbiz/it/magazine/16-10/mf_chrome" target="_blank">chrome</a>.</p>
<p>This is about me wanting to track the flight status of my parent&#8217;s airline that just came in from Cali.  Of course I could go to the American Airlines website, which by the way is at <a href="http://www.aa.com" title="Alcoholics Anonymous">aa.com</a>, but that seemed like a lot of work when Google is my default homepage.  So I thought I would just type in the flight information and hope Google would give me a direct link to the flight status page.</p>
<p><img src="http://www.theodorenguyen-cao.com/wp-content/uploads/2008/09/picture-6.png" alt="search" /></p>
<p>Google&#8217;s response surprised me with the following:</p>
<p><img src="http://www.theodorenguyen-cao.com/wp-content/uploads/2008/09/picture-4.png" alt="search-result" /></p>
<p>Wow.  Thanks, Google!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2008/09/03/surprise-your-users/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>gem update fails &#8211; can&#8217;t find header files for ruby</title>
		<link>http://www.theodorenguyen-cao.com/2008/09/03/gem-update-fails-cant-find-header-files-for-ruby/</link>
		<comments>http://www.theodorenguyen-cao.com/2008/09/03/gem-update-fails-cant-find-header-files-for-ruby/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 05:27:40 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.theodorenguyen-cao.com/2008/09/03/gem-update-fails-cant-find-header-files-for-ruby/</guid>
		<description><![CDATA[So, Pat got a new MacBook Pro. Little does she know, I&#8217;ve start to install programs that I would use if I just so happened to be on her computer. The laptop already had Leopard installed and all of its goodies but a bit of upgrading was called for. So, of course I had run [...]]]></description>
			<content:encoded><![CDATA[<p>So, Pat got a new <a href="http://www.apple.com/macbookpro/" target="_blank">MacBook Pro</a>.  Little does she know, I&#8217;ve start to install programs that I would use if I just so happened to be on her computer.  The laptop already had Leopard installed and all of its goodies but a bit of upgrading was called for.  So, of course I had run <code>gem update</code>.</p>
<pre class="console">
pats-macbook-pro:~ pat$ sudo gem update

Updating installed gems

Updating RedCloth

Building native extensions.  This could take a while...

ERROR:  While executing gem ... (Gem::Installer::ExtensionBuildError)

    ERROR: Failed to build gem native extension./System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby extconf.rb update

can't find header files for ruby.

Gem files will remain installed in /Library/Ruby/Gems/1.8/gems/RedCloth-4.0.3 for inspection.

Results logged to /Library/Ruby/Gems/1.8/gems/RedCloth-4.0.3/ext/redcloth_scan/gem_make.out</pre>
<p>But then I ran into a strange error I had never seen before.  <code>gem update</code> would fail when trying to build native extension. It&#8217;s been awhile since I setup a rails development environment so a-googlin&#8217; I went.</p>
<p><a href="http://www.macruby.org/trac/wiki/Troubleshooting">Turns out</a> the ruby headers don&#8217;t come installed with the base ruby install with Mac OS X.  These can been found on Mac OS X Install Disc 2 by installing the XCode Tools.</p>
<p>Once installed, all was well!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2008/09/03/gem-update-fails-cant-find-header-files-for-ruby/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>To be more educated or not?</title>
		<link>http://www.theodorenguyen-cao.com/2008/07/05/to-be-more-educated-or-not/</link>
		<comments>http://www.theodorenguyen-cao.com/2008/07/05/to-be-more-educated-or-not/#comments</comments>
		<pubDate>Sat, 05 Jul 2008 21:55:03 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>
		<category><![CDATA[aspiration]]></category>
		<category><![CDATA[inspiration]]></category>

		<guid isPermaLink="false">http://blog.notedpath.com/2008/07/05/to-be-more-educated-or-not/</guid>
		<description><![CDATA[&#8230;That is, more educated in the formal sense. I think nothing can replace real world experience. However, one of the questions that have been on my mind for the past year or so is if I should be going back to school. I&#8217;m 24 and I got a couple of years of work experience under [...]]]></description>
			<content:encoded><![CDATA[<p style="float: right"><img src="http://blog.notedpath.com/wp-content/uploads/2008/07/diploma_graduate_graduation_260768_l.jpg" alt="diploma" /></p>
<p>&#8230;That is, more educated in the formal sense.  I think nothing can replace real world experience.  However, one of the questions that have been on my mind for the past year or so is if I should be going back to school.  I&#8217;m 24 and I got a couple of years of work experience under my belt.  I recently got <a href="http://blog.notedpath.com/2008/06/20/officially-engaged/">engaged</a>.  If there was ever a time to go back to school, now seems like as good of a time as any.</p>
<p>If I decided to go back to get more education, should I go for a Masters of Science or an MBA?  In the industry I&#8217;m in, I find that a Masters in Computer Science or Engineering is not really rewarding as it was for my dad&#8217;s generation from a career perspective.  Today&#8217;s smart IT employers focus on what you&#8217;ve done, created, or built more than what you have studied in a classroom or years of work experience (which I think is <a href="http://blog.notedpath.com/2008/02/09/prior-work-experience-not-needed/">great</a>).  I think if I go back to school for a Masters, my reasons for going would be to surround myself with smart hackers and really dig deep into exciting research.  I strongly believe that to get the most out of Masters program, you need to be there for the right reasons. Go back to school to learn more, not to get ahead in a career.</p>
<p>On the other hand, an MBA seems much more of a career booster and would give me the businessy-types of skills that I haven&#8217;t been formally trained with.  The part about this that doesn&#8217;t excite me is all the finance and accounting kinda courses that I don&#8217;t seem myself really leveraging in my career path.  That side of things doesn&#8217;t really get me excited.  Plus, all of my friends that are taking MBA courses say that it&#8217;s nothing special. It&#8217;s just going to be another thing you put on your resume.  Which might not be such a bad thing, but for me it doesn&#8217;t seem to make sense right now to pursue that avenue.</p>
<p>I would love to hear from people on their reasons for choosing to pursue higher education or choosing not to or choosing to postpone it until further notice.</p>
<p>As for me, I think I&#8217;ll postpone until further notice.  There&#8217;s so much more for me to learn through real <a href="http://www.clearspring.com" target="_blank">work</a> experience and my natural curiosity of emerging technologies.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2008/07/05/to-be-more-educated-or-not/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Officially Engaged</title>
		<link>http://www.theodorenguyen-cao.com/2008/06/20/officially-engaged/</link>
		<comments>http://www.theodorenguyen-cao.com/2008/06/20/officially-engaged/#comments</comments>
		<pubDate>Fri, 20 Jun 2008 04:02:25 +0000</pubDate>
		<dc:creator>Theo</dc:creator>
				<category><![CDATA[geekery]]></category>
		<category><![CDATA[personal]]></category>

		<guid isPermaLink="false">http://blog.notedpath.com/2008/06/20/officially-engaged/</guid>
		<description><![CDATA[On June 19, 2008, I became officially engaged according to Facebook. But the actual date was June 18, 2008.  I love you, Pat. Can&#8217;t wait for what&#8217;s next, baby. I&#8217;ll post some details soon&#8230;]]></description>
			<content:encoded><![CDATA[<p>On June 19, 2008, I became officially engaged according to Facebook.</p>
<p style="text-align: center"><img src="http://blog.notedpath.com/wp-content/uploads/2008/06/picture-4.png" alt="facebook_engaged_status" /></p>
<p>But the actual date was June 18, 2008.  I love you, Pat.</p>
<p>Can&#8217;t wait for what&#8217;s next, baby.</p>
<p style="text-align: center"><img src="http://blog.notedpath.com/wp-content/uploads/2008/06/img_8285.jpg" alt="engagement_day" /></p>
<p>I&#8217;ll post some details soon&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.theodorenguyen-cao.com/2008/06/20/officially-engaged/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
