tag:blogs.thewehners.net,2005:/josh/postsJosh's Blog2018-10-14T16:21:14Ztag:blogs.thewehners.net,2005:Post/4352018-10-14T16:21:14Z2018-10-14T16:21:14Z
Four decades, five places <p>In a few weeks, I will turn 40. This year, I have found myself thinking a lot about where I&#8217;ve been.</p>
<p>My first birthday (year &#8220;0&#8221;, if you insist) happened in Dayton, Ohio:</p>
<iframe width="600" height="450" frameborder="0" style="border:0" src="https://www.google.com/maps/embed/v1/place?q=dorothy%20lane%2C%20kettering%2C%20oh&amp;key=AIzaSyAphYzh1rH8sRdmqoKj4rrgJAkoSEhq6vE" allowfullscreen=""></iframe>
<p>By the time I turned 10, my family was living in Winston-Salem, North Carolina. I vaguely remember having a party in a Putt-Putt mini-golf-slash-arcade, but that might have been age 11 or even 12?</p>
<iframe width="600" height="450" frameborder="0" style="border:0" src="https://www.google.com/maps/embed/v1/place?q=Kinnamon%20Road%2C%20Winston-Salem%2C%20NC%2C%2027104&amp;key=AIzaSyAphYzh1rH8sRdmqoKj4rrgJAkoSEhq6vE" allowfullscreen=""></iframe>
<p>I turned 20 when I studying in Germany, at a technical school in a small village called Mittweida, near Chemnitz and Dresden:</p>
<iframe width="600" height="450" frameborder="0" style="border:0" src="https://www.google.com/maps/embed/v1/place?q=hochschule%2C%20mittweida%2C%20germany&amp;key=AIzaSyAphYzh1rH8sRdmqoKj4rrgJAkoSEhq6vE" allowfullscreen=""></iframe>
<p>My 30th birthday happened when I was living in city of Utrecht, in the Netherlands:</p>
<iframe width="600" height="450" frameborder="0" style="border:0" src="https://www.google.com/maps/embed/v1/place?q=place_id:ChIJf0n-cQ5vxkcRhTTNprQ4lAk&amp;key=AIzaSyAphYzh1rH8sRdmqoKj4rrgJAkoSEhq6vE" allowfullscreen=""></iframe>
<p>And, now I live in Minneapolis, Minnesota:</p>
<iframe width="600" height="450" frameborder="0" style="border:0" src="https://www.google.com/maps/embed/v1/place?q=East%20Lake%20Street%20at%2036th%20st%2C%20Minneapolis%2C%20MN%2C%20USA&amp;key=AIzaSyAphYzh1rH8sRdmqoKj4rrgJAkoSEhq6vE" allowfullscreen=""></iframe>
<p>I&#8217;ve moved a lot, and lived in a bunch of interesting places, and I&#8217;m weirdly proud that this decades slice of my life captures this well. It&#8217;s not even all the places I&#8217;ve lived (whole countries are missing!) but, still.</p>
<p>Growing old is weird (but &#8220;better than the alternative&#8221;, heh).</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4342016-11-10T15:43:03Z2016-11-10T15:43:03Z
Blow <p>We are, each of us, a little wind. Mostly, we are good little winds. We blow a little, here and there. We do what we can to increase joy and diminish pain. Every so often, a great many winds gather in one place, and blow together, and so, they do much harm. They uproot trees and smash houses, and they generate a great deal of pain and suffering and loss.</p>
<p>If you find yourself in a place where a great many winds gather and together you do great harm, and you, too, blow in that direction with them, you cannot say that you were not a hurricane. And if we wake up and say &#8220;that was some bad weather last night&#8221;, then we are talking about you. You might be just a little wind, but a great many winds came together and were a hurricane, and so were you a hurricane.</p>
<p>This is how it is with racism. And sexism, too. And a great many other &#8220;isms&#8221;, too many to name them all here. The formula for racism is discrimination plus structural support. We are all a little racist, a little sexist - it is part of the air we breathe, we cannot be separated from it. We all carry the potential for harm, if we join together and focus on our potential to harm, we can do great harm.</p>
<p>People, with the support of systemic racism, enslaved, raped, and murdered many millions of Africans during chattel slavery. People, with the support of systemic racism, robbed, imprisoned, and murdered many millions of European Jews during the Nazi period. In the last few decades, racism has made genocides in Ukraine, Armenia, Kosovo, and Rwanda. It has brought drone strikes and the fear of sunny days to people in Afghanistan and Pakistan. It will continue to murder and deprive and torture, for as long as we allow a great many to gather together and do great harm.</p>
<p>If you blow with the hurricane, you are a hurricane. You cannot vote for a racist and not be a racist. You cannot vote for a misogynist and not be a misogynist. You cannot give hatred and discrimination your power without hating and discriminating. I am sorry to have to tell you that what you intended to accomplish in your heart matters less than the context in which you operate and the effect you generate.</p>
<p>For what it&#8217;s worth, this here is the operation of a &#8220;classical liberal arts education&#8221;, the intent and design of which is to make it possible for us to sense and understand the forces gathering around us and to be a little less smug in our feeling that we are good little winds.</p>
<p>Some of us, at least, a long time ago, said &#8220;never again&#8221;. Some of us, at least, choose to gather together and rail against the belief that we are good and do no harm and everything will be okay. It&#8217;s not terribly effective, but blowing against the hurricane is the only thing I have left to do.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4332016-08-04T03:14:48Z2016-08-04T03:14:48Z
Not-so-wondrous strange <p>I watched <em>Stranger Things</em> in a remarkable-for-me 4-day binge this past weekend. I had mixed feelings for the first episode, but it gradually won me over, then the ending made me mad.</p>
<p>If, somehow, you haven&#8217;t heard of it, then let&#8217;s at least say: <em>Stranger Things</em> is a short, eight-episode series currently in its first season on Netflix about small town teens who fight a monster. It&#8217;s steeped in nostalgia for the 80s &#8211; or, maybe, more for the pop cultural outgrowths of the 80s than the <em>actual</em> 80s, per se. Imagine <em>The Goonies</em> crossed with <em>E.T.</em> and <em>It</em> with just enough <em>Firestarter</em> and <em>The Thing</em> for good measure.</p>
<p>If you liked any of those fine films, you will probably enjoy this series. And I did, too, up to a point. But the final episode of the series was a major disappointment and I want to talk about why, but, somewhat obviously, I can&#8217;t do that without significant spoilers.</p>
<p>If you have not seen <em>Stranger Things</em> and plan to and don&#8217;t enjoy <strong>**<em>MAJOR SPOILERS</em></strong>**, stop reading now, kaythxbye!</p>
<p><img src="https://cloud.githubusercontent.com/assets/2077/17389114/e3b3356c-59c6-11e6-849b-209ec9f0853e.jpg" alt="stranger-things-logo" /></p>
<hr />
<p>Still here? Okay.</p>
<p>Let&#8217;s start with: the 80s were not a great time for women in film. The &#8220;Bechdel-Wallace Test&#8221; (aka the Bechdel Test, the Mo Movie Measure, and The Rule) originally appeared in a 1985 <a href="http://dykestowatchoutfor.com/the-rule"><em>Dykes to Watch Out for</em> strip</a> where 1979&#8217;s <em>Alien</em> is the last movie to have passed the test.</p>
<p>So, going into a series steeped in 80s film nostalgia, in 2016, no less, scant days after watching Paul Feig rebooted, gender-swapped <em>Ghostbusters</em> (and the last year or so of the 20-something man-baby portion of the culture collectively losing its mind) one has to be, at least a tiny bit apprehensive as to how women are going to be handled in <em>Stranger Things</em>. Are we going to see badass women a la <em>Alien</em>&#8217;s Ripley? Or are we going to get <em>E.T.</em>&#8217;s Gertie? Or any of the dozens of 80s&#8217; lust objects/trophies?</p>
<p>The first couple episodes are rough: Joyce starts out frayed and rapidly goes into high-gear hysteria; Nancy is initially framed as the object of Dustin&#8217;s lust; the other high school girls are barely characters; El starts out nearly mute and spends her first few appearances straddling a very fine line.</p>
<p>So, until maybe episode 3 or 4, the show&#8217;s women are more objects than subjects. Somewhere in the middle of the season, though, this all takes a sharp turn: Joyce, with her ouija wall and wall axing, seems to be occupying the <a href="http://www.imdb.com/title/tt0081505/">Jack Torrance</a> / <a href="http://www.imdb.com/title/tt0075860/">Roy Neary</a> &#8220;kinda crazy but actually not&#8221; territory. Nancy, with her gun toting and lock breaking, turns out to be more <a href="http://www.imdb.com/title/tt0082971/">Marion Ravenwood</a> than <a href="http://www.imdb.com/title/tt0091790">Andie Walsh</a>. And El freakin&#8217; steals the show &#8211; there&#8217;s an early <a href="http://www.telegraph.co.uk/on-demand/0/stranger-things-all-the-hidden-and-not-so-hidden-references-in-p/x-men/">shout-out to X-Men 134</a> that, for geeks like me, anyway, foreshadows her evolution, which plays out much more along <em>Dark Phoenix</em> / <em>Carrie</em> / <em>Firestarter</em> lines than the damsel-in-distress 80s template might have predicted.</p>
<p>But, then, in the eighth and final episode, they fuck everything up.</p>
<p>Depending on how you want to count Barb &amp; Will&#8217;s time in the Upside-Down, there are three (maybe four) separate stories happening in <em>Stranger Things</em>:</p>
<p>1) the D&amp;D group find El and elude the lab goons<br />
2) Nancy &amp; Jonathan discover, lure &amp; fight the monster<br />
3) Joyce &amp; Det. Hopper journey into the Upside Down to rescue Will</p>
<p>There are three stories and each one has almost exactly one woman character. For the first 7/8ths of the season, it appears that each of these stories might actually be <em>about</em> the woman &#8211; El&#8217;s super powers, Nancy&#8217;s badassery, and Joyce&#8217;s determination appear to be in the driver&#8217;s seats of each of their stories for seven episodes.</p>
<p><img src="https://cloud.githubusercontent.com/assets/2077/17389115/e3b35042-59c6-11e6-8a02-d03ec6290e2d.jpg" alt="poster" /></p>
<p>Let me back up a second: I want to talk, for just a bit, about stories and protagonists, because I think our culture routinely screws this stuff up, and I just want to establish some ground rules.</p>
<p>Protagonists are <em>not</em> &#8220;just&#8221; the central character in a story. Protagonists experience conflict and make choices to resolve that conflict. The arc of the story is shaped <em>by</em> their choices: the story happens <em>because</em> of them, not <strong><em>to</em></strong> them.</p>
<p>So, my beef with episode 8 of <em>Stranger Things</em> is that it de-protagonizes every woman in the show, in 53 minutes or less.</p>
<p>Look, let&#8217;s warm up with one we can all agree on: Mike&#8217;s Mom (Karen: I had to look it up) is not, and never was, a protagonist in this show. She&#8217;s on &#8220;it&#8217;s time for dinner&#8221; mom-auto-pilot &#8211; sadly, standard fare for this &#8220;80s genre&#8221; stuff. She does not make choices that effect the story, the story happens <strong><em>to</em></strong> her.</p>
<p><img src="https://cloud.githubusercontent.com/assets/2077/17389113/e3b22bfe-59c6-11e6-8ea0-5c7e316bbe72.jpg" alt="school" /></p>
<p>Technically, Barb gets <a href="http://www.lby3.com/wir/">fridged</a> early on, and so maybe this is just me, but I held on to some hope until the bitter end that maybe, just maybe, Barb was going to be a subject of this story, and not just an object. By the finale, though, it&#8217;s clear: this is a story where Will gets saved and Barb gets eaten.</p>
<p>Nancy is more complicated, maybe, but: up to episode seven, Nancy (the character) is <em>driving</em> her story. She may be Steve&#8217;s conquest, but the show makes it clear that it&#8217;s as much (if not more) her choice than his; later, she pushes Jonathan to gear up and fight the monster, bashes her way into the shed, etc.</p>
<p>In the finale, though, the focus shifts to Steve &#8211; in the end, it&#8217;s <em>his</em> decision to stick around and join in the monster fight that&#8217;s the focal point of their arc. I mean, it&#8217;s a good story <em>for Steve</em>, it&#8217;s just, we were literally in the middle of <em>Nancy&#8217;s story</em> when Steve broke into it. In the coda, it&#8217;s even implied that it&#8217;s <em>actually</em> Steve who got the camera for Jonathan (&#8220;did you give it to him?&#8221;).</p>
<p><img src="https://cloud.githubusercontent.com/assets/2077/17389111/e3a00082-59c6-11e6-9074-9d4ff67d09a1.jpg" alt="axe" /></p>
<p>It&#8217;s Joyce&#8217;s story that I&#8217;m most pissed at, to be honest. Joyce has been, since episode one, determined to find out what happened to her son Will. The lights, the ouja wall, the axe attack &#8211; all of Joyce&#8217;s action in the course of the season is focused on this <em>one</em> thing.</p>
<p>In episode 8, though, the story suddenly shifts to Det. Hopper &#8211; he makes the deal with Brenner, he tells her to breathe, he pulls the breathing tube out of Will, he talks her through CPR. Joyce has <em>literally</em> gone from driver&#8217;s seat to &#8220;along for the ride&#8221; in the space of one episode. Worse still, the (heartbreakingly, beautifully rendered) flashbacks to Det. Hopper&#8217;s daughter&#8217;s cancer shift the <em>emotional</em> weight of their story solidly to <em>him</em>. It&#8217;s no longer about Joyce&#8217;s determination or focus; it&#8217;s about Hopper&#8217;s.</p>
<p>By the time we get to the coda, Joyce has been reset back to being just another overburdened, frazzled Mom, while Hopper&#8217;s scenes play out as an unwinding of his introduction &#8211; making for neat bookends with his introductory scene, all the way down to the &#8220;your mom&#8221; banter.</p>
<p><img src="https://cloud.githubusercontent.com/assets/2077/17389116/e3b3a0ce-59c6-11e6-86e3-2d591f7d8dc2.jpg" alt="bathtub" /></p>
<p>Okay: El. In the end, El sacrifices herself to save her friends. As much as I&#8217;m gutted to see her disappear in this way, sacrificing oneself is a real protagonist choice, and even I have to admit that I&#8217;m stretching things a bit to say that she&#8217;s &#8220;deprotagonized&#8221; in episode eight.</p>
<p><strong><em>However</em></strong>, the way this plays out on camera is just <em>wrong</em>. The moment when El makes the decision to fight the monster, she&#8217;s not even on screen. There&#8217;s a <em>wonderful</em> scene in episode seven where she&#8217;s facing her fears, plunging into the bathtub to locate Will, so it&#8217;s not as if the actress isn&#8217;t up to selling this. Episode 8 just isn&#8217;t having any of it.</p>
<p>Sure, at the end, she gets a lovely &#8220;goodbye&#8221;, and, I suppose, you could argue, maybe, that <em>that&#8217;s</em> the moment she decides to sacrifice herself, but&#8230; I just don&#8217;t think that&#8217;s supported by what&#8217;s on screen. For one thing, we have no reason to think her powers work like this, or are capable of &#8230; whatever it is that happens &#8211; let alone that she&#8217;d <em>know</em> she was capable of this outcome. More important, every time she&#8217;s on screen before that, we&#8217;re being reminded how weak she, how much she needs a re-charge, etc.</p>
<iframe width="420" height="236" src="https://www.youtube.com/embed/DHI5xSi_WGA" frameborder="0" allowfullscreen=""></iframe>
<p>Just contrast this scene with, say, <a href="https://youtu.be/DHI5xSi_WGA?t=129">a similar moment in <em>Creed</em></a>: as Adonis lies, barely conscious on the mat, we get brief micro-flashes of his childhood, his girlfriend, his mentor, his Mom&#8230; and, finally, his late Dad, smiling, before Donny jolts upright and springs back into action.</p>
<p>Again: he&#8217;s <em>barely</em> even conscious here, yet, there&#8217;s no doubt that Adonis has <em>chosen</em> to remain in the fight, despite his injuries, despite all the physical reasons he has to bow out. Adonis is not on &#8220;autopilot&#8221; here, and the film-makers focus all the energy and attention on <em>his</em> story, his grit and determination.</p>
<p>When El gets up off the table to fight the monster should be <em>her</em> moment, but it&#8217;s not a moment we get to see.</p>
<p>Worse, it&#8217;s not even a moment we&#8217;re &#8220;supposed&#8221; to be emotionally invested in: it&#8217;s not <em>her story</em>, it&#8217;s Mike&#8217;s. The climactic showdown with the monster is focused on Mike, Dustin &amp; Lucas. The moment the last stone leaves the wrist-rocket and pins the monster to the wall, slows down just enough to make you think &#8220;it worked?&#8221; The scene is filmed and presented in a way that makes the boys the focal point, so, El isn&#8217;t on screen at all when she decides &#8220;fuck it, let&#8217;s save these guys&#8221;.</p>
<p><img src="https://cloud.githubusercontent.com/assets/2077/17389112/e3b0cee4-59c6-11e6-9748-4e9ccd94df76.jpg" alt="bikes" /></p>
<p>Think about it this way: if you imagine this third of the story a bed-time story being told to a small child, who do you picture is telling the story?</p>
<p>Mike, right? It&#8217;s the &#8220;that time Will went missing and we fought a real-world monster&#8221;, right? The thing is, at almost any point up before episode 8, it <em>could have been</em> &#8211; it had a <em>chance</em> of being &#8211; El&#8217;s &#8220;how I escaped from Hawkins Lab and became a badass Jedi knight&#8221; story. And then, suddenly, nope, it&#8217;s Mike.</p>
<p>I&#8217;m not talking about &#8220;she can&#8217;t be telling the story &#8216;cause she&#8217;s gone&#8221;, here. I&#8217;m talking about <em>who the story is centered on</em>. And it&#8217;s totally okay to tell ensemble stories &#8211; and, actually, Dustin kinda gets the short end of the deal here: he&#8217;s not really in conflict, basically on auto-pilot the whole season, but because he&#8217;s always right and kinda awesome, and there are plenty of other dudes on screen, it&#8217;s <em>not a big deal</em>.</p>
<p>On it&#8217;s own, El&#8217;s story wouldn&#8217;t be a problem. &#8220;Super-powered girl sacrifices herself to save her friends&#8221; is not a bad story. But, as part of the pattern happening in the show overall, it <em>is</em> a problem. As a part of the much broader pattern of the 80s gender politics, which 2016 seems oddly fixated on in hindsight, it&#8217;s yet another small piece of a <em>much</em> bigger problem.</p>
<p>Will gets saved, gets to go on and have other stories and seasons and adventures; Barb gets eaten. Nancy is <em>thiiiis</em> close to being in command of her own story, but Steve swoops in at the end. Joyce is just-along-for-the-ride while Hopper saves her kid, no axe in sight. And El isn&#8217;t even on screen when she decides to save the world.</p>
<p>Here&#8217;s the thing: there&#8217;s the glimmer of a thing here that <em>could</em> have been awesome. This show is more about &#8220;80s movies&#8221; than &#8220;the 80s&#8221;, per se. This is a show about D&amp;D and adventures &#8211; it&#8217;s more about the stories we tell about our lives than our <em>lives</em>, per se. Like much of the 80s material its soaking in, this show is all about banding together, working together and becoming greater than the sum of our parts. &#8220;Don&#8217;t split the party or the orcs will get us.&#8221;</p>
<p>This <em>could</em> have been a show about how we live our lives as if we&#8217;re the protagonists in a story &#8211; in our <em>own</em> story, of course &#8211; but in reality there is no story and we&#8217;re as much guest stars in each others&#8217; shows as we ever are protagonists of our own.</p>
<p>But, in the end, it&#8217;s just another product of a 1980s culture that, apparently, only sees men as having interesting stories to tell, that doesn&#8217;t quite understand woman as <em>people</em>.</p>
<p>I am disappoint.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4322016-04-13T16:37:29Z2016-04-13T16:37:29Z
Help! Why does git think I have been decapitated? <h3 id="or-all-about-detached-head-in-git">Or: all about &#8220;detached HEAD&#8221; in git</h3>
<p>You&#8217;ve been using git for awhile and you&#8217;re finally getting the hang of it. Then one day, you get this weird message from git:</p>
<pre><code>You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example:
git checkout -b &lt;new-branch-name&gt;
</code></pre>
<p>Wait, why does git think I have been decapitated? I feel fine.</p>
<p>Technically, nothing is <em>wrong</em>. This message is a <em>warning</em>, not an <em>error</em>. But you&#8217;re probably a little confused: it isn&#8217;t immediately obvious why you have been warned or what might happen if you fail to heed the warning.</p>
<p>Let&#8217;s back up a bit and try to unpack some of the issues here.</p>
<h3 id="how-did-this-happen">How did this happen?</h3>
<p>A &#8220;detached HEAD&#8221; happens when you use <code>git checkout</code> to checkout something that isn&#8217;t a branch. Most often, this happens when you checkout a specific SHA, or a shortcut like <code>HEAD^</code>.</p>
<p>Another common &#8220;detached HEAD&#8221; scenario is making a small typo when checking out a colleague&#8217;s remote branch.</p>
<p>If you&#8217;re trying to work a branch called <code>feature</code> and you type <code>git checkout feature</code>, git will see <code>origin/feature</code> and assume you want to create a local <code>feature</code> branch tracking changes from <code>origin/feature</code> (or: <code>git checkout -b feature --track origin/feature</code>)</p>
<p><em>However</em>, if you type <code>git checkout origin/feature</code>, you&#8217;ll be in &#8220;detached HEAD&#8221; &#8211; that extraneous <code>origin/</code> instead leads git to assume that you want something else altogether.</p>
<h3 id="what-really-is-head">What <em>really</em> is HEAD?</h3>
<p>Usually, we say that <code>HEAD</code> is a &#8220;pointer&#8221;, but that isn&#8217;t <em>literally</em> true. <code>HEAD</code> is literally a file, inside the <code>.git</code> folder that lives inside and makes your project folder a git repository.</p>
<p>Normally, this file contains a single line, which points or links or refers to the currently-checked out branch.</p>
<p>You can inspect this file and see for yourself. Say you have recently used <code>git checkout master</code>. If you now use <code>cat .git/HEAD</code> (<code>cat</code> is a Unix command that prints a file to the screen. I know it makes no sense.) you will see:</p>
<pre><code>ref: refs/heads/master
</code></pre>
<p>If you <code>checkout</code> a branch called <code>feature</code> and <code>cat .git/HEAD</code> again, you will now see:</p>
<pre><code>ref: refs/heads/feature
</code></pre>
<p>So: <code>HEAD</code> is a file. The contents of that file are (more-or-less) a branch name. And that file changes when you <code>checkout</code> a different branch.</p>
<p>In &#8220;normal operation&#8221;, git updates <code>.git/HEAD</code> with the name of the currently-checked-out branch. But then: what happens when you&#8217;re in &#8220;detached HEAD&#8221;?</p>
<p>If you aren&#8217;t already, let&#8217;s put ourselves in &#8220;detached HEAD&#8221; and see what happens. Run this command in a git repository with more than three commits and it&#8217;ll put you in &#8220;detached HEAD&#8221;: <code>git checkout HEAD^</code>. You should see the long warning message I included earlier.</p>
<p>Now try <code>cat .git/HEAD</code> and instead of <code>refs/heads</code>, you should see a long alphanumeric code - I got <code>49aa5ca3fd952ed1e48759f0e842650841d332b1</code>, which just happens to be the SHA identifier for a commit I named &#8220;One commit before the most recent commit&#8221; (which is what the <code>HEAD^</code> short syntax expands to become).</p>
<p>So, this is &#8220;detached HEAD&#8221;: instead of a branch in the form of <code>ref: refs/heads/&lt;branch&gt;</code>, HEAD is &#8220;detached&#8221; if the contents of <code>.git/HEAD</code> point us at a specific commit by its SHA identifier.</p>
<p>Still: why is this a &#8220;detached HEAD&#8221;? And what&#8217;s the big deal anyway?</p>
<h3 id="why-is-head-attached-to-refsheads">Why is HEAD &#8216;attached&#8217; to refs/heads?</h3>
<p>What you call &#8220;branches&#8221;, git internally calls &#8220;refs&#8221;, or sometimes &#8220;heads&#8221;. (All branches are &#8220;refs&#8221;, but not all &#8220;refs&#8221; are branches. Tags are also &#8220;refs&#8221;.)</p>
<p>A &#8220;ref&#8221; is another kind of pointer in git. For git, a branch (or tag) is not <em>just</em> a human-friendly label, &#8220;refs/heads&#8221; are an indicator of the <em>present</em>, from which git can start to trace backwards to find the entire repository history.</p>
<p>Any individual git commit has no knowledge of its future, but each git commit (except the first) has a record indicating its past - the identifier of the previous commit in history is stored as the commit&#8217;s &#8220;parent&#8221;. (If you think about it, it <em>has</em> to be this way, or git would have to edit older commits whenever you made a new commit later on - it&#8217;d be a small nightmare to keep things consistent.)</p>
<p>To see this in action, look at the last three commits in your repository, with the full commit meta-data on display using the command <code>git log -3 --format=raw</code>. You&#8217;ll see something like this:</p>
<pre><code>commit 823171e770806ffe05e4698dfcfe14eeec260898
tree 3f3b28fed915450b25fe845bfc0dc6b3ee9ec811
parent 49aa5ca3fd952ed1e48759f0e842650841d332b1
author Joshua Wehner &lt;jaw6@fake.com&gt; 1460487755 -0500
committer Joshua Wehner &lt;jaw6@fake.com&gt; 1460487755 -0500
The most recent commit
commit 49aa5ca3fd952ed1e48759f0e842650841d332b1
tree a332444208e9700d95cb78948a41da840d796780
parent 6822da008523291da1d559ec5b4f03f75c88e217
author Joshua Wehner &lt;jaw6@fake.com&gt; 1460487755 -0500
committer Joshua Wehner &lt;jaw6@fake.com&gt; 1460487755 -0500
One commit before the most recent commit
commit 6822da008523291da1d559ec5b4f03f75c88e217
tree f87f39484d60fd23dae45a220c604745d3453a0f
parent 23482b60590927e3939815b366c3ee00073b58dc
author Joshua Wehner &lt;jaw6@fake.com&gt; 1460487755 -0500
committer Joshua Wehner &lt;jaw6@fake.com&gt; 1460487755 -0500
Two commits before the most recent commit
</code></pre>
<p>So, my commit <code>823171</code> knows that its parent is <code>49aa5ca3</code> who knows that its parent is <code>6822da0</code> and so on.</p>
<p>Commits themselves are also stored as files. They can also be found inside the <code>.git</code> folder, in <code>.git/objects</code>. The objects folder is further split into sub-folders using the first two digits of the commit identifier, a little like organizing your documents by year (2016, 2015, etc.)</p>
<p>Now, imagine that you are git. Your user has just asked you for a list of all the commits in the history (<code>git log</code>). You know they are in <code>.git/objects</code> but there&#8217;s a <em>lot</em> of stuff in there. There could easily be <em>millions</em> of objects. And they wouldn&#8217;t necessarily be in a helpful order (those first two digits aren&#8217;t sequential in any useful way).</p>
<p>But: if you could get your &#8220;hands&#8221; on some relatively recent commits &#8211; like, maybe the most recent work on the active branches &#8211; you could start with those and gradually walk backwards from parent to parent, until you had found all the commits in the repository history.</p>
<p>That&#8217;s, basically, what &#8220;refs/heads&#8221; (branches and tags) lets git do &#8211; identify a set of relatively recent commits from which it can work, via parent identifiers, to build a tree of all the commits.</p>
<p>In fact, if there were a commit that fell outside of that tree structure, that commit would be considered by git to be &#8220;unreachable&#8221; - it wouldn&#8217;t show up in <code>git log</code> and it will <em>eventually</em> be removed from <code>.git/objects</code>.</p>
<h3 id="what-might-cause-a-commit-to-fall-off-the-tree-and-be-unreachable-">What might cause a commit to fall off the tree and be &#8220;unreachable&#8221; ?</h3>
<ul>
<li>
<p><strong>Deleting a branch</strong> (<code>git branch -d &lt;branch&gt;</code>) with un-merged work - those commits no longer have a &#8220;refs/heads&#8221; indicating a commit in the &#8220;present&#8221;, so they become &#8220;unreachable&#8221; when the branch is deleted</p>
</li>
<li>
<p><strong>Resetting branch history</strong> - a command like <code>git reset HEAD^</code> moves that branch&#8217;s &#8220;refs/heads&#8221; pointer to an earlier commit, making any commits in between &#8220;unreachable&#8221; by git</p>
</li>
</ul>
<p>And, most significantly for our purposes: <strong>Making a new commit after &#8220;detached HEAD&#8221;</strong></p>
<h3 id="the-risk-of-detached-head-is-accidentally-creating-unreachable-commits">The risk of &#8220;detached HEAD&#8221; is <em>accidentally</em> creating unreachable commits</h3>
<p><strong>This</strong> is why git is trying to warn you about &#8220;detached HEAD&#8221;: there&#8217;s nothing wrong with <code>git checkout &lt;bad SHA&gt;</code> as long as you don&#8217;t make any <em>new</em> commits over there. If you treat &#8220;detached HEAD&#8221; like being in &#8220;read-only mode&#8221;, you&#8217;ll be fine.</p>
<p>If you <em>do</em> make new commits, those commits will become <strong>unreachable</strong> when you switch away to another branch &#8211; that is, when <code>.git/HEAD</code> is no longer pointing at your new commits, git has <em>nothing</em> pointing to those commits.</p>
<p>Maybe you were trying to solve a mysterious bug. You know when the bug came in, maybe even the exact commit, but it&#8217;s not clear what exactly is wrong. You thought it would help if you could &#8220;see&#8221; exactly what the code looked like back on Friday - maybe you could load the project with a debugger attached, try to pin-point the problem.</p>
<p>You did a <code>git checkout &lt;bad commit SHA&gt;</code>, attached the debugger, ran some tests and voila! you&#8217;ve figured it out. You write the new, fixed code, commit it and you&#8217;re done.</p>
<p>Except: <code>git checkout &lt;bad SHA&gt;</code> detached HEAD. You forgot you were in &#8220;detached HEAD&#8221; when you made your fix commits. Now there isn&#8217;t a &#8220;refs/heads&#8221; branch (or tag) that points to these commits (or anything in their future), so they will <strong>disappear</strong> from your repository as soon as you <code>git checkout &lt;away&gt;</code>.</p>
<p>If you are using git on the command-line, modern versions of the git commands will <em>try</em> to warn you about leaving these unreachable commits behind. If I made a commit &#8220;This commit will be unreachable soon&#8221; on a &#8220;detached HEAD&#8221; and then try to <code>git checkout master</code>, I&#8217;ll see:</p>
<pre><code>Warning: you are leaving 1 commit behind, not connected to
any of your branches:
c10b6d2 This commit will be unreachable soon
If you want to keep it by creating a new branch, this may be a good time to do so with:
git branch &lt;new-branch-name&gt; c10b6d2
Switched to branch 'master'
</code></pre>
<p>This lengthy warning is trying to tell me how to prevent these commits from becoming lost in the shuffle. If I create a new branch pointing to the commit, or latest of these commits, the branch will maintain these commits as &#8220;reachable&#8221;. The command <code>git branch &lt;new-branch-name&gt; &lt;SHA&gt;</code> will create a new branch and point it specifically at the given SHA identifier.</p>
<h3 id="so-lets-summarize-what-we-know">So, let&#8217;s summarize what we know</h3>
<ul>
<li>Most of the time, git stores the name of the current branch in <code>.git/HEAD</code>.</li>
<li>When you check out something that is not a branch, a specific commit SHA identifier is stored in <code>.git/HEAD</code> instead &#8211; this is what puts you in &#8220;detached HEAD&#8221;.</li>
<li>Commits only know the identifier of the previous commit or &#8220;parent&#8221;, they don&#8217;t know about the future.</li>
<li>Git uses branches (or tags), aka &#8220;refs/heads&#8221;, as indicators of &#8220;the present&#8221;, from which it can work backwards to build the repository history.</li>
<li>Commits which fall outside of that backwards-working history are &#8220;unreachable&#8221;.</li>
<li>The &#8220;detachable HEAD&#8221; state is dangerous because there is a risk that new commits become unreachable when we leave them behind via checking out to a branch.</li>
<li>Git will try to warn us about &#8220;detached HEAD&#8221; and also about leaving commits behind.</li>
<li>You can avoid losing commits by creating a new branch pointing at the last of the would-be-unreachable commits.</li>
</ul>
<hr />
<p>And that&#8217;s all there is to keeping your HEAD attached in git!</p>
<p><img src="http://data.whicdn.com/images/95573229/large.gif" alt="image" /></p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4292014-01-12T17:13:10Z2014-01-12T17:13:10Z
2013 <p>Ah, Ye Olde Neglected Blogge.</p>
<p style="float:right; margin: 0 0 0.25em 1em">
<a href="http://www.joshuawehner.com/images/so_happy1.jpg"><img src="http://www.joshuawehner.com/images/so_happy_sm1.jpg" /></a>
</p>
<p>I wrote a year-in-review thing a <a href="http://blogs.thewehners.net/josh/posts/404-2008-wrap-up">few years ago</a> and kinda meant to make a habit of it, but other things kept getting in the way.</p>
<p>2013 was a weird year. If I had to pick a theme, I’d probably go with “Biology Is Weird”.</p>
<p>Outline of potentially significant events in 2013:</p>
<ul>
<li>In May, I quit my job at LivingSocial.</li>
<li>In June, my wife and I had our first child.</li>
<li>In July, I started my new/current <a href="http://blogs.thewehners.net/josh/posts/428-working-like-a-hubber">job at GitHub</a>.</li>
<li>In November, we bought our first house.</li>
</ul>
<p>All in all, I like it, but man, I feel old now. It’s a lot of change and much of it in a scary, new “settling down-ish” direction.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4282013-09-18T21:16:45Z2013-09-18T21:16:45Z
Working like a Hubber <h2 id="githubs-approach-to-distributed-work-as-i-have-experienced-it">GitHub’s Approach to Distributed Work as I Have Experienced It</h2>
<p>When I told people I was joining GitHub, there was a familiar response from friends and colleagues: “tell us how they do it”. The general consensus outside of GitHub seems to be that a) distributed workforces are <em>hard</em> b) GitHub appears to do it in a way that “works” and c) no one outside GitHub really understands how they do it. </p>
<p>So, I thought I’d write a little about what I’m seeing at GitHub and why I think it works better than what I’ve seen elsewhere. </p>
<h3 id="disclaimers">Disclaimer(s)</h3>
<p>As of this writing, I’ve been “in the system” for about 9 weeks. I think there are things I’ve seen here that teams elsewhere could use (if they knew about – <em>hence this document</em>) but I think there are also things that we do that wouldn’t work (or wouldn’t work <em>well</em>) at any/every/most other places –</p>
<ul>
<li>GitHub’s main product is a tool for distributed teams to collaborate on code. When we develop a new feature for the product, we enable it for Staff accounts long before we ship it to the “general population”. So, when we work this way, we are not just “dog fooding” – in the traditional sense of “gee, we’d better start using our own product” – we immediately get to work with the benefits of using our new feature ourselves. I mean, people here were using pull requests to build pull requests. It’s a bit meta, but if our workflow didn’t work, we’d already be building the tools to fix it. </li>
<li>A decision was made, at a very early stage, that they wanted to make GitHub a company that worked as a distributed workforce, <em>for better or worse</em>. They have deeply integrated this style of working into almost every aspect of “being GitHub” – and, at this point, they explicitly hire people who work this way. I suspect there’s maybe a chicken-and-egg problem – I can’t really be sure if this is the way we work because it works, or if it works because this is the way we work. However that shakes out, it might not be possible for an established organization to switch to any of the patterns we’re using – it’s possible it’s already too late for some of this to begin and take hold.</li>
</ul>
<h2 id="mostly-obvious-background">Mostly Obvious Background</h2>
<p>As of right now, there are 211 Hubbers. There are 164 tagged as “remote” (ie, 77% of us have a home in a city that is not in SF). In SF right now there are 78 (36%) Hubbers (that’s a combination of residents at home and visitors abroad, so the two add up to &gt;100%).</p>
<p>Once a year, the company brings everyone out to SF at the same time for “Summit”. This is, essentially, an all-company conference, not dissimilar to a higher-end Ruby event, like a RubyFringe or Nordic Ruby – there’s swag, there are lightning talks, there are fancy dinner parties, etc. (There used to be two summits a year, each a slightly different mood/focus, but the current discussion is going in the direction of only having one each year.)</p>
<p>Everyone is encouraged to come to HQ as often as practical (but keep in mind that even people who live in SF don’t necessarily work daily from HQ). Teams are encouraged (but not required) to organize “mini summits”, approximately quarterly. There are also organized Hack Houses and exotic Destinations, which are sort of like “opt-in retreats” (and might involve people you don’t regularly work with, per se).</p>
<p>So, while a lot of people here work remotely most of the time, there’s also a variety of outlets to meet up in person with other Hubbers. When a Hubber is speaking at a conference, they find another Hubber goes along as their “buddy”, so they aren’t wandering alone at the event. </p>
<p>I’d also like to point out that, with a few minor differences, everything I have seen here applies to <em>everyone</em> at GitHub. There’s no internal policy barrier where Developers or Designers are given special treatment. I mean, we make “is a Hubber” posts for <em>every</em> person we hire, not just the “techies”, and as far as I can tell, everything about the way the company works applies to everyone here.</p>
<p>I’d summarize the general guidelines for work here as something like: <strong>“work / discuss / decide in public, with a permalink, invite anyone to comment/collaborate, move on with it - repeat as needed”</strong>.</p>
<h2 id="everything-has-a-url">Everything has a URL</h2>
<p>If there’s one thing that’s really strikingly different about the day-to-day work here, it’s that this company has created this “pro-actively pubilcize work/decisions with permalinks” style and managed to embed it deep into the fundamental company culture. A friend told me he once visited the old GitHub office and when friendly banter turned towards worky-things, he noticed the Hubbers became visibly uncomfortable, and only managed to relax when they were able to stop talking (out loud) and return to the chat room. </p>
<p>People here, at every level, have a powerful drive to share what they are thinking/deciding/working-on and invite discussion around it. There’s an enormous difference between “here’s a note from the boss explaining his decision” and “here’s a pull request someone started to discuss a new feature he’s asking for feedback on”. Not just the timing, but the <em>tone</em>: there’s generally a healthy attitude around discussions and tendency to treat ideas as equally valid regardless of source. That people here have an almost reflexive seeking of feedback is, in my experience, the rare piece that seems fairly unique about the way we operate.</p>
<p>In practical terms, in my experience: Emails are rare, Google docs are endangered species, Hangouts are unusual (and are often transcribed after for anyone who wasn’t involved). Campfire chats and GitHub notificataions are the most common communications channels. (More on this in a bit.) </p>
<p>Possibly related: when we build internal communication tools, people actually use them, for real, and not in a half-assed way. We have an “internal twitter”-type thing, but people actually use it (unlike some Yammer experiments I’ve seen elsewhere). We have an “internal blog” to announce other internal tools / less visible work, and people actually use it to triumphantly announce what they’ve been working on – even things like “Gave a talk” or “Shipped payroll for August”. </p>
<p>Sharing is baked in and contagious.</p>
<h3 id="almost-everything-is-a-pr-or-issue">(Almost) Everything is a PR (or Issue)</h3>
<p>Almost everything we do happens in a PR or Issue. Have a question about using company trademarks? Create a PR on the <code>legal</code> repository. Have a question for the communication team about an article? Put in a PR on the <code>PR</code> repository. Want to order a new MacBook? Send a PR to the <code>gear</code> repository. Want to order business cards? There’s a PR for that… </p>
<p>This enables the Notifications-based communication channel I mentioned above to work reasonably well, but mostly, I think it’s about having a long-lived host for the conversation. Emails are transient, chat transcripts are <em>out there</em> but are needles lurking in haystacks. PRs and Issues can be referenced, automatically linked to, watched/unwatched, closed and reopened, and new comments notify any interested parties. So there’s a record of the situation that’s relatively static (unlike email), but well-integrated with the rest of our tools (unlike Google docs) and can evolve as conversation happens via ongoing comments.</p>
<h3 id="almost-everything-is-opt-in-and-you-can-opt-in-to-almost-everything">(Almost) Everything is Opt-in and You Can Opt-in to (Almost) Everything</h3>
<p>Campfire, PRs and Issues are generally all public information, and I’ve already mentioned that the company culture actively promotes discussions. But what I’ve seen here is that the discussions are really open – anyone who’s interested is welcome and encouraged to contribute. It’s more like having a bunch of internally-open-sourced projects. Want to weigh in on the new office lighting system? Want to help with documentation? There’s basically no boundary to participating on anything internally.</p>
<p>This is one thing we do that everyone can and should copy right away: Instead of the mode where your teams are built around user access privileges, add some teams that are built around “tuning in to interesting topics”.</p>
<p>Examples: we have a JavaScript team, a finance team, a legal team, a performance team, etc. Building a new, JS-heavy feature in an obscure product with a small team and want some extra eyes on the code review? Mention the <code>@github/js</code> team and bring the interested parties to where you are. Working on integrating various services? Tag the effected teams. Wondering if there’s a way to make your new feature perform better? You see where this is going.</p>
<p>During onboarding, we are encouraged to follow along with things like pr, hiring, and legal, as a way of absorbing company background happenings. People follow along with topics that are interests or passions even if they aren’t things they’ve been explicitly hired to do, and helps to avoid the “missing watercooler” problem, where remote employees don’t have access to the same back-channels as on-site employees. Want to know more about front-end dev? Join the JS team and do some code review! Want to weigh in on obscure legal issues? Same answer!</p>
<p>One key seems to be that these teams are all opt-in, and that there are no real limits on what you opt into (other than your own attention span and desire to get work done). Opt-in seems to work better than opt-out. In opt-out systems, <em>everything</em> is overwhelming, so you set up filters to whisk away things until you have some sanity. Then, when someone actually wants to get your attention, they have to figure out how to break through the filters.</p>
<h3 id="almost-everything-works-via-hubot">(Almost) Everything Works via Hubot</h3>
<p>Every tech company I know has used Campfire and most of them have setup <a href="https://github.com/github/hubot">Hubot</a>. But I’ve never seen anyone use Hubot the way GitHub does – here Hubot is not just funny images and mustaching, it has <em>real power</em> to do things, and people depend on it. </p>
<p>Hubot at GitHub is like having a shared, company-wide command-line. It can run CI, deploy to staging or production, scale dynos, read or change environment configuration settings, query and display graphs from graphite, etc. </p>
<p>Sure, there are non-Hubot interfaces to do these things, but with Hubot:</p>
<ul>
<li>Everyone sees what command I used</li>
<li>Everyone sees the same results I see</li>
<li>And it’s automatically stored in the chat transcript</li>
</ul>
<p>Using Hubot this way, our Campfire rooms are more like command centers, or virtual war rooms. Everyone has access to the same set of information – graphs, deploys, etc. – shared and available to the entire room by default. It’s stuff we use on a regular basis, but it really comes together in a crisis – everyone involved is on the same page, and thanks to the “opt-in” culture, any/everyone can get involved and pitch in. I haven’t really seen post-mortem documents created here, just internal posts that link to the beginning of the event in a chat transcript.</p>
<p>Aside: we also use Hubot as a way of reaching out to team members beyond the chatroom. When someone mentions me by my “@username”, Hubot checks if I’m in the room and, if I’m not, I’ll a get a message on my phone. Also, if we’re discussing a PR or Issue in chat, Hubot will post a comment linking back to the chat transcript.</p>
<h3 id="everybody-works-on-whatever-they-want-to-work-on-and-somehow-it-works">Everybody Works on Whatever They Want to Work On and Somehow It Works</h3>
<p>There’s a rumor outside the company that GitHub has no managers. On the inside, we prefer to say that everyone is a manager. Everyone is fully vested in making the company work, and, as much as ability and interest allows, you’re allowed (and encouraged) to work on the thing that you most want to work on. </p>
<p>I think everyone is surprised by how well this actually works, in practice. My personal theory is that this works as well as it does for two reasons:</p>
<ul>
<li>Employees are, from day one, connected to a small(ish) team – so roles are small(ish), broad enough for comprehension but focused enough to get work done, and strong interpersonal ties move the team forward.</li>
<li>Our hiring is built around finding people who want to do the thing the company wants to see getting done – during interviews, I was frequently asked variations on: “if you had all the time and money in the world, what would you do?” </li>
</ul>
<p>It isn’t a perfect process, but, in general, it seems to work: people here are often deliriously happy to be <em>allowed</em> to work on things that we could have <em>asked</em> them to do, but nobody had to ask. </p>
<h3 id="some-examples-of-this-in-action">Some Examples of This in Action</h3>
<p>A team in the late stages on an amazing future product is thinking about possibly making it open source instead of a paid product. There’s a PR where they are discussing the merits of either approach. Along the way, the conversation turns into a discussion about larger company goals. There’s an early consensus, but the conversation has nine articulate participants from all over the “org chart” and takes three days to run it’s course.</p>
<p>Someone starts a PR on the gear repository. Their laptop is getting old, they provide the specs they’d like for the new one. First commenter: “they are rumored to be bumping this line of laptops in a few weeks, can you wait that long?” Second commenter: “I have a company laptop with these specs that I’m not using, want to have it until the upgrades?” This isn’t the IT Department (there isn’t one, yet), it’s just people talking.</p>
<p>The Support team was struggling, held a meeting, decided that weekends and evening shifts were needed to even out the workload and keep everyone happy. Then they built an internal app to visualize and maintain a schedule of who’s-working-when. No one was assigned to a work schedule and somehow it all worked out amicably.</p>
<p>My team recently, after a lengthy multi-channel chat decided to scrap a couple of months work and go in a very different direction for our project. Some of the team may even split off onto other projects for a bit, given the demands of the new focus. But no one seems bummed about the lost work, there’s been very little loss of velocity, we’re excitedly moving on to the next phase.</p>
<h3 id="downsides">Downsides</h3>
<p>I’m only 9 weeks in, but I can already see where there are potential downsides to this approach:</p>
<ul>
<li>It’s stressful – several people I’ve spoken to here compare it to consulting or freelancing, but with a more reliable paycheck. When I started freelancing, I loved that I could work whenever I wanted, take as much vacation as I wanted, etc., until I realized that no work got done unless work actually got done. Without a Big Mean Boss, I have to talk myself out of procrastinating and have no one to blame but myself if I get into trouble. (Well, that last bit isn’t entirely true: I’ve seen my team already [figuratively] jump onto grenades, push people to take more time away, etc. Good people help, but it’s ultimately still my decision as to how I manage my time.) It’s manageable, enjoyable even, but it’s not always easy.</li>
<li>Not everyone works well this way – a few non-Hubbers I know out there who I admire and respect, they’re excellent developers and designers, but I’m not sure they’d be happy in a company run this way. Some of them are senior people who’re looking for a job with an authoritative title. Some are just getting started or would otherwise prefer more guidance in what to work on and how to approach new problems And “lone wolf”-types would struggle, too – there’s a ton of team communication and shared responsibility. People that do well here are the types that seem to thrive in open source – driven, passionate, and open to collaboration with a wider, virtual team.</li>
</ul>
<h1 id="more">More</h1>
<p>If you’re interested to learn more about the way GitHub works, here are a few other sources you might try:</p>
<ul>
<li><a href="https://github.com/blog/1269-the-github-hiring-experience">Coby Chapple</a> and <a href="http://muan.co/2013/07/24/github-hiring-story/">Muan Chiou</a> wrote about the hiring process</li>
<li><a href="http://bleikamp.com/posts/github-mobile/">Ben Bleikamp</a> wrote about building GitHub for mobile</li>
<li><a href="http://zachholman.com/talk/how-github-uses-github-to-build-github/">Zach Holman</a> has talked about using GitHub to Build GitHub</li>
<li><a href="http://scottchacon.com/2011/08/31/github-flow.html">Scott Chacon</a> has written about <a href="http://scottchacon.com/2011/08/31/github-flow.html">“the GitHub Flow”</a></li>
</ul>
<h3 id="thanks">Thanks!</h3>
<p>Thanks for reading this! Also, thanks to Jonathan Hoyt, who provided extremely valuable editing, and has also <a href="http://theprogrammingbutler.com/blog/archives/2013/09/16/new-team-and-lessons-learned/">written a bit</a> about working at GitHub.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4262011-06-19T17:09:31Z2011-06-19T17:09:31Z
Nordic Ruby 2011 <p>Here are some rambling notes on the themes and connections &ndash; intended and mostly otherwise &ndash; I saw in the material presented and discussed in the halls at Nordic Ruby.</p>
<h3>Expressiveness</h3>
<p>In Tom Preston-Werner's opening session, he talked about TomDoc, his alternative to <span class="caps">YARD</span> and RDoc, which he created to have a documentation language whose audience is human code-readers, instead of machine code-generators.</p>
<p>Anthony Eden's talk about <span class="caps">API</span> design continued the theme, suggesting that we pay more and better attention to the audience for whom we write our public interfaces. I particularly loved his suggestion of writing APIs on multiple levels &ndash; one for "I just need it to work"-types, another for "I want more details"-types.</p>
<p>Jakkob Mattsson asked us to consider the things we can't do easily in Ruby &ndash; it's not really supported to metaprogram operators, or change the way expressions are evaluated to suit our own needs. Elise Huard illustrated the Actor Pattern, and asked if we might like to see better support, as in primitives, in Ruby for concurrency.</p>
<p>This being an rather international crowd, there were also some interesting sidelines about the Swedish language, and the challenges inherent in translating code, concepts and web sites from one language to another.</p>
<h3>Data &amp; Metrics</h3>
<p>It seems rubyists love data. Keavy's talk featured some fascinating ideas about driving athletics performance through personal metrics, and both Randall Thomas and Joseph Wilk talked about collecting and scrutinizing data. I especially like Joe's ideas about analyzing code performance metrics, and using that analysis to focus and prioritize our test systems.</p>
<p>I found the hallway discussions heavily featured data. From Forward's <a href="http://www.infoq.com/presentations/Leaner-Programmer-Anarchy">Developer Anarchy</a> concept, to how we're using things like <a href="https://github.com/aezell/statsd">StatsD</a> to help us better track important data at Shopify, there were all sorts of interesting discussions about the use and acquisition of data.</p>
<h3>Legacy</h3>
<p>Both Chad Fowler's incredibly inspiring penultimate session and Aaron Patterson's painfully funny presentation featured nearly identical slides showing &ndash; full screen &ndash; the cover for Michael Feathers' <a href="http://www.amazon.ca/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052">Working Effectively with Legacy Code</a>. But where Aaron talked about strategies for mitigating the difficulties &ndash; code that is often untested and poorly understood can be challenging to refactor &ndash; Chad asked us to ponder the up-side of legacy, and made me wonder whether code I write will <strong>still</strong> be useful in one, let alone 5 or 25 years.</p>
<h3>Comfort zones</h3>
<p>Both Keavy McMinn's and my own presentation asked the audience to "step outside their comfort zone". I asked the crowd to defy stereotypes, and deliberately cultivate variety and "weirdness" in their daily lives. Keavy challenged us to push ourselves toward our goals with heart, to deeply engage with our fears and limits, and build a process by which we may overcome them.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4252011-05-12T23:57:01Z2011-05-12T23:57:01Z
... and the wisdom to know the difference <p>The tech community has a diversity problem. Take gender diversity, for one thing. By most counts, the average open source project has <a href="http://infotrope.net/2009/07/25/standing-out-in-the-crowd-my-oscon-keynote/">49 male participants for every female participant</a>. Women at conferences &ndash; rare enough already! &ndash; are assumed to be significant others, designers or visitors from planet marketing, with <a href="http://www.deliberatepixel.com/2011/04/28/why-the-women-in-technology-thing-really-matters">disastrous consequences</a> for all involved.</p>
<p>This is a problem, for lots of reasons. The worst is that it's self-perpetuating &ndash; women will (wisely!) avoid hostile environments, and through some <a href='http://en.wikipedia.org/wiki/Broken_windows_theory'>broken-window</a>-like mechanism, environments without women will quickly become environments that are <a href="http://www.boingboing.net/2011/03/16/misogyny-is-alive-an.html">hostile to women</a>. (The same holds for other visible minorities.)</p>
<p>In <a href="http://www.garann.com/dev/2011/things-that-actually-matter/">discussions</a> about "how to fix this", community leaders <a href="http://www.brianburridge.com/2010/05/19/lessconf-diversity-and-discrimination-where-is-our-focus/">often</a> appear to be at a loss, unsure how to progress. Their early efforts are often met by criticism on both sides &ndash; techies have a strong libertarian streak that tilts at all sorts of windmills, and the women who do "blaze trails" aren't always much better than the men. (In fields like physics, chemistry and finance &ndash; <a href="http://www.nytimes.com/2006/12/19/science/19women.html?pagewanted=all">fields dominated by men for ages</a> &ndash; which are, these days, however, beating <em>our</em> numbers by a wide margin &ndash; the first generation of women to brave the hostilities and pierce the glass ceiling are often later generations' harshest critics. "What? You want to have a career <strong>and</strong> a family? <em>I</em> didn't have that option. Why should you? You'll need to learn to drink scotch and smoke cigars like I did, or you're through.")</p>
<p>The problem, as I see it, is that the business of fixing this is more like evolutionary biology than most of us are comfortable admitting. That is, it may require a ridiculously awkward, clumsy transitionary phase, to get the caterpillar to turn into a butterfly. To <a href="http://www.sarahmei.com/blog/2010/02/20/scale-8x-slides-posted/">move the needle</a>, as Sarah Mei calls it, <em>might</em> require us to adopt practices and activities that later generations will think were <em>crazy</em>. But we're not going to make a dent in the ratios by pretending that everyone is the same under their clothes &ndash; an admirable attitude in good times, it's not going to help us make a difference now.</p>
<div style="width:425px" id="__ss_3234356"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/sarahmei/moving-the-needle-how-sf-ruby-got-to-18" title="Moving the Needle: How SF Ruby Got to 18%">Moving the Needle: How SF Ruby Got to 18%</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/3234356" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe> <div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/sarahmei">Sarah Mei</a> </div> </div>
<p>Those of us (I count myself among them) who <strong>want</strong> to see this change happen are actively looking for these <a href="http://en.wikipedia.org/wiki/Spandrel_(biology)">spandrels</a> &ndash; the "step-stools" of evolutionary biology &ndash; to find ways to bridge the gap. Because, if you decide that you want to make the numbers change, then a lot of other things don't matter. So what if <a href='http://farukat.es/journal/2011/04/576-translation-general-misogyny-uncomfortable-truth'>some people don't think it's "fair"</a>? What matters is getting people to show up. And if the people who <em>do</em> show up feel marginalized and decide not to return? <strong>That</strong> shit matters.</p>
<p>So, maybe you're gathering a bunch of techie people for a tech meetup or conference. You say "sure, I know that a diverse line-up will improve the experience for female participants, but <a href="http://voodootikigod.com/how-i-pick-speakers-for-jsconf">quotas are icky</a>." I say, "stop calling them quotas, then." Call them "expectations" or "standards" or "quality control measures". Call them anything that makes them feel less icky, 'cause, if you care about this stuff, then you probably need to do <strong>something</strong> about it.</p>
<p>Here's the thing: our brains do this thing where we compare ourselves to all the people around us, all the time. And to make this easier, our brain divides the world into "the group of people that are mostly like us" (aka "peers") and "the others" (it's like <em>Lost</em>, basically). We mostly use visible physical characteristics to determine our peer group: gender, race, accent, body language, shoe selection, <a href="http://sixrevisions.com/infographics/web-designers-vs-web-developers-infographic/">choice of ironic t-shirt vendors</a>, etc. are all automatically factored in.</p>
<p>So, everybody who comes to your event will be scanning the crowd (or the <a href="http://twitter.com/jamieorc/status/68144825299505152">speaker list</a>, if it's available in advance) to answer the question "are these my people, or are they <em>'the others'</em>?" If you're a white male, you probably don't think this is terribly important, but probably that's because you've rarely been in situations where you weren't around other white men. But if you have been in a room where you're the only guy (ever taken a knitting class?), then you know what I'm talking about. (And, if you have <strong>never</strong> been in a situation where you were the visible minority &ndash; seriously? wtf? get out of your comfort zone a little, 'kay?)</p>
<p>Meanwhile, you've already got some ideas on your mental whiteboard about the sort and calibre of talks and people you'd like to see at your event, right? I mean, sure, you like "wacky" talks. Everybody does. <em>One</em> talk about <a href="http://blip.tv/file/3834462">curing bacon at home</a>? Sure, sounds like fun! But, let's say you got a <strong>ton</strong> of submissions that were completely out-of-left-field, weirdo, super-niche kinds of talks. At some point, your finely-honed organizer instincts would kick in, and you'd say, "hold on, let's make sure this thing is balanced, or it'll never fly."</p>
<p>So, when you say "we don't want to have quotas", what I hear is, "I care more about being perceived as 'fair' than I care about actually making a difference in this diversity thing." If you're an organizer or community leader, and if you're on the "side" that wants to move this needle and change the way women (and others) feel when they go to tech events, then there's <strong>no reason</strong> to call them "quotas", because they are no different than any other of your already established criteria for inclusion.</p>
<p>But, look, I'll agree with you, at least, in part: "quotas" are a pretty blunt instrument. They're the sledge hammer. But they're not the only &ndash; or best &ndash; option. They're how you "hold the line", not how you make a major change.</p>
<p>The way you make a major change in the tech-diversity business is to create an environment where people can't <em>not</em> want to be there. You do <strong>everything</strong> you can to make your event impossible to resist.</p>
<p>You offer child-care. And or maybe a kids' track. You offer an introductory track. You offer scholarships for people who normally wouldn't be able to afford your event, because you don't want the ticket price to stop anyone from attending. You advertise your event (and your <span class="caps">CFP</span>) everywhere people you want to be there are looking, because you don't want "I didn't know about it" to be an excuse. You have decent food options for <strike>picky eaters</strike>everyone, because you don't want "I hate food at these things" to stop anyone from showing up.</p>
<p>You do all of this without making anyone feel singled-out or isolated. You create an environment where sexist and racist and homophobic jokes just aren't tolerated, and if they do happen, you make it clear to the <em>offending party</em> (not the <em>offended</em>) and everyone who thinks they might belong in the "asshat" peer group that this isn't the kind of thing you do in your community, and if they can't adapt, they can take a hike.</p>
<p>In other words: You find <strong>every</strong> possible barrier that might keep someone away (except the "I don't like being in such an awesomely diverse crowd" one), and you get rid of it.</p>
<p>You ask follow-up questions. <a href="http://compscigail.blogspot.com/2011/05/2011-mini-course-post-course-survey.html">Survey people</a> &ndash; especially those in all the groups you want to see more of &ndash; and find out how you did. You have to ask two vital questions here: "Will you come next time?" and "Will you recommend that others come with you?" Because those are the answers that add up to making the needle jump around.</p>
<p>You may find that some of the things you offer aren't taken up. Maybe you offer a kids' track, and no kids arrive. Maybe you offer vegetarian food, which no one eats. But that's okay! You need to keep doing it! Because, in making these things <strong>available</strong>, you've moved your event (and yourself), into the category of "events (and people) who <strong>care</strong> about this stuff" &ndash; and <strong>that</strong> is like a giant magnet, attracting all sorts of people, from all sorts of diverse backgrounds, who will want to be part of your community in the future.</p>
<p>There will be times when doing everything you can do doesn't accomplish much. This is a long game, though, and you have to be patient. The impression you leave with people (people who come, and even <a href='http://blog.mewie.com/2011/05/09/why-i-loved-lessconf/'>people who don't</a>) will linger long after your event finishes. But, frankly, we have to do this. We have to do this, so that, someday, we can stop having to do this.</p>
Joshua Wehnertag:blogs.thewehners.net,2005:Post/4242011-04-20T02:08:53Z2011-04-20T02:08:53Z
2000-2010 <p style="float:right; margin: 0 0 0.25em 1em"><a href="http://www.thewehners.net/photos/decade/cwru%202000%20large.JPG"><img src="http://www.thewehners.net/photos/decade/cwru%202000%20small.JPG" width='127' height='200' title="CWRU, 1999" alt="CWRU, 1999" /></a></p>
<p>On January 1, <strong>2000</strong>, I was in <strong>Florida</strong>, with Liz and her family. We&#8217;d only been back from our year in Europe &#8211; her in England, me in various parts of <a href="http://blogs.thewehners.net/josh/posts/tagged/germany">Germany</a> &#8211; a few months, and I was still adapting. When it turned out that Y2K didn&#8217;t kill us all, we went back to Cleveland, and finished our program at Case Western.</p>
<p>That summer, Liz moved to <strong>Wisconsin</strong> to start her PhD in Astronomy, and I moved to <strong>Columbus</strong>, where I entered the masters program in Journalism &amp; Communication. I also got a job &#8211; one of those life- or, at least, career-altering jobs &#8211; in the Web department at the Columbus Dispatch. When I started, it was four of us in a closet; by the time I left, two years later, we had moved out of the closet, acquired a full-time designer, majorly overhauled the main site, and began work on a sister site.</p>
<p>I was in Kansas City, visiting my parents, on September 11, <strong>2001</strong>. I was actually supposed to fly back to Columbus that afternoon, but that morning I was watching Braveheart on <span class="caps">DVD</span>, when my mom phoned and told me to switch over to the news. A few months later, Liz and I got engaged.</p>
<p style="text-align: center">
<a href="http://www.thewehners.net/photos/decade/wedding%202002%20large.JPG"><img src="http://www.thewehners.net/photos/decade/wedding%202002%20small.JPG" width='200' height='141' title="wedding, 2002" alt="wedding, 2002" /></a>
<a href="http://www.thewehners.net/photos/decade/moving%202002%20large.JPG"><img src="http://www.thewehners.net/photos/decade/moving%202002%20small.JPG" width='200' height='138' title="moving, 2002" alt="moving, 2002" /></a>
</p>
<p>In <strong>2002</strong>, my cousin died. Christina and I shared our birthdays &#8211; she&#8217;s the only person I&#8217;d ever known with my exact birthday. Her car stalled out on some railroad tracks and an oncoming train killed her and her boyfriend. It was such a freak thing &#8211; it nearly devastated my aunt &#8211; and, for me, it was a sharp reminder that life can be too short sometimes. I finished my master&#8217;s program as fast as I could, Liz and I got married, and I moved to <strong>Wisconsin</strong>. <em>Note:</em> I seem to have my cousins confused.</p>
<p>I had trouble finding work in Madison, and spent almost 10 months unemployed. I spent a few weeks as a freelance developer at a failing local startup, but the cheques started bouncing, so I left. I also spent a month or two temping, filing paperwork by day, and nursing my many paper-cuts by night. I finally got a job as a webmaster at <a href="http://www.ultratec.com/">Ultratec</a> &#8211; they make communication devices for the deaf &amp; hard-of-hearing.</p>
<p><strong>2004</strong> was the first year this decade that <strong>both</strong> of us manage to stay put at the same address for the entire year.</p>
<p style="text-align: center">
<a href="http://www.thewehners.net/photos/decade/DC%202005%20large.JPG"><img src="http://www.thewehners.net/photos/decade/DC%202005%20small.JPG" width='200' height='150' title="Washington D.C., 2005" alt="Washington, D.C., 2005" /></a>
<a href="http://www.thewehners.net/photos/decade/gencon%202006%20large.JPG"><img src="http://www.thewehners.net/photos/decade/gencon%202006%20small.JPG" width='200' height='148' title="GenCon, 2006" alt="GenCon, 2006" /></a>
</p>
<p>In <strong>2005</strong>, Liz finished her PhD, and got a job in Canada, so we loaded up a truck and moved to Mississauga &#8211; the &#8220;exurbs&#8221;, roughly half-way between her job in Hamilton, and the big city life in Toronto. I started my own small company, <a href="http://www.yeoldewebshoppe.com/">Ye Olde Web Shoppe</a>, and worked on a variety of little web projects. We went to <a href="http://gencon.com/2011/indy/default.aspx">GenCon</a> for the first time, and met a wonderful group of new friends.</p>
<p style="float:right; margin: 0 0 0.25em 1em"><a href="http://www.thewehners.net/photos/decade/badger%202006%20large.JPG"><img src="http://www.thewehners.net/photos/decade/badger%202006%20small.JPG" width='136' height='200' title="Badger, 2005" alt="Badger, 2005" /></a></p>
<p><strong>2006</strong> was the last year in which we didn&#8217;t move houses, change cities or immigrate to other countries. We got a dog, <strong>Badger</strong>.</p>
<p>In <strong>2007</strong>, Liz&#8217;s contract at McMaster ran out, and we moved to the <strong>Netherlands</strong>. We rented a little old house just outside the city center, and starting learning <a href="http://translate.google.com/?hl=en#nl|en|om%20Nederlands%20te%20spreken">om Nederlands te spreken</a>. We went to <a href="http://www.internationalespieltage.de/e070.php4">Spiel</a> for the first time, and discovered how much we like Scotland.</p>
<p>We moved again in <strong>2008</strong> &#8211; still in Utrecht, but to a larger house, a little further outside the city. We got a quieter neighborhood, and spent more time biking than we had in the old place. We finally got to see Ireland and Spain.</p>
<p>Liz&#8217;s contract with Utrecht ran out in <strong>2009</strong>, and I got a job at <a href="http://www.unspace.ca/">Unspace</a>, so we moved to <strong>Toronto</strong> &#8211; not the exurbs, this time, but to the city proper.</p>
<p style="text-align: center">
<a href="http://www.thewehners.net/photos/decade/Kinderdijk%202009%20large.JPG"><img src="http://www.thewehners.net/photos/decade/Kinderdijk%202009%20small.JPG" width='200' height='133' title="Kinderdijk, 2009" alt="Kinderdijk, 2009" /></a>
<a href="http://www.thewehners.net/photos/decade/kelt%20fest%202009%20large.JPG"><img src="http://www.thewehners.net/photos/decade/kelt%20fest%202009%20small.JPG" width='200' height='160' title="Kelt Fest (NL) 2009" alt="Kelt Fest (NL) 2009" /></a>
</p>
<p>Unfortunately, Toronto wasn&#8217;t working out so well for us. The population density was driving Badger nuts (<em>&#8220;What do you mean I can&#8217;t herd those sheep? What do you mean they aren&#8217;t sheep?&#8221;</em>), and Liz wanted to be somewhere greener.</p>
<p>So, this past July, we moved again, to <strong>Ottawa</strong> this time. I&#8217;m now working at &#8211; and <strong>loving</strong> &#8211; <a href="http://www.shopify.com/">Shopify</a>.</p>
<p>The last few weeks of <strong>2010</strong> have been rough &#8211; my aunt Cindy passed away, my Dad fell off a ladder and broke his pelvis in three places, and Liz was rushed into a <a href="http://orthopedics.about.com/cs/herniateddisk/a/ruptureddisk.htm">discectomy</a> 8 days before Christmas.</p>
<p>So, maybe these weren&#8217;t the holiday plans we started with, but still, things are looking good: my Dad is going to be fine, and Liz&#8217;s recovery is proceeding faster than we had hoped.</p>
<p>And, with a little luck, I&#8217;m hoping we get to spend most of the next decade in one place for a change.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4232010-04-26T16:17:16Z2010-04-26T16:17:16Z
Exploring a new frontier <p style="float:right; margin: 0 0 0.5em 0.25em"><a href="http://www.flickr.com/photos/45409431@N00/2939337382"><img src="http://farm3.static.flickr.com/2079/2939337382_d7e1268752_m.jpg" title="yummy coffee" alt="yummy coffee" /></a></p>
<p>Beginning a few years ago, there have been a few projects &ndash; <a href="http://www.mozilla.org/rhino/">Rhino</a>, <a href="http://jaxer.org/">Jaxer</a>, more recently <a href="http://narwhaljs.org/">Narwhal</a> &ndash; that proclaimed we were about to enter a golden era of server-side JavaScript programming. But the implementations always seemed to fall a bit short of expectations, and none of those projects have yet managed to generate the kind of attention and enthusiasm one might hope to see.</p>
<p>But then lately, and for the last few months, I've been hearing <a href="http://jsconf.eu/2009/video_nodejs_by_ryan_dahl.html">really good things</a> about <a href="http://nodejs.org/">Node.js</a> and when I saw <a href="http://howtonode.org/express-mongodb">this blog post</a> I decided to give Node.js a shot.</p>
<p>But: first a little background.</p>
<p>My latest project at <a href="http://unspace.ca/">work</a> involves wrangling a sprawling horde of almost entirely arbitrary metadata. I've been really impressed with <a href="http://www.mongodb.org/">MongoDB's</a> combination of traditional relational-database and new-fangled "document-oriented" features, but there's been a problem.</p>
<p>Ruby.</p>
<p>Well&#8230; kinda. Mostly. Basically.</p>
<p>There are a handful of MongoDB adapters for Ruby and/or Rails; my favorite tends to be <a href="http://railstips.org/blog/archives/2009/06/27/mongomapper-the-rad-mongo-wrapper/">MongoMapper</a>. Except that, MongoMapper requires the developer to explicitly declare the model's attributes (ala DataMapper, MongoMapper's namesake) which, kinda, basically, mostly defeats the flexibility advantages of using something like Mongo in the first place.</p>
<p>There is also <a href="http://github.com/SFEley/candy">Candy</a> which maintains most of Mongo's flexibility, but: 1) it doesn't "feel" like idiomatic Ruby (it diverges wildly from standard-bearer ActiveRecord, at least) and 2) it uses (painfully slow) method-missing "deep magic" to dynamically read and write from arbitrary attributes.</p>
<p>But also: I've been thinking that I might end up using something like Cappuccino as the front-end framework. In which case, I'd kind of like to just get the <span class="caps">JSON</span> that's coming out of Mongo, more or less unmolested, and let the fancy Objective-J client do the processing. For this particularly project, it started to feel that Ruby's obsession with object-relationship mapping was actively getting in the way.</p>
<p>And then sometime last week, I stumbled upon <a href="http://howtonode.org/express-mongodb">this tutorial by Ciaran Jessup</a> that walks through creating a simple blog application <em>(why do new web frameworks always start with blog tutorials?)</em>, written in Node.js, with database-backing provided by MongoDB.</p>
<p>His tutorial uses Express, a Node-powered http server that closely mirrors Ruby's <a href="http://www.sinatrarb.com/">Sinatra</a>. This is where things start to feel familiar: I know my way around Sinatra, and I already tend to think Sinatra is a great "middle layer" for Cappuccino front-ends.</p>
<p>So: for the last few days, I've been hacking away on a little "proof of concept" project (you can follow along on github <a href="http://github.com/jaw6/coffee-blog">here</a>), a "custom blend" of two tutorials: <a href="http://howtonode.org/express-mongodb">Ciaran's Node/Express/Mongo tutorial</a> and <a href="http://cappuccinocasts.com/2009/05/11/8-cappuccino-and-ruby-on-rails-the-weblog-application-part-1/">this series on CappuccinoCasts</a> about building a blog app backed by Rails.</p>
<p>The Cappuccino app is least changed from what's in the screencast, except that I threw in some bits working in Atlas (from a <a href="http://cappuccinocasts.com/2009/11/17/12-playing-with-atlas-beta/">later episode</a>), and had to figure out how to adjust Cappuccino's load paths to launch from the "static files" part of the Express app. (I'm a <em>little</em> disappointed in Atlas &ndash; for a "pay to play" beta, I expected something a little less buggy.)</p>
<p>My contributions here involved expanding Ciaran's very basic blog app to provide a few RESTful endpoints, and expanding his minimalistic Mongo-wrapper to also provide delete and update features. To make matters a little more challenging, I decided that I wanted to try writing the Express app in <a href="http://jashkenas.github.com/coffee-script/">CoffeeScript</a> &ndash; a variant, nicer syntax for JavaScript, that can be compiled into JavaScript.</p>
<p>Although CoffeeScript is easier to read and write than traditional JavaScript &ndash; borrowing good bits from both Ruby and Python, while still preserving the essential "javascriptiness" &ndash; I've never really warmed to the idea of writing for the browser in CoffeeScript, as it would seem to require some frequent re-compiling during development &mdash; true, there are <a href="http://jashkenas.github.com/coffee-script/#resources">resources available</a> that help make that easier, it's just never appealed to me. But I'm <em>much</em> less cautious of writing server-side code that way.</p>
<p>So, how was it?</p>
<p>Well, first the good news: Node.js is <em>fast</em>. Insanely, unbelievably fast. Maybe this just tells you that I've spent too much time working with Ruby, but I found it astonishing. Posting a comment on the blog happens so quickly, I initially assumed it wasn't working &mdash; I thought, "it can't have done that so fast, there must be an error or something".</p>
<p>So, Express works reasonably well as a JSONified RESTful back-end for Cappuccino, with none of the "Mongo-in-a-straight-jacket" feeling I had with Ruby. And I think CoffeeScript is an instant "hit" &ndash; if one is already reasonably familiar with JavaScript, as well as at least one of Ruby or Python.</p>
<p>But it wasn't all cotton candy and rainbows&#8230;</p>
<p>First, as familiar as I am with JavaScript, after a decade or more time writing it for browsers, it's almost like learning a new language again. The server-side context is sufficiently different as to require a substantial shift in perspective ("you mean I don't have to walk the <span class="caps">DOM</span>?"), and a new raft of tools (there are multiple, actively competing <a href="http://github.com/visionmedia/kiwi">package managers</a> for server-side JavaScript) to familiarize oneself with. I'd like to find something like Ruby's <code>irb</code> (ie, a <a href="http://en.wikipedia.org/wiki/Read-eval-print_loop"><span class="caps">REPL</span></a> for Node), to help explore the language in an interactive environment, with more immediate feedback.</p>
<p>Second, there's a lot of moving pieces: in addition to my code, there's CoffeeScript compiling syntaxes, Express setting up listeners and routing, and Node.js executing all that comes out. With all that's going on "under the covers", the "javascript stack" can be a little wobbly. I remember running into similar problems in the early days with Rails' long, confusing stack traces being more than a little overwhelming.</p>
<p>Some examples of places where this bit me:</p>
<ul>
<li>At one point, I was flummoxed by a "syntax error" from coffee, that turned out to be an unknown-to-me JavaScript reserved word &mdash; blindly assuming that "delete" routes worked in Express as they do in <a href="http://www.sinatrarb.com/intro.html">Sinatra</a>, when "delete" in JavaScript <a href="http://www.openjs.com/articles/delete.php">nullifies properties on objects</a>. (Express uses "del" instead of "delete".)</li>
<li>Or, reading the stack trace from an error involving Express' "render" method, it looked to me that there were problems finding the specified template, but it turned out that Express was <em>also</em> trying to find a layout template (which had yet to be created), and failing loudly when it couldn't be located. (You can explicitly turn layouts off, but I had assumed it wouldn't <em>require</em> one anyway.)</li>
</ul>
<p>Ultimately, Node.js and/or Express (realistically: and/or Coffee) might still be just a little too unstable. I found that small errors (sometimes including badly-formed <span class="caps">JSON</span> strings) could crash the entire server. Sure, some of that is my fault &ndash; bad code is bad code, afterall &ndash; and I know I can bring down a Ruby server, too, but it happened a <em>bit</em> more often than I'd like. I'm sure this will get better as Node and Express evolve, but for now, there's a <a href="http://howtonode.org/deploying-node-upstart-monit">tutorial available here</a> on using <a href="http://mmonit.com/monit/">Monit</a> to keep Node alive.</p>
<p>Given that it's still "early days" (both Node and Express are pre-version 1.0), all of this is understandable, and things will only improve from here. After a few years with Ruby, it seems like the "JavaScript guys" are approaching web development programming in reverse &ndash; build a super-fast server <em>first</em>, then follow up with a minimalist "framework", and throw in some (optional) pretty syntax on top &ndash; and I mean that in a <strong>good</strong> way. Approaching things this way seems to have resulted in something that's <em>wicked</em> fast, today &ndash; and that's a great foundation to build on going forward.</p>
<div style="font-style: italic; font-size: 80%" xmlns:cc="http://creativecommons.org/ns#" about="http://www.flickr.com/photos/45409431@N00/2939337382"><a rel="cc:attributionURL" href="http://www.flickr.com/photos/marfis75/">Photo by Kuzeytac &ndash; <a href="http://flic.kr/p/5nGaiW</a>">http://flic.kr/p/5nGaiW</a></a> / <a rel="license" href="http://creativecommons.org/licenses/by-sa/2.0/">CC BY-SA 2.0</a></div>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4222010-03-21T23:36:33Z2010-03-21T23:36:33Z
Scottish Ruby Conference <p>I'm very excited to be speaking at the Scottish Ruby Conference on Saturday. I've been an attendee at the conference (well, in its previous incarnation as Scotland on Rails) and it's one of my all-time favorite conferences. </p>
<p>My talk is on the challenges of developing multilingual applications in Ruby and Rails. I'll be drawing on my experiences on both sides of the screen &mdash; as a developer building web apps, and as a traveler trying to use poorly localized sites. </p>
<p>For anyone who can't attend, I'll post my slides here shortly after the conference, and I understand they might be making videos available again this year.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4212009-12-12T12:17:58Z2009-12-12T12:17:58Z
How to review a game <p style="clear: both">Let's start with how <em>not</em> to review a game. <a href="http://www.star-telegram.com/entertainment/story/1816875.html" style="text-decoration: none;">This is quite possibly the worst review ever</a>. I don't know if the Star-Telegram reviews games often, but this is a phenomenally lazy attempt. They couldn't figure out how to play two of the games, so they give up, play something else, and rate the games an "F".</p>
<p style="clear: both">So, that's the first thing: to review a game, you have to have actually played the game. Preferably more than once. Can you imagine a movie review that goes, "Well, we couldn't make it to the theatre, and missed the first half of the movie. The movie was confusing, so we give it an F."</p>
<p style="clear: both">Maybe it's acceptable to talk about a game you haven't actually played, but then you don't qualify for the "review" label. You could call it a "preview" or "overview" or "glimpse" or something. In fact, articles along the lines of "here's what you get in the box" or "set aside more time than I did for setup" can be very useful, they're just not a "review".</p>
<p style="clear: both">I've always felt that the key word in reviewing a game is "tension" or "balance". Good games will provide a series of choices to be made, and the tension between them is important to the way the game plays out. If the right decision is obvious, it's not much of a game. The rules included in most games talk about the actions and choices available during play, but when I present a new game I try to explain these choices in a context of tension.</p>
<p style="clear: both">Some examples:</p>
<ul style="clear: both"><li>In Ticket to Ride, you have two kinds of tension: you must balance between drawing enough of the right color train cards and claiming routes before your opponents take them from you. You also have the tension between longer, higher-risk and higher-reward destination tickets and the shorter, lower-risk and lower-reward tickets.<br /></li><li>Incan Gold is a straight-forward "press your luck" game: the tension comes in deciding whether to press forward and gain more treasure (at the risk of losing it all), or leave with what you have, while you watch your opponents treasures increase.<br /></li><li>In Dominion, there's tension among the different cards you can purchase, but mostly in choosing the right time to shift your deck-building from "build the engine" mode into "buy some points" mode.</li></ul>
Joshua Wehnertag:blogs.thewehners.net,2005:Post/4202009-12-02T17:00:30Z2009-12-02T17:00:30Z
Thermostat <p style="clear: both">I wonder if some of the reason that there are so many Climate Change Skeptics in North America has to do with the overall temperature here being kinda coldish.</p><p style="clear: both">I mean, if you asked most North Americans how they'd like the temperature if it were a couple of degrees warmer next year, I think most of them would say, "Sure. I wouldn't mind a little less snow."</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4182009-12-01T08:25:43Z2009-12-01T08:25:43Z
Is this thing on? <p style="clear: both">I'm contemplating starting to blog more regularly. Trying this on for size.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4172009-08-03T22:22:30Z2009-08-03T22:22:30Z
Dominion <p>A little game called <a href="http://www.boardgamegeek.com/boardgame/36218">Dominion</a>, possibly my favorite game in recent years, has just <a href="http://en.wikipedia.org/wiki/Spiel_des_Jahres">won a very prestigious game award</a>, and is nominated for another &mdash; perhaps even more prestigious &mdash; award.</p>
<p>Dominion is a card game for 2-4 players (or up to 6 when you add the <a href="http://www.boardgamegeek.com/boardgame/40834">expansion</a>), combining elements of "German-style" board games and trading card games (ie, <a href="http://en.wikipedia.org/wiki/Magic_the_gathering">Magic: the Gathering</a>), except it provides all you need to play in one box.</p>
<p>Each player starts with a deck of 10 cards, seven Copper cards and 3 Estates. There's a pool of 25-50 additional cards available, from which about 10 are selected for each game. The goal of the game is to have the most points when the game ends (by running out of certain piles of cards).</p>
<p>You play in rounds, with a 5-card hand, drawn from each player's own deck of cards. You use Copper to buy new cards, which are added to your deck. The trick is that the cards that earn you points aren't worth much during play. That is, while you can spend Coppers to buy new cards, cards like the Estates are dead weight when drawn into your hand. The other 10 cards available for purchase may allow you do things like draw more cards, or get discounts on your purchases.</p>
<p>So, you have this growing pile of cards, which you shuffle through and draw into a hand, which you can then "spend" to buy more cards, which you will (eventually) shuffle and continue playing. The challenge, then, is to manage the balance of cards in your deck, building it as you play the game. If you buy too many point cards, too early, you'll run out of "gas", and watch your hand "clog" with cards you can't play. On the other hand, if you don't buy point cards quickly enough, you'll be behind the competition when time runs out.</p>
<p>And, because each game generates a different set of cards from the game's pool (originally 25 cards, now up to 50 with the expansion), your strategy has to adapt a little each game. If the "Village" was the run-away star of your last game, but now it's not available, you have to change the way you approach the game.</p>
<p>And you have to watch your opponent's purchases, as well. They might buy a "Witch", which puts "Curse" cards into your deck (-1 point <strong>and</strong> dead weight when drawn). Now you might want to look for solutions: there might be a card that neutralizes the Witch, or which turns the Curse into an advantage for you.</p>
<p>The <a href="http://en.wikipedia.org/wiki/Spiel_des_Jahres">Spiel des Jahres</a> (SdJ) is the gaming world's Oscars. It's given out a few weeks in advance of the Spiel game fair, held even year in Essen. (I bought Dominion after playing it at it's Essen debut a year ago.) The SdJ award often goes to games that are family-friendly, and Dominion is, in some respects, a more complex game than is usually recognized by the SdJ. Still, with only a few exceptions, the SdJ usually signifies a game that is about to "break out" onto the gaming scene, if it hasn't already.</p>
<p>On the other hand, Dominion was recently announced as a nominee for this year's <a href="http://www.dianajonesaward.org/index.html">Diana Jones Award</a>. First: there is no Diana Jones. The award is fashioned from the remaining bits of the "Indiana Jones Role-Playing Games" &mdash; reputedly one of the worst games in the history of games, each and every copy destroyed by request of the publisher &mdash; and "Diana Jones" is all that can be read of the original title, a sort of "traveling trophy".</p>
<p>The secretive cabal responsible for the Diana Jones Award is comprised of game designers, and their emphasis is on games that, in some way, effect the <strong>field</strong> of games. This has led to some odd nominees, as they occasionally select a "style" or "community" of games. In 2006, for example, the winning nominee was <a href="http://www.dianajonesaward.org/06winner.html">Irish Game Convention Charity Auctions</a>. This year's nominees include <a href="http://jeepen.org/">Jeepform</a>, a style of live role-playing games popularized in Scandinavia.</p>
<p>Dominion isn't a lock to win; this year's Diana Jones nominees are all reputedly good games. Still, I can't help hoping. The only other time that a game has won both the Spiel des Jahres and Diana Jones awards was in <a href="http://www.dianajonesaward.org/05winner.html">2005</a>, when <a href="http://en.wikipedia.org/wiki/Ticket_To_Ride_(game)">Ticket to Ride</a> won both.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4162009-06-18T20:25:51Z2009-06-18T20:25:51Z
Language filter <p>One of the spoiling things about living for two years where you don't fluently speak the local language, is that the range of external communication you can safely ignore expands dramatically. In fact, my brain's ability to filter irrelevant conversations happening around me has substantially atrophied. Walking around Toronto, now, I'm having to re-learn to ignore people who aren't actually talking to me. </p>
<p>Most people I encountered in the Netherlands spoke English, and most of them spoke it well, much better than I spoke their language. But there are also cultural differences. I found a sign like this posted in our new apartment building here in Toronto:</p>
<blockquote><p></p>
<p>In our continuing efforts to maintain the cleanliness of the building we are pleased to inform you that we have retained the services of a professional window cleaner to wash the windows of the building.</p>
<p>This work is scheduled between June 15, 2009 till June 19, 2009 from 9am to 5pm, weather permitting. Please ensure that all the blinds and curtains are closed. The work will start from the 10th floor and continue down to the lower floors.</p>
<p></p></blockquote>
<p>If this sign had been posted in the Netherlands, I believe it would say something like this:</p>
<blockquote>Someone comes this week to clean the windows.</blockquote>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4152009-06-15T22:04:12Z2009-06-15T22:04:12Z
Moving bits <h3>Standing in our new flat, looking south-east</h3>
<p><a href="http://www.thewehners.net/joshua/grfx/toronto_view.jpg"><img src="http://www.thewehners.net/joshua/grfx/toronto_view_thumb.jpg" alt="" /></a></p>
<h3>Shower spray</h3>
<p>When we inspected the new flat, along with the building management, we noticed spots of water hanging on the ceiling in the bathroom. &#8220;Must be something upstairs from us,&#8221; we said. &#8220;I&#8217;ll have maintenance look into it,&#8221; they said.</p>
<p>Maintenance came, a day later, but by then, the water was gone, nothing to do.</p>
<p>The next day, I went to take a shower, and discovered the source of the problem. When the shower was running, an arc of water <strong>shot out</strong> at a right angle, with enough force to splatter the wall on the opposite side of the room (roughly 2m away). It was a ridiculous amount of water, shorting out two lights on the vanity mirror. If it weren&#8217;t mounted in our bathroom, it&#8217;d make a fantastic squirt gun on a summer day.</p>
<p>We figure the previous tenant must have had their own, upgraded shower head, and returned the original on their last day, though I can&#8217;t imagine how they failed to notice the leak.</p>
<h3>Badger likes sleeping in the closet</h3>
<p>When I was a kid, our family dog, Rubee, always wanted to sleep in the warm beam of sunlight. Our dog, Badger, is as opposite of that as can be: his favorite places are under beds, and now, inside the coat closet.</p>
<p><a href="http://www.thewehners.net/joshua/grfx/badger_closet.jpg"><img src="http://www.thewehners.net/joshua/grfx/badger_closet_thumb.jpg" alt="" /></a></p>
<p>We don&#8217;t <em>put</em> him in there, he goes in on his own. Lately, when we can&#8217;t easily find him, we check the closet first.</p>
<p>He must be descended from some sort of cave-dog.</p>
<h3>Dutch beer is popular over here</h3>
<p>Inexplicably, Dutch beer is <em>everywhere</em> I look: there are a half-dozen large billboards advertising Grolsch, Heineken, Amsterdam, and a few steps from our new flat we found this:</p>
<p><a href="http://www.thewehners.net/joshua/grfx/dommelsch.jpg"><img src="http://www.thewehners.net/joshua/grfx/dommelsch_thumb.jpg" alt="" /></a></p>
<p>In my time in Utrecht, I only rarely saw anyone voluntarily (forget excitedly) drinking Dutch beer &#8212; Belgian beer is <em>that much better</em>.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4062009-05-12T21:22:07Z2009-05-12T21:22:07Z
Using iText to generate PDFs in Rails; JRuby vs. Ruby Java Bridge <p>So I need to generate a <span class="caps">PDF</span>, using data coming out of a Rails-based app. I started looking at <a href="http://prawn.majesticseacreature.com/">Prawn</a> and <a href="http://www.cracklabs.com/prawnto">Prawnto</a>, but I need to prepend the <span class="caps">PDF</span> with some boilerplate material, ideally another <span class="caps">PDF</span>. In other words, I'd like to programmatically generate a <span class="caps">PDF</span>, then combine the generated <span class="caps">PDF</span> with the boilerplate <span class="caps">PDF</span>.</p>
<p>Pete suggested I look at <a href="http://www.lowagie.com/iText/">iText</a>. iText is a popular, free, <span class="caps">PDF</span> writing library written in Java. So, using this means connecting Ruby and Java in some way. Pete (also helpful) passed on some links and suggested I look at <a href="rjb.rubyforge.org/">Rjb</a>.</p>
<p>All <em>I</em> have to do is get Java and Rjb up and running.</p>
<h4>Gathering ingredients</h4>
<p>This is the easy part.</p>
<p>First, install rjb: <code>gem install rjb</code></p>
<p>Next, download iText from <a href="http://www.lowagie.com/iText/">lowagie.com</a>. At a minimum, you want the "jar" file (it might be zipped). Unpack it to somewhere convenient, maybe your app's <code>lib</code> directory.</p>
<p>Done!</p>
<h4>Try talking to iText</h4>
<p>Try this in <code>irb</code>:</p>
<p style="border: 1px solid #E0E0E0; padding: 5px; white-space:pre"><code>require 'rubygems'
require 'rjb'
load_path = File.join('path', 'to', 'your', 'railsapp', 'lib', 'itext-2.0.6.jar')
options = []
Rjb::load load_path, options
doc = Rjb::import("com.lowagie.text.Document")</code></p>
<p>If this actually works, you'll see something like <code>#&lt;Rjb::Com_lowagie_text_Document:0x2b0c8a8b6390&gt;</code></p>
<p>I had trouble getting this to work on my first several tries. Here are a few errors you might encounter:</p>
<h5>RuntimeError: can't create Java VM</h5>
<p>I got this error when I didn't have a <code>JAVA_HOME</code> set for my environment. On my Mac, this was pretty easy, because Apple <a href="http://developer.apple.com/qa/qa2001/qa1170.html">fixes the location of Java</a> to <code>/Library/Java/Home</code>. Edit (or create, if you don't have one) your <code>~/.bash_profile</code> and add:</p>
<p style="border: 1px solid #E0E0E0; padding: 5px;"><code>export JAVA_HOME=/Library/Java/Home</code></p>
<p>On a Unix system (like, say, our production server), this is a little trickier. On our system, <code>JAVA_HOME</code> is <code>/usr/java/jdk1.5.0_17</code>.</p>
<p>You may also need to set the <code>LD_LIBRARY_PATH</code>. This should be a directory or two away from your JAVA_HOME, and can typically be set in a similar way (ie, in your <code>~/.bash_profile</code>). The general pattern is "JAVA_HOME/jre/lib/<span class="caps">ARCH</span>", where <span class="caps">ARCH</span> refers to your system's architecture (typically <code>i386</code>, but <code>am64</code> on some systems). (Some guides suggest that you also specify a 'client' directory, but our server didn't have one, and leaving it out didn't seem to hurt.)</p>
<h5>NoClassDefFoundError: <code>com/lowagie/text/Document</code></h5>
<p>I got this error when I tried to use any relative path to the iText jar. I had to provide an exact, explicit path to the iText jar file, or NoClassDefFoundError would strike. Inside a script or rake task, I was able to use <code>File.expand_path</code> like so:</p>
<p style="border: 1px solid #E0E0E0; padding: 5px;white-space:pre"><code>my_path = File.dirname(File.expand_path(__FILE__))
load_path = File.join(my_path, 'lib', 'itext-2.0.6.jar')</code></p>
<h5>Can't start the <span class="caps">AWT</span> because Java was started on the first thread</h5>
<p>I got this error sporadically, especially when trying to write tests. Based on a <a href="http://jaywhy.wordpress.com/2007/03/05/pdf-templates-via-rails/#comment-167">comment here</a>, I was able to get it running like this:</p>
<p style="border: 1px solid #E0E0E0; padding: 5px;white-space:pre"><code>require 'rubygems'
require 'rjb'
load_path = File.join('path', 'to', 'your', 'railsapp', 'lib', 'itext-2.0.6.jar')
options = ['-Djava.awt.headless=true']
Rjb::load load_path, options
doc = Rjb::import("com.lowagie.text.Document")</code></p>
<h4>Step Three: Combining files</h4>
<p>Once I had <code>Rjb::import</code> working, I was able to quickly get basic PDFWriter operations running. But I needed to <strong>combine</strong> files, so I transliterated a <a href="http://itext.ugent.be/library/com/lowagie/examples/general/copystamp/Concatenate.java">sample program</a> I found on the <a href="http://itextdocs.lowagie.com/tutorial/general/copystamp/">iText Tutorial pages</a> from Java to Ruby+Rjb+Java, ending up with something like <a href="http://pastie.textmate.org/private/lmpg1mcb7yq5kytxvrpcq">what you see here</a>.</p>
<p>Except that it wasn't working. At all. The errors I got suggested that either <code>copier</code> was <code>nil</code>, or that it didn't have a <code>add</code> method.</p>
<h4>A random but not totally useless side-track &ndash; JRuby</h4>
<p>I couldn't tell if Rjb was the source of my problems, but I had a hunch that if I could run the above script in JRuby, then I'd at least know that my program was <em>fine</em>, that the problem was <em>somewhere else</em>.</p>
<p>In theory, installing JRuby is easy: download the latest release from <a href="http://wiki.jruby.org/wiki/Getting_Started">JRuby</a>, unzip it somewhere useful, put that somewhere in your <code>PATH</code>. I had a problem with <code>jirb</code> (the JRuby <code>irb</code>) where <code>env</code> couldn't find <code>jruby</code>. Using the explicit path to JRuby (instead of <code>~/jruby/bin</code>, say) made everything work.</p>
<p>The only real change to get this running in JRuby is to change from <code>Rjb::import</code> to <code>include_class</code>, like so:</p>
<p style="border: 1px solid #E0E0E0; padding: 5px;white-space:pre"><code>require 'java'
my_path = File.dirname(File.expand_path(__FILE__))
load_path = File.join(my_path, '..', 'iText-2.1.4.jar')
require load_path
include_class "java.io.FileOutputStream"
include_class "com.lowagie.text.pdf.PdfWriter"
include_class "com.lowagie.text.Document"
include_class "com.lowagie.text.Paragraph"</code></p>
<p>But there was still a problem with <code>copier.add</code>. Luckily, though, JRuby's error messages are <em>much</em> more useful than the ones I got from RJb:</p>
<p style="border: 1px solid #E0E0E0; padding: 5px;white-space:pre"><code>NameError: no add with arguments matching
[class com.lowagie.text.pdf.PdfImportedPage] on object
Java::ComLowagieTextPdf::PdfCopy:0xacbf5c
@java_object=com.lowagie.text.pdf.PdfCopy@362a7b</code></p>
<p>So, there's no 'add' method! Okay, armed with this knowledge, I march off into the <a href="http://www.1t3xt.info/api/">iText <span class="caps">API</span> docs</a>. There, I find another method that seems to do what I want: <code>addPage</code>. With a little hackery, I end up with something like this:</p>
<p style="border: 1px solid #E0E0E0; padding: 5px;white-space:pre"><code>document.open
n_pages = reader.getNumberOfPages
n_pages.times do |i|
copier.addPage( copier.getImportedPage(reader, i+1) ) if copier
end
document.close</code></p>
<p>Which works: I can generate a <span class="caps">PDF</span> now. Ooooh, so close!</p>
<p>Now, I want to put some of our app's data into the generated PDFs. But JRuby hates our gems! We have a bunch of weird, wacky, crazy gems here, like RMagick and Ruby2Ruby. I could maybe create a seperate environment configuration with different gem requirements, but&#8230; ugh, that's <strong>so</strong> messy.</p>
<p>Back to Rjb!</p>
<div style='background-color: #E0E0E0; border: 1px solid; padding: 0.5em 1.5em; margin-bottom: 1.5em'>
<p><strong>Totally random aside</strong></p>
<p>I haven't really done a lot of programming with Java, so I didn't know this before today, but in Java you can write two different methods with the same names as long as they have different parameters! So, <code>add(integer)</code> could be totally different than <code>add(string)</code>, say.</p>
<p>From what I can gather, systems that bridge Java and Ruby (like Rjb) do their best to "guess" at the arguments' types, but sometimes they need help.</p>
</div>
<h4>Finally: Combining <span class="caps">PDF</span> Files with iText</h4>
<p>Actually, once I had the JRuby version of the script working, all I had to do was change all the <code>include_class</code> lines back to <code>RJb::import</code>.</p>
<p>Here's a reasonable fascimile of the final rake task: <a href="http://pastie.textmate.org/362591">pdf:build and pdf:combine</a></p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4142009-04-19T04:02:04Z2009-04-19T04:02:04Z
Concerning the thickness of fantasy novels <p>I love this detail from <a href="http://en.wikipedia.org/wiki/Brandon_Sanderson">Brandon Sanderson's</a> <a href="http://www.brandonsanderson.com/article/56/Splitting-AMOL">explanation</a> of the decision to turn the final <i>Wheel of Time</i> novel into 3 parts:</p>
<blockquote>When I'd mentioned 400k to him once, he'd been wary. He explained to me that he felt 400k was unprintably large in today's publishing market. Things have changed since the 90's, and booksellers are increasingly frustrated with the fantasy genre, which tends to take up a lot of shelf space with very few books. There is constant pressure from the big chain bookstores to keep things smaller and thinner.</blockquote>
<p>I like these "behind-the-scenes" anecdotes, that shed unaccustomed light onto the dark corners of otherwise rather familiar-feeling businesses. </p>
<p>For what it's worth, I've never read any of the <i>Wheel of Time</i> books, but I'm becoming a bit of a Sanderson fan - I really liked <i>Mistborn</i> and <i>Elantris</i>, though the second <i>Mistborn</i> seemed to be phoning it in.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4132009-04-18T04:20:56Z2009-04-18T04:20:56Z
Dog bites man, indeed <blockquote><p>Some things should be, on the contrary, celebrated for their very groundedness and averageness and relatability. Human interest stories &mdash; when they're of true human interest (rather than the products of cable's attempts to sensationalize the serious and elevate the vapid) &mdash; needn't be apologized for.</p>
<p>But the kind of tone-deafness so prominently on display in yesterday's cable coverage is precisely what many people resent about cable news (not to mention the media more generally): its tendency to inject melodrama into even the most banal and undramatic of stories. Its impulse to dress things up in sequins and boas and pancake makeup rather than simply present them, to the extent possible, as they are. Waxing rhetorical about The Cultural Significance of Bo the Dog, in this case, isn't merely absurd; it verges on intellectual dishonesty. It suggests an attempt to fool audiences into thinking they're watching Substantial Commentary, when in fact what they're watching is the same kind of body-language-expert-focused, banter-happy drivel they're so used to seeing on cable news.</p></blockquote>
<p><a href="http://www.cjr.org/behind_the_news/what_hath_dog_wrought.php?page=all">Read more at cjr.org</a></p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4122009-03-14T16:35:00Z2009-03-14T16:35:00Z
Serious play <p>This has to be one of my favorite TED talks:</p>
<p><object width="334" height="326"> <param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"> </param> <param name="allowFullScreen" value="true" /> <param name="wmode" value="transparent"> </param> <param name="bgColor" value="#ffffff"> </param> <param name="flashvars" value="vu=http://video.ted.com/talks/embed/StuartBrown_2008P-embed-PARTNER_high.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/StuartBrown-2008P.embed_thumbnail.jpg&vw=320&vh=240&ap=0&ti=483" /> <embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="334" height="326" allowFullScreen="true" flashvars="vu=http://video.ted.com/talks/embed/StuartBrown_2008P-embed-PARTNER_high.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/StuartBrown-2008P.embed_thumbnail.jpg&vw=320&vh=240&ap=0&ti=483"> </embed> </object><br /></p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4102009-02-04T16:46:15Z2009-02-04T16:46:15Z
How we identify <p><a href="http://www.mattbors.com/2009/02/no-respect.html ">Matt Bors points out</a> that political cartoons are frequently <em>described</em>, maybe attributed to a paper, but rarely to an author.</p>
<blockquote>It may seem like a small gripe, but this is routinely how cartoons are referenced in the media. You would never quote a brilliant rhetorical flourish from an op-ed column without saying who wrote it.</blockquote>
<p><a href="http://www.mattbors.com/2009/02/no-respect.html">Read more at mattbors.com</a></p>
<p><a href="http://costik.com/writing.html">Greg Costikyan</a> used to have a similar complaint about game designers. Can you name the person who created <i>Scrabble</i>?</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4092009-01-26T18:44:08Z2009-01-26T18:44:08Z
Doorbell question <blockquote>If you're over 30, you'll probably press a doorbell with your index finger, while anyone under 30 may well use their thumb.</blockquote>
<p><a href="http://www.iht.com/articles/2009/01/23/arts/design26.1-412695.php">Read more at iht.com</a></p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4082009-01-22T17:19:59Z2009-01-22T17:19:59Z
What We Didn't Know Has Hurt Us <p>There's a fascinating article at CJR, <a href="http://www.cjr.org/feature/what_we_didnt_know_has_hurt_us.php?page=all">"What We Didn't Know Has Hurt Us"</a>, about the explosion of classified documents under the Bush administration.</p>
<p>I found this bit mind-boggling:</p>
<blockquote>Far more troubling was the revelation in 2006 that more than twenty-five thousand documents had been pulled from the stacks at the National Archives and Records Administration [...] what had gone missing: cables documenting a widely known intelligence failure from the Korean War; a 1948 message chastising the State Department for not predicting riots in Bogot&aaccute; talking points on how to handle questions about Japanese peace offers before the end of World War II; etcetera. Archive officials conducted an audit and determined that a third of the documents that had been pulled were not eligible to be reclassified, even under the new Bush standards.</blockquote>
<p><a href="http://www.cjr.org/feature/what_we_didnt_know_has_hurt_us.php?page=all">Read more at cjr.org</a></p>
<p><em>Why the heck?</em></p>
<p>Plus, why does this all make me want to play more <a href="https://blogs.thewehners.net/josh/posts/315-wilderness-of-mirrors">Wilderness of Mirrors</a>?</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4072009-01-17T01:21:43Z2009-01-17T01:21:43Z
Geek stampede <p>So, the <a href="http://www.wkowtv.com/Global/story.asp?S=9667184">original story</a> goes something like this: girl buys laptop, laptop comes with (gasp!) Linux, Linux isn't compatible with her High-Speed Internet or her college classes. Girl drops out of the college.</p>
<p>The original article isn't great journalism by any standard, but it tries to spread both blame and instructive explanations into as many corners as it can find: the girl didn't immediately realize what she'd bought, Dell told her everything would be fine, Verizon was going to send someone over, the college promises to accept OpenOffice documents from now on.</p>
<p>Then someone links it to Digg with the wonderfully helpful headline: <a href="http://digg.com/linux_unix/Ubuntu_Causes_Girl_To_Drop_Out_of_College?FC=PRCT2">Ubuntu Causes Girl To Drop Out of College</a> [sic] As of this writing, there are 3,296 "diggs" and 1,158 comments at Digg.</p>
<p>Enter the fanatics:</p>
<blockquote><p>The original story [&#8230;] received more than 120,000 page visits on Thursday. To put that in perspective, our main page got about 15,000 hits&#8230; That's also when the comments &ndash; many of them angry, rude, and hateful &ndash; started pouring in&#8230;</p>
<p>Many Ubuntu users also wrote very personal attacks about the young lady who was having trouble using the operating system. They called her "lazy," "a dumb girl," and "not worthy of a college degree."</p>
<p>The young woman also contacted 27 News to report she's being harassed on her Facebook account by Ubuntu users.</p>
</blockquote>
<p><a href="http://www.wkowtv.com/Global/story.asp?S=9682258&nav=menu1362_2">Read more at wkowtv.com</a></p>
<p>Seriously people? Us geeks are <strong>already</strong> marginalized by our society, do we really need to give them <strong>more</strong> reasons to think we're creepy, anti-social clods? How is any of this helping <strong>anyone</strong>? Do you really think harassing someone on their Facebook page will make <em>more</em> people inclined to try Ubuntu in the future?</p>
<p>The reality is: you all just made it <strong>harder</strong> for Dell to sell more computers pre-loaded with Linux. "More Linux? I don't know, remember all that fuss about Ubuntu awhile back. Let's just put Windows on it and save the hassle."</p>
<p>For what it's worth, I think there's an interesting story or two underneath all this, but the local news team went with the brain-dead "problem solvers" approach. (The original story is a just hair's breadth away from some kind of Onion parody: "Technology, Despite Improvements, Still Hard to Understand".)</p>
<p>The college here is <span class="caps">MATC</span> &ndash; <a href="http://www.matc.edu/">Madison Area Technical College</a> &ndash; basically, a local, two-year, or community college, that focuses on technical skills. Given that their primary student demographics are underprivileged and technically challenged, I'd have hoped that they'd make free and open source software their <strong>default</strong>.</p>
<p>But that's the challenge of the moment for technical colleges like <span class="caps">MATC</span>: Microsoft's expensive tools are the de-facto <em>standard</em>. Ubuntu is a great operating system, and OpenOffice&#8230; well, it isn't <em>that bad</em>, but no matter how good the free software gets &ndash; no matter if it's <strong>perfectly</strong> suited to their student's situation &ndash; as long as the recruiters want to see "Microsoft Word" on the resum&eaccute;s these schools are going to treat it as the standard that it is.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4052009-01-15T15:21:19Z2009-01-15T15:21:19Z
Bush's Economy <p>So, you think things are bad? The Washington Post can <a href="http://www.washingtonpost.com/wp-dyn/content/article/2009/01/11/AR2009011102301.html">tell you just how bad</a>, in glorious, sickening detail:</p>
<blockquote>President Bush has presided over the weakest eight-year span for the U.S. economy in decades, according to an analysis of key data, and economists across the ideological spectrum increasingly view his two terms as a time of little progress on the nation's thorniest fiscal challenges.</blockquote>
<p><a href="http://www.washingtonpost.com/wp-dyn/content/article/2009/01/11/AR2009011102301.html">Read more 'Economy Made Few Gains in Bush Years' at washingtonpost.com</a></p>
<p>To paraphrase: for the roughly 70 years or so for which we have data, the "Bush years" are the worst eight years in several categories. Sure, some blame can be placed on factors outside any president's control, but it remains that this president did remarkably little good.</p>
<p>I'd add a prediction, or two:</p>
<p>Four (or eight?) years from now, when we're getting all retrospective on Obama's term(s), if things are good, we'll all say, "And to think, he inherited a recession."</p>
<p>If things go badly, though, or, at least, fail to improve substantially, I don't think anyone will say, "Well, he inherited such a terrible economy to begin with&#8230;" Should it turn out badly for President Obama's economy, I suspect it will be blamed on what he <em>did</em> or <em>failed to do</em>, not the preconditions.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4042009-01-12T03:26:46Z2009-01-12T03:26:46Z
2008 wrap-up <p>I had a pretty amazingly good 2008, all things considered. I traveled a lot: this was the first year of my life where I can say that I spoke four languages &#8212; even if my Dutch is still consistently horrible.</p>
<p><img src="http://www.joshuawehner.com/images/sevilla.jpg" alt="" /></p>
<p>I finally made it to Spain (a long unfulfilled &#8220;wish&#8221;, since high school Spanish classes) and Scotland. Plus a wedding in Boston, house-sitting in London, a return to Berlin with Liz&#8217;s Mom, and a brief visit to Toronto. We made it back to Essen for Spiel (a giant games fair), and two trips to the K&ouml;ln/Bonn area for the Christmas markets.</p>
<p>The best thing I saw this year was <a href="http://en.wikipedia.org/wiki/The_Wire"><em>The Wire</em></a> (and I&#8217;m re-watching it again now, with Liz this time). I have the fondest memories of a meal I had at <a href="http://www.zurletzteninstanz.de/">Zur letzten instanz</a> in Berlin with Liz and her mom. Best fiction was probably <a href="http://en.wikipedia.org/wiki/The_Anubis_Gates">The Anubis Gates</a> by Tim Powers. Best non-fiction would have to be <a href='http://en.wikipedia.org/wiki/The_Black_Swan_(book)'>The Black Swan</a> by Nassim Taleb.</p>
<p>We&#8217;ve had regular, near-weekly game nights almost all year long, playing an insanely wide range of board, card and role-playing games &#8212; of which <a href="http://www.boardgamegeek.com/game/36218">Dominion</a> is probably my favorite.</p>
<p>Mostly, I feel extremely, ridiculously lucky to have so many wonderful friends, now literally all over the world.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4032008-12-30T16:12:12Z2008-12-30T16:12:12Z
"Dark Knight" sucked <p>The American media got all hyperventilated when "The Dark Knight" came out there back in July, but there was comparatively less enthusiasm when it was finally released in the Netherlands around September or so. Still, when I saw it was scheduled to go out "for rent" on iTunes over the holidays, I made myself an appointment with the couch. Anyway, I'm about six months behind the curve, writing this now, but there'll be <strong>spoilers here</strong>.</p>
<p>So, I finally got to see this and&#8230; good gawd it was awful.</p>
<p>Okay, maybe that's <strong>slightly</strong> overstating it, but certainly "overrated" or "overhyped" and "incoherent mess" would be fairly accurate.</p>
<p>I had "suspension of disbelief" issues throughout the entire movie. A DA <em>punches</em> a witness on the <em>stand</em>, in <em>court</em>, and everybody loves 'em? In what universe? Plus, does this mob give out diversity awards?</p>
<p>Everyone has time in <em>spades</em> in this movie. The Joker plants bombs all over the city. I'm willing to believe that he's good, but some of his "tricks" require psychic powers. And Bruce Wayne does everything we <em>see</em> in the movie, <em>plus</em> develops the software and hardware for a city-wide sonar system? (We saw his ninja training in the previous movie, but when did he learn to write code?) <em>And</em> a password-activated self-destruct sequence?</p>
<p>Visually, the movie was a muddled disappointment. The three-party car chase scene, for example, was a boring mess. (Plus, good riddance to that bat-mobile rubbish &mdash; if they made me sit through one more scene of Batman putting his seat and tray-table down&#8230;) The "truck chase" in <em>Terminator 3</em> was one of the few good things in that movie &mdash; likewise with <em>Matrix Reloaded</em> &mdash; but this movie seemed to replace tension with confusion.</p>
<p>Okay, okay&#8230; Heath Ledger was good. Really, really, really good. When he was on screen, I was generally having a good time. But, um, only like 90% of the time. Even then, most of the time, what he was doing, plot-wise, was crap.</p>
<p>Like, why do the mob guys have a literal, physical, giant pile of money? Hell, why does the bank they're robbing have piles of money in a literal vault, anyway? (Is there a bank, anywhere in North America that still has piles of money in a literal vault these days? I don't mean "credit crisis" <em>these days</em>, I mean 'digital transfer' <em>these days</em>. What bank, let alone mob, still does this?)</p>
<p>Are we really supposed to believe that someone who kills his <em>entire</em> crew during/after one job is a force to be reckoned with in the criminal underworld? a) He'd need to be constantly out working to recruit new help. b) He'd be gradually killing off all the best "muscle" in the criminal underworld (or the worst, then there goes the reputation&#8230;) c) How do you recruit new guys onto a team where all the other guys died? Doesn't that, like, tarinsh your reputation a little?</p>
<p>Ultimately, I failed to find a protagonist &mdash; "viewpoint character", whatever &mdash; to identify with in this movie. Are we supposed to trust Batman/Bruce Wayne, when he's not on screen for half the movie? How <em>did</em> the Joker get those scars? (And does lying about it make him more or less interesting?)</p>
<p>Who do we believe when Dent and Gordon squabble about the trust-worthiness of various police officers? Later, as we follow Harvey Dent on his descent into vengeance, sorry, but who cares? We didn't see the officers driving the hostages around, so is this really supposed to resonate as a betrayal of trust? Had the movie introduced us to some of the officers as characters, maybe we'd at least have <em>some</em> emotional stake in their deaths, or <em>something</em>.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4022008-12-24T16:43:39Z2008-12-24T16:43:39Z
Clay Shirky on attention spans, information overload, and journalism in the new media age <p>I think <a href="http://en.wikipedia.org/wiki/Clay_Shirky">Clay Shirky</a> is easily one of the smartest people researching and writing about the modern media age. I really like his answers in a two part interview with <span class="caps">CJR</span>, this part especially:</p>
<blockquote><p>Or look what happened right when Mac came out. Remember when the Mac came out in '84, and then in '87 they announced this sort of &ldquo;desktop publishing&rdquo; thing, right, and all the Linotype operators laughed until milk came out their noses. Twenty years later, the Linotype operators' union votes itself out of business. Because when the Mac shipped with desktop publishing, it certainly wasn't very good, right? Quality took a hit, everybody's getting these birthday invites with nine fonts on them and so forth. But over the course of twenty years, quality got sorted out, because in a more competitive landscape, there were more positive returns to high quality.</p>
<p>So I think that's going to happen here. The average quality of something written is going to fall to the floor because of the volume of written material. But the competition will mean that the premium for having something especially interesting is going to rise. And then, over the course of the next ten years, we'll sort ourselves out into some sort of new equilibrium.</p>
</blockquote>
<p>Read the whole thing: <a href="http://www.cjr.org/overload/interview_with_clay_shirky_par.php?page=all">Part I</a> <a href="http://www.cjr.org/overload/interview_with_clay_shirky_par_1.php?page=all">Part II</a></p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4012008-12-16T18:09:50Z2008-12-16T18:09:50Z
On the origins of the crisis <p><span class="caps">CJR</span> has <a href="http://www.cjr.org/the_audit/audit_interview_michael_hudson.php?page=all">a fantastic interview</a> with Michael Hudson on the origins of the financial crisis, and his background reporting on poverty issues becomes extremely relevant. It's one of the best resources I've seen, with about a dozen links to background stories, and Hudson's perspective goes really deep.</p>
<p>I particularly found this statistic enlightening:</p>
<blockquote>Between 1998 and 2006, more than 60 percent of subprime loans were refinances. About 30 percent were used for home purchases. Less than one in ten, only 9 percent, were first-time home buyers. This idea that subprime loans were basically used by people who would never have a chance to own a house is a bit misleading. A significant percentage of people who got subprime loans could have qualified for prime loans.</blockquote>Joshua Wehnertag:blogs.thewehners.net,2005:Post/4002008-11-17T15:03:48Z2008-11-17T15:03:48Z
Friends or fans, or does it even matter? <p>So, we've had blogs and the intarwebs for some time now, but it still feels a bit like the wild-west frontier at times. It's fun to see people exploring the medium, trying to find new ways to connect, or just make a buck.</p>
<p>In an <a href="http://www.avclub.com/content/interview/felicia_day">interview with The A.V. Club</a>, Felicia Day talks about blurring the lines between 'fans' and 'friends' online:</p>
<blockquote><p><strong><span class="caps">AVC</span>: It's someone they're invested in, who's in their world, as opposed to someone who was thrust on them by movie posters.</strong></p>
<p><strong>FD:</strong> Or you know, completely separated and become something you project all these things on. Like, "Oh, that person's like <em>this</em>." Well, they know how I am. They probably know what I had for breakfast that morning. [Laughs.] And that's the cool part. And I respond to people, if they post on my blog, I'm like, "Oh, that's really cool you read that book, that fantasy series!" It's almost like they're my friends in a sense. There's less separation. They know me more as a human being with my flaws, versus some kind of actor on a pedestal.</p>
</blockquote>
<p>The timing with this is funny, as I've been watching something similar on <a href="http://www.patrickrothfuss.com/blog/2008/11/heifer-international-charity-for-people.html">Patrick Rothfuss' blog / fundraising project</a>. If you don't know, Patrick Rothfuss is a lecturer and writer, who's first book, <em>The Name of the Wind</em> is probably my favorite book this year. He's currently running a fantastic sort of 'charity raffle', wherein people who donate to the incredible <a href="http://www.heifer.org/site/c.edJRKQNiFiG/b.204586/k.9430/Gift_Catalog.htm?msource=kw1844&amp;gclid=CJCxu8_u6pYCFRKLDQoduwNwPQ">Heifer International</a> through his project will not only have their donation matched by the author, but also receive a signed book, artwork or what have you.</p>
<p>Specifically, it's been interesting to watch the project morph and change shape over time. Just a few days after starting, based on fans'/friends' feedback, Rothfuss has <a href="http://www.patrickrothfuss.com/blog/2008/11/heifer-fundraiser-more-prizes-more.html">expanded and altered</a> the original terms of the raffle, and the whole process has the conversational style you'd expect among friends. I'm sure some of that is Rothfuss' own style and presentation, but that only goes so far &mdash; there's a give-and-take here that you don't see with traditional mediated fan relationships.</p>
<p>See also: <a href="http://blogs.thewehners.net/josh/posts/393-1000-true-fans-give-or-take-a-few">1,000 True Fans, give or take a few</a></p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/3992008-11-04T00:47:14Z2008-11-04T00:47:14Z
The Choconomicon <p>'Tis the season for mixing horror and chocolate, with frighteningly delicious results!</p>
<p>Would you believe that H.P. Lovecraft <a href="http://www.mcsweeneys.net/2008/8/15burns.html">used to write copy for Whitman's Sampler?</a> (McSweeney's) Like the following:</p>
<blockquote><strong>Chocolate Cherry Cordial</strong> You must not think me mad when I tell you what I found below the thin shell of chocolate used to disguise this bonbon's true face. Yes! Hidden beneath its rich exterior is a hideously moist cherry cordial! What deranged architect could have engineered this non-Euclidean aberration? I dare not speculate.</blockquote>
<p>But now, the fine chocolatiers at um, <a href="http://coffeeinhell.livejournal.com/893369.html">here</a> have made this vision a terrifying reality.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/3972008-10-19T19:23:45Z2008-10-19T19:23:45Z
The end of "Opus" <p>Salon.com <a href="http://www.salon.com/books/feature/2008/10/18/opus/print.html">interviews</a> Berkley Breathed about the end of his long-running, oft-revived cartoon character &amp; strip. I thought this quote was touching, in a melancholy sort of way:</p>
<blockquote>The very, absolute last comic strip characters destined to become true household words across America were invented 23 years ago: Calvin &amp; Hobbes. There are and will be no more new ones.</blockquote>Joshua Wehnertag:blogs.thewehners.net,2005:Post/3962008-10-17T22:43:19Z2008-10-17T22:43:19Z
The view from over here <p>An <a href="http://www.guardian.co.uk/commentisfree/2008/sep/10/uselections2008.barackobama">excellent editorial</a> by the Guardian's Jonathan Freedland sums things up nicely:</p>
<blockquote>Until now, anti-Americanism has been exaggerated and much misunderstood: outside a leftist hardcore, it has mostly been anti-Bushism, opposition to this specific administration. But if McCain wins in November, that might well change. Suddenly Europeans and others will conclude that their dispute is with not only one ruling clique, but Americans themselves. For it will have been the American people, not the politicians, who will have passed up a once-in-a-generation chance for a fresh start &ndash; a fresh start the world is yearning for.</blockquote>Joshua Wehnertag:blogs.thewehners.net,2005:Post/3952008-10-16T16:10:49Z2008-10-16T16:10:49Z
Shiny <p>I'm drooling over the new MacBooks Apple announced this week. I've wanted to upgrade my MacBook to a MacBook Pro for some time (every time I run rspec or try to watch video on YouTube, the fan turns the box into a miniature jet engine) but I've been semi-patiently waiting for the long-rumored updates. (Of course, now that they're here, I'll have to drool a little longer, as the internal <span class="caps">CFO</span> isn't ready to sign off on a major expenditure just now.)</p>
<p>Anyway, have you seen <a href="http://www.apple.com/macbook/#designvideo">this video</a>, touting the new "unibody" construction process? It's <strong>gorgeous</strong>. Who does this? Complain about Apple if you want to, but you have to, at least, acknowledge that no other company produces such lavish marketing. (Unless that's what Microsoft's silly <a href="http://www.joeydevilla.com/2008/09/12/bill-gates-and-jerry-seinfelds-second-microsoft-commercial-longer-and-weirder/">Seinfeld ads</a> were trying for? If so, they missed by 1.6 kilometers. I guess <a href="http://www.google.com/googlebooks/chrome/">Google's 'Chrome' comic</a> comes close, though it has a different feel.)</p>
<p>I'm not even sure who this is targeting. It's like a little short film about industrial manufacturing. It's way too long for a TV ad, probably even for YouTube. You have to go out of your way to find it on their site.</p>
<p>I just wish there were more companies who's marketing competed on this level.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/3942008-10-15T23:28:45Z2008-10-15T23:28:45Z
The Food Issue <p>Michael Pollan, author of the very well-written <a href="http://www.michaelpollan.com/omnivore.php">The Omnivore's Dilemna</a>, has penned a timely and flat-out <em>brilliant</em> op-ed for the NYT. Though a tad long-ish, the <a href="http://www.nytimes.com/2008/10/12/magazine/12policy-t.html?_r=3&em=&oref=slogin&pagewanted=all">whole thing</a> is well worth reading.</p>
<blockquote><p></p>
<p>This, in brief, is the bad news: the food and agriculture policies you've inherited &mdash; designed to maximize production at all costs and relying on cheap energy to do so &mdash; are in shambles, and the need to address the problems they have caused is acute. The good news is that the twinned crises in food and energy are creating a political environment in which real reform of the food system may actually be possible for the first time in a generation. The American people are paying more attention to food today than they have in decades, worrying not only about its price but about its safety, its provenance and its healthfulness. [...]</p>
<p>There are many moving parts to the new food agenda I'm urging you to adopt, but the core idea could not be simpler: <em>we need to wean the American food system off its heavy 20th-century diet of fossil fuel and put it back on a diet of contemporary sunshine.</em></p>
<p></p></blockquote>
<p><a href="http://www.nytimes.com/2008/10/12/magazine/12policy-t.html?pagewanted=all">Read more at nytimes.com</a></p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/3932008-10-15T23:06:02Z2008-10-15T23:06:02Z
1,000 True Fans, give or take a few <p>Kevin Kelly has an interesting take on the challenges of being an artistic type in the modern, hyper-digital era:</p>
<blockquote><p>Other than aim for a blockbuster hit, what can an artist do to escape the long tail?</p>
<p>One solution is to find 1,000 True Fans. While some artists have discovered this path without calling it that, I think it is worth trying to formalize. The gist of 1,000 True Fans can be stated simply:</p>
<p>A creator, such as an artist, musician, photographer, craftsperson, performer, animator, designer, videomaker, or author - in other words, anyone producing works of art - needs to acquire only 1,000 True Fans to make a living.</p></blockquote>
<p><a href="http://www.kk.org/thetechnium/archives/2008/03/1000_true_fans.php">&raquo; Read more at www.kk.org</a></p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/3922008-10-02T01:15:49Z2008-10-02T01:15:49Z
I wonder... <p>&#8230; how many conservative chatterboxes have actually <em>heard</em> Pelosi's "hyper-partisan" speech (<a href="http://www.nytimes.com/2008/09/30/washington/30pelositranscript.html?_r=1&amp;pagewanted=all">transcript</a>, <a href="http://www.youtube.com/watch?v=VMLo7i38D58">video</a>). Maybe hyper-partisan speech is, like, subliminal, or something, but I don't see anything here to get all offended over. In <em>her</em> speech, I mean. The bailout proposal seems pretty crappy.</p>
<p>(It's from last week already, but <a href="http://www.npr.org/templates/rundowns/rundown.php?prgId=13&amp;prgDate=09-23-2008&amp;view=storyview">this episode of <em>Fresh Air</em></a> has the best critique of the bailout I've heard so far. And <a href="http://www.nytimes.com/imagepages/2008/09/28/weekinreview/20080928_MARSH_GRFK.html">this <span class="caps">NYT</span> graphic</a> tries to put the bailout in perspective.)</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/3912008-09-29T21:07:54Z2008-09-29T21:07:54Z
First debate <p>This is my first time watching the US presidential process from abroad. I've lived abroad before (<a href="http://blogs.thewehners.net/josh/posts/tagged/germany">a year in Germany</a> and <a href="http://blogs.thewehners.net/josh/posts/tagged/Canada">two in Canada</a>), but never managed to overlap with a US election before. I was part of a course in persuasive speaking during the 2000 election and got some kind of perverse entertainment out of watching Bush and Gore mangle the basics of rhetoric; a pattern which seems to be repeating itself every four years.</p>
<p>The first challenge? Finding a video of the debates. I wasn't staying up late enough to watch the thing live (we're currently six hours ahead of the east-coast), but managed to find the debate in pieces across YouTube. (Other sites were either buggy, blocking me, or had low-quality video. Although I really like the NYT's <a href="http://elections.nytimes.com/2008/president/debates/first-presidential-debate.html">interactive transcript/video</a>, the video is too small for my tastes.)</p>
<p>General reaction? Debates between senators are <em>boring</em>. I guess that's the reason they tend to lose to governors &mdash; arms-length lists of "voted for's" and "voted against's"; picky details of sponsorship and support; committee versus sub-committee in-fighting&#8230; it all comes out sounding like minutiae.</p>
<p>I don't think Lehrer did an especially good job moderating. The questions were often too broad or generic, and the follow-up was weak. To be fair, it is the first debate, and he spent most of his energy trying (rather unsuccessfully) to coax the two into actually, you know, <em>talking</em> to each other. Asking how the bailout would effect their goals was a good <em>idea</em>, but it's like asking them to name their favorite child on national TV.</p>
<p>I thought the last question (the "likelihood of another 9/11-type attack" question) was particularly bad. The honest answer would be "who the @#$% knows?" but no one's going to say that on television. Worse, it's an opening for long, rambling "we're safe, rah-rah-rah" boosterism. I liked Obama's attempt to segue into the "lost standing" territory, but when Lehrer tosses that softball to McCain, he swerves onto a long ramble about missile defense nonsense.</p>
<p>Speaking of which, McCain didn't seem to answer any rebuttal question all night. His pattern of responses were long on hollow talking points and painfully short on direct answers. At times, it seemed like he was running for "king of the senate", rather than President, rattling off a laundry list of dubious "accomplishments" in his Senate career. At least three times (that I noted), he walked a long way around the question to be able to bring up Reagan &ndash; I guess someone thinks he's still shaky with conservatives.</p>
<p>As someone who's worked a few contracts over the years, McCain insistence that fixed-bid contracts would patch up the government's money leak bothered me. There's a tension between "getting what you want" and "paying what you can afford" in any contract, pushing the pendulum one way or the other doesn't change the basic equation. Fixed bids transfer the financial pressures to the contractor, which sounds great when money's tight, but more often than not, quality drops precipitously as a result. More oversight sounds to me like a solution to both problems. Maybe the Congress should spend less time writing <a href="http://www.govtrack.us/congress/bill.xpd?bill=hr110-1255">stupid resolutions</a> and more time doing something useful?</p>
<p>I thought McCain's best answer was his response on aggressive Russia, but even that felt forced and over-rehearsed, in addition to being a bit lose with the facts. Between deliberately misquoting Kissinger and Admiral Mullen, he seems to be tacking hard into "facts don't matter" waters, following a trail blazed by Bush and his running mate.</p>
<p>I'm already sick of the "defeat from the jaws of victory" line, and the whole attitude behind it, as it seems to drive hard at increasing American xenophobia, and more of Bush's "unilateral super-power" mojo. How do you declare victory in a war with no stated goals? Or lose a war we claim we "accomplished"?</p>
<p>Did anybody else notice McCain go all <em>blinky</em> as he starts his last real answer? (The one that starts with "I've been involved, as I mentioned before.") What's <strong>that</strong> about?</p>
<p>I really like Obama as a speaker, but as a debater, he wasn't much better. I thought his tone was a bit off &mdash; he seemed to be aiming for a "I know better than you" flavor of condescending (understable, given McCain's repeatedly pushing the "doesn't get it" button, but still odd to my ears). He also made more "meta-comments" like "Let me make a closing point" or "One last point I want to make". Too often he repeated John Kerry's mistake of over-talking, belaboring his points past the point of simplicity.</p>
<p>All told, it was a fairly uninspiring debate. I don't imagine many undecided viewers were strongly persuaded one way or the other by these performances. Worse, weak questions with weaker follow-up and too many talking points made for a low-wattage show. I'm eagerly awaiting Thursday's vice-presidential debate, though. That has the makings of a real spectacle. (I think Palin's going to be eviscerated.) Should be fun!</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/3872008-09-11T16:40:05Z2008-09-11T16:40:05Z
Of pigs and lipstick <p><span class="caps">NPR</span> has a <a href="http://www.npr.org/templates/story/story.php?storyId=94481288">great overview</a> of the current scandal/gate/tempest-in-a-teapot brewing in US politics. Hearing more of Obama's speech, it's clear that the "pig" comment refers to his "that's not change" riff. Out of context, I guess it's easier to associate the comment with the "hockey moms vs. pit-bulls" "joke" from Palin's convention speech.</p>
<p>Anyway, the piece from <span class="caps">NPR</span> references "lipstick on a pig" comments made in times past, including quotes from Vice President Dick Cheney, Representative Charles Rangel, and <strong>Senator John McCain</strong>.</p>
<p>Um, Candidate McCain? Senator McCain would like to have a word with you.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/3862008-09-06T02:49:59Z2008-09-06T02:49:59Z
Blog.new <p>As of about 15 minutes ago, the blog engine here is a brand new rewrite of what was before. The new system may not look much different on the surface, but it's all new underneath &mdash; and hopefully a lot easier to make gradual improvements, going forward. I'll post later with some more details.</p>
<p>Let me know if you find anything that seems broken.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/3842008-08-28T17:29:24Z2008-08-28T17:29:24Z
Hug a developer <p>I love this video:</p>
<p><embed src="http://blip.tv/play/gYwjwZJqjdEh" type="application/x-shockwave-flash" width="420" height="265" allowscriptaccess="always" allowfullscreen="true"> </embed> </p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/3802008-08-20T19:25:05Z2008-08-20T19:25:05Z
"The pro-Obama Dungeons and Dragons crowd" <p>What the frack?</p>
<blockquote><p>In a post on the McCain Website on Monday, Alexander Goldfarb wrote, &ldquo;It may be typical of the pro-Obama Dungeons and Dragons crowd to disparage a fellow countryman's memory of war from the comfort of mom's basement, but most Americans have the humility and gratitude to respect and learn from the memories of men who suffered on behalf of others.&rdquo; The post was responding to a blog on Daily Kos in which McCain's story of a Vietnamese prison camp guard drawing a cross in the dirt is tied to Aleksandr Solzhenitsyn's similar story from the Soviet Gulag.</p>
<p>This isn't the first time McCain spokesperson Goldfarb has inexplicably used Dungeons and Dragons as a &ldquo;negative&rdquo; association. In early August, he compared the editors of the New York Times to a blogger &ldquo;sitting at home in his mother's basement and ranting into the ether between games of Dungeons and Dragons.&rdquo;</p>
</blockquote>
<p>Um, I mean, I guess, "guilty as charged", but still, wtf?</p>
<p>I can't find the original Daily Kos post, but thhe response is <a href="http://www.dailykos.com/storyonly/2008/8/19/11438/1343/321/570210">here</a></p>
<p>Via <a href="http://www.icv2.com/articles/news/13121.html">ICv2</a></p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/3792008-07-03T21:04:14Z2008-07-03T21:04:14Z
Creative storytelling with signage <object width="400" height="323"><param name="movie" value="http://www.youtube.com/v/G2FueFv5eDo&hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/G2FueFv5eDo&hl=en&fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="400" height="323"></embed></object>Joshua Wehnertag:blogs.thewehners.net,2005:Post/3782008-06-28T21:03:47Z2008-06-28T21:03:47Z
Geeking out (part 2) <p style="float:right;"><img src="http://farm1.static.flickr.com/81/223318835_b6797eff54_m.jpg" alt="" /></p>
<p><a href="http://blogs.thewehners.net/josh/posts/view/377-geeking-out-part-1">More</a> on the changes to D&amp;D in 4th edition:</p>
<h4>Dungeon Master's Guide</h4>
<ul>
<li>The 4th edition Dungeon Master's Guide takes it's name literally: it's genuinely full of <em>extremely practical</em> advice for actually running a game.</li>
<li>Page 42 is the best new thing in 4th edition: advice and a simple table on dealing (coping) with improvised player actions. There's also a brilliant, easy-to-follow walkthrough, using these tools to play out the kind of "swing on the chandelier and kick him into the fire" action that typically drives GMs mad.</li>
<li>There are now rules for running "skill challenges" &ndash; multi-round, skill-based alternatives to hack-n-slash combat. The examples cover everything from court intrigue to interrogation to getting lost in the woods. This solves one of my biggest complaints with 3rd edition D&amp;D, explicitly encouraging non-combat encounters that don't melt down into arbitrary die rolls.</li>
<li>The old encounter planning guideliness &ndash; Encounter Level (EL) and Challenge Rating (CR) &ndash; are largely gone. Based on the number and level of the PCs, you have an XP "budget", which you spend to buy monsters, traps and so forth. Individual monster XP is largely based on level, but can be adjusted with simple add-ons.</li>
</ul>
<h4>Monster Manual</h4>
<ul>
<li>Much about monsters has changed. In 3rd edition, monsters are built like characters, with all the same technical minutiae. 4th edition monsters are slimmed-down, simplified characters, with a compressed presentation that, for even the highest level monster, would fit on an index card.</li>
<li>The 4th edition Monster Manual <em>does <strong>not</strong></em> include much, if indeed any, information on what the monsters eat, where they sleep, or their favorite color. (This was easily half the text in the 3rd edition.) The new manual <em>does</em> include detailed tactical advice, or suggested attack sequences, for almost every monster.</li>
<li>Most kinds of monsters are available in two or more configurations, either at lower/higher levels, or with different roles (goblin archer, goblin brute; kobold slinger, kobold wyrmpriest; etc.)</li>
<li>One nearly universal monster option is the "minion" (or "mook", if you've been playing <a href="http://www.atlas-games.com/fengshui/">Feng Shui</a>). Minion monsters still attack and threaten the PCs, but have essentially one hit point. For those "Stormtrooper" moments, when you want the PCs to hack through dozens of bad guys each turn, minions are great.</li>
<li>Every monster "category" includes a variety of suggested encounter groups by level, such as "5 goblin thugs, 3 goblin archers, 3 dire wolves". You could easily put together such an interesting encounter at a moment's notice.</li>
<li>Monster traits are less common among different monster types (in other words, instead of 10 monsters with some kind of "improved grab" or "flyby attack", traits are more likely to be unique, or at least, unique to a broad "kind" of monster).</li>
<li>I didn't see any monsters with spell resistance, easily one of the most frustrating properties to play against in 3rd edition.</li>
<li>Humanoid monsters (goblins, drow, gnomes, etc.) are presented in a special appendix of racial traits, all the information needed to create more detailed, PC-like NPCs.</li>
</ul>
<h4>Thoughts</h4>
<p>In case it doesn't show, I quite like this edition of D&amp;D. While I didn't quite <em>hate</em> 3rd edition, I didn't very much <em>like</em> it, either.</p>
<p>I'm not a die-hard, life-long D&amp;D fan. I've played more games in the last few years from <a href="http://www.indie-rpgs.com/">the forge</a> than D&amp;D. But I've long wished that D&amp;D would plant itself firmly in the "gamist" niche &ndash; a niche that indie games largely avoid. Sure, maybe I don't want tactical combat every week, but when I do, I'd like there to be a brilliant game that handles it smoothly. 3rd edition D&amp;D, despite it's best efforts, was never going to be that game &ndash; not for me, anyway.</p>
<p>I think 4th edition could be that game.</p>
<p>It's bizarre but &ndash; mainly by losing lots of it's 30 years of established cruft &ndash; this very mainstream game now feels eerily like an indie game. Albeit one that's less open-ended, less narrativist than most indie games, sure. But, still. Unlike 3rd edition's "one game to rule them all" sprawling everygame, 4th edition draws a tighter focus on the <a href="http://www.hmfy.com/masterplan/10">three big questions</a> &ndash; questions that have grown out of the indie rpg movement.</p>
<p>D&amp;D4 may not be the "game I'd take to a desert island" (I'm looking at you, <a href="http://www.daysofwonder.com/tickettoride/en/index/europe/">Ticket to Ride: Europe</a>), but it's the best "go into a dungeon, fight bad guys, take their stuff" game I've seen yet.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/3772008-06-28T20:57:14Z2008-06-28T20:57:14Z
Geeking out (part 1) <p style="float:right;"><a href="http://www.flickr.com/photos/54427463@N00/1580588896/"><img src="http://farm3.static.flickr.com/2267/1580588896_017f594a8b_m.jpg" alt="" /></a> <br />
<br /><em>Magical d20</em> by <a href="http://www.flickr.com/photos/kirklau/">kirk lau</a></p>
<p>So, there's a new version of <a href="http://www.wizards.com/dnd/">Dungeons &amp; Dragons</a> out, just released a few weeks ago. I got the new 4th Edition D&amp;D books this week, and I'm reading them at a rapid pace. I'm trying to keep track of things that have changed between editions, and it's not always as easy as it sounds. Some things are new, some have moved, others have been renamed, others are just gone. I know, there was a "preview" book put out by Wizards of the Coast a few months back, but I don't think it went into sufficiently gory detail.</p>
<p>Here's what I've put together for the player's handbook so far:</p>
<h5>Races &amp; Powers</h5>
<ul>
<li>Gnomes and half-orcs are gone; Dragonborn (beefy humanoid dragon-ish people) and Eladrin (high-falutin' elves) are in.</li>
<li>3rd edition races advantages and disadvantages tended to balance out, 4th edition races generally give a net bonus.</li>
<li>In 4th edition, every level of every class offers you a choice of "powers" (aka spells, tricks, maneuvers, prayers, and so on.) In general, everyone gets the same number of powers at each level, but the range of choices to each class at each level differs. Some character races offer their own additional powers.</li>
<li>Powers are classified as either "at-will" (any time you want, all day long), "per encounter" (needs a 5 minute rest to re-charge), "daily" (needs a 6 hour rest) or "utility" (typically encounter or daily, but separated for character creation purposes).</li>
</ul>
<h5>Classes</h5>
<ul>
<li>Instead of 3rd edition's "tables everywhere" layout, where each class has it's own confusing table, 4th edition has <strong>one big table</strong> that applies to every character.</li>
<li>No more Sorceror (good riddance), the new Warlocks are an interesting potential replacement, but they are a more combat-focused class. At any rate, those who liked playing Sorcerors in the past will probably be happy with the Wizard now.</li>
<li>No more Bard, for better or worse. Several "bard-like" traits are available from other classes, but you may want to multi-class to recreate the exact mix you like best.</li>
<li>No Barbarian or Druid (and none of the other classes do a very good job replicating either), but there's a theory floating around that they'll be sold in a future product.</li>
<li>I could see the new Fighter feeling very different for some players. (Not bad, just different.) Previously, you could build a variety of different characters from this one class. The Fighter now has a more explicit role ("hold the line"); players who went the two-weapon route before should look at the Ranger, others might like the "brutal Rogue" options.</li>
<li>Fighters, Paladins and some monsters have a poorly defined ability to <strong>mark</strong> one or more of their opponents. A mark basically says "deal with me or else!" Marked opponents have -2 on attacks that don't include the marker. There may be additional effects, that vary by class and power selection.</li>
<li>Rogue's still have <strong>sneak attack</strong> bonus damage (but it's much more widely applicable), and the bonus runs on a separate track that goes up automatically with your level.</li>
<li>Wizards don't have <strong>familiars</strong> anymore.</li>
<li>Wizards get to know additional daily powers, but have to prepare a sub-set at the start of the day. Also, their spells are now standard attacks, meaning that Magic Missile can now <em>miss</em>.</li>
<li>Magic-using classes now have weapons &ndash; sorry, "implements" &ndash; staffs, wands, rods, etc. In 3rd edition, a wand was a disposable spell gun, in 4th edition, it adds a bonus to your attack roll with a certain class of spells.</li>
</ul>
<h5>Feats and Skills</h5>
<ul>
<li>I haven't kept track of all of them, but many 3rd edition feats, like <strong>Trip</strong> and <strong>Cleave</strong>, for example, are now class powers.</li>
<li><strong>Multi-classing</strong> is now done with feats. Each class has an intro feat, that lets you gain a specific power from the class in question, and there are generic "power swap" feats, for additional powers. Around level 11, you get additional options, depending on which of these feats you've taken. In general, it's a lot harder to make "half this and half that" characters now, but "this, plus a wee bit of that" is now a lot easier, less likely to <em>suck</em> at everything.</li>
<li><strong>Two Weapon Fighting</strong> is quite a bit different. With the exception of some Ranger class powers, characters in 4th edition have just <em>one</em> attack each round. You are explicitly allowed to hold an additional, light weapon in your off-hand, but you don't typically gain anything from this.</li>
<li>Skills are now much simplified and consolidated. There are no "skill ranks" &mdash; you automatically get half your level + the revelant ability + 5 if you chose the skill at first level.</li>
<li>Most "programmed" skill-based combat maneuvers (tumbling through an opponent's space, using bluff to feint, etc.) are now class powers. (But see how the new Dungeon Master's Guide for improvising combat maneuvers using skills.)</li>
</ul>
<h5>Equipment</h5>
<ul>
<li>The Player's Handbook now includes magic items and all the character creation options. (In 3rd edition, the Dungeon Master's Guide had all the non-mundane equipment and all the prestige classes &mdash; which were an optional but common focus of character creation, especially at higher levels.) If you don't think you'll DM, you can safely buy <em>just</em> the player's book, and save money on the other two.</li>
<li>4th edition <strong>weapon proficiency</strong> is new and different: any character can use any kind of weapon, but class-granted proficiency <em>allows</em> you to add a "proficiency bonus", which is different for each weapon (though it tends to follow a pattern).</li>
<li>Magic weapons now "scale" with character level: a weapon that grants a +1 bonus at 2nd level might give a +2 by level 7. Similar things happen with armor. Magic shields typically <strong>don't</strong> offer armor bonuses, but various other defensive buffs, like damage resistance.</li>
</ul>
<h5>Combat Action</h5>
<ul>
<li>Your turn in combat now has three "phases": take on-going damage at the start, take actions, make saves against on-going effects.</li>
<li>There are now four kinds of combat actions: standard (attacks), move, minor (draw a weapon) and free (talk). You typically get 1 standard, 1 move and 1 minor action, but you can convert down (standard &gt; move &gt; minor). There are no full round actions.</li>
<li>There's now just <em>one</em> Armor Class score (no more flat-footed, touch, etc.) However, Fort, Reflex and Will are now <em>defenses</em>. A "save" in 4th edition is just a simple "beat 10" roll, against most on-going effects (paralysis, poison damage, etc.) Different powers target different defenses. In play, this means calling out which defense you're targeting along with the to-hit roll ("18 versus AC", "21 against his Will", etc.)</li>
<li>The core game now has Action Points, but they work differently. Once per encounter, you can spend a point to get a bonus standard, move or minor action. You gain a new action point every two fights without sleeping. When you sleep, you are reset to 1. (3rd edition action points, in Eberron anyway, gave you bonus dice on a d20 roll.)</li>
<li>A natural 20 is an automatic hit. If the roll + bonuses <em>would</em> hit the target's defense, it's a critical hit. Instead of doubling the damage, 4th edition critical hits deal the <strong>maximum</strong> damage. Some weapons and powers offer additional effects on a critical hit. Note that <strong>all</strong> attacks can now critical (including spells!)</li>
<li>Charge works similarly, but is described awkwardly, so it seems more different than it is. Charge is now a standard action that bundles a move and an attack. Effectively, this means you still move twice and attack. This bonus for charging is a smaller now.</li>
<li>Grapple, now called "grab", is <em>hugely</em> less complicated, and should have a higher success rate for most characters.</li>
<li>"5 foot step" is now a move action called <strong>shift</strong>. The re-definition allows for powers to affect shifting (with less clunky writing) &mdash; for example, a power might grant you a longer shift, or stop another character from shifting away from you.</li>
</ul>Joshua Wehnertag:blogs.thewehners.net,2005:Post/3762008-06-26T21:19:27Z2008-06-26T21:19:27Z
"Brave N00b World" <p>A fun talk on mapping a virtual world by James Wallis:</p>
<p><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="420" height="318" id="viddler"><param name="movie" value="http://www.viddler.com//simple_on_site/a10494c4" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="true" /><embed src="http://www.viddler.com//simple_on_site/a10494c4" width="420" height="318" type="application/x-shockwave-flash" allowScriptAccess="always" allowFullScreen="true" name="viddler" ></embed></object></p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/3752008-06-16T18:30:54Z2008-06-16T18:30:54Z
Tech talk <p>I've been thinking lately about how many of the talks at tech conferences are bizarrely <em>impractical_. For a counter-example, Rands has this <a href="http://www.randsinrepose.com/archives/2008/04/21/saving">seemingly un-radical suggestion</a></em>seconds.html</p>
<blockquote><p>This is the presentation I want to see at the next conference: in a room full of people, anyone is welcome to walk up to the mic and plug their laptop in to the projector. They'll be asked to complete three simple tasks:</p>
<ol>
<li>Send a mail to a friend</li>
<li>Find something on the Internet</li>
<li>Save a bookmark or an image.</li>
</ol>
<p>I would be fixated.</p>
</blockquote>
<p>I'd love that.</p>
<p>If developers are the builders, why don't we talk more about <strong>craft</strong>? Why are there so many conference presentations about lofty topics, and so <em>few</em> about dispensing with down-to-earth, day-to-day chores?</p>
<p>One of my favorite BarCamp sessions was a group "show-and-tell" &mdash; we took turns introducing the rest of the crowd to one tool in our arsenal. I talked about <a href="http://www.getfirebug.com/">FireBug</a>, someone talked about <a href="http://docs.google.com/">Google Spreadsheets</a>, someone else talked about <a href="http://selenium.openqa.org/">Selenium</a>. I'd love to see more of that kind of thing.</p>
<p>If you're planning a conference, and can't squeeze one "practical nuggets" session into the schedule, <em>why not</em>?</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/3742008-06-13T19:06:26Z2008-06-13T19:06:26Z
It's the economy, stupid <p>Hidden in the intro to <a href="http://www.businessweek.com/magazine/content/06_39/b4002001.htm">this BusinessWeek article</a> &mdash; ostensibly about the health-care industry &mdash; is an jaw-dropping nugget of information. See if you find it:</p>
<blockquote><p>If you really want to understand what makes the U.S. economy tick these days, don't go to Silicon Valley, Wall Street, or Washington. Just take a short trip to your local hospital. Park where you don't block the ambulances, and watch the unending flow of doctors, nurses, technicians, and support personnel. You'll have a front-row seat at the health-care economy.</p>
<p>For years, everyone from politicians on both sides of the aisle to corporate execs to your Aunt Tilly have justifiably bemoaned American health care &mdash; the out-of-control costs, the vast inefficiencies, the lack of access, and the often inexplicable blunders.</p>
<p>But the very real problems with the health-care system mask a simple fact: Without it the nation's labor market would be in a deep coma. Since 2001, 1.7 million new jobs have been added in the health-care sector, which includes related industries such as pharmaceuticals and health insurance. Meanwhile, the number of private-sector jobs outside of health care is no higher than it was five years ago.</p>
</blockquote>
<p>Did you catch it? Here, let me highlight it for you:</p>
<blockquote>the number of private-sector jobs outside of health care is <strong>no higher than it was five years ago</strong></blockquote>
<p>Or, phrase it the other way around:</p>
<blockquote>the <strong>only sector</strong> that produced <strong>any</strong> net new jobs in the U.S. economy between 2001 and 2006 was health care</blockquote>
<p>For even more mind-boggling details, <a href="http://www.cjr.org/the_audit/turning_point_middle_class_und.php?page=all">read the latest installment</a> in CJR's series on the looming general election, which links a number of reports on the state of the US economy.</p>
<p>Shorter version: it's much, much worse than I thought.</p>Joshua Wehnertag:blogs.thewehners.net,2005:Post/3732008-06-11T16:59:50Z2008-06-11T16:59:50Z
RubyEnRails Tidbits <p style="float:right;"><a href="http://www.flickr.com/photos/97414294@N00/2568021529/"><img src="http://farm4.static.flickr.com/3125/2568021529_99705b1ca7_m.jpg" alt="" /></a></p>
<p>I'm <em>way</em> too attention-deprived to "live blog" at a conference, so here's some of my notes transcribed from paper to the interwebs&#8230;</p>
<h5>Zed Shaw's opener</h5>
<ul>
<li>Stop doing math demos as benchmarks &ndash; math's not the problem, IO <strong>is</strong> (talk to the database, write to a file, respond to client)</li>
<li><a href="http://en.wikipedia.org/wiki/Amdahl%27s_law">Amdahl's Law</a>: throwing more hardware at bad code doesn't really help &ndash; better code trumps faster hardware</li>
</ul>
<h5>Obie Fernandez' "Worst Rails Code"</h5>
<ul>
<li>There's a Ruby anti-patterns book in the works. If it includes "how to do it better", this could be cool.</li>
<li>Suggested: There should be more "how to re-factor this" blog posts, take up the <a href="http://www.therailsway.com/">Rails Way</a> slack.</li>
</ul>
<p>I didn't particularly enjoy Obie's talk. It seems like an easy "win" to look at someone else's code, say "<span class="caps">FAIL</span>", and laugh; it's harder to point to a better way.</p>
<p>The new and inexperienced write bad code, because they don't know better. But the way they learn is by writing; does publicly shaming the bad code make them learn faster? I don't think so.</p>
<p style="float:right;"><a href="http://www.flickr.com/photos/97414294@N00/2568023495/"><img src="http://farm4.static.flickr.com/3155/2568023495_decc9ff2b2_m.jpg" alt="" /></a></p>
<h5>Sam Aaron "Code Aesthetics"</h5>
<p>Sam's talk was very conversational, I didn't take very interesting notes. <a href="http://ruby.sadi.st/Flog.html">Flog</a> looks interesting.</p>
<h5>Ninh Bui &amp; Hongli Lai "Phusion Passenger (mod_rails)"</h5>
<p>This was probably my favorite talk of the day; a good blend of practical information (including how-to videos) and high-level theory. Passenger 2.0 looks really cool.</p>
<p style="float:right;"><a href="http://www.flickr.com/photos/97414294@N00/2568952838/"><img src="http://farm4.static.flickr.com/3157/2568952838_d81c64a6a9_m.jpg" alt="" /></a></p>
<h5>Charles Nutter "JRuby"</h5>
<p>I don't have a need of JRuby just now, but I was nonetheless impressed. I expected setup and deployment to be much more complicated than it looked like here. I noticed that Charles frequently used the expression "package it up &amp; ship it out", whereas the mainstream Ruby community may be more accustomed to "clone the latest from git and check it out" &mdash; it's a different metaphor for software delivery.</p>
<p style="float:right;"><a href="http://www.flickr.com/photos/97414294@N00/2568970242/"><img src="http://farm4.static.flickr.com/3161/2568970242_c0bdb62600_m.jpg" alt="" /></a></p>
<h5>Miscellaneous</h5>
<ul>
<li>There seems to be a rift growing between the "write what you know / optimize programmer happiness / programmer time is expensive" camp and the "performance is an issue / 'worst rails code ever' / optimize now" camp. The last group seems to spend more time in <a href="http://en.wikipedia.org/wiki/The_Black_Swan_%28book%29#Part_1_Umberto_Eco.27s_antilibrary.2C_or_how_we_seek_validation">extremistan</a> than the former, for better or worse.</li>
<li>A lot of time yesterday was spent talking about performance. Maybe this was an accident, but I think it's reflected in the larger community (there are <em>how many</em> projects working on newer/better/faster Ruby VMs?) Is this really a good use of our time?</li>
<li>Here's my short list of "what we aren't talking about, because 'performance' has taken all the air out of the room" &mdash; testing, globalization, contributing to Rails, <a href="http://datamapper.org/">alternatives to ActiveRecord</a>.</li>
<li>Both Obie and David are bothered by re-inventing wheels. Haven't we <a href="http://c2.com/cgi/wiki?ReinventingTheWheel">been through this before</a>? If joining a programming cult doesn't save me from inane dogma, what will?</li>
</ul>
<h5>Community</h5>
<p>If you're a local and haven't yet, you really ought to check out the monthly ".rb" pub meetings (<a href="http://groups.google.com/group/amsterdam-rb">Amsterdam</a> or <a href="http://groups.google.com/group/utrecht-rb">Utrecht</a>, so far), or the sporadic <a href="http://www.fngtps.com/sections/Meetings">coffee meetings</a>.</p>
<p><cite>Photos from <a href="http://www.flickr.com/photos/dannynet/">danny_l</a></cite></p>Joshua Wehner