<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Robert Green&apos;s DIY</title>
    <link rel="alternate" type="text/html" href="http://www.rbgrn.net/blog/" />
    <link rel="self" type="application/atom+xml" href="http://www.rbgrn.net/blog/atom.xml" />
    <id>tag:www.rbgrn.net,2007-06-05:/blog/1</id>
    <updated>2008-08-06T20:34:28Z</updated>
    <subtitle>Articles for DIY Adventurists</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Publishing Platform 4.0</generator>

<entry>
    <title>Integrating Ruby on Rails with existing PHP or Perl Based Sites</title>
    <link rel="alternate" type="text/html" href="http://www.rbgrn.net/blog/2008/08/integrating-ruby-on-rails-with-existing-php-or-perl-based-si.html" />
    <id>tag:www.rbgrn.net,2008:/blog//1.72</id>

    <published>2008-08-05T04:30:29Z</published>
    <updated>2008-08-06T20:34:28Z</updated>

    <summary><![CDATA[So, you want to add some new features to your site using Ruby on Rails?&nbsp; That's not a bad idea.&nbsp; I've found Rails to be one of the quickest ways to develop small feature-rich sites quickly.&nbsp; The problem is getting...]]></summary>
    <author>
        <name>Robert Green</name>
        
    </author>
    
        <category term="How-To" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="programming" label="programming" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rubyonrails" label="ruby on rails" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.rbgrn.net/blog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image"><img alt="rails.png" src="http://www.rbgrn.net/blog/2008/08/05/rails.png" class="mt-image-left" style="margin: 0pt 20px 20px 0pt; float: left;" height="112" width="87" /></span>So, you want to add some new features to your site using Ruby on Rails?&nbsp; That's not a bad idea.&nbsp; I've found Rails to be one of the quickest ways to develop small feature-rich sites quickly.&nbsp; The problem is getting those new components integrated with the existing PHP, Perl, JSP, .NET or whatever other language codebase.&nbsp; I've found that it's really not that hard so long as you know the right tricks. &nbsp; <div><br /></div><div><br /></div>]]>
        <![CDATA[The big difference between a Rails app and PHP and Perl is that Rails apps run on an application server.&nbsp; An application server is always running and needs its own dedicated port.&nbsp; PHP and Perl are more commonly run as CGI, which is hosted by the webserver which is usually Apache.&nbsp; <br /><br />It's not that difficult to add the rails app in with the existing site by using mod_proxy.&nbsp; Mod_proxy is an apache module that intercepts HTTP calls on your regular web port (80), rewrites them and redirects to the port and URL of your choosing.&nbsp; An example of this would be <a href="http://www.diyelectriccar.com/garage">http://www.diyelectriccar.com/garage</a>.&nbsp; That is actually the rails portion of the site running on a different port via apache's mod_proxy.&nbsp; If I add another rails app to the site, I'll just use another port and another proxy mapping. <br /><br />My mod_proxy settings look like this:<br /><br />ProxyPass /garage http://localhost:3001/garage<br />ProxyPassReverse /garage http://localhost:3001/garage<br />ProxyPreserveHost On<br /><br />What this does is maps hits to /garage and /garage/* to port 3001/garage on the localhost.&nbsp; You could use this same technique to proxy the traffic to another application server, which is nice for scalability.&nbsp; One important thing to note is that when you are developing your app, you will want to use that same base URL instead of just / because it won't be on / when deployed to your production server.<br /><br />Also, if your site needs to handle more than just a small amount of traffic, you will need to run multiple mongrel servers to handle the load.&nbsp; These can be on the same machine, just like apache runs many child processes, and fortunately there is a gem called mongrel_clusters which will handle this for you.&nbsp; <a href="http://articles.slicehost.com/2008/5/9/ubuntu-hardy-mongrel-and-mongrel-clusters">Here is a tutorial on using mongrel_clusters</a>.<br /><br />Often times for integration pieces you will need to piggyback on one database while maintaining data in another.&nbsp; This is a very common integration problem and there are a few different ways to accomplish it with Rails.&nbsp; I had a relatively small number of tables I needed to work with from the integration database so I followed <a href="http://www.railsonwave.com/railsonwave/2006/12/11/multiple-database-handlng-with-rails">this method for mapping model classes to different databases</a>.<br /><br />After that was done I still had one more problem to solve.&nbsp; I needed a way to include the output of just one rails URL in my PHP app.&nbsp; The easiest way I found was through using a client-side AJAX call, just like Google's Adsense does.&nbsp; It may not be ideal for many situations, but for the ease of implementation, I had to try it and I think it worked out well.&nbsp; <a href="http://www.dynamicdrive.com/dynamicindex17/ajaxincludes.htm">Here is a method for doing client-side ajax includes</a> and <a href="http://www.diyelectriccar.com/forums/">if you look at the "random car from the garage" box up toward the top</a>, you will see how I was able to include the Rails call into a vBulletin forum which is PHP.<br /><br />To finish it all off, I simply put the different site components into navigation links in the header, copied much of the style between the 3 different pieces of software and I had a fully integrated custom feature written in Ruby on Rails for my site.<br /><br />Here is the end result:&nbsp; <br /><br />Main Site (PHP) - <a href="http://www.diyelectriccar.com/">www.diyelectriccar.com</a> (the garage box on top is an integrated component)<br />Rails app (RoR) - <a href="http://www.diyelectriccar.com/garage/">www.diyelectriccar.com/garage/</a><br />Site Blog (Perl) - <a href="http://www.diyelectriccar.com/blogs/">www.diyelectriccar.com/blogs/</a><br /><br />And with a little elbow grease, you have one site written in 3 languages.<br /><br />Update - 8/6/2008:<br />I installed <a href="http://www.modrails.com/">Phusion Passenger</a> and redeployed my apps with it.&nbsp; I highly recommend using this method as it's very easy to build and install and deployment couldn't be more simple.<br /><br />]]>
    </content>
</entry>

<entry>
    <title>How to Charge and Balance 2 3s1p Packs as a Single 6s1p</title>
    <link rel="alternate" type="text/html" href="http://www.rbgrn.net/blog/2008/07/how-to-charge-and-balance-2-3s1p-packs-as-a-single-6s1p.html" />
    <id>tag:www.rbgrn.net,2008:/blog//1.70</id>

    <published>2008-07-16T02:17:33Z</published>
    <updated>2008-07-16T03:11:00Z</updated>

    <summary><![CDATA[Anyone who owns a T-Rex 450 or 500 knows that one of the big downers is the short flights and long charge times.&nbsp; I have a Thunder Power 610c charger which is capable of charging a 6 cell pack, however...]]></summary>
    <author>
        <name>Robert Green</name>
        
    </author>
    
        <category term="How-To" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="rchelicopters" label="rc helicopters" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.rbgrn.net/blog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20024%20%281024x768%29.html" onclick="window.open('http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20024%20%281024x768%29.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20024%20%281024x768%29-thumb-200x150.jpg" alt="3s1p to 6s1p charging 024 (1024x768).JPG" class="mt-image-left" style="margin: 0pt 20px 20px 0pt; float: left;" height="150" width="200" /></a></span>Anyone who owns a T-Rex 450 or 500 knows that one of the big downers is the short flights and long charge times.&nbsp; I have a Thunder Power 610c charger which is capable of charging a 6 cell pack, however I only have 3 cell packs for my T-Rex 450.&nbsp; I read a forum post somewhere where someone built a parallel balancer lead which let him charge 2 3s1p packs at the same time.&nbsp; He had the right idea but the problem with charging them parallel like that is that the balancer can't see the true voltage of any one cell.&nbsp; It can only see the combined average voltage of the 2 that are paralleled.&nbsp; The only way to safely charge and balance 2 3s1p packs is to build a serial balance lead that combines the two packs into a proper 6s1p.&nbsp; The charger can then see each individual cell and will charge up to 25.2v, balancing the cells to 4.2v each.<br />]]>
        <![CDATA[First, gather your supplies.&nbsp; I ordered 2 Align-style 3 cell balance lead extensions, 1 Align-style 6 cell balance lead and a deans serial power lead from an online hobby store.&nbsp; You can build the deans lead yourself or use whatever connector your setup requires.&nbsp; So long as it's serial and is configured to allow 2 batteries and one charging connection, you'll be all set.&nbsp; I used a wire cutter/stripper and electrical tape.&nbsp; I recommend using solder and heat-shrink tubing but I did this in about 20 minutes in a hotel room using what I had in my parts box.<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20004%20%281024x768%29.html" onclick="window.open('http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20004%20%281024x768%29.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20004%20%281024x768%29-thumb-380x285.jpg" alt="3s1p to 6s1p charging 004 (1024x768).JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br /><div>I started by cutting the extensions in half and probably could have cut off much more because I had way too much wire to work.<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20005%20%281024x768%29.html" onclick="window.open('http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20005%20%281024x768%29.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20005%20%281024x768%29-thumb-380x285.jpg" alt="3s1p to 6s1p charging 005 (1024x768).JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br />Toss the male sides of the 3s leads and use only the female sides.&nbsp; Strip off about 3/4 of an inch from all 8 wires and then the 7 wires on the 6s male lead.<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20006%20%281024x768%29.html" onclick="window.open('http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20006%20%281024x768%29.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20006%20%281024x768%29-thumb-380x285.jpg" alt="3s1p to 6s1p charging 006 (1024x768).JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br /><br />Here is what you'll be working with before you start splicing the wires together:<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20007%20%281024x768%29.html" onclick="window.open('http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20007%20%281024x768%29.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20007%20%281024x768%29-thumb-380x285.jpg" alt="3s1p to 6s1p charging 007 (1024x768).JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br /></div><div><br />Lay out the wires so that the order on the 3s side from top to bottom is:&nbsp; red, blue, yellow, black, red, blue, yellow black.&nbsp; On the 6s side from top to bottom it should be red, all whites in (not crossed over each other), then the black on the bottom.&nbsp; Start tying the wires together from the reds down.<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20008%20%281024x768%29.html" onclick="window.open('http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20008%20%281024x768%29.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20008%20%281024x768%29-thumb-380x285.jpg" alt="3s1p to 6s1p charging 008 (1024x768).JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br /><br />I twisted and taped my wires, but I recommend soldering and using heat-shrink tubing.&nbsp; If you are going to twist and tape, I recommend putting the wires into a "Y" shape and evenly twisting them around each other for maximum strength.<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20009%20%281024x768%29.html" onclick="window.open('http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20009%20%281024x768%29.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20009%20%281024x768%29-thumb-380x285.jpg" alt="3s1p to 6s1p charging 009 (1024x768).JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br /></div><div><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20010%20%281024x768%29.html" onclick="window.open('http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20010%20%281024x768%29.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20010%20%281024x768%29-thumb-380x285.jpg" alt="3s1p to 6s1p charging 010 (1024x768).JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span></div><div><br /><br />I like to lay fold the twisted part in-line and tape very tightly to secure it in place.<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20012%20%281024x768%29.html" onclick="window.open('http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20012%20%281024x768%29.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20012%20%281024x768%29-thumb-380x285.jpg" alt="3s1p to 6s1p charging 012 (1024x768).JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br /></div><div><br />The center red and black wires of the 3s leads must tie to the single center wire of the 6s lead.<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20014%20%281024x768%29.html" onclick="window.open('http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20014%20%281024x768%29.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20014%20%281024x768%29-thumb-380x285.jpg" alt="3s1p to 6s1p charging 014 (1024x768).JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br /><br /></div><div>Continue wiring together the leads all the way through the bottom black wires.&nbsp; Here's how the full charging rig looks with two packs connected:<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20017%20%281024x768%29.html" onclick="window.open('http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20017%20%281024x768%29.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20017%20%281024x768%29-thumb-380x285.jpg" alt="3s1p to 6s1p charging 017 (1024x768).JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br /><b>VERY IMPORTANT</b>:&nbsp; The "Red" side of the power "Y" harness must be connected to the "Red" side of the balance lead, and the "Black" sides together to match, as shown here.&nbsp; The red side is the pack that is directly connected to the red lead of the 6s balancer and the red lead of the power wire.&nbsp; The black side is the pack that is directly connected to the black lead of the 6s balancer and the black lead of the power wire.&nbsp; <b>If this is not followed every time you charge, you risk ruining your charger, packs, wiring or a vicious fire</b>.&nbsp; I recommend labeling the deans and balance leads "1" and "2" to avoid any confusion.&nbsp; <br /><br /><br />Here is a closer shot of the wiring.<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20018%20%281024x768%29.html" onclick="window.open('http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20018%20%281024x768%29.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20018%20%281024x768%29-thumb-380x285.jpg" alt="3s1p to 6s1p charging 018 (1024x768).JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br /></div><div><br />Once connected to the charger/balancer, it will show as a 6s1p pack.&nbsp; Fully charged it should be 25.2v.&nbsp; I checked my cells out on the balancer and it was able to give me good readings for all 6 cells.<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20020%20%281024x768%29.html" onclick="window.open('http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20020%20%281024x768%29.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20020%20%281024x768%29-thumb-380x285.jpg" alt="3s1p to 6s1p charging 020 (1024x768).JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br /></div><div><br />Here's the finished lead after taping it up a little better.&nbsp; Again - this was made with spare parts in a hotel room so it doesn't look as pretty as I'd normally like but it does the job!&nbsp; I kept the red and black top and bottom wires out in the open on my harness so I wouldn't accidentally connect to the wrong packs.&nbsp; Again, I recommend labeling the balancer and matching deans leads "1" and "2" or "A" and "B" to avoid confusion.&nbsp; I did Align-style balance leads but this should work exactly the same on Thunder Power-style leads.&nbsp; Enjoy half the charge time for 2 packs!<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20025%20%281024x768%29.html" onclick="window.open('http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20025%20%281024x768%29.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/07/15/3s1p%20to%206s1p%20charging%20025%20%281024x768%29-thumb-380x285.jpg" alt="3s1p to 6s1p charging 025 (1024x768).JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br /><br /><b>Disclaimer:</b>&nbsp; I am not responsible for any injury as a result of or misuse of this information.&nbsp; Anyone attempting to build anything based on the information on this page must assume their own risk and responsibility.&nbsp; This is for educational purposes only and not an official guide from any manufacturer.&nbsp; I have no affiliation with any of the brands listed in this article.<br /><br /><br /></div>]]>
    </content>
</entry>

<entry>
    <title>5 Ways To Get The Most Out Of Vista</title>
    <link rel="alternate" type="text/html" href="http://www.rbgrn.net/blog/2008/07/5-ways-to-get-the-most-out-of-vista.html" />
    <id>tag:www.rbgrn.net,2008:/blog//1.69</id>

    <published>2008-07-11T17:34:00Z</published>
    <updated>2008-07-11T21:01:24Z</updated>

    <summary><![CDATA[After having run Windows Vista (Business 64) for over a month now, I can say that with a few tweaks, I believe it is ready for full-time use.&nbsp; I'm a full time consultant so I work off of a laptop...]]></summary>
    <author>
        <name>Robert Green</name>
        
    </author>
    
        <category term="How-To" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="vista" label="vista" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.rbgrn.net/blog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/07/11/vista-logo.jpg"><img alt="vista-logo.jpg" src="http://www.rbgrn.net/blog/2008/07/11/vista-logo-thumb-240x239.jpg" class="mt-image-left" style="margin: 0pt 20px 20px 0pt; float: left;" height="239" width="240" /></a></span>After having run Windows Vista (Business 64) for over a month now, I can say that with a few tweaks, I believe it is ready for full-time use.&nbsp; I'm a full time consultant so I work off of a laptop in the field running a full suite of software about 10 hours per day.&nbsp; This means that if my OS is misbehaving, I'm in big trouble because if I can't work, I can't bill my hours and if I can't bill my hours, I'm getting a serious call from the guys above.&nbsp; <br /><br />Despite all of the dogging of Vista from XP and 2000 users, I've found that I'm faster in my day-to-day activities than I was in Windows XP.&nbsp; Here's my list of Vista must-knows:<br /><br /><br /> <div><br /></div>]]>
        <![CDATA[<b>Vista Power Use #1:&nbsp; Hotkeys</b><br /><br />If you're the type that likes to right click, copy, right click, paste then I seriously suggest that you start learning a few hotkeys.&nbsp; Most people know the standard Alt-Tab, Control-Z, X, C and V.&nbsp; That's a great start and will surely speed up any editing you're doing.&nbsp; Here's the best list I've seen of Vista hotkeys (from <a href="http://www.shavedplatypus.com/forum/viewtopic.php?p=29825">shavedplatypus</a>)<br /><br />
Win-Space: Show sidebar
<br />
Win-D: Show desktop
<br />
Win-Tab: Flip 3D
<br />
Ctrl Win-Tab: Flip 3D which stays onto desktop, you can then scroll with up, down, left and right keys
<br />
Win-E: Opens explorer window
<br />
Win-R: Opens the run dialogue box, yes it still exists
<br />
Win-T: Tabs between running applications onto the taskbar, you know
like you would hover over each task with the mouse and get a live
preview of the app's.
<br />
Win-Q: When I tried this one out it launches the Office communicator for me, how does this behave for you?
<br />
Win-F: Opens the search window.
<br />
Win-G: Gives the sidebar the focus and when you press this key combination again it tabs between the gadgets on the sidebar
<br />
Win-L: Locks the computer, I use this a lot just quickly lock the PC when you go grab a cup of coffee.
<br />
Win-U: Opens the Ease of Access Center
<br />
Win-M: Minimizes all windows
<br />
Shift Win-M: Undo minimize windows
<br />
Win-X: Opens the Windows Mobility center
<br />Win-Number: Press the Win key and then choose a number of the
applications that are in the quick launch task bar. An example the
third icon on the taskbar (starting from left) is IE so to run IE press
Win-3 and it will launch IE.<br /><br />I use many of these, especially show desktop, show sidebar and lock computer. <br /><br /><br /><b>Vista Power Use #2:&nbsp; Hit Windows and start typing</b><br /><br />I really love this feature.&nbsp; I used to have <a href="http://www.launchy.net/">launchy</a> installed when I ran Windows XP and while this isn't customizable and doesn't have the same feature set, it's sure nice to see Microsoft get some real usability integrated with their new OS.&nbsp; Just press the windows key, start typing a program or document name and Vista will autocomplete to show the results in the start menu.&nbsp; Press enter when you see the right one and it'll open up.&nbsp; For example, when I want to run Cisco Anyconnect, I just hit windows, then start typing "anyconnect."&nbsp; It shows me by the time I've got the y in that Cisco's client is the top result and I can already hit enter to launch it.&nbsp; This saves me a lot of time when launching apps.&nbsp; <br /><br /><br /><b>Vista Power Use #3:&nbsp; Laptop Power Management</b><br /><br />A huge improvement over XP, Vista's power management offers far more detail in customizing your power scheme.&nbsp; I use 3 profiles on my machine:&nbsp; Maximum Performance, Power Source Optimized and Battery Saver.&nbsp; For each scheme, I have it tweaked out to give me exactly the type of performance or connectivity I desire.&nbsp; By default it seems to be set up fair enough, but I found that WiFi was set to maximum battery savings on all profiles so I changed it accordingly.&nbsp; To access this menu, go to Control Panel -&gt; Hardware and Sound -&gt; Power Options -&gt; Change Plan Settings -&gt; Change Advanced Power Settings.&nbsp; There are many options and I think you'll find that you can configure exactly to taste.<br /><br /><br /><b>Vista Power Use #4:&nbsp; The Sidebar</b><br /><br />The sidebar reminds me a lot of Mac-style computing which can be very useful.&nbsp; I found and installed a few gadgets like the calculator and a VNC client, which are things I use frequently.&nbsp; Having them on the sidebar and using my trusty Win-Space hotkey gives me quicker access to my common tasks.<br /><br /><br /><b>Vista Power Use #5:&nbsp; Photo Management</b><br /><br />While I was let down to find that MS has gotten rid of the old photo importer that XP had, I am happy to see that they've embraced tags and built in photo-management.&nbsp; Albums work ok for organizing photos but being able to tag and rate them in your OS makes it much easier to find exactly what you're looking for.&nbsp; Start entering tags on photos when you import them off your camera and you can pull up any tagged photos by doing an advanced search for that tag.&nbsp; Tags are also editable if you simply click on the file.<br /><br /><br />]]>
    </content>
</entry>

<entry>
    <title>Product Review:  Roku Netflix Instant Movie Player</title>
    <link rel="alternate" type="text/html" href="http://www.rbgrn.net/blog/2008/06/product-review-roku-netflix-instant-movie-player.html" />
    <id>tag:www.rbgrn.net,2008:/blog//1.68</id>

    <published>2008-06-07T05:02:56Z</published>
    <updated>2008-06-07T06:36:20Z</updated>

    <summary><![CDATA[ Following and complimenting the Netflix instant streaming video service for the PC, Roku has produced a Set-Top Box offering instant streaming of Netflix video to your home television set.&nbsp; This concept sounds simple:&nbsp; Just play the netflix movies over...]]></summary>
    <author>
        <name>Robert Green</name>
        
    </author>
    
        <category term="Product Reviews" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="computing" label="Computing" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="movies" label="movies" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.rbgrn.net/blog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/06/07/roku%20front%20corner%20%5B1024x768%5D.html" onclick="window.open('http://www.rbgrn.net/blog/2008/06/07/roku%20front%20corner%20%5B1024x768%5D.html','popup','width=1024,height=669,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/06/07/roku%20front%20corner%20%5B1024x768%5D-thumb-240x156.jpg" alt="roku front corner [1024x768].jpg" class="mt-image-left" style="margin: 0pt 20px 20px 0pt; float: left;" height="156" width="240" /></a></span> <div>Following and complimenting the Netflix instant streaming video service for the PC, Roku has produced a Set-Top Box offering instant streaming of Netflix video to your home television set.&nbsp; This concept sounds simple:&nbsp; Just play the netflix movies over the internet to your television.&nbsp; Unfortunately, this concept just hasn't been implemented well in the past.&nbsp; Even the movies-by-mail business hasn't gone over for others as well as it has for the online rental king and that seemed rather straightforward.&nbsp; Fortunately for us and in the Netflix tradition, the new service was implemented with a simple and straightforward interface which does one thing - plays video over the internet to your TV.<br /></div>]]>
        <![CDATA[<b>What you get (physically):</b><br /><br />I was very excited to receive my Roku box having waited nearly a month since ordering and countless months before that just knowing the technology exists but had yet to be implemented.&nbsp; It was only a matter of time until someone, mainly Netflix, released such a service.&nbsp; <br /><br />The Roku arrived in a small purple box with all necessary cables and instructions within.&nbsp; For my installation, I only needed an HDMI cable, but opted to get the high-quality cable pack anyway.&nbsp; The pack contained a fiber optic audio cable, component video cables and an HDMI cable.&nbsp; The cables all looked to be decent quality so I'd say for $20, it wasn't a bad deal.<br /><br /><b>Setting it up:</b><br /><br />Hooking up the Roku was a piece of cake:&nbsp; One power cable and one HDMI cable.&nbsp; Have a look at the back of the Roku to see how it connects.<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/06/07/roku%20back%20%5B1024x768%5D.html" onclick="window.open('http://www.rbgrn.net/blog/2008/06/07/roku%20back%20%5B1024x768%5D.html','popup','width=1024,height=443,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/06/07/roku%20back%20%5B1024x768%5D-thumb-380x164.jpg" alt="roku back [1024x768].jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="164" width="380" /></a></span><br /><div>It's all there, and in such a small package!&nbsp; See how it sits right under the bezel of my TV.&nbsp; It's not shown in this photo but the Roku is smaller than a Nintendo Wii!<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/06/07/roku%20010%20%5B1024x768%5D.html" onclick="window.open('http://www.rbgrn.net/blog/2008/06/07/roku%20010%20%5B1024x768%5D.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/06/07/roku%20010%20%5B1024x768%5D-thumb-380x285.jpg" alt="roku 010 [1024x768].JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br />One thing I was worried about before receiving the unit was its Wi-Fi capabilities.&nbsp; I couldn't imagine a new STB (Set Top Box) would be released without 802.11g or better but it's happened before.&nbsp; Upon turning on the Roku, I saw an option for wireless network configuration and knew I was in the clear.<br /><br />The configuration screens were very easy.&nbsp; Wireless password, a software update, Netflix account activation and screen width settings.&nbsp; Here are a few photos of the menus:<br /><br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/06/07/roku%20004%20%5B1024x768%5D.html" onclick="window.open('http://www.rbgrn.net/blog/2008/06/07/roku%20004%20%5B1024x768%5D.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/06/07/roku%20004%20%5B1024x768%5D-thumb-380x285.jpg" alt="roku 004 [1024x768].JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a><br /></span></div><div><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/06/07/roku%20005%20%5B1024x768%5D.html" onclick="window.open('http://www.rbgrn.net/blog/2008/06/07/roku%20005%20%5B1024x768%5D.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/06/07/roku%20005%20%5B1024x768%5D-thumb-380x285.jpg" alt="roku 005 [1024x768].JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span></div><div>The way the device attaches to your Netflix account is very clever.&nbsp; Instead of having you log in with a username and password on the box, it just generates a code and has you enter the code on the Netflix website from any computer.&nbsp; For me it took about 30 seconds to go to the activation site to enter the code and the Roku was ready to go.<br /><br /><b>Selecting video to watch:</b><br /><br />Ready for limitation number one?&nbsp; You have to use a computer or at least a regular web browser to select the videos you will be watching on your TV.&nbsp; Why?&nbsp; Because the Roku can only play videos that are in your "Instant" queue on Netflix.&nbsp; I didn't think this was such a big problem.&nbsp; We instantly filled up our queue with things we had been meaning to watch but hadn't gotten to yet.&nbsp; <br /><br />Once I sat back down on the couch to browse my new queue, it looked a little bit like this:<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/06/07/roku%20003%20%5B1024x768%5D.html" onclick="window.open('http://www.rbgrn.net/blog/2008/06/07/roku%20003%20%5B1024x768%5D.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/06/07/roku%20003%20%5B1024x768%5D-thumb-380x285.jpg" alt="roku 003 [1024x768].JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br />For a low number of items in the queue, this interface would get an A.&nbsp; It's responsive, easy to find what you're looking for and it's pretty.&nbsp; Load and synchronization times were very quick.&nbsp; Video selections seemed to appear instantly on screen when I would put them in my queue.&nbsp; No hassle here.<br /><br />Once you select your video, you will see a familiar thing:&nbsp; The 5-star rating.&nbsp; Hinging their recommendations upon user-fed ratings, netflix once again works in their ratability interface.&nbsp; Fortunately, they made it very quick and easy to do and I've already found myself ratings things directly off the Roku just because it's easy to do.&nbsp; Good work there.&nbsp; Videos can also be removed from this screen.&nbsp; Another simple but necessary function that works as you would expect it to.<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/06/07/roku%20002%20%5B1024x768%5D.html" onclick="window.open('http://www.rbgrn.net/blog/2008/06/07/roku%20002%20%5B1024x768%5D.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/06/07/roku%20002%20%5B1024x768%5D-thumb-380x285.jpg" alt="roku 002 [1024x768].JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br /><b>Watching the video</b><br /><br />Playback features include Resume (remembering where you left off), Restart (Play from beginning), then fast forward, rewind and pause.&nbsp; The remote control is incredibly simple, offering only arrow navigation, the aforementioned playback buttons and a home button.&nbsp; It's quite clear after starting a movie up that those buttons really are all that is needed to get a good experience.<br /><br />The first video we started to play took a few minutes to get buffered up, but once playback began, it was smooth and uninterrupted.&nbsp; The test broadband connection was about 2Mbps, which falls right around the current national average in the US.&nbsp; On a scale of 1 to 4, with 4 being best, we only got a 2 for video quality.&nbsp; I was a bit concerned that it would look fuzzy and full of compression (big blocky things moving around) but after watching all of The Orphanage, I must say that I'm very impressed.&nbsp; See this screenshot - the subtitles are clear enough to read from across the room on a 42" screen.&nbsp; Not bad!<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/06/07/roku%20011%20%5B1024x768%5D.html" onclick="window.open('http://www.rbgrn.net/blog/2008/06/07/roku%20011%20%5B1024x768%5D.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/06/07/roku%20011%20%5B1024x768%5D-thumb-380x285.jpg" alt="roku 011 [1024x768].JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br />The sound was fairly good too.&nbsp; I only listened in basic stereo but the dynamics were there and voices were clear.<br /><br /><b>Conclusion:</b><br /><br />One thing I was really hoping the device would have is a hard drive so that it could buffer higher quality versions of the video than you'd normally be able to stream.&nbsp; While Roku and Netflix did say there would be software updates released in the future to increase functionality, my guess is that my hard drive dream will go unrealized.&nbsp; I'm not sweating it though, this little box is exactly what I've been wanting on those nights where the notebook computer heat is too much on the lap in bed.&nbsp; <br /><br />The big drawback right now is video selection.&nbsp; While there are over ten thousand titles available, it's possible to get through everything you may really enjoy in just a couple of months.&nbsp; I really think they (netflix) need to step up the licensing and video transfer to make this service great.&nbsp; I have to imagine that it will happen sometime in the near future as the instant video on PC has always felt like somewhat of a beta test program to me.&nbsp; <br /><br /><b>Pros:&nbsp; </b><b>Streams Video, </b><b>Cheap, Easy Setup, Easy to Use, Good Quality<br />
Cons:&nbsp; Limited Selection, Requires Fast Broadband for High Quality, No Hard Drive</b><br /><br />I have to say that I'm very delighted with this device.&nbsp; It's quick, easy and gets the job done.&nbsp; I'm betting the selection will get better sooner rather than later and for me, that puts the pros way ahead of the cons.&nbsp; I'd recommend it if you're someone who already uses the Netflix "instant" service.&nbsp; If not, it may be better to wait until they have a more robust catalog available for instant viewing, but for $99, it doesn't make for a bad early adoption.<br /><br /></div>]]>
    </content>
</entry>

<entry>
    <title>Java Single Application Instance</title>
    <link rel="alternate" type="text/html" href="http://www.rbgrn.net/blog/2008/05/java-single-application-instance.html" />
    <id>tag:www.rbgrn.net,2008:/blog//1.67</id>

    <published>2008-05-26T16:15:21Z</published>
    <updated>2008-05-26T16:45:09Z</updated>

    <summary><![CDATA[A single instance application is one that only allows for 1 of the application to run no matter how many times the user tries to launch.&nbsp; Windows and linux native applications have an API to detect the instance of an...]]></summary>
    <author>
        <name>Robert Green</name>
        
    </author>
    
        <category term="How-To" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="programming" label="programming" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.rbgrn.net/blog/">
        <![CDATA[A single instance application is one that only allows for 1 of the application to run no matter how many times the user tries to launch.&nbsp; Windows and linux native applications have an API to detect the instance of an application but when in Java, it is not quite as easy or reliable.&nbsp; To complicate matters, often times the requirement will be for the original application instance to react in some way to the launch, as in bringing the window to the front, opening a file or displaying a message.<br /><br />Fortunately it's not all that difficult to code this if you know the trick.&nbsp; In this article I'll give you all the code you need to copy and paste into your application to make it single instance.<br /> ]]>
        <![CDATA[I've seen suggestions to use files as a cross-instance lock, but that is unreliable as application crashes and other IO errors may not allow for the file to be cleaned up.&nbsp; The better solution in my opinion is to use a local server socket.&nbsp; <br /><br />This code example works by having the first instance attempt to open a listening socket on the localhost interface.&nbsp; If it's able to open the socket, it is assumed that this is the first instance of the application to be launched.&nbsp; If not, the assumption is that an instance of this application is already running.&nbsp; The new instance must notify the existing instance that a launch was attempted, then exit.&nbsp; The existing instance takes over after receiving the notification and fires an event to the listener that handles the action.<br /><br />For security, I added a shared key that is used between the sender the receiver.&nbsp; In my implementation, the only constraint is that it must end with a newline character.&nbsp; That was just for ease of coding.&nbsp; The imports are all in java.io or java.net.<br /><br /><div class="code">public class ApplicationInstanceManager {<br /><br />&nbsp;&nbsp;&nbsp; private static ApplicationInstanceListener subListener;<br /><br />&nbsp;&nbsp;&nbsp; /** Randomly chosen, but static, high socket number */<br />&nbsp;&nbsp;&nbsp; public static final int SINGLE_INSTANCE_NETWORK_SOCKET = 44331;<br /><br />&nbsp;&nbsp;&nbsp; /** Must end with newline */<br />&nbsp;&nbsp;&nbsp; public static final String SINGLE_INSTANCE_SHARED_KEY = "$$NewInstance$$\n";<br /><br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp; &nbsp;* Registers this instance of the application.<br />&nbsp;&nbsp;&nbsp; &nbsp;* <br />&nbsp;&nbsp;&nbsp; &nbsp;* @return true if first instance, false if not.<br />&nbsp;&nbsp;&nbsp; &nbsp;*/<br />&nbsp;&nbsp;&nbsp; public static boolean registerInstance() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // returnValueOnError should be true if lenient (allows app to run on network error) or false if strict.<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; boolean returnValueOnError = true;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // try to open network socket<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // if success, listen to socket for new instance message, return true<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // if unable to open, connect to existing and send new instance message, return false<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; final ServerSocket socket = new ServerSocket(SINGLE_INSTANCE_NETWORK_SOCKET, 10, InetAddress<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; .getLocalHost());<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; log.debug("Listening for application instances on socket " + SINGLE_INSTANCE_NETWORK_SOCKET);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Thread instanceListenerThread = new Thread(new Runnable() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public void run() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; boolean socketClosed = false;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while (!socketClosed) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (socket.isClosed()) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; socketClosed = true;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } else {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Socket client = socket.accept();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String message = in.readLine();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (SINGLE_INSTANCE_SHARED_KEY.trim().equals(message.trim())) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; log.debug("Shared key matched - new application instance found");<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fireNewInstance();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; in.close();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; client.close();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (IOException e) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; socketClosed = true;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; });<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; instanceListenerThread.start();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // listen<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (UnknownHostException e) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; log.error(e.getMessage(), e);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return returnValueOnError;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (IOException e) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; log.debug("Port is already taken.&nbsp; Notifying first instance.");<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Socket clientSocket = new Socket(InetAddress.getLocalHost(), SINGLE_INSTANCE_NETWORK_SOCKET);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; OutputStream out = clientSocket.getOutputStream();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; out.write(SINGLE_INSTANCE_SHARED_KEY.getBytes());<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; out.close();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; clientSocket.close();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; log.debug("Successfully notified first instance.");<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (UnknownHostException e1) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; log.error(e.getMessage(), e);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return returnValueOnError;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (IOException e1) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; log.error("Error connecting to local port for single instance notification");<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; log.error(e1.getMessage(), e1);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return returnValueOnError;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return true;<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public static void setApplicationInstanceListener(ApplicationInstanceListener listener) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; subListener = listener;<br />&nbsp;&nbsp;&nbsp; }<br />}<br /><br />public interface ApplicationInstanceListener {<br />&nbsp;&nbsp;&nbsp; public void newInstanceCreated();<br />}<br /><br />public class MyApplication {<br />&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  if (!ApplicationInstanceManager.registerInstance()) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // instance already running.<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("Another instance of this application is already running.&nbsp; Exiting.");<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.exit(0);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  ApplicationInstanceManager.setApplicationInstanceListener(new ApplicationInstanceListener() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  public void newInstanceCreated() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  System.out.println("New instance detected...");<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  // this is where your handler code goes...<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  });<br />&nbsp;&nbsp;&nbsp; }<br />}</div><br />]]>
    </content>
</entry>

<entry>
    <title>How to upgrade the ram in a T60, T60p, T61 or T61p</title>
    <link rel="alternate" type="text/html" href="http://www.rbgrn.net/blog/2008/05/how-to-upgrade-the-ram-in-a-t60-t60p-t61-or-t61p.html" />
    <id>tag:www.rbgrn.net,2008:/blog//1.66</id>

    <published>2008-05-26T15:21:43Z</published>
    <updated>2008-05-26T16:09:37Z</updated>

    <summary><![CDATA[I've had to do this for several of these laptops now so I thought I'd just make a picture tutorial to explain.&nbsp; It's been pretty much the same for all models T60 and greater.&nbsp; What we've been doing is upgrading...]]></summary>
    <author>
        <name>Robert Green</name>
        
    </author>
    
        <category term="How-To" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="computing" label="Computing" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.rbgrn.net/blog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%201%20%5B1024x768%5D1.html" onclick="window.open('http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%201%20%5B1024x768%5D1.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%201%20%5B1024x768%5D-thumb-250x187.jpg" alt="t61p ram 1 [1024x768].JPG" class="mt-image-left" style="margin: 0pt 20px 20px 0pt; float: left;" height="187" width="250" /></a></span>I've had to do this for several of these laptops now so I thought I'd just make a picture tutorial to explain.&nbsp; It's been pretty much the same for all models T60 and greater.&nbsp; What we've been doing is upgrading machines with either 1 or 2GB up to 4GB.&nbsp; The memory is located under the touchpad on the front panel, which is removable via long screws on the bottom.&nbsp; All you need is a philips head precision screwdriver and your new ram, which must be compatible with the machine. <div><br /></div><div><br /></div>]]>
        <![CDATA[First off, you will need a precision screwdriver just like this:<br /><br /><div style="clear: both;">&nbsp;</div><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%208%20%5B1024x768%5D.html" onclick="window.open('http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%208%20%5B1024x768%5D.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%208%20%5B1024x768%5D-thumb-380x285.jpg" alt="t61p ram 8 [1024x768].JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br /><div><br />Start by flipping the laptop over.&nbsp; Find the holes that have a little etched memory-chip icon beside them.&nbsp; Some are for more than just the ram, but there will be 5 that have the memory-chip beside them and they will be towards the front of the laptop (away from the battery).<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%206%20%5B1024x768%5D.html" onclick="window.open('http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%206%20%5B1024x768%5D.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%206%20%5B1024x768%5D-thumb-380x285.jpg" alt="t61p ram 6 [1024x768].JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br /><br />Unscrew the screws using the precision driver and put them aside.&nbsp; Some may not come out easily but once you flip the laptop back over they'll fall so make sure to do it over a secure area so you don't lose them.<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%207%20%5B1024x768%5D.html" onclick="window.open('http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%207%20%5B1024x768%5D.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%207%20%5B1024x768%5D-thumb-380x285.jpg" alt="t61p ram 7 [1024x768].JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br /><br /><br />Flip the laptop back to it's normal orientation and open the lid.&nbsp; You should be able to grab the front panel and lift it up by the corners.<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%209%20%5B1024x768%5D.html" onclick="window.open('http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%209%20%5B1024x768%5D.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%209%20%5B1024x768%5D-thumb-380x285.jpg" alt="t61p ram 9 [1024x768].JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%2010%20%5B1024x768%5D.html" onclick="window.open('http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%2010%20%5B1024x768%5D.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%2010%20%5B1024x768%5D-thumb-380x285.jpg" alt="t61p ram 10 [1024x768].JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span></div><div><br /><br /><br /><br />Flip the lid up but be careful not to pull too hard on the ribbon cable connecting the touchpad.&nbsp; Right underneath you will see the ram that is currently installed.<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%2011%20%5B1024x768%5D.html" onclick="window.open('http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%2011%20%5B1024x768%5D.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%2011%20%5B1024x768%5D-thumb-380x285.jpg" alt="t61p ram 11 [1024x768].JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br /><br /></div><div><br />Pull outwards - away from the ram module on the little metal tabs holding it in.&nbsp; It shouldn't require a lot of effort and the ram will pop up if you've done it right.&nbsp; <br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%2012%20%5B1024x768%5D.html" onclick="window.open('http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%2012%20%5B1024x768%5D.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%2012%20%5B1024x768%5D-thumb-380x285.jpg" alt="t61p ram 12 [1024x768].JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br /><br /><br />It should slide easily out.&nbsp; Reverse the steps to install the new ram.&nbsp; Here is the new ram installed in my T61p:<br /><br /><span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%2013%20%5B1024x768%5D.html" onclick="window.open('http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%2013%20%5B1024x768%5D.html','popup','width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.rbgrn.net/blog/2008/05/26/t61p%20ram%2013%20%5B1024x768%5D-thumb-380x285.jpg" alt="t61p ram 13 [1024x768].JPG" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="285" width="380" /></a></span><br /><br />After that is done, make sure to boot the laptop up to see that all is working correctly and your ram is found.&nbsp; Remember - if you're running a 32bit OS, you'll only get to use around 3GB of RAM.&nbsp; You must run a 64bit OS to use all 4GB.&nbsp; <br /><br />The front panel will clip back down with a little gentle rocking action and the screws should go back in to be thumb-tight.<br /></div><div><br /></div>]]>
    </content>
</entry>

<entry>
    <title>Choosing a President by Trusting Celebrities and Public Figures</title>
    <link rel="alternate" type="text/html" href="http://www.rbgrn.net/blog/2008/05/choosing-a-president-by-trusting-celebrities-and-public-figu.html" />
    <id>tag:www.rbgrn.net,2008:/blog//1.65</id>

    <published>2008-05-12T18:32:31Z</published>
    <updated>2008-05-12T19:17:08Z</updated>

    <summary><![CDATA[I was at dinner with a few people some months ago when we got to talking politics.&nbsp; Rather than discuss the people and the issues though, we ended up talking about the process by which people select candidates to favor.&nbsp;...]]></summary>
    <author>
        <name>Robert Green</name>
        
    </author>
    
        <category term="Editorials" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="programming" label="programming" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="recommenders" label="recommenders" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.rbgrn.net/blog/">
        <![CDATA[I was at dinner with a few people some months ago when we got to talking politics.&nbsp; Rather than discuss the people and the issues though, we ended up talking about the process by which people select candidates to favor.&nbsp; One of the people said that his mother always picked her candidate not by reading about their position on issues or their history but instead by asking her friends who they are voting for.&nbsp; We joked that this person's mother is simply using collaborative filtering to get a good recommendation.&nbsp; Then we asked the question:&nbsp; Why isn't this process automated?&nbsp; Now it is -&nbsp; <a href="http://www.electionrecommender.com/">The Election Recommender</a>.&nbsp; We originally had only joked about using celebrity endorsements but the results have been very interesting so far.&nbsp; If you're satisfied just trying out the site, go ahead, otherwise read on for a more detailed explanation.<br />  ]]>
        <![CDATA[Collaborative filtering (CF) is the process by which collective knowledge is assembled and applied.&nbsp; Here's an example:<br /><br />Netflix uses a system called Cinematch to determine which movies you might enjoy.&nbsp; This system is a very specialized, highly tweaked linear collaborative filtering algorithm.&nbsp; It takes every rating you've done and compares that to every other user's ratings, usually using Pearson correlation or some similar algorithm.&nbsp; The correlation score simply translates to "How similar are you and the person compared to you".&nbsp; The reason pearson is used instead of just totaling up how many of the same-movie 5s, 4s.. etc you've had is because certain people tend to be biased - that is they will rate everything just a little higher or lower than you, even if you feel the exact same way about the films.&nbsp; Pearson takes bias into account, which is very nice.<br /><br />After correlating the users, your top "blank" spots can be found in the data.&nbsp; Movies that several people who have similar tastes to you have rated that you have not rated can be recommended, usually using some sort of weighting scheme to give extra priority to the best-match users.<br /><br />Think about it like this.&nbsp; Jerry, Bob and Cindy all rated the movie Alien vs Predator with 2 stars, The Incredibles with 5 stars and Iron Man with 5 stars.&nbsp; Jim also gave AVP 2 stars and the Incredibles 5 stars.&nbsp; The system sees that Jim has very strong correlation with Jerry, Bob and Cindy and so predicts that Jim will also rate Iron Man as 5 stars... And that becomes his recommendation.<br /><br />Make sense?<br /><br />There is actually a fantastic O'Reilly book out called "Collective Intelligence" that covers these topics very well and goes into machine learning and much more advanced material.&nbsp; I'll let you dive into all of that at your leisure.&nbsp; <br /><br />Back to the matter at hand.<br /><br />The Election Recommender is my third and most simple recommender system (after my netflix prize entry and a larger recommender system I developed last year).&nbsp; It uses linear collaborative filtering but the endorsers are static, unlike a system like netflix which uses users to collaborative with other users.&nbsp; It's very striaght-forward in that your preferences for the endorsers are filtered directly through to the candidates they endorsed and out pops the recommendation.&nbsp; It's simply based on highest score.<br /><br />Some would say that it's not true CF but it really is in its simplest form, which is why I think it makes for a good example of basic recommenders.&nbsp; Things would get much more interesting if somehow the endorsers were to endorse each other as well as the candidates.&nbsp; That would just create a web of which to filter instead of the straight path it is now.<br /><br />To get the election recommender more like Netflix we'd need to give the users the ability to rate the other users, which isn't exactly the interface I had in mind.<br /><br />The site is written completely in Ruby on Rails, is proxied through Apache 2 and runs on a FreeBSD server.&nbsp; I actually hope it gets some decent traffic so I can test out some scalability solutions for rails.&nbsp; <br /><br />Please let me know what you think of the site!&nbsp; Enjoy!<br /><br /><a href="http://www.electionrecommender.com/">The Election Recommender - Recommending America's Vote</a><br /><br /><br />]]>
    </content>
</entry>

<entry>
    <title>Advanced Typesafe Command Pattern using Java Generics</title>
    <link rel="alternate" type="text/html" href="http://www.rbgrn.net/blog/2008/04/advanced-typesafe-command-pattern-using-java-generics.html" />
    <id>tag:www.rbgrn.net,2008:/blog//1.64</id>

    <published>2008-04-17T15:55:00Z</published>
    <updated>2008-04-17T16:20:22Z</updated>

    <summary><![CDATA[If you have a need to use the command pattern and want to have a standard interface but with type safe parameters, I have come up with a solution.&nbsp; This is one of the most interesting uses (or hacks) of...]]></summary>
    <author>
        <name>Robert Green</name>
        
    </author>
    
        <category term="How-To" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="programming" label="programming" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.rbgrn.net/blog/">
        <![CDATA[If you have a need to use the command pattern and want to have a standard interface but with type safe parameters, I have come up with a solution.&nbsp; This is one of the most interesting uses (or hacks) of generics I've ever seen or come up with and being that it took a little bit of deep thought to get worked out, I'd like to share it with you all.&nbsp; <br /> ]]>
        <![CDATA[<b>Here's why you may want to use a Command pattern:</b><br /><br /><ol><li>You can call the code from anywhere in the system without dependencies.</li><li>You can bundle complicated logic into one place</li><li>You can decouple the code that executes from the interface allowing for multiple different implementations</li><li>You can modularize your code, allowing for a larger system that is still manageable.</li></ol><br /><b>What is the Command pattern?</b>&nbsp; Wikipedia sums it up better than I can - <a href="http://en.wikipedia.org/wiki/Command_pattern" target="_blank">http://en.wikipedia.org/wiki/Command_pattern</a><br /><br />Some people say a true command pattern is one where the Command requires no parameters.&nbsp; While that may be good in some cases, most often I've found that you certainly want to pass some sort of parameters to the command, otherwise why not just use Runnable?<br /><br />Of course you can just use an untypesafe interface of public Object executeCommand(String commandName, String... args) but that does not get you any compile-time checking of the arguments or the return type.&nbsp; It also doesn't even guarantee you got the command name right.<br /><br />What I wanted to do was to make it so that if I only knew the Command, I would know exactly which parameters it took, but all on a single method interface.&nbsp; I didn't want to have different interfaces for different commands because I was looking to have all invocations of commands be done from any subclass of MyBaseClass.&nbsp; For my example, we're going to have a Command be "FileChooserCommand", which will take a starting directory and filename mask as parameters and return a File.&nbsp; Here is how I wanted my class that is invoking the Command to work:<br /><br /><div class="code"><br />public class MyClass extends MyBaseClass {<br /><br />&nbsp;&nbsp;&nbsp; public void doStuff() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  System.out.println("Watch me invoke the command");<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; File chosenFile = executeCommand(Command.CHOOSE_FILE, new ChooseFileCommandParameters("c:\", "*.txt"));<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  System.out.println("The file you chose is: " + chosenFile);<br />&nbsp;&nbsp;&nbsp; }<br />}<br /></div><br /><br />Can you see the simplicity in this interface?&nbsp; Of course there are other ways to do this, but I chose this because I can standardize every conceivable command with it.&nbsp; What's really cool about it is that for every different command, you are guaranteed to have the correct parameter type passed in compile-time.&nbsp; It may seem like a trivial thing to get at first, but believe me, it's not.&nbsp; Java lets you define interfaces and lets you parameterize them, but <b>it doesn't let you have the second argument and return type both be dependent on the first argument</b>.&nbsp; Did you understand that?&nbsp; <b>This makes it so that both the return type and second argument change compile-time based on the first argument.&nbsp;&nbsp; </b>I'm trying to really push this idea because it's useful in other cases and not that easy to do properly.<br /><br />Here are the key pieces of code you will need to make this happen:<br /><br /><div class="code"><br />/** the command class defines the interface for a command and has the available commands listed out in my <br />* implementation.&nbsp; The important thing is the interface itself but the Command constants can be located in any <br />* class or classes.<br />*/<br />public class Command&lt;ParamType, ReturnType&gt; {<br />&nbsp;&nbsp;&nbsp; public static final Command&lt;ChooseFileCommandParams, File&gt; CHOOSE_FILE = new Command&lt;ChooseFileCommandParams, File&gt;(<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "Choose File");<br /><br />&nbsp;&nbsp;&nbsp; public static final Command&lt;AnotherCommandParams, String&gt; ANOTHER_COMMAND = new Command&lt;AnotherCommandParams, String&gt;(<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "Another Command");<br /><br />&nbsp;&nbsp;&nbsp; private String name;<br /><br />&nbsp;&nbsp;&nbsp; private Command(String name) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.name = name;<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public String getName() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return name;<br />&nbsp;&nbsp;&nbsp; }<br />}<br /></div><br /><br /><div class="code"><br />/**<br />* This is the interface for handling the commands that are executed.&nbsp; Implement this using the correct parameter <br />* type and return type to have code that handles the command.<br />*/<br />public interface CommandHandler&lt;ParamType, ReturnType&gt; {<br />&nbsp;&nbsp;&nbsp; public ReturnType execute(ParamType params) throws Exception;<br />}<br /></div><br /><br /><br /><div class="code"><br />/**<br />&nbsp;* Used to Bind Commands to CommandHandlers with parameterized types<br />&nbsp;* <br />&nbsp;* The point of this class is to enforce the 1-1 relationship between a command's param/return types and the handler's<br />&nbsp;* param/return types<br />&nbsp;* <br />&nbsp;*/<br />public class CommandHandlerBinding&lt;ParamType, ReturnType&gt; {<br />&nbsp;&nbsp;&nbsp; private Command&lt;ParamType, ReturnType&gt; command;<br /><br />&nbsp;&nbsp;&nbsp; private CommandHandler&lt;ParamType, ReturnType&gt; handler;<br /><br />&nbsp;&nbsp;&nbsp; public CommandHandlerBinding(Command&lt;ParamType, ReturnType&gt; command, CommandHandler&lt;ParamType, ReturnType&gt; handler) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.command = command;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.handler = handler;<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public Command&lt;ParamType, ReturnType&gt; getCommand() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return command;<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public CommandHandler&lt;ParamType, ReturnType&gt; getHandler() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return handler;<br />&nbsp;&nbsp;&nbsp; }<br />}<br /></div><br /><br /><div class="code"><br />/**<br />* base class - I don't do anything with it but I'm sure people would.<br />*/<br />public abstract class CommandParameters {<br />}<br /></div><br /><br /><div class="code"><br />/**<br />* Parameters for the file chooser command<br />*/<br />public class ChooseFileCommandParameters extends CommandParameters {<br />&nbsp;&nbsp;&nbsp; private String path;<br /><br />&nbsp;&nbsp;&nbsp; private String filter;<br /><br />&nbsp;&nbsp;&nbsp; public ChooseFileCommandParameters (String path, String filter) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.path = path;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.filter = filter;<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public String getPath() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return path;<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public String getFilter() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  return filter;<br />&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;  <br />}<br /></div><br /><br /><div class="code"><br />/**<br />* The ChooseFileCommandHandler.&nbsp; Performs the real work.<br />*/<br />public class ChooseFileCommandHandler implements CommandHandler&lt;ChooseFileCommandParams, File&gt; {<br />&nbsp;&nbsp;&nbsp; public File execute(ChooseFileCommandParams params) throws Exception {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; // UI code here to set up the chooser, set look and feel, defaults, etc..<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  // of course this won't compile because I made up a fake implementation.<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  // the point is to show how the work is encapsulated and nicely parameterized.<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  FileChooser chooser = new FileChooser(params.getPath(), params.getFilter());<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  chooser.open();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; File chosenFile = chooser.getSelection();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  if (chosenFile == null) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  new AlertDialog("File not chosen!");<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  return chosenFile;<br />&nbsp;&nbsp;&nbsp; }<br />}<br /></div><br /><br /><div class="code"><br />/**<br />* Handles registering command handlers (binding them to commands) and executing.&nbsp; I called this<br />* ApplicationContext but it can be any class that's initialized on application startup and accessible to any<br />* code that needs to execute commands.&nbsp; Most application frameworks have something like this.<br />*/<br />public class ApplicationContext {<br />&nbsp;&nbsp;&nbsp; private List&lt;CommandHandlerBinding&gt; commandHandlerBindings;<br />&nbsp;&nbsp;  <br />&nbsp;&nbsp;&nbsp; public void initializeApplication() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; registerCommandHandler(Command.CHOOSE_FILE, new ChooseFileCommandHandler());<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public &lt;ParamType, ReturnType&gt; void registerCommandHandler(Command&lt;ParamType, ReturnType&gt; command,<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; CommandHandler&lt;ParamType, ReturnType&gt; handler) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; CommandHandler&lt;ParamType, ReturnType&gt; existingHandler = getCommandHandler(command);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (existingHandler != null) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("Command [" + command.getName() + "] already has a handler ["<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + existingHandler.getClass().getName() + "] but is being set to [" + handler.getClass().getName()<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + "]");<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; commandHandlerBindings.add(new CommandHandlerBinding&lt;ParamType, ReturnType&gt;(command, handler));<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; private &lt;ParamType, ReturnType&gt; CommandHandler&lt;ParamType, ReturnType&gt; getCommandHandler(Command&lt;ParamType, ReturnType&gt; command) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (CommandHandlerBinding&lt;ParamType, ReturnType&gt; binding : commandHandlerBindings) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (binding.getCommand().getName().equals(command.getName())) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return binding.getHandler();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return null;<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; public &lt;ParamType, ReturnType&gt; ReturnType executeCommand(Command&lt;ParamType, ReturnType&gt; command,<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ParamType parameters) throws Exception {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; CommandHandler&lt;ParamType, ReturnType&gt; handler = getCommandHandler(command);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (handler == null) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; throw new NullPointerException("No CommandHandler registered for Command [" + command.getName() + "]");<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return handler.execute(parameters);<br />&nbsp;&nbsp;&nbsp; }<br />}<br /></div><br /><br /><div class="code"><br />/**<br />* The base class for anything.<br />*/<br />public abstract class MyBaseClass {<br />&nbsp;&nbsp;&nbsp; private ApplicationContext applicationContext;<br /><br />&nbsp;&nbsp;&nbsp; public &lt;ParamType, ReturnType&gt; ReturnType executeCommand(Command&lt;ParamType, ReturnType&gt; command,<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ParamType parameters) throws Exception {<br />&nbsp;&nbsp;&nbsp; &nbsp; return  getApplicationContext().executeCommand(command, parameters);<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; private ApplicationContext getApplicationContext() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  return applicationContext;<br />&nbsp;&nbsp;&nbsp; }<br />}<br /></div><br /><br /><div class="code"><br />/**<br />* Finally, the top of the stack.&nbsp; This is the class that is invoking the command.&nbsp; Looks simple from up<br />* here, doesn't it?<br />*/<br />public class MyClass extends MyBaseClass {<br /><br />&nbsp;&nbsp;&nbsp; public void doStuff() {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  System.out.println("Watch me invoke the command");<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; File chosenFile = executeCommand(Command.CHOOSE_FILE, new ChooseFileCommandParameters("c:\", "*.txt"));<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  System.out.println("The file you chose is: " + chosenFile);<br />&nbsp;&nbsp;&nbsp; }<br />}<br /></div><br /><br />There are many conceptual uses for this pattern and the way you integrate into your existing code base may vary.&nbsp; I know some people will object to defining the Commands as constants or having them defined in the Command interface.&nbsp; You don't have to do it that way.&nbsp; You can do it however you want.&nbsp; The proof here is that you can have dependent type safe parameters using generics.&nbsp; Try editing MyClass to have a String as the parameter.&nbsp; It won't compile.&nbsp; The idea is that your API will be very easy to use because your command pattern can ensure that programmers are passing the right parameters in and not casting the return type, which is determined by the Command itself.&nbsp; <br /><br />In a large application, I like to have logical units defined as Modules and each module is responsible for registering its own commands with the application context.&nbsp; That allows for commands to come and go just like plugins.&nbsp; One module can depend on another module's commands.&nbsp; All it needs to know is the location of the Command Constant and the CommandParameters class.&nbsp; That's the whole high-level API.<br /><br />You'll notice that most of the meat of the work here is done in ApplicationContext.&nbsp; That is not easy code to read, but fortunately it's not something you'll ever have to update.&nbsp; It handles, using the binding, the parameterization dependencies.&nbsp; <br /><br />This whole thing could be simplified if Java were to add some syntax to allow for parameter associations.&nbsp; Perhaps someone from Sun will read this and we can talk about it.<br /><br />
<b>Related Articles:</b><br /><br /><a href="http://www.rbgrn.net/blog/2007/10/object-oriented-programming-explained-part-2-polymorphism.html">Object Oriented Programming Explained - Part 2 - Polymorphism</a><br /><a href="http://www.rbgrn.net/blog/2007/10/object-oriented-programming-explained-part-1-the-basics.html">Object Oriented Programming Explained - Part 1 - The Basics</a><br /><a href="http://www.rbgrn.net/blog/2007/08/how-to-start-writing-software-web-applications.html"> How to start writing software:&nbsp; Web Applications</a><br /><a href="http://www.rbgrn.net/blog/2007/06/how-i-became-a-professional-software-developer.html">How I became a professional software developer</a><br /><br />]]>
    </content>
</entry>

<entry>
    <title>Teleportation will be the end of us all</title>
    <link rel="alternate" type="text/html" href="http://www.rbgrn.net/blog/2008/04/teleportation-will-be-the-end-of-us-all.html" />
    <id>tag:www.rbgrn.net,2008:/blog//1.63</id>

    <published>2008-04-10T03:12:59Z</published>
    <updated>2008-04-10T04:33:00Z</updated>

    <summary><![CDATA[For years I've had a theory about teleportation that has only recently been brought to mass attention by the movie The Prestige.&nbsp; Many films have been made about the topic and I'm sure some lesser-known films have covered the idea...]]></summary>
    <author>
        <name>Robert Green</name>
        
    </author>
    
        <category term="Editorials" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="science" label="science" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.rbgrn.net/blog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image"><img alt="teleport3.jpg" src="http://www.rbgrn.net/blog/2008/04/09/teleport3.jpg" class="mt-image-left" style="margin: 0pt 20px 20px 0pt; float: left;" height="278" width="255" /></span>For years I've had a theory about <a href="http://en.wikipedia.org/wiki/Teleportation" target="_blank">teleportation</a> that has only recently been brought to mass attention by the movie <i>The Prestige</i>.&nbsp; Many films have been made about the topic and I'm sure some lesser-known films have covered the idea of copy and kill but not as well as this film.&nbsp; With such a wide reach across the world, I'm happy that many people are able to see the issue with this concept.&nbsp; If you think I'm just being a paranoid sci-fi nut, think again because this technology is being actively <a href="http://www.research.ibm.com/quantuminfo/teleportation/" target="_blank">researched </a>with <a href="http://www.tribuneindia.com/2002/20021219/science.htm" target="_blank">some</a> <a href="http://news.independent.co.uk/sci_tech/article2611757.ece#2007-06-04T00:00:25-00:00" target="_blank">success</a> and may actually manifest itself in a human-usable way in the future.<br /> ]]>
        <![CDATA[The two basic ideas for teleportation are copy/kill and move.  Copy/kill means to take a snapshot of every particle comprising a person 

at a given instant, construct a new instance of that snapshot in a different location and disintegrate the original.  Move is exactly 

what one would think - to move every particle to a new location.  

<br /><br />Both ideas have their own sets of limitations and challenges.  For example, moving is constrained by distance.  Imagine if you were 

deconstructed at the atomic level, so every atom in your body was removed one by one.  Now take all of the different atoms (mostly 

carbon, I know)  and shoot them through a kind of atomic hose to the new location for reconstruction.  Not only do they have to be 

removed in order, but the energy required to move them would be greater than the energy of the contents themselves.  The distance would 

compound the energy usage.

<br /><br />Copy/kill has potential for more interesting designs.  Required for this idea to come together is a component that can "scan" your 

molecular structure or provide the "snapshot" of all particles in an instant and another component which can produce any particle in any 

state with regards to any other particle that uses electricity and may some other simple energy source.  This was the architecture of 

choice for the film <i>The Fly</i> in which a high-level scientist developed the machine using a scanner/disintegrator pod and an integrator 

pod to transport himself.  While it seems like it's the move theory, it's really copy/kill as any conversion of matter into energy has 

the same effect as just starting with energy and assembling.

<br /><br />My fears may have some sort of spiritual connotations because I will be talkin about losing ones very existance, stream of consciousness 

or as many believe, soul.  With that said, I actually don't have as much of a problem with the mover idea because, while at some point 

during the transport, you are totally disassembled and vulnerable to being lost forever into the ocean of atomic matter, I don't think 

it's that much different than having your limbs cut off and sewn back on, barbaric as that may sound.  I'm sure the disruption to the 

brain would likely put you in a coma or deliver a severe shock, but at the end of the day, you're still made of the exact same atoms 

that you started as and at any given point in time there was only 1 of you in existance.  

<br /><br />Copy/kill is much harder for me to accept.  Just like <i>The Prestige</i> illustrates, at some point there are 2 instances of you.  The 

troubling thing is that both of you will feel perfectly valid in desiring to stay alive.  The copy will think it's really you, even 

though it's simply an exact replica with all memories and emotions in-tact.  Frustratingly, one of you must die.  Of course it should be 

the copy, but in that film and like any practical transporter would operate, it would be the original, because how else would the device 

have any utility?

<br /><br />Imagine stepping into a transporter and feeling a strange, perhaps even very painful sensation surrounding and overtaking you.  Before 

you have time to react, your body is burning and your eyes are slightly raw but coming into focus.  You made it!  But is that really 

you?  What happened to the old you?  What would you do if there was a malfunction and your old self was never disintegrated?  Which one 

of you can have the old life back?  

<br /><br />The questions I have are endless and apply to most replication/cloning/time paradox issues but the biggest problem I have is the total 

disruption to your stream of consciousness.  I have issues accepting the new copy of yourself in the new location.  Of course you will 

feel totally legitimate, but are you really the same existentially?<br /><br />The question is totally philosophical but to sum up my thoughts:&nbsp; Are you greater than the sum of your parts?&nbsp; Somehow, I'd like to think so.<br />]]>
    </content>
</entry>

<entry>
    <title>Snowboarding:  How To Reliably Stick a 180</title>
    <link rel="alternate" type="text/html" href="http://www.rbgrn.net/blog/2007/12/snowboarding-how-to-reliably-stick-a-180.html" />
    <id>tag:www.rbgrn.net,2007:/blog//1.62</id>

    <published>2007-12-13T15:57:39Z</published>
    <updated>2007-12-13T17:26:44Z</updated>

    <summary><![CDATA[One of the prerequisites of being able to stick 180s is the ability to ride "switch" proficiently.&nbsp; Switch-stance just means riding facing the opposite direction of your normal stance.&nbsp; If you ride regular-foot, your normal stance faces to the right...]]></summary>
    <author>
        <name>Robert Green</name>
        
    </author>
    
        <category term="How-To" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="fun" label="fun" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="snowboarding" label="snowboarding" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.rbgrn.net/blog/">
        <![CDATA[One of the prerequisites of being able to stick 180s is the ability to ride "switch" proficiently.&nbsp; Switch-stance just means riding facing the opposite direction of your normal stance.&nbsp; If you ride regular-foot, your normal stance faces to the right and your switch faces to the left.&nbsp; If you ride goofy-foot, your normal is to the left and switch is to the right.&nbsp; It can feel very awkward to begin riding switch, but without acquiring the skill, you will struggle to balance or ride away from a 180 or (don't get ahead of yourself yet!) a 540. &nbsp; ]]>
        <![CDATA[I spent my first 20 days of riding just trying to get good riding regular stance, riding switch, handling small jumps and handling small terrain.&nbsp; At first riding switch feels very, very strange.&nbsp; It's difficult to convince yourself that it's worthwhile because it really does feel like a step backwards.&nbsp; You just started to feel like you've mastered the carve and now it's back to square-one.&nbsp; You'll fall, catch your edge, feel out of control and basically it'll seem like it's your second day riding again.&nbsp; Don't sweat it just yet.&nbsp; It may be frustrating but one day it will certainly click.<br /><br />One good way to learn switch is to just work it in a little bit every time you ride, that is to say, carve down the run and every once in a while, frontside the board into your switch stance and try to reverse all of your weight.&nbsp; Now your back foot is the rudder, more of your weight is on that foot and you're looking over your other shoulder.&nbsp; Try turning toe and heelside just a bit to see how it feels.&nbsp; Once you get uncomfortable, just frontside back over to your normal stance and you'll be good to go.&nbsp; If you're wondering what frontsiding is, it's simply saying rotate the board while looking downhill.&nbsp; Backside is to do it where you're looking uphill.<br /><br />These little bits start to add up.&nbsp; Over time, you'll get more and more comfortable with your switch stance to the point of where you don't even notice you're riding in it.&nbsp; Once you have that revelation, you know you should be able to handle 180s.&nbsp; <br /><br />The real trick to landing a 180 is making sure you can land it imperfectly if you haven't rotated the exact amount.&nbsp; Try a small jump first while riding slowly.&nbsp; When you approach the top of the kicker, wind your body backwards just a little bit so you can twist after you jump.&nbsp; You want to time it carefully so that you don't start twisting before the board has left the kicker or it'll trip you up.&nbsp; It's really not too terribly hard to do, it's just intimidating at first.&nbsp; Getting the rotation right is the first part.&nbsp; It's really just a matter of feel.&nbsp; You can practice just doing jumping 180s on a slight incline.&nbsp; You don't need a kicker for these.&nbsp; When landing in practice or on your kicker, you want to make sure that your weight is leaned uphill just a bit, your legs are bent at the knee so you can not only absorb the shock, but also so that when you touch down if the board isn't totally dead on, you can handle the edge and not catch it.&nbsp; <br /><br />Mental preparation is key as you want to be able to think switch as you're landing.&nbsp; Try only doing frontside 180s to start with.&nbsp; That way you can stay looking downhill the whole time.&nbsp; On landing the most important thing is to keep loose, keep those knees bent and keep that edge up.&nbsp; If you over-spin or under-spin you're going to have to smooth out the hit and that means instant edge control when you touch down.<br /><br />I have to recommend practicing on a slight incline at low speeds before trying on a kicker.&nbsp; You'll know when you're ready once you can ride at a comfortable speed, jumping 180s with no terrain of any sort.&nbsp; It's very disorienting at first when you touch down because everything feels backwards.&nbsp; If you want a good indication of when you're ready, try doing 10 practice (no kicker) FS 180s back and forth in a row.&nbsp; If you can do that without tripping, you're ready to take it to a jump.<br /><br />Keep practicing, learn your switch stance like the back of your hand and you should have no problems.<br /><br /><br /><b>Related Articles</b><br /><br /><a href="http://www.rbgrn.net/blog/2007/06/how-to-start-snowboarding.html">How to start snowboarding</a><br /><br />]]>
    </content>
</entry>

<entry>
    <title>I Propose Online Movie Rentals 2.0</title>
    <link rel="alternate" type="text/html" href="http://www.rbgrn.net/blog/2007/12/i-propose-online-movie-rentals-20.html" />
    <id>tag:www.rbgrn.net,2007:/blog//1.61</id>

    <published>2007-12-06T20:01:22Z</published>
    <updated>2007-12-06T20:10:16Z</updated>

    <summary><![CDATA[After having read the article about a new USPS surcharge that could cut into Netflix's profits I got to thinking about the future of movie rentals.&nbsp; If you're a Netflix customer and haven't tried their streaming video service, I recommend...]]></summary>
    <author>
        <name>Robert Green</name>
        
    </author>
    
        <category term="Editorials" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="business" label="business" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="movies" label="movies" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.rbgrn.net/blog/">
        <![CDATA[After having read the article about a new <a href="http://www.boston.com/business/technology/articles/2007/12/06/post_office_surcharge_could_slash_netflix_profit/" target="_blank">USPS surcharge that could cut into Netflix's profits</a> I got to thinking about the future of movie rentals.&nbsp; If you're a Netflix customer and haven't tried their streaming video service, I recommend you give it a shot.&nbsp; I've noticed the weak selection of titles available on it and can only imagine that it must be a licensing issue with the MPAA or specific rights-holder.&nbsp; While I enjoy their online video-watching service, I don't enjoy watching movies on my laptop as much as on my TV and I also don't enjoy having to plug my laptop into my TV.&nbsp; There is a feasible solution for all of this covering concerns like licensing agreements (giving consumers better selection) to proper television integration (no more laptops plugged into the TV.)&nbsp; Read on to find out how I see a successful movie rental business operating in the near future. ]]>
        <![CDATA[I'll start with the solution and then explain how it addresses all concerns.&nbsp; <br /><br /><b>The Scope of this Solution<br /></b><br />This is aimed at a company like Netflix, DirecTV, Dish Networks, Comcast or any other content licensee.&nbsp; I stated that this was a feasible business solution, not an ideal
consumer solution.&nbsp; You may think I'm too pro-business but what I'm
suggesting has more value to the consumer than receiving DVDs in the
mail and is something that the MPAA would potentially sign off on,
which is the key to delivery.&nbsp; This is a proposal for a video rental
replacement, not for an all-in-wonder media-whiz.&nbsp; Think of my proposal
as a compromise which gives the consumer better rental options than
currently available. <br /><br /><b>The Business Model</b><br /><br />Customers rent a number of movies at-a-time.&nbsp; The videos are available to watch on their TV at home.&nbsp; Only the number of videos they selected at-a-time are available until they remove one, at which point the next in queue would begin transferring.&nbsp; This is parallel to the way Netflix handles DVD rental by mail, except everything happens electronically.&nbsp; The big value for the customer is doing away with shipping time.&nbsp; New movies are instant, or only with a slight delay for high quality HD content.&nbsp; The rental company can charge a flat monthly rate and can rent any movie in its collection out because the customer is unable to copy or preserve it.&nbsp; They may rent it as many times as they wish but it must always be within the set movies-at-a-time limit.<br /><br />The hardware required is to be free as part of the subscription.&nbsp; View it as a necessary component in the chain.&nbsp; Without it, the business does not work.<br /><br /><b>Hardware<br /><br /></b>It starts with a set top box.&nbsp; This is not new concept for most vendors of course but the box would be special in a few ways.&nbsp; As far as hardware goes, it would have a hard drive with no less than 200GB capacity, a wireless connection no worse than Wireless-G,&nbsp; a wired connection no worse than 100 megabit, an HDMI output and a security card interface. <br />Seems rather limited.&nbsp; You may be inclined to ask me:&nbsp; <i>Why not better specs?&nbsp; Why only HDMI out?&nbsp; Why a security card?!&nbsp; </i><br /><br />The specifications don't need to be better than that.&nbsp; The fastest broadband connection available in the US right now is 15 megabit from Speakeasy.&nbsp; The max number of films one could have would be 8 at a time which in H.264 encoded 1080x1920 @24fps would take up 192GB of hard disk space according to figures <a href="http://en.wikipedia.org/wiki/Advanced_Video_Codec_High_Definition" target="_blank">here</a>.&nbsp; That's the absolute maximum quality and resolution for the HDTV specification and that video encoding.&nbsp; <br /><br />HDMI-only output is to circumvent copying by utilizing HDCP.&nbsp; Fair-use does not apply because the video was not purchased, it was rented.&nbsp; If you would like to buy the film you are allowed to make copies for personal use according to US law, but that is not the case here.&nbsp; The point is to alleviate MPAA fears of users copying films and spreading them around.&nbsp; This ensures that the video is only viewed by an HDCP compliant device, which should be good enough for their online blessing.<br /><br />The security card is to prevent users from hacking the software on the set top box.&nbsp; Using a similar approach to Hughes/DirecTV, one could implement a card that has a private key embedded into its code.&nbsp; The card is not crackable.&nbsp; If you don't believe me, please research NDS P4, P5, etc.. security cards.&nbsp; They are very reliable.&nbsp; The card could be used for a critical function such as decoding a stream, booting the OS by checking a hash of critical files, etc or other things.&nbsp; This ensures the box is not hacked and is operating as expected.<br /><br /><b>Software</b><br /><br />The software on the set top box would provide a listing of movies along with the current films downloaded.&nbsp; One would expect an intuitive, easy-to-use interface which gets straight to the point of watching films.&nbsp; There is much room here to add extra features but all the consumer really wants is to watch the movies available from the rental service.&nbsp; Anything else is gravy.<br /><br /><b>End-User Experience</b><br /><br />At the end of a long day at the office, the customer gets to plop down on the couch, turn on the TV and see what movies are available to watch right now.&nbsp; Got a craving for something else?&nbsp; Use the "watch now" function to remove an already-viewed film from the local queue and start downloading the new movie while watching it.&nbsp; Movies should be able to stream in real time but if the user wants higher quality than he/she has bandwidth for (such as Full HD), the movie can download in the background while he/she watches something else.&nbsp; Remote administration capabilities right through the user's online account make a fantastic addition, allowing the user to pick some what they want to watch when they get home in the evening and have it ready to go when they get there.<br /><br /><b>Closing Statements</b><br /><br />I believe this technology will happen in this form or a form very close to it.&nbsp; It makes sense to the customer, to the publisher and to the company in the middle, the movie rental service.&nbsp; While many incarnations of set top box and streaming video service exist and will continue to exist and evolve, this approach makes sense purely from a rental business standpoint.&nbsp; If Netflix doesn't do it, someone else will.&nbsp; I see this as the rental system of the future.<br /><br /><b>Related Articles</b><br /><br /><a href="http://www.rbgrn.net/blog/2007/11/review-netflix-instant-streaming-video-service.html">Review:&nbsp; Netflix Instant Streaming Video Service</a><br /><br />]]>
    </content>
</entry>

<entry>
    <title>Guitar Hero III on PS3 has Severe Playability Issues</title>
    <link rel="alternate" type="text/html" href="http://www.rbgrn.net/blog/2007/12/guitar-hero-iii-on-ps3-has-severe-playability-issues.html" />
    <id>tag:www.rbgrn.net,2007:/blog//1.60</id>

    <published>2007-12-05T00:41:06Z</published>
    <updated>2007-12-05T15:58:18Z</updated>

    <summary><![CDATA[As the latest in one of the most successful video game series today, Guitar Hero III offers the same rhythm-based game play as the previous releases.&nbsp; It is available for PS2, PS3, Nintendo Wii and Xbox 360.&nbsp; So far as...]]></summary>
    <author>
        <name>Robert Green</name>
        
    </author>
    
        <category term="Product Reviews" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="games" label="games" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.rbgrn.net/blog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2007/12/04/Guitar-Hero-III-1.jpg"><img alt="Guitar-Hero-III-1.jpg" src="http://www.rbgrn.net/blog/2007/12/04/Guitar-Hero-III-1-thumb-200x118.jpg" class="mt-image-left" style="margin: 0pt 20px 20px 0pt; float: left;" height="118" width="200" /></a></span>As the latest in one of the most <a href="http://kotaku.com/gaming/notag/guitar-hero-iii-sales-break-100-mil-in-seven-days-319177.php" target="_blank">successful video game series today</a>, <a href="http://en.wikipedia.org/wiki/Guitar_Hero_III:_Legends_of_Rock" target="_blank">Guitar Hero III</a> offers the same rhythm-based game play as the previous releases.&nbsp; It is available for PS2, PS3, Nintendo Wii and Xbox 360.&nbsp; So far as I have read, the game runs very well on all platforms except the PS3.&nbsp; Playstation 3 users are plagued with issues including controller problems and strange game behavior.&nbsp; I was one of the unfortunate ones to have excitedly purchased this game for PS3 only to find out that it's very difficult if not impossible to have a positive gaming experience with it.&nbsp; I spent some time researching the problems and my conclusion is that the PS3 version was rushed and absolutely not ready for market. ]]>
        <![CDATA[<b>A Pick-Shaped USB Dongle?</b><br /><br />The first thing I noticed after I opened up the box was a black pick-shaped USB dongle.&nbsp; I was hoping this was for some sort of lower-grade PS3 compatibility but after firing up the game and having no connectivity with the guitar controller, I reluctantly plugged it in and started pressing buttons.&nbsp; My system found the controller and worked right away.&nbsp; After reading other people's experiences, I feel fortunate for achieving such success.&nbsp; Many people reported problems of no syncing at all for the guitar, connection loss and other connection issues.&nbsp; Why Red Octane, the developing partners, couldn't get a regular bluetooth controller working is beyond me, but at this point I was already over it and ready to play.<br /><br /><b>Controller Lag?<br /><br /></b>Having played GH1 and GH2 through on "Expert" level, I felt that I should have no problems with this game.&nbsp; After all, it's the same interface and controller.&nbsp; As soon as I started the first song I knew something was wrong.&nbsp; Was I hitting the notes too early?&nbsp; Too late?&nbsp; Not at all?&nbsp; It occurred to me after failing that perhaps there was simply something wrong with the game.&nbsp; I played with the calibration settings but to no avail.&nbsp; I also found that the music sometimes would slow down and pitch down just like when you slow down a spinning record.&nbsp; It did this only occasionally, but it clearly wasn't supposed to be doing that.&nbsp; The game appeared to be broken.<br /><br />I put my theory to the test and asked someone who had the 360 version of the game and had mastered it on expert to try it out on my PS3.&nbsp; He immediately noticed the playability issue.&nbsp; He said something was clearly wrong but he couldn't put his finger on it.&nbsp; He was having problems playing medium songs when he was used to playing them on expert.&nbsp; I was sure now that it wasn't just me.<br /><br />We also tested this out on a PS3 other than my own.&nbsp; The problems were actually worse!&nbsp; At least I don't have a defective console.<br /><br /><b>Start making uneducated guesses now.</b><br /><br />This is the part people won't read before telling me how to "fix" this.&nbsp; I've seen enough of it on other blogs and forums.&nbsp; I have an HDTV (Panasonic 52" Rear Projection LCD) and I know it has minimal lag.&nbsp; How do I know this?&nbsp; I'm obsessed with rhythm games.&nbsp; I played 8 different versions of DDR, 2 GHs, Beatmania and 3 Karaoke Revolutions on it with not a single bit of sync issue.&nbsp; Below is a chart of things people are going to recommend.&nbsp; If I don't have it on the list, feel free to add it and I'll try it:<br /><br /><b>Fixes and poor justifications</b><br /><br />1.&nbsp;&nbsp;  Adjust the lag configuration in-game.<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  <i>I already said that I tried that.&nbsp; My TV and receiver don't have noticable lag on ANY GAME.&nbsp; This means that when I adjust that, the problem only gets worse.&nbsp; I also tried autodetecting the lag by strumming and guess what number it gave me?&nbsp; 0ms.&nbsp; No lag.</i><br /><br />2.&nbsp;&nbsp;&nbsp; Turn off digital processing on your TV.<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; <i>My set has minimal processing.&nbsp; It doesn't use DNLe or any of that nonsense.&nbsp; See the list above for games that worked.<br /></i><br />3.&nbsp;&nbsp;&nbsp; Turn off Dolby digital processing or anything else that may cause your receiver delays in audio processing.<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  <i>Tried it.&nbsp; The video doesn't seem to be quite right either.&nbsp; In fact, it feels to me like they made a huge open window of timing on the notes simply to compensate for the system's lack of stability.</i><br /><br />4.&nbsp;&nbsp;  You have an HDTV.&nbsp; They all have delay.<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  <i>That is simply untrue.&nbsp; I have played other rhythm games through my PS3 using the upconvert and it works perfectly.&nbsp; My TV runs games off my PS2 perfectly non-upconverted as well.&nbsp; IT ISN'T MY TV.</i><br /><br />5.&nbsp;&nbsp;  You're just bad at the game.<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  <i>No, I'm not.&nbsp; I played through both GH1 and GH2 on expert levels.&nbsp; I know how to play the game.<br /></i><i><br /></i>6.&nbsp;&nbsp; All wireless controllers have delays.<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  <i>The game runs perfectly on Wii and Xbox 360.&nbsp; Both are wireless.&nbsp; The Wii evens uses bluetooth, much like the PS3.&nbsp; That rules out wireless and bluetooth.</i><br />&nbsp;  <br /><b>For PS3, It's just broken.</b><br /><br />Activision has announced a new controller to be released in 2008.&nbsp; Hopefully just the controller is the problem but if it's the software as well, I would really appreciate an update soon.&nbsp; I've honestly tried everything and I don't believe there's anything else I can do to fix this.&nbsp; I believe the game is broken and it sounds like thousands of others do as well.&nbsp; I expect a little more out of a major game publisher on one of their hottest games and at $89 for the game with controller.&nbsp; If you have any choice at all, go for any platform BUT PS3.&nbsp; It simply doesn't work well on it.<br />&nbsp; <br /><b>Sources</b><br /><br /><a href="http://treyhutcheson.wordpress.com/2007/10/29/review-guitar-hero-3-on-the-ps3/" target="_blank">http://treyhutcheson.wordpress.com/2007/10/29/review-guitar-hero-3-on-the-ps3/</a><br /><a href="http://treyhutcheson.wordpress.com/2007/10/29/review-guitar-hero-3-on-the-ps3/" target="_blank">http://blogs.pcworld.com/gameon/archives/005982.html</a><br /><a href="http://www.1up.com/do/newsStory?cId=3164074" target="_blank">http://www.1up.com/do/newsStory?cId=3164074</a><br /><br />]]>
    </content>
</entry>

<entry>
    <title>Review:  Netflix Instant Streaming Video Service</title>
    <link rel="alternate" type="text/html" href="http://www.rbgrn.net/blog/2007/11/review-netflix-instant-streaming-video-service.html" />
    <id>tag:www.rbgrn.net,2007:/blog//1.59</id>

    <published>2007-11-20T23:00:09Z</published>
    <updated>2007-11-20T23:34:04Z</updated>

    <summary><![CDATA[Netflix has dominated the internet DVD rental market since its inception and until recently, that has been their only service.&nbsp; I've had a Netflix account for years now and have been quite satisfied with their service.&nbsp; I was especially happy...]]></summary>
    <author>
        <name>Robert Green</name>
        
    </author>
    
        <category term="Product Reviews" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="movies" label="movies" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.rbgrn.net/blog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image"><img alt="netflix.gif" src="http://www.rbgrn.net/blog/2007/11/20/netflix.gif" class="mt-image-left" style="margin: 0pt 20px 20px 0pt; float: left;" height="150" width="150" /></span>Netflix has dominated the internet DVD rental market since its inception and until recently, that has been their only service.&nbsp; I've had a Netflix account for years now and have been quite satisfied with their service.&nbsp; I was especially happy when they introduced Blu-Ray and HD-DVD as options.&nbsp; More recently they have upped the ante with their instant video service, which allows users to start watching a video instantly using a PC.&nbsp; This review will go over technical problems, selection, video quality and overall user experience with this new Netflix service. <div><br /></div>]]>
        <![CDATA["Fantastic," I said as I got the email announcing the new service.&nbsp; Finally, users are able to watch movies on the internet legally.&nbsp; This is a major achievement for the industry.&nbsp; Technical aspects aside, it has taken too long to address the issue of movie piracy.&nbsp; People aren't downloading movies because they are trying to break the law or because they are too cheap to buy the movie.&nbsp; They download movies because the technology is readily available and it's very convenient.&nbsp; It took the industry a few years to catch up to that.<br /><br />I'm a Firefox user and the first thing I noticed when I tried to watch a film off Netflix was my incompatible browser.&nbsp; They've traditionally been very good at cross-browser support so I was a little surprised but I switched over to IE just to make it work.&nbsp; Once I opened the site up in IE, I had the option to watch the movie instantly so I tried it out.&nbsp; At first it was just an error and it prompted me to download a few things.&nbsp; Initially, I had assumed that they had implemented the service as a Flash player.&nbsp; That approach would make sense to me because not only would it allow support for PC and Mac in all browsers but it would facilitate any DRM and custom codec mechanism of choice.&nbsp; This is not how Netflix opted to go.&nbsp; <i>Attn Netflix CTO:&nbsp; Give me a call if you like.&nbsp; We can work out something more accessible.&nbsp; I know people.</i>&nbsp; <i>Seriously.</i><br /><br />Netflix implemented their video player using Windows Media Player 11.&nbsp; For the growing Mac OSX base, that translates to SOL.&nbsp; For those of you with an illegitimate version of Windows XP, it also means you can't use it because you can't upgrade to WMP11 without WGA.&nbsp; Why would they do this?&nbsp; I'm sure it's part of a deal with the MPAA.&nbsp; If it's not, then I don't quite understand the solution because it's not reaching the growing Mac and Linux user base.&nbsp; Either way I had to download 2 sets of components and upgrade my media player to WMP11 to be able to use the service.<br /><br />Once connected, it determines your connection speed and sets the video resolution to match.&nbsp; That's a good thing.&nbsp; What it translates to is most people with broadband will be able to watch the movies.&nbsp; People with a slow connection don't get it quite as clear and people with a fast connection get the highest video quality.&nbsp; I'm assuming that applies to sound as well but I wasn't able to observe that.&nbsp; What I thought was interesting though was that the video looked far worse than any DivX movie I've watched at the same bitrate.&nbsp; It was pulling about 200kB/s to my laptop to achieve that.&nbsp; DivX encoded content looks near DVD quality at that rate.&nbsp; This was nowhere near as good, but it was still watchable. <br /><br />Currently they claim to have 5,000 movies available in the library but they are seriously lacking when it comes to current titles.&nbsp; I couldn't find most of the films I was looking for and many are big name.&nbsp; I'm assuming they are going to be improving their selection in the future.<br /><br />Overall my first experience was rocky.&nbsp; I don't like the choice of technology used because while it works for me, it doesn't reach a large group of users and I don't believe it delivers the best end user experience.&nbsp; The video choices are lacking right now but there are still some gems in the collection.&nbsp; I haven't used it enough to be able to really complain about the DRM used, but if I know DRM and I know the MPAA and I know Microsoft, it's sure to give users a headache.<br /><br /><b>My wishlist for Netflix:</b><br /><br /><ol><li>Flash-based player</li><li>Higher quality audio and video</li><li>Better selection</li><li>More lenient DRM allowing for watching downloaded films offline</li></ol><br /><b>Kudos to Netflix for:<br /></b><br /><ol><li>Starting the service at all</li><li>Having a large pipe to deliver the necessary bandwidth</li><li>Offering it for free to existing customers</li></ol><br />I applaud Netflix for initiating and providing a usable online on-demand video service.&nbsp; While I had technical difficulty getting everything working, it does work and I can watch movies.&nbsp; I look forward to their next major release of the service but until then will be trying to make the best of what's there right now.<br /><br />]]>
    </content>
</entry>

<entry>
    <title>Three Minute National Guard Movie Theater Ad Is Too Much!</title>
    <link rel="alternate" type="text/html" href="http://www.rbgrn.net/blog/2007/11/three-minute-national-guard-movie-theater-ad-is-too-much.html" />
    <id>tag:www.rbgrn.net,2007:/blog//1.57</id>

    <published>2007-11-20T22:29:00Z</published>
    <updated>2007-11-20T23:36:45Z</updated>

    <summary><![CDATA[Remember a time when there weren't ads before movies?&nbsp; It used to be that people were excited just for the previews and previews were all you got.&nbsp; Times were simpler then.&nbsp; People actually showed up early to see previews because...]]></summary>
    <author>
        <name>Robert Green</name>
        
    </author>
    
        <category term="Editorials" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="movies" label="movies" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.rbgrn.net/blog/">
        <![CDATA[Remember a time when there weren't ads before movies?&nbsp; It used to be that people were excited just for the previews and previews were all you got.&nbsp; Times were simpler then.&nbsp; People actually showed up early to see previews because previews were considered a perk of going to the theater.&nbsp; After paying $10 per seat and the same for refreshments, most people expect a certain level of comfort and service for their money.&nbsp; The TV-style ads have been annoying to say the least but recently I hit a new limit.&nbsp;&nbsp;<br /> ]]>
        <![CDATA[The other day I had to sit through a three-and-a-half minute long war-glorifying music video endorsing the US National Guard.&nbsp; Not only did I have to sit through it, but because I went to movies two days in a row, I had to see it twice. That's seven full minutes of "Citizen Soldier" by 3 doors down.&nbsp; The first time was simply irritating.&nbsp; Besides the fact that I'm not a war supporter in most senses, the depiction that war is a valiant, heroic effort is just offensive when put into context of the current US foreign policy.<br /><br />At first you may say to yourself, "So What?&nbsp; Deal with it."&nbsp; Ok, let's put this to the test.&nbsp; Imagine watching this whole video on the big screen every time you go to a movie.&nbsp; Can you stand to sit and <a href="http://www.youtube.com/watch?v=LJRthpxDM10" target="_blank">watch the whole thing on Youtube</a> right now?&nbsp; I'm sure I sound like I'm whining too much, but It's much worse when you paid good money to watch something you really want and have this forced in front of you with no x to click on to stop it.<br /><br />Sixty seconds of this would have been plenty.&nbsp; I could put up with that, but as the video goes on and on, you can look around the theater and see wear and tear on everyone's faces.&nbsp; In one of the theaters I was at, people started openly mocking the whole thing and you could hear complaints all around.&nbsp; <br /><br />Disclaimer:&nbsp; I support freedom.&nbsp; I don't support terrorism.&nbsp; I also don't support needless killing.&nbsp; I think most wars are needless.&nbsp; I also accept that sometimes there is no simple diplomatic resolution and actions must be taken.&nbsp; I'm not an idealist, but I'm not quick to opt for the trigger either.&nbsp; Got it?&nbsp; <br /><br />It's one thing for the National Guard to buy an ad spot.&nbsp; Every organization should be able to do that, right?&nbsp; My problem is partially with the content and partially the fact that's it's almost four minutes of awful music.&nbsp; Awful is a subjective term, of course.&nbsp; You may love the song.&nbsp; That's fine.&nbsp; I wouldn't like that ad even if it was my favorite song.&nbsp; In fact, it'd probably make my favorite song one of my lease favorites just because of the placement and context.<br /><br />If any theater executive is reading this, please stop that ad campaign.&nbsp; It makes people not want to go to theaters anymore.&nbsp; I'm fearing the barrage of car, movie ticket and war ads every time I go now.&nbsp; That's just gotta be plain and simple bad business to make your customers sit through that.&nbsp; Charge $10 for a ticket, fine.&nbsp; Charge $9 more for a small bag of popcorn and a soda, fine.&nbsp; Pile war-promoting music videos on top of that?&nbsp; There's my line.&nbsp; Enough already.<br /><br /><br /><br />]]>
    </content>
</entry>

<entry>
    <title>How to use your cell phone as a wireless Bluetooth modem</title>
    <link rel="alternate" type="text/html" href="http://www.rbgrn.net/blog/2007/11/how-to-use-your-cell-phone-as-a-wireless-bluetooth-modem.html" />
    <id>tag:www.rbgrn.net,2007:/blog//1.56</id>

    <published>2007-11-15T22:19:40Z</published>
    <updated>2008-04-01T18:47:55Z</updated>

    <summary><![CDATA[I was recently stuck in a situation where I had absolutely no broadband connection or phone line to dial up.&nbsp; What's a tech-nerd to do when in need of the internet but only able to use a laptop, cellphone and...]]></summary>
    <author>
        <name>Robert Green</name>
        
    </author>
    
        <category term="How-To" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="computing" label="computing" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.rbgrn.net/blog/">
        <![CDATA[<span class="mt-enclosure mt-enclosure-image"><a href="http://www.rbgrn.net/blog/2007/11/15/bluetooth_logo_1.jpg"><img alt="bluetooth_logo_1.jpg" src="http://www.rbgrn.net/blog/2007/11/15/bluetooth_logo_1-thumb-50x70.jpg" class="mt-image-left" style="margin: 0pt 20px 20px 0pt; float: left;" height="70" width="50" /></a></span>I was recently stuck in a situation where I had absolutely no broadband connection or phone line to dial up.&nbsp; What's a tech-nerd to do when in need of the internet but only able to use a laptop, cellphone and no wires?&nbsp; Get this - Not only did I get this to work, but I successfully connected to my company's VPN over it and was able to work for the day, slowly but surely over the 115kbps <a href="http://en.wikipedia.org/wiki/Enhanced_Data_Rates_for_GSM_Evolution" target="_blank">EDGE network</a>.&nbsp; Just to push the point home, I connected to our mail server via VPN via Internet via EDGE via Cellphone via <a href="http://en.wikipedia.org/wiki/Bluetooth" target="_blank">Bluetooth</a>.&nbsp; No wires needed.&nbsp; The sweet part is that it doesn't cost me anything to do this because it's part of my unlimited data plan and uses no minutes.&nbsp; I use T-Mobile, but will give settings to the best of my knowledge for all the other providers. ]]>
        <![CDATA[So how does one set up this miraculously long chain of physical and logical connections?&nbsp; I used a Samsung D900 on T-Mobile for this but I'll try to make it work for you and your phone as well.&nbsp; Also I'm going to refer to the computer as the laptop but this will work for a PC with bluetooth as well.&nbsp; This technique is only for GSM networks (T-Mobile or At&amp;t in the US).&nbsp; It may work on European GSM network as well with slight modification to settings.<br /><br /><b>1) Enable bluetooth on your phone</b><br /><br />This is easy but every phone is a little different.&nbsp; In mine I have to do Applications -&gt; Bluetooth -&gt; Activation -&gt; On.<br /><br /><b>2) Link your laptop with your phone</b><br /><br />Set your phone's bluetooth to "Discoverable."&nbsp; for me it's in the Bluetooth menu under "My phone's visibility."&nbsp; This setting makes it so that your laptop will be able to find your phone and link to it.<br /><br />'Right click on the bluetooth icon in your system tray and use the bluetooth setup wizard.&nbsp; Choose "I know the service I want to use and I want to find a Bluetooth device that provides the service."&nbsp; Next choose "Dial up networking."&nbsp; Find your phone in the list of devices and add it.&nbsp; If you have security enabled, you will be asked for a PIN.&nbsp; Make up any number you want, but remember it.&nbsp; On the phone, enter the PIN you made up on your laptop.<br /><br />At this point you can turn off the visibility/discoverable on your phone but leave Bluetooth running.<br /><br /><b>3) Start the dial-up connection</b><br /><br />Double click on the Bluetooth icon or right-click and "Explore my Bluetooth places."&nbsp; You should see an icon that looks like a computer and a phone that says your phone's Bluetooth name and then "Dial-up Networking." Double click on that or right-click and "Connect."<br /><br />For the phone number, put in *99# and dial.&nbsp; Your phone should connect to EDGE/GPRS now.&nbsp; If it does not, try *99**1*1# or *99***1#.&nbsp; If none of these work, post a comment with your phone model and we'll see if we can figure out what the code is.<br /><br />If it's successful, you'll generally see an indication on your phone that it's connected to EDGE/GPRS.&nbsp; If not it'll either sit indefinitely waiting for a connection or you'll get an error.&nbsp; It should not ever try to dial a number.&nbsp; That is not what you want.&nbsp; You want to be connected to EDGE/GPRS.<br /><br /><b>4)&nbsp; Configure the proxy server</b><br /><br />This is the part that I got stuck at the first time I tried to do this.&nbsp; For those of you who have used unlocked/unbranded phones, you've had to