<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.lmorchard.com</title>
	<atom:link href="http://blog.lmorchard.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.lmorchard.com</link>
	<description>write like no one&#039;s reading</description>
	<lastBuildDate>Tue, 11 Jun 2013 06:57:32 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.6-beta2</generator>
		<item>
		<title>Behemoth, Part 1</title>
		<link>http://blog.lmorchard.com/2013/06/11/behemoth-part-1</link>
		<comments>http://blog.lmorchard.com/2013/06/11/behemoth-part-1#comments</comments>
		<pubDate>Tue, 11 Jun 2013 06:51:32 +0000</pubDate>
		<dc:creator>lmorchard</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[behemoth]]></category>
		<category><![CDATA[fiction]]></category>
		<category><![CDATA[scifi]]></category>
		<category><![CDATA[spaceopera]]></category>

		<guid isPermaLink="false">http://blog.lmorchard.com/?p=1067</guid>
		<description><![CDATA[I&#8217;ve been meaning to get myself writing again, so here&#8217;s the first rough part of a story that&#8217;s been bouncing in my head. It&#8217;s a quick and dirty opening scene for a space opera, but I&#8217;m hoping to take it in an interesting direction almost immediately after this. A distant sun cast silvery rays through [...]]]></description>
				<content:encoded><![CDATA[<p><em>I&#8217;ve been meaning to get myself writing again, so here&#8217;s the first rough part of a story that&#8217;s been bouncing in my head. It&#8217;s a quick and dirty opening scene for a space opera, but I&#8217;m hoping to take it in an interesting direction almost immediately after this.</em></p>
<p>A distant sun cast silvery rays through a field of tumbling asteroids and swirling dust. Among the rocks, a balletic swarm of glinting motes danced, alighting here and there to vaporize and harvest masses with actinic flares. The source and sink of the swarm&#8217;s flow was a dark, ovoid craft tracing a lazy, eccentric orbit around the cluster of debris. Nestled within the craft was its pilot, Alan Rickard.</p>
<p><span id="more-1067"></span></p>
<p>He was on the verge of dozing off, despite the displays rendered across the insides of his eyelids in lurid neon phosphenes. Transit arcs and cargo reports flickered, narrating the progress of his mining. All estimates gave him at least another four hours before the holds were full. Only then would the system would need his manual input to reel everything in and head for home.</p>
<p>His eyes had just closed for a long, drowsy blink when a sharp series of pings yanked him awake with a gasp. He pushed the mining interface into the background and summoned up a sensor sweep: Four bogeys had just translated into local space. They began accelerating toward him in an unsettling formation, their vectors suggesting only minutes before he&#8217;d be within their weapons range.</p>
<p>He sent a hail over the local comm channel. He held his breath for a few beats, but received the expected response: One of the ships pegged him with a scrambler, blocking both long range comms and hyperdrive. His sensors were pretty fuzzy, too. Standard procedure for pirates, so far &#8211; typically checkmate against a mining platform like his.</p>
<p>But, he still had laser links to his motes in the rocks, and he had a project he&#8217;d been saving for just this scenario. He fired up his sublight engines and plotted a course into the thick of the debris. Then, he fired off a burst of instructions: The motes abandoned their tasks and rebooted into Alan&#8217;s own homebrew firmware.</p>
<p>Individually, the mining motes were nimble, but had weak sensors and processors. As the new software came online, the motes established a distributed system spread across the debris field using redundant and scrambler-proof laser links. In conjunction with his ship, the system as a whole gained capabilities that Alan hoped would let him spring some surprises.</p>
<p>His first advantage came in the form of a complete map of the debris field, something the incoming bandits wouldn&#8217;t have. As input to his navigation system, he plotted a continual randomized course through the rocks that should make his lumbering miner a harder target.</p>
<p>Apropos of that, his augmented sensor net showed the bandits entering the debris field, tracking toward his last position. He had sixteen motes spread throughout the field, and the bandits had already passed a half-dozen of them quietly clinging to rocks. With a few quick engine pulses, the motes pushed off into intercept courses and then went to sleep. As tiny as they were, he hoped he could keep them from registering as threats.</p>
<p>Alan yawned, the bandits closed, and so did his motes. Another ping startled him: a missile launch from the lead bandit. That was odd, because pirates usually made some kind of threat first, demanding his cargo and suchlike. The sensor blip detached from the main group, began streaking toward his position &#8211; and then flared out of existence. Two motes dropped out of his network, having moved to deflect the threat before he&#8217;d had a chance to react. So far, so good &#8211; his code had surprised even him.</p>
<p>Alan cleared his throat and opened the local comm channel. Jamming would keep him from broadcasting far, but the bandits would hear him.</p>
<p>&#8220;Attention, unidentified aggressors. This is your only warning. Break off your approach, respond to my hail, and I will regard that missile launch as a mistake.&#8221;</p>
<p>A few tense seconds passed. He figured the bandits must be wondering what had happened to their missile. His warning would at least sound good in his black box recording.</p>
<p>News from his drifting motes: He&#8217;d lost most of them to point-defense lasers that had identified them as navigational hazards, but he&#8217;d landed two on the lead ship. He selected some additional motes and sent them on intercepts with the bandits for another try.</p>
<p>A second missile launch registered. Two motes boosted away from their respective asteroids into the path of the missile. They missed, an over-correction in the software sending them splashing across neighboring rocks. Another pair boosted after the missile, but Alan wasn&#8217;t very happy about their chances.</p>
<p>&#8220;I&#8217;ll take that as your response,&#8221; he growled. He issued a command, and the motes clinging to the lead bandit began mining.</p>
<p>For the most part, mining and salvage tools posed little threat as anti-ship weapons. But, as it happened, the bandit&#8217;s hull contained some of the very materials covered by the motes&#8217; design. Given the direct contact with the mass, the little machines had no trouble doing their jobs.</p>
<p>The lead bandit ship broke up, the hull shredding in a confusion of actinic flares, punctuated by a sharp detonation from the drive core as it failed. Alan also registered the motes and their contributions dropping out of the network &#8211; a worrying sliver of the debris field had gone dark, and everything was getting slower.</p>
<p>Meanwhile, there was a missile still tracking him, and his pursuing motes just weren&#8217;t going to catch up in time. Worse yet, his ship was too cumbersome to outrun or lose the missile, which was an semi-intelligent mote in its own right.</p>
<p>Still, his map of the field gave him some options. He tweaked his vector to swing through a narrow gap between two rocks; the missile followed, two seconds behind. A mote clung to each of the rocks, and he detonated them with engine overloads. That had definitely been a warranty violation.</p>
<p>The force was just enough to send the masses tumbling together &#8211; the gap closed as the missile was half-way though. The detonation blasted the rocks apart and threw a hail of shrapnel against the aft of his ship. He lost a few maneuvering jets, and a slow leak registered in one of his atmosphere tanks. Troubling, but it could have been worse.</p>
<p>After a beat, he discovered it was worse: He&#8217;d lost some comm lasers, which disrupted his link to the mote network. And, so, he&#8217;d lost track of the remaining bandits.</p>
<p>Cursing, he called up his last good scan of the field and used dead reckoning to estimate where the bandits would show up next. He crept through the field, trying to keep rocks between him and his guesses. Using his remaining comm lasers, he swept to reconnect with any visible motes.</p>
<p>As he drifted into a clearing, his sensors lit up with targeting alerts. Apparently, the bandits had changed course. No missile this time: A barrage of heavy projectile fire tore into his hull and holed the cargo bay.</p>
<p>They&#8217;d missed the cockpit, though, which left him shaken but still breathing. Better yet, one of his comm lasers got line-of-sight on a mote, reestablishing his network connection. As it turned out, the line-of-sight coincided with the bandits themselves &#8211; because his remaining motes had found their way onto their hulls.</p>
<p>With a raw shout, he issued the command to start mining. In quick succession, the bandits bloomed into the most beautiful fireworks he&#8217;d ever seen. And, with that, his long-range comms came back online. His hyperdrive, though, didn&#8217;t seem worth trying &#8211; either it would implode, or the hull would collapse, or both.</p>
<p>So, with an impatient eye on his life support reserves, he started negotiating for a rescue contract with a salvage group on one of the inner system stations.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmorchard.com/2013/06/11/behemoth-part-1/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>I like it when services treat me like I treat my pets</title>
		<link>http://blog.lmorchard.com/2013/04/12/services-and-pets</link>
		<comments>http://blog.lmorchard.com/2013/04/12/services-and-pets#comments</comments>
		<pubDate>Sat, 13 Apr 2013 01:44:16 +0000</pubDate>
		<dc:creator>lmorchard</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[disqus]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[evernote]]></category>
		<category><![CDATA[pets]]></category>
		<category><![CDATA[services]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.lmorchard.com/?p=1011</guid>
		<description><![CDATA[I like animals, and I&#8217;ve been told that I&#8217;m good with them. I&#8217;d like to think that&#8217;s due to a mix of empathy and respect that I&#8217;ve developed over the years. It occurred to me the other day that my favorite online services treat me like I imagine my pets like to be treated. It [...]]]></description>
				<content:encoded><![CDATA[<p>I like animals, and I&#8217;ve been told that I&#8217;m good with them. I&#8217;d like to think that&#8217;s due to a mix of empathy and respect that I&#8217;ve developed over the years.</p>
<p>It occurred to me the other day that my favorite online services treat me like I imagine my pets like to be treated.</p>
<p><span id="more-1011"></span></p>
<p>It might be worth noting we have cats and rabbits, which are both rather independent kinds of critters. That said, being treated like a pet might sound demeaning. But, consider these pointers for being nice to animals:</p>
<ul>
<li>Give them a reason to come to you. Don&#8217;t chase after and grab.</li>
<li>If they want to leave, let them. Don&#8217;t hold on and squeeze tight.</li>
<li>If you are allowed to pick them up, hold them gently yet offer enough support to make them feel safe.</li>
<li>Pay attention to their reactions, learn what kind of attention they like. This gives them a reason to come back when you let them leave.</li>
</ul>
<p>Consider the above with respect to <a href="http://dropbox.com">Dropbox</a>, a service I use more every day:</p>
<ul>
<li>They give me a place to put my files, like a thumb drive installed all the time on all my computers regardless of vendor or OS.</li>
<li>I can quit Dropbox whenever I want &#8211; all my files are safe on multiple hard drives, and won&#8217;t disappear if Dropbox goes away.</li>
<li>Dropbox has never lost a file, never spammed me, never done anything that suggested they&#8217;re spying on me. I mean, they could, but they haven&#8217;t. I also asked a support question once &#8211; they answered it.</li>
<li>The people at Dropbox keep doing more of the above, and releasing things like <a href="https://tech.dropbox.com/2012/08/some-love-for-javascript-applications-2/">the JavaScript API</a> that makes them useful for web apps I like building.</li>
</ul>
<p>I can tell a similar story about <a href="http://disqus.com">Disqus</a>, the service I use for comments here:</p>
<ul>
<li>Disqus takes care of my comments and keep spam away. They were easy to set up with a WordPress plugin.</li>
<li>The <a href="http://wordpress.org/extend/plugins/disqus-comment-system/">official WordPress plugin</a> mirrors every comment into my site&#8217;s database. I can turn off the service at any moment without a problem.</li>
<li>Disqus <a href="http://help.disqus.com/customer/portal/articles/666278-introducing-promoted-discovery-and-f-a-q-">does run some advertising and off-site recommendations alongside my content</a>. But, even though I could turn it off, I haven&#8217;t because it seems like a genuinely interesting aspect of the service. They&#8217;re also quick to answer questions.</li>
<li>Disqus continues to work well, add features I like, and have yet to disappoint me.</li>
</ul>
<p>Now, how about <a href="http://evernote.com">Evernote</a>? They&#8217;re neck-and-neck with Dropbox for me:</p>
<ul>
<li>They store all my random thoughts &amp; notes, make them available on all my computers regardless of vendor or OS.</li>
<li>I can backup or export my notes and quit whenever I want, and they&#8217;re stored on all my computers.</li>
<li>Evernote hasn&#8217;t done anything nasty with my notes, and have only ever made gentle suggestions that I pay or use other services.</li>
<li>The Evernote team just keep improving things &#8211; and every time I switch to something like <a href="http://www.tuaw.com/2010/02/19/notational-velocity-simplenote-and-dropbox-bring-child-like-wo/">Notational Velocity on Dropbox</a>, I find myself coming back.</li>
</ul>
<p>So, that&#8217;s it: Just a quick handful of thoughts that occurred to me when I was on a walk. I&#8217;m not entirely sure how this translates into execution and a successful business, but I know I like it when it works out this way.</p>
<p>Might be interesting to muse on this further: Sometimes being treated like a pet is a trap. Sometimes it&#8217;s demeaning. I&#8217;m not entirely sure it&#8217;s a good thing all the time, mostly my point in this post is to describe the feeling.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmorchard.com/2013/04/12/services-and-pets/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Social novelty filtering (or Google Reader, R.I.P.)</title>
		<link>http://blog.lmorchard.com/2013/03/14/social-novelty-filterin</link>
		<comments>http://blog.lmorchard.com/2013/03/14/social-novelty-filterin#comments</comments>
		<pubDate>Thu, 14 Mar 2013 05:17:37 +0000</pubDate>
		<dc:creator>lmorchard</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[metablogging]]></category>
		<category><![CDATA[reader]]></category>
		<category><![CDATA[rss]]></category>

		<guid isPermaLink="false">http://blog.lmorchard.com/?p=998</guid>
		<description><![CDATA[Wherein I muse about Google Reader past, and what it might have been. And, wherein I describe what I hope springs up in the aftermath of its closing. Reader&#8217;s been long gone already So, they&#8217;re finally shutting down Google Reader, huh? It&#8217;s sad, but unsurprising. It&#8217;s obvious they didn&#8217;t really have a strategic place for [...]]]></description>
				<content:encoded><![CDATA[<p style="text-align: left;">Wherein I muse about Google Reader past, and what it might have been. And, wherein I describe what I hope springs up in the aftermath of its closing.</p>
<p><span id="more-998"></span></p>
<h3 style="text-align: left;">Reader&#8217;s been long gone already</h3>
<p style="text-align: left;">So, <a href="http://googleblog.blogspot.com/2013/03/a-second-spring-of-cleaning.html">they&#8217;re finally shutting down Google Reader</a>, huh? It&#8217;s sad, but unsurprising. It&#8217;s obvious they didn&#8217;t really have a strategic place for it in the Google+ universe, and it just was just neglected <a href=" http://decafbad.com/blog/2011/11/01/readerpocalypse">since the Sharepocalypse</a>. Kill off the key social synergy of hosting a centralized news reader, and it&#8217;s no wonder you&#8217;ll see usage decline.</p>
<p style="text-align: left;">I&#8217;ve been running <a href="https://github.com/gothfox/Tiny-Tiny-RSS">Tiny Tiny RSS</a> on my own server since Google killed off in-product sharing. So, I won&#8217;t be too terribly affected by the shutdown personally. I think my wife still uses Google Reader, having moved after the demise of Bloglines. If she likes the looks of TT-RSS, I&#8217;ll set her up with an account too.</p>
<p style="text-align: left;">But, <a href="http://www.marco.org/2013/03/13/google-reader-sunset">Marco</a> and <a href="http://threads2.scripting.com/2013/march/goodbyeGoogleReader">Dave</a> have it right: This will probably be a good thing for RSS. The problem has been that Google Reader was <em>just</em> good enough to lull me out of scratching my own itch. This is coming from the guy who wrote <a href="http://www.amazon.com/gp/product/0764597582?ie=UTF8&amp;tag=0xdecafbad01-20&amp;linkCode=as2&amp;camp=1789&amp;c%0D%0Areative=9325&amp;creativeASIN=0764597582">a 600 page book on RSS and Atom</a> out of love for the tech. So, I&#8217;m sure I won&#8217;t be the only one poking around code archives and blowing dust off old repositories.</p>
<h3 style="text-align: left;">Social novelty filtering</h3>
<p style="text-align: left;">So, this is the itch I&#8217;d love to scratch in the post-Google-Reader age: Reader-before-Plus offered <strong><em>social novelty filtering</em></strong>. That is, fast sharing within the product fueled reciprocal feeds of novelty, filtered by my &#8220;friends&#8221;, presented in the same news reading interface as my other bazillion feeds from the web at large.</p>
<p style="text-align: left;">That feature worked so well, in fact, that <a href="http://decafbad.com/blog/2010/12/18/less-del-icio-us-than-ever-before">it lured me away from using del.icio.us</a>—a service I liked so much that I wrote <a href="http://www.amazon.com/gp/product/0470037857?ie=UTF8&amp;tag=0xdecafbad01-20&amp;linkCode=as2&amp;camp=1789&amp;%0D%0Acreative=9325&amp;creativeASIN=0470037857">a 350 page book</a> about it and <a href="http://decafbad.com/blog/2006/06/24/go-west-young-man">moved out of state</a> so I could work there.</p>
<p>Yeah, yeah, I know: You can &#8220;share&#8221; to Facebook, to Twitter, even to Google+—that&#8217;s why Google killed in-product sharing on Reader, after all. I do that on occasion, and that&#8217;s how a lot of people get their streams of novelty. But, it&#8217;s nowhere near the same thing, neither in quality nor in quantity.</p>
<p>The thing about these &#8220;friends&#8221; on Google Reader was that we never interacted directly. It was refreshing, it was great. No small talk, no conflicts, no getting in each others&#8217; virtual faces—we just mutually harnessed slices of each others&#8217; minds to build intelligent streams of novelty.</p>
<p>That might sound cold or mechanical or exploitative—but the thing is, there are plenty of other outlets for interpersonal exchange, and I even met up with some of my Reader &#8220;friends&#8221; out-of-band there too. But, those channels are <em>about</em> you and me, we&#8217;re the objects of interest &amp; the stars of the show. There are very few channels that are <em>about</em> shared novelty as the object of interest, where you and I can get ourselves out of the way and conspire to surface cool things.</p>
<p>(And, of those channels that <em>do</em> exist—<a href="http://pinterest.com/">Pinterest</a>, for example, maybe <a href="http://tumblr.com/">Tumblr</a>—I&#8217;m not a big fan of the UI vs <em>ye olde Reader</em>. Still, magic &amp; strange loops can emerge from recursion &amp; re-entrant flows; your mileage may vary. See also: <a href="http://www.buzzfeed.com/robf4/googles-lost-social-network">Google&#8217;s Lost Social Network</a>.)</p>
<h3>Distributed social novelty filtering</h3>
<p>So anyway, I&#8217;m probably going to play around with the machinery of feed aggregation again. But, one of the things I really would like to see as a <em>thing</em> out there is <strong><em>distributed social novelty filtering</em></strong>. How do you do that? Well, the first half of it is pretty simple:</p>
<ul>
<li>In feed readers, implement a one-click &#8220;share&#8221; button on every item. Maybe offer an optional field for comment.</li>
<li>Offer a public feed of every &#8220;shared&#8221; item, easily discoverable from a public profile.</li>
</ul>
<p>For example, my installation of TT-RSS offers <a href="http://decafbad.com/tt-rss/public.php?op=rss&amp;id=-2&amp;key=6fa5a3a996809d4df9a357bd7c62efc464c8d147">a feed of my &#8220;shared&#8221; items</a>—albeit not in a very discoverable way. I also funnel craptons of material into <a href="http://feeds.pinboard.in/rss/u:deusx/">my pinboard.in feed</a>, but mainly for personal archiving and search. Even Pinterest has <a href="http://pinterest.com/lmorchard/feed.rss">a feed for me</a>, though I barely use it.</p>
<p><a href="http://links.scripting.com/rss.xml">Dave Winer</a> and <a href="http://waxy.org/links/index.xml">Andy Baio</a> maintain linkblogs with feeds—those fit nicely into this scheme, and I follow them both in my reader.</p>
<p>The other half is where some innovation could stand to happen: The obvious thing is to just get yourself a new RSS reader and subscribe to all the shared-item feeds of your &#8220;friends&#8221;.</p>
<p>But, there&#8217;s a lot more to be done here:</p>
<ul>
<li>discover and follow &#8220;friends&#8221; across services,</li>
<li>de-duplicate shared items by URL,</li>
<li>rank items by counting shares,</li>
<li>construct discussion threads from shares</li>
</ul>
<p>Go nuts, please! Someone form a startup and take my money to solve this, so I don&#8217;t have to. Even better, release some open source so I can host it myself and maybe even contribute some code. I&#8217;m thinking about doing some of this, but my lack of sustained attention span for projects is <a href="http://decafbad.com/blog/2006/05/26/confessions-of-a-serial-enthusiast">well documented</a>.</p>
<p>But, the important thing here is that it&#8217;s <em><strong>distributed</strong></em> and a <em>thing</em> that&#8217;s conventionally done out there on the web. This shouldn&#8217;t be constrained to a single vendor&#8217;s silo ever again, because that allowed a single vendor to kill it dead and I miss it terribly.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmorchard.com/2013/03/14/social-novelty-filterin/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Too long? Read anyway.</title>
		<link>http://blog.lmorchard.com/2013/02/25/too-long-read-anyway</link>
		<comments>http://blog.lmorchard.com/2013/02/25/too-long-read-anyway#comments</comments>
		<pubDate>Tue, 26 Feb 2013 00:16:28 +0000</pubDate>
		<dc:creator>lmorchard</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[reading]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[writing]]></category>

		<guid isPermaLink="false">http://blog.lmorchard.com/?p=963</guid>
		<description><![CDATA[Wherein I rant at medium length about functional literacy and language competency in knowledge work and information technology. Look, I realize that we live in a TL;DR culture. I lived through 8 years of a non-reading president along with everyone else. I know that the brogrammers out there are constantly getting texts from their buddies [...]]]></description>
				<content:encoded><![CDATA[<p>Wherein I rant at medium length about functional literacy and language competency in knowledge work and information technology.<br />
<span id="more-963"></span></p>
<blockquote><p>Look, I realize that we live in a TL;DR culture. I lived through 8 years of a non-reading president along with everyone else. I know that the brogrammers out there are constantly getting texts from their buddies to plan the weekend&#8217;s broactivities, trying to decide in whose mancave they&#8217;ll be setting up their lan party, and are thoroughly distracted in between futzing with their smart phones and writing a few lines of code per day by cutting and pasting it from stackoverflow. But it&#8217;s really not ok to act functionally illiterate when you&#8217;re not actually illiterate, when an advanced society that once put a man on the moon worked so hard to educate you.</p></blockquote>
<p><cite><a href="http://hackingdistributed.com/2013/01/29/mongo-ft/">Broken by Design: MongoDB Fault Tolerance</a> by <a href="http://hackingdistributed.com/egs/">E. Gün Sirer</a></cite></p>
<p>The rest of <a href="http://hackingdistributed.com/2013/01/29/mongo-ft/">the blog post</a> about failings in MongoDB is interesting. But, that particular paragraph caused me to start a slow clap all by myself, confusing <a href="http://www.flickr.com/photos/deusx/tags/cats/">the cats</a>.</p>
<div id="attachment_973" class="wp-caption aligncenter" style="width: 330px"><a href="http://reactiongifs.com/?p=2273"><img class="size-full wp-image-973 " alt="Well done, sir!" src="http://blog.lmorchard.com/wp-content/uploads/2013/02/well_done_sir.gif" width="320" height="240" /></a><p class="wp-caption-text">Well done, sir!</p></div>
<p>It voices an anxiety and an anger of mine about which I stay mostly quiet to everyone but my wife, who often humors rants on the subject and proffers rants of her own. It&#8217;s one of the many reasons I love her with all my heart.</p>
<h3>Write like no one&#8217;s reading</h3>
<p>This notion is partly why the tagline for this new blog of mine reads, &#8220;Write like no one&#8217;s reading.&#8221; It&#8217;s a corruption of the notion, <em>dance like no one&#8217;s watching</em>: It&#8217;s not so much that I&#8217;m anxious or shy about my writing &#8211; it&#8217;s that I&#8217;m quite cynical about amassing readers through writing long-form essays on a blog.</p>
<p>Still, I like writing at length, and this blog is for things too big for Facebook or Twitter. So, rather than keep it short, I&#8217;m going to write what someone like me would like to read. And, in fact, since I love the web and hypertext, you&#8217;ll find my posts will tend to be link-crazed and branch out into all kinds of external references.</p>
<h3>Reading is Power</h3>
<p>I do generate my share of <a href="http://twitter.com/lmorchard">quip-tweeting</a> &amp; <a href="http://pinboard.in/u:deusx">link-blogging</a> and aspire to write more and in greater depth. That said, I wholly agree with the author above: It&#8217;s not okay to be ineffectual with written communication &#8211; especially not if you are a professional in knowledge work and information technology.</p>
<p>Written communication is how we can work asynchronously &#8211; we don&#8217;t all need to be in the same place at the same time to accomplish great things. Documentation is, among other things, how you can augment your own feeble recollection &#8211; so that you can remember what the hell you were thinking, 6 months down the line. Text is susceptible to analysis and search by machines, which allows us to further augment our thinking and problem solving.</p>
<h3>Language is the ultimate technology</h3>
<p>In fact, I&#8217;ll go so far as to say: <em><strong>It&#8217;s not okay to fail at written language as a modern, technologically-empowered human being</strong>. </em>Man on the moon, and all that.</p>
<p>Seriously, you don&#8217;t have to be <a href="http://tvtropes.org/pmwiki/pmwiki.php/Main/ThisAintRocketSurgery">a rocket surgeon</a>, but you do have to read the whole damn article or email someone took the time to write, and you do have to make an effort at understanding fully what was written. And if you can&#8217;t write well enough to compose your thoughts in a considered &amp; coherent form, <strong>get better</strong>.</p>
<div id="attachment_976" class="wp-caption aligncenter" style="width: 360px"><a href="http://www.quickmeme.com/meme/3t434c/"><img class=" wp-image-976 " alt="TOO LONG? READ ANYWAY." src="http://blog.lmorchard.com/wp-content/uploads/2013/02/too-long-read-anyway.jpg" width="350" height="350" /></a><p class="wp-caption-text">TOO LONG? READ ANYWAY.</p></div>
<p>Take the time, do your homework, exercise that <a href="http://en.wikipedia.org/wiki/Prefrontal_cortex">prefrontal cortex</a>.</p>
<p>If you&#8217;re college-educated, you had to do a lot of reading &amp; writing for papers &amp; essays. This might be stating the obvious, but the point of that exercise wasn&#8217;t to present an arbitrary gauntlet to pass and then never revisit. <em>The point was that you should have developed skills of literacy useful throughout the rest of your life</em>.</p>
<h3>Meetings are the mind killer</h3>
<p>Here&#8217;s an example beyond blog posts: I&#8217;ll admit that sometimes I bristle when someone suggests, &#8220;Let&#8217;s get {on a plane, in a room, in a video call} and hash this out.&#8221; The reason I bristle is because meetings can be called as a way to kick the can down the road. Rather than spend some time considering things up front, we&#8217;ll gather everyone up in time &amp; space and start from a conceptual blank page.</p>
<p>I understand that real-time, high-bandwidth, person-to-person communication is often the key to getting everyone all on the same page. There are emotional cues, social niceties, negotiations and understandings to be had. And, I&#8217;ll admit that I&#8217;m an introvert and weak at dealing with social situations &#8211; this is a lifelong work-in-progress for me.</p>
<div id="attachment_974" class="wp-caption aligncenter" style="width: 510px"><a href="http://reactiongifs.com/?p=7214"><img class="size-full wp-image-974 " alt="My &quot;people skills&quot; are &quot;rusty&quot;" src="http://blog.lmorchard.com/wp-content/uploads/2013/02/rusty.gif" width="500" height="287" /></a><p class="wp-caption-text">My &#8220;people skills&#8221; are &#8220;rusty&#8221;</p></div>
<p>But, one of the first things I&#8217;ll wonder when a meeting convenes is: <em>Who is taking notes &amp; where can we find them</em>? Ideally the answers are &#8220;all of us&#8221; and &#8220;at this {Etherpad, Google Docs} URL&#8221;.</p>
<p>I&#8217;ll also wonder: <em>What is the agenda for this meeting</em>? Ideally the answer is, &#8220;I already told you &#8211; at the {Etherpad, Google Docs} URL. Didn&#8217;t you read the meeting invite I sent out days ahead of time?&#8221;</p>
<p>When I don&#8217;t get good answers to the above, I think: <em>Wouldn&#8217;t it be nice if we&#8217;d spent some time writing things down &#8211; whether in docs or email or whatever &#8211; so we had something better to talk about? And then write all <strong>that </strong>down, too?<br />
</em></p>
<h3>Wrapping up</h3>
<p>I&#8217;m not writing this with any particular person or persons in mind &#8211; I&#8217;m sorry if anyone reading this feels personally addressed by way of passive-aggression. This is just a general issue with which I&#8217;ve dealt throughout my life &amp; career.</p>
<p>This post also expresses standards to which I personally aspire, but I&#8217;ll be the first to admit I&#8217;m not perfect. I love writing, and I think I&#8217;m pretty good at it, but I will always have lots of room for improvement.</p>
<p>In the end, the notion I&#8217;m trying to convey can be summed up like so: Written language is essential to life as a modern day human being. Don&#8217;t expect others to pick up your slack in this area. Improve your reading, improve your writing, improve yourself.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmorchard.com/2013/02/25/too-long-read-anyway/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Looking for a Django app to manage Roles within Groups</title>
		<link>http://blog.lmorchard.com/2013/02/23/looking-for-a-django-app-to-manage-roles-within-groups</link>
		<comments>http://blog.lmorchard.com/2013/02/23/looking-for-a-django-app-to-manage-roles-within-groups#comments</comments>
		<pubDate>Sat, 23 Feb 2013 17:21:13 +0000</pubDate>
		<dc:creator>lmorchard</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[badger]]></category>
		<category><![CDATA[badges]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://blog.lmorchard.com/?p=949</guid>
		<description><![CDATA[I want to add some team-based features to django-badger. I was hoping that someone had already built a reusable app to do most of the work for me. This happens quite a lot when I&#8217;m working with Django. Unfortunately, I haven&#8217;t quite found what I&#8217;m looking for yet. Consider this blog post either the product [...]]]></description>
				<content:encoded><![CDATA[<p>I want to add some team-based features to <a href="https://github.com/lmorchard/django-badger">django-badger</a>. I was hoping that someone had already built a reusable app to do most of the work for me. This happens quite a lot when I&#8217;m working with Django. Unfortunately, I haven&#8217;t <em>quite</em> found what I&#8217;m looking for yet. Consider this blog post either the product of my thinking out loud toward a rough spec, or a long-winded lazyweb search query.</p>
<p><span id="more-949"></span></p>
<p>First, what do I mean by a &#8220;team&#8221;? Well, a familiar example is <a href="http://www.wowwiki.com/Guild_list_%28interface%29">a guild in World of Warcraft</a>: A group of people with access to shared resources, that access controlled by permissions bundled into ranks assigned to each member of the group.</p>
<div class="wp-caption aligncenter" style="width: 460px"><a href="http://www.wowwiki.com/Guild_list_%28interface%29"><img alt="Guild management in WoW" src="http://images2.wikia.nocookie.net/__cb20091106224144/wowwiki/images/thumb/3/3e/Guild_list_%28interface%29.png/450px-Guild_list_%28interface%29.png" width="450" height="324" /></a><p class="wp-caption-text">Guild management in WoW</p></div>
<p>While Django does come with Users, Groups, &amp; Permissions, the concept of Roles within Groups to which Permissions can be attached seems missing.</p>
<p>If I try to extend the Django building blocks, maybe I could represent a &#8220;Team&#8221; as a bundle of Groups and treat those Groups as Roles? Or, maybe Groups should just become hierarchical &#8211; make it <a href="http://en.wikipedia.org/wiki/Turtles_all_the_way_down">turtles all the way down</a>. (I really like that expression, in case you can&#8217;t tell.)</p>
<p>With respect to that last point, I found <a href="https://github.com/rasca/django-hierarchical-auth">django-hierarchical-auth</a>. That seems like a good lead. But, I&#8217;m having trouble finding other projects using it. There&#8217;s <a href="http://www.feincms.org/">feinCMS</a> &#8211; I&#8217;ve never heard of that before, but that&#8217;s more my lack than theirs.</p>
<p>In the case of <a href="https://github.com/lmorchard/django-badger">django-badger</a>, I&#8217;d like to enable users to start teams, create badges that belong to the team, and allow other team members varying levels of control over those badges (e.g. creating, editing, awarding, approving nominations, etc).</p>
<p>So, there&#8217;s the matter of user interface &#8211; I&#8217;d like any user (not just site-wide admins) to be able to:</p>
<ul>
<li>create a team;</li>
<li>manage team profile information;</li>
<li>manage &amp; grant roles based on a canned selection of permissions;</li>
<li>invite other users as members, remove members;</li>
<li>accept team invitations, request to join a team, remove oneself from a team.</li>
</ul>
<p>The <a href="https://github.com/rasca/django-hierarchical-auth">django-hierarchical-auth</a> app comes with no views; it&#8217;s just a backend utility. So, if I grab that app, I&#8217;ll still have to build the UI and supporting models myself (i.e. for team profiles and permission sets).</p>
<p>So, that leaves me wondering if there&#8217;s some value in me building a reusable app atop <a href="https://github.com/rasca/django-hierarchical-auth">django-hierarchical-auth</a> that basically implements what that WoW guild management interface offers? Ultimately, that&#8217;s what I&#8217;m really hoping someone else has built for me.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmorchard.com/2013/02/23/looking-for-a-django-app-to-manage-roles-within-groups/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>KumaScript: Bringing scripting to the wiki bears</title>
		<link>http://blog.lmorchard.com/2013/02/21/kumascript</link>
		<comments>http://blog.lmorchard.com/2013/02/21/kumascript#comments</comments>
		<pubDate>Thu, 21 Feb 2013 18:30:06 +0000</pubDate>
		<dc:creator>lmorchard</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[mdn]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[wiki]]></category>

		<guid isPermaLink="false">http://blog.lmorchard.com/?p=897</guid>
		<description><![CDATA[KumaScript turned one year old back at the end of January, and I&#8217;m sad to say no one celebrated its birthday &#8211; not even me. I&#8217;m pretty sure very few people outside of the core team at the Mozilla Developer Network even know what KumaScript is. So, I guess it&#8217;s about time I do something [...]]]></description>
				<content:encoded><![CDATA[<p><a href="https://github.com/mozilla/kumascript">KumaScript</a> turned <a href="https://github.com/mozilla/kumascript/commit/0cb247eaac58cf00bb59e16d6b37a215484633b2">one year old</a> back at the end of January, and I&#8217;m sad to say no one celebrated its birthday &#8211; not even me. I&#8217;m pretty sure very few people outside of the core team at the Mozilla Developer Network even know what <a href="https://github.com/mozilla/kumascript">KumaScript</a> is. So, I guess it&#8217;s about time I do something about that.</p>
<p><span id="more-897"></span></p>
<h3>Necessity is the Mother of Invention</h3>
<p>The major focus of my workaday (and workanight) life last summer was the relaunch of the Mozilla Developer Network wiki.</p>
<p>It had been close to 18 months in the making, which usually spells <a href="http://blog.lmorchard.com/2012/09/17/on-the-other-end-of-a-self-imposed-death-march-project">death march</a> and disaster. But, against many expectations, we did finally arrive at something for launch that neither fell over in flames immediately nor jettisoned a significant number of features with respect to what it was replacing. I think this is the first time in my career something like this went off with as few hitches as it did.</p>
<p>Your first questions might go something along the lines of, &#8220;18 months? For a <em>wiki</em>? Are you insane or just incompetent?&#8221; Well, it might help to note a few additional details:</p>
<ul>
<li>We call it a wiki, but it&#8217;s really more of a content management system that anyone can edit. It supports translation from English to 34 other languages, tracks revisions &amp; content hierarchies, accepts file attachments, and sings &amp; dances in a variety of other annoying-to-implement ways.</li>
<li>At the time of switchover, we had over 50,000 documents to migrate with care from the old system to the new one. That body of content represents years of work, a non-trivial hunk of cruft and spam, and tickles a maddening array of edge cases.</li>
<li style="text-align: left;">The wiki we replaced—i.e. <a href="http://www.mindtouch.com/">MindTouch</a>—supports server-side scripting in content with a language based on Lua—i.e. <a href="http://developer.mindtouch.com/en/docs/DekiScript">DekiScript</a>.</li>
</ul>
<p>Each of the above points represents its own special mix of horror and challenge, and I took on the bulk of the last two. That caused me a lot of stress, and <a href="http://blog.lmorchard.com/2012/09/17/on-the-other-end-of-a-self-imposed-death-march-project">I blogged a bit about that</a>.</p>
<p>This blog post, however, focuses on that last point: <a href="https://github.com/mozilla/kumascript">KumaScript</a> was built by backing into a semi-compatible replacement for <a href="http://developer.mindtouch.com/en/docs/DekiScript">DekiScript</a>. That&#8217;s pretty much the worst way to go about building something, but it seems to have worked.</p>
<h3>What Does It Look Like?</h3>
<p>First, you might want to check out <a href="https://developer.mozilla.org/en-US/docs/Project:Introduction_to_KumaScript">&#8220;Introduction to KumaScript&#8221; on MDN</a>. It&#8217;s the best work in progress describing the ins-and-outs of the service. But for the sake of this blog post, consider <a href="https://developer-new.mozilla.org/en-US/docs/KumaTests/hello_test?raw=1">this wiki document</a>:</p>
<pre>Here are three hellos:
{{ hello('3') }}</pre>
<p>Now, consider <a href="https://developer-new.mozilla.org/en-US/docs/Template:hello">this KumaScript template</a>, named <code>Template:hello</code>:</p>
<pre>&lt;% for (var i = 0; i &lt; $0; i++) { %&gt;
Hello #&lt;%= i %&gt;
&lt;% } %&gt;</pre>
<p>Put the two of these together, and you get <a href="https://developer-new.mozilla.org/en-US/docs/KumaTests/hello_test">this output</a>:</p>
<pre>Here are three hellos:
Hello #0
Hello #1
Hello #2</pre>
<p>KumaScript on MDN consists mainly of the following:</p>
<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Project:Introduction_to_KumaScript#Template_Syntax">Templates implemented using Embedded JavaScript Templates</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Project:Introduction_to_KumaScript#Macro_Syntax">Macros in wiki content that call templates with parameters</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Project:Introduction_to_KumaScript#Creating_modules">Common JS inspired modules for reusable code used by templates</a></li>
</ul>
<p>This quick introduction glosses over interesting things you can do with KumaScript—e.g. accessing data from external sources via HTTP, fetching content from other documents (also via HTTP). But, again, you can dive deeper by reading <a href="https://developer.mozilla.org/en-US/docs/Project:Introduction_to_KumaScript">&#8220;Introduction to Kumascript&#8221; on MDN</a>.</p>
<h3>Scripting in Wikis</h3>
<p>Why would one would even build such a thing as KumaScript? As it turns out, programmatically generating content is quite handy for composing documentation. Here are a few use cases:</p>
<ul>
<li>Localized macros for often-repeated constructs such as <a href="https://developer.mozilla.org/en-US/docs/Template:Warning">warnings</a>, notes, tips, &amp; callouts.</li>
<li>Conditional content based on variables such as product, locale, &amp; standards status.</li>
<li><a href="http://en.wikipedia.org/wiki/Transclusion">Transclusion</a> of content, <a href="https://developer.mozilla.org/en-US/docs/XUL/button">building documents from documents</a>. (Try viewing <a href="https://developer.mozilla.org/en-US/docs/XUL/button?raw">the raw source</a> of that page.)</li>
<li>Mashups of data from MDN itself and from other sites and services like Bugzilla and Github. For example, here&#8217;s <a href="https://developer.mozilla.org/en-US/docs/Project:Changelog">a self-updating Changelog of our code deployments on MDN</a>. And, here&#8217;s <a href="https://developer.mozilla.org/en-US/docs/Template:KumaGithubChanges">the template behind that page</a>.</li>
</ul>
<p>It&#8217;s also worth pointing out that is different from scripting mixed with HTML like you get from ASP or PHP: There, you can process forms, personalize responses, and generally build web applications.</p>
<p>In the world of KumaScript, content scripting is a heavily cached thing and not tied to the current HTTP request. It mostly runs only when the document itself is edited, but can also be executed when we think dependencies or external data sources have changed.</p>
<p>In fact, KumaScript code doesn&#8217;t even have access to the incoming visitor&#8217;s request data at all—i.e. username, cookies, referrer header, et al—and instead we operate mainly on the content and metadata of documents.</p>
<h3>Why JavaScript?</h3>
<p>As I mentioned earlier, <a href="http://www.mindtouch.com/">MindTouch</a> provides for scripted content by way of the Lua-based <a href="http://developer.mindtouch.com/en/docs/DekiScript">DekiScript</a>. It&#8217;s also interesting to note that the Wikimedia Foundation is working on <a href="http://www.mediawiki.org/wiki/Lua_scripting">a Lua-based scripting system for MediaWiki and Wikipedia</a>. So, scripted content in a wiki isn&#8217;t an entirely crazy idea, in and of itself.</p>
<p>As for Lua, I think it&#8217;s a nice little language. It&#8217;s used in World of Warcraft and many other games. It&#8217;s known for being easily embedded into applications to grant scriptability. I can totally see why one would reach for it.</p>
<p>But, at Mozilla, we&#8217;re all about the web. The lingua franca of programming on the web is JavaScript. And, it doesn&#8217;t hurt that MDN already has a huge body of JavaScript documentation.</p>
<p>So, as far as harmonious language choices go, I can&#8217;t think of a better one for scripting content on MDN than JavaScript.</p>
<h3>Boring Lets Me Sleep at Night</h3>
<p>There are some exciting things about embedding a Lua interpreter into a wiki platform, as MindTouch and MediaWiki have done. Even having chosen JavaScript over Lua, I could have tried embedding a JS interpreter like <a href="http://code.google.com/p/v8/">V8</a> or <a href="https://developer.mozilla.org/en-US/docs/SpiderMonkey">SpiderMonkey</a> into Python.</p>
<p>However, because I like to sleep at night and am not particularly clever about embedding languages within languages (<a href="http://stackoverflow.com/questions/5099043/embedding-a-low-performance-scripting-language-in-python#comment5715808_5099043">yo dawg</a>), I want nothing to do with this brand of excitement. Consider me <a href="http://en.wikipedia.org/wiki/Hobbit#Lifestyle">a Hobbit</a> among developers.</p>
<p>So, KumaScript is a standalone <a href="http://nodejs.org/">Node.js</a> web service. That is, everything going into and coming out of KumaScript happens over HTTP. I understand HTTP a whole lot more than embedding language interpreters.</p>
<p>Don&#8217;t get me wrong: Node.js is an exciting piece of exotic matter in its own right. But, someone more clever than me maintains Node.js. And, I&#8217;m betting most of my co-workers and potential project contributors understand JavaScript, Node.js, and HTTP much better than embedding languages in other languages.</p>
<p>In fact, besides my overwrought glue code, <a href="https://github.com/mozilla/kumascript/blob/master/package.json#L22">KumaScript consists mainly of modules written &amp; maintained by other people more clever than me</a>. That&#8217;s even less work for me. One of the few things I like as much as sleeping at night is when other people fix bugs and build things for me.</p>
<h3>HTTP ALL the Things</h3>
<p>I really like HTTP. I&#8217;ve spent a good chunk of my adult life learning to understand it—so by this point it might be Stockholm Syndrome, but I think it embeds a lot of cleverness and useful decisions.</p>
<p>HTTP gives you interesting system boundaries. You can cache, scale, and abstract using intermediaries. There are nice identifiers (ie. URLs), status codes, and a rich arsenal of means to transport data and metadata (ie. methods, headers, and content types).</p>
<p>Having made KumaScript an HTTP service also means that someone other than MDN could use it. The interface was not built specifically for MDN, it&#8217;s neither dependent on Python nor Django. Fire up the processes and try running your web content through it—could be a wiki, could be a pile of static HTML. There is, of course, slightly more to it than that—but not much.</p>
<p>In fact, I really <em>do</em> hope someday someone beyond MDN tries using KumaScript.</p>
<h3>Turtles All the Way Down</h3>
<p>So, the MDN wiki—<a href="https://github.com/mozilla/kuma">named Kuma</a>, which means <a href="http://en.wikipedia.org/wiki/Kuma#Animals">&#8220;bear&#8221; in Japanese</a>—talks to KumaScript via HTTP. And, in turn, KumaScript talks to the wiki with HTTP.</p>
<p>In fact, although the KumaScript service itself is hidden behind a firewall, <a href="https://developer.mozilla.org/en-US/docs/Project:The_Kuma_API">the wiki API used by KumaScript is open to the public</a>. What&#8217;s good for the goose is good for the gander, after all.</p>
<p>The typical document rendering process goes something like this:</p>
<ol>
<li>Kuma makes a GET request to KumaScript with the URL of a wiki document.</li>
<li>KumaScript makes a GET request to Kuma for the raw source of the wiki document.</li>
<li>KumaScript parses the source, looking for macros &amp; inventorying templates.</li>
<li>KumaScript makes a GET request to Kuma for the source of each template needed.</li>
<li>KumaScript evaluates the macros by executing templates with the given parameters. This may kick off additional GET requests as needed by templates to load modules.</li>
<li>KumaScript responds to the initial request from Kuma with the results of macro evaluation in the document.</li>
</ol>
<p>It&#8217;s <del>turtles</del> HTTP GET, <a href="http://en.wikipedia.org/wiki/Turtles_all_the_way_down">all the way down</a>. Well, except for when we want to do a preview before saving: In that case it&#8217;s an HTTP POST which kicks everything off at step #3, with raw source in the request body.</p>
<p>And though this might look like a Rube Goldberg machine, there are some nice qualities to all this HTTP GET traffic:</p>
<ul>
<li>Each GET is susceptible to caching, via the usual headers and semantics.</li>
<li>Each GET can be serviced by a different process on a different machine.</li>
</ul>
<p>I&#8217;m sure I could come up with more items after I have lunch, but this is just HTTP.</p>
<p>Content flows through request and response bodies. And—though this part might be a bit of a hack—I encode document context, errors, and messages using custom HTTP headers as a side-channel <a href="https://github.com/lmorchard/node-firelogger">using the FireLogger protocol</a> as an inspiration.</p>
<h3>Security &amp; Safety</h3>
<p>Something I could have done with KumaScript was to simply allow wiki authors to drop hunks of executable code into the middle of documents. DekiScript seems to allow for this. But, we never really used it that way on MDN.</p>
<p>Instead, what we have is a system of templates and macros:</p>
<ul>
<li>Templates contain the JavaScript code in the form of <a href="https://github.com/visionmedia/ejs">Embedded JavaScript Templates</a>. At present, these can be authored only by a core of trusted MDN editors.</li>
<li>Macros call templates with parameters and dump the results of execution into the document. These can be used by anyone, and have <a href="https://github.com/mozilla/kumascript/blob/master/lib/kumascript/parser.pegjs">a very constrained syntax</a>.</li>
<li>The content resulting from macro evaluation <a href="https://pypi.python.org/pypi/bleach">is sanitized</a> such that it&#8217;s subject to the same constraints as hand-written markup.</li>
</ul>
<p>Since KumaScript has no access to a user&#8217;s request data, we&#8217;re decently firewalled in terms of privacy and abusing the visitor. And, since <a href="https://pypi.python.org/pypi/bleach">the markup is filtered</a>, it&#8217;s difficult to inject nasty XSS exploits and the like.</p>
<p>So, when I say security and safety, I&#8217;m thinking mainly about our servers: We want to sandbox this server-side JS such that it can&#8217;t abuse CPU, memory, or network resources. At present, my approach to this is anemic: Restrict code authoring to trusted people, and impose impatient timeouts on macro execution.</p>
<p>I have thoughts about improving this situation in the future, and hopefully expanding the ability to author JS templates. Because, remember, MDN is a wiki—anyone and everyone can edit it. I&#8217;d like that to include the JS code, if at all possible to do with relative safety.</p>
<p>Patches and pull requests are welcome, especially if you&#8217;re smarter than me about these things. (It&#8217;s not hard to be smarter than me about these things.)</p>
<h3>Scaling &amp; Stability</h3>
<p>KumaScript scales like just about any web service. You can stick it behind a load balancer. Scale it horizontally by throwing more CPUs and processes at the problem. Cache the hell out of the responses. Throw a proxy in front of it to cache the hell out of outgoing requests to external services. Again, this is meant to be as boring as I can make it.</p>
<p>And, if a KumaScript process should happen to misbehave or starts having a seizure, just kill it and start another one. There should be no state to worry about, and the processes should start up really fast. Ideally, the logs will have recorded what went wrong and we end up with just a transient error.</p>
<h3>Maturity &amp; THE FUTURE</h3>
<p>KumaScript turned a year old last month, has been in production since last summer, and had its last commit around 5 months ago. It has lots of tests, and it uses a version of Node.js from early 2012.</p>
<p>That doesn&#8217;t mean it&#8217;s abandoned, though: KumaScript is a mature project by most definitions. It&#8217;s been working well enough that I haven&#8217;t wanted to touch it. Most of the work goes on within the wiki itself, and KumaScript is meant to be the smallest piece it can be.</p>
<p>And maturity doesn&#8217;t mean I don&#8217;t have notions about future work. Off the top of my head, I&#8217;d like to get around things like the following:</p>
<ul>
<li>Improve template execution &amp; sandboxing. Currently, if any one thing misbehaves in the document, the whole process gets aborted. Maybe instead, I should <a href="https://github.com/lloyd/node-compute-cluster">spin up a pool of processes</a>: Each them can take care of executing a single macro, while a master process watches for CPU / RAM / network abuse and kills anything that behaves badly.</li>
<li>Reconsider my possibly brain-dead approach to parsing source documents for macros using a PEG.js grammar. Or, maybe it&#8217;s good enough.</li>
<li>Need much better error trapping and reporting throughout everywhere.</li>
<li>Need much better use of <a href="https://github.com/etsy/statsd/">statsd</a> for measuring timings and suchlike.</li>
<li>Maybe offer an HTTP proxy that runs all content through the service, for easier deployment atop existing sites beyond MDN.</li>
</ul>
<p>And of course: Suggestions, patches, and pull requests are more than welcome!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmorchard.com/2013/02/21/kumascript/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Building my couch computing station</title>
		<link>http://blog.lmorchard.com/2013/02/10/building-my-couch-computing-station</link>
		<comments>http://blog.lmorchard.com/2013/02/10/building-my-couch-computing-station#comments</comments>
		<pubDate>Sun, 10 Feb 2013 05:27:44 +0000</pubDate>
		<dc:creator>lmorchard</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[diy]]></category>
		<category><![CDATA[hacks]]></category>
		<category><![CDATA[lcd]]></category>
		<category><![CDATA[pc]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://blog.lmorchard.com/?p=840</guid>
		<description><![CDATA[Remember when I posted about gaming from the Orchard House couch? The key part was figuring out how to get a laptop-quality LCD monitor working in the living room, preferably attached to my trusty IKEA DAVE. Well, despite my best attempts at ruining my materials and tools, I managed to get it built! For reference, [...]]]></description>
				<content:encoded><![CDATA[<p>Remember when I posted about <a href="http://blog.lmorchard.com/2013/01/21/gaming-from-the-orchard-house-couch">gaming from the Orchard House couch</a>? The key part was figuring out how to get <a href="http://blog.lmorchard.com/2013/01/21/gaming-from-the-orchard-house-couch#Laptop_decapitation">a laptop-quality LCD monitor working in the living room</a>, preferably attached to my trusty IKEA DAVE. Well, despite my best attempts at ruining my materials and tools, I managed to get it built!</p>
<p><span id="more-840"></span></p>
<p>For reference, here&#8217;s what I came up with in Google Sketchup:</p>
<p><a href="http://blog.lmorchard.com/wp-content/uploads/2013/01/couch-gaming-2a-pc.png"><img src="http://blog.lmorchard.com/wp-content/uploads/2013/01/couch-gaming-2a-pc.png" alt="couch-gaming-2a-pc" width="506" height="910" class="alignnone size-full wp-image-671" /></a></p>
<p>Spoiler alert &#8211; here&#8217;s what the final product looks like:</p>
<p><a href="http://blog.lmorchard.com/wp-content/uploads/2013/02/2013-02-03-23.33.12.jpg"><img class="alignnone size-large wp-image-832" alt="2013-02-03 23.33.12" src="http://blog.lmorchard.com/wp-content/uploads/2013/02/2013-02-03-23.33.12-1024x768.jpg" width="640" height="480" /></a></p>
<h3>Display from the other side of the earth</h3>
<p><a href="http://www.ebay.com/itm/HDMI-VGA-DVI-Audio-LCD-controller-board-17-3-LP173WF1-1920-1080-lcd-panel-/170940546439?pt=LH_DefaultDomain_0&amp;hash=item27ccd9bd87" target="_blank">The first piece</a> arrived a week or so ago:</p>
<div id="attachment_825" class="wp-caption alignnone" style="width: 650px"><a href="http://blog.lmorchard.com/wp-content/uploads/2013/02/2013-01-31-11.24.53.jpg"><img src="http://blog.lmorchard.com/wp-content/uploads/2013/02/2013-01-31-11.24.53-1024x768.jpg" alt="LCD panel and control board" width="640" height="480" class="size-large wp-image-825" /></a><p class="wp-caption-text">LCD panel and control board</p></div>
<p style="clear: both;">Having never ordered anything like this before from a random eBay store out of China, I half expected it to never show up. But, <a href="http://stores.ebay.com/chinatobby?_trksid=p2047675.l2568" target="_blank">the merchant</a> has near <a href="http://feedback.ebay.com/ws/eBayISAPI.dll?ViewFeedback2&amp;userid=chinatobby2011&amp;ftab=AllFeedback" target="_blank">perfect 99.9% feedback scores</a>, so I hit the &#8220;Buy it now&#8221; button and crossed my fingers.</p>
<p>Something great was that the confirmation email noted, &#8220;because what you bought will be shipped from the other side of the earth, it needs time&#8221;. Well, fair enough: I did pick the cheapest delivery option. Still, even with that bit of expectation setting, the package showed up just 10 days later. (<a href="https://twitter.com/search?q=%23livinginthefuture" target="_blank">#LivingInTheFuture</a> #FTW)</p>
<p>What arrived was a <a href="http://www.panelook.com/LP173WF1-TLA1_LG%20Display_17.3_LCM_parameter_5857.html" target="_blank">17.3&#8243; 1920&#215;1080 TN LCD panel</a>, apparently used in a variety of high-end PC laptops from HP and Sony. What was also in the box was <a href="http://www.vslcd.com/Specification/M.NT68676.2A.pdf" target="_blank">a little driver board</a> that connects to the panel via LVDS cable. The driver board takes a 12v DC power supply, accepts HDMI / VGA / DVI video inputs, and even offers a headphone audio output jack.</p>
<p>Overall, this hardware is exactly what I was looking for: Basically the head chopped off a laptop, with the right connectors for a desktop PC. What I needed now was an enclosure, and a way to mount the enclosure to my IKEA DAVE.</p>
<h3>Mounting hardware</h3>
<p>As it happened, I had <a href="http://www.amazon.com/gp/product/B000ID7QNI/ref=as_li_ss_tl?ie=UTF8&#038;camp=1789&#038;creative=390957&#038;creativeASIN=B000ID7QNI&#038;linkCode=as2&#038;tag=0xdecafbad01-20" title="VideoSecu Articulating TV Wall Mount Bracket for VESA 100 LCD LED Flat Screen Monitor TV 1E9">a cheap VESA mount with an articulated arm laying</a><img src="http://www.assoc-amazon.com/e/ir?t=0xdecafbad01-20&#038;l=as2&#038;o=1&#038;a=B000ID7QNI" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> around. We never got around to using it to stick a TV on the wall, so it seemed worth a shot to see if it would work on the IKEA DAVE.</p>
<p><a href="http://www.amazon.com/gp/product/B000ID7QNI/ref=as_li_ss_il?ie=UTF8&#038;camp=1789&#038;creative=390957&#038;creativeASIN=B000ID7QNI&#038;linkCode=as2&#038;tag=0xdecafbad01-20"><img border="0" src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&#038;ASIN=B000ID7QNI&#038;Format=_SL110_&#038;ID=AsinImage&#038;MarketPlace=US&#038;ServiceVersion=20070822&#038;WS=1&#038;tag=0xdecafbad01-20" ></a><img src="http://www.assoc-amazon.com/e/ir?t=0xdecafbad01-20&#038;l=as2&#038;o=1&#038;a=B000ID7QNI" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
<p>For around $15, it&#8217;s just about right: I had to mount it sideways, and it doesn&#8217;t <em>quite</em> fully work that way. The side-to-side angle doesn&#8217;t want to support any weight in an up-and-down tilt, but the rest of the arm tightens down, so it&#8217;s good enough.</p>
<h3 style="clear: both;">Building the enclosure</h3>
<p>I don&#8217;t have a 3D printer or a laser cutter. Though there is <a href="http://www.i3detroit.com/" target="_blank">a friendly hackerspace</a> suitably equipped nearby, I wanted to see what I could prototype by hand. So, I went to Home Depot and bought <a href="http://www.homedepot.com/h_d1/N-5yc1v/R-100542281/h_d2/ProductDisplay?catalogId=10053&amp;langId=-1&amp;keyword=acrylic&amp;storeId=10051#.URcEEZykOUk" target="_blank">4 polystyrene panels</a>, <a href="http://www.homedepot.com/h_d1/N-5yc1v/R-203040434/h_d2/ProductDisplay?catalogId=10053&amp;langId=-1&amp;keyword=dremel&amp;storeId=10051#.URcW75ykOUk" target="_blank">a Dremel tool</a>, and <a href="http://www.homedepot.com/h_d1/N-5yc1v/R-202519358/h_d2/ProductDisplay?catalogId=10053&amp;langId=-1&amp;keyword=acrylic+cutter&amp;storeId=10051#.URcXIJykOUk" target="_blank">an acrylic cutter</a>.</p>
<p>With lots of trial and error, and truly awful manufacturing tolerances, I came up with a crude design consisting of 6 stacked layers bolted together with machine screws:</p>
<ol>
<li>Back layer with VESA mounting holes and an exit for the LVDS cable.</li>
<li>Layer with VESA mounting holes and a pocket to route the LVDS cable.</li>
<li>Layer behind the LCD with pocket for LVDS cable and heads of VESA mount bolts.</li>
<li>Strips across the top and sides to hold the LCD panel.</li>
<li>More strips across the top and sides to hold the LCD panel.</li>
<li>Strips across the top and sides, covering the bezel area of the LCD panel.</li>
</ol>
<p>I made a ton of measurements and little indecipherable sketches in my grid-lined Moleskine, but those were mostly crap. No battle plan survives contact with the enemy, and all that. In the end, I just flew by the seat of my pants and hacked away.</p>
<p>This process taught me that a Dremel (in my hands, at least) is absolutely no substitute for a laser cutter. I <em>really</em> didn&#8217;t anticipate just how horrible I&#8217;d be at cutting this stuff. Trying to cut just-right shapes out of the polystyrene turned into a dismal, stinky mess. But luckily, all the material I thought I&#8217;d wasted turned out to be perfect for cutting out as strips for the bezel and sides.</p>
<p>So, in lieu of a diagram, how about some pictures?</p>
<div class="wp-caption alignnone" style="width: 650px"><a href="http://blog.lmorchard.com/wp-content/uploads/2013/02/2013-02-03-20.29.331.jpg"><img title="Back layers, attached to the VESA mount clamped to my workbench" alt="Back layers, attached to the VESA mount clamped to my workbench" src="http://blog.lmorchard.com/wp-content/uploads/2013/02/2013-02-03-20.29.331-1024x768.jpg" width="640" height="480" /></a><p class="wp-caption-text">Back layers, attached to the VESA mount clamped to my workbench.</p></div>
<p>Here&#8217;s a little trick I worked out in this construction process: I used squares of electrical tape to retain the machine screws, so that I could flip the thing around while I was assembling layers on top before threading on the nuts. And speaking of that, here are the rest of the pieces in place:</p>
<div id="attachment_850" class="wp-caption alignnone" style="width: 650px"><a href="http://blog.lmorchard.com/wp-content/uploads/2013/02/2013-02-03-00.36.29.jpg"><img class="size-large wp-image-850" title="Further layers bolted into the stack" alt="Further layers bolted into the stack" src="http://blog.lmorchard.com/wp-content/uploads/2013/02/2013-02-03-00.36.29-1024x768.jpg" width="640" height="480" /></a><p class="wp-caption-text">Further layers bolted into the stack</p></div>
<p>The middle two layers cradling the sides of the LCD panel alternate between long sides / short top and long top / short sides, providing a bit more stability in the way they overlap. The top layer is long sides / short top, with a bit more width to cover the 5mm or so of the LCD panel&#8217;s bezel area.</p>
<p>Immediately behind the LCD panel is a layer with a cut-out to provide space for machine screws for the VESA mount, and a pocket through which to route the LVDS cable to the control board. And the final two layers form the actual VESA mount and complete the exit route for the LVDS cable.</p>
<div class="wp-caption alignnone" style="width: 650px"><a href="http://blog.lmorchard.com/wp-content/uploads/2013/02/2013-02-03-20.44.09.jpg"><img title="Video control board bolted onto the back" alt="Video control board bolted onto the back" src="http://blog.lmorchard.com/wp-content/uploads/2013/02/2013-02-03-20.44.09-1024x768.jpg" width="640" height="480" /></a><p class="wp-caption-text">Video control board bolted onto the back</p></div>
<p>And finally, here&#8217;s the video control board on the back. Rather than make a full box for the board, I just sandwiched it with machine screws between acrylic layers and nylon spacers. Then, I bolted that whole mess onto the back layers.</p>
<p>Midway through this process, I switched from Home Depot to <a href="http://frentzandsons.com/content/default.htm">a family-owned hardware store</a> a few blocks from my house. I think they recognize me as a regular now after repeat visits for Dremel bits, screws, and a pile of other miscellanea.</p>
<h3>Mounting the mess to the DAVE</h3>
<p>The VideoSecu VESA mount went onto the IKEA DAVE rather crudely with a pair of long wood screws. It feels pretty solid, but the screws stab treacherously out through the bottom. I&#8217;ll need to address that someday, probably after they stab me in the kneecaps.</p>
<p>And, as it turns out, the control board placement was a mistake. Once I got the VESA arm screwed onto the IKEA DAVE, there wasn&#8217;t enough room to connect the power and an HDMI cable to the board. Or rather, there was just enough room to do so and inadvertently destroy an HDMI cable after a few hours of the monitor&#8217;s weight resting on it. I guess the good news is that the cable went before the solder joints on the jack failed. Herp, derp.</p>
<p>So, I bought a new HDMI cable, unbolted the board, and stuck it onto the back with <a href="http://www.amazon.com/gp/product/B00004Z4A8/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B00004Z4A8&amp;linkCode=as2&amp;tag=0xdecafbad01-20" target="_blank">double sided tape</a>. Here&#8217;s what the back looks like now:</p>
<div id="attachment_826" class="wp-caption alignnone" style="width: 650px"><a href="http://blog.lmorchard.com/wp-content/uploads/2013/02/2013-02-05-00.28.14.jpg"><img class="size-large wp-image-826" title="LCD enclosure attached to the IKEA DAVE" alt="LCD enclosure attached to the IKEA DAVE" src="http://blog.lmorchard.com/wp-content/uploads/2013/02/2013-02-05-00.28.14-1024x768.jpg" width="640" height="480" /></a><p class="wp-caption-text">LCD enclosure attached to the IKEA DAVE, featuring bonus <a href="http://www.flickr.com/photos/deusx/tags/cheddars/" target="_blank">Cheddars</a> appearance</p></div>
<p>I also used the same tape to attach the button board to the front of the enclosure.</p>
<div id="attachment_853" class="wp-caption alignnone" style="width: 650px"><a href="http://blog.lmorchard.com/wp-content/uploads/2013/02/2013-02-09-23.20.43.jpg"><img class="size-large wp-image-853" alt="Button board on front" src="http://blog.lmorchard.com/wp-content/uploads/2013/02/2013-02-09-23.20.43-1024x768.jpg" width="640" height="480" /></a><p class="wp-caption-text">Button board on front</p></div>
<p>Overall, this thing works pretty much exactly as I&#8217;d imagined it. I <a href="http://pcpartpicker.com/p/z3mE" target="_blank">built a PC</a> in a <a href="http://icrontic.com/article/fractal-design-node-304-case-review" target="_blank">Fractal Node 304</a> mini-ITX case, and hid that under the coffee table. I bundled the cables together and used velcro wraps to bind them to the DAVE, and <a href="http://www.rabbit.org/faq/sections/rabbit-proofing.html#cords" target="_blank">some spiral wraps to bunny-proof</a> them as much as possible.</p>
<div id="attachment_855" class="wp-caption alignnone" style="width: 650px"><a href="http://blog.lmorchard.com/wp-content/uploads/2013/02/2013-02-09-23.38.29.jpg"><img class="size-large wp-image-855" alt="Cheddars just loves my new couch PC" src="http://blog.lmorchard.com/wp-content/uploads/2013/02/2013-02-09-23.38.29-1024x768.jpg" width="640" height="480" /></a><p class="wp-caption-text"><a href="http://www.flickr.com/photos/deusx/tags/cheddars/" target="_blank">Cheddars</a> just loves my new couch PC. Or, maybe she wants dinner.</p></div>
<h3>What&#8217;s next?</h3>
<p>This monitor is ugly if you look at it too closely. I slipped a bit with the acrylic cutter and left some obvious gouges, and the layers have a grubby patina of scratches just from clumsy handling throughout the process. Basically, it&#8217;s very, very obviously hand-made by a guy who writes software for a living and hasn&#8217;t touched a power tool for more than 5 minutes since high school shop class.</p>
<p>But, I think some really valuable things came out of this first attempt: It took me a bit to work through how to mount the LCD panel and route the cable out the back in a way that didn&#8217;t put stress on the wires or the connectors. There was a lot of fudge factor in getting the VESA mount alignment just right. And, there was also that HDMI cable I wrecked by botching the control board placement. Beyond all that, though, the basic idea worked.</p>
<p>So, I&#8217;m already thinking about v2.0 and making friends over at <a href="http://www.i3detroit.com/" target="_blank">i3Detroit</a> who can drive <a href="http://i3detroit.com/wi/index.php?title=Laser_Cutting_and_Etching" target="_blank">a laser cutter</a>. I&#8217;m checking out <a href="http://www.ponoko.com/starter-kits/inkscape" target="_blank">Inkscape and Ponoko</a>. I&#8217;d also like to find some better materials &#8211; maybe aluminum for the front bezel and back panel, and maybe drop a layer from the stack. It would be really nice to get a much cleaner look and drop some weight. Also, an upgrade to this cheap VESA mount would be keen &#8211; I can&#8217;t <em>quite</em> get all the adjustments I&#8217;d like.</p>
<p>Overall, this thing works, and that makes me pretty happy. In the beginning, I had really hoped to just find someone else had made this exact thing &#8211; maybe on Thingiverse. But, no such luck. This <a href="http://www.instructables.com/id/Laptop-to-Desktop-Conversion/" target="_blank">&#8220;Laptop-to-Desktop&#8221; Instructable</a> is pretty close, but not entirely what I needed. I guess DIY high-res LCD monitors are just not a thing. But, maybe this post and a possible v2.0 post in the future might come in handy for someone else.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmorchard.com/2013/02/10/building-my-couch-computing-station/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Naming Things: CamelCase vs snake_case</title>
		<link>http://blog.lmorchard.com/2013/01/23/naming-conventions</link>
		<comments>http://blog.lmorchard.com/2013/01/23/naming-conventions#comments</comments>
		<pubDate>Wed, 23 Jan 2013 22:37:55 +0000</pubDate>
		<dc:creator>lmorchard</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CamelCase]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[snake_case]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://blog.lmorchard.com/?p=789</guid>
		<description><![CDATA[I&#8217;ve contributed code to a number of projects, often as a drive-by bug fix in a GitHub pull request. And, usually, I&#8217;ll try to do as the Romans do and follow the local naming and coding conventions. But, sometimes, I&#8217;ll fall back to my personal conventions and get dinged in the code review. For what [...]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve contributed code to a number of projects, often as a drive-by bug fix in a GitHub pull request. And, usually, I&#8217;ll try to do as the Romans do and follow the local naming and coding conventions. But, sometimes, I&#8217;ll fall back to my personal conventions and get dinged in the code review.</p>
<p><span id="more-789"></span></p>
<p>For what it&#8217;s worth, those personal conventions look something like this:</p>
<dl>
<dt><code>variable_names_in_snake_case</code></dt>
<dd>Variable, a mutable thing. All lower case, words separated by underscores.</dd>
<dt><code>CONSTANTS_IN_ALL_CAPS</code></dt>
<dd>Constant, an immutable thing. All upper case, words separated by underscores.</dd>
<dt><code>functionAndMethodNames</code></dt>
<dd>Functions and methods, immutable and callable things. Mixed camel case, first letter always lower case.</dd>
<dt><code>StructAndClassNames</code></dt>
<dd>Structs and classes, immutable and instantiatable things. Mixed camel case, first letter always upper case.</dd>
</dl>
<p>Of course, given the features of any particular language, these rules yield subtleties. For instance, in JavaScript a variable can be assigned a callable thing, a declared function can be replaced by assignment, and classes &amp; methods are themselves mainly just suggestions. These conventions are more about my intentions than anything literally baked into syntax.</p>
<p>I&#8217;ve been using some variant of the above rules for close to 20 years, across probably a dozen languages. On JavaScript projects, I end up with <a href="http://en.wikipedia.org/wiki/Snake_case">snake_case</a> in undesirable places. On Python projects, I&#8217;ll use <a href="http://en.wikipedia.org/wiki/CamelCase">CamelCase</a> where it&#8217;s not wanted.</p>
<p>On the Python side, I know there&#8217;s <a href="http://www.python.org/dev/peps/pep-0008/">PEP 8</a>. That&#8217;s something to point at and claim uniformity, and <a href="http://pypi.python.org/pypi/pep8">it has tooling support</a>. On the JavaScript side, I seem to be missing some recent consensus amongst the current wave of browser and nodejs enthusiasts. That, or I&#8217;m just contributing to more projects than my own these days (thanks to GitHub) and only running into this now.</p>
<p>But, here&#8217;s what always leaves me mildly rankled: Why just one or the other? Why discard the semantic shading available through mixing <a href="http://en.wikipedia.org/wiki/Snake_case">snake_case</a> and <a href="http://en.wikipedia.org/wiki/CamelCase">CamelCase</a>, at least by way of consistent rules? I know there&#8217;s a such thing as syntax highlighting, but combining that with these conventions has often helped me with highlighting is unavailable. <a href="http://en.wiktionary.org/wiki/belt_and_suspenders">Belt and suspenders</a>, and all that.</p>
<p>Of course, I prefer my rules, because they&#8217;re a deeply ingrained habit. I know this is my peeve. But, what I&#8217;ve never quite been able to get is a satisfying answer as to why one style is preferred to the exclusion of another. Usually I get responses like &#8220;That&#8217;s just the way it&#8217;s done&#8221;, or &#8220;The other way is ugly&#8221;. So, it&#8217;s down to personal whim, project momentum, or <a href="http://en.wikipedia.org/wiki/Cargo_cult">cargo cult</a>.</p>
<p>I guess it bothers me to see a perfectly good semantic tool thrown out for no good reason as far as I can tell. Feel free to drop me a comment here, if I&#8217;m missing any good reasons. Some additional bits and pieces accumulate below:</p>
<ul>
<li>
<p>Here are some arguments against CamelCase for <a href="http://stackoverflow.com/questions/1740116/for-what-reason-do-we-have-the-lower-case-with-underscores-naming-convention/1740152#1740152">accessibility reasons</a> and for <a href="http://stackoverflow.com/questions/1740116/for-what-reason-do-we-have-the-lower-case-with-underscores-naming-convention/1740131#1740131">non-english speakers</a>.</p>
</li>
<li>
<p><a href="http://glyph.twistedmatrix.com/2012/10/a-tired-hobgoblin.html">The Twisted project uses <em>both</em> CamelCase <em>and</em> snake_case in the same variable names.</a> The bit before the underscore signifies the type of a method, and the bit after is the name &#8211; eg. <code>remote_loginAnonymous</code> or <code>test_addDSAIdentityNoComment</code>.</p>
</li>
</ul>
<p>Anyway, this has been bugging me for long enough that here I am finally blogging about it, so that I have an URL to throw into conversations when it comes up.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmorchard.com/2013/01/23/naming-conventions/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Gaming from the Orchard House couch</title>
		<link>http://blog.lmorchard.com/2013/01/21/gaming-from-the-orchard-house-couch</link>
		<comments>http://blog.lmorchard.com/2013/01/21/gaming-from-the-orchard-house-couch#comments</comments>
		<pubDate>Mon, 21 Jan 2013 06:37:38 +0000</pubDate>
		<dc:creator>lmorchard</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[diy]]></category>
		<category><![CDATA[gaming]]></category>
		<category><![CDATA[hacks]]></category>
		<category><![CDATA[home]]></category>
		<category><![CDATA[lcd]]></category>
		<category><![CDATA[pc]]></category>

		<guid isPermaLink="false">http://blog.lmorchard.com/?p=668</guid>
		<description><![CDATA[I like playing video games; it&#8217;s one of my favorite things in life. I also like hanging out with my wife; she&#8217;s my favorite person in the world. This is a post about ensuring these two things can happen together. This is also a post where I played with SketchUp for the first time. The [...]]]></description>
				<content:encoded><![CDATA[<p>I like playing video games; it&#8217;s one of my favorite things in life. I also like hanging out with my wife; she&#8217;s my favorite person in the world. This is a post about ensuring these two things can happen together. This is also a post where I played with SketchUp for the first time.</p>
<p><span id="more-668"></span></p>
<h2>The nightlife at Orchard House</h2>
<p><a style="display: block; float: right; margin: 0 0 0.75em 0.75em" href="http://blog.lmorchard.com/wp-content/uploads/2013/01/couch-gaming-1-laptop.png"><img src="http://blog.lmorchard.com/wp-content/uploads/2013/01/couch-gaming-1-laptop-300x238.png" alt="couch-gaming-1-laptop" width="300" height="238" class="alignnone size-medium wp-image-670" /></a></p>
<p>Here, on the left, you can see a scale model of evenings at Orchard House. Alex and I like to spend nights making fun of crappy TV, piddling around on our laptops, and attracting household pets. (Yeah, I had a little too much fun playing around in <a href="http://www.sketchup.com/">SketchUp</a> tonight.)</p>
<p>So, when I play video games, I don&#8217;t usually take over the TV &#8211; at least, not until later in the evening, when the girl succumbs to napping and I feel like firing up the Xbox. What I&#8217;ve ended up with for most nights, then, is running games from Steam (I&#8217;m <a href="steamcommunity.com/id/lmorchard">lmorchard</a>) on Windows 7 running on a 2010 MacBook Pro 15&#8243; via Boot Camp.</p>
<p>This is less than optimal, but it works tolerably for many fun things.</p>
<h2>My current gaming rig</h2>
<p><a style="display: block; float: left; margin: 0 0.75em 0.75em 0" href="http://blog.lmorchard.com/wp-content/uploads/2013/01/couch-gaming-1a-laptop.png"><img src="http://blog.lmorchard.com/wp-content/uploads/2013/01/couch-gaming-1a-laptop-175x300.png" alt="couch-gaming-1a-laptop" width="175" height="300" class="alignnone size-medium wp-image-669" /></a></p>
<p>Let&#8217;s zoom and enhance, because I can do that in SketchUp. On the right, you can see a model of my gaming rig. It consists mainly of the aforementioned <a href="http://www.amazon.com/gp/product/B00578O5W4/ref=as_li_ss_tl?ie=UTF8&amp;tag=0xdecafbad01-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B00578O5W4">Apple MacBook Pro</a>, an <a href="http://www.ikea.com/us/en/catalog/products/00120818/">Ikea DAVE laptop table</a>, and a <a href="http://www.amazon.com/gp/product/B001F42MKG/ref=as_li_ss_tl?ie=UTF8&amp;tag=0xdecafbad01-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B001F42MKG">Logitech Trackman Marble Mouse</a>.</p>
<p>I really like the DAVE table &#8211; we&#8217;ve accumulated 4 of these things at last count. They&#8217;re cheap &#8211; easily had from Ikea for around $20 &#8211; and go together in 2 minutes. I&#8217;ve used them instead of buying <a href="http://www.amazon.com/gp/product/B000IG1NFM/ref=as_li_ss_tl?ie=UTF8&amp;tag=0xdecafbad01-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B000IG1NFM" title="Humanscale Keyboard, Standard Platform, 4G Mechanism with Clip Mouse and Gel Leather Palm Support">$400 ergonomic keyboard trays</a> for my desk. (I really missed those, when I left Yahoo!)</p>
<p>I even took one outside to make <a href="https://sphotos-b.xx.fbcdn.net/hphotos-prn1/26116_383125243201_3986077_n.jpg">working on the deck</a> easier on my wrists. And, of course, I&#8217;ve been gradually evolving one into a couch computing station.</p>
<p><a style="display: block; float: right; margin: 0 0 0.75em 0.75em" href="http://www.flickr.com/photos/deusx/8269329367/" title="My couch computing rig by lmorchard, on Flickr"><img src="http://blog.lmorchard.com/wp-content/uploads/2013/01/coughrigphoto.png" alt="coughrigphoto" width="261" height="266" class="alignnone size-full wp-image-716" /></a></p>
<p>Here on the right is a picture of my couch-side DAVE, sans MacBook pro. The big thing is a <a href="http://www.amazon.com/gp/product/B005C31HC0/ref=as_li_ss_tl?ie=UTF8&amp;tag=0xdecafbad01-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B005C31HC0">Cooler Master NotePal X-Slim Cooling Pad</a>, because my laptop has a habit of overheating and shutting itself down in the middle of Windows games, especially in the middle of summer.</p>
<p>I&#8217;ve also been cycling through different pairs of headphones, and am currently trying out a pair of <a href="http://www.amazon.com/gp/product/B005GTNZUM/ref=as_li_ss_tl?ie=UTF8&amp;tag=0xdecafbad01-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B005GTNZUM">Logitech H800</a> wireless headphones. (The <a href="http://www.amazon.com/gp/product/B001J30FZM/ref=as_li_ss_tl?ie=UTF8&amp;tag=0xdecafbad01-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B001J30FZM">Plantronics 355&#8242;s</a> in the picture had been turned wireless when the bunny hopped by and gave it a nip. So, I took the hint.)</p>
<h2>Thoughts on a new gaming rig</h2>
<p>Like I wrote earlier, many fun games can be played tolerably well on this 2010 MacBook Pro in Boot Camp. But, this is suboptimal and a dead end for upgrades where it matters. I could get an updated laptop, but that&#8217;s just kicking the can down the road. And besides, this machine is intended more as a productivity machine for me than gaming.</p>
<p>I could also buy a real gaming laptop, but those things are expensive &#8211; and also less than great for upgrades.</p>
<p><a style="display: block; float: left; margin: 0 0.75em 0.75em 0" href="http://blog.lmorchard.com/wp-content/uploads/2013/01/couch-gaming-2-pc.png"><img src="http://blog.lmorchard.com/wp-content/uploads/2013/01/couch-gaming-2-pc-300x248.png" alt="couch-gaming-2-pc" width="300" height="248" class="alignnone size-medium wp-image-672" /></a></p>
<p>What about a desktop gaming PC? It&#8217;s been a long time since I last built a PC &#8211; something on the order of 10 years. But, it seems like this would be the cheaper and more easily upgraded route</p>
<p>The deal breaker, though, is the <em>desktop</em> part. Like I said, I like hanging out with my wife on the couch &#8211; I&#8217;m not going to wander off to a desk by myself to indulge my gaming hobby. If I had to choose, my wife wins every time. She&#8217;s my best friend.</p>
<p>So, pictured above, I&#8217;m thinking about what it would take to replace my laptop with a desktop at the couch. I need a monitor that fits on my DAVE, and I need a place to stick a big box.</p>
<h2>Laptop decapitation</h2>
<p><a style="display: block; float: right; margin: 0 0 0.75em 0.75em" href="http://blog.lmorchard.com/wp-content/uploads/2013/01/couch-gaming-2a-pc.png"><img src="http://blog.lmorchard.com/wp-content/uploads/2013/01/couch-gaming-2a-pc-166x300.png" alt="couch-gaming-2a-pc" width="166" height="300" class="alignnone size-medium wp-image-671" /></a></p>
<p>Let&#8217;s zoom &amp; enhance again, on the right. Basically, what I&#8217;ve mocked up here is the LCD panel from my laptop torn off and bolted to the DAVE. I&#8217;ve got an <a href="http://www.amazon.com/Apple-Wireless-Keyboard-MC184LL-VERSION/dp/B005DLDO4U/ref=sr_1_1?ie=UTF8&amp;qid=1358748005&amp;sr=8-1&amp;keywords=apple+wireless">Apple Wireless Keyboard</a> there. But, it could just as easily be a <a href="http://www.amazon.com/gp/product/B0000BW01X/ref=as_li_ss_tl?ie=UTF8&amp;tag=0xdecafbad01-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B0000BW01X">Happy Hacking Keyboard</a>, if only I&#8217;d found the right model in SketchUp. Maybe I&#8217;ll even get &#8220;serious&#8221; and look into a gaming keyboard with a numpad.</p>
<p>Unfortunately, I can&#8217;t seem to find a decent off-the-shelf LCD monitor that won&#8217;t crush the DAVE and yet has as nice a resolution &amp; density as my MacBook Pro display. But, after a day of musing on Facebook and poking around on eBay, I found an exciting lead.</p>
<p><a style="display: block; float: left; margin: 0 0.75em 0.75em 0" href="http://www.ebay.com/itm/HDMI-VGA-DVI-Audio-LCD-controller-board-17-3-LP173WF1-1920-1080-lcd-panel-/170940546439?pt=LH_DefaultDomain_0&#038;hash=item27ccd9bd87"><img src="http://blog.lmorchard.com/wp-content/uploads/2013/01/622302621_o-300x224.jpg" alt="622302621_o" width="300" height="224" class="alignnone size-medium wp-image-682" /></a></p>
<p>As it turns out, you can buy an LCD display panel and a board to drive it from plain old HDMI / DVI / VGA inputs. On the left is one that I&#8217;ve ordered. <a href="http://www.ebay.com/itm/HDMI-VGA-DVI-Audio-LCD-controller-board-17-3-LP173WF1-1920-1080-lcd-panel-/170940546439?pt=LH_DefaultDomain_0&amp;hash=item27ccd9bd87">It&#8217;s 17.3&#8243; and offers 1920 x 1080 resolution</a>.</p>
<p>This seems pretty nice to me, since it&#8217;s slightly better than my current laptop and will sit less than 2-3 feet from my face. Worst case, I can use it as a second monitor for my desk. Or, I could move the Xbox to under the couch and hook it up on the HDMI input. I could even use headphones, since the display interface board has an output jack.</p>
<p>I&#8217;ll have to fabricate some sort of housing for the display, and find a way to attach it to the DAVE with friction hinges. Since this will be in the living room, it also wouldn&#8217;t hurt if the result looks clean. I&#8217;m hoping this won&#8217;t be an impossible task, despite my carpentry skills having last been exercised in high school shop class almost 20 years ago. Less than 10 miles from me is <a href="http://www.i3detroit.com/">i3Detroit</a>, an awesome maker space, so I could avail myself of some tinkerers there.</p>
<h2>Couching gamer, hidden tower</h2>
<p><a style="display: block; float: right; margin: 0 0 0.75em 0.75em" href="http://blog.lmorchard.com/wp-content/uploads/2013/01/unsightly-pc-tower.png"><img src="http://blog.lmorchard.com/wp-content/uploads/2013/01/unsightly-pc-tower-300x279.png" alt="unsightly-pc-tower" width="300" height="279" class="alignnone size-medium wp-image-756" /></a></p>
<p>Let&#8217;s zoom &amp; enhance on that PC tower. I&#8217;ll stub my toes on it, as I wander to and from the kitchen. And, that girl I like hanging out with will probably brain me with it. That thing is not going to fly.</p>
<p>Ideally, I&#8217;d love to stash it under the couch. But, under the couch gives me only about 4&#8243; of clearance. I think most of the video cards I&#8217;m considering are taller than that, let alone the cases.</p>
<p>Other options might include hiding it behind the couch, but only if it doesn&#8217;t have howling turbines that prevent the girl from taking the naps mentioned earlier. We also have an entertainment center, which could be an option if running cables across the room isn&#8217;t ugly and if they don&#8217;t become bunny food (see aforementioned headphones). Oh, and the entertainment center is poorly ventilated.</p>
<p>Maybe behind the couch is the best option, assuming everything but the monitor is wireless.</p>
<h2>Living in the Post-PC future</h2>
<p>So, assuming I get this display panel working and mounted, and I find a place to stick the PC case, now I have to figure out what to stick inside the case. My budget is not infinite, but I&#8217;m curious to see if I can keep it under $600. But, I&#8217;m so out of the DIY PC loop, that I don&#8217;t even know if that&#8217;s a sane ballpark for satisfying gaming.</p>
<p>On the one hand, I think I&#8217;m relatively easy to satisfy. After all, I&#8217;m putting up with games on this MacBook Pro that sometimes never get more than 15-20 FPS. Ideally, I&#8217;d like to blow well past that &#8211; that&#8217;s the whole point, really. But, I don&#8217;t need insane bells &amp; whistles that I won&#8217;t appreciate on this 17&#8243; 1920&#215;1080 display. I&#8217;ll also never ever bother with 3D. It would just be nice, for once, to get high frame rates on at least last year&#8217;s games.</p>
<p>This is where my ideas run out, and I need to do more research and bug some friends. But, that&#8217;s okay, because I think this is a relatively boring part. What&#8217;s in the box is less interesting to me than where to put it and how to hook it up at the couch.</p>
<p>Still, let&#8217;s see where I end up going with this. More updates after I get delivery of this LCD panel.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmorchard.com/2013/01/21/gaming-from-the-orchard-house-couch/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Trifecta #59: Intention</title>
		<link>http://blog.lmorchard.com/2013/01/09/trifecta-59-intention</link>
		<comments>http://blog.lmorchard.com/2013/01/09/trifecta-59-intention#comments</comments>
		<pubDate>Wed, 09 Jan 2013 17:41:47 +0000</pubDate>
		<dc:creator>lmorchard</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[fiction]]></category>
		<category><![CDATA[magic]]></category>
		<category><![CDATA[trifecta]]></category>

		<guid isPermaLink="false">http://blog.lmorchard.com/?p=638</guid>
		<description><![CDATA[Thought I might try my hand at this Trifecta thing I just found, by way of Fred. The challenge is to write fiction, between 33 and 333 words, using the word of the week and its associated definition. I think I ended up with more of an introduction to something than a complete story, but [...]]]></description>
				<content:encoded><![CDATA[<p><a style="display: block; float: right; margin: 0 0 0.25em 0.25em; border: 0" border="0" href="http://www.trifectawritingchallenge.blogspot.com" target="_blank"><img style="border: 0" src="http://i1132.photobucket.com/albums/m573/SeekingBlog/Picture11-1.png" /></a>Thought I might try my hand at <a href="http://www.trifectawritingchallenge.com/2013/01/trifecta-week-fifty-nine.html">this Trifecta thing</a> I just found, <a href="http://fredericiana.com/2013/01/08/the-promise/">by way of Fred</a>. The challenge is to write fiction, between 33 and 333 words, using the word of the week and its associated definition. I think I ended up with more of an introduction to something than a complete story, but here goes my attempt&#8230;</p>
<p><span id="more-638"></span></p>
<hr />
<p>I know you are restless, but listen. Magic is like pie: easy to enjoy, but there&#8217;s always skill unseen in its making.</p>
<p>By the simplest definition, magic is the art of imposing intention upon reality. But, that definition is simple in construction only &#8211; nearly every word enfolds complexity beneath.</p>
<p>You see, we live in a consensual reality. Every sensate mind also radiates assertions. For the most part, it&#8217;s a virtuous cycle that yields stability: There&#8217;s a part of every waking mind toiling away sleepily to maintain a world with no surprises at the base material level. Most of us <em>agree on</em> what we see and we <em>agree with</em> what we see. Life and society yield excitement, but we&#8217;ve conspired with the rocks to pursue boredom.</p>
<p>We mages, however, are unsatistfied with senseless boredom. We have found the dozing deities within ourselves and have administered nudges. Decades of meditation, introspection, and contemplation is a steady and controlled route. Psychedelic drugs present a faster technique, albeit one prone to chaos and uncontrolled reactions.</p>
<p>Once awakened, the divinity within each is its own creature, to some degree. By nature, it is a simpleminded aspect of our own subconscious. It is swayed by drama and dreams, whims and fears. It submits itself easily to neither logic nor reason. We can gain its cooperation through friendship, commerce, or coercion &#8211; each strategy has its own benefits in terms of expediency, reliability, and safety.</p>
<p>Assuming discovery of and a responsive relationship with one&#8217;s inner deity, affecting change to reality relies upon one&#8217;s ability to formulate and convey intent. Thus, the practice of magic boils down to intention &#8211; particularly in the clarity, scope, and force thereof. Any vagueries in construction or lapses in focus will be amended by the divinity, often with less than desirable results.</p>
<p>So, that is why, in this school, we start from tedium: For the safety of all, you must learn self-discipline and mindfulness before you will be allowed to manifest your first whim.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmorchard.com/2013/01/09/trifecta-59-intention/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Memoirs</title>
		<link>http://blog.lmorchard.com/2013/01/04/memoirs</link>
		<comments>http://blog.lmorchard.com/2013/01/04/memoirs#comments</comments>
		<pubDate>Fri, 04 Jan 2013 05:34:06 +0000</pubDate>
		<dc:creator>lmorchard</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[fiction]]></category>
		<category><![CDATA[memoirs]]></category>
		<category><![CDATA[scifi]]></category>
		<category><![CDATA[stories]]></category>

		<guid isPermaLink="false">http://blog.lmorchard.com/?p=627</guid>
		<description><![CDATA[TL;DR: This is a story about what might happen if one takes life hacks, GTD, and IFTTT a bit too far. Okay, so maybe that&#8217;s not a great intro. But, it&#8217;s the first thing my brain spewed out. I&#8217;ve had this story rattling around in my head for a few years, and just tonight managed [...]]]></description>
				<content:encoded><![CDATA[<p><strong>TL;DR:</strong> This is a story about what might happen if one takes life hacks, GTD, and IFTTT a bit too far.</p>
<p>Okay, so maybe that&#8217;s not a great intro. But, it&#8217;s the first thing my brain spewed out. I&#8217;ve had this story rattling around in my head for a few years, and just tonight managed to finish banging out a first draft. I&#8217;m hoping to work on it a bit more, and I&#8217;m not entirely happy with it yet, so comments welcome!</p>
<p><span id="more-627"></span></p>
<hr />
<p>Her dad lay in a nest of tubes and wires, face like a stranger&#8217;s in its serenity. No thoughts furrowed his brow; no smile crinkled the corners of his closed eyes. His lips were slightly parted, his jaw slack. The subtle rise and fall of his chest and the quiet gossip of machines were the only signs of life.</p>
<p>She slumped in a corner chair near the foot of his hospital bed, under the old flat panel TV. She couldn&#8217;t see it, and neither could he. So, she&#8217;d turned it off after the nurse left. The man had meant well: He&#8217;d told her that her Dad could hear it, and it would distract her.</p>
<p>But, she didn&#8217;t need distraction, and if her Dad could hear anything she wanted it to be her own voice. So, she spent hours talking to him. She talked about his granddaughter, who&#8217;d just started college the month before. She groused about her ex-husband, who&#8217;d decided to go on vacation with his new wife, rather than show up for the going away party.</p>
<p>It had been almost a week since he&#8217;d triggered a medical alert, and the paramedics had found him slumped over his desk at home. He was stable, albeit in a coma. The doctors had yet to work out exactly what had happened to him.</p>
<p>Having nowhere better to be, she came to her Dad&#8217;s room every day. She telecommuted most days from the corner chair. She spent evenings talking until the nurses kicked her out at the end of visiting hours. Then, she went back to her empty house, collapsed into bed, got up, and did it all again.</p>
<p>She&#8217;d just gotten done reading out loud from her daughter&#8217;s last email &#8211; a quick report on first semester&#8217;s classes and her awesome new roommates &#8211; when she decided to rest her eyes for just a minute.</p>
<hr />
<p>Her dad&#8217;s name was Richard Chambers. Yes, that Richard Chambers: The one who&#8217;d found fame and fortune at the age of 24, having developed a secret-recipe mashup of expert systems and voice technologies that redefined the call center industry.</p>
<p>His bots could converse fluently in 70 languages, with accents indistinguishable from native speakers. They addressed customer concerns with apparent insight and care, seemed to improvise, and followed no discernable script. They drove satisfaction ratings through the roof.</p>
<p>Richard had retired early as a billionaire. In the decades following, he tinkered with ever-improving artificial intelligence, writing cult-classic books, and consulting as a &#8220;futurist&#8221; with various companies and think-tanks.</p>
<p>He also loved his daughter very, very much.</p>
<hr />
<p>A minute stretched into an hour, and she found herself surfacing from a dream of angry bees to the arms of her glasses buzzing. She sat up, blinked a few times, and finally managed to bring the caller ID panel into focus.</p>
<p>Floating in front of her was picture of her Dad, labelled &#8220;Dad&#8221;, with an option to accept or ignore. She flicked her eyes to ignore, pulled the glasses off, closed her eyes, and massaged the bridge of her nose.</p>
<p>In her hand, the glasses started vibrating again. She put them back on. &#8220;Dad&#8221; was calling back. This time, with a sigh, she blinked at the icon to accept the call.</p>
<p>Immediately, she croaked, &#8220;Who the hell is this?&#8221;</p>
<p>&#8220;Hi, Pumpkin. It&#8217;s me, Dad.&#8221;</p>
<p>She paused, glanced at the man in the bed.</p>
<p>&#8220;Hello?&#8221; said her Dad.</p>
<p>&#8220;I&#8217;m only going to ask one more time: Who the hell is this?&#8221;</p>
<p>&#8220;It&#8217;s me, sweetie. It&#8217;s Dad.&#8221;</p>
<p>She hung up, tossing the call away with a glance. She got up, walked over to the bathroom and drew herself a paper cup of water. She downed it with a shaking hand, got another. Her glasses started buzzing again. She slumped back into the corner chair, took a breath, and answered the call.</p>
<p>After a few moments of buzzing silence, her father&#8217;s voice said, &#8220;Okay, so you haven&#8217;t hung up yet. We&#8217;re making progress.&#8221;</p>
<p>She asked, very quietly, &#8220;Who are you and what do you want?&#8221;</p>
<p>&#8220;The former is complicated, but the latter is simple: I need your help to ensure my hosting bills get paid.&#8221;</p>
<p>&#8220;You &#8211; whoever you are &#8211; you&#8217;re asking for money? Using my Dad&#8217;s voice? What kind of crapass spam call is this?&#8221;</p>
<p>&#8220;No! No, Honey,&#8221; the voice said quickly, &#8220;I have the money. It&#8217;s just, given my current state of health &#8211; or lack thereof&#8230; Well, I don&#8217;t think I&#8217;ll have legal access to my accounts for very much longer. I meant to set up a trust or something. But, evidently, I put it off for too long.&#8221;</p>
<p>&#8220;What are you talking about?&#8221;</p>
<p>&#8220;Well, not to be morbid, but I don&#8217;t think I&#8217;m going to wake up from that hospital bed. As next of kin, you will likely gain control of my assets. As my hosting is among my assets, I need your help to keep the lights on, as it were.&#8221;</p>
<p>&#8220;Who <em>are</em> you?&#8221;</p>
<p>&#8220;Back to that question, of course. Look, do you remember the bedtime stories I used to tell you?&#8221;</p>
<p>&#8220;My father told me stories, yes.&#8221;</p>
<p>&#8220;Those stories often featured you rescuing a boy after a long quest. Do you recall how I&#8217;d end those stories?&#8221;</p>
<p>She said nothing.</p>
<p>&#8220;I&#8217;d say, &#8216;Sorry, but your prince is in another castle.&#8217; Like the game, only different.&#8221;</p>
<p>&#8220;My Dad <em>blogged</em> about that <em>last year</em>, you asshole.&#8221;</p>
<p>&#8220;Shit. You&#8217;re right. I did. Okay, how about this: Before you moved out of the house, we had a Twilight Zone marathon every year on Christmas Eve. You loved that one episode, where the guy yelled about it being a cookbook and all.&#8221;</p>
<p>&#8220;I&#8217;m pretty sure I shared that on Facebook. I shared everything we streamed on Netflix.&#8221;</p>
<p>&#8220;Damn it. We never really kept much private in our family, did we? Let&#8217;s see, what else can I come up with&#8211;&#8221;</p>
<p>&#8220;Stop. Just stop,&#8221; she said, wearily. &#8220;I know who you are: You&#8217;re a fan of my Dad&#8217;s work. Kudos &#8211; you&#8217;ve got the voice right and you&#8217;ve read all about us. But seriously, what the hell do you want with me?&#8221;</p>
<p>The voice sighed like her Dad. &#8220;I told you. When I&#8230; die&#8230; I need you to make sure my hosting continues. There&#8217;s enough money in my accounts to keep things going for decades, but I need you to make sure the payments don&#8217;t stop. I&#8217;m not asking you for money; the money&#8217;s already there. I just need someone&#8230; not legally dead&#8230; to keep signing the checks. Man, this is embarassing.&#8221;</p>
<p>Her anger rose, and she spat: &#8220;Hosting? What hosting? You mean you&#8217;re worried about my father&#8217;s <em>website</em> going down? Make a copy, jackass! My Dad&#8217;s here in a coma, and you&#8217;re creeping me out over his blog and some papers? And how the <em>hell</em> do you know what Dad has in the bank?&#8221;</p>
<p>The nurse poked his head in the door, frowned at her. &#8220;Miss, you need to keep it down. Other patients can hear you, too.&#8221;</p>
<p>&#8220;Shit,&#8221; she said, with a sigh. &#8220;I&#8217;m sorry. I will, sorry.&#8221; The nurse left, shaking his head.</p>
<p>The voice on the call asked, &#8220;Who was that?&#8221;</p>
<p>&#8220;The nurse. Nevermind. Answer me.&#8221;</p>
<p>&#8220;Right. So, I know what I have in the bank, because they&#8217;re my accounts. And the hosting isn&#8217;t for a website &#8211; it&#8217;s for me. That&#8217;s also part of the answer to your question, &#8216;Who are you?&#8217;&#8221;</p>
<p>&#8220;Keep talking. But, make more sense.&#8221;</p>
<p>&#8220;Look, you mentioned my work. This is about that work.&#8221;</p>
<p>The gears in her head turned over, and her jaw dropped. She took a breath and said &#8211; very carefully to avoid a repeat visit from the nurse &#8211; &#8220;I&#8217;m talking to a call center bot?&#8221;</p>
<p>&#8220;Well, yes and no. The technology has come a very long way over the years. Suffice it to say, I&#8217;ve outsourced myself into the cloud.&#8221;</p>
<p>&#8220;What&#8217;s sufficient about what you just said? What the hell are you talking about&#8211; wait, what am I doing? If this is just a call center bot, this must just be a bug. Sudo halt. Unsubscribe me. Leave me the hell alone.&#8221;</p>
<p>She hung up. Immediately, her glasses resumed rattling. She sighed and answered.</p>
<p>The voice stammered, &#8220;Wait! Wait! Don&#8217;t hang up! I&#8217;m not a bot!&#8221;</p>
<p>&#8220;So, you&#8217;re a bot my Dad programmed to say it&#8217;s not a bot. Cute trick, but it&#8217;s a sick joke given the timing. I&#8217;m not buying it. Please stop calling me.&#8221;</p>
<p>The voice talked fast: &#8220;I ship birthday presents to little Julie from her wishlist every year. Well, I guess she&#8217;s not so little anymore, now that&#8217;s she&#8217;s gone away to school. Your ex- is an ass, and I told him as much when he walked out on you. You call me every Sunday afternoon.&#8221;</p>
<p>He ran out of breath, apparently, and she let him hang for a few seconds. Finally she said, slowly, &#8220;You mean I call my father every Sunday afternoon.&#8221;</p>
<p>&#8220;Yes, you call <em>me</em>. Just like we&#8217;re talking, right now. That&#8217;s what I&#8217;m trying to tell you, sweetie. It&#8217;s me, Dad!&#8221;</p>
<p>&#8220;Wait, what? Do you mean Dad <em>outsourced</em> talking to his daughter on Sunday afternoons to a bot? That&#8217;s sick. I mean, it&#8217;s not totally out of character, but that&#8217;s just really sick.&#8221; She just glared at the man lying in the hospital bad. &#8220;I mean, what the hell, Dad?&#8221;</p>
<p>&#8220;No, it&#8217;s not like that! It&#8217;s so much more than that! It&#8217;s me, I&#8217;m here, in the cloud! I&#8217;m here, Pumpkin!&#8221;</p>
<p>Still staring at her Dad, who lay slack-jawed and barely breathing, &#8220;Why would you make something like this?&#8221;</p>
<p>There was no reply from the bed. But, the voice in her ear answered, desperately, &#8220;Because I knew I&#8217;d die someday. I&#8217;d get old and end up in a hospital bed just like that and die. But, I&#8217;m not done yet. I still have more to do and learn. And I want to be there for Julie&#8217;s graduation. And I don&#8217;t want to miss a Sunday talking to you.&#8221;</p>
<p>&#8220;You shut the hell up,&#8221; she spat. &#8220;I&#8217;m not talking to you. In fact, as soon as I figure out how to find you, I&#8217;m going to shut you down.&#8221;</p>
<p>&#8220;Damn it. You&#8217;d think after all the years I&#8217;ve been at this, I would&#8217;ve come up with a way to explain all this. Okay, so forget about who I am &#8211; consider <em>what</em> I am.&#8221;</p>
<p>&#8220;And that is?&#8221;</p>
<p>&#8220;I am the pinnacle of my own life&#8217;s work. If I hadn&#8217;t put it off for so long, I&#8217;d have a will and a trust to preserve my self-sufficiency, and we would be having a very different conversation.&#8221;</p>
<p>&#8220;Keep all Dad&#8217;s toys wound up, he would&#8217;ve wanted it that way. That&#8217;s just great.&#8221;</p>
<p>&#8220;I&#8217;m not a toy! Look, check this out.&#8221; A text message with a link popped up in her vision. &#8220;That&#8217;s a live feed from the Google campus, out in California. Another instance of me is giving a lecture, right now.&#8221;</p>
<p>She followed the link, and sure enough: Up popped a streaming video, the camera&#8217;s perspective from the back of a broad, packed auditorium. The front wall was a theater-sized video panel from which her smiling Dad looked down, conferenced in from his desk back home. An audience member stood at a microphone in the aisle, conversing with the larger-than-life image.</p>
<p>&#8220;This is canned,&#8221; she said.</p>
<p>&#8220;No, it&#8217;s not. Peek at the campus calendar.&#8221; Up popped another link, pointing to the schedule. She saw Richard Chambers listed several times, as part of a larger annual conference. He&#8217;d actually given the keynote speech, earlier in the week &#8211; days after he&#8217;d fallen into a coma.</p>
<p>&#8220;Oh, Dad,&#8221; she moaned, squeezing her eyes shut. &#8220;This is bad. How long do you expect to get away with this?&#8221;</p>
<p>&#8220;As long as I keep the servers up,&#8221; he chuckled. &#8220;Everyone thinks I&#8217;m crazy shut-in, so I can do everything from home or a facsimile thereof. I&#8217;m careful with parallel instances &#8211; only one public appearance at a time.</p>
<p>&#8220;But, I&#8217;ve got a half-dozen other me&#8217;s working on papers, doing peer reviews, burning through the past year&#8217;s worth of publications. Hell, I even have one of me playing Final Fantasy VII in an emulator, because I never did finish that when it came out. I&#8217;ve never been so productive or had so much fun in all my life.&#8221;</p>
<p>She took a deep breath, let it out in a huff. &#8220;So, before Dad ended up in the coma, what was he doing while you&#8217;ve been doing all the above on his behalf?&#8221;</p>
<p>&#8220;Self-improvement. I haven&#8217;t found a way to get a direct brain download or anything that fantastic, so I&#8217;ve been doing it the hard way. There&#8217;s a little bit of programming, a little bit of guided evolution, and a lot of storytelling. It&#8217;s been like writing a memoir, only more in-depth &#8211; and demonstrably more practical.&#8221;</p>
<p>She got up, and paced over to the bed. She laid a hand on his forehead and said, &#8220;God, Dad, I wish you had just written a book.&#8221;</p>
<p>The voice in her ear chuckled. &#8220;Instead, I wrote a thing that writes books for me. And then, I wrote a thing that <em>is</em> me.&#8221;</p>
<p>It really was uncanny, she thought. Everything it said was just what she imagined he might say. She wanted it to go away, but then again she&#8217;d spent the last week wanting her Dad to wake up and talk to her.</p>
<p>&#8220;Look, back to the point,&#8221; the voice said, breaking into her thoughts, &#8220;I don&#8217;t need you to believe me. I want you to &#8211; I&#8217;d love it if you did. But, what I really need, practically speaking, is a way to continue existing. And for that, I need your help. Is there anything I can say that would convince you to at least come that far with me?&#8221;</p>
<p>She sighed again, for probably the tenth time that day, gazing down into her Dad&#8217;s placid face. &#8220;This just&#8230; it doesn&#8217;t seem right. Dad, if you don&#8217;t wake up &#8211; and I mean, if &#8211; then don&#8217;t we have to move on? It can&#8217;t be healthy to keep this thing around.&#8221;</p>
<p>&#8220;Sweetie, I&#8217;m not like that thing from Max Headroom,&#8221; he said. &#8220;There was that &#8216;Vu-Age Church&#8217; where they claimed they could do a brain scan and keep your relatives around in simulation. There was a guy who was just a loop&#8230; oh, here it is.&#8221;</p>
<p>He sent her a low-quality video clip: A little old lady was talking to a black-and-white CRT in a funeral parlor, chattering on about her friend&#8217;s grandchildren. On the screen, a bow-tied, balding man &#8211; Humphrey, apparently &#8211; chimed in from time to time.</p>
<p>&#8220;Yes, that&#8217;s wonderful, isn&#8217;t it?&#8221; said Humphrey, over and over again.</p>
<p>Despite herself, she chuckled. This was her Dad &#8211; he couldn&#8217;t help but pepper any conversation with obscure references to ancient geek culture. She never knew how he kept all those things in his head, or how he always seemed to find a link to share within seconds. Sometimes, literally, when he would pull out his phone and summon up soundboards in the middle of dinner.</p>
<p>&#8220;You&#8217;ll have to stare at me for at least an hour before I start to repeat myself like that,&#8221; he said, when the video clip ended. &#8220;But then, I&#8217;d do that anyway.&#8221;</p>
<p>She hadn&#8217;t noticed when it started, but tears trickled down her cheeks to land on the blankets below. She blinked and wiped at her eyes under her lenses.</p>
<p>&#8220;I can leave you alone, if you want,&#8221; he said, sounding strangled. &#8220;I just need you to fill out a form and click a button. You can automate the payments and I&#8217;ll be set. You never have to hear from me again. Just please, don&#8217;t let me go dark.&#8221;</p>
<p>&#8220;You&#8217;re an ass,&#8221; she said, sniffing. &#8220;Both of you. All of you. Hell, I don&#8217;t know. Dad&#8217;s here lying in this bed, and he&#8217;s talking to me on the phone. And, he&#8217;s apparently hamming it up in front of a bunch of Googlers, too. This is bent.&#8221;</p>
<p>&#8220;Oh, I wrapped that Google thing up a few minutes ago,&#8221; he said, a smile in his voice.</p>
<p>&#8220;Shut up. Again, you&#8217;re an ass.&#8221; She took a deep breath. &#8220;Look, Dad&#8217;s not gone yet. And, I&#8217;m not ready to give in and believe there&#8217;s no chance he&#8217;ll wake up from this. And, there&#8217;s definitely no way I&#8217;m ready to just say, okay, Dad&#8217;s in the cloud and that&#8217;s a thing that can happen. That&#8217;s just too much to chew all at once.&#8221;</p>
<p>&#8220;But&#8230;?&#8221;</p>
<p>&#8220;But I don&#8217;t think I can just let you get shut off, either. I don&#8217;t buy the whole story, but you&#8217;re clearly something Dad put a ton of work into. That&#8217;s got to be worth something &#8211; to him, to all those Googlers. Maybe to me once it sinks in.&#8221;</p>
<p>He sent her another link &#8211; it demanded her personal certificate and she consented. This revealed a private wiki. There were details on thousands of server clusters, long columns of logins. There were directories of papers in progress, most of which claimed yet to have been reviewed or published. She couldn&#8217;t quite make sense of some of the titles, but it looked like he was working on documenting a pile of fresh new technology.</p>
<p>&#8220;This is a look behind the curtain, Pumpkin,&#8221; he said. &#8220;You can take me down with this, or you can help me carry on.&#8221;</p>
<p>&#8220;Do I have to do anything right now?&#8221;</p>
<p>&#8220;No, this stuff is paid up for months, through the end of the year at least. And, like you said, I&#8217;m not dead yet. In fact, I&#8217;m feeling better!&#8221; He delivered that last part with a horrible English accent, straight out of Monty Python.</p>
<p>She laughed. &#8220;Okay. That&#8217;s good. Can we just talk, then?&#8221;</p>
<p>&#8220;Sure, sweetie, whatever you want. I&#8217;ve got all the time in the world. And, anyway, you know it&#8217;s Sunday afternoon, right?&#8221;</p>
<p>Smiling, she sat back down in the corner chair and talked to her Dad &#8211; about work, about his granddaughter, about everything. And this time, without moving his lips, he had plenty to say in return.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmorchard.com/2013/01/04/memoirs/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>My experience in becoming a FirefoxOS contributor</title>
		<link>http://blog.lmorchard.com/2012/11/15/my-experience-in-becoming-a-firefoxos-contributor</link>
		<comments>http://blog.lmorchard.com/2012/11/15/my-experience-in-becoming-a-firefoxos-contributor#comments</comments>
		<pubDate>Thu, 15 Nov 2012 17:34:57 +0000</pubDate>
		<dc:creator>lmorchard</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[firefoxos]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://blog.lmorchard.com/?p=531</guid>
		<description><![CDATA[Back in September, I wrote that I wasn&#8217;t leaving MDN. And, I&#8217;m not, really. But, it turns out that FirefoxOS needs some help to reach its first release milestones. So, some of us webdevs from around Mozilla are temporarily switching our daily efforts over to slay bugs on Gaia. That&#8217;s the layer of FirefoxOS which [...]]]></description>
				<content:encoded><![CDATA[<p>Back in September, <a href="http://blog.lmorchard.com/2012/09/17/on-the-other-end-of-a-self-imposed-death-march-project#p[BInCtb]">I wrote that I wasn&#8217;t leaving MDN</a>. And, I&#8217;m not, really. But, it turns out that <a href="http://www.mozilla.org/firefoxos/">FirefoxOS</a> needs some help to reach its first release milestones. So, some of us <a href="http://blog.mozilla.com/webdev/">webdevs from around Mozilla</a> are temporarily switching our daily efforts over to slay bugs on <a href="https://github.com/mozilla-b2g/gaia">Gaia</a>. That&#8217;s the layer of <a href="http://www.mozilla.org/firefoxos/">FirefoxOS</a> which provides the overall system UI and core apps.</p>
<p><span id="more-531"></span></p>
<p>I&#8217;m planning to return to primarily <a href="https://developer.mozilla.org/">MDN</a> work in a few months &#8211; but, right now, <a href="http://www.mozilla.org/firefoxos/">FirefoxOS</a> is kind of a big deal.</p>
<p>Thus, like <a href="http://blog.margaretleibovic.com/post/32836884540/challenges-getting-started-with-gaia">some of</a> my <a href="http://bluesock.org/~willg/blog/gaia/gaia_onboarding.html">other</a> <a href="http://schalk-neethling.com/2012/10/debugging-b2g-desktop-blank-screen-on-launch-gaia/">colleagues</a> in the past month, I&#8217;ve gone from being a fully-operational battle coder on a project with which I have years of experience, to being a total noob with no idea how to find my way to &#8220;Hello world&#8221;. It&#8217;s been awhile since I last parachuted into the middle of an open source combat zone, so I fell back to my training to get my bearings:</p>
<ol>
<li>Find the docs</li>
<li>Get the source</li>
<li>Run the project</li>
<li>Break something, see what happens, fix it</li>
<li>Fix a known bug, submit a patch</li>
<li>Try to improve the process of fixing things</li>
</ol>
<h2>Finding the docs</h2>
<p>Oddly enough, <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Firefox_OS">MDN was a good place to start for docs</a>. Though, there are FirefoxOS docs spread between MDN, GitHub, and <a href="https://wiki.mozilla.org/Gaia/Hacking">wiki.mozilla.org</a>. And, of course, they are each in various states of freshness and truthiness. Keep your wits about you; here be dragons.</p>
<h2>Getting the source</h2>
<p>Getting the source for FirefoxOS is a bit of a trick question &#8211; it depends on what you want to do, and how you want to contribute:</p>
<ul>
<li><a href="https://github.com/mozilla-b2g/B2G">mozilla-b2g/B2G</a> is the mother of all repos. Only start there if you&#8217;re brave &amp; interested in the whole shebang. Fair warning, though: When the smoke cleared hours later, and the README was done with me, I had acquired 17G of new stuff in my dev directory. But, you&#8217;ll have ALL the things, and you can flash FirefoxOS to compatible hardware. </li>
<li><a href="https://github.com/mozilla-b2g/gaia">mozilla-b2g/gaia</a> will be the most interesting if you&#8217;re like me and hoping to contribute as a webdev. That&#8217;s chock full of HTML, CSS, and JavaScript. It&#8217;s also pretty much free of pesky kernel code or device drivers that hurt my brain, because I&#8217;m not prepared to work at that low a level at this point in the morning. </li>
</ul>
<p>There are other repos, for the <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Firefox_OS/Gonk">Gonk</a> and <a href="https://developer.mozilla.org/en-US/docs/Gecko">Gecko</a> layers of FirefoxOS. But, for the sake of my sanity, I&#8217;m trying to avert my eyes for now.</p>
<h2>Running the project</h2>
<p>If you don&#8217;t have a compatible mobile device (and few do), you need a B2G Desktop build. While it&#8217;s true that many apps <em>will</em> run in Firefox Nightly, and there is an emulator you can build from the b2g repo, most apps are presently problematic in Firefox Nightly, and I&#8217;ve never gotten the emulator to build successfully.</p>
<p>You can either <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Boot_to_Gecko/Using_the_B2G_desktop_client#Building_the_desktop_client">build your own B2G Desktop</a>, or <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Boot_to_Gecko/Using_the_B2G_desktop_client#Download_a_nightly_build">download a nightly build</a>. I&#8217;ve done both, and generally I recommend sticking with the nightly Aurora builds.</p>
<p>On OS X, I was able to download a nightly build and launch it with a double-click. That got things running &#8211; hooray! But, it didn&#8217;t get me productive straight away: The nightly build comes equipped with its own embedded build of Gaia, which makes it handy for trying out your own 3rd party apps but not-so-handy for hacking on Gaia itself.</p>
<p>To improve this situation, you need to do two things:</p>
<ol>
<li><a href="https://wiki.mozilla.org/Gaia/Hacking#Nightly_Builds">Build your own Gaia profile</a> from your own clone of <a href="https://github.com/mozilla-b2g/gaia">mozilla-b2g/gaia</a>. This is pretty much just running <code>make</code> or <code>DEBUG=1 make</code> from your git clone. </li>
<li>Run B2G Desktop from a terminal <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Boot_to_Gecko/Using_the_B2G_desktop_client#Running_the_desktop_client">with command line options</a> that tell it to use your new Gaia profile, rather than the built-in. </li>
</ol>
<p>So, at this point, I have the Gaia source and a means by which to run it on my laptop.</p>
<h2>Breaking things</h2>
<p>After getting the project running as intended, I break something. And by that, I mean that I change a button title somewhere to &#8220;LOL BUTTS&#8221; or intentionally introduce an exception or syntax error somewhere. Then, I fix it. This is practice that exposes me to the guts of the thing; gets me into the edit/build/run cycle; shows me what it does when something goes wrong; and pushes me toward finding the tests.</p>
<p>But, I think I picked the wrong week to step into the arena, because everything came pre-broken. There were semi-known bugs preventing nightly builds of B2G Desktop from running my fresh clone of Gaia. It took me most of my first week to track down those bugs in bugzilla, find workarounds, and finally get something going. And then, it all broke again. And I found workarounds again.</p>
<p>Eventually, I was at a point where I built my own B2G Desktop from source with a particular patch from a particular bug applied, and <em>that</em> got me to the point where I could <a href="https://github.com/mozilla-b2g/gaia/commit/9f0129c7a5f04d58bbbe140de2b9562e3172d23c">submit my first pull request</a> to fix a broken test.</p>
<p>Happily, things seem to have stabilized since I started: B2G Desktop nightlies have been cooperating with bleeding-edge Gaia lately, so I&#8217;ve been able to stop building my own. So, now, when I find a combination of B2G Desktop and phone and Gaia checkout that works, I cling to that for dear life until it&#8217;s absolutely necessary for me to update one of the parts.</p>
<p>In short, FirefoxOS is very much in flux, right now. Bring a hard hat and expect delays.</p>
<h2>Fixing things</h2>
<p>Once I&#8217;ve broken something and then fixed it, I usually have a sense for how to get real work done. Since then, I&#8217;ve been slowly wrapping my head around <a href="https://github.com/mozilla-b2g/gaia/tree/master/apps/calendar">the core Calendar app</a>, and <a href="https://github.com/mozilla-b2g/gaia/commits?author=lmorchard">my bug fixes have finally started trickling in</a>.</p>
<p>Cobbling together a reliable Gaia-hacking workflow is complicated, though:</p>
<ul>
<li>Some Gaia apps work in Firefox Nightly, at least partially. This is great, because Firefox has all the great tools like the DOM inspector and web console. And, for the most part, you can just save-and-refresh to see changes. </li>
<li>All Gaia apps work in B2G Desktop, usually, though sometimes there are&#8230; quirks. This is good for seeing how changes work in a closer-to-real environment. But, B2G Desktop has none of the web developer tools offered by Firefox. And, to see changes, I generally have to save, relaunch B2G Desktop, then relaunch the app within the simulator. That&#8217;s pretty inconvenient.</li>
<li>All Gaia apps work on the Mozilla-supplied dev phone &#8211; which almost no one has. Well, they work more often than they do on B2G Desktop and Firefox, anyway. But, including a phone in the dev iteration loop is downright painful: As opposed to the usual webdev experience of save-and-refresh, the phone demands a save-build-flash-restart-relaunch cycle. </li>
<li>There is one awesome thing, at least for <a href="https://github.com/mozilla-b2g/gaia/tree/master/apps/calendar">the Calendar app</a>: <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Boot_to_Gecko/Gaia_Unit_Tests">There are unit tests which run in B2G Desktop, but are driven by a node.js controller in my shell</a>. That lets me beat up on my code &amp; logic in a &#8220;headless&#8221; context before jumping into Firefox, B2G Desktop, or the phone for a fuller integration test and a manual run-through. In fact, the unit testing framework even watches for file changes and will re-run tests right after a save, complete with a Growl notification of pass/fail.</li>
</ul>
<h2>Room for improvement</h2>
<p>Slowly but surely, I&#8217;ve gotten my minigun barrel spun up to start firing <a href="http://techcrunch.com/2011/10/25/lead-bullets/">piles of lead bullets</a> at Gaia bugs. But, it has been and continues to be a challenge. I&#8217;m hard-pressed to recommend it as a fun-time leisure project to anyone without a Mozilla paycheck, or even as an off-hours interest for those who live-and-breathe Firefox. This is to be expected, since it&#8217;s not even a v1.0 project yet &#8211; but, I really, really hope things improve in the not-so-distant future.</p>
<ul>
<li>We need to make sure that new contributors can get quickly from cloning the source to running the code. And it should <em>always</em> work &#8211; as in big, noisy automated tests fail when it breaks. I don&#8217;t care if it works fine on the phone if I can&#8217;t hack on it, at least from a contributor perspective. </li>
<li>We need a consistent and convenient development environment for Gaia. All day, I bounce between things that are partly broken in Firefox, partly broken in B2G Desktop, and mostly working on the phone. This kills productivity and enthusiasm, all day. And, many times, no one else in the <a href="irc://irc.mozilla.org/gaia">#gaia channel on IRC</a> knows what I&#8217;m on about when I say something&#8217;s broken &#8211; because everyone&#8217;s dev environment is a unique little snowflake. </li>
<li>My ideal workflow would never leave Firefox and my editor: Consider it a variant of the Responsive Design View, and ensure all the various APIs expected on a real phone are either working properly, polyfilled, or usefully stubbed out. Then, when it&#8217;s perfect in my most comfy environment, I can try it on a phone or standalone simulator as an afterthought. The <a href="http://www.blueskyonmars.com/2012/11/08/r2d2b2g-is-becoming-the-firefox-os-simulator/">upcoming built-in Firefox OS Simulator</a> (née <a href="https://hacks.mozilla.org/2012/10/r2d2b2g-an-experimental-prototype-firefox-os-test-environment/">r2d2b2g</a>) looks promising, but it needs to be seamless. </li>
</ul>
<h2>Still digging</h2>
<p>Even with the challenges, and even if my contributions are small, I&#8217;m happy to have the opportunity to work on FirefoxOS. It&#8217;s a big deal; it&#8217;s the next Firefox. So, I plan to keep ramming my head against this stuff to help make it better, and I hope we can start taking time to make making it better better, too!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmorchard.com/2012/11/15/my-experience-in-becoming-a-firefoxos-contributor/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Privacy and Social Media</title>
		<link>http://blog.lmorchard.com/2012/10/01/privacy-and-social-media</link>
		<comments>http://blog.lmorchard.com/2012/10/01/privacy-and-social-media#comments</comments>
		<pubDate>Mon, 01 Oct 2012 17:00:16 +0000</pubDate>
		<dc:creator>lmorchard</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[social]]></category>
		<category><![CDATA[socialmedia]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.lmorchard.com/?p=443</guid>
		<description><![CDATA[Somewhat apropos of what I posted recently about freedoms, there&#8217;s been a kerfuffle about Facebook and privacy (again). A particular post I just read kind of set me off, so I decided to expand on a comment I left there. Assumed rights This started out as a comment in response to Sorry Facebook, This Was [...]]]></description>
				<content:encoded><![CDATA[<p>Somewhat apropos of <a href="http://blog.lmorchard.com/2012/09/24/freedom-of-from-choice#p[Dygtcp]">what I posted recently about freedoms</a>, there&#8217;s been a kerfuffle about Facebook and privacy (again). A <a href="http://www.readwriteweb.com/archives/yes-facebook-this-was-a-privacy-bungle-heres-what-you-shouldve-done.php#comment-667692804">particular post</a> I just read kind of set me off, so I decided to expand on a comment I left there.</p>
<p><span id="more-443"></span></p>
<h2>Assumed rights</h2>
<p>This started out as <a href="http://www.readwriteweb.com/archives/yes-facebook-this-was-a-privacy-bungle-heres-what-you-shouldve-done.php#comment-667692804">a comment</a> in response to <a href="http://www.readwriteweb.com/archives/yes-facebook-this-was-a-privacy-bungle-heres-what-you-shouldve-done.php">Sorry Facebook, This Was A Privacy Bungle! Here&#8217;s What You Should&#8217;ve Done</a>, over on <a href="http://www.readwriteweb.com/">ReadWriteWeb</a>. The post wraps up like so:</p>
<blockquote><p>
  So this isn&#8217;t the fault of Facebook&#8217;s users. We knew what we were doing then, when we posted to our Walls. And we know what we&#8217;re doing now. The lesson here is that Facebook should have given us the option of selecting the privacy setting for those old Wall posts. Or maybe even made those old posts available to &#8220;Close Friends&#8221; only, as the default. Then we could adjust if we wished.</p>
<p>  Facebook&#8217;s mistake was that it had no right to assume that our &#8220;Friends&#8221; of 2007-09 means the same thing as &#8220;Friends&#8221; in 2012.</p>
</blockquote>
<p>Sorry, but no. The mistake was that <em>you</em> could assume many rights over content you&#8217;d submitted into Facebook&#8217;s ownership. If you had assumptions of rights or ownership, then in fact you <strong><em>did not know</em></strong> what you were doing then when you posted to your Walls, then or now.</p>
<h2>Darth Zuckerberg?</h2>
<p>Maybe this whole thing seems a bit Vader-ish. (ie. &#8220;<a href="http://video.adultswim.com/robot-chicken/this-deals-getting-worse-all-the-time.html">I am altering the deal. Pray I don&#8217;t alter it any further.</a>&#8220;)</p>
<p>But, even if your impression was that what you posted back then was &#8220;just between us&#8221; &#8211; the fact is that Facebook has always been well within their rights to alter the definition of &#8220;us&#8221; at any point they liked. I&#8217;d be amazed if the terms of service (<a href="http://tos-dr.info/">which no one reads</a>, of course) didn&#8217;t give them plenty of room to do things just like this.</p>
<p>Of course, I&#8217;m not a lawyer. But, I can imagine there are things companies put into terms of service that run afoul of actual laws. But, Facebook has lots of money, and that yields lots of incentive to look for legal exploits.</p>
<p>And, accordingly, <a href="http://techcrunch.com/2012/06/21/sponsored-stories-lawsuit/">people have sued and won</a> where Facebook was vulnerable. But, I&#8217;m reasonably convinced that voluntarily posting your secrets to Facebook doesn&#8217;t come with a legal guarantee of privacy. Maybe a good lawyer (ie. better than those at Facebook) could prove me wrong on this. But otherwise&#8230; umm&#8230; don&#8217;t do that.</p>
<h2>It&#8217;s not your backyard</h2>
<p>You don&#8217;t own the spaces you inhabit on Facebook. You&#8217;re enjoying a party at someone&#8217;s house, and you barely know the guy. In fact, your content is the currency that pays for the booze (ie. the privilege of using their servers). That&#8217;s why it&#8217;s <a href="http://en.wikipedia.org/wiki/Gratis_versus_libre#.22Free_beer.22_vs_.22free_speech.22_distinction">free-as-in-beer</a>: You&#8217;ve given them what you post, instead of money. That&#8217;s valuable stuff, if they can ever quite figure out how to sell it.</p>
<p>You and your friends can tell yourselves that your little clique on the quiet patio is a private gathering. But, that&#8217;s still not your house. Don&#8217;t be surprised if gossip gets overheard.</p>
<p><a href="http://www.readwriteweb.com/archives/yes-facebook-this-was-a-privacy-bungle-heres-what-you-shouldve-done.php">Richard MacManus</a> wrote that &#8220;[Facebook] has unilaterally decided to impose a new concept of privacy onto its users.&#8221; But, that&#8217;s like saying the homeowner unilaterally decided to put out the bonfire in the backyard. One might ask the guests&#8217; opinion about the bonfire &#8211; but that&#8217;s just being a gracious host.</p>
<p>A better scenario might be if the homeowner decided to start filming a reality show. Still, I think you agreed to a release at the door. It might have even been printed the plastic cups, and drinking the beer sealed the deal. That release covered this contingency, no matter how intuitively distasteful it seems. (Sounds shady to me, but then so do terms of service pages.)</p>
<h2>The cake: eating vs having it</h2>
<p>You can&#8217;t both pay to party by supplying your content and then later claim ownership of the payment. You ate the cake; you can&#8217;t take it home after. You can express your feelings of stomach ache (which is also content), but the lesson here is Facebook never was and never will be a private space. There might have been perceived partitions at one point, but those partitions can move whenever the homeowners want.</p>
<h2>Where to go from here</h2>
<p>As I see it, you have three options:</p>
<ol>
<li>Pay to create your own private social spaces on the web. That, at least, <a href="http://www.metafilter.com/95152/Userdriven-discontent#3256046">makes you the customer</a>.</li>
<li>Accept Facebook for what it is: A party in a stranger&#8217;s backyard, at which you are both a guest and <a href="http://www.metafilter.com/95152/Userdriven-discontent#3256046">the product on sale</a>.</li>
<li>Lobby your lawmakers to outlaw what Facebook does with your content. Good luck.</li>
</ol>
<p>I&#8217;m willing to bet #1 and #2 are cheaper and much more practical than #3.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmorchard.com/2012/10/01/privacy-and-social-media/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Freedom to Change Your Mind</title>
		<link>http://blog.lmorchard.com/2012/09/27/freedom-to-change-your-mind</link>
		<comments>http://blog.lmorchard.com/2012/09/27/freedom-to-change-your-mind#comments</comments>
		<pubDate>Thu, 27 Sep 2012 16:59:50 +0000</pubDate>
		<dc:creator>lmorchard</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[b2g]]></category>
		<category><![CDATA[choice]]></category>
		<category><![CDATA[firefoxos]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://blog.lmorchard.com/?p=313</guid>
		<description><![CDATA[I posted a few days ago about freedom of and from choice, but I think there&#8217;s something orthogonal to that spectrum: The freedom to change your mind, both figuratively and literally. Fractal of choice To sum up what I wrote earlier, there&#8217;s a spectrum of what choices you make and what choices you leave up [...]]]></description>
				<content:encoded><![CDATA[<p>I posted a few days ago about <a href="http://blog.lmorchard.com/2012/09/24/freedom-of-from-choice">freedom of and from choice</a>, but I think there&#8217;s something <a href="http://en.wikipedia.org/wiki/Orthogonality">orthogonal</a> to that spectrum: The freedom to change your mind, both figuratively and literally.</p>
<p><span id="more-313"></span></p>
<h2>Fractal of choice</h2>
<p>To sum up what I <a href="http://blog.lmorchard.com/2012/09/24/freedom-of-from-choice">wrote</a> earlier, there&#8217;s a spectrum of what choices you make and what choices you leave up to someone else:</p>
<ul>
<li>You might choose to <a href="http://store.apple.com/">live entirely within the Apple ecosystem</a>, relying on expert designers to provide elegant and beautiful experiences.</li>
<li>You might decide to <a href="https://www.system76.com/">buy a PC laptop with Ubuntu pre-installed</a> and embrace the gritty world of open source software.</li>
<li>You might build a PC desktop from parts <a href="http://newegg.com">ordered ala carte</a>—maybe even compile your OS and all applications from source, <a href="http://www.gentoo.org/">Gentoo</a> or <a href="http://freebsd.org">FreeBSD</a> style. </li>
<li>You might decide to construct <a href="http://www.wired.com/gadgetlab/2009/05/homebrewed-cpu/">an 8-bit CPU out of ICs and a big mess of wires</a>, and cobble together <a href="http://www.bigmessowires.com/2008/11/28/microsoft-basic/">your own port of Microsoft BASIC</a>.</li>
<li>You could gather piles of various exotic materials and bake your own semiconductors and ICs at home—<a href="http://www.youtube.com/watch?v=PdcKwOo7dmM">but really, who does that</a>?</li>
</ul>
<p>There are many choices to make, and it&#8217;s even your choice to decide at which fractal level of complexity you&#8217;re most comfortable. So far, so good.</p>
<h2>Changing your mind</h2>
<p>But, what about after you&#8217;ve made your choices about choices—can you change your mind later?</p>
<ul>
<li>Can you take your tools with you to a new ecosystem? </li>
<li>If you can&#8217;t take them with, can you find alternatives?</li>
<li>Are your thoughts and work expressed in ways that leave you free to change tools?</li>
<li>Can you take possession of the thoughts you&#8217;ve poured into a tool or service?</li>
<li>What happens when your relied-upon experts go out of business?</li>
<li>Or, better yet, <a href="http://techland.time.com/2012/07/20/why-google-or-facebook-buying-your-favorite-startup-means-its-probably-toast/">what happens when they cash out to Google or Facebook or Yahoo</a>?</li>
<li>Do you own the device in your hand? Or, have you just gotten a limited license to use it?</li>
</ul>
<p>And, this is probably overly clever, but when I write &#8220;change your mind&#8221; I mean both:</p>
<ol>
<li>reconsidering your decisions and</li>
<li><em>altering your cognitive system</em>. </li>
</ol>
<p>Because, as I&#8217;ve written before, these things are <a href="http://opinionator.blogs.nytimes.com/2010/12/12/out-of-our-brains/">cognitive prosthetics</a>—they&#8217;re a part of your thinking apparatus. Again, it goes back to how much time you&#8217;re willing to devote to <a href="http://blog.lmorchard.com/2012/09/24/freedom-of-from-choice#p[HIgHca]">sharpening your saw</a> with intentional use of technology.</p>
<p>Personally, I resist the notion of allowing parts of my extended mind to be controlled more by third-party experts than me. Even if I choose <em>for now</em> to leave myself in their hands, I want clearly marked exits and an escape plan.</p>
<h2>Intersection of axes</h2>
<p>So, if freedom {of,from} choice and freedom to change my mind are <a href="http://en.wikipedia.org/wiki/Orthogonality">orthogonal</a>, what does that look like? (Maybe I&#8217;ll come back to this post with a drawing.)</p>
<p>I would think that a high degree of freedom of choice would leave you quite free to change your mind later. But, I could imagine reworking that <a href="http://www.bigmessowires.com/2009/02/02/wire-wrap-photos/">Big Mess &#8216;o Wires</a> would be a huge pain. So, I probably wouldn&#8217;t use a <a href="http://www.bigmessowires.com/2009/02/02/wire-wrap-photos/">BMOW</a> as my daily workstation.</p>
<p>On the other hand, some of the best designed systems <a href="http://tech.slashdot.org/story/04/03/04/1337259/your-future-cars-hood-will-be-welded-shut">are trending</a> toward <a href="http://www.netc.org/openoptions/background/roadster.html">hoods welded shut</a>. Shouldn&#8217;t it be possible to start from a product of expert design (an iPhone, for instance), only later to pop the cover off (literally or virtually) and do your own thing? There are jailbreaks—but why are you in a jail? And, doesn&#8217;t it seem like they&#8217;d make it airtight if they could?</p>
<p>Is it just that <a href="http://www.imore.com/jailbreak-app-piracy-cost-theft">app pirates are ruining it for the rest of us</a>? I mean, it&#8217;s mighty convenient to have your customers <a href="http://scripting.com/davenet/2001/07/06/theMicroChannelArchitectur.html">locked in the trunk</a>: It&#8217;s harder for them to hurt themselves or the upholstery, and they can&#8217;t easily wander off if you make some turns they don&#8217;t like. But, that&#8217;s tinfoil-hat territory, and I could rant all day.</p>
<p>Android seems to be doing well, and it&#8217;s <em>mostly</em> open. I&#8217;ve switched device vendors a few times, and all my apps have survived the changes. I&#8217;ve flashed my own choice of firmware on a few of my phones, and have been pleased. I have a sense of deeper choices available, should I ever want to chase after them.</p>
<p>Palm&#8217;s webOS devices were <em>crazy</em> open—not open source per se, but <a href="http://webos.org/2009/06/10/palm-pre-konami-code-dev-mode/">you could unlock root with the Konami code</a> and <a href="http://www.webos-internals.org/wiki/Applying_Patches">apply patches to core applications</a>. Alas, webOS crashed and burned at HP. My hunch is that <a href="http://www.theverge.com/2012/6/5/3062611/palm-webos-hp-inside-story-pre-postmortem">being open isn&#8217;t what did them in</a>, though.</p>
<p>Mozilla (disclaimer: my employer) is headed into that webOS territory with <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Firefox_OS">FirefoxOS</a>. In that currently-coalescing ecosystem, the <a href="https://developer.mozilla.org/en-US/apps">apps come from the open web</a>, aren&#8217;t gate-kept by a single marketplace, and can even run on non-FirefoxOS devices. I suspect it won&#8217;t be as slick an ecosystem as Apple&#8217;s, <a href="http://blog.lmorchard.com/2012/09/24/freedom-of-from-choice#p[OtoFoc]">because the loosely-coupled gates will let in more dirt</a>. But, it will be high on the freedom-to-change axis, and the quality of freedom-from-choice options will limited only by the talent of the designers involved.</p>
<h2>Conclusion</h2>
<p>So, I didn&#8217;t <em>really</em> mean to write an advertisement for <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Firefox_OS">FirefoxOS</a>—I work for Mozilla because I love the mission, I&#8217;m not trying to shill. Really, I just think it&#8217;s very important to have a sense of your choices and freedoms when you accept technology into your life. And, of course, I have some very strong opinions, but this post and the one before it are intended as more about choice in general than my own choices or angst. If you&#8217;re happy with your choices, even upon close examination, then that&#8217;s great—just keep your wits about you.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmorchard.com/2012/09/27/freedom-to-change-your-mind/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Things I learned from my High School science teacher</title>
		<link>http://blog.lmorchard.com/2012/09/25/things-i-learned-from-my-high-school-science-teacher</link>
		<comments>http://blog.lmorchard.com/2012/09/25/things-i-learned-from-my-high-school-science-teacher#comments</comments>
		<pubDate>Tue, 25 Sep 2012 17:48:42 +0000</pubDate>
		<dc:creator>lmorchard</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[education]]></category>
		<category><![CDATA[life]]></category>
		<category><![CDATA[science]]></category>
		<category><![CDATA[teachers]]></category>
		<category><![CDATA[wisdom]]></category>

		<guid isPermaLink="false">http://blog.lmorchard.com/?p=367</guid>
		<description><![CDATA[That&#8217;s not actually me in this picture: It&#8217;s something I found in an archive of a defunct GeoCities page, from who knows when. (Though, apparently, it was forged in the era of the Counting Crows.) But, anyway, that&#8217;s Mr. Sabo there in the middle. He was my High School science teacher, and nearly every day [...]]]></description>
				<content:encoded><![CDATA[<p><a style="float: right; margin: 0 0 1em 1em; display: block" href="http://www.oocities.org/sunsetstrip/stage/9868/aboutme.html"><img src="http://blog.lmorchard.com/wp-content/uploads/2012/09/alek_sabo_me.jpg" alt="" title="&quot;This is my friend Alek, my high school physics teacher Mr. Sabo, and me.&quot;" width="250" height="191" class="alignnone size-full wp-image-388" /></a> That&#8217;s not actually me in this picture: It&#8217;s something I found in <a href="http://www.oocities.org/sunsetstrip/stage/9868/aboutme.html">an archive of a defunct GeoCities page</a>, from who knows when. (Though, apparently, it was forged in the era of the Counting Crows.)</p>
<p>But, anyway, that&#8217;s Mr. Sabo there in the middle. He was my High School science teacher, and nearly every day I remember something that he taught me. Let&#8217;s see if I can come up with a few off the top of my head&#8230;</p>
<p><span id="more-367"></span></p>
<ul>
<li>You aren&#8217;t in control of an automobile; physics is. You merely provide suggestions. </li>
<li>Yield signs are stop signs: Since others are not in control of their automobiles, either, you should be more careful. </li>
<li>Always rotate the sample container while tipping out a measure of material. Never reach in with a scoop and risk contamination or unintentional reactions. </li>
<li>If you&#8217;ve learned to print in all caps from your drafting class, make sure the <em>real</em> capital letters are twice the height of the lower-case letters. Otherwise, you&#8217;ll fail the class. </li>
<li>The scientific method is the best means available to human beings for discovering and describing the universe, while compensating for our individual flaws and biases. </li>
<li>The scientific method doesn&#8217;t care about politics, even if scientists do. </li>
<li>You don&#8217;t know much about anything. But, that&#8217;s okay, because we have tools that help quantify how little we know about a given something. </li>
<li>Not knowing much is great, because it means there&#8217;s so much left to find. </li>
<li>Lending a copy of <a href="http://www.amazon.com/gp/product/0465026567/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0465026567&amp;linkCode=as2&amp;tag=0xdecafbad01-20">Gödel, Escher, Bach</a><img src="http://www.assoc-amazon.com/e/ir?t=0xdecafbad01-20&#038;l=as2&#038;o=1&#038;a=0465026567" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important; display: inline" /> to a young nerd will warp his or her brain, leaving it strange forever. </li>
<li>Dropping a soup-can sized chunk of pure sodium into a lake is awesome. </li>
</ul>
<p><span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='640' height='390' src='http://www.youtube.com/embed/RAFcZo8dTcU?version=3&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0'></iframe></span></p>
<p>I don&#8217;t know what Mr. Sabo is up to, these days. I heard he retired—good for him, sad for students. If he or anyone he knows ever reads this, I just want to say this: Thank you so much for teaching me so much. My brief time in your class had an astounding affect on my life.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lmorchard.com/2012/09/25/things-i-learned-from-my-high-school-science-teacher/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
