<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8533688570733149008</id><updated>2011-07-08T06:59:17.457-07:00</updated><category term='dropdown'/><category term='global user message'/><category term='varchar'/><category term='country_select'/><category term='aasm'/><category term='state_machine'/><category term='SQL Server'/><category term='Locality'/><category term='change'/><category term='conversion'/><category term='object modeling'/><category term='site offline'/><category term='Active Record'/><category term='api'/><category term='Ajax'/><category term='validation'/><category term='shortcut'/><category term='state_select'/><category term='plugin'/><category term='gem'/><category term='adjectivize'/><category term='desert'/><category term='maintenance'/><category term='verticalresponse'/><category term='SSL'/><category term='code'/><category term='Ruby on Rails'/><category term='inflector'/><category term='emails'/><category term='process modeling'/><category term='Test Driven Development'/><category term='check'/><category term='number'/><category term='Rails'/><category term='machine readable'/><category term='programming'/><category term='Localization'/><category term='customize'/><category term='Logon'/><category term='Behavior'/><category term='isinteger'/><category term='French Southern Territories Nationality'/><category term='postal codes'/><category term='Behaviour Driven Development'/><category term='nationality'/><category term='isint'/><category term='Agile'/><category term='Ruby'/><category term='Ecommerce'/><category term='adapt'/><category term='email blasts'/><category term='adjective'/><category term='string class'/><category term='headache'/><category term='Blog'/><category term='Login'/><title type='text'>Ruby On Braille</title><subtitle type='html'>Technology Agnostic Rubyist : Open Source Lights The Way</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rubyonbraille.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rubyonbraille.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>40x14</name><uri>http://www.blogger.com/profile/00293707839342409278</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos9.flickr.com/12579037_3544450bc3_t.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8533688570733149008.post-6388403733492480192</id><published>2010-02-22T22:27:00.000-08:00</published><updated>2010-02-22T22:27:10.375-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='aasm'/><category scheme='http://www.blogger.com/atom/ns#' term='process modeling'/><category scheme='http://www.blogger.com/atom/ns#' term='desert'/><category scheme='http://www.blogger.com/atom/ns#' term='state_machine'/><category scheme='http://www.blogger.com/atom/ns#' term='object modeling'/><title type='text'>reverse engineering and acts_as_state_machine</title><content type='html'>I started using &lt;a href=http://railroad.rubyforge.org/&gt;railroad&lt;/a&gt; to help me understand (by way of reverse engineering) a complex system I'm working on. &lt;br /&gt;&lt;br /&gt;I really like the fact that it generates .dot files which can be opened and manipulated using Omnigraffle, but it was failing on AASM due to complicated dependencies which I don't care to resolve.&lt;br /&gt;&lt;br /&gt;Today I discovered that I can use &lt;a href=http://rubygems.org/gems/ruby-graphviz&gt;ruby-graphviz&lt;/a&gt; to make pretty drawings of complex state machine events in my models. I highly recommend it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8533688570733149008-6388403733492480192?l=rubyonbraille.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyonbraille.blogspot.com/feeds/6388403733492480192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8533688570733149008&amp;postID=6388403733492480192' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/6388403733492480192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/6388403733492480192'/><link rel='alternate' type='text/html' href='http://rubyonbraille.blogspot.com/2010/02/reverse-engineering-and.html' title='reverse engineering and acts_as_state_machine'/><author><name>40x14</name><uri>http://www.blogger.com/profile/00293707839342409278</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos9.flickr.com/12579037_3544450bc3_t.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8533688570733149008.post-2676461043108514383</id><published>2009-11-03T19:16:00.000-08:00</published><updated>2009-11-03T19:19:37.729-08:00</updated><title type='text'>Fresh Cucumber</title><content type='html'>I've been putting together a little project using Rspec and Cucumber. It's a way of coding called Behaviour Driven Development and I'm loving it. &lt;br /&gt;&lt;br /&gt;Here is Aslak Hellesøy's excellent backgrounder on &lt;a href=http://wiki.github.com/aslakhellesoy/cucumber/cucumber-backgrounder&gt;Cucumber: BDD that talks to domain experts first and code second&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8533688570733149008-2676461043108514383?l=rubyonbraille.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyonbraille.blogspot.com/feeds/2676461043108514383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8533688570733149008&amp;postID=2676461043108514383' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/2676461043108514383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/2676461043108514383'/><link rel='alternate' type='text/html' href='http://rubyonbraille.blogspot.com/2009/11/cooking-cucumber.html' title='Fresh Cucumber'/><author><name>40x14</name><uri>http://www.blogger.com/profile/00293707839342409278</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos9.flickr.com/12579037_3544450bc3_t.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8533688570733149008.post-8244279178979646262</id><published>2009-09-10T12:07:00.000-07:00</published><updated>2009-09-15T12:41:14.738-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='adapt'/><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='headache'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='change'/><title type='text'>API Changes</title><content type='html'>I decided to read the &lt;a href="http://developer.ebay.com"&gt;eBay API Developer Newsletter&lt;/a&gt; today and was reminded why this API can be difficult to work with. The reason is &lt;span style="font-style:italic;"&gt;not&lt;/span&gt; because it is complex or difficult to master. It is because the API is constantly evolving (good), and often the evolutionary changes cause previous working code to fail (not good).&lt;br /&gt;&lt;br /&gt;After glancing past the Developer Success Stories I found this valuable nugget: &lt;blockquote style="color:#000"&gt;The eBay API team is considering changing the case of the appinfo tags found in various wsdls—specifically, changing from upper to lowercase on the first letter only. For example, CallName could become callName, RequiredInput could become requiredInput, and MaxLength could become maxLength.&lt;/blockquote&gt;In &lt;span style="font-weight:bold;"&gt;stark&lt;/span&gt; contrast, a quote from the home page of rubyonrails.org:&lt;br /&gt;&lt;blockquote style="color:#000"&gt;Ruby on Rails is an open source web framework that's optimized for programmer &lt;span style="font-weight: bold;"&gt;happiness &lt;/span&gt;and &lt;span style="font-weight: bold;"&gt;sustainable productivity&lt;/span&gt;. It lets you write &lt;span style="font-weight: bold;"&gt;beautiful code&lt;/span&gt; by favoring &lt;span style="font-weight: bold;"&gt;convention over configuration&lt;/span&gt;.&lt;/blockquote&gt;Can an API be designed in such a way as to make programmers Happy and Productive? &lt;br /&gt;&lt;br /&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8533688570733149008-8244279178979646262?l=rubyonbraille.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyonbraille.blogspot.com/feeds/8244279178979646262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8533688570733149008&amp;postID=8244279178979646262' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/8244279178979646262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/8244279178979646262'/><link rel='alternate' type='text/html' href='http://rubyonbraille.blogspot.com/2009/09/api-changes.html' title='API Changes'/><author><name>40x14</name><uri>http://www.blogger.com/profile/00293707839342409278</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos9.flickr.com/12579037_3544450bc3_t.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8533688570733149008.post-4789636852517582814</id><published>2009-07-31T10:22:00.000-07:00</published><updated>2009-11-09T21:56:20.933-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='nationality'/><category scheme='http://www.blogger.com/atom/ns#' term='gem'/><category scheme='http://www.blogger.com/atom/ns#' term='country_select'/><title type='text'>country_select and my country of origin inflector method</title><content type='html'>Making use of the string class add-on that I developed at the recent &lt;a href="http://www.goruco.com"&gt;Goruco&lt;/a&gt; conference. &lt;br /&gt;&lt;br /&gt;I've put together a &lt;a href="http://guiweinmann.alphabetware.com/meetups/list"&gt;simple little app&lt;/a&gt; and a &lt;a href=http://originfy.us&gt;domain&lt;/a&gt; where some of the code is available to anyone who can use it.&lt;br /&gt;&lt;br /&gt;Please contact me if you are interested any part of this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8533688570733149008-4789636852517582814?l=rubyonbraille.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyonbraille.blogspot.com/feeds/4789636852517582814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8533688570733149008&amp;postID=4789636852517582814' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/4789636852517582814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/4789636852517582814'/><link rel='alternate' type='text/html' href='http://rubyonbraille.blogspot.com/2009/07/job-interview-at-amexpub.html' title='country_select and my country of origin inflector method'/><author><name>40x14</name><uri>http://www.blogger.com/profile/00293707839342409278</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos9.flickr.com/12579037_3544450bc3_t.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8533688570733149008.post-4228120170359191147</id><published>2009-05-30T19:05:00.000-07:00</published><updated>2009-05-30T19:32:46.608-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Locality'/><category scheme='http://www.blogger.com/atom/ns#' term='Localization'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Ecommerce'/><title type='text'>Extending the String class</title><content type='html'>Feeling inspired after &lt;a href="http://www.goruco.com"&gt;2009 Gotham Ruby Conference&lt;/a&gt;, I finally wrote this.&lt;div style="width:400px;"&gt;&lt;pre&gt;&lt;br /&gt;class String&lt;br /&gt;&lt;br /&gt; def nationalize &lt;br /&gt;    # retrieve a full xml list of countries and attributes&lt;br /&gt;    # if string matches the country name on the list return the &lt;br /&gt;    # nationality of the goods that originate from that country&lt;br /&gt;    # may not be the most efficient way, but it sure is extensible&lt;br /&gt;    @xml = open('http://originify.us/originify.us.xml')    &lt;br /&gt;    country = REXML::Document.new(@xml)&lt;br /&gt;      country.elements.each('/countries/country') do |p|&lt;br /&gt;          return p.attributes['nationality'] if self.to_s == p.text.to_s&lt;br /&gt;      end &lt;br /&gt;      # returns self or superclass&lt;br /&gt;      self || super&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;It's an extension of the String class. I wanted to present the idea at the Reject Conference session but I'm glad I didn't. There were about 10 reject presentations and some were really good.&lt;br /&gt;&lt;br /&gt;The way it works is simple. Just take any text string and use the nationalize method on it. For example, "France".nationalize =&gt; "French", "Switzerland".nationalize =&gt; "Swiss", "Australia".nationalize =&gt; "Australian".&lt;br /&gt;&lt;br /&gt;This could be useful. Suppose you are a clothing retailer and have data for sweater in your database. The sweater has been assigned the attributes "Wool" and originating from "Australia" or "Switzerland" using a dropdown.&lt;br /&gt;&lt;br /&gt;In describing the sweater on a web site, one might want to say that it is made of Swiss Wool.&lt;br /&gt;&lt;br /&gt;This could be refactored.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8533688570733149008-4228120170359191147?l=rubyonbraille.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyonbraille.blogspot.com/feeds/4228120170359191147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8533688570733149008&amp;postID=4228120170359191147' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/4228120170359191147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/4228120170359191147'/><link rel='alternate' type='text/html' href='http://rubyonbraille.blogspot.com/2009/05/extending-string-class.html' title='Extending the String class'/><author><name>40x14</name><uri>http://www.blogger.com/profile/00293707839342409278</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos9.flickr.com/12579037_3544450bc3_t.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8533688570733149008.post-2723830606907276612</id><published>2009-04-03T22:56:00.000-07:00</published><updated>2009-04-03T22:58:51.629-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Test Driven Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Behaviour Driven Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Behavior'/><title type='text'></title><content type='html'>Take away the RAD tools, TDD and BDD may be the best way to ensure good specifications before commencing a project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8533688570733149008-2723830606907276612?l=rubyonbraille.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyonbraille.blogspot.com/feeds/2723830606907276612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8533688570733149008&amp;postID=2723830606907276612' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/2723830606907276612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/2723830606907276612'/><link rel='alternate' type='text/html' href='http://rubyonbraille.blogspot.com/2009/04/take-away-rad-tools-tdd-and-bdd-may-be.html' title=''/><author><name>40x14</name><uri>http://www.blogger.com/profile/00293707839342409278</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos9.flickr.com/12579037_3544450bc3_t.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8533688570733149008.post-8058997237262107426</id><published>2009-03-31T20:45:00.001-07:00</published><updated>2009-05-30T19:16:49.795-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='string class'/><category scheme='http://www.blogger.com/atom/ns#' term='inflector'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='French Southern Territories Nationality'/><category scheme='http://www.blogger.com/atom/ns#' term='nationality'/><category scheme='http://www.blogger.com/atom/ns#' term='machine readable'/><category scheme='http://www.blogger.com/atom/ns#' term='adjective'/><category scheme='http://www.blogger.com/atom/ns#' term='customize'/><category scheme='http://www.blogger.com/atom/ns#' term='adjectivize'/><title type='text'>Ruby on Rails Inflector for Nationality</title><content type='html'>I've given myself until midnight to complete &lt;a href="http://rubyonbraille.blogspot.com/2008/11/write-nationality-gem-or-plugin.html"&gt;the task I wrote about&lt;/a&gt; on November 25th.&lt;br /&gt;&lt;br /&gt;The idea is for a Ruby Gem that provides a nationalize method for the String Class.&lt;br /&gt;&lt;br /&gt;Any country code would be nationalized by simply typing something akin to "France".nationalize =&gt; "French" likewise "US".nationalize =&gt; "American"&lt;br /&gt;&lt;br /&gt;As soon as I found a list country codes... I also realized I wouldn't have enough time to write the code and Gemify it. So I started hacking away at an Environment.rb file.&lt;br /&gt;&lt;br /&gt;That got me something like this:&lt;br /&gt;&lt;code&gt;class String&lt;br /&gt;# list of countries derived from http://www.internetworldstats.com/list2.htm#af&lt;br /&gt;def nationalize&lt;br /&gt;{&lt;br /&gt;:Afghanistan =&gt; "Afghani",&lt;br /&gt;:Africa =&gt; "African",&lt;br /&gt;:Albania =&gt; "Albanian",&lt;br /&gt;:Algeria =&gt; "Algerian",&lt;br /&gt;:Andorra =&gt; "Andorra",&lt;br /&gt;:Angola =&gt; "Angolan",&lt;br /&gt;:Anguilla =&gt; "Anguilla",&lt;br /&gt;:Antarctica =&gt; "Antarctic",&lt;br /&gt;...&lt;br /&gt;}[self.gsub(/_id$/, "").to_sym] || super&lt;br /&gt;end&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I decided this was getting a little cumbersome. Especially when I realized that any country with a space (char(32)) or other odd character in the name would need to be typecast as a :symbol in order for my code to work.&lt;br /&gt;&lt;br /&gt;Options:&lt;br /&gt;1) Devise out a work around, or&lt;br /&gt;2) Plug away at the entire list of &lt;a href="http://www.madore.org/%7Edavid/misc/countries.html"&gt;230+ ISO country names&lt;/a&gt; and code for the exceptions&lt;br /&gt;&lt;br /&gt;Of course one would prefer a more elegant and flexible solution. Have only two choices seemed awkward. So I did a little bit more research and found an XML list of countries.&lt;br /&gt;&lt;br /&gt;This enabled another option:&lt;br /&gt;3) Modify an XML country list to include nationality adjectives.&lt;br /&gt;&lt;br /&gt;Now that I've modified the XML country list the data can be parsed, utlized, and published however one sees fit, in any computer program.&lt;br /&gt;&lt;br /&gt;This is a flexible solution and completely language agnostic. I like it that way.&lt;br /&gt;&lt;br /&gt;While I was thinking about this, I registered the domain name &lt;a href="http://originify.us/"&gt;http://originfy.us&lt;/a&gt;. I will upload the XML file that I created to that domain.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8533688570733149008-8058997237262107426?l=rubyonbraille.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyonbraille.blogspot.com/feeds/8058997237262107426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8533688570733149008&amp;postID=8058997237262107426' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/8058997237262107426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/8058997237262107426'/><link rel='alternate' type='text/html' href='http://rubyonbraille.blogspot.com/2009/03/ruby-on-rails-inflector-for-nationality_31.html' title='Ruby on Rails Inflector for Nationality'/><author><name>40x14</name><uri>http://www.blogger.com/profile/00293707839342409278</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos9.flickr.com/12579037_3544450bc3_t.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8533688570733149008.post-1819699744489201682</id><published>2009-01-13T08:33:00.000-08:00</published><updated>2009-01-13T08:35:04.822-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emails'/><category scheme='http://www.blogger.com/atom/ns#' term='email blasts'/><category scheme='http://www.blogger.com/atom/ns#' term='verticalresponse'/><title type='text'>No more email campaigns for me</title><content type='html'>Today I taught my client how to send email blasts. It was a BLAST.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8533688570733149008-1819699744489201682?l=rubyonbraille.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyonbraille.blogspot.com/feeds/1819699744489201682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8533688570733149008&amp;postID=1819699744489201682' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/1819699744489201682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/1819699744489201682'/><link rel='alternate' type='text/html' href='http://rubyonbraille.blogspot.com/2009/01/no-more-email-campaigns-for-me.html' title='No more email campaigns for me'/><author><name>40x14</name><uri>http://www.blogger.com/profile/00293707839342409278</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos9.flickr.com/12579037_3544450bc3_t.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8533688570733149008.post-8205987865383796602</id><published>2008-11-25T20:46:00.000-08:00</published><updated>2008-11-25T20:48:27.117-08:00</updated><title type='text'>Write a nationality gem or plugin</title><content type='html'>This is just a reminder to self to write something that ties in with Ruby inflectors and the country_select helper.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8533688570733149008-8205987865383796602?l=rubyonbraille.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyonbraille.blogspot.com/feeds/8205987865383796602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8533688570733149008&amp;postID=8205987865383796602' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/8205987865383796602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/8205987865383796602'/><link rel='alternate' type='text/html' href='http://rubyonbraille.blogspot.com/2008/11/write-nationality-gem-or-plugin.html' title='Write a nationality gem or plugin'/><author><name>40x14</name><uri>http://www.blogger.com/profile/00293707839342409278</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos9.flickr.com/12579037_3544450bc3_t.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8533688570733149008.post-3952315564472526076</id><published>2008-11-14T11:34:00.000-08:00</published><updated>2008-11-25T20:46:14.630-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='isint'/><category scheme='http://www.blogger.com/atom/ns#' term='conversion'/><category scheme='http://www.blogger.com/atom/ns#' term='isinteger'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='number'/><category scheme='http://www.blogger.com/atom/ns#' term='check'/><category scheme='http://www.blogger.com/atom/ns#' term='validation'/><category scheme='http://www.blogger.com/atom/ns#' term='varchar'/><title type='text'>Dirty numbers</title><content type='html'>/$#@!&lt;br /&gt;&lt;br /&gt;This is a pretty basic programming concept but I haven't touched this blog in a while here we go...&lt;br /&gt;&lt;br /&gt;Say you're working with numbers in a database field. Those numbers were keyed in by people using a different system, and the other system somehow stored non-numeric values in a numeric field. &lt;br /&gt;&lt;br /&gt;Since Ruby does not have strong typing, an easy way to check and see if a field is an integer is to compare its integer value with its actual value. &lt;br /&gt;&lt;br /&gt;if (&lt;b&gt;somefield&lt;/b&gt;.to_i == &lt;b&gt;somefield&lt;/b&gt;)&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;n = 1234567&lt;br /&gt;if (&lt;b&gt;n&lt;/b&gt;.to_i==&lt;b&gt;n&lt;/b&gt;) =&gt; &lt;b&gt;true&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If the value of n is not keyed properly the equality test returns false&lt;br /&gt;n = "12345x67"&lt;br /&gt;if (&lt;b&gt;n&lt;/b&gt;.to_i==&lt;b&gt;"12345x67"&lt;/b&gt;) =&gt; &lt;b&gt;false&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Easy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8533688570733149008-3952315564472526076?l=rubyonbraille.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyonbraille.blogspot.com/feeds/3952315564472526076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8533688570733149008&amp;postID=3952315564472526076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/3952315564472526076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/3952315564472526076'/><link rel='alternate' type='text/html' href='http://rubyonbraille.blogspot.com/2008/11/dirty-numbers.html' title='Dirty numbers'/><author><name>40x14</name><uri>http://www.blogger.com/profile/00293707839342409278</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos9.flickr.com/12579037_3544450bc3_t.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8533688570733149008.post-2311196631361967313</id><published>2008-03-24T08:25:00.000-07:00</published><updated>2008-03-24T08:28:45.018-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='site offline'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='maintenance'/><category scheme='http://www.blogger.com/atom/ns#' term='global user message'/><title type='text'>Web site maintenance - global message</title><content type='html'>About once a week we upload and update all of the products in the database. &lt;br /&gt;&lt;br /&gt;This intensive process takes about 15 minutes, during which time any pages that requires database access may time out.&lt;br /&gt;&lt;br /&gt;There has to be a simple way to establish a "web site maintenance" message on the site while these processes run. Additionally cached pages need to be expired if they contain updated products.&lt;br /&gt;&lt;br /&gt;I'm still working on a way to achieve this result.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8533688570733149008-2311196631361967313?l=rubyonbraille.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyonbraille.blogspot.com/feeds/2311196631361967313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8533688570733149008&amp;postID=2311196631361967313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/2311196631361967313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/2311196631361967313'/><link rel='alternate' type='text/html' href='http://rubyonbraille.blogspot.com/2008/03/web-site-maintenance-global-message.html' title='Web site maintenance - global message'/><author><name>40x14</name><uri>http://www.blogger.com/profile/00293707839342409278</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos9.flickr.com/12579037_3544450bc3_t.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8533688570733149008.post-6353606149076916051</id><published>2008-02-25T18:41:00.000-08:00</published><updated>2008-02-25T20:26:31.612-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Logon'/><category scheme='http://www.blogger.com/atom/ns#' term='Login'/><category scheme='http://www.blogger.com/atom/ns#' term='Ecommerce'/><title type='text'>SSL Plugin for Rails</title><content type='html'>I'm using the &lt;a href="http://www.blogger.com/wiki.rubyonrails.org/rails/pages/Acts_as_authenticated"&gt;acts_as_authenticated&lt;/a&gt; plugin for ruby on rails.&lt;br /&gt;&lt;br /&gt;Unforunately it falls short in a few key areas for an ecommerce site. An obvious one is that it does not ensure all login pages are SSL encrypted.&lt;br /&gt;&lt;br /&gt;So I wrote the simple method (explained below) and put it in the application.rb file.&lt;br /&gt;&lt;br /&gt;in application.rb...&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;  def redirect_to_ssl&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    redirect_to :protocol =&amp;gt; "https://" unless (request.ssl? or local_request? or request.server_port.to_i!=80)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;   &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;  end&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;br /&gt;The reason for the last check of the server port != 80 is twofold. First, if the server port &lt;span style="font-style: italic;"&gt;is&lt;/span&gt; equal to 80 then I am probably running in production mode. However if the server port is &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; 80 then I am either running a development box, or I'm already on port 443. Ports 80 and 443 are the standard port used in HTTP and SSL.&lt;br /&gt;&lt;br /&gt;Any time I want to ensure that a page is SSL encrypted, I put the following bit of code in my controller as a before_filter.&lt;br /&gt;&lt;br /&gt;in my SSL protected controller...&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;br /&gt;class MySslController &amp;lt; ApplicationController&lt;br /&gt;&lt;br /&gt;before_filter :redirect_to_ssl, :except =&amp;gt; actions_that_do_not_require_ssl&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Voila! (or "Wahla!" as we americans like to say) it works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8533688570733149008-6353606149076916051?l=rubyonbraille.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyonbraille.blogspot.com/feeds/6353606149076916051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8533688570733149008&amp;postID=6353606149076916051' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/6353606149076916051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/6353606149076916051'/><link rel='alternate' type='text/html' href='http://rubyonbraille.blogspot.com/2008/02/ssl-plugin-for-rails.html' title='SSL Plugin for Rails'/><author><name>40x14</name><uri>http://www.blogger.com/profile/00293707839342409278</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos9.flickr.com/12579037_3544450bc3_t.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8533688570733149008.post-8319291685560612320</id><published>2008-02-22T19:53:00.000-08:00</published><updated>2008-02-22T20:13:56.195-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='state_select'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='postal codes'/><category scheme='http://www.blogger.com/atom/ns#' term='dropdown'/><category scheme='http://www.blogger.com/atom/ns#' term='shortcut'/><title type='text'>State abbreviations in a database</title><content type='html'>I use an excellent &lt;a href="http://webonrails.com/2006/09/12/plugin-state_select-generate-drop-down-selection-box-for-states/"&gt;state_select&lt;/a&gt; Ruby plugin to generate nice looking dropdown lists for web pages.&lt;br /&gt;&lt;br /&gt;Unfortunately this plugin uses full state names instead of abbeviations, both in the view and in the values that are submitted to the database.&lt;br /&gt;&lt;br /&gt;I want &lt;blockquote&gt;&amp;lt;option value="NY"&amp;gt;New York&lt;/blockquote&gt;&lt;br /&gt;instead of &lt;blockquote&gt;&amp;lt;option value="New York"&amp;gt;New York&lt;/blockquote&gt;&lt;br /&gt;The change I want is easy to achieve by modifying /lib/state_select.rb&lt;br /&gt;&lt;br /&gt;Comment out the values for US_STATES and add this bit of code instead. Note Puerto Rico and outlying territories have been omitted, since these are considered international locations in my program.&lt;br /&gt;&lt;blockquote&gt;US_STATES=[&lt;br /&gt;[ "Alabama", "AL" ],&lt;br /&gt;[ "Alaska", "AK" ],&lt;br /&gt;[ "Arizona", "AZ" ],&lt;br /&gt;[ "Arkansas", "AR" ],&lt;br /&gt;[ "California", "CA" ],&lt;br /&gt;[ "Colorado", "CO" ],&lt;br /&gt;[ "Connecticut", "CT" ],&lt;br /&gt;[ "Delaware", "DE" ],&lt;br /&gt;[ "District Of Columbia", "DC" ],&lt;br /&gt;[ "Florida", "FL" ],&lt;br /&gt;[ "Georgia", "GA" ],&lt;br /&gt;[ "Hawaii", "HI" ],&lt;br /&gt;[ "Idaho", "ID" ],&lt;br /&gt;[ "Illinois", "IL" ],&lt;br /&gt;[ "Indiana", "IN" ],&lt;br /&gt;[ "Iowa", "IA" ],&lt;br /&gt;[ "Kansas", "KS" ],&lt;br /&gt;[ "Kentucky", "KY" ],&lt;br /&gt;[ "Louisiana", "LA" ],&lt;br /&gt;[ "Maine", "ME" ],&lt;br /&gt;[ "Maryland", "MD" ],&lt;br /&gt;[ "Massachusetts", "MA" ],&lt;br /&gt;[ "Michigan", "MI" ],&lt;br /&gt;[ "Minnesota", "MN" ],&lt;br /&gt;[ "Mississippi", "MS" ],&lt;br /&gt;[ "Missouri", "MO" ],&lt;br /&gt;[ "Montana", "MT" ],&lt;br /&gt;[ "Nebraska", "NE" ],&lt;br /&gt;[ "Nevada", "NV" ],&lt;br /&gt;[ "New Hampshire", "NH" ],&lt;br /&gt;[ "New Jersey", "NJ" ],&lt;br /&gt;[ "New Mexico", "NM" ],&lt;br /&gt;[ "New York", "NY" ],&lt;br /&gt;[ "North Carolina", "NC" ],&lt;br /&gt;[ "North Dakota", "ND" ],&lt;br /&gt;[ "Ohio", "OH" ],&lt;br /&gt;[ "Oklahoma", "OK" ],&lt;br /&gt;[ "Oregon", "OR" ],&lt;br /&gt;[ "Pennsylvania", "PA" ],&lt;br /&gt;[ "Rhode Island", "RI" ],&lt;br /&gt;[ "South Carolina", "SC" ],&lt;br /&gt;[ "South Dakota", "SD" ],&lt;br /&gt;[ "Tennessee", "TN" ],&lt;br /&gt;[ "Texas", "TX" ],&lt;br /&gt;[ "Utah", "UT" ],&lt;br /&gt;[ "Vermont", "VT" ],&lt;br /&gt;[ "Virginia", "VA" ],&lt;br /&gt;[ "Washington", "WA" ],&lt;br /&gt;[ "West Virginia", "WV" ],&lt;br /&gt;[ "Wisconsin", "WI" ],&lt;br /&gt;[ "Wyoming", "WY" ] ] unless const_defined?("US_STATES")&lt;br /&gt;&lt;/blockquote&gt;But what happens to the data that has already started been saved with long unabbreviated state names? I need to update that too. I could have written a migration file to do this - but instead just used quick and dirty sql update statements.&lt;br /&gt;&lt;br /&gt;This is the code that I used. It's very straightforward, but I'm posting it here anyway with the hope that someone can copy/paste it and save themself the hassle of writing 50+ updates from scratch.&lt;br /&gt;&lt;blockquote&gt;update addresses set state = 'AL' where [state]= 'Alabama'&lt;br /&gt;update addresses set state = 'AK' where [state]= 'Alaska'&lt;br /&gt;update addresses set state = 'AZ' where [state]= 'Arizona'&lt;br /&gt;update addresses set state = 'AR' where [state]= 'Arkansas'&lt;br /&gt;update addresses set state = 'CA' where [state]= 'California'&lt;br /&gt;update addresses set state = 'CO' where [state]= 'Colorado'&lt;br /&gt;update addresses set state = 'CT' where [state]= 'Connecticut'&lt;br /&gt;update addresses set state = 'DE' where [state]= 'Delaware'&lt;br /&gt;update addresses set state = 'DC' where [state]= 'District Of Columbia'&lt;br /&gt;update addresses set state = 'FL' where [state]= 'Florida'&lt;br /&gt;update addresses set state = 'GA' where [state]= 'Georgia'&lt;br /&gt;update addresses set state = 'HI' where [state]= 'Hawaii'&lt;br /&gt;update addresses set state = 'ID' where [state]= 'Idaho'&lt;br /&gt;update addresses set state = 'IL' where [state]= 'Illinois'&lt;br /&gt;update addresses set state = 'IN' where [state]= 'Indiana'&lt;br /&gt;update addresses set state = 'IA' where [state]= 'Iowa'&lt;br /&gt;update addresses set state = 'KS' where [state]= 'Kansas'&lt;br /&gt;update addresses set state = 'KY' where [state]= 'Kentucky'&lt;br /&gt;update addresses set state = 'LA' where [state]= 'Louisiana'&lt;br /&gt;update addresses set state = 'ME' where [state]= 'Maine'&lt;br /&gt;update addresses set state = 'MD' where [state]= 'Maryland'&lt;br /&gt;update addresses set state = 'MA' where [state]= 'Massachusetts'&lt;br /&gt;update addresses set state = 'MI' where [state]= 'Michigan'&lt;br /&gt;update addresses set state = 'MN' where [state]= 'Minnesota'&lt;br /&gt;update addresses set state = 'MS' where [state]= 'Mississippi'&lt;br /&gt;update addresses set state = 'MO' where [state]= 'Missouri'&lt;br /&gt;update addresses set state = 'MT' where [state]= 'Montana'&lt;br /&gt;update addresses set state = 'NE' where [state]= 'Nebraska'&lt;br /&gt;update addresses set state = 'NV' where [state]= 'Nevada'&lt;br /&gt;update addresses set state = 'NH' where [state]= 'New Hampshire'&lt;br /&gt;update addresses set state = 'NJ' where [state]= 'New Jersey'&lt;br /&gt;update addresses set state = 'NM' where [state]= 'New Mexico'&lt;br /&gt;update addresses set state = 'NY' where [state]= 'New York'&lt;br /&gt;update addresses set state = 'NC' where [state]= 'North Carolina'&lt;br /&gt;update addresses set state = 'ND' where [state]= 'North Dakota'&lt;br /&gt;update addresses set state = 'OH' where [state]= 'Ohio'&lt;br /&gt;update addresses set state = 'OK' where [state]= 'Oklahoma'&lt;br /&gt;update addresses set state = 'OR' where [state]= 'Oregon'&lt;br /&gt;update addresses set state = 'PA' where [state]= 'Pennsylvania'&lt;br /&gt;update addresses set state = 'RA' where [state]= 'Rhode Island'&lt;br /&gt;update addresses set state = 'SC' where [state]= 'South Carolina'&lt;br /&gt;update addresses set state = 'SD' where [state]= 'South Dakota'&lt;br /&gt;update addresses set state = 'TN' where [state]= 'Tennessee'&lt;br /&gt;update addresses set state = 'TX' where [state]= 'Texas'&lt;br /&gt;update addresses set state = 'UT' where [state]= 'Utah'&lt;br /&gt;update addresses set state = 'VT' where [state]= 'Vermont'&lt;br /&gt;update addresses set state = 'VA' where [state]= 'Virginia'&lt;br /&gt;update addresses set state = 'WA' where [state]= 'Washington'&lt;br /&gt;update addresses set state = 'WV' where [state]= 'West Virginia'&lt;br /&gt;update addresses set state = 'WI' where [state]= 'Wisconsin'&lt;br /&gt;update addresses set state = 'WY' where [state]= 'Wyoming'&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8533688570733149008-8319291685560612320?l=rubyonbraille.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyonbraille.blogspot.com/feeds/8319291685560612320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8533688570733149008&amp;postID=8319291685560612320' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/8319291685560612320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/8319291685560612320'/><link rel='alternate' type='text/html' href='http://rubyonbraille.blogspot.com/2008/02/state-abbreviations-in-database.html' title='State abbreviations in a database'/><author><name>40x14</name><uri>http://www.blogger.com/profile/00293707839342409278</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos9.flickr.com/12579037_3544450bc3_t.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8533688570733149008.post-1662583964157452869</id><published>2008-02-22T19:21:00.000-08:00</published><updated>2008-02-22T20:11:47.470-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Active Record'/><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Blog'/><title type='text'>Visually impaired software development</title><content type='html'>This is my work blog.&lt;br /&gt;&lt;br /&gt;I will present ideas (very) informally, as well as shortcuts and tips that I learn and use for application development.&lt;br /&gt;&lt;br /&gt;Since&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt; working at &lt;a href="http://www.lighthouse.org/"&gt;Lighthouse International&lt;/a&gt; during 2006 and 2007 I have become enamored with Ruby as a programming language. Mainly I love the fact that it's open source, though I'm still using Microsoft SQL Server for the databased operations and have been happy with this database server for a long time.&lt;br /&gt;&lt;br /&gt;The idea for Ruby on Braille came to me when as a team, we three developers, (&lt;a href="http://michaelhill.info/"&gt;Mike Hill&lt;/a&gt;, Rathnavel Kandaswami, and &lt;a href="http://alphabetware.com/"&gt;myself&lt;/a&gt;) were toying with the idea of building &lt;a href="http://www.lighthouse.org/aboutus/press/press-releases/cnib/"&gt;something new&lt;/a&gt;, a program that had never been built before. As is often the case with open source software there are a lot of free resources, but it can be hard to separate signal from noise and often as developers we must simply "roll our own" code, modify existing programs, and evaluate the effectiveness and reliability of free solutions.&lt;br /&gt;&lt;br /&gt;So while I don't plan on offering any free solutions I will tell you about my experience as a  software developer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8533688570733149008-1662583964157452869?l=rubyonbraille.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyonbraille.blogspot.com/feeds/1662583964157452869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8533688570733149008&amp;postID=1662583964157452869' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/1662583964157452869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8533688570733149008/posts/default/1662583964157452869'/><link rel='alternate' type='text/html' href='http://rubyonbraille.blogspot.com/2008/02/visually-impaired-and-leading-blind.html' title='Visually impaired software development'/><author><name>40x14</name><uri>http://www.blogger.com/profile/00293707839342409278</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://photos9.flickr.com/12579037_3544450bc3_t.jpg'/></author><thr:total>0</thr:total></entry></feed>
