<?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-5693054744995313095</id><updated>2011-11-27T19:22:24.868-05:00</updated><category term='Radiant'/><category term='flash'/><category term='lighttpd'/><category term='postgresql'/><category term='package'/><category term='Economics'/><category term='Amazon'/><category term='Screenshots'/><category term='adobe'/><category term='Blip.tv'/><category term='dell'/><category term='locks'/><category term='NewEgg'/><category term='prawn'/><category term='railroad'/><category term='Mac OS X'/><category term='video'/><category term='email'/><category term='laughing'/><category term='performance'/><category term='redirect'/><category term='xbox'/><category term='aspell'/><category term='raid'/><category term='Dropbox'/><category term='wget'/><category term='freeze'/><category term='backup'/><category term='patch'/><category term='halo'/><category term='Ohio'/><category term='ohloh'/><category term='Screencast'/><category term='boxbackup'/><category term='Gmail'/><category term='apt'/><category term='diff'/><category term='pdf'/><category term='logrotate'/><category term='Christmas Fotolog'/><category term='furniture'/><category term='Firefox'/><category term='iPhone'/><category term='refrigerator'/><category term='CMS'/><category term='network'/><category term='redmine'/><category term='ComputerWorld'/><category term='Palm Pre'/><category term='noise'/><category term='cleaning'/><category term='ruby'/><category term='savetheinternet'/><category term='T1'/><category term='appliances'/><category term='apple'/><category term='VirtualBox'/><category term='ebay'/><category term='hang'/><category term='blood'/><category term='event'/><category term='Tutorial'/><category term='inhouse'/><category term='faint'/><category term='RedHat'/><category term='Phatch'/><category term='sdk'/><category term='debian'/><category term='UPS APC Battery'/><category term='Screengrab'/><category term='hosted software'/><category term='rrod'/><category term='squeeze'/><category term='justhackit'/><category term='LinuxFest'/><category term='MynaStuff'/><category term='idea'/><category term='key'/><category term='oss'/><category term='office'/><category term='SilverStripe'/><category term='programming'/><category term='Ruby-AAWS'/><category term='party'/><category term='monitoring'/><category term='Web 2.0'/><category term='licensecheck'/><category term='AWS'/><category term='Apple iMac MacWorld'/><category term='GradeSheet'/><category term='ruby on rails'/><category term='Linux'/><category term='Anteater'/><category term='microsoft'/><category term='Ubuntu'/><category term='SAN'/><category term='authlogic'/><category term='Coraid'/><title type='text'>KangarooWho‽</title><subtitle type='html'>My viewpoint on the world at large.&lt;br&gt;Yea, you can probably just ignore everything I say.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>44</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-6724436378085935259</id><published>2010-10-12T14:39:00.000-04:00</published><updated>2010-10-12T14:39:40.192-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='VirtualBox'/><title type='text'>Resizing a VirtualBox guest hard drive</title><content type='html'>Recently, I needed to expand the hard drive on my Ubuntu VirtualBox guest machine from 8GB to 20GB.&amp;nbsp; At first it looked like I was going to have to start from scratch, but a little Googling turned up this gem (which I stole from the &lt;a href="http://forums.virtualbox.org/viewtopic.php?f=1&amp;amp;t=364&amp;amp;sid=0f6c731729f2cc73f48c473d11710606&amp;amp;start=90"&gt;VirtualBox forums&lt;/a&gt;)&lt;br /&gt;&lt;blockquote&gt;#VBoxManage createhd -filename new.vdi --size 20000 --remember&lt;br /&gt;#VBoxManage clonehd old.vdi new.vdi --existing&lt;/blockquote&gt;After the clone operation gets finished you just need to replace the old hard drive with the new on in VirtualBox and start the guest instance.&amp;nbsp; The only thing that tripped me up is that the guest didn't immediately "see" the bigger hard drive.&amp;nbsp; Well, to be more precise the hard drive was bigger but the partition was still set to 8GB.&amp;nbsp; As quick boot into GParted did the trick and now I have room to move again on my VM.&amp;nbsp; :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-6724436378085935259?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/6724436378085935259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2010/10/resizing-virtualbox-guest-hard-drive.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/6724436378085935259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/6724436378085935259'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2010/10/resizing-virtualbox-guest-hard-drive.html' title='Resizing a VirtualBox guest hard drive'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-5707298607053930092</id><published>2010-01-04T14:11:00.005-05:00</published><updated>2010-01-26T13:45:51.357-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='authlogic'/><title type='text'>Authlogic: Restricting simultaneous sessions</title><content type='html'>I'm building a Rails based application for a client, which they are in-turn licensing to their customers on a per-seat basis.  This means that they don't want multiple people using the same login at the same time; if you have 5 people in your shop, you have to purchase 5 licenses.  Makes sense to me.&lt;br /&gt;&lt;br /&gt;Anyway, we're using the splendid &lt;a href="http://github.com/binarylogic/authlogic"&gt;Authlogic&lt;/a&gt; plug-in for all the authentication duties and while it does many things very well it doesn't have a built-in way to restrict simultaneous logins.  I asked around and got a couple of tips on what might work and how I might proceed.  It was a simple process but after several others had the same problem I thought I would formalize the "solution" in a blog post in hopes that it might help someone else in the future.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Step One - Add a place to store a session key&lt;br /&gt;&lt;pre name="code" class="brush:ruby"&gt;# add_session_key_to_users.rb&lt;br /&gt;class AddSessionKeyToUsers &lt; ActiveRecord::Migration&lt;br /&gt;def self.up&lt;br /&gt;add_column :users, :session_key, :string&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def self.down&lt;br /&gt;remove_column :users, :session_key&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;This gives us a place to store a "session_key" value that changes every time a user logs in.&lt;/li&gt;&lt;li&gt;Step Two - Insert the "session_key" on login&lt;br /&gt;&lt;pre name="code" class="brush:ruby"&gt;# user_sessions_controller.rb&lt;br /&gt;def create&lt;br /&gt;...&lt;br /&gt;if @user_session.save&lt;br /&gt;# Save the session ID to detect simultaneous login attempts&lt;br /&gt;@user_session.record.session_key = session[:session_id]&lt;br /&gt;@user_session.record.save!&lt;br /&gt;...&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;What this does is forces the session_id to be saved to the User model each time a user logs into the site.  We'll check this value later to make sure the session hasn't changed.  I'm using the session_id here as a "unique" value but it could be anything you want; timestamp, IP address, etc...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Step Three - Make sure the user is unique&lt;br /&gt;&lt;pre name="code" class="brush:ruby"&gt;# application_controller.rb&lt;br /&gt;def current_user&lt;br /&gt;...&lt;br /&gt;# Prevent simultaneous logins&lt;br /&gt;if @current_user &amp;&amp; @current_user.session_key != session[:session_id]&lt;br /&gt;flash[:notice] = 'Access denied. Simultaneous logins detected.'&lt;br /&gt;current_user_session.destroy &lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here is where the rubber meets the road, so to speak.  In Authlogic, the current_user method is accessed on every page request so it is the perfect place to check for duplicate user sessions.  We simple verify that the session_id in the users cookie is the same one in the database.  If they are different we destroy the session and update the flash message.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;This is a pretty simple little hack but it seems to work OK.  One "problem" that I have noticed is that while the session is immediately destroyed the current request continues unabated.  This means that the two users could possibly perform two actions at the same time, but it shouldn't be a problem.  Another side effect of this technique is that the last user to log in always gets the session.  This might be a problem for you but it wasn't for my project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-5707298607053930092?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/5707298607053930092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2010/01/authlogic-restricting-simultaneous.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/5707298607053930092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/5707298607053930092'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2010/01/authlogic-restricting-simultaneous.html' title='Authlogic: Restricting simultaneous sessions'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-5337255237399856006</id><published>2009-12-24T12:14:00.006-05:00</published><updated>2010-01-26T13:46:29.197-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><title type='text'>Switching Ruby platforms on Debian</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.debian.org/logos/openlogo-nd-50.png"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 50px; height: 61px;" src="http://www.debian.org/logos/openlogo-nd-50.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;My favorite Linux server distribution is &lt;a href="http://www.debian.org/"&gt;Debian&lt;/a&gt; and I use it whenever possible.  Its sane layout and APT system make working with it easy and fun.  I've also been doing quite a bit of &lt;a href="http://rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt; coding recently and I have grown to love the way it works and how easy it is to get massive amounts of work done.  The problems start when you try to use Ruby on Debian.  Sure, Debian tries to make things super easy to install and upgrade by using the APT package manager.  However, the Ruby community insist on using Gem as its package manager and the two don't work and play well together.&lt;br /&gt;&lt;br /&gt;I recently wanted to try out the latest Ruby and found that while you can install both Ruby 1.8 and Ruby 1.9.1 they don't use the Alternatives system built-in to Debian.  This means that the Ruby 1.8 executable is "hard-coded" into the system and even installing Ruby 1.9.1 doesn't change the default version that runs.&lt;br /&gt;&lt;br /&gt;One solution is to go through the system looking for links to the 1.8 stuff and change it to point to 1.9.1.  To do this manually is tedious, error prone, and not reproducible; wouldn't it be great if there was a way to make all these links automatically?  Enter the Debian alternatives system.  Thanks to a &lt;a href="http://groups.google.com/group/rails-oceania/msg/dc0f32bec9f49025"&gt;post by David Lee&lt;/a&gt; I had a starting point to get my system working the way I wanted it to.  His post was for Ubuntu and specifically targeted Ruby 1.9 so I've updated it a bit and laid out the steps below for your convenience.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Install the latest versions for Ruby1.8 and Ruby1.9.1&lt;br /&gt;&lt;pre name="code" class="brush:ruby"&gt;sudo aptitude install -s ruby1.8  riby1.9.1 irb1.8 irb1.9.1 ri1.8 ri1.9.1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Next we're going to configure the Alternatives system.  Create a new file on your system and copy this code into it.&lt;br /&gt;&lt;pre name="code" class="brush:ruby"&gt;# Filename: ruby-alternatives.sh&lt;br /&gt;# install ruby1.8 &amp;amp; friends with priority 500 and make them the default&lt;br /&gt;update-alternatives --install /usr/bin/ruby ruby /usr/bin/ruby1.8 500 \&lt;br /&gt;--slave   /usr/share/man/man1/ruby.1.gz ruby.1.gz \&lt;br /&gt;/usr/share/man/man1/ruby.1.8.gz \&lt;br /&gt;--slave   /usr/bin/ri ri /usr/bin/ri1.8 \&lt;br /&gt;--slave   /usr/bin/irb irb /usr/bin/irb1.8&lt;br /&gt;&lt;br /&gt;# install ruby1.9.1 &amp;amp; friends with priority 400&lt;br /&gt;update-alternatives --install /usr/bin/ruby ruby /usr/bin/ruby1.9.1 400 \&lt;br /&gt;--slave   /usr/share/man/man1/ruby.1.gz ruby.1.gz \&lt;br /&gt;/usr/share/man/man1/ruby.1.9.1.1.gz \&lt;br /&gt;--slave   /usr/bin/ri ri /usr/bin/ri1.9.1 \&lt;br /&gt;--slave   /usr/bin/irb irb /usr/bin/irb1.9.1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Now execute the script you just created to install your new configuration. You should see some messages go by but don't worry if it complains a little bit about the old 1.8 stuff not being there.&lt;br /&gt;&lt;pre name="code" class="brush:ruby"&gt;sh ruby-alternatives.sh&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You are now ready to alternate between Ruby installations on your Debian box.  Just run the command below whenever you want to switch between 1.8 and 1.9.1.&lt;br /&gt;&lt;pre name="code" class="brush:ruby"&gt;update-alternatives --config ruby&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;font-family:lucida grande;" &gt;NOTE: &lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;font-family:lucida grande;" &gt;These commands worked on my Debian Squeeze install. Your mileage may vary.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-5337255237399856006?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/5337255237399856006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2009/12/switching-ruby-platforms-on-debian.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/5337255237399856006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/5337255237399856006'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2009/12/switching-ruby-platforms-on-debian.html' title='Switching Ruby platforms on Debian'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-811473745958974319</id><published>2009-10-25T20:20:00.002-04:00</published><updated>2009-10-25T20:27:54.640-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Flash video player stutters and drops frames...</title><content type='html'>Why, oh why do Flash video players not work properly?  I mean, I'm on a reasonably powerful Mac Book Pro running the latest browsers and Flash plug-in and &lt;span style="font-weight: bold;"&gt;still&lt;/span&gt; YouTube videos are almost unwatchable (for reasons other than the content :).  Can no one save us from the horror that is Flash video?  Am I missing something somewhere that makes video smooth and watchable?  The audio works just fine but the video breaks and jumps like crazy.&lt;br /&gt;&lt;br /&gt;Its not a buffering issue, because no matter where I view it (home DLS, work T1) it still has the same performance.  I have also fully buffered the videos before viewing them and even that didn't help things.  Its also not a Mac problem as the same thing happens under Linux (no surprise) and Windows.&lt;br /&gt;&lt;br /&gt;I realize that HTML 5 has a video tag built-in, but I don't think I can wait that long.  :/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-811473745958974319?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/811473745958974319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2009/10/flash-video-player-stutters-and-drops.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/811473745958974319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/811473745958974319'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2009/10/flash-video-player-stutters-and-drops.html' title='Flash video player stutters and drops frames...'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-3477100761422601844</id><published>2009-10-20T09:24:00.003-04:00</published><updated>2009-10-20T09:49:25.298-04:00</updated><title type='text'>The International Council of Manlaws, Ltd.</title><content type='html'>I found this in an old email today and thought I would repost. :)&lt;br /&gt;&lt;hr width="75%"&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The International Council of Manlaws, Ltd.&lt;br /&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Under no circumstances may two men share an umbrella.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It is OK for a man to cry ONLY under the following circumstances:&lt;br /&gt;&lt;ol style="list-style-type: lower-alpha;"&gt;&lt;li&gt;When a heroic dog dies to save its master.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The moment Angelina Jolie starts unbuttoning her blouse.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;After wrecking your boss's car.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;When she is using her teeth.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Any man who brings a camera to a bachelor party may be legally killed and eaten by his buddies.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Unless he murdered someone in your family, you must bail a friend out of jail within 12 hours.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If you've known a man for more than 24 hours, his sister is off limits forever unless you actually marry her.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Moaning about the brand of free beer in a mate's fridge is forbidden. However complain at will if the temperature is unsuitable.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;No man shall ever be required to buy a birthday present for another man. In fact, even remembering your mate's birthday is strictly optional. At that point, you must celebrate at a strip bar of the birthday boy's choice.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;On a road trip, the strongest bladder determines pit stops, not the weakest.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;When stumbling upon other guys watching a sporting event, you may ask the score of the game in progress, but you may never ask who's playing.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You may flatulate in front of a woman only after you have brought her to climax. If you trap her head under the covers for the purpose of flatulent entertainment, she's officially your Girlfriend.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It is permissible to drink a fruity alcohol drink only when you're sunning on a tropical beach ... and it's delivered by a topless model ... and it's free.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Only in situations of moral and/or physical peril are you allowed to kick or punch another guy in the nuts.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Unless you're in prison, never fight naked.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Friends don't let friends wear Speedos. &lt;span style="font-style: italic;"&gt;Ever.&lt;/span&gt; Issue closed.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If a man's fly is down, that's his problem, you didn't see anything.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Women who claim they "love to watch sports" must be treated as spies until they demonstrate knowledge of the game and the ability to drink as much as the other sports watchers.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A man in the company of a hot, suggestively dressed woman must remain sober enough to fight.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Never hesitate to reach for the last beer or the last slice of pizza, but not both, that's just greedy.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If you compliment a man on his six-pack, you'd better be talking about his choice of beer.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Never join your girlfriend or wife in discussing a friend of yours, except if she's withholding sex pending your response.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Phrases that may NOT be uttered to another man while lifting weights:&lt;br /&gt;&lt;ol style="list-style-type: lower-alpha;"&gt;&lt;li&gt;Yeah, Baby, Push it!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;C'mon, give me one more! Harder!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Another set and we can hit the showers!&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Never talk to a man in a bathroom unless you are on equal footing: i.e., both urinating, both waiting in line, etc. For all other situations, an almost imperceptible nod is all the conversation you need.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Never allow a telephone conversation with a woman to go on longer than you are able to have sex with her. Keep a stopwatch by the phone. Hang up if necessary.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It is acceptable for you to drive her car. It is not acceptable for her to drive yours.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Thou shalt not buy a car in the colors of brown, pink, lime green, orange or sky blue.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The girl who replies to the question "What do you want for Christmas?" with "If you loved me, you'd know what I want!" gets an XBox 360. End of story.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;There is no reason for guys to watch Ice Skating or Men's Gymnastics. Ever.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;We've all heard about people having guts or balls. But do you really know the difference between them? In an effort to keep you informed, the definition of each is listed below:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;"GUTS"&lt;/dt&gt;&lt;dd&gt;is arriving home late after a night out with your mates, being assaulted by your wife with a broom, and having the guts to say, "are you still cleaning or are you flying somewhere?"&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;"BALLS"&lt;/dt&gt;&lt;dd&gt;is coming home late after a night out with you mates smelling of perfume and beer, lipstick on your collar, slapping your wife on the arse and having the balls to say, "You're next!"&lt;/dd&gt;&lt;/dl&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;address&gt;&lt;br /&gt;I hope this clears up any confusion, The International Council of Manlaws, Ltd&lt;br /&gt;&lt;/address&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-3477100761422601844?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/3477100761422601844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2009/10/international-council-of-manlaws-ltd.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/3477100761422601844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/3477100761422601844'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2009/10/international-council-of-manlaws-ltd.html' title='The International Council of Manlaws, Ltd.'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-8923395854246925857</id><published>2009-09-06T07:44:00.006-04:00</published><updated>2009-09-06T08:05:47.722-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hang'/><category scheme='http://www.blogger.com/atom/ns#' term='squeeze'/><category scheme='http://www.blogger.com/atom/ns#' term='dell'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='freeze'/><title type='text'>Debian Squeeze and an old Dell PE1650</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.debian.org"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 100px; height: 123px;" src="http://www.debian.org/logos/openlogo-100.png" alt="Debian logo" border="0" /&gt;&lt;/a&gt;I recently had to put Debian testing (Squeeze) on an old Dell PowerEdge 1650 server.  Here's a little tip to save you some time if your ever in the same situation: upgrade the BIOS first!&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Its kind of a long story but my original PE1650 was running BIOS A10 when it died due to memory slot failure.  So I borrowed a friend's unused PE1650 until I could get a "new" one on-site.  Well, the new one was even older than mine and was running BIOS A05.  I didn't think it was a big deal and installed Lenny (stable) and then upgraded to Squeeze (testing).  And then the problems began.  Let's just say that I spent a week of sleepless nights and frustrating days trying to figure out why the machine would just suddenly, and without any notice at all, freeze.  And it wasn't your normal hang either as there was no kernel panic messages, no messages in the syslog, not even anything on the console.&lt;br /&gt;&lt;br /&gt;I upgraded the BIOS to A11 (the latest available) and rebooted the machine; its been running now for almost 12 hours.  This post may be a little premature as I've thought the problem was solved several times before, but everything was pointing to a hardware failure and the BIOS qualifies as hardware in my book.  Regardless, I am still a little gun shy and will feel much better when it stays running for at least a whole day.  A week would be better.  :)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-8923395854246925857?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/8923395854246925857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2009/09/debian-squeeze-and-old-dell-pe1650.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/8923395854246925857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/8923395854246925857'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2009/09/debian-squeeze-and-old-dell-pe1650.html' title='Debian Squeeze and an old Dell PE1650'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-1530430503759222299</id><published>2009-08-23T10:32:00.008-04:00</published><updated>2009-08-23T11:10:34.902-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MynaStuff'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Amazon'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby-AAWS'/><category scheme='http://www.blogger.com/atom/ns#' term='AWS'/><title type='text'>Ruby-AAWS &amp; Rails</title><content type='html'>On August 15, 2009 Amazon begin requiring all calls to their AWS servers to be cryptographically signed.  This caused &lt;a href="http://mynastuff.com/"&gt;MynaStuff&lt;/a&gt;, our home inventory website, to gradually break and stop serving pages.  This post is to help me remember details about what I did this weekend and to help anyone else out who might be in the same boat.&lt;br /&gt;&lt;br /&gt;Because we use memcached on our servers the actual degradation of the service was quite slow and intermittent.  However it soon became clear that we had a major problem and after a few seconds of investigation I knew what I had to do.  We had built MynaStuff pretty quickly and had just thrown together a home grown connection to the AWS service.  It was time to either add crypto signing to our code or use someone elses code.  Never a big fan or build over buy I downloaded &lt;a href="http://www.caliban.org/ruby/ruby-aws/"&gt;Ruby-AAWS&lt;/a&gt; and started hacking.&lt;br /&gt;&lt;br /&gt;I can't say enough good things about Ruby-AAWS, it was easy to install and pretty easy to work with.  Even though it wasn't designed to work with Ruby on Rails everything went pretty smoothly until I tried to get the data out of the memcache.  The problem centered around how Ruby-AAWS builds classes on the fly to contain the data coming back from AWS.  The way it works is really slick, however Ruby doesn't like the virtual classes too much so AAWS has to provide a factory method (of sorts).  Just a simple call to Amazon::AWS::AWSObject.load() with the string that you retrieved from your memcache system and your good to go.  Or so I thought. &lt;br /&gt;&lt;br /&gt;It turns out that Ruby-AAWS depends on the marshal.load() method to throw an ArgumentError when it has a problem reading some data and Rails somehow changes that exception to something else.  So, no matter what I tried it always failed.  The good thing about Open Source code is the ability to find out exactly what is wrong and then fix it (for your system or for the whole world).  After changing the aws.rb file to check for any exception (i.e. Exception) the code worked again.  However, checking for any exception is like killing a fly with a sledgehammer and is not a good idea.  I am currently looking for the reason that the exception thrown by marshal.load() changed and how I can fix me code to accept this and deal with it.&lt;br /&gt;&lt;br /&gt;Anyway, here is the patch I submitted to the Ruby-AAWS author.  Happy hunting!&lt;br /&gt;&lt;br /&gt;&lt;pre name="code"&gt;&lt;br /&gt;*** aws.rb.ORIG 2009-08-22 14:44:39.000000000 -0400&lt;br /&gt;--- aws.rb 2009-08-22 14:44:51.000000000 -0400&lt;br /&gt;***************&lt;br /&gt;*** 230,236 ****&lt;br /&gt;        def AWSObject.load(io)&lt;br /&gt;   begin&lt;br /&gt;     Marshal.load( io )&lt;br /&gt;!  rescue ArgumentError =&gt; ex&lt;br /&gt;     m = ex.to_s.match( /Amazon::AWS::AWSObject::([^ ]+)/ )&lt;br /&gt;     const_set( m[1], Class.new( AWSObject ) )&lt;br /&gt;  &lt;br /&gt;--- 230,236 ----&lt;br /&gt;        def AWSObject.load(io)&lt;br /&gt;   begin&lt;br /&gt;     Marshal.load( io )&lt;br /&gt;!  rescue Exception =&gt; ex&lt;br /&gt;     m = ex.to_s.match( /Amazon::AWS::AWSObject::([^ ]+)/ )&lt;br /&gt;     const_set( m[1], Class.new( AWSObject ) )&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-1530430503759222299?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/1530430503759222299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2009/08/ruby-aaws-rails.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/1530430503759222299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/1530430503759222299'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2009/08/ruby-aaws-rails.html' title='Ruby-AAWS &amp; Rails'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-7022299109345350256</id><published>2009-07-23T09:28:00.009-04:00</published><updated>2010-01-26T13:47:14.122-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='logrotate'/><category scheme='http://www.blogger.com/atom/ns#' term='boxbackup'/><category scheme='http://www.blogger.com/atom/ns#' term='backup'/><category scheme='http://www.blogger.com/atom/ns#' term='postgresql'/><title type='text'>Backing up your database with logrotate</title><content type='html'>I use &lt;a href="http://www.boxbackup.org/"&gt;BoxBackup&lt;/a&gt; in lazy mode to back up my systems.  This works well for things like normal files and directories but not so well for databases.  I wanted to periodically dump my database to a file and then have BoxBackup come along and do its thing.  The only problem was how to name each backup file and how to clean up after so many backups had been done.  Since it runs in lazy mode I can't know ahead of time exactly when the backup will happen and which files it will backup.&lt;br /&gt;&lt;br /&gt;I looked at generating files with timestamps and then doing some calculations about cleaning up old files but that just seemed messy and I was sure that someone must have run into this type of situation before.  Then I thought about log files and how they are backed up.  It turns out the the standard Linux &lt;code&gt;logrotate&lt;/code&gt; command knows how to rename files and get rid of old ones automagically.  It even has script functionality that allows you to run commands before and after the rotate happens.  Sounds perfect.  Here's what I did.&lt;br /&gt;&lt;br /&gt;First I created a directory in my web apps directory to hold all the database information and backup files.  I'm using PostgreSQL, but you could do the same thing for MySQL or even Oracle.  Just change the names of the directories and commands to something more suitable for your environment.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush:shell"&gt;$ mkdir /var/www/postgres&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Next we have to create a status file for &lt;code&gt;logrotate&lt;/code&gt; to use.  Since we will be running this as a non-root user we don't want to pollute the system status file with our non-log database backup stuff.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush:shell"&gt;$ touch /var/www/postgres/logrotate.status&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;We also want to create a "fake" dump file so that &lt;code&gt;logrotate&lt;/code&gt; will have something to start working with.  If this file doesn't exist &lt;code&gt;logrotate&lt;/code&gt; will refuse to rotate it.  In this case we are backing up a Postgres database called "mydatabase".&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush:shell"&gt;$ touch /var/www/postgres/mydatabase.dump&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now we get to the heart of the matter; the logroate script itself.  This tells &lt;code&gt;logrotate&lt;/code&gt; to keep 10 copies of our dump but don't compress it and dont copy it.  It will also complain if there is no original file to backup and it will create a blank "dump" for next time.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush:shell"&gt;# /var/www/postgres/logrotate.pg_dump&lt;br /&gt;# Dump PostgreSQL databases and prepare them for backup&lt;br /&gt;/var/www/postgres/mydatabase.dump {&lt;br /&gt;rotate 10&lt;br /&gt;nomissingok&lt;br /&gt;create&lt;br /&gt;nocompress&lt;br /&gt;nocopy&lt;br /&gt;prerotate&lt;br /&gt;test -x /usr/bin/pg_dump || exit 0&lt;br /&gt;/usr/bin/pg_dump mydatabase -F c &gt; /var/www/postgres/mydatabase.dump&lt;br /&gt;endscript&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;One final step and we're done.  The &lt;code&gt;pg_dump&lt;/code&gt; command connects to the database as the user who runs it and the postgres user has access to all the databases by default (on Debian anyway).  So running the &lt;code&gt;logrotate&lt;/code&gt; command as the postgres user allows us to backup any database on the system without a password.  And in order to allow the postgres user access to our new setup we have to change the owner on the files in /var/www/postgres.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush:shell"&gt;$ chown -R postgres:postgres /var/www/postgres&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now, whenever you want to generate a new database dump just run the following command.  You can put this is a crontab or just run it by hand.  Remember to use the &lt;code&gt;-f&lt;/code&gt; flag to force the backup to happen. &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush:shell"&gt;$/usr/sbin/logrotate -f /var/www/postgres/logrotate.pg_dump -s /var/www/postgres/logrotate.status&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-7022299109345350256?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/7022299109345350256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2009/07/backing-up-your-database-with-logrotate.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/7022299109345350256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/7022299109345350256'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2009/07/backing-up-your-database-with-logrotate.html' title='Backing up your database with logrotate'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-2452602740293219848</id><published>2009-07-17T23:00:00.000-04:00</published><updated>2009-07-17T23:01:15.913-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='prawn'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='pdf'/><title type='text'>Generating PDFs in Rails using Prawn</title><content type='html'>In my current Rails projects (&lt;a href="http://github.com/rnhurt/gradesheet"&gt;Gradesheet&lt;/a&gt; &amp; &lt;a href="http://mynastuff.com"&gt;MynaStuff&lt;/a&gt;) I have the need to create reports as PDFs.  Prawn is a relatively new library that does just what I need in pure Ruby.  There are a couple of really good tutorials on how to integrate Prawn into your Rails project on the web but I wanted to do something a little different.  There's even a plugin (&lt;a href="http://www.cracklabs.com/prawnto"&gt;PrawnTo&lt;/a&gt;) that makes Prawn look like a native Rails construct and allows you build PDFs without leaving your views.  Neat!&lt;br /&gt;&lt;br /&gt;However, this is not really how I wanted to implement reporting in my applications.  So I created a directory in lib and filled it with self-contained reports.  In my view, this makes reports easier to build and maintain.  Let's get started.  First, you need a Rails project.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush:ruby"&gt;&lt;br /&gt;strutter$ rails HelloPrawn&lt;br /&gt;      create  &lt;br /&gt;      create  app/controllers&lt;br /&gt;       ...&lt;br /&gt;      create  log/server.log&lt;br /&gt;      create  log/production.log&lt;br /&gt;      create  log/development.log&lt;br /&gt;      create  log/test.log&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now, we need to get the Prawn &amp; Prawn-layout plugins.  Since they are pretty new and constantly changing I like to get the latest version straight from GitHub.  Just clone them in the usual way.  Note that you have to get a couple of subcollections when you get Prawn this way.&lt;br /&gt;&lt;pre name="code" class="brush:ruby"&gt;&lt;br /&gt;$cd vendor/plugins&lt;br /&gt;$git clone git://github.com/sandal/prawn.git&lt;br /&gt;Initialized empty Git repository in /Rails/HelloPrawn/vendor/plugins/prawn/.git/&lt;br /&gt;remote: Counting objects: 6716, done.&lt;br /&gt;remote: Compressing objects: 100% (2762/2762), done.&lt;br /&gt;Receiving objects:  21% (1459/6716), 6.31 MiB | 220 KiB/s     &lt;br /&gt;...&lt;br /&gt;$git clone git://github.com/sandal/prawn-layout.git&lt;br /&gt;Initialized empty Git repository in /Rails/HelloPrawn/vendor/plugins/prawn-layout/.git/&lt;br /&gt;remote: Counting objects: 271, done.&lt;br /&gt;remote: Compressing objects: 100% (232/232), done.&lt;br /&gt;remote: Total 271 (delta 111), reused 0 (delta 0)&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Since we are running Prawn from Git we have to do a couple of extra things.&lt;br /&gt;&lt;pre name="code" class="brush:ruby"&gt;&lt;br /&gt;$cd vendor/plugins/prawn&lt;br /&gt;$git submodule init&lt;br /&gt;Submodule 'vendor/pdf-inspector' (git://github.com/sandal/pdf-inspector.git) registered for path 'vendor/pdf-inspector'&lt;br /&gt;Submodule 'vendor/ttfunk' (git://github.com/sandal/ttfunk.git) registered for path 'vendor/ttfunk'&lt;br /&gt;$git submodule update&lt;br /&gt;Initialized empty Git repository in /Users/richardhurt/Rails/HelloPrawn/vendor/plugins/prawn/vendor/pdf-inspector/.git/&lt;br /&gt;remote: Counting objects: 16, done.&lt;br /&gt;remote: Compressing objects: 100% (14/14), done.&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now we have to tell Rails to load Prawn-layout as well as Prawn.  I do this with a simple initializer.&lt;br /&gt;&lt;pre name="code" class="brush:ruby"&gt;&lt;br /&gt;# config/initializers/prawn.rb&lt;br /&gt;require "prawn/core"&lt;br /&gt;require "prawn/layout"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Next we'll create a report.  First build a new directory to hold all your reports.&lt;br /&gt;&lt;pre name="code" class="brush:ruby"&gt;&lt;br /&gt;mkdir lib/reports&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then add this new path to your Rails load_path.  Look for the following section in you config/environment.rb file and make it look similar to this.&lt;br /&gt;&lt;pre name="code" class="brush:ruby"&gt;&lt;br /&gt;# Add additional load paths for your own custom dirs config.load_paths += %W({RAILS_ROOT}/extras )&lt;br /&gt;config.load_paths += %W( #{RAILS_ROOT}/lib/reports )&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and add a new PDF mime type.&lt;br /&gt;&lt;pre name="code" class="brush:ruby"&gt;&lt;br /&gt;#config/initializers/mime_types.rb &lt;br /&gt;Mime::Type.register_alias "application/pdf", :pdf&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now that most of the setup is out of the way we're ready to get to work.  Let's create a simple report and then show the controller that goes along with it.  This report doesn't do much but it shows the basics.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="brush:ruby"&gt;&lt;br /&gt;# lib/reports/hello_prawn.rb&lt;br /&gt;class HelloPrawn&lt;br /&gt;&lt;br /&gt;  # Build the parameter screen for this report.&lt;br /&gt;    def self.get_params()&lt;br /&gt;      # This report has no parameters&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;  # Build the report in PDF form and sent it to the users browser&lt;br /&gt;  def self.draw(params)&lt;br /&gt;    # Create a new document&lt;br /&gt;    pdf = Prawn::Document.new(:page =&gt; "LETTER")&lt;br /&gt;&lt;br /&gt;      # Make it so we don't have to use pdf. everywhere.  :)&lt;br /&gt;      pdf.instance_eval do&lt;br /&gt;        # Print something&lt;br /&gt;        text "Hello Prawn", :align =&gt; :center, :size =&gt; 20&lt;br /&gt;&lt;br /&gt;        # Render the page and send it back to the controller&lt;br /&gt;        render&lt;br /&gt;      end&lt;br /&gt;&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Finally we'll build a controller to either build the parameter screen or render the PDF itself.&lt;br /&gt;&lt;pre name="code" class="brush:ruby"&gt;&lt;br /&gt;class ReportsController &lt; ApplicationController&lt;br /&gt;  &lt;br /&gt;  def show&lt;br /&gt;    # Since we are building the report object on the fly we need to make sure&lt;br /&gt;    # that it is a valid report before we try to build/show it.&lt;br /&gt;    begin&lt;br /&gt;      # Try to make the report into an 'object'&lt;br /&gt;      @report = params[:id].classify.constantize&lt;br /&gt;    rescue NameError&lt;br /&gt;      # This is not a valid report or some other error happened&lt;br /&gt;      flash[:error] = "Unknown Report '#{params[:id]}'"&lt;br /&gt;      redirect_to :action =&gt; :index&lt;br /&gt;    else&lt;br /&gt;&lt;br /&gt;      respond_to do |format|&lt;br /&gt;        format.html  do&lt;br /&gt;          # display the parameters screen&lt;br /&gt;        end&lt;br /&gt;&lt;br /&gt;        format.pdf do&lt;br /&gt;          # Send the PDF back to the browser for viewing&lt;br /&gt;          send_data @report.draw(params),&lt;br /&gt;            :filename      =&gt; params[:id].titleize + '.pdf',&lt;br /&gt;            :type              =&gt; 'application/pdf',&lt;br /&gt;            :disposition  =&gt; 'inline'&lt;br /&gt;          end&lt;br /&gt;        end&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Lets test it out.  Start up your Rails server and go to &lt;a href="http://localhost:3000/reports/hello_prawn.pdf"&gt;http://localhost:3000/reports/hello_prawn.pdf&lt;/a&gt; and you should get an inline PDF report in return.  The cool thing about this is that each report can generate its own parameters screen on demand.  See that self.get_params() function up in the report?  That's where you can put your ERB stuff and have it render when you hit &lt;a href="http://localhost:3000/reports/hello_prawn"&gt;http://localhost:3000/reports/hello_prawn&lt;/a&gt;.  Neato!&lt;br /&gt;&lt;pre name="code" class="brush:ruby"&gt;&lt;br /&gt;  def self.get_params()&lt;br /&gt;    # Get the homeroom information&lt;br /&gt;    homerooms = Student.find_homerooms()&lt;br /&gt;                &lt;br /&gt;    # Build the parameter screen&lt;br /&gt;    params = &lt;&lt;-EOS&lt;br /&gt;&lt;br /&gt;        &lt;form action="/reports/student_roster.pdf" method="get"&gt;&lt;br /&gt;          &lt;fieldset&gt;&lt;br /&gt;            &lt;legend&gt;Student Roster&lt;/legend&gt;&lt;br /&gt;            &lt;br /&gt;                &lt;label&gt;Homeroom&lt;/label&gt;&lt;br /&gt;                        &lt;select name='homeroom'&gt;&lt;br /&gt;                                &lt;option value=''&gt;ALL&lt;/option&gt;&lt;br /&gt;EOS&lt;br /&gt;&lt;br /&gt;    # Add the homerooms&lt;br /&gt;    homerooms.each do |homeroom|&lt;br /&gt;      params += "&lt;option value='#{homeroom}'&gt;#{homeroom}&lt;/option&gt;"&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    params += &lt;&lt;-EOS&lt;br /&gt;                        &lt;/select&gt;&lt;br /&gt;                        &lt;br /&gt;                &lt;div class="spacer"&gt;&lt;br /&gt;                        &lt;input class="btn positive" type="submit" value="Run Report" /&gt;&lt;br /&gt;                &lt;/div&gt;&lt;br /&gt;                &lt;/fieldset&gt;&lt;br /&gt;        &lt;/form&gt;&lt;br /&gt;EOS&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-2452602740293219848?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/2452602740293219848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2009/07/generating-pdfs-in-rails-using-prawn.html#comment-form' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/2452602740293219848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/2452602740293219848'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2009/07/generating-pdfs-in-rails-using-prawn.html' title='Generating PDFs in Rails using Prawn'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-1206558530021967586</id><published>2009-05-21T05:09:00.008-04:00</published><updated>2009-05-21T14:57:47.907-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Palm Pre'/><title type='text'>Why would I give up my iPhone for a Palm Prē?</title><content type='html'>With the recent announcement that the &lt;a href="http://www.engadget.com/2009/05/19/palm-launching-pre-on-june-6th-official/"&gt;Palm Prē is going on sale June 6th&lt;/a&gt; for &lt;strike&gt;$300&lt;/strike&gt; $200, I am very excited and can't wait to try it in the store.  I currently own a 1st generation iPhone and I have to say that I have become disillusioned with it.  Sure it does some things really well (dialing a number from a map search) but other things are a complete disaster (integrating with online apps, ToDo lists).  I've realized that the iPhone is nothing but a computer accessory and it will always require a computer to be useful.  This is something that I don't really want or need right now.&lt;br /&gt;&lt;br /&gt;I want a portable computer in its own right; something that doesn't need a tether to a desktop to work.  The iPhone is completely dependent on its host system for important things like system updates.  This is where I really miss my T-Mobile Sidekick (aka Danger HipTop).  Everything it did was OTA (Over The Air); from system updates, to syncing.  Heck you could even lose your phone and not worry about your data because it was stored on the web!  It didn't do everything perfectly (the online web interface was atrocious) but it got close.&lt;br /&gt;&lt;br /&gt;Some features that I'm looking forward to on the Prē are OTA updates, online syncing, and background apps.  After using Google calendar quite a bit I've realized that it's much better than Apples iCal program.  Google makes it easier to have multiple calendars, share information with others, and generally navigate the system.  I also love to use SSH to manage my servers, but the iPhone makes this hard if not impossible because of the lack of background apps.  When I switch out of my SSH program to check an email, the iPhone closes the SSH app thus terminating my connection.  Not cool.&lt;br /&gt;&lt;br /&gt;One thing I wont miss on my iPhone is the music playing function.  For one, I already have an iPod that works really well as a music player.  But the biggest problem is that the iPhone makes a terrible iPod.  The original intent of the iPod was to make it very simple to listen to your music and the iPhone screws that up royally.  Its very confusing to control the music playing in the background while at the same time switching between other applications.  For some reason I can't seem to do it.  And forget about playing online music while doing something else (see the part about background apps).  I was really looking forward to Pandora Radio or Last.Fm on my iPhone when it was first announced only to be disappointed.&lt;br /&gt;&lt;br /&gt;I'm not saying that the Palm Prē will be the end all be all system for me.  Its not even been released yet.   But I think it will come close and I am looking forward to giving it a shot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-1206558530021967586?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/1206558530021967586/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2009/05/why-im-giving-up-my-iphone-for-palm-pre.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/1206558530021967586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/1206558530021967586'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2009/05/why-im-giving-up-my-iphone-for-palm-pre.html' title='Why would I give up my iPhone for a Palm Prē?'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-3189697800699061337</id><published>2009-03-16T09:58:00.006-04:00</published><updated>2009-03-16T10:40:41.714-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Palm Pre'/><title type='text'>8 iPhone Faults &amp; Missing Features</title><content type='html'>I've compiled a list of things I think the iPhone fails at but could be easily corrected.  "Easily" in this case means no hardware fixes, just software updates.  Most of these complaints are things that I haven't read about elsewhere on the 'net so I thought I would bring them to light and see who else was also having these problems.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Speed - Switching between applications is painful, waiting on an application to load before using it is painful, even using some of the applications is painful.  And I'm not talking about 3rd party non Apply apps either, this is happening in the contact list.  Just opening up the contact list and trying to search for a particular person takes 5-7 seconds before the keyboard responds.  Opening up the Maps application has a similar lag and causes me to miss-type quite a lot.  Come on Apple, can't you get some speed in your apps?!  Hell, the iPhone can run 3D games but it can't let you search a simple contact list without stuttering all over itself?  Bah!  &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Global search - Speaking of searching stuff, why can't I search for something anywhere on my iPhone?  What do I do if I want to find a bookmark or something in my Notes?  This is very frustrating and should be an easy fix.&lt;/li&gt;&lt;li&gt;Free rotation everywhere! - Ok, this one really gets my goat.  How come I can rotate my web pages in any direction but email doesn't rotate at all?  And YouTube only rotates on one specific side but wont rotate to the other side?  I tend to hold my phone with the home button on the left side.  This gives me easy access to the volume and mute controls.  But whenever I open a YouTube video it's upside down and I'm forced to physically rotate my phone 180°.  Photos can be viewed from any angle, but my calendar is stuck in portrait mode.  This makes no sense at all! &lt;br /&gt;&lt;/li&gt;&lt;li&gt;To-Do List - What smartphone on the market doesn't have a to-do list?  Oh sure, we have a Notes application but its not quite the same and it doesn't even sync with my computer!  I know there are hundreds of to-do apps in the iTunes store but they don't sync with my computer either or are not very convenient or pretty.  Oh and the iPhone Notes application doesn't rotate either.  How nice.  :P&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Recent Call info - This one has just hit me pretty recently when I was trying to find out when my wife had called the day before.  The only time the iPhone displays the exact time of a call is on the day of that call.  After 24 hours or so it switches into fuzzy logic mode and says things like "Yesterday" and "Friday" or "3/3/08" and there is &lt;span style="font-weight: bold;"&gt;no&lt;/span&gt; way to get an exact time of an old call.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Safari stability - Web browser stability has gotten better lately but its still way to unstable.  I can almost always crash it with a large page (say, a heated Slashdot discussion) or something with a lot of graphics.  Sometimes its really bad and crashes after the page is fully loaded and I'm in the middle of reading the content.  Like I said, its getting better, but I still experience at least one Safari crash a day and a couple of times in the recent past it's crashed so hard that I had to cold boot my iPhone.  That's bad.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Bluetooth_profile#Advanced_Audio_Distribution_Profile_.28A2DP.29"&gt;A2DP&lt;/a&gt; - Ok, is the iPhone an iPod or not?  If it is then you would think that they would make listening to music a priority.  Why O' why can we not listen to music on our Bluetooth headsets?!  For all its hype you would think that the iPhone would make listening to music easy and enjoyable.  Not so.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Bluetooth tethering, Cut &amp;amp; Paste, Flash, and more - these are all the old saws that have been floating around the 'net since the iPhone's launch and I just wanted to give a nod to them.  Lately I have seen the need for tethering and how it could have saved me quite a lot of trouble.  Lack of Cut &amp;amp; Paste is unacceptable and might be one of the things that drive me to pick up a Palm Pre.  And it goes without saying that the missing Flash capability in the browser is a major problem.  Fortunately, the word on the street is that the upcoming iPhone 3.0 update will take care of some of these things.  We'll see...&lt;/li&gt;&lt;/ol&gt;These things are all pretty minor annoyances but they do keep me from enjoying my iPhone completely and make me think back to my Danger Sidekick with envy.  Sure it didn't have YouTube videos and other bits and bobs, but it got the basics right and never slowed me down.  Taken together, all these little things are making me look around for other devices that might be better and it looks like Palm might just have what I need in the Pre device.  Let's hope Palm doesn't screw it up.  :/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-3189697800699061337?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/3189697800699061337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2009/03/8-iphone-faults-missing-features.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/3189697800699061337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/3189697800699061337'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2009/03/8-iphone-faults-missing-features.html' title='8 iPhone Faults &amp; Missing Features'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-2252578186858725966</id><published>2008-12-09T03:46:00.003-05:00</published><updated>2008-12-09T04:01:41.422-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network'/><category scheme='http://www.blogger.com/atom/ns#' term='T1'/><category scheme='http://www.blogger.com/atom/ns#' term='monitoring'/><title type='text'>External Monitoring</title><content type='html'>I have been trying to do a little external monitoring and statistics for the KangarooBox main website, but haven't had much luck.  Basically, my T1 has been giving me problems as of late and I would like to have some numbers to go along with my "feeling" that it is sometimes slow and/or dropping packets. &lt;br /&gt;&lt;br /&gt;I started off trying to use &lt;a href="http://basicstate.com"&gt;BasicState&lt;/a&gt; but quickly realized that they are having problems of their own.  I get multiple emails per day telling me that they were a target of a DDOS attack several weeks ago and that they are working on fixing it.  And the reports they send out are fairly useless with not much data and only a few vague numbers to hint at a possible problem.  So I tried to un-register, but that didn't go anywhere.  I still received many emails per day.  I just now tried to un-register again.  We'll see how it goes.  :/&lt;br /&gt;&lt;br /&gt;I'm currently evaluating &lt;a href="http://www.easysitecheck.com"&gt;EasySiteCheck&lt;/a&gt; but so far I'm not impressed.  I haven't gotten much/any SPAM from them but neither have I gotten much value.  Their statistics are very minimal and basically just show if your site is online or not.  They check every 15 minutes, so they are quick to find out if your site is having problems, but the data to allow you to diagnose the problem is just not there.&lt;br /&gt;&lt;br /&gt;Maybe I'm going about this the wrong way.  I have an internal monitoring system using &lt;a href="http://www.zabbix.org"&gt;Zabbix&lt;/a&gt; and I'm pretty happy with it, but it can't really monitor the web site as it looks from the outside.  And if our T1 is having problems, I'll want some hard numbers to go into the trouble ticket.  Does anyone have any suggestions?  What would you do?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-2252578186858725966?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/2252578186858725966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/12/external-monitoring.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/2252578186858725966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/2252578186858725966'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/12/external-monitoring.html' title='External Monitoring'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-4288757910715794619</id><published>2008-12-05T15:56:00.002-05:00</published><updated>2008-12-05T16:09:03.096-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='GradeSheet'/><title type='text'>More Rails action</title><content type='html'>I've been working on getting my routes right the past couple of days and I'm happy to report that its working, as far as I can tell.  Our new application, &lt;a href="http://github.com/rnhurt/gradesheet/tree/master"&gt;GradeSheet&lt;/a&gt;, is an online grade management system for the education system.  Teachers, students, and eventually parents will be able to log into the system and get an ongoing glimpse into their grades.&lt;br /&gt;&lt;br /&gt;One of the early problems I'm having is how to arrange the pages in the site.  Since teachers &amp;amp; students are both types of users I wanted them to be represented in some similar manner.  I finally ended up using a users/+ pattern to reference them.  &lt;code&gt;users/students&lt;/code&gt; would allow you to work with students while &lt;code&gt;users/teachers&lt;/code&gt; would allow you to work with teacher information.  This should allow the system to grow into different types of users without much hassle but still allow a unique controller for each user type.  That way you can tune a specific user type to do different things (i.e. Students have a &lt;code&gt;Class Of&lt;/code&gt; attribute).&lt;br /&gt;&lt;br /&gt;I have to give thanks to IRC user rolfb on the &lt;a href="irc://#rubyonrails"&gt;#rubyonrails&lt;/a&gt; channel on &lt;a href="http://freenode.net/"&gt;Freenode&lt;/a&gt; for all his help.  He led me down the road to using route namespaces and made it all possible.  He also stuck with me though many of my stupid questions and patiently helped me work through it.  Thanks again, rolfb!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-4288757910715794619?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/4288757910715794619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/12/more-rails-action.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/4288757910715794619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/4288757910715794619'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/12/more-rails-action.html' title='More Rails action'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-931738106183813145</id><published>2008-11-19T06:05:00.002-05:00</published><updated>2008-11-19T06:18:29.690-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='railroad'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Rails Headaches</title><content type='html'>Our new project is written in Ruby on Rails.  This is the first time that I've been able to get down and dirty with a real Rails project and I have to say that it has its ups and downs.  The upside is that I really like the way it 'feels'.  There is something about pretty code that is satisfying to an old programmer.  When I'm stuck on something that doesn't work for some reason I get that "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;AhHa&lt;/span&gt;" moment when it finally clicks.  I like that.&lt;br /&gt;&lt;br /&gt;The downside is that when it fails it fails badly.  One example is the pluralization support (requirement ?) in Ruby.  Using the name "Campus" for one of my models caused all sorts of problems down the road.  It turns out that Ruby doesn't properly pluralize Campus as Campuses and just uses the root word for everything.  This obviously isn't the Rails way to do things so I forced it to use the proper pluralization in the Model.  While I got it working in Rails proper other things didn't like it.  &lt;a href="http://railroad.rubyforge.org/"&gt;Railroad&lt;/a&gt;, a great little tool to check your models, puked all over the place looking for a table called Campus.  Inserting test data using fixtures failed in weird places too.  After too much hair pulling and cursing I had to rename it to something more suitable to Rails. &lt;br /&gt;&lt;br /&gt;I like Rails &amp;amp; Ruby but this something that should be handled more gracefully.  A language should not arbitrarily drive the design of a system.  Or at least there should be a way to localize plurality settings.  :/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-931738106183813145?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/931738106183813145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/11/rails-headaches.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/931738106183813145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/931738106183813145'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/11/rails-headaches.html' title='Rails Headaches'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-3360803006713470266</id><published>2008-10-23T07:40:00.004-04:00</published><updated>2008-10-23T07:55:23.558-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ComputerWorld'/><category scheme='http://www.blogger.com/atom/ns#' term='Economics'/><category scheme='http://www.blogger.com/atom/ns#' term='RedHat'/><title type='text'>Getting better every day</title><content type='html'>I know that a lot of people are worried about the recent economic downturn but I think that it will make Open Source an even stronger force in the business world.  And it appears as though Jim Whitehurst the President and CEO of &lt;a href="http://www.redhat.com"&gt;RedHat&lt;/a&gt; agrees.  In &lt;a href="http://www.computerworld.com.au/index.php/id;1780559326;fp;16;fpid;1"&gt;this ComputerWorld article&lt;/a&gt; he says that companies are looking to save money and OSS is in the right place at the right time.  If you want more in-depth coverage of the situation, check out the &lt;a href="http://slashdot.org"&gt;Slashdot&lt;/a&gt; &lt;a href="http://linux.slashdot.org/article.pl?sid=08/10/21/0116221"&gt;article&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One of the goals of my company is to get great software to those who need it most, and I think business are in real need of a solution that fits their needs and their budgets.  Appliance based computing reduces costs even further by reducing complexity in your data center.  Now you don't even have to install or maintain the software; just purchase the appliance and plug it in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-3360803006713470266?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/3360803006713470266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/10/getting-better-every-day.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/3360803006713470266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/3360803006713470266'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/10/getting-better-every-day.html' title='Getting better every day'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-9005186278934082720</id><published>2008-10-22T11:12:00.002-04:00</published><updated>2008-10-22T11:21:53.915-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LinuxFest'/><category scheme='http://www.blogger.com/atom/ns#' term='Ohio'/><title type='text'>Me @ OLF '08</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt;&lt;a href="http://www.flickr.com/photos/kudzu13/2936706556/" title="photo sharing"&gt;&lt;img src="http://farm4.static.flickr.com/3057/2936706556_49743971a8_m.jpg" alt="" style="border: 2px solid rgb(0, 0, 0);" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="margin-top: 0px;font-size:0.9em;" &gt;&lt;a href="http://www.flickr.com/photos/kudzu13/2936706556/"&gt;OLF2008_096&lt;/a&gt;&lt;br /&gt;Originally uploaded by &lt;a href="http://www.flickr.com/people/kudzu13/"&gt;kudzu13&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;Just a small picture of me winning a book (DoJo) from the guys over at the &lt;a href="http://tllts.org/wiki/index.php"&gt;Linux Link Talk Show&lt;/a&gt;.  We had a great time and I'm really looking forward to next year.&lt;br /&gt;&lt;br /&gt;&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt;&lt;a href="http://www.flickr.com/photos/kudzu13/2936710102/" title="photo sharing"&gt;&lt;img src="http://farm4.static.flickr.com/3035/2936710102_8fd0ea71e4_m.jpg" alt="" style="border: 2px solid rgb(0, 0, 0);" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="margin-top: 0px;font-size:0.9em;" &gt;&lt;a href="http://www.flickr.com/photos/kudzu13/2936710102/"&gt;OLF2008_094&lt;/a&gt;&lt;br /&gt;Originally uploaded by &lt;a href="http://www.flickr.com/people/kudzu13/"&gt;kudzu13&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;And this guy is wearing a KangarooBox T-Shirt.  I know, your jealous.&lt;br /&gt;&lt;br /&gt;Rock On!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-9005186278934082720?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/9005186278934082720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/10/me-olf.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/9005186278934082720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/9005186278934082720'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/10/me-olf.html' title='Me @ OLF &amp;#39;08'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3057/2936706556_49743971a8_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-3856935686812585087</id><published>2008-10-09T11:08:00.003-04:00</published><updated>2008-10-09T11:17:22.682-04:00</updated><title type='text'>Is there a SO?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_JBRPU8rTHVQ/SO4epu7QBvI/AAAAAAAABfM/O-KplU6s13Q/s1600-h/IMG_0439.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_JBRPU8rTHVQ/SO4epu7QBvI/AAAAAAAABfM/O-KplU6s13Q/s200/IMG_0439.JPG" alt="" id="BLOGGER_PHOTO_ID_5255171517507962610" border="0" /&gt;&lt;/a&gt;OK, here you can see my Wall 'O Cans.  I'm just wondering, do you think I drink too much soda for one person?  Remember, this wall is about 6 months old and is two rows deep.  And I only work on it when I'm at the office (which is most days, but not all day long).&lt;br /&gt;&lt;br /&gt;Do I have a problem?  Should I visit SA (Soda Anonymous)?  If you think that is a lot of cans, you should see my &lt;a href="http://www.altoids.com/index.do"&gt;Altoids&lt;/a&gt; collection.  Whew!!&lt;br /&gt;&lt;br /&gt;EDIT: I really wish that Mountain Dew &lt;a href="http://www.youtube.com/watch?v=uO-J5ImDEi8"&gt;Game Fuel&lt;/a&gt; was still being made.  That soda &lt;a href="http://www.energyfiend.com/2007/04/halo-3-mountain-dew-game-fuel"&gt;rocked&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-3856935686812585087?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/3856935686812585087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/10/ok-here-you-can-see-my-wall-o-cans.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/3856935686812585087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/3856935686812585087'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/10/ok-here-you-can-see-my-wall-o-cans.html' title='Is there a SO?'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_JBRPU8rTHVQ/SO4epu7QBvI/AAAAAAAABfM/O-KplU6s13Q/s72-c/IMG_0439.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-470135556782598023</id><published>2008-10-06T09:35:00.003-04:00</published><updated>2008-10-09T11:18:56.715-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='event'/><category scheme='http://www.blogger.com/atom/ns#' term='party'/><category scheme='http://www.blogger.com/atom/ns#' term='LinuxFest'/><category scheme='http://www.blogger.com/atom/ns#' term='Ohio'/><title type='text'>Ohio LinuxFest 2008!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.ohiolinux.org/"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px;" src="http://www.ohiolinux.org/files/images/olf2008-button.png" title="The sixth annual Ohio LinuxFest will be on October 10 - 11, 2008 at the Greater Columbus Convention Center, in downtown Columbus, Ohio. " border="0" /&gt;&lt;/a&gt;Great news!  KangarooBox is sponsoring the Pre-Event Party for the &lt;a href="http://ohiolinux.org/" title="The sixth annual Ohio LinuxFest will be on October 10 - 11, 2008 at the Greater Columbus Convention Center, in downtown Columbus, Ohio. "&gt;Ohio LinuxFest&lt;/a&gt; and we're giving away free T-Shirts to commemorate the event.  Come on down to &lt;a href="http://www.barleysbrewing.com/downtown/index.htm"&gt;Barley's Brewing Companay&lt;/a&gt; and say "hi!"&lt;br /&gt;&lt;br /&gt;I'm really looking forward to meeting with all the folks there and can't wait to here some of the speakers.  With talks on Xen, iSCSI, Drupal, and Robotics whats not to love?  Jon "maddog" Hall is going to give a talk on Sustainable Computing.  I'm guessing that it will be standing room only.&lt;br /&gt;&lt;br /&gt;See ya there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-470135556782598023?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/470135556782598023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/10/great-news-kangaroobox-is-sponsoring.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/470135556782598023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/470135556782598023'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/10/great-news-kangaroobox-is-sponsoring.html' title='Ohio LinuxFest 2008!'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-50832336292648800</id><published>2008-10-01T11:52:00.012-04:00</published><updated>2008-10-01T12:05:44.940-04:00</updated><title type='text'>StartupNation Contest</title><content type='html'>&lt;div style="padding-right:10px; float:left"&gt;&lt;script type="text/javascript" src="http://widgets.clearspring.com/o/48ae40ef14fda2f6/48e39db829da51cc/48ae42c3b169f53b/2ee8fa9d/-cpid/5fa183a986fee8fa/widget.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Well, KangarooBox has entered the StartupNation contest to find the top 100 home based businesses.  While we're technically not "home" based we are small enough to squeeze in under the radar.  I think.  :)  Anyway, if you not doing anything right now, give us a vote.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-50832336292648800?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/50832336292648800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/10/startupnation-contest.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/50832336292648800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/50832336292648800'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/10/startupnation-contest.html' title='StartupNation Contest'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-6409040337671532859</id><published>2008-10-01T05:12:00.002-04:00</published><updated>2008-10-01T05:32:34.870-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Screencast'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='Blip.tv'/><title type='text'>Posting Screencasts to Blip.tv</title><content type='html'>&lt;center&gt;               &lt;script type="text/javascript" src="http://blip.tv/scripts/pokkariPlayer.js?ver=2008010901"&gt;&lt;/script&gt;     &lt;script type="text/javascript" src="http://blip.tv/syndication/write_player?skin=js&amp;amp;posts_id=1317377&amp;amp;source=3&amp;amp;autoplay=true&amp;amp;file_type=flv&amp;amp;player_width=&amp;amp;player_height="&gt;&lt;/script&gt;     &lt;div id="blip_movie_content_1317377"&gt;     &lt;a rel="enclosure" href="http://blip.tv/file/get/KangarooBox-iShowUCaptureDemo710.mov" onclick="play_blip_movie_1317377(); return false;"&gt;&lt;img alt="Video thumbnail. Click to play" src="http://blip.tv/file/get/KangarooBox-iShowUCaptureDemo710.mov.jpg" title="Click to play" border="0" /&gt;&lt;/a&gt;     &lt;br /&gt;     &lt;a rel="enclosure" href="http://blip.tv/file/get/KangarooBox-iShowUCaptureDemo710.mov" onclick="play_blip_movie_1317377(); return false;"&gt;Click to Play&lt;/a&gt;     &lt;/div&gt;          &lt;/center&gt;&lt;br /&gt;As you can tell from the above movie, I've been experimenting with video tutorials.  My thinking is that its much easier and more informative to watch a quick video on how to do something than it is to print it out and read it.  What would normally take 10 pages of text and several screenshots can be done in a quick 30 second video.  Would you rather read 10 pages of text or watch a bit of video?&lt;br /&gt;&lt;br /&gt;I looked at posting my videos to YouTube but didn't really like the results.  They were very grainy and hard to see.  So I looked at some of the other video screencasts around and found that several of them use &lt;a href="http://kangaroobox.blip.tv"&gt;Blip.tv&lt;/a&gt;.  I signed up and gave it a shot and so far, I really like them.  They have tools to auto post to Blogger (again, see above), push your content to iTunes, and even show advertisements to generate revenue.  I'm not going to show ads for my content but the rest of the tools work really well.  The thing I like best though, is the video conversion.  Its very easy to use and produces a very high quality movie.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-6409040337671532859?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/6409040337671532859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/10/ishowu-capture-demo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/6409040337671532859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/6409040337671532859'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/10/ishowu-capture-demo.html' title='Posting Screencasts to Blip.tv'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-5727988482785239086</id><published>2008-09-23T04:47:00.007-04:00</published><updated>2008-09-23T05:54:31.115-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='appliances'/><category scheme='http://www.blogger.com/atom/ns#' term='hosted software'/><category scheme='http://www.blogger.com/atom/ns#' term='inhouse'/><title type='text'>Appliances vs Hosting vs In-House</title><content type='html'>I'll be honest, &lt;a href="http://www.KangarooBox.com"&gt;my company&lt;/a&gt; is in the appliance based computing market and this post is heavily influenced by that.  There are certain advantages and disadvantages to the different types of computing that are available to the business customer today.  Traditionally In-House computing was the only game in town.  You have to purchase your own hardware, install all the software (operating system, database, application, etc.), maintain it, update it, provide disaster recovery, etc.  And on top of all of that you had to figure out how many licenses you needed and keep the &lt;a href="http://en.wikipedia.org/wiki/Software_and_Information_Industry_Association"&gt;SIIA hounds&lt;/a&gt; at bay.  It was a huge hassle.&lt;br /&gt;&lt;br /&gt;Then web based computing came on the scene and hosted software was born.  This solved a great many problems with in-house computing.  You didn't have to worry about installing the software, buying hardware, updating the system, or anything.  Umm... sorta.  There were a couple of things that worried quite a few people with availability being the topmost concern.  If your connection to the Hosted software vendor goes down you can't work.  Period.  Now Google and a few other companies are working on this problem by providing local browser based caching and database solutions but they are not very wide spread.  Another concern is what happens to your data if/when the vendor goes out of business or stops providing the application you use.  In the in-house software days you merely didn't get updates anymore and the software slowly bit-rotted away.  When your application is hosted you are completely at the vendors mercy.  If they decide to close up shop you have no choice but to move to another solution.&lt;br /&gt;&lt;br /&gt;Then there is Appliance based computing.  For those of you who don't know, appliances are self contained boxes with pre-installed software that are installed inside your company.  One of the big advantages over in-house solutions is that they are almost as simple to install and get running as hosted software.  You just purchase the appliance you need, unpack it, and plug it in.  Kinda like your toaster or refrigerator, hence the name Appliance.  Another benefit is the fact that your data stays inside your walls and is not hosted on some unknown system, with some unknown security.  You know where it is and can limit physical and network access to it according to your policies.&lt;br /&gt;&lt;br /&gt;KangarooBox goes above and beyond most appliance vendors in several areas.  Firstly, since we base all of our solutions on &lt;a href="http://en.wikipedia.org/wiki/Open_source_software"&gt;OSS&lt;/a&gt; (Open Source Software) we have unlimited licensing, and that means that you don't have to worry about how many users are on the system or if the SIIA are going to be knocking on your door.  We also have a customer safety net so that you can continue using your appliance even if something happens to us.  If, by some unfortunate event, we no can longer support your appliance the SSH keys will be given up to you so that you can support the system yourself or at least retrieve your data.&lt;br /&gt;&lt;br /&gt;All of these options are viable and you have to make the best choice depending on your situation.  In-House still makes sense for completely custom solutions or business critical applications.  However, with the current state of the economy a lot of companies are looking for ways to simplify their systems and reduce staff.  Hosted applications allow you to expand your software operations without increasing headcount.  Appliance based computing goes even further by keeping it inside your walls while at the same time making it easier to manage.  What are you going to choose for your next project?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-5727988482785239086?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/5727988482785239086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/09/appliances-vs-hosting-vs-in-house.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/5727988482785239086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/5727988482785239086'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/09/appliances-vs-hosting-vs-in-house.html' title='Appliances vs Hosting vs In-House'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-6730050699469160950</id><published>2008-09-12T10:43:00.004-04:00</published><updated>2008-09-12T10:54:33.961-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dropbox'/><category scheme='http://www.blogger.com/atom/ns#' term='Web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Dropbox FTW!</title><content type='html'>I have been playing with &lt;a href="http://www.getdropbox.com"&gt;Dropbox&lt;/a&gt; this morning and I have to say that it is &lt;span style="font-weight: bold;"&gt;nice&lt;/span&gt;.  There have been other products and other ways of syncing data on multiple computers but they have never been as slick and easy to use as this.  I'm thinking that Dropbox might even pass the Mother test (can my Mother install and use it?); which is saying a lot (hi Mom).&lt;br /&gt;&lt;br /&gt;Just visit the Dropbox site, register for a FREE account, and download and install the software.  When alls said and done you have a new "Dropbox" folder on your computer and anything you put in it is automatically copied to all of the other computers that you have installed DropBox on.  And anytime you change a file or delete something or move something the change is duplicated everywhere else.  Simple!  It even works between platforms - I'm running it on Mac OS X and Ubuntu right now without any issues.&lt;br /&gt;&lt;br /&gt;Now for the downside.  Although they are encrypting everything and storing it on &lt;a href="http://aws.amazon.com/s3"&gt;Amazon's S3&lt;/a&gt; service I wouldn't go putting sensitive material in your Dropbox if I were you.  Dropbox is great for your Mom's "secret" pot roast recipe but not the &lt;a href="http://en.wikipedia.org/wiki/Kentucky_Fried_Chicken#History"&gt;Colonel's 11 herbs and spices&lt;/a&gt;.  It's highly unlikely that someone would care about your stuff and even if they did it would be tough to get to it, but why take the chance?  Actually this advice doesn't just apply to Dropbox - if you don't want people to see your sensitive stuff, dont put it on the 'net.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-6730050699469160950?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/6730050699469160950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/09/dropbox-ftw.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/6730050699469160950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/6730050699469160950'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/09/dropbox-ftw.html' title='Dropbox FTW!'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-286782366227069037</id><published>2008-09-10T11:44:00.008-04:00</published><updated>2008-09-10T11:52:35.179-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='email'/><category scheme='http://www.blogger.com/atom/ns#' term='NewEgg'/><category scheme='http://www.blogger.com/atom/ns#' term='Gmail'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>NewEgg steps up to the plate</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JBRPU8rTHVQ/SMfsaSsdcgI/AAAAAAAABNc/EFPMnXCrGeY/s1600-h/NewEgg+apologizes.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://4.bp.blogspot.com/_JBRPU8rTHVQ/SMfsaSsdcgI/AAAAAAAABNc/EFPMnXCrGeY/s200/NewEgg+apologizes.png" alt="" id="BLOGGER_PHOTO_ID_5244420227535303170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This is a followup to my &lt;a href="http://kangaroobox.blogspot.com/2008/09/firefox-gmail-dialog-box-deluge.html"&gt;previous post&lt;/a&gt; talking about a never ending loop I got caught up in with NewEgg, Gmail, and Firefox.  It looks like NewEgg realized it had a problem, informed its customers about it, and is working to prevent it from happening again.&lt;br /&gt;&lt;br /&gt;I would like to thank NewEgg for going out of their way to communicate a problem they were having with their customers.  This goes a long way with me toward showing me that they are a good company and that I should continue to utilize them.  I purchase quite a lot from them and am happy with the way they have dealt with this minor situation.&lt;br /&gt;&lt;br /&gt;Here is the text of their apology:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif; font-size: 20px; font-weight: bold;"&gt;Dear e-Blast Subscriber,&lt;/span&gt;&lt;br /&gt;     &lt;br /&gt;       &lt;span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 12px;"&gt;We apologize to those of you who experienced some technical difficulties when trying to open today's edition of the Newegg e-Blast Newsletter. One of our servers was temporarily down, causing the e-Blast to display incorrectly for some recipients.&lt;br /&gt;     &lt;br /&gt;The e-Blast is now running correctly again, and we would like to reassure you that this was a purely internal technical issue—none of your private information has been accessed or leaked outside our secure network. We take our customers’ privacy very seriously and have run a thorough check to ensure that your personal data has not in any way been compromised, so please rest assured.&lt;br /&gt;     &lt;br /&gt;This morning’s temporary server failure is an extremely rare occurrence at Newegg and we are putting additional measures in place to ensure a similar problem will not occur again. We apologize for the inconvenience this morning’s technical difficulties may have caused you and thank you for your understanding and patience with the situation.&lt;br /&gt;    &lt;br /&gt;     Sincerely,      &lt;br /&gt;     &lt;br /&gt;      The Newegg e-Blast Team &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-286782366227069037?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/286782366227069037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/09/newegg-steps-up-to-plate.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/286782366227069037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/286782366227069037'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/09/newegg-steps-up-to-plate.html' title='NewEgg steps up to the plate'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_JBRPU8rTHVQ/SMfsaSsdcgI/AAAAAAAABNc/EFPMnXCrGeY/s72-c/NewEgg+apologizes.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-1255084162556480061</id><published>2008-09-09T08:22:00.008-04:00</published><updated>2008-09-10T11:53:07.363-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='email'/><category scheme='http://www.blogger.com/atom/ns#' term='NewEgg'/><category scheme='http://www.blogger.com/atom/ns#' term='Gmail'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Firefox &amp; Gmail Dialog Box Deluge</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JBRPU8rTHVQ/SMZuPcBXlCI/AAAAAAAABM8/zZXkilT4ZR0/s1600-h/NewEgg.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_JBRPU8rTHVQ/SMZuPcBXlCI/AAAAAAAABM8/zZXkilT4ZR0/s200/NewEgg.png" alt="" id="BLOGGER_PHOTO_ID_5244000027618546722" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;UPDATE: It looks like NewEgg &lt;a href="http://kangaroobox.blogspot.com/2008/09/newegg-steps-up-to-plate.html"&gt;realized&lt;/a&gt; its mistake and is fixing it.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Well, this is a new one on me.  &lt;a href="http://www.getfirefox.com/"&gt;Firefox&lt;/a&gt; and &lt;a href="http://www.gmail.com/"&gt;Gmail&lt;/a&gt; are fighting over a message from &lt;a href="http://www.newegg.com/"&gt;NewEgg&lt;/a&gt;.  Apparently, someone at NewEgg decided that you needed to enter a username &amp;amp; password to view some portion of their new email advertisement.  So when it landed in my Gmail inbox I opened it, just to get the lowdown on their "Last Chance for Back-to-School Bargains" - hey I might get a free flash drive or something.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That was a mistake.  Firefox decided to throw up an endless barrage of "Authentication Required" dialog boxes asking for a username &amp;amp; password that I don't have.  OK, I thought, I'll just hit cancel a couple of times and it will go away.  Nope.  After hitting Cancel, OK, and trying to type anything and everything in the required fields all I got was more dialog boxes.  Hmmm... maybe its because I'm using Minefield (Firefox 3.1a2).  Nope.  Changing to Firefox 3.0.1 still gives me the never ending dialog box storm.  And since Firefox is set to open my last set of tabs I didn't even get the chance to delete the Gmail message before it dialog boxed me to death.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The only way out for me was to open a different browser (Safari), log into Gmail, and delete the message.  First though I wanted to do a little investigation and see how Safari would handle this situation.  After I opened the offending message, Safari threw up the Auth dialog box two or three times and then stopped bothering me about it.  Problem solved.  I could have also gone to the command line and opened Firefox in "safe" mode with a different profile, but that wouldn't have been as much fun and too much work.  :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anyway, this is just a warning to everyone to watch out for the Gmail messages that can lock out Firefox.  And to NewEgg to fix their processes.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-1255084162556480061?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/1255084162556480061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/09/firefox-gmail-dialog-box-deluge.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/1255084162556480061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/1255084162556480061'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/09/firefox-gmail-dialog-box-deluge.html' title='Firefox &amp; Gmail Dialog Box Deluge'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_JBRPU8rTHVQ/SMZuPcBXlCI/AAAAAAAABM8/zZXkilT4ZR0/s72-c/NewEgg.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-5236028658475356385</id><published>2008-08-29T17:03:00.004-04:00</published><updated>2008-08-29T18:00:35.571-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Anteater'/><category scheme='http://www.blogger.com/atom/ns#' term='Screengrab'/><category scheme='http://www.blogger.com/atom/ns#' term='Phatch'/><category scheme='http://www.blogger.com/atom/ns#' term='Screenshots'/><title type='text'>Screenshots the easy way</title><content type='html'>I needed to update the &lt;a href="http://www.kangaroobox.com/"&gt;KangarooBox&lt;/a&gt; web site with some enticing screen shots of our &lt;a href="http://www.kangaroobox.com/anteater/"&gt;Anteater&lt;/a&gt; product and to be honest, I wasn't looking forward to it.  Sure its fun getting into Gimp and wasting a day trying to get everything looking good for a particular picture but doing it over and over for a bunch of pictures is a drag.  Heck, even capturing the screenshots was a challenge.  That's when I ran across Screengrab! and Phatch.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1146"&gt;Screengrab!&lt;/a&gt; has got to be one of the coolest &lt;a href="http://www.mozilla.com/firefox/"&gt;Firefox&lt;/a&gt; add-ons around.  Its simple&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.screengrab.org/wp-content/images/ScreengrabSelection.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px;" src="http://www.screengrab.org/wp-content/images/ScreengrabSelection.png" alt="" border="0" /&gt;&lt;/a&gt; and effective.  After installing it and restarting Firefox right-clicking on a page brings up a small menu that allows you to save the whole page, only the visible section, or a selection of your choosing.  This allows you to capture only what you want and not have to worry about the browser chrome (URL bar, scroll bars, etc.) showing up in your final pictures.  Absolutely brilliant!&lt;br /&gt;&lt;br /&gt;Now I had just the right pictures to put on my web page, the only problem was that they were fairly large and wouldn't work on my site just scaled down.  I wanted to &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photobatch.wikidot.com/local--files/getting-started/actions-scale.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px;" src="http://photobatch.wikidot.com/local--files/getting-started/actions-scale.png" alt="" border="0" /&gt;&lt;/a&gt;make little thumbnails that had rounded corners and a drop shadown.  Luckily I found &lt;a href="http://photobatch.wikidot.com/start"&gt;Phatch Photo Batch Processor&lt;/a&gt; which allowed me to do just that, and more.  It basically works like &lt;a href="http://en.wikipedia.org/wiki/Automator_%28software%29"&gt;Automator&lt;/a&gt; on Mac OS X 10.5 in that you build a flow out of discreet components.  There are modules for rounding corners, scaling, adding text, transposing, and more.  Just select the ones you want, set a few options, and point it to a directory of images.  By default it saves your new pictures in a folder right next to the source folder with "_phatch" added to it.  And since it only takes a few seconds to run its easy to adjust the settings and run it again to get the results you need.&lt;br /&gt;&lt;br /&gt;Using these two utilities enabled me to add product screenshots to my &lt;a href="http://www.kangaroobox.com/anteater-features/"&gt;web pages&lt;/a&gt; faster than ever before.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-5236028658475356385?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/5236028658475356385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/08/screenshots-easy-way.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/5236028658475356385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/5236028658475356385'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/08/screenshots-easy-way.html' title='Screenshots the easy way'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-6761635826454157226</id><published>2008-08-25T06:13:00.003-04:00</published><updated>2008-08-25T06:22:57.159-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lighttpd'/><category scheme='http://www.blogger.com/atom/ns#' term='SilverStripe'/><category scheme='http://www.blogger.com/atom/ns#' term='redirect'/><title type='text'>Redirecting... Lighttpd!</title><content type='html'>I've been fighting with &lt;a href="http://www.lighttpd.net/"&gt;Lighttpd&lt;/a&gt; for the past few days and I think I've finally won.  The problem was that I had old hosts hanging around the web from when KangarooBox first went live, and I wanted to get rid of them.  And by get rid of them I mean redirect them, permanently, to the www. host.  For example, the one big major FQDN that I wanted to squash is "mail.kangaroobox.com".  When we were just getting the company off the ground we need to test some thing really quickly so we just grabbed the first host name we found (that wasn't www).  It turns out that it got propagated much more widely than we had anticipated and Google got it's hands on it.  :(&lt;br /&gt;&lt;br /&gt;So now, thanks to the following bit of configuration code, everything seems to be working really well.  I post this so that future generations may learn from my mistakes.  Or I'm just following the Linus creed: "Backups are for wimps. Real men upload their data to an FTP site and have everyone else mirror it."  :)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;## Redirect to www.kangaroobox.com for SEO&lt;br /&gt;$HTTP["host"] !~ "^www.kangaroobox.com" {&lt;br /&gt; url.redirect = (&lt;br /&gt;   "^/(.*)" =&gt; "http://www.kangaroobox.com/$1"&lt;br /&gt; )&lt;br /&gt;}&lt;br /&gt;## Rewrite the URL for sapphire&lt;br /&gt;$HTTP["host"] =~ "^www.kangaroobox.com" {&lt;br /&gt; url.rewrite-once = (&lt;br /&gt;   "(?i)(/.*\.([A-Za-z0-9]+))(.*?)$" =&gt; "$0",&lt;br /&gt;   "^/(.*?)(\?|$)(.*)" =&gt; "/sapphire/main.php?url=$1&amp;amp;$3"&lt;br /&gt; )&lt;br /&gt; server.error-handler-404 = "/sapphire/main.php"&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-6761635826454157226?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/6761635826454157226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/08/redirecting-lighttpd.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/6761635826454157226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/6761635826454157226'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/08/redirecting-lighttpd.html' title='Redirecting... Lighttpd!'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-6183838819528651345</id><published>2008-08-20T13:15:00.005-04:00</published><updated>2008-08-20T13:29:34.667-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='justhackit'/><category scheme='http://www.blogger.com/atom/ns#' term='idea'/><category scheme='http://www.blogger.com/atom/ns#' term='aspell'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='wget'/><title type='text'>Spell checking an entire website.</title><content type='html'>While building the new KangarooBox site I ran into something that I thought would be pretty simple.  Surely there are folks out there in web land that have wanted to spell check an entire web site  before, right?  So it stands to reason that they would have created some tools to do it.  It seems I was wrong, at least for simple, command line, free solutions.&lt;br /&gt;&lt;br /&gt;Just thinking off the top of my head I can envision a marriage of &lt;a href="http://www.gnu.org/software/wget/"&gt;wget&lt;/a&gt; and &lt;a href="http://aspell.net/"&gt;aspell&lt;/a&gt; that would work well.  Wrap it all up with a bit of Perl or Python and your good to go.  Now this solution wouldn't be as comprehensive as some of the payware stuff but it should be good enough to chunk though the majority of your pages finding blatent spelling errors.  Heck, you could probably even get it to do some light gramatical checking while your at it.  I think I saw a post on &lt;a href="http://news.ycombinator.com/news"&gt;Hacker News&lt;/a&gt; about a site that gathers ideas and puts them into peoples heads.  Maybe I'll try to submit this one.  It's small, simple and pretty much self contained.  Perfect!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;== UPDATE ==&lt;/span&gt;&lt;br /&gt;I found out that the is named &lt;a href="http://justhackit.slinkset.com"&gt;JustHackIt&lt;/a&gt; and I have posted &lt;a href="http://justhackit.slinkset.com/links/Website_Spell_Checker"&gt;my idea&lt;/a&gt;.  Let's see if anything comes of it...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-6183838819528651345?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/6183838819528651345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/08/spell-checking-entire-website.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/6183838819528651345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/6183838819528651345'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/08/spell-checking-entire-website.html' title='Spell checking an entire website.'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-875534433410292811</id><published>2008-08-04T15:41:00.005-04:00</published><updated>2008-08-04T15:48:07.232-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='package'/><category scheme='http://www.blogger.com/atom/ns#' term='redmine'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><title type='text'>Packaging a RoR app for Debian Linux</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.rubyonrails.org/images/rails.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 78px; height: 101px;" src="http://www.rubyonrails.org/images/rails.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Well, it appears as if I might be the first person in the world to package up a Ruby on Rails application for Debian.  Let me say that I have zero experience in building Debian packages and I really didn't want to start off this way.  But since I need it for my business I guess there is no way around it.  Oh well, I guess its a good learning experience.&lt;br /&gt;&lt;br /&gt;I'll try to keep this blog up-to-date with my progress.  I'm actually kinda looking forward to it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-875534433410292811?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/875534433410292811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/08/packaging-ror-app-for-debian-linux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/875534433410292811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/875534433410292811'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/08/packaging-ror-app-for-debian-linux.html' title='Packaging a RoR app for Debian Linux'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-9189688267820214559</id><published>2008-07-25T09:50:00.004-04:00</published><updated>2008-07-25T10:15:24.033-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='raid'/><category scheme='http://www.blogger.com/atom/ns#' term='SAN'/><category scheme='http://www.blogger.com/atom/ns#' term='Coraid'/><title type='text'>Mounting the SAN</title><content type='html'>After getting my Coraid SAN hardware up and running I was having trouble deciding on how to use it.  I mean it does the RAID stuff great but it doesn't have the ability to split up the space dynamically or shrink it at will.  For that I needed LVM (Logical Volume Management) so I installed the Debian LVM2 package and went to work. I found an excellent &lt;a href="http://gagme.com/greg/linux/raid-lvm.php#lvm"&gt;resource&lt;/a&gt; on the subject of Linux, LVM, &amp;amp; RAID setup and followed it pretty closely.  The only changes I made were to the RAID portion and that was because I had the Coraid doing all my heavy lifting.&lt;br /&gt;&lt;br /&gt;So instead of using &lt;code&gt;mdadm&lt;/code&gt; I created the RAID by typing the following line on the Coraid console.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;make raid5 0.0-2&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Since I have 4 physical disks in my SAN at the moment, this gives me a single RAID5 LUN (Logical Unit Number) and a hot swappable spare.  This shows up on my Debian server as /dev/etherd/e0.0.  I then initialized my new device as a physical volume, added it to a pv group, and created my first logical volume.&lt;br /&gt;&lt;br /&gt;I am currently in the process of testing different file systems (JFS, ReiserFS, ex3) to find out which one performs the best and has the best reliability.  I'm also testing a hardware failure by yanking out a disk in the middle of some operations.  It should work fine and continue like nothing happened.  If it doesn't, I would rather find out now when I don't have real data on it instead of 6 months from now when it could really cause some problems.&lt;br /&gt;&lt;br /&gt;One more thing I found on another site was using a separate mirror with 3 disks as an off-site backup plan.  Mount 2 of the disks in a RAID1 configuration and dump all of your backup data there.  Then when you want to off-site your backups just yank one of the disks out and replace it with the spare.  By taking the freshly yanked disk home or to your Mom's house you have a backup that can survive almost anything.  Just do this 2-3 times a week and your golden.  &lt;br /&gt;&lt;br /&gt;I knew this SAN thing would come in handy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-9189688267820214559?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/9189688267820214559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/07/mounting-san.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/9189688267820214559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/9189688267820214559'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/07/mounting-san.html' title='Mounting the SAN'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-7638252813856353880</id><published>2008-07-21T12:48:00.004-04:00</published><updated>2008-07-21T13:03:46.348-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='licensecheck'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='patch'/><category scheme='http://www.blogger.com/atom/ns#' term='diff'/><title type='text'>Debian Packaging II - A simplified experience</title><content type='html'>In my last post I showed a fairly complex command line that parses the output of &lt;code&gt;licensecheck&lt;/code&gt; into something more usable for the new &lt;code&gt;debian/copyright&lt;/code&gt; format.  The problem was that it didn't quite work properly and it was too complex to modify.  So, I took a different approach and modified the &lt;code&gt;licensecheck&lt;/code&gt; program directly.  Yea, open source!&lt;br /&gt;&lt;br /&gt;Here is my simple but working patch for the &lt;code&gt;licensecheck&lt;/code&gt; program.  Enjoy.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;--- licensecheck        2008-06-29 08:53:10.000000000 -0400&lt;br /&gt;+++ licensecheck        2008-07-21 12:44:03.000000000 -0400&lt;br /&gt;@@ -288,12 +288,11 @@&lt;br /&gt;     $content =~ tr/ //s;&lt;br /&gt; &lt;br /&gt;     $license = parselicense($content);&lt;br /&gt;-    print "$file: ";&lt;br /&gt;+    print $license . "\t";&lt;br /&gt;     print "*No copyright* " unless $copyright;&lt;br /&gt;-    print $license . "\n";&lt;br /&gt;-    print "  [Copyright: " . $copyright . "]\n"&lt;br /&gt;+    print "[Copyright: " . $copyright . "]\t"&lt;br /&gt;       if $copyright and $opt_copyright;&lt;br /&gt;-    print "\n" if $opt_copyright;&lt;br /&gt;+    print "$file\n";&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; sub parse_copyright($) {&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now I can easily sort all the files by copyright and by owner.  This will hopefully make it easier to build and maintain my copyright file for my redmine package.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-7638252813856353880?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/7638252813856353880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/07/debian-packaging-ii-simplified.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/7638252813856353880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/7638252813856353880'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/07/debian-packaging-ii-simplified.html' title='Debian Packaging II - A simplified experience'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-2921697292443492505</id><published>2008-07-21T10:40:00.004-04:00</published><updated>2008-07-21T11:03:31.989-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='package'/><category scheme='http://www.blogger.com/atom/ns#' term='redmine'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='apt'/><title type='text'>Debian Packaging - A new experience</title><content type='html'>Well, I've decided to package up the &lt;a href="http://www.redmine.org/"&gt;redmine&lt;/a&gt; program for inclusion into &lt;a href="http://www.debian.org/"&gt;Debian&lt;/a&gt; Linux.  It's not the most simple software in the world but it shouldn't be too bad to package. One of the things that is throwing me right now is that it is based on &lt;a href="http://www.rubyonrails.org/"&gt;Ruby On Rails&lt;/a&gt; and all of the documentation I'm reading only discusses compiling applications, not packaging scripted language software.&lt;br /&gt;&lt;br /&gt;One of my first tasks is to find and document all of the licenses for all of the files in the redmine source code.  This is not as easy as it sounds as while most of redmine is licensed under the GPL some of the files have other licenses or none at all.  At first I attempted to do a simple &lt;code&gt;grep&lt;/code&gt; to check for the appropriate license, but that hammer was just too crude for the task.  After asking around a little bit I found a program called &lt;code&gt;licensecheck&lt;/code&gt; (in the &lt;a href="http://packages.debian.org/search?keywords=devscripts"&gt;devscripts&lt;/a&gt; package) that processes files and tries to find out what license that file was developed under.  Just what I need!&lt;br /&gt;&lt;br /&gt;One twist in my copyright journy is that I'm trying to create my &lt;code&gt;debian/copyright&lt;/code&gt; file in accordance with the &lt;a href="http://wiki.debian.org/Proposals/CopyrightFormat"&gt;new&lt;/a&gt; format instead of the old, standard format.  Hey, if I'm gonna package this thing up I might as well use all the latest &amp;amp; greatest tools, right?  Anyway, the new format is pretty strict about how things are supposed to be laid out, filenames, labels, etc. and the output of licensecheck is not very pretty.  After a bit of trial and error I came up with the following command.  It's not perfect (yet) but it gets me closer to the proper format, and since I'm lazy that means less hand editing for me.  Yea!&lt;br /&gt;&lt;br /&gt;&lt;code&gt;licensecheck -copyright -r * | grep -v "*No copyright*" | sed '/^$/d' | sed '2~1 {N;s/\n/ /g}' | sort&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I'm still working on the details and I have to adjust a couple of things, but if I can get it working properly it will mean a lot less work on my part and hopefully someone else will be able to use it as well.  Who knows, if I can get it working really well maybe I'll try to get it added to licensecheck as an additional output format.  Cool!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-2921697292443492505?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/2921697292443492505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/07/debian-packaging-new-experience.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/2921697292443492505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/2921697292443492505'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/07/debian-packaging-new-experience.html' title='Debian Packaging - A new experience'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-426297568407031964</id><published>2008-06-26T14:14:00.004-04:00</published><updated>2008-06-26T14:28:05.312-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Radiant'/><category scheme='http://www.blogger.com/atom/ns#' term='SilverStripe'/><category scheme='http://www.blogger.com/atom/ns#' term='CMS'/><title type='text'>SilverStripe CMS</title><content type='html'>On our recent family vacation to &lt;a href="http://www.myrtlebeachinfo.com/"&gt;Myrtle Beach, SC&lt;/a&gt; I got to playing with a new content management system called &lt;a href="http://www.silverstripe.com/"&gt;SilverStripe&lt;/a&gt;.  In a nutshell, a CMS is a way to make web pages.  Specifically its a framework designed to make it easy to make a lot of web pages with a bunch of functionality.  A CMS makes building things like Blogs &amp;amp; Forums and tying them together with a bunch of ofther pages easy.  Hit the link above and check it out.&lt;br /&gt;&lt;br /&gt;Anyway, &lt;a href="http://www.kangaroobox.com/"&gt;KangarooBox&lt;/a&gt; currently uses a Ruby on Rails CMS called &lt;a href="http://radiantcms.org/"&gt;Radiant&lt;/a&gt; and while it does a pretty good job I'm not completely happy with it.  By design Radiant is very lightweight and isn't as full featured as SilverStripe.  Thats not a bad thing and it served me very well in the beginning.  However, my needs are greater now and SilverStripe looks like it might fit the bill quite nicely.  A couple of the features I'm looking forward to are the Forums support and real Shopping Cart functionality.  We'll be ready to start selling products soon and I need a way for people to buy stuff from us.  That's really the point behind this whole thing.  :)&lt;br /&gt;&lt;br /&gt;BTW: Who here thinks it's extremely geeky of me to install CMSs while on a beach vacation?  :/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-426297568407031964?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/426297568407031964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/06/silverstripe-cms.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/426297568407031964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/426297568407031964'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/06/silverstripe-cms.html' title='SilverStripe CMS'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-7654461161436637656</id><published>2008-05-01T11:12:00.003-04:00</published><updated>2008-05-01T13:50:50.175-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rrod'/><category scheme='http://www.blogger.com/atom/ns#' term='halo'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='xbox'/><title type='text'>XBox 360 Love/Hate Affair</title><content type='html'>OK, I'll be honest with you - I don't really like the XBox 360.  I really like some of the games (Halo {2|3}) but the console sucks.  There are so many things wrong with it that I don't know where to start.  Wait, yes I do.  Last week I got a visit from the dreaded &lt;a href="http://en.wikipedia.org/wiki/Xbox_360_technical_problems#General_hardware_failure"&gt;RROD&lt;/a&gt; monster.  :(  That just tops off my list of complaints about the system, some of which are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It's insanely loud!  Any time your playing a game the fan sounds like an F16 fighter taking off.  Sitting at the dashboard it's not too bad, but pop in a game and I have to crank the TV volume up to 11.&lt;/li&gt;&lt;li&gt;XBox Live going down whenever people log in.  This past Christmas season it was down more than it was up.  Microsoft blames this on the influx of new subscribers and I can understand that but it's not like these people just popped out of nowhere.  Here's a tip for you Microsoft, when you sell more XBox 360 consoles your probably going to have more people log into XBox Live.  It's not like this is something that we're getting for free and we shouldn't complain.  Waiting around for you to get your stuff together is costing me $50 a year.&lt;/li&gt;&lt;li&gt;XBox Live costing me $50 a year.  How do Sony and Nintendo get away with free network access?  Are you really that greedy?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Red Ring Of Death!  Enough said.&lt;/li&gt;&lt;/ul&gt;Now you might ask why I continue down the XBox 360 path and up until now the answer was simple: GAMES!  I like the Wii well enough but most of the games just don't really appeal to me.  I currently like hardcore, multiplayer, shooter games and those are few and far between on the Wii.  The Playstation 3 is in a similar situation.  Not only is it WAY too expensive, it has just been completly void of games for a long time.  However, that is changing and it's looking like more and more games that I like are ending up on Sony's platform.&lt;br /&gt;&lt;br /&gt;I'm probably not going to switch platforms just yet, but I'm putting Microsoft on notice; as soon as I find something, anything better than your crappy platform I'm saying goodby to Halo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-7654461161436637656?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/7654461161436637656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/05/xbox-360-lovehate-affair.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/7654461161436637656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/7654461161436637656'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/05/xbox-360-lovehate-affair.html' title='XBox 360 Love/Hate Affair'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-740244916629267640</id><published>2008-04-22T09:03:00.003-04:00</published><updated>2008-04-22T09:17:38.163-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='savetheinternet'/><title type='text'>Save The Internet!</title><content type='html'>I just signed up with &lt;a href="http://www.savetheinternet.com/"&gt;SaveTheInternet&lt;/a&gt; to post &lt;a href="http://www.savetheinternet.com/yourstory/398349"&gt;my story&lt;/a&gt; and plead for Net Neutrality.  I firmly believe that in order for the Internet to continue to grow and mature it has to be free of artificial limits on who can move data around it.  If you haven't already, please consider joining the fight and telling your story.  Just hit the link above and fill out a couple of forms.  It's easy and it will hopefully make the FCC  sit up and take notice of what we want.&lt;br /&gt;&lt;br /&gt;Thanx!&lt;br /&gt; Richard&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.savetheinternet.com/yourstory"&gt;&lt;br /&gt;&lt;img src="http://www.savetheinternet.com/graphics/sti_tys.jpg" width="150" height="200" alt="Save the Internet: Tell Your Story" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-740244916629267640?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/740244916629267640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/04/i-just-signed-up-with-savetheinternet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/740244916629267640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/740244916629267640'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/04/i-just-signed-up-with-savetheinternet.html' title='Save The Internet!'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-6132756632370850765</id><published>2008-03-17T21:32:00.002-04:00</published><updated>2008-03-17T21:43:43.882-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oss'/><category scheme='http://www.blogger.com/atom/ns#' term='raid'/><category scheme='http://www.blogger.com/atom/ns#' term='noise'/><category scheme='http://www.blogger.com/atom/ns#' term='ohloh'/><title type='text'>Non-Silent Running!</title><content type='html'>Well, I got the Coraid SAN device hooked up and boy is it loud!!  I know that rack mounted devices are not supposed to be quiet but I'm thinking a fan is going out or something.  Its squealing like a stuck pig.  To be fair, I have contacted the manufacturer and they are willing to ship me some new parts if it turns out that something is gone/going bad.  I just haven't had the time to turn it on, open it up, and find out exactly whats making all the racket.&lt;br /&gt;&lt;br /&gt;On another note, I have decided that this blog shouldn't really represent KangarooBox so much as just a platform for me to rant on.  So from now on, this will be my official soap-box.  I just wanted to let you know.&lt;br /&gt;&lt;br /&gt;And finally, I have been playing with &lt;a href="http://www.ohloh.net/"&gt;Ohloh&lt;/a&gt; quite a bit lately and I really like it and what their trying to do for the OSS (Open Source Software) world.  Basically, they allow users to submit their favorite OSS package and fill in all kinds of stuff about it.  We're talking reviews, tags, source code repositories, RSS feeds, etc.  You can even build a "Stack" out of all your favorite software and compare them with other users to see what else you might like.  The best part is that they dig through the source code of each project and calculate how active it is, what type of licenses it uses, the quality of the code (determined by source code comments) and finally how much it would cost to develop it in the commercial software world.  Very cool stuff.&lt;br /&gt;&lt;br /&gt;So, the next time you need to find some info on a piece of OSS check Ohloh out.  It could just save you some time and money.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-6132756632370850765?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/6132756632370850765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/03/non-silent-running.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/6132756632370850765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/6132756632370850765'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/03/non-silent-running.html' title='Non-Silent Running!'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-369143093130268366</id><published>2008-02-05T13:29:00.001-05:00</published><updated>2008-02-05T14:39:14.760-05:00</updated><title type='text'>Running out of memories...</title><content type='html'>So, a couple of weeks ago I was thinking about storage and how we didn't have enough of it.  There were two solutions to the problem; purchase more individual disks and put them in our servers, or get a SAN/NAS.  Putting more disks inside the servers is quick and easy but it really doesn't solve the problem.  What you end up with is more storage than you need on some servers and not enough on others.&lt;br /&gt;&lt;br /&gt;For example, our web server has 80G of space spread over a 2 drive RAID mirror.  We are only using about 5GB total but the 80G drives are all we have.  Meanwhile there are other servers in the rack (can you say &lt;a href="http://apt-mirror.sourceforge.net/"&gt;apt-mirror&lt;/a&gt;?) that are starving for space.  The traditional answer is to purchase more drives and max out the server and I almost when that route.  Fortunately my experience in enterprise computing slapped me in the face and told me to try something else.&lt;br /&gt;&lt;br /&gt;SANs (Storage Attached Network) and NAS (Network Attached Storage) devices are purposely built to solve this problem.  NAS devices are generally boxes of drives that can be mounted over protocols like NFS or FTP.  They are fairly cheap and work fairly well as slower, less reliable hard drives.  A SAN, on the other hand, is generally fast, reliable, and expensive.  They use things like &lt;a href="http://en.wikipedia.org/wiki/Iscsi"&gt;iSCSI&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Fibre_Channel"&gt;Fibre Channel&lt;/a&gt; and expensive, high performance SCSI drives to do their magic.  They are also quite difficult to design and build out.  All of these things add up to lots of $$$ - and the budget just didn't allow for this type of cash outlay.&lt;br /&gt;&lt;br /&gt;This is where &lt;a href="http://www.coraid.com/"&gt;Coraid&lt;/a&gt; comes into the picture.  After scouring the 'Net for several days I came across their web site and liked what they were doing.  Instead of using expensive protocols and hardware, they went the other direction and used commodity products in a new way.  Where most SANs use Fibre Channel to move data around Coraid is using good ol' TCP.  The secret sauce is that they are only using the barest minimum of TCP (the first two layer) and slapping an open protocol on top of it.  There is no fancy switches or other networking equipment involved.  Just build out a dedicated network (1GB will do) and plug the Coraid EtherDrive and all your servers into it and your good to go.  Best of all its all been incorporated into the Linux kernel so it works out of the box with most major&lt;br /&gt;distributions like Debian!  They even have Mac OS X and Windows drivers too.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JBRPU8rTHVQ/R6i5f5ROuVI/AAAAAAAABC4/PZUy8e3Vq24/s1600-h/IMG_0099.JPG"&gt;&lt;img dragover="true" style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://4.bp.blogspot.com/_JBRPU8rTHVQ/R6i5f5ROuVI/AAAAAAAABC4/PZUy8e3Vq24/s200/IMG_0099.JPG" alt="" id="BLOGGER_PHOTO_ID_5163580930380446034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The Coraid package just arrived this afternoon and I'm pretty excited to get to work building out our new SAN.  I'll let you know what happens and keep this blog up-to-date on the progress of our new storage solution.  Hopefully it will all go well and I'll be able to say nice things about it.  We'll see...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-369143093130268366?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/369143093130268366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/02/running-out-of-memories.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/369143093130268366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/369143093130268366'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/02/running-out-of-memories.html' title='Running out of memories...'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_JBRPU8rTHVQ/R6i5f5ROuVI/AAAAAAAABC4/PZUy8e3Vq24/s72-c/IMG_0099.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-5580490432462344738</id><published>2008-01-22T13:14:00.000-05:00</published><updated>2008-01-22T13:23:49.344-05:00</updated><title type='text'>Apple Store FTW!</title><content type='html'>If you &lt;a href="http://kangaroobox.blogspot.com/2008/01/another-reason-apple-rocks.html"&gt;remember&lt;/a&gt; a couple of weeks ago I took our family iMac in for service and it turns out if was even better than I thought.  Well, sorta.  &lt;br /&gt;&lt;br /&gt;When we went to pick it up there was a small problem; they couldn't find it.  After double checking some things (name, ID, etc.) it appeared on the front counter and the nice man said that it would cost just over $700.  Now I was told at the outset of this adventure that this problem was covered under a recall and that I wouldn't have to pay for the repair.  Needless to say this was a little unnerving and I thought back to all the good things I had said about Apple in the past.  &lt;br /&gt;&lt;br /&gt;After I told the genius dude that this should be under warranty and I shouldn't have to pay anything, he scurried off to the back room to consult the bones.  Luckily for everyone involved* the mess was straightened out and they only required my signature and we were walking out the door with our refurbished computer.&lt;br /&gt;&lt;br /&gt;Once again my faith in Apple is restored.  Now if they had just had something to announce at MacWorld '08 last week.  The MacBook Air has almost no redeeming qualities and I can't see how anyone will purchase it.  My guess is that it will turn out to be the Mac Cube of this decade and will be a collectors item before the year is out.  Hmmm...I might need to pick one up and keep it in a box in my basement.  I'm gonna make me some eBay money in 2020.  :)&lt;br /&gt; &lt;br /&gt;Later...&lt;br /&gt;  Richard&lt;br /&gt;&lt;br /&gt;*NOTE: My wife had a migraine and was ready to hurl/scream at the drop of a hat.  :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-5580490432462344738?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/5580490432462344738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/01/apple-store-ftw.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/5580490432462344738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/5580490432462344738'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/01/apple-store-ftw.html' title='Apple Store FTW!'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-4391849316933088806</id><published>2008-01-12T03:22:00.000-05:00</published><updated>2008-01-12T03:55:17.085-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apple iMac MacWorld'/><title type='text'>Another reason Apple rocks!</title><content type='html'>Our family iMac has been ill for quite a while now.  About a year ago I noticed it rebooting randomly; we would come back to the machine after not using it for a while and it would be at the login screen.  It was annoying but not tragic.  Then the hard drive went out last month and I started looking around.  It turns out that the power module was going bad and throwing a "AppleSMU: shutdown cause -110" error in the system logs.  The bad thing is that this is a hardware problem and it's probably expensive. &lt;img style="cursor: pointer; width: 20px; height: 20px;" src="http://photos1.blogger.com/blogger/7678/802/1600/sad.gif" alt=":(" border="0" /&gt;  The good thing is that it's covered under a recall and we have a new Apple store in town. &lt;img style="cursor: pointer; width: 20px; height: 20px;" src="http://photos1.blogger.com/blogger/7678/802/1600/smile.gif" alt=":)" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;I took it to the Genius bar last night and Wil knew right away what was wrong with it.  He took my information, chatted about the problems with the iPhone, and even gave me an  insiders tip on what Steve Jobs was going to introduce at MacWorld next week (hint: It's a new line of Apple branded clothing*).  After all the paperwork was finished Wil took my iMac to the back room and told me they would call when it was ready to pick up.&lt;br /&gt;&lt;br /&gt;According to the paperwork I was given, this problem normally costs over $600 to fix.  But I was getting it for free.  On a 4 year old computer!  WOW!!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;*NOTE: I'm 99% sure Wil was pulling my leg with the clothing thing, but you can never be sure what the Steve is going to pull out of his magic bag of tricks.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-4391849316933088806?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/4391849316933088806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2008/01/another-reason-apple-rocks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/4391849316933088806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/4391849316933088806'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2008/01/another-reason-apple-rocks.html' title='Another reason Apple rocks!'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-8319677699769848363</id><published>2007-12-14T12:00:00.000-05:00</published><updated>2008-01-12T03:56:47.373-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='sdk'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>iPhone Annoyances</title><content type='html'>&lt;h3&gt;Gripe On!&lt;/h3&gt;I've had my iPhone since day one and I wouldn't trade it for (almost) any phone on the market.  It does most things very well and some things extremely greatly.  It also falls on it's face in a few areas.  This rant is about those areas and what &lt;a href="http://www.apple.com/iphone"&gt;Apple&lt;/a&gt; could do to fix it.&lt;br /&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;iTunes Yanks My Chain&lt;/h3&gt;OK, I'm working away on my MacBook Pro and decide to plug my iPhone in to get a little syncing love going on.  As soon as I put it in the base iTunes pops up and gets all in my face.  What's up with that?!?  Hold on, it gets even worse.  Even if you hide iTunes it pops up.  What about if you just close the iTunes window but still leave the app running?  Nope, it still pops up.&lt;br /&gt;&lt;br /&gt;Now, when Spaces came along I thought "Great, now I can have iTunes and other things running on another screen and never have to worry about it jumping up in my face every time I sync my iPhone".  No such luck.  Not only does iTunes still pop up in my face, but it yanks me out of whatever I was doing and transports me to a new screen to show it to me!!  WTF!!!&lt;br /&gt;&lt;br /&gt;I have a message for iTunes:  &lt;span style="font-weight: bold; font-style: italic;"&gt;Leave Me Alone!!&lt;/span&gt;  If there were a way to sync my iPhone without iTunes I would be all over it.  Even an option to sync in the background or something.  This leads to another problem.&lt;br /&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;That Syncing Feeling&lt;br /&gt;&lt;/h3&gt;Now, I don't want to sync my entire music &amp;amp; video collection over the cell network or even over Bluetooth, but come on.  Why cant I sync &lt;span style="font-style: italic;"&gt;some&lt;/span&gt; stuff without physically connecting my phone to my computer?  Seriously, an address book entry shouldn't over tax the cellular network.  Even better, just allow my laptop and phone to talk to each other on Bluetooth.  It doesn't cost anything and it's already built-in.  Why oh why are we stuck in the late 90's with this?!&lt;br /&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;Bluetooth Vacancies&lt;/h3&gt;Just to rail on Bluetooth a bit more I have to ask; why does Bluetooth work for something and not others.  I picked up a &lt;a href="http://www.jawbone.com/"&gt;Jawbone&lt;/a&gt; headset (BTW: I love it!) to work in noisy environments - like behind a rack full of servers.  I use it to talk on the phone and everything is dandy.  The problem comes in when I want to do other things, such as listen to voicemail or music.  That's right, you didn't read it wrong - the iPhone doesn't allow you to listen to voicemail or music though a Bluetooth headset.  I have no idea why.  Granted, Apple might not want to sacrifice sound quality for the iPod functions in an iPhone.  I can see Steve being adamant about that.  However, what's the excuse for not allowing voice mail to hit the Bluetooth airwaves?  This is annoying to no end.&lt;br /&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;Sideways Email Viewing&lt;/h3&gt;And while we're talking about annoying things, let's touch on one thing that drives me bonkers.  How come I can view my web pages, pictures, and even songs horizontally, but my mail is stuck in vertical mode?  I get lots of email that are too wide for the screen in vertical mode but would look great if I could rotate them 90 degrees.  It's not like it's something that's never been done before.  It's HTML email and you already have a browser on the device, and it can rotate the message for you.&lt;br /&gt;&lt;br /&gt;You've got to wonder; did they not think that people wouldn't get wide email?  Or maybe everything they tested it with was ASCII and would flow to match the screen.&lt;br /&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;Jungle Safari&lt;br /&gt;&lt;/h3&gt;Multiple browsing on the iPhone is a great idea.  Too bad it doesn't work properly.  I can't count the number of times I've been surfing along with two pages open (&lt;a href="http://www.reddit.com/"&gt;Reddit&lt;/a&gt; &amp;amp; &lt;a href="http://www.digg.com/"&gt;Digg&lt;/a&gt;, mostly) and had the iPhone drop me back to the dashboard.  Most of the time I'm just reading a article and there is no action going on.  My instinct tells me that it's running out of resources (or something) but with 8GB of storage you'd think they could keep a couple of articles open.&lt;br /&gt;Even worse, the caching doesn't seem to work well, if at all.  I can hit the same page twice in a row and it still downloads the whole thing.  These things make browsing the web much more painful than it should be.  Yes, yes, I have "rebooted" my iPhone to fix the problems.  It doesn't seem to work.  I've also tried to be careful in my surfing, going slowly, not hitting "bad" sites, etc.  Nothing seems to work.&lt;br /&gt;&lt;br /&gt;Another problem with Safari on the iPhone is the fact that you have no control over the links you "click".  One of the best things about tabbed browsers is the ability to open other pages in the background while still reading the current page.  I do this all the time on sites like Reddit and Slashdot to maximize my browsing to loading ratio.  Given the problems with crashing and caching, the lack of a way to open a new page from a link is a real handicap.  Maybe if you held down the link for a certain amount of time it would open that link in a new page.  I've tried it but it doesn't work.  :(&lt;br /&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;Looking Ahead&lt;/h3&gt;On the bright side, I am really looking forward to the release of the Software Development Kit for the iPhone.  People are really doing some amazing things without it - I can hardly imagine what's going to happen with it.  Actually, I can image a few things I really, really need.&lt;br /&gt;&lt;br /&gt;High on my list of must haves is an SSH client.  I used to use a Danger HipTop (Sidekick II) and one of the best (coolest :) things I could do was log into my machines from anywhere in the world and get stuff done.  Now that I have my own small business, this is even more important as there is usually no one back at the office to call and walk through a problem.&lt;br /&gt;&lt;br /&gt;Another thing I'm really going to like is a usable instant message client.  One that talks to AIM, Jabber (Gtalk), MSIM, &amp;amp; Yahoo will keep me in touch with everyone.  That crappy SMS thing that comes with the iPhone is not even worth looking at.  I think I have used it 3 times and each time it was a total pain-in-the-butt, and not because it was costing me money to do so (OK, that was a little bit of it).  I like some of the web applications enough, but sometimes there is no substitute for a real, honest to goodness client.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-8319677699769848363?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/8319677699769848363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2007/12/iphone-annoyances.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/8319677699769848363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/8319677699769848363'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2007/12/iphone-annoyances.html' title='iPhone Annoyances'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-2478978223624028628</id><published>2007-12-07T10:59:00.000-05:00</published><updated>2007-12-07T11:07:20.441-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Christmas Fotolog'/><title type='text'>New Fotolog Account</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_JBRPU8rTHVQ/R1lvkZGqUtI/AAAAAAAAA_A/yRVd55hMGtA/s1600-h/IMG_0031.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_JBRPU8rTHVQ/R1lvkZGqUtI/AAAAAAAAA_A/yRVd55hMGtA/s320/IMG_0031.jpg" alt="" id="BLOGGER_PHOTO_ID_5141263120624931538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Well, I've gone ahead and set up a &lt;a href="http://www.fotolog.com/"&gt;Fotolog&lt;/a&gt; account for &lt;a href="http://www.fotolog.com/kangaroobox"&gt;KangarooBox&lt;/a&gt;.  I realized that I have been collecting pictures of the office and other things around here but don't really have anywhere to share them.  I'm hoping to use this new account to post some interesting pics of whats going on at the time.  Like showing you my Christmas decorations, as pitiful as they are.&lt;br /&gt;&lt;br /&gt;Hmmm...on second thought maybe I shouldn't show these pictures.  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-2478978223624028628?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/2478978223624028628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2007/12/new-fotolog-account.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/2478978223624028628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/2478978223624028628'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2007/12/new-fotolog-account.html' title='New Fotolog Account'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_JBRPU8rTHVQ/R1lvkZGqUtI/AAAAAAAAA_A/yRVd55hMGtA/s72-c/IMG_0031.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-7918037633493221953</id><published>2007-11-22T21:11:00.000-05:00</published><updated>2007-11-22T21:32:30.539-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='laughing'/><category scheme='http://www.blogger.com/atom/ns#' term='blood'/><category scheme='http://www.blogger.com/atom/ns#' term='office'/><category scheme='http://www.blogger.com/atom/ns#' term='faint'/><title type='text'>Ok, so I cut my finger.  Big deal.</title><content type='html'>So there I was doing my part to save the dolphins when I cut my finger and passed out.  Nothing big right?  Well, I didn't think so but everyone got a good laugh and I think I'm getting safety scissors and toy dolphins for Christmas this year, so that's not good.  :)&lt;br /&gt;&lt;br /&gt;Anyway, you know those plastic things that 20 oz. soda bottles are wrapped up with?  I was cutting the rings out of them so that fish &amp;amp; other creatures don't get caught in them and die of starvation or whatever.  I'm happily cutting along when *snip* my finger got in the way.  It's not a bad cut but the blood does start to flow, so I grab a paper napkin and put some pressure on it.  Searching the office for a band-aid I realize that I don't have anything like that and I need to go to a neighbor for help.  I finally get one from the nice lady in the CPA office down the hall.&lt;br /&gt;&lt;br /&gt;While I'm there I start to feel light-headed and ask to sit down.  As I'm telling her the story of how I pass out sometimes at the sight of my own blood I pass out.  Great.  And to top it all off my limbs start twitching (cause that happens sometimes according to Wikipedia) and I scare this poor lady half to death.&lt;br /&gt;&lt;br /&gt;I finally come around and she gives me some water and asks if I need to go to the hospital or anything.  I thank her profusely and call my parents to come get me.  My body didn't like passing out very much and I don't think I should drive.  I get home and rest and everything is good.  All's well that ends well, right?  Wrong.&lt;br /&gt;&lt;br /&gt;My wife and mother-in-law find out about my experience and are, at first, very concerned.  However, when they found out that I had passed out after just nicked my finger with scissors they have a good laugh at my expense.  It's OK though, I'm used to it.  This story just joins the others, like the one about the 3 year old throwing sand in my face.  That one always gets a laugh out of everyone.  I'm  not bitter though.  No, not me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-7918037633493221953?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/7918037633493221953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2007/11/ok-so-i-cut-my-finger-big-deal.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/7918037633493221953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/7918037633493221953'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2007/11/ok-so-i-cut-my-finger-big-deal.html' title='Ok, so I cut my finger.  Big deal.'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-1722327337732796714</id><published>2007-08-12T18:42:00.001-04:00</published><updated>2007-08-12T18:50:13.005-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='locks'/><category scheme='http://www.blogger.com/atom/ns#' term='key'/><category scheme='http://www.blogger.com/atom/ns#' term='cleaning'/><category scheme='http://www.blogger.com/atom/ns#' term='furniture'/><title type='text'>Locked out!</title><content type='html'>For some reason my fancy electronic key wont open the front door on Sundays.  :(  I'm guessing that the former owner of the key was not allowed 24x7 access to the building and when it was passed to me that it wasn't "reset" to my needs.  Either way it's not a huge deal but I was rather put out that I couldn't get in to move some more things into the office.&lt;br /&gt;&lt;br /&gt;On a good note, yesterday saw the arrival of a used computer desk and a new refrigerator.&lt;br /&gt;  After setting at the plastic table in my Aeron chair :) I realized that it wobbles too much (the table, not the chair) and that I probably need to get a "real" desk.  A quick trip to the Habitat for Humanity store and I am the new owner of a $35 desk.  It needs a bit of a scrub and some screw tightening but I think it will do just fine.  The fridge was a new item from Lowes that only cost $299 and it even has a soda can dispenser in the door!  So, cool (literally).&lt;br /&gt;&lt;br /&gt;Now I just have to get into the office and scrub it down.  It has a strong plastic smell and I want to get rid of that before I store my Sweet Tea in it.  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-1722327337732796714?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/1722327337732796714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2007/08/locked-out.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/1722327337732796714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/1722327337732796714'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2007/08/locked-out.html' title='Locked out!'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-7439574756374148797</id><published>2007-08-09T21:13:00.000-04:00</published><updated>2008-01-12T03:56:14.769-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ebay'/><category scheme='http://www.blogger.com/atom/ns#' term='refrigerator'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>New Beginning</title><content type='html'>Well, KangarooBox is officially started.  We got the funding we needed and I'm in the process of booting up the office.  Painting is done; furniture is slowing coming along; appliances are next.  I have to have a refrigerator to make ice, and you have to have ice to make sweet tea, and I have to have sweet tea to live!&lt;br /&gt;&lt;br /&gt;I've also had a new 30Amp circuit installed for the new UPS.  Well, it's going to be new to us - thank ${DEITY} for &lt;a href="http://www.ebay.com"&gt;eBay&lt;/a&gt;!  I think I'm going to outfit 80% of the office with things from the online auction giant.  About the only thing I'm buying new is the aforementioned refrigerator and my main computer, a &lt;a href="http://www.apple.com/macbookpro"&gt;Apple MacBook Pro&lt;/a&gt;.  Which reminds me, I have to go and build a business accounting system with Quickbooks Pro.  Grrrr...  :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-7439574756374148797?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/7439574756374148797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2007/08/new-beginning.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/7439574756374148797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/7439574756374148797'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2007/08/new-beginning.html' title='New Beginning'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5693054744995313095.post-1388890293191847159</id><published>2006-11-08T08:26:00.000-05:00</published><updated>2006-11-08T08:37:03.637-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UPS APC Battery'/><title type='text'>APC SmartUPS</title><content type='html'>Grrrr...  OK, I think I'm almost over being angry at &lt;a href="http://www.apcc.com"&gt;APC&lt;/a&gt;.  We have one of their SmartUPS 3000 systems installed at &lt;a href="http://www.ndasaints.org"&gt;school&lt;/a&gt; and the other day it turned itself off!&lt;br /&gt;&lt;br /&gt;The story so far: A couple of years ago we purchased a used SmartUPS 3000RM on eBay to condition the power and keep the systems running in case anything happened at school.  We put new batteries in it and everything was hunky-dory.  Fast forward to last week - the "bad battery" light had been on for a while but everything was still running fine.  I figured that we needed to replace the battery and would probably do it over the Christmas holiday.  However, the UPS had other plans.  Apparently, the non-enterprise APC systems don't fail closed, they fail open!!  So, if the battery goes bad the system shuts down completely!!&lt;br /&gt;&lt;br /&gt;We used to use Visual Source Safe for version control.  Then one day we discovered that it was silently corrupting our files because a hard drive filled up and that was the end of VSS. &lt;br /&gt;&lt;br /&gt;A version control system's job is to keep your files safe - NO MATTER WHAT!  If it can't do that, it's worse than useless. &lt;br /&gt;&lt;br /&gt;A UPS's job is to keep the power on - NO MATTER WHAT!  If it can't do that, it's worse than useless. &lt;br /&gt;&lt;br /&gt;Given that, I don't think I'll be purchasing any APC products for roobox.  Someone pointed out that the midrange &lt;a href="http://www.liebert.com/dynamic/catprodlist.asp?pid=19&amp;cycles=60HZ"&gt;Liebert&lt;/a&gt;  systems operate correctly even when the battery dies.  I think I'll check them out&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5693054744995313095-1388890293191847159?l=kangaroobox.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kangaroobox.blogspot.com/feeds/1388890293191847159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://kangaroobox.blogspot.com/2006/11/apc-smartups.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/1388890293191847159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5693054744995313095/posts/default/1388890293191847159'/><link rel='alternate' type='text/html' href='http://kangaroobox.blogspot.com/2006/11/apc-smartups.html' title='APC SmartUPS'/><author><name>Richard Hurt</name><uri>http://www.blogger.com/profile/07196615930668739458</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='22' src='http://bp1.blogger.com/_JBRPU8rTHVQ/SCieMw9oCvI/AAAAAAAABJI/eq4fbJjLgBY/S220/Photo+25_2.jpg'/></author><thr:total>0</thr:total></entry></feed>
