<?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-3958627136570980537</id><updated>2011-07-30T16:44:57.697-07:00</updated><category term='bottleneck'/><category term='discussion'/><category term='astronomy'/><category term='postgres'/><category term='cli'/><category term='news'/><category term='web'/><category term='prototypical'/><category term='bugs'/><category term='modern'/><category term='development'/><category term='solving'/><category term='how to'/><category term='column'/><category term='debate'/><category term='train'/><category term='corporate'/><category term='iphone'/><category term='gem'/><category term='rails'/><category term='railroad'/><category term='sales'/><category term='video'/><category term='review'/><category term='rant'/><category term='generator'/><category term='poro'/><category term='security'/><category term='rdoc'/><category term='philosophy'/><category term='editor'/><category term='report'/><category term='1.9.1'/><category term='software'/><category term='persistence'/><category term='1.8.5'/><category term='marketing'/><category term='design'/><category term='rail'/><category term='pluto'/><category term='biography'/><category term='error'/><category term='widget'/><category term='subversion'/><category term='svn'/><category term='ruby'/><category term='space'/><category term='locomotive'/><category term='planet'/><category term='mongo'/><category term='spec'/><category term='apple'/><category term='passphrase'/><category term='legacy'/><category term='blender'/><category term='bnsf'/><category term='HO'/><category term='crime'/><category term='leopard'/><category term='planning'/><category term='kiss'/><category term='physics'/><category term='code'/><category term='observatory'/><category term='repository'/><category term='identifier'/><category term='science'/><category term='anecdote'/><category term='apache'/><category term='linux'/><category term='scale'/><category term='reload'/><category term='programming'/><category term='10.5'/><category term='name'/><category term='refresh'/><category term='simple'/><category term='dashboard'/><category term='ego'/><category term='tip'/><category term='apache2'/><category term='time'/><category term='essay'/><category term='ruby on rails'/><category term='bio'/><category term='fan'/><category term='layering'/><category term='sql'/><category term='unix'/><category term='hobby'/><category term='languages'/><category term='microsoft'/><category term='nomemoryerror'/><category term='server'/><category term='exception'/><category term='id'/><category term='article'/><category term='accessor'/><category term='model'/><category term='fear'/><category term='password'/><title type='text'>blog.PaplooTheLearned.net</title><subtitle type='html'>My latest thoughts, experiences, and ramblings with ruby, rails, software, science, technology, healthcare, and life.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.paploo.net/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>28</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-3997628617912857511</id><published>2010-09-18T17:55:00.000-07:00</published><updated>2010-09-18T18:08:20.915-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='poro'/><category scheme='http://www.blogger.com/atom/ns#' term='persistence'/><category scheme='http://www.blogger.com/atom/ns#' term='mongo'/><category scheme='http://www.blogger.com/atom/ns#' term='gem'/><title type='text'>Poro 0.1.0 Released</title><content type='html'>&lt;p&gt;Today I released the Ruby Gem Poro v0.1.0.  It is a first working version of an extensible persistence engine.  Currently it only has support for MongoDB, but I plan on also supporting SQL and MemCache before going to version 1.0.&lt;/p&gt;

&lt;p&gt;You can get it by either calling &lt;code&gt;gem install poro&lt;/code&gt; or by downloading or forking the source on &lt;a href="http://github.com/paploo/poro"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Poro takes a slightly different philosophy from existing gems:  Recently I was struck with a thought, in the Ruby world the majority of persistence engines take philosophy of having a base persistence object, and then subclassing that object for everything that needs persistence.  This, it seems to me, puts the thought of persistence before the thought of what the object does.  In other words, it seems like the chicken before the egg.&lt;/p&gt;

&lt;p&gt;In my mind, one should first be worried about what an object does and implementing that.  After that, they should be able to transparently add persistence to the object, without actively affecting it.&lt;/p&gt;

