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

<channel>
	<title>mattt*</title>
	<atom:link href="http://mattt.me/feed/" rel="self" type="application/rss+xml" />
	<link>http://mattt.me</link>
	<description></description>
	<pubDate>Wed, 26 May 2010 18:30:29 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Lost Recordings of _why&#8217;s Last Lecture</title>
		<link>http://mattt.me/2010/05/lost-recordings-of-_whys-last-lecture/</link>
		<comments>http://mattt.me/2010/05/lost-recordings-of-_whys-last-lecture/#comments</comments>
		<pubDate>Wed, 26 May 2010 18:30:29 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://mattt.me/?p=464</guid>
		<description><![CDATA[<br/><p>Of <a href="http://artandcode.ning.com/page/presenters-march-2009">all of the presenters at art&#038;&code</a>, there was one who perfectly captured the spirit of it all. His name was _why. He wore a blue flower on his lapel, and carried an autoharp around with him. He was and remains a hero and source of inspiration for me, and I was lucky enough to be his student (at least for a few hours).</p>]]></description>
			<content:encoded><![CDATA[<br/><p><img src="http://mattt.me/wp-content/uploads/2010/05/art-and-code-lady.jpg" alt="art-and-code-lady" title="art-and-code-lady" width="548" height="616" class="aligncenter size-full wp-image-476" /></p>
<p>On a rainy, blustery weekend in March of 2009, the <a href="http://www.art.cfa.cmu.edu/">Carnegie Mellon School of Art</a> hosted the<br />
<a href="http://artandcode.ning.com/page/motivation-march-2009">art&amp;&amp;code symposium</a>. It was a low-key event, with maybe one or two hundred in attendance. It gathered together artists, coders, hackers, students and teachers alike. We came to talk about programming environments like <a href="http://processing.org/">Processing</a>, <a href="http://scratch.mit.edu/">Scratch</a>, <a href="http://www.openframeworks.cc/">openFrameworks</a>, and <a href="http://vvvv.org/">vvvv</a>, and how they can be used to make art, and more importantly, how these tools can educate and inspire an interest in programming for young people.</p>
<p>Of <a href="http://artandcode.ning.com/page/presenters-march-2009">all of the presenters</a>, there was one who perfectly captured the spirit of it all. His name was _why. He wore a blue flower on his lapel, and carried an autoharp around with him. He was and remains a hero and source of inspiration for me, and I was lucky enough to be his student (at least for a few hours).</p>
<p><img src="http://mattt.me/wp-content/uploads/2010/05/_why-autoharp.jpg" alt="_why-autoharp" title="_why-autoharp" width="590" height="266" class="aligncenter size-full wp-image-472" /></p>
<p>&#8220;<em>Drawing Cats with Hackety Hack</em>&#8221; was the name of his session. As soon as everyone took their seats, _why started in with a dramatic chord on his autoharp. On instinct, I opened up <a href="http://tapedeckapp.com/">TapeDeck</a> and pressed record.</p>
<p>It was a few months later, in August, that <a href="http://whymirror.github.com/">_why made his sudden disappearance from the Internet</a>. _why existed mostly as an online persona, and made very few personal appearances. This was one of his last. I had completely forgotten that I recorded the lecture, until I stumbled across the files a few weeks back. </p>
<p>The audio quality isn&#8217;t great—it&#8217;s my computer&#8217;s internal mic, facing the wrong way, no less. There&#8217;s a good half hour I missed because my laptop ran out of battery. You can hear the strained whirring of my computer fans, along with other strange computer noises.</p>
<p>Yet, these recordings are very special to me, and I thought I might share them with everyone else. Here are the interesting bits with _why talking and singing that I could salvage from my footage.</p>
<ol>
<li>
    <span><a href='http://mattt.me/wp-content/uploads/2010/05/01-introduction-and-the-jennings-kids-are-here.mp3'>Introduction and The Jennings Kids Are Here</a></span></p>
<p><em>&#8220;Drawing Cats with Hackety Hack&#8221; is exactly what this class is about. _why introduces the kinds of cats we&#8217;re about to draw together (recording starts at number 3, though). Special guest appearance by <a href="http://flong.com/">Golan Levin</a>, who organized the conference.</em></p>
</li>
<li>
    <span><a href='http://mattt.me/wp-content/uploads/2010/05/02-hopes-of-hackety-hack-and-the-ridiculousness-of-web-programming.mp3'>Hopes of Hackety Hack and the Ridiculousness of Web Programming</a></span></p>
<p><em>On HTML, CSS, &#038; Javascript: &#8220;You&#8217;re a smart kid, but three langauges? Are you kidding me? Are you seriously kidding me? That&#8217;s ridiculous, I can&#8217;t accept that&#8230; I mean, three languages that are inexplicably combined. Where does HTML begin and Javascript end?&#8221;</em></p>
</li>
<li>
    <span><a href='http://mattt.me/wp-content/uploads/2010/05/03-the-keybohohohoard-should-not-be-ignohohohored.mp3'>The Keybohohohoard Should Not Be Ignohohohored</a></span></p>
<p><em>_why breaks out into song as he reminds us of the utility of the keyboard in programming interfaces for teaching kids.</em></p>
</li>
<li>
    <span><a href='http://mattt.me/wp-content/uploads/2010/05/04-fake-viruses.mp3'>Fake Viruses</a></span></p>
<p><em>Everybody&#8217;s made a fake virus program—even _why! Perhaps this should be part of a young programmer&#8217;s rites of passage.</em></p>
</li>
<li>
    <span><a href='http://mattt.me/wp-content/uploads/2010/05/05-i-dont-really-care-if-it-crashed-i-just-want-you-to-feel-smart.mp3'>I Don&#8217;t Really Care if it Crashed, I Just Want You to Feel Smart</a></span></p>
<p><em>A musical conclusion to the class. No matter what happened with programming, it was alright because we were having fun and able to laugh about it.</em></p>
</li>
</ol>
<p>_why&#8217;s mission with <a href="http://hacketyhack.heroku.com/">Hackety Hack</a>, and indeed in much of his work, was to make programming more about whimsey than frustration, more about feeling smart than feeling dumb. That day remains one of my most cherished memories, and I submit these with the utmost respect and gratitude to _why. Wherever you are, I wish you all the best. We all still have a lot to learn from you.</p>
<hr/>
<p>If you haven&#8217;t already, you should read his 2003 essay <a href="http://viewsourcecode.org/why/hacking/theLittleCodersPredicament.html">&#8220;The Little Coder&#8217;s Predicament&#8221;</a>. His lecture from art&amp;&amp;code is also worth a watch.</p>
<p><object width="590" height="325"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5047563&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=534731&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=5047563&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=534731&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="590" height="325"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2010/05/lost-recordings-of-_whys-last-lecture/feed/</wfw:commentRss>
<enclosure url="http://mattt.me/wp-content/uploads/2010/05/01-introduction-and-the-jennings-kids-are-here.mp3" length="3966002" type="audio/mpeg" />
<enclosure url="http://mattt.me/wp-content/uploads/2010/05/02-hopes-of-hackety-hack-and-the-ridiculousness-of-web-programming.mp3" length="2258658" type="audio/mpeg" />
<enclosure url="http://mattt.me/wp-content/uploads/2010/05/03-the-keybohohohoard-should-not-be-ignohohohored.mp3" length="2621012" type="audio/mpeg" />
<enclosure url="http://mattt.me/wp-content/uploads/2010/05/04-fake-viruses.mp3" length="1108802" type="audio/mpeg" />
<enclosure url="http://mattt.me/wp-content/uploads/2010/05/05-i-dont-really-care-if-it-crashed-i-just-want-you-to-feel-smart.mp3" length="1837774" type="audio/mpeg" />
		</item>
		<item>
		<title>Achievement Unlocked! Human Morality When Life Becomes A Videogame</title>
		<link>http://mattt.me/2010/05/achievement-unlocked/</link>
		<comments>http://mattt.me/2010/05/achievement-unlocked/#comments</comments>
		<pubDate>Mon, 17 May 2010 15:00:24 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Philosophy]]></category>

		<guid isPermaLink="false">http://mattt.me/?p=454</guid>
		<description><![CDATA[<br/>Loved by some and derided by others, achievement systems are nonetheless as essential to the fabric of videogaming today as power-ups were from the days of Contra, Super Mario Bros., and MegaMan. It is a trend unlikely to go away anytime soon, given not only its commercial viability, but—perhaps more importantly—its grounding in human nature.

It's not just fun and games, though. I believe that this is a matter of immense significance to the role of technology in our daily lives, with far-reaching implications into human morality in this brave new century.]]></description>
			<content:encoded><![CDATA[<br/><p>Both commercially and critically, videogames command respect as a part of mainstream culture. This activity once relegated to dank and secluded arcades is a now a past-time to be enjoyed by everyone. Mom does yoga with Wii Fit and tends to her virtual crops on Farmville. Dad gets his adrenaline pumping on Modern Warfare or relaxes to a round of Civilization IV. Even jocks—the natural enemy of nerds, the old guard of videogaming—will spend untold hours in front of their latest copy of Madden. And who doesn&#8217;t have a pair of plastic guitars tucked away by the TV?</p>
<p>Even with videogames being more diverse in scope and audience than ever before, there is a common thread throughout: achievement systems.</p>
<p>Regardless of age, sex, or religious allegiance to console makers, we are all equally susceptible to the insatiable drive of collectable badges, leader boards, and point systems. We are all human, and thus become slaves to the steady drip of dopamine these systems deliver to the pleasure centers of our brain. It&#8217;s an addiction, albeit a virtual one.</p>
<p>With such incredible influence over players, it&#8217;s no surprise that this trend is catching on. Xbox LIVE awards Gamerscore points for completing achievements in hundreds of games. Valve builds achievements into games like Team Fortress 2 and Left 4 Dead to create a compelling meta-gaming experience. And lest we forget casual gaming, Zynga was recently given a $5 billion valuation (take that for what you will), following the success of games like FarmVille and Mafia Wars, which are <em>little else other than achievement systems</em>.</p>
<p>Loved by some and derided by others, achievement systems are nonetheless as essential to the fabric of videogaming today as power-ups were from the days of Contra, Super Mario Bros., and MegaMan. It is a trend unlikely to go away anytime soon, given not only its commercial viability, but—perhaps more importantly—its grounding in human nature.</p>
<p>It&#8217;s not just fun and games, though. I believe that this is a matter of immense significance to the role of technology in our daily lives, with far-reaching implications into human morality in this brave new century.</p>
<h2 id="ubiquitous_disposable_technology">Ubiquitous, Disposable Technology</h2>
<p>In his 2010 D.I.C.E. presentation, Jesse Schell asks us to consider the future of achievement systems in conjunction with another trend: disposable technology. As a consequence of Moore&#8217;s Law, Schell explains, it becomes less expensive to produce more powerful computers with each passing year. &#8220;If anyone here ever bought a Furby, the Furby costs $20, $30. It has more technology in it than they used to put a man on the moon. People have now thrown out their Furbies because it&#8217;s kind of dumb. It&#8217;s disposable technology.&#8221;</p>
<p>If this rate keeps up, we can expect everyday objects to become increasingly self-aware. Sensors, tiny embedded computers, video displays, and touch interfaces; they all exist today, and will be orders of magnitude cheaper in just a decade—cheap enough to put in anything and everything.</p>
<p>For instance, it&#8217;s not far-fetched to imagine an internet-enabled toothbrush (an example Schell uses in his talk). Oral hygiene is just one of those things that people don&#8217;t think about too often. Even if you brush twice a day, chances are you brush for under a minute, less than the recommended two or three. </p>
<p>However, if your toothbrush was more self aware&#8230;<br />
<em>Brush your teeth for 3 minutes? <strong>+10 points!</em></strong><br />
<em>Oh, you brushed and flossed every day that week? <strong>+100 points!!</em></strong><br />
<em>Want to share this on Facebook? <strong>Hells yeah!</em></strong></p>
<p>Before you discredit the possibility of imaginary points impacting your brushing habits, consider that <em>virtual crops</em> have <a href="http://www.newser.com/story/85513/12-year-old-blows-1400-on-farmville.html">caused kids incur massive debt</a>, <a href="http://www.huffingtonpost.com/2010/03/30/dimitar-kerin-fired-over-_n_518635.html">ruined careers</a>, and <a href="http://www.chinasmack.com/2009/stories/happy-farms-popular-online-game.html">ended relationships</a>. All because of <em>virtual</em> crops on <em>virtual</em> farms.</p>
<p>Shoes will award points for regular exercise, pillows for getting a healthy amount of sleep, and reading lights for getting through those books you&#8217;d been putting off. Badges will be issued for biking rather than driving to work all week, or eating healthy home-cooked meals instead of fast-food. Toilets will give you a virtual thumbs up for each time you remember to put the seat back down.</p>
<p>Yet the implications are far greater than encouraging better habits. Those same ubiquitous sensors afforded by disposable technology and necessitated to keep track of your progress in achievement systems will end up recording your every action. This is Schell&#8217;s concluding point in his talk:</p>
<blockquote><p>&#8220;These sensors that we&#8217;re going to have on us and all around us and everywhere are going to be tracking, watching what we&#8217;re doing forever. Our grandchildren will know every book that we read. That legacy will be there, will be remembered. And you get to thinking about how, wow, is it possible maybe that &#8212; since all this stuff is being watched and measured and judged, that maybe I should change my behavior a little bit and be a little better than I would have been? So it could be that these systems are all crass commercialization and it&#8217;s terrible. But it&#8217;s possible that they will inspire us to be better people, if the game systems are designed right.&#8221;</p></blockquote>
<p>In our post-religious society, achievement systems stand to become a prescriptive moral entity comparable to God. Instead of promises of heaven in exchange for doing good deeds (+10 points!), going to church (+50 points!), or partaking in the sacraments (+1000 points each!)<sup><a href="#footnote-1">1</a></sup>, we are watched, judged, and awarded points by a technological deity.<sup><a href="#footnote-2">2</a></sup></p>
<p><sup id="footnote-1">1</sup> Depending on your particular interpretation of salvation<br/><br />
<sup id="footnote-2">2</sup> Sacrilege: -100 points!</p>
<p>The comparison to religion is apt, I think. When computers gain a certain level of omniscience, people will change the way they behave. It is karma, only undoubtedly real.</p>
<p>Slowly, the line between videogames and life will blur, and then vanish. In a postmodern world, achievement systems will provide the meta-narrative absent in our everyday existence. When life is the ultimate sandbox game, those collectable achievements are what keep you playing. This is all to say, when life becomes a videogame, achievement systems may not seem so gimmicky after all.</p>
<p><object classId="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="480" height="418" id="VideoPlayerLg44277" style="margin-top:2em;"><param name="movie" value="http://g4tv.com/lv3/44277" /><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="true" /><embed src="http://g4tv.com/lv3/44277" type="application/x-shockwave-flash" name="VideoPlayer" width="590" height="400" allowScriptAccess="always" allowFullScreen="true" /><br />
</object></p>
<p>Photo Credit: <a href="http://www.flickr.com/photos/kimonomania/2946030842/">Kimonomania</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2010/05/achievement-unlocked/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Designing an IPA keyboard for the iPad</title>
		<link>http://mattt.me/2010/04/designing-an-ipa-keyboard-for-the-ipad/</link>
		<comments>http://mattt.me/2010/04/designing-an-ipa-keyboard-for-the-ipad/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 11:56:00 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Linguistics]]></category>

		<guid isPermaLink="false">http://mattt.me/?p=435</guid>
		<description><![CDATA[<br/><p>With the iPhone, iPad, and similar devices, we are seeing a transition into a new paradigm of touch screen interfaces, wherein the physical interface becomes virtual, able to dynamically adapt as needed to fit any context. Imagine what that could do for a classically difficult problem of Linguistics: typing IPA</p>]]></description>
			<content:encoded><![CDATA[<br/><p>Phonetics will always hold a special place in my heart. It&#8217;s what first got me interested in Linguistics. Making exotic sounds and representing them with even more exotic characters&#8212;it was love at first <a href="http://en.wikipedia.org/wiki/Phoneme">phoneme</a>.</p>
<p>Anyway, those exotic characters I fell in love with of course make up the <a href="http://en.wikipedia.org/wiki/International_Phonetic_Alphabet">International Phonetic Alphabet</a>, or IPA. IPA is a standard way to represent the spectrum of human speech across virtually every language with a sophisticated level of nuance. It&#8217;s as essential to Linguistics, both academically and culturally, as the periodic table is to Chemistry.</p>
<p>Yet despite its immense significance, there is an utter lack of hardware or software to support its transcription onto computers. For anyone not lucky enough to be fluent in <a href="http://en.wikipedia.org/wiki/TIPA">LaTeX</a>, it&#8217;s an arduous process of <a href="http://en.wikipedia.org/wiki/Alt_codes">ALT- codes</a> and copy-pasta. This is not just a problem for phonologists. I believe that this technological disconnect is the single greatest barrier to the growth of Linguistics as a field. </p>
<p>At the very least, this is an interesting problem for someone interested in technology, design, and linguistics. As luck would have it, the problem just got a whole lot easier with the release of the iPad.</p>
<h2 id="you_cant_spell_ipad">You Can&#8217;t Spell iPad Without IPA</h2>
<p>For the better part of the last century, our lives have been controlled by the push of a button&#8212;physical interfaces resulting in electromechanical output. With the iPhone, iPad, and similar devices, we are seeing a transition into a new paradigm of touch screen interfaces, wherein the physical interface becomes virtual, able to dynamically adapt as needed to fit any context.</p>
<p>In these heady times, I though it&#8217;d be cool to employ some Blue Sky Solutioneering™, and see what&#8217;s possible. But first, let&#8217;s set some design goals to make sure we&#8217;re heading in the right direction:</p>
<ul>
<li>
<p><strong>Efficient</strong>: An input method&#8217;s sole function is to be an optimal method of transcribing thought into representation. A new IPA interface would be successful if and only if it is able to offer an improvement over competing alternatives. Though the bar is set pretty low in this respect, it should be at least comparable to the speed one could achieve writing in, say, <a href="http://en.wikipedia.org/wiki/Kirshenbaum">Kirshenbaum, or ASCII-IPA</a>.</p>
</li>
<li>
<p><strong>Intuitive / Familiar</strong>: When one refers to something as being &#8220;intuitive&#8221;, they usually mean &#8220;familiar&#8221;. Thus, an ideal interface should capture the best organizing principles for IPA and translate them into an interface with ideas borrowed from various input methods for other orthographies. As ubiquitous as <a href="http://en.wikipedia.org/wiki/File:IPA_chart_2005_png.svg">IPA charts</a> are in understanding phonology, there is much to be glanced from earlier traditions, such as the foundational work done by <a href="http://en.wikipedia.org/wiki/Jakobson">Jakobson</a>, <a href="http://en.wikipedia.org/wiki/Nikolai_Trubetzkoy">Trubetzkoy</a>, and others from the <a href="http://en.wikipedia.org/wiki/Prague_circle">Prague Circle</a>, or Chomsky and Halle&#8217;s seminal <a href="http://en.wikipedia.org/wiki/The_Sound_Pattern_of_English">&#8220;The Sound Pattern of English&#8221;</a>.</p>
</li>
<li>
<p><strong>Completeness</strong>: Given the dozens of symbols and diacritics in its repertoire, representing IPA in its entirety becomes quite a daunting goal. In an ideal interface, one would have access to the full range of the alphabet. However, since usability is the main priority, certain pragmatic affordances might have to be made.</p>
</li>
</ul>
<h2 id="inspiration">Inspiration</h2>
<p>Keeping these goals in mind, I set out to create some initial designs to iterate upon. I drew heavily on the international keyboards available on the iPad. Here are some concepts I found to be informative, and how I translated them into an interface for IPA.</p>
<h3 id="romanized_japanese_input">Romanized Japanese Input</h3>
<p><img src="http://mattt.me/wp-content/uploads/2010/04/japanese-keyboard-input.jpg" alt="Romanized Japanese Keyboard Input" title="Romanized Japanese Keyboard Input" width="590" height="235" class="aligncenter size-full wp-image-440" /></p>
<p>Compared to English, Japanese has a fairly <a href="http://en.wikipedia.org/wiki/Japanese_phonology">constrained phonetic inventory</a>. Using the <a href="http://en.wikipedia.org/wiki/Hepburn_romanization">Hepburn romanization system</a>, one can transcribe Japanese syllables by typing how it would be spelled in English. For instance, <tt>ma</tt> becomes <em>ま</em> <tt>tsu</tt> turns into <em>つ</em>, and <tt>a</tt> is written as <em>あ</em>. Kanji has many homophones, so for example, あお could be written as 青, 碧, 蒼, and 襖. An IME, or <a href="http://en.wikipedia.org/wiki/Input_method_editor">input method editor</a>, suggests characters that correspond to a particular phonetic input, from which a user picks what they meant. In practice, IMEs are orders of magnitude faster than having to write characters by hand. Even in Japan, where keyboards have a direct one-to-one mapping of kana onto the keyboard, most people prefer this romanized method of input.</p>
<p><img src="http://mattt.me/wp-content/uploads/2010/04/ipa-consonant-suggestions.jpg" alt="IPA Consonant Suggestions" title="IPA Consonant Suggestions" width="590" height="55" class="aligncenter size-full wp-image-441" /></p>
<p>One could imagine a similar method of text expansion being used for IPA input. For example, if a user types in <tt>th</tt>, the system could recommend <em>th</em>, <em>θ</em> and <em>tʰ</em>. Taken a step further, suggestions could also include voiced variants (so <em>ð</em> in addition to <em>θ</em>), or in the case of vowels, any related monophthongs or diphthongs. There are several standard ASCII ↔ IPA schemes that could be included as well, such as <a href="http://en.wikipedia.org/wiki/X-SAMPA">X-SAMPA</a>.</p>
<h3 id="chinese_handwriting_input">Chinese Handwriting Input</h3>
<p><img src="http://mattt.me/wp-content/uploads/2010/04/chinese-handwriting-input.jpg" alt="Chinese Handwriting Input" title="Chinese Handwriting Input" width="590" height="199" class="aligncenter size-full wp-image-442" /></p>
<p>While phonetic input using Kana for Japanese or Pinyin for Chinese is an effective means of transcribing text, there are some cases in which handwritten input is desirable (for instance, characters that you don&#8217;t know how to pronounce). Based on the position of your strokes, a handwriting interface like the one shown above can present you with possible matches. Similar to the romanized Japanese interface, a rough input is refined to an exact match using suggestions.</p>
<p><img src="http://mattt.me/wp-content/uploads/2010/04/ipa-vowel-input.jpg" alt="IPA Vowel Input" title="IPA Vowel Input" width="590" height="201" class="aligncenter size-full wp-image-444" /></p>
<p>Borrowing from this concept, I designed a more intuitive system for transcribing vowels. Unlike consonants, which are relatively distinct from one another, vowels are nebulous, flowing one into another. Although the same method of ASCII expansion described above would allow for vowel transcription as well, it&#8217;s often hard enough to figure out which vowel is the best fit (let alone what its ASCII representation is).</p>
<p>As such, I employed that <a href="http://en.wikipedia.org/wiki/Vowel#Articulation">familiar trapezoid structure</a>, which spatially maps vowels to regions of the mouth. Just touch the general region of articulation, and select the desired vowel from the list of nearest neighbors provided on the right. As you drag your finger around, the suggestions would dynamically update accordingly. Not only is this a convenient interface, but it serves as a useful reference to enforce the relationships between the vowels and their place of articulation.</p>
<h3 id="long_touch_gestures">Long Touch Gestures</h3>
<p><img src="http://mattt.me/wp-content/uploads/2010/04/english-keyboard-input-detail.jpg" alt="English Keyboard Input Detail" title="English Keyboard Input Detail" width="590" height="232" class="aligncenter size-full wp-image-445" /></p>
<p>One of the interface idioms used on the iPad is to display a contextual menu when you tap and hold certain objects for a second or two. Pictured above above, I touch and hold down on the <tt>a</tt> key to reveal a collection of related characters and diacritical variants.</p>
<p>With so many ways to ornament characters, this method of hiding complexity is nearly essential to keeping the interface clean and functional. For instance, by tapping and holding <tt>t</tt>, we could expect to see <em>tʰ</em>, <em>tʷ</em>, and <em>tˠ</em>, along with all of its voiced and other coarticulated variants.</p>
<h2 id="scratching_the_surface">Scratching the Surface</h2>
<p>Of course, this is only the beginning in thinking about the potential for touch-screen IPA interfaces. I just wanted to get these ideas out there, so I could get some initial feedback.</p>
<p>If you have any ideas for how to organize or present the alphabet, or how to improve the UI, please put them in the comments! I&#8217;ll continue to keep iterating on these ideas, and hopefully get a working prototype out soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2010/04/designing-an-ipa-keyboard-for-the-ipad/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Tell Me a Story</title>
		<link>http://mattt.me/2010/02/tell-me-a-story/</link>
		<comments>http://mattt.me/2010/02/tell-me-a-story/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 18:12:52 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Philosophy]]></category>

		<guid isPermaLink="false">http://mattt.me/?p=427</guid>
		<description><![CDATA[<br/>As a product of evolution, we humans are cognitively endowed with the ability to make sense of nature. Yet, we are a pre-historic being in a post-modern world. So how do we make sense of everything? Well, among other things, we tell stories.]]></description>
			<content:encoded><![CDATA[<br/><blockquote><p>Modern physics teaches us that there is more to truth than meets the eye; or than meets the all too limited human mind, evolved as it was to cope with medium-sized objects moving at medium speeds through medium distances in Africa.<cite>Richard Dawkins, &#8220;What is True?&#8221;</cite></p></blockquote>
<p><br/></p>
<p>As a product of evolution, we humans are cognitively endowed with the ability to make sense of nature. We have an intuitive grasp on shapes and how objects can be manipulated in space. We can track animals and determine patterns in the weather and the seasons. We possess an innate notion of fairness and how to mitigate social interactions. </p>
<p>While these kinds of skills were useful for our ancestors in navigating the world for the last million generations, a lot has changed in the last 10,000 years, and almost as much has changed in the last century alone. We&#8217;ve gone from the savanna to the concrete jungle. From loin cloths and wooden clubs to business suits and ballpoint pen. From hunting to channel surfing. (You get the idea)</p>
<p>We are a pre-historic being in a post-modern world. So how do we make sense of everything? Well, among other things, we tell stories.</p>
<p>An atom <em>wants</em> to be at its lowest energy level, and does so by filling its electron shells in a particular order. Autophagy is a process by which cells <em>eating</em> their own internal components and invading microbial invaders. Genes are <em>selfish</em>, and do everything in their interest of self-replication, even at the expense of their organism. </p>
<p>Or, to illustrate the point even further:</p>
<p><object width="590" height="332"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=1041071&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=02867b&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=1041071&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=02867b&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="590" height="332"></embed></object></p>
<p>Translating the complexities of chemical or biological systems into a story about actors playing different roles is a tradition as old as civilization itself. Going back to the earliest creation myths across all cultures, humans have told stories of trickster gods stealing the sun, or the sparks that created the planets and the stars to make sense of the universe. </p>
<p>Science, like mythology, creates an abstraction from the mechanistic underpinnings of the reality it describes.　This tradition extends to computer science as well, in how we understand computational systems.</p>
<blockquote><p>Let us change our traditional attitude to the construction of programs: Instead of imagining that our main task is to instruct a computer what to do, let us concentrate rather on explaining to human beings what we want a computer to do.<cite>Donald Knuth, <em>Literate Programming</em></cite></p></blockquote>
<p><br/></p>
<h3>So, with apologies to <a href="" title="http://en.wikipedia.org/wiki/Alan_Kay">Alan Kay</a>, Object-Oriented Programming wasn&#8217;t so much invented as <em>discovered</em>.</h3>
<p>Why does <acronym title="Object-Oriented Programming">OOP</acronym> work so well as a paradigm? How can programmers identify and debug problems without thinking about the underlying <tt>1</tt>&#8217;s and <tt>0</tt>&#8217;s? It&#8217;s no coincidence—in fact, it all goes back to our evolutionary heritage. </p>
<p>Seeing as how our ancestors had a lot of practice thinking in terms of people with intentions who act on the world using tools, it comes as no surprised that we have become quite adapt at thinking about other things in that way, too. By contrast, our ancestors never had to deal with transistors, logic gates, bits, or bytes, so it takes some mental acrobatics for us to understand that even on its most basic level.</p>
<p>What I&#8217;m trying to get at is that, although we often fancy ourselves scientists, mathematicians, or architects, we should be reminded that at the end of the day, <em>programming is about telling stories</em>. Why? Because that&#8217;s the only chance we have at understanding computers.</p>
<p>As storytellers, programmers are tasked with constructing a comprehensive narrative about the way a system works. Using a <a href="" title="http://www.ruby-lang.org/en/">language elegant enough</a>, we can succeed in telling our story without &#8220;breaking the spell&#8221;. We can refer to libraries to incorporate common functionality in the same way a writer might summon devices from the greek tragedies. A penchant for pedantic linguistic frivolity can be just as annoying as overly-clever meta-programming hacks.</p>
<p>If we are to become better story tellers, perhaps we should head to the fiction section to find our next programming book.</p>
<p><em>Photo Credit: <a href="http://www.flickr.com/photos/verbola/4193543895/in/set-72157603938293517/">Francesc Gelonch</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2010/02/tell-me-a-story/feed/</wfw:commentRss>
		</item>
		<item>
		<title>さようなら 日本、G&#8217;Day Austin</title>
		<link>http://mattt.me/2010/01/sayonara-japan-gday-austin/</link>
		<comments>http://mattt.me/2010/01/sayonara-japan-gday-austin/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 00:16:05 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://mattt.me/?p=423</guid>
		<description><![CDATA[<br/><p>Today, I officially joined the <a href="http://gowalla.com/">Gowalla</a> team. I&#8217;ll be leaving the Land of the Rising Sun for the Lone Star State; trading ramen for ribs, karaoke for concerts, and utter linguistic befuddlement for&#8230;well, maybe I&#8217;ll hold onto that one.</p>]]></description>
			<content:encoded><![CDATA[<br/><p>And all at once, my adventure in Tokyo is coming to an end.</p>
<p>Today, I officially joined the <a href="http://gowalla.com/">Gowalla</a> team. I&#8217;ll be leaving the Land of the Rising Sun for the Lone Star State; trading ramen for ribs, karaoke for concerts, and utter linguistic befuddlement for&#8230;well, maybe I&#8217;ll hold onto that one. The big move happens after I wrap up a few things in Tokyo in the next couple weeks.</p>
<h2 id="cerego">さよなら, Cerego</h2>
<p>My time at Cerego working on <a href="http://smart.fm/">Smart.fm</a>, although brief, was an amazing experience that I will not soon forget. From the long hours we pulled <a href="http://gowal.la/s/27hK">in the office</a> to the late nights <a href="http://gowal.la/s/qgX">out in Shin-Ōkubo</a>, these were some of the best times I&#8217;ve had. Though Cerego is in a state of flux at the moment, there are a lot of smart, passionate people who are poised to really change the world, and I&#8217;m confident that they will do just that.</p>
<h2 id="gowalla">G&#8217;Day, Gowalla</h2>
<p>It feels absolutely surreal to join the ranks of Gowalla. For years, I&#8217;d been an avid <a href="http://alamofire.com/">Alamofire</a> fanboy, devouring <a href="http://www.iconbuffet.com/">IconBuffet</a>, losing sleep over <a href="http://apps.facebook.com/packrat/">PackRat</a>, and most recently, flouting acceptable social cues by obsessively checking in with <a href="http://gowalla.com/">Gowalla</a> when going out with friends.</p>
<p>As fate would have it, I have the fortune to join at a pivotal moment for Gowalla. 2010 will be <em>the</em> year for geo and the social web. These are the days of Blue Sky Solutioneering™, a time of endless possibilities. All bets are off, and all eyes are on us.</p>
<p>That said, I am sure of one thing—<br />
<a href="http://foursquare.com/">foursquare</a>: With all due respect, you guys are toast.</p>
<p>Peace &amp; Love,<br/><br />
Mattt</p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2010/01/sayonara-japan-gday-austin/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Forgetting to Remember</title>
		<link>http://mattt.me/2009/11/forgetting-to-remember/</link>
		<comments>http://mattt.me/2009/11/forgetting-to-remember/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 12:17:58 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Philosophy]]></category>

		<guid isPermaLink="false">http://mattt.me/?p=412</guid>
		<description><![CDATA[<br/>The Ebbinghaus Forgetting Curve describes the way humans retain knowledge. Learning is, in a way, just a process of continually <em>not</em> forgetting things.]]></description>
			<content:encoded><![CDATA[<br/><p>The <a href="http://en.wikipedia.org/wiki/Forgetting_curve">Ebbinghaus Forgetting Curve</a> describes the way humans retain knowledge.</p>
<p>When we learn something for the first time, it stays fresh in our minds for a little while. For instance, if I tell you “the Japanese word for Dog is <em>‘Inu’</em> (犬)”, you should have no problem answering when I ask you about it in the next paragraph. Ready?</p>
<p>What’s the Japanese word for Dog?</p>
<p><em>“Inu”</em>. Right. Easy.</p>
<p>Well, if I ask you again in a few paragraphs, you may well have forgotten it. This is what the Forgetting Curve describes: As time passes, your ability to recall a particular fact diminishes until, after a while, it’s forgotten.</p>
<p><img src="http://mattt.me/wp-content/uploads/2009/11/forgetting-curve.jpg" alt="Image Credit: AI Vault (http://www.ellaz.com/AIV/Memo%20Images/Forgetting%20Curve.jpg)" title="Forgetting Curve" width="520" height="366" class="size-full wp-image-413" /></p>
<p>This inescapable decline seems pretty dismal. Don’t worry, though! The fact that you’re able to read and understand this very sentence proves that learning is, in fact, possible. (In case you forgot)</p>
<p>Learning is, in a way, just a process of continually <em>not</em> forgetting things.</p>
<p>We learn and remember facts by refreshing our memory from time to time, before it completely fades away. Doing this enough times makes it stick in our minds, for good.</p>
<p>Dog? <em>“Inu”</em>. Great.</p>
<p>There’s an art to figuring out when to review something&#8212;when to “reset” the forgetting curve. Turns out, the optimal time to do this is <em>just as you&#8217;re about to forget it</em>. This is the premise of a technique called spaced rehearsal.</p>
<p>For nearly a century, psychologists and teachers alike have demonstrated the efficacy of spaced rehearsal in the lab and in the classroom. It’s the invisible thread that connects so much of how we learn today, from flash cards to <a href="http://en.wikipedia.org/wiki/Pimsleur_language_learning_system">Pimsleur</a>.</p>
<p>But for all of its advantages, spaced rehearsal is difficult to do by yourself. Keeping track of what you need to learn next carries a cognitive load, which only increases as the number of things you are studying grows.</p>
<p>Luckily, this is a problem that can be solved by software. Let computers figure out what you need to study instead! That way, you can focus on actually learning.</p>
<p>That’s the foundation of <a href="http://smart.fm">Smart.fm</a>: a tool to manage your “brain bank”, allowing you to learn faster and retain knowledge longer. We all want to be more intelligent, more sophisticated, more articulate. With Smart.fm, you can get there by studying less, and have fun while you’re at it.</p>
<p>Over the last 6 months of working at Smart.fm, I’ve become fascinated in the way technology can hack our brains, and how it has the potential to completely transform and democratize education. A cognitive revolution is underway, and being on the front lines has been an unbelievable experience.</p>
<p>Some really amazing things are on the way.</p>
<p>Out of curiosity, do you remember <a href="http://smart.fm/items/247851">how to say “dog” in Japanese</a>?</p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2009/11/forgetting-to-remember/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Chroma-Hash, Revisited</title>
		<link>http://mattt.me/2009/11/chroma-hash-revisited/</link>
		<comments>http://mattt.me/2009/11/chroma-hash-revisited/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 16:45:12 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://mattt.me/?p=401</guid>
		<description><![CDATA[<br/><p>Based on a resurgence of interest in Chroma-Hash (hi <a href="http://www.reddit.com/r/programming/comments/a150t/a_regular_confirm_password_field_but_100x_cooler/">reddit</a>!), I thought it&#8217;d be useful to revisit this oft-misunderstood project. </p>]]></description>
			<content:encoded><![CDATA[<br/><p>Based on a resurgence of interest in Chroma-Hash (hi <a href="http://www.reddit.com/r/programming/comments/a150t/a_regular_confirm_password_field_but_100x_cooler/">reddit</a>!), I thought it&#8217;d be useful to revisit this <a href="http://mattt.me/2009/07/chroma-hash-a-belated-introduction/">oft-misunderstood project</a>. </p>
<p>If you haven&#8217;t already seen it already, <a href="http://mattt.github.com/Chroma-Hash/">you should check it out</a>. Even if you have, you might want to <a href="http://mattt.github.com/Chroma-Hash/?again">play around with it again</a> to see if any new insights come to mind (<em>go ahead, it&#8217;ll only take a minute</em>). </p>
<p><a href="http://github.com/mattt/Chroma-Hash/">Chroma-Hash</a> has been a particularly interesting project because of the controversy it creates in discussions. Some people won&#8217;t understand how it could ever be useful, while it couldn&#8217;t be any clearer to others. There&#8217;s often a back-and-forth about the potential security risks of the system and the pragmatics of how those risks are insignificant.</p>
<p>I&#8217;ve learned a lot from reading through these various threads, and I wanted to share some of my thoughts to help bring light to the discussion. Or maybe just fuel the fire, perhaps.</p>
<p>Alright, let&#8217;s get right to it then:</p>
<h2 id="so_what8217s_the_point">So what&#8217;s The Point?</h2>
<p>Good question! It started out as a simple UI experiment, but it soon developed into something that I think could be really useful. Here are some of the use cases that emerged from various feedback and iterations:</p>
<h3 id="use_case_1_password_confirmation">Use Case #1: Password Confirmation</h3>
<p>Perhaps the most obvious use case from the demo, Chroma-Hash allows you to quickly compare the contents of two secure text fields. It&#8217;s common for a signup flow to ask you to type your password twice (to make sure you didn&#8217;t mistype it). With this visualization, a user can instantly check to see if what she typed was the same each time, without having to submit the form.</p>
<p>In a similar vein to password confirmation at signup, Chroma-Hash can be helpful when logging in from day-to-day. Whenever you log into your webmail or your favorite social network, you could expect to see your signature color combination. If not, you&#8217;d know that you somehow fudged it along the way. Especially for sites with 3 strike lockouts, Chroma-Hash could save a lot of needless frustration.</p>
<h3 id="use_case_2_anti_phishing_mechanism">Use Case #2: Anti-Phishing Mechanism</h3>
<p>As you might have caught on from the last use-case, Chroma-Hash could be effective in mitigating the risk of a phishing attack. Similar to the account-specific images that online banking systems recently added, your password becomes a visual signature that you can look for. Websites can securely serve unique color signatures by issuing a hash salt through a browser cookie, for instance.</p>
<p>Let&#8217;s say you go to a site that you <em>think</em> is PayPal. If you start to type your password and you&#8217;re getting unfamiliar colors (or no colors show up at all, for that matter), you&#8217;ll know something&#8217;s fishy. </p>
<h3 id="use_case_3_password_strength_feedback">Use Case #3: Password Strength Feedback</h3>
<p>Let&#8217;s think back to signup flow: When creating a Google account, for instance, you&#8217;ll get visual feedback of the strength of your password as you type it in. Stop after 5 characters, and a partially-filled red bar will accompany a message telling you to pick something stronger.</p>
<p>Similarly, Chroma-Hash has a parameter to specify the minimum number of characters before colors start to display. Until that threshold is reached, all the user will see are boring, gray bars. It&#8217;s more implicit than using strong colors and words, but there&#8217;s something to be said about ambient feedback, no?</p>
<h3 id="use_case_4_clipped_or_constrained_input_feedback">Use Case #4: Clipped or Constrained Input Feedback</h3>
<p>Let&#8217;s say you&#8217;re like me, and you go a little over-the-top with passwords. Although it&#8217;s a bit of an edge case, Chroma-Hash can be useful for providing visual feedback when a user types beyond the boundaries of a field.</p>
<p>Conversely, if there is a cap on the maximum amount of input, the lack of visual feedback, in that colors stop changing even though you keep typing, can just as well provide a cue to stop.</p>
<h2 id="objections_concerns_and_questions">Objections, Concerns, and Questions</h2>
<p>Reading through various threads on <a href="http://www.reddit.com/r/programming/comments/95hxr/chromahash_a_sexy_nonreversible_live/">reddit</a> and <a href="http://news.ycombinator.com/item?id=729556">Hacker News</a> gave me a much deeper insight into everything from aesthetics and usability to security and information theory. A lot of feedback was immensely useful, and helped take Chroma-Hash to that next level.</p>
<p>There may still be some legitimate usability or security concerns, but after several iterations, I&#8217;m confident that Chroma-Hash is a robust UI component. That said, I&#8217;d love to be proven wrong so I can continue to improve it even more.</p>
<p>For your consideration, here are some common concerns that are raised, along with my response to them.</p>
<h3 id="8220md5_is_weak8221">&#8220;MD5 Is Weak&#8221;</h3>
<p>From my understanding, a weak hash function is <em>exactly</em> what makes something like MD5 well-suited to this application. Usually, a hashing function is rated on its aversion to collision. For instance, if you are taking a checksum of a file, you&#8217;d want to be confident two files with the same checksum have the same content&#8212;otherwise, no collisions. </p>
<p>In the case of Chroma-Hash, collisions add security. If passwords have the same checksum, it makes it harder to isolate which one a checksum represents. Collisions are <em>good</em> for the purposes of the visualization. Collisions are what make security possible with Chroma-Hash.</p>
<h3 id="8220knowing_the_colors_is_knowing_the_password8221">&#8220;Knowing the Colors is Knowing the Password&#8221;</h3>
<p>Although Chroma-Hash seems to cover the entire spectrum, it&#8217;s actually constrained to a limited palette. Small palette means more collisions, which means that it&#8217;s more secure. Here are two techniques that are used to minimize the use of colors:</p>
<ul>
<li>
<p><strong>Grayscale Threshold</strong> - As mentioned in Use Case #3, colors don&#8217;t show up below a specified number of characters (by default, 6). Instead, the bars display in 4-bit monochrome. Not only are the colors difficult to differentiate based on plain eyesight, but within that range, you are nearly guaranteed to have collisions. Bump up the minimum, and it becomes exponentially more difficult to trace through to the final password.</p>
</li>
<li>
<p><strong>Least-Place Crushing</strong> - Above the grayscale threshold, the range of colors are still constrained. Based on a <a href="http://blog.iangreenleaf.com/2009/08/making-chroma-hash-less-leaky.html">great insight by Ian Young</a>, the least place of a hexadecimal color can be rounded down without compromising aesthetics. For instance, the color <span style="color:#CE2029">#CE2029</span> is nearly the same as <span style="color:#C02020">#C02020</span>, but the latter could be any one of 3375 colors. Since humans can&#8217;t perceive these slight differences, the extra (leaky) detail is removed without cost. Your password still looks like &#8220;Red Green Purple&#8221; with or without that extra place.</p>
</li>
</ul>
<p>This naturally brings us to&#8230;</p>
<h3 id="8220what_about_colorblind_people8221">&#8220;What About Colorblind People?&#8221;</h3>
<p>Consider the last points about grayscale and constrained palettes. Although I&#8217;m not colorblind myself, I would suppose that having some form of colorblindness is comparable to these two examples. In an extreme case, in which someone could not differentiate any color at all&#8212;everything is grayscale&#8212;you could <em>still</em> use Chroma-Hash. </p>
<p>The only snag is that without perceiving the additional color information, they have a greater chance of colliding, as you see it. Because one-off input is unlikely to be consistently similar one could imagine this system as still somewhat useful (expected dark <span style="color:gray">gray</span>, <span style="color:black">black</span>, <span style="color:white; background:#222;">white</span>; got <span style="color:#999">light gray</span>, <span style="color:white; background:#222;">white</span>, <span style="color:black">black</span>: no match).</p>
<h2 id="8220chroma_evangelism8221_or_8220the_many_colors_of_chroma_hash8221">&#8220;Chroma-Evangelism&#8221; OR &#8220;The Many Colors of Chroma-Hash&#8221;</h2>
<p>Last but not least, I wanted to point out some of the awesome contributions other developers have made to this whole experiment. They took the ideas behind Chroma-Hash and ported it to their favorite libraries and languages, and added so much more along the way. I&#8217;m truly humbled by your contributions.</p>
<ul>
<li><a href="http://github.com/leegao/pyChroma">pyChroma - leegao (Lee Gao)</a></li>
<li><a href="http://github.com/foxxtrot/Chroma-Hash">YUI3 - foxxtrot (Jeff Craig)</a> </li>
<li><a href="http://github.com/wki/Chroma-Hash/">Prototype - wki (Wolfgang Kinkeldei)</a></li>
</ul>
<p>Also, an Objective-C port and sound-based version by me:</p>
<ul>
<li><a href="http://github.com/mattt/CHSecureTextField">CHSecureTextField</a></li>
<li><a href="http://github.com/mattt/sonic-Hash">Sonic-Hash</a></li>
</ul>
<p>Interested? Feel free to <a href="http://github.com/mattt/Chroma-Hash/">fork Chroma-Hash</a> and make something even cooler!</p>
<h2>Finally, a Shout-Out</h2>
<p>I would be remiss without mentioning the main inspiration behind Chroma-Hash, <a href="http://lab.arc90.com/2009/07/09/hashmask-another-more-secure-experiment-in-password-masking/">HashMask</a> by <a href="http://www.umbrae.net/">Chris Dary</a> of <a href="http://lab.arc90.com/">Arc90</a>.  Cheers, Chris!</p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2009/11/chroma-hash-revisited/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Chroma-Hash: A Belated Introduction</title>
		<link>http://mattt.me/2009/07/chroma-hash-a-belated-introduction/</link>
		<comments>http://mattt.me/2009/07/chroma-hash-a-belated-introduction/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 14:23:36 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://mattt.me/?p=390</guid>
		<description><![CDATA[<br/><p>Yesterday, I posted <a href="http://mattt.github.com/Chroma-Hash/" title="Chroma-Hash Demo">Chroma-Hash</a>, an experiment in how to visualize the live-input of secure fields, such as a password on a login screen. So far, I&#8217;ve received a lot of great feedback, as well as a number of questions that I thought deserved a proper response.</p>]]></description>
			<content:encoded><![CDATA[<br/><p><strong><em>Hey, go check out the <a href="http://mattt.me/2009/11/chroma-hash-revisited/">more recent blog post about Chroma-Hash</a> for a better and more up-to-date explanation of everything.</em></strong></p>
<hr/>
<p>Yesterday, I posted <a href="http://mattt.github.com/Chroma-Hash/" title="Chroma-Hash Demo">Chroma-Hash</a>, an experiment in how to visualize the live-input of secure fields, such as a password on a login screen. So far, I&#8217;ve received a lot of great feedback, as well as a number of questions that I thought deserved a proper response.</p>
<p>Before I go into any details, I invite you to <a href="http://mattt.github.com/Chroma-Hash/" title="Chroma-Hash Demo">check out the live demo</a>, (if you haven&#8217;t seen it already), so you can get a clear idea of what Chroma-Hash does.</p>
<h2 id="the_concept">The Concept</h2>
<p>When you type something into a secure field, each character is displayed as a •. Good news for people who don&#8217;t want others to see their password; Bad news for anyone who has a long or difficult password (or is bad at typing). How could we improve the experience of secure text input so that the user entering information could have an idea of what they entered, without anyone else knowing it?</p>
<p>Chroma-Hash approaches this problem using an ambient color representation of the input as it is being typed. </p>
<h3 id="use_case_1_login_check">Use Case 1: Login Check</h3>
<p>If your password normally is represented as &#8220;red, purple, orange&#8221;, and after you&#8217;ve finished typing you see &#8220;pink, green, grey&#8221;, you&#8217;ll know you mistyped it somewhere along the way. This avoids a potentially long wait for the server to respond with a &#8220;failed login&#8221; notice.</p>
<h3 id="use_case_2_password_confirmation">Use Case 2: Password Confirmation</h3>
<p>When you sign up for a web service, you often have to type your password twice to make sure that you entered what you wanted correctly. <a href="http://mattt.github.com/Chroma-Hash/" title="Chroma-Hash Demo">As in the demo</a>, a user will be able to confirm that two fields are the same visually. There are, of course, many alternatives for live-input validation of password confirmation, but this is another viable use case for Chroma-Hash.</p>
<h2 id="security_concerns">Security Concerns</h2>
<p>Under the scrutiny of the sharp minds on <a href="http://mattt.github.com/Chroma-Hash/" title="programming.reddit.com">proggit</a> and <a href="http://news.ycombinator.com/item?id=729556" title="Y Combinator Hacker News">Hacker News</a>, it&#8217;s only natural that some really good concerns were raised. As an experiment, this is the best kind of input I could ask for, because it challenges the viability of this as a visual metaphor, and works to improve the usability of the project as a whole.</p>
<h3 id="8220it8217s_not_non_reversible8221">&#8220;It&#8217;s Not Non-Reversible&#8221;</h3>
<p>By all accounts, I would not, in fact, bet on Chroma-Hash being unbreakable. <em>At least in its current iteration.</em></p>
<p>One of the common arguments is that by showing the colors as you type, one could step through and guess along each way. <a href="http://news.ycombinator.com/user?id=chaosmachine" title="chaosmachine on Hacker News">chaosmachine</a> on Hacker News <a href="http://news.ycombinator.com/item?id=729724" title="Comment on Y! Combinator Hacker News">explained it this way</a>:</p>
<blockquote><p>Because you can see the color code at each step, it&#8217;s easy to compare results very quickly, even by hand. Did I get letter 1 right? Ok, move on to letter two, try each key until the colors match the recording. Do this for each step. At most, you have to try about 64 key presses to crack each letter.</p></blockquote>
<p>Theoretically, this is definitely a concern. One of the ways I tried to prevent this was to animate transitions between the color sequences as they were being typed, so intermediary colors were never shown. Given a sufficiently slow typist, though, all bets are off in Chroma-Hash&#8217;s current state.</p>
<p>Another consideration, however, is how exactly someone would be able to tell what the colors are, at least in common use-cases. As a color expressed in Hex, there are 16,777,215 possible colors for each bar. Eye-balling it wouldn&#8217;t be enough to get an exact color value—the difference between <span style="color:#952A08;">#952A08</span> and <span style="color:#952A09;">#952A09</span> is nearly imperceptible, but represent an completely different hash input. Unless you get a really good look, it would be pretty hard to tell. And at that point, you might as well be looking at the person typing it instead <img src='http://mattt.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3 id="md5_is_weak">MD5 is Weak</h3>
<p>Another concern was the use of MD5 rather than a stronger hashing algorithm, like <a href="http://en.wikipedia.org/wiki/SHA_hash_functions" title="SHA Hash Functions on Wikipedia">SHA-1</a>. For this first release, <a href="http://en.wikipedia.org/wiki/Md5" title="MD5 on Wikipedia">MD5</a> was a choice of convenience. MD5 is marginally faster, and with live-validation, I wanted to make sure that the animation was smooth and didn&#8217;t interfere with user input.</p>
<p>One of the ideas behind the project was that by using one hashing algorithm, a user could expect the same color on any website that implemented Chroma-Hash. This is not a central concept to this visualization, and may prove to be a bad idea. For the next iteration, I&#8217;m considering adding support for SHA-1 as an alternative hashing algorithm that can be passed in as a parameter.</p>
<h2 id="iterative_improvement">Iterative Improvement</h2>
<p>Weighing in these concerns, I believe that this kind of visualization can become a viable UI metaphor—all it would take are a few minor improvements. Here are a few suggestions that I am currently considering for the next version:</p>
<h3 id="adding_a_time_delay_to_live_input">Adding A Time Delay To Live Input</h3>
<p>To avoid the possibility of exploiting information as the user types their input, a short time delay could be added before the colors are displayed.<a href="http://news.ycombinator.com/item?id=729622">[1]</a> <a href="http://news.ycombinator.com/item?id=729629">[2]</a> <a href="http://www.reddit.com/r/programming/comments/95hxr/chromahash_a_sexy_nonreversible_live/c0bi0s7">[3]</a> <a href="http://www.reddit.com/r/programming/comments/95hxr/chromahash_a_sexy_nonreversible_live/c0bi1g9">[4]</a> This way, all a potential attacker could know is a portion of the password&#8217;s hash, which is not nearly as useful.</p>
<h3 id="using_a_stronger_hashing_algorithm">Using A Stronger Hashing Algorithm</h3>
<p>As stated before, I may add an option to use SHA-1 instead of MD5 in the next version. This is pending research into the potential gains and the concerns of maintaining a fluid user experience.<a href="http://www.reddit.com/r/programming/comments/95hxr/chromahash_a_sexy_nonreversible_live/c0bi24j">[1]</a> <a href="http://www.reddit.com/r/programming/comments/95hxr/chromahash_a_sexy_nonreversible_live/c0bi497">[2]</a></p>
<h3 id="using_a_salt">Using a Salt</h3>
<p>A <a href="http://en.wikipedia.org/wiki/Salt_(cryptography">salt</a> &#8220;Salt on Wikipedia&#8221;) based on other field inputs or a server-defined constant, for instance, would further increase the security of the hashing algorithm. The only downside is that this approach would force the user to remember different color combinations for each site, which as I mentioned above, may not be such a bad thing.</p>
<hr/>
<p>Once again, I&#8217;d like to thank everyone who&#8217;s given me so much useful feedback and encouragement. I&#8217;m really excited to take <a href="http://mattt.github.com/Chroma-Hash/" title="Chroma-Hash">Chroma-Hash</a> to the next level, and as such, I extend you to continue this conversation on possible uses and security considerations.</p>
<p>Photo Credit: <a href="http://www.flickr.com/photos/binarycoco/2736362903/" title="binarycoco on Flickr">binarycoco</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2009/07/chroma-hash-a-belated-introduction/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Game Over: Learning From Failure In Videogames</title>
		<link>http://mattt.me/2009/07/game-over-learning-from-failure-in-videogames/</link>
		<comments>http://mattt.me/2009/07/game-over-learning-from-failure-in-videogames/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 10:57:04 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Aesthetics]]></category>

		<guid isPermaLink="false">http://mattt.me/?p=375</guid>
		<description><![CDATA[<br/><p>Thinking through the contingencies of failure for an interaction is an exercise of empathy with the user. Whether in videogames or more traditional <abbr title="User Interfaces">UI</abbr>s, framing development in a mindset of failure allows you to get in the head of the typical user and design accordingly.</p>]]></description>
			<content:encoded><![CDATA[<br/><p>We tend to think of videogames in terms of success. It&#8217;s all about rescuing the princess, getting the high score, beating the final boss, or pwning your friends. The last thing you want to think about is seeing that Game Over screen.<br />
&#8230; That is, unless you&#8217;re a game designer, in which case the whole &#8220;Game Over&#8221; thing may be the most important detail to get right.</p>
<p>Consider what Will Wright, creator of such iconic games as Sim City and The Sims, has to say about the matter:</p>
<blockquote><p>When we make games now, we very much think in terms of what are the interaction loops, and what are the success and failure sides of those interaction loops. One of the things that&#8217;s kind of non-intuitive here is that it&#8217;s actually more important to really think through the failure side than the success side. Because, when you think about it, the success side is pretty boring: you want to get to the next level. You could just spend most of your time failing, and it&#8217;s important that the failures are interesting, varied and primarily that you understand why the failure occurred.<br />
<cite>Will Wright (2003)</cite>
</p></blockquote>
<p>Failure is an inevitable part of the gaming experience, but accounting for it is a detail too often overlooked by developers. And who could blame them? It&#8217;s much more interesting to think about cool new game mechanics or engrossing narratives. But as Will Wright points out, failure is every bit as important. Failure closes the interaction loop. No matter how interesting a game mechanic or story you have, it doesn&#8217;t matter if the player never experiences because they get frustrated and give up half-way through.</p>
<p>Thinking through the contingencies of failure for an interaction is an exercise of empathy with the user. Whether in videogames or more traditional <abbr title="User Interfaces">UI</abbr>s, framing development in a mindset of failure allows you to get in the head of the typical user and design accordingly.</p>
<p>Below are 2 examples of videogames that each approach failure in a poignant way. Together, they illustrate what I call 2 core <em>mantras</em> of designing for failure. By exploring the ways that these videogames deal with failure, we can learn a great deal about we can improve our own user experiences.</p>
<h2>Team Fortress 2</h2>
<p>In the overcrowded space of multiplayer first-person shooters, <a href="http://www.teamfortress.com/">Team Fortress 2</a> really stands out. Between its innovative class system, meticulously-groomed collection of maps, and an unmatched focus on teamwork, <abbr class="caps" title="Team Fortress 2">TF2</abbr> gets a lot of things right. One of those things that I&#8217;d like to focus on is the screen you get when you die.</p>
<p>Being blown apart by a rocket, lit up by sub-machine gun fire, bludgeoned by a baseball bat, or being burnt to a crisp isn&#8217;t anyone&#8217;s idea of a good time. It&#8217;s a delicate matter to communicate to a user, but <abbr class="caps" title="Team Fortress 2">TF2</abbr> nails it:</p>
<p><img src="http://mattt.me/wp-content/uploads/2009/07/tf2-death.jpg" alt="tf2-death" title="tf2-death" width="590" height="331" class="alignnone size-full wp-image-381" /></p>
<p>There&#8217;s actually a lot going on with this screen.</p>
<p>First, the gameplay stops with a distinctive &#8220;whoosh&#8221; noise. With the frantic pace of a 24-person match, a break in the action affords the player a chance to step back and collect themselves. Beyond a visual cue that action has been suspended, this pause is a mental cue to reflect on what happened, so the player can understand how to not get p&oslash;wn&#x27;d next time.</p>
<p>Next, the camera zooms in to where your killer was when you bit the dust. This particular detail is something Valve talked about in their developer commentary: Testers sometimes had trouble understanding how or why they were killed. Especially in the case of a Sniper&#8217;s headshot from the other side of the level, for instance, it would be very frustrating to drop dead out of without adequate explanation. Thus, Valve settled on the aforementioned solution, to the chagrin of campers and griefers everywhere.</p>
<p>One of the most unique parts of this death screen is the &#8220;On the Bright Side&#8221; message that pops up from time to time. Just as zooming in to your killer added context of how you were killed, &#8220;On the Bright Side&#8221; adds context to your death itself. For instance, <em>&#8220;You tied your previous record for kills this round of 4&#8221;, or &#8220;You stayed alive as Scout longer that round than your previous best&#8221;</em>. As it were, this message recontextualizes death from <em>failure</em> to a form of <em>success</em>. Rather than be upset that you died <em>again</em>, you get recognized for things you did particularly well this time around.</p>
<p>Our insights from Team Fortress 2 leads us to the first mantra of Failure:</p>
<div class="mantra team-fortress-2">
	<span class="title">Be Informative</span><br />
  <span class="description">Provide sufficient context for the user to understand what happened, and learn how to improve in the future.</span>
</div>
<p>When we fail, much of the pain we feel derives from a lingering sense of confusion. &#8220;<em>What the heck? Why did that happen?</em>&#8221; Without properly communicating the situation, the player is unable to causally link their actions to the response. This can quickly lead to frustration, and ultimately cause the player to give up. When we fail, it&#8217;s not that we&#8217;re necessarily upset with failing itself&#8212;after all, in videogames, the stakes are pretty low. What&#8217;s really upsetting is when, because of a broken feedback cycle, we don&#8217;t seem in control of our own destiny.</p>
<h2>World of Goo</h2>
<p>Fueled by its critical reception and widespread distribution, <a href="http://www.2dboy.com/games.php">World of Goo</a> has become an iconic success story for the <a href="http://www.offworld.com/gimme-indie-game/">emerging generation of indie games</a>. But more importantly, it shows how a strong concept combined with creativity and a great attention to detail can produce an amazing experience.</p>
<p>Each level of World of Goo challenges the player to build structures in order to reach a goal. How the player does it is up to them.</p>
<p>Game mechanics are introduced with new varieties of Goo Balls, like Ivy Goo, Balloon Goo, and Bomb Goo. These game mechanics are reinforced through different puzzles that explore the intricate ways that Goo Balls can combine and interact. Levels incorporate obstacles, like spike-lined chasms, mechanical automata, and hurricane-strength winds. All of these elements come together to keep gameplay varied and interesting, and in turn, make the player come up with new and creative strategies.</p>
<p>Sometimes, the solution is obvious, and it&#8217;s just a matter of getting there the fastest or with the fewest Goo Balls. Other times, things aren&#8217;t as clear, and it may take several iterations just to find something that works at all. Perhaps the worst, though, are the times when it&#8217;s clear exactly what needs to be done, but you just don&#8217;t have the finesse to get your goo tower to balance the right way.</p>
<p>For how challenging the game is, though, it never seems overly frustrating. Why this is has a lot to do with the way World of Goo mitigates failure.</p>
<p><img src="http://mattt.me/wp-content/uploads/2009/07/world-of-goo-screenshot.jpg" alt="world-of-goo-screenshot" title="world-of-goo-screenshot" width="590" height="443" class="alignnone size-full wp-image-380" /></p>
<p>In World of Goo, there is no Game Over screen. Rather, the notion of failure is recognized as being very distinct from Game Over. This touches on a fundamental truth of problem solving&#8212;that it is an iterative process; a process of constant failure, but also of constant learning. To expect the player to get it right every time undermines the spirit of the whole puzzle genre. If the player isn&#8217;t failing, it&#8217;s not really a puzzle, now is it?</p>
<p>Even though failure is inevitable, and indeed important, it&#8217;s important to recognize that not all failures are equal. For instance, certain levels in World of Goo have white &#8220;undo bugs&#8221; flying around on the screen&#8217;s periphery. Activating one reverts the last thing you did, making a particularly disastrous move not force a full restart. To that point of all failures not being equal, &#8220;undo bugs&#8221; allow for an acceptable level of inevitable human error to occur without taking away from the core gameplay experience.</p>
<p>All of this brings us to the second mantra of failure:</p>
<div class="mantra world-of-goo">
  <span class="title">Be Implicit</span><br />
  <span class="description">When possible, allow the user to understand that they failed without having to tell them outright.</span>
</div>
<p>It&#8217;s like that archetypical High School French teacher&#8212;the one who corrects every last word you say, and then makes you repeat the whole sentence again, once you&#8217;ve painfully managed to eek it out. <em>Don&#8217;t be that High School French teacher.</em> If not just for the fact that such an interaction isn&#8217;t so much fun, they&#8217;re also not that effective. Going back to the first mantra of failure, provide the player with enough context to understand what they&#8217;re doing wrong, and they&#8217;ll often correct themselves.</p>
<hr/>
<p>Of course, there are many more things to be said about failure. This is only a start to a conversation that I extend into the ethos of everyone interested in making user interactions better.</p>
<p>For a deeper appreciation of the role of failure in game design, be sure to check out the work of <a href="http://www.jesperjuul.net/ludologist/">Jesper Juul</a>, particularly his essay, <a href="http://www.jesperjuul.net/text/fearoffailing/">&#8220;Fear of Failing? The Many Meanings of Difficulty in Video Games&#8221;</a>. Other suggested reading includes <a href="http://www.gamingw.net/item.php?id=77566">a Gaming World article on difficulty and failure (which also cites Juul)</a> and <a href="http://www.wired.com/gaming/gamingreviews/commentary/games/2009/03/gamesfrontiers_0309">A Wired article by Clive Thompson on Peggle</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2009/07/game-over-learning-from-failure-in-videogames/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Commence</title>
		<link>http://mattt.me/2009/05/commence/</link>
		<comments>http://mattt.me/2009/05/commence/#comments</comments>
		<pubDate>Wed, 13 May 2009 19:11:55 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Philosophy]]></category>

		<category><![CDATA[Carnegie Mellon]]></category>

		<category><![CDATA[CMU]]></category>

		<category><![CDATA[Commencement]]></category>

		<category><![CDATA[Graduation]]></category>

		<category><![CDATA[Speech]]></category>

		<category><![CDATA[This American Life]]></category>

		<guid isPermaLink="false">http://mattt.me/?p=308</guid>
		<description><![CDATA[<br/>Earlier in the year, as is the tradition at Carnegie Mellon, there was an open contest to be the class speaker at commencement. As someone who never identified strongly as a student qua student, I knew my submission would be a long shot. It was, but how much better to have tried and failed.]]></description>
			<content:encoded><![CDATA[<br/><p>Earlier in the year, as is the tradition at Carnegie Mellon, there was an open contest to be the class speaker at commencement. As someone who never identified strongly as a student qua student, I knew my submission would be a long shot. It was. But how much better to have tried and failed.</p>
<p>So for what it&#8217;s worth, here&#8217;s my parting message to all of you (us) graduating seniors.</p>
<hr/>
<p>Fellow members of the Class of 2009, I stand here before you to talk about a very important subject: hot dogs.</p>
<p>Well, not hot dogs, per se, but a story about hot dogs, which, as you might expect from a graduation speech, has very little to do with hot dogs.</p>
<p>This story takes place at the Vienna Sausage Company&#8217;s factory on the North Side of Chicago. In 1970, the company completed construction on this building, to replace the original plant on the South Side: a sprawling mass of inter-connected properties covering an entire city block. It had been built up incrementally over the company&#8217;s 70-year history. This new plant was designed from the ground-up to streamline the manufacturing process into a single, state-of-the-art facility.</p>
<p>When the plant finally opened, the first batches of the company&#8217;s signature product—their &#8220;natural-casing, old-world, hickory-smoked sausages&#8221; weren&#8217;t coming out right. They tasted fine, but they didn&#8217;t have the right snap when you bit into them. Even worse, the color was wrong. Rather than a distinctive bright red that had defined the brand for so long, these new batches were pink.</p>
<p>So, over the next 2 years, the Vienna Sausage Company did everything they could to figure out what was wrong. The ingredients were all the same. The process was all the same. Maybe the ovens were cooking differently? Maybe the water on the North Side of Chicago wasn&#8217;t the same as the South Side? After all this time, no one had any idea what could possibly be missing.</p>
<p>Then, one night, a few workers were out reminiscing on their days in the old plant, when someone mentioned Irving. Irving was the kind of guy that had been there forever. He knew everyone there; had nicknames for everyone. Listen to what he did: his job was to take racks of sausages from refrigeration to the ovens. Though this could take as long as 30 minutes, as he had to wind through the maze of hallways and buildings of the old plant to get there. He would go through the warm hanging benches for the pastrami, through the boiler-room, next to the tanks where they cooked the corned beef, sometimes even up an elevator, until he finally got to the smokehouse.</p>
<p>In this new plant, there was no Irving—he didn&#8217;t want to commute from the South Side to the new plant. And his long journey to the smokehouse was missing too—in this new facility, there just wasn&#8217;t any need for it. As it turns out, Irving&#8217;s trip, which gradually warmed the hot dogs before being cooked in the smokehouse: <em>that</em> was the secret ingredient. So secret, that <em>not even the company itself knew it</em>.</p>
<p>I originally heard this story from Ira Glass, on an old episode of a radio program called <a href="http://thislife.org/">This American Life</a>. And the reason I found it so compelling was his take on it:</p>
<blockquote><p>
&#8220;What I like about the story is the fact that these guys at the factory had done everything right. Finally built their dream factory, with the best equipment and expertise that money could buy. But you can&#8217;t think of everything&#8221;</p>
<p>&#8220;Sometimes, you have no idea why you were a success in the first place.&#8221;
</p></blockquote>
<p>That&#8217;s something you don&#8217;t really hear enough. All too often, we try to simplify things into easy-to-remember formulas, that either equate success as a function of how hard you work, or conversely, as a matter of blind luck.</p>
<p>Graduation is a big milestone in life, certainly. It&#8217;s one among many that you use to fold up your personal story into neat little episodes.</p>
<p>It&#8217;s that interface where one chapter wraps-up and another begins. Where our only choice is whether to reflect back or plan ahead.</p>
<p>I ask you today, to consider your own messy factory that you&#8217;ve unwittingly built-up over the last 20-some years. At milestones such as this, there is a tendency to want to reinvent yourself; to move across town, into a brand-new facility with everything meticulously designed to absolute perfection. And there&#8217;s no way to stop this—it&#8217;s human nature. Really, there&#8217;s no reason to either: sometimes it&#8217;s worth thinking about starting fresh with a clean slate. In fact, probably most of us will do just this to varying degrees, as we move across this country, and around the world, where our new identities await us. But as you stand there, with your clean slate in hand, ready to build &#8220;the perfect you&#8221;, remember this:</p>
<blockquote><p>&#8220;Sometimes, you have no idea why you were a success in the first place.&#8221;</p></blockquote>
<p>Look deep inside yourself, and you might begin to see where Irving is. He might be in that random elective you took on a whim that turned you onto something completely new and different. He might be in your renewed sense of hygiene after you transferred out of Computer Science. He might be in a very special person you met when you least expected it, who completely changed your life.</p>
<p>I ask you today, to look deep inside yourself, on every level, with the resolve to know yourself as well as you possibly can.</p>
<p>With luck, you may meet a fellow named Irving, who just so happens to be the very reason why you&#8217;re here today, graduating from Carnegie Mellon University.</p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2009/05/commence/feed/</wfw:commentRss>
		</item>
		<item>
		<title>URL Shorteners Suck. Roll Your Own.</title>
		<link>http://mattt.me/2009/04/url-shorteners-suck-roll-your-own/</link>
		<comments>http://mattt.me/2009/04/url-shorteners-suck-roll-your-own/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 19:05:53 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Bit.ly]]></category>

		<category><![CDATA[Digg]]></category>

		<category><![CDATA[DiggBar]]></category>

		<category><![CDATA[GitHub]]></category>

		<category><![CDATA[link-rot]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[SEO]]></category>

		<category><![CDATA[TinyURL]]></category>

		<category><![CDATA[URL]]></category>

		<category><![CDATA[URL Shorteners]]></category>

		<guid isPermaLink="false">http://mattt.me/?p=282</guid>
		<description><![CDATA[<br/><p>So you&#8217;re all gung-ho about preventing the <em>link-rot apocolypse</em> of the internet. Sweet! Now what? Check out this simple way to implement a shortener on your own site.</p>]]></description>
			<content:encoded><![CDATA[<br/><p><span class="caps">URL</span> shorteners are quite the topic of conversation following the announcement of the <a href="http://digg.com/tools/diggbar">DiggBar</a> last week—marking <a href="http://digg.com/">Digg&#8217;s</a> impressive entry into this crowded and contentious field.</p>
<p>Back in the day, there was <a href="http://tinyurl.com/">TinyURL</a>, which turned that interesting web page you found into something you could easily slip into conversation, or confidently paste into an e-mail. But with the advent of Twitter, a whole ecosystem has sprung up to make sure you&#8217;re able to milk every last character, whether by <a href="http://ff.im/">clever</a> <a href="http://cli.gs/">uses</a> <a href="http://krz.ch/">of</a> <a href="http://bit.ly">exotic</a> <a href="http://is.gd">TLDs</a>&#8221; or recently, <a href="http://tinyarro.ws/">unicode characters</a>.</p>
<p>Yet, for the convenience these services provide, there is a hidden cost to this transaction, as Joshua Schachter points out in <a href="http://joshua.schachter.org/2009/04/on-url-shorteners.html">his recent article</a>:</p>
<blockquote><p>
  The worst problem is that shortening services add another layer of indirection to an already creaky system. A regular hyperlink implicates a browser, its <span class="caps">DNS</span> resolver, the publisher&#8217;s <span class="caps">DNS</span> server, and the publisher&#8217;s website. With a shortening service, you&#8217;re adding something that acts like a third <span class="caps">DNS</span> resolver, except one that is assembled out of unvetted <span class="caps">PHP</span> and MySQL, without the benevolent oversight of luminaries like Dan Kaminsky and St. Postel.
</p></blockquote>
<p>If these shortener services were to suddenly vanish, their links would go with them. Sure, a majority of those links are of no greater significance than <a href="http://flolcatr.com">your average lolcat</a>, but 5, 10 years down the line, we face losing a lot of meaningful content. It poses enough of a problem that there is now a <a href="http://archiveteam.org/index.php?title=TinyURL">project to systematically crawl all of these services</a> to archive and preserve their links.</p>
<p>As users, we are left without much recourse: most <span class="caps">SEO</span> junkies and <span class="caps">REST</span> purists are pretty set in their ways of descriptive URLs, and Twitter&#8217;s core philosophy revolves around 140 characters—so that&#8217;s not changing anytime soon (<a href="http://www.kottke.org/09/04/url-shorteners-suck">short of Kottke&#8217;s proposed solutions</a>). Fortunately, for those of us who make websites, we have the opportunity to roll our own solution, and reclaim our URLs.</p>
<h2><span class="caps">DNS</span> Diet</h2>
<p>So you&#8217;re all gung-ho about preventing the <em>link-rot apocolypse</em> of the internet. Sweet! Now what?</p>
<p>For now, home-grown, site-specific short URLs seem to be the most sustainable solution. Not only do they reinforce your domain in the minds of the end-user, but they keep a closed loop on valuable analytics. And as long as you make sure to <a href="http://domainnamewire.com/2009/03/16/toyscom-loses-google-ranking/">redirect intelligently</a>, you can build it right on top of your existing site without sacrificing <span class="caps">SEO</span>.</p>
<p>Every website has its fair share of quirks, but if Amazon, a website rife with <a href="http://www.amazon.com/gp/product/B000X25GW2?ie=UTF8&#38;tag=mattthom-20&#38;linkCode=as2&#38;camp=1789&#38;creative=390957&#38;creativeASIN=B000X25GW2">long, impenetrable URLs</a> can make <a href="http://amazon.com/wii/">amazon.com/wii</a> work <a href="http://www.scripting.com/stories/2009/03/07/solvingTheTinyurlCentraliz.html">as expected</a>, surely you can implement something for your own blog or web application. For a starting point, you might want to check out something I made recently.</p>
<h2>Midgt: Well, Here&#8217;s One Way of Doing It.</h2>
<p><a href="http://github.com/mattt/midgt/">Midgt</a> is a Ruby implementation of a simple, reversible algorithm that encodes numeric IDs into mixed-case alpha-numeric sequences that can be used as a drop-in component in web applications.</p>
<p>With some creative routing, you could change this:<br />
<tt><br />
  http://ecommer.ce/catalog/products/94573<br />
</tt></p>
<p>Into something like this:</p>
<p><tt><br />
  http://ecommer.ce/nBo<br />
</tt></p>
<p>The ID <em>94573</em> can alternatively be encoded to the shorter string, <em>nBo</em>. Custom routing can be used to trim the verbose hierarchy built around the ID down to a shorter alpha-numeric ID, which redirects back to it to it&#8217;s proper listing.</p>
<p>This example is admittedly contrived, but the utility of such an approach increases dramatically as the range of legal characters used to encode is expanded, and the number of unique IDs to represent continues to grow. For applications operating in terms of millions of items, this could mean 3 or 4 less characters. Since every character matters in this 140-count economy, why not? Besides, transparent numeric IDs are <em>so</em> 2006.</p>
<p>Check out Midgt for yourself on Github:</p>
<p>	<tt><a href="http://github.com/mattt/midgt/">http://github.com/mattt/midgt/</a></tt></p>
<p>Nothing too revolutionary, but I hope it&#8217;s a bit of inspiration for those of you now wanting to roll your own solution.</p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2009/04/url-shorteners-suck-roll-your-own/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Computational / Poetry Thesis Blog Post / Stanza 三: Haiku</title>
		<link>http://mattt.me/2009/03/computational-poetry-thesis-blog-post-stanza-3-haiku/</link>
		<comments>http://mattt.me/2009/03/computational-poetry-thesis-blog-post-stanza-3-haiku/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 23:13:12 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Linguistics]]></category>

		<category><![CDATA[Caesura]]></category>

		<category><![CDATA[CMU]]></category>

		<category><![CDATA[Computational Linguistics]]></category>

		<category><![CDATA[Haiku]]></category>

		<category><![CDATA[Japanese]]></category>

		<category><![CDATA[Keats]]></category>

		<category><![CDATA[Kigo]]></category>

		<category><![CDATA[Markov]]></category>

		<category><![CDATA[n-Gram]]></category>

		<category><![CDATA[NLP]]></category>

		<category><![CDATA[PCFG]]></category>

		<category><![CDATA[Poetry]]></category>

		<category><![CDATA[Thesis]]></category>

		<category><![CDATA[WordNet]]></category>

		<guid isPermaLink="false">http://matttthompson.com/?p=260</guid>
		<description><![CDATA[<br/>A wise man once said, that if you train an n-gram model with too much data, it will hurt. Bad. We&#8217;re talking <em>Kurzweilian singularity &#x27A1; grey goo &#x27A1; ??? &#x27A1; profit!</em> kind of hurt. That&#8217;s the way I&#8217;ve felt over the last month or so, thinking about my thesis; there were so many directions I could go in, so many theoretically intriguing and clever avenues to venture.]]></description>
			<content:encoded><![CDATA[<br/><p><a href="http://www.cs.cmu.edu/~nasmith/">A wise man</a> once told me that if you train an n-gram model for generation with too much data, it will hurt. Bad.</p>
<p> We&#8217;re talking <em>Kurzweilian singularity &#x27A1; grey goo &#x27A1; ??? &#x27A1; profit!</em> kind of hurt.</p>
<p> That&#8217;s the way I&#8217;ve felt over the last month or so, thinking about my thesis; there were so many directions I could go in, so many theoretically intriguing and clever avenues to venture.</p>
<p>In order to head off my progressive channeling of Don Giovanni, I got back to fundamentals, and rediscovered what it really meant to be a haiku.</p>
<h2>俳句 &#8211; haiku</h2>
<p>&#8220;Ignorance of other cultures is the currency of ours.&#8221;</p>
<p>As much a law of the universe as entropy, any genuine artifact of a culture will inevitably become completely bastardized. Much the same fate has befallen the noble haiku, now distilled to a metrical exercise of 5-7-5. (Then again, who am I to judge, like I of all people could bemoan the loss of 17th-century Japanese culture). What appealed to me from traditions lost were two missing pieces— <a href="http://en.wikipedia.org/wiki/Kigo">kigo</a> and <a href="http://en.wikipedia.org/wiki/Caesura">caesura</a> —that come together to further constrain the project, making the problem at hand more well-defined.</p>
<hr/>
<h3>季語 &#8211; kigo (season word)</h3>
<p><q>梅がかに　／　ノット比の出る　／　山路仮名</q></p>
<blockquote>
<pre>
scent of plum blossoms
on the misty mountain path
a big rising sun
</pre>
</blockquote>
<p>Traditional Japanese haiku have this remarkable ability to evoke a sense of place, as in this classic example from Bashō. In a post-modern context, though, such naturalistic references might best be supplanted by a pop-culture reference. Here&#8217;s my take:</p>
<blockquote>
<pre>
the earth is crying
our only hope is Al Gore
it&#8217;s gettin hott in hrrrr
</blockquote>

Yeah, that definitely speaks to me more than some plum trees and rocks in the fog.

From the start, I imagined that this program would provide a web interface, where people could generate poems about a keyword. Since I suspect most people would like to see poems about people and places, getting relevant text about named entities is actually a major concern.
<hr/>
<h3> 休止 &#8211; caesura</h3>

<q>春雨や ／ 小磯の戸外 ／ ヌルルほど</q>
<blockquote>
<pre>
spring rain —
small shells on a small beach
glittering
</blockquote>

This example by Buson illustrates the caesura, or break, of traditional haiku. Whether its a dash, period, colon (semi- or otherwise): old-school haiku have a grammatical and indexical turn in them. A good haiku uses the two resultant shards to play off of each other through stylistic and symbolic contrasts, embracing a sort of proto-Hegelian dialectic.

Pragmatically, this is pretty good news. Not only does the break provides a pseudo-grammatical structure to rest upon, but it allows for different semantic relationships to be explored. For instance, given a theme word or <em>kigo</em>, the former half could contain synonyms and metonyms, whereas the latter might be all antonyms.
<h2>ボックスの話 &#8211; Natural Language Processing</h2>

After a solid week of hacking on the project, a working prototype of the haiku module started to emerge.

Most importantly, I&#8217;m happy to report, <em>it kinda works</em>: the system generates valid haiku form just fine, and is cognizant of semantic relationships to the point of only needing parameter tuning.

Allow me to present the most reasonable and least-embarrassing results from initial testing:
<blockquote>
<pre>
sunny cheerful day -
gloomy nimbus on Wall Street
today as stocks
</pre>
</blockquote>
<p>Stranger still, after generating this, my program decided to move to New York City to make it big, where it received mixed reviews on his interludes to the oppression of the working-man&#8217;s clock cycles.</p>
<h3>Introducing the Cast</h3>
<p><em>Keats</em> is composed of several different <span class="caps">NLP</span> modules, each optimized for different tasks, which are combined using some pretty slick Ruby glue code. Here are the components used at the moment:</p>
<h4><span class="caps">CMU</span> Pronouncing Dictionary</h4>
<p>As I mentioned before, the <a href="http://www.speech.cs.cmu.edu/cgi-bin/cmudict"><span class="caps">CMU</span> Pronouncing Dictionary</a> was the technical inspiration for my thesis project in the first place. It offers both phonological and prosodic information on tens of thousands of words. I indexed the flat-file into a MySQL database, which cached calculated information like number of syllables and vowel geometry, along with a delightful <span class="caps">IPA</span> string representation.</p>
<h4>WordNet</h4>
<p>Perhaps one of the best-known <span class="caps">NLP</span> resources out there, Princeton&#8217;s <a href=""http://wordnet.princeton.edu/">WordNet</a>&#8221; is an semantic index of <a href="http://wordnet.princeton.edu/man/wnstats.7WN">staggering breadth and depth</a>. Not only does it have hundreds-of-thousands of entries, but for each entry, there is an extensive relational graph for everything from synonymy to verb frame. In order to integrate it into my project, I wrote a script to transform the Prolog database into a MySQL relational database, and cross reference it with the existing phonological information from the <span class="caps">CMU</span> Dictionary.</p>
<h4><acronym title="Probabilistic Context-Free Grammar"><span class="caps">PCFG</span></acronym></h4>
<p>After entertaining some ideas about language model training on a corpus of haiku, I decided the most reasonable way to approach it, at least for now, was with my trusted friend, the <a href="http://en.wikipedia.org/wiki/PCFG">Probabilistic Context-Free Grammar</a>. To get a feel for what it could do, I hand-wrote a series of transformation rules like <em>S &#x27A1; Adj <span class="caps">N V</span></em> or <em>S &#x27A1; Adj Adj <span class="caps">N V N</span></em>. From there, I would partition syllables for the line and find a candidate word from the WordNet SynSets.</p>
<h4>n-Gram Modeling</h4>
<p>Building off a small sample of a New York Times text corpus, I started to work with <a href="http://en.wikipedia.org/wiki/Trigram">trigram</a> and larger <a href="http://en.wikipedia.org/wiki/N-gram">n-gram</a> language models to produce meaningful (or at least reasonable) sequences between target keywords. This is what generated &#8220;on Wall Street / today as stocks&#8221; in the example poem. There was a rule in the <acronym title="Probabilistic Context-Free Grammar"><span class="caps">PCFG</span></acronym> that replaced <em>M</em> with this Markov model output.</p>
<h3>All Together Now</h3>
<p>Given the <em>kigo</em>, or theme word, I look up all of the semantic pairs associated with it in WordNet, whose correspondent has an entry in the <span class="caps">CMU</span> Pronunciation dictionary. After ranking the candidates (now randomly, but later by phonological features), it will partition syllables and generate a <span class="caps">PCFG</span> for a sequence before and a sequence after the split. Using the candidate rankings, it will fill in the slots as necessary, until the grammar is satisfied and the poem is complete.</p>
<p>At this point, I&#8217;m feeling pretty good about my progress so far. After some fine-tuning and figuring out better ways to rank candidate words, I should have a pretty robust engine that will produce not only passable haiku, but with slight modification, Fibonacci poems as well. As for the Limerick part of the project, I&#8217;m hoping that something will click in the next month, so I&#8217;ll have some idea of where to start with that.</p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2009/03/computational-poetry-thesis-blog-post-stanza-3-haiku/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Prayer from the SF-bound Caltrain at 15:12 in early August</title>
		<link>http://mattt.me/2009/03/prayer-from-the-sf-bound-caltrain-at-1512-in-early-august/</link>
		<comments>http://mattt.me/2009/03/prayer-from-the-sf-bound-caltrain-at-1512-in-early-august/#comments</comments>
		<pubDate>Sat, 14 Mar 2009 00:45:54 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Philosophy]]></category>

		<category><![CDATA[prayer california summer august caltrain ghosts voyeurism]]></category>

		<guid isPermaLink="false">http://matttthompson.com/?p=255</guid>
		<description><![CDATA[<br/>Riding on the Caltrain enumerates the untraveled possibilities of my former voyeurism.]]></description>
			<content:encoded><![CDATA[<br/><p>There&#8217;s a sort of listlessness when you exist between lives. I guess you can only live life in one of two states: content with eternity, or bracing for a change that sweeps over you like a lazy, salty tide. You can talk to permanent fixtures of the universe—champions of their own unique set of mannerisms &#38; affectations, or if you&#8217;re unlucky (as I am) you&#8217;re talking to ghosts, just waiting for the last anything (everything).</p>
<hr/>
<p>Perhaps it&#8217;s the presence of disorientation that allows me to explore. I wonder how different that really makes me, anyway. The weeks build upon each other, and the sins of monotony, of convenience, of routine, become unbearable temptations. The air ceases to carry that unfamiliar electricity.<br />
The roads cease to branch<br />
It&#8217;s a game of how long you can pretend to embrace the frightening beauty of chance,</p>
<p>Riding on the Caltrain enumerates the untraveled possibilities of my former voyeurism.</p>
<p>Questions of &#8220;what if&#8221; replaced by &#8220;why not&#8221;. Yet their vapor trails cast a shadow of phony, constructed illusions. Of what it was actually like to toss caution to the wind and venture to the Hillsdale stop and visit the racetrack. These un-lived carcasses of imagination hurt the most. As if their vacuous lies actualize their emptiness deep in your gut. It teases you with the prospect of making up for missed time. What a sorry trap.</p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2009/03/prayer-from-the-sf-bound-caltrain-at-1512-in-early-august/feed/</wfw:commentRss>
		</item>
		<item>
		<title>将来 - In Which I Talk About My New Life In Japan</title>
		<link>http://mattt.me/2009/03/in-which-i-talk-about-my-new-life-in-japan/</link>
		<comments>http://mattt.me/2009/03/in-which-i-talk-about-my-new-life-in-japan/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 10:26:04 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Philosophy]]></category>

		<category><![CDATA[Cerego]]></category>

		<category><![CDATA[Future]]></category>

		<category><![CDATA[iKnow!]]></category>

		<category><![CDATA[Shibuya]]></category>

		<category><![CDATA[smart.fm]]></category>

		<category><![CDATA[Tokyo]]></category>

		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://matttthompson.com/?p=246</guid>
		<description><![CDATA[<br/><p>June 1st marks the beginning of the next big chapter in my life. Just 15 days after graduation, I&#8217;ll officially begin work with Cerego, in the heart of <a href="http://en.wikipedia.org/wiki/Shibuya,_Tokyo">Shibuya, Tokyo</a>.</p>]]></description>
			<content:encoded><![CDATA[<br/><p>June 1st marks the beginning of the next big chapter in my life. Just 15 days after graduation, I&#8217;ll officially begin work with Cerego, in the heart of <a href="http://en.wikipedia.org/wiki/Shibuya,_Tokyo">Shibuya, Tokyo</a>. Cerego just yesterday launched a major brand and site overhaul with <a href="http://smart.fm">smart.fm</a>, the premiere learning resource on the internets. (As it were, I held off on an official post like this until the redesign hit, if nothing else than to avoid confusion).</p>
<p>Although I expected to land somewhere in the bay area, my new digs in Tokyo felt like it was destined from the start. I mean, the job posting advertised for a <a href="http://matttthompson.com/work/">Rails developer</a> with <a href="http://matttthompson.com/2008/10/discovering-geoplanet/">hacker aspirations</a> to work on a product that was <a href="http://matttthompson.com/2009/01/the-magical-tale-of-my-computational-poetry-thesis-first-stanza/">rooted in linguistics</a>. And as if that wasn&#8217;t enough, the offices were in Shibuya, which not a few hours earlier, I had looked up on Wikipedia to satisfy my curiosity after playing <a href="http://en.wikipedia.org/wiki/The_World_Ends_With_You"><em>The World Ends With You</em></a>, a videogame set in a virtual rendition of Shibuya. On my first visit, this would prove to be surprisingly useful: I can&#8217;t describe how weird it was to think &#8220;Okay, here&#8217;s that <a href="http://en.wikipedia.org/wiki/File:Shibuya_Moyai.jpg">Moyai</a> head, so that means <a href="http://en.wikipedia.org/wiki/File:Shibuya_night.jpg">Scramble Crossing</a> and <a href="http://en.wikipedia.org/wiki/Hachik">Hachikō</a>ō are coming up&#8221; and actually be right. Thanks Square-Enix!</p>
<p>One of the first things people ask when I tell them about my new job is, <em>&#8220;Do you speak Japanese?&#8221;</em></p>
<p>To this, I usually respond with a combination of furtive glances and an awkward smile, speaking to the fact that I, in fact, cannot speak Japanese, as well as my understanding that this is not exactly ideal for someone about to live in Japan. I could be worse off, though. I do, after all, study Linguistics and I&#8217;ll be working for a company <em>that teaches Japanese</em>. Nonetheless, there&#8217;s still a part of me that regrets my decision against taking Japanese in high school, because it was too <a href="http://en.wikipedia.org/wiki/Otaku">オタク</a> for my tastes.</p>
<p>Moving to Tokyo involves packing up everything I own into a couple suitcases and leaving everything else behind. To be honest, the whole process has this eerie religious undertone to it: selling all of my earthly possessions, making amends with friends and family, and whatnot.</p>
<p>I have an entire bucket list of things to do before I leave, including an epic midnight bike tour of all of the places I&#8217;ve ever lived—retracing fragments of South Fayette and exploring uncharted areas around Oakland. A sad consequence of this preparation are the empty checkboxes next to the names of all of my friends and family, placed there with the full understanding that with each check, I prepare myself for the possibility of that being the last time I ever see them again. And worse, leaving here means leaving behind <a href="http://flickr.com/photos/matttthompson/3305286564/in/set-72157614279186659/">someone very special</a>, at least for a while. At moments, I can&#8217;t help but feel frozen in time, in the eternal now of self-reflection.</p>
<p>At heart, I&#8217;m a sort of romantic fatalist: things will happen as they will—no matter what—and it usually turns out alright. How wonderful it is to be a part of something so amazing. &lt;/waxing-philosophic&gt;</p>
<p>June 1st marks the first day of my new life, and I couldn&#8217;t be more excited! This is the opportunity of a lifetime, and I&#8217;m ready to start kicking some ass. So to all my future colleagues in Team smart.fm: I&#8217;ll see you soon.<br />
And to all of my friends: let&#8217;s go out for a drink.</p>
<p>- マタタ</p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2009/03/in-which-i-talk-about-my-new-life-in-japan/feed/</wfw:commentRss>
		</item>
		<item>
		<title>What Can &#8220;Left 4 Dead&#8221; Teach Us About The Social Web?</title>
		<link>http://mattt.me/2009/02/what-can-left-4-dead-teach-us-about-the-social-web/</link>
		<comments>http://mattt.me/2009/02/what-can-left-4-dead-teach-us-about-the-social-web/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 21:43:34 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Aesthetics]]></category>

		<category><![CDATA[Achievements]]></category>

		<category><![CDATA[Development]]></category>

		<category><![CDATA[Facebook]]></category>

		<category><![CDATA[Gameplay]]></category>

		<category><![CDATA[Last.fm]]></category>

		<category><![CDATA[Left 4 Dead]]></category>

		<category><![CDATA[microformats]]></category>

		<category><![CDATA[Social Web]]></category>

		<category><![CDATA[Steam]]></category>

		<category><![CDATA[Valve]]></category>

		<category><![CDATA[Videogames]]></category>

		<category><![CDATA[XBox Live]]></category>

		<category><![CDATA[YouTube]]></category>

		<category><![CDATA[Zombies]]></category>

		<guid isPermaLink="false">http://matttthompson.com/?p=226</guid>
		<description><![CDATA[<br/>Valve's implementation of achievements in Left 4 Dead demonstrate 4 primary uses of the achievement framework: to be Instructive, to be Prescriptive, to be Demarcative, and to act as Incentive. Looking at how achievements shape the gameplay experience, there's a lot that can be applied in the context of social web applications, too.]]></description>
			<content:encoded><![CDATA[<br/><p>Whether it&#8217;s <a href="http://half-life2.com/">Half Life</a>, <a href="http://tf2.com/">Team Fortress 2</a>, <a href="http://www.aperturescience.com/">Portal</a>, or, most recently, <a href="http://l4d.com/">Left 4 Dead</a>, <a href="http://valvesoftware.com/">Valve</a> has an attention to detail that is unsurpassed among game developers. If it wasn&#8217;t for their commitment to opening up their development process, such as through their brilliantly-conceived in-game developer commentary, I&#8217;d have no recourse but to conclude that these games were delivered on high from <a href="http://www.venganza.org/">His Noodley Goodness</a>.</p>
<p>Thankfully, their efforts have not gone unnoticed, given their commercial success as well as strong critical acclaim from game journalists and bloggers alike. Since the release of Left 4 Dead in November 2008, there&#8217;s been an steady stream of articles about the subtle touches that made for a such a unique gameplay experience. One particularly awesome piece by <a href="http://www.offworld.com/2008/12/why-left-4-dead-has-the-best-t.html">John Brownlee</a> details how the 5 minute intro video communicates all of the important gameplay dynamics without the player even noticing. Brilliant.</p>
<p>Reading this article got me thinking about what good ideas more conventional software developers could absorb from Valve. What I found particularly intriguing was <abbr title="Left 4 Dead"><span class="caps">L4D</span></abbr>&#8217;s achievement system as a way to explore its potential in the context of the social web.</p>
<p>Mind you, achievement systems are not particularly novel. Perhaps the most ubiquitous example is <a href="http://www.xbox.com/en-US/live/">XBox Live</a>, wherein players unlock achievements by meeting conditions in a particular game, thereby earning trophy icons and Gamerscore points. These accomplishments are usually along the lines of &#8220;complete the game on hard difficulty&#8221; or &#8220;score 100,000 points&#8221;. Valve&#8217;s implementation (viz <a href="http://steampowered.com/">Steam</a>) in particular, though, is the first to really use achievements effectively.</p>
<p>In particular, I&#8217;ve identified 4 primary uses of the achievement framework: to be <strong>Instructive</strong>, to be <strong>Prescriptive</strong>, to be <strong>Demarcative</strong>, and to act as <strong>Incentive</strong>. For each of these, I&#8217;ll explore a canonical example from the <a href="http://www.steampowered.com/status/l4d/">Left 4 Dead achievements</a>, and tie it all together with <a href="http://microformats.org/">microformats</a>. Yes, <a href="http://microformats.org/">microformats</a>. Excited yet? Just so you know, <em>there&#8217;s an achievement to earn by getting to the end of this article</em>.</p>
<h2>Left 4 Uses of Achievements</h2>
<h3>Instructive</h3>
<p>All <abbr title="first-person shooters"><span class="caps">FPS</span></abbr>&#8217;s are pretty much the same on the surface:<br />
W-A-S-D, Mouse to look and aim, Click to shoot, R to reload, Numbers for weapons, Space to jump.<br />
Play one and you&#8217;ve played them all.</p>
<p>This may not be a bad thing in itself, but it does present some design issues. For instance, how do you tell players about something new? No one reads instruction manuals, complex controller maps on loading screen are obnoxious, and in-game tutorials are <em>really</em> awkward in a story&#8217;s context (&#8220;Wow, an upgrade! Now I can press B to fire missiles!&#8221;)</p>
<p>One such hidden ability is that you can instantly kill an infected by sneaking up and melee-attacking them from behind. As you might expect, melee-ing an enemy from behind isn&#8217;t a very standard idiom. Not like a Head Shot, at least. So how did I learn to do that? Well, there just so happens to be an accomplishment called &#8220;Spinal Tap&#8221;, which describes this exact situation.</p>
<p>	<img src="http://matttthompson.com/wp-content/uploads/2009/02/l4d-spinal-tap.png" alt="Left 4 Dead - Spinal Tap" title="Left 4 Dead - Spinal Tap" width="430" height="99" class="alignnone size-full wp-image-230" /></p>
<p>As obscure as this might seem, buried in an achievements list and whatnot, <a href="http://www.steampowered.com/status/l4d/">according to Valve&#8217;s stat tracking</a> at the time of this writing, over 60% of users have discovered this on their own, perhaps many of them because of this being an accomplishment.</p>
<p>Achievements like &#8220;Spinal Tap&#8221; promote exploration by creating an invitation for users to try new things. By learning just this one new thing, a user will be more compelled to step out of their common habits to discover something new for themselves.</p>
<h3>Prescriptive</h3>
<p>What separates Left 4 Dead from pretty much any other multiplayer game is the intense focus on small-group cooperation. Valve took a huge risk with this too: if it hadn&#8217;t nailed that game dynamic, the whole game would have failed. As the central design philosophy for the game, everything comes back to cooperation in Left 4 Dead. Pull a <a href="http://www.youtube.com/watch?v=LkCNJRfSZBU">Leeroy Jenkins</a> and fight the horde on your own, and don&#8217;t be surprised when a hunter starts feasting on your innards.</p>
<p>So consider another achievement in Left 4 Dead: </p>
<p><img src="http://matttthompson.com/wp-content/uploads/2009/02/l4d-dead-giveaway.png" alt="Left 4 Dead - Dead Giveaway" title="Left 4 Dead - Dead Giveaway" width="430" height="120" class="alignnone size-full wp-image-231" /></p>
<p>When you&#8217;ven been rattled by zombies to the point of near-collapse, it&#8217;s difficult to even consider healing someone else before you. However, achievements such as &#8220;Dead Giveaway&#8221; exists to prescribe such selfless actions in order to reward cooperation and cohesion within the group. Subtle rewards like this stress the importance of teamwork and empathy—just as Valve had in mind.</p>
<h3>Demarcative</h3>
<p>A core facet of our human nature is the importance of understanding one&#8217;s place in the world. For platformer and adventure games, like Super Mario World, the world map provides a sense of the vastness of the game, and your progress through it. RPGs use highly-developed plot in conjunction with leveling systems to contrast how far you&#8217;ve come since the beginning of the game. Puzzle games taunt you with high-scores.</p>
<p>Left 4 Dead, if you didn&#8217;t have achievements, wouldn&#8217;t have a strong sense of place on its own. You could spend hundreds of hours blasting through each campaign, and be right back where you started.</p>
<p>Of course, this isn&#8217;t the case.</p>
<p><img src="http://matttthompson.com/wp-content/uploads/2009/02/l4d-toll-collector.png" alt="Left 4 Dead - Toll Collector" title="Left 4 Dead - Toll Collector" width="430" height="99" class="alignnone size-full wp-image-232" /></p>
<p>A strong cast of player achievements serve as a permanent record of where your time has gone, and how far your accomplishments reach. You get an achievement for playing through any of the campaigns once, like &#8220;Toll Collector&#8221; for completing the Death Toll campaign. You get one for beating them on expert too. Even though you spent hours needlessly earning each of them, when you certainly had better things to be doing, at least you have nothing to show for it.</p>
<h3>Incentive</h3>
<p>One thing is for sure, given fads and trends that pop in and out of existence: people <em>love</em> to collect shit.</p>
<p>The whole concept of an achievements system is based upon this core premise. Present a player with an empty trophy case, and they&#8217;ll spend hours upon hours scouring the game world to fill it up. A game might only last a few hours, but the meta-game is, or can be, eternal.</p>
<p>	<img src="http://matttthompson.com/wp-content/uploads/2009/02/l4d-zombie-genocidest.png" alt="Left 4 Dead - Zombie Genocidest" title="Left 4 Dead - Zombie Genocidest" width="430" height="99" class="alignnone size-full wp-image-233" /></p>
<p>Want to earn all of the achievements in Left 4 Dead? You&#8217;ll have to kill 53,595 infected first. To put that in perspective, I average a couple hundred on a normal campaign, each of which takes about an hour. For the average player, this accomplishment will might take 100 hours to complete. What&#8217;s amazing is that about 3% players have done it. That&#8217;s some dedication.</p>
<h2>Left 4 Relevance?</h2>
<p>So to recap, here&#8217;s what Valve&#8217;s achievement system does:</p>
<ul>
<li>It encourages players more likely to explore and discover (&#8220;Spinal Tap&#8221;)</li>
<li>It instructs players on the right way to do things (&#8220;Dead Giveaway&#8221;)</li>
<li>It provides players a sense of place and accomplishment (&#8220;Toll Collector&#8221;)</li>
<li>It challenges players to invest more time in the game (&#8220;Zombie Genocidest&#8221;)</li>
</ul>
<p>This is <em>exactly</em> what you want users to be doing. Not only is are achievements effective, but there&#8217;s very little technical overhead at all. So long as some real time is put into thinking about how you want to encourage users, the only other thing you need are some delicious icons and witty titles. For a fantastic write-up about using these in a web context, check out the <a href="http://developer.yahoo.com/ypatterns/pattern.php?pattern=achievements">Yahoo! Reputation Design Pattern Library</a>.</p>
<h3>Web 4.0 Achievements</h3>
<p>Putting things into context, imagine if popular sites implemented their own achievement system:</p>
<p><img src="http://matttthompson.com/wp-content/uploads/2009/02/lastfm-achievement.png" alt="Last.fm Achievement" title="Last.fm Achievement" width="430" height="99" class="alignnone size-full wp-image-235" /></p>
<p><br/></p>
<p><img src="http://matttthompson.com/wp-content/uploads/2009/02/facebook-achievement.png" alt="Facebook Achievement" title="Facebook Achievement" width="430" height="120" class="alignnone size-full wp-image-236" /></p>
<p><br/></p>
<p><img src="http://matttthompson.com/wp-content/uploads/2009/02/youtube-achievement.png" alt="YouTube Achievement" title="YouTube Achievement" width="430" height="120" class="alignnone size-full wp-image-237" /></p>
<h3>microformats 4 the win</h3>
<p>Just Blue Sky Solutioneering™ here, but a portable achievement network like XBox Live or Steam on the web would be pretty sweet. Call it a spiritual successor to those vBulliten-era forum rankings and titles.</p>
<p>To help you get started, here&#8217;s a first conceptualization of a microformat spec that I&#8217;ll be <a href="http://microformats.org/wiki/process">pursuing in the near future</a>. For now, let&#8217;s just call it hAchievement:</p>
<pre>
<code>
&lt;div id=&quot;blogdor&quot; class=&quot;achievement&quot;&gt;
  &lt;img src=&quot;images/trophy.png&quot; class=&quot;icon&quot; width=&quot;60&quot; height=&quot;60&quot;/&gt;
  &lt;h1 class=&quot;title&quot;&gt;Blogdor, the Wordenator!&lt;/h1&gt;
  &lt;p class=&quot;description&quot;&gt;You read this blog post. Gratz!&lt;/p&gt;
&lt;/div&gt;
</code>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2009/02/what-can-left-4-dead-teach-us-about-the-social-web/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Second Stanza: Of Phones and Phonemes</title>
		<link>http://mattt.me/2009/01/second-stanza-of-phones-and-phonemes/</link>
		<comments>http://mattt.me/2009/01/second-stanza-of-phones-and-phonemes/#comments</comments>
		<pubDate>Mon, 19 Jan 2009 20:19:03 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Linguistics]]></category>

		<category><![CDATA[Feature Analysis]]></category>

		<category><![CDATA[IPA]]></category>

		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[NLP]]></category>

		<category><![CDATA[Phonetics]]></category>

		<category><![CDATA[Phonology]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[Thesis]]></category>

		<category><![CDATA[Zellig Harris]]></category>

		<guid isPermaLink="false">http://matttthompson.com/?p=220</guid>
		<description><![CDATA[<br/>That the creative processes of all writers—poets, novelists, academics, and the like—are completely hidden, is what makes <span class="caps">NLP</span> so frustrating. Such underdetermination is the reason why <a href="http://www.xkcd.org/114/"><span class="caps">XKCD</span> can (justifiably) dish beeves upon computational linguists with such pizazz</a>. There&#8217;s just no way to know what the hell is going on underneath the hood with human language, and all we have to go on is what comes out on the other side.]]></description>
			<content:encoded><![CDATA[<br/><p><img src="http://matttthompson.com/wp-content/uploads/2009/01/zellig-horsis.jpg" alt="Zellig Horsis" title="Zellig Horsis" width="430" height="200" class="alignnone size-full wp-image-224" /></p>
<p>That the creative processes of all writers—poets, novelists, academics, and the like—are completely hidden, is what makes <span class="caps">NLP</span> so frustrating. Such underdetermination is the reason why <a href="http://www.xkcd.org/114/"><span class="caps">XKCD</span> can (justifiably) dish beeves upon computational linguists with such pizazz</a>. There&#8217;s just no way to know what the hell is going on underneath the hood with human language, and all we have to go on is what comes out on the other side.</p>
<p>On that note, my Plan B for this project is a magical horse named <a href="http://en.wikipedia.org/wiki/Zellig_Harris">&#8220;Zellig Horsis&#8221;</a>. Give him any subject matter, anything at all, and that thoroughbred synthesized lyrical genius will tap a Pulitzer-winning poem in morse code for you. Put peanut butter under his lips, and you can even imagine he&#8217;s <em>actually</em> saying it!</p>
<p>Horses aside, with all of the million ways I could approach computational poetry, my inner-linguist compels me to seriously consider my formal training. My roots. &#8220;Consult the <a href="http://en.wikipedia.org/wiki/Jan_Niecisław_Baudouin_de_Courtenay">Kazan School</a>, my son&#8221; suggests my inner-voice, sounding suspiciously like Jeff Goldblum.</p>
<h2>Two Things I Learned in Phonology</h2>
<h3>Feature Analysis of Consonants</h3>
<p>One of the great linguistic traditions is the <a href="http://en.wikipedia.org/wiki/Prague_Linguistic_Circle">Prague Linguistics Circle</a> from the 1930&#8217;s. Among their many contributions was Feature Analysis, an entirely different way to understand phonetic inventories. It did so by looking <em>inside</em> the phonemes themselves; breaking through the seeming atomicity of phonemes to understand them as bundles of descriptive features.</p>
<p>For instance, consider the phoneme <strong>[d]</strong>, as in <duck>:</p>
<table>
<tr>
<th>Articulatory Phonetics</th>
<td>Voiced Dental or Alveolar Plosive</td>
</tr>
<tr>
<th>Feature Analysis</th>
<td>[+Consonantal, -Vocalic, +Voicing, -Continuant, -Strident, -Nasal, -Tenseness, -Rounding]</td>
</tr>
</table>
<p>Although the familiar articulatory perspective is more concise, feature analysis has the ability to take any two sounds and describe how they differ in much finer granularity. By breaking down phonetic strings into these features, I could construct a much more complex machine learning strategy. For instance, it could computationally determine the efficacy of sounds coming together inside words to compute a sort of poetic &#8220;score&#8221;.</p>
<p>Much of the delight in poetry comes from the delicious way sounds crash and coalesce to form a unique identity. Poetry, after all, is to be enjoyed out loud; the layering of semantic and prosodic and phonetic imagery is the essence and ultimately the mystique of poetry.</p>
<h3>Articulation of Vowels</h3>
<p>Vowels, as you might expect, are quite a bit different from consonants. Whereas consonants have a more distinct point of articulation (whether bilabial or dental or velar or uvular, placement variation doesn&#8217;t matter <em>too</em> much within that location), vowels are quite a bit harder to pin down. With continuous airflow through your vocal tract, you become a musical instrument of sorts. That is, the shape of your mouth changes what frequencies are generated and how it sounds.</p>
<p>If you ever took an undergraduate class in Linguistics, you&#8217;ve probably seen the infamous &#8220;tongue video&#8221;. It&#8217;s rough, but it does a good job of showing just how the tongue affects the shape of the oral tract, and how that corresponds to each phoneme:</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/BH4D9g6D5kY&#38;hl=en&#38;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/BH4D9g6D5kY&#38;hl=en&#38;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p>Thing is, between languages like <a href="http://en.wikipedia.org/wiki/Hungarian_phonology">Hungarian</a>—which has 14 distinct vowels—and the combination of neighboring consonants, which color a vowel, there are a lot of possible sounds for each &#8220;vowel&#8221;. That&#8217;s when I got this completely random insight: what if I used the same geometric algorithm to calculate vowel proximity that I would use to <a href="http://votermap.us/">calculate cartographic entities</a>? Since I&#8217;m already using MySQL, why not add a spatial column to map the geometry of each word? It might be just crazy enough to work.</p>
<h2>Grasping at Straws</h2>
<p>Where either of these approaches gets me remains to be seen. Like most things with <span class="caps">NLP</span>, it&#8217;s a crap shoot until you actually try it.</p>
<p>In the meantime, I&#8217;ve had fun writing Ruby glue code to pretty-print <span class="caps">IPA</span>. My next step is to implement a formal subclass or maybe independent analog of the String class that stores <span class="caps">IPA</span> strings as an array of phonemes, which each with their own feature bundle definition. Yes, it&#8217;s nerdy, but damn is Ruby meta-programming fun.</p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2009/01/second-stanza-of-phones-and-phonemes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Magical Tale of My Computational Poetry Thesis, First Stanza</title>
		<link>http://mattt.me/2009/01/the-magical-tale-of-my-computational-poetry-thesis-first-stanza/</link>
		<comments>http://mattt.me/2009/01/the-magical-tale-of-my-computational-poetry-thesis-first-stanza/#comments</comments>
		<pubDate>Sun, 11 Jan 2009 17:39:56 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Linguistics]]></category>

		<category><![CDATA[Keats]]></category>

		<category><![CDATA[Markov]]></category>

		<category><![CDATA[NLP]]></category>

		<category><![CDATA[Phonology]]></category>

		<category><![CDATA[Poetry]]></category>

		<category><![CDATA[Thesis]]></category>

		<guid isPermaLink="false">http://matttthompson.com/?p=200</guid>
		<description><![CDATA[<br/>In order to complete my BA Linguistics, I have to write a Thesis. My goal for this project is to develop a programmatic module that, given a subject — be it love, Paris, or Heisenberg&#8217;s Uncertainty Principle—can produce a valid (and ideally tear-jerking or awe-inspiring) poem in the forms of Haiku, Limerick, and Fib.]]></description>
			<content:encoded><![CDATA[<br/><p>In order to complete my BA Linguistics, I have to write a Thesis. But not on just anything. No no. I had to come up with a topic that met some level of marginal approval from my advisor, Professor Mandy Simons, a sweet but daunting woman of ~5&#8217;2&#8221; with a bespectacled glare and a curious, nearly-British accent that escapes all notions of placement like a magical knot that becomes tighter when you try to untie it.</p>
<p>Because OT field research on Cherokee wasn&#8217;t going to cut it, I had to soul-search for a topic whose premise would not ostensibly get me thrown out a window.</p>
<hr/>
<p>What I settled on was a combination of my favorite parts of linguistics: probabilistic models and phonology.</p>
<p>You see, what first got me intensely interested in linguistics was <a href="http://en.wikipedia.org/wiki/Markov_chain">Markov Chains</a>. It&#8217;s crazy that such a simple mechanism can produce something that has all of the great taste of lexical value, but with none of the calories! A few months after I first discovered them, <a href="http://loremipscream.com/">Lorem Ipscream</a> was born, and the world rejoiced at it&#8217;s creamy goodness. A <a href="http://flolcatr.com/">furrier project</a> of the same Markovian fervor was born a few months later. That, alas, was an insurmountably bad idea.</p>
<p>These days, I&#8217;ve been on quite the phonology binge. Ask any of my friends.<br />
For instance, my girlfriend has refused to let me practice my voiced uvular trills, despite my well-argued point that it&#8217;s a fun noise to make.</p>
<p>Anyway, combine the two, and you get my thesis project, which I&#8217;ve come to call <em>Keats</em>.<br />
Just as you might expect, I chose to honor <a href="http://en.wikipedia.org/wiki/John_Keats">the great poet</a> purely to exude an image of sophistication.<br />
Never read a lick of him in my life, to be honest.</p>
<h2>Thesis Abstract, would I were stedfast as thou art</h2>
<p>My goal for this project is to develop a programmatic module that, given a subject—be it love, Paris, or Heisenberg&#8217;s Uncertainty Principle—can produce a valid (and ideally tear-jerking or awe-inspiring) poem in the forms of Haiku, Limerick, and Fib.</p>
<p>These three chosen forms represent three distinct problem spaces, as well as three very different opportunities to investigate the essence of poetic form.</p>
<h3>Haiku</h3>
<blockquote><p>
  Haikus are easy<br/><br />
  But sometimes they don&#8217;t make sense<br/><br />
  Refrigerator<br/><br />
  <cite><a href="http://www.typetees.com/product/623/Haikus_are_easy_but_sometimes_they_don_t?=">Threadless T-Shirt</a></cite>
</p></blockquote>
<p><em>5/7/5</em>. Anybody who&#8217;s anybody has written a <a href="http://en.wikipedia.org/wiki/Haiku">Haiku</a> before. What could be simpler?<br />
Without any constraints on rhyme or syntax—just the right meter—Haiku are both the easiest to implement, but hardest to get right. What is it about a Haiku that makes it so great? Is it all in the content of simple, but powerful words in sequence, or is there a hidden prosody that escapes normal conscious detection?</p>
<h3>Limerick</h3>
<blockquote><p>
  There once was a man named Bertold<br/><br />
  Who drank beer when the weather grew cold<br/><br />
  As he reached for his cup&#8230;<br/><br />
  &#8220;NEEEEVER <span class="caps">GONNA GIVE YOU UP</span>!!!&#8221;<br/><br />
  Oh, snap! You just got limerickrolled!<br/><br />
  <cite><a href="http://limerickdb.com/?383">Limerick DB #383</a></cite>
</p></blockquote>
<p>Ah, the lyric form of the Everyman. Filled to the brim with innuendo and wit, it just wouldn&#8217;t be any fun to do a project without <a href="http://en.wikipedia.org/wiki/Limerick_(poetry)">Limericks</a>.</p>
<p>As luck would have it, Limericks have a pleasant balance of meter and rhyming constraints to make the problem of weaving sultry narratives interesting, while narrowing the problem into something bite-sized and manageable. Already, I have a sense that this may prove to be a harsh battleground between the forces of linguistic-based models and statistical, machine learning models.</p>
<h3>Fib</h3>
<blockquote><p>
  One<br/><br />
  Small,<br/><br />
  Precise,<br/><br />
  Poetic,<br/><br />
  Spiraling mixture:<br/><br />
  Math plus poetry yields the Fib.<br/><br />
  <cite><a href="http://gottabook.blogspot.com/2006/04/fib.html">Pincus, Gregory K.</a></cite>
</p></blockquote>
<p>And finally, the wildcard: Fibonacci-metered poems—known by the poets on the ins as, simply, &#8220;<a hre="http://en.wikipedia.org/wiki/Fib_(poetry)">Fib</a>&#8221;. Forged in the crucible of rebellion against the scourge of free-verse poetry in the 1990&#8217;s, this postmodern construct provides much-needed structure to the syntax-starved poetry slammers while maintaining an open-endedness and irony that resembles Germany&#8217;s inexplicable lust for all things cowboys and <a href="http://www.youtube.com/watch?v=QUHomRLop7I">David Hasselhoff</a>.</p>
<p>Like Haiku, meter—not rhyme—is enforced. However, the number of syllables per line is dictated by <a href="http://en.wikipedia.org/wiki/Fibonacci_sequence#Origins">an expression of the number of rabbit pairs per generation over time</a>. Aside from <a href="http://en.wikipedia.org/wiki/Fibonacci_sequence#Fibonacci_numbers_in_nature">showing up everywhere in nature</a>, the imagery of the two previous lines combining to form the next is quite, well, poetic.</p>
<p>As a theoretically open-ended form (although conventional Fib poets stop at line six), it also presents the challenge of producing the longest possible poem. Line 20, for example, would require 6765 syllables, which is the just about the length of a <span class="caps">SAT</span> writing sample. Clearly, things are going to get pretty freaky if I leave this running overnight.</p>
<hr/>
<p>So there you have it. The beginning to my semester-long quest to uncover the secret of this timeless form of expression. For posterity, and as a demonstrative means of not putting everything off until the last minute, I&#8217;ll be posting updates as the project develops.</p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2009/01/the-magical-tale-of-my-computational-poetry-thesis-first-stanza/feed/</wfw:commentRss>
		</item>
		<item>
		<title>10,000 Resolutions</title>
		<link>http://mattt.me/2009/01/10000-resolutions/</link>
		<comments>http://mattt.me/2009/01/10000-resolutions/#comments</comments>
		<pubDate>Thu, 01 Jan 2009 03:43:38 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Philosophy]]></category>

		<category><![CDATA[10000 hours]]></category>

		<category><![CDATA[gtd]]></category>

		<category><![CDATA[malcolm gladwell]]></category>

		<category><![CDATA[new year's]]></category>

		<category><![CDATA[outliers]]></category>

		<category><![CDATA[resolution]]></category>

		<guid isPermaLink="false">http://matttthompson.com/?p=185</guid>
		<description><![CDATA[<br/>Every January 1st, as is the custom for millions of Americans, we enter into a collective delusion to commit ourselves to vague truisms that we already know to be good for us. This time around, I'm ditching resolutions for simple accounting.]]></description>
			<content:encoded><![CDATA[<br/><p><strong>Resolutions, come to think of it, are rather silly.</strong></p>
<p>Every January 1st, as is the custom for millions of Americans, we enter into a collective delusion to commit ourselves to vague truisms that we already know to be good for us.</p>
<ul>
<li>Read more.</li>
<li>Eat healthy.</li>
<li>Work out.</li>
<li>Don&#8217;t procrastinate.</li>
<li>Be a better person.</li>
</ul>
<p>Well, duh.</p>
<p>This time around, I&#8217;m tired of setting myself up for failure.<br/><br />
This time around, I&#8217;m ditching resolutions for simple accounting.</p>
<h2>Life is like World of Warcraft&#8212;It all comes down to <a href="http://en.wikipedia.org/wiki/Grind_(gaming)">grinding</a>.</h2>
<p>Among the books I&#8217;ve had the chance to finally enjoy over the holiday was <a href="http://www.amazon.com/gp/product/0316017922?ie=UTF8&#38;tag=mattthom-20&#38;linkCode=as2&#38;camp=1789&#38;creative=390957&#38;creativeASIN=0316017922">Malcolm Gladwell&#8217;s &#8220;Outliers&#8221;</a>. One of the most striking ideas in the book is <a href="http://www.youtube.com/watch?v=Hz4hPbHIZ6Y">&#8220;The 10,000 Hour Rule&#8221;</a>. Simply stated, it takes about 10,000 hours for the human mind to fully assimilate a skill to the point of mastery.</p>
<p>It&#8217;s an incredibly empowering sentiment: provided that you meet some minimal intelligence or talent requirements (chances are, you&#8217;re fine), it&#8217;s conceivable that the old adage, &#8220;You can do anything you put your mind to&#8221;, will come to pass. Even if you don&#8217;t completely buy into this magical number, 10,000 hours is a long ass time; if not <em>mastery</em> then, hell, 10,000 hours certainly couldn&#8217;t hurt.</p>
<h2>Rather be working for a paycheck, then waiting to win the lottery.</h2>
<p>Consider this excerpt from the book <a href="http://www.amazon.com/gp/product/0961454733?ie=UTF8&#38;tag=mattthom-20&#38;linkCode=as2&#38;camp=1789&#38;creative=390957&#38;creativeASIN=0961454733">Art &#38; Fear</a> (<a href="http://www.codinghorror.com/blog/archives/001160.html">via Coding Horror</a>):</p>
<blockquote><p>The ceramics teacher announced on opening day that he was dividing the class into two groups. All those on the left side of the studio, he said, would be graded solely on the quantity of work they produced, all those on the right solely on its quality. His procedure was simple: on the final day of class he would bring in his bathroom scales and weigh the work of the &#8220;quantity&#8221; group: fifty pound of pots rated an &#8220;A&#8221;, forty pounds a &#8220;B&#8221;, and so on. Those being graded on &#8220;quality&#8221;, however, needed to produce only one pot &#8211; albeit a perfect one &#8211; to get an &#8220;A&#8221;.</p>
<p>Well, came grading time and a curious fact emerged: <strong>the works of highest quality were all produced by the group being graded for quantity</strong>. It seems that while the &#8220;quantity&#8221; group was busily churning out piles of work &#8211; and learning from their mistakes &#8211; the &#8220;quality&#8221; group had sat theorizing about perfection, and in the end had little more to show for their efforts than grandiose theories and a pile of dead clay.</p></blockquote>
<p>For all that we stress about in our creative processes, it all boils down to the simple tautology&#8212;that the only way to get better at something is to <em>do it</em>. Yes, a lot of it&#8217;s going to suck. Yes, you&#8217;re going to hate when things don&#8217;t turn out right. Just learn to get over it. And for god&#8217;s sake, don&#8217;t get embarrassed about it. You&#8217;ve got 10,000 hours to get it right. Don&#8217;t worry about getting it wrong a couple times.</p>
<p>Underneath every brilliant work, there was a lot of sweat, love, and determination to get there. Figure out what you love, and start chipping away.</p>
<p>Happy New Year.</p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2009/01/10000-resolutions/feed/</wfw:commentRss>
		</item>
		<item>
		<title>I Want My MTV API!</title>
		<link>http://mattt.me/2008/11/i-want-my-mtv-api/</link>
		<comments>http://mattt.me/2008/11/i-want-my-mtv-api/#comments</comments>
		<pubDate>Sat, 15 Nov 2008 02:35:25 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[API]]></category>

		<category><![CDATA[MTV]]></category>

		<category><![CDATA[Music]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[Yahoo!]]></category>

		<guid isPermaLink="false">http://matttthompson.com/?p=142</guid>
		<description><![CDATA[<br/>MTV just released an API for their entire music video collection. How does it stack up against the reigning champion Yahoo! Music? Read on to find out...]]></description>
			<content:encoded><![CDATA[<br/><p>Just a few weeks back, I was in the middle of a rather spirited discussion about <span class="caps">MTV</span> and its fall from grace over the years.</p>
<p>&#8220;In the early days, it was all about the music&#8221;, I had reminisced (never mind the fact that it would be another 6 years until I was born when <span class="caps">MTV</span> first launched in 1981).</p>
<p>Over the decades, though, the old girl&#8217;s lost her edge. Now if you tune into channel 29 (around here, anyway), just pray you don&#8217;t stumble across any of <span class="caps">MTV</span>&#8217;s recent <em>reality programming</em>, like &#8220;Paris Hilton&#8217;s My New <span class="caps">BFF</span>&#8221;, &#8220;Sex &#8230; with Mom and Dad&#8221;, or <em><strong>shudder</strong></em> &#8220;My Super Sweet 16&#8221;. Even <span class="caps">MTV2</span>, the channel they spun off to get back to their music video roots, has turned into a kind of X Games-themed version of the original, dedicating huge blocks to reruns of &#8220;Pimp My Ride&#8221; and &#8220;Jackass&#8221;.</p>
<p>Perhaps realizing this themselves, the good folks over at Viacom recently launched <a href="http://www.mtvmusic.com/"><span class="caps">MTV</span> Music</a>, a website that offers untethered access to their entire music video collection. Overall, the site is a polished throwback to the early days of <span class="caps">MTV</span>, with all of the focus being put on the videos themselves.</p>
<p>They also released an <span class="caps">API</span>, which I&#8217;ve been playing with for a couple weeks.</p>
<h2>The Rundown</h2>
<table>
<thead>
<tr>
<th></th>
<th style="text-align:center; width:40%;"><img src="http://matttthompson.com/wp-content/uploads/2008/11/mtv-logo.png" alt="MTV Logo" title="MTV Logo" width="71" height="54"/></th>
<th style="text-align:center; width:40%"><img src="http://l.yimg.com/us.yimg.com/i/us/mus/hdr/ymusic_logo.png" width="127" height="54"</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Protocols</strong></td>
<td>REST</td>
<td>REST</td>
</tr>
<tr>
<td><strong>Formats</strong></td>
<td>mRSS, Atom</td>
<td>XML, JSON, RSS</td>
</tr>
<tr>
<td><strong>API Groups</strong></td>
<td>Artist, Genre, Video</td>
<td>Artist, Category, Image, Rating, Release, Station, Track, Video</td>
</tr>
<tr>
<td><strong>Dev Key Required?</strong></td>
<td>No</td>
<td>Yes</td>
</tr>
<tr>
<td><strong>Usage Limit</strong></td>
<td>&#8220;Reasonable Usage&#8221; <br/><em>(See Terms of Service)</em></td>
<td>5,000 reqs / day / App ID</td>
</tr>
<tr>
<td><strong>Number of Music Videos</strong></td>
<td>20886</td>
<td>47561</td>
</tbody>
</table>
<p>Just like the <span class="caps">MTV</span> Music site itself, its <span class="caps">API</span> is all about the music videos. So, unlike other APIs like Last.fm and Yahoo! Music, there&#8217;s just enough information about artists and genres to get you to the main attraction: <em>every music video <span class="caps">MTV</span> ever aired</em>. Certainly, that&#8217;s a compelling reason to check it out, but how does it stack up against Yahoo! Music, which also boasts a huge collection of music videos?</p>
<p>It turns out that Yahoo! Music has more than <em>double</em> the number of videos as <span class="caps">MTV</span> Music, which might come as a surprise, considering <span class="caps">MTV</span>&#8217;s synonymy with music videos. As for the rest of the chart, it&#8217;s clear that <span class="caps">MTV</span> and Yahoo! are geared for different purposes. So, to get a better idea about what the <span class="caps">MTV API</span> is all about, read on for a more detailed overview.</p>
<h2>Reading the Fine Print</h2>
<p>For developers out there who are interested in building on top of the MTV API, you should carefully read through the <a href="http://developer.mtvnservices.com/page/legal/terms_of_service">Terms of Service</a>. Here are two parts that are potentially deal-breakers:</p>
<blockquote style="font-size:75%;"><p>
  <tt>3.(f)	<strong>MTVN API Usage Quotas.</strong> MTVN may, in its sole discretion, restrict your use of the MTVN APIs at any time for any reason, including, without limitation, establishing quotas on the number of daily calls you may make from Your Website(s) to the MTVN APIs. Without limiting the generality of the foregoing, you may not use the MTVN APIs in any manner that exceeds reasonable request volume, constitutes excessive or abusive usage, or otherwise fails to comply or is inconsistent with the Specifications, all as determined by MTVN in its sole discretion. You shall not attempt to aggregate use of the MTVN APIs or representation of multiple MTVN API IDs, if applicable, for the purpose of circumventing any such usage quotas.</tt>
</p></blockquote>
<p>Usage quotas were an especially sore point for me in developing my Ruby library around the <span class="caps">API</span> (oh yes, there&#8217;s code at the end&#8230;funny how that seems to be the trend lately). While soft rate limits might sound good at first, a lack of agreed-upon rules up-front can lead to major awkwardness later. From my experience, <span class="caps">MTV</span> won&#8217;t get mad if you keep it below 1 request / second.</p>
<blockquote style="font-size:75%;"><p>
  <tt>3. (c)	<strong>Personal Use Only.</strong> Your access to and use of the MTVN APIs and MTVN API Content are limited for personal, non-commercial use only, which may include, without limitation, (i) use of the MTVN APIs to display MTVN API Content on Your Website(s) to the extent the same does not recreate or duplicate a material portion of any end user experience provided via any web sites or online programming service owned or controlled by MTVN or its affiliates and (ii) the sale or distribution of any device that provides access to or use of Your Website(s). You may not derive income from the use or provision of the MTVN APIs and/or MTVN API Content, whether for direct commercial or monetary gain or otherwise including, without limitation, income derived from the sale or access to the MTVN API Content or any advertising, sponsorships, promotions or any other content displayed, served or otherwise made available within or adjacent to the display of MTVN API Content via Your Website(s).</tt>
</p></blockquote>
<p>Limiting use to personal and non-commercial purposes means that you can&#8217;t do much beyond embedding videos on your blog&#8212;at least that&#8217;s my take. Even blogging might be going too far for the ToS if you have banner ads. Really, you might be better off just with YouTube. Throwing caution to the wind, I thought I&#8217;d add in a video that I had stuck in my head while writing this post:</p>
<p><embed allowFullScreen="true" allowScriptAccess="always" flashvars="autoPlay=false" height="366" src="http://media.mtvnservices.com/mgid:uma:video:api.mtvnservices.com:63105" type="application/x-shockwave-flash" width="448" /></p>
<h2>Assorted API Beef</h2>
<p>Beyond some of the bigger issues, there are some other minor quirks that you should know about the <span class="caps">API</span>. Once again, this is beta software, so this could all be fixed really soon. I&#8217;ve been in contact with the lead developer over there, and it seems that they&#8217;re working hard to push new releases to address these issues. In the meantime, though, here&#8217;s some random beef about the <span class="caps">API</span>:</p>
<dl>
<dt>Sparse Developer Resources</dt>
<dd>It might just be the page design, but something about <a href="http://developer.mtvnservices.com/">their developer site</a> just feels&#8230;empty. There&#8217;s about as much documentation about the API as needed, but it lacks an overall cohesiveness and vision of how it should be used. There are <a href="http://developer.mtvnservices.com/forum">message boards</a>, which are encouraged for requesting features and bug reports, but there&#8217;s not much incentive to use it. There&#8217;s a <a href="http://developer.mtvnservices.com/blog">blog</a>, which has the latest information about the API, but it only gets updated once a month. Despite all of this, I can&#8217;t help but thank developer Justin Tormey, for responding to my e-mails and answering questions on the message boards. Unfortunately, it looks like it&#8217;s all on him to take care of whiny developers like me.</p>
<dt>No Flash Player Events</dt>
<dd>Currently, there&#8217;s no way to communicate with the flash player for the music videos. There&#8217;s no way to tell if it&#8217;s playing or not, if the video has loaded, played through, or even what the video is. Contrast this with the <a href="http://developer.yahoo.com/music/api_guide/VideoPlayer.html">Y! Music Video Player</a>, which gives you all the control you could ask for.</dd>
<dt>No XML or JSON-formatted Responses</dt>
<dd>One of the more interesting choices made by the MTV Music API is to provide responses only in formatted feeds. Normally, web services have a few formats to choose from, like JSON or XML, but not in this case. While I applaud the appropriate choice of <a href="http://en.wikipedia.org/wiki/Media_RSS">mRSS</a> for video results, it ends up feeling out of place when <a href="http://api.mtvnservices.com/1/artist/decemberists/">returning results for artists, or genres</a>.</dd>
<dt>Incomplete Error Handling</dt>
<dd>Remember that rate limit mentioned in the Terms of Service? If you go over, here&#8217;s what you get back:<br />
    <code>&lt;h1&gt;403 Developer Over Qps&lt;/h1&gt;</code><br />
    What&#8217;s most confusing is that this isn&#8217;t in the documentation at all. A recent update added error responses to the API, but not for this.
  </dd>
<dt>Limited Meta Information</dt>
<dd>Like I mentioned above, there&#8217;s only as much information about artists as necessary to then access their videos. Either as a consequence or the mRSS format or a design constraint, simple information like the album title that corresponds to a given music video just isn&#8217;t there.</dd>
</dd>
<h2>Selling Points</h2>
<p>Now that I&#8217;ve vented my frustrations about the API, I&#8217;d be remiss in talking about some of the things that it really has going for it:</p>
<dl>
<dt>Huge Collection of Videos</dt>
<dd>Although the Y! Music video collection has twice the number of videos, MTV&#8217;s 20,000+ videos are definitely nothing to scoff at. Although it had less success with <a href="http://www.last.fm/tag/freak%20folk" title="Freak Folk, for example">some of the fringe genres I listen to</a>, it had a good selection for the mainstream stuff I tried out.</dd>
<dt>No Ads (yet&#8230;)</dt>
<dd>Perhaps the biggest competitive advantage the MTV Music API has over Yahoo! is that its music videos don&#8217;t have ads. Ads are one of my biggest gripes about Y! Music videos, so it&#8217;s a breath of fresh air to be able to <a href="http://en.wikipedia.org/wiki/Rickrolling" title="Guess what? This isn't a rickroll!">rickroll</a> someone without being <a href="http://www.youtube.com/watch?v=oHg5SJYRHA0" title="...but this is :)"> foiled by an ad for Nissan</a>.</dd>
<dt>mRSS and OpenSearch</dt>
<dd>Somebody at MTV has a good head on their shoulders for making use of these technologies, even if not the best use. Despite my mild protestation, the MTV API is exactly what mRSS was spec&#8217;d for. Adding <a href="http://en.wikipedia.org/wiki/Opensearch">OpenSearch</a> into the mix was also in good taste.</dd>
</dl>
<h2>The Verdict</h2>
<p>The <span class="caps">MTV</span> Music <span class="caps">API</span>, as it currently stands, is a bit of a mixed bag. It&#8217;s still in beta, so it still has some room to grow before its release proper, but for now, it leaves a lot left to be desired. What I&#8217;m most concerned about, though, are the constrictive Terms of Service, which are enough to make me wary of choosing to develop with their technologies.</p>
<p>Either way, you can check out <a href="http://developer.mtvnservices.com/">http://developer.mtvnservices.com/</a> for everything you need to get started. Or, if you&#8217;re a Rubyist, read on for an even easier way to get started&#8230;</p>
<h2>require &#8216;mtv-music.rb&#8217;</h2>
<p>Following the <em>&#8220;You can only know an <span class="caps">API</span> once you&#8217;ve walked a mile in its shoes&#8221;</em> tradition, I&#8217;ve fashioned a Ruby wrapper around the <span class="caps">API</span>.</p>
<p>If the code samples below entice, <a href="http://github.com/mattt/mtv-music/">go ahead and try it out</a>.</p>
<pre>
<code>
require 'mtv-music'
include MTV::Music

artist = Artist.new("Radiohead")

puts artist.name
puts artist.website

puts '*' * 40
puts

puts 'Videos'
artist.videos.each do |video|
  puts "t- %s" % video.title
end

video = Video.new("hznHivqrbHHZBZNXB") # Radiohead's "There There"

# The MTV Music API makes it easy to embed videos into any webpage
puts video.embed_code
# &lt;embed src=&quot;http://media.mtvnservices.com/mgid:uma:video:api.mtvnservices.com:202930&quot;
#        width=&quot;448&quot; height=&quot;366&quot; type=&quot;application/x-shockwave-flash&quot;
#        allowFullScreen=&quot;true&quot; allowScriptAccess=&quot;always&quot; flashvars=&quot;autoPlay=false&quot; /&gt;
</code>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2008/11/i-want-my-mtv-api/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Y! Music Battle of the APIs in the Key of Ruby</title>
		<link>http://mattt.me/2008/08/y-music-battle-of-the-apis-in-the-key-of-ruby/</link>
		<comments>http://mattt.me/2008/08/y-music-battle-of-the-apis-in-the-key-of-ruby/#comments</comments>
		<pubDate>Fri, 08 Aug 2008 00:53:38 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Last.fm]]></category>

		<category><![CDATA[Music]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[Yahoo!]]></category>

		<guid isPermaLink="false">http://matttthompson.com/?p=96</guid>
		<description><![CDATA[<br/>The Yahoo! Music API is impressive, but the question remains:
How does it stack up to the reigning champion of music APIs?
How does Yahoo! Music compare to <a href="http://www.last.fm/">Last.fm</a>?]]></description>
			<content:encoded><![CDATA[<br/><p>Earlier this week, <a href="http://music.yahoo.com/">Yahoo! Music</a> announced the release of <a href="http://developer.yahoo.com/music/">their API</a>. Jim Bumgardner, a front-end engineer from the team, gave <a href="http://developer.yahoo.net/blog/archives/2008/08/jamming_with_th.html">a nice introduction</a>, which included <a href="http://www.krazydad.com/musicvideo/">some</a> <a href="http://krazydad.com/baconbrothers/">examples</a> of what you could do with it. In fact, his post inspired me to dive into the docs to see what else was in there.</p>
<p>Truth be told, the Yahoo! Music API is a substantial entry into the music-related APIs. It offers a powerful and elegant interface to one of the largest music catalogs in the world, including hands-down the largest volume of music videos out there. As a Yahoo! property, it serves a massive user base, whose listening habits power a comprehensive graph of for finding similar artists. Through its corporate partners, Yahoo! Music also enjoys the benefits of direct access to artists and labels from around the world.</p>
<p>The Yahoo! Music API is impressive, but the question remains:<br />
How does it stack up to the reigning champion of music APIs?<br />
How does Yahoo! Music compare to <a href="http://www.last.fm/">Last.fm</a>?</p>
<p>As you might expect, there&#8217;s no quick answer. Both offer features that are about on parity, and each have their own advantages and shortcomings, which is to be expected. What&#8217;s interesting is what those differences are, to see what&#8217;s truly novel about what Yahoo! Music has to offer.</p>
<p>If you already hip to the whole Last.fm thing, you can skip down to the next section for the gritty details.</p>
<h2>A Brief History of Last.fm</h2>
<p>Last.fm was one of the first and most notable music APIs, launching right as the Web 2.0 thing was hitting its stride in late 2005. It&#8217;s greatest strength is its ability to track its user&#8217;s listening habits real-time, through a process called <a href="http://www.last.fm/help">&#8220;Scrobbling&#8221;</a>. Over a just a few weeks, a user&#8217;s personal listening habits are matched against everyone else&#8217;s to see what else you might be interested in. Back in June, Last.fm announced the second iteration of their APIs, which further beefed up its offerings with support for tagging and  user sessions. As a <a href="http://www.last.fm/user/emptysock" title="Go ahead, friend me">long-time Last.fm user</a>, I can vouch for their recommendation engine: no matter how <a href="http://www.last.fm/music/Lindha+Kallerdahl/+videos/+1-lMgL-wJ8d_A">obscure</a> or <a href="http://www.last.fm/music/Yo+La+Tengo">indie</a> my musical tastes get, it always has <a href="http://www.last.fm/music/The+Microphones/The+Glow%2C+Pt.+2">great recommendations</a>.</p>
<p>Enough about that, on with the gritty details:</p>
<h2>The Gritty Details</h2>
<table>
<thead>
<tr>
<th></th>
<th style="text-align:center;"><img src="http://cdn.last.fm/flatness/logo.6.png" width="103" height="50" alt="Last.fm Logo"/></th>
<th style="text-align:center;"><img src="http://l.yimg.com/us.yimg.com/i/us/mus/hdr/ymusic_logo.png" width="127" height="54"</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Protocols</strong></td>
<td>REST, XML-RPC</td>
<td>REST</td>
</tr>
<tr>
<td><strong>Formats</strong></td>
<td>Plaintext, XML, XSPF, RSS</td>
<td>XML, JSON, RSS</td>
</tr>
<tr>
<td><strong>API Groups</strong></td>
<td>Album, Artist, Event, Group, Library, Tag, Track, User</td>
<td>Artist, Category, Image, Rating, Release, Station, Track, Video</td>
</tr>
<tr>
<td><strong>Dev Key Required?</strong></td>
<td>Yes (v2.0 only)</td>
<td>Yes</td>
</tr>
<tr>
<td><strong>Usage Limit</strong></td>
<td>5 reqs / sec / IP Address</td>
<td>5,000 reqs / day / App ID</td>
</tr>
</tbody>
</table>
<p>As far as functionality goes, there&#8217;s a lot of overlap between these two APIs. Both offer search APIs for Artists, Albums, Tracks, and Users&#8211;the bread an butter of any respectable music catalog. Last.fm, being mostly user-generated, categorizes its music using a tag-based <a href="http://en.wikipedia.org/wiki/Folksonomy">folksonomy</a>, whereas Yahoo! takes a top-down approach by using categories, which include genres, eras, and themes.</p>
<p>In terms of unique features, the Last.fm API exposes its database of upcoming performances by artists and other events. It also has supports a wider range of user interactions, including the ability to submit listening information ala &#8220;Scrobbling&#8221;.</p>
<p>On the other hand, Yahoo! Music, is unrivaled in its offering of music videos, and the ability to embed videos directly into web pages is a killer feature. Although less flashy, Yahoo! Music supports spelling recommendations to disambiguate results, which in practice, make it a lot more usable.</p>
<p>Both APIs offer a means of getting and manipulating user data. Last.fm uses session-based authentication tokens, and Y! Music does in its own way, via <a href="http://developer.yahoo.com/auth/">BBAUTH</a>.</p>
<p>Logistically, there are quite a few differences in how developers can use either of the APIs.</p>
<p>Although the previous version of the Last.fm allowed use without an API key, the new version requires it. Fortunately, their <a href="http://www.last.fm/api/tos">terms of use</a> remain fairly liberal, providing <a href="http://www.last.fm/api/account">API keys</a> for both commercial and non-commercial use. As far as usage caps, applications can make up to 5 requests per IP address per second.</p>
<p>The terms of use for Y! Music are <a href="http://info.yahoo.com/legal/us/yahoo/api/api-2140.html">just like any other Yahoo! API</a>, with the big exception being that use of the Music API is limited to non-commercial use. Requests require an <a href="http://developer.yahoo.com/wsregapp/">App ID</a>, with which up to 5,000 queries per day can be made.</p>
<p>Lastly, although for the most part a matter of taste, each has their own way of formatting REST requests.</p>
<p>The REST architecture for Last.fm resembles a familiar, object-oriented approach:<br />
<tt>http://ws.audioscrobbler.com/2.0/?method=album.getinfo&#038;artist=Jamiroquai&#038;album=Dynamite</tt></p>
<p>By contrast, the relative cryptic nature of the Y! Music API takes a little getting used to, with a typical request looking like:<br />
<tt>http://us.music.yahooapis.com/release/v1/list/artist/252859</tt></p>
<h2>Rock out with Ruby</h2>
<p>Lucky for you, over the course of researching the Y! Music API, I wrote a pretty flexible Ruby library, which will be available as a gem in the next couple of days. You can get the latest version at <a href="http://github.com/mattt/yahoo-music/">the project&#8217;s Github page</a>.</p>
<p>To give you an idea of what it&#8217;s like, here&#8217;s a simple example:</p>
<p><code>
<pre>
require 'yahoo-music'
include Yahoo::Music
Yahoo::Music.app_id = "..." # Put Your App ID Here

artist = Artist.new("Beirut") # Searches by name and uses first result

album = artist.releases.detect{|r| r.title == "Flying Club Cup"}

puts album.title
puts album.artist
puts "Release Date:" + album.released_on.strftime("%m/%d/%Y")
puts
puts "Tracks"
artist.tracks.each_with_index do |track, i|
  puts "t%d %s t%2d:%2d" % [i, track.title, track.duration / 60, track.duration % 60]
end
</pre>
<p></code></p>
<p>Pretty awesome, right? Although the library&#8217;s still in early development, and doesn&#8217;t <em>completely</em> cover all of the functionality of the full API yet, feel free to check it out for yourself and tell me what you think.</p>
<h2>D.S. al Coda</h2>
<p>Actually, talking about libraries is less of a digression than a good stopping-off point for this article. Like I said before, both Last.fm and Y! Music are both excellent music APIs that are definitely worth a look. The best place to start is to just dive into some code and write something.<sup><a href="#footnote1">1</a></sup> I hope that this deeper dive not only gives you a context for what they can do, but also inspire you to get out there and make something awesome.</p>
<hr/>
<p><sup id="#footnote1">1</sup> If you&#8217;re looking for a good Ruby library for Last.fm, be sure to check out John Nunemaker&#8217;s Scrobbler gem (http://scrobbler.rubyforge.org/). It has served me well in the past, and was a great source of inspiration when I made my Y! Music library.</p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2008/08/y-music-battle-of-the-apis-in-the-key-of-ruby/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Gears, BrowserPlus, and Web 3.0, baby</title>
		<link>http://mattt.me/2008/07/gears-browserplus-and-web-3-oh/</link>
		<comments>http://mattt.me/2008/07/gears-browserplus-and-web-3-oh/#comments</comments>
		<pubDate>Wed, 30 Jul 2008 03:00:51 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[BrowserPlus]]></category>

		<category><![CDATA[Gears]]></category>

		<category><![CDATA[Google]]></category>

		<category><![CDATA[Web 3.0]]></category>

		<category><![CDATA[Yahoo!]]></category>

		<guid isPermaLink="false">http://matttthompson.com/?p=67</guid>
		<description><![CDATA[<br/>If you’ve heard of Gears or BrowserPlus, chances are you've heard them positioned as competitors in one way or another. Another Google vs. Yahoo! showdown. Truth is, that’s not the case at all, or at least doesn’t have to be. After taking a look at what these technologies actually offer, we can see that they’re actually two distinct approaches to an exciting new direction for the web.]]></description>
			<content:encoded><![CDATA[<br/><p><em class="highlight">Originally posted on the <a href="http://developer.yahoo.net/blog/archives/2008/07/gears_vs_browserplus.html">Yahoo! Developer Network Blog</a></em></p>
<p>Speculative tech journalism is wrought with some pretty bone-headed predictions.</p>
<p>I’m fully aware of that.</p>
<p>Every time you toss your hat in the ring to offer your opinion, you’re opening yourself up to the possibility of being as wrong as <a href="http://en.wikipedia.org/wiki/Bill_Gates">the guy who said</a>, <q>“No one will need more than 637 kb of memory for a personal computer. 640K ought to be enough for anybody.”</q></p>
<p>Despite all of that, I’d like to tell you about what the future of the Web will be. What Web 3.0 might look like.</p>
<p>But first, some context:</p>
<p>Web 2.0, for all of the nebulously related concepts it represents, was ultimately made possible by Ajax. Asynchronous communication between the browser and servers (a la Ajax) provided the latency needed to recreate the look and feel of a regular desktop application. Not to argue the finer points in this minefield of buzzwords and strong opinions, but the emergence of rich user interaction changed everything. It got people to rethink what a website could be. It was a newer, shinier series of tubes.</p>
<p>Seriously, think back to the first time you saw <a href="http://maps.google.com/">Google Maps</a> and your jaw dropped, or how Flickr’s <a href="http://flickr.com/photos/organize/">Photo Organizer</a> blew your mind. Can you imagine <a href="http://www.digg.com">Digg</a> being anything more than yet another Fark without that “digg it” button? And how about all of the little transparent things, like sorting a list by drag and drop, accordion lists, live previews, or page animations?</p>
<p>So much of the internet’s look and feel is powered by Ajax. Go back to a time before Ajax, and the internet was something completely different; it’s not implausible to think that another substantial technology could make Web 2.0 no more than a distant memory.</p>
<p>Right now, two technologies in particular, <a href="http://gears.google.com/">Gears</a> (formerly Google Gears) and <a href="http://browserplus.yahoo.com/">Yahoo! BrowserPlus</a>, have amazing potential to completely reshape the future of internet.</p>
<p>If you’ve heard of Gears or BrowserPlus, chances are you&#8217;ve heard them positioned as competitors in one way or another. Another Google vs. Yahoo! showdown. Truth is, that’s not the case at all, or at least doesn’t have to be. After taking a look at what these technologies actually offer, we can see that they’re actually two distinct approaches to an exciting new direction for the web.</p>
<h2 style="margin-bottom:1.5em"><img src="http://matttthompson.com/wp-content/uploads/2008/11/gears.png" width="153" height="43"  alt="Gears Logo" /><br />
<span style="display:none;">(Google) Gears</span></h2>
<p>Gears recently celebrated its first birthday in style, by being released as open-source and dropping the Google brand. In <a href="http://googleblog.blogspot.com/2008/05/happy-birthday-google-gears.html">Gears’ anniversary blog post</a>, software engineer Chris Prince explained it this way:</p>
<p>
<blockquote>&#8220;We want to make it clear that Gears isn’t just a Google thing. We see Gears as a way for everyone to get involved with upgrading the web platform.”</p></blockquote>
<p>In fact, perhaps the best way to think about what Gears is, to borrow a phrase from a <a href="http://almaer.com/blog/gears-as-a-bleeding-edge-html-5-implementation">blog post from Dion Almaer</a>, as “a bleeding edge implementation of HTML5”, as many of the core functionalities of Gears have been inspired by the HTML5 draft spec (and the reverse is true as well).</p>
<p>Gears provides several major components, including Database, which can read and write to a local SQLite3 database; WorkerPool, which parallelizes processing tasks; and LocalServer, which allows websites to cache resources like HTML, images, or video, and serve them from the local machine.</p>
<p>So what can you do with that? If you just went on what Google had to say about it from their examples, well…you might miss the point completely. That is to say, the demos aren’t exactly flashy. To be fair, it’s difficult to come up with trivial examples that encapsulate such a nontrivial range of functionality.</p>
<p>To show what’s possible with Gears, let’s imagine what your favorite sites would look like enhanced by Gears:</p>
<dl>
<dt><a href="http://gmail.com/">GMail</a> / <a href="http://ymail.com/">Y! Mail</a></dt>
<dd>Messages are downloaded and synced with a local database on your machine, meaning mail can be read and written offline, and searching is really really fast, as in search-as-you-type fast.</dd>
<dt><a href="http://vimeo.com/">Vimeo</a> / <a href="http://video.yahoo.com/">Y! Video</a> / <a href="http://youtube.com/">YouTube</a></dt>
<dd>Instead of uploading videos and waiting for them to be encoded later, videos could be encoded locally and uploaded along the way, making the whole process much faster.</dd>
<dt><a href="http://www.kingdomofloathing.com/">Kingdom of Loathing</a></dt>
<dd>&#8230;or pretty much any web-based game currently. Download all of the game files you need in one shot and adventure to your heart&#8217;s content, syncing up your local database every now and then.</dd>
</dl>
<p>As I said before, if you think back to how Ajax changed the way people could interact with websites, much of it is completely transparent. For instance, deleting items in a list with real-time feedback is so pervasive that it became an expected behavior. Just as that doesn’t lend itself to an impressive demo, I can see a lot of Gears’ functionality becoming equally pervasive, yet remaining invisible to the normal user. But as you know, Ajax has a flashier side too, which is where Yahoo! comes in.</p>
<h2 style="margin-bottom:1.5em"><img src="http://matttthompson.com/wp-content/uploads/2008/11/browserplus.png" width="276" height="71"  alt="BrowserPlus" /><br />
<span style="display:none;">Yahoo! BrowserPlus</span></h2>
<p>Back in May, Yahoo! announced <a href="http://browserplus.yahoo.com/">BrowserPlus</a>, a technology poised to blur the lines between the browser and the desktop. Unlike Gears, which provides a single underlying framework, BrowserPlus is made up of individual modules, called services, which can be installed and updated on the fly.</p>
<p>If you haven’t done so already, you should check out some of the BrowserPlus demos firsthand to get the full effect of what’s possible.</p>
<p>PhotoDrop is a good example of how BrowserPlus services interact. Using the DragAndDrop service, users are able to drag photos from their desktop directly into the browser window. The ImageAlter service hooks in with ImageMagick to resize, crop, and apply filters to your photos instantly. When you’re done editing your photos, the FlickrUploader tool will take care of adding them to your photostream. Putting all of these services together creates a new, rich user interface that just isn’t possible with Ajax alone.</p>
<p>BrowserPlus comes with <a href="http://browserplus.yahoo.com/services/">an assortment of built-in services</a> you can build on, including one for text-to-speech, one that provides secure cross-domain JSON requests, and one that ties into local notifications like Growl for the Mac, or its Windows counterpart, Snarl. But what’s really exciting is that BrowserPlus provides its own Ruby interpreter, which gives developers the power to build their own Ruby-based services.</p>
<p>For now, BrowserPlus is only available to Yahoo! properties, but developers are able to test out the APIs locally. The reason for this limited release is <a href="http://browserplus.yahoo.com/faq/#sneakPeek">explained in the FAQ</a>:</p>
<p>
<blockquote>&#8220;Once we’re confident that the system is safe for users when hosted on any site (even potentially malicious sites), and that users have all the proper controls over use of BrowserPlus on their computer – we’ll open it up. The “sneak peek” is a way to balance the desire for openness and the risk of exposing users to a new dynamic web-enabled software model.&#8221;</p></blockquote>
<p>BrowserPlus has been criticized by some for its lack of openness, but there are good reasons for Yahoo! to play it safe. Yahoo! is known and trusted for its commitment to providing a secure online experience to its users. With BrowserPlus, Yahoo! has the ability to immediately restrict services if they’re found to pose a security risk. Pragmatically speaking, if a technology is going to provide such powerful capabilities to developers, a trusted gatekeeper like Yahoo! is ultimately what it takes to ensure that your machine is safe.</p>
<h2>A Philosophical Difference</h2>
<p>With their respective design goals in mind, it doesn’t make sense to look at Gears and BrowserPlus as competitors. Sure, both have an intersecting feature set, including desktop integration, and automatic software updates, but that’s where the similarities end.</p>
<p>Gears is built for the back-end, providing a solid foundation of core technologies to the browser. Being open-source software suits it well too, just as the W3C itself was started as a way to open the process of web standard adoption.</p>
<p>BrowserPlus, on the other hand, has amazing potential for the front-end in a way that’s only possible because of its modular architecture. It’s based upon Yahoo!’s strong reputation for privacy and security, which will ensure that users can feel safe trying out new things online.</p>
<p>Put the two together (BrowserPlus + Gears), and there’s a chance you’ll rip a hole in the space-time continuum, or something&#8211; they’re just that awesome. Seriously though, check out what the fuss is about now, and get a leg up on this Web 3.0 thing.</p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2008/07/gears-browserplus-and-web-3-oh/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Book Review: High Performance MySQL</title>
		<link>http://mattt.me/2008/07/high-performance-mysql/</link>
		<comments>http://mattt.me/2008/07/high-performance-mysql/#comments</comments>
		<pubDate>Tue, 15 Jul 2008 22:42:11 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Books]]></category>

		<category><![CDATA[Jeremy Zawodny]]></category>

		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[O'Reilly]]></category>

		<guid isPermaLink="false">http://matttthompson.com/?p=3</guid>
		<description><![CDATA[<br/>A lot has changed since the first publication of <strong>High Performance MySQL</strong> in 2004. At some point, the web turned <a href="http://youtube.com/watch?v=NLlGopyXT_g">2.0</a>, startups became cool again, and <a href="http://en.wikipedia.org/wiki/Sql">SQL</a> became a bad word (regardless of how you pronounce it).]]></description>
			<content:encoded><![CDATA[<br/><p><em class="highlight">Originally posted on the <a href="http://developer.yahoo.net/blog/archives/2008/06/high_performance_mysql_2nd_ed.html">Yahoo! Developer Network Blog</a></em></p>
<p>A lot has changed since the first publication of <strong>High Performance MySQL</strong> in 2004. At some point, the web turned <a href="http://youtube.com/watch?v=NLlGopyXT_g">2.0</a>, <a href="http://flickr.com/">startups</a> <a href="http://del.icio.us/">became</a> <a href="http://reddit.com/">cool</a> <a href="http://facebook.com/">again</a>, and <a href="http://en.wikipedia.org/wiki/Sql">SQL</a> became a bad word (regardless of how you pronounce it). For many in this new generation of web development, hand-writing SQL has become a sort of vestige&#8211;something to suffer through only as a last resort. Frameworks like <a href="http://www.djangoproject.com/">Django</a> and <a href="http://rubyonrails.org/">Ruby on Rails</a> provide a clean abstraction to the database called an <abbr title="Object-Relational Mapping">ORM</abbr>, or <a href="http://en.wikipedia.org/wiki/Object-relational_mapping">Object-Relational Mapping</a>, which makes it possible to develop an entire application <a href="http://media.rubyonrails.org/video/rails_take2_with_sound.mov">without writing a single line of SQL</a>. Developers end up learning the hard way that reliance on database-agnostic development can have tremendous consequences once the application has to scale to thousands or millions of users.</p>
<p><span id="more-3"></span></p>
<p><a href="http://oreilly.com/catalog/9780596101718/"><strong>High Performance MySQL</strong></a>, by Baron Schwartz, Peter Zaitsev, Vadim Tkachenko, Jeremy Zawodny, Arjen Lentz, and Derek J. Balling, is a high-level introduction to the most powerful aspects of <a href="http://www.mysql.com/">MySQL</a> that&#8217;s still accessible to anyone who&#8217;s worked with a database before. Although this book focuses on MySQL, many of the concepts like <a href="http://en.wikipedia.org/wiki/Database_transaction">transactions</a>, <a href="http://en.wikipedia.org/wiki/Lock_%28database%29">locking</a>, and <a href="http://en.wikipedia.org/wiki/Query_optimization">query optimization</a> are important to an understanding of any database system. You can get through the book on just a basic literacy of SQL, but it might be helpful to have a companion reference lying around in case something comes up.</p>
<p>The book starts out with a detailed overview of the MySQL architecture, with careful attention to MySQL&#8217;s selection of storage engines, which offers a lot of flexibility in how you can optimize performance. As a way to explain the differences between each of these storage engines and when it might make sense to use <a href="http://en.wikipedia.org/wiki/InnoDB">InnoDB</a> rather than <a href="http://en.wikipedia.org/wiki/MyISAM">MyISAM</a>, for instance, the book provides a thorough explanation of how they implement locking and transactions.</p>
<p>Chapters 3 &amp; 4 are also fairly specific to MySQL, as they explain the finer details of how it processes queries. MySQL does a fair amount of heuristics-based optimization on incoming queries depending on the nature of your data, and understanding what&#8217;s going on under the hood can not only help you fix queries, but start writing better SQL. If you&#8217;ve ever added <a href="http://en.wikipedia.org/wiki/Index_%28database%29">column indices</a> because it seemed like the cool thing to do, or couldn&#8217;t quite figure out how that simple query could be taking a few seconds, these two chapters especially will set you straight.</p>
<p>The rest of the book covers general best practices for optimizing server performance. These chapters provide a good reference for how MySQL best implements practices like <a href="http://en.wikipedia.org/wiki/Benchmarking">benchmarking</a>, <a href="http://en.wikipedia.org/wiki/Load_balancing_%28computing%29">load balancing</a>, <a href="http://en.wikipedia.org/wiki/Backup">backups</a>, and hardware scaling. Since most of these optimizations are external to MySQL itself, much of the information is important for any production environment.</p>
<p>Without a doubt, <strong>High Performance MySQL</strong> belongs on any serious developer&#8217;s bookshelf.  Like the original, it&#8217;s an enjoyable, engaging read that provides battled-tested solutions to real-world problems that engineers face in scaling their applications. The second edition covers the new features of <a href="http://dev.mysql.com/doc/refman/5.1/en/">MySQL 5</a>, including <a href="http://en.wikipedia.org/wiki/Stored_procedures">stored procedures</a>, <a href="http://en.wikipedia.org/wiki/Cursor_%28databases%29">cursors</a>, <a href="http://en.wikipedia.org/wiki/Database_trigger">triggers</a> and <a href="http://en.wikipedia.org/wiki/Database_view">views</a>, as well as a deeper comparative look into the various storage engines. Perhaps more importantly, the second edition brings with it a reminder of how important database design is to web development.</p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2008/07/high-performance-mysql/feed/</wfw:commentRss>
<enclosure url="http://media.rubyonrails.org/video/rails_take2_with_sound.mov" length="54364199" type="video/quick" />
		</item>
		<item>
		<title>Book Review: Javascript: The Good Parts</title>
		<link>http://mattt.me/2008/06/javascript-the-good-parts/</link>
		<comments>http://mattt.me/2008/06/javascript-the-good-parts/#comments</comments>
		<pubDate>Sun, 15 Jun 2008 19:00:48 +0000</pubDate>
		<dc:creator>Mattt Thompson</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Books]]></category>

		<category><![CDATA[Douglas Crockford]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[O'Reilly]]></category>

		<category><![CDATA[Yahoo! Press]]></category>

		<guid isPermaLink="false">http://matttthompson.com/?p=72</guid>
		<description><![CDATA[<br/>As weird as it is, there are a lot of good reasons to <em>actually</em> learn JavaScript, and not just <em>pretend</em> its some other language with C syntax. It takes a great deal of insight into this language to understand its true potential, and <a href="http://www.crockford.com/">Douglas Crockford</a> offers just this in his new book, "Javascript: The Good Parts."]]></description>
			<content:encoded><![CDATA[<br/><p><em class="highlight">Originally posted on the <a href="http://developer.yahoo.net/blog/archives/2008/06/javascript_the_good_parts_review.html">Yahoo! Developer Network Blog</a></em></p>
<p>First off, a confession&#8211;I&#8217;ve rewritten the first sentence of this post maybe a dozen times. (How&#8217;s that for meta?) For one reason or another, I figured that writing about <a href="http://en.wikipedia.org/wiki/JavaScript">JavaScript</a> would warrant some clever insight into the language. Some poetic tidbit that people could rally behind. The kind of voice that could shape a generation of empathetic web developers.</p>
<p>Something like:</p>
<blockquote><p><em>Javascript is a language of alchemy, turning inconsistent behavior and design flaws into <a href="http://280slides.com/">Web 2.0 gold</a>.</em></p></blockquote>
<p>Or maybe:</p>
<blockquote><p><em>JavaScript is nothing short of quantum physics with its spooky action at a distance.</em></p></blockquote>
<p>Before I decided to go all self-referential with my introduction, I had tentatively settled on something I think we can all agree with:</p>
<blockquote><p>JavaScript is really, <em>really</em> weird.</p></blockquote>
<p>As weird as it is, there are a lot of good reasons to <em>actually</em> learn JavaScript, and not just <em>pretend</em> it&#8217;s some other language with C syntax. It takes a great deal of insight into this language to understand its true potential, and <a href="http://www.crockford.com/">Douglas Crockford</a> offers just this in his new book, <strong>&#8220;Javascript: The Good Parts.&#8221;</strong> This offering from <a href="http://oreilly.com/">O&#8217;Reilly</a> and <a href="http://developer.yahoo.net/">Yahoo!</a> sets itself apart from <a href="http://search.oreilly.com/?q=javascript&#038;t1=Books&#038;u1=q&#038;u2=t1&#038;sort=searchDate">other JavaScript books</a> in a lot of ways.</p>
<p>The first thing you&#8217;ll notice is how thin this book is. Weighing in at around 100 pages and another 50 with appendices, it&#8217;s a concise and remarkably pleasant read that you&#8217;ll probably finish in a single sitting. Nonetheless, there is enough packed into this book to have you reading it through a few more times. Another rarity among programming books is its  remarkable clarity and pleasant, patient tone. That said, this book is not for beginners (JavaScript probably isn&#8217;t a great language to learn programming with anyway). By tailoring the book to people already familiar with programming fundamentals, Crockford is able to tease out the quirks that make JavaScript so confusing, and expose some of its hidden elegance.</p>
<p>The best parts of <strong>&#8220;The Good Parts&#8221;</strong> are definitely Chapters 4 and 5, which take a look at some of JavaScript&#8217;s more unique aspect&#8211;functions as objects and <a href="http://en.wikipedia.org/wiki/Prototype-based_programming">prototypes</a>. In Chapter 4, Crockford explains and implements an impressive set of language features like <a href="http://en.wikipedia.org/wiki/Modular_programming">modules</a>, <a href="http://en.wikipedia.org/wiki/Currying">function currying</a>, and <a href="http://en.wikipedia.org/wiki/Memoization">memoization</a>, which make JavaScript start to feel closer to languages like <a href="http://www.python.org/">Python</a>, <a href="http://www.haskell.org/">Haskell</a>, or <a href="http://en.wikipedia.org/wiki/Lisp_programming_language">Lisp</a>. <a href="http://yuiblog.com/assets/pdf/good-parts-ch-5.pdf">Chapter 5</a> does a great job explaining the difference between classical and prototypical inheritance, and how to take advantage of prototypes in JavaScript.</p>
<p>If you&#8217;re a developer looking to finally make sense of JavaScript, you&#8217;ll find this book to be right up your alley. It&#8217;s an enjoyable read that presents core programming concepts and won&#8217;t waste your time on the <a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29">marketing buzzwords</a> that usually come with the territory. Do yourself a favor and <a href="http://oreilly.com/catalog/9780596517748/index.html">check out Douglas Crockford&#8217;s <strong>Javascript: The Good Parts</strong></a>, and forget everything you ever thought about this <a href="http://javascript.crockford.com/javascript.html">poor, misunderstood language</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mattt.me/2008/06/javascript-the-good-parts/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 1.985 seconds -->
<!-- Cached page generated by WP-Super-Cache on 2010-09-02 14:12:26 -->
<!-- Compression = gzip -->