<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6897130125864772151</id><updated>2011-11-19T05:54:35.020-06:00</updated><category term='C++'/><category term='OpenMoko'/><category term='jokes'/><category term='radio'/><category term='late for school'/><category term='hacks'/><category term='recipes for disaster'/><category term='Linux'/><category term='programming'/><category term='robot'/><category term='altoids'/><category term='projects'/><category term='nipples'/><category term='junk'/><category term='Neo Freerunner'/><category term='computers'/><category term='i hate clocks'/><category term='bicycle shop'/><category term='mods'/><title type='text'>Steely Eyed Codeslinger</title><subtitle type='html'>sudo apt-get install happiness</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>61</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-4772507259644813454</id><published>2009-12-25T14:23:00.027-06:00</published><updated>2009-12-26T01:07:35.207-06:00</updated><title type='text'>Freerunner Battery Mod, Case Mod, Runs Android</title><content type='html'>&lt;p&gt;Oklahoma was hit by the biggest snow storm in state history this Christmas.  Since we were snowed in and couldn't visit relatives, I found myself with some unexpected time on my hands.  So I built my own Android phone.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s7k3i46yEG0/SzU9zmgDBGI/AAAAAAAAAXY/dvC-ed0gHZQ/s1600-h/snowed+in.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 237px;" src="http://1.bp.blogspot.com/_s7k3i46yEG0/SzU9zmgDBGI/AAAAAAAAAXY/dvC-ed0gHZQ/s400/snowed+in.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5419305683327845474" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I bought a Neo Freerunner last year, but some design flaws kept it from being usable to me as an everyday phone:  pitiful battery life, audio problems, and no single Linux distribution stood out as the one best choice to use.  But the battery was the worst problem.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_s7k3i46yEG0/SzVDTEBsPPI/AAAAAAAAAXg/GZz3Ca8qGHE/s1600-h/P3100056.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_s7k3i46yEG0/SzVDTEBsPPI/AAAAAAAAAXg/GZz3Ca8qGHE/s320/P3100056.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5419311721387670770" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;My previous experiments had shown that if you remove the battery monitor circuit board from the original battery:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s7k3i46yEG0/SzVDxkovnoI/AAAAAAAAAXo/O_ivNEZ00rg/s1600-h/P3100065.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_s7k3i46yEG0/SzVDxkovnoI/AAAAAAAAAXo/O_ivNEZ00rg/s400/P3100065.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5419312245537480322" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;...you can transfer it to a larger Li-Ion battery, like this one from a portable DVD player, and it will work.  Surprisingly the BQ27000 chip on the smart battery board is able to learn the larger battery capacity.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s7k3i46yEG0/SzVHnzuP-oI/AAAAAAAAAXw/zFOQGlplbDc/s1600-h/P3100080.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_s7k3i46yEG0/SzVHnzuP-oI/AAAAAAAAAXw/zFOQGlplbDc/s400/P3100080.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5419316475834923650" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Of course, I didn't let the old battery go to waste either...&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s7k3i46yEG0/SzW04zPb5zI/AAAAAAAAAZY/zAXAKuG6wTw/s1600-h/P3120094.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_s7k3i46yEG0/SzW04zPb5zI/AAAAAAAAAZY/zAXAKuG6wTw/s400/P3120094.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5419436614530885426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_s7k3i46yEG0/SzW0VqJhtMI/AAAAAAAAAZQ/6XII6WKxkUQ/s1600-h/P3120119.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_s7k3i46yEG0/SzW0VqJhtMI/AAAAAAAAAZQ/6XII6WKxkUQ/s400/P3120119.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5419436010794759362" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The prototype battery mod worked but I needed to give the phone a bigger enclosure so the battery wouldn't have to be on the outside where it might be damaged.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_s7k3i46yEG0/SzWyTFNUX2I/AAAAAAAAAZA/1zTw4_Sawuw/s1600-h/P3100085.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_s7k3i46yEG0/SzWyTFNUX2I/AAAAAAAAAZA/1zTw4_Sawuw/s400/P3100085.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5419433767495556962" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Having proved the concept, I exchanged the junk DVD player battery for a brand new 6 AH Li-Ion battery from Sparkfun, and put it all into the case from a 2.5 inch portable hard drive.  (To put that in perspective, the original battery was only 1100 mAH.)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s7k3i46yEG0/SzWVUb-1_eI/AAAAAAAAAYI/eq3Z6_8-Y1Y/s1600-h/PC250619.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_s7k3i46yEG0/SzWVUb-1_eI/AAAAAAAAAYI/eq3Z6_8-Y1Y/s400/PC250619.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5419401904951524834" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_s7k3i46yEG0/SzWR-r95sCI/AAAAAAAAAX4/PFnAWzPnnrw/s1600-h/PC250618.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_s7k3i46yEG0/SzWR-r95sCI/AAAAAAAAAX4/PFnAWzPnnrw/s400/PC250618.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5419398232750534690" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Rather than try to cut the hard drive case to perfectly match the Freerunner circuit board, I simply reused the original phone faceplate since it already had the proper board mounting locations.  I cut an oval hole in the hard drive case (free hand with a dremel), and then used JB Weld to join the two pieces and to even out the gaps between them.  I put the JB Weld on sloppy but used a wet paper towel to wash away the excess, leaving a nice even seam all the way around.  (Turns out JB Weld is water soluble - who knew!)&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s7k3i46yEG0/SzWUdy_TQOI/AAAAAAAAAYA/gNUB6QqdGs0/s1600-h/PC250612.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_s7k3i46yEG0/SzWUdy_TQOI/AAAAAAAAAYA/gNUB6QqdGs0/s400/PC250612.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5419400966234652898" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;By the way that silver squiggle shape on the front is the cellular antenna.  I ran out of room on the inside, so I put the antenna on the outside!  And putting the antenna next to my cheek is a good way to extend a sarcastic "bite me" to all those idiots who argue from a position of ignorance that cell phone signals cause cancer without knowing the first thing about the physics of radio signals.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Although from the faceplate it may appear as though an entire Freerunner has been simply embedded into the new case, behind the faceplate there is nothing left of the original Freerunner case, and some components have been moved and some improvements made as I tried to rectify my main complaints about the original phone.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s7k3i46yEG0/SzWcmb5JRUI/AAAAAAAAAYQ/Y-D8gD6-4QU/s1600-h/fast+charge.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 360px;" src="http://2.bp.blogspot.com/_s7k3i46yEG0/SzWcmb5JRUI/AAAAAAAAAYQ/Y-D8gD6-4QU/s400/fast+charge.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5419409910746662210" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s7k3i46yEG0/SzWcmnqfxrI/AAAAAAAAAYY/w8pIu9MHr5g/s1600-h/other+annotations.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_s7k3i46yEG0/SzWcmnqfxrI/AAAAAAAAAYY/w8pIu9MHr5g/s400/other+annotations.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5419409913906448050" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Here it is charging at a total rate of nearly 2 amps using both the fast charge board and the Freerunner's internal charging circuitry.  No apparent harm comes of running them both at once, and the extra charger doesn't confuse the battery gas gauge chip either.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s7k3i46yEG0/SzWsXx7yf5I/AAAAAAAAAYo/_vgUPFsTyXs/s1600-h/PC240584.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_s7k3i46yEG0/SzWsXx7yf5I/AAAAAAAAAYo/_vgUPFsTyXs/s400/PC240584.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5419427251151339410" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The BQ27000 learns the battery capacity by observing a complete battery discharge cycle.  Unfortunately software will shut down the phone when it thinks the battery is empty, so we'll never actually reach a full discharge of the new battery to recalibrate the gas gauge!  Luckily I built a battery discharge device a while back, which is really just a mess of enormous low-ohm power resistors strapped to a massive heatsink with a fan on top.  And a fancy digital temperature readout so I know whether I'm actually frying my power resistors.  This discharges this battery at a rate of 1 amp, which is a bit too fast, but with a 6 AH battery I could be waiting all weekend for it to discharge at "normal" current draws.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s7k3i46yEG0/SzWsXRr1JlI/AAAAAAAAAYg/cijBuaslZpY/s1600-h/PC240587.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_s7k3i46yEG0/SzWsXRr1JlI/AAAAAAAAAYg/cijBuaslZpY/s400/PC240587.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5419427242494469714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The documentation for the BQ27000 gas gauge chip mentions that it doesn't revise its capacity estimate downward more than 1/8th of the total at a time.  It doesn't say anything about how the estimate gets revised upward, but experimentation with the test battery from the DVD player indicates that it caps the upward change at 1/4th of the previous estimate each time.  The test battery reached 2.2 AH, so I can only expect the BQ27000 to revise the estimate up by about 0.55 AH on this cycle.  It's probably not worth the trouble to work it up to the full 6 AH reading, since the process takes 12 hours and I'll be slightly damaging the battery every time I completely discharge it!  Maybe when the battery is deteriorated in a few years, I'll calibrate it to whatever reduced capacity is still in it.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Not really visible in the pictures, but I removed the speakerphone (which was useless in its old location because its proximity to the microphone made it impossible to actually use speakerphone without getting a loud feedback squeal) and connected it in place of the earpiece.  I thought that, because it was bigger, it would be louder than the earpiece, but instead it is much softer, nearly inaudible.  I think that's because the earpiece measures as high impedance while the speakerphone speaker is low impedance, so there isn't an efficient transfer of power.  Tomorrow I'll cannibalize the audio amplifier IC from that same portable DVD player I got the test battery from, and use it to fabricate a tiny audio amplifier board to drive the earpiece &amp; match the impedances.  (I can design a circuit in my head and build it on a new board as fast as I can take the components off the board I'm cannibalizing.)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;That will also provide me a physical volume control so I won't have to rely on the goofy software volume settings that never seem to work right on the Freerunner.  Hmmm... Maybe I'll make it stereo while I'm at it.  The Neo 1971 (prototype to the Freerunner) had stereo speakers in it, but not the Freerunner.  The audio amplifier chip in the DVD player is stereo, and I can pull a stereo signal from the headphone jack.  Interesting...&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So... Android right?  Remember at the top I said that my original goal was to address some specific flaws with the Freerunner, one of which being lack of a definite distribution to stick with.  I didn't actually like Android when I first tried it (still not sure about it) but it seems to be where the ball is rolling.  When I began to think I wanted a Motorola Droid, and when blogs and podcasts started going crazy over the (latest) rumored Google phone, I had to stop and remember, wait a minute, I already HAVE hardware capable of running Android.  It's just been sitting on my desk in pieces waiting for me to put it together.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_s7k3i46yEG0/SzWsYIV_-7I/AAAAAAAAAYw/4FhdChbbK10/s1600-h/PC250611.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_s7k3i46yEG0/SzWsYIV_-7I/AAAAAAAAAYw/4FhdChbbK10/s400/PC250611.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5419427257166855090" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Installing Android was a breeze; easier than any other install I've done on the Freerunner.  You just untar a file onto an SD card, and then booting off the SD card prepares Android on the Freerunner.  No messing around with the flashing the phone over USB, and no messing around with bootstrapping the system on the phone itself like Debian does.  Just pop in the SD card and it just works.  Not much else to it - except wifi doesn't work.  Why does wifi never work for me on Linux?  Oh well...&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s7k3i46yEG0/SzWsYtGgFgI/AAAAAAAAAY4/3zShSWvWABI/s1600-h/PC250617.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_s7k3i46yEG0/SzWsYtGgFgI/AAAAAAAAAY4/3zShSWvWABI/s400/PC250617.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5419427267033961986" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-4772507259644813454?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/4772507259644813454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=4772507259644813454' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4772507259644813454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4772507259644813454'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2009/12/freerunner-battery-mod-case-mod-runs.html' title='Freerunner Battery Mod, Case Mod, Runs Android'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_s7k3i46yEG0/SzU9zmgDBGI/AAAAAAAAAXY/dvC-ed0gHZQ/s72-c/snowed+in.jpg' height='72' width='72'/><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-3157569594159593619</id><published>2009-10-09T18:30:00.003-05:00</published><updated>2009-10-09T18:38:42.771-05:00</updated><title type='text'>Anything That's Not Tied Down</title><content type='html'>This morning when I got out of class I found someone had undone several of the velcro straps that hold my electric bicycle's battery on.  Fortunately the battery (and the bicycle!) were still ok.&lt;br /&gt;&lt;br /&gt;My guess is someone just saw a bulky black bag and decided to steal it without knowing what was inside.  Walk-by snatch and grab.  I like to think the sheer weight of 30 lbs of lead acid batteries scared them into letting go of it.  And anyway there's more straps holding that thing down on the front side.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-3157569594159593619?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/3157569594159593619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=3157569594159593619' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/3157569594159593619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/3157569594159593619'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2009/10/anything-thats-not-tied-down.html' title='Anything That&apos;s Not Tied Down'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-4803879356730700129</id><published>2009-10-03T19:49:00.007-05:00</published><updated>2009-10-03T22:09:03.080-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Everything Takes Longer In C++</title><content type='html'>So I had tonsil surgery last Monday.  Even though I didn't feel up to programming for my day job, I couldn't stay away from trying to work on the MMO game project called Emergence that Ben and I are creating.  When it seems like progress is going glacially slow on our game Ben and I always say "if only we had more free time to work on this..."  Well I've had time this week - and I still made only baby steps in progress on it.  Granted I was resting from surgery and on pain medicine, but still...  I'm beginning to think it's not (just) that we have no free time.  It's that with programming you put in enormous effort yet make only incremental progress.&lt;br /&gt;&lt;br /&gt;If it takes a certain amount of effort to write software of a given complexity, writing software that's twice as complex doesn't take twice as long, it takes, I don't know, ten times as long, twenty times as long.  The effort increases exponentially.  Invert that and you get an equation that says that you only get logarithmic increases in output for every increase in effort.  If you don't know what a logarithmic curve looks like, it has a knee bend.  If you stay to the left side of the curve you get pretty good output for input, but as you move right it levels off quickly.   To the right side of the curve, increasingly large increases in input result in increasingly small changes in output.&lt;br /&gt;&lt;br /&gt;So I think I've been working dangerously close to right side of the curve lately, where what you can accomplish tapers off faster than the increase in effort.  I've been getting better with some of the new programming techniques I'm using, and I've streamlined my build process and improved my debugging techniques.  But here's the funny thing - all those improvements really just help me increase my work input.  They don't directly increase the output.  You see if I streamline my build process and my debugging techniques so that I can make a change and test it in half the time, that just means I can test twice as many code updates in the same amount of time.  But if I'm on the inefficient side of a logarithmic curve, I may actually need to make four, or ten, or twenty times as many code changes at a time to actually double my output.&lt;br /&gt;&lt;br /&gt;So that's what's so frustrating about this work.  You run faster and faster but never seem to get anywhere.  It's not hopeless though.  I think the fact that the ratio of accomplishments from effort is logarithmic is some kind of fundamental law of software, but it is possible to tweak the shape of the curve.  Although it will always eventually taper off, it doesn't need to taper so as quickly.  I think changing the programming language you program in does the most to change this curve.  C++ is very powerful and generates efficient programs, but it has a very sharp bend in its complexity curve.  This is because doing anything substantial in C++ just involves so many fiddly little details, and the language does so little for you automatically.  I'm not saying you can't build large systems in C++, but I am saying it probably took exponentially more work to do it than it would have to do it in a scripting language.  And I'm not saying you shouldn't use C++; in order to get good performance in our game, we need to.  But we're going to use both C++ and script language in our game, and I need to get out of the C++ part and into the scripting as soon as possible.&lt;br /&gt;&lt;br /&gt;The ironic thing is that the component which is giving me all this trouble, where I'm working too far on the right side of the complexity curve, is the C++ component that will bind our C++ side of our game to our scripting side.  In order to leave C++ behind I need to first overcome a trial by fire of the toughest C++ I've ever worked on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-4803879356730700129?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/4803879356730700129/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=4803879356730700129' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4803879356730700129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4803879356730700129'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2009/10/everything-takes-longer-in-c.html' title='Everything Takes Longer In C++'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-4618967300862826905</id><published>2009-09-04T20:34:00.015-05:00</published><updated>2009-09-05T00:50:06.795-05:00</updated><title type='text'>Electric Bicycle Conversion</title><content type='html'>&lt;p&gt;&lt;br /&gt;A student parking pass at the University of Oklahoma costs ~$200 a semester.  As if that weren't bad enough, they first try to trick you into buying the &lt;span style="font-style:italic;"&gt;nine hundred dollar&lt;/span&gt; reserved pass.  Instead of paying "the man" $200 just so I can park in overcrowded, confusingly marked lots, I decided my money would be better spent upgrading my bicycle so I can park a few miles away and bike to class.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s7k3i46yEG0/SqH6QpJ0MtI/AAAAAAAAAWg/EBLSuhwArQ0/s1600-h/ou+parking.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 200px;" src="http://2.bp.blogspot.com/_s7k3i46yEG0/SqH6QpJ0MtI/AAAAAAAAAWg/EBLSuhwArQ0/s400/ou+parking.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5377854593888957138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;I knew about these electric bicycle conversion kits because a couple of CS Ph.D. students I'm friends with, Lawrence Kinchloe and Mark Woehrer, put electric conversion kits on their bicycles a couple years ago.  (Hey guys!  We should start a club!)&lt;br /&gt;&lt;br /&gt;It turns out WeRelectrified.com sells a &lt;a href="http://www.werelectrified.com/ProductDetails.asp?ProductCode=BD24+Kit"&gt;low-end, but complete bicycle conversion kit&lt;/a&gt; for $200.  (Ha!  Exactly the same as I would have spent on a parking pass!)  While I could have fabricated my own motor controller, and scrounged my own batteries, the complete kit is such a good deal that it didn't make sense not to just use it as-is.  There's even more than what's in the picture - it also comes with a metal rack to go on the back of the bike for the batteries.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s7k3i46yEG0/SqHz6OTR6JI/AAAAAAAAAWY/woa4Fhfa_7k/s1600-h/BD24+Kit-2.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 306px;" src="http://1.bp.blogspot.com/_s7k3i46yEG0/SqHz6OTR6JI/AAAAAAAAAWY/woa4Fhfa_7k/s400/BD24+Kit-2.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5377847611654006930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;The way this thing works is there's actually a motor inside the front wheel, a big fat metal hub that makes the front wheel turn by itself.  (Nothing gets changed on the back wheel - so you can still pedal it too, like a normal bike.)  In theory, you can just replace the front wheel of your bicycle, put the batteries on the back and the throttle on your handlebars, and you're ready to go!&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;That's the idea, anyway.  Of course, this is a Project, and as we all know Projects rarely go according to plan.  The first problem I had was that the hub is too wide to fit between my front forks.  Earl Martin would probably just have grabbed the front forks and pulled them out, but I'm not that strong.  Instead, I took the scissor jack that came with my car, slipped it over the front forks, and just &lt;span style="font-style:italic;"&gt;cranked it on out there.&lt;/span&gt;  (Nick Johnson asks "Is that SAFE?"  Come on, Nick, it's a steel frame!  You could probably safely bend it into a pretzel if you wanted to.)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_s7k3i46yEG0/SqHqtAfM3yI/AAAAAAAAAUo/okKT5Cu0X-M/s1600-h/P8280556.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_s7k3i46yEG0/SqHqtAfM3yI/AAAAAAAAAUo/okKT5Cu0X-M/s400/P8280556.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377837489002962722" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;OK, now the hub fits - but the axle is too big to go in the notches on the end of the forks.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s7k3i46yEG0/SqHqtn14zmI/AAAAAAAAAUw/MuYQRPgyt88/s1600-h/P8280558.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_s7k3i46yEG0/SqHqtn14zmI/AAAAAAAAAUw/MuYQRPgyt88/s400/P8280558.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377837499567099490" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Not a problem for a man who owns more kinds of steel files than socks!  This is a delicate operation - the axle has flat sides on it, and I want the notch just wide enough for the flat sides to fit, but not wide enough for the axle to rotate in place.  When the hub motor turns the wheel, it's pushing against the axle to do so, and you don't want the axle to be able to start spinning within the forks.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s7k3i46yEG0/SqHquD3CXpI/AAAAAAAAAU4/qiAl2D76has/s1600-h/P8280560.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_s7k3i46yEG0/SqHquD3CXpI/AAAAAAAAAU4/qiAl2D76has/s400/P8280560.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377837507088113298" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Great! Front wheel fits now!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s7k3i46yEG0/SqHrZem9tOI/AAAAAAAAAVA/m2BFSb0dpg0/s1600-h/P8280561.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_s7k3i46yEG0/SqHrZem9tOI/AAAAAAAAAVA/m2BFSb0dpg0/s400/P8280561.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377838253002831074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;OK, now to transfer the tire from the old wheel to the new wheel.  Except the tire doesn't fit.  In fact, these aren't the same size at all!  Did I buy the wrong size wheel?  Oh, never mind.  This is the same thing I went through last time I worked on this bicycle!  The wheels I put on it then were narrow 26 inch, which means they have less tire material and more rim circumference than the moutain bike wheels it came with; the new wheel brings us back full circle, with smaller diameter rims under thicker tires.  Means I need to buy a tire.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_s7k3i46yEG0/SqHrZ734weI/AAAAAAAAAVI/CpjFqrAcZAQ/s1600-h/P8280563.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_s7k3i46yEG0/SqHrZ734weI/AAAAAAAAAVI/CpjFqrAcZAQ/s400/P8280563.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377838260858438114" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Off to the bicycle store!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_s7k3i46yEG0/SqHvYvzt8tI/AAAAAAAAAVg/mS9kOhoXry4/s1600-h/bicycle+store.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://3.bp.blogspot.com/_s7k3i46yEG0/SqHvYvzt8tI/AAAAAAAAAVg/mS9kOhoXry4/s400/bicycle+store.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5377842638486368978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Since the front wheel is now a different size, I decided to change the back wheel to that size too, and buy new tires for front and back.  I've been meaning to replace the back wheel anyhow (between either the wheel starting out warped or my asymmetric weaving pattern, the wheel was getting ever so slightly out of round).  I didn't think I needed to buy new gears though because I could just take the gears from the old wheel, right?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_s7k3i46yEG0/SqHtXRSzeYI/AAAAAAAAAVQ/mnMxmyUvHD0/s1600-h/P8290564.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_s7k3i46yEG0/SqHtXRSzeYI/AAAAAAAAAVQ/mnMxmyUvHD0/s400/P8290564.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377840414092130690" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Oops... that's not how you remove the gear pack.  (If ball bearings fall out all over the place, you're doin' it wrong.)  If I read my own damn blog from last year I MIGHT have remembered that.  I never was actually able to get the center portion of the hub off.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_s7k3i46yEG0/SqHtX1aljoI/AAAAAAAAAVY/uMvTwYsEK9g/s1600-h/P8290565.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_s7k3i46yEG0/SqHtX1aljoI/AAAAAAAAAVY/uMvTwYsEK9g/s400/P8290565.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377840423788449410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;BACK to the bicycle store!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_s7k3i46yEG0/SqHvYvzt8tI/AAAAAAAAAVg/mS9kOhoXry4/s1600-h/bicycle+store.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://3.bp.blogspot.com/_s7k3i46yEG0/SqHvYvzt8tI/AAAAAAAAAVg/mS9kOhoXry4/s400/bicycle+store.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5377842638486368978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Another one hour drive.  This time I came back with a gear pack.  I put yellow teflon tape on the threads of the new back wheel - hopefully if I ever need to remove the new gear pack, this will keep the gear hub from getting stuck as badly as the old one did.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_s7k3i46yEG0/SqHw1GeoyaI/AAAAAAAAAVo/cvVzAxd6xKU/s1600-h/P8290569.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_s7k3i46yEG0/SqHw1GeoyaI/AAAAAAAAAVo/cvVzAxd6xKU/s400/P8290569.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377844225119930786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Then I remembered that on the second trip to the bicycle store, I forgot to return the inner tubes I bought on the first trip.  The guy at the store mixed up the two sizes of 26 inch just like I did with the wheels, and sold me the skinnier, larger circumference narrow tubes when I needed the wide 26 inch tubes.  These tubes don't fit in the tires I bought (there's excess tube), but by this point I'm beyond caring so I just jammed them in there anyway, kinks and all.  I haven't gotten a flat yet so I guess it's OK.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;I'm kind of proud of the way the throttle mount turned out.  I didn't want to unwrap all my handlebar tape to slide the throttle assembly on, so I wasn't sure how I was going to mount it.  Eventually I realized it would just as easily fit on a piece of 3/4 inch PVC pipe, so I mounted the throttle vertically on a piece of pipe.  I knew if a convex pipe edge butted against a convex handlebar edge it would never stay in place, so I cut a half-circle indention in the side of the PVC pipe where it mates to the handlebar.  The mounting feels solid and the throttle is not any harder to use in this position.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s7k3i46yEG0/SqHzIDkZskI/AAAAAAAAAWI/TyQB9RoHDUA/s1600-h/P9040574.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_s7k3i46yEG0/SqHzIDkZskI/AAAAAAAAAWI/TyQB9RoHDUA/s400/P9040574.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377846749779571266" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;It has a key for an on/off switch.  It happened to be a perfect fit for this space under the bicycle seat.  While it might look a little rude if I reach between my legs to turn the key, I figure this will keep the rain off it.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s7k3i46yEG0/SqHzIkZXiDI/AAAAAAAAAWQ/FKPjx_ac9ac/s1600-h/P9040578.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_s7k3i46yEG0/SqHzIkZXiDI/AAAAAAAAAWQ/FKPjx_ac9ac/s400/P9040578.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377846758591662130" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;I mounted the motor controller box upside down under the battery, and I made all the wire connectors come out in the space hidden between seat and the battery bag.  Hopefully that will make the wiring less obvious from above.  Although I'm not doing anything wrong, I don't exactly want to advertise that something strange is going on.  My experience with authority has been that even harmless things will be treated with suspicion if they out of the ordinary.  Besides, I don't want to give potential bicycle thieves any reason to think my bicycle is special.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s7k3i46yEG0/SqHpNDx6cOI/AAAAAAAAAUg/HBB_Lm6_8MQ/s1600-h/P9040580.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_s7k3i46yEG0/SqHpNDx6cOI/AAAAAAAAAUg/HBB_Lm6_8MQ/s400/P9040580.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377835840619311330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Here's the completed bicycle.  As long as I had to buy new tires, I thought I'd have a little fun and get ones with a red stripe.  I think it's a nice effect.  You can see the batteries here in the unzipped bag; it came with a block of styrofoam in the back where I assume the 3rd battery would go if this were a 36 volt kit instead of 24 volts.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_s7k3i46yEG0/SqHyH93V6_I/AAAAAAAAAWA/vvc3t5fEVZQ/s1600-h/P9040573.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_s7k3i46yEG0/SqHyH93V6_I/AAAAAAAAAWA/vvc3t5fEVZQ/s400/P9040573.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377845648736775154" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;On my first day riding it to class, the zipper failed on the bag where the corner of the battery meets it.  The batteries, which are sealed lead acid (heavy as hell but cheaper than lithium ion), rest directly on the metal frame of the rack.  There's no padding in the bag, so with every bump the batteries slam down against the rack and then up against the zipper.  &lt;br /&gt;&lt;br /&gt;Catastrophic zipper failure!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_s7k3i46yEG0/SqHw1nDhhuI/AAAAAAAAAVw/Rxm9hW2ThpA/s1600-h/P9040570.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_s7k3i46yEG0/SqHw1nDhhuI/AAAAAAAAAVw/Rxm9hW2ThpA/s400/P9040570.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377844233864578786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;When this happened, I wasn't even sure how I would secure the batteries for the ride home.  I actually have a pair of shoes that I've threaded two sets of laces into for MacGuyver emergencies.  I could have taken out one set of laces to tie down the batteries and still have had the other set of laces to keep my shoes on.  Wouldn't you know it but this would be the day I wore a different pair of shoes though?  Darn the luck.  Fortunately I had previously fixed the water bottle holder with baling wire, and there turned out to be enough when I unwrapped that to hold the batteries down.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_s7k3i46yEG0/SqHyHHBI6NI/AAAAAAAAAV4/BnPtj-ZNtsE/s1600-h/P9040571.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_s7k3i46yEG0/SqHyHHBI6NI/AAAAAAAAAV4/BnPtj-ZNtsE/s400/P9040571.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377845634013915346" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;The foam from this padded laptop bag will be just what I need to cushion the batteries.  After I cut out the foam, I'll fold it in half and put it under the battery bag.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_s7k3i46yEG0/SqHpMhOKEMI/AAAAAAAAAUY/HeITVLQr7ro/s1600-h/P9040582.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_s7k3i46yEG0/SqHpMhOKEMI/AAAAAAAAAUY/HeITVLQr7ro/s400/P9040582.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377835831342534850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;A zipper is completely off one side.  How will I get back it on track?  By cutting deeper into the throat of the zipper, I was able to give myself enough slack to re-thread it from the end.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s7k3i46yEG0/SqHpLkHQ5BI/AAAAAAAAAUI/3-7lOMnyraE/s1600-h/P9040588.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_s7k3i46yEG0/SqHpLkHQ5BI/AAAAAAAAAUI/3-7lOMnyraE/s400/P9040588.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377835814939059218" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Then I made the two zippers meet at the corner where the original tear happened, so I don't ever have to cross the damaged section!  The amount of offset I created from rethreading the zipper on the left side happens to the same length as the stretched portion here, so everything matches up properly.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s7k3i46yEG0/SqHpMFaNJ7I/AAAAAAAAAUQ/48oSp-vKdd8/s1600-h/P9040590.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_s7k3i46yEG0/SqHpMFaNJ7I/AAAAAAAAAUQ/48oSp-vKdd8/s400/P9040590.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377835823876876210" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;The next time I have something go wrong with the bicycle, I'll have some duct tape stowed onboard.  I removed the hard cardboard center from a roll of duct tape so I could fold it up.  I think I saw that trick on Instructables.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s7k3i46yEG0/SqHpLDh1xII/AAAAAAAAAUA/9twXW_Z_NcY/s1600-h/P9040594.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_s7k3i46yEG0/SqHpLDh1xII/AAAAAAAAAUA/9twXW_Z_NcY/s400/P9040594.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377835806192157826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;And there it is, back together and nicely padded.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_s7k3i46yEG0/SqHntXbXp3I/AAAAAAAAAT4/MiQV1_r5eGs/s1600-h/P9040595.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_s7k3i46yEG0/SqHntXbXp3I/AAAAAAAAAT4/MiQV1_r5eGs/s400/P9040595.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377834196626024306" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Unfortunately the cheap made-in-china 24V battery charger that came with the kit died after just one use!  I can use my car battery charger to recharge the batteries, but to do so I have to change the wiring on the battery pack from a 24V serial configuration to a 12V parallel configurations every time I hook up the 12V charger.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_s7k3i46yEG0/SqHnItPCVgI/AAAAAAAAATw/LdcImZ1Rxvg/s1600-h/P9040597.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_s7k3i46yEG0/SqHnItPCVgI/AAAAAAAAATw/LdcImZ1Rxvg/s400/P9040597.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377833566824715778" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Finally done, fully charged and put back together.  Despite the problems, I would say the project has gone better than I anticipated.  It's lots of fun to ride and completely practical.  I think if more people understood that we'd see as many electric bicycles in stores and on the road as regular ones.  It still works as a bicycle, so you can rely on electrical power as much or as little as you want.  For a casual rider like me, this makes me more confident about taking the bicycle out for rides because I know if I'm too out of shape to pedal any further I can still get home on battery power.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_s7k3i46yEG0/SqHmp578G5I/AAAAAAAAATo/IBlGCAhm3oM/s1600-h/P9040596.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_s7k3i46yEG0/SqHmp578G5I/AAAAAAAAATo/IBlGCAhm3oM/s400/P9040596.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5377833037658332050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-4618967300862826905?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/4618967300862826905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=4618967300862826905' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4618967300862826905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4618967300862826905'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2009/09/electric-bicycle-conversion.html' title='Electric Bicycle Conversion'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_s7k3i46yEG0/SqH6QpJ0MtI/AAAAAAAAAWg/EBLSuhwArQ0/s72-c/ou+parking.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-2693230748064568088</id><published>2009-06-06T16:45:00.004-05:00</published><updated>2009-06-06T16:53:02.513-05:00</updated><title type='text'>Public Key Authentication - Update</title><content type='html'>Turns out it's not easy to uninstall Ubuntu's encrypted home directory feature either, at least not while logged in over an ssh session.  All I succeeded in doing when attempting to uninstall was screwing up both computers so bad I can't log in to them any more, and losing all my files.  (Luckily there wasn't much on there yet to lose.)&lt;br /&gt;&lt;br /&gt;As long as I have to go to trouble of digging these computers out and hooking up a keyboard and monitor so I can reinstall everything, I'm going to put Debian on them instead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-2693230748064568088?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/2693230748064568088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=2693230748064568088' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2693230748064568088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2693230748064568088'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2009/06/public-key-authentication-update.html' title='Public Key Authentication - Update'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-182017673467450417</id><published>2009-05-30T18:07:00.003-05:00</published><updated>2009-06-06T15:30:04.466-05:00</updated><title type='text'>Public Key Authentication</title><content type='html'>I haven't been updating this blog lately because I've been trying to get my webserver set up first, so that I could put the pictures there and just link to them from the blog posts.  (Uploading pictures to this blog is a tedious process, so I'm planning to create a website that I can just drop a folder full of pictures onto and have them all display nicely.  I suppose I could just get a Flicker account instead, but I like doing things the hard way.)&lt;br /&gt;&lt;br /&gt;So that I won't have to type my password over and over again to manage my webserver, I took an evening to set up public/private key authentication so I can just use that to prove to my webserver who I am when I log in, and then I don't need a password.  Well that was the plan.  It ended up taking an evening, then a weekend, then another few evenings, then a week...  Every time I thought I had everything set up properly, the next time I came back and tried to log in, the key didn't work.  Eventually it got to the point where I'd make a key, it would work exactly one time, and then never work again until I made a new key.  (If you know how public/private keys work, this makes NO SENSE.  But there it was.)&lt;br /&gt;&lt;br /&gt;I spent more time troubleshooting this problem than all the cumulative time I will save from not having to type a password in the future.  Nothing wastes your time like a technology designed to save you time, right?  But I'm stubborn and the longer this went on the more determined I got to figure it out.  See, I have a theory about life:  success or failure is self-reinforcing between your beliefs and your actions.  If you believe you can't make technology work for you, then when faced with a problem you'll give up too soon.  By failing you proved right your own conviction that you would fail.  Because you'll never know if the right solution was miles away from what you attempted, or whether it would have been just around the corner.  On the other hand if you maintain an unshakeable belief that eventually, &lt;span style="font-style:italic;"&gt;something&lt;/span&gt; you try will work, eventually it does, and you &lt;span style="font-style:italic;"&gt;vindicate&lt;/span&gt; the confidence you had in the first place.&lt;br /&gt;&lt;br /&gt;Turned out the problem in this case stemmed from an innocent decision I made when installing Ubuntu Linux on the server.  In this new version of Ubuntu, they added a feature for encrypting your home directory.  The install program asked me if I want to do this, and explained that it would be perfectly transparent to me; the operating system would magically decrypt and mount the home directory for me when I log in, and safely unmount it when I log off.  Totally convenient - I'd never notice anything different.  "Why not?" I thought.  It didn't sound like much trouble and who wouldn't want more security on their webserver?  So I left it enabled.  BIG MISTAKE.&lt;br /&gt;&lt;br /&gt;I would never have guessed there would be an interaction between this feature and using public/private key logins until I was looking at the ssh logs to try to figure out why I couldn't log in with my key.  At first I thought I had the wrong log - why were there messages from the home directory encryption service mixed in with my ssh logs?  And why was it not finding the key sometimes?  Wait wait the order of those operations doesn't look right - shouldn't it be decrypting the home directory &lt;span style="font-style:italic;"&gt;before&lt;/span&gt; looking in it for the key?  Ahhhhh...  Dammit.  Now I get it.&lt;br /&gt;&lt;br /&gt;Here's what was going on:  the way public/private key ssh logins work is the server looks in your home directory for your public key to use to recognize you.  But your home directory is encrypted.  It gets decrypted for you &lt;span style="font-style:italic;"&gt;when you log in&lt;/span&gt;.  But you can't log in until it uses the public key to authenticate you, which it can't pull out of the home directory because it's still encrypted.  "There's a hole in my bucket, dear Liza, dear Liza..."&lt;br /&gt;&lt;br /&gt;You can verify if you've got the same problem as I did:  as long as you're logged into the server in one terminal window, public/private key authentication will work in a 2nd terminal window.  Log out of all the sessions, and now you can't authenticate anymore with your key.  Log back in, and now your key works again in other terminals too.  If this works, send an angry email to Canonical.  Tell them I sent you.&lt;br /&gt;&lt;br /&gt;The moral of the story is don't use the encrypted home directory feature, it was released half-baked.  Have you heard the expression "Beware Greeks bearing gifts?"  The meta-moral here is beware operating systems bearing gifts of "features" you didn't need!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-182017673467450417?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/182017673467450417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=182017673467450417' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/182017673467450417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/182017673467450417'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2009/05/public-key-authentication.html' title='Public Key Authentication'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-3164919634668433973</id><published>2009-04-10T11:41:00.005-05:00</published><updated>2009-04-10T12:34:46.799-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='robot'/><title type='text'>Final Days Before Robot Competition</title><content type='html'>The Hardware is (mostly) done but as usual Software is holding up the show.  Lateness is the nature of software; it's worse with robots because given the choice between finishing the hardware and finishing the software, you work on the hardware first: the software can't get around without a body.  Then you try to get all the software done in the final 10% of the schedule.  I told my team (only half joking) that the first time it runs the whole course, if it runs it, will be at the starting line at the competition!&lt;br /&gt;&lt;br /&gt;Testing the GPS is particularly challenging because you have to be outside in a big area to test it well.  It's been unseasonably (brutally) cold here some days, mixed with many other forms of inclement weather, so I haven't wanted to walk around outside with a circuit board and laptop, especially at night which is the only time I have to really work on things.  Luckily I'm off work today on a three day weekend; I'm going to need every minute of it.&lt;br /&gt;&lt;br /&gt;When I did a cursory test of the GPS in a park several weeks ago, I tried to test the minimum resolution of the GPS by standing in a location, and walking a few meters to see how much it changed per every meter.  That proved to be futile, so I tried standing in one place, walking several meters away, and then returning to where the GPS coordinates said I should be in the same starting location.  Inevitably, I ended up nowhere near where I started, even though the coordinates were the same.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s7k3i46yEG0/Sd99Gr1G3_I/AAAAAAAAASo/DUQ7dGpvmDE/s1600-h/gps+points+2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 328px;" src="http://2.bp.blogspot.com/_s7k3i46yEG0/Sd99Gr1G3_I/AAAAAAAAASo/DUQ7dGpvmDE/s400/gps+points+2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5323110838373375986" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Today I realized that if you leave the GPS unit facing a window long enough, it will eventually get a fix, even though you may be indoors.  The picture above plots all the results returned by the GPS over a 20 minute period.  (Use the cars in the picture to judge scale.)  My incorrect assumption had been that the GPS might be off by several meters, but that you could compensate for that and get a stead progression of readings.  The problem is that the amount it is off varies from one reading to the next, even if you are standing still.  What you really get is a cluster of points near your real location.  Now, the center of that cluster as a whole might be off a fixed amount, and you can compensate for that a bit, but you can't take any individual reading and apply a fixed offset and say "ah, this is where I am".  It's more like darts shot at a dart board.  Also, the cluster as a whole eventually shifts over time - twenty minutes after this screenshot was taken, the GPS began giving readings further down and to the right.&lt;br /&gt;&lt;br /&gt;So, where does this leave our navigation algorithm?  Since the data is statistical, maybe our control routine should be as well.  Instead of doing 90 degree turns and full stops every time a new reading puts us 10 meters left or right of where we thought we were, maybe lots of readings should have an aggregate effect on the direction of travel.  For instance, if we're heading N, the first time we get a reading indicating we should really got E, we won't head directly east but instead shift our heading slightly NE.  Maybe the next reading comes in affirming a northerly course, at which point we head N again; it would not be until several readings confirm "go east" that we completely turn N -&gt; NNE -&gt; NE -&gt; E.&lt;br /&gt;&lt;br /&gt;Oh and did I mention the compass sensor that tells us whether we actually are going north or east is also not 100% accurate?  Guesses stacked on top of guesses...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-3164919634668433973?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/3164919634668433973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=3164919634668433973' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/3164919634668433973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/3164919634668433973'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2009/04/final-days-before-robot-competition.html' title='Final Days Before Robot Competition'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_s7k3i46yEG0/Sd99Gr1G3_I/AAAAAAAAASo/DUQ7dGpvmDE/s72-c/gps+points+2.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-4154658944832054028</id><published>2009-02-03T22:49:00.005-06:00</published><updated>2009-02-04T22:19:46.554-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><title type='text'>Giant Robot Headed for Colorado</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_s7k3i46yEG0/SYkiPGuH2sI/AAAAAAAAASI/SZgC4TFZi2M/s1600-h/hagrid.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_s7k3i46yEG0/SYkiPGuH2sI/AAAAAAAAASI/SZgC4TFZi2M/s400/hagrid.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5298804079475546818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Woot!  We're going to Colorado!  &lt;a href="http://www.sparkfun.com"&gt;Sparkfun.com&lt;/a&gt; is hosting an &lt;a href="http://www.sparkfun.com/commerce/product_info.php?products_id=9016"&gt;Unmanned Autonomous Vehicle contest&lt;/a&gt; in their parking lot in April.  This is exactly the kind of contest my powerwheels robot is designed for!&lt;br /&gt;&lt;br /&gt;When I first read about the competition, my first reaction was "of course we never have anything like this in Oklahoma."  Then I thought, damn it, after all the cool robot events I miss out on because they're in &lt;a href="http://www.seattlerobotics.org/"&gt;Seattle&lt;/a&gt;, or &lt;a href="http://www.parallax.com/TopLevelMenu/Company/2008EmbeddedSystemsConference/tabid/640/Default.aspx"&gt;California&lt;/a&gt;, I'm sick and tired of getting left out just because I live in the sticks.  I'm going to this one.  Colorado isn't &lt;span style="font-style:italic;"&gt;that&lt;/span&gt; far.&lt;br /&gt;&lt;br /&gt;It's funny because you could see the same thought process go on when I asked my friend Earl Martin to come with me.  "Oh I'd love to go, but really I can't..."  It was his wife who convinced him, "Go!  Go have fun!"  (Wives of geeks, take note:  you may not be able to break us of the habit of taking over the kitchen table with an occaisional soldering project, or the habit of accumulating mountains of computer electronics junk, no matter how often you roll your eyes at it, but a just little bit of encouragement from you goes a long way to making us feel enthusiastic again when we need that approval.  I'm indebted to my own wife for selflessly sacrificing our living room so I can have a place to work on the robot to get it ready for the contest.)&lt;br /&gt;&lt;br /&gt;I also asked my friend Ben to come along.  He's a great guy to have around, but he's hard to pin down.  When I wanted him to be one of my groomsman in my wedding, he was off in England!  So I don't know if he'll be available for the trip but I hope so.  He said he might be able to fix me up with a mini-ITX board running Intel's open source machine vision library - very cool!&lt;br /&gt;&lt;br /&gt;My sister Ginny also asked to come along.  I had automatically assumed it wouldn't be something she would be interested in, but when I mentioned it, she asked to come along.  I don't know how the transportation situation will play out because my car doesn't have a lot of room, and most of it will be taken up by the robot, but I'm sure things will work out.  If she wants to go I certainly don't object and who knows?  We might turn her into an engineer, by osmosis.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-4154658944832054028?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/4154658944832054028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=4154658944832054028' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4154658944832054028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4154658944832054028'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2009/02/giant-robot-headed-for-colorado.html' title='Giant Robot Headed for Colorado'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_s7k3i46yEG0/SYkiPGuH2sI/AAAAAAAAASI/SZgC4TFZi2M/s72-c/hagrid.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-6005354303163881402</id><published>2009-01-22T23:04:00.005-06:00</published><updated>2009-01-22T23:52:16.524-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recipes for disaster'/><title type='text'>Meatloaf Recipe</title><content type='html'>This is a meatloaf recipe that sort of just evolved out of cooking experiments done by my mother and myself with the help of my brothers and sisters when I was a teenager.  We (especially my mother and I) are not big on measuring, so everything is approximate, guessed on what looks good, and seasoned to taste.  Sometimes it comes out really good and sometimes really awful, but either way, we never make a bland meatloaf!&lt;br /&gt;&lt;br /&gt;In a large pyrex bowl, crush 3 large handfuls of Kellogg's Cornflakes to powder using your hands.&lt;br /&gt;Add:&lt;br /&gt;1/4 teaspoon black pepper&lt;br /&gt;1/4 teaspoon salt&lt;br /&gt;a dash of parsley&lt;br /&gt;a dash of sage&lt;br /&gt;1/2 teaspoon fresh thyme&lt;br /&gt;1/2 teaspoon fresh rosemary&lt;br /&gt;&lt;br /&gt;Mix these dry ingredients together.&lt;br /&gt;&lt;br /&gt;Then add:&lt;br /&gt;2 cloves minced garlic&lt;br /&gt;1/3 of a whole onion, chopped&lt;br /&gt;1/3 of a whole green pepper, chopped&lt;br /&gt;&lt;br /&gt;In a separate bowl, beat 2 whole eggs&lt;br /&gt;Add the eggs and vegetables to the dry ingredients in the pyrex bowl, and mix&lt;br /&gt;&lt;br /&gt;After mixing the other ingredients, only then add the hamburger.  How much hamburger?  I dunno - enough to fill the bowl!  The key to making good meatloaf is to handle the ground beef as little as possible.  It's already been ground up, and if you mush it around too much mixing it, you'll end up with a meatloaf the consistency of canned cat food.  A good meatloaf has the same texture as a grilled hamburger patty.&lt;br /&gt;&lt;br /&gt;To mix the meatloaf right, first pull the hamburger apart while breaking as few "strands" as possible.  Then fluff the mixture almost as you would if you were mixing butter into popcorn.  The goal is distribute the seasonings and vegetables throughout the meat, not to homogenize it.  Don't push the meat back together as you mix it; we'll take care of the density by packing it down when we actually put it in the pan.&lt;br /&gt;&lt;br /&gt;Place the mixed meatloaf in the pan, and pack it down as solidly but don't smush it.  Set aside.&lt;br /&gt;&lt;br /&gt;In another bowl, mix the SECRET sauce:&lt;br /&gt;1/2 cup ketchup&lt;br /&gt;1 heaping teaspoon brown sugar&lt;br /&gt;two dashes of chili powder&lt;br /&gt;a hint of nutmeg&lt;br /&gt;a heavy dash of black pepper&lt;br /&gt;1 clove of garlic, ground to a paste&lt;br /&gt;a sprinkle of fresh rosemary, crushed and torn&lt;br /&gt;one drop of yellow mustard&lt;br /&gt;&lt;br /&gt;The sauce - I just made that up.  Tastes great.  Tangy, like teryaki sauce.  Melissa's grandmother had suggested the brown sugar and mustard.&lt;br /&gt;&lt;br /&gt;Pour the sauce over the top of the meatloaf and spread evenly.&lt;br /&gt;&lt;br /&gt;Preheat oven to 350 degrees and bake 1 hour or until firm.  If it isn't delicious, don't blame me - you must be doing it wrong.  :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-6005354303163881402?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/6005354303163881402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=6005354303163881402' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/6005354303163881402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/6005354303163881402'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2009/01/meatloaf-recipe.html' title='Meatloaf Recipe'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-8259597184133316020</id><published>2008-12-01T09:28:00.015-06:00</published><updated>2008-12-17T21:01:11.696-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><title type='text'>PROP6502 Laptop Project</title><content type='html'>&lt;p&gt;&lt;br /&gt;I made a laptop.  It won &lt;a href="http://www.parallax.com/tabid/708/Default.aspx"&gt;honorable mention&lt;/a&gt; in the &lt;a href="http://www.parallax.com/tabid/720/Default.aspx"&gt;Parallax 2008 Propeller Design Contest&lt;/a&gt;.  The point of the contest was to do something that shows off the unique capabilities of the &lt;a href="http://www.parallax.com/tabid/407/Default.aspx"&gt;Propeller microcontroller&lt;/a&gt;.  I made a 6502-based laptop that uses the Propeller as its "chipset".  I started with a toy laptop, and replaced all of the electronics with my own design to make it into a real working computer.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_s7k3i46yEG0/SS93jLt9A1I/AAAAAAAAAQo/uvV2gQCKm0g/s1600-h/laptop-closed2.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_s7k3i46yEG0/SS93jLt9A1I/AAAAAAAAAQo/uvV2gQCKm0g/s400/laptop-closed2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5273565134998799186" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;The screen is a 5.5 inch LCD TV for the laptop screen.  The video decoder board, which was piggybacked on the LCD, made too tall a stack to fit inside the screen.  After watching this &lt;a href="http://benheckpodcast.com/blog/?p=61"&gt;presentation about modding&lt;/a&gt; by &lt;a href="http://benheck.com/"&gt;Benjamin Heckendorn&lt;/a&gt;, I decided not to try to make the laptop thicker.  He gives the advice that you have to pick a height constraint and stick to it or else your project will grow to be "the Marvel Mystery House."  Instead I figured out a way to unfolded the TV circuit board flat and place it below (not behind) the screen.  Unfortunately that makes the LCD sit very high up the lid, so I made a nice decorative faceplate to distract the eye from how high and small the screen is.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s7k3i46yEG0/SUBbTzg3rtI/AAAAAAAAARY/sX7KuzhYWm0/s1600-h/laptop-open.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_s7k3i46yEG0/SUBbTzg3rtI/AAAAAAAAARY/sX7KuzhYWm0/s400/laptop-open.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5278319159081938642" /&gt;&lt;/a&gt;&lt;br /&gt;The battery holder is embedded face up in the bottom so I wouldn't have to fashion a battery cover; the lid keeps the batteries in place when the laptop is closed.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Inside the laptop:  at the top of the picture you see the back of the keyboard.  In the second row, components from left to right:  the keyboard decoder, back of the battery holder, and the CPU board.  (More on the CPU board in a minute.)  This toy laptop had a QWERTY keyboard, but it was not PS/2.  Decoding this key matrix with the Propeller would be a waste of I/O pins.  I realized that all keyboards are key matrices, including standard computer keyboards.  So I simply cut the circuit board out of a real PS/2 keyboard from a Dell PC, and soldered the toy keyboard to the PS/2 board!  The fact that that actually works (it does work!) is hilarious.  Of course the key codes generated will be different; for instance pressing "A" might make the PS/2 board think you are pressing "X", but I simply translate the keycodes in software.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_s7k3i46yEG0/SUm1UJFwWgI/AAAAAAAAARg/eGOJUMbTMcQ/s1600-h/inside-laptop.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_s7k3i46yEG0/SUm1UJFwWgI/AAAAAAAAARg/eGOJUMbTMcQ/s400/inside-laptop.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5280951395710687746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;The laptop is based on a 6502 processor.  I used the Propeller microcontroller as the "chipset" for the computer.  The Propeller provides video, I/O, and memory control.  The 6502 addresses a 64K static RAM chip, and the Propeller manipulates the control signals in order to load the initial program and monitor the address and data buses.  Reducing chip count was key to making this board fit inside the laptop shell.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s7k3i46yEG0/SS9xPWL3ehI/AAAAAAAAAQg/CSRtpnxmKjM/s1600-h/board-component-side.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_s7k3i46yEG0/SS9xPWL3ehI/AAAAAAAAAQg/CSRtpnxmKjM/s400/board-component-side.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5273558197141469714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;The reason I was able to do it with so few chips is a combination of the Propeller microcontroller's versatility, and a neat timing trick that allowed me to multiplex the data bus.  After reading how old 6502 computers interleaved video access with processor accesses on the same bus, I realized I could use the same technique to allow the Propeller to access the bus in the interim period between each 6502 bus cycle.  Since the 6502 puts the address out before the data is read or written, the Propeller can quickly transfer the 16 bit address onto the 8 bit data bus in two transfers, and still finish in time to return the data bus to a "normal" state so that the 6502 never knows anything happened.&lt;br /&gt;&lt;br /&gt;What I learned from this project is that pins and signals are ways of dividing up the physical dimensions, but you can also think of time as a dimension that can be sliced up and parceled out.  Making use of this extra dimension in a design can allow you to fold a complex system into a smaller physical space than it would seem to fit.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s7k3i46yEG0/SS997Ibba4I/AAAAAAAAARA/HUZJDBzI67M/s1600-h/Prop6502.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_s7k3i46yEG0/SS997Ibba4I/AAAAAAAAARA/HUZJDBzI67M/s400/Prop6502.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5273572143502420866" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Once you've pared down your design, you've still got to wire it, and even a simple computer involves a nightmare of wiring.  This part is harder than choosing the right chips to wire in the first place!&lt;br /&gt;&lt;br /&gt;In a closely packed board, you can have a problem wiring it just from the sheer mass of copper packed into each square inch.  I used strips cut from 80 conductor IDE ribbon cables to wire up the board.  (Credit to Benjamin Heckendorn for giving this advice as well, in the same &lt;a href="http://benheckpodcast.com/blog/?p=61"&gt;presentation&lt;/a&gt; I mentioned above.)  These extremely thin IDE cable wires allowed me to pack more wiring into a smaller space, and it makes the wiring neater when you can group 4 or 8 together into ribbon cables.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s7k3i46yEG0/SS9-J-egJKI/AAAAAAAAARI/HNIY26Z89OM/s1600-h/board-wire-side.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_s7k3i46yEG0/SS9-J-egJKI/AAAAAAAAARI/HNIY26Z89OM/s400/board-wire-side.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5273572398528996514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;This project gave me an excuse to finally use my Fluke 9010A Microcomputer Troubleshooter (pictured, front and center).  My friend and former teacher, Earl Martin, once told me there were only ever two pieces of electronics equipment he wanted his whole life.  One is a multichannel logic analyzer; the other is this Fluke 9010A, which he gave to me.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s7k3i46yEG0/SS98uYTTHAI/AAAAAAAAAQ4/YBP73ss5SEs/s1600-h/PA040001.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_s7k3i46yEG0/SS98uYTTHAI/AAAAAAAAAQ4/YBP73ss5SEs/s400/PA040001.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5273570824913361922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What this unit allows you to do is plug in to the CPU socket of a computer and exercise control of any aspect of the computer.  You can test bus signals, read/write memory, even run programs and break on conditions.  Technically it's an in-circuit emulator, but that term doesn't begin to cover the depth of what this tool can do.  I would not have even attempted this project without it.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s7k3i46yEG0/SS97a5VMEBI/AAAAAAAAAQw/6JkWV_aSaAc/s1600-h/during-testing.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_s7k3i46yEG0/SS97a5VMEBI/AAAAAAAAAQw/6JkWV_aSaAc/s400/during-testing.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5273569390670647314" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;I had hoped to get better than honorable mention, but at least I'm on the same web page with the other winners, and received a $100 prize.  I took the prize payment in the form of $100 of Parallax electronics components.  I used the prize from this contest to buy parts for my project for next year's Propeller design contest:  Norbert 2.0, a Propeller-controlled mobile Lego robot with a 5-degree of freedom manipulator arm.  See you next time!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_s7k3i46yEG0/SS9vTpJgM9I/AAAAAAAAAQY/xinVgoMk02M/s1600-h/holding-laptop.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_s7k3i46yEG0/SS9vTpJgM9I/AAAAAAAAAQY/xinVgoMk02M/s400/holding-laptop.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5273556071928050642" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-8259597184133316020?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/8259597184133316020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=8259597184133316020' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/8259597184133316020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/8259597184133316020'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/12/prop6502-laptop-project.html' title='PROP6502 Laptop Project'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_s7k3i46yEG0/SS93jLt9A1I/AAAAAAAAAQo/uvV2gQCKm0g/s72-c/laptop-closed2.JPG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-7857712792406870485</id><published>2008-09-01T10:25:00.004-05:00</published><updated>2008-09-01T11:42:52.271-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenMoko'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Neo Freerunner'/><title type='text'>Success at Last:  Wireless on the Freerunner with Om2008</title><content type='html'>Since I lose the USB network device when the Freerunner powers down, it would be helpful if I &lt;a href="http://wiki.openmoko.org/wiki/USB_Networking"&gt;set up Ubuntu&lt;/a&gt; to automatically reconfigure the device when it does come back online.  I haven't tested if that would unstick a frozen SSH session, but it might.  Unfortunately I read Ubuntu has a &lt;a href="https://bugs.launchpad.net/ubuntu/+source/ifupdown/+bug/130437"&gt;bug&lt;/a&gt; that &lt;a href="http://wiki.openmoko.org/wiki/USB_Networking#Ubuntu_Issues"&gt;makes the reconnect not work&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The fix isn't exactly hard but before I did that, I decided to give my Freerunner's wifi configuration another try.  It turns out the reason I couldn't get wifi to work before was due to a really silly thing.  In the new keyboard app in Om2008, it shows what word it thinks you're typing, but it doesn't actually enter it unless you tap on the word.  Whenever I tried to enter my WPA password, I would see the word suggestion from the keyboard app right below the blank password textbox, and I thought I was typing in the password box.  Actually I hadn't entered anything yet because I didn't click on the word.  Once I figured that out, I was able to connect to my wifi network.&lt;br /&gt;&lt;br /&gt;But how to be sure that I was connected?  I hit upon the idea of going into my router configuration to see if it had assigned a DHCP address to my Freerunner.  Sure enough, there it was, and now I knew what IP to type in to ssh to it.  Having wifi working solves some of my problems I had with USB networking.  Even though my ssh session still freezes when the Freerunner goes into standby, the ssh session also unfreezes when I wake the phone back up, so I can continue where I left off while working.  Still trying to figure out how to fix the shutdown problem.&lt;br /&gt;&lt;br /&gt;Once you have wifi connected, you should be able to ping internet IP addresses, but DNS doesn't work yet because the Freerunner doesn't know your DNS server.  I followed the instructions from &lt;a href="http://wiki.openmoko.org/wiki/USB_Networking#Configure_Default_Neo_DNS"&gt;the USB networking page&lt;/a&gt; to set up DNS, using the address of my router, as that part of the instructions works equally well for wifi networking as it does for USB networking.&lt;br /&gt;&lt;br /&gt;Once DNS works, then the package manager works.  &lt;del&gt;I still haven't figured out the suspend problem.&lt;/del&gt;&lt;br /&gt;&lt;br /&gt;Update:  I must have missed that in the &lt;a href="http://wiki.openmoko.org/wiki/Om_2008.8"&gt;known issues&lt;/a&gt; for Om2008, they said that the builds from the last days of August (which I'm using) have to have the X screensaver disabled.  The fix is to run the command "xset s off".  What they didn't mention (and since it's a wiki, I was able to fix it for them :) ) is that you can't run xset from the ssh session, you have to install the terminal app (after getting DNS working) and run the command on the phone itself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-7857712792406870485?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/7857712792406870485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=7857712792406870485' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/7857712792406870485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/7857712792406870485'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/09/success-at-last-wireless-on-freerunner.html' title='Success at Last:  Wireless on the Freerunner with Om2008'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-172538911570968513</id><published>2008-08-31T21:46:00.002-05:00</published><updated>2008-08-31T22:09:55.979-05:00</updated><title type='text'>USB Networking on the Neo Freerunner</title><content type='html'>Well the new version of the open moko software isn't much better; they changed a lot in the interface but it still has some serious bugs.&lt;br /&gt;&lt;br /&gt;This version of the software has a bug that causes my phone to suspend every 30 seconds when the USB cable is connected, even if you have suspend set to "disabled".  Guys you have GOT to fix these bugs!  Seriously.  I was honestly better off &lt;i&gt;before&lt;/i&gt; I upgraded, in terms of reliability.&lt;br /&gt;&lt;br /&gt;In order to do much with the Neo Freerunner, you really have to have USB networking set up. I found some &lt;a href="http://sebastian-bergmann.de/archives/801-OpenMoko-Freerunner-and-Ubuntu.html"&gt;instructions&lt;/a&gt; that work nicely on Ubuntu.  However, if the phone suspends at any time during the process (as mine does constantly due to the bug I was talking about), then -poof- your USB device magically goes away and you lose your ifconfig settings or crash your ssh session!&lt;br /&gt;&lt;br /&gt;Unfortunately you have to have USB networking set up in order to run the install scripts to put Debian onto the SD card.  Maybe I can type in a command that will force it not to suspend, but I have to do it faster than thirty seconds over SSH because it looks like they took the terminal app out of the newer release. (The one thing that was actually any good in the old release, and they take it &lt;b&gt;out&lt;/b&gt;?  WTF?)&lt;br /&gt;&lt;br /&gt;I'm almost ready to flash Qtopia over the open moko software and forget about it, but I did really want to see what apps the open moko distribution would have available if I could get networking so the package manager will work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-172538911570968513?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/172538911570968513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=172538911570968513' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/172538911570968513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/172538911570968513'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/08/usb-networking-on-neo-freerunner.html' title='USB Networking on the Neo Freerunner'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-2901945120984442654</id><published>2008-08-31T10:17:00.009-05:00</published><updated>2008-08-31T11:06:16.608-05:00</updated><title type='text'>My Neo Freerunner Arrives</title><content type='html'>&lt;p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s7k3i46yEG0/SLq2-jQ_fcI/AAAAAAAAAPo/z-Fm5NJULn8/s1600-h/P8290001.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_s7k3i46yEG0/SLq2-jQ_fcI/AAAAAAAAAPo/z-Fm5NJULn8/s400/P8290001.JPG" alt="" id="BLOGGER_PHOTO_ID_5240702302133648834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center"&gt;It's here!  It's finally here!  My &lt;a href="http://en.wikipedia.org/wiki/A_Christmas_Story"&gt;&lt;del&gt;Secret Decoder Ring&lt;/del&gt;&lt;/a&gt; Neo Freerunner!&lt;/div&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s7k3i46yEG0/SLq3lqUirSI/AAAAAAAAAPw/SmhvNsiRyBA/s1600-h/P8290003.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_s7k3i46yEG0/SLq3lqUirSI/AAAAAAAAAPw/SmhvNsiRyBA/s400/P8290003.JPG" alt="" id="BLOGGER_PHOTO_ID_5240702974042484002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;When you open the box, you're greeted by a quote from the Tao De Ching.  I keep that same book on my desk.  How cool is that?&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s7k3i46yEG0/SLq4AlhGucI/AAAAAAAAAP4/ziMIGxKE4Rs/s1600-h/p8290002-1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_s7k3i46yEG0/SLq4AlhGucI/AAAAAAAAAP4/ziMIGxKE4Rs/s400/p8290002-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5240703436609468866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The quote seems to be about the empty hole in the bottom of the phone.  Funny, I figured that was where the &lt;a href="http://www.soaponarope.com/Merchant2/merchant.mvc?Screen=PROD&amp;Store_Code=soap&amp;Product_Code=7033&amp;Category_Code=A"&gt;rope&lt;/a&gt; goes.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s7k3i46yEG0/SLq4Tcb0ZXI/AAAAAAAAAQA/4R2HOuKm9K8/s1600-h/p8290005.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_s7k3i46yEG0/SLq4Tcb0ZXI/AAAAAAAAAQA/4R2HOuKm9K8/s400/p8290005.jpg" alt="" id="BLOGGER_PHOTO_ID_5240703760588891506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here's what you get in the box:  a stylus, USB cable, a charger with plugs for various countries, and a 512MB SD card.  The back side of the green card says "Thank you for your efforts to Free The Phone."&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s7k3i46yEG0/SLq4lhMeITI/AAAAAAAAAQI/8xr5AmhR71I/s1600-h/p8290004-1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_s7k3i46yEG0/SLq4lhMeITI/AAAAAAAAAQI/8xr5AmhR71I/s400/p8290004-1.jpg" alt="" id="BLOGGER_PHOTO_ID_5240704071104340274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The Neo Freerunner comes with the coolest stylus I've ever seen.  On the top side of the device is a laser pointer and a bright LED flashlight.  The bottom of the device has a clever mechanism which when twisted one way extends a plastic stylus tip, but when twisted the other way reveals a ballpoint pen tip.  Not quite a &lt;a href="http://tardis.wikia.com/wiki/Sonic_screwdriver"&gt;Sonic Screwdriver but close!&lt;/a&gt;  I ended up using the flashlight on this thing just a few hours later when a thunderstorm knocked our light out.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s7k3i46yEG0/SLq48pIDX2I/AAAAAAAAAQQ/v9RdpQBcAPo/s1600-h/p8290009.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_s7k3i46yEG0/SLq48pIDX2I/AAAAAAAAAQQ/v9RdpQBcAPo/s400/p8290009.jpg" alt="" id="BLOGGER_PHOTO_ID_5240704468370284386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The display on the phone is really quite beautiful.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-2901945120984442654?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/2901945120984442654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=2901945120984442654' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2901945120984442654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2901945120984442654'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/08/my-neo-freerunner-arrives.html' title='My Neo Freerunner Arrives'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_s7k3i46yEG0/SLq2-jQ_fcI/AAAAAAAAAPo/z-Fm5NJULn8/s72-c/P8290001.JPG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-4213690872262184173</id><published>2008-08-31T09:25:00.002-05:00</published><updated>2008-08-31T10:17:41.567-05:00</updated><title type='text'>Getting the OpenMoko</title><content type='html'>As our cell phone contracts expire soon, I wanted to take the opportunity to get a phone that I can hack the software on (I've been quite frustrated by the horrible software on my Sprint phone).  I've wanted an OpenMoko Freerunner phone because it runs Linux and you have true freedom to change the software on the phone as you like, but I wasn't sure if I could convince my wife we should spend money on it.  She surprised me, however, by promising me one for my birthday!&lt;br /&gt;&lt;br /&gt;Actually buying an OpenMoko Freerunner turns out to be a bit difficult.  The "Store" section of the openmoko site simply showed "Sold Out" with a claim that more phones would be coming in July, but it was already August and they hadn't updated that message.  You have to go through one of their 3rd-party distributors.  There's a catch:  the only US 3rd-party distributor (GP2X) doesn't actually sell the latest version of the phone!!  They are selling the Neo 1973, which is a prototype to the Neo Freerunner.  Due to the similar sounding names, it would be easy to accidently buy the older hardware, which lacks some features and already isn't always supported in newer software releases.  Read carefully before you buy!&lt;br /&gt;&lt;br /&gt;As of today when I look on the site, it seems you can now buy the new phones directly from OpenMoko, but when we ordered mine earlier this month, the only place that had it was the Canadian distributor, Koolu.  Having never bought anything from another country before, my wife and I were unsure how to pay for something in Canadian dollars with a US checking account, but it turns out the exchange rate is all handled automatically.  We didn't have any problems with the Canadian company, Koolu, but we had a string of problems trying to go through the US company PayPal to get the phone paid for.  First PayPal froze my wife's PayPal account because they flagged it as suspicious activity (because it was my wife's name on the account but the ship to was my name).  After jumping through a bunch of arbitrary hoops to get my wife's PayPal account unlocked, PayPal dropped the transaction &lt;i&gt;anyway&lt;/i&gt; because too much time had passed.  So I ended up buying the phone on my account and PayPal ran it as an echeck instead of a credit card, which is not what I wanted.  It turns out if you are PayPal customer, there is no way to tell PayPal to run it as credit, even though if you are &lt;b&gt;not&lt;/b&gt; a PayPal customer, PayPal &lt;i&gt;will&lt;/i&gt; run it as credit!  What kind of crap company denies a service to their members that they will give to nonmembers?  So I canceled the original transaction and re-ran it as credit and not as a PayPal member, and finally got the phone.  However, instead of refunding my first transaction, PayPal double charged me, wiping out my bank account.  The funds PayPal sucked from my bank account were there in my PayPal account, true, but I had only intended to pass money through PayPal, not deposit it there.  PayPal wasn't going to return my money from the canceled transaction unless I specifically asked for it back.  As long as I don't notice what they did, PayPal effectively had an interest-free loan from me.  Bastards.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-4213690872262184173?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/4213690872262184173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=4213690872262184173' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4213690872262184173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4213690872262184173'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/08/getting-openmoko.html' title='Getting the OpenMoko'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-1819526095102753921</id><published>2008-08-25T23:58:00.002-05:00</published><updated>2008-08-26T00:13:29.985-05:00</updated><title type='text'>I Feel Stupid And Triumphant</title><content type='html'>For years I haven't been able to run Linux on my laptop because my wireless card is not supported on Ubuntu.  Dell used several different Broadcom chipsets in different runs of the laptop I got, and I had the bad luck to get the ONE chipset that is completely unsupported on Linux.  The model stepping BEFORE this wireless card works, and the one after, but this one just proved to be too tough a nut to crack for the Linux driver people.  By a ridiculous stroke of bad luck it ALSO has a Windows driver which can't be used with the NDIS wrapper.  Trust me I've tried everything; many sleepless nights to no avail.&lt;br /&gt;&lt;br /&gt;But in an unrelated project, I've been playing with these WRAP PC Engines router boards that I got for free because they were lightning damaged.  A couple of them had mini-PCI wireless cards attached to them.  These cards use Atheros chipsets, which are the most well-supported wireless chips under Linux. They would fit in my laptop, but I didn't think they worked because I could never get them to work in any of the WRAP boards.  Plus I imagined tearing down the laptop to find the wireless card inside it would be a pain in the butt, so I put off actually swapping in a card to check if it worked.&lt;br /&gt;&lt;br /&gt;When I upgraded the RAM in my laptop today I found out that the wireless card is not hidden in the bowels of the machine; it's just located under the same access panel with the RAM!  I also had had the WRAP boards out and I noticed that the Atheros wireless cards I had weren't just crappy wireless "B" cards, they were really wireless "G".  So I finally swapped one in and it worked!  I'm writing this post from Ubuntu Linux now on my laptop, wirelessly!  Yipee!&lt;br /&gt;&lt;br /&gt;Then I realized that I could have done this six months ago.  Now I feel stupid.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-1819526095102753921?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/1819526095102753921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=1819526095102753921' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/1819526095102753921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/1819526095102753921'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/08/i-feel-stupid-and-triumphant.html' title='I Feel Stupid And Triumphant'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-2123032394469721186</id><published>2008-08-24T05:35:00.006-05:00</published><updated>2008-08-25T21:51:40.862-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>C++ Iterators</title><content type='html'>A friend of mine and I are collaborating on a game in the C++ programming language.  The part I'm writing is a general purpose engine that will be used on both the game server and the game client, so I decided to use templates to allow basic game objects to be replaced with entirely different classes in the client and server, yet still use all the same code on top of them.&lt;br /&gt;&lt;br /&gt;In the process of moving my code from regular classes to template classes, I uncovered a fundamental language wart or compiler flaw.  It has to do with a problem I ran into using STL iterators.  Before I go into what the problem is, let me explain iterators a bit.&lt;br /&gt;&lt;br /&gt;The people who wrote C++'s standard template library want to break you of the habit of writing things like:&lt;br /&gt;&lt;br /&gt;for (int i=0; i &amp;lt vec.size(); i++)&lt;br /&gt;&lt;br /&gt;Instead you should write this:&lt;br /&gt;&lt;br /&gt;for (vector&amp;lt int &amp;gt::iterator i=vec.begin(); i != vec.end(); i++)&lt;br /&gt;&lt;br /&gt;Do you see the improvement?  No?  It's supposed to simplify code for traversing containers--except that it's twice as much typing!  OK, well it also gives your code portability to use different containers besides vector ...theoretically... except that we have to specify "vector" directly in the for loop to say what kind of iterator it is!  Oops.&lt;br /&gt;&lt;br /&gt;The real motivation behind iterators is that it unifies the concepts for the people who &lt;span style="font-style:italic;"&gt;write the container classes&lt;/span&gt;.  I won't say the users of the container classes can't use iterators in ways that also provide benefit, but the users also bear a burden of extra boilerplate that adds as much work as it saves.  This is the sort of thing Bjarne Stroustroup means when he talks about the compiler vendors and library/tools group being overrepresented on the C++ standards committee compared to actual users of C++.  At least we users are finally going to get the auto keyword in C++0x, which will allow us to just write the word "auto" in place of the vector&lt;int&gt;::iterator gobbledygook.&lt;br /&gt;&lt;br /&gt;But being the good little C++ citizen that I am, I've taken the trouble to use iterators in all my code, even if it is a lot more typing.  That's how when I moved my engine definition into templates, I got burned badly.&lt;br /&gt;&lt;br /&gt;Where before I had this:&lt;br /&gt;&lt;br /&gt;for (vector&amp;lt GameObj &amp;gt::iterator i=vec.begin(); i != vec.end(); i++)&lt;br /&gt;&lt;br /&gt;I now have:&lt;br /&gt;&lt;br /&gt;template &amp;lt typename T &amp;gt&lt;br /&gt; ...  ...&lt;br /&gt;for (vector&amp;lt T &amp;gt::iterator i=vec.begin(); i != vec.end(); i++)&lt;br /&gt;&lt;br /&gt;What is &lt;span style="font-weight:bold;"&gt;supposed&lt;/span&gt; to happen is that when I instantiate the code with T=GameObj or T=OtherGameObj, the code will get built at the point I instantiated it and the result of the latter will look like the former except with either GameObj or OtherGameObj substituted for T.&lt;br /&gt;&lt;br /&gt;Instead, it turns out that you can't (at least on my compiler) use a template argument like T to specify the type argument to a container iterator.  You can &lt;span style="font-style:italic;"&gt;declare the container&lt;/span&gt; using that T, but you cannot access the iterator of the container you just created!  On some containers like vector you can just go back to the old notation, but for containers like map&lt;&gt;, iterators are the only way to loop over the container.  This is a Really F*ing Big Problem.  This is like laying the foundation for a building and realizing you didn't leave room in the floor plan for any doors.  The irony is that iterators from the standard &lt;span style="font-weight:bold;"&gt;template&lt;/span&gt; library don't work with &lt;span style="font-weight:bold;"&gt;template&lt;/span&gt; arguments!  This is like forgetting to leave room for doors in the plans for a f*ing door factory!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-2123032394469721186?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/2123032394469721186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=2123032394469721186' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2123032394469721186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2123032394469721186'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/08/c-iterators.html' title='C++ Iterators'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-2879491648555186258</id><published>2008-07-31T21:03:00.003-05:00</published><updated>2008-07-31T21:58:05.328-05:00</updated><title type='text'>Host Offline</title><content type='html'>I was trying to think of a catchy title for my first post after being away so long.  Due some ironic glitch in my blogging software, "Host Offline" appeared as the default text in the title box.  Why, yes, I have been!&lt;br /&gt;&lt;br /&gt;I've had so much going on that I haven't had any time to blog about it!  In the last two months I graduated college, moved, got married, and started a new job.  My routine changed a lot and I haven't figured out where blogging fits in to it.  Two a.m. used to be my prime writing time, but these days I'm in bed by ten so I can get up early for work.  I almost decided to give up this blog, but I found out my father reads it (hi dad!), so I think I'll give it another go.  &lt;br /&gt;&lt;br /&gt;Life's been great.  Melissa and I had a beautiful wedding, no family members disowned each other over the wedding planning stress, and then we had a wonderful week in Jamaica to unwind.  (I'll put some wedding pictures up... eventually...) When I got back I started my new job as a programmer for an insurance company and it's turned out to be a good gig, they run a clean shop and treat people right.  The only unfortunate thing is that I work during the day and Melissa works at night (she's a nurse).  Our hours mean I leave for work before she gets home, and she leaves just as I get home.&lt;br /&gt;&lt;br /&gt;Melissa found us a nice apartment in Norman, which IMO is the best city in Oklahoma.  I got all my stuff moved up here and - this is really shocking:  I'm actually organized!  Kinda.  I'm still a big pack rat and leave a lot of clutter around, but all my junk box goodies are in individual draws, bins, or containers.  If you name something, I can lay my hands on it in 2 minutes without rummaging.  I had had a week off by myself before the wedding, and I busted ass to get my organization project finished then because it could be years before I get another opportunity like that.  While sorting my 100's of TTL chips into individual bins by part number, I suddenly remembered that I had actually started sorting them 10 years ago, and hadn't finished.  So this is a once-in-a-decade event.&lt;br /&gt;&lt;br /&gt;These days I'm working on a MMO game engine, and hand-wiring an 8-bit computer, among other things, on evenings when my wife is at work. I used to think it was not possible to get anything constructive done in short shifts, but I've actually gotten pretty good at working on my projects now for just 30 minutes or an hour at a time.  Having my junk box organized helps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-2879491648555186258?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/2879491648555186258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=2879491648555186258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2879491648555186258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2879491648555186258'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/07/host-offline.html' title='Host Offline'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-2083538071263945980</id><published>2008-05-20T22:12:00.007-05:00</published><updated>2008-05-22T13:25:33.121-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='junk'/><title type='text'>My New Old 64-bit AMD</title><content type='html'>&lt;span style="font-style:italic;"&gt;It might be a sign it's time to upgrade when you find a better computer in the dumpster!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Melissa (my future wife) and I just moved to a nice little apartment in Norman.  One of the perks of living in "the city" is people throw out way better stuff here.  Just our first day in the apartment I spotted a computer tower sitting next to the dumpster.  I was surprised Melissa didn't say anything when I came back from taking out the trash, carrying something larger back into the house than what was in the bag when I went out.  She rolled her eyes but let me keep my new little "toy".  Maybe she's used to it by now, or just tired of trying to talk me out of it!  Because I'm a bit of a junk collector - it runs in the family.  But I just get such a charge out of taking things that were broken/worthless and turning them into something that can be used.&lt;br /&gt;&lt;br /&gt;This one was a real find - a 64 bit AMD Athlon 3200+; only a few years old.  I was hoping it was a dual-core; it wasn't, but the board supports one, and as it is this processor is still slightly faster than my current best computer (a 2.6 GHz Pentium 4).  Even though the clock speed of my Pentium is greater, AMD chips get more work done in each clock cycle, and this AMD one is 64 bit vs. my old one which is only 32 bit.&lt;br /&gt;&lt;br /&gt;I can only imagine what kind of hot rig the previous owner must have if he throws away a good 64 bit machine!  Perhaps he thought it was broken?  Dead computers are almost always salvageable; usually a dying hard drive or finicky power supply is the only ailment, but I guess owners get so frustrated with such problems that they get pissed and throw out the whole thing.  Or they don't understand that the CPU tower has interchangeable components inside it, many of which contain no moving parts and theoretically never wear out.  This guy obviously knew at least a little about computers, because he removed the RAM, which I was sad to see missing because I'm always short of DDR sticks.&lt;br /&gt;&lt;br /&gt;I cannibalized some RAM from one of my other computers, and I'm super excited now because the junk-computer seems to work fine!&lt;br /&gt;&lt;br /&gt;In order to furnish this new computer, I'm going to basically split my best computer in half and make two:  my best computer had 2 GB of RAM and matched hard drives in a mirror RAID; so I'm just going to put 1 GB of RAM in each and break the mirror.  Sure it was fun setting up the mirror RAID a few months ago... (What am I saying?  It was a pain in the ass setting up a software RAID to work with both Windows and Linux!  Way more trouble than it's worth!)  Anyhow as I was saying it's been fun playing with a RAID, but I can get more use out of the drives separately at the moment.&lt;br /&gt;&lt;br /&gt;(Gosh, how &lt;b&gt;do&lt;/b&gt; you break a mirror RAID?  Do you just yank out one drive and just make the system deal with it?)&lt;br /&gt;&lt;br /&gt;Unfortunately there'll be no pictures of this project.  My beat up old camera finally died its last death.  Cracked LCD, confused CPU, and it won't stay on anymore no matter how high I boost the voltage (it previously had an undervolt problem that I fixed by adding a 3rd battery).  Even I can't fix it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-2083538071263945980?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/2083538071263945980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=2083538071263945980' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2083538071263945980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2083538071263945980'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/05/it-might-be-sign-its-time-to-upgrade.html' title='My New Old 64-bit AMD'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-7103962058508777533</id><published>2008-04-27T23:18:00.020-05:00</published><updated>2008-04-28T04:24:28.634-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mods'/><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='bicycle shop'/><title type='text'>Mountain Bike to Road Bike Conversion</title><content type='html'>&lt;p&gt;Since my '63 Huffy was stolen, I've been saving parts for a new bicycle.  I wanted another road bike, but all I found was a used mountain bike.  I hate mountain bikes!  Still, it was in good shape, so I bought it.  When a derelict road bike showed up at the dump, I combined them to make the bike I really wanted.  The Frankenbike!  Skinny wheels, drop handlebars, and a big ironic sticker on it that says "Mountain Bike".&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_s7k3i46yEG0/SBVQZ8oyueI/AAAAAAAAAH8/RUhXWmK3K7M/s1600-h/Bicycle+outside.jpg"&gt;&lt;img style="margin: 10px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_s7k3i46yEG0/SBVQZ8oyueI/AAAAAAAAAH8/RUhXWmK3K7M/s320/Bicycle+outside.jpg" alt="" id="BLOGGER_PHOTO_ID_5194146151945910754" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_s7k3i46yEG0/SBWSzMoyuuI/AAAAAAAAAJ8/I75koAedEpM/s1600-h/IM000865.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_s7k3i46yEG0/SBWSzMoyuuI/AAAAAAAAAJ8/I75koAedEpM/s200/IM000865.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5194219153505041122" /&gt;&lt;/a&gt;It has a thick steel frame and extra low gears from the mountain bike.  The cargo rack came from the junk bike; I need to paint it.  Did I say I was making a road bike?  Maybe I mean &lt;span style="font-weight:bold;"&gt;touring bike.&lt;/span&gt;  This thing's a tank!  But I like to ride slow and steady anyway.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_s7k3i46yEG0/SBWTRMoyuvI/AAAAAAAAAKE/N4sPBLgYtGk/s1600-h/blue+bike.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_s7k3i46yEG0/SBWTRMoyuvI/AAAAAAAAAKE/N4sPBLgYtGk/s200/blue+bike.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5194219668901116658" /&gt;&lt;/a&gt;My original intent was to just swap wheels, but the donor road bike was a real wreck - rusty frame, taco-ed wheels, and seized bearings had eaten the hubs.  With the rims I wanted to use attached to bad hubs, and rims I didn't want attached to my good hubs, I hatched a plan I figured was either mad or brilliant.  Knowing nothing about wheel lacing or truing, I decided I'd take all the spokes out of the wheels, and transplant the good mountain bike hubs into the road bike rims.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_s7k3i46yEG0/SBWSOcoyutI/AAAAAAAAAJ0/2gs37-vLvvk/s1600-h/sorting+spokes.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_s7k3i46yEG0/SBWSOcoyutI/AAAAAAAAAJ0/2gs37-vLvvk/s200/sorting+spokes.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5194218522144848594" /&gt;&lt;/a&gt;When I tried to lace the new hubs into the road rims, I found the road bike rims have a larger inside diameter.  It wasn't much, but it was enough that the mountain bike spokes wouldn't reach.  I needed to use at least some mountain bike spokes, because a few of the road bike spokes were broken.  Usually when you lace wheels, you pick a lacing pattern and buy spokes the right length.  I needed to find lacing patterns that used the random combination of lengths I already had!&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_s7k3i46yEG0/SBVW1coyuhI/AAAAAAAAAIU/CUcWYbhXXTU/s1600-h/crows+foot+and+bearings+closeup.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; float:right; cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_s7k3i46yEG0/SBVW1coyuhI/AAAAAAAAAIU/CUcWYbhXXTU/s320/crows+foot+and+bearings+closeup.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5194153221462080018" /&gt;&lt;/a&gt;I found a site which described the Crow's Foot pattern.  This was perfect for what I needed, as I could use the shorter mountain bike spoke for the radial spokes, and the longer road bike spokes for the two crossing "toes".  The pattern looks nice and it's very stiff.  In this picture, you can see the distinctive 3-spoke crossings of the crow's foot.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_s7k3i46yEG0/SBWTxMoyuwI/AAAAAAAAAKM/oWO6rlvd1_w/s1600-h/you+can+see+the+bearings.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_s7k3i46yEG0/SBWTxMoyuwI/AAAAAAAAAKM/oWO6rlvd1_w/s200/you+can+see+the+bearings.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5194220218656930562" /&gt;&lt;/a&gt;That's a front fork but it's got a rear wheel hub stuck in it, sans gears.  The mountain bike spokes were just too short, even for Crow's Foot.  But a rear wheel hub has a larger diameter than a front wheel hub; it gets these shorter spokes closer to rim, just enough to make it work.  Of course that caused problems all its own.  A rear hub is wider than a front hub, which means the front fork isn't wide enough to go around the cone nuts.  I didn't want to bend the forks out, so I had to bring the cone nuts in.  Using the angle grinder and nerves of steel, I cut the cone nuts down to mere slivers, leaving only the sloped bearing race.  I cut them so thin I could fit both them and the nuts that lock them within the forks.  I also had to notch the axle bolt so it would slip into the smaller fork holes.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Despite the difficulties, using a rear hub for the front wheel is a great mod.  Front wheel hubs are narrow and use smaller bearings on a smaller axle.  Why?  You'd think the front wheel is the one you'd least want to wobble, and it will take the brunt of any crash.  Rear hubs, being wider, place the bearings further apart, so play in the bearings has less effect at the rim than with narrow hubs.  It gives a steeper dish to the spokes, which also resists side to side forces better.  And this hub has uncaged bearings, more of them, in a larger race.  The difference is noticeable.  There is zero wobble.  None.  It rides like it's on rails.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_s7k3i46yEG0/SBWIUsoyupI/AAAAAAAAAJU/RaiHbzmf7uI/s1600-h/IM000858.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_s7k3i46yEG0/SBWIUsoyupI/AAAAAAAAAJU/RaiHbzmf7uI/s320/IM000858.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5194207634402753170" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Funny story about the bearings.  I tried the smaller axle from the old front hub to see if it would hold the large bearings in.  It didn't, and the bearings went bouncing all over my shop.  I recovered all but one of the bearings.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_s7k3i46yEG0/SBWU0coyuyI/AAAAAAAAAKc/DXfFLPOTkAk/s1600-h/crows+foot+pattern.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_s7k3i46yEG0/SBWU0coyuyI/AAAAAAAAAKc/DXfFLPOTkAk/s200/crows+foot+pattern.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5194221374003133218" /&gt;&lt;/a&gt;  When I finally found that last bearing, I noticed it had hole drilled through it.  I'd never seen that before, and I couldn't figure out why someone would make a bearing with a hole in it!  But it was clearly one of the right bearings - it was the same size as all the others, and the same shiny silver color.  Maybe the hole was so it would retain grease?  I shrugged and put it into the race with the others.  Well the next day I found the missing bearing.  I thought, if I'm holding the missing bearing in my hand, what the crap did I put into the bearing race yesterday?  I removed the bearing with the hole in it and scratched it.  Silver paint flaked off.  What I had was one of those metalized plastic beads they use for craft necklaces!  By chance it happened to be on the floor in the same place I dropped my bearings!  I don't know what would have happened if I'd left it in, but the wheel turned fine with a plastic bearing.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_s7k3i46yEG0/SBV9_MoyumI/AAAAAAAAAI8/jO2D9bkQ9iw/s1600-h/IM000875.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; float:right;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_s7k3i46yEG0/SBV9_MoyumI/AAAAAAAAAI8/jO2D9bkQ9iw/s320/IM000875.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5194196269919287906" /&gt;&lt;/a&gt;For the rear wheel, I used Crow's Foot on one side, and made up my own pattern for the other.  I came up with a daring plan to use an &lt;span style="font-weight:bold;"&gt;unbalanced lacing pattern&lt;/span&gt;.  There are two forward-pulling spokes for every one backward-pulling spoke.  The idea is that when you're pedalling, there are two spokes transmitting your torque to the ground for every one that's not.  Does it lead to the wheel twisting under load?  It's hard to be sure because the rim was already bent when I got it.  But I've been riding it like this and haven't had a problem.  I call it the "Dreamcatcher" lacing pattern; the spokes weave many times.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_s7k3i46yEG0/SBVQ6MoyugI/AAAAAAAAAIM/3gFkI58Fe9w/s1600-h/handlebars+with+shifters+on+the+outside.jpg"&gt;&lt;img style="display:block; margin:0px 20px 10px; text-align:center; cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_s7k3i46yEG0/SBVQ6MoyugI/AAAAAAAAAIM/3gFkI58Fe9w/s320/handlebars+with+shifters+on+the+outside.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5194146705996691970" /&gt;&lt;/a&gt;I didn't want to restring the shifter cables, so I kept the original shifters.  Unfortunately they were designed for a straight bar.  On the drop bars always the shift lever was blocked, or the cable interfered with the brakes or my hands.  Putting them on the outside was the least bothersome place.  I'm saving the two levers on the stem for clutch levers to engage the motors if I make the bike electric.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The handlebars had awful rubber grips that kept slipping off.  I got rid of them and wrapped the handlebars with some good Cinelli cork tape.  Not bad for my first try.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_s7k3i46yEG0/SBWBr8oyunI/AAAAAAAAAJE/4HILmKRa-yA/s1600-h/IM000856.JPG"&gt;&lt;img style="display:block; margin:10px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_s7k3i46yEG0/SBWBr8oyunI/AAAAAAAAAJE/4HILmKRa-yA/s320/IM000856.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5194200337253317234" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Well, that's my bicycle.  There's nothing like riding a bike knowing every piece that makes up the whole is there because you chose it, not the factory.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_s7k3i46yEG0/SBWJXMoyurI/AAAAAAAAAJk/vQd_HtcnrIE/s1600-h/me+with+bicycle+in+front+of+construction.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_s7k3i46yEG0/SBWJXMoyurI/AAAAAAAAAJk/vQd_HtcnrIE/s400/me+with+bicycle+in+front+of+construction.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5194208776864053938" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-7103962058508777533?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/7103962058508777533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=7103962058508777533' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/7103962058508777533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/7103962058508777533'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/04/mountain-bike-to-road-bike-conversion.html' title='Mountain Bike to Road Bike Conversion'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_s7k3i46yEG0/SBVQZ8oyueI/AAAAAAAAAH8/RUhXWmK3K7M/s72-c/Bicycle+outside.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-4581352194365084803</id><published>2008-04-24T19:58:00.018-05:00</published><updated>2008-04-24T23:20:12.462-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='bicycle shop'/><category scheme='http://www.blogger.com/atom/ns#' term='nipples'/><title type='text'>Ferron's Guaranteed No Mess No Mixups Method for Swapping Rims without Relacing</title><content type='html'>&lt;p&gt;I'm restoring my fiancée's bicycle.  The hub and spokes are ok, but the bottom of the rims once sat in a puddle until they rusted out.  Luckily I had a spare pair of rims left over from my last bicycle project.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;It's fairly easy to de-lace a wheel.  But getting the lacing right when you put the new rims on looks really hard!  All those criss-crossings and spokes going alternating ways...  Who can keep track of it?  And if you miss a spoke, you'll throw off the whole process.  I found websites which provide wheel lacing patterns, but I've got a much easier way than lacing from scratch.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;The basic idea is that you only transfer one lace at a time.  You copy the pattern from the old wheel step by step, and you'll never miss a spoke.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Start by holding the two wheels side-by-side between your knees.  Make sure the right side spoke holes in one wheel are next to the right side holes in the other, and the left are by the left.  As seen in this picture, the valve holes might not line up although the left-right spoke holes do.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_s7k3i46yEG0/SBExUcoyuVI/AAAAAAAAAGs/gKKcNsNxaQY/s1600-h/IM000815.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_s7k3i46yEG0/SBExUcoyuVI/AAAAAAAAAGs/gKKcNsNxaQY/s320/IM000815.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5192986072689326418" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;With a flat head bit, completely unscrew a &lt;span style="font-weight:bold;"&gt;left side&lt;/span&gt; nipple.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_s7k3i46yEG0/SBE5v8oyuWI/AAAAAAAAAG0/IxQXHyNJir4/s1600-h/IM000818.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_s7k3i46yEG0/SBE5v8oyuWI/AAAAAAAAAG0/IxQXHyNJir4/s320/IM000818.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5192995341228751202" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Move the spoke over to the other rim and screw it in loosely.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_s7k3i46yEG0/SBE71MoyuYI/AAAAAAAAAHE/v4GbILrbqYs/s1600-h/IM000820.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_s7k3i46yEG0/SBE71MoyuYI/AAAAAAAAAHE/v4GbILrbqYs/s320/IM000820.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5192997630446320002" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Spokes which cross underneath are blocked by the ones on top.  Always transfer the spoke that crosses on top first, then transfer the one that crossed under it.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_s7k3i46yEG0/SBE6ocoyuXI/AAAAAAAAAG8/RCn7BLlXQIU/s1600-h/IM000823.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_s7k3i46yEG0/SBE6ocoyuXI/AAAAAAAAAG8/RCn7BLlXQIU/s320/IM000823.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5192996311891360114" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As you go around transfering each left side spoke, &lt;span style="font-weight:bold;"&gt;loosen&lt;/span&gt; but do not remove each &lt;span style="font-weight:bold;"&gt;right side&lt;/span&gt; nipple.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_s7k3i46yEG0/SBE9KsoyuZI/AAAAAAAAAHM/fTy8JzeuKc8/s1600-h/IM000819.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_s7k3i46yEG0/SBE9KsoyuZI/AAAAAAAAAHM/fTy8JzeuKc8/s320/IM000819.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5192999099325135250" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Save any extra nipples you can get off other wheels, because you will most likely round off a few nipples during the transfer, and you'll need to replace them.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_s7k3i46yEG0/SBE-QMoyuaI/AAAAAAAAAHU/oi9-Q8RgHT8/s1600-h/IM000821.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_s7k3i46yEG0/SBE-QMoyuaI/AAAAAAAAAHU/oi9-Q8RgHT8/s320/IM000821.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5193000293326043554" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;When you've transferred all the left side spokes, you will end up with this.  If you welded these rims together, you could make a monster "dualie" mountain bike!&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_s7k3i46yEG0/SBE_ZMoyubI/AAAAAAAAAHc/n8e-Eo1eOlc/s1600-h/IM000826.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_s7k3i46yEG0/SBE_ZMoyubI/AAAAAAAAAHc/n8e-Eo1eOlc/s320/IM000826.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5193001547456494002" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Now work around the wheel and transfer the remaining right side spokes one by one.  Except this time, transfer the one that crosses under first, so it will reach, then do the one that crossed over.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_s7k3i46yEG0/SBFBG8oyucI/AAAAAAAAAHk/6rnk6E6ZrBs/s1600-h/IM000833.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_s7k3i46yEG0/SBFBG8oyucI/AAAAAAAAAHk/6rnk6E6ZrBs/s320/IM000833.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5193003432947136962" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Ta-da!  Now the old rim is free, and the spokes are all in the new rim.  Yet you never undid more than one spoke at a time.  Magic!&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_s7k3i46yEG0/SBFBrcoyudI/AAAAAAAAAHs/fH1p5JiY85U/s1600-h/IM000838.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_s7k3i46yEG0/SBFBrcoyudI/AAAAAAAAAHs/fH1p5JiY85U/s320/IM000838.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5193004060012362194" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Don't try to ride it yet!  You still need to true the wheel.  I'll explain in another post the technique I came up with to true my wheels without special equipment.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-4581352194365084803?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/4581352194365084803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=4581352194365084803' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4581352194365084803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4581352194365084803'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/04/ferrons-guaranteed-no-mess-no-mixups.html' title='Ferron&apos;s Guaranteed No Mess No Mixups Method for Swapping Rims without Relacing'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_s7k3i46yEG0/SBExUcoyuVI/AAAAAAAAAGs/gKKcNsNxaQY/s72-c/IM000815.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-7466432351967487624</id><published>2008-04-24T19:43:00.002-05:00</published><updated>2008-04-24T19:55:36.694-05:00</updated><title type='text'>cheaphack.net</title><content type='html'>Just wanted to extend a little link-love out to Nick Johnson's &lt;a href="http://www.cheaphack.net/"&gt;cheaphack.net.&lt;/a&gt;  When I first started reading his blog, I expected it to really take off, so I've been surprised by how few comments I've seen around there.  If you enjoy reading about electronics projects, building things on the cheap, and the occasional post about bicycles, then you'll really enjoy &lt;a href="http://www.cheaphack.net/"&gt;cheaphack.net&lt;/a&gt;.  Check it out, and leave a message if you like it!  That's how we know whether or not anyone reads the stuff we write.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-7466432351967487624?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/7466432351967487624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=7466432351967487624' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/7466432351967487624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/7466432351967487624'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/04/cheaphacknet.html' title='cheaphack.net'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-6126553567120512024</id><published>2008-04-24T18:35:00.005-05:00</published><updated>2008-04-24T19:16:22.285-05:00</updated><title type='text'>Bicycle Shop</title><content type='html'>&lt;p&gt;In March I finally cleaned out my basement so I'd have a place where I can work on my bicycles. I have an alcove that's just right for parking one or two bikes by the door so I can easily wheel them outside.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_s7k3i46yEG0/R93jD1j2wXI/AAAAAAAAAFo/3Y3OIcQXRqw/s1600-h/bicycle+shop.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_s7k3i46yEG0/R93jD1j2wXI/AAAAAAAAAFo/3Y3OIcQXRqw/s320/bicycle+shop.JPG" alt="" id="BLOGGER_PHOTO_ID_5178544801602519410" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I even have a cool sign!&lt;br /&gt;(Disclaimer:  I do not run a real bicycle shop!)&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_s7k3i46yEG0/SBEga8oyuUI/AAAAAAAAAGk/rawZIrxZkG0/s1600-h/IM000854.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_s7k3i46yEG0/SBEga8oyuUI/AAAAAAAAAGk/rawZIrxZkG0/s320/IM000854.JPG" alt="" id="BLOGGER_PHOTO_ID_5192967492660803906" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Since clearing this shop space I've already completed 1 1/2 bicycle projects!  I'll post about them soon.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-6126553567120512024?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/6126553567120512024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=6126553567120512024' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/6126553567120512024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/6126553567120512024'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/04/bicycle-shop.html' title='Bicycle Shop'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_s7k3i46yEG0/R93jD1j2wXI/AAAAAAAAAFo/3Y3OIcQXRqw/s72-c/bicycle+shop.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-8046986305844469102</id><published>2008-04-24T13:38:00.008-05:00</published><updated>2008-04-24T14:09:36.099-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='i hate clocks'/><category scheme='http://www.blogger.com/atom/ns#' term='jokes'/><category scheme='http://www.blogger.com/atom/ns#' term='late for school'/><title type='text'>Let's Do The Time Warp Again</title><content type='html'>&lt;p&gt;This morning it was 7 o'clock three times in a row!  Wow!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_s7k3i46yEG0/SBDYjsoyuPI/AAAAAAAAAF8/q1WrFPmbpi0/s1600-h/Seven.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_s7k3i46yEG0/SBDYjsoyuPI/AAAAAAAAAF8/q1WrFPmbpi0/s320/Seven.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5192888478147459314" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Clearly I must be caught in a Time Loop!  So I did what any sensible person should do when they're caught in a time loop; I went back to sleep!&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Later I discovered this switch on the top of my clock.  It was on "alarm set".&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_s7k3i46yEG0/SBDY9MoyuQI/AAAAAAAAAGE/3k7n7KlDSL8/s1600-h/switch.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_s7k3i46yEG0/SBDY9MoyuQI/AAAAAAAAAGE/3k7n7KlDSL8/s320/switch.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5192888916234123522" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;D'Oh!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_s7k3i46yEG0/SBDZEcoyuRI/AAAAAAAAAGM/nxGH-y5OeNo/s1600-h/one+forty-four.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_s7k3i46yEG0/SBDZEcoyuRI/AAAAAAAAAGM/nxGH-y5OeNo/s320/one+forty-four.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5192889040788175122" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-8046986305844469102?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/8046986305844469102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=8046986305844469102' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/8046986305844469102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/8046986305844469102'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/04/lets-do-time-warp-again.html' title='Let&apos;s Do The Time Warp Again'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_s7k3i46yEG0/SBDYjsoyuPI/AAAAAAAAAF8/q1WrFPmbpi0/s72-c/Seven.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-3070150263311486421</id><published>2008-03-04T01:13:00.020-06:00</published><updated>2008-03-04T03:28:15.262-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mods'/><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='hacks'/><title type='text'>Small Form Factor Case Mod</title><content type='html'>&lt;p&gt;&lt;br /&gt;I wanted to build a custom firewall/router PC. Something small and compact, and which would use up some of my old computer parts.&lt;br /&gt;&lt;br /&gt;Let's see what we have to work with?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_s7k3i46yEG0/R8z-rIwzJ4I/AAAAAAAAADM/AL3v0OoYT80/s1600-h/00001.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_s7k3i46yEG0/R8z-rIwzJ4I/AAAAAAAAADM/AL3v0OoYT80/s320/00001.jpg" alt="" id="BLOGGER_PHOTO_ID_5173790088981849986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What a ridiculously bulbous case!  No wonder Packard-Bell went out of business.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_s7k3i46yEG0/R8z_UYwzJ5I/AAAAAAAAADU/Q50wIBIUB2c/s1600-h/00004.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_s7k3i46yEG0/R8z_UYwzJ5I/AAAAAAAAADU/Q50wIBIUB2c/s320/00004.jpg" alt="" id="BLOGGER_PHOTO_ID_5173790797651453842" border="0" /&gt;&lt;/a&gt;Ah, that's better: The metal part of the case isn't too bad.  We can work with this!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_s7k3i46yEG0/R80ACYwzJ6I/AAAAAAAAADc/84xsdm0Y_WA/s1600-h/00005.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_s7k3i46yEG0/R80ACYwzJ6I/AAAAAAAAADc/84xsdm0Y_WA/s320/00005.jpg" alt="" id="BLOGGER_PHOTO_ID_5173791587925436322" border="0" /&gt;&lt;/a&gt;Drives?  Who needs 'em!  With the drive bay cut off, I shortened the case by a third. Then I used new rivets to attach the old top at the new height.  Very clean - looks almost stock.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_s7k3i46yEG0/R80Bx4wzJ7I/AAAAAAAAADk/nhWy66FrRPk/s1600-h/00008.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_s7k3i46yEG0/R80Bx4wzJ7I/AAAAAAAAADk/nhWy66FrRPk/s320/00008.jpg" alt="" id="BLOGGER_PHOTO_ID_5173793503480850354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Unfortunately, the side panel now doesn't fit.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_s7k3i46yEG0/R80CI4wzJ8I/AAAAAAAAADs/10t1xBjYtOs/s1600-h/00014.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_s7k3i46yEG0/R80CI4wzJ8I/AAAAAAAAADs/10t1xBjYtOs/s320/00014.jpg" alt="" id="BLOGGER_PHOTO_ID_5173793898617841602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Mr. Side Panel, meet Mr. Angle Grinder.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_s7k3i46yEG0/R80F94wzJ9I/AAAAAAAAAD0/o5HQvA0csDA/s1600-h/00018.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_s7k3i46yEG0/R80F94wzJ9I/AAAAAAAAAD0/o5HQvA0csDA/s320/00018.jpg" alt="" id="BLOGGER_PHOTO_ID_5173798107685791698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I knew I'd never be able to cut a perfect edge with the grinder, so I riveted aluminium bar stock to make a skirt to stiffen the panel and mask the imperfection.  If you can't make it, fake it!&lt;br /&gt;&lt;br /&gt;Now I just need a face plate.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_s7k3i46yEG0/R80ID4wzJ_I/AAAAAAAAAEE/6oaKh5agxRE/s1600-h/00020+rotated.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_s7k3i46yEG0/R80ID4wzJ_I/AAAAAAAAAEE/6oaKh5agxRE/s320/00020+rotated.jpg" alt="" id="BLOGGER_PHOTO_ID_5173800409788262386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Look!  A perfect fit - other than being ginormously tall.  I really like the styling on this face plate better though.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_s7k3i46yEG0/R80JsIwzKAI/AAAAAAAAAEM/Z0WjX1yGkw0/s1600-h/00022.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_s7k3i46yEG0/R80JsIwzKAI/AAAAAAAAAEM/Z0WjX1yGkw0/s320/00022.jpg" alt="" id="BLOGGER_PHOTO_ID_5173802200789624834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;We'll just cut it in half too.  Uh oh...  I didn't account for that big hole on the top of faceplate after it's cut.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_s7k3i46yEG0/R80KV4wzKBI/AAAAAAAAAEU/muyK430_Pak/s1600-h/00025.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_s7k3i46yEG0/R80KV4wzKBI/AAAAAAAAAEU/muyK430_Pak/s320/00025.jpg" alt="" id="BLOGGER_PHOTO_ID_5173802918049163282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;What better way to fix the top of the faceplate than with the, er, top?  The steel files in the background:  I used those to trim the cuts so they'd glue together flush.  I have mad skills with files.  You can see here there's still going to be a seam no matter what I do.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_s7k3i46yEG0/R80OAIwzKDI/AAAAAAAAAEk/svPbckeCwOM/s1600-h/industrial+art+deco.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_s7k3i46yEG0/R80OAIwzKDI/AAAAAAAAAEk/svPbckeCwOM/s320/industrial+art+deco.jpg" alt="" id="BLOGGER_PHOTO_ID_5173806942433519666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Time to pull a design trick with the magician's old standby:  indirection!  Since I can't make the seam impossible to notice, I'll do the opposite and call attention to the area with a little decoration.  Who knew strap iron could be so appealing?  Earl Martin calls my style "industrial art deco," which I think has a nice ring to it.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_s7k3i46yEG0/R80O6IwzKEI/AAAAAAAAAEs/09KqVh0nxVU/s1600-h/00035.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp2.blogger.com/_s7k3i46yEG0/R80O6IwzKEI/AAAAAAAAAEs/09KqVh0nxVU/s320/00035.jpg" alt="" id="BLOGGER_PHOTO_ID_5173807938865932354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here's how I laid the parts out to fit them in such a small space.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_s7k3i46yEG0/R80RQowzKFI/AAAAAAAAAE0/26NxzAbs-6I/s1600-h/00051.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_s7k3i46yEG0/R80RQowzKFI/AAAAAAAAAE0/26NxzAbs-6I/s320/00051.jpg" alt="" id="BLOGGER_PHOTO_ID_5173810524436244562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The finished case mod in all it's glory, sitting as the capstone on my pyramid of computers.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-3070150263311486421?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/3070150263311486421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=3070150263311486421' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/3070150263311486421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/3070150263311486421'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/03/small-form-factor-case-mod.html' title='Small Form Factor Case Mod'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_s7k3i46yEG0/R8z-rIwzJ4I/AAAAAAAAADM/AL3v0OoYT80/s72-c/00001.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-220000110551939957</id><published>2008-02-12T02:28:00.000-06:00</published><updated>2008-02-12T02:44:11.712-06:00</updated><title type='text'>Slashdot Bingo</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_s7k3i46yEG0/R7FZI6XD_fI/AAAAAAAAADA/yiXhr2_5JZo/s1600-h/slashdot+bingo.PNG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://bp1.blogger.com/_s7k3i46yEG0/R7FZI6XD_fI/AAAAAAAAADA/yiXhr2_5JZo/s400/slashdot+bingo.PNG" alt="" id="BLOGGER_PHOTO_ID_5166008257210482162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-style: italic;"&gt;How to play&lt;/span&gt;:  Whenever someone invokes one of these topics in the comments on &lt;a href="http://slashdot.org/"&gt;Slashdot&lt;/a&gt;, place a token on the corresponding square!  Stack two tokens if the subject of the reference has nothing at all to do with the subject of the article.  Five in a row and you win!&lt;br /&gt;&lt;br /&gt;Remember to shout "Bingo!"&lt;span style="font-size:78%;"&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-220000110551939957?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/220000110551939957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=220000110551939957' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/220000110551939957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/220000110551939957'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/02/slashdot-bingo.html' title='Slashdot Bingo'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_s7k3i46yEG0/R7FZI6XD_fI/AAAAAAAAADA/yiXhr2_5JZo/s72-c/slashdot+bingo.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-6071119828898247512</id><published>2008-02-11T01:38:00.001-06:00</published><updated>2008-03-04T01:13:50.035-06:00</updated><title type='text'>Why Isn't There a 'Presentation Mode?'</title><content type='html'>&lt;div style="text-align: justify;"&gt;After so many years of Power Point presentations and public screens controlled by computers, it is a mystery to me why there still is no such thing as a "presentation mode." You ought to be able to tell the operating system, "No matter what happens, don't bother me.  Don't display any message boxes, don't put anything on top of the current application, and don't steal the foreground focus."&lt;br /&gt;&lt;br /&gt;It's a big problem when a Windows machine is embedded in an outdoor video display. It's set up to give the impression that it works seamlessly, like a TV.  Then a software glitch happens and Windows shows its ugly face.  Like this:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://thedailywtf.com/Articles/Calculatorating-in-Las-Vegas.aspx"&gt;http://thedailywtf.com/Articles/Calculatorating-in-Las-Vegas.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You would think that if the operating system cannot be counted on to not interrupt you, presentation software might at least try to give the illusion that the only thing going on is the content of the presentation.  Bah!  Some of the worst offenders are applications &lt;span style="font-style: italic;"&gt;interrupting themselves&lt;/span&gt; with update requests.  I can't count how many times I've seen a professor try to begin a slide presentation from a PDF file when his slides are covered up with this obscenity:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_s7k3i46yEG0/R7AMXaXD_cI/AAAAAAAAACo/T0dLJyhJNLA/s1600-h/adobe+update+dialog.PNG"&gt;&lt;img style="margin: 0px auto 10px; text-align: center; display: block; cursor: pointer;" src="http://bp2.blogger.com/_s7k3i46yEG0/R7AMXaXD_cI/AAAAAAAAACo/T0dLJyhJNLA/s320/adobe+update+dialog.PNG" alt="" id="BLOGGER_PHOTO_ID_5165642368946535874" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;How come Adobe can't figure out how worthless this dialog is?  The person who programmed it seems to think that the user is going to say, "Oh, a dialog box.  I love dialog boxes. Let's see what this one says..."  And then they think the user is going to carefully read it and consider all the choices.&lt;br /&gt;&lt;br /&gt;F**k no, man!  Here's what really happens:&lt;br /&gt;&lt;br /&gt;User:  "OMG!  WTF!  Did I break something?  Where'd this error message come from?  Where's my presentation?  Update who, what?  No!  Cancel!  Go away!"&lt;br /&gt;&lt;br /&gt;Anytime a program shows a dialog message, I think, "ah, this application was programmed by idiots."  They're idiots because they don't understand two essential facts:&lt;br /&gt;&lt;br /&gt;1.  Users do not read message boxes.  Ever.  Seriously.  I'm a computer geek, and I don't read the damn things.&lt;/div&gt;&lt;p style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_s7k3i46yEG0/R7AVPKXD_dI/AAAAAAAAACw/35guplWVe-8/s1600-h/no+error.PNG"&gt;&lt;img style="margin: 20px 10px 10px 0pt; float: right; cursor: pointer;" src="http://bp1.blogger.com/_s7k3i46yEG0/R7AVPKXD_dI/AAAAAAAAACw/35guplWVe-8/s400/no+error.PNG" alt="" id="BLOGGER_PHOTO_ID_5165652122817265106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;2.  The mere fact you're popping up a dialog box carries an unintentional message by itself.  Whether you mean to or not, you will lead the user to believe he did something wrong.  That message carries the same weight no matter how friendly you make the words inside the box.  See rule #1.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Before I go too far on this tangent, my point is that most interruptions are unnecessary. (Adobe, if you need the updates, get them automatically, and if you don't need them, don't ask!)  Of the questions that are necessary to ask, well then you're just screwed, because nobody will read it.&lt;br /&gt;&lt;br /&gt;So why isn't there a Presentation mode?  There are times when an interruption is not just annoying, it's completely unacceptable.  How about no interruptions whenever an application is running full screen mode?  Or give us a key combination, or a taskbar shortcut, to turn off interruptions?  Why not?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-6071119828898247512?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/6071119828898247512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=6071119828898247512' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/6071119828898247512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/6071119828898247512'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/02/why-isnt-there-presentation-mode.html' title='Why Isn&apos;t There a &apos;Presentation Mode?&apos;'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_s7k3i46yEG0/R7AMXaXD_cI/AAAAAAAAACo/T0dLJyhJNLA/s72-c/adobe+update+dialog.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-1338304509021067617</id><published>2008-02-08T02:34:00.001-06:00</published><updated>2008-02-08T03:16:26.136-06:00</updated><title type='text'>I Don't Do House Calls</title><content type='html'>I wish I could help, but I have to tell you up front that it's unlikely I'll have the time, sorry. With the utmost respect and kindness, I must demur that if I did have some free time, I wouldn't spend it on a service call.&lt;br /&gt;&lt;br /&gt;I apologize for this drawn-out "no", but you have opened up a subject which has a long and ghastly history for me.  I used to help friends &amp;amp; family with their computers at home, and after much work and frustration I decided it is not something I'm willing to do anymore. I'm sure you would be willing to pay a reasonable amount, but the trouble is the reasonable amount to charge for such a service doesn't come close to the time and stress involved.&lt;br /&gt;&lt;br /&gt;I gently suggest that if you knew what you were asking for, you would not ask: the job is akin to separating all the white and black granules out of a pepper shaker into equal piles with tweezers and a magnifying glass.  It will require the utmost concentration, but teach me nothing.&lt;br /&gt;&lt;br /&gt;I understand the plight you are in, because computers rarely work right, and it is difficult to find someone willing and able to look at them for you.  I feel the utmost sympathy for you and the millions of other people like you who have trouble with them; clearly things need to improve.  If I am ever in a position to effect a change, I promise I will do what I can to fix those design flaws that cause you so much grief, and try to bridge the disconnect between computers and ordinary people.&lt;br /&gt;&lt;br /&gt;But just because I've worked hard to become proficient with computers, doesn't mean I have to feel obligated to do additional work just because I have the ability.  I may have the ability, but if I answered every request like this that I get - and I can't walk down the street without being hounded by requests for computer help - then I would never do anything else.&lt;br /&gt;&lt;br /&gt;I'll tell you what I am willing to do for you. Send me an email, and describe your problem.  If it is something I can advise you on, I will give you all the advice I can - for free - when I have time.  Just don't ask for house calls.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-1338304509021067617?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/1338304509021067617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=1338304509021067617' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/1338304509021067617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/1338304509021067617'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/02/i-dont-do-house-calls.html' title='I Don&apos;t Do House Calls'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-6451052787460408945</id><published>2008-02-06T23:19:00.001-06:00</published><updated>2008-04-24T21:47:48.588-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='i hate clocks'/><title type='text'>Pro Tip:  Setting Your Clock</title><content type='html'>User interfaces of clock radios are so bad, I'll do anything to avoid interacting with them.&lt;br /&gt;&lt;br /&gt;Here's one way to avoid having to figure out how to set your clock:  if you ever have to unplug your clock to move it, wait until midnight.  That way when the clock flashes "12:00 a.m." after you plug it back in, it will already be the right time!&lt;br /&gt;&lt;br /&gt;Now I just have to wait until 7 o'clock tomorrow morning to set the alarm...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-6451052787460408945?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/6451052787460408945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=6451052787460408945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/6451052787460408945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/6451052787460408945'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/02/pro-tip-setting-your-clock.html' title='Pro Tip:  Setting Your Clock'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-4366667090710951179</id><published>2008-01-01T23:20:00.001-06:00</published><updated>2008-01-01T23:44:19.873-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='projects'/><category scheme='http://www.blogger.com/atom/ns#' term='radio'/><category scheme='http://www.blogger.com/atom/ns#' term='hacks'/><category scheme='http://www.blogger.com/atom/ns#' term='altoids'/><title type='text'>A Curiously Chocolate Radio</title><content type='html'>&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_s7k3i46yEG0/R3skWprTvNI/AAAAAAAAAB0/CS_-i3fGxSo/s1600-h/Altoids+radio+closed.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_s7k3i46yEG0/R3skWprTvNI/AAAAAAAAAB0/CS_-i3fGxSo/s200/Altoids+radio+closed.jpg" alt="" id="BLOGGER_PHOTO_ID_5150750570391518418" border="0" /&gt;&lt;/a&gt;I've been saving Altoids tins for years.  They're full of project possibilities:  how much electronics could you cram into one?  What neat things will people see when they peek inside?&lt;/p&gt;&lt;p&gt;From the outside this looks like an ordinary Altoids tin.  But what's under the cover?&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_s7k3i46yEG0/R3sft5rTvLI/AAAAAAAAABk/q1V7PpyN6jI/s1600-h/Altoids+radio+glowing.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 257px; height: 272px;" src="http://bp3.blogger.com/_s7k3i46yEG0/R3sft5rTvLI/AAAAAAAAABk/q1V7PpyN6jI/s320/Altoids+radio+glowing.jpg" alt="" id="BLOGGER_PHOTO_ID_5150745472265338034" border="0" /&gt;&lt;/a&gt;Why, it's a shiny pocket radio!&lt;/p&gt;&lt;p&gt;I got the circuit board out of a cheap FM radio, but I added the batteries and speaker.  (The original radio only had head phones.)  It turned out to be very difficult to get the antenna to work right.  The original radio used the head phones to double as a loop antenna, but the speaker I replaced them with doesn't have long enough wires and wouldn't get any reception with the metal tin surrounding it.  I solved it by running one leg of the audio out the back as an antenna wire, and I grounded the other side of the audio to the metal case.&lt;/p&gt;&lt;p&gt;Now the radio gets better reception than it did even before I hacked it!&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_s7k3i46yEG0/R3semZrTvKI/AAAAAAAAABc/YrNUkl7UIJo/s1600-h/Altoids+radio+side.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 292px; height: 325px;" src="http://bp1.blogger.com/_s7k3i46yEG0/R3semZrTvKI/AAAAAAAAABc/YrNUkl7UIJo/s320/Altoids+radio+side.jpg" alt="" id="BLOGGER_PHOTO_ID_5150744243904691362" border="0" /&gt;&lt;/a&gt;The chocolate brown theme of the tin reminded me of old wooden cabinet phonographs, so I thought it would be neat to make the radio so that you prop the lid open to use it, as if it were from that era.&lt;/p&gt;&lt;p&gt;The speaker is held to the lid with foam tape, which keeps it from buzzing.  The circuit board is held on one side with foam tape and screws on the other side, and the batteries are in a Radio Shack AAA battery holder, also secured with foam tape.  I used 190 proof Everclear to pre-clean the inside of the tin, so the foam tape would stick tight.&lt;/p&gt;&lt;p&gt;I'm pleased with how this project turned out.  It's one of the few projects I've actually seen through to completion in years - a testament to the wisdom of choosing a simple project.  And it's something I will actually use!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-4366667090710951179?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/4366667090710951179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=4366667090710951179' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4366667090710951179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4366667090710951179'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/01/curiously-chocolate-radio.html' title='A Curiously Chocolate Radio'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_s7k3i46yEG0/R3skWprTvNI/AAAAAAAAAB0/CS_-i3fGxSo/s72-c/Altoids+radio+closed.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-2161739205103884933</id><published>2008-01-01T20:09:00.000-06:00</published><updated>2008-01-02T00:54:10.339-06:00</updated><title type='text'>What Am I Doing Here?</title><content type='html'>It's been another crazy semester, and I've no doubt lost my readers (all five of you) by not posting in so long.  I've been suffering an existential crisis as to just what my blog is really all about.&lt;br /&gt;&lt;br /&gt;I started blogging with the intention of writing about the business of software - and I will do so still from time to time - but it has been so long since my employment has dealt directly with coding that I feel I can no longer speak of it as an expert.  When you're away from the front lines of software development, your memory of it becomes stale too quickly.&lt;br /&gt;&lt;br /&gt;So I have to ask myself, who am I writing for and what would those people want to read?  I will admit that I actually am writing for myself, but I do so with the suspicion that what I want to write, someone else may want to read.&lt;br /&gt;&lt;br /&gt;For one thing, I think I will move most of my project pages off Google Pages, and turn them into blog posts from now on.  Since Google has decided not to continue working on the Google Pages software, I don't know what will become of my website.  Blogspot, on the other hand, has continued to improve, and I've learned how to add images to my posts.&lt;br /&gt;&lt;br /&gt;I found that the most anecdotal narrative I've written yet, "&lt;a href="http://dennisferron.blogspot.com/2007/04/looting-compusa.html"&gt;Looting CompUSA&lt;/a&gt;", is also the one that rates highest on a Google search (indicating popularity).  Clearly the personal touch does better than an intellectual essay.&lt;br /&gt;&lt;br /&gt;One area that I've long neglected on this blog is my personal life.  No more!  My fiancee has asked why I don't talk about her on my blog, so let me start the new direction of my blog by announcing that I'm super excited because we just got our honeymoon trip booked!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-2161739205103884933?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/2161739205103884933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=2161739205103884933' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2161739205103884933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2161739205103884933'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2008/01/what-am-i-doing-here.html' title='What Am I Doing Here?'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-8533535801995364409</id><published>2007-11-08T16:54:00.000-06:00</published><updated>2007-11-08T18:14:05.602-06:00</updated><title type='text'>Wifi Combat</title><content type='html'>I suspect someone has been jamming my wireless network today.&lt;br /&gt;&lt;br /&gt;I noticed that web pages were taking a long time to load, which is strange since my cable internet is normally very fast.  Then my laptop's wireless connection to my router&lt;br /&gt;started dropping out within seconds every time it reconnected.&lt;br /&gt;&lt;br /&gt;I opened my site monitor and found that new non-broadcasting wireless networks were suddenly popping up on channels 1 and 11, and the strongest one was on the same channel as my router.  Though my connection kept dropping out, I managed to connect to the admin page on my router long enough to move it to channel 6.  It's not a good idea to use the wireless network to do router configuration, but I wasn't too worried about someone spying on my router password out of my packets because I run WPA-2 encryption.&lt;br /&gt;&lt;br /&gt;After I moved to 6, someone opened a new nonbroadcasting network on channel 8!  Usually, 1-6-11 are the three channels used.  These are chosen because they are as far apart as you can get; the intermediate channels interfere slightly with each other.  It is possible that someone might choose 8 knowing that it would interfere with my 6.  I thought, "they're trying to squeeze me out."&lt;br /&gt;&lt;br /&gt;Haha, they don't know who they're messing with.  I went into my router again and this time I sliced my broadcast power down as low as it would go: 3 percent.&lt;br /&gt;&lt;br /&gt;You might think, that if you are in a wifi jamming war, you would want to make your signal as strong as possible.  That's brute force thinking.  The Zen way to beat them is to make it so they don't know your signal is there at all.  A signal that is too strong is a common security risk for wifi networks; if you instead use only the minimum signal you can get by with, you reduce the chances of someone eavesdropping on your signal from far away.  By setting my broadcast signal so low, hardly any of it spills outside the walls of my house.&lt;br /&gt;&lt;br /&gt;Once I had the signal turned down so that my jammer couldn't see my network, I switched channels one last time - from 6 down to 5, so that it would both be farter from 8, and odd instead of even (if that matters -?).  Though my 3% signal only gets two bars on my meter, it still runs at the full 54 MBps, and I haven't been knocked offline since.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-8533535801995364409?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/8533535801995364409/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=8533535801995364409' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/8533535801995364409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/8533535801995364409'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/11/wifi-combat.html' title='Wifi Combat'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-7109329783227042311</id><published>2007-11-02T22:36:00.000-05:00</published><updated>2007-11-02T22:49:41.853-05:00</updated><title type='text'>I Didn't Clear the CMOS - D'Oh!</title><content type='html'>At work this week a computer was hit by a power surge and it wouldn't come on, though the lights would light up.  "Aha," I said, "I know just what to do!"  I suspected that the power surge might have corrupted the CMOS memory.  Back when I used to be in electronics class at Vo-Tech, I often ran into computers that appeared totally dead because of something as minor as a corrupt CMOS setting.  They often had nothing major wrong with them once the CMOS was cleared.&lt;br /&gt;&lt;br /&gt;I wasted no time in opening up the work computer that had been scrambled by the power surge, and I set the jumper to clear the CMOS.  When the procedure was finished, the computer magically came back to life.&lt;br /&gt;&lt;br /&gt;Later that day I got to thinking...  Isn't it strange, I told myself, that the computer at work which I fixed by clearing the CMOS had &lt;span style="font-style: italic;"&gt;exactly&lt;/span&gt; the same symptoms as my dead motherboard at home.  For some reason, though I instantly knew to clear the CMOS on the work computer, when my home computer had had the same problem, it had not even occurred to me to check that!&lt;br /&gt;&lt;br /&gt;My computer has been dead for a month while I struggled to find the time to set up a new motherboard and hard drive with it.  I pulled my old motherboard &lt;span style="font-style: italic;"&gt;out of the trash&lt;/span&gt; and set the jumper to clear the CMOS.  I had already parted out all the pieces of the computer that the motherboard went in; I would feel like a fool if a 2 minute procedure could have saved that computer.  "If this works, I'm won't know whether to be happy or pissed at myself."&lt;br /&gt;&lt;br /&gt;I cleared the CMOS.  The motherboard, which I had thrown away, the loss of which had thrown me off work and gaming for a month - the motherboard worked.&lt;br /&gt;&lt;br /&gt;D'oh!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-7109329783227042311?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/7109329783227042311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=7109329783227042311' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/7109329783227042311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/7109329783227042311'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/11/i-didnt-clear-cmos-doh.html' title='I Didn&apos;t Clear the CMOS - D&apos;Oh!'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-4649225305557453877</id><published>2007-10-10T22:06:00.000-05:00</published><updated>2007-10-10T23:29:06.664-05:00</updated><title type='text'>In Hindsight, my Foresight was 20-20</title><content type='html'>When I bought my portable harddrive, I went to no small amount of trouble to install Ubuntu Linux on it, wasting valuable storage space to make a sort of "Ubuntu rescue partition."  Most of the people I asked told me running an operating system from a USB drive was pointless, and probably impossible. Impossible it was not, though it required tedious study of arcane documents and a bit of black magic.  For a while it was fun to see Linux booting off a USB drive, but eventually I grew tired of the trick and just installed Ubuntu onto the internal hard drives in my machines.&lt;br /&gt;&lt;br /&gt;I came to regret having wasted the space on my external drive, so a few weeks ago I prepared to clear off the drive and repartition it.  But before I could start, the motherboard in my desktop was killed by a runaway power supply.&lt;br /&gt;&lt;br /&gt;Between my junk box and donations from friends, I was able to gather a booty of no less than eight replacement motherboards, each of dubious origin and doubtful reliability.&lt;br /&gt;&lt;br /&gt;Three motherboards evidenced fire damage; they had been toasted before I ever got them.&lt;br /&gt;&lt;br /&gt;One motherboard worked, but only with a goofy old style of RAM and not with my fastest processor.&lt;br /&gt;&lt;br /&gt;One went into nuclear meltdown in my lap.&lt;br /&gt;&lt;br /&gt;Two more simply did nothing at all.&lt;br /&gt;&lt;br /&gt;I saved the best one for last.  With its beautiful silver coating and more features than even I will use, this motherboard was obviously targetted at gamers and custom system builders.  The only caveat was that it dated from a couple years earlier than my old motherboard, so it would run my processor, but not as fast as the recently deceased board had.  But it was the best candidate, and it was new in the box.  Could it be, could this one &lt;span style="font-style: italic;"&gt;actually work?&lt;/span&gt;  My heart was in my throat as I connected the cables.&lt;br /&gt;&lt;br /&gt;Nothing.&lt;br /&gt;&lt;br /&gt;Anticlimax.  Pack up and go home.&lt;br /&gt;&lt;br /&gt;I don't think so.  This motherboard, I mean you could just &lt;span style="font-style: italic;"&gt;look &lt;/span&gt;at it, and you'd just know, it was too damn &lt;span style="font-style: italic;"&gt;pretty &lt;/span&gt;to not work.  Like seeing a shiny Corvette on the showroom floor and being told it doesn't run.  Doesn't add up, does it?&lt;br /&gt;&lt;br /&gt;When I get stuck, I try to put my problem in the larger context of the situation as a whole.  So...  This motherboard had to come from somewhere.  I didn't know its history but I do know that someone had taken this expensive new motherboard and thrown it away.  Now what would cause someone to do that?  Maybe they bought it and it didn't work.  I refuse to accept that it doesn't work.  Then - what could cause someone to &lt;span style="font-style: italic;"&gt;think&lt;/span&gt; their motherboard doesn't work?&lt;br /&gt;&lt;br /&gt;User error.&lt;br /&gt;&lt;br /&gt;And the antidote to user error?  RTFM.  It stands for "Read the F--king Manual," and it's good advice.&lt;br /&gt;&lt;br /&gt;In the manual for the motherboard I found that a jumper was incorrectly stuck on where the power switch belongs.  That's like holding the button in all the time; it won't turn on until you let go.  Furthermore the presence of the jumper had led me to put the real power switch onto the wrong place. Someone had stuck a jumper where it didn't belong and the motherboard was just wired permanently off.  I removed the jumper, and the system booted; it seems the original owner threw out something worth $200 rather than open a book and read about it.&lt;br /&gt;&lt;br /&gt;Now we come to the foresight I alluded to in my title.  Obviously I could not &lt;span style="font-style: italic;"&gt;really &lt;/span&gt;have known ahead of time, but I might as well have.  It turned out that my little Linux partition on my external storage drive was worthwhile anyhow.  The hard drive I'd been using with my old motherboard was SATA, but my replacement motherboard doesn't have SATA.  It meant that I couldn't boot the hard drive that had my operating system on it.  Instead, I had to gut my external storage drive to get a P-ATA drive that would work with the replacement motherboard.  And on the drive, there was the preinstalled Ubuntu partition, working just as well now that it is &lt;span style="font-style: italic;"&gt;inside&lt;/span&gt; my computer as it did when it was outside in the USB enclosure.  So I have an operating system for my computer after all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-4649225305557453877?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/4649225305557453877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=4649225305557453877' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4649225305557453877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4649225305557453877'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/10/in-hindsight-my-foresight-was-20-20.html' title='In Hindsight, my Foresight was 20-20'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-4135992316628373118</id><published>2007-07-27T20:09:00.000-05:00</published><updated>2007-07-27T20:15:35.453-05:00</updated><title type='text'>Project Pages - Powerwheels Robots</title><content type='html'>I'm stoked because I just finished the first of the &lt;a href="http://system.windows.codeslinger.googlepages.com/home"&gt;Project Pages&lt;/a&gt; on my website!  I made a complete write-up about &lt;a href="http://system.windows.codeslinger.googlepages.com/powerwheelsrobots-hagrid"&gt;Hagrid, my powerwheels robot&lt;/a&gt;.  Expect to see more projects up soon too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-4135992316628373118?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/4135992316628373118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=4135992316628373118' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4135992316628373118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4135992316628373118'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/07/project-pages-powerwheels-robots.html' title='Project Pages - Powerwheels Robots'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-2455310773347372074</id><published>2007-07-16T20:29:00.001-05:00</published><updated>2008-01-02T00:56:03.032-06:00</updated><title type='text'>The Dearly Departed:  My Poor Bicycle</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_s7k3i46yEG0/R3s1UprTvRI/AAAAAAAAACQ/l46FzER2Kc0/s1600-h/Travis+on+3+speed+by+church.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_s7k3i46yEG0/R3s1UprTvRI/AAAAAAAAACQ/l46FzER2Kc0/s320/Travis+on+3+speed+by+church.jpg" alt="" id="BLOGGER_PHOTO_ID_5150769227729452306" border="0" /&gt;&lt;/a&gt;This morning I awoke (at noon) to find my bicycle stolen.  Ack!  That's what I get for using a cheap&lt;span style="font-style: italic;"&gt; Walmart&lt;/span&gt; chain to secure a &lt;span style="font-style: italic;"&gt;valuable&lt;/span&gt; item.  The thieves didn't even have to cut it; they just pulled and the traitorous links separated without protest.  They left the chain, broken, on the ground.&lt;br /&gt;&lt;br /&gt;That's my brother riding it in this picture.  It was a 1962 Huffy; an English bicycle with a 3-speed hub.  Completely irreplaceable - a collector's item these days.  I liked it because I hate dérailleurs; with a 3-speed hub there's no chain derailing and you can change gears at any time, even at a dead stop.  Despite half a century of age and neglect, the bicycle was in perfect working order.  It had brand-new tires and I'd just installed all new cables.&lt;br /&gt;&lt;br /&gt;I actually noticed the chain out of place a second before I put two and two together:  "Hmmm...  If I'm holding the chain... and the chain is broken... and it was on my bicycle last night... and today it was on the ground... Holy Crap!  WHERE'S ME BICYCLE?"&lt;br /&gt;&lt;br /&gt;It's a strange feeling one gets at this moment of realization.  It reminded me of when I was three and let go of my balloon on accident.  As I watched it disappear into the sky, I somehow understood that there was nothing that could be done to retrieve it.  Something &lt;span style="font-style: italic;"&gt;ought &lt;/span&gt;to be done - yet nothing &lt;span style="font-style: italic;"&gt;could&lt;/span&gt; be done.&lt;br /&gt;&lt;br /&gt;You let go of your balloon - it goes up and away.  Simple physics.  You leave your bicycle chained outside in a neighborhood of juvenile delinquents - it gets vandalized.  Cause and effect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-2455310773347372074?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/2455310773347372074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=2455310773347372074' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2455310773347372074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2455310773347372074'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/07/dearly-departed-my-poor-bicycle.html' title='The Dearly Departed:  My Poor Bicycle'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_s7k3i46yEG0/R3s1UprTvRI/AAAAAAAAACQ/l46FzER2Kc0/s72-c/Travis+on+3+speed+by+church.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-6927329809752683458</id><published>2007-07-11T21:22:00.000-05:00</published><updated>2007-07-12T00:19:49.408-05:00</updated><title type='text'>An Opinionated Review of the Orlando Presentations</title><content type='html'>As I said in my previous entry, the quality of the presentations varied widely.  There were many presentations I thought were very good.&lt;br /&gt;&lt;br /&gt;But it's more fun to attack the bad ones.&lt;br /&gt;&lt;br /&gt;By far the worst presentation I saw was &lt;span style="color: rgb(153, 255, 153);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;blue text &lt;span style="color: rgb(0, 0, 0);"&gt;on a &lt;span style="color: rgb(102, 255, 153);"&gt;lime green&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(102, 255, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="font-weight: bold;"&gt;background&lt;/span&gt;.  In ALL CAPS.  Incredible.  It was so bad, I couldn't look away.  It was like a cheesy horror movie.  I can't remember at all what the research was about, but I was so fascinated by the abomination that I just had to make a spoof of it.&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://system.windows.codeslinger.googlepages.com/downloads"&gt;&lt;/a&gt;  &lt;a href="http://system.windows.codeslinger.googlepages.com/WELCOMETOMYGLORIOUSPRESENTATION.pdf"&gt;See it for yourself&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Oh but it wasn't just the slides; his presentation style was... unique.  Picture this:  this guy loads his slides up on the projector and you can tell &lt;span style="font-style: italic;"&gt;from his title page &lt;/span&gt;that it's going to be a terrible presentation.  He steps out in front of the crowd, and says... nothing.  He looks at us through round coke-bottle glasses a gives that deer-in-the-headlights look that only public speaking can inspire.  (Did you know &lt;a href="http://www.voicedynamic.com/overcoming_public_speaking_anxiety.htm"&gt;some people fear public speaking more than death&lt;/a&gt;?)&lt;br /&gt;&lt;br /&gt;So this poor guy steps out and just looks at us for two minutes and I'm thinking, poor fellow, he's going to die of pure fright right there in front of me.  When he finally spoke it was barely more than a mumble through the whole presentation.&lt;br /&gt;&lt;br /&gt;A different presentation that struck me as funny was not bad in the usual sense, in fact it was a polished presentation and the speaker was well-practiced.  Problem was, it didn't look like a research talk.  It looked like a coporate motivational presentation.  Straight out of Dilbert.  "&lt;span style="font-style: italic;"&gt;In order to maximize your profits, you want to minimize your costs and maximize your revenues!&lt;/span&gt;"  Complete with a histrogram showing costs that are down and revenues that are up, but the chart doesn't mean anything because there is no Y-axis and no units!  It was also full of motivationally meaningless phrases like, "&lt;span style="font-style: italic;"&gt;The future is tomorrow's now!&lt;/span&gt;"  and "&lt;span style="font-style: italic;"&gt;Today is yesterday's tomorrow!&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;That presentation was supposedly about data mining - stick to your subject, please!&lt;br /&gt;&lt;br /&gt;Another presentation was about the effectiveness of a new teaching method.  This was a good presentation but here I consider the work itself questionable.  The researcher gave a pre-test to a student on a subject they were doing badly in, spent one hour tutoring the student, and then administered a post test.  Naturally the students did better.  Based on this data, the researcher declared the teaching method a resounding success.&lt;br /&gt;&lt;br /&gt;Wait, no way.  How is this science?  Setting aside the issue that he has hand selected his subjects (it is not random) the form of the experiment is also bad.  He has an experiment with a variable but no control.  I suppose he thinks the pre-test is a control.  That's not a control, it's your baseline for your measurements.  A control would have been to administer the pre-test and post-test with one hour in between in which you did nothing.  Or to compare it to doing the pre-test and post-test with a &lt;span style="font-style: italic;"&gt;different&lt;/span&gt; tutoring method for one hour.  Only then can you get a real comparative analysis.&lt;br /&gt;&lt;br /&gt;I told the presenter I personally liked his teaching method, but I can't consider it objectively if he doesn't compare it to anything else.  He said that in all of the previous literature, the other researchers in this field are doing what he does - comparing pre-test and post-test only for their own method.&lt;br /&gt;&lt;br /&gt;In other words, it's ok because everyone is doing it.&lt;br /&gt;&lt;br /&gt;(How much science would a scientist chuck if a scientist could chuck science?)&lt;br /&gt;&lt;br /&gt;Some other things I found hilariously bad in other presentations:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(153, 255, 153);"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(102, 255, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Slide transitions that make it take ten seconds for everything to finish.  The speaker is trying to make her point but words are flying around like helicopters.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(153, 255, 153);"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(102, 255, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Talking with your hands in your pockets.  Good: you don't wave your hands around like a madman.  Bad:  Makes you look sheepish.  "&lt;span style="font-style: italic;"&gt;Ah gee shucks Mr. Wilson, I didn't mean nuthin' by it.&lt;/span&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(153, 255, 153);"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(102, 255, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Getting defensive over questions.  The moment you get defensive, you've lost all credibility with the audience.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(153, 255, 153);"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(102, 255, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-6927329809752683458?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/6927329809752683458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=6927329809752683458' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/6927329809752683458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/6927329809752683458'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/07/opinionated-review-of-orlando.html' title='An Opinionated Review of the Orlando Presentations'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-216666112166467944</id><published>2007-07-10T22:30:00.000-05:00</published><updated>2007-07-11T21:22:15.761-05:00</updated><title type='text'>Paranoia and Computer Science in Orlando</title><content type='html'>I'm sitting at the hotel cantina, enjoying a beer with my new friend from Iceland.  We are searching the internet, using our laptops to try to uncover the truth about the strange suspicions we share about the computer science event we are attending.&lt;br /&gt;&lt;br /&gt;There is something &lt;span style="font-style: italic;"&gt;odd&lt;/span&gt; about this conference.&lt;br /&gt;&lt;br /&gt;I showed up Monday morning bright and early to check in for the conference right on time.  I arrived to find nothing set up, and a sole conference organizer surrounded by unopened boxes.  He told me "it was hot" so he "didn't feel like unpacking the registration materials."  Come back later, he said.&lt;br /&gt;&lt;br /&gt;It was on my way out of the room that I noticed the conference sign was written in magic marker.  Like a lemonade stand.&lt;br /&gt;&lt;br /&gt;To kill time I ate a continental breakfast in the hotel diner.  Everything was stale.  Usually continental breakfasts - especially at conferences - are complimentary; this one cost $4.70.&lt;br /&gt;&lt;br /&gt;I was more concerned whether or not there was salmonella on the week-old boiled eggs.&lt;br /&gt;&lt;br /&gt;I came back and registered for the conference.  If you didn't have a receipt, they gave you a bank account number where you could transfer $ to attend the first day; when you find your receipt, they promised to refund your extra payment.  But it was abundantly clear that it was &lt;span style="font-style: italic;"&gt;very important&lt;/span&gt; that they get payment, and they wouldn't complain if someone wanted to pay twice.&lt;br /&gt;&lt;br /&gt;Luckily I had my receipt, and a transcript of an email with Prof. J E which documented that I would be presenting a paper for my colleague.  I was never to meet the mysterious JE, but I did get in to the conference with no trouble.&lt;br /&gt;&lt;br /&gt;This is my first conference so I didn't know what to expect, but I was sure that I could expect a printed copy of the proceedings - that is, a printed schedule and a book containing all of the papers submitted to the conference.  I got no such item.  They gave us a CD, with the conference proceedings on it.  Ok, this is the 21st century, I can dig this.  Paper is dead.  Long live digital media!  Yet... it seems somehow an insult to hand us a mere CD when we were promised a book.  Like they couldn't be bothered to print it out for us.  What about a schedule? - they didn't even print that.  It is a pain to pull out your laptop every time you want to know what's happening next, and I wanted to circle the talks I wanted to attend.  You can't (easily) do this with a PDF.&lt;br /&gt;&lt;br /&gt;The conference organizer (J E) did not show up; there was no explanation.&lt;br /&gt;&lt;br /&gt;At least the rest of the proceedings began innocently enough.  We had a guest speech called Forty Years in the Software Trenches.  I love hearing stories about the early days of computing, and this guy's been around since the days of punch cards.&lt;br /&gt;&lt;br /&gt;After the speech, BP, the assistant organizer, popped in to say that it was break time, and that there would be free breakfast food during the break times.  (I'd just paid for breakfast.  D'Oh!)  I asked him if we could get our money back if the hotel erroneously charged us - he said, "Next time, if you're not so hungry, you can just wait until break time!"&lt;br /&gt;&lt;br /&gt;I took break; what the heck, might as well snack again, since it's free.  I loaded my plate with some petrified cinnamon buns and the archeological remains of a danish.  "That'll be $4.70"  I thought it was free!  "No, not this - that.  Only that side.  The conference organizers only paid for what's on &lt;span style="font-style: italic;"&gt;that&lt;/span&gt; side."  D'Oh!&lt;br /&gt;&lt;br /&gt;What was on "that side" of the buffet was:  ice water, burnt cookies, and stale tortilla chips.  Breakfast of champions, yes?&lt;br /&gt;&lt;br /&gt;I considered coffee, but I'd made some in my room this morning.  Good thing.  A.B., from Tunisia, approached the coffee percolator.  A hotel staff physically blocked her, dashing to place his body between her the percolator just as she reached for the spigot.  "Can't have that," he said.  WTF?  "The conference organizers didn't want to pay for you guys to have coffee.  So you can't have any.  You can only have the ice water or the coke."  (A fellow attendee later informed me that even the coke was cut with a great deal of water to make it go farther.)&lt;br /&gt;&lt;br /&gt;AB and I sat at the same table and during the break discussed our disappointment in some aspects of the way the conference had been organized.  BP, who you will remember was the assistant organizer, asked if he could join our discussion.  I felt a little sheepish - had he heard us? - but AB took the opportunity to confront him (tactfully).  "No coffee allowed at the coffee break?  I never heard of such a thing!" she said.  BP said, "No you see, different people have different tastes, yes?  And you can't please everyone.  So really, we can only give water."  Amil said, "Yes, but no &lt;span style="font-style: italic;"&gt;coffee?&lt;/span&gt;  I've been to conferences in many countries, and this is the first I've seen that."  BP said, "Yes but you see... in other countries, they are more hospitable.  They are not so hospitable in America.  So you see we cannot provide coffee."&lt;br /&gt;&lt;br /&gt;Huh?  That doesn't even make &lt;span style="font-style: italic;"&gt;sense&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;This wasn't getting anywhere, so I asked him my question:  "You know, I was disappointed to not receive any printed proceedings, or a schedule."  BP had a justification for everything: "Yes but you see this is better, because this way you can print out just what you want.  You can go on the CD, you see, and click click click and get right to the paper you want to see."&lt;br /&gt;&lt;br /&gt;Thanks.  I know how a document on a CD works.&lt;br /&gt;&lt;br /&gt;AB said to him, "Wait, he's got a point!  Some of us don't even have our laptops here.  How are we supposed to review the papers before the talks?  It's not like you provided a PC available for us to use to at least view the CD."  BP went on the offensive now:  "Well I went to a conference in India and there they told us to bring our own laptops and I am not responsible if you didn't bring your own laptop.  So you see it is really your own fault that you don't have your laptop with you."  Amil countered, "But the rules for &lt;span style="font-style: italic;"&gt;this conference&lt;/span&gt; don't say to bring your own computer!"  BP had his story and stuck to it:  "It is your fault!" he declared, "And as for us providing you a computer to view it on, that is not our fault either, ha ha, it's not like we can force the hotel to provide you with a PC."&lt;br /&gt;&lt;br /&gt;Huh?  Strange logic, these Indians have.&lt;br /&gt;&lt;br /&gt;The content of the presentations varied widely in both quality and topic.  There seemed to be no rhyme or reason to the selection criteria for papers.&lt;br /&gt;&lt;br /&gt;There is &lt;a href="http://windpub.com/literary.scams/ripoffs.htm"&gt;a common scam involving books of poetry&lt;/a&gt;, in which &lt;a href="http://windpub.com/literary.scams/"&gt;gullible young writers are led to believe&lt;/a&gt; that their poetry is so good that a publisher wants to include it in their next book. Anyone will be accepted; as long as they buy a copy of the book.  The book is expensive.&lt;br /&gt;&lt;br /&gt;The basic concept appears over and over - short story contests, the who's who of students, etc.  Might someone do that with a conference?  Might someone have done that with this research conference?  I haven't a bloody clue.&lt;br /&gt;&lt;br /&gt;But I do know this:  if they had, they would have made $400 - $800 off every person here.&lt;br /&gt;&lt;br /&gt;Honestly this conference is not really a scam.  It would be better to say that: it borders on scandalous.  Hopefully the conference organizers learn to do better next time, and I know all of us attendees have learned an important lesson about being selective where we publish.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-216666112166467944?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/216666112166467944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=216666112166467944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/216666112166467944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/216666112166467944'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/07/paranoia-and-computer-science-in.html' title='Paranoia and Computer Science in Orlando'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-5692182166837084563</id><published>2007-07-09T08:41:00.000-05:00</published><updated>2007-07-09T08:46:32.889-05:00</updated><title type='text'>Thoughts from the Airport</title><content type='html'>&lt;p class="MsoNormal"&gt;I’m flying to &lt;st1:city&gt;&lt;st1:place&gt;Orlando&lt;/st1:place&gt;&lt;/st1:City&gt; to give a presentation on some research done by a Ph.D. candidate at OU.&lt;span style=""&gt;  &lt;/span&gt;I love traveling and while I’ve been to half the 50 states, &lt;st1:state&gt;&lt;st1:place&gt;Florida&lt;/st1:place&gt;&lt;/st1:State&gt; is one of the ones I haven’t been to yet, and one I’ve most wanted to see.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;Airport security, however, is one of the things I do not enjoy about traveling.&lt;span style=""&gt;  &lt;/span&gt;The process of checking in through airport security gets more odious and invasive every year.&lt;span style=""&gt;  &lt;/span&gt;I’ve traveled through many airports while I was in the Marines, but it has been many years since the last time I flew.&lt;span style=""&gt;  &lt;/span&gt;I wasn’t sure what new pointless rules would have been added in my long hiatus from travel, but I knew to expect a sour experience.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;As I stood in line waiting to go through the metal detector, it occurred to me that we didn’t feel the same way we feel when about to board a bus or standing in line to enter a public place.&lt;span style=""&gt;  &lt;/span&gt;This was more like prisoners standing in line waiting for punishment.&lt;span style=""&gt;  &lt;/span&gt;Why don’t they just make us strip naked and throw delousing powder over us like the scene at the beginning of the Shawshank Redemption.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;I was of course picked for a bag search.&lt;span style=""&gt;  &lt;/span&gt;I’m always picked for a random bag search, even though I have never done anything wrong.&lt;span style=""&gt;  &lt;/span&gt;I don’t fit their racial profiling nor am I on a list, as far as I know; I am simply spectacularly unlucky.&lt;span style=""&gt;  &lt;/span&gt;I know to also expect to be pulled out of the line for another random bag search when I try to board the plane, as if their first bag search was not enough.&lt;span style=""&gt;  &lt;/span&gt;Perhaps I am such a geek that my body language looks wrong to former high school jocks turned security guards.&lt;/p&gt;                &lt;p class="MsoNormal"&gt;After searching my bag the security guard informs me that my toothpaste, hair crème, and shaving cream are potentially dangerous chemicals and that I will only be allowed to take one of them with me, and in a quantity no greater than 3 ounces.&lt;span style=""&gt;  &lt;/span&gt;And it has to be in a plastic bag.&lt;span style=""&gt;  &lt;/span&gt;He kindly offered to escort me back out of security, so that I can go home and retrieve a plastic bag to carry my three ounces of the gel of my choice.&lt;br /&gt;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;And miss my flight.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;I’m beginning to think there might be a market for 3 ounce bottles of combination shaving gel and hair crème that tastes like toothpaste.&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;If they are afraid of allowing these things on the plane, why allow 3 ounces of it?&lt;span style=""&gt;  &lt;/span&gt;Why not just ban it?&lt;span style=""&gt;  &lt;/span&gt;Nevermind that I can’t imagine what one could do wrong with these.&lt;span style=""&gt;  &lt;/span&gt;Perhaps they are afraid I will shave the pilot, or give a pretty flight attendant a permanent bad hair day with my hair crème.&lt;span style=""&gt;  &lt;/span&gt;I can’t even speculate what good the plastic bag does.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-5692182166837084563?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/5692182166837084563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=5692182166837084563' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/5692182166837084563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/5692182166837084563'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/07/thoughts-from-airport.html' title='Thoughts from the Airport'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-8806032585586992544</id><published>2007-06-18T23:14:00.000-05:00</published><updated>2007-06-18T23:46:21.887-05:00</updated><title type='text'>That Contest I Didn't Win (But Could Have)</title><content type='html'>After an interminable wait, the &lt;a href="http://worsethanfailure.com/Articles/Announcing-the-OMGTWTF-Winner.aspx"&gt;OMGWTF contest results are in&lt;/a&gt;.  It looks like I'll have to get my MacBook by buying one, because I sure didn't win the one in this contest.  Though I did make it into the top twelve, and I got &lt;a href="http://worsethanfailure.com/Articles/OMGWTF-Finalist-10-FerronCalc.aspx"&gt;a great write up&lt;/a&gt;.  That's something, for sure, and having people like Raymond Chen and Joel Spolsky actually read your code is an honor.  I just wish I knew what they thought of it, because I didn't even get mentioned in the final decision.  I like to think this quote, taken out of context, was prompted by my entry:  “Joel said about “clever” solutions in general, “nobody told these people that pure OO design isn’t always the best way to write a given piece of code.”&lt;br /&gt;&lt;br /&gt;It looks like the judge's choice for the contest winner was &lt;a href="http://worsethanfailure.com/Articles/OMGWTF-Finalist-01-The-Buggy-4Function-Calculator.aspx"&gt;the most "believable" entry&lt;/a&gt;; it contains code that is strange, but strange in a way that you might actually see in a real project.  Perhaps I  overshot the mark then.  My entry was pervertedly clever, but was a little &lt;span style="font-style: italic;"&gt;too &lt;/span&gt;strange to be believable.  I didn't expect to get the "crowd favorite" award either; that clearly belonged to the &lt;a href="http://worsethanfailure.com/Articles/OMGWTF-Finalist-06-OMG%21OCRCAL.aspx"&gt;OMGOCR calculator&lt;/a&gt;.  But last I checked, my entry was doing 1 percent worse on the polls than the votes for "None of the above!"&lt;br /&gt;&lt;br /&gt;Despite the fact that Alex gave my entry a great write-up, there was quite a bit of material I wrote to him that he had to leave out of his article due to space limitations, and I've obtained his permission to post that material here.  (&lt;a href="http://worsethanfailure.com/Authors/Alex_Papadimoulis.aspx"&gt;Alex Papadimoulis&lt;/a&gt; is editor of &lt;a href="http://worsethanfailure.com/"&gt;www.worsethanfailure.com&lt;/a&gt;, the site which held the contest.)  I've been too busy to blog for several weeks, but with the contest getting over, I figured I'd better make it snappy with this post before it became old news.  Here is the full text of the conversation I had with Alex about my contest entry:&lt;br /&gt;&lt;div&gt;&lt;span class="q"&gt;&lt;blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"&gt;&lt;div link="blue" vlink="purple" lang="EN-US"&gt;&lt;div&gt;&lt;p&gt;• Where did you grow up and where do you live now? Anything fun/interesting about these locations? Do you have any kids, family, etc?&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;div&gt;I grew up in poverty.  My father was a working class man at a time when the type of jobs he had grown up doing were leaving the US to go to third world countries.  When I was young we moved all across the country, sometimes as much as four times a year, as my father searched for work.  I've lived in or been to twenty-five of the fifty states; by the time I was in sixth grade I'd gone to more schools than grades.  I've seen much but held on to little - we could never afford to ship anything with us when we moved, only what could fit into the trunk of a car.  So when people ask me, where did I grow up, I... don't know what to say.  I guess I grew up on the road.&lt;br /&gt;&lt;br /&gt;When I was twelve, my parents moved for the last time.  My father got a settlement on his social security disability and bought a tiny house in a very small town in rural western Oklahoma.  After a lifetime of &lt;span style="font-style: italic;"&gt;  wanderlust&lt;/span&gt;, he is content to never move again.  I emphasize with him; I too am sick to death of moving.  But my journey is just beginning.&lt;br /&gt;&lt;br /&gt;I could not stay in that small town.  If you live in western Oklahoma, you will be a farmer, or a rancher, or work in the oil fields.  There was no place for me there.  When I was seventeen I joined the Marines for no other reason than to get away from the life I felt trapped in.  I did not believe I would ever go to college.  Growing up in a family with no money, I was raised to believe that it just wasn't in the cards for me.&lt;br /&gt;&lt;br /&gt;I became a Small Computer Systems Specialist in the Marine Corps.  I went to school in California and was stationed in Washington, D.C.  (I loved D.C!)  Working alongside civilians, I came to realize that the only difference between their opportunities and mine was the degree.  I liked my job, working with computers, but I did not take well to military life.  I also really wanted to be a programmer, but my duties only included network administration.  If I went back to school, I could do what I really wanted to do, and be a civilian.&lt;br /&gt;&lt;br /&gt;I could have gotten a tuition scholarship on academic merit without having to join the military, but that would not provide money to live on.  After I got my honorable discharge, the G.I. Bill money enabled me go to college.  I chose a small college (Southwestern Oklahoma State University) because it was close to where my family lives.  Since then I've been blessed by many great opportunities.  I got an internship writing business software, a summer fellowship doing undergraduate research in machine learning and robotics, and most recently I became the first student from a regional university to get a NASA internship.  I also met the love of my life, Melissa, in college.  We will be married next year, after I graduate.  For the moment I'm living in Norman, Oklahoma, finishing the second summer of my undergraduate research program at the OU.&lt;br /&gt;&lt;/div&gt;&lt;span class="q"&gt;&lt;br /&gt;&lt;blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"&gt;&lt;div link="blue" vlink="purple" lang="EN-US"&gt;&lt;div&gt;&lt;p&gt;• When and why did you get into the field of computer programming? What college/university did you attend (if any)?&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;div&gt;In elementary school, I got my first exposure to computers playing Commander Keen on my uncle's computer.  I wanted to write my own games, but without a computer of my own I satiated my desire to program by performing thought experiments, trying to figure out from first principles alone the algorithm Commander Keen used to draw tiles and sprites.&lt;br /&gt;&lt;br /&gt;It wasn't until I was twelve that I got my own computer.  Someone gave me an Epson QX-10, which was an old 8-bit Z80 machine with 256K of RAM.  It was older than DOS; instead, it ran CP/M.  To put this in perspective, I was running CP/M on a Z80 while my schoolmates were running Windows 95 on 586 Pentiums.  My cousin asked me if my computer was a dinosaur; I told her that it wasn't even that evolved, "more like a trilobyte computer!"  I loved it though.&lt;br /&gt;&lt;br /&gt;(This topic parallels something I recently wrote in my blog: &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://dennisferron.blogspot.com/2007/05/phosphor-green.html" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt;http://dennisferron.blogspot&lt;wbr&gt;.com/2007/05/phosphor-green&lt;wbr&gt;.html &lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Most people get their start in programming by learning BASIC.  I've never met anyone else who learned to program in dBASE II. Unlike most 8 bit computers, my Epson did not come with BASIC.  It did come with a scattering of business software disks, including the dBASE programmable database software, and a slim, friendly introduction to programming in dBASE script.  We're talking a book less than 100 pages and a language that only let you have 80 integer variables - that's all I got.  But it rocked my world.  As I read about if-statements and loops and variable assignments, I did not so much learn the material as experience divine revelation.  I wanted to shout it from the rooftops.  I would read about an algorithm and shout, "Aha! Of course!  THAT'S how it's done!"  Everyone thought I was nuts.&lt;br /&gt;&lt;br /&gt;There was literally not a single soul in my small school who was interested in programming, besides me.  I learned to rely on myself to overcome problems and answer questions, because there just wasn't anyone else around to ask.  You learn to be resourceful that way; a child can shirk responsibilty for hard problems onto the shoulders of an authority figure, but when it came to computers I &lt;span style="font-style: italic;"&gt;was&lt;/span&gt; the highest authority I had.  So if I ran into something I didn't understand how to fix, I went at it like a dog with a bone until I figured it out myself.&lt;br /&gt;&lt;br /&gt;dBASE was ultimately too limiting a programming environment to write games on.  Just as I was nearing the end of what I could do with dBASE, my uncle built me a 486 machine with Win95 to replace my Epson CP/M machine.  On the Windows 95 CD, tucked away in an obscure folder, I found my next great love:  QBASIC.  If I could not get my friends interested in programming itself, I could get them interested in the games that can be written in QBASIC.  It was shortly after discovering QBASIC on my own machine that the realization hit me that not only were the Gorillas and Nibbles games on the school computers written in QBASIC, they came in &lt;span style="font-style: italic;"&gt;source code&lt;/span&gt; form.  I spent countless hours at school hacking those two games which came on the school computers, and my friends actually enjoyed watching me program.  I learned the uncommon skill of entertaining an audience while programming, which is something that has helped me immensely whenever I have given code reviews in my professional life today.  I also learned to program while explain what I was doing to someone watching over my shoulder, and still to this day I write code as though I have someone watching, trying to understand what I am doing.&lt;br /&gt;&lt;br /&gt;Since then I've had a passion for learning every computer language I can.  I'm now studying for a bachelor's in Computer Science at Southwestern Oklahoma State University.  At the risk of upsetting my professors, I have to say I haven't really learned anything &lt;span style="font-style: italic;"&gt;in class&lt;/span&gt; that I hadn't already picked up before I came here.  But what I have had is the wonderful opportunity to do internships and participate in research activities, and it was through my university that I was enabled to do this.  And furthermore I stress the words &lt;span style="font-style: italic;"&gt;in class&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;because while I get nothing out of lectures, I have had classes which featured projects we had to do, and I certainly learned things after class while doing those projects.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="q"&gt;&lt;blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"&gt;&lt;div link="blue" vlink="purple" lang="EN-US"&gt;&lt;div&gt;&lt;p&gt;• What is your job title and where do you work? How long have you been there?&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;div&gt;I've never liked the generic term "student" for encompassing all of the things I do.  This summer I'm a undergraduate researcher in machine learning and robotics at the University of Oklahoma.  I'm also a .NET software developer for a great software company called CDF Associates, which I will be rejoining when I go back to my usual college in Weatherford this Fall.  I'm in my second year with the research program and have been working off and on for CDFA since my sophmore year.&lt;br /&gt; &lt;/div&gt;&lt;span class="q"&gt;&lt;blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"&gt;&lt;div link="blue" vlink="purple" lang="EN-US"&gt;&lt;div&gt;&lt;p&gt;• How long have you been a reader of WTF? Have a favorite article/story? Submit any?&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;I've never submitted an article, but I've been a long time reader of the site.  I seriously thought about submitting this story:  a coworker of mine designed a new user interface for submitting data in a grid (a problem which has obviously never been solved before).  The grid featured different colors for validated rows depending upon whether they were new, old, canceled, or "uncanceled".  (The system had appointments you could cancel or undo cancellation on.)  If you hit "OK," the form saves the data.  If you hit "Cancel" he wanted it to ask, "Are you sure?"  Apparently it was tongue-twister Friday that week because he came up with a slightly different way of phrasing the question.  Here's the message box the application brings up if you hit cancel:  "The rows which were uncancelled that are now cancelled are highlighted in white.  The rows which were cancelled that are now uncancelled are now highlighted in gray.  Are you sure you want to cancel the uncancelled rows and/or uncancel the cancelled rows?"&lt;br /&gt;&lt;br /&gt;He couldn't understand what I found wrong with that.  I told him to say it three times fast.&lt;br /&gt;&lt;/div&gt;&lt;span class="q"&gt;&lt;blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"&gt;  &lt;div link="blue" vlink="purple" lang="EN-US"&gt;&lt;div&gt;&lt;p&gt;• What drew you to the OMGWTF contest?&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;div&gt;I suppose you're looking for an answer that involves the recognition of my peers, the thrill of the competition, and infinite glory (or at least infinite ego).  Nope.  I did it for the Mac Book. Ever since I started this undergraduate research program, I've had an acute case of Mac envy, but can't afford one for the foreseeable future.  Among computer science researchers, all the cool kids have Macs.  In the lab we have mostly Linux machines, some Apple, and a few Windows computers - but we put those in last kind in a corner and do not speak of them.  Sometimes we make the sign of the cross and throw garlic at them, just in case.  Anyhow I noticed that with me on my Windows XP laptop (I'm such a hypocrite), and some of my friends on Linux and some on Mac OS, when it came to basic day-to-day use, the people using Mac OS would actually get everything done twice as fast as the rest of us.  It gets points in the usability department, to be sure.  But the most important factor is that carrying a Mac around will increase my "street cred" here in the AI lab.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="q"&gt;&lt;blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"&gt;&lt;div link="blue" vlink="purple" lang="EN-US"&gt;&lt;div&gt;&lt;p&gt;• How did you come up with the idea? &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;div&gt;I drew on a number of different sources.  I've been thinking lately about the difference between static and dynamic typing, since I learned Ruby after being a C++/C# aficionado.  The difference is in static typing variables have types and that determines the type of value it can hold, but in dynamic typing the importance of each is reversed - only values have types, so a variable just has the type of whatever it's holding.  I have finally come to the conclusion that static typing is a false savings - it appears to be helpful but ultimately causes more work than it saves.  To illustrate the ridiculousness of static typing, I imagined a fictional language in which not only is the integer a type, but every value of an integer is a different type from every other value.  "Two" is a different type than "Three", and you cannot store a value of type "Three" into a value of type "Two".  If you, good heavens, need to store both "2" and "3" into a variable, you must create a new class and multiply inherit from both "Two" and "Three".&lt;br /&gt;&lt;br /&gt;When I saw the calculator contest, I realized it would be fun to try to simulate this situation in C++.  Of course the trouble is that under normal circumstances the "petrified values" language I described wouldn't actually be useful.  However, for some time I have been aware of the concept of template metaprograms in C++.  See, it turns out that C++ templates are so complex that they are actually Turing complete!  They can be used as a pure functional, recursive language that "runs" at compile time.  Since templates act on types, it should be possible to write C++ templates which perform recursive programmatic functions on types.  Instead of passing the &lt;span style="font-style: italic;"&gt;value&lt;/span&gt; 2 to a normal function, I pass the &lt;span style="font-style: italic;"&gt;type&lt;/span&gt; Two to a C++ template.&lt;br /&gt;&lt;br /&gt;Which brings me to my next point.  Although I didn't actually have to use any true template metaprograms in my code (my templates are similar to metaprograms, but not really), when I found out that template metaprograms were possible in C++, it brought a startling and abrupt end to my love affair with C++.  You see, the cardinal rule of good software design is to implement the same feature only once.  Once I learned of the existence of template metaprograms, I understood that C++ implements two Turing-complete languages.  One language runs at run time (normal C++), and it is classified as an imperative language.  The other language, templates, runs at compile time but is a pure functional language.  Though they are locked in a perverse embrace, the two languages could not be more different from one another.  It begs the question, why would you have one language that runs one time only (templates that run at compile time), and another language whose code runs every time?  That was how I came to understand that templates are just a poor work-around for the real underlying problem:  you only need templates because the static typing is too limiting.  A language which uses dynamic types does not need templates because you can do operations on types at run time with the same language you use for other problems.&lt;br /&gt;&lt;br /&gt;I could go on but I'll suffice it to say that I designed the calculator to be an example of what I think it wrong with inheritance and static typing, and I also wanted to push the boundaries of what is possible with the C++ language.  For instance, in the project I actually invented a new kind of method dispatch which selects base functions by namespace with the aid of templates.&lt;br /&gt;&lt;/div&gt;&lt;span class="q"&gt;&lt;blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"&gt;&lt;div link="blue" vlink="purple" lang="EN-US"&gt;&lt;div&gt;&lt;p&gt;• How long did it take for you to develop? &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;div&gt;I didn't find out about the contest until there was only a week to go, and by then I had already made plans to go away over the weekend.  So I had to finish it in about four days.  That's nothing.  I was once assigned to a project which had been worked on by two other programmers for months.  It was a calendar and scheduling service.  When I inherited the project the other two programmers were reassigned and the boss told me I had two weeks to finish the project for them and ship it.  I looked over the code and the forms but there was one thing I just couldn't understand.&lt;br /&gt;&lt;br /&gt;Me:  "Um, it's supposed to be a scheduler, right?"&lt;br /&gt;Boss:  "Sure!"&lt;br /&gt;Me:  "Well, I don't see any calendar in here, or any code that has to do with calendars or appointments..."&lt;br /&gt;Boss:  "Oh, I had them do administrative and maintenance forms until you got here.  You know, all the icky support stuff.  Don't worry!  I have faith in you!"&lt;br /&gt;&lt;br /&gt;Two weeks to go and the application had not one line of code that actually dealt with what the app was supposed to do!  Egads.  In two weeks - I had it done.  Didn't sleep for days and my girlfriend thought I disappeared from the Earth, but I shipped it, baby!&lt;br /&gt;&lt;br /&gt;(This is the same place I worked where I picked up the moniker Steely Eyed Code Slinger, which I used as the name of my blog.  I talk more about what that means in this entry:  &lt;a href="http://dennisferron.blogspot.com/2007/03/new-blog.html" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt; http://dennisferron.blogspot&lt;wbr&gt;.com/2007/03/new-blog.html&lt;/a&gt;)&lt;br /&gt;&lt;/div&gt;&lt;span class="q"&gt;&lt;blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"&gt;&lt;div link="blue" vlink="purple" lang="EN-US"&gt; &lt;div&gt;&lt;p&gt;• Were you inspired by any WTFs that you encountered in your professional programming?&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;div&gt;I think I was inspired by as many of my own WTF's as other people's.  I used to work with someone who came in to be the software architect for our team.  He and I had several differences of opinion.  Joel Spolsky talks about architecture astronauts; I'm here to tell you that the opposite can be a bad thing too!  Yes, we had an architect that didn't believe in abstraction.  Kind of like hiring a cowboy that doesn't ride horses.  He criticized my code because I would solve a "2+2" problem by making an inheritance hierarchy seven levels deep in a modular class framework with dynamic loading and package management.  Yet he went too far the opposite way - in his code every class lay at the same level, and he never reused &lt;span style="font-style: italic;"&gt;anything&lt;/span&gt;.  (Or... maybe he did!  Is cut and paste reuse?)  If we had 200 tables in a database, I would make one class that could handle every table.  He would make a new class for each of the 200 tables.  The key is that they differred only in types; the logic was the same.  Although we had many arguments, I think that ultimately I benefitted from knowing him, perhaps more than he did from me.  I do not know if he ever adopted any of my viewpoints, but I took his criticism of my methods seriously.  He may not have seen things the same way as I did but he did have four times the years of experience as I have, and as I too gained more experience I came to see that proper use of abstraction is a balancing act.  If you go too far in optimizing for abstraction, you may pay for it in the loss of simplicity or time.&lt;br /&gt;&lt;br /&gt;That does not, however, mean that you can't do badly in every possible facet.  My use of classes was narrow and deep (deep inheritance, but few classes at each level).  His use of classes was broad and shallow (short inheritance, many classes at a level).  The architecture of my calculator takes the worst of both our methods - it uses many more different classes than it should and inherits as deeply as possible.  Instead of 1 x Height or Width x 1, a structure that is both deep and broad results a Height x Width rectangle!  According to the garbage collector inside the calculator program, instantiating an object of type NinetyNine results in the instantiation of about 2700 other objects.&lt;br /&gt;&lt;/div&gt;&lt;span class="q"&gt;&lt;blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"&gt;&lt;div link="blue" vlink="purple" lang="EN-US"&gt;&lt;div&gt;&lt;p&gt;• What challenges did you face in creating your solution?&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;div&gt;Once I started down the path I set out for myself with the initial ideas, it was very difficult to rein in the project and keep it under control so that I could finish on time.  At first I put in ideas as soon as I came up with them, but when I reached the halfway point I knew that I needed to turn around and swim back for shore (to wrap up the architecture I started), and sometimes I was afraid I'd gone too far and wouldn't be able to pull it off.  I started out with a number of ideas that, based on what I know about the C++ type system and templates, I was pretty sure would work, but there is always the possibility of a devil in the details that keeps things from coming together.  There were a couple of sticking points where I was out in uncharted territory.  For instance, I decided to implement the calculator state machine using multiple inheritance, with each base class of the calculator corresponding to a different state.  The function names would be the same; different implementations of the same name would just come from multiple bases.  I thought that by casting the "this" pointer to a different base class, I could choose which one would be called.  Like virtual functions in reverse.  I cannot remember now why that didn't work - something to do with having a pointer an object under the disguise of one base class not necessarily meaning that the compiler knows how to cast that to another pointer to a different base of the same object.  Information gets lost in the translation that you can't get back.  So I had this brilliant state machine implementation - only problem was, it didn't actually work, due to a small detail.  I was able to solve it, though.  Instead of casting the "this" pointer to a new type, I pass the buck to a call-back proxy, which is a template class.  This way I can store the type of the base class in the form of the specific type of callback object I create.  The callback object then calls a template function on my calculator with the original T type argument it was instantiated with.  And inside my template function, I have code that reads T::some_func() where "T" is a class.  So if you have a state callback object which was instantiated with type "Cleared", you will get Cleared::some_func() ("T" is replaced by "Cleared", literally) but if it is state "Enter1stNumber" then T will be literally replaced with Enter1stNumber to make Enter1stNumber::some_func().  Thus it selects which base class to call some_func() for.  That's an example of the kind of thing I had to solve to pull this off.&lt;br /&gt; &lt;/div&gt;&lt;span class="q"&gt;&lt;blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"&gt;&lt;div link="blue" vlink="purple" lang="EN-US"&gt;&lt;div&gt;&lt;p&gt;• Would you replace calc.exe  on Windows with your calculator?&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;div&gt;Absolutely.  During the testing of my program, I compared my program's results to the results calc.exe produces.  In the process I found an obscure bug which calc.exe has but which my program does NOT!  Yes, the Windows calculator is buggier than a WTF entry.  You heard it from me first.&lt;br /&gt;&lt;/div&gt;&lt;blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"&gt;&lt;div link="blue" vlink="purple" lang="EN-US"&gt;&lt;div&gt;&lt;span class="q"&gt;&lt;p&gt;P.S. Let me know if you'd like a WTF sticker. &lt;/p&gt;&lt;/span&gt;  &lt;/div&gt;  &lt;/div&gt;   &lt;/blockquote&gt;&lt;/div&gt;Yes I would like one, thanks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-8806032585586992544?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/8806032585586992544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=8806032585586992544' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/8806032585586992544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/8806032585586992544'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/06/that-contest-i-didnt-win-but-could-have.html' title='That Contest I Didn&apos;t Win (But Could Have)'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-1015734159673034491</id><published>2007-05-24T19:54:00.001-05:00</published><updated>2007-05-24T23:47:25.355-05:00</updated><title type='text'>Phosphor Green</title><content type='html'>My first computer was an &lt;a href="http://www.classiccmp.org/dunfield/epson/index.htm"&gt;Epson QX-10&lt;/a&gt; (see it &lt;a href="http://www.obsoletecomputermuseum.org/qx-10/"&gt;here&lt;/a&gt; too).  I was 12 when I got it, back in 1995, and it was already ancient then.  It wasn't a PC compatible, and did not even run DOS.  Instead, it ran something that predated DOS, an older operating system called CP/M.  With its simple CP/M software and elegantly straightforward 8 bit Z-80 hardware, in a cute chassis, it meant to me what old Apple computers must have meant to their owners.  The QX-10 was the last, best 8-bit home computer.&lt;br /&gt;&lt;br /&gt;I spent many months in the cool glow of its green monochrome screen, learning to program.  Gosh I loved that computer.  At first I used my electronics skills to keep it running, but when it finally deteriorated past the point of my ability to repair it, I am ashamed to say I cannibalized it for parts.  Like Shel Silverstein's story of &lt;a href="http://en.wikipedia.org/wiki/The_Giving_Tree"&gt;The Giving Tree&lt;/a&gt;, where a boy cuts from his favorite childhood tree until all that's left of it is a sad stump, I chopped pieces from the computer to build other projects, until there was nothing left.  When I was 12 it seemed impossible that anyone could understand the entire workings of such a complicated device; now at 23, with much greater electronics experience, I look back and realize that I could keep such a simple computer in repair forever, if only I had left it intact.  The only thing I still have from it is a 3 inch long piece of black plastic and silicon - the Z-80 CPU that was at the heart of the system.&lt;br /&gt;&lt;br /&gt;Nostalgic Apple II owners and Commodore 64 enthusiasts can now download emulators of their old systems, but no one ever made an Epson QX-10 emulator.  I suppose it just wasn't a common enough system.&lt;br /&gt;&lt;br /&gt;However, while perusing a computer museum site, &lt;a href="http://www.classiccmp.org/dunfield/index.htm"&gt;Dave's Old Computers&lt;/a&gt;, I found he has &lt;a href="http://www.classiccmp.org/dunfield/epson/index.htm"&gt;CP/M emulators (scroll to the very bottom of the page)&lt;/a&gt;.  I always thought that a CP/M program would be for CP/M &lt;span style="font-style: italic;"&gt;on a QX-10&lt;/span&gt;, or CP/M &lt;span style="font-style: italic;"&gt;on a Kaypro&lt;/span&gt;, etc.  In other words, since CP/M runs on many different computers, I assumed that the programs would need to be both written for CP/M and be for that particular type of computer.  But it seems that any CP/M computer can run a program for any other CP/M computer, at least as long as both computers use the Z-80 processor.  So even though it might not be emulating the QX-10 per se, it seems to run the programs anyhow.&lt;br /&gt;&lt;br /&gt;With emulators in hand, I went looking for CP/M software.  I found the &lt;a href="http://www.retroarchive.org/cpm/index.html"&gt;CP/M Commercial Software Archive&lt;/a&gt;, which even has a version of &lt;a href="http://www.retroarchive.org/cpm/dbase/dbase.htm"&gt;dBASE II&lt;/a&gt;, the environment I first learned to program on.  I was disappointed that I couldn't find &lt;a href="http://en.wikipedia.org/wiki/QX-10"&gt;Valdocs&lt;/a&gt; in their downloads section.  Although it was written years before Microsoft Office was ever thought of, I could do anything with Valdocs that you can do today with Word and Excel, and I often got compliments on how nice my homework assignments looked when I did them with Valdocs.  I kept many of my old disks, but in agreement with Murphy's law, it happened that the disks I still have are mostly blank or worthless, while important ones, such as my own copies of the Valdocs disks, are all missing.&lt;br /&gt;&lt;br /&gt;There's still a surprising amount of CP/M software around.  The &lt;a href="http://www.cpm.z80.de/index.html"&gt;Unofficial CP/M Web Site&lt;/a&gt; even includes &lt;a href="http://www.cpm.z80.de/source.html"&gt;source code downloads&lt;/a&gt;.  By far the most eyebrow-raising download of all is option to download the entire source code for the CP/M operating system itself!  There is also a "mostly finished" version 3 of CP/M which was being written for the Motorola 68000 processor.  The nice thing about this version is that the source code is in C, so it could be compiled for something other than the 68000 as well; one of these days I would like to try taking that C code and porting it to another computer.  That would be fun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-1015734159673034491?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/1015734159673034491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=1015734159673034491' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/1015734159673034491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/1015734159673034491'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/05/phosphor-green.html' title='Phosphor Green'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-8681444095996006966</id><published>2007-05-24T04:10:00.000-05:00</published><updated>2007-05-24T05:04:53.583-05:00</updated><title type='text'>Communications</title><content type='html'>I have a story that makes people's cell phones ring.&lt;br /&gt;&lt;br /&gt;It isn't even a very important story.  Just one of those stories that begins, "so, something interesting happened to me today on the way to your house..."&lt;br /&gt;&lt;br /&gt;Except that I can't get any farther than that line without my listener's cell phone interrupting the conversation.  I am in mid-sentence; her cell phone rings, and I wait patiently for her to finish talking to the random caller.  "Sorry, what were you saying?"  So I begin again; but I don't get any farther than I did the first time, when her phone rings again.  It's the original caller, who thought of something she forgot to say before she hung up.  I wait again, but it's no use.  The second call does not even finish before a third call comes in.&lt;br /&gt;&lt;br /&gt;This has become so commonplace that it wasn't until the second time I tried to tell the same short story, to a different friend, at another house, when I once again could not tell the story because of phone interruptions, that it even occurred to me to be upset over this treatment!  If everyone does it, is it still rude?&lt;br /&gt;&lt;br /&gt;My fiancee is infamous among our friends for never answering her cell phone.  But I never get mad at her when I can't get through.  "I'm not a slave to my phone," she says.  Damn straight.&lt;br /&gt;&lt;br /&gt;I'd still rather people tried to reach me by phone than email.  Oh, how I hate email.  I check my email twice a week; inevitably I find my inbox stuffed with frantic messages because one professor or another has some &lt;span style="font-style: italic;"&gt;urgent&lt;/span&gt; business and has to reach me right away, and they've gotten themselves all in a tizzy because they can't understand why I haven't replied to their emails in two days.  I want to say to them, "Hello?  It's called the &lt;span style="font-style: italic;"&gt;telephone?&lt;/span&gt;  Ever heard of it?"&lt;br /&gt;&lt;br /&gt;I met an old-timer at NASA who shares my astonishment that people put so much stock in email.  He illustrates his point with a hypothetical question:&lt;br /&gt;&lt;br /&gt;"Suppose I told you that you've won $10,000.  All you have to do to claim your prize is get in touch with me by the end of the day.  What would you do?"&lt;br /&gt;&lt;br /&gt;"I'd call you."&lt;br /&gt;&lt;br /&gt;"You wouldn't email me?"&lt;br /&gt;&lt;br /&gt;"No."&lt;br /&gt;&lt;br /&gt;He then poses the same scenario over again, but lowers the amount in question each time.  Most people draw the line at $50.  When $50 is at stake, an email will suffice.  But for larger amounts, people want that assurance that they got through.  The difference between a phone call and an email is that if you physically talk to someone on the phone, you know they got your message.  "So why," he asks, "Do people conduct important business deals, over a medium they don't trust further than $50?  It's insanity."&lt;br /&gt;&lt;br /&gt;You expect this sort of thing from the older generation; but I am a young person, and I agree with him!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-8681444095996006966?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/8681444095996006966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=8681444095996006966' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/8681444095996006966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/8681444095996006966'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/05/i-have-story-that-makes-peoples-cell.html' title='Communications'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-237621180511686222</id><published>2007-05-14T01:27:00.000-05:00</published><updated>2007-05-14T01:48:27.424-05:00</updated><title type='text'>Programming Contest</title><content type='html'>I've had Mac-envy ever since I started my undergraduate research program last summer.  That's where I learned that Macbooks are what the real computer geeks are all carrying now; all the cool kids have one.&lt;br /&gt;&lt;br /&gt;They are, unfortunately, out of my meager price range; so when &lt;a href="http://worsethanfailure.com/Default.aspx"&gt;one of my favorite websites&lt;/a&gt; announced a &lt;a href="http://omg.worsethanfailure.com/"&gt;programming contest&lt;/a&gt;, the offerred grand prize really made me take notice: A shiny new &lt;a href="http://www.apple.com/macbookpro/"&gt;Mac Book Pro&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;I looked at the contest rules and thought, "I can do that!"  Given that the site is &lt;span style="font-style: italic;"&gt;very&lt;/span&gt; popular, I'm sure that I'll be competing against a large number of other contestants.  But the contest is in C++, and I'm at the top of my game right now, having just wrapped up a very challenging C++ program for NASA last month.  My brain is still in "C++ mode," so I dived in with both feet (well, both hands really; it's hard to type with your feet).  I've been coding like a madman all week, pulling out all the stops, exploiting every C++ trick I know up to the hilt.  I finished the submission just a few minutes ago, and had to blow on my hands because my fingers were smoking.  We're talking serious hacking here, three cups of espresso and a bottle of aspirin and go! go! go!  Yeah baby.&lt;br /&gt;&lt;br /&gt;So...  I submitted it.  All there is to do now is wait and see if they like it.  I hope so; I don't need any validation as a programmer but I really, really want that MacBook.  Wish me luck!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-237621180511686222?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/237621180511686222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=237621180511686222' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/237621180511686222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/237621180511686222'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/05/ive-had-mac-envy-ever-since-i-started.html' title='Programming Contest'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-3244198811162109235</id><published>2007-05-12T01:59:00.000-05:00</published><updated>2007-05-12T02:22:06.249-05:00</updated><title type='text'>How I Decide What Level to Write at</title><content type='html'>When writing about complicated subjects, it's difficult to maintain a balance between giving enough depth to make the topic interesting, and glossing over some details to make the article easy to read.  Some advice on the subject boils down to targeting your writing to the lowest common denominator - dumbing it down, if you will, but in a good way.  Yet I don't think this is the right approach for a blog with a technical focus.  I'm not writing this blog for everyone; I'm writing it because I think reasonably intelligent people will enjoy reading it.&lt;br /&gt;&lt;br /&gt;So what I actually do is that when I write a sentence or paragraph, I ask myself whether it would make sense to an overwise intelligent reader at 2:00 in the morning, who is tired and not thinking clearly, but who likes to stay up sometimes and read blogs.  I figure if that person can at least make sense of it, then the cognitive effort required to read the words is low enough for anyone else to cruise smoothly over the page.  It is not hard for me to put myself in that person's shoes, since I only write blog entries at 2:00 in the morning, when I am tired and not thinking clearly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-3244198811162109235?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/3244198811162109235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=3244198811162109235' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/3244198811162109235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/3244198811162109235'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/05/how-i-decide-what-level-to-write-at.html' title='How I Decide What Level to Write at'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-1340187534443468696</id><published>2007-05-08T23:32:00.000-05:00</published><updated>2007-05-08T23:51:12.992-05:00</updated><title type='text'>Offline Blogging</title><content type='html'>I'm writing this blog entry offline.&lt;br /&gt;&lt;br /&gt;When I first moved in, my professor warned me that he didn't think the signal from his wireless router reached the far bedroom in which I'm staying. “That's ok,” I said, “I'm getting 2 bars; not great but it's a usable signal.”&lt;br /&gt;&lt;br /&gt;After I'd been using the network for a few days, I happened to mention to him that I'm getting horribly slow speeds on his “linksys” wireless network. “I don't have a Linksys router,” he said. “What?” I asked. “I don't have a Linksys router. I have a D-Link router.” “But... then how... who...” “You must be getting a neighbor's signal.” “Ah. I see.”&lt;br /&gt;&lt;br /&gt;Since my connection to a neighbor's internet was both unreliable and slow, I would much rather be on my professor's cable modem connection. I was pretty sure the lack of a signal from his router was a configuration issue rather than a signal limitation, so I went to go check the configuration. At this time it was well after midnight, and not wanting to disturb my professor's sleep, I resolved to hack into the router rather than wake him up and ask him for the password.&lt;br /&gt;&lt;br /&gt;In the pitch-black living room, I used the light of my laptop screen to illuminate the mess of cables around his router and cable modem. I'd have to have a copper hard-link until I got the wireless working. I found a spare ethernet port on the router and plugged myself in. Turn on DHCP... then run ipconfig, good: it gave me an ip address. Now that I had a link, I needed to access the router's configuration page. Nine times out of ten, the ip address of a router is 192.168.1.1. I opened up my Firefox web browser and typed in that address. It popped up and asked me for a username and password. So far so good – I wasn't in yet, but at least I knew there is a router at that address.&lt;br /&gt;&lt;br /&gt;I never get discouraged when I see a dialog for a password and I don't know it, because I've learned a few very simple facts: 1. most users never change the default passwords, 2. default passwords are remarkably easy to guess. Besides, I had a gut feeling the login would be “admin/admin.”&lt;br /&gt;&lt;br /&gt;That brought up the router configuration page. Now, to check the “wireless” section. I clicked on it, but instead of any configuration options, I was treated to this helpful message: ~!@ #$%^ &amp;*()_&lt;br /&gt;&lt;br /&gt;The software that is loaded on home network appliances has never been particularly well-written, but lately it has been getting even worse. In this case, the router's configuration software is so badly broken, that it returns a page containing random binary garbage, instead of the wireless configuration page.&lt;br /&gt;&lt;br /&gt;Upgrading the firmware on the router to fix this problem would be more work and more intrusive than my original intentions, so I prepared to give up for the night. Then I noticed that the color scheme of the configuration page was &lt;em&gt;purple&lt;/em&gt; and grey, rather than the &lt;em&gt;blue&lt;/em&gt; and grey D-Link would use. Guess which router company favors puple over blue? Yep, Linksys. I missed the Linksys logo when I first logged in because their broken software just loads an empty image box where their logo goes. But a quick check of the ip addresses on my interfaces showed my error: I should have been on 192.168.&lt;strong&gt;&lt;em&gt;0&lt;/em&gt;&lt;/strong&gt;.x if I wanted to connect over my copper ethernet. What I used, 192.168.&lt;strong&gt;&lt;em&gt;1&lt;/em&gt;&lt;/strong&gt;.x, was my wireless interface. Darn it, I broke into the wrong router. Sorry neighbor dude! How embarassing – like walking into the Women's bathroom by mistake.&lt;br /&gt;&lt;br /&gt;With the correct IP address in my browser, I got to another login screen, this time for the D-Link router. “Admin/admin” didn't work here. Hmmm... maybe, “administrator/password”? Nope. I tried a few more obvious combinations and failed. Time to back up and think about this analytically. Now I know that most login systems don't allow blank passwords, but some do. So perhaps I had been overthinking it. Had I failed to guess the password simply because there wasn't any? Indeed. “Admin/[blank]” worked like a charm.&lt;br /&gt;&lt;br /&gt;Once I got into the right router, the only thing I could see that might be wrong was that WEP encryption was enabled. Considering that the router login was admin with a blank password, I highly doubted my professor had been in these configuration pages at all, so I don't think he deliberately enabled WEP. While I would be taking off a layer of security by turning off WEP encryption, if neither he nor I could access his wireless network at all, than the WEP security was clearly not doing any good. As bad as it is to have your wireless network unsecured, WEP has caused me nothing but trouble. Every time I try to use it to secure a network, I've had to turn it back off again because half of the computers I want to connect, can't.&lt;br /&gt;&lt;br /&gt;With WEP turned off, the wireless network began working again. Still no internet. Why not?&lt;br /&gt;&lt;br /&gt;At this point it's best to approach the problem in stages. Can I ping my own address? Good. Can I ping the router? Good. Can I ping &lt;a href="http://www.google.com/"&gt;http://www.google.com/&lt;/a&gt;? No. What's between the router and google? Ah, yes, the cable modem. Cable modems are notorious for crashing and needing to be rebooted, so naturally they are designed without an accessible reset button and with no on/off switch to power cycle them. How hard would it have been to put a watch-dog timer in the hardware that reboots the modem if it can't ping out? These devices are designed with the assumption that nothing will go wrong. If these companies would admit to themselves that software is inherently unreliable, it would be the first step to making devices that are reliable.&lt;br /&gt;&lt;br /&gt;I unplugged the router and waited five seconds before plugging it in. Instead of connecting me to the internet, the router flashed its power and link lights over and over. What the heck does that mean? Turning it off and on again did not stop the flashing. Hmm... If the router has a configuration page, surely the cable modem has one too. How to access it? In the router configuration page, the local network is 192.168.&lt;strong&gt;&lt;em&gt;0&lt;/em&gt;&lt;/strong&gt;.x; but the outside network is 192.168.&lt;strong&gt;&lt;em&gt;100&lt;/em&gt;&lt;/strong&gt;.x. If that is the network the router is using to talk to the cable modem, that would put the cable modem at 192.168.100.&lt;strong&gt;&lt;em&gt;1&lt;/em&gt;&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;The cable modem didn't require a password, because it doesn't have any user-changeable options. It does show status though. It said “LAN: Up” “USB: Down” (no USB is plugged in) and “CABLE: Down”. Bummer. The modem's event log page had more bad news: “DHCP failed” “Timing Sync Failure” “Failed to receive....” “Failed to receive...” (In other words, the cable modem's not getting any response from the cable company.)&lt;br /&gt;&lt;br /&gt;Well, fiddlesticks. After all that, I still have no internet.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;It turned out that the cable company was having technical problems; cable internet service was down in the entire area for nearly 24 hours.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-1340187534443468696?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/1340187534443468696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=1340187534443468696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/1340187534443468696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/1340187534443468696'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/05/offline-blogging.html' title='Offline Blogging'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-857776203681208919</id><published>2007-05-03T15:12:00.000-05:00</published><updated>2007-05-03T16:37:56.612-05:00</updated><title type='text'>Giant Mackerel Gets Married</title><content type='html'>Lent is a time when Catholics try to identify something in their lives that is a bad habit, and sacrifice it for a month.  I gave up &lt;a href="http://reddit.com/"&gt;Reddit.com&lt;/a&gt; for Lent.  Actually, what I gave up was &lt;span style="font-style: italic;"&gt;wasting time on the internet.&lt;/span&gt;  I'm not sure there's a distinction.&lt;br /&gt;&lt;br /&gt;It didn't go so well.  I think I ended up reading Reddit more when I was trying not to, than I ever did before or since the Lenten period.  At one point I reached Reddit link number #999.  That's like sitting down to eat a few Cheetos, and ending up eating a whole bag instead of dinner.&lt;br /&gt;&lt;br /&gt;It seems that all bad habits share a common feature - they involve consequences such that one might decide &lt;span style="font-style: italic;"&gt;a priori&lt;/span&gt; that the activity is not worthwhile, but when broken down into pieces, each infinitesimal step does not entail enough harm to cause someone to stop.  One more potato chip, one more cigarette (thank God I don't smoke), reading one more Reddit article - I used to think this kind of procrastination was my own peculiar personality flaw.  I'm beginning to realize I'm not as alone in this as I thought.&lt;br /&gt;&lt;br /&gt;In a remarkable expression of candid self-awareness, one of the founders of Reddit &lt;a href="http://www.aaronsw.com/weblog/everythinggood"&gt;blogs about this very problem&lt;/a&gt;.  In that well-written post, &lt;a href="http://www.aaronsw.com/"&gt;Aaron Swartz&lt;/a&gt; characterizes the basic problem:  people might rather do things more substantial with their time, but "&lt;span style="font-size:85%;"&gt;reading bite-sized blog posts is by far &lt;em&gt;easier&lt;/em&gt;&lt;/span&gt;," and "&lt;span style="font-size:85%;"&gt;looking at photos of sunsets or reading one-liners takes no cognitive effort.&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;I took a Bioinformatics class last year that was co-taught by professors from computer science and biology.  The biology professor wanted to underscore the importance of the discovery of DNA, or perhaps just had a chip on his shoulder; he took pleasure in baiting the minority of computer science students in the class by telling us that the invention of the computer is nothing, completely irrelevant, compared to the enormity of the discovery of DNA and genetic engineering, and that we should all stop studying computers and study biology instead.  Rather than let him irritate me, I only smiled - because it is laughable that he would say this, while not realizing his whole syllabus relies on a third technology which eclipses both in significance:  the web.&lt;br /&gt;&lt;br /&gt;So what do we do with the greatest invention of all time?  What are we using the internet for?  If you have Ruby (a computer language) installed on your computer, I can save you the trouble of reading 999 reddit links to find out.  &lt;a href="http://system.windows.codeslinger.googlepages.com/spoof.rb"&gt;This Ruby program&lt;/a&gt; (from my &lt;a href="http://system.windows.codeslinger.googlepages.com/downloads"&gt;Downloads page&lt;/a&gt;) rips every current reddit title and runs a modified Markov learning algorithm on the titles.  Then it uses what it learned to generate sample titles in reddit "style".  What results is a hilarious mis-mash.  I'll leave you with a few of the most interesting tidbits it generated (these are machine-generated; I didn't make these up):&lt;br /&gt;&lt;br /&gt;Giant Mackerel Gets Married&lt;br /&gt;Giant Mackerel Gets Even Creepier&lt;br /&gt;Baby Marmosets Are To Analyze Software Patents&lt;br /&gt;Cockatoo Guarding Chocolate Good, Morbid Obesity Soaring&lt;br /&gt;Even worse than one peep jousting: Two peeps&lt;br /&gt;Anarchy On Sudafed Claims First Free Gps&lt;br /&gt;Extreme D.I.Y. - Solitaire&lt;br /&gt;Doomsday For How Blogging Can Die Of Education&lt;br /&gt;Reddit Users To Prevent Manatee Deaths? Prevent Manatees!&lt;br /&gt;Ask Reddit: what modern world?&lt;br /&gt;I Read Reddit Users Are Small. [pic] This Pathetic Story&lt;br /&gt;Anatomy Of Yoda [photo]&lt;br /&gt;sex-mad? Mabye. Obsessed? With Chainsaw Could possibly be stopped&lt;br /&gt;Grindhouse:  Good movie or faked orgasm?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-857776203681208919?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/857776203681208919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=857776203681208919' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/857776203681208919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/857776203681208919'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/05/giant-mackerel-gets-married.html' title='Giant Mackerel Gets Married'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-5826516167826926090</id><published>2007-04-25T00:37:00.000-05:00</published><updated>2007-04-25T01:25:38.207-05:00</updated><title type='text'>Homeless in the 21st Century</title><content type='html'>It's now the interim period between the end of my NASA internship and the beginning of my summer research fellowship.  I find myself - once again - homeless, while I wait for my housing to become available for the next semester.&lt;br /&gt;&lt;br /&gt;As a college student, this happens to me three times a year; the transitions of the fall, spring, and summer semesters drive also the availability of housing for college students.  Whether it be the dorm kicking everyone out for two weeks between semesters, or campus apartments unwilling to extend a summer lease past August 9th when I can't move into fall housing until August 23rd, the gaps between semesters are not a vacation but a hardship for those of us who don't have anywhere else to go during those times.  My parents would be willing to take me in, but they have such a small house that there isn't a bed for me to sleep on there.  So in the interim weeks between semesters I become a modern gypsy, taking my car from place to place and staying with friends until my welcome runs out.&lt;br /&gt;&lt;br /&gt;This semester is not too bad.  One of my professors has kindly allowed me the use of his spare room, and we get along well.  I am experiencing no physical hardship - only the mental anguish of trying to define &lt;span style="font-style: italic;"&gt;home&lt;/span&gt; and coming up empty-handed.  I have been provided a house to stay in, and hospitality, but it is not my home.  In my heart, home is with my fiancee Melissa, but neither of us has our own place.  Last semester, Melissa's week consisted of bouncing from Weatherford, to Edmond, to Norman, depending on where she needed to be for college or work.  When we are married we'll have a home together, but for now we make do as best we can.&lt;br /&gt;&lt;br /&gt;I drove to Weatherford today, but my professor happened to be out, and I felt funny about going into his house alone.  So I picked somewhere far away and drove there until he would get back.  It's times like this that my car means more to me than just transportation.  It represents freedom, and a much needed piece of the familiar in unfamiliar lands.  As long as I am rushing 78 mph down an unending stretch of freeway at least I am &lt;span style="font-style: italic;"&gt;somewhere&lt;/span&gt;, doing &lt;span style="font-style: italic;"&gt;something&lt;/span&gt;, which is infinitely better than nothing, nowhere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-5826516167826926090?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/5826516167826926090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=5826516167826926090' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/5826516167826926090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/5826516167826926090'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/04/homeless-in-21st-century.html' title='Homeless in the 21st Century'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-3629528685668045437</id><published>2007-04-20T14:47:00.000-05:00</published><updated>2007-04-20T14:56:31.539-05:00</updated><title type='text'>Gun Threat in the NASA Building I Work In!</title><content type='html'>Hot on the heels of the VT shooting, everyone is on edge.  Now there has been a report of a gunman at the &lt;span style="font-style: italic;"&gt;building I work in&lt;/span&gt; on the Johnson Space Center!&lt;br /&gt;&lt;br /&gt;On Friday mornings I do a teleconference meeting from home.  Today the conference ran late and made me late coming in to work.  I was just about to head down to the Johnson Space Center to go in to building 44 to get the paperwork I need to check out, when I got a call from a coworker.  He said there was a man with a gun and security is on lock down!&lt;br /&gt;&lt;br /&gt;I don't really have much more information than that yet, and what more I have heard so far is unconfirmed so I will not start any rumors with it.  But it's just crazy; I mean, I work there!  Let me tell you that Building 44 is &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; the place I would have in a million years expected to see this happen.  It's been the most stress-free work place I've seen, and I can't imagine what would push someone over the edge.&lt;br /&gt;&lt;br /&gt;Update:  They have helicopters showing the building on the news on CNN.  Unreal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-3629528685668045437?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/3629528685668045437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=3629528685668045437' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/3629528685668045437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/3629528685668045437'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/04/gun-threat-in-nasa-building-i-work-in.html' title='Gun Threat in the NASA Building I Work In!'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-2834442164270548520</id><published>2007-04-20T13:27:00.000-05:00</published><updated>2007-04-20T13:31:33.512-05:00</updated><title type='text'>Last Day of My NASA Internship</title><content type='html'>It's been a busy week since my last blog entry.  Fear not, dear reader(s), I have not abandoned you.  I'll have more time to write next week, including some entries about how my internship went.  And will they ask me to come back?  I'll find out next fall.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-2834442164270548520?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/2834442164270548520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=2834442164270548520' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2834442164270548520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2834442164270548520'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/04/last-day-of-my-nasa-internship.html' title='Last Day of My NASA Internship'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-7319708360906067713</id><published>2007-04-13T23:48:00.000-05:00</published><updated>2007-04-13T23:55:32.005-05:00</updated><title type='text'>Reading:  Zero</title><content type='html'>My sister mailed me the book &lt;a href="http://www.users.cloud9.net/%7Ecgseife/zero.html"&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Zero: The Biography of a Dangerous Idea&lt;/span&gt;&lt;/a&gt;.  The book has already used four of my favorite words, and that's just the title!  Zero &lt;span style="font-style: italic;"&gt;is&lt;/span&gt; my favorite number; I like biographies, and I like dangerous ideas best of all. I can't wait to start reading it.&lt;br /&gt;&lt;br /&gt;Thanks Rose!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-7319708360906067713?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/7319708360906067713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=7319708360906067713' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/7319708360906067713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/7319708360906067713'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/04/reading-zero.html' title='Reading:  Zero'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-506934586767191243</id><published>2007-04-13T18:34:00.000-05:00</published><updated>2007-04-13T23:45:58.876-05:00</updated><title type='text'>Start Your Own OS Project in 30 Minutes</title><content type='html'>&lt;div style="text-align: justify;"&gt;Have you ever dreamed of writing your own operating system?  The first step is to get a kernel loaded.  It's easier than you think.  I'll show you how.&lt;br /&gt;&lt;br /&gt;If you took an operating systems course in college, unless you went somewhere like &lt;a href="http://en.wikipedia.org/wiki/BSD_Unix"&gt;Berkeley&lt;/a&gt; or &lt;a href="http://www.minix3.org/"&gt;Vrije in Amersterdam&lt;/a&gt;, it's likely that there was not a professor in your whole university who knew how to write an OS kernel from scratch and get it to boot by itself.  Look, they're only human, ok? - &lt;span style="font-style: italic;"&gt;most&lt;/span&gt; programmers wouldn't know how to do it.  But it also means you came away from that class vaguely dissatisfied.  Because if you take an operating systems class and never write your own simple kernel, it's like taking a driver's-ed course without ever getting to sit behind the wheel.&lt;br /&gt;&lt;br /&gt;It's time we changed how we teach operating systems.  Let's get started.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;The first hurdle to overcome is getting the BIOS to boot your code. There are 512&lt;br /&gt;&lt;div style="text-align: justify;"&gt;bytes of code at the beginning of a disk, which the BIOS loads and executes.  This is called the boot sector, and it is the responsibility of this incredibly tiny program to load other code and finally the actual kernel.&lt;br /&gt;&lt;br /&gt;My first intention was to write one of these boot sector programs, because it would be a way to get code running on the machine completely by itself.  There is just enough space in 512 bytes to write a very simple program.  But that doesn't sound very useful, and besides, &lt;a href="http://www.geocities.com/eiforall/AtomicOS/"&gt;it's been done before&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So I wanted to contribute something new.  Besides my idea of putting a toy operating system in the boot sector not being original, there is already a perfectly good boot loader program available.  It's called &lt;a href="http://www.gnu.org/software/grub/"&gt;GRUB&lt;/a&gt;.  Why not put GRUB in your boot sector instead of custom code, and use GRUB to bootstrap your prototype OS?  Suddenly what would have been weeks slogging through nasty bootstrap code isn't necessary.  Things are looking up.&lt;br /&gt;&lt;br /&gt;GRUB stands for GRand Unified Bootloader.  If you dual-boot Linux and Windows, you may know GRUB can load your favorite operating systems, but did you know there's another reason it's called &lt;span style="font-style: italic;"&gt;Unified&lt;/span&gt;?  The people who developed GRUB looked at all these operating systems floating around; they all need many of the same things to happen as they boot, but each implements their own proprietary boot loader.  They said, "What if there were a universal standard for booting an operating system?  Then we could write one really good boot loader that would suffice for any operating system."  They did.&lt;br /&gt;&lt;br /&gt;What they came up with was the &lt;a href="http://www.gnu.org/software/grub/manual/multiboot/"&gt;Multiboot Specification&lt;/a&gt;.  It's a magic header that you include in a program to tell GRUB the information it needs to know to load your kernel.  GRUB is smart enough to read a file system, so you don't even have to place your kernel in specific sectors or make some kind of wacky system file.  Instead, all you have to do is compile a program as you would normally, and you can place the ordinary program file in any directory on the disk.&lt;br /&gt;&lt;br /&gt;In an article I read recently, Julio Vidal describes &lt;a href="http://www.onlamp.com/pub/a/bsd/2007/03/01/inside-multiboot.html"&gt;how he made NetBSD Multiboot-Compliant&lt;/a&gt;.  The article includes a detailed description of the boot process, and is an interesting read all around.  Most importantly for us, though, the article links to some example code, from the GRUB documentation, which shows how to make a minimal kernel that is multiboot-compliant.&lt;br /&gt;&lt;br /&gt;You can find that example code here:  &lt;a href="http://cvs.savannah.gnu.org/viewcvs/grub/grub/docs/#dirlist"&gt;http://cvs.savannah.gnu.org/viewcvs/grub/grub/docs/#dirlist&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Don't worry, you don't need all the files listed on that page - just three of them.  You need boot.S, kernel.c, and multiboot.h.  In order to illustrate the proof of concept (that, once loaded, I can run any code I want), I made a slight modification to the files which simply displays my own custom message after the kernel boots.  You may want to work with the modified version in order to see where to put your own code, and because it is the version I used for these instructions, although the unmodified files should work too.  You can get them from &lt;a href="http://system.windows.codeslinger.googlepages.com/downloads"&gt;my downloads page&lt;/a&gt;:  &lt;a href="http://system.windows.codeslinger.googlepages.com/boot.S"&gt;boot.S&lt;/a&gt; | &lt;a href="http://system.windows.codeslinger.googlepages.com/kernel.c"&gt;kernel.c&lt;/a&gt; | &lt;a href="http://system.windows.codeslinger.googlepages.com/multiboot.h"&gt;multiboot.h&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now that you have the code, you need to compile it.  For this, you will need to be running Linux.  You'll also need Linux for the later steps involving GRUB, so you might as well get it now if you don't have it already.  I recommend &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt;.  Ubuntu comes on a Live CD, so you can run it from the CD without even having to install it.  You can also install Ubutunu on an external hard drive or even a USB memory stick.  (I will be posting another blog entry soon explaining how I did that.)&lt;br /&gt;&lt;br /&gt;Compiling the code is the second major hurdle to cross.  Most C programs link in libraries for things such as I/O and debugging.  These C libraries in turn depend on an OS, or more specifically, they rely on making calls to the &lt;span style="font-style: italic;"&gt;kernel of an OS&lt;/span&gt;.  Well hold on a minute - we haven't got a kernel yet; that's what we're trying to make.  Not only can we not rely on the the standard libraries, we have to make sure the compiler doesn't sneak external references in anyway (which it will try to do if you let it).  So we have to use special compiler options to force the compiler to generate code that stands alone and has no external dependencies.&lt;br /&gt;&lt;br /&gt;Open a terminal in Linux and type:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;cd /whatever/directory/you/have/the/code/in&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then use this command (all on one line) to compile it:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;gcc boot.S kernel.c -o mbs-kernel -ffreestanding -nostdlib -nostartfiles -fno-stack-protector&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Explanation:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;-o mbs-kernel:&lt;/span&gt; names the output file&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;-ffreestanding:&lt;/span&gt; means the resulting program should have no dependencies&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;-nostdlib:&lt;/span&gt; tells the linker not to bring in the C standard library, which won't work in the kernel&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;-nostartfiles:&lt;/span&gt; tells the linker not to bring in any C startup code&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;-fno-stack-protector:&lt;/span&gt; is a fix for the error "undefined reference to '__stack_chk_fail'"&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;This produces the file "mbs-kernel" which contains our new kernel.&lt;br /&gt;&lt;br /&gt;You may need to be root to do the rest of the steps.  To switch to superuser mode so that you can run all the commands, type:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;sudo su&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;...and provide the root password when it asks.&lt;br /&gt;&lt;br /&gt;Next we need to install grub to a floppy disk so that we can boot from it.  It is possible to use a USB key instead, but &lt;span style="font-style: italic;"&gt;I haven't figured out how to do that yet&lt;/span&gt;.  So we'll use a floppy disk for this example.*&lt;br /&gt;&lt;br /&gt;Open a terminal and type the following command:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;grub --batch --device-map=/dev/null &amp;lt;&amp;lt;EOF&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The above command starts GRUB in batch mode.  Insert a formatted floppy disk and type these commands to install GRUB to it:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;device (fd0) /dev/fd0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;root (fd0)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;setup (fd0)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;quit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you are using a USB external floppy (what I was using), then the device will be different.  In that case, do not type the above, but use this set of commands instead:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;device (fd0) /dev/sdb&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;root (fd0)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;setup (fd0)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;quit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;EOF&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;USB floppy drive devices show up as /dev/sda, /dev/sdb, etc.  Mine was sdb because I also have an internal SATA hard drive, and that occupies /dev/sda, so the floppy became /dev/sdb.  If you have an ordinary IDE hard drive, then a USB floppy might be /dev/sda.  How can you tell which one is your floppy disk?  What I did was I used the Gnome file manager to mount the floppy disk (by double clicking its icon).  Once I could see the contents of the floppy disk in the GUI file manager, I knew it had to be mounted.  Then I opened up a terminal and typed:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;mount -l&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That's a lowercase "el".  It caused mount to list all the mounted file systems - I looked at the one that matched where my floppy was mounted and the device given was the device I used for grub.  However, if I recall, the drive has to actually be &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; mounted for the GRUB install to work.  So after you mount the disk to find out its device file, be sure to right-click on it in the file manager and select "unmount" &lt;span style="font-style: italic;"&gt;before&lt;/span&gt; you attempt to do the GRUB install.&lt;br /&gt;&lt;br /&gt;Now that we have GRUB installed, we need to put our compiled kernel onto the disk.  Use the file manager to mount the floppy drive and copy the file mbs-kernel to the /boot directory of the floppy disk.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;*Note:  If you already have GRUB on your hard drive, you don't necessarily have to have a boot floppy at all for this exercise.  If you are comfortable with the idea of changing the boot configuration of your computer, you can safely skip the GRUB floppy install steps above, and place your homemade kernel directly in your /boot directory on your hard drive next to your Linux kernel.  When you boot, you can choose whether to load Linux or your own kernel.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The last step is to modify the menu.lst file to make an entry for your kernel.  If you have put your kernel on a floppy disk, you should be able to go to &lt;your&gt;/boot/grub and double click on menu.lst in the file manager, which will open up gedit and let you edit the file.  If you are going to run the kernel off your hard drive, you will find that gedit cannot save menu.lst if you opened it by double clicking.  This is just a security precaution by Linux - the file manager didn't run gedit as root when you double clicked the file, so it can't write to it to save your changes.  No matter - you can easily start gedit from the superuser prompt, and then it &lt;span style="font-style: italic;"&gt;will&lt;/span&gt; have root priviledges.  Just type:&lt;/your&gt;&lt;br /&gt;&lt;your&gt;&lt;/your&gt;&lt;br /&gt;&lt;your&gt;&lt;span style="font-weight: bold;"&gt;gedit /boot/grub/menu.lst&lt;/span&gt;&lt;/your&gt;&lt;br /&gt;&lt;your&gt;&lt;/your&gt;&lt;br /&gt;&lt;your&gt;Or, if you're back at the $ prompt instead of #, type:&lt;/your&gt;&lt;br /&gt;&lt;your&gt;&lt;/your&gt;&lt;br /&gt;&lt;your&gt;&lt;span style="font-weight: bold;"&gt;sudo gedit /boot/grub/menu.lst&lt;/span&gt;&lt;/your&gt;&lt;br /&gt;&lt;your&gt;&lt;/your&gt;&lt;br /&gt;&lt;your&gt;Menu.lst is simply a script that GRUB reads to know what boot menu options to show and how to execute them.  At the very bottom of the file, if you are using a floppy, add the lines:&lt;/your&gt;&lt;br /&gt;&lt;your&gt;&lt;/your&gt;&lt;br /&gt;&lt;your&gt;&lt;span style="font-weight: bold;"&gt;title Multiboot Kernel Example&lt;/span&gt;&lt;/your&gt;&lt;br /&gt;&lt;your&gt;&lt;span style="font-weight: bold;"&gt;root (fd0)&lt;/span&gt;&lt;/your&gt;&lt;br /&gt;&lt;your&gt;&lt;span style="font-weight: bold;"&gt;kernel /boot/mbs-kernel&lt;/span&gt;&lt;/your&gt;&lt;br /&gt;&lt;your&gt;&lt;/your&gt;&lt;br /&gt;&lt;your&gt;If you want to boot your kernel directly from your hard drive, put the file mbs-kernel into your /boot directory on your hard drive, and add this to the bottom of your menu.lst file in /boot/grub/menu.lst:&lt;/your&gt;&lt;br /&gt;&lt;your&gt;&lt;/your&gt;&lt;br /&gt;&lt;your&gt;title Multiboot Kernel Example&lt;/your&gt;&lt;br /&gt;&lt;your&gt;&lt;span style="font-weight: bold;"&gt;root (hd0)&lt;/span&gt;&lt;/your&gt;&lt;br /&gt;&lt;your&gt;&lt;span style="font-weight: bold;"&gt;kernel /boot/mbs-kernel&lt;/span&gt;&lt;/your&gt;&lt;br /&gt;&lt;your&gt;&lt;/your&gt;&lt;br /&gt;&lt;your&gt;Once you have prepared the disk, reboot your computer.  If you are booting from a floppy, make sure your BIOS is set to be able to boot from the floppy drive.  Some computers have a key you can press to get a boot menu and choose manually.  GRUB should start up when the computer boots.  Choose the Multiboot Kernel Example, and GRUB will start your kernel.  If you were successful, you should see either:&lt;/your&gt;&lt;br /&gt;&lt;your&gt;&lt;/your&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;A screen full of gobbledygook if you booted the default GNU example code&lt;/li&gt;&lt;li&gt;A friendly message if you booted my version&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;If you get a message from GRUB that says "Error 28:  Selected item cannot fit into memory," that error message is badly worded.  It really means, "Default load address is too high."  I got the error on a machine with 32 MB of RAM, but not on one with 256 MB.  This problem could be fixed by instructing GCC to compile the program for a lower memory address.  Anyone know how to do that?&lt;br /&gt;&lt;br /&gt;In any case, as soon as you get the kernel to boot, you should immediately boot back into Linux, delete my code changes, and add your own code instead.  This is &lt;span style="font-style: italic;"&gt;your kernel.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you want to go further, here are some resources:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cs.utah.edu/flux/oskit/"&gt;http://www.cs.utah.edu/flux/oskit/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.osdev.org/wiki/Main_Page"&gt;http://www.osdev.org/wiki/Main_Page&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Remember, you are starting with a blank slate.  You won't have a filesystem driver, I/O, anything, until you put them into your OS.  You are starting at the bare metal.  One way of looking at it is that you have nothing holding up your code.&lt;br /&gt;&lt;br /&gt;Another way of looking at it, is that you have nothing holding you back.&lt;br /&gt;&lt;br /&gt;Happy hacking.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-506934586767191243?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/506934586767191243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=506934586767191243' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/506934586767191243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/506934586767191243'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/04/start-your-own-os-project-in-30-minutes.html' title='Start Your Own OS Project in 30 Minutes'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-2223090715797831474</id><published>2007-04-12T22:39:00.000-05:00</published><updated>2007-04-12T23:04:42.054-05:00</updated><title type='text'>Now I Have a Home Page Too!</title><content type='html'>Come see it at:  &lt;a href="http://system.windows.codeslinger.googlepages.com/home"&gt;http://system.windows.codeslinger.googlepages.com/home&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This blog meets most of my needs, but I'm finding more and more cases where it just isn't enough.  For instance, I want to include source code file downloads with some of my articles, and there isn't an easy way to do that through Blogspot.  Fear not; my new web site does not replace this blog.  I will be using my home page and the blog together.&lt;br /&gt;&lt;br /&gt;I had been thinking about making a home page for quite a while now, and went to look for a paid web host tonight. I was just thinking, man, I wish Google did homepages too. That's when I stumbled upon &lt;a href="http://pages.google.com/"&gt;http://pages.google.com/&lt;/a&gt;.  Wow!  My main concern when looking for a web host had been finding a site I can trust, and in that category Google definitely fits the bill!  Since I already have a Google account, I had a page already waiting for me.&lt;br /&gt;&lt;br /&gt;You really have to see the AJAX web page editor Google has come up with.  It blew me away - working with it is like working on a Macintosh.  Who needs the Windows desktop when javascript applications running in your browser have now &lt;span style="font-style: italic;"&gt;surpassed&lt;/span&gt; traditional desktop apps in quality of service?&lt;br /&gt;&lt;br /&gt;Anyhow, take a look.  I'll have to warn you, I don't really "get" web design.  So I will be keeping the site clean and simple to cover up the fact that I don't know how to do fancy.  In the movie Walk the Line, when June Carter asked him how they get such a steady sound, Johnny Cash's character just looks sheepish and says:  "Well, we'd play faster if we could.&lt;span style="font-size:-1;"&gt;&lt;/span&gt;"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-2223090715797831474?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/2223090715797831474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=2223090715797831474' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2223090715797831474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2223090715797831474'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/04/now-i-have-home-page-too.html' title='Now I Have a Home Page Too!'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-8505399045192339482</id><published>2007-04-11T19:15:00.000-05:00</published><updated>2007-04-11T20:01:37.159-05:00</updated><title type='text'>NASA Procedures:  In Case of Emergency, Save the Icecream</title><content type='html'>Working at NASA has been a great experience for me.  It is an engineer's paradise.  It is also - I might remind you - a &lt;span style="font-style: italic;"&gt;government&lt;/span&gt; operation.  If you've been in the military or civil service, you'll understand what I mean; in a government job, normal rules of logic and common sense are still there, but they undergo a bit of a twist, like light passing too close to a black hole.  I'm not saying it's good or bad.  All I'm saying is that things can get rather amusing sometimes.&lt;br /&gt;&lt;br /&gt;We have a very high-tech Coke machine in the building I work in.  It has a glass front so that you can watch what it does.  Instead of just dropping your coke down a chute like a normal Coke machine, this machine has a conveyor belt that moves up and down like an elevator.  In order to retrieve your beverage, the machine first moves the conveyor up to the "floor" that your drink is on.  The bottle (which is stored upright) is pushed onto the conveyor.  Then the conveyor belt moves the bottle sideways until it gets to the end of the belt where it enters - would you believe - a chute.  It's fascinating to watch when it works, but the machine is often out of order.  You see, the chute is only wide enough to accept an &lt;span style="font-style: italic;"&gt;upright&lt;/span&gt; bottle coming off the conveyor.  The entire machine was built on the assumption that the upright bottles would never fall over.  Once a bottle does fall over (which is inevitable) the machine cannot get it off the conveyor belt, and other people's purchases pile up behind it.  The Coca-Cola service man has to be called every time a bottle falls over on the conveyor.&lt;br /&gt;&lt;br /&gt;No longer a dispenser of beverages, today the Rube Goldberg Coke machine stood there, with it's conveyor jammed with bottles, as an ironic monument to overengineering.  A warning, if you will, to anyone who might forget the K.I.S.S. principle.&lt;br /&gt;&lt;br /&gt;I joked about this with one of the NASA oldtimers I work with, and he followed it up with an interesting anecdote.  That's nothing, he said.  A while ago we used to have an upright ice cream machine.  Any time the power went out, the ice cream bars inside would melt, and gallons of vanilla ice cream would drain to the bottom of the machine and out the hole in the front.  It made a terrible mess in the hallway.  Eventually, something was done about it:&lt;br /&gt;&lt;br /&gt;The building I work in is packed with radio and computer equipment, so you can well imagine that any loss of electrical power is a &lt;span style="font-weight: bold;"&gt;big deal&lt;/span&gt;, as equipment has to be shut down properly if possible.  For this reason, we have a written procedure that is followed when loss of power is imminent, to ensure that every important piece of equipment is taken care of.&lt;br /&gt;&lt;br /&gt;I have it on good authority that, for many years, step one of the emergency power loss procedure read:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Call the Bluebell Icecream company.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-8505399045192339482?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/8505399045192339482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=8505399045192339482' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/8505399045192339482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/8505399045192339482'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/04/nasa-procedures-in-case-of-emergency.html' title='NASA Procedures:  In Case of Emergency, Save the Icecream'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-4211259858168168604</id><published>2007-04-07T21:11:00.000-05:00</published><updated>2007-04-08T01:11:13.862-05:00</updated><title type='text'>Looting CompUSA</title><content type='html'>I woke up this morning to feel an unexpected downdraft of warm air.  Wait - is that the &lt;span style="font-style: italic;"&gt;heater &lt;/span&gt;going?  Holy crap.&lt;br /&gt;&lt;br /&gt;This is bad because I'm allergic to certain house dusts, and the heating system seems to be a source of that kind of dust.  I always get sick if the heater is running.  Normally I would have the vent closed to prevent the allergens getting into my room, but until yesterday it was quite warm, and I can have the vent open for the A/C without ill effect.&lt;br /&gt;&lt;br /&gt;I had heard a cold front was coming, but I can't believe it came as far down as Houston, and got as cold as it has.  It triggered the heater, and now thanks to my allergy I have a case of the crud and a sore throat to keep me company for the next few days.&lt;br /&gt;&lt;br /&gt;Despite not feeling well, I went ahead with my favorite Saturday pastime, which is to hit up the electronics and computer and book stores in order of their closing times.  First I go to EPO electronics until they kick me out at 5 pm, then I wander CompUSA like a friendly ghost until &lt;span style="font-style: italic;"&gt;they&lt;/span&gt; kick me out, and then on to Barnes &amp; Noble which caters to night-owls and has a Starbucks to boot.&lt;br /&gt;&lt;br /&gt;After reading about a &lt;a href="http://www.neodux.com/?view=story.php&amp;amp;post_id=290"&gt;foxhole radio made from a slinky&lt;/a&gt;, I decided I want to build my own radio (though not out of a slinky).  Some of my most memorable electronics experiences involved building crystal radios and one-transistor radios from Radioshack kits when I was a pre-teen, but ultimately I became frustrated with the radios' unpredictable behavior and changed my focus to digital logic instead.  I now realize that most of the unpredictability must have stemmed from my poor understanding of necessities like proper grounding techniques and controlling parasitic capacitance.  With the experience I have now, I figure I could build some much better receivers and have some fun with it again.&lt;br /&gt;&lt;br /&gt;That's why I went to EPO today - to get parts.  EPO is a giant electronics store in south Houston.  Like Radio Shack &lt;span style="font-style: italic;"&gt;used to be&lt;/span&gt; but much better.  It's an electronics geek's dream - they have components, kits, tools, testers, surplus junk, everything.  It's like walking into the pages of a &lt;a href="http://www.digikey.com/"&gt;Digikey catalog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I was surprised to find that they don't carry &lt;a href="http://en.wikipedia.org/wiki/Crystal_radio_receiver"&gt;crystal radio&lt;/a&gt; kits.  Not one.  I guess &lt;a href="http://www.elecdesign.com/Articles/Index.cfm?AD=1&amp;ArticleID=15076"&gt;nobody builds them anymore&lt;/a&gt;.  Shame.  They do have some other radio-related kits, but not what I was looking for.  They also had a confusing array of ham-radio kits, but I'm not licensed to transmit ham radio and I wasn't sure which receiver to get either.&lt;br /&gt;&lt;br /&gt;I was intrigued by a &lt;a href="http://en.wikipedia.org/wiki/Phase-locked_loop"&gt;phase lock loop&lt;/a&gt; experiment kit they carry.  It uses a digital phase lock loop chip (PLL) and a PIC microcontroller to give you a push-button, digital control over what frequency is generated.   It was meant for sending, not receiving, but I thought, what if I run the output of an antenna amplifier (also available as a kit) into the phase lock loop chip?  Then maybe I could make the &lt;a href="http://www.uoguelph.ca/%7Eantoon/gadgets/pll/pll.html"&gt;PLL lock to a radio station&lt;/a&gt; by typing the station's frequency into the digital control.&lt;br /&gt;&lt;br /&gt;It's a hell of an idea but the cost quickly got out of hand.  The PLL kit is already expensive, and the antenna amplifier was downright overpriced for something so simple.  Then I realized I needed some sort of "mixer" chip to compare the PLL output back to the antenna input, in order to skim the actual sound off the incoming signal.  (The PLL locks you with the phase of a signal but the actual sounds of AM radio come from the signal's amplitude&lt;span style="font-style: italic;"&gt;.&lt;/span&gt;)  I found a general-purpose IF mixer chip that looked perfect for the job, but &lt;span style="font-style: italic;"&gt;it&lt;/span&gt; was expensive too.  I was expecting to spend, say, $35 tops today on a weekend project.  Instead I ended up with an armload of parts that came to $90 and I didn't even know if the circuit would work or not, it was just based on a hunch!&lt;br /&gt;&lt;br /&gt;I would have loved to test the idea, but I also need to be more careful with my money.  Not to sound arrogant by comparing myself to the great man, but I live like &lt;a href="http://en.wikipedia.org/wiki/Nikola_Tesla"&gt;Nikola Tesla&lt;/a&gt; did. I'm chronically broke, spending money on inventions instead of food.  I'm trying to get away from that.  When the items rang up to three times what I expected, a glimmer of rationality seeped in and I wondered, "when did my $10 crystal radio project become a $90 digital synchrodyne?"  I stammered to the cashier that I couldn't afford it and made an embarassed and hasty exit with the items still on the counter.  Sad.  It would have been a fun project.  Maybe some day I'll make enough money to do some of them.&lt;br /&gt;&lt;br /&gt;My next stop was CompUSA.  I more than half expected it to not be there anymore.  When I first came to Houston, the CompUSA store here was the first one I had been to - they don't have them in the small town I'm from.  Murphy's law dictates that since I liked the store, it would naturally have to go out of business soon.  The CompUSA company decided this branch isn't bringing in enough profit, and decided to close it up.  They've been having a going out of business sale for a month now.&lt;br /&gt;&lt;br /&gt;They didn't seem very serious about it last time I was there.  Most things were only 10% off.  You call that a going out of business sale?  Can you even call that a &lt;span style="font-style: italic;"&gt;sale&lt;/span&gt;?  I did get a great deal on a hard drive that time, but I decided to wait and see how much further the prices drop before I buy anything else.&lt;br /&gt;&lt;br /&gt;Things have changed quite a bit since the last time.  The store looks like a warzone!  Now most things are 40% off, half the shelves are stripped, and people aren't so much shopping the store, as looting it.  Everything is for sale, not just the products but the shelves too, for goodness sake.  One of the store managers asked me, "Why don't you take a basket?"  "Oh, good idea," I said.  I picked up a shopping basket and behind it was a sign that said, "Why don't you take a basket?  Only $4 each."  Gee golly, they &lt;span style="font-style: italic;"&gt;are &lt;/span&gt;serious.&lt;br /&gt;&lt;br /&gt;This would be a good time for me to pick up a GPS navigator for my car.  I probably burn $200 a year extra gas just from getting lost.  The trouble is, I'm dead scared of blowing my money on a crappy GPS system when I could have a better one if I wait.  They had some $200-range GPS units for sale at the CompUSA but they were all no-name brands.  One didn't turn on at all, and the other could play music but reported "application .exe file not found" when you tried to view the map!  This doesn't inspire my confidence in them.&lt;br /&gt;&lt;br /&gt;"Even in the future, nothing works!" - Spaceballs.&lt;br /&gt;&lt;br /&gt;You know that's the trouble with consumer electronics.  Ultimately the manufacturers of these devices are collectively shooting themselves in the foot by sacrificing quality to save manufacturing cost.  They've lost the consumer's trust.  Even if you're willing to spend the extra money to buy a good product, how do you know you're actually getting something better?  Are you really getting a quality piece of equipment, or did a major trademark just slap their logo on a craptastic piece of outsourced junk?  Even for an engineer it's hard to tell unless you could look inside the case.  Uncertainty is the real reason Americans buy tons of cheap plastic crap and fund a Walmart on every street corner.  Given the choice between spending a little money on something cheap and crappy, or risking more money on something that might be better, the same, or worse, people will choose the devil they know and go with cheap over risky every time.&lt;br /&gt;&lt;br /&gt;I felt rather bad for the people working at that store.  I mean, here are all these shoppers, me included, acting like sharks in a feeding frenzy, yet the staff are being uncharacteristically polite to everyone, and no one is commenting on the larger tragedy that, at the end of this month, a dozen people will be unemployed.  I asked one of the younger sales associates about it and he shrugged apologetically and said, "stuff happens".  "Are they going to move you guys to another store, or just throw you out on the street?"  "Well one guy was going to get reassigned but he quit instead, and there's one other person who got another position."  "So, the rest of you...what happens?"  "We get a severance package and...that's the end of it."&lt;br /&gt;&lt;br /&gt;There were some crazy deals going on, like a TiVo version 2 for $100 and also a laser printer for the same, but I decided to forego the expensive items today and buy more smaller items.  I got a USB floppy drive for my laptop for $23, and a book called "The Multi-Boot Configuration Handbook," which looks interesting.  I also completed my collection of &lt;a href="http://www.swisstechtools.com/products.aspx"&gt;Swiss-tech keychain tools&lt;/a&gt;.  I have so many tools on my keychain that I don't keep my keys on it anymore.  I need to invent a utility belt that holds keychain widgets!  It'll have to be inconspicuous, too, so my girlfriend will not be too embarassed to be seen in public with me.&lt;br /&gt;&lt;br /&gt;Of course, what I really want is a Swiss army knife the size of a, well, &lt;a href="http://www.wengerna.com/browse/product.jsp?prod_id=1260&amp;cat_id=1&amp;amp;sub_cat_id=23"&gt;just look at it&lt;/a&gt;!  It's huge and it has every blade Wenger makes, but at $1200 it definitely costs more than the sum of it's parts.  Kudos to them for having the balls to make something this cool, but they're totally undermining it by calling it "only a collector's item".  I would really use this thing.  That's got me thinking - how hard is it to hack a Swiss army knife?  Why not buy a bunch of smaller Swiss Army knives, break them into pieces, and put together one big one with just the blades you like?  Why not make it so the blades are easy to add and remove whenever you want?  Then you can have a modular, customizable Swiss Army knife that's as wild and crazy as you want it to be.&lt;br /&gt;&lt;br /&gt;I envision setting up an online web store where geeks could buy knife parts to combine together.  You could buy blades for $5 each, custom handle-plate designs, and screws and nylon washers to put the knives together.  They'd all be interchangeable but every person could have a unique knife, and you could accessorize to no end.  A true geek toy.&lt;br /&gt;&lt;br /&gt;Too bad the people who make the real Swiss Army knives would sue me out of business.&lt;br /&gt;&lt;br /&gt;After CompUSA I went to Barnes &amp; Noble.  I've gone longer than usual without buying any books lately.  It's not that I don't find books I'm interested in - just the opposite.  I can't go to Barnes &amp; Noble without finding a stack of books as tall as I am that I simply &lt;span style="font-style: italic;"&gt;must&lt;/span&gt; have.  I can't afford them all but I can't choose any to remove.  So I end up getting none.&lt;br /&gt;&lt;br /&gt;But I tell you I have &lt;span style="font-weight: bold;"&gt;never&lt;/span&gt; regretted buying a book.  Never.  For instance, I spent $143 on a stack of C# books two years ago - that $143 turned into a few thousand I made as a C# programmer right after that. &lt;br /&gt;&lt;br /&gt;So I decided it's high time I bit the bullet and actually spent some money on programming books again.  (Money has been the thread tying this entry together, I just noticed.  It must be on my mind today.)&lt;br /&gt;&lt;br /&gt;I had been thinking about getting a book on Ruby for ages now.  I decided to get only one and get the rest later.  I was drawn to &lt;a href="http://books.google.com/books?id=ows9jTsyaaEC&amp;dq=the+ruby+way&amp;amp;pg=PP1&amp;ots=ikQHzPvhIq&amp;amp;sig=CSlr06bAycMhUYlqnTJ0nmbcOFI&amp;prev=http://www.google.com/search%3Fsource%3Dig%26hl%3Den%26q%3Dthe%2Bruby%2Bway%26btnG%3DGoogle%2BSearch&amp;amp;sa=X&amp;oi=print&amp;amp;ct=title#PPP1,M1"&gt;The Ruby Way&lt;/a&gt; by Hal Fulton because of its Taoist references (I'm a big fan of the &lt;a href="http://acc6.its.brooklyn.cuny.edu/%7Ephalsall/texts/taote-v3.html"&gt;Tao Te Ching&lt;/a&gt;, and also &lt;a href="http://www.canonical.org/%7Ekragen/tao-of-programming.html"&gt;The Tao of Programming&lt;/a&gt;), but ultimately I settled on the classic &lt;a href="http://www.pragmaticprogrammer.com/index.html"&gt;Pragmatic Programmer&lt;/a&gt;'s guide, &lt;a href="http://www.pragmaticprogrammer.com/titles/ruby/index.html"&gt;Programming Ruby&lt;/a&gt;, because the writing in it has a light-hearted tone that lifts my spirits.  Yes, the old edition is &lt;a href="http://www.rubycentral.com/book/"&gt;available online&lt;/a&gt;, but there is more in the second edition and I still like to read from a real book instead of a computer screen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-4211259858168168604?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/4211259858168168604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=4211259858168168604' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4211259858168168604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/4211259858168168604'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/04/looting-compusa.html' title='Looting CompUSA'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-3326410994247847387</id><published>2007-04-06T00:37:00.000-05:00</published><updated>2007-04-06T01:46:42.057-05:00</updated><title type='text'>Does Code Belong in Essays about Software?</title><content type='html'>When I wrote &lt;a href="http://dennisferron.blogspot.com/2007/04/can-i-do-without-this.html"&gt;&lt;span style="font-style: italic;"&gt;Can I Do Without This&lt;/span&gt;&lt;/a&gt;, it struck me how hard it can be to describe software.  In the draft I described a real-world case, detailing how I took the principle I espoused in the essay and applied it to the software I am currently working on.  I had to delete those paragraphs.  The details distracted from the flow of the writing.  I could not make them comprehensible to the reader without going off on a tangent to explain all of the made-up terminology that describes my classes and methods.  Software is difficult to describe.  I want to speak in specifics, but writing in plain English constrains me to generalities.&lt;br /&gt;&lt;br /&gt;Source code exists for the specific purpose of describing programs.  &lt;a href="http://www.engin.umd.umich.edu/CIS/course.des/cis400/algol/algol.html"&gt;Algol&lt;/a&gt; (one of the earliest high level languages) was originally invented for the purpose of making it easier for computer scientists to &lt;span style="font-style: italic;"&gt;communicate&lt;/span&gt; with each other in publications.&lt;br /&gt;&lt;br /&gt;However, source code is not English, no matter how many pains you take to make it appear so.  Source code is a form of notation, like mathematical notation or musical notes.  Good advice for research students is to try to avoid putting math on their slides when they make presentations, lest they lose their audience's attention span.  I think the issue is not just math, but that any form of notation is a denser form of communication than what humans are comfortable reading - too dense to put into an essay.&lt;br /&gt;&lt;br /&gt;There are other reasons not to mix code with ordinary writing.  The formatting that is applied to prose will severely damage the careful indentation structure of a source code example.  Conversely, when the source code gets its own formatting, the breaks introduced by switching back and forth rapidly are jarring.&lt;br /&gt;&lt;br /&gt;Code and prose don't mix well.  This is a real problem if code itself is the subject of your writing.  Ultimately, though, we are deluding ourselves if we think that someone is actually reading all the code examples, if we include them.  Source code is to be read in the context of pursuing a bug fix or feature change &lt;span style="font-style: italic;"&gt;in real source code files.&lt;/span&gt;  I don't read other people's code examples in literature - why should I be inclined to think that other people will really read mine?  When I started this blog, I knew that this issue would surface.  I made a decision that I would focus on the articles more than the code examples.  It's more readable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-3326410994247847387?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/3326410994247847387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=3326410994247847387' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/3326410994247847387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/3326410994247847387'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/04/does-code-belong-in-essays-about.html' title='Does Code Belong in Essays about Software?'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-196904069419072863</id><published>2007-04-05T19:01:00.000-05:00</published><updated>2007-04-05T19:59:25.948-05:00</updated><title type='text'>Good Stuff</title><content type='html'>Just wanted to share some Good Stuff I've run across in the past day.&lt;br /&gt;&lt;br /&gt;Jason pointed me to this &lt;a href="http://xona.com/stevejobs/"&gt;video of Steve Jobs addressing Stanford graduates&lt;/a&gt;.  Frankly I'm surprised they were brave enough to let Steve Jobs talk to students - he speaks his mind, and he's rich enough to tell the truth and not give a damn.  This is actually the first time I ever saw him speak.  Having seen the video, I think, ah, now I understand why people get so fanatical about him.&lt;br /&gt;&lt;br /&gt;You can find a lot of good stories about the early Steve Jobs, and the rest of the original Mac crew on &lt;a href="http://www.folklore.org/index.py"&gt;folklore.org&lt;/a&gt;.  There are over a hundred stories on the site, all very good, detailing the trials and tribulations surrounding the release of the first Macintosh computer.  From the site's own description of itself:&lt;br /&gt;&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;"&lt;a href="http://www.folklore.org/index.py"&gt;Folklore.org&lt;/a&gt; is a web site devoted to collective historical storytelling. It captures and presents sets of related stories that describe interesting events from multiple perspectives, allowing groups of people to recount their shared history in the form of interlinked anecdotes."&lt;br /&gt;&lt;br /&gt;Also in the good stuff category, I just popped open a can of Guinness draught.  It's delicious!  Had quite a head on it too. I'm a big fan of their Extra Stout, but I hadn't tried their draught yet.  Draught is similar to Extra Stout, but a lot smoother and maybe more "user friendly".&lt;br /&gt;&lt;br /&gt;(For the unenlightened, Guinness is a beer from Ireland that's so strong it has the black color and approximate viscosity of used motor oil.  This isn't your wimpy light beer.)&lt;br /&gt;&lt;br /&gt;I'm a glass-bottle beer drinker.  Not sure how I feel about Guinness in a can, but poured into a drinking glass it tastes good.  I like how the side of the can boldly says "&lt;span style="font-weight: bold;"&gt;beer&lt;/span&gt;", you know, just in case you forgot after you got home from the store.   There's also a mysterious plastic ball floating in the can, which is, according to the label, the "Guinness Floating Widget".  WTF?&lt;br /&gt;&lt;br /&gt;I spent part of the day browsing &lt;a href="http://redhanded.hobix.com/"&gt;Why's blog about Ruby&lt;/a&gt;.  Why is the author of &lt;a href="http://poignantguide.net/ruby/"&gt;Why's Poignant Guide to Ruby&lt;/a&gt;, which, along with &lt;a href="http://tryruby.hobix.com/"&gt;an &lt;span style="font-weight: bold;"&gt;interactive&lt;/span&gt; online Ruby tutorial&lt;/a&gt;, is the reason I became interested in &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt;.  Thanks to Why, Ruby must be the first programming language to have a significant book about it written in the style of &lt;a href="http://www.engrish.com/category_index.php?category=Instructions"&gt;badly translated Asia instruction manuals&lt;/a&gt;.  Why is so random, you almost can't judge whether his writing is good or bad; he just kicks things up (or sideways) to a new level (of insanity).  But I enjoy it just for the originality.  His habit of posting &lt;a href="http://redhanded.hobix.com/inspect/hpricotAndMarkabyElope.html"&gt;code examples drawn with colored pencils&lt;/a&gt; cracks me up every time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-196904069419072863?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/196904069419072863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=196904069419072863' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/196904069419072863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/196904069419072863'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/04/good-stuff.html' title='Good Stuff'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-302320358517605347</id><published>2007-04-05T00:43:00.000-05:00</published><updated>2007-04-06T01:54:18.642-05:00</updated><title type='text'>Can I Do Without This?</title><content type='html'>&lt;div style="text-align: left;"&gt;I have to give credit to &lt;a href="http://www.jasondoucette.com/"&gt;Jason Doucette&lt;/a&gt;, of &lt;a href="http://xona.com/"&gt;xona.com&lt;/a&gt;, for reminding me of the topic I wanted to blog today.  He said, "To be productive, you truly have to choose what not to do, and avoid it, even though you'll want to do it. Otherwise, it never gets done."&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The difference between a good software project and a bad one is that the bad one is in a free-fall of runaway complexity, while a good one merely teeters continuously on the edge of it.  There doesn't seem to be a way to build software that doesn't run the continual risk of running amok in it's own sprawling subroutines.  It is not the software that has a problem - it's perfectly happy growing wild and wooly.  But people can only take so much complexity before their &lt;a href="http://en.wikipedia.org/wiki/Exploding_head"&gt;heads explode&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you just don't care about quality, if you don't have any &lt;span style="font-style: italic;"&gt;passion&lt;/span&gt; for your work, the statement I quoted about being productive probably doesn't apply to you.  You're not going around writing extra code as it is, and that's ok - there's not much I can say that will affect you.&lt;br /&gt;&lt;br /&gt;The people I'm trying to reach are those who want to be great programmers, but who perhaps haven't yet found&lt;span style="font-style: italic;"&gt; the path.  &lt;/span&gt;Because you can be very smart and work very hard, only to find that the amount of work required to introduce each change to your beautiful software architecture grows faster than you can keep up with.  What happens is that each feature suggests a symmetrical feature as well.  If you have a list and a function to add to the list, don't you also need a delete?  Not necessarily - if your application doesn't ever delete items from the list, don't write that code.  You can write it when and if you do use it - who knows; in ten days you may change your architecture, and not even use that list at all!&lt;br /&gt;&lt;br /&gt;You have to be something of a perfectionist to write solid code - you also have to be willing to put up with incompleteness if you want to finish software projects, and that can be a bitter pill to swallow.&lt;br /&gt;&lt;br /&gt;I think the reason I had so much trouble with this, is that I learned to program by reading libraries.  In the many years I spent learning to program before I had internet in my home, the finest code examples I had were contained in the standard language libraries and headers which came with my compilers.  The quality of the code that goes into compiler libraries and language frameworks is usually exceptionally good.  What I'm worried about is that smart programmers will fail to grasp the fact that code in a library is targetted for a completely different use-case than code in an application is.&lt;br /&gt;&lt;br /&gt;When you look at only libraries and frameworks, you get a skewed idea of which things need to be done and which do not.  You risk developing a lop-sided aesthetic sense that values the completeness of a class's API over completeness of the project.  When I look at some of my older programs, I realize that what I had were layers upon layers of homemade libraries, building up like a pyramid until at the pinnacle you have one library call which sums up the whole program.&lt;br /&gt;&lt;br /&gt;So what's wrong with that?  Isn't that the holy grail of software design - to be able to issue one simple command and know that everything else is going to be taken care of?&lt;br /&gt;&lt;br /&gt;It's wrong because it took me - &lt;span style="font-style: italic;"&gt;f o r e v e r -&lt;/span&gt; to finish programs that way.  When I look through the code I see dozens of functions which are &lt;span style="font-style: italic;"&gt;never called&lt;/span&gt; anywhere in the entire program.  I put them in, not because I needed them, but just &lt;span style="font-style: italic;"&gt;to make the class API complete.&lt;/span&gt;  Ridiculous!&lt;br /&gt;&lt;br /&gt;I'm not alone.  I once heard a computer science professor give a group of freshmen the bad advice that, "when you make a class, you should give it as many overloaded constructors as you can, as many as you can think of, in case you need them." &lt;span style="font-style: italic;"&gt;Remember, kids, to stock up on constructors; that way you'll be prepared when the global function shortage hits...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The path I alluded to earlier is the way out of the quagmire of slow software development.  Imagine the space of all programs as a huge, dark forest.  Walking the path means not straying from what you need to write to accomplish your goals.  You can write code, even good code, while meandering all over the place, but you will spend much time lost in the forest and may never reach the end.  Every time you leave the path to go explore something interesting, you are covering a greater area in the space of all possible programs, making it ever harder to come back from your excursion.&lt;br /&gt;&lt;br /&gt;So much for not writing what you do not have to.  Yet I am advocating something beyond even that. You must continually re-examine everything you have already written, and eliminate dead code.  Do not be wedded to code you have written just because you spent time on it.  Instead, value the code only on how much it contributes to the final product.&lt;br /&gt;&lt;br /&gt;When I work on software I run variations of the same question through my mind continuously:  Can I do without this?  Is this a necessary function?  If I delete this piece of code, will the rest of the system continue to work?&lt;br /&gt;&lt;br /&gt;You can't have bugs in code that is not there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-302320358517605347?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/302320358517605347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=302320358517605347' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/302320358517605347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/302320358517605347'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/04/can-i-do-without-this.html' title='Can I Do Without This?'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-1996184126922742941</id><published>2007-04-01T23:29:00.000-05:00</published><updated>2007-04-02T02:10:28.038-05:00</updated><title type='text'>I Like that Old Time Rock and Roll</title><content type='html'>If you want to really understand something, you must go straight to the source.  Led Zepplin.  The Beatles.  Ernest Hemmingway.  Shakespeare. The original works in any area may not be the most polished - but they are the ones you will learn the most from.  Good ideas have a way of gathering extraneous junk over time - it's as if every original concept is a potential &lt;a href="http://en.wikipedia.org/wiki/Katamari_Damacy"&gt;katarami damacy&lt;/a&gt; ball, absorbing more cruft with each reincarnation.  Eventually it reaches a point that the &lt;a href="http://en.wikipedia.org/wiki/Quality_without_a_name"&gt;quality without a name&lt;/a&gt; that made the idea good in the first place is completely obscured.&lt;br /&gt;&lt;br /&gt;It's easy to see why this happens.  Original ideas are rare, and original people are scary.  Sometimes they smell bad, too.  It's much easier find a person who'll take an original idea and adapt it.  There are three ways to adapt an old idea - you can remove part of it, or you can substitute part of it with something else, or you can tack on unnecessary crap.  Of these ways, the first two require some understanding of what you are doing.  I don't look down on them.  Everything is created in the larger context of the culture and technology that spawned it, and I suspect what we call original ideas, are mostly made of other original ideas by simplifying them or substituting parts of another idea.&lt;br /&gt;&lt;br /&gt;The third way of co-opting an idea, however, is a form of pollution.  It's easy to take a good idea and add something that doesn't change it, because it doesn't break what was already there.  Anyone can do it.  That's the problem.  Look, it's not &lt;span style="font-style: italic;"&gt;just&lt;/span&gt; a dog, it's a dog with a flower on it's head!  &lt;span style="font-style: italic;"&gt;It's original!&lt;/span&gt;  Dog 2.0.  The &lt;a href="http://en.wikipedia.org/wiki/Noosphere"&gt;noosphere&lt;/a&gt; is littered with junk like this.&lt;br /&gt;&lt;br /&gt;The best way to avoid exposure to junk is to go back in time far enough to reach a point before the cruft took over.  So when I wanted to understand computer architecture better, I set out to build a homemade system based around one of the oldest 8-bit classics:  the 6502 microprocessor.  To those of you who may ask &lt;span style="font-style: italic;"&gt;why I would want to &lt;/span&gt;design my own computer, I refer you to my &lt;a href="http://dennisferron.blogspot.com/2007/03/why-do-anything.html"&gt;previous blog entry&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There are all manner of shortcuts that could be taken in such a project.  For instance, I could have just used a 6502 emulator on a PC - but I don't want to pretend I have a 6502 computer, I want to have a real 6502 that I can hold in my hands.  One shortcut I do think is reasonable is that I am using a powerful modern microcontroller, the &lt;a href="http://www.parallax.com/propeller/index.asp"&gt;Propeller from Parallax&lt;/a&gt;, to manage all the I/O and control logic for the circuit.  It will allow me to use software to replace a whole handful of support chips.  The Propeller is over a hundred times more powerful than the 6502 CPU it will be supporting, but the point is not to make a powerful computer, but to gain a better insight into computer architecture.  The Von Neumann architecture, which most computers today are based on, remains remarkably unchanged whether you're looking at a 6502 or a modern Pentium.&lt;br /&gt;&lt;br /&gt;(Incidently, the Propeller chip itself is also an example of an original work, the first of its own class.)&lt;br /&gt;&lt;br /&gt;My 6502-computer remains a work in progress.  I've run NOPs and simple loops on it using its single-cycle facility, but it's temporarily offline while I make some changes.  I figured out a way to eliminate even more chips from the circuit, using software on the Propeller to do their jobs, but the computer will not be operational again until I finish writing that firmware.&lt;br /&gt;&lt;br /&gt;Even so, I've already uncovered a wealth of fascinating things, which I would never have suspected. Building actual projects provides you with these wonderful Zen moments where your whole plan of action is suddenly brought up short by something unexpected. You find there's a gap in your reasoning and there's nothing in your plans for connecting it. Getting stuck is a wonderful thing because it means you're about to learn something that will change your perspective.&lt;br /&gt;&lt;br /&gt;Some of the interesting problems I've overcome so far:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Problem&lt;/span&gt;:  The hardest part of the whole project is... wiring.  If you've never tried to build a microprocessor circuit, you might think that the chips and the signals are what's important. For the most part, those will sort themselves out as you improve your design. But your schematic doesn't give you any hint how to keep hundreds of wires from turning into a horrible rats nest. Bad wiring is the perpetrator of electrical gremlins, and wiring is by far the most time consuming aspect of building a homebrew computer.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution&lt;/span&gt;:  Ribbon cables to keep the mess manageable, and patience.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Problem&lt;/span&gt;:  The 6502 doesn't always behave the same way every time you reset it. Sometimes it produces junk for six machine cycles before jumping to its reset vector, and sometimes it is seven or eight.  This is a problem because my theoretical design depended upon carefully counting the number of machine cycles so that I would know when the 6502 is looking for its reset vector, so that I can substitute another number.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution&lt;/span&gt;:  In my original design, I didn't give the Propeller any connections to the 6502's address lines.  I was relying on counting machine cycles to predict what the address &lt;span style="font-style: italic;"&gt;should&lt;/span&gt; be.  I had to change my design, because I needed it to measure actual addresses instead.  Plus, you really do need to know the machine addresses for debugging.  Guessing doesn't cut the mustard.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Problem&lt;/span&gt;:  The 6502 I'm using is rated for a 2 MHz clock. I would like to run the 6502 at a slower-than-normal clock speed while I'm debugging it, because certain electrical problems are mitigated by running the circuit more slowly.  However, the 6502 uses dynamic RAM for its registers, which have to be refreshed.  There is a minimum safe clock speed that will still keep the registers refreshed on time - but what is it?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution&lt;/span&gt;: It seems no one knows what the real minimum clock speed is.  However, everyone agrees that 500 KHz is fast enough.  In my own experiments, I found that some operations (like resets and interrupts) would still work at speeds as slow as 10 KHz, but others did not.  I've taken to running the processor at 500 KHz normally, and 50 KHz for specific tests.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Problem&lt;/span&gt;: The 6502 lacks many "essential" bus control signals.  When I first evaluated the chip, I thought, wow, this is really simple.  It doesn't have all the confusing extra pin functions that other microprocessors have.  Then I went to actually implement the thing and realized there were signals I needed which the 6502 doesn't provide.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution&lt;/span&gt;: The 6502 has a clock input, as you would expect, but it also has two clock outputs, for no obvious reason.  When I first looked at the datasheets, I ignored these because I didn't understand what they did. You can't ignore them. The reason the 6502 appears to be simpler in its bus control pins is that other microprocessors include bus-decoding logic on the chip, but the 6502 makes you use the two clock-phase outputs to synthesize your own bus logic.  I first used NAND gates to combine the signals in the way I needed, but my new design will use firmware on the Propeller to decode it on the fly.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Problem&lt;/span&gt;:  The 6502 single-step feature is very poorly documented, and poses a complex logic design problem. It is also very easy to lock up the 6502 if the single-step pin is asserted at an inconvenient time. (I think they tried to gloss over that in the official docs.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solution&lt;/span&gt;: I found a schematic of the 6502 single-step circuit that the man himself, Steve Wozniak, used on the Apple II.  It was a brilliantly designed state machine using a pair of D-flipflops in a 7474 chip.  I'm proud to report that I independently came up with the same idea of using a 7474, and had something already that looked remarkably like Woz's circuit - except for the small detail that mine locked up the 6502, but Woz's actually worked.  I analyzed his circuit and realized that the clock-phase outputs (mentioned above) were the piece of the puzzle that I had been missing. Using a flipflop configuration inspired by Woz's, I at last got single-stepping to work, but no sooner had I gotten it working than I realized I could do it in software on the Propeller, without any additional chips.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-1996184126922742941?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/1996184126922742941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=1996184126922742941' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/1996184126922742941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/1996184126922742941'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/04/i-like-that-old-time-rock-and-roll.html' title='I Like that Old Time Rock and Roll'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-2210983547661108661</id><published>2007-03-31T15:25:00.000-05:00</published><updated>2007-04-01T12:04:02.708-05:00</updated><title type='text'>In Which I Do Not Fly a Kite on the Beach</title><content type='html'>Ah, I should be ashamed of myself. What kind of person pays a $65 buy-in for the &lt;span style="font-style: italic;"&gt;craziest&lt;/span&gt; beach party of the year, and after one night says, "You know what?  I'm tired of partying. Let's go home, read a book, and maybe write a blog entry."&lt;br /&gt;&lt;br /&gt;I'll never be able to pass myself off as a normal person &lt;span style="font-style: italic;"&gt;now.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's not that I have no life, it's just that I can only do the social thing so long before I want to quit wasting time, and go do something geeky and constructive with my time. Alcohol doesn't really do it for me. I like the people at the beach party. I had the time of my life. But this morning I realized I'm just not interested in getting intoxicated enough to enjoy another night with 75 loud, intoxicated college students.&lt;br /&gt;&lt;br /&gt;Ok, maybe it is that I have no social life.&lt;br /&gt;&lt;br /&gt;I don't worry about it.  I may be crazy but it's a happy kind of crazy. I enjoy my geeky life. I just wish my fiancee could have been here with me this weekend.&lt;br /&gt;&lt;br /&gt;My original plans for the beach party were to get an awesome &lt;a href="http://www.goflyakite.com/framelessflyers.html"&gt;parafoil kite&lt;/a&gt;, and spend the weekend flying the kite on the beach. Then all the girls would say, "Wow, that's a cool kite, can I fly it?" And I'd have to say, "Piss off. Get your own kite."&lt;br /&gt;&lt;br /&gt;(Just a joke - I'm really not that mean.)&lt;br /&gt;&lt;br /&gt;So I bought the kite. Unfortunately some bad thunderstorms are keeping everyone inside this weekend - no kite flying, or beachly activities of any kind. I can't remember whether the Mythbusters episode confirmed or busted the myth that you can get killed by lightning striking a kite, but I'd hate to find out the hard way.&lt;br /&gt;&lt;br /&gt;(Some people have this strange idea that you should go into the water, or something, when you go to the beach. I hear it's called "swimming". I've never tried it myself - it sounds terribly unpleasant.)&lt;br /&gt;&lt;br /&gt;The book I'm curling up with on this rainy day is titled &lt;a href="http://www.amazon.com/Born-Blue-Day-Extraordinary-Autistic/dp/1416535071"&gt;&lt;span style="font-style: italic;"&gt;Born on a Blue Day&lt;/span&gt;&lt;/a&gt;.  It is the autobiography of &lt;a href="http://60minutes.yahoo.com/segment/44/brain_man"&gt;Daniel Tammet&lt;/a&gt;, who is a famous memory savant who has &lt;a href="http://www.udel.edu/bkirby/asperger/aswhatisit.html"&gt;Asperger's syndrome&lt;/a&gt;.  The book makes an outstanding contribution to the body of works that includes &lt;a href="http://en.wikipedia.org/wiki/Temple_Grandin"&gt;Temple Grandin&lt;/a&gt;'s autobiography, &lt;a href="http://www.amazon.com/Thinking-Pictures-Other-Reports-Autism/dp/0679772898"&gt;&lt;span style="font-style: italic;"&gt;Thinking in Pictures&lt;/span&gt;&lt;/a&gt;, and the novel by Mark Haddon, &lt;span style="font-style: italic;"&gt;&lt;a href="http://en.wikipedia.org/wiki/The_Curious_Incident_of_the_Dog_in_the_Night-time"&gt;The Curious Incident of the Dog in the Night-time&lt;/a&gt;.&lt;/span&gt;  I'll post a review of &lt;a href="http://www.amazon.com/Born-Blue-Day-Extraordinary-Autistic/dp/1416535071"&gt;&lt;span style="font-style: italic;"&gt;Born on a Blue Day&lt;/span&gt;&lt;/a&gt; sometime this week.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-2210983547661108661?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/2210983547661108661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=2210983547661108661' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2210983547661108661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/2210983547661108661'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/03/in-which-i-do-not-fly-kite-on-beach.html' title='In Which I Do Not Fly a Kite on the Beach'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-6982133300635997886</id><published>2007-03-27T22:31:00.000-05:00</published><updated>2007-03-28T01:05:57.605-05:00</updated><title type='text'>Why Do Anything?</title><content type='html'>Personal hack projects, &lt;a href="http://www.hackaday.com/"&gt;like the kind they write about on hackaday&lt;/a&gt;, are indispensable to the aspiring technology wizard's development. These are small feats of engineering done for no other purpose than for the joy of making things, or to prove that something considered impossible can actually be done. Other computer science students often ask me how I acquired the skills I have, and want to know how they might improve their own skills. "Projects!" I tell them.  I advise them to choose something that interests them but lies just outside their current skillset.  In doing the project they will acquire the skills the project requires and polish the ones they already have.  It's also great fun!&lt;br /&gt;&lt;br /&gt;I, of all people, should not have any difficulty justifying to myself why I do projects - right? Well let me tell you...&lt;br /&gt;&lt;br /&gt;I have a favorite uncle who is a computer consultant.  I am greatly indebted to him - my first experiences with computers were playing games at his house when I was very young, and it was also he who gave me my first "real" computer.&lt;br /&gt;&lt;br /&gt;We definitely have some common interests, but whenever I would tell him my latest idea for some fun but purposeless project, he would reply:  "That sounds interesting... but &lt;span style="font-style: italic;"&gt;why would you want to?&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;As an adult and now a computer professional myself, I've come to understand his viewpoint.  Our field is simply too full of possibilities to go tilting at every windmill.  You have to pick and choose your battles. A simple but mundane solution to an interesting problem is not a waste of a good problem - it is a job well done, or at least done with minimal risk.&lt;br /&gt;&lt;br /&gt;Yet there has always been something that bothered me about the way my uncle posed that question.  "&lt;span style="font-style: italic;"&gt;But why would you want to?&lt;/span&gt;"  The answer to it is meaningless.  I don't know why I want to.  I just get ideas for projects and I do them.&lt;br /&gt;&lt;br /&gt;It is not the answer but the question itself that troubles my thoughts. No, not even the question. It runs deeper than that.  It is the &lt;span style="font-style: italic;"&gt;act of asking&lt;/span&gt; the question that raises the hairs on my neck.&lt;br /&gt;&lt;br /&gt;Because you see if you start asking this question when you have an idea for project to do for fun, it only leads to self-doubt. You will never reach your full potential if you question your own motivation. I've met many geeks who regularly do astonishing things with technology. I've met many more, just as smart, who talk about great things but do not do them. What stops them?&lt;br /&gt;&lt;br /&gt;There are many cases where self-doubt is a good thing. It is a survival trait. One day my best friend needed to fix something on the roof of his house. I held a ladder while he climbed to the roof. It was very windy. Suddenly he hesitated and climbed back down. "What's wrong?" I asked. He said, "I don't know whether I suddenly became smarter or am just chickenshit, but I just got the feeling I shouldn't be up on that roof." As he said that, another violent gust of wind shook the ladder in my hands. I think he made the right choice.&lt;br /&gt;&lt;br /&gt;Most electronics and software projects are not nearly as dangerous as climbing a ladder on a windy day. Provided you practice good lab safety habits, the real danger is to your own ego. The fear you deal with is just fear of the unknown - "What if I can't get this to work?" "I don't know where to begin." When it comes to doing a project, self-doubt is &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; a survival trait - it's a stumbling block.&lt;br /&gt;&lt;br /&gt;It's appropriate to apply the "but why would you want to?" question when evaluating solutions to a major engineering project at your day job. You'd be irresponsible if you created unnecessary work by not differentiating between things that are &lt;span style="font-style: italic;"&gt;fun&lt;/span&gt; to do and things you &lt;span style="font-style: italic;"&gt;need &lt;/span&gt;to do. But if you ask "why would you want to?" about personal projects that are just for fun in the first place, you will invariably find a reason not to do it. An old 'geezer' I know recently lamented to me that the downside of today's advanced technology is that no one is impressed anymore when you show them what you've been working on, because they can buy a piece of consumer electronics from Walmart that does the same thing. When anything that has a real purpose is already available, and anything you may build that is one of a kind probably also doesn't have any practical value, it begs the question, "Why do anything?"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-6982133300635997886?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/6982133300635997886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=6982133300635997886' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/6982133300635997886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/6982133300635997886'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/03/why-do-anything.html' title='Why Do Anything?'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-6391879301157498760</id><published>2007-03-27T00:36:00.000-05:00</published><updated>2007-03-27T00:37:53.525-05:00</updated><title type='text'>Coming soon</title><content type='html'>Coming soon:  shorter paragraphs!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-6391879301157498760?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/6391879301157498760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=6391879301157498760' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/6391879301157498760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/6391879301157498760'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/03/coming-soon.html' title='Coming soon'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6897130125864772151.post-6088231862313997987</id><published>2007-03-26T23:34:00.000-05:00</published><updated>2007-03-27T01:12:36.640-05:00</updated><title type='text'>New Blog</title><content type='html'>Well!  My first blog that is not one of my previous two blogs.  Ahem.  No really, this blog is better because it is:&lt;br /&gt;&lt;br /&gt;A) Not on Myspace.  [yuck]&lt;br /&gt;B) Not on a university computer that no one can access!  (Long story.)&lt;br /&gt;&lt;br /&gt;I actually wanted to create a real website, complete with project pages documenting the cool things I've built, pictures, and file downloads; but I'm too poor to buy good webhosting, and too good to use a cheap one!  So I'm starting a blog instead.  C'est la vie.  A blog is a better fit anyway.&lt;br /&gt;&lt;br /&gt;The name of the blog is Steely Eyed Codeslinger.  I - have worked for - occaisionally work for - may work for again? - a software company called CDFA, and as it is a small company we were a very close-knit group.  We'd often have some good inside jokes buzzing about, and sometimes all watch the same movies or read the same novels.  At one point when I worked there last year,&lt;br /&gt;the boss, &lt;a href="http://bortell.net/Dean/wordpress/index.php"&gt;Dean Bortell&lt;/a&gt;, was reading Stephen King's Gunslinger novels, and got the rest of us into it.  I enjoyed them but I never did end up finishing the series.  I wonder if Dean did?  Anyhow Dean changed the word "gunslinger" to "codeslinger" to describe the kind of "just do it, fast, clean, and efficient" programmers we were (or wanted to be).  I always rather liked the codeslinger / gunslinger comparison.  It was more-or-less a synonym for "hacker" but without the bad connotations, and "hacker" was a generic term but "codeslinger" was our own word.  During that time I was always complaining that we needed to spend more time on our architecture (think before you shoot), but after getting more exposure to software done other places, especially academia, with their current gonzo Java fad, and meeting some real-life &lt;a href="http://www.joelonsoftware.com/articles/fog0000000018.html"&gt;architecture astronauts&lt;/a&gt;, I realized that there is a lot to be said for a one-shot, one-kill style of coding without friviality.  To me, the term "codeslinger" embodies that idea.  Of course, it is a sliding scale - what I might bang out without having to think about it, what I might consider a perfectly straightforward solution, might make another programmer want to hang me by my neck with my keyboard cable.  You have to be both experienced and good to be a "codeslinger" - you can't just bang out code without knowing what you're doing anymore than a cowboy can win a gunfight if he can't hit anything.  The important point is not that the gunslinger shoots without having to think about it, the point is that &lt;span style="font-weight: bold;"&gt;he hits what he's aiming at.&lt;/span&gt;  When you write software for money, time doesn't magically become free of cost while you do your planning.  It costs money and affects your schedule, whether you are planning code or writing code, but of the two activities, only one actually results in &lt;span style="font-style: italic;"&gt;a program&lt;/span&gt;.  Once you've planned long enough to know you can hit what you're aiming for, then shoot, damn it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6897130125864772151-6088231862313997987?l=dennisferron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dennisferron.blogspot.com/feeds/6088231862313997987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6897130125864772151&amp;postID=6088231862313997987' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/6088231862313997987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6897130125864772151/posts/default/6088231862313997987'/><link rel='alternate' type='text/html' href='http://dennisferron.blogspot.com/2007/03/new-blog.html' title='New Blog'/><author><name>Dennis Ferron</name><uri>http://www.blogger.com/profile/03601234553344631838</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://bp0.blogger.com/_s7k3i46yEG0/SBWaE8oyuzI/AAAAAAAAAKk/cmVL9L_ZVjw/S220/Me+working+on+engine.jpg'/></author><thr:total>1</thr:total></entry></feed>