&lt;p&gt;Poro (which stands for Plain Ol' Ruby Object) tries to take a hands-off approach.  It does this by generating and configuring persistence management objects--called contexts--that manage the persistence for a given class.  Thus, each class that one wishes to persist has a context sitting off to the side, that can be used (in a functional language like way) to persist an object.&lt;/p&gt;

&lt;p&gt;Of course, I realize the convenience of models, so there is a basic model mixin that can be used to your object to add methods like find and save.  (In the future, I plan on breaking apart this mixin into several modules that can be included all at once in the same way--as they are now--or in pieces, so that you can add only the pieces you want to use.&lt;/p&gt;

&lt;p&gt;At this point, the major thing missing from Poro is testing and tuning.  It will probably contain bugs and be slow, but I have plans to use the MongoDB context for a project soon, so it'll should be brought up-to-snuff relatively quickly.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-3997628617912857511?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://github.com/paploo/poro' title='Poro 0.1.0 Released'/><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/3997628617912857511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=3997628617912857511' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/3997628617912857511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/3997628617912857511'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2010/09/poro-010-released.html' title='Poro 0.1.0 Released'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-1278012108412254170</id><published>2010-01-07T12:14:00.001-08:00</published><updated>2010-01-07T12:35:55.484-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='layering'/><category scheme='http://www.blogger.com/atom/ns#' term='identifier'/><category scheme='http://www.blogger.com/atom/ns#' term='column'/><category scheme='http://www.blogger.com/atom/ns#' term='id'/><category scheme='http://www.blogger.com/atom/ns#' term='name'/><title type='text'>Rant: Names Are NOT Identifiers</title><content type='html'>&lt;b&gt;Names Everywhere&lt;/b&gt;

&lt;p&gt;I see this happen often:  Someone creates a list of items with a "name" column.  The backend team uses the name to fetch and compare these items.  The UI team uses the name as a human readable description.  Hilarity ensues.&lt;/p&gt;

&lt;p&gt;Let me back-up and give an example:  Let's say we have a list of states that an order can be in, things like "New", "Being Fullfilled", "Shipped", etc.  The backend team, naturally, writes code like "Transition all the orders that are in the state 'New' and over 2 days into the state 'Overdue'".  The front-end team creates a list of Orders that clients can view online and places the state name on the screen.&lt;/p&gt;

&lt;p&gt;So what happens when it is decided that "New" needs to read "Pending"?  If the UI team changes the name in the table to "Pending", all the code written around lookup and comparison to "New" breaks!&lt;/p&gt;

&lt;b&gt;Names are Two Concepts in One: Identifiers and Labels&lt;/b&gt;

&lt;p&gt;What happened here is that the developers confused the concept of an &lt;i&gt;identifier&lt;/i&gt; with a &lt;i&gt;label&lt;/i&gt;.  The former should &lt;i&gt;never&lt;/i&gt; be shown in a UI, but should &lt;i&gt;always&lt;/i&gt; be used by developers for look-up, comparison, and whatever else they need.  The latter should &lt;i&gt;only&lt;/i&gt; ever be used for user display, and &lt;i&gt;never&lt;/i&gt; for anything else.&lt;/p&gt;

&lt;p&gt;In other words, mixing these into a single column is a layering violation, because you are mixing business logic and user interface display layers together!  Making sure you don't breech these layers ensures that you can change the label all willy-nilly at anytime and not break anything.&lt;/p&gt;

&lt;b&gt;What About My "id" Column?&lt;/b&gt;

&lt;p&gt;As a last note, I often get asked (which pertains mostly to users of ORMs that rely on a numeric id column as a convention) is: why not use the numeric id as an identifier?  In a small project this is probably fine.  But in large or long running projects, it can get more complex:  Sometimes the table's contents aren't predicable enough.  FOr example, sometimes you have multiple clients running the same application, but with different (developer defined) entries in their own databases.  The numeric IDs just aren't reliable because they are created via a sequence counter (auto-increment, serial, whatever).  You are just asking for trouble if your project becomes anything more than a pet one.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-1278012108412254170?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/1278012108412254170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=1278012108412254170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/1278012108412254170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/1278012108412254170'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2010/01/rant-names-are-not-identifiers.html' title='Rant: Names Are NOT Identifiers'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-8056230174959019456</id><published>2009-05-15T13:20:00.000-07:00</published><updated>2010-01-16T10:56:42.097-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='postgres'/><category scheme='http://www.blogger.com/atom/ns#' term='1.9.1'/><title type='text'>Tip: Compiling the Postgres Gem for Ruby 1.9.1</title><content type='html'>&lt;p&gt;[EDIT (2010-JAN-16): The original postgres gem has been replaced by &lt;a href="http://rubyforge.org/projects/ruby-pg"&gt;ruby-pg&lt;/a&gt;.  If you are having the problem below, try installing the pg gem via &lt;code&gt;sudo gem pg install&lt;/code&gt;.]&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Crash!&lt;/b&gt;&lt;p&gt;

&lt;p&gt;I compiled a fresh copy of Ruby 1.9.1 onto my MacBook Pro and proceeded to install Ramaze, Sequel, Thin.  Things went well and I was happy... that is, until I tried to install the postgres gem.  I'm talking the C-extension one, which runs so much faster than the native one that it isn't even funny.&lt;/p&gt;

&lt;pre class="code-block"&gt;
$ sudo gem install postgres
&lt;/pre class="code-block"&gt;

&lt;p&gt;That's when it happened:  bam!  exception!&lt;/p&gt;

&lt;pre class="code-block"&gt;
/usr/local/bin/ruby extconf.rb install postgres
extconf.rb:4:in `&amp;lt;main&amp;gt;': uninitialized constant PLATFORM (NameError)
&lt;/pre class="code-block"&gt;

&lt;p&gt;No good.  How am I supposed to develop enterprise Ruby software when I cannot connect to the database?!&lt;/p&gt;

&lt;p&gt;&lt;b&gt;What Happened&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;After poking around on the internet, I discovered two things about Ruby 1.9.1:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;code&gt;PLATFORM&lt;/code&gt; environment variable is now &lt;code&gt;RUBY_PLATFORM&lt;/code&gt;, and&lt;/li&gt;
&lt;li&gt;The C macros for working with a Ruby Array changed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;b&gt;The Solution&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;To solve this problem, one could learn what to do and hand-change all the code.  This is a waste of time.  I set-up a couple &lt;tt&gt;sed&lt;/tt&gt; filters instead.  Thus, to get your postgres adapter working, just do the following:&lt;/p&gt;

&lt;pre class="code-block"&gt;
$ cd /usr/local/lib/ruby/gems/1.9.1/gems/postgres-0.7.9.2008.01.28/ext
$ sudo sed "s/PLATFORM/RUBY_PLATFORM/" extconf.rb &amp;gt; ./extconf.rb
$ sudo ruby extconf.rb
$ sudo sed "s/RARRAY(\([_a-zA-Z0-9]*\))-&amp;gt;ptr/RARRAY_PTR(\1)/; s/RARRAY(\([_a-zA-Z0-9]*\))-&amp;gt;len/RARRAY_LEN(\1)/; s/row-&amp;gt;len/RARRAY_LEN(row)/; s/row-&amp;gt;ptr/RARRAY_PTR(row)/" postgres.c &amp;gt; ./postgres.c
$ sudo make
$ sudo make install
&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;Disclaimer&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;While I have been successfully using this patch, I have not tested it in a production environment.  Therefore, you should put this patch through its paces before using it on anything critical.&lt;/p&gt;

&lt;p&gt;Lastly, but definitely most importantly, I am NOT liable for &lt;i&gt;anything&lt;/i&gt; bad that may happen as a result of using this patch.  It is up to you to thoroughly test it for any problems, which may include (but are not limited to) loss of data on your system, loss of data on your database, corruption of your Ruby installation, self destruction of your hard drive, spontaneous combustion of your printer, Swine flu infection, SARS transmission, broken lawn mowers, and rancid ice cream.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-8056230174959019456?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/8056230174959019456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=8056230174959019456' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/8056230174959019456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/8056230174959019456'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2009/05/tip-compiling-postgres-gem-for-ruby-191.html' title='Tip: Compiling the Postgres Gem for Ruby 1.9.1'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-8095975916411591335</id><published>2009-05-15T12:42:00.000-07:00</published><updated>2009-05-15T13:19:59.899-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rdoc'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='1.9.1'/><title type='text'>Tip: Ruby 1.9.1 RDocs in HTML</title><content type='html'>&lt;p&gt;&lt;b&gt;That's A Big Process!&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;I like my HTML RDocs.  They are easy to browse and search.  Unfortunately, unlike ruby 1.8.x, which made compiling the HTML RDocs trivial, ruby 1.9.1 seems to only make ri documentation trivial... and I soon found out why.&lt;/p&gt;

&lt;p&gt;It turns out that on my old MacBook Pro (maxed out with only 2 GB of RAM), I didn't have enough RAM to build the process.  Somewhere around 3/4 of the way done, the thing would jump into swap and crawl to a halt.  I aborted and decided I'd have to live with online and ri documentation.&lt;/p&gt;

&lt;p&gt;Recently, however, I upgraded to a new MacBook Pro with 4 GB of RAM on board and decided to try compiling the RDocs again.  After 25 minutes and around 2 GB of RAM for the single ruby process, it worked!  (Why it takes so much RAM is beyond me... they need to rethink how RDoc is written).&lt;/p&gt; 

&lt;p&gt;&lt;b&gt;Where Do I Get It?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Considering that I've gone through all the work, there is no reason why I can't share, so I've published the directory to &lt;a href="http://www.github.com/paploo"&gt;my GitHub account&lt;/a&gt; in the &lt;a href="http://github.com/paploo/ruby-rdoc"&gt;ruby-rdoc&lt;/a&gt; project.&lt;/p&gt;

&lt;p&gt;While other &lt;a href="http://www.github.com/"&gt;GitHub&lt;/a&gt; users will probably just clone the repository to keep up on the latest updates, most people will want to download a tarball or zip archive.  To do this, simply go to the &lt;a href="http://github.com/paploo/ruby-rdoc/downloads"&gt;downloads&lt;/a&gt; page and pick the documentation that goes with the ruby version you want.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-8095975916411591335?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://github.com/paploo/ruby-rdoc' title='Tip: Ruby 1.9.1 RDocs in HTML'/><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/8095975916411591335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=8095975916411591335' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/8095975916411591335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/8095975916411591335'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2009/05/ruby-191-rdocs-in-html.html' title='Tip: Ruby 1.9.1 RDocs in HTML'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-2831204722890730548</id><published>2008-07-15T13:10:00.000-07:00</published><updated>2008-07-15T13:12:15.282-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='railroad'/><category scheme='http://www.blogger.com/atom/ns#' term='space'/><category scheme='http://www.blogger.com/atom/ns#' term='time'/><category scheme='http://www.blogger.com/atom/ns#' term='scale'/><category scheme='http://www.blogger.com/atom/ns#' term='essay'/><title type='text'>Essay: Scale Railroading (Part 2: Time)</title><content type='html'>&lt;p&gt;Model railroaders frequently like to talk about scale speeds, and often quote the scale speeds at which their models run.  However, it is very clear there are no physicists amongst them, because they way they scale speed is incorrect by most measures.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;How It's Done&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Let me back-up.  I should first explain how modelers currently do it, and the reason why they do it the way they do.&lt;/p&gt;

&lt;p&gt;To do this, I need to do a little math.  Bare with me, because I don't need a lot of math, but for this article to be meaningful to anyone, a little bit of simple algebra needs to be invoked.&lt;/p&gt;

&lt;p&gt;Speed is calculated by the equation&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;tt&gt;v = d/t&lt;/tt&gt;,&lt;br/&gt;
where &lt;tt&gt;d&lt;/tt&gt; is the distance travelled and &lt;tt&gt;t&lt;/tt&gt; is the time it took.&lt;/p&gt;

&lt;p&gt;Additionally, we will introuce an equation to take a real distance &lt;tt&gt;d&lt;/tt&gt; and change it into a scale distance &lt;tt&gt;d'&lt;/tt&gt; using the scale factor m&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;tt&gt;d' = m*d&lt;/tt&gt;.&lt;br/&gt;&lt;/p&gt;

&lt;p&gt;Now if I want to calculate the scale speed &lt;tt&gt;v'&lt;/tt&gt;--according to the vast majority of modelers--I can do it by cleverly combining these too formulas.  I must first observe that I can change out the scalable quantities in the velocity equation to produce&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;tt&gt;v' = d'/t&lt;/tt&gt;,&lt;br/&gt;
and then combine that with the scaled distance equation to produce the relationship&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;tt&gt;v' = m*v&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;For those of you that love examples, an HO scale railroad would give &lt;tt&gt;m&lt;/tt&gt; a value of 1/87.1, or approximately 0.0115.  Thus a track speed of 60 mph would be equivlent to very nearly 0.7 mph, which is 1 ft/sec.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;What About Time?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Of course, the question we should ask ourselves, is why do we scale both the velocity and the distance in the above equation, but not time?  Is there a fundamental reason why time should not be scaled?&lt;/p&gt;

&lt;p&gt;To most, the reason is intuitive.  It just seems absurd.  And if you were to naively scale time in the same way we scale distance, you'd be right.&lt;/p&gt;

&lt;p&gt;Going back to the ugly math, let us write the velocity equation with all the coordinates scaled, and then scale both distance &lt;i&gt;and&lt;/i&gt; time by the factor &lt;tt&gt;m&lt;/tt&gt;.  Doing so produces the equation for scaled velocity as
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;tt&gt;v' = d'/t'&lt;/tt&gt;,
and after relating it back to the original velocity through the scaling equations, &lt;tt&gt;d'=m*d&lt;/tt&gt; and &lt;tt&gt;t'=m*t&lt;/tt&gt;, we get&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;tt&gt;v' = v&lt;/tt&gt;,&lt;br/&gt;
which is, of course, an absurd result!&lt;/p&gt;

&lt;p&gt;Imagine having to run your model trains at an &lt;i&gt;actual&lt;/i&gt; 60mph around the track!  Your very expensive train, if it could even produce that much speed, would go flying off the track and probably injure someone in the process!&lt;/p&gt;

&lt;p&gt;But this is not the end of the story for time scaling; Indeed, this is just the beginning.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;One Man's Scale Clock&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;One of the justifications one hears for measuring scaled time the way it does, is because our concept of time is so thoroughly rooted in our own wrist watches.  Indeed, when timing out the distance a model train goes, we run off to our wrist watches, happily counting off non-scaled seconds, and never even give it a second thought.&lt;/p&gt;

&lt;p&gt;Human cognitive function is &lt;i&gt;so&lt;/i&gt; rooted in this absolute concept of time, that the theory or relativity (which dictates that time runs at seemingly contradictorily different rates depending on where you are) is still impossible for most scientists to intuitively work with.&lt;/p&gt;

&lt;p&gt;That being said, let's devise an interesting thought experiment that messes with our concept of a uniform clock.&lt;/p&gt;

&lt;p&gt;In the real world, I set up a simple pendulum clock next to the train tracks, and seeing how far the next locomotive to pas the clock gets in one cycle of the pendulum.&lt;/p&gt;

&lt;p&gt;Now, if we made a scale model of the simple pendulum clock, and put it next to our model train tracks, how fast (in the real world) would we need to run that model train to cover the scaled distance the real train traveled in one cycle of the pendulum?&lt;/p&gt;

&lt;p&gt;In other words, given the scaled distance and the scaled concept of time from the ticking pendulum, how does the speed scale?&lt;/p&gt;

&lt;p&gt;To solve this problem, one must (once again) invoke some math.  More specifically, the first step is to find the equation that relates the length of one tick of the pendulum, &lt;tt&gt;T&lt;/tt&gt;, with the length of the pendulum &lt;tt&gt;L&lt;/tt&gt;.  A little looking around the web will show you that the period of a pendulum's swing is given by&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;tt&gt;T = 2*pi*sqrt(L/g)&lt;/tt&gt;,&lt;br/&gt;
where g is the acceleration of gravity, which is a constant at any position on the Earth.  Combining that with the speed equation, we find that the speed of a the train is related to the pendulum's length via&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;tt&gt;v = (d/(2*pi)) * sqrt(g/L)&lt;/tt&gt;.&lt;/p&gt;
If one scales the distance &lt;tt&gt;L&lt;/tt&gt; by the factor &lt;tt&gt;m&lt;/tt&gt;, and uses the techniques presented above, it is very easy to show the surprising result that the scaled velocity &lt;tt&gt;v'&lt;/tt&gt; is related to the real velocity &lt;tt&gt;v&lt;/tt&gt; by the relationship:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;tt&gt;v' = v * sqrt(m)&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Surprise!&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;So what does that mean?&lt;/p&gt;

&lt;p&gt;Think about it for a moment.  Let's say, in the real world, we have a clock with a pendulum that swings a complete cycle once every second.  This allows a train passing at 60mph to travel 88ft during that one second.  Now if we made an HO scale model of this clock, and placed it next to our model train, we'd have to run the train at about 9.43 ft/sec in order to cover a scaled 88 ft distance (12 1/8 inches) in one tick of the pendulum!  That is nearly 10 times faster than the speed of 1 ft/sec we calculated using the classic relationship.&lt;/p&gt;

&lt;p&gt;Of course, the reason for this is that the clock itself runs faster.  Indeed, a pendulum that is shorter by a factor of 100 will run at a rate that is 10 times faster than that of the longer pendulum.&lt;/p&gt;

&lt;p&gt;Thus, in this example at least, it is clear that we have scaled not just distance, but also &lt;i&gt;time&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Superelevation&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Of course, I hear you say, this is just one example.  One example that could have been carefully constructed to give the desired result.  And I'm happy to hear that skepticism, because that is what real science is all about.&lt;/p&gt;

&lt;p&gt;So let's try another situation entirely.  Train curves are superelevated, just like roads, in order to make corners smoother.  Ideally, this is done by finding the elevation angle such that the rails tilt the coach in a way that exactly balances the forces so that they pull straight down through the bottom of the coach, causing you to feel no lateral forces at all (and keeping the tea in your cup from spilling).&lt;/p&gt;

&lt;p&gt;So the question is, if we built a scale model of a real world curve that is ideally superelevated, and we perfectly model that curve in our model train set, what speed would we have to run the model train at so that the forces are balanced for the model passengers with their model tea cups in the model coach?&lt;/p&gt;

&lt;p&gt;Of course, to answer that, we need to know that the equation for relating the superelevation &lt;i&gt;angle&lt;/i&gt; &lt;tt&gt;theta&lt;/tt&gt; of the coach (and hence the rails it is on), to the curve's radius &lt;tt&gt;R&lt;/tt&gt; and the design speed of the train around the curve &lt;tt&gt;v&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;Fortunately, this is a problem that is solved in the first few months of class by every student of physics in the world, and the correct answer is always&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;tt&gt;v^2 = g*R*tan(theta)&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;Applying the same techniques to this equations as the examples before it, we find something surprising: yet again, the relationship between the scale velocity &lt;tt&gt;v'&lt;/tt&gt; and the real world velocity &lt;tt&gt;v&lt;/tt&gt;, is given by&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;tt&gt;v' = v * sqrt(m).&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;In other words, if a real world curve has its superelevation perfectly designed to a 60mph train, then an HO scale model train would have go around that curve at 9.43 ft/sec to keep the tea in the model cup from spilling while going around the corner.  (This, of course, being a good deal faster than the 1 ft/sec scale speed that modelers would calculate!)&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Welcome to the Movies&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;It's hard to argue with physics, and so far I've given two entirely unrelated physical situations in which I have no choice but to produce the same, very surprising result.&lt;/p&gt;

&lt;p&gt;But, being the stubborn kind of people we are, it is hard to accept radically different ideas (indeed cognitive dissonance is a very fascinating field of psychology), and so I fear I must produce one more example before you actually believe what it is I have to say.&lt;/p&gt;

&lt;p&gt;Imagine you are a special effects artist working for Robert Zemeckis and Bob Gale, and are in charge of the crash sequence at the end of Back to the Future III, where the beautiful steam engine drives off the cliff at 88mph, and plummets into the Earth below.&lt;/p&gt;

&lt;p&gt;Obviously, Sierra Railway will &lt;i&gt;not&lt;/i&gt; let you drive their prized engine number 3 off a cliff, so you must resort to models to do it!&lt;/p&gt;

&lt;p&gt;Being the sort of person you are, you want the shot to look realistic.  This requires you to satisfy two criteria:&lt;/p&gt;

&lt;ol&gt;
    &lt;li&gt;You must find the correct speed to drive your model train off the cliff so that it follows the exact same parabolic path through the air as the real thing would, except scaled down according to the scaling equations we now know and love.&lt;/li&gt;
    &lt;li&gt;You must run the film through the camera at a faster rate so that, when slowed back down to the standard 24 fps of a theater projector, it &lt;i&gt;looks&lt;/i&gt; like it took the same amount of time to hit the ground as the real thing, even though it actually hit much sooner due to the much shorter distance.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now the math for this one is much too ugly to show here, but rest assured that over the last year I have calculated it several different times, several different ways, and always come to the same conclusions:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Velociy scales by the same &lt;tt&gt;sqrt(m)&lt;/tt&gt; factor as we found in all of the previous examples.&lt;/li&gt;
    &lt;li&gt;Time scales by the &lt;tt&gt;sqrt(m)&lt;/tt&gt; as well!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;Time Does Scale&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;So we've determined that velocity scaled according to the square root of the scale factor, and that time also scales by the square root of the scale factor.  These are not independent results!  Indeed, following the lead of theories such as special relativity, the fundamental equations are best taken as atransformation of the basic coordinates; that is to say, the basic equations are:&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;tt&gt;d' = m*d&lt;/tt&gt;&lt;br/&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;tt&gt;t' = t*sqrt(m)&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;One can then easily &lt;i&gt;derive&lt;/i&gt; the velocity transormation equations by applying these transforms to the scaled velocity equations &lt;tt&gt;v'=d'/t'&lt;/tt&gt; to get the velocity transform equation &lt;tt&gt;v'=v*sqrt(m)&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;But Why?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;But &lt;i&gt;why&lt;/i&gt; does time scale in this seemingly absurd way?  It is very counter intuitive, even to me, that this would be the case.&lt;/p&gt;

&lt;p&gt;As it turns out, the common thread is gravity.  The pendulum uses gravity to drive it.  Superelevation is determined as balancing gravity with centrifugal aceleration.  And, of course, a projectile motion is the quintessential problem of gravity.&lt;/p&gt;

&lt;p&gt;More specifically, gravity is &lt;i&gt;scale invariant&lt;/i&gt;.  No matter how you scale your model railraod, the gravitational acceleration roots you down to a very specific scale of motion.  In other words, you have no choice but to accelerate a real 9.8 meters per second per second, no matter how you scale!&lt;/p&gt;

&lt;p&gt;This scale invariance, then, gives a way for both the brain, and for measuring devices, to determine the scale factors involved, &lt;i&gt;unless you change the rate of time&lt;/i&gt;!&lt;/p&gt;

&lt;p&gt;So why does the rate of time change the way it does?  The easiest way is to use a bit of differential calculus.  But that is beyond the scope of this article.  Instead, I will note that the constraint on how to scale time is imposed by the quadratic relationship between distance and time under the effects of gravity.  More technically, since &lt;tt&gt;d&lt;/tt&gt; is proportional to &lt;tt&gt;t^2&lt;/tt&gt;, and we know that &lt;tt&gt;d&lt;/tt&gt; scales according to &lt;tt&gt;d'=m*d&lt;/tt&gt;, it necessarily constrains &lt;tt&gt;t&lt;/tt&gt; to scale by &lt;tt&gt;t'=t*sqrt(m)&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;So Now Then&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;While modelers as a whole have determined what &lt;i&gt;feels&lt;/i&gt; to a reasonable scaling methodology (space scales, but time does not).  But to anyone serious about modeling the physics of trains correctly, it is important to realize that it isn't a matter of what &lt;i&gt;feels&lt;/i&gt; right, but instead is determined by what &lt;i&gt;is&lt;/i&gt; right.&lt;/p&gt;

&lt;p&gt;And as much as everyone &lt;i&gt;feels&lt;/i&gt; that time does not scale, the physics does not agree.  Indeed, time must scale in order to replicate the balance of the physical forces involved.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-2831204722890730548?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/2831204722890730548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=2831204722890730548' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/2831204722890730548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/2831204722890730548'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2008/07/essay-scale-railroading-part-2-time.html' title='Essay: Scale Railroading (Part 2: Time)'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-8951640473363506752</id><published>2008-07-14T15:11:00.000-07:00</published><updated>2008-07-14T16:38:54.357-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HO'/><category scheme='http://www.blogger.com/atom/ns#' term='railroad'/><category scheme='http://www.blogger.com/atom/ns#' term='prototypical'/><category scheme='http://www.blogger.com/atom/ns#' term='model'/><category scheme='http://www.blogger.com/atom/ns#' term='scale'/><category scheme='http://www.blogger.com/atom/ns#' term='essay'/><title type='text'>Essay: Scale Railroading (Part 1: Space)</title><content type='html'>&lt;p&gt;If you spend much time around railroad modelers, they tend to talk a lot about scale, and particularly in reference to speed.&lt;/p&gt;

&lt;p&gt;Being a physicist, I've put some thought into scaling things, and don't agree with the reasoning for how to derive scale speed.  But that is for Part 2: Time.&lt;/p&gt;

&lt;p&gt;In this part, I want to cover some basics about pure spacial scaling, and how standard layouts and the real world already agree very poorly.&lt;/p&gt;

&lt;p&gt;Length is very important.  But how big is a model layout in the realworld?  How long would a real North American train be in a scaled layout?&lt;/p&gt;

&lt;h2&gt;Prototypicality&lt;/h2&gt;

&lt;p&gt;&lt;b&gt;Train Length&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Let's answer the latter question first.  In North America, trains are often 100+ cars long, resulting in lengths of around a mile long.  Given the most favored modeling scale, HO, which has a 1:87.1 scale factor, 1 mile is a hair under 61 feet long!&lt;/p&gt;

&lt;p&gt;This means that a scale model railroad of North American trains needs 60 feet &lt;i&gt;just&lt;/i&gt; for a single train!&lt;/p&gt;

&lt;p&gt;To put this in perspective, an 8'x4' layout, which is fairly common to find in spare bedrooms, only gives about 20' on an oval track around the edge, which is only about 1/3rd of a mile!&lt;/p&gt;

&lt;p&gt;So how does this scale relate to the real world?&lt;/p&gt;

&lt;p&gt;&lt;b&gt;The Shopping Mall&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Doing even a small real life layout would take a space about the size of a shopping mall.  Indeed, let's look at a mall of about average mid-sized town length.  Spokane Valley, WA, and Santa Rosa, CA, each serve communities of around 1/4 million, and each have a mall that supports three department stores, and are of a length-wise construction.  In each case, if you ran an HO scale layout from the far end of one department store, through the main corridor of shops, and to the far end of the opposite department store, you'd have about 1400ft in which to model.  Translate this to miles, and you get very nearly only 24 scale miles of layout!  This is smaller than many steam excursion branch railway lines!&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Trees Are How Tall?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;While this puts a lot into perspective, I do find the most interesting case--and the one that will actually surprise a lot of modellers--to not be a geographic distance, but instead the scale modeling of an evergreen tree.&lt;/p&gt;

&lt;p&gt;The Northern California coast is filled with dense redwood forests which were, and still are, logged of their trees.  These trees, the tallest in the world, can grow over 300 feet tall and become over 26 feet in diameter, and in the time in which it was logged, it was common to find trees 200 feet tall and 18 feet in diameter.&lt;/p&gt;

&lt;p&gt;Thus, if you were modeling a logging railroad, you'd need redwood trees that are nearly 3.5 feet tall whose trunks are made from dowels about 2.5" in diameter!  I dare you to build a layout with trees that large and not have all your friends call it absurd.&lt;/p&gt;

&lt;p&gt;So how big are those 6" tall model evergreens you probably have on your layout?  A measly 44 feet, which is about 1/5 the maximum height of a Pacific Coast Ponderosa Pine tree!&lt;/p&gt;

&lt;h2&gt;Curves&lt;/h2&gt;

&lt;p&gt;Lengths are all fine and dandy, but something that modelers tend to pay less attention to is how tight those curves really are.  This is compounded by the fact that track manufacturers tend to sell pre-molded curve pieces that are sizes like 15", 18" and 24".&lt;/p&gt;

&lt;p&gt;But Just How tight are those curves?  To answer that, we must first learn how curves are measured.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Surveying Curves&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Railroads survey their curves by using what is called the "degree" of the curve.  According to an &lt;a href="http://www.trains.com/trn/print.aspx?c=a&amp;id=211"&gt;excellent article&lt;/a&gt; by Robers S. McGonigal in TRAINS Magazine, this is done by measuring the change in heading of a piece of curved track that is 100ft in length.  Expressed mathematically, one can find that the radius of a curve in feet can be found by dividing 5729 by the degree of a curve.&lt;/p&gt;

&lt;p&gt;Furthermore, the article goes on to explain that for a typical mainline, curves are limited to only 1-2 degrees, but that mountainous territory dictates curves of around 5-10 degrees.  Furthermore, the limit for a four-axle diesel with rolling stock is about 20 degrees and the locomotive by itself can handle curves up to about 40 degrees.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Scaling Curves Down&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;So how do these real world curves relate to an HO scale model?&lt;/p&gt;

&lt;p&gt;As modelers tend to like the beauty of mountainous scenery, let's start with those 5-10 degree curves.  In the real world, these correspond to a curve radius of about 570-1150 feet.  Scaled down, these correspond to a relatively giant 79"-158" curve radii!&lt;/p&gt;

&lt;p&gt;But if those curves are so tight, how tight are those model curves that the track manufacturers make?&lt;/p&gt;

&lt;p&gt;As it turns out, the standard 18" curve is already nearly a 44 degree, 130 scale foot curve, which is already in excess of the maximum for a four-axle engine with out any rolling stock!&lt;/p&gt;

&lt;p&gt;So what are the limits?  For a 20 degree curve (287ft radius), you do not want to have smaller than a 39.5" curve radius, and for a 40 degree curve (144ft radius), you do not want to have smaller than a 20" curve radius&lt;/p&gt;

&lt;p&gt;Indeed, as a rule of thumb, an HO scale modeler can divide 800" by the degree of curve you wish to obtain, and you will obtain a pretty good estimate of the necessary curve radius you need for your model.  Equivalently, you can divide 800" by the radius of a curve on your layout and get a fairly good estimate of the curve degree.&lt;/p&gt;

&lt;p&gt;Of course, in real life, if you plan on having speed, you'll want to model those curve radiuses of only 1-2 degrees, which correspond to around 1/2-1 mile.  But most people don't have the room to construct a prototpyical curve in their layout, as a 30'-60' curve radius is bigger than pretty much any layout.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-8951640473363506752?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/8951640473363506752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=8951640473363506752' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/8951640473363506752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/8951640473363506752'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2008/07/essay-scale-railroading-part-1-space.html' title='Essay: Scale Railroading (Part 1: Space)'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-9095847016361613269</id><published>2008-07-12T13:15:00.000-07:00</published><updated>2008-07-12T13:15:01.527-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='spec'/><category scheme='http://www.blogger.com/atom/ns#' term='planning'/><title type='text'>Rant: Proper Planning is Pivotal</title><content type='html'>&lt;p&gt;My brother and I are, on the side, developing some software for our own enjoyment.  However we take our development effort seriously, and have spent a good deal of time writing small technology tests and, most importantly, documenting our specification so that we can agree on the path that we are taking.&lt;/p&gt;

&lt;p&gt;Our spec is mainly composed of two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The feature specification, and&lt;/li&gt;
&lt;li&gt;the architectural plan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both of these are important.  Even if everyone agrees on the features that should be implemented (and we'll assume that there weren't the normal communication issues involved in doing this without a written spec), everyone's programming/architectural styles can be incredibly different.&lt;/p&gt;

&lt;p&gt;Unfortunately, this can lead to a mess later.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;The Draw&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;It is very tempting to ignore this obvious fact, especially when you have small teams of developers working under tight timelines and budgets.  Your team will find itself having one-hour meetings to verbally discuss a feature and how it should work, and then the developers will all run off to their caves and start writing code.&lt;/p&gt;

&lt;p&gt;Initially this actually works out really well.  Everyone is building their separate pieces, plugging along and writing code in the way they write best, which results in quick turnaround.&lt;/p&gt;

&lt;p&gt;It is a manager's best dream.  Everything is getting done ahead of time and under budget!&lt;/p&gt;

&lt;p&gt;&lt;b&gt;The Problem&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;But what happens when the pieces have to start fitting together?&lt;/p&gt;

&lt;p&gt;At some point the pieces that everyone writes have to start fitting together.  If everyone is writing to their own architectural drum in their own style, how easy is this integration going to be?&lt;/p&gt;

&lt;p&gt;Even worse, how many of your developers are good architects?  Did those quick up-front times result from the developer doing whatever was quickest to get their pieces done?  What happens when, as anything in real life happens, the spec changes a little?  How about when it changes a lot?&lt;/p&gt;

&lt;p&gt;And none of this includes what happens when developers have to work on eachother's code.  Where is a document to help them figure out what was done, especially since the code is so incredibly different from their own?&lt;/p&gt;

&lt;p&gt;&lt;b&gt;It Happens&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;These aren't all hypothetical questions.  I've encountered this problem in the real world.  Specs aren't thought out and aren't documented to save time.  It's alluring.  I've even bought into it.  Turn around times are fast and everyone is happy...&lt;/p&gt;
&lt;p&gt;...at first.&lt;/p&gt;

&lt;p&gt;But after a year on a project, this can start to turn around.  You start discovering all the webs of spaghetti code that were weaved to meet deadlines, and the hacks involved when a developer didn't want to spend the time to ask someone else how to integrate with their component, or the bugs that appear because of the bad assumptions that lazy programmers will make.&lt;/p&gt;

&lt;p&gt;I've seen all these problems over and over again, and sometimes these problems can bog down development to the point that whole sections of code must be stripped out and re-written to get around it.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;The Solution&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;In programming, the money is where there are hard problems that need to be solved, and hindsight is 20/20.  So no matter how much planning you do, you'll never be happy with your solution.  There is always &lt;i&gt;something&lt;/i&gt; that you should have done.&lt;/p&gt;

&lt;p&gt;Which is why architecture is so important.  If architected properly, a system is set-up so that when these problems are found, they are easier to solve.  One must strive for expandability and refactorability, but without spending time creating interfaces and functionality that are never used.&lt;/p&gt;

&lt;p&gt;As I always say, a good software architect dares to dream and plans ahead for the future, but knows where to stop to keep development times and costs down.&lt;/p&gt;

&lt;p&gt;For this to succeed, there must be somethind that is in control.  Something that is guiding everyone else towards a common goal.&lt;/p&gt;

&lt;p&gt;That is the architectural spec.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;The Spec&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Of course, someone has to create the spec.  That should be the job of multiple people.  Ideally, there should be an open dialog between the developers that are writing new code, the developers that wrote any code that is being interfaced with, and an architect that can coordinate the input from these developers into the common design goals and styles of the application as a whole.&lt;/p&gt;

&lt;p&gt;And this is &lt;i&gt;easy&lt;/i&gt; to do with the small teams that are usually lured into ignoring spec writing altogether!&lt;/p&gt;


&lt;p&gt;&lt;b&gt;Words of Advice&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;My advice to you: whether you are two programmers or hundreds of programmers, specification documents, and clear architectural leaders, are important to the overall long-term success of your software.&lt;/p&gt;

&lt;p&gt;You may be tempted by The Devil to ignore proper specification in order to achieve the impossible up-front, but like any deal with The Devil, you better be prepared to tackle the ugly consequences that follow.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-9095847016361613269?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/9095847016361613269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=9095847016361613269' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/9095847016361613269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/9095847016361613269'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2008/07/rant-proper-planning-is-pivotal.html' title='Rant: Proper Planning is Pivotal'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-637523688177869235</id><published>2008-04-23T13:23:00.000-07:00</published><updated>2008-04-23T13:23:21.315-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='observatory'/><category scheme='http://www.blogger.com/atom/ns#' term='philosophy'/><category scheme='http://www.blogger.com/atom/ns#' term='fear'/><title type='text'>Observatory: Fear</title><content type='html'>&lt;p&gt;The only thing we truly fear is the unknown.&lt;/p&gt;

&lt;p&gt;We are afraid of snakes and spiders because we don't know if they are going to strike.&lt;/p&gt;

&lt;p&gt;We are afraid of heights because we don't know if we are going to fall.&lt;/p&gt;

&lt;p&gt;We are afraid of strangers because we don't know if they have bad intentions.&lt;/p&gt;

&lt;p&gt;If we take the time to learn about the thing we fear, we will find that we are no longer afraid.&lt;/p&gt;

&lt;p&gt;It is only then that we can make responsible decisions.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-637523688177869235?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/637523688177869235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=637523688177869235' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/637523688177869235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/637523688177869235'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2008/04/observatory-fear.html' title='Observatory: Fear'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-1079445516675566508</id><published>2007-11-29T11:48:00.000-08:00</published><updated>2007-11-29T11:55:07.562-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='nomemoryerror'/><category scheme='http://www.blogger.com/atom/ns#' term='1.8.5'/><category scheme='http://www.blogger.com/atom/ns#' term='exception'/><category scheme='http://www.blogger.com/atom/ns#' term='error'/><category scheme='http://www.blogger.com/atom/ns#' term='leopard'/><category scheme='http://www.blogger.com/atom/ns#' term='10.5'/><title type='text'>Tip: Bug in Ruby 1.8.5 on 10.5 Leopard</title><content type='html'>&lt;p&gt;When I first got Mac OS X 10.5 Leopard, one of the first things I had to do with compile and install ruby 1.8.5 in order to facilitate my job as a Ruby on Rails developer (as we are just getting around to upgrading our thousands of lines of enterprise code to work in rails 1.2.x).&lt;/p&gt;

&lt;p&gt;I downloaded, compiled, and installed, ruby 1.8.5 p114, and for the most part things went smoothly.&lt;/p&gt;

&lt;p&gt;However I would intermittently get the weirdest error:&lt;/p&gt;
&lt;pre&gt;NoMemoryError (negative allocation size (or too big))&lt;/pre&gt;

&lt;p&gt;I still don't know what the root cause of this error is, but as of this morning it seems that downgrading to p52 fixed my problem.&lt;/p&gt;

&lt;p&gt;Hopefully this will pan out in the long run, but so far this error (which I'd see several times an hour during active development) has disappeared.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-1079445516675566508?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/1079445516675566508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=1079445516675566508' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/1079445516675566508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/1079445516675566508'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/11/tip-bug-in-ruby-185-on-105-leopard.html' title='Tip: Bug in Ruby 1.8.5 on 10.5 Leopard'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-176045775832197285</id><published>2007-11-20T10:36:00.000-08:00</published><updated>2007-11-20T10:35:15.411-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='server'/><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='reload'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='refresh'/><title type='text'>Rant: Auto-Refresh News Sites</title><content type='html'>&lt;p&gt;I was reading and article at &lt;a href="http://www.computerweekly.com"&gt;www.computerweekly.com&lt;/a&gt; this morning, who, like many other news sites, seems to think that they need to force a server side refresh on the whole page every five minutes to reload an article so that I can have the latest, greatest, news in some ticker.&lt;/p&gt;

&lt;p&gt;In this case the problem was that their server is flaky, and on refresh, it gave me a "Server Too Busy" error!  So now instead of getting to read the article (which was apparently in necessity of updating because the content of individual articles changes so frequently), I get to stare at an error message generated by a Microsoft Web Server.&lt;/p&gt;

&lt;p&gt;This is just the most infuriating case in a string of annoyances with auto-refreshing news pages.&lt;/p&gt;

&lt;p&gt;One thing I consistently find annoying is how &lt;a href="http://news.google.com"&gt;Google News&lt;/a&gt; has to refresh the news listing on me, while I'm browsing through the article summaries.&lt;/p&gt;

&lt;p&gt;Indeed, it always seems to do it when I am about to click on the link to an article I think would be very interesting to read, and it always seems that that article has rolled off the bottom of the list and I have to dig around if I want to read it!&lt;/p&gt;

&lt;p&gt;Now the question on my mind is &lt;em&gt;"why"&lt;/em&gt;?  Why do we need to have our news updated so frequently (or at all)?  Did so many important things happen in the course of the ten minutes I was reading the site that I need to have it updated?&lt;/p&gt;

&lt;p&gt;And if I'm &lt;em&gt;that&lt;/em&gt; addicted to news, what am I going to do for the hours that I'm actually working?  Or for that matter, how do I possibly think I could make it through a nights sleep!&lt;/p&gt;

&lt;p&gt;Or is it that they think we are so freakin' lazy that we can't hit 'refresh' several hours later to reload the page if we want to be ten extra minutes up to date with the cutting edge news?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-176045775832197285?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/176045775832197285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=176045775832197285' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/176045775832197285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/176045775832197285'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/11/rant-auto-refresh-news-sites.html' title='Rant: Auto-Refresh News Sites'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-6738380042323194081</id><published>2007-10-31T18:18:00.000-07:00</published><updated>2008-04-23T11:16:22.847-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='apache2'/><category scheme='http://www.blogger.com/atom/ns#' term='leopard'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='repository'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='10.5'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>How To: Manage Your Own Subversion Repository In Leopard</title><content type='html'>&lt;p&gt;&lt;a href="http://www.apple.com/macosx/"&gt;Mac OS X 10.5 Leopard&lt;/a&gt; ships with &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; 1.4.4 pre-installed.  It also ships with Apache2 pre-installed.  It does not, however, ship with a pre-installed subversion repository configuration.&lt;/p&gt;

&lt;p&gt;So let's say you want to create your own subversion repository host on your Leopard box your own source code management goodness?&lt;/p&gt;

&lt;p&gt;You &lt;em&gt;could&lt;/em&gt; go to the subversion homepage and download the &lt;a href="http://svnbook.red-bean.com/"&gt;free svn book&lt;/a&gt; and sort through the instructions trying to figure out how they apply to you... Or you could follow these simple directions which I've laid out for you.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Make a Repository&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;The first thing you need to do is to make a repository.  Actually, for my needs, I had to make &lt;em&gt;multiple&lt;/em&gt; repositories, so these instructions will set everything up to make that work.  It really only changes two steps anyway, so it isn't a big deal.&lt;/p&gt;

&lt;p&gt;Now I decided to make my repository collection root directory be in &lt;code&gt;/Users/Shared/&lt;/code&gt;, but you can really make it be anything you want, including the ever popular &lt;code&gt;/usr/local&lt;/code&gt;.  Just be sure to replace &lt;code&gt;/Users/Shared/&lt;/code&gt; with your directory of choice whenever necessary.&lt;/p&gt;

&lt;p&gt;Anyway, I opened Terminal and entered the following commands:&lt;/p&gt;

&lt;pre class="code-block"&gt;
$ sudo mkdir /Users/Shared/svn
$ sudo mkdir /Users/Shared/svn/reposname
$ sudo svnadmin create /Users/Shared/svn/reposname
$ sudo chown -R www:www /Users/Shared/svn/reposname
&lt;/pre&gt;

&lt;p&gt;Note that you can create multiple repositories by following these directions but replacing every instance of &lt;code&gt;reposname&lt;/code&gt; with the name of the repository you want to use.  Thus, if you have multiple repositories, you will have multiple directoris in &lt;code&gt;/Users/Shared/svn&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Make Access&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Most directions do this later, but I'm going to do it now because I think you are smarter than that.&lt;/p&gt;

&lt;p&gt;You might want to create a passowrd file, unless you want full public access to your repository.  For our purposes, simple http basic authentication is fine, but remember that the password is only weakly encoded and the traffic isn't encoded at all, so a snooper could get to the information if you access your computer outside of your own computer.&lt;/p&gt;

&lt;p&gt;So if you do want to use authentication, create the password using the following command, substituting &lt;code&gt;username&lt;/code&gt; for a user name of your choice, and following the directions for password creation:&lt;/p&gt;

&lt;pre class="code-block"&gt;$ sudo htpasswd -cm /etc/apache2/svn-auth-file username&lt;/pre&gt;

&lt;p&gt;To add other users to the file, just ditch the &lt;code&gt;c&lt;/code&gt; switch in the &lt;code&gt;-cm&lt;/code&gt; options to &lt;code&gt;htpasswd&lt;/code&gt;.  The &lt;code&gt;c&lt;/code&gt; stood for create, and since the file has been created you don't want it anymore.&lt;/p&gt;

&lt;p&gt;Note that you can put the svn-auth-file anywhere you want, but this seemed like a good place for it in my mind.  (Just remember where you hid it from yourself if you put it anywhere else.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Apache Configuration&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Navigate to &lt;code&gt;/etc/apache2/other&lt;/code&gt; and use your favorite command line text editor as root to make a file named anything you want (I chose &lt;code&gt;svn.conf&lt;/code&gt;, but you could name it &lt;code&gt;foobar_banana.conf&lt;/code&gt; and it would still work!):&lt;/p&gt;

&lt;pre class="code-block"&gt;
$ cd /etc/apache2/other
$ sudo vim svn.conf
&lt;/pre&gt;

&lt;p&gt;Now that you are editing this file as root, you want to make it contain the following bits, and save:&lt;/p&gt;

&lt;pre class="code-block"&gt;
LoadModule dav_svn_module /usr/libexec/apache2/mod_dav_svn.so

&amp;lt;Location /svn&amp;gt;
    DAV svn
    
    SVNParentPath /Users/Shared/svn
    
    AuthType Basic
    AuthName "Subversion repository"
    AuthUserFile /etc/apache2/svn-auth-file
    Require valid-user
&amp;lt;/Location&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Note that you can leave off all the authentication related stuff if you didn't want authentication on your repository.  Also note that you need to fix the SVNParentPath and the AuthUserFile if you varied from my directions.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Restart Apache&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Now restart Apache.  This can be done in the Sharing panel of the System Preferences application.  Just click to turn off, and then back on, Web Sharing.&lt;/p&gt;

&lt;p&gt;Now, if you didn't make a mistake, you should be ready!  Try going to &lt;code&gt;http://localhost/svn/reposname&lt;/code&gt; (where you need to put the repository name you chose earlier instead of reposname!) and see what happens.&lt;/p&gt;

&lt;p&gt;If you are lucky you'll see revision 0 of your repository.  But most people are human and will have made a typo that results in an error.  For hints on what created the error, trying checking out &lt;code&gt;/var/log/system.log&lt;/code&gt; and &lt;code&gt;/var/log/apache2/error_log&lt;/code&gt; for hints as to what you did wrong.  (And as a bonus, the Console application works great for monitoring thes logs as they are writen to!)&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Where From Here?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;And now you are ready to use your repository.  At this point I figure you already know how to use SVN and don't need my help anymore.  But if you need to know how to use SVN, just refer to &lt;a href="http://svnbook.red-bean.com/"&gt;their book&lt;/a&gt;, which tells you everything you need to know, including how to make your server better!&lt;/p&gt;


&lt;p&gt;&lt;b&gt;EDIT (11/6/07):&lt;/b&gt; Forgot to encode my character entities in the example script source.  I fixed this so that the &lt;code&gt;&amp;lt;Location&amp;gt;&lt;/code&gt; tag actually shows now.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;EDIT (04/23/08):&lt;/b&gt; The &lt;code&gt;chown&lt;/code&gt; line now uses the full path as it should.  Thanks to all those who pointed this confusion inducing mistake out.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-6738380042323194081?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/6738380042323194081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=6738380042323194081' title='53 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/6738380042323194081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/6738380042323194081'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/10/how-to-manage-your-own-subversion.html' title='How To: Manage Your Own Subversion Repository In Leopard'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>53</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-3853590129149368028</id><published>2007-10-28T14:35:00.001-07:00</published><updated>2007-12-02T11:21:34.064-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='leopard'/><category scheme='http://www.blogger.com/atom/ns#' term='legacy'/><category scheme='http://www.blogger.com/atom/ns#' term='10.5'/><title type='text'>Tip: Leopard and Legacy Rails</title><content type='html'>&lt;p&gt;Due to the size and requirements of &lt;a href="http://www.redpinservices.com"&gt;our enterprise healthcare application&lt;/a&gt; that we've written on Rails, we've been sort of stuck at &lt;a href="http://www.rubyonrails.org/"&gt;rails&lt;/a&gt; 1.1.6 and &lt;a href="http://www.ruby-lang.org/en/"&gt;ruby&lt;/a&gt; 1.8.5.  Not that we don't want to upgrade, but in trying to build on functionality so we can make enough sales to sustain ourselves, we've had to forgo tracking down all the problems that keep us from going to rails 1.2.3 and ruby 1.8.6&lt;/p&gt;

&lt;p&gt;As a good Mac geek, I upgraded my computer to &lt;a href="http://www.apple.com/macosx/"&gt;Mac OS X 10.5 Leopard&lt;/a&gt; this weekend, deciding to use the archive &amp; install feature because I had some issues upgrading from 10.3 to 10.4. (my compilation of ruby 1.8.4 would crash randomly).  Of course, Leopard, being all cool and stuff, ships with rails 1.2.3 and ruby 1.8.6.&lt;/p&gt;

&lt;p&gt;Fortunately, compiling ruby 1.8.5 was straight forward (just don't use the &lt;code&gt;--enable-pthread&lt;/code&gt; option or you'll get a crash!), and otherwise the instructions to install &lt;a href="http://rubygems.org/"&gt;gems&lt;/a&gt;, &lt;a href="http://www.postgresql.org/"&gt;postgres&lt;/a&gt;, and &lt;a href="http://rubyforge.org/projects/rmagick/"&gt;RMagick&lt;/a&gt; all worked exactly the same as on Leopard.&lt;/p&gt;

&lt;p&gt;And since Apple manages the ruby/rails installation that ships with Leopard via a Ruby framework and some symbolic links in &lt;code&gt;/usr&lt;/code&gt;, it means that if you compile and install everything into &lt;code&gt;/usr/local&lt;/code&gt;, you can easily revert back to Leopard's ruby/rails whenever you want.&lt;/p&gt;

&lt;p&gt;So the net result:  If you have a legacy app, just compile and install and you are good to go.&lt;/p&gt;

&lt;p&gt;Speaking of, I really should make a set of blog articles that goes over the compile/install procedures for ruby, rails, postgres, and RMagick, on Leopard.  But right now I'm having too much fun playing with Time Machine to care.  :)&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Edit (10/28/07):&lt;/b&gt; As noted in &lt;a href="/2007/11/tip-bug-in-ruby-185-on-105-leopard.html"&gt;this&lt;/a&gt; article, rails 1.8.5 p114 has a bug in it.  However it appears that p52 works just fine.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-3853590129149368028?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/3853590129149368028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=3853590129149368028' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/3853590129149368028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/3853590129149368028'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/10/tip-leopard-and-legacy-rails.html' title='Tip: Leopard and Legacy Rails'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-7410956726265499726</id><published>2007-10-23T20:24:00.000-07:00</published><updated>2007-10-24T17:12:19.503-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='corporate'/><category scheme='http://www.blogger.com/atom/ns#' term='marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='simple'/><category scheme='http://www.blogger.com/atom/ns#' term='kiss'/><category scheme='http://www.blogger.com/atom/ns#' term='sales'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Video: Keep It Simple Stupid!</title><content type='html'>&lt;p&gt;Being that I'm a simple-is-sexy kind of person, I've always been flabbergasted by the busy packaging so many corporate marketing teams put out.&lt;/p&gt;

&lt;p&gt;As a developer, I've learned that the KISS principle (Keep It Simple Stupid) is very important for solving problems.  And as a teacher I've experienced the confusion an onslaught of information can provide.  Indeed, in most situations, whether it being a scientist, and engineer, a teacher, or even a parent, keeping it simple is important.&lt;/p&gt;

&lt;p&gt;Which is why I loved the following video.  It does such a good job of punctuating the differences between Apple's approach of simplicity, against the corporate world's attempts to attract attention while cramming the package with information.&lt;/p&gt;

&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/aeXAcwriid0"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/aeXAcwriid0" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;

&lt;p&gt;Of course the ironic thing is that, with all these super-busy boxes on the shelves, the one that actually stands-out is the simple-sexy one.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-7410956726265499726?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/7410956726265499726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=7410956726265499726' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/7410956726265499726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/7410956726265499726'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/10/video-keep-it-simple-stupid.html' title='Video: Keep It Simple Stupid!'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-4831958554789885815</id><published>2007-10-23T17:25:00.000-07:00</published><updated>2007-10-23T17:25:16.318-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='accessor'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='bottleneck'/><title type='text'>Rant: Rails Lacks Accessor Bottlenecks</title><content type='html'>&lt;p&gt;Being a longtime user of (and zealot for) &lt;a href="http://www.ruby-lang.org"&gt;Ruby&lt;/a&gt;, I have a made a name around the office for my unusually strong understanding of its details.  Thus my &lt;a href="http://www.redpineservices.com"&gt;employers&lt;/a&gt; decided that, out of our team of developers, I should be the one to write the security sub-layer for our &lt;a href="http://www.rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt; based chiropractic applications (as it would require digging into, and understanding the internals of Rails.&lt;/p&gt;

&lt;p&gt;Now before I proceed to beat Rails around a littl bit, I don't want you to get me wrong.  I love using Ruby on Rails and would easily chooose to do this project (and future projects) in it again, but sometimes I find some of their design decisions to be, well, web-developerish, while we need a more robust enterprise-developerish solution.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;A Bottle With Too Many Openings Can't Hold Water&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;One of the design patterns that I have seen over and over again in Object Oriented APIs is the use of bottle-necking.  That is to say, even within your own class, you choose to use a set of accessors to get at instance variables instead of poking at them directly.&lt;/p&gt;

&lt;p&gt;The big benefits to this approach are two fold: It allows you to be more agile with changes (as you only have edit the accessors to change behavior), and it allows third part developers to easily augment or override the default behavior of your code.&lt;/p&gt;

&lt;p&gt;An simple example of this may be a simple vector class that stores a magnitude and an angle.  Now this angle, in all reality, needs to be between 0 and 360 degrees.  So if you have two ways to set this data (from rectangular or polar coordinates), you would have to enforce these limits, probably by using a modulus operator. (Which isn't very &lt;a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself"&gt;DRY&lt;/a&gt;, now is it?)  But what happens when you have to change the behavior?  Maybe the angle needs to be stored in radians, maybe the range needs to be changed to -90 to 90, or maybe it needs to be compass oriented instead of right-handed-axis oriented?  Or maybe you just want to add a way to set the angle without changing the magnitude?&lt;/p&gt;

&lt;p&gt;All of these requires refactoring your code, which requires duplicating and/or altering your code in several locations!  But if you were to make a single accessor for getting, and a single accessor for setting the internal value, then all your other code could go through this accessor (including possible intermediate accessors) to enable fast, agile, and DRY code changes!&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Playing With Steam Engines&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;So, now, let's imagine your employer gives you the spec that your enterprise Rails driven software must have a security system where you can restrict read and write ability to different models, on a per attribute basis.  This is what I faced over a year ago.&lt;/p&gt;

&lt;p&gt;The way I really wanted to solve this was to override the accessors to the basic hash that stores, as key/value pairs, all the data for the table row the objects represents.  That way I could add my own code that would allow or deny access at this fundamental level.&lt;/p&gt;

&lt;p&gt;Unfortunately this basic and simple idea (based on past experience with other APIs) exploded in my face.  You see, the &lt;code&gt;@attributes&lt;/code&gt; hash instance variable that &lt;code&gt;ActiveRecord&lt;/code&gt; uses to store these key/value pairs is directly poked and prodded by &lt;em&gt;many&lt;/em&gt; separate methods throughout the ActiveRecord class.  Thus I had to override &lt;em&gt;all&lt;/em&gt; of these methods, making them call the same friggin security check method, to decide if they could continue onto their default implementation or if I should restrict access.  (I'm only lucky that the runtime generated accessors utilized standard accessors, or else I'd be re-writing the code-generation routines as well.)&lt;/p&gt;

&lt;p&gt;Of course, all this work meant that besides sinking a lot of the company's time and money into implementing a task that &lt;em&gt;should&lt;/em&gt; have been simple, maintaining our release against newer versions of Rails is more costly because of all the hacks I've had to do to meet the requirements.&lt;/p&gt;

&lt;p&gt;Which is why I'm so peeved at their code.  If only they had followed good design practices and bottle-necked &lt;em&gt;all&lt;/em&gt; calls to &lt;code&gt;@attributes&lt;/code&gt; through a read and write accessor method, it would have been easy to implement customized behavior at this point in the program flow, and thus would have made my security requirements a trivial task.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-4831958554789885815?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/4831958554789885815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=4831958554789885815' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/4831958554789885815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/4831958554789885815'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/10/rant-rails-lacks-accessor-bottlenecks.html' title='Rant: Rails Lacks Accessor Bottlenecks'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-3288451005720848516</id><published>2007-10-21T22:08:00.000-07:00</published><updated>2007-10-21T20:10:17.001-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='modern'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='legacy'/><title type='text'>Rant: Marching Forward; Why Should I Upgrade?</title><content type='html'>&lt;p&gt;With the oncoming release of &lt;a href="http://www.apple.com/macosx/"&gt;Mac OS X 10.5 Leopard&lt;/a&gt;, I feel compelled to rant about a post I saw on the discussion board for the open-source software &lt;a href="http://audioslicer.sourceforge.net/index.html"&gt;AudioSlicer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On this forum there was a post that seemed like the author was taking out his frustrations on the AudioSlicer developer that software was not backwards compatible with his old version of Mac OS X.&lt;/p&gt;

&lt;p&gt;Now, if I picture myself as the average user, &lt;a href="http://www.dict.org/bin/Dict?Form=Dict2&amp;Database=*&amp;Query=ignorant"&gt;ignorant&lt;/a&gt; of anything to do with software development, I can see where the guy is coming from.  However, as a developer, I find his attitude to be quite maddening, particularly because AudioSlicer one man's solution to a problem he was trying to solve for himself, and was &lt;em&gt;nice&lt;/em&gt; enough to share it with anyone who wanted to download it!&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Building a Home Of Code&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Building software is kind of like building a home.  Each operating system gives you a set of tools and building blocks to build your "home", and then you figure out how to stack them with building blocks of your own and glue them all together to make an application for people to enjoy.&lt;/p&gt;

&lt;p&gt;In the old days, there were no power tools and, depending on the place and time you lived, you might even have to your own plaster and maybe even cut down your own trees.  Thus, most of your time, energy, and money, goes just into building things for construction, much-less building a complex and interesting house.&lt;/p&gt;

&lt;p&gt;In modern times, however, you are lucky enough to be given power tools, pre-cut lumber, drywall, and fiberglass insulation, allowing you to spend more time on building the house the way you want it, and less time preparing to build.&lt;/p&gt;

&lt;p&gt;Now what happens if someone wants you to build that nice modern home but with old fashioned techniques and materials?  You'd have to spend inordinate amounts of time re-inventing technologies such as drywall and fiberglass fabrication, and spend large amount of time overcoming the lack of power tools and even back-hoes!&lt;/p&gt;

&lt;p&gt;No contractor would dare to take on this task because it is just not economically feasible for anyone to build a modern house using old-time building techniques.&lt;/p&gt;

&lt;p&gt;The same is true for software developers.  We are given many building blocks and tools from our operating system manufacturer that smart people have spent months or even years developing and testing, and then we take advantage of their hard work so that we can focus on building better software applications for end users.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Jaguars, Panthers, and Tigers, Oh My!&lt;/b&gt;&lt;p&gt;

&lt;p&gt;Most users were very unimpressed by OS X 10.4 Tiger's release, and I can agree with them.  From a user's perspective, it was a lackluster release.  It was hard for the average person to justify spending $130 to upgrade from their comfortable and productive little OS X 10.3 Panther machines.&lt;/p&gt;

&lt;p&gt;But what these people didn't realize was the &lt;em&gt;massive&lt;/em&gt; amount of really cool new building blocks Apple gave developers.  These new building blocks (called &lt;a href="http://en.wikipedia.org/wiki/Application_programming_interface"&gt;API&lt;/a&gt;s if you want to learn a new word), got developers very excited as it allowed them to make much better software for a lot less time and cost.&lt;/p&gt;

&lt;p&gt;As a result, several months after Tiger was released, a flood of cool software came out that could only run on OS X 10.4 Tiger.  This, of course, caused all the people who wanted to stick with OS X 10.3 Panther to complain that no one was releasing their cool new offerings for them.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;The Amish Can't Have Cell Phones&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;As much as many people hate it, technology marches forward at a breakneck pace.  What was sate-of-the-art in computing four years ago is slow and a useless novelty now.  It may be cheaper not to upgrade, but to stay in the past is to be left behind.&lt;/p&gt;

&lt;p&gt;If you refuse to buy pre-manufactured building materials and use power tools to build your house, you can't expect the same quality of house for the same costs and built in the same small amount of time.&lt;/p&gt;

&lt;p&gt;So why do you expect anything different from software developers?&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Misunderstood&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Development is a &lt;em&gt;very&lt;/em&gt; long, complicated, and expensive process.  Most software projects--even while taking advantage of all the tools and building blocks they have available to them--still run significantly overtime and over-budget.  So how do you expect developers to find the extra time and money to spend the months (or even years) necessary to re-invent building blocks from scratch, just so that you can live in the past?&lt;/p&gt;

&lt;p&gt;Indeed, in reality, many new pieces of software that require new building blocks were only ever made &lt;em&gt;because&lt;/em&gt; the new building blocks exist.  CoreData and CoreImage allow developers to build database-driven libraries of scanned images, and Cocoa Bindings allow developers to build whole CoreData driven GUIs without touching a hardly any code.  Without these nifty new technologies, cool applications like &lt;a href="http://www.delicious-monster.com/"&gt;Delicious Library&lt;/a&gt; would be such a chore to make that only companies with large development and marketing budgets would be able to build them.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Change Course Into The Wind&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;The world is always changing, and technology is no different.  People are scared of change.  But those who do not cope with change get left behind while those that embrace change become successful.  As much as it can be a large time, energy, and monetary investment to change, it is worth it to yourself and your family to learn and adapt...&lt;/p&gt;

&lt;p&gt;...or don't complain when you get left in the dust.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-3288451005720848516?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/3288451005720848516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=3288451005720848516' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/3288451005720848516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/3288451005720848516'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/10/rant-marching-forward-why-i-should.html' title='Rant: Marching Forward; Why Should I Upgrade?'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-8200740643165762786</id><published>2007-10-18T13:27:00.000-07:00</published><updated>2007-10-18T13:27:29.205-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='crime'/><category scheme='http://www.blogger.com/atom/ns#' term='solving'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><title type='text'>Rant: Fixing Bugs is Like Solving a Crime</title><content type='html'>&lt;p&gt;So I got a bug report the other day, from our own staff member no-less, that simply said: "Can not 'submit fixes' in finalize screen." &lt;/p&gt;

&lt;p&gt;Now let's think about this for a minute.  Fixing bugs is very much like solving a crime.  You are presented with a bunch of clues about what went wrong, and now you have to  follow those clues down different avenues to piece together what went wrong (which is a very time consuming process to do right).  But you have to do this, because you can only fix the bug when you understand why it exists.&lt;/p&gt;

&lt;p&gt;So, now, if you were a police detective and someone called with the brief report "I found a dead body", would you be able to catch the murderer?  You don't even know where the body was found to be able to start collecting crime scene data with your trained eyes.  It would, thus, be an impossible case to solve with just the information provided from your well intentioned, possibly anonymous citizen.&lt;/p&gt;

&lt;p&gt;So, then, how does the submitter of such a brief bug report expect me to solve their bug?&lt;/p&gt;

&lt;p&gt;&lt;b&gt;The Things You Need To Provide&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;For a bug to be successfully fixed, the developer has a few things the he needs to know.&lt;/p&gt;

&lt;p&gt;Although it is very important to give your computer's specifications and the software version that threw the bug, it turns out that it is actually more important for you to supply the following information:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What you were trying to do,&lt;/li&gt;
&lt;li&gt;What you were doing &lt;em&gt;before&lt;/em&gt; the bug occurred,&lt;/li&gt;
&lt;li&gt;What you expected to happen when the bug occurred,&lt;/li&gt;
&lt;li&gt;What you expected to see when the bug occurred, and&lt;/li&gt;
&lt;li&gt;What you saw when the bug occurred,&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Of course, just like a murder investigation, the more information you can take the time to give, the more likely a developer can fix your problem.&lt;/p&gt;

&lt;p&gt;Remember that a developer has to be able to re-create the bug you saw in order to fix it, so if you don't give them enough information to make the same thing happen on their own computer, they will possibly just jump to the next bug in their bug list!&lt;/p&gt;

&lt;p&gt;&lt;b&gt;And Why You Should Give It To Them&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Of course, the main reason why you should give all this information to them is because you want the bug to be fixed!  But you should also realize that giving all of this information also saves both you and the developer time (and money in most instances).&lt;/p&gt;

&lt;p&gt;For one, it usually takes you about the same amount of time to describe a bug up-front or after asked for details later, so being so brief doesn't actually save you any time in the long run.&lt;/p&gt;

&lt;p&gt;By not giving the information up front, however, the developer loses quite a bit of time due to a bunch of small reasons, such as lost time in bug list triage, inability to group and collectively solve related bugs, and loss of time in having to contact users for details.&lt;/p&gt;

&lt;p&gt;And, I'm not going to lie; commercial companies are driven by money.  So if it is going to cost them money to get the details on a minor bug, they are likely to just bump it to the bottom of the list and go on to more important things.  It sucks, it may even seem wrong, but I guarantee you every software company does it (and that you would do it too).&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Last Words&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;If there is one last thing I want to impress upon you is that, despite all my harsh words for people that don't give details, having a bad bug report is still better than no bug report.  We can't fix a problem we don't know about, and appreciate any information we can get.  Just remember that it can be frustrating for everyone if you don't spend the extra two minutes of your life to give us some details.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-8200740643165762786?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/8200740643165762786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=8200740643165762786' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/8200740643165762786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/8200740643165762786'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/10/rant-fixing-bugs-is-like-solving-crime.html' title='Rant: Fixing Bugs is Like Solving a Crime'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-1576835135399910380</id><published>2007-10-17T14:32:00.000-07:00</published><updated>2007-10-17T14:33:31.985-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='discussion'/><category scheme='http://www.blogger.com/atom/ns#' term='debate'/><category scheme='http://www.blogger.com/atom/ns#' term='article'/><category scheme='http://www.blogger.com/atom/ns#' term='essay'/><title type='text'>Article: Egos Stop Innovation; How to Have a Discussion</title><content type='html'>&lt;p&gt;Any academic professional, from a software architect to a physicists, is at their peak innovative performance when they can effectively communicate, discuss, and refine their ideas with others.&lt;/p&gt;

&lt;p&gt;Unfortunately, it seems that a large number of people are more concerned with their own egos than with innovation, as evidenced by their inability to communicate with others.   It seem that these people are always irrationally attacking ideas that are not their own while taking an emotional bias towards ideas that are their own.&lt;/p&gt;

&lt;p&gt;This is a natural thing for people to do.  It is in our blood.  We evolved from the genes of the top-dog alpha-males and their mating successes.&lt;/p&gt;

&lt;p&gt;But today should be different.  The human race is now capable of attaining much greater heights if we work &lt;i&gt;with&lt;/i&gt; others instead of against them.&lt;/p&gt;

&lt;p&gt;Take Quantum Mechanics, for example.  Quantum Mechanics was not the invention of a single mind quietly working away.  No.  It is the hard won innovation that resulted from many great minds working together to solve a common goal.&lt;/p&gt;

&lt;p&gt;So how can we keep from being the jerk down the hall that no one wants to work with, and help to further the innovations of yourself and your company, making your managers happy and helping you to attain popularity, love, and wealth?&lt;/p&gt;

&lt;p&gt;&lt;b&gt;I Like Friends&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Let's try to learn by example.&lt;/p&gt;

&lt;p&gt;I had two friends that, through countless discussions and debates, showed me most of what I know about a successful exchange of ideas.&lt;/p&gt;

&lt;p&gt;One of these friends was infuriating clam and methodical in his approach, but his goal was always to lead to a common understanding of the truths behind the material we discussed.&lt;/p&gt;

&lt;p&gt;The other of these friends was irrational and stubborn, always hanging onto his idea no matter how well it could be proved false, and then would stomp off in a hissy fit whenever he was defeated.&lt;/p&gt;

&lt;p&gt;What I learned from all this is contained in the ten rules below; but before I go there I wanted to follow my own rules and define two terms.  These definitions aren't the dictionary definitions of these terms, but as long as you can understand my definition then you can follow what it is I'm trying to say.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Defining Talking&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;The way I see it, there are essentially two ways to exchange and refine ideas with others: discussion and debate.&lt;/p&gt;

&lt;p&gt;I define "&lt;em&gt;discussion&lt;/em&gt;" to be the friendly and logical open exchange of ideas, where the goal of everyone involved is to reach a new, common understanding of the material, knowing that this will most likely be different than any of the ideas brought to the table by anyone there.&lt;/p&gt;

&lt;p&gt;On the otherhand, I define "&lt;em&gt;debate&lt;/em&gt;" to be what happens when a discussion breaks down into egos and arguing, caused by even just one person to not want to budge from their flawed arguments, leading to an overall breakdown of the process of innovation.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;The Ten Commandments&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;These rules take practice and hard work to follow, but following them is important not just to others, but to yourself as well.&lt;/p&gt;

&lt;p&gt;One last thing before I start, though: I should note that rules 1-3 are mostly concerned with how to hold yourself, rules 4-7 are about communication, rules 8 and 9 are about arriving at a conclusion, and rule 10 is stating an obvious fact that people seem to forget about in the heat of a debate.&lt;/p&gt;

&lt;p&gt;So without further ado, on with the show!&lt;/p&gt;

&lt;p&gt;&lt;b&gt;1.Be civil; always treat other people with respect and dignity.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;People will only take you seriously if you treat them like an intelligent human being.  If you let your frustration take over, you run the risk of insulting another person, causing them to close themselves from your point of view, destroying the whole process.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;2. Place your ego aside; readily admit when you are wrong.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;I doubt the knowledge you bring to a discussion is without flaws, inaccuracies, and other mistakes.  Therefore you need to know and admit the limits of your knowledge.  Admitting when you are wrong is probably the biggest and hardest step for people, but being ready to admit when your idea just isn't right is an important part of innovation.  Put another way: don't let yourself look like an idiot by defending a lame-duck idea to the bitter end.  People just won't ask for your input anymore because no one likes a self-centered, stubborn donkey!&lt;/p&gt;

&lt;p&gt;&lt;b&gt;3. Be open to new and different ideas; put yourself in the shoes of others.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Great thinkers are able to view things from many points of view other than their own.  You do want to be like a great thinker, right?  It is important, then, that you put yourself into the shoes of people presenting alternative (and usually contradictory) ideas and try hard to understand why they support that idea.  This can help you either rebut their idea, accept their idea, or realize that there is no way to agree.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;4. Make sure everyone agrees as to what the question really is.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;As stupid as it seems, I have seen (and been in) many discussions or debates where each person thought a different question was trying to be answered!  This, of course, causes much frustration.  If it seems like the other person isn't understanding, try rephrasing what it is you are trying to find out, and see if they agree that that is the question at hand.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;5. Define terms; be vigilant of disagreements caused by different definitions.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;One of the funny things that often happens is that communication break downs can be the cause of many long discussions where everyone actually agreed the whole time.  For example, I was in a debate with someone once where, after three hours, we found out that we were using slightly different definitions of the word "money".  Once we hammered out a common definition, we suddenly found that we never disagreed on the real question at hand!  This happens more often than one would think!  So be vigilant of disagreements stemming from different definitions of terms and try to nip them in the bud.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;6. Listen patiently and carefully to what others say.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;This is really a two fold problem.  One is that people get in such a hurry to say what is in their mind that they stop listening to what everyone else is saying and just want to blurt out their own thoughts.  But listening turns out to be one of the most important skills in innovation.  So don't be a jerk, listen up!  The other part of this is that people naturally interpret, filter, and infer the words of others.  It is important to pay attention to detail and make sure you understand what they mean and to ask questions when you don't understand.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;7. Say what you mean.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;There seems to be some sort of mangle-o-matic filter between the brain and the mouth.  Be careful to say what you mean, try to make statements that don't leave anything to inference, and be willing to re-explain yourself in different terms if someone is confused as to what you meant.  (Seems simple?  It is harder than you'd think!)&lt;/p&gt;

&lt;b&gt;8. Strive to reach the crux of any disagreement.&lt;/b&gt;

&lt;p&gt;In order to reach resolution on a disagreement, it is important to find the crux of what it is, exactly, that you disagree on.  It is no fun spending three hours hammering over a topic just to find that the crux of the disagreement lay in a misunderstanding of a word definition.  Pealing away the layers to reveal the point of disagreement quickly will save everyone a lot of time, energy, frustration, and headache.&lt;/p&gt;

&lt;b&gt;9. Discussions hinging on personal values are doomed to become debates.&lt;/b&gt;

&lt;p&gt;Some discussions have no agreeable resolution.  This is especially true of many socio-political discussions.  When the crux of a disagreement hinges on a personal value or opinion, there is no way to agree.  Whether it be a disagreement over  something as stupid as the best flavor of ice-cream or the best band ever, or it be over deep issues such as abortion, gay marriage, and the validity of your own religion, there just isn't an answer that everyone can agree on.  This doesn't mean that you can't &lt;i&gt;understand&lt;/i&gt; and &lt;i&gt;respect&lt;/i&gt; what the other person believes, but it means that you'll probably never agree, and so should agree to disagree.&lt;/p&gt;

&lt;b&gt;10. Use logic, facts, and reasoning.&lt;/b&gt;

&lt;p&gt;This should go without saying, but it doesn't seem to be the case.  People cloud their reasoning with emotion.  This is, once again, part of being human.  But if you want to convince someone of the validity of a viewpoint, you must always support that with facts and logical reasoning, while being careful to avoid such traps as logical fallacy, inaccurate facts, and mis-representation of your knowledge limits.  (But if you follow the other 9 rules, none of this should happen to you, right?)&lt;/p&gt;


&lt;p&gt;&lt;b&gt;Every Article Needs A Conclusion&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;So there they are, in all their glory.  Some simple rules that take a lot of hard work to follow; but will quickly make you that innovative, team-playing, cool-guy, that everyone wants to have on their team and at their parties.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-1576835135399910380?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/1576835135399910380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=1576835135399910380' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/1576835135399910380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/1576835135399910380'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/10/article-egos-stop-innovation-how-to.html' title='Article: Egos Stop Innovation; How to Have a Discussion'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-5800759196284845797</id><published>2007-10-15T22:38:00.000-07:00</published><updated>2007-10-31T18:16:34.093-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='passphrase'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='generator'/><title type='text'>Code: Passphrase Generator</title><content type='html'>&lt;p&gt;In a couple &lt;a href="/2007/10/article-security-words.html"&gt;previous article&lt;/a&gt;s I talk about the benefits of randomly generated passphrases.  But how do I generate random passphrases you may ask?&lt;/p&gt;

&lt;p&gt;The answer is that I use the following Ruby script that looks at the words list that is provided on every Mac OS X 10.4 box:&lt;/p&gt;

&lt;div class="code-block"&gt;
&lt;!-- Generator: GNU source-highlight 2.8
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite --&gt;
&lt;pre&gt;&lt;tt&gt;&lt;i&gt;&lt;font color="#9A1900"&gt;#!/usr/bin/ruby&lt;/font&gt;&lt;/i&gt;

words &lt;font color="#990000"&gt;=&lt;/font&gt; &lt;font color="#990000"&gt;[]&lt;/font&gt;
File&lt;font color="#990000"&gt;.&lt;/font&gt;open&lt;font color="#990000"&gt;(&lt;/font&gt;&lt;font color="#FF0000"&gt;'/usr/share/dict/words'&lt;/font&gt;&lt;font color="#990000"&gt;,&lt;/font&gt;&lt;font color="#FF0000"&gt;'r'&lt;/font&gt;&lt;font color="#990000"&gt;).&lt;/font&gt;each &lt;font color="#FF0000"&gt;{&lt;/font&gt; &lt;font color="#990000"&gt;|&lt;/font&gt;line&lt;font color="#990000"&gt;|&lt;/font&gt; words &lt;font color="#990000"&gt;&amp;lt;&amp;lt;&lt;/font&gt; line&lt;font color="#990000"&gt;.&lt;/font&gt;chomp &lt;font color="#FF0000"&gt;}&lt;/font&gt;

selected_words &lt;font color="#990000"&gt;=&lt;/font&gt; &lt;font color="#990000"&gt;[]&lt;/font&gt;
&lt;b&gt;&lt;font color="#0000FF"&gt;while&lt;/font&gt;&lt;/b&gt;&lt;font color="#990000"&gt;(&lt;/font&gt; selected_words&lt;font color="#990000"&gt;.&lt;/font&gt;length &lt;font color="#990000"&gt;!=&lt;/font&gt; &lt;font color="#993399"&gt;4&lt;/font&gt; &lt;font color="#990000"&gt;)&lt;/font&gt;
  w &lt;font color="#990000"&gt;=&lt;/font&gt; words&lt;font color="#990000"&gt;[&lt;/font&gt;rand&lt;font color="#990000"&gt;(&lt;/font&gt;words&lt;font color="#990000"&gt;.&lt;/font&gt;length&lt;font color="#990000"&gt;)].&lt;/font&gt;capitalize
  selected_words &lt;font color="#990000"&gt;&amp;lt;&amp;lt;&lt;/font&gt; w &lt;b&gt;&lt;font color="#0000FF"&gt;if&lt;/font&gt;&lt;/b&gt; &lt;font color="#990000"&gt;(&lt;/font&gt;&lt;font color="#993399"&gt;3&lt;/font&gt;&lt;font color="#990000"&gt;..&lt;/font&gt;&lt;font color="#993399"&gt;6&lt;/font&gt;&lt;font color="#990000"&gt;).&lt;/font&gt;&lt;b&gt;&lt;font color="#0000FF"&gt;include&lt;/font&gt;&lt;/b&gt;&lt;font color="#990000"&gt;?(&lt;/font&gt;w&lt;font color="#990000"&gt;.&lt;/font&gt;length&lt;font color="#990000"&gt;)&lt;/font&gt;
&lt;b&gt;&lt;font color="#0000FF"&gt;end&lt;/font&gt;&lt;/b&gt;

puts selected_words&lt;font color="#990000"&gt;.&lt;/font&gt;join&lt;/tt&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;br/&gt;

&lt;p&gt;In the event that you don't have access to the same words list, you can use your own by changing the filepath in the second line to that of your own text file.  Just put one word per line and save!&lt;/p&gt;

&lt;p&gt;EDIT: In case you are wondering, I did have another 2-line version of the script that harnesses the power of ruby's API and syntax, but it actually runs slower, so I went with this one.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-5800759196284845797?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/5800759196284845797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=5800759196284845797' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/5800759196284845797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/5800759196284845797'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/10/code-passphrase-generator.html' title='Code: Passphrase Generator'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-6664464883916186913</id><published>2007-10-13T13:28:00.000-07:00</published><updated>2007-10-13T13:28:58.206-07:00</updated><title type='text'>Rant: Passphrases Continued -- Why They Haven't Caught On?</title><content type='html'>&lt;p&gt;In a previous &lt;a href="http://blog.paploo.net/2007/10/article-security-words.html"&gt;article&lt;/a&gt; I talked about passwords vs. passphrases, and why, in general, randomly generated passphrases are a better idea than passwords.  But while discussing my results with others the question came up "if they are so cool, why haven't they caught on?"&lt;/p&gt;

&lt;p&gt;I think there are several reasons for that.  One of which is that, historically speaking, space was limited, so passwords couldn't be longer than 8 characters.  Thus password culture has been built around an eight-character password, even though this limitation has disappeared from pretty much every system.&lt;/p&gt;

&lt;p&gt;But I think the main reason is that they just don't &lt;em&gt;feel&lt;/em&gt; secure.&lt;/p&gt;

&lt;p&gt;Think about it.  Which one feels more secure to you?  &lt;code&gt;Opjk8J2Q&lt;/code&gt; or &lt;code&gt;PiecesStudySmoothCatch&lt;/code&gt;?  With all the security experts always telling you that you need a password with symbols and numbers in it, while avoiding dictionary words, passphrases seem to go against everything we've been told!&lt;/p&gt;

&lt;p&gt;But as my &lt;a href="http://blog.paploo.net/2007/10/article-security-words.html"&gt;article&lt;/a&gt; showed, a random four-word passphrase that is generated from a dictionary of only about 4000 words is just as difficult to crack as a random 8-character password made of alphanumeric characters!  Indeed, if the exact dictionary of words you are using for password generation is unknown by an attacker, it becomes even more secure, as they have to try passphrases with words that have no relevance to your system.&lt;/p&gt;


&lt;p&gt;&lt;b&gt;A Little Extra&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;While I'm here I do want to mention two extra thoughts that came up while discussing my previous &lt;a href="http://blog.paploo.net/2007/10/article-security-words.html"&gt;article&lt;/a&gt; with others.&lt;/p&gt;

&lt;p&gt;The first thing is that passphrases are really no good if people can choose their own, as people are likely to choose certain words more over others.  This uneven distribution could be figured out through simple studies and then exploited by an attacker.&lt;/p&gt;

&lt;p&gt;On the other hand a random passphrase is so much easier for someone to remember that with a secure situation, issuing passphrases that people cannot change will work out better than issuing random passwords (since people usually have to write down random password, creating a place to breach security by a spying party; e.g. a janitor) while being more secure than a password that someone chooses for themselves.&lt;/p&gt;

&lt;p&gt;Remember, depending on the system, it only takes one weak password for an attacker to hack into a system and get access to password information to start doing brute-force attacks on administrator passwords!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-6664464883916186913?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/6664464883916186913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=6664464883916186913' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/6664464883916186913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/6664464883916186913'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/10/rant-passphrases-continued-why-they.html' title='Rant: Passphrases Continued -- Why They Haven&apos;t Caught On?'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-136058409925291579</id><published>2007-10-13T12:48:00.000-07:00</published><updated>2007-10-13T13:00:09.463-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>Video: iPhone in a Blender</title><content type='html'>&lt;p&gt;Last night I was checking my e-mail after a long evening of playing The Sims 2, and found that my mother-in-law sent me this video.&lt;/p&gt;

&lt;p&gt;As someone that loves his two Macs (and rarely boots his PC because he has little use for it), I should be abhorred by the wanton destruction of an iPhone.  But as the curious scientist in me wanted to see what happened, I found myself being quite entertained by the absurd and humorous presentation.&lt;/p&gt;

&lt;br/&gt;
&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/qg1ckCkm8YI"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/qg1ckCkm8YI" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-136058409925291579?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/136058409925291579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=136058409925291579' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/136058409925291579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/136058409925291579'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/10/video-iphone-in-blender.html' title='Video: iPhone in a Blender'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-4268126546041190805</id><published>2007-10-12T18:06:00.000-07:00</published><updated>2007-10-17T14:41:31.818-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='password'/><category scheme='http://www.blogger.com/atom/ns#' term='passphrase'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='article'/><title type='text'>Article: Security Words</title><content type='html'>&lt;p&gt;Ever since I've been a kid, I've been fascinated with codes and cryptography.  Of course, this topic has some great overlap with security, such as solving problems with storing, retrieving, and comparing passwords.  So I was the obvious choice to implement the security engines for the software at the small &lt;a href="http://www.redpineservices.com"&gt;start-up company&lt;/a&gt; that I work for.&lt;/p&gt;

&lt;p&gt;Now this article is NOT about implementing security in Rails.  This is a big and complicated topic that I do plan on writing about because implementing enterprise level security in Rails is not easy at all.&lt;/p&gt;

&lt;p&gt;No, this is about another common topic.  We often have to reset passwords for users.  (We, of course, only store the hashed form of the password with salt so that no one  get them!)&lt;/p&gt;

&lt;p&gt;Now most of the time, assigned passwords are generated out of random sets of characters.  This is great.  A randomly generated password is very secure.  But it is really hard to remember.&lt;/p&gt;

&lt;p&gt;So I got to thinking.  What if instead of passwords, we used a passphrase?  That is to say, instead of joining together a series of individual characters, what if we joined together a fewer number of words?  For me, at least, it is easier to remember a series of words than random characters, as I can come up with some visual or some rhyme to help me remember it.&lt;/p&gt;

&lt;p&gt;For example, most sys-admins might give you a random password that looks something like &lt;code&gt;2qLzj94k&lt;/code&gt;.  But what if, instead, they gave you a password like &lt;code&gt;GreenRunDallasOrchard&lt;/code&gt;?  I'd be willing to bet that you'd be much more likely to remember the 4 words better than the 8 random letters.&lt;/p&gt;

&lt;p&gt;But this gives rise to the question: How many words would I need to string together, and from a dictionary how large, in order to match the security of a random string of characters?&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Now For The Math&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;If you hate math, you may want to skim this section.  Though I am pretty sure that if you are still actually reading this, then either you are a technical individual and like math, or you are a manager who was forced to read this by your IT staff because you just don't get it.&lt;/p&gt;

&lt;p&gt;Normal passwords can be generated using all the letters (uppercase, and lower), digits, and a plethora of symbols.  Looking at an &lt;a href="http://en.wikipedia.org/wiki/ASCII"&gt;ASCII&lt;/a&gt; table, it looks like there are, 94 eligible characters that one could use in a password.&lt;/p&gt;

&lt;p&gt;Strangely enough, though, most random passwords are generated just with a subset of all letters and numbers, giving only 62 possible symbols.  This reduction of 32 symbols leads to a &lt;em&gt;drop&lt;/em&gt; of 5,877,349,279,825,920 passwords from all the possible 8 character passwords, which is a reduction in passwords of about 1/28th the fully possible 6,095,689,385,410,816!&lt;/p&gt;

&lt;p&gt;Now to calculate the number of random passwords possible with just letters and numbers given password of a given length, we just raise 62 to the power of that length.  Thus the following table hilights the number of possible passwords that exist with lengths of 4, 6, 8, and 16.&lt;/p&gt;

&lt;br/&gt;

&lt;table border='1' align="center" width="100%"&gt;
&lt;tr&gt;&lt;th align="center"&gt;Password&lt;br/&gt;Length&lt;/th&gt;&lt;th colspan="2" align="center"&gt;Possible&lt;br/&gt;Passwords&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;62&lt;sup&gt;4&lt;/sup&gt;&lt;/td&gt;&lt;td align="right"&gt;14776336&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;62&lt;sup&gt;6&lt;/sup&gt;&lt;/td&gt;&lt;td align="right"&gt;56800235584&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;62&lt;sup&gt;8&lt;/sup&gt;&lt;/td&gt;&lt;td align="right"&gt;218340105584896&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;62&lt;sup&gt;16&lt;/sup&gt;&lt;/td&gt;&lt;td align="right"&gt;47672401706823533450263330816&lt;/td&gt;&lt;/tr&gt;
&lt;caption&gt;Possible Passwords Composed of Letters and Numbers&lt;/caption&gt;
&lt;/table&gt;

&lt;br/&gt;

&lt;p&gt;So the real question then becomes: If we had a pass-phrase of 4 words, how many words would have to be in our dictionary of random words to match the security of a random string of letters and numbers of a given length?&lt;/p&gt;

&lt;p&gt;To calculate this, it is just a matter of the reverse problem from above.  We know how many passwords we want there to be, and we know the length needs to be 4, so we use some n-th roots to produce the following table:&lt;/p&gt;

&lt;br/&gt;

&lt;table border='1' align="center" width="100%"&gt;
&lt;tr&gt;&lt;th align="center"&gt;Password&lt;br/&gt;Length&lt;/th&gt;&lt;th colspan="2" align="center"&gt;Dictionary&lt;br/&gt;Size&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;62&lt;sup&gt;4/4&lt;/sup&gt;&lt;/td&gt;&lt;td align="right"&gt;62&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;62&lt;sup&gt;6/4&lt;/sup&gt;&lt;/td&gt;&lt;td align="right"&gt;489&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;62&lt;sup&gt;8/4&lt;/sup&gt;&lt;/td&gt;&lt;td align="right"&gt;3844&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;62&lt;sup&gt;16/4&lt;/sup&gt;&lt;/td&gt;&lt;td align="right"&gt;14776336&lt;/td&gt;&lt;/tr&gt;
&lt;caption&gt;Dictionary Size Needed For 4 Word Passphrases to Match Passwords of a Given Length&lt;/caption&gt;
&lt;/table&gt;

&lt;br/&gt;

&lt;p&gt;&lt;b&gt;The Answer For The Math Weenies&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;So what do all those numbers mean?  They mean that to reach the security of a randomly generated 8-character password generated just of letters and numbers, we only need to pull four random words from a dictionary of 3844 words, which is a completely reasonable feat.&lt;/p&gt;

&lt;p&gt;Indeed, doing a quick &lt;br/&gt;&lt;code&gt;grep -Ec "^[a-z]{3,6}$" /usr/share/dict/words&lt;/code&gt;&lt;br/&gt; on my OS X box seems to indicate that there are 29,041 words, none of which are proper nouns, that are from 3 to 6 letters long that could be used.  And expanding the list to contain proper nouns results in a dictionary of 33,925 possible words.&lt;/p&gt;

&lt;p&gt;Thus with a dictionary of 30,000 words, it would be possible to match the security of a random 10 letter password made of letters and numbers, with only a four word passphrase!  And if we increased the number of words in the passphrase to five, it would add 24,299,190,000,000,000,000,000 passphrases, which is the same security level as a 15 character alphanumeric password!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-4268126546041190805?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/4268126546041190805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=4268126546041190805' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/4268126546041190805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/4268126546041190805'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/10/article-security-words.html' title='Article: Security Words'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-408036370657333248</id><published>2007-10-02T14:19:00.001-07:00</published><updated>2007-10-02T15:02:28.567-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='widget'/><category scheme='http://www.blogger.com/atom/ns#' term='review'/><category scheme='http://www.blogger.com/atom/ns#' term='dashboard'/><title type='text'>Tip: Time Scroller</title><content type='html'>&lt;p&gt;With my co-worker working remotely the Philippines for the next 6 weeks, I have been finding that I'm often interested in two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What time is it there right now?&lt;/li&gt;
&lt;li&gt;When is a good time to talk to him?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first of these issues is handled easily enough with Apple's World Clock widget, which everyone has with their shiny copy of &lt;a href="http://auburnis.deviantart.com/art/tiger-19206771"&gt;Tiger&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But to solve the second one of these issues, I was finding myself wanting a Little Orphan Annie decoder ring style thing--with color coded section--to let me quickly scan over times and see how things line up.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;TimeScroller to the rescue!&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;After a quick search in Apple's downloads area, and a run around the block looking at the various widgets available, I found &lt;a href="http://www.timescroller.com/Home.html"&gt;TimeScroller&lt;/a&gt; to be the best for what I wanted.&lt;/p&gt;

&lt;p align="center"&gt;&lt;a href="http://www.timescroller.com/Home.html"&gt;&lt;img src="http://www.timescroller.com/Images/forweb.png" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With a quick press of F12, I'm whisked to a place where I can quickly see the time in as many (or as few) cities as I please, and with a flick of a scroll-bug, I can cycle through the times, checking to see how things line-up without doing any mental arithmetic.  And the best part: the customizable colored orbs that allow me to quickly tell when business hours align.&lt;/p&gt;

&lt;p&gt;Indeed, the only thing I would like to have out of this is a way to define different hours for the different cities (as my co-worker currently works from 4am to noon Manila time while I work 10am to 6pm Spokane Time).&lt;/p&gt;

&lt;p&gt;To download TimeScroller, visit the TimeScroller webpage at &lt;a href="http://www.timescroller.com/Home.html"&gt;http://www.timescroller.com/Home.html&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-408036370657333248?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.timescroller.com/Home.html' title='Tip: Time Scroller'/><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/408036370657333248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=408036370657333248' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/408036370657333248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/408036370657333248'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/10/tip-time-scroller.html' title='Tip: Time Scroller'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-2949723859848998064</id><published>2007-09-29T14:41:00.001-07:00</published><updated>2007-09-30T15:37:59.831-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='planet'/><category scheme='http://www.blogger.com/atom/ns#' term='pluto'/><category scheme='http://www.blogger.com/atom/ns#' term='astronomy'/><category scheme='http://www.blogger.com/atom/ns#' term='science'/><category scheme='http://www.blogger.com/atom/ns#' term='physics'/><title type='text'>Rant: Get Over It; Pluto Is NOT a Planet</title><content type='html'>&lt;p&gt;Pluto is &lt;i&gt;NOT&lt;/i&gt; a planet.  Get over it.&lt;/p&gt;

&lt;p&gt;For some reason, people seem to be offended that the &lt;a href="http://www.iau.org/"&gt;International Astronomical Union&lt;/a&gt; stripped it of its ranks and recategorized it as a &lt;a href="http://en.wikipedia.org/wiki/Dwarf"&gt;Dwarf&lt;/a&gt; planet.&lt;/p&gt;

&lt;p&gt;And as a good scientist, I'm horrified how many people make their scientific decisions based off of raw emotions and no logics or fact!&lt;/p&gt;

&lt;p&gt;That isn't to say that, in practice, science isn't driven by politics and emotions; but just because your immature little brother is being bad, doesn't mean you should as well.&lt;/p&gt;

&lt;p&gt;So in order to set a good example to the emotionally driven ignorant masses, let's get to work on why Pluto cannot be a planet.&lt;/p&gt;

&lt;br/&gt;
&lt;p&gt;&lt;b&gt;The Crux&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;The key to all of this is that there is no way to make a simple and impartial definition of a planet that includes Pluto with the other eight planets.&lt;/p&gt;

&lt;p&gt;This is important enough to repeat:&lt;/p&gt;

&lt;p&gt;There is NO simple, impartial definition we can apply to the word "planet" that includes the standard 9 planets, and only those 9 planets.&lt;/p&gt;

&lt;br/&gt;
&lt;p&gt;&lt;b&gt;Lets Try Our Hand At This&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Let's try our best to make a definition for planet that includes Pluto and see what happens:&lt;/p&gt;

&lt;p&gt;So first thing first, let's try the most obvious definition.  Let's try to limit by size.  Since Pluto is about 2,400km in diameter, we'll try the following definition:&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Definition #1&lt;/b&gt;: &lt;i&gt;"A planet is any body bigger than 2,000km in diameter, whose primary gravitational influence is the Sun."&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;So now let's vet this one to see how it works out for Pluto.&lt;/p&gt;

&lt;p&gt;If we consider the second part of the statement, "...whose primary gravitational influence is the Sun". As it turns out, depending on where Pluto is in its orbit, the gravitational pull between Pluto and Charon is somewhere between 40 and 110 times as strong as that of Pluto and the Sun!  Thus the first thing we need to consider is a better definition of how the gravity of the Sun affects the orbit of the planet!&lt;/p&gt;

&lt;br/&gt;

&lt;p&gt;So let's try another definition.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Definition #2&lt;/b&gt;: &lt;i&gt;"A planet is any body bigger than 2,000km in diameter, whose local system orbits the Sun, and who is not the satellite of another planet."&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;But whoops!  It turns out that then we'd have to have 10 planets, because &lt;a href="http://en.wikipedia.org/wiki/Eris_%28dwarf_planet%29"&gt;Eris&lt;/a&gt;--which was discovered in 2005--is a few kilometers bigger in diameter, and is almost 30% more massive--than Pluto!&lt;/p&gt;

&lt;p&gt;Indeed, to put the &lt;a href="http://en.wikipedia.org/wiki/List_of_solar_system_objects_by_radius"&gt;size of things&lt;/a&gt; into perspective, it turns out there are seven moons of established planets that are bigger than Pluto, including our own moon!&lt;/p&gt;

&lt;p&gt;Furthermore, there was no scientific reason why we chose a diameter of 2,000km as the minimum limit in the first place.  It was just an arbitrary number that was pulled out of thin air in an effort to make Pluto a planet, but other similar objects not!&lt;/p&gt;

&lt;p&gt;Indeed, if we tried to scientifically pick a minimum diameter, we'd probably want to pick the critical radius where gravity pulls the object into a &lt;a href="http://en.wikipedia.org/wiki/Spheroid"&gt;spheroidal&lt;/a&gt; shape.  This &lt;a href="http://www.hull.ac.uk/php/dmsghc/planets/html/v_minimum_radius_and_mass_for_a_planetary_body.htm"&gt;This diameter&lt;/a&gt; depends on the material of the body, but is often around 400km to 500km in diameter, which is about 5 times smaller than Pluto, and includes at least several &lt;A href="http://en.wikipedia.org/wiki/Kuiper_belt"&gt;Kupier Belt Objects&lt;/a&gt;, as well as the largest asteroid in the &lt;a href="http://en.wikipedia.org/wiki/Asteroid_belt"&gt;Asteroid Belt&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Ceres_%28dwarf_planet%29"&gt;Ceres&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Indeed, as we discover more and more Kupier Belt Objects, this definition could lead to dozens or even hundreds of planets!&lt;/p&gt;

&lt;p&gt;So size (and mass) turned out to be a really bad way of defining what is and is not a planet.&lt;/p&gt;

&lt;br/&gt;

&lt;p&gt; So lets this another way entirely.  What can we say about the orbits of the planets?&lt;/p&gt;

&lt;p&gt;Well, let's look at how circular the orbit is; which is called its &lt;a href="http://en.wikipedia.org/wiki/Orbital_eccentricity"&gt;eccentricity&lt;/a&gt;.  If we look at most of the planets, the eccentricity is such that the oribtal path is reasonably close to circular.&lt;/p&gt;

&lt;p&gt;But this fails for Pluto.  Pluto's orbit goes from around 30 &lt;a href="http://en.wikipedia.org/wiki/Astronomical_unit"&gt;AU&lt;/a&gt;s at its closest to the sun, to nearly 50 AUs at its farthest.  Thus its orbit is nearly 1.7 times longer than it is wide making it pretty oval in shape.

&lt;p&gt;But it gets worse.  This test &lt;i&gt;also&lt;/i&gt; fails for Mercury, whose eccentricity is almost as bad as Pluto's, while the asteroid Ceres has about the same eccentricity as Mars.&lt;/p&gt;

&lt;p&gt;So if we try to use the shape of the orbit as a criteria, we endanger the planetary status of Mercury, while possibly allowing the asteroid Ceres as a planet!&lt;/p&gt;

&lt;br/&gt;

&lt;p&gt;So what if we look at the &lt;a href="http://en.wikipedia.org/wiki/Orbital_inclination"&gt;inclination&lt;/a&gt; of the orbit?  Most of the planetary orbit's lie very nearly in the same plane as the Earth.  In fact, most of the planets lie within 3.5 degrees of this plane.&lt;/p&gt;

&lt;p&gt;However, this is very different for Pluto, whose orbit is inclined 17 degrees out of the &lt;a href="http://en.wikipedia.org/wiki/Ecliptic"&gt;Ecliptic Plane&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Even worse Mercury, at 7 degrees, has problems again!&lt;/p&gt;  It is inclined by over twice the amount of any other planet, and is getting pretty close to the orbital inclination of the asteroid Ceres, which is at about 10 degrees!&lt;/p&gt;

&lt;p&gt;So once again, if we try to use an orbital parameter to define what is a planet, we endanger Mercury or include Ceres!&lt;/p&gt;

&lt;br/&gt;

&lt;p&gt;So it appears that we need to appeal to something else than orbit.  Which leads me to wonder about Moons?  Pluto has three moons, and all the other planets seem to have moons, while Ceres does not.&lt;/p&gt;

&lt;p&gt;But wait; Mercury has no moons, while many other bodies in the solar system (such as some asteroids and Kupier Belt Objects) do.  So this makes a horrible way of defining a planet as well.&lt;/p&gt;

&lt;br/&gt;
&lt;p&gt;&lt;b&gt;An Analog From History&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;I keep bringing up Ceres for a reason.  Ceres discovered in 1801, was the first asteroid found.  However it was not always classified as an asteroid.  Indeed, for about a half century, Ceres (along with the other three first found asteroids) were listed as &lt;i&gt;planets&lt;/i&gt; in books and tables.  Thus, for a good part of the 1800s, we had more than nine planets, and none of them were Pluto!&lt;/p&gt;

&lt;p&gt;But as the number of astronomical bodies that all had nearly this same orbit grew, it became obvious that these were not best categorized as planets, but that they were best categorized on their own.&lt;p&gt;

&lt;p&gt;Indeed, this was a wise decision, as over the past 200 years the number of asteroids found has climbed over 100,000!  Aren't we glad we don't have to learn about the 100,000 planets!&lt;/p&gt;

&lt;br/&gt;
&lt;p&gt;&lt;b&gt;Kupier Has A Belt&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;So as it turns out, Pluto is smack in the middle of the Kupier Belt, and its only special attribute seems to be that it is one of the largest Kupier Belt Objects found so far.&lt;/p&gt;

&lt;p&gt;Now since you are here, you probably don't know anything about the &lt;a href="http://en.wikipedia.org/wiki/Kuiper_belt"&gt;Kupier Belt&lt;/a&gt;.  This is for good reason, because even though it had been conjectured to exist in the 1940's, it wasn't until the early 1990's that we were able to discover any object in it other than Pluto.  Anyway, as a quickie overview, you can think of it much like an asteroid belt that is beyond the orbital distance of Neptune and upto 50 AU away.  It contains thousands or even tens of thousands of objects, all in a similar orbit, and all with a similar chemical composition.&lt;/p&gt;

&lt;p&gt;Indeed the composition of Pluto is much more like that of a comet, and the scientific evidence is mounting that many of the comets originated as Kupier Belt objects.&lt;/p&gt;

&lt;br/&gt;
&lt;p&gt;&lt;b&gt;The Nail In The Coffin&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Thus to continue considering Pluto a planet would be the same fallacy as having continued to cald the first four asteroids planets.&lt;/p&gt;

&lt;p&gt;It would also mean coming up with an absurdly complicated definition of planet because we are too emotionally attached to what we knew&lt;/p&gt;

&lt;p&gt;But since immediately after Pluto was found nearly 80 years ago, it has been conjectured that Pluto should not be called a planet because it doesn't belong with the others.&lt;/p&gt;

&lt;p&gt;Good science is about progress, change, and admitting when we are wrong.  And as we discover more about the structure of our solar system, we will have to continue to admit mistakes, change our definitions, and push scientific progress for the good of humanity.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-2949723859848998064?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/2949723859848998064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=2949723859848998064' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/2949723859848998064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/2949723859848998064'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/09/rant-get-over-it-pluto-is-not-planet.html' title='Rant: Get Over It; Pluto Is NOT a Planet'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-2062521053037703499</id><published>2007-09-27T21:10:00.000-07:00</published><updated>2007-09-28T10:51:50.283-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='discussion'/><category scheme='http://www.blogger.com/atom/ns#' term='debate'/><category scheme='http://www.blogger.com/atom/ns#' term='ego'/><category scheme='http://www.blogger.com/atom/ns#' term='anecdote'/><title type='text'>Anecdote: The Parable of Confused Direction</title><content type='html'>&lt;p&gt;While sitting here enjoying my &lt;a href="http://www.bigskybrew.com/process/moosedrool.html"&gt;Moose Drool&lt;/a&gt; and trying to piece together an essay on how to keep from being one of those jerks that always needs to be right, I was reminded of an interesting skirmish I had with a friend over the stupidest thing.&lt;/&gt;

&lt;p&gt;&lt;b&gt;Way Back In College&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;It was years ago, when we weren't even freshmen in college for a whole week.  Now somehow it came-up, while sitting one night on the lawn outside our dorm, that we disagreed as to which direction was North.&lt;/p&gt;

&lt;p&gt;Now, being academically inclined, I cannot let a disagreement go until it's come to a satisfactory resolution.  So my first attempt to support my contradictory viewpoint was to point out the &lt;a href="http://en.wikipedia.org/wiki/Polaris"&gt;North Star&lt;/a&gt; and say "Look!  See?  That direction must be North!".&lt;/p&gt;

&lt;p&gt;Unfortunately, we were both from a rural area where you could see an enormous multitude of stars, and so this brightly lit city sky, with its relatively few stars, obscured our ability to recognize the constellations.  Thus, I was quite unperturbed when she disagreed with my assessment, and pointed at another star as being Polaris.&lt;/p&gt;

&lt;p&gt;This led me to my second attempt: to have her recollect the companion we wandered about with all throughout those first wide-eyed days of college: a &lt;a href="http://www.aw.id.ucsb.edu/maps/ucsbmap.html"&gt;campus map&lt;/a&gt;.  Now since we agreed on how the map oriented compared to where we were sitting, I tried to reason that maps almost always have North at the top.  And therefore what she thought was North was actually West.&lt;/p&gt;

&lt;p&gt;But since we did not have an actual map to point at a compass rose, my reasoning was rebutted by her with a simple: "Well, this map is different!"&lt;/p&gt;

&lt;p&gt;So, after a little skirmish over the plausibility of her claim, in which she refused to budge on her position while finding no further arguments to support it, it dawned on me:  I knew how to prove, beyond a shadow of a doubt, that her North could not possibly be North.&lt;/p&gt;

&lt;p&gt;Now it needs to be noted that she was pointing in a direction perpendicular to mine, because she was using the local coast line, in accordance with her geographical experiences in other places, to discern which way was North.&lt;/p&gt;

&lt;p&gt;So I pointed at the Moon, which was low on the horizon, and said "The Moon rises in the East and sets in the West.  Therefore that direction is either East or West."&lt;/p&gt;

&lt;p&gt;Now the Moon was in what was her "South", and so it became obvious that she was quite confused because her "North" was really either West or East, and either way it was clear that it could not possibly be North.&lt;/p&gt;

&lt;p&gt;Now this was too much for her: she became entirely frustrated with the fact that she was proven wrong, and she jumped up with a face red with frustration and left in a hurried hissy!&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Food For Thought&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;I was very annoyed with her reaction.  I didn't want the discussion to end this way at all.  All I really wanted was to find out the truth.&lt;/p&gt;

&lt;p&gt;I was pretty certain I was correct, being that I have an obsession with maps (to which I think everybody should have an obsession with maps).  But even though I knew the maps so well, that didn't mean that I was incapable of making a mistake.  Everyone makes mistakes, and no one can know everything, so all I really wanted to do was discuss it out until we reached an agreement as to what was most likely the truth.&lt;/p&gt;

&lt;p&gt;In fact, this was an exercise that one of my other great friends and I have always enjoyed.  Most of our time together (mostly as teenagers) was spent tabling topics to hash out in search of a better understanding of the truth. His ability to put his ego aside--combined with his &lt;a href="http://en.wikipedia.org/wiki/Spock"&gt;Spock-like&lt;/a&gt; calm logical approach--was often very frustrating for me because if you were wrong about something, he would slowly pin you down into a corner, never showing any sign of emotion the entire way.&lt;/p&gt;

&lt;p&gt;But in the end, It was his Spock-like calm and logic that I can thank for having learned how to overcome my own ego and to admit when I am wrong.&lt;/p&gt;

&lt;p&gt;Unfortunately, my good friend in this story was unable to do the same thing in her younger years, whch led to many unfortunate consequences including alienated friendships and stagnation of ideas.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;More Beer?&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;So now that I've managed to throw this thought out onto the page, the real question I have for all of you is if there is another Moose Drool in the fridge.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-2062521053037703499?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/2062521053037703499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=2062521053037703499' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/2062521053037703499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/2062521053037703499'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/09/anecdote-parable-of-direction.html' title='Anecdote: The Parable of Confused Direction'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-1051830390263360315</id><published>2007-09-27T16:08:00.001-07:00</published><updated>2007-09-27T19:38:47.238-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='fan'/><category scheme='http://www.blogger.com/atom/ns#' term='train'/><category scheme='http://www.blogger.com/atom/ns#' term='hobby'/><category scheme='http://www.blogger.com/atom/ns#' term='rail'/><category scheme='http://www.blogger.com/atom/ns#' term='locomotive'/><category scheme='http://www.blogger.com/atom/ns#' term='bnsf'/><title type='text'>Video: BNSF Speeding Through Crossing</title><content type='html'>&lt;p&gt;Since before I can remember, I've loved trains.  I grew up riding steam trains on vacations with my parents, and am now fortunate enough to live in an area where my good friend "&lt;a href="http://www.youtube.com/user/rdw283"&gt;rdw283&lt;/a&gt;" any myself can go railfanning when the wives let us.&lt;/p&gt;

&lt;p&gt;And people wonder why I like Ruby on Rails!&lt;/p&gt;

&lt;p&gt;About a half mile from my house is this fun crossing where the BNSF blasts through at 50+ mph on the tail end of their acceleration push out of the Yardly yards in Spokane.&lt;/p&gt;

&lt;p&gt;I caught this one this summer:&lt;p&gt;

&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;&lt;object height='350' width='425'&gt;&lt;param value='http://youtube.com/v/nCc_ml-FHNk' name='movie'/&gt;&lt;embed height='350' width='425' type='application/x-shockwave-flash' src='http://youtube.com/v/nCc_ml-FHNk'/&gt;&lt;/object&gt;&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;If you are interested in seeing more, you can check out my &lt;a href="http://www.youtube.com"&gt;YouTube&lt;/a&gt; page at &lt;a href="http://www.youtube.com/paploothelearned"&gt;http://www.youtube.com/paploothelearned&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-1051830390263360315?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/1051830390263360315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=1051830390263360315' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/1051830390263360315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/1051830390263360315'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/09/video-bnsf-speeding-through-crossing.html' title='Video: BNSF Speeding Through Crossing'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-6956754246526839439</id><published>2007-09-26T18:14:00.000-07:00</published><updated>2007-10-17T13:19:58.475-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='editor'/><category scheme='http://www.blogger.com/atom/ns#' term='cli'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='review'/><title type='text'>Tip: Emacs and Vim Suck; JOE to the rescue!</title><content type='html'>&lt;p&gt;Being a software architect and developer at &lt;a href="http://www.redpineservices.com"&gt;RedPine Services&lt;/a&gt;, I often find myself working from the command line for a variety of purposes and on a variety of hardware.  Unfortunately, I find the standard compliment of command line text editors to be lackluster.&lt;/p&gt;

&lt;p&gt;I've found that most systems come bundled with three major editors: Emacs, Vi/Vim, and Pico.  Although I use vim as my primary editor, I wish I didn't have to.  All thee of these editors have major drawbacks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt; is very large, complex, and cumbersome.  Sure, it is very powerful, but it takes a lot of time and a good memory to learn all the &lt;a href="http://www.engr.uvic.ca/~dastone/emacs-keys.html"&gt;unnecissarily long, funky key combinations&lt;/a&gt;, and until you've learned them, using Emacs from the CLI is impossible.  This kills its approachability and leads me to wonder how it ever gained popularity in the first place.&lt;/li&gt;

&lt;li&gt;&lt;a href="http://www.vim.org/"&gt;Vi/Vim&lt;/a&gt; is also very powerful, but its unique and strange &lt;a href="http://vimdoc.sourceforge.net/htmldoc/intro.html#vim-modes-intro"&gt;input mode vs. command mode&lt;/a&gt; paradigm makes it hard to pick-up, and its &lt;a href="http://www.keyxl.com/aaa8263/290/VIM-keyboard-shortcuts.htm"&gt;non-standard key commands&lt;/a&gt; make it difficult to learn as well.&lt;/li&gt;

&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Pico_(text_editor)"&gt;Pico&lt;/a&gt; is sort of the opposite.  It is very easy to pick-up and learn, with the most important key commands being shown as help right on the screen.  This is very helpful for any novice, as you don't have to go fishing for the key command to bring up help or to save or to quit like you do with Emacs and Vim.  The downside, though, is that Pico was made for e-mail composition purposes (being the bundled text editor for &lt;a href="http://www.washington.edu/pine/"&gt;PINE&lt;/a&gt;) and thus lacks many features (and wraps and destroys your carefully made code and config files if you don't provide the right option on the command line!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now I admit that I use Vim in my everyday life because it is on all the systems and servers I have to work with in my professional career, and because Emacs is the complete opposite of what I value in a text editor.  But no matter how much I use it, I can't shake my wish that people would always bundle the text editor that I used in my younger years: &lt;a href="http://sourceforge.net/projects/joe-editor/"&gt;JOE&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I came across JOE as a teenager when my family first signed up for internet access with the ISP &lt;a href="http://www.sonic.net"&gt;Sonic.net&lt;/a&gt;.  It has much of the simplicity and accessibility as Pico, while having most of the power features people actually want.&lt;/p&gt;

&lt;p&gt;The key to JOE is its accessibility.  When you first open it, you are presented with a screen that is intuitive to use and navigate, and which has a prominent message displaying how to get to the inline help screens, which can be toggled on and off at any time during use.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Thus you can just jump right in and go with JOE!&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Then, as you use JOE more and more, you can start moving deeper and deeper into the help screens to learn how to use functionality such as buffers and simultaneous multi-buffer display.&lt;/p&gt;

&lt;p&gt;I recommend that everyone that programs, who is unhappy with emacs and vim, give joe a look.  It is easily downloaded, compiled, and install with the standard &lt;code&gt;./configure &amp;&amp; make &amp;&amp; sudo make install&lt;/code&gt; routine on Linux and Mac OS X.&lt;/p&gt;

&lt;p&gt;Check-out &lt;a href="http://sourceforge.net/projects/joe-editor/"&gt;JOE on SourceForge&lt;/a&gt; to get your copy now.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-6956754246526839439?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/6956754246526839439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=6956754246526839439' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/6956754246526839439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/6956754246526839439'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/09/tip-emacs-and-vim-suck-joe-to-rescue.html' title='Tip: Emacs and Vim Suck; JOE to the rescue!'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-5291921922099270136</id><published>2007-09-26T14:39:00.000-07:00</published><updated>2007-09-26T14:40:38.338-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>Rant: Flame-War Fueling Language Reviews</title><content type='html'>&lt;p&gt;One of my big pet peeves is people who start flame-wars over programming language choice.  It is as if they think that they are righteous enough to force their one way of thinking about the narrow scope of tasks they solve, upon everyone else.  Furthermore, it appears to me as if the majority of these arguments are fueled by the narrow-minded ignorance of those who do not take the time to actually understand the language that the proclaim to hate so much.&lt;/p&gt;

&lt;p&gt;One example of this that sticks in my mind was a rant article I read in the early days of Java, which was written by a C++ aficionado.  He spent a couple days learning Java and then proclaimed a long list of problems that Java had and why he would never use it.  Although at the time his arguments seemed to make sense, I came back a year later to find that all his claims were actually based out of ignorance of Java, and that none of those problems actually existed if he took the time to learn how to think in Java instead of C++.&lt;/p&gt;

&lt;p&gt;Now, one thing that seems obvious, but is frequently glazed over in language wars, is that not everyone is trying to perform the same tasks with the language they are using.  This means that everyone requires something different out of the language they write in.  Actually, now that I think about it, let me rephrase it: everyone requires something different out of the &lt;i&gt;tools&lt;/i&gt; they write in, which would be the API.  So just like you wouldn't use a hammer to plant your flowers or a rake to build a bookcase, different APIs are necessary to solve different problems.&lt;/p&gt;

&lt;p&gt;Thus the way I see it, if you find a language that fits your personal style, you should be able to write anything in it, as long as there is a good API to support what you need to do.  Thus a good API is the single most important place to discuss a lanuage, and only when it is in the context of accomplishing specific tasks.&lt;/p&gt;

&lt;p&gt;So maybe what really is the problem is that people seem to have such strong opinions about a &lt;i&gt;language&lt;/i&gt; when what they really should be discussing is the strengths and shortcomings of the &lt;i&gt;API&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;This would help keep away the all too often scene of petty complaints about the language itself, which are rooted in ignorance of how to leverage the language, and result in false arguments as to the righteousness of their own choice of programming language that are easily seen as flawed by those more knowledgeable of the other side.&lt;/p&gt;

&lt;p&gt;But there is one other issue I'd like to discuss: if it is a matter of API only, why don't we implement Operating Systems in ruby, for example? Surely we could build a suitable base API for ruby and then build the rest of the OS in ruby itself?&lt;/p&gt;

&lt;p&gt;Of course, the reason why we don't is that ruby is in a runtime environment that gives it the flexibility of platform independence and fast turn-around times, but lacks the speed necessary to accomplish such tasks efficiently.&lt;/p&gt;

&lt;p&gt;But this isn't the fault of the language.  No.  This is the fault of the compiler/runtime.   The langauge, which is just a grammar and rules for how to execute the basic constructs of said grammar, should be capable of performance at least on par with Objective-C, if not better.&lt;/p&gt;

&lt;p&gt;Indeed, most languages, if they had a bunch of resources thrown at an optimized native machine language compiler, should achieve similar performance at runtime.&lt;/p&gt;

&lt;p&gt;So when it comes down to it, when we review "languages", there are really three parts that need to be discussed, and each one needs to be discussed in the proper context:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;API&lt;/b&gt; - Both the strengths and shortcomings.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Performance&lt;/b&gt; - As compared to other languages that can solve the same tasks.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Language&lt;/b&gt; - The kinds of people and projects that benefit and determent from the features of the langauge at hand.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So this brings me to one thing I have not discussed: The language itself:&lt;/p&gt;

&lt;p&gt;Which languages you like is a matter of taste, and reflects upon you as a person.  It naturally reflects on how you think and how you solve problems.  But it also reflects on your ability to learn and adapt.  Good programmers should always be learning and pushing their bounds, which always involves learning and &lt;i&gt;understanding&lt;/i&gt; new languages.  Unfortunately, too many people become comfortable in the one langauge they use and don't want to take the time to understand other languages.  These same people, then, seem to always be the most vocal in the language flame-wars, usually displaying their ignorance to everyone in the process.&lt;/p&gt;


&lt;p&gt;Expressing one's opinion is good, but people need to be more aware of what is their opinion versus what is fact; to be careful not to let their ignorance drive their zealous verbosity; and to support their viewpoint with calm and poise.  Everyone is different and that is what makes life so rich and interesting.  And while sharing ideas about what can make one language more useful than another is good, attempting to force everyone to conform to one way of thinking is not.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-5291921922099270136?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/5291921922099270136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=5291921922099270136' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/5291921922099270136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/5291921922099270136'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/09/rant-reviewing-languages.html' title='Rant: Flame-War Fueling Language Reviews'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3958627136570980537.post-6776004505684758087</id><published>2007-09-25T21:41:00.000-07:00</published><updated>2007-10-21T20:12:26.173-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='biography'/><category scheme='http://www.blogger.com/atom/ns#' term='bio'/><title type='text'>So Who Is This Guy?!</title><content type='html'>&lt;p&gt;Before I started rambling about things like you care, I thought it would be nice to give you a little background about myself.&lt;/p&gt;

&lt;p&gt;I grew up in a strange family with strange friends, doing strange things.  This is what makes life interesting.  If I weren't a strange person who grew up in a strange family, doing strange things, then I'd be boring and I'd have boring friends and be a robot.  So being strange is a compliment.&lt;/p&gt;

&lt;p&gt;For that matter, being a geek is a compliment (whereby I consider a geek to be a nerd with social skills).  I've always been a geek and I'm proud of it.  Okay, I'll come clean.  I was a nerd until college and then I became a geek.&lt;/p&gt;

&lt;p&gt;Anyway, Before I could read I had memorized all the planets in order (including the asteroid belt).  As I got older I realized I actually couldn't remember anything, and hence I was bad at math and spelling; but when it came to concepts I was a very fastlearner.&lt;/p&gt;

&lt;p&gt;So not to toot my own horn or anything, but in high school, as the curriculum changed from memorization to problem solving, I suddenly excelled over other students of my class in subjects such as math, science, and history.  (Okay, so I am tooting my own horn on purpose, but I feel ashamed that I'm doing it.)&lt;/p&gt;

&lt;p&gt;It was at that time that I discovered my first love is Physics.  (Howwever, If you are my wife, then you are my first love!)  In high school I was the first student in the district to ever take the AP Physics C test, I got an 800 on my SAT II in Physics, and went on to be one of 13 students who enrolled in the &lt;a href="http://www.ccs.ucsb.edu/"&gt;College of Creative Studies&lt;/a&gt;, which offers an advanced physics program at &lt;a href="http://www.ucsb.edu/"&gt;UC Santa Barbara&lt;/a&gt;.  Through UCSB I was able to study physics and astronomy, culminating in learning about my favorite topic: General Relativity.&lt;/p&gt;

&lt;p&gt;UCSB also allowed me to excel at another love of mine , which is teaching.  My passion and exuberance for what I know translates into a passion and exuberance to share this knowledge with others.  Through UCSB I was able to be a teaching assistant for several classes which enabled me to hone my teaching skills.&lt;/p&gt;

&lt;p&gt;Although my training is technically in Physics, I learned something far more important.  What I learned primarily was the ever important skills of self-learning and problem solving, which prepares you to be successful and anything you feel passionate about.&lt;/p&gt;

&lt;p&gt;Which leads me to computers.  I have always loved computers.  Couple that with my passion for learning and problem solving, and it should be obvious that I am a self-taught software whiz.  (Once again, I toot my own horn and feel bad doing so.)  I've taught myself many languages over the years, each time striving to completely understand the language--how it works and how to think in it--before coming to a decision about which languages are right for me.&lt;/p&gt;

&lt;p&gt;Nearly all my employment has been computer related.  I have had several stints at &lt;a href="http://www.ocli.com"&gt;Optical Coating Labs&lt;/a&gt; as a Java programmer, combining science, math, and software to write major components of their in-house thin film engineering software.  And currently I work at the start-up &lt;a href="http://www.redpineservices.com/"&gt;RedPine Services&lt;/a&gt; as a software architect and developer, working to see through our dream for a top-notch healthcare software package.&lt;/p&gt;

&lt;p&gt;So now I live in Spokane with my wife and three wonderful (though cheeky) step-children, enjoying my many hobbies (which include, but are not limited to: eating, sleeping, painting, video games, reading, watching TV, drinking good scotch, photography, playing piano or trumpet, writing music, listening to music, playing with my children), and adoring my wife whenever I can.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3958627136570980537-6776004505684758087?l=blog.paploo.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.paploo.net/feeds/6776004505684758087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3958627136570980537&amp;postID=6776004505684758087' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/6776004505684758087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3958627136570980537/posts/default/6776004505684758087'/><link rel='alternate' type='text/html' href='http://blog.paploo.net/2007/09/so-who-is-this-guy.html' title='So Who Is This Guy?!'/><author><name>Paploo</name><uri>http://www.blogger.com/profile/05918964938891806436</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://www.paploo.net/me/img/jeff.jpg'/></author><thr:total>0</thr:total></entry></feed>
