<?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>The Puerto Rican Rails Dude &#187; Programming</title>
	<atom:link href="http://www.dennmart.com/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dennmart.com</link>
	<description>Official Blog of Dennis Martinez</description>
	<lastBuildDate>Mon, 26 Jul 2010 23:13:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>My Arrival To The Bay Area</title>
		<link>http://www.dennmart.com/2010/02/21/my-arrival-to-the-bay-area/</link>
		<comments>http://www.dennmart.com/2010/02/21/my-arrival-to-the-bay-area/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 01:44:57 +0000</pubDate>
		<dc:creator>Dennis Martinez</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby On Rails]]></category>

		<guid isPermaLink="false">http://www.dennmart.com/?p=183</guid>
		<description><![CDATA[Well, after writing in my last post a month ago that I was officially unemployed, I was blessed with acquiring a new full-time job just four days later. Best of all, it&#8217;s where I always wanted to be, the Bay Area! Tomorrow will officially be my first day as a Rails developer for RepairPal. I [...]]]></description>
			<content:encoded><![CDATA[<p>Well, after writing in my <a href="http://www.dennmart.com/2010/01/26/no-rest-for-the-unemployed/">last post</a> a month ago that I was officially unemployed, I was blessed with acquiring a new full-time job just four days later. Best of all, it&#8217;s where I <a href="http://www.dennmart.com/2007/04/28/san-francisco-here-i-come-hopefully/">always wanted to be</a>, the Bay Area!</p>
<p>Tomorrow will officially be my first day as a Rails developer for <a href="http://repairpal.com">RepairPal</a>. I was in their offices last week to meet them personally, and everyone seemed very friendly and the company seems to be doing some cool stuff, so I hope I&#8217;ll be a part of all the awesome stuff that&#8217;s to come. It&#8217;s really a dream come true for me to be where I&#8217;m at right now, at this very moment. It&#8217;s proof that if you really want something bad enough, and you work hard for it, whatever you want will come true.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dennmart.com/2010/02/21/my-arrival-to-the-bay-area/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>No Rest For The Unemployed</title>
		<link>http://www.dennmart.com/2010/01/26/no-rest-for-the-unemployed/</link>
		<comments>http://www.dennmart.com/2010/01/26/no-rest-for-the-unemployed/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 04:25:42 +0000</pubDate>
		<dc:creator>Dennis Martinez</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Databases]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.dennmart.com/?p=178</guid>
		<description><![CDATA[After two years, yesterday was my final day of being a developer for BarterQuest. As anyone living in expensive New York City in the same situation, I have been focusing part of my energy looking for a new gig. I&#8217;m pretty confident, despite the current economy, that I will land on my feet sooner rather [...]]]></description>
			<content:encoded><![CDATA[<p>After two years, yesterday was my final day of being a developer for <a href="http://www.barterquest.com/">BarterQuest</a>. As anyone living in expensive New York City in the same situation, I have been focusing part of my energy looking for a new gig. I&#8217;m pretty confident, despite the current economy, that I will land on my feet sooner rather than later. I have a few leads, with one in particular that I am really hoping will come through.</p>
<p>In the meantime, I&#8217;m not just throwing my resumé in the face of companies everywhere in the U.S. I have also decided that since now that I have quite a few extra hours in my days, I should really do productive things instead of sitting on my couch and re-watching all previous seasons of <em>24</em> (believe me, I would watch all 7 seasons in a row if I could) or jamming away to <em>Guitar Hero</em>. This is a perfect chance to do lots of technical things I&#8217;ve been wanting to do for months, but just never got the time to do so. Here&#8217;s a short list of some goals I&#8217;d like to get started on.</p>
<p><strong>Learning new stuff</strong></p>
<p>For the past two years, I&#8217;ve been exclusively using Ruby and Ruby on Rails at my day job. I&#8217;ve always wanted to broaden my skills by doing other types of programming, but when you take into consideration that I would usually be at work more between 9-10 hours per day, plus a commute that would sap an additional two hours, there wasn&#8217;t much time for me to be able to do personal things, let along learn new stuff. Now that I&#8217;m finally free, I can now spend more time with those things I&#8217;ve wanted to experiment with.</p>
<p>I&#8217;ve always wanted to learn iPhone application development. I know the basics of Objective-C, and have the book <a href="http://pragprog.com/titles/amiphd/iphone-sdk-development">iPhone SDK Development</a> by Bill Dudney, but I was never able to sit down and code something up. I have a few ideas for apps, so even if I can make a simple app that&#8217;s accepted to Apple&#8217;s App Store will be an achievement for me.</p>
<p>I&#8217;ve been very interested in implementing <a href="http://en.wikipedia.org/wiki/Push_technology">Push technology</a> to web apps, like <a href="http://en.wikipedia.org/wiki/Comet_%28programming%29">Comet</a> or <a href="http://dev.w3.org/html5/websockets/">Web Sockets</a>, using nginx&#8217;s <a href="http://pushmodule.slact.net/">Push Module</a> and <a href="http://orbited.org/">Orbited</a>.</p>
<p>Although I&#8217;ve never had the opportunity to work with extremely large data sets, I&#8217;ve always been curious about frameworks like <a href="http://labs.google.com/papers/mapreduce.html">Google&#8217;s MapReduce</a> and <a href="http://hadoop.apache.org/">Apache Hadoop</a>, particularly how well they can &#8220;crunch&#8221; the data thrown at them.</p>
<p><strong>Keep on with what I already know</strong></p>
<p>As I mentioned, I&#8217;ve been using Ruby for years now, and I know Ruby on Rails and Sinatra pretty well. However, just because I want to learn new things doesn&#8217;t mean that I want to abandon this awesome language. In fact, I want to keep using it more with the latest toys.</p>
<p>Thanks to <a href="http://rvm.beginrescueend.com/">Ruby Version Manager</a>, I was able to safely install the latest versions of Ruby 1.9 and MacRuby and start learning their new features. I was also able to check any possible compatibility issues in my older applications with different major Ruby versions. Seriously, if you are a Ruby developer using a Mac or Linux, install RVM now if you haven&#8217;t.</p>
<p>Recently, there have been more and more news about Ruby on Rails 3, the next major release for the wonderful framework. I&#8217;d like to stay one step ahead of the pack and start learning about the new changes before it officially hits the web. One of the leaders of the newest Rails changes, Yahuda Katz, has written <a href="http://yehudakatz.com/tags/rails-3/">lots of blog posts relating to the changes in Rails 3</a>. They&#8217;re definitely worth a read.</p>
<p><strong>Strengthening my shortcomings</strong></p>
<p>There are quite a few things &#8211; development-wise &#8211; that have been bugging me for a long time, yet I&#8217;ve never taken the proper steps to correct. Now is as good a time as any to take on these things and finally conquer them.</p>
<p>My main weakness, as a web developer, is that I&#8217;m pretty bad at design. I know CSS and its properties, I know about browser incompatibilities (having been a victim many times before by the evil and immortal Internet Explorer 6 browser) and all that stuff. But as far as design goes, like font sizes, element placement, usability and colors, these things are not my strong suit. I&#8217;ve actually stocked up on some books about these subjects (like <a href="http://www.sensible.com/dmmt.html">Don&#8217;t Make Me Think</a> by Steve Krug and <a href="http://pragprog.com/titles/bhgwad/web-design-for-developers">Web Design for Developers</a> by Brian Hogan), so I hope that by the time my unemployment ends, I&#8217;ll be much better off making my work look good &#8211; or at least decent.</p>
<p>Another weakness I consider is that I get distracted from development from time to time. It&#8217;s not frequent enough to affect the quality of my work, but it&#8217;s enough to annoy me when I do it subconsciously and I then catch myself in the act. I have read some people who had some success using the <a href="http://www.pomodorotechnique.com/">Pomodoro technique</a>, so starting tomorrow I decided that I&#8217;ll give it a try. There&#8217;s a nice little app called <a href="http://getconcentrating.com/">Concentrate</a> for the Mac that seems to be just the thing I need during those times when I need to get stuff done and not get distracted.</p>
<p><strong>Beef up my GitHub profile</strong></p>
<p>I have to admit that I&#8217;m a little bit ashamed to see my <a href="http://github.com/dennmart">GitHub profile</a> virtually empty. For a long time, I&#8217;ve been wanting to add more of the projects that I have in my laptop to GitHub and see if some of them take a life of their own. Sadly, for whatever reason, I haven&#8217;t done that. Most of the times I&#8217;m a bit too critical at my code and think it&#8217;s embarrassing to make public, but that&#8217;s really what I need to do to get better as a developer. I can take criticism with the best of them, so there&#8217;s really no excuse. I need to make more of my code open-source, period.</p>
<p>Not only do I want to show my own work, I also want to give back to the community. I have used so many open-source projects over the years, yet I&#8217;ve only submitted a handful of patches to very few projects. I don&#8217;t want to be a person who takes, takes, takes and never gives anything back in return. So I&#8217;m going to take steps to correct that. I&#8217;ve started cloning some repositories of my favorite projects from GitHub to my computer to start reading their code more in-depth, which I had been doing anyway. I&#8217;ll check if these projects have <a href="http://lighthouseapp.com/">Lighthouse</a> pages with open tickets, or if there are any open issues on their GitHub page. A few years ago, Dr. Nic wrote an excellent post titled <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/">&#8220;8 steps for fixing other people’s code&#8221;</a> that inspired me to start finding features or defects that I can handle.</p>
<p>I have to say, I&#8217;m only one day into this routine, and I don&#8217;t remember the last time I felt this free and liberated doing what <em>I</em> wanted to do. Full-time employment is great for earning money and making substantial stuff, but sometimes there&#8217;s a feeling of emptiness due to not being able to explore on your own. Being unemployed doesn&#8217;t mean that you need to spend all your time looking for work. Unless you&#8217;re truly struggling economically and can&#8217;t pay the bills in the next couple of weeks or even days, why not spend part of your time gearing up for the future?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dennmart.com/2010/01/26/no-rest-for-the-unemployed/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MongoShort &#8211; URL Shortener using SInatra and MongoDB</title>
		<link>http://www.dennmart.com/2010/01/14/mongoshort-url-shortener-using-sinatra-and-mongodb/</link>
		<comments>http://www.dennmart.com/2010/01/14/mongoshort-url-shortener-using-sinatra-and-mongodb/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 02:56:58 +0000</pubDate>
		<dc:creator>Dennis Martinez</dc:creator>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Databases]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.dennmart.com/?p=175</guid>
		<description><![CDATA[As many other developers, I&#8217;ve been experimenting with the different &#8220;NoSQL&#8221; data stores. Most of them are really great, like Redis, Tokyo Cabinet and CouchDB. My favorite so far, however, is MongoDB. I think it hits the sweet spot between a normal relational databases and key-value stores. After a while playing around MongoDB, I decided [...]]]></description>
			<content:encoded><![CDATA[<p>As many other developers, I&#8217;ve been experimenting with the different &#8220;NoSQL&#8221; data stores. Most of them are really great, like <a href="http://code.google.com/p/redis/">Redis</a>, <a href="http://1978th.net/tokyocabinet/">Tokyo Cabinet</a> and <a href="http://couchdb.apache.org/">CouchDB</a>. My favorite so far, however, is <a href="http://www.mongodb.org/">MongoDB</a>. I think it hits the sweet spot between a normal relational databases and key-value stores. After a while playing around MongoDB, I decided to do something with it. That something that I did is called <a href="http://github.com/dennmart/mongoshort">MongoShort</a>.</p>
<p>MongoShort is a very simple URL shortening service, written with Sinatra and MongoDB. I originally wrote this little app to be used as part of a larger Rails application. However, it was mostly done as a way to do something with MongoDB. Particularly, I wanted to start using the awesome <a href="http://github.com/jnunemaker/mongomapper">MongoMapper</a> library. It&#8217;s really a breeze to use all these tools together, and it makes developing small apps on Ruby really fun. I hope someone can grab a copy of MongoShort and learn a bit of the basics of these wonderful tools.</p>
<p><a href="http://github.com/dennmart/mongoshort">Go fork MongoShort on GitHub now!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dennmart.com/2010/01/14/mongoshort-url-shortener-using-sinatra-and-mongodb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Redis rocks!</title>
		<link>http://www.dennmart.com/2009/11/05/redis-rocks/</link>
		<comments>http://www.dennmart.com/2009/11/05/redis-rocks/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 17:16:25 +0000</pubDate>
		<dc:creator>Dennis Martinez</dc:creator>
				<category><![CDATA[Databases]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.dennmart.com/?p=170</guid>
		<description><![CDATA[In my development blog, I previously wrote that MongoDB was the future of database storage. I might reconsider my decision, now that I&#8217;ve discovered Redis. In a nutshell, Redis is a key-value store. But it&#8217;s not a simple key-value database, as it has lots of commands and extra goodies, such as file persistence (so data [...]]]></description>
			<content:encoded><![CDATA[<p>In my <a href="http://development.dennmart.com/2009/10/08/mongodb-and-mongomapper-the-future.html">development blog</a>, I previously wrote that <a href="http://www.mongodb.org/">MongoDB</a> was the future of database storage. I might reconsider my decision, now that I&#8217;ve discovered <a href="http://code.google.com/p/redis/">Redis</a>. In a nutshell, Redis is a key-value store. But it&#8217;s not a simple key-value database, as it has lots of <a href="http://code.google.com/p/redis/wiki/CommandReference">commands</a> and extra goodies, such as file persistence (so data can be stored from memory to a file, and restored in case of failure) and awesome data structures like lists (with push / pop) and sets (even ordered sets). Besides that, Redis boasts atomicity and even master-slave replication. It&#8217;s quite a lot of stuff for a lean package.</p>
<p>One of the things I love the most about Redis is it&#8217;s speed. Believe me, this little database is <em>fast</em>. Redis includes a benchmark tool, so I ran the default benchmark (Approximately 10,000 total requests per command, from 50 simultaneous clients) just to demonstrate its raw speed. These tests were run on a Mac Mini (1.83 GHz Intel Core 2 Duo, 2 GB RAM) under Ubuntu 9.10 Server:</p>
<p><code><br />
    dennmart@ubuntu:~$ redis-benchmark<br />
    ====== SET ======<br />
      10005 requests completed in 0.14 seconds<br />
      50 parallel clients<br />
      3 bytes payload<br />
      keep alive: 1<br />
    <br />
    34.89% <= 0 milliseconds<br />
    99.19% <= 1 milliseconds<br />
    100.00% <= 2 milliseconds<br />
    74111.11 requests per second<br />
    <br />
    ====== GET ======<br />
      10003 requests completed in 0.13 seconds<br />
      50 parallel clients<br />
      3 bytes payload<br />
      keep alive: 1<br />
    <br />
    34.62% <= 0 milliseconds<br />
    99.79% <= 1 milliseconds<br />
    99.83% <= 2 milliseconds<br />
    99.87% <= 3 milliseconds<br />
    99.91% <= 4 milliseconds<br />
    99.94% <= 5 milliseconds<br />
    99.97% <= 6 milliseconds<br />
    99.99% <= 7 milliseconds<br />
    100.00% <= 8 milliseconds<br />
    74649.25 requests per second<br />
    <br />
    ====== INCR ======<br />
      10005 requests completed in 0.15 seconds<br />
      50 parallel clients<br />
      3 bytes payload<br />
      keep alive: 1<br />
    <br />
    25.60% <= 0 milliseconds<br />
    99.73% <= 1 milliseconds<br />
    99.80% <= 2 milliseconds<br />
    99.83% <= 3 milliseconds<br />
    99.86% <= 4 milliseconds<br />
    99.89% <= 5 milliseconds<br />
    99.92% <= 6 milliseconds<br />
    99.95% <= 7 milliseconds<br />
    99.97% <= 8 milliseconds<br />
    100.00% <= 9 milliseconds<br />
    65392.16 requests per second<br />
    <br />
    ====== LPUSH ======<br />
      10001 requests completed in 0.13 seconds<br />
      50 parallel clients<br />
      3 bytes payload<br />
      keep alive: 1<br />
    <br />
    37.62% <= 0 milliseconds<br />
    99.78% <= 1 milliseconds<br />
    99.82% <= 2 milliseconds<br />
    99.86% <= 3 milliseconds<br />
    99.89% <= 4 milliseconds<br />
    99.93% <= 5 milliseconds<br />
    99.96% <= 6 milliseconds<br />
    99.99% <= 7 milliseconds<br />
    100.00% <= 8 milliseconds<br />
    77527.13 requests per second<br />
    <br />
    ====== LPOP ======<br />
      10000 requests completed in 0.14 seconds<br />
      50 parallel clients<br />
      3 bytes payload<br />
      keep alive: 1<br />
    <br />
    34.13% <= 0 milliseconds<br />
    99.69% <= 1 milliseconds<br />
    99.82% <= 2 milliseconds<br />
    99.86% <= 3 milliseconds<br />
    99.90% <= 4 milliseconds<br />
    99.93% <= 5 milliseconds<br />
    99.96% <= 6 milliseconds<br />
    99.98% <= 7 milliseconds<br />
    100.00% <= 8 milliseconds<br />
    74074.07 requests per second<br />
    <br />
    ====== PING ======<br />
      10000 requests completed in 0.12 seconds<br />
      50 parallel clients<br />
      3 bytes payload<br />
      keep alive: 1<br />
    <br />
    43.79% <= 0 milliseconds<br />
    99.80% <= 1 milliseconds<br />
    99.85% <= 2 milliseconds<br />
    99.89% <= 3 milliseconds<br />
    99.91% <= 4 milliseconds<br />
    99.93% <= 5 milliseconds<br />
    99.97% <= 6 milliseconds<br />
    100.00% <= 7 milliseconds<br />
    86206.90 requests per second<br />
</code></p>
<p>Yeah, you read that right. On this somewhat low-end computer (by today's standards), Redis still manages to do over 74,000 SET (write) and GET (read) operations <em>per second</em>. Push and pop list operations also do well over 70,000 requests. On bigger hardware, expect these numbers to be much higher. Besides speed, I've also been impressed by the stability of Redis. I've been running Redis non-stop on the Mac Mini for over two weeks, and I've never had a single issue with it.</p>
<p>I got really interested in Redis after <a href="http://ozmm.org/">Defunkt</a> (of <a href="http://github.com/">GitHub</a> fame) open-sourced <a href="http://github.com/defunkt/hurl">Hurl</a>. Hurl was an entry in this year's <a href="http://r09.railsrumble.com/entries">Rails Rumble</a> competition. I used it quite extensively when developing with PayPal's APIs. After it was released, I noticed that Hurl used Redis for persistence. I was kind of puzzled why a key-store value was used for this. However, Defunkt wrote <a href="http://ozmm.org/posts/sort_in_redis.html">an excellent post</a> mostly explaining the SORT operation, but also included some additional details on how Redis was used in Hurl. It made the decision to use Redis clear. Well, I'm also willing to bet that he used Redis because us programmers love to use the new hotness.</p>
<p>I feel that Redis will be something big soon. There are a few open-source projects using it, including the aforementioned Hurl and <a href="http://github.com/defunkt/resque">Resque</a>. I already have a few ideas where I can use some of this functionality for current sites that I'm working on (such as simple counters, or a tag-like system where we can push and pop tags from a list). Check Redis out if you need some quick and simple storage.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dennmart.com/2009/11/05/redis-rocks/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>What Have I Been Up To?</title>
		<link>http://www.dennmart.com/2009/03/06/what-have-i-been-up-to/</link>
		<comments>http://www.dennmart.com/2009/03/06/what-have-i-been-up-to/#comments</comments>
		<pubDate>Sat, 07 Mar 2009 02:00:41 +0000</pubDate>
		<dc:creator>Dennis Martinez</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Databases]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[BarterQuest]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[MacBook Pro]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://www.dennmart.com/?p=128</guid>
		<description><![CDATA[It&#8217;s been quite a while since I last updated this blog. I should seriously start writing more often. So, what have I been up to? With the cold weather here in New York City, it gets difficult sometimes to go out and have fun in the city. As usual, most of my time is spent [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been quite a while since I last updated this blog. I should seriously start writing more often. So, what have I been up to? With the cold weather here in New York City, it gets difficult sometimes to go out and have fun in the city. As usual, most of my time is spent on technology, software development, stuff like that. Here&#8217;s a brief recap of what I&#8217;ve been working on:</p>
<p><strong>Got a new MacBook Pro, and I love it</strong> &#8211; I finally gave in and bought myself a shiny new <strong><a href="http://www.apple.com/macbookpro/features-15inch.html">MacBook Pro</a></strong>. I&#8217;m having a blast with it. For the open-source developer in me, this has everything I could ever want. It&#8217;s a beautiful and sleek machine that has gotten me highly motivated to start expanding my knowledge in different directions. While I still consider these laptops to be pricey, they&#8217;re really great.</p>
<p><strong>Learning Objective-C for Mac and iPhone development</strong> &#8211; Since I got a nice Mac, I figured I should start learning Objective-C, then eventually get into Cocoa and the iPhone SDK. I&#8217;ve always been impressed by some nicely-done open-source Mac applications, and iPhone apps have always seemed to be so creative, so I wanted to learn how to build some myself. Since I&#8217;ve been working for so many years on dynamically typed languages (like PHP and Ruby), it&#8217;s kind of a total change of pace to go back to a somewhat-statically typed language like Objective-C. It&#8217;s been a bit of a challenge, since I last used a C-based language back in my college days. But it&#8217;s going along well so far. </p>
<p>I&#8217;ve compiled quite a few resources for learning all of these things.  I recently purchased a book called <strong><a href="http://www.amazon.com/Programming-Objective-C-2-0-Developers-Library/dp/0321566157">Programming In Objective-C</a></strong>, which seems like the de-facto book on Objective-C, as it&#8217;s pretty extensive..And there are a few good screencasts &#8211; <strong><a href="http://www.peepcode.com/">PeepCode</a></strong> developed a screencast dubbed <strong><a href="http://peepcode.com/products/objective-c-for-rubyists">Objective-C for Rubyists</a></strong>, and <strong><a href="http://pragprog.com/">The Pragmatic Programmers</a></strong> have a screencast series by Bill Dudney called <strong><a href="http://pragprog.com/screencasts/v-bdobjc/coding-in-objective-c-2-0">Coding in Objective-C</a></strong>. Of course, Apple has done a fine job with <strong><a href="http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/chapter_1_section_1.html">their Objective-C documentation</a></strong>. All of these resources should get you coding in Objective-C in no time.</p>
<p>The iPhone development part is mostly being learned because at my day job we would like to create a nice iPhone app for users of our site. I truly think that a mobile interface will expand our user base easily, even if people say they don&#8217;t really use mobile interfaces for a lot of things. I find myself using Facebook and Amazon&#8217;s iPhone apps more than I visit their sites.</p>
<p><strong><a href="http://www.barterquest.com/">BarterQuest</a> is getting better and better</strong> &#8211; It&#8217;s been a wild ride on BarterQuest since <strong><a href="http://www.dennmart.com/2008/07/10/barterquest-the-trading-site-on-the-internet/">we launched</a></strong>. We&#8217;ve been featured all over the place, from blogs to television shows, and we&#8217;re getting more and more users visiting, registering and trading on our site every single day. I&#8217;ve even traded twice already, and everything has gone as smoothly as it possibly could. It&#8217;s a great way to get the stuff you want by getting rid of the stuff you don&#8217;t want.</p>
<p>If you haven&#8217;t checked out our site yet, or haven&#8217;t done so in a while, I highly recommend you visit us soon. We&#8217;re going to be adding support for <strong><a href="http://www.barterquest.com/home/real_estate">Real Estate</a></strong> in a few weeks, so our range of tradable items will greatly expand. And stay up to date with all that we&#8217;re doing by <strong><a href="http://twitter.com/barterquest">following us on Twitter</a></strong>.</p>
<p><strong>Learning (and liking) <a href="http://couchdb.apache.org/">CouchDB</a></strong> &#8211; My curiosity with CouchDB started when people were mentioning it quite a bit, and some Rails libraries like <strong><a href="http://github.com/jchris/couchrest/tree/master">CouchRest</a></strong> were gaining some attention. So I checked it out for the first time, and I had no freakin&#8217; clue why someone would use document-oriented databases, when relational databases did just fine.</p>
<p>Then a week I was working on a side project, and when trying to design my classes, I noticed that I would either have to denormalize my database tables, or be strict with normalization, but have a rather messy database schema. Then it just hit me &#8211; I finally knew the reason why CouchDB would rock in this scenario, where the data I was storing wouldn&#8217;t always follow the same structure. So I got into it, and I&#8217;m really liking it a whole lot. It&#8217;s something different, yet really useful in some situations. Seeing that there&#8217;s a market for databases like these, like <strong><a href="http://aws.amazon.com/simpledb/">Amazon SimpleDB</a></strong>, it seems like CouchDB (and document-oriented databases in general) will gain much popularity in the foreseeable future.</p>
<p>These are just a few things I&#8217;m playing along with. It seems like there are a lot of fun times ahead in software development and computing in general. I&#8217;m just happy to be able to ride the wave.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dennmart.com/2009/03/06/what-have-i-been-up-to/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Fatten Up Those Error Pages For Internet Explorer 6.0</title>
		<link>http://www.dennmart.com/2008/12/05/fatten-up-those-error-pages-for-internet-explorer-60/</link>
		<comments>http://www.dennmart.com/2008/12/05/fatten-up-those-error-pages-for-internet-explorer-60/#comments</comments>
		<pubDate>Fri, 05 Dec 2008 21:04:38 +0000</pubDate>
		<dc:creator>Dennis Martinez</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.dennmart.com/?p=121</guid>
		<description><![CDATA[One of the not-so-joyous moments of being a web developer is the fact that we still need to support browsers that are ancient (by technological standards). Specifically, I&#8217;m talking about Internet Explorer 6.0. A quick look at the site statistics of one of the major websites I&#8217;m currently working on says that 16.9% of users [...]]]></description>
			<content:encoded><![CDATA[<p>One of the not-so-joyous moments of being a web developer is the fact that we still need to support browsers that are ancient (by technological standards). Specifically, I&#8217;m talking about Internet Explorer 6.0. A quick look at the site statistics of one of the major websites I&#8217;m currently working on says that 16.9% of users visited our site using Internet Explorer 6.0. That&#8217;s obviously not the majority &#8211; Internet Explorer 7.0 takes that honor with 38.4%, followed by Firefox 3.0 with 19.8%. But it&#8217;s still a large enough number for the higher-ups to decide not to ignore it.</p>
<p>Since I never, ever use Internet Explorer 6.0 for any regular browsing (and you shouldn&#8217;t, either &#8211; read why on sites like <strong><a href="http://browsehappy.com/">Browse Happy</a></strong>), this past week I decided to give the site a test run with Internet Explorer 6.0 (using <strong><a href="http://www.tatanka.com.br/ies4linux/page/Main_Page">IEs 4 Linux</a></strong>). Besides the frustration of finding some incompatibilities with standard CSS on this browser, everything else seemed to work well. I then triggered an error on purpose, just to make sure our error handling would be handled properly (display our custom 404 error page instead of a nasty -yet customized &#8211; 500 error page). To my surprise, Internet Explorer 6.0 decided to render its own friendly error page instead of our custom one.</p>
<p>Thinking one of my colleagues removed it for whatever reason, I fired up Firefox and triggered the same error. The custom 404 page appeared correctly. Heading over to a Windows laptop, I had the custom error page on all browsers, including Internet Explorer 7.0. This left me scratching my head for a while. Although I&#8217;m already used to Internet Explorer 6.0 to act in different ways, standards be damned, this act seemed to be stupefying.</p>
<p>I was about to give up, thinking that Internet Explorer 6.0 used to hijack everyone&#8217;s custom error page just to hawk their own, I did a search on 404 error pages.  Lo and behold, <strong><a href="http://en.wikipedia.org/wiki/404_error">Wikipedia</a></strong> came through with a response that I would have never guessed:</p>
<blockquote><p>Internet Explorer (before Internet Explorer 7), however, will not display custom pages unless they are larger than 512 bytes, opting to instead display a &#8220;friendly&#8221; error page.</p></blockquote>
<p>Wow. Who knew that size mattered? On a custom error page, of course.</p>
<p>Our custom 404 was basically just a regular HTML with the standard tags, and one image and it weighed less than 300 bytes. I couldn&#8217;t modify the design or anything, so I just padded the error page with a long, boring and senseless comment, explaining why said comment was there. After &#8216;fattening up&#8217; the file to more than 512 bytes, the error page started appearing on Internet Explorer 6.0.</p>
<p>It turns out that older versions of Internet Explorer had a <strong><a href="http://support.microsoft.com/kb/q218155/">threshold value in the registry</a></strong> which decided whether to display their own error page or a custom one. Why? I have no idea. Thankfully that was fixed for recent versions. But for all of the unlucky ones who still have to support ancient technology, this is another special Internet Explorer 6.0 quirk that needs to be taken into consideration.</p>
<p>For more information, including the default size limitations for other error pages, read <strong><a href="<br />
http://www.404-error-page.com/404-error-page-too-short-problem-microsoft-ie.shtml">this site</a></strong> (aptly named &#8217;404-error-pages.com&#8217;) has all the information you need.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dennmart.com/2008/12/05/fatten-up-those-error-pages-for-internet-explorer-60/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Want To Learn About Rails 2.2? Get The Envycast and PDF</title>
		<link>http://www.dennmart.com/2008/11/02/want-to-learn-about-rails-22-get-the-envycast-and-pdf/</link>
		<comments>http://www.dennmart.com/2008/11/02/want-to-learn-about-rails-22-get-the-envycast-and-pdf/#comments</comments>
		<pubDate>Sun, 02 Nov 2008 17:16:41 +0000</pubDate>
		<dc:creator>Dennis Martinez</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Reviews]]></category>
		<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[Envycast]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Rails 2.2]]></category>

		<guid isPermaLink="false">http://www.dennmart.com/?p=113</guid>
		<description><![CDATA[A couple of weeks ago, I wrote a short post about the first Envycast released by the guys over at Rails Envy. I really enjoyed their first foray in the world of screencasting, so I was looking forward to see what else they would offer us in the future. With the imminent release of Rails [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of weeks ago, I wrote a <strong><a href="http://www.dennmart.com/2008/09/16/envy-casts-the-new-hotness/">short post</a></strong> about the first Envycast released by the guys over at <strong><a href="http://www.railsenvy.com/">Rails Envy</a></strong>. I really enjoyed their first foray in the world of screencasting, so I was looking forward to see what else they would offer us in the future.</p>
<p>With the imminent release of Rails 2.2 (<strong><a href="http://weblog.rubyonrails.org/2008/10/24/rails-2-2-rc1-i18n-thread-safety-docs-etag-last-modified">Release Candidate 1</a></strong> was announced last week), it makes complete sense that the new Envycast would focus on Rails 2.2. In the <strong><a href="http://envycasts.com/products/ruby-on-rails-22-screencast">Ruby on Rails 2.2 Screencast</a></strong>, Gregg Pollack and Jason Seifer talk about all the goodies that have been included in Rails for our use. Even if you&#8217;re currently subscribed to <strong><a href="http://ryandaigle.com/">Ryan Daigle&#8217;s blog</a></strong> and follow the <strong><a href="http://github.com/rails/rails/commits/master">Rails commit history</a></strong>, it&#8217;s still nice to have everything in one easily accessible place. While an Envycast in itself should be awesome, they decided to also have a PDF available, detailing all of these changes.</p>
<p><strong>Screencast</strong></p>
<p>Clocking in at 44 minutes, this screencast takes you through the changes in Rails, divided by component (ActiveRecord, ActiveSupport, ActionPack, ActionController, Railties) and specific topics (Internationalization and Performance). Like the first Envycast, all the action (well, as much &#8216;action&#8217; as you can get in a Rails screencast) is done in front of a green screen, with either Gregg or Jason explaining what&#8217;s on the screen. As I mentioned previously, this gives the screencast a nice, personal feel, making the learning (and retaining the information) experience enjoyable and much easier &#8211; at least to me &#8211; than other screencasts. The infused humor also helps a lot with the learning process, making you feel comfortable and in a relaxed setting, which is key for learning new stuff. </p>
<p>Considering all the changes that have occurred in the six months between Rails 2.1 and Rails 2.2, this screencast does a good job in explaining all the new stuff. Although it doesn&#8217;t go too much into detail with some new features (thankfully so &#8211; I prefer short and simple, just like my Ruby and my Rails), my major gripe with this screencast is the lack of more detailed explanation on one major feature I (and I&#8217;m sure hordes of other Rails developers) was looking forward to: Internationalization. While I do understand this would need sufficient time to explain this new feature properly, I thought this was too big of a feature to just briefly touch on. They do encourage viewers who want to learn more to download and play with the <strong><a href="http://github.com/clemens/i18n_demo_app/tree/master">Internationalization Demo App</a></strong> that was created just for this purpose.</p>
<p>Besides that, Gregg and Jason do an awesome job with this screencast. They explain these new features really well, make good use of the green screen (well, besides dodging pigeons and running away from Godzilla &#8211; trust me, you&#8217;ll see when you get this screencast) There were many <em>&#8220;Whoa, I&#8217;m so going to use that in my next project!&#8221;</em> moments for me, which for some reason didn&#8217;t happen when I read about these changes in Ryan Daigle&#8217;s blog.</p>
<p>After my short review of the first Envycast and liking it a lot, I was anxious to see if the Rails Envy crew would continue along these lines. I&#8217;m glad to see that they still produced a great screencast that&#8217;s easy to learn from and fun to watch.</p>
<p><strong>PDF</strong></p>
<p>Like I mentioned, they not only released a screencast on Rails 2.2, they also released a PDF to complement the screencast. The <strong><a href="http://envycasts.com/products/ruby-on-rails-22-pdf">Ruby on Rails 2.2 PDF</a></strong> was written by <strong><a href="http://www.nomedojogo.com/">Carlos Brando</a></strong>, a Portuguese Rails Core contributor who also wrote a similar (and excellent) <strong><a href="http://www.nomedojogo.com/2008/06/09/new-free-book-ruby-on-rails-21-whats-new/">e-book on Rails 2.1</a></strong>.</p>
<p>While the screencast goes over the new features in Rails 2.2 briefly, the PDF goes more into detail, with explanations and code examples throughout the book. There&#8217;s even an entire chapter on Internationalization, compensating for the lack of explanation in the screencast. At 118 pages (of which 86 are in-depth explanations of the Rails 2.2 features, 9 pages detailing the bug fixes in this release and 14 pages of the entire changelogs by component), it gives you all the new details in Rails 2.2, perhaps much more than what you need.</p>
<p>While the content is rock-solid, the formatting of the guide wasn&#8217;t too much to my liking. The PDF is in landscape orientation, which usually isn&#8217;t a big deal for me. However, the author didn&#8217;t seem to take advantage of this fact, as I think it could&#8217;ve been printed in portrait orientation without much formatting changes. Also, the PDF is just straight text (well, not counting the cover page, for those who like to nit-pick). There are no diagrams or anything similar &#8211; just explanations and code samples. Some diagrams or other illustrations wouldn&#8217;t have hurt to be included.</p>
<p>As a matter of example, if you see any of the Peepcode PDF&#8217;s (like the one on <strong><a href="http://peepcode.com/products/unobtrusive-prototype-js">Unobtrusive Prototype.js</a></strong>), you&#8217;ll see they took advantage of the page sizes, filling it up without making the pages feel too loaded. These make reading <em>less boring</em>, while still keeping the core information there. It&#8217;s a nice combination.</p>
<p>Aside from some very minor gripes, these are quality products that will further your knowledge of everything Rails. I definitely recommend them to any Rails developer who is interested in keeping up to date with the rapidly-changing Rails world. Kudos to the Rails Envy crew for putting up another great product. I&#8217;ll be looking forward with what they come up next.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dennmart.com/2008/11/02/want-to-learn-about-rails-22-get-the-envycast-and-pdf/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Difference between validates_presence_of and validates_length_of</title>
		<link>http://www.dennmart.com/2008/10/22/difference-between-validates_presence_of-and-validates_length_of/</link>
		<comments>http://www.dennmart.com/2008/10/22/difference-between-validates_presence_of-and-validates_length_of/#comments</comments>
		<pubDate>Thu, 23 Oct 2008 02:26:22 +0000</pubDate>
		<dc:creator>Dennis Martinez</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.dennmart.com/?p=111</guid>
		<description><![CDATA[Today I had a pretty frustrating moment. I made some new changes in the morning, which included the addition of a new column in the database. This field wasn&#8217;t required, but I needed to limit the amount of characters a user could enter in that string. So I did the proper thing and set this [...]]]></description>
			<content:encoded><![CDATA[<p>Today I had a pretty frustrating moment. I made some new changes in the morning, which included the addition of a new column in the database. This field wasn&#8217;t required, but I needed to limit the amount of characters a user could enter in that string. So I did the proper thing and set this in my model:</p>
<p><code>validates_length_of :locations, :maximum => 200</code></p>
<p>I did a quick test, and the validations worked great. So I promptly committed the code to our repository. A few minutes later, our Continuous Integration system sent me a nasty E-Mail: <em>I broke the build</em>.</p>
<p>I frantically searched the errors in the test, and it seemed that the tests were expecting that field I just added to have something. I was stumped, thinking that unless you specify <em>validates_presence_of</em>, set a range of characters in the <em>validates_length_of</em> or perhaps some regular expression validations in the model, that would be the only time a model would require the field to be there. I hadn&#8217;t done any of these.</p>
<p>Frustrated, I added a simple string to the fixtures and the test code for this field, and the tests passed. Not content in just making something work, I <em>needed</em> to know what was up. So I started digging around, and found something that now seems obvious, but I totally ignored before.</p>
<p>Whenever you submit a form for a model in Rails to insert a new record in an ActiveRecord model, all the fields you have set in the view are passed in the POST request. However, if you didn&#8217;t enter anything in a field, the parameters for that field would simply be sent blank. In this case, <em>validates_length_of</em> doesn&#8217;t bitch about the missing field, because it&#8217;s there. As long as the number of characters &#8211; in this case, zero &#8211; isn&#8217;t more than what I specified in the model, it&#8217;s all good. However, the tests were failing because since I hadn&#8217;t specified that new field in the fixtures, the parameters were sending that field as <strong>nil</strong>, which caused the previously mentioned validation to scream out.</p>
<p>So just as a quick review:</p>
<ul>
<li><strong>validates_length_of</strong> &#8211; Verifies if the field is within the amount of characters specified in the validation code. If no minimum is set, it won&#8217;t mind blank fields, but it will mind <strong>nil</strong> fields.</li>
<li><strong>validates_presence_of</strong> &#8211; Verifies if the field is <strong>nil</strong> or blank.</li>
</ul>
<p>Like I said, it&#8217;s obvious now, but not so much when I was getting alerts that the build failed for some silly reason.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dennmart.com/2008/10/22/difference-between-validates_presence_of-and-validates_length_of/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quick and Dirty Browser Cookie Testing</title>
		<link>http://www.dennmart.com/2008/09/30/quick-and-dirty-browser-cookie-testing/</link>
		<comments>http://www.dennmart.com/2008/09/30/quick-and-dirty-browser-cookie-testing/#comments</comments>
		<pubDate>Wed, 01 Oct 2008 02:23:19 +0000</pubDate>
		<dc:creator>Dennis Martinez</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby On Rails]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.dennmart.com/?p=97</guid>
		<description><![CDATA[On a recent Rails project, I was asked to verify if the visiting user&#8217;s browser has cookies enabled, and display a message on top of the screen if they don&#8217;t. While I don&#8217;t want to get into the reasoning why, or get into a flame war whether the site should still be accessible regardless if [...]]]></description>
			<content:encoded><![CDATA[<p>On a recent Rails project, I was asked to verify if the visiting user&#8217;s browser has cookies enabled, and display a message on top of the screen if they don&#8217;t. While I don&#8217;t want to get into the reasoning why, or get into a flame war whether the site should still be accessible regardless if the user&#8217;s browser has cookies, I still needed to implement it.</p>
<p>Since it&#8217;s a Rails project, I thought of checking if the session cookie that Rails sets in the Application controller was set. But Rails sets the session <em>after</em> the view is rendered the first time (I have a more detailed explanation somewhere but don&#8217;t have it with me, so maybe next time). This means the first time the user visits the site, it will incorrectly display the warning message. Subsequent views will test correctly, but this obviously won&#8217;t work.</p>
<p>So I decided to implement a redirect, thanks to ideas given by <strong><a href="http://kill-0.com/duplo/2007/07/12/rails-cookie-detection/">this blog post</a></strong>. It worked, but it left me with a parameter in my URL the first time the user visited the site. It didn&#8217;t seem clean, and the higher-ups didn&#8217;t like it either, so off it went.</p>
<p>Then I was given the idea to check it via JavaScript, and with some slight tinkering I think I got what I wanted:</p>
<pre name="code" class="javascript">
<script type="text/javascript">
    function testCookies() {
      document.cookie = "cookie_test=test;";
      var results = document.cookie.match ( '(^|;) ?cookie_test=([^;]*)(;|$)' );
      if (!results) // No cookies were set - The browser doesn't allow cookies.
        $('cookies_disabled').show();
      else // Delete the cookie - It's no longer needed.
        document.cookie = "cookie_test=; expires=01/01/2001 00:00:00;";
    }
</script>
</pre>
<p>Basically this uses JavaScript to set the cookie when the page is rendering and immediately checks for its availability using a regular expression. If it&#8217;s found, then the user has cookies enabled and we can safely delete the test cookie (provided the user has their system clock set after January 1, 2001). If the cookie isn&#8217;t set, that means the user doesn&#8217;t have cookies enabled in their browser, so we display the &#8216;cookies_disabled&#8217; element with our message inside.</p>
<p>This function is called in our application layout, between the &lt;head&gt; tags, meaning it&#8217;s called for every single page that renders the default layout. I haven&#8217;t observed any type of performance issue this might have, but I might have missed something along the way. And there&#8217;s probably a better, more efficient way to handle this as well, so if you have any suggestions, feel free to dtop a comment and let me know.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dennmart.com/2008/09/30/quick-and-dirty-browser-cookie-testing/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>That&#8217;s Why There Are Choices, People</title>
		<link>http://www.dennmart.com/2008/09/18/thats-why-there-are-choices-people/</link>
		<comments>http://www.dennmart.com/2008/09/18/thats-why-there-are-choices-people/#comments</comments>
		<pubDate>Fri, 19 Sep 2008 01:38:40 +0000</pubDate>
		<dc:creator>Dennis Martinez</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.dennmart.com/?p=94</guid>
		<description><![CDATA[I was having a quick tech discussion the other day on a non-tech message board I visit on a daily basis. I had mentioned how frustrating it is to have to spend hours developing for good ol&#8217; obsolete Internet Explorer 6.0, and why people are so damn lazy to upgrade. There are countless reasons why [...]]]></description>
			<content:encoded><![CDATA[<p>I was having a quick tech discussion the other day on a non-tech message board I visit on a daily basis. I had mentioned how frustrating it is to have to spend hours developing for good ol&#8217; obsolete Internet Explorer 6.0, and why people are so damn lazy to upgrade. There are countless reasons why people don&#8217;t upgrade, which I won&#8217;t go into now to avoid a long, long rant on why I think these people should be stripped from their computing privileges. But I was talking about the recent developments in web browsers, in particular how Firefox 3.1 is going to be <strong><a href="http://news.cnet.com/8301-1001_3-10023723-92.html">much faster</a></strong>, or how Internet Explorer 8.0 is <strong><a href="http://www.cio.com/article/193350/Internet_Explorer_Promises_Better_Standards_Compliance...and_a_Whole_Lot_More">promising to play better with web standards</a></strong>, I received this delightful comment from one of the few techies (and one of the few females) in that forum:</p>
<blockquote><p>He can shove Firefox 3 where the sun doesn&#8217;t shine, and if he suggests Internet Explorer 8 in person I will be forced to cram his balls up over his head whilst they are still attached to him.</p></blockquote>
<p>Just lovely. And I hadn&#8217;t even suggested that people upgrade!</p>
<p>The particular reasons she gave me as to why she made this statement are irrelevant to the discussion (<em>&#8220;Firefox 3 doesn&#8217;t support all my add-ons yet and Internet Explorer lost me a long, long time ago.&#8221;</em>), but something slightly ticked me off about this brash statement.</p>
<p>Every single person on this planet has an opinion to express, for whatever reason. People involved in computers aren&#8217;t excluded. I&#8217;d say we absolutely <em>love</em> expressing our opinions about a myriad of things, leading to sometimes heated (and entertaining) discussions: Windows vs. Linux vs. Mac, Ruby vs. Python, vi vs. emacs&#8230; No matter what you say, there will always be someone to express the opposite.</p>
<p>I learned a long time ago to avoid these discussions altogether. Why? It&#8217;s not because I&#8217;m a poor debater and fear I&#8217;m going to lose (which is most likely true). It&#8217;s because no one in this world will ever be pleased. That&#8217;s why there are choices in this world. To put it as simple as possible, someone wasn&#8217;t content with something, so they made another thing. And they&#8217;re happy with it.</p>
<p>So if I&#8217;m happy with Ruby and Rails, and you&#8217;re extremely happy with Python and Django, then I respect your opinion, sir. Just don&#8217;t come down on me and run down a zillion reasons why Ruby or Rails suck (which are probably variants of &#8220;<strong><a href="http://railscantscale.com/">Rails Can&#8217;t Scale</a></strong>&#8220;). Be happy with what you have, I&#8217;ll be happy with what I have, and we can co-exist nicely in this vast software development universe.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dennmart.com/2008/09/18/thats-why-there-are-choices-people/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.246 seconds -->
