<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;C0UDRns4fyp7ImA9WhVVFkQ.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397</id><updated>2012-05-10T19:07:57.537-04:00</updated><category term="atomic zombie marauder" /><category term="astronomy" /><category term="urban planning" /><category term="2008 democratic primary elections" /><category term="vehicle" /><category term="improvised" /><category term="one-liner" /><category term="domain name" /><category term="free" /><category term="cheap" /><category term="predictions" /><category term="minilathe" /><category term="events" /><category term="phone" /><category term="chainring" /><category term="product" /><category term="tig welding" /><category term="bike" /><category term="tax" /><category term="design criticism" /><category term="sheldonbrown" /><category term="make" /><category term="waste management" /><category term="park slope" /><category term="job" /><category term="metal working" /><category term="tune-up" /><category term="software engineering" /><category term="single-serving" /><category term="standard library" /><category term="reliability" /><category term="lunar eclipse" /><category term="video" /><category term="spoke" /><category term="craigslist" /><category term="repair" /><category term="hvac" /><category term="eclipse" /><category term="brooklyn" /><category term="alarm clock" /><category term="shattered dreams" /><category term="charge coupled device" /><category term="software engineer" /><category term="alternative" /><category term="lwb" /><category term="cars" /><category term="rant" /><category term="obituary" /><category term="voting" /><category term="bed-stuy" /><category term="modifications" /><category term="biofuel" /><category term="diy" /><category term="java" /><category term="bent" /><category term="princeton" /><category term="lock" /><category term="dragons" /><category term="ccd" /><category term="makenyc" /><category term="holiday" /><category term="stirling" /><category term="haha" /><category term="lathe" /><category term="india" /><category term="long wheel-base" /><category term="urbanity" /><category term="toilet" /><category term="123 tompkins" /><category term="cart" /><category term="compost" /><category term="disappointment" /><category term="obama" /><category term="implementation issues" /><category term="caste" /><category term="septic tank" /><category term="idiotarod" /><category term="software" /><category term="flickr" /><category term="&quot;unix is great&quot;" /><category term="bamboo" /><category term="headset" /><category term="pollution" /><category term="color" /><category term="chinese new year" /><category term="coding" /><category term="power" /><category term="freegan" /><category term="wheel" /><category term="turing alarm clock" /><category term="led" /><category term="design" /><category term="dumpster" /><category term="human waste" /><category term="entrepeneur" /><category term="grow-lamp" /><category term="race" /><category term="nyc" /><category term="urban effect" /><category term="register.com" /><category term="greenwash" /><category term="sugino sucks" /><category term="recumbent" /><category term="bikes" /><category term="education" /><category term="stirling engine" /><category term="one-time-use" /><category term="moon" /><category term="short" /><category term="efficiency" /><category term="night" /><category term="bakfiets" /><category term="Innertubes" /><category term="winter" /><category term="photos" /><category term="press" /><category term="bio-gas" /><category term="pwm" /><category term="interface" /><category term="green" /><category term="sewer" /><category term="nokia" /><category term="quote depth exceeded" /><category term="congestion tax" /><category term="scavenger" /><category term="bicycle" /><category term="rim" /><category term="bakfiet" /><category term="maintenance" /><category term="welding" /><category term="building wheels" /><category term="princeton university" /><category term="london" /><category term="cellular" /><category term="update" /><category term="advertisements" /><category term="mods" /><category term="hack" /><category term="embedded" /><category term="tool" /><category term="idiotarod2008" /><category term="primaries" /><category term="grow-light" /><category term="programming" /><category term="mixin" /><category term="politics" /><category term="cell phone" /><category term="norway" /><category term="lunar" /><category term="padlock" /><category term="graduate school" /><category term="sterling engine" /><category term="hillary" /><category term="electronics" /><category term="trash" /><category term="coal" /><category term="cargo" /><category term="energy" /><category term="sanitation" /><category term="clock" /><category term="deposits" /><category term="bike tool" /><category term="gardening" /><category term="lamp" /><category term="Recycling" /><category term="developing nation" /><category term="7x12" /><category term="polluter-pays" /><category term="maps" /><category term="traffic" /><category term="lcd" /><category term="rambling" /><category term="metal lathe" /><category term="solar" /><category term="reuse" /><category term="transportation" /><title>cheaphack</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.cheaphack.net/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>115</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/cheaphack" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="cheaphack" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">cheaphack</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;CE8DR3s-fyp7ImA9Wx9UEEk.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-6717215897304685736</id><published>2011-02-06T20:13:00.007-05:00</published><updated>2011-02-06T20:41:16.557-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-06T20:41:16.557-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="bent" /><category scheme="http://www.blogger.com/atom/ns#" term="lwb" /><category scheme="http://www.blogger.com/atom/ns#" term="bike" /><category scheme="http://www.blogger.com/atom/ns#" term="atomic zombie marauder" /><category scheme="http://www.blogger.com/atom/ns#" term="welding" /><category scheme="http://www.blogger.com/atom/ns#" term="recumbent" /><category scheme="http://www.blogger.com/atom/ns#" term="diy" /><category scheme="http://www.blogger.com/atom/ns#" term="long wheel-base" /><title>DIY long recumbent</title><content type="html">Another cabin fever project: a long-wheel base racer recumbent.  This is based on Atomic Zombie's Marauder from his book, but with modifications as I go along.  Why a long recumbent?  Supposedly, above 20 mph or so, a rider is primarily limited by wind resistance.  If you want to go faster, you must overcome that.&lt;br /&gt;&lt;br /&gt;Unfortunately, recumbents (and their riders) usually look like this.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.rbr.info/images/stories/support/recumbent-glossary/bent.jpg"&gt;&lt;img style="cursor: pointer; width: 250px;" src="http://www.rbr.info/images/stories/support/recumbent-glossary/bent.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Atomic Zombie works hard to make recumbents look a little bit cooler...&lt;br /&gt;&lt;br /&gt;&lt;iframe title="YouTube video player" src="http://www.youtube.com/embed/emh9R0zrJp0" allowfullscreen="" frameborder="0" height="390" width="480"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;I'm not sure I'll look much cooler than either of these guys, but fuck it... I want to ride fast!&lt;br /&gt;&lt;br /&gt;The main frame is made from three pieces of 1"-square tubing.  The front wheel is 20", and will be steered via rod (much like my &lt;a href="http://www.cheaphack.net/2010/07/diy-bakfiets.html"&gt;Bakfiets&lt;/a&gt;), the rear is 26".  The rear fork is made from an old fork (the &lt;span style="font-style: italic;"&gt;seat stays&lt;/span&gt;) and some 1/2"-square tubing (the &lt;span style="font-style: italic;"&gt;chain stays&lt;/span&gt;).  The wheel-base is 6'10".&lt;br /&gt;&lt;br /&gt;I've got a lot more work to do, but progress is coming along very well: I've got two wheels and cranks.  Still need: steering, brakes, transmission.&lt;br /&gt;&lt;br /&gt;This thing is so long it's hard to photograph.  See the whole &lt;a href="http://www.flickr.com/photos/npj/sets/72157625867637945/"&gt;set on flickr&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/npj/5423697508/" title="Wheels on a stick. by nickjohnson, on Flickr"&gt;&lt;img src="http://farm6.static.flickr.com/5214/5423697508_be66926cb1_m.jpg" alt="Wheels on a stick." height="180" width="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/npj/5423697518/" title="Wheels on a stick by nickjohnson, on Flickr"&gt;&lt;img src="http://farm6.static.flickr.com/5216/5423697518_621bfd24e6_m.jpg" alt="Wheels on a stick" height="180" width="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/npj/5423697524/" title="Bottom bracket by nickjohnson, on Flickr"&gt;&lt;img src="http://farm6.static.flickr.com/5132/5423697524_e2031db0fd_m.jpg" alt="Bottom bracket" height="180" width="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/npj/5423071843/" title="Joe with the Rear triangle. by nickjohnson, on Flickr"&gt;&lt;img src="http://farm6.static.flickr.com/5251/5423071843_6a4aa273eb_m.jpg" alt="Joe with the Rear triangle." height="180" width="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thank you &lt;a href="http://www.anthonycross.com/cyclab/"&gt;Cyclab&lt;/a&gt; for letting me keep the intermediates and a lot of tools in your shop!&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-6717215897304685736?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pAJSDj-SYjKxR_WK1cdPJP_68ik/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pAJSDj-SYjKxR_WK1cdPJP_68ik/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pAJSDj-SYjKxR_WK1cdPJP_68ik/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pAJSDj-SYjKxR_WK1cdPJP_68ik/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/6717215897304685736/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=6717215897304685736" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/6717215897304685736?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/6717215897304685736?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2011/02/diy-long-recumbent.html" title="DIY long recumbent" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/emh9R0zrJp0/default.jpg" height="72" width="72" /><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;CkINRXgyfCp7ImA9Wx9UEEk.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-8606762484476622957</id><published>2011-02-06T19:16:00.013-05:00</published><updated>2011-02-06T20:03:14.694-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-06T20:03:14.694-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="grow-lamp" /><category scheme="http://www.blogger.com/atom/ns#" term="lamp" /><category scheme="http://www.blogger.com/atom/ns#" term="grow-light" /><category scheme="http://www.blogger.com/atom/ns#" term="led" /><category scheme="http://www.blogger.com/atom/ns#" term="diy" /><category scheme="http://www.blogger.com/atom/ns#" term="hack" /><category scheme="http://www.blogger.com/atom/ns#" term="gardening" /><title>DIY Grow Lamp</title><content type="html">&lt;p&gt;We've had snow on the ground since the day after Christmas, and I'm getting a little bit of cabin fever.  We're also getting exciting about the upcoming gardening season, and Daya started sprouting vegetables inside.  When she started searching for indoor grow lamps online, I was disgusted by the prices.  So, I walked into my workshop to see if I had any LEDs laying around.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="float: left; margin-right: 1em;" href="http://www.flickr.com/photos/npj/5422935307/" title="LED Strip, Detail by nickjohnson, on Flickr"&gt;&lt;img src="http://farm6.static.flickr.com/5175/5422935307_9fc7f06546_m.jpg" alt="LED Strip, Detail" height="180" width="240" /&gt;&lt;/a&gt;And that's when I remembered that I had LED strip.&lt;br /&gt;&lt;p&gt;I  bought 3 meters of this at a great price while I was in India a year  and a half ago.  I thought I'd use it to bling-out my bike, but never  got around to it.   On later thought, glowing bikes are tacky.  The grow lamp is a better use.&lt;/p&gt;&lt;p&gt;Each  white rectangle is three LEDs: red, green and blue.  The black  rectangles are SMT resistors, 150 Ohm for the red and green channels,  330 Ohm for the blue channel.  Each channel can be controlled  independently to produce any color.  The strip is printed on &lt;a href="http://en.wikipedia.org/wiki/Flexible_circuit"&gt;flexible circuit board&lt;/a&gt; with an adhesive backing. The strip can be cut at 3-LED increments.  This stuff is pretty damn cool, and very easy to use in nearly anything.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="float: right; margin-left: 1em;" href="http://www.flickr.com/photos/npj/5422935273/" title="Bottom view by nickjohnson, on Flickr"&gt;&lt;img src="http://farm6.static.flickr.com/5098/5422935273_31c496baab_m.jpg" alt="Bottom view" height="180" width="240" /&gt;&lt;/a&gt;&lt;p&gt;I put the strips onto a piece of  scrap wood grid that I found in the dumpster.  I wired them together,  and use an old laptop power supply to power them.  Wiring requires a little bit of thought.  A contiguous length of strip puts all of the LEDs in parallel.  It's tempting to wire connect this directly to the power supply.  However, the voltage drop of the lights is only about 0.7V.  Putting 20V across that will draw a huge amount of current, and the LEDs will run hot.  I chose instead to wire the strips in series.  This gives as much light, but draws less current.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="float: left; margin-right: 1em;" src="http://farm6.static.flickr.com/5218/5422935281_9eacc9cdff_m.jpg" alt="Action shot" height="180" width="240" /&gt;&lt;br /&gt;&lt;p&gt;The  light is intentionally purple.  I use only the red and blue  channels,  since those are (approximately) the &lt;a href="http://en.wikipedia.org/wiki/Chlorophyll"&gt;frequencies of light that  plants can  use&lt;/a&gt;.  Said another way; plants are green because green is the only color they don't absorb.  Adding green would give a  whiter color,  but add nothing for the plants while burning more power.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="float: right; margin-left: 1em;" href="http://www.flickr.com/photos/npj/5422935295/" title="Action shot by nickjohnson, on Flickr"&gt;&lt;img src="http://farm6.static.flickr.com/5256/5422935295_a499507163_m.jpg" alt="Action shot" height="180" width="240" /&gt;&lt;/a&gt;&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Underwriters_Laboratories"&gt;Underwriters Laboratories&lt;/a&gt; would not  approve. Exposed soldered  connections, no enclosure, and hand-wavy  electrical engineering on  an appliance that will be near water. Still,  the power supply and LEDs  run cool, and give intensely bright light.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;We   hang the lamp from a shelving unit in our living room.  Underneath,   we're sprouting Mustard Greens, Lettuce, Parsley, and Collards, and below that, a space heater to keep the seedlings warm.  At   least a month more before Jersey thaws and we can put them in the   ground.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-8606762484476622957?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/d9jDnv-xapcq0f49TjR38_gRkx4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d9jDnv-xapcq0f49TjR38_gRkx4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/d9jDnv-xapcq0f49TjR38_gRkx4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d9jDnv-xapcq0f49TjR38_gRkx4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/8606762484476622957/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=8606762484476622957" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/8606762484476622957?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/8606762484476622957?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2011/02/diy-grow-lamp.html" title="DIY Grow Lamp" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm6.static.flickr.com/5175/5422935307_9fc7f06546_t.jpg" height="72" width="72" /><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DkIASX84eCp7ImA9Wx5bGE4.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-1518907901859303204</id><published>2010-11-03T21:35:00.001-04:00</published><updated>2010-11-03T21:35:48.130-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-03T21:35:48.130-04:00</app:edited><title>Steinbeck quote</title><content type="html">&lt;div id="description_div4569154279" class="photo-desc"&gt;&lt;p id="yui_3_1_0_1_1288834453573857"&gt;&lt;b id="yui_3_1_0_1_1288834453573860"&gt;&lt;/b&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;b id="yui_3_1_0_1_1288834453573860"&gt;If I seem to be over-interested in junk,&lt;/b&gt;  it is because I am, and I have a lot of it too -- half a garage full of  bits and broken pieces. ...  I do have a genuine and mostly miserly  interest in worthless objects. My excuse is that in this era of planned  obsolescence, when a thing breaks down I can usually find something in  my collection  to repair it -- a toilet, or a motor, or a lawn mower.  But I guess the truth is that I simply like junk.&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p id="yui_3_1_0_1_1288834453573857"&gt;&lt;br /&gt;-- John Steinbeck, &lt;i id="yui_3_1_0_1_1288834453573863"&gt;Travels With Charley&lt;/i&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-1518907901859303204?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/g9t0EifACbJF9z5tiMSUF9EMvJ4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/g9t0EifACbJF9z5tiMSUF9EMvJ4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/g9t0EifACbJF9z5tiMSUF9EMvJ4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/g9t0EifACbJF9z5tiMSUF9EMvJ4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/1518907901859303204/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=1518907901859303204" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/1518907901859303204?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/1518907901859303204?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2010/11/steinbeck-quote.html" title="Steinbeck quote" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0cCRng4eyp7ImA9Wx5UGUg.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-7018437247740418101</id><published>2010-10-24T16:01:00.004-04:00</published><updated>2010-10-24T16:11:07.633-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-24T16:11:07.633-04:00</app:edited><title>Someone finally made the right kind of vacation planner.</title><content type="html">If you're like me, you love traveling, but don't want to break the bank. The cost usually is more important than the destination. I know a few languages and I'd like to speak them.  I want warm weather. I know a general time of travel. Where can I go?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_S_lLPG9im4k/TMSSYS54YeI/AAAAAAAAAG8/jLUZyd9DXmc/s1600/kayak.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 176px;" src="http://4.bp.blogspot.com/_S_lLPG9im4k/TMSSYS54YeI/AAAAAAAAAG8/jLUZyd9DXmc/s320/kayak.jpg" alt="" id="BLOGGER_PHOTO_ID_5531707188406936034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I usually think about vacation in terms of "&lt;a href="http://www.kayak.com/explore/#/NYC?a=any&amp;amp;d=any&amp;amp;fb=110,1000&amp;amp;l=en,es,fr&amp;amp;ll=17.644022,-55.898437&amp;amp;ns=n&amp;amp;s=0&amp;amp;t=62,106&amp;amp;z=3&amp;amp;w=20101201,20101231"&gt;I want to go to a Spanish, French or English speaking nation in December, where the average daytime temperature is at least 62F, and with tickets for less than $1K.&lt;/a&gt;"  Kayak has made this nifty map application to answer that for me.&lt;br /&gt;&lt;br /&gt;Thank you Kayak, this is brilliant.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-7018437247740418101?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ybNLR-_rVlMXfGempeEts10Lk80/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ybNLR-_rVlMXfGempeEts10Lk80/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ybNLR-_rVlMXfGempeEts10Lk80/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ybNLR-_rVlMXfGempeEts10Lk80/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/7018437247740418101/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=7018437247740418101" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/7018437247740418101?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/7018437247740418101?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2010/10/someone-finally-made-right-kind-of.html" title="Someone finally made the right kind of vacation planner." /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_S_lLPG9im4k/TMSSYS54YeI/AAAAAAAAAG8/jLUZyd9DXmc/s72-c/kayak.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0IBRXczeyp7ImA9Wx5WFUk.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-4049202334421498153</id><published>2010-09-26T21:04:00.004-04:00</published><updated>2010-09-26T21:05:54.983-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-26T21:05:54.983-04:00</app:edited><title>Maker Faire was Awesome</title><content type="html">Two thoughts.&lt;br /&gt;&lt;br /&gt;(1) If you're going to build a robot, make it a crowd pleaser:&lt;br /&gt;&lt;br /&gt;&lt;object type="application/x-shockwave-flash" data="http://www.flickr.com/apps/video/stewart.swf?v=71377" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" height="400" width="300"&gt; &lt;param name="flashvars" value="intl_lang=en-us&amp;amp;photo_secret=7a8b273b94&amp;amp;photo_id=5024257597"&gt; &lt;param name="movie" value="http://www.flickr.com/apps/video/stewart.swf?v=71377"&gt; &lt;param name="bgcolor" value="#000000"&gt; &lt;param name="allowFullScreen" value="true"&gt;&lt;embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/video/stewart.swf?v=71377" bgcolor="#000000" allowfullscreen="true" flashvars="intl_lang=en-us&amp;amp;photo_secret=7a8b273b94&amp;amp;photo_id=5024257597" height="400" width="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;(2) I'd saw my arm off for a &lt;a href="http://store.makerbot.com/3d-printers/thing-o-matic/makerbot-thing-o-matic.html"&gt;thing-o-matic&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-4049202334421498153?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jzgk-IQ-cPsWeRGTVGq90HfrEQs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jzgk-IQ-cPsWeRGTVGq90HfrEQs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jzgk-IQ-cPsWeRGTVGq90HfrEQs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jzgk-IQ-cPsWeRGTVGq90HfrEQs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/4049202334421498153/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=4049202334421498153" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/4049202334421498153?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/4049202334421498153?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2010/09/maker-faire-was-awesome.html" title="Maker Faire was Awesome" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEEMSHg_eyp7ImA9WxFaEkQ.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-3465084602253332872</id><published>2010-07-16T12:07:00.003-04:00</published><updated>2010-07-16T12:11:29.643-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-16T12:11:29.643-04:00</app:edited><title>Photos from Guatemala</title><content type="html">&lt;a style="float:left; margin-right:1em" href="http://www.flickr.com/photos/npj/4798575700/" title="IMG_5147 by nickjohnson, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4077/4798575700_4c246a2a2a_m.jpg" width="180" height="240" alt="IMG_5147" /&gt;&lt;/a&gt;I just got back from a month long vacation in Guatemala.  I've uploaded &lt;a href="http://www.flickr.com/photos/npj/collections/72157624511127528/"&gt;pictures&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you just want highlights, check out &lt;a href="http://www.flickr.com/photos/npj/sets/72157624512273112/"&gt;Semuc Champey&lt;/a&gt; and &lt;a href="http://www.flickr.com/photos/npj/sets/72157624512504320/"&gt;Tikal&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-3465084602253332872?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ecOOvI1zu2xDEmrp2jetMSRj3yA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ecOOvI1zu2xDEmrp2jetMSRj3yA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ecOOvI1zu2xDEmrp2jetMSRj3yA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ecOOvI1zu2xDEmrp2jetMSRj3yA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/3465084602253332872/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=3465084602253332872" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/3465084602253332872?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/3465084602253332872?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2010/07/photos-from-guatemala.html" title="Photos from Guatemala" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm5.static.flickr.com/4077/4798575700_4c246a2a2a_t.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0ABR3c8eSp7ImA9WxFbGEs.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-2738718097905383834</id><published>2010-07-11T10:38:00.013-04:00</published><updated>2010-07-11T11:22:36.971-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-11T11:22:36.971-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cargo" /><category scheme="http://www.blogger.com/atom/ns#" term="bike" /><category scheme="http://www.blogger.com/atom/ns#" term="welding" /><category scheme="http://www.blogger.com/atom/ns#" term="hack" /><category scheme="http://www.blogger.com/atom/ns#" term="bakfiets" /><category scheme="http://www.blogger.com/atom/ns#" term="bakfiet" /><category scheme="http://www.blogger.com/atom/ns#" term="transportation" /><category scheme="http://www.blogger.com/atom/ns#" term="bikes" /><title>DIY Bakfiets</title><content type="html">I don't have a car---not even a license---and so transportation is a problem for me.  It wasn't a problem back in Charlottesville or in Brooklyn, since both cities offered walkable communities.  But now that I live in Princeton, my grocery stores are far away.  I use a bike for personal transport, but even then, I can only carry a small amount of groceries at a time.  I need a better solution; I need a sport utility bike.&lt;br /&gt;&lt;br /&gt;The spark that moved me into action was one of bike-machismo.  My friend Sean-not-douche of the &lt;a href="http://www.anthonycross.com/cyclab/"&gt;Cyclab&lt;/a&gt; asked me to help him build a &lt;a href="http://www.flickr.com/photos/npj/4782505707/in/set-72157624469941328/"&gt;tall bike&lt;/a&gt;.  That went well, but I was embarrassed that we needed a pickup truck to transport my welder and tools to his shop.  Why do we need to burn gas for a bike-geek activity!?  It seemed wrong.&lt;br /&gt;&lt;br /&gt;Sure, I could simply buy a trailer, but I don't really like trailers.  I had built a trailer back in my Virginia days, but I didn't like how it affected the feel of the ride.  The joint between the frame and the weight added an unsettling resonance to the ride, especially around corners.  I wanted a design that offeres a more rigid ride.&lt;br /&gt;&lt;br /&gt;The dutch have long ago perfected a design known as the &lt;a href="http://en.wikipedia.org/wiki/Freight_bicycle"&gt;Bakfiets&lt;/a&gt; ("box bike") for transporting cargo.  These literally are the SUVs of Holland; Dutch moms even use these to carry their children to school.  I thought about it, and the design seemed perfect for my needs.  In short, the design is a two-wheel bicycle, with a large cargo platform between a 20" front wheel and the steering column.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/npj/4783198418/" title="The front half, on Flickr"&gt;&lt;img style="float: left; margin-right: 1em;" src="http://farm5.static.flickr.com/4081/4783198418_dbcd7507a1_m.jpg" alt="IMG_4528" width="240" height="180" /&gt;&lt;/a&gt; I ran off to lowes and bought a lot of 1" square steel tubing.  The new steering column is made from 1-1/2" EMT conduit.  The headset, fork and wheel were scavenged from a child's huffy.  The cargo platform is made from two 1" tubes, one above the other, with 1/2" tubes supporting between them.&lt;br /&gt;I didn't really measure anything---I eyeballed everything.  I found out later that the angle between steering column and front half was important and incorrect.  I would need to correct this later.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/npj/4783198426/" title="Aligning the frame by nickjohnson, on Flickr"&gt;&lt;img style="float: right; margin-left: 1em;" src="http://farm5.static.flickr.com/4080/4783198426_5cb86c3cbb_m.jpg" alt="IMG_4529" width="240" height="180" /&gt;&lt;/a&gt;Next, my friend Hjalmar gave me a small, purple schwinn to serve as the rear half.  I cut-off the headset and mitered it to fit the steering column, and added another 1" square tube from the bottom bracket.  Alignment is important, but not critical.  So, I used a string to aid alignment.  I made a loop of string, joined by a rubber band for tension.  I wrapped this around the dropouts and the headset, then tapped the steering column left or right until it was centered between the two lengths of string.  Clamp, weld, and repeat until the frame is straight.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/npj/4783198480/" title="First iteration by nickjohnson, on Flickr"&gt;&lt;img style="float: left; margin-right: 1em;" src="http://farm5.static.flickr.com/4102/4783198480_33eebe6c09_m.jpg" alt="IMG_4543" width="240" height="180" /&gt;&lt;/a&gt;I achieved the steering using an offset arm.  An old fork was cut and extended with a piece of plumber's pipe so it would span the steering column.  At the end, I welded a bold at a 90-degree angle, and added a complementary bold on one tine of the fork.  I added a length of rebar, which connects to these two bolts using univeral (aka ball) joints.  I built it up, adding components and wheels, and took it for a test ride.&lt;br /&gt;&lt;br /&gt;Honestly, the first time I tried it, it rode like crap.  The bottom bracket was too low, and the pedals would strike the ground.  It felt very unstable, and the rider would tire very quickly.  But why?  I can't say I knew enough about bicycle geometry---was the slope of the front wheel incorrect? Was it misaligned?  I was lost.&lt;br /&gt;&lt;br /&gt;Luckily, my friend Joe figured it out for me.  I welded the front half to the steering column at a 90-degree angle, and the steering column met the top-tube at a 90-degree angle as well.  However, the purple schwinn had a rising top tube.  Effectively, the 90-degree angle caused the rear frame to tilt forward unnaturally and lowered the bottom bracket.  The solution was to change the angle.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/npj/4783210702/" title="Second Iteration by nickjohnson, on Flickr"&gt;&lt;img style="float: right; margin-left: 1em;" src="http://farm5.static.flickr.com/4114/4783210702_a6c0576bb9_m.jpg" alt="IMG_4575" width="240" height="180" /&gt;&lt;/a&gt;From what I had, the easiest solution was to cut just in front of the steering column, and then reattach at a more obtuse angle.  This raises the bottom bracket, moves it forward of the seet, gives a comfortable slope to the steering column, and leveled the cargo platform.  Indeed, this simple change made the bike much more comfortable.&lt;br /&gt;&lt;br /&gt;Per Zach's suggesting, I added a triangular piece from the steering column to the cargo platform, for strength.&lt;br /&gt;&lt;br /&gt;Next, I welded two 27"-long 1/2" square tubes perpendicular to the cargo platform.  These will help to support the platform.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/npj/4783210754/" title="Attaching the box by nickjohnson, on Flickr"&gt;&lt;img style="float: left; margin-right: 1em;" src="http://farm5.static.flickr.com/4098/4783210754_b10c27785d_m.jpg" alt="IMG_4583" width="240" height="180" /&gt;&lt;/a&gt;Once I had achieved a ridable frame, and could not forsee any major changes to geometry, I build a box out of scrap plywood I found in the dumpster.  These three boards rest against the frame.  I didn't have any hardware to attach the wood.  I searched my junk pile, and found some scrap copper sheets, leftover from some roofers.  I cut, bent, pierced these into brackets, and then screwed the frame tight against the frame.  Copper is expensive---if you were buying it, I'd recommend you use sheet tin or steel.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/npj/4783210852/" title="Done-ish by nickjohnson, on Flickr"&gt;&lt;img style="float: right; margin-left: 1em;" src="http://farm5.static.flickr.com/4074/4783210852_db63348316_m.jpg" alt="IMG_4586" width="240" height="180" /&gt;&lt;/a&gt;Now the bike is done-ish.  I can carry cargo.  The next few things I'll do are: add sides to the box, add cable stops so I can shift gears, and also strip it all down and paint it.  In the mean time, it's certainly strong enough to carry 8 bags of groceries, or a hundred-or-so pound of tools.  Success.&lt;br /&gt;&lt;br /&gt;But this is better than just a hack---this is a liberating technology.  I want a life without gasoline yet without sacrificing quality of life.  This machine gets me one step closer.&lt;br /&gt;The whole set of photos is on &lt;a href="http://www.flickr.com/photos/npj/sets/72157624470072104/"&gt;flickr&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-2738718097905383834?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0sAd9wwnzPHMqmiFM1D71qsqLpU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0sAd9wwnzPHMqmiFM1D71qsqLpU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0sAd9wwnzPHMqmiFM1D71qsqLpU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0sAd9wwnzPHMqmiFM1D71qsqLpU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/2738718097905383834/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=2738718097905383834" title="15 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/2738718097905383834?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/2738718097905383834?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2010/07/diy-bakfiets.html" title="DIY Bakfiets" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm5.static.flickr.com/4081/4783198418_dbcd7507a1_t.jpg" height="72" width="72" /><thr:total>15</thr:total></entry><entry gd:etag="W/&quot;CE8HRH89cSp7ImA9WxNQF0g.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-52382663440828795</id><published>2009-09-23T20:31:00.001-04:00</published><updated>2009-09-23T20:40:35.169-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-23T20:40:35.169-04:00</app:edited><title>If you can solve this one...</title><content type="html">&lt;a href="http://ubuntuforums.org/showthread.php?t=1273513"&gt;http://ubuntuforums.org/showthread.php?t=1273513&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'll give you a high-five.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-52382663440828795?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AHqTaghGnrq_YujDNCQpHnWgZ4Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AHqTaghGnrq_YujDNCQpHnWgZ4Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/AHqTaghGnrq_YujDNCQpHnWgZ4Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AHqTaghGnrq_YujDNCQpHnWgZ4Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/52382663440828795/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=52382663440828795" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/52382663440828795?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/52382663440828795?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2009/09/if-you-can-solve-this-one.html" title="If you can solve this one..." /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0cGQH05eSp7ImA9WxNRFUk.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-441461495788374581</id><published>2009-09-09T22:02:00.002-04:00</published><updated>2009-09-09T22:17:01.321-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-09T22:17:01.321-04:00</app:edited><title>Welcome Back to America:  Door-to-Door Christians</title><content type="html">So, I've been back in the country for a week now.  In some ways it's really nice to be here, and in others it's driving me crazy. In particular, I've have two visits from door-to-door Christians in as many days.&lt;br /&gt;&lt;br /&gt;The first visit came during the daytime, and I tried to politely refuse.  I even wished them a good afternoon.&lt;br /&gt;&lt;br /&gt;But tonight, they started banging on my door at 9pm, while I was in bed.  I tried to ignore them, but they banged again, making me think that my neighbors had some emergency.  So, I got up, opened the door, and a well-dressed young man proudly announced "Hi, we're Christians!"&lt;br /&gt;&lt;br /&gt;I slammed the door in their face.&lt;br /&gt;&lt;br /&gt;And although, in this second situation, I think that the solicitors were behaving obnoxiously, I still feel a need to explain why.  Certainly, they thought they were doing something good.  Let me express an alternate interpretation of the interaction.  When you come to my house and try to tell me about your religion, here is what I hear:&lt;br /&gt;&lt;blockquote&gt;"Hello, we don't really care what you believe because we are right and you are wrong.  Although popular culture has presented ample evidence that many people do not appreciate our presence, and although we should respect that you may have a different opinion, we chose to ignore what you believe and what you want, and to instead impose our will on you."&lt;/blockquote&gt;No matter how you sugar-coat it, it's as rude a statement as is possible.  I shouldn't have to post "no soliciting" to escape this.&lt;br /&gt;&lt;br /&gt;Just be glad I don't knock on your door to tell you how you're wrong.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-441461495788374581?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JvLcuzmNSwu9sMaeZNlFctEoeoE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JvLcuzmNSwu9sMaeZNlFctEoeoE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JvLcuzmNSwu9sMaeZNlFctEoeoE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JvLcuzmNSwu9sMaeZNlFctEoeoE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/441461495788374581/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=441461495788374581" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/441461495788374581?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/441461495788374581?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2009/09/welcome-back-to-america-door-to-door.html" title="Welcome Back to America:  Door-to-Door Christians" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0UFRXY8eCp7ImA9WxNRFUk.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-1126086837287633254</id><published>2009-08-24T10:36:00.005-04:00</published><updated>2009-09-09T22:20:14.870-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-09T22:20:14.870-04:00</app:edited><title>Excellent Quote: Chomsky on English Spelling</title><content type="html">&lt;blockquote &gt;conventional orthography is ... a near optimal system f&lt;span &gt;&lt;span &gt;or the lexical representation of English words.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span &gt;Chomsky, N. &amp;amp; Halle, M. (1968) &lt;i&gt;The Sound Pattern of English&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span &gt;Compare to Mark Twain&lt;/span&gt;&lt;span &gt;'s &lt;a href="http://www.mantex.co.uk/samples/spell.htm"&gt;"&lt;/a&gt;&lt;/span&gt;&lt;a href="http://www.mantex.co.uk/samples/spell.htm"&gt;&lt;span &gt;Spelling Reform: &lt;/span&gt;&lt;span&gt;A Plan for the Improvement of English Spelling,"&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;blockquote &gt;&lt;p&gt; Fainali, xen, aafte sam 20 iers ov orxogrefkl riform, wi wud hev a lojikl, kohirnt speling in ius xrewawt xe Ingliy-spiking werld. &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-1126086837287633254?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hkd__vMsIjkBVX6Gjeb9KS3bjmw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hkd__vMsIjkBVX6Gjeb9KS3bjmw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hkd__vMsIjkBVX6Gjeb9KS3bjmw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hkd__vMsIjkBVX6Gjeb9KS3bjmw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/1126086837287633254/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=1126086837287633254" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/1126086837287633254?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/1126086837287633254?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2009/08/excellent-quote-chomsky-on-english.html" title="Excellent Quote: Chomsky on English Spelling" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkYCSXo7fip7ImA9WxNTGUk.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-959506812326664473</id><published>2009-08-22T08:40:00.004-04:00</published><updated>2009-08-22T09:36:08.406-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-22T09:36:08.406-04:00</app:edited><title>One of my few Indian Victories: Cheap Tech Books.</title><content type="html">One of the most respected algorithm text books out there, &lt;a href="http://en.wikipedia.org/wiki/Introduction_to_Algorithms"&gt;Cormen et al's Introduction to Algorithms&lt;/a&gt; &lt;a href="http://www.amazon.com/Introduction-Algorithms-Second-Thomas-Cormen/dp/0262531968/ref=ed_oe_p"&gt;will cost you $62 from Amazon&lt;/a&gt; (2nd Ed, paperback).  On the other hand, I just bought it here for Rs 350 in India, brand new.  That's about $7 US.  Wonderful.  I may have to go back for &lt;a href="http://www-cs-staff.stanford.edu/%7Euno/taocp.html"&gt;TAOCP&lt;/a&gt; 1-3.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-959506812326664473?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tdYHoWJNgrXXt3kTNDRPR6klHbA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tdYHoWJNgrXXt3kTNDRPR6klHbA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tdYHoWJNgrXXt3kTNDRPR6klHbA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tdYHoWJNgrXXt3kTNDRPR6klHbA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/959506812326664473/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=959506812326664473" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/959506812326664473?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/959506812326664473?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2009/08/one-of-my-few-indian-victories-cheap.html" title="One of my few Indian Victories: Cheap Tech Books." /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0YNQ30_fCp7ImA9WxNTEEU.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-5729861895918007038</id><published>2009-08-12T10:56:00.002-04:00</published><updated>2009-08-12T10:59:52.344-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-12T10:59:52.344-04:00</app:edited><title>Excellent Quote: How programmers think</title><content type="html">I can't tell you how correct this passage is:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Most programmers above a certain level are very good at conceptualising large, complex systems. They can interrogate perceived weaknesses in a program before it is even written. This is how good programmers manage to write programs that are largely free of defects and that generally work in the way that is expected. Small-scale errors aside, a good high-level conceptual understanding of the system, coupled with an ability to mentally simulate the behaviour of any portion of a program provides programmers with most of the tools they need to construct good-quality programs. The programmer is likely to know (at least at some high level) how the entire system is going to work any any given moment.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;From Adventures in Programming Languages and Semantics, "&lt;a href="http://plsadventures.blogspot.com/2009/08/if-concurrency-is-easy-youre-either.html"&gt;If concurrency is easy, you're either absurdly smart or you're kidding yourself&lt;/a&gt;."  The full article is a good read.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-5729861895918007038?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/l60MYeRB6A70VNxeQVMzuX7O--c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/l60MYeRB6A70VNxeQVMzuX7O--c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/l60MYeRB6A70VNxeQVMzuX7O--c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/l60MYeRB6A70VNxeQVMzuX7O--c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/5729861895918007038/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=5729861895918007038" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/5729861895918007038?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/5729861895918007038?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2009/08/excellent-quote-how-programmers-think.html" title="Excellent Quote: How programmers think" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkcFQXY6fCp7ImA9WxJaFEw.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-8448312135267359829</id><published>2009-08-04T15:24:00.003-04:00</published><updated>2009-08-04T15:26:50.814-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-04T15:26:50.814-04:00</app:edited><title>Review and Analysis of C# Part 1: Partial Definitions are an Anti-pattern</title><content type="html">&lt;span style="font-size:100%;"&gt;I've had to use C# a lot at work recently.  Like everything else, I have &lt;/span&gt;very strong opinions about C#.  So, I've decided to write an N-part series reviewing, critisicing, and sometimes even praising its design.&lt;br /&gt;&lt;br /&gt;So, here's the first installment: Partial Definitions are an Anti-Pattern.&lt;br /&gt;&lt;br /&gt;C# introduces the partial keyword. In short, the partial keyword allows a programmer to partially define a class at several places. &lt;a href="http://msdn.microsoft.com/en-us/library/wa80x488.aspx"&gt;According to MSDN&lt;/a&gt;, the rationale for this feature is:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;When working on large projects, spreading a class over separate files enables multiple programmers to work on it at the same time.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;When working with automatically generated source, code can be added to the class without having to recreate the source file. Visual Studio uses this approach when it creates Windows Forms, Web service wrapper code, and so on. You can create code that uses these classes without having to modify the file created by Visual Studio.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;The first argument, holds no water. Yes, projects sometimes grow large, and often multiple programmers need to work on it concurrently. But, &lt;span style="font-weight: bold;"&gt;this problem is better handled by version control software&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;To make this argument, let me introduce the notion of a section of code. Let's say that a section a collection of lines of code such that a significant modification to any one requires modification to (or at least a critical evaluation of) the other lines within that section. For example, changing the type of a variable requires you to revisit each use of that variable. For example, changing an invariant of a class requires you to revisit all lines which assume that invariant. It's a loose definition, but all the programmers out there know what I'm talking about.&lt;br /&gt;&lt;br /&gt;Now suppose that two or more programmers are trying to modify some large class. At any given moment, either they work on the same sections of code, or they do not. If they work on different sections (which implies they are working on different lines), then &lt;a href="http://en.wikipedia.org/wiki/Version_control#Version_merging"&gt;common version control software will be able to automatically combine their efforts&lt;/a&gt;. On the other hand, if these two programmers are working on the same section of code, the programmers will need to coordinate their efforts---even if they are able to isolate their changes to disjoint lines of code or separate files. Said another way, &lt;span style="font-weight: bold;"&gt;the ability to split the class into two separate files does nothing to solve the original problem&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The second argument is no stronger. Suppose a code generator produces a large class definition. Further suppose that, across multiple runs of the code generator, much of the output is common. Why then, I ask, would the code generator repeatedly emit redundant code? Wouldn't it make more sense for the code generator to place the common code into a runtime library, or even a base class from which the situation specifics may derive? &lt;span style="font-weight: bold;"&gt;Just because it is a code generator, there is no excuse to emit code which ignores good software engineering practice&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;There may be efficiency concerns pushing towards this style of code generation output. It could be that there is a significant difference in run time. I argue that this is a symptom of a problem elsewhere in the software stack. If two different implementations differ only on a cosmetic level, but the compiler exhibits a drastic performance difference, then it is the compiler's responsibility to decrease that performance difference. In a high level language---and especially in the case of a language stack as complicated as the &lt;a href="http://en.wikipedia.org/wiki/Common_Language_Runtime"&gt;CLR&lt;/a&gt;---&lt;span style="font-weight: bold;"&gt;these kinds of implementation details should be below the programmer's cognitive radar.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have argued against the claimed benefits of partial classes, and I'll be happy to argue against any others that people suggest. Let me next argue that partial classes not only give no benefit, but that they also do harm.&lt;br /&gt;&lt;br /&gt;The primary goal of software engineering is to create software engineering best practices in which &lt;span style="font-weight: bold;"&gt;programmers can reason about software in a modular fashion&lt;/span&gt;. Classes, for instance, enable us to think about one algorithm at a time, and to ignore all of the other parts of the software. Imagine trying to prove that your implementation of a binary tree is correct if it depends upon the operation of your GUI? Yeah, that's ridiculous, and that's why we write modular programs.&lt;br /&gt;&lt;br /&gt;Now suppose that you have written a module so complicated---so multi-faceted---that you believe that some parts of its definition should be expressed separately from the rest. This suggests you believe (1) that your module expresses at least two different aspects of the problem, (2) that a programmer can reason about each independently, and (3) that any attempt to reason about them as a single unit will lead to unnecessary confusion. All of these are reasons to place the second aspect of your module into a separate module, not a separate file. In fact, many design patterns describe interfaces which tackle precisely this sort of fine-grained interaction among modules. &lt;span style="font-weight: bold;"&gt;The only reason to keep them in one module is programmer laziness&lt;/span&gt;. In this case, the partial feature enables the programmer to defer good design; he may get the code to work faster, but may cause headaches for all of the programmers who must maintain the code.&lt;br /&gt;&lt;br /&gt;Additionally, as a programmer, I find it valuable to see the entire definition of an algorithm (feel free to disagree; let me know why in the comments). I don't necessarily look at the entire definition, but I think it is critical to be able to find any code which contradicts my understanding of code. In this case, a single definition (or at least a single file) enables me to quickly gather all factors which contribute to the operation of an algorithm. From my experience with C#, &lt;span style="font-weight: bold;"&gt;partial class definitions make it harder to gather all factors&lt;/span&gt;, and make it difficult to be sure I have found all of them.&lt;br /&gt;&lt;br /&gt;Virtual methods might cause this problem as well. However, virtual methods are more restricted. First, they are marked virtual. Second, I know immediately where to find refinements of virtual methods: lower in the inheritance tree. Partial definitions have an arbitrary number of components---they can be anywhere provided they are combined at compile time.&lt;br /&gt;&lt;br /&gt;Some may counter that these arguments all suggest a feature-rich &lt;a href="http://en.wikipedia.org/wiki/Integrated_development_environment"&gt;integrated development environment&lt;/a&gt;. Sure. I'm in favor of good tools. But (1) I appreciate languages which don't require IDE support to read, because sometimes you read code on a website, a book, or other media, and (2) &lt;span style="font-weight: bold;"&gt;even the best of the best tools don't yet support this style of code browsing&lt;/span&gt;. I've been using Visual Studio 2008 at work, and it can't even list all of the subclasses of a base class for me! Enumerating all parts of a partial definition is equally challenging.&lt;br /&gt;&lt;br /&gt;My recommendation: avoid the partial keyword, and instead decompose your software into modules sensibly.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-8448312135267359829?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lP-rWHfPbtv6jpGy_UeOa2nUNtQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lP-rWHfPbtv6jpGy_UeOa2nUNtQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lP-rWHfPbtv6jpGy_UeOa2nUNtQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lP-rWHfPbtv6jpGy_UeOa2nUNtQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/8448312135267359829/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=8448312135267359829" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/8448312135267359829?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/8448312135267359829?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2009/08/review-and-analysis-of-c-part-1-partial.html" title="Review and Analysis of C# Part 1: Partial Definitions are an Anti-pattern" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DUMERHw5cCp7ImA9WxJXFEs.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-3213755933696060863</id><published>2009-06-08T08:52:00.002-04:00</published><updated>2009-06-08T09:23:25.228-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-08T09:23:25.228-04:00</app:edited><title>The Foreign Registration office in Bangalore</title><content type="html">As a foreigner, the government of India requires that I register with the police within a fortnight of my arrival in India.  I have no problem with this &lt;span style="font-style: italic;"&gt;conceptually&lt;/span&gt;; I believe in India's sovereignty, and I think it is within their rights.  However, the implementation of this policy leaves sucks.&lt;br /&gt;&lt;br /&gt;First of all, I admit that I don't speak Kannada, and I don't speak Hindi (or Tamil, Telugu, Assamese, or any of the twenty some official languages of India), but in my defense, I strongly doubt that the cumulative language coverage of the officers would accommodate every citizen of India, and thus the difficult of communications issue is mute.  Let me also qualify this by saying that my company has a liason team, whose mission is to try to make this process much easier for me.&lt;br /&gt;&lt;br /&gt;Nonetheless, I had to visit the foreign registration office (FRO) six times over the last week, and had to pay a $30 fee for late registration.&lt;br /&gt;&lt;br /&gt;(Visit 1) I arrive at the office, sign in, and am handed a bundle of forms.  I don't know why my liason team doesn't keep these forms on file.&lt;br /&gt;(Visit 2) Because of several work engagements, I couldn't start the process until 4:30pm.  The liason and I drive across town to a notary, and then back to the FRO office.  When we get within a block, he tells me to get out and run.  I walk in a 5:25pm, but the clerk swears it's 5:30, that there's nothing I can do, and that he doesn't care that I have to pay a $30 late fee.&lt;br /&gt;(Visit 3) I come back the next day, but I forgot my passport. D'oh&lt;br /&gt;(Visit 4) Later that day, they review my paperwork, highlighting several mundane details.  They hand me the signed form and tell me to go to the other counter.  There, they tell me to sit and wait.  Thirty minutes later, I ask why I'm waiting and he tells me to go back to the first counter.  There, they take my forms, hand me a receipt, and tell me to come the next evening.&lt;br /&gt;(Visit 5) I arrive the next evening, and hand them my receipts.  They tell me to go to the other counter, and the second counter tells me to wait.  Twenty minutes later, I ask why I'm waiting, and they tell me to go back to the first counter.  There, the man gives me a deposit slip, and asks me to take it to the bank down the street, where I must deposit $30.  When I return to the FRO, they give me a receipt and ask me to come back Monday.&lt;br /&gt;(Visit 6) I arrive, sign-in, and deposit my receipt.  He tells me to go to the other counter and ask for Ajita (sp?).  I do so, he looks at it for 30 minutes, then hands it back and tells me to go to the other counter.  Finally, I am a legal resident.&lt;br /&gt;&lt;br /&gt;The other interns have similarly horrifying stories; some were given business visas instead of employment visas; others were given student visas.  These people have a lot more work to do before they can be legally paid within India.&lt;br /&gt;&lt;br /&gt;I'll leave it as an exercise to the reader to replace the FRO office with 100 lines of code in the language of your choice.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-3213755933696060863?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/w7J886nvaVm3C1lNQriYPWCaYSo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/w7J886nvaVm3C1lNQriYPWCaYSo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/w7J886nvaVm3C1lNQriYPWCaYSo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/w7J886nvaVm3C1lNQriYPWCaYSo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/3213755933696060863/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=3213755933696060863" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/3213755933696060863?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/3213755933696060863?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2009/06/foreign-registration-office-in.html" title="The Foreign Registration office in Bangalore" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;CEAHQXg-fCp7ImA9WxJRGE4.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-8240690974248336196</id><published>2009-05-20T11:18:00.001-04:00</published><updated>2009-05-20T11:18:50.654-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-20T11:18:50.654-04:00</app:edited><title>I'm off to India</title><content type="html">I leave for India tonight!  I'll be back in September.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-8240690974248336196?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_BJ5n0JpuaNlbAWKyQfP8HUHRzA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_BJ5n0JpuaNlbAWKyQfP8HUHRzA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_BJ5n0JpuaNlbAWKyQfP8HUHRzA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_BJ5n0JpuaNlbAWKyQfP8HUHRzA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/8240690974248336196/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=8240690974248336196" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/8240690974248336196?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/8240690974248336196?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2009/05/im-off-to-india.html" title="I'm off to India" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;C0YHSHYyeip7ImA9WxJRF0U.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-8388865071377240196</id><published>2009-05-19T20:56:00.003-04:00</published><updated>2009-05-19T20:58:59.892-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-19T20:58:59.892-04:00</app:edited><title>Power Steering Fluid Pump, Mercedes-Benz 190E (W201)</title><content type="html">The girlfriend and I spent an hour trying to find the power steering fluid reservior on a Mercedez-Benz 190E (a.k.a. W201).  Even the internet didn't know.  We found it again, in hopes that the next guy finds it easy.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/npj/3547585764/" title="Power Steering Pump; Mercedes-Benz 190E (W201) by nickjohnson, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3346/3547585764_6f23ccd31f_m.jpg" alt="Power Steering Pump; Mercedes-Benz 190E (W201)" height="180" width="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is the power steering pump in a Mercedes-Benz 190E (a.k.a W201).  The top of the power steering pump is the power steering reservoir.&lt;br /&gt;&lt;br /&gt;Simply unscrew the black nut on top, and remove the lid.  You should extract the old  fluid using something like a turkey baster (which, of course, you should never use on food again).  Then fill it mostly to the top (owner's manual says 0.6L).&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-8388865071377240196?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/R9OmuoQ10HL9bjSmPZ4N9OtREYM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R9OmuoQ10HL9bjSmPZ4N9OtREYM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/R9OmuoQ10HL9bjSmPZ4N9OtREYM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R9OmuoQ10HL9bjSmPZ4N9OtREYM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/8388865071377240196/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=8388865071377240196" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/8388865071377240196?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/8388865071377240196?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2009/05/girlfriend-and-i-spent-hour-trying-to.html" title="Power Steering Fluid Pump, Mercedes-Benz 190E (W201)" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm4.static.flickr.com/3346/3547585764_6f23ccd31f_t.jpg" height="72" width="72" /><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;CkIMR349fSp7ImA9WxJRF0U.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-5415765667863157979</id><published>2009-05-19T20:40:00.002-04:00</published><updated>2009-05-19T20:49:46.065-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-19T20:49:46.065-04:00</app:edited><title>Good Quote: Le Corbusier</title><content type="html">&lt;blockquote&gt;... Man's stock of tools marks out the stages of civilization, the stone age, the bronze age, the iron age.  Tools are the result of successive improvement; the effort of all generations is embodied in them.  The too is the direct and immediate expression of progress; it gives man essential assistance and essential freedom also.  We throw the out-of-date tool on the scrap-heap: the carbine, the culverin, the growler and the old locomotive.  The action is a manifestation of health, of moral health, of morale also; it is not right that we should produce bad things because of a bad tool; nor is it right that we should waste our energy, our health and our courage because of a bad tool; it must be thrown away and replaced.&lt;/blockquote&gt;&lt;br /&gt;Le Corbusier&lt;br /&gt;in "Towards a New Architecture"&lt;br /&gt;Translated by Frederick Etchells&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-5415765667863157979?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YWVT276Z0Kfki6IVGJ28j0UihgQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YWVT276Z0Kfki6IVGJ28j0UihgQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YWVT276Z0Kfki6IVGJ28j0UihgQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YWVT276Z0Kfki6IVGJ28j0UihgQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/5415765667863157979/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=5415765667863157979" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/5415765667863157979?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/5415765667863157979?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2009/05/good-quote-le-corbusier.html" title="Good Quote: Le Corbusier" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUAMQXg5eyp7ImA9WxJTGUs.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-7873095006751989659</id><published>2009-04-28T21:12:00.001-04:00</published><updated>2009-04-28T21:16:20.623-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-28T21:16:20.623-04:00</app:edited><title>Cute typo: Turing Basin Park</title><content type="html">&lt;iframe marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=turing+basin+park&amp;amp;sll=40.328986,-74.653151&amp;amp;sspn=0.005734,0.013947&amp;amp;ie=UTF8&amp;amp;z=14&amp;amp;iwloc=A&amp;amp;ll=40.33732,-74.65004&amp;amp;output=embed" frameborder="0" height="350" scrolling="no" width="425"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;small&gt;&lt;a href="http://maps.google.com/maps?f=q&amp;amp;source=embed&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=turing+basin+park&amp;amp;sll=40.328986,-74.653151&amp;amp;sspn=0.005734,0.013947&amp;amp;ie=UTF8&amp;amp;z=14&amp;amp;iwloc=A&amp;amp;ll=40.33732,-74.65004" style="color: rgb(0, 0, 255); text-align: left;"&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;br /&gt;&lt;br /&gt;This is supposed to be "&lt;a href="http://www.princetontwp.org/delrar.html"&gt;Turning Basin Park&lt;/a&gt;," but apparently some geek over at google thought "&lt;a href="http://en.wikipedia.org/wiki/Alan_turing"&gt;Turing&lt;/a&gt;" would be more appropriate, given the proximity to Princeton.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-7873095006751989659?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LYYe4So_xyzfkfEvL8h3UccbjxM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LYYe4So_xyzfkfEvL8h3UccbjxM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LYYe4So_xyzfkfEvL8h3UccbjxM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LYYe4So_xyzfkfEvL8h3UccbjxM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/7873095006751989659/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=7873095006751989659" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/7873095006751989659?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/7873095006751989659?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2009/04/cute-typo-turing-basin-park.html" title="Cute typo: Turing Basin Park" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;CUUEQHs_fip7ImA9WxVUGUw.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-7766841383245181886</id><published>2009-03-24T12:34:00.002-04:00</published><updated>2009-03-24T12:46:41.546-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-24T12:46:41.546-04:00</app:edited><title>walk score -- measuring pedestrian friendlyness</title><content type="html">As I've mentioned before, I don't have a car, don't want one, and don't think that people should have an unquestioned right to drive a car.  I'm an urbanist, and I believe that people should be able to walk to all of their life's necessities, or in the worst case, ride a bike or public transportation.  Since I've moved to Princeton, one of my major complaints has been how inconvenient it is for someone without a car.&lt;br /&gt;&lt;br /&gt;Today, I discovered &lt;a href="http://www.walkscore.com/"&gt;WalkScore&lt;/a&gt; (via the Freakonomics Blog).  It is a google maps mash-up which tries to quantify how walkable an area is according to distance from common necessities, such as grocery stores and bars.  Very clever.  And for comparison:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.walkscore.com/get-score.php?street=douglas+avenue%2C+charlottesville%2C+va&amp;amp;go=Go"&gt;My old neighborhood in Charlottesville&lt;/a&gt;: 85/100 - very walkable&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.walkscore.com/get-score.php?street=dean+st+at+washington+ave%2C+brooklyn%2C+ny&amp;amp;go=Go"&gt;My old neighborhood in Brooklyn&lt;/a&gt;: 88/100 - very walkable&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.walkscore.com/get-score.php?street=king+st%2C+princeton%2C+nj&amp;amp;go=Go"&gt;My current neighborhood in Princeton&lt;/a&gt;: 29/100 - car-dependant&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.walkscore.com/get-score.php?street=washington+square+park%2C+new+york%2C+ny&amp;amp;go=Go"&gt;Washington Square Park, NYC&lt;/a&gt;: 100/100 - walker's paradise.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;It's nice to have some external validation on my opinion of Princeton ;)&lt;br /&gt;&lt;br /&gt;In all fairness to Princeton, if I were to live on &lt;a href="http://www.walkscore.com/get-score.php?street=witherspoon+st+at+spring+st%2C+princeton%2C+nj&amp;amp;go=Go"&gt;Witherspoon at Spring St&lt;/a&gt;, I'd live in Walker's Paradise 95/100, but what grad student can afford that?&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-7766841383245181886?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bZ-6uDhx03VZCfmbNZKr6GgZ_yg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bZ-6uDhx03VZCfmbNZKr6GgZ_yg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bZ-6uDhx03VZCfmbNZKr6GgZ_yg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bZ-6uDhx03VZCfmbNZKr6GgZ_yg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/7766841383245181886/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=7766841383245181886" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/7766841383245181886?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/7766841383245181886?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2009/03/walk-score-measuring-pedestrian.html" title="walk score -- measuring pedestrian friendlyness" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>5</thr:total></entry><entry gd:etag="W/&quot;DUMGRHgycCp7ImA9WxVUFUw.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-7264252047929756382</id><published>2009-03-19T22:49:00.001-04:00</published><updated>2009-03-19T22:50:25.698-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-19T22:50:25.698-04:00</app:edited><title>Melting metal in the backyard</title><content type="html">&lt;object type="application/x-shockwave-flash" data="http://www.flickr.com/apps/video/stewart.swf?v=68975" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" height="226" width="400"&gt; &lt;param name="flashvars" value="intl_lang=en-us&amp;amp;photo_secret=07964178cc&amp;amp;photo_id=3369549902"&gt; &lt;param name="movie" value="http://www.flickr.com/apps/video/stewart.swf?v=68975"&gt; &lt;param name="bgcolor" value="#000000"&gt; &lt;param name="allowFullScreen" value="true"&gt;&lt;embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/video/stewart.swf?v=68975" bgcolor="#000000" allowfullscreen="true" flashvars="intl_lang=en-us&amp;amp;photo_secret=07964178cc&amp;amp;photo_id=3369549902" height="226" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;a style="left: 0px ! important; top: 15px ! important;" title="Click here to block this object with Adblock Plus" class="rabxmcwcqfpqpwmfakzp visible" href="http://www.flickr.com/apps/video/stewart.swf?v=68975"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://makeprinceton.wordpress.com/2009/03/20/meeting-recap-metal-casting/"&gt;Read more a the MAKE:Princeton blog.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-7264252047929756382?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qNgg6-CDQ1YiyWqWOMJlRc9svJc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qNgg6-CDQ1YiyWqWOMJlRc9svJc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qNgg6-CDQ1YiyWqWOMJlRc9svJc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qNgg6-CDQ1YiyWqWOMJlRc9svJc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/7264252047929756382/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=7264252047929756382" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/7264252047929756382?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/7264252047929756382?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2009/03/melting-metal-in-backyard.html" title="Melting metal in the backyard" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0AFR3g5cCp7ImA9WxVVEko.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-5997947688881633476</id><published>2009-03-05T12:40:00.003-05:00</published><updated>2009-03-05T14:01:56.628-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-05T14:01:56.628-05:00</app:edited><title>Bjarne Stroustrup is so metal!</title><content type="html">&lt;a href="http://www.flickr.com/photos/npj/3331346238/" title="Bjarne Stroustrup is so metal! by nickjohnson, on Flickr"&gt;&lt;img style="margin: 1ex; float: left;" src="http://farm4.static.flickr.com/3618/3331346238_1ef40a4ed6_m.jpg" alt="Bjarne Stroustrup is so metal!" height="180" width="240" /&gt;&lt;/a&gt;On Wednesday, &lt;a href="http://en.wikipedia.org/wiki/Bjarne_Stroustrup"&gt;Bjarne Stroustrup&lt;/a&gt; made a visit to Princeton, and &lt;a href="http://liberty.princeton.edu/"&gt;the Liberty Research Group&lt;/a&gt; scheduled a private meeting with him before his colloquium.  We spent a little over an hour discussing the &lt;a href="http://en.wikipedia.org/wiki/C%2B%2B0x"&gt;C++0x&lt;/a&gt; and the future of C++.  Overall, Bjarne is a cool guy, and I had an excellent time talking with him.&lt;br /&gt;&lt;br /&gt;The wikipedia article about C++0x is painfully out of date.  Bjarne mentioned some upcoming features that are hardly mentioned, if at all.  Of these, the ones which took my interest the most were &lt;span style="font-style: italic;"&gt;Concepts&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;Axioms&lt;/span&gt;, and the future of static typing in C++.&lt;br /&gt;&lt;br /&gt;I'll disclaim that I haven't read any C++0x standardization documents, not even drafts, so take everything here as a grain of salt.  These are simply my take-away points from the talk.&lt;br /&gt;&lt;br /&gt;Bjarne is concerned that the template feature of C++ does not allow programmers to sufficiently constrain template parameters.  For instance, a sort algorithm may be implemented to operate on a random-access iterator.  However, recall that iterators in the C++ STL do not share a common inheritance (and there are fair arguments that they shouldn't).  C++ templates cannot capture the notion that one of its formals must be a iterator-like type, and so specializing the template against, say a string, will likely yield hundreds of uninformative type errors instead of a simple error stating that we expect an iterator.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;One solution to this problem would be to create base iterator classes in order to ensure an interface (this is the approach taken by Java, for instance).  However, one could argue that this is an inappropriate use of inheritance---it's not code re-use, and although we give many concepts the name &lt;span style="font-style: italic;"&gt;iterator&lt;/span&gt;, they really have little in common.&lt;br /&gt;&lt;br /&gt;Some languages use a notion of &lt;a href="http://en.wikipedia.org/wiki/Structural_typing"&gt;structural equivalence &lt;/a&gt;(or, less formally, duck typing) to capture these constraints.  I think this is the appropriate technique.  The earlier example of a sorting algorithm simply requires &lt;span style="font-style: italic;"&gt;some&lt;/span&gt; object which can provide random access to a data structure, and the most direct test for compatibility is whether the interface is a satisfied.  In C++0x, &lt;span style="font-style: italic;"&gt;Concepts&lt;/span&gt; are an implementation of structural equivalence (from the high-level, language view).  In the low-level view, concepts are a special case of templating, and produce multiple implementations of the same code according to the specific type.&lt;br /&gt;&lt;br /&gt;In a C++0x Concept, one can specify the methods which must be supported.  For instance, one may have a Concept named &lt;a href="http://en.wikipedia.org/wiki/Total_order"&gt;TotalOrder&lt;/a&gt;, which must support a less-than-or-equal-to operator.  Many types satisfy the TotalOrder concept, such as int, double, std::string, yet they are not required to have a common ancestor.  In this sense, a concept allows you to communicate many of the traits to a type, without paying the penalty of multiple inheritance.&lt;br /&gt;&lt;br /&gt;But Concepts get cooler.  Although I describe them as a mechanism for structural equivalence in C++, they can also be viewed as &lt;span style="font-style: italic;"&gt;mixins&lt;/span&gt;, since they allow a programmer to specify a default implementation for many methods.  With the prior example of TotalOrder, one could also add default implementations of greater-than, equal-to, etc, operators as functions of less-than-or-equal-to.  In this way, it becomes very easy for programmers to bootstrap support for all operators while writing minimal code.&lt;br /&gt;&lt;br /&gt;Suppose that I implement some class that satisfies TotalOrder.   This information simply means that my class supports comparison operators.  One wonders, however, if these operations actually behave as a total order.   As a counter example, I could write a random number generator  to  produce the result of the less-than-or-equal-to comparison---can a language be made to disallow this?  Or, can a compiler be taught to rely upon deeper qualities of total orders, without having a special case for total orders?&lt;br /&gt;&lt;br /&gt;Axioms allow the programmer to specify additional qualities of operations that transcend simple typing.  For instance, one could write axioms that signify that the less-than-or-equal-to relation is transitive, or that it is always the logical inverse of the greater-than relation.  With axioms, we can state that a sort algorithm not only requires a random-access-iterator, but also that there is a total order of the elements which satisfies transitivity.  The use of concepts and axioms allows us to specify &lt;span style="font-style: italic;"&gt;all&lt;/span&gt; of the constraints of the sort algorithm.&lt;br /&gt;&lt;br /&gt;But how can the compiler use axioms?  It is unlikely that any compiler will ever be able to verify that the listed axioms are true for a given implementation.  Instead, axioms will provide additional transformations to the compiler's arsenal of optimizations.  With support for axioms, many compiler optimizations including &lt;a href="http://en.wikipedia.org/wiki/Constant_folding"&gt;constant-folding&lt;/a&gt; (especially with associativity), &lt;a href="http://en.wikipedia.org/wiki/Strength_reduction"&gt;reduction in strength&lt;/a&gt;, and &lt;a href="http://en.wikipedia.org/wiki/Common_subexpression_elimination"&gt;common-subexpression elimination&lt;/a&gt; can be lifted from the compiler and expressed at the language level.  I think this is really cool.&lt;br /&gt;&lt;br /&gt;I think the notion of concepts and axioms struck home with me because they resemble some of my thinking on one of my side projects.  I've been working on a language for years now (never enough time, alas!) in which I plan to feature structural equivalence in typing for reasons similar to those outlined by Bjarne.  The axioms are a natural extension which I now realize I would like to support as well.&lt;br /&gt;&lt;br /&gt;Finally, before the meeting was over, I had to ask a question about type safety.  Throughout his book &lt;span style="font-style: italic;"&gt;The Design and Evolution of C++&lt;/span&gt;, Bjarne laments the type (un)safety of C.  Repeatedly, and with each new language feature, he attempts to make C++ more typesafe, but is repeatedly foiled by inherited features such as void pointers and unrestricted casting.  So, I asked: &lt;span style="font-style: italic;"&gt;are you ever going to take the plunge and drop support for pointers in C++?&lt;/span&gt;  His answer was intelligent, and showed a great understanding of not simply the technical considerations of C++, but also the political considerations.&lt;br /&gt;&lt;br /&gt;Mr. Stroustrup suggested that he hopes to add more and more features to C++ until type-safe alternatives are available for each and every unsafe aspect of C++.  Once that has happened, he hopes to define a safe subset of C++.  At that point, all existing C++ tools could be given a flag to provide warnings of unsafe features.  This safe sub-C++ will immediately have rich toolchain support, but will be able to provide strong guarantees, such as those provided by ML.  Excellent plan.&lt;br /&gt;&lt;br /&gt;Bjarne is a very interesting person indeed; I recommend you talk with him if you ever have the chance.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-5997947688881633476?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/baeYx4c3y566DF-lQ9p1rqKSNw4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/baeYx4c3y566DF-lQ9p1rqKSNw4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/baeYx4c3y566DF-lQ9p1rqKSNw4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/baeYx4c3y566DF-lQ9p1rqKSNw4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/5997947688881633476/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=5997947688881633476" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/5997947688881633476?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/5997947688881633476?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2009/03/bjarne-stroustrup-is-so-metal.html" title="Bjarne Stroustrup is so metal!" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm4.static.flickr.com/3618/3331346238_1ef40a4ed6_t.jpg" height="72" width="72" /><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;Ck8BQn49fip7ImA9WxVWGU4.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-1774119290726200080</id><published>2009-03-01T13:02:00.003-05:00</published><updated>2009-03-01T13:07:33.066-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-01T13:07:33.066-05:00</app:edited><title>A quick thought...</title><content type="html">The other day, Daya and I rode our bikes to the local grocer to buy some groceries.  At the checkout line, we stuffed our groceries into our bags, when the teller asked, "Did you guys ride your bikes here?"&lt;br /&gt;&lt;br /&gt;"Yes," I responded, "How else does one buy groceries?"&lt;br /&gt;&lt;br /&gt;She deducted a dollar from our total, and told us the store offers a ride your bike discount.  The guy in line behind us muttered something to the effect of "I'm glad you're doing your part."&lt;br /&gt;&lt;br /&gt;It's at times like these that I want to say "No!  I'm not being a responsible person; rather, you are being irresponsible!"  Honestly, I think they should add a fee for driving to the grocer, perhaps charge for parking, or make you wear an "I hate the environment" shirt.&lt;br /&gt;&lt;br /&gt;But, I bit my tongue.&lt;br /&gt;&lt;br /&gt;On an unrelated note, &lt;a href="http://en.wikipedia.org/wiki/Bjarne_Stroustrup"&gt;Bjarne Stroustrup&lt;/a&gt; is visiting Princeton CS on the 4th for a 4:15 colloquium.  If you're in the area, you should check it out.  It will be packed.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-1774119290726200080?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AcdAvNmwBsfdmYCFmUcI25U5CzA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AcdAvNmwBsfdmYCFmUcI25U5CzA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/AcdAvNmwBsfdmYCFmUcI25U5CzA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AcdAvNmwBsfdmYCFmUcI25U5CzA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/1774119290726200080/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=1774119290726200080" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/1774119290726200080?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/1774119290726200080?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2009/03/quick-thought.html" title="A quick thought..." /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;CUYNRHw_fyp7ImA9WxVQGUg.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-8308798272672375008</id><published>2009-02-06T12:08:00.010-05:00</published><updated>2009-02-06T15:46:35.247-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-06T15:46:35.247-05:00</app:edited><title>Failed reasoning by an Ivy League Grad Student; Engineering and Approximation</title><content type="html">Let me babble for a little bit...&lt;br /&gt;&lt;br /&gt;There was an extended power failure in Princeton last night---for two hours, all three power inlets to the boro went down, and so all the uninterruptible power supplies drove themselves dead.  While the CS department's servers were hooked up to a secondary generator, the servers for my research group went down.&lt;br /&gt;&lt;br /&gt;After power was restored, our machines booted back up, but in the incorrect order.  One of the other students in the group had to go visit them to remount NFS partitions, make sure they all came back up, etc, etc.&lt;br /&gt;&lt;br /&gt;While he was down there, he observed a chirping noise.  Looking around underneath tables and racks, he found the culprit: an uninterruptible power supply that wasn't plugged into the wall, and had nothing plugged into it.  Judging by its position, he decided that this was a power supply for a server that had been of commission for at least a decade.  He reasoned that it took about ten years for the minute inefficiencies in this UPS to drain the battery.&lt;br /&gt;&lt;br /&gt;But, the damned thing was still chirping.  Looking around, he couldn't find a free plug, and so he couldn't restore power to the UPS.  "How can I make this stop chirping?" he asked himself.&lt;br /&gt;&lt;br /&gt;His solution amazes me: &lt;span style="font-weight: bold;"&gt;he plugged the UPS into itself.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, clearly, &lt;a href="http://en.wikipedia.org/wiki/Second_law_of_thermodynamics"&gt;the UPS isn't going to charge&lt;/a&gt;, and he doesn't dispute that.  He argued, however, that this should be enough to fool the UPS into thinking that it was charging.  In other words, he conjectured that the UPS chirps iff it does not have wall power; he was wrong, because he assumed the UPS engineers had made an approximation they had not.  In actuality, the UPS continued to chirp.  This is because the UPS chirps iff there is a negative change in the charge of the battery.  It takes some time to measure this change, and this is why UPSes will chirp for a short while after you plug them back in.&lt;br /&gt;&lt;br /&gt;Why do I bring this up?  Because it allows for an interesting analysis of approximation, and maybe we can pull out some principles of design.  &lt;span style="font-style: italic;"&gt;What semantics does the chirp noise carry?&lt;/span&gt;  The chirp noise should denote battery discharge.  Under the assumption that the UPS can always charge the battery as fast as it is discharged when plugged in, the UPS would stop chirping when plugged in.  The question is: &lt;span style="font-style: italic;"&gt;do you want to measure the real scenario, or can you get away with measuring symptoms of the scenario?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Engineering is the fine art of approximation.  Approximation is so ingrained into our reasoning that we have mathematical operators to describe it: x &amp;lt;&amp;lt; y means x is &lt;span style="font-style: italic;"&gt;significantly&lt;/span&gt; smaller than y; x -&amp;gt; y means that as the value of x comes &lt;span style="font-style: italic;"&gt;arbitrarily&lt;/span&gt; close to y; epsilon denotes an &lt;span style="font-style: italic;"&gt;arbitrarily&lt;/span&gt; small number; we say a function f is O(g(x)) to mean that as x gets &lt;span style="font-style: italic;"&gt;arbitrarily&lt;/span&gt; large f(x) is bounded by &lt;span style="font-style: italic;"&gt;some&lt;/span&gt; constant times g(x).  The meanings of &lt;span style="font-style: italic;"&gt;significant&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;arbitrary&lt;/span&gt;, and &lt;span style="font-style: italic;"&gt;some&lt;/span&gt; vary wildly by situation.&lt;br /&gt;&lt;br /&gt;Engineers make jokes about it too: a horse is a sphere if it makes the numbers easier; 2+2==5 for very large values of 2.  Approximation is critical, but only where appropriate.&lt;br /&gt;&lt;br /&gt;In the UPS example, the charge of the battery can be measured more or less directly.  In many other circumstances, the real scenario is hard to measure, but symptoms of it are easily measured, and an approximation can be computed from those measurements.  A couple examples come to mind:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You use a compass to find North, but it actually tells you the direction to something that is mostly north of you and very far away.  Sailors have shown that for navigation within a few hundred miles, this is perfectly sufficient.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It is difficult for a robot to measure its exact position in a room, but it can easily measure how much each of its wheels has moved and then deduce its relative position via dead reckoning.  For short distances, the error of this approach is negligible.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;People say you should change your oil every six months or 6,000 miles.  In reality, it's a question of the quality of the oil (how much crud has accumulated?), not how long or how far you've used it.  Oil is cheap and engines are expensive, so this method is successful.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;When structural engineers design a building, they use a &lt;span style="font-style: italic;"&gt;safety factor&lt;/span&gt;---building every piece &lt;span style="font-style: italic;"&gt;n&lt;/span&gt; times as strong as need be---to account for variation in manufacturing, material aging, and unforeseeable events.  Steel is cheap and wrongful-death lawsuits are expensive, so this method is successful.&lt;/li&gt;&lt;li&gt;Software engineering preaches: it's more important that the software works than that it works efficiently; instead of writing in machine code, we use high level languages that favor programmer time over execution time.  Programmer time is expensive, but faster computers are cheap, so this method is successful.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;So, next time you design something, take another look at the approximations you are making.  More importantly, look for approximations that you are not yet making.  So long as you are conservative enough to ensure your approximations are right enough, they can save you a lot of effort.&lt;br /&gt;&lt;br /&gt;Maybe your robot can't read GPS, but there are other ways it can geolocate.  Maybe your software cannot successfully identify some event, but if it can be right more often than not, it can pass the final say onto a human operator.  Possibilities are endless.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-8308798272672375008?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AqcXciBJa-H5pDvl1gqcl-w-sA8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AqcXciBJa-H5pDvl1gqcl-w-sA8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/AqcXciBJa-H5pDvl1gqcl-w-sA8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AqcXciBJa-H5pDvl1gqcl-w-sA8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/8308798272672375008/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=8308798272672375008" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/8308798272672375008?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/8308798272672375008?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2009/02/failed-reasoning-by-ivy-league-grad.html" title="Failed reasoning by an Ivy League Grad Student; Engineering and Approximation" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DUQFQXw9fyp7ImA9WxVQFUw.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-8084027802031408491</id><published>2009-02-01T14:27:00.004-05:00</published><updated>2009-02-01T14:41:50.267-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-01T14:41:50.267-05:00</app:edited><title>Proposal for a future Interstate Rail Network</title><content type="html">From &lt;a href="http://thetransportpolitic.wordpress.com/2009/02/01/a-future-interstate-rail-network-redux/"&gt;The Transport Politic&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://thetransportpolitic.files.wordpress.com/2009/01/rail-network8.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 312px; height: 200px;" src="http://thetransportpolitic.files.wordpress.com/2009/01/rail-network8.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The transport politic blog has run the numbers and made a proposal for a high-speed train network for the United States.  I think they've done an incredible job, and so I want to mention them here.  Their plan is based upon a few pillars:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;This network would be funded 50--90% by the Fed; compare to roads and highways that are funded 80--90% by the Fed.&lt;/li&gt;&lt;li&gt;This funding would be part of the expected economic stimulus plans.  In this respect, it sounds to me like a big WPA project instead of a bailout.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A new national authority (which they call NatTrack) will be responsible for acquiring land, building and maintaining tracks, and renting those tracks to service providers such as Amtrak.&lt;/li&gt;&lt;li&gt;They identify the ideal route as one that is (a) shorter than 500 miles, and (b) between two population centers of 100,000 or more.  These numbers were chosen as they [a] typically beat an airplane in overall travel time, and [b] have enough potential customers to maintain the route.&lt;/li&gt;&lt;li&gt;The main network features high-speed (150 mph) trains; this is supplemented by low-speed (70--120 mph).&lt;/li&gt;&lt;li&gt;Their route choices were computed mathematically, under some well-defined assumptions.  At the end of the article, they give numeric scores for each route to justify their choices.&lt;/li&gt;&lt;/ol&gt;Again, this is excellent work.  &lt;a href="http://thetransportpolitic.wordpress.com/2009/02/01/a-future-interstate-rail-network-redux/"&gt;I encourage you to read their article&lt;/a&gt;.  I hope this has a chance.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-8084027802031408491?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xpFJbwhX-NPwUEUREZRBHYPGeEw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xpFJbwhX-NPwUEUREZRBHYPGeEw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xpFJbwhX-NPwUEUREZRBHYPGeEw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xpFJbwhX-NPwUEUREZRBHYPGeEw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/8084027802031408491/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=8084027802031408491" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/8084027802031408491?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/8084027802031408491?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2009/02/proposal-for-future-interstate-rail.html" title="Proposal for a future Interstate Rail Network" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;C0ENSX8yfCp7ImA9WxVQFk4.&quot;"><id>tag:blogger.com,1999:blog-6181310435977891397.post-2025909931661499502</id><published>2009-02-01T11:51:00.004-05:00</published><updated>2009-02-02T22:28:18.194-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-02T22:28:18.194-05:00</app:edited><title>Update to pipemiter.rb</title><content type="html">Last week I wrote about &lt;a href="http://www.cheaphack.net/2009/01/easily-miter-tubes.html"&gt;a simple script to miter pipes&lt;/a&gt;.  As soon as I wrote it, I realized about a hundred ways it could be improved, and about a hundred new ways it could be used.&lt;br /&gt;&lt;br /&gt;My first observation was that the old version would fail if the cutting template was too large to fit on one page.  To solve this, I added pagination support---the image will be split across multiple pages, and alignment marks will be drawn at each corner so they can be stitched back together.&lt;br /&gt;&lt;br /&gt;Next, I noticed that &lt;span style="font-style: italic;"&gt;real&lt;/span&gt; pipes have some thickness, i.e. the inner diameter might be significantly smaller than the outer diameter.  As a result, you can now specify an inner diameter, and it will draw a gray curve alongside the black curve of the outer diameter.  This can make it easier to miter thick tubes.&lt;br /&gt;&lt;br /&gt;Also, I realized that one often wants to miter several tubes against one.  In this case, you don't just measure how to cut the smaller tubes, but also where the smaller tubes meet the larger one.  For this reason, the software will now draw a guide for the large tube as well.&lt;br /&gt;&lt;br /&gt;Beyond that, there are numerous little changes to make it easier to use or more fool-proof.&lt;br /&gt;&lt;br /&gt;The script is now in three files:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.cs.princeton.edu/%7Enpjohnso/pipemiter2.rb"&gt;pipemiter2.rb&lt;/a&gt; - the main executable,&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cs.princeton.edu/%7Enpjohnso/units.rb"&gt;units.rb&lt;/a&gt; - handles unit conversion in a not-too-painful way, and&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cs.princeton.edu/%7Enpjohnso/postscript.rb"&gt;postscript.rb&lt;/a&gt; - a library for drawing postscript images.&lt;/li&gt;&lt;/ol&gt;Save all of these files to some directory.  Like before, we can either invoke this program from the command line, or in interactive mode.&lt;br /&gt;&lt;br /&gt;You specify a pipe scenario as a single &lt;span style="font-style: italic;"&gt;center pipe&lt;/span&gt; (i.e. the one that doesn't get mitered), and one or more &lt;span style="font-style: italic;"&gt;radial pipes&lt;/span&gt; (i.e. the ones that get cut to fit the center pipe).  The center pipe is simply specified as its diameter (or equivalently, its circumference or radius).  Each radial pipe is specified as 3-D polar coordinates relative to the center pipe.  The characteristics of the radial pipes are:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Its (outer) diameter (or equivalently, it's circumference or radius);&lt;/li&gt;&lt;li&gt;Optionally, its (inner) diameter;&lt;/li&gt;&lt;li&gt;Its latitude, i.e. the angle at which it meets the center pipe, where a latitude of 0 means along the equator, and a latitude of +/- 90 means at the north or south pole;&lt;/li&gt;&lt;li&gt;Its longitude, i.e. the angle &lt;span style="font-style: italic;"&gt;around&lt;/span&gt; the center pipe, which defaults to 0; and&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Its projection, i.e. placement along the length of the center pipe.&lt;/li&gt;&lt;/ol&gt;That can be complicated, so lets go through a few examples.  I'm going to write these examples in command line format, but if you don't specify any command line arguments it will go into interactive mode.&lt;br /&gt;&lt;br /&gt;First, the example from &lt;a href="http://www.cheaphack.net/2009/01/easily-miter-tubes.html"&gt;my previous post&lt;/a&gt;:  two toilet paper rolls (1.75" diameter) meet at a 30-degree angle.  All I need to specify is the center  pipe, and the diameter and latitude for the radial pipe:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;$ ./pipemiter2.rb 1.75 1.75 30 &gt;&lt;/span&gt;&lt;a href="http://www.cs.princeton.edu/%7Enpjohnso/eg1.ps"&gt;&lt;span style="font-family:courier new;"&gt;eg1.ps&lt;/span&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Notice &lt;a href="http://www.cs.princeton.edu/%7Enpjohnso/eg1.ps"&gt;the output&lt;/a&gt; is more elaborate than last time.  In particular, it's now a two page document.  The first page shows the cutting profile, and then second page shows the profile on the pipe that you don't cut.&lt;br /&gt;&lt;br /&gt;Let's try something more complicated.  Suppose you wanted to build a sort of tripod-like thing.  You have a center pipe 9-inch in circumference, and you have three 2-inch-diameter &lt;span style="font-style: italic;"&gt;radial pipes&lt;/span&gt;.  Each radial pipe meets the center pipe at a 60 degree angle, and each is evenly spaced along the circumference of the center pipe.  Then you could type something like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;$ ./pipemiter2.rb 9in-circ and 2in 60 and 2 60 by 120 and 2 60 by 240 &gt;&lt;/span&gt;&lt;a style="font-family: courier new;" href="http://www.cs.princeton.edu/%7Enpjohnso/eg2.ps"&gt;eg2.ps&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are a few things to note about this line.  First, it specifies the center pipe (&lt;span style="font-style: italic;"&gt;9in-circ&lt;/span&gt;).  Next, it specified the three radial pipes: &lt;span style="font-style: italic;"&gt;2in 60 by x&lt;/span&gt;.  The word &lt;span style="font-style: italic;"&gt;and&lt;/span&gt; goes between each pipe specification, but is completely optional.  Each pipe is specified as its diameter (&lt;span style="font-style: italic;"&gt;2in&lt;/span&gt;), it's latitude (&lt;span style="font-style: italic;"&gt;60&lt;/span&gt;), and its longitude (&lt;span style="font-style: italic;"&gt;by 120&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;by 240&lt;/span&gt;, etc).  &lt;a href="http://www.cs.princeton.edu/%7Enpjohnso/eg2.ps"&gt;The output file&lt;/a&gt; has four pages---a cutting template for each of the radial pipes, and then an alignment template for the center pipe.&lt;br /&gt;&lt;br /&gt;So what's up with the units?  Units are optional, though I often write them for clarity's sake.  Diameter units default to inches, but could also be mm-circ (millimeters of circumference), cm-rad (centimeters of radius), ft (feet), etc.  Length units default to inches, but could also be mm, cm, m, ft, etc.  Angle units default to degrees, but could also be radians.  Once you use a {length, diameter, angle} unit once, all future {length, diameter, angle} units default to that unit, just to save some typing.  When in doubt, type the units.&lt;br /&gt;&lt;br /&gt;So far, we've explained units, diameters, longitude, and latitude.  What about projection and inner diameter?  Notice that, in the previous example, the center points of each radial pipe all lined up along the equator of the center pipe.  The projection parameter moves the center points up or down the length of the center pipe relative to the equator.&lt;br /&gt;&lt;br /&gt;For example, suppose you have a center pipe of 9-inch-circumference, and want to attach five 1-inch-diameter radial pipes to it.   Each of the radial pipes has an inner diameter of 0.5-inches.  Next, suppose that the pipes should be connected at 60, 30, 0, -30, and -60 degrees, and that there should have a projection of +0.4-inch, +0.2-inch, 0-inch, -0.2-inch and -0.4-inch, respectively.  Enter the command,&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;$ ./pipemiter2.rb 9in-circ \&lt;br /&gt;and 1in id 0.5 60 by 0 up .4 \&lt;br /&gt;and 1 id .5 30 by 72 up .2 \&lt;br /&gt;and 1 id .5 0 by 144 \&lt;br /&gt;and 1 id .5 -30 by 216 down .2 \&lt;br /&gt;and 1 id .5 -60 by 288 down .4 \&lt;br /&gt;&gt;&lt;a href="http://www.cs.princeton.edu/%7Enpjohnso/eg3.ps"&gt;eg3.ps&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The backslash character tells your shell that the command will span multiple lines.  For each of the radial pipes, I use the &lt;span style="font-style: italic;"&gt;id .5&lt;/span&gt; command to specify the inner diameter of the pipe.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/npj/3244133055/" title="Example of pipe mitering, template by nickjohnson, on Flickr"&gt;&lt;img style="margin: 1em; float: right;" src="http://farm4.static.flickr.com/3522/3244133055_20ebf1db0d_m.jpg" alt="Example of pipe mitering, template" height="180" width="240" /&gt;&lt;/a&gt;&lt;br /&gt;When you look at &lt;a href="http://www.cs.princeton.edu/%7Enpjohnso/eg3.ps"&gt;the output&lt;/a&gt;, you see that each cutting profile additionally has a gray curve.   This gray curve is the shape of the miter along the inner diameter of the pipe---it gives you a few more hints of how to grind the pipes to meet perfectly.  Also note how, on the sixth page, the inner diameter is drawn on the alignment guide.  The projection is specified using &lt;span style="font-style: italic;"&gt;up .2&lt;/span&gt; or &lt;span style="font-style: italic;"&gt;down .4&lt;/span&gt;, and causes the center of each pipe to move up or down the length of the center pipe on the alignment guide.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/npj/3244959506/" title="Example of pipe mitering by nickjohnson, on Flickr"&gt;&lt;img style="margin: 1em; float: left;" src="http://farm4.static.flickr.com/3099/3244959506_cdd42812cd_m.jpg" alt="Example of pipe mitering" height="240" width="180" /&gt;&lt;/a&gt;In case your wondering, that last example looks like this and this.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And that's it.  Now you can specify the many-pipes-meet-one scenario, and have cutting and alignment guides automatically generated.  This can make mitering pipes much easier for you.&lt;br /&gt;&lt;br /&gt;Also of note is that this is not limited to mitering pipes.  I've realized that it can be used to make paper/cardboard models, and that those models can be used as molds for plaster or concrete.  I'll talk about pipe sculptures in a future post.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related: &lt;/span&gt;Commenter Flemming gives a link to &lt;a href="http://www.harderwoods.com/pipetemplate.php"&gt;a similar online tool&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-7340324799078970";
/* 728x90, created 8/4/08 */
google_ad_slot = "1609028911";
google_ad_width = 728;
google_ad_height = 90;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6181310435977891397-2025909931661499502?l=www.cheaphack.net' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cEX7R8QHuxyj5xFYolQQqpSHSfE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cEX7R8QHuxyj5xFYolQQqpSHSfE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cEX7R8QHuxyj5xFYolQQqpSHSfE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cEX7R8QHuxyj5xFYolQQqpSHSfE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.cheaphack.net/feeds/2025909931661499502/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6181310435977891397&amp;postID=2025909931661499502" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/2025909931661499502?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6181310435977891397/posts/default/2025909931661499502?v=2" /><link rel="alternate" type="text/html" href="http://www.cheaphack.net/2009/02/update-to-pipemiterrb.html" title="Update to pipemiter.rb" /><author><name>Nick Johnson</name><uri>http://www.blogger.com/profile/09742551843387605596</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm4.static.flickr.com/3522/3244133055_20ebf1db0d_t.jpg" height="72" width="72" /><thr:total>1</thr:total></entry></feed>

