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

<channel>
	<title>Programming Blog &#187; funny</title>
	<atom:link href="http://www.neurosoftware.ro/programming-blog/category/funny/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.neurosoftware.ro/programming-blog</link>
	<description>Web development , php , ajax , symfony, framework, zend</description>
	<lastBuildDate>Thu, 18 Aug 2011 08:11:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Nobody&#8217;s Going to Help You, and That&#8217;s Awesome</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/nobodys-going-to-help-you-and-thats-awesome/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/nobodys-going-to-help-you-and-thats-awesome/#comments</comments>
		<pubDate>Fri, 29 Jul 2011 01:35:03 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[damn work]]></category>
		<category><![CDATA[generic concept]]></category>
		<category><![CDATA[marathon plan]]></category>
		<category><![CDATA[overnight success]]></category>
		<category><![CDATA[reading books]]></category>
		<category><![CDATA[self help books]]></category>
		<category><![CDATA[self improvement]]></category>
		<category><![CDATA[Techie]]></category>
		<category><![CDATA[time quality]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/nobodys-going-to-help-you-and-thats-awesome/</guid>
		<description><![CDATA[I&#8217;m not into self-help. I don&#8217;t buy self-help books, I don&#8217;t read productivity blogs, and I certainly don&#8217;t subscribe to self-proclaimed self-help guru newsletters. Reading someone else&#8217;s advice on the rather generic concept of helping yourself always struck me as a particularly misguided idea. Apparently I&#8217;m not the only person to reach this conclusion, either. [...]]]></description>
			<content:encoded><![CDATA[<p>
I&#8217;m not into <a href="http://en.wikipedia.org/wiki/Self-help">self-help</a>. I don&#8217;t buy self-help books, I don&#8217;t read productivity blogs, and I certainly don&#8217;t subscribe to <a href="http://www.stevepavlina.com/" rel="nofollow">self-proclaimed self-help guru</a> newsletters. Reading someone else&#8217;s advice on the rather generic concept of <i>helping yourself</i> always struck me as a particularly misguided idea. </p>
<p>
Apparently I&#8217;m not the only person to <a href="http://commonsenseatheism.com/?p=12651">reach this conclusion</a>, either.</p>
<blockquote><p>
I spent two years reading all the self-help books I could find. As of a year ago, I had read 340 self-help books. Because I’m insane.</p>
<p>
My conclusion from all that reading?</p>
<p>
<b>95% of self-help books are complete bullshit.</b>
</p></blockquote>
<p>
To be clear, I am all for <i>self-improvement</i>. Reading books, blogs, and newsletters by people who have accomplished great things is a fine way to research your own path in life. But these people, however famous and important they may be, <a href="http://sivers.org/up2you">are not going to help you</a>.</p>
<blockquote><p>
Unfortunately that&#8217;s not the answer he wanted. To him, my answer [that nobody was going to help him become successful] was really discouraging. To me, if I was receiving that answer from someone else, it would be really encouraging.</p>
<p>
I like being reminded that nobody&#8217;s going to help me &#8211; that it&#8217;s all up to me. <b>It puts my focus back on the things I can control &#8211; not waiting for outside circumstances.</b>
</p></blockquote>
<p>
Take it from <a href="http://productiveblog.tumblr.com/">The Ultimate Productivity Blog</a>:</p>
<p>
<a href="http://productiveblog.tumblr.com/"><img alt="Ultimate-productivity-blog" src="http://www.codinghorror.com/.a/6a0120a85dcdae970b01543407f4ef970c-800wi" border="0" /></a></p>
<p>
Reading self-help advice from other people, however well-intentioned, is no substitute for <b>getting your own damn work done</b>. The sooner you come to terms with this, the better off you&#8217;ll be.</p>
<p>
Get out there and do stuff <i>because you fundamentally enjoy it</i> and <i>because it makes you better</i>. As a writer, as an analyst, as a techie, whatever. Learn to <a href="http://headrush.typepad.com/creating_passionate_users/2006/03/dont_forget_squ.html">love practicing the fundamentals</a> and <b>do it better each time</b>. Over time, quality does lead to success, but you have to be patient. <i>Really</i> patient. Turns out, <a href="http://www.codinghorror.com/blog/2009/01/overnight-success-it-takes-years.html">&#8220;overnight&#8221; success takes years</a>. Maybe even decades. This is not a sprint, it&#8217;s a marathon. Plan accordingly.</p>
<p>
For example, I don&#8217;t care if anyone reads what I write here. I&#8217;m writing to satisfy myself first and foremost. If others read it and benefit from it, fantastic &#8212; that&#8217;s a welcome side effect. If I worry about <i>who</i> is reading, <i>why</i> they&#8217;re reading, or if <i>anyone</i> is even reading at all, I&#8217;d be too paralyzed to write! That&#8217;d be the least productive outcome of all.</p>
<p>
That&#8217;s not to say that <i>some</i> introspection about the nature of your work isn&#8217;t useful. It is. Even <a href="http://commonsenseatheism.com/?p=12651">the weary self-help student</a> I quoted above concluded that 5% of self-help advice surprisingly <i>wasn&#8217;t</i> bullshit. The one book he recommended without hesitation? <b><a href="http://www.amazon.com/59-Seconds-Little-Change-Borzoi/dp/B0057DCE7M/?tag=codihorr-20">59 Seconds: Think a Little, Change a Lot</a></b>.</p>
<p>
<a href="http://www.amazon.com/59-Seconds-Little-Change-Borzoi/dp/B0057DCE7M/?tag=codihorr-20"><img alt="59-seconds-book-cover" src="http://www.codinghorror.com/.a/6a0120a85dcdae970b014e8a27c433970d-800wi" border="0" /></a></p>
<p>
Despite my deep reservations about the genre, I ordered this book based on his recommendation and a number of credible references to it I noticed on the <a href="http://skeptics.stackexchange.com">Skeptic Stack Exchange</a>. </p>
<p>
Why does this self-help book work when so many others fail? In a word, <b>science</b>! The author goes out of his way to find actual published scientific research documenting specific ways we can make small changes in our behavior to produce better outcomes for ourselves and those around us. It&#8217;s powerful stuff, and the book is full of great, research backed insights like this one: </p>
<blockquote><p>
A group of participants were asked to select a negative experience. One group of participants were then asked to have a long chat with a supportive experimenter about the event, while a second group were invited to chat about a far more mundane topic &#8211; a typical day.</p>
<p>
Participants who had spent time talking about their traumatic event thought the chat had been helpful. However, the various questionnaires told a very different story. In reality the chat had no significant impact at all. They might just as well have been chatting about a typical day.</p>
<p>
In several studies, participants who have experienced a traumatic event have been encouraged to spend just a few minutes each day writing in a diary-type account of their deepest thoughts and feelings about it. For example, in one study participants who had just been made redundant were asked to reflect upon their deepest thoughts and feelings about their job loss, including how it had affected both their personal and professional lives. Although these types of exercises were  both speedy and simple, the results revealed a remarkable boost in their psychological and physical well-being, including a reduction in health problems and an increase in self-esteem and happiness.</p>
<p>
The results left psychologists with something of a mystery. <b>Why would talking about a traumatic experience have almost no effect but writing about it yield such significant benefits?</b> From a psychological perspective, talking and writing are very different. Talking can often be somewhat unstructured, disorganized, even chaotic. In contrast, writing encourages the creation of a story line and structure that help people make sense of what has happened and work towards a solution. In short, talking can add to a sense of confusion, but writing provides a more systematic, solution-based approach.
</p></blockquote>
<p>
Therefore, the real world change you would make based on this advice &ndash; the proverbial 59 seconds on the book jacket &ndash; is to avoid talking through traumatic experiences in favor of writing about them. Not because some self-help guru said so, but because the published research data tells us that talking doesn&#8217;t work and writing does. Not exactly intuitive, since talking through our problems with a friend always feels like the right thing to do, but I have certainly documented many times over the value of writing through a problem.</p>
<p>
<a href="http://www.amazon.com/59-Seconds-Little-Change-Borzoi/dp/B0057DCE7M/?tag=codihorr-20">59 Seconds</a> is <i>so</i> good, in fact, <b>it has rekindled my hopes that our new <a href="http://productivity.stackexchange.com">Stack Exchange Productivity Q&amp;A</a> can work.</b> I&#8217;d love for our productivity site to be founded on a scientific basis, and not the blind cult of personality I&#8217;ve come to expect from the self-help industry.</p>
<p>
Remember, nobody&#8217;s going to help you &hellip; except <i>science</i>, and if you&#8217;re willing to put in the required elbow grease each and every day &ndash; <i>yourself</i>.</p>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/nobodys-going-to-help-you-and-thats-awesome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building a PC, Part VII: Rebooting</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/building-a-pc-part-vii-rebooting/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/building-a-pc-part-vii-rebooting/#comments</comments>
		<pubDate>Fri, 29 Jul 2011 01:31:16 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[bridge system]]></category>
		<category><![CDATA[building a pc]]></category>
		<category><![CDATA[effic]]></category>
		<category><![CDATA[Gbps]]></category>
		<category><![CDATA[heat buildup]]></category>
		<category><![CDATA[initial research]]></category>
		<category><![CDATA[picopsu]]></category>
		<category><![CDATA[ssds]]></category>
		<category><![CDATA[workstation recommendations]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/building-a-pc-part-vii-rebooting/</guid>
		<description><![CDATA[I&#8217;ve had more or less the same PC, with various updates, since 2007. I&#8217;ve written about most of it here: Building a PC, Part I: Minimal boot Building a PC, Part II: Burn in Building a PC, Part III: Overclocking Building a PC, Part IV: Now It&#039;s Your Turn Building a PC, Part V: Upgrading [...]]]></description>
			<content:encoded><![CDATA[<p>
I&#8217;ve had more or less the same PC, with various updates, since 2007. I&#8217;ve written about most of it here:
</p>
<ul>
<li><a href="http://www.codinghorror.com/blog/2007/07/building-a-pc-part-i.html">Building a PC, Part I: Minimal boot</a>
</li>
<li><a href="http://www.codinghorror.com/blog/2007/07/building-a-pc-part-ii.html">Building a PC, Part II: Burn in</a>
</li>
<li><a href="http://www.codinghorror.com/blog/2007/07/building-a-pc-part-iii---overclocking.html">Building a PC, Part III: Overclocking</a>
</li>
<li><a href="http://www.codinghorror.com/blog/2007/07/building-a-pc-part-iv-now-its-your-turn.html">Building a PC, Part IV: Now It&#039;s Your Turn</a>
</li>
<li><a href="http://www.codinghorror.com/blog/2008/04/building-a-pc-part-v-upgrading.html">Building a PC, Part V: Upgrading</a>
</li>
<li><a href="http://www.codinghorror.com/blog/2009/12/building-a-pc-part-vi-rebuilding.html">Building a PC, Part VI: Rebuilding</a>
</ul>
<p>
While the advice in those original articles is still quite sound, my old 2007 era case was feeling mighty creaky. I needed a new chassis. I also wanted a motherboard that supported native 6 Gbps SATA for the latest generation of SSDs that <a href="http://www.codinghorror.com/blog/2011/05/the-hot-crazy-solid-state-drive-scale.html">truly benefit from them</a>. The buzz around the Sandy Bridge based Core i7-2600k was nearly deafening, and I&#8217;ve fallen <i>completely</i> in love with <a href="http://www.codinghorror.com/blog/2011/03/revisiting-the-home-theater-pc.html">my last HTPC build based on the same technology</a>. (Oh, and even if you already read that article, read it again because I added new PicoPSU and case information that takes it from awesome to sublime &ndash; on the order of 17 watts idle!)
</p>
<p>
So I decided it was time to build myself a nice Sandy Bridge system. What I ended up with is <b>easily the best case and motherboard combination I&#8217;ve ever laid hands on</b>. Read on!
</p>
<p>
I cut out a lot of the initial research work by relying on my old, dear friends at Tech Report and <a href="http://techreport.com/articles.x/21164/8">their current workstation recommendations</a>:
</p>
<ul>
<li><a href="http://www.amazon.com/gp/product/B00503EA80/?tag=codihorr-20">Asus P8Z68-V Pro</a> $220
<li><a href="http://www.amazon.com/gp/product/B004RFBIUU/?tag=codihorr-20">Corsair Vengeance 16 GB kit</a> $155
<li><a href="http://www.amazon.com/gp/product/B004EBUXSA/?tag=codihorr-20">Core i7-2600K</a> $315
</ul>
<p>
As for the case, I was impressed by <a href="http://techreport.com/articles.x/19638">the Tech Report review of the Corsair 600T</a>, which even comes in a heart-stopping pseudo stormtrooper white. <i>WANT.</i>
</p>
<p>
<a href="http://www.amazon.com/gp/product/B004O0PAKW/?tag=codihorr-20"><img alt="Corsair-600t-special-edition" src="http://www.codinghorror.com/.a/6a0120a85dcdae970b014e89f20a7f970d-800wi" border="0" /></a>
</p>
<p>
When it comes to power supplies, <a href="http://www.codinghorror.com/blog/2007/05/upgrading-to-a-high-efficiency-power-supply.html">I&#8217;m crazy about efficiency</a>, and fortunately there are now lots of so-called &#8220;80 Plus Gold&#8221; PSUs out there now, offering a staggering <i>90% efficiency</i> under most loads. Power supply efficiency is important, because the rest of that heat is dumped back into your case. The less efficient your PSU, the more heat buildup you&#8217;ll have under load. I chose <a href="http://www.amazon.com/Seasonic-ATX12V-EPS12V-Power-Supply/dp/B004F0AQ8C/?tag=codihorr-20">the Seasonic X-760</a> &ndash; which, when bench tested, <a href="http://www.jonnyguru.com/modules.php?name=NDReviews&amp;op=Story3&amp;reid=192">indeed delivered the promised 90% efficiency</a> &ndash; but <b>any high quality 80 Plus Gold model will generally do</b>. </p>
<p>
The CPU (and possibly, depending on your tastes, the video card) is the biggest heat generator inside your PC. The better and more efficient the CPU cooler, the quieter your whole system can be. This also affects how much you can overclock. I chose the <a href="http://www.amazon.com/gp/product/B003NWXH9S/?tag=codihorr-20">Thermalright Venomous-X Silent Edition</a> on the basis of it being <a href="http://www.silentpcreview.com/tr-venomousx">the current top dog for efficiency</a>, <i>and</i> because it had a simple mounting system. Large coolers can be a real bear to install. And did I mention it comes with an especially quiet fan out of the box, too?</p>
<p>
Once I had all the parts in hand, it was a simple matter of building it up, as documented in <a href="http://www.codinghorror.com/blog/archives/000905.html">my previous post series</a>. I adore this Corsair case; it is <i>an absolute joy to work in</i>. Everything in it is cleverly designed, from the rear cable routing area with rubber grommets all over the place for easily passing cables back and forth, to the tool-less 2.5&#8243; and 3.5&#8243; bays, to the super easily removable side panels. It&#8217;s like they read a giant list of all my prior complaints with every PC case I&#8217;ve ever used and fixed every. single. last. one of them. </p>
<p>
The end result is what you see here:</p>
<p>
<img class="asset  asset-image at-xid-6a0120a85dcdae970b014e89f1f08d970d image-full" alt="New-sandy-bridge-build-internal" src="http://www.codinghorror.com/.a/6a0120a85dcdae970b014e89f1f08d970d-800wi" border="0" /></p>
<p>
There are some significant tweaks visible in the above picture that I do recommend:</p>
<ol>
<li><b>Use tin snips to remove the rear exhaust grill.</b> We don&#8217;t need it back there, and the exhaust airflow is critical. <a href="http://www.silentpcreview.com/forums/viewtopic.php?t=15810">Fan grills affect low-speed fan airflow more than you&#8217;d think</a>:<br />
<blockquote><p>
Wire grills also have an effect: ~20%. This was checked with an anemometer on several different fans of 80, 92 and 120mm size, at full and lower speeds. The airflow reduction went as high as 24% but it was never below 19%. At 12V, the reduction in airflow with most fans will be relatively harmless, though there is an increase in turbulence noise (audible to me). But at the low airflow rates SPCR members run fans, I think the airflow reduction is significant.
</p></blockquote>
<li><b>Install a 140mm rear exhaust fan</b>. The <a href="http://www.amazon.com/gp/product/B002XISTXM/?tag=codihorr-20">Noctua NF-P14</a> is expensive at $25 but is cleverly designed to give you 140mm of super-quiet fan in the space a 120mm fan would normally take. It just <i>barely</i> fits in the rear exhaust fan slot with a little nudging. But it does fit; it&#8217;s the beige fan in the above picture. It also comes with its own speed reducers and accessories.
<li><b>Use fan speed reducers on <i>all</i> the fans</b>. The case has two 200mm fans, and the 140mm fan we&#8217;re adding. I couldn&#8217;t get the Asus motherboard&#8217;s &#8220;QFan&#8221; fan control system to work, as it seems to require 4-pin fans, and all the ones I had (including the ones that came with the case) are 3-pin. While I do prefer dynamic, temperature based control when I can get it, the next best thing is to use hardware to slow down the fans. I like the <a href="http://www.google.com/search?q=zalman%20zm-56&amp;tbm=shop">Zalman-ZM-RC56 resistor connector</a> as the simplest solution, but it&#8217;s getting hard to find for some reason. The <a href="http://www.google.com/search?q=zalman%20fanmate%202&amp;tbm=shop">Zalman Fan Mate 2</a> will also work, and allows you to individually adjust the speed of each fan. The case also has a built in fan controller &ndash; that&#8217;s the knob you see on the front top &ndash; but I found it too limited in range for my purposes.
<li><b>Add acoustic foam to taste</b>. Between inexpensive eggcrate foam and thin, adhesive backed open-cell foam, you can easily reduce that last 10-20% of fan noise to a very pleasant white noise. It works well in the areas pictured, and also on the interior of the side panel &#8220;facing&#8221; the fans. See item 6 in my <a href="http://www.codinghorror.com/blog/2006/08/building-a-quiet-pc.html">Building a Quiet PC</a> post for details.
</ol>
<p>
And then, of course, <a href="http://www.codinghorror.com/blog/2007/07/building-a-pc-part-iii---overclocking.html">the overclockening</a>. What kind of geek would I be if I didn&#8217;t attempt to <i>turn this baby up to 11?</i> This is another area where Sandy Bridge is a revelation: <b>so long as you buy one of the blessed &#8220;K&#8221; series processors, overclocking is as simple as setting the multiplier to the desired value.</b> It is ridiculously simple. And my results, for once, were immediately as good as the ones everyone else was crowing about: <i>4.4 GHz totally stable!</i></p>
<p>
<img alt="Sandy-bridge-overclock" src="http://www.codinghorror.com/.a/6a0120a85dcdae970b01538ffee801970b-800wi" border="0" /></p>
<p>
(beware: there is one <a href="http://vip.asus.com/forum/view.aspx?id=20110611021059226&amp;SLanguage=en-us&amp;board_id=1&amp;model=P8P67%20PRO&amp;page=1">nasty little issue</a> with the Asus motherboard&#8217;s auto-overclock feature. The PLL Overvoltage setting, which auto-overclock &#8220;helpfully&#8221; enables, completely bollixes up resuming from sleep. Just turn it off, and all is well. I don&#8217;t even want to tell you how long it took me to figure <i>that</i> one out.)</p>
<p>
The total package with a nice SSD delivers a near-perfect <a href="http://www.codinghorror.com/blog/2006/09/have-you-ever-been-windows-experienced.html">Windows Experience score</a>:</p>
<p>
<img alt="Sandy-bridge-windows-experience-score" src="http://www.codinghorror.com/.a/6a0120a85dcdae970b015433d240d0970c-800wi" border="0" /></p>
<p>
I won&#8217;t lie to you. This is not a compact build. It&#8217;s big! Those roomy side areas come at a cost, and that makes it a very <i>wide</i> case. But that&#8217;s to be expected for a desktop powerhouse machine. And since my last case lasted me from 2007-2011, I&#8217;ll happily accept a little bulk for something that&#8217;s easy to work on and upgrade over time.</p>
<p>
<img alt="New-sandy-bridge-build-external" src="http://www.codinghorror.com/.a/6a0120a85dcdae970b01538ffe7761970b-800wi" border="0" /></p>
<p>
It&#8217;s a fantastic new reboot of my system, and I didn&#8217;t expect to be this excited about the final result. This is not merely an incremental improvement over what I had, it&#8217;s <i>much</i> quieter, easier to work on, and when overclocked to 4.4 GHz, noticeably faster too. (I do slightly mourn <a href="http://www.codinghorror.com/blog/2011/01/24-gigabytes-of-memory-ought-to-be-enough-for-anybody.html">the loss of 8 GB of RAM</a>, but I&#8217;ll survive.)</p>
<p>
In this build, I already had hard drives, DVD drive, a sound card, and so forth &hellip; but for completeness&#8217; sake I&#8217;ll list everything here if you want to mirror this setup. Realize that some of this comes down to personal taste, so I&#8217;m just listing what <i>I</i> recommend. Feel free to change anything out, and bear in mind that Sandy Bridge has decent default onboard video as well.
</p>
<ul>
<li><a href="http://www.amazon.com/gp/product/B00503EA80/?tag=codihorr-20">Asus P8Z68-V Pro</a> $220
<li><a href="http://www.amazon.com/gp/product/B004RFBIUU/?tag=codihorr-20">Corsair Vengeance 16 GB RAM</a> $155
<li><a href="http://www.amazon.com/gp/product/B004EBUXSA/?tag=codihorr-20">Core i7-2600K CPU</a> $315
<li><a href="http://www.amazon.com/gp/product/B004O0PAKW/?tag=codihorr-20">Corsair 600T Special Edition case</a> $170
<li><a href="http://www.amazon.com/Corsair-Professional-High-Performance-850-Watt-CMPSU-850AX/dp/B003PJ6QW4/?tag=codihorr-20">Corsair 850w 80 Plus Gold PSU</a> $170
<li><a href="http://www.amazon.com/gp/product/B003NWXH9S/?tag=codihorr-20">Thermalright Venomous-X Silent Edition CPU heatsink</a> $75
<li><a href="http://www.amazon.com/OCZ-Technology-Vertex-2-5-Inch-VTX3-25SAT3-240G/dp/B004QJM1HG/?tag=codihorr-20">Vertex 3 240 GB SSD</a> $500
<li><a href="http://www.amazon.com/Western-Digital-3-5-Inch-Internal-Desktop/dp/B004YNQKRG">WD Caviar Green 3 TB HDD</a> $170
<li><a href="http://www.amazon.com/gp/product/B002XISTXM/?tag=codihorr-20">Noctua Ultra Silent 140mm Fan NF-P14 FLX</a> $25
<li><a href="http://www.amazon.com/Sapphire-DL-DVI-I-SL-DVI-D-PCI-Express-100315L/dp/B0047ZGIUK/?tag=codihorr-20">Radeon 6850 triple monitor capable video card</a> $170
</ul>
</p>
<p>
Remember, if you can put together a LEGO kit, you can build this totally sweet PC for yourself, too. Good luck and happy building!</p>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/building-a-pc-part-vii-rebooting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Performance is a Feature</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/performance-is-a-feature/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/performance-is-a-feature/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 10:46:51 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[bermuda vacation]]></category>
		<category><![CDATA[golden reference]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[opportunity cost]]></category>
		<category><![CDATA[public internet]]></category>
		<category><![CDATA[stack overflow]]></category>
		<category><![CDATA[trophy wife]]></category>
		<category><![CDATA[website loads]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/performance-is-a-feature/</guid>
		<description><![CDATA[We&#8217;ve always put a heavy emphasis on performance at Stack Overflow and Stack Exchange. Not just because we&#8217;re performance wonks (guilty!), but because we think speed is a competitive advantage. There&#8217;s plenty of experimental data proving that the slower your website loads and displays, the less people will use it. [Google found that] the page [...]]]></description>
			<content:encoded><![CDATA[<p>
We&#8217;ve always put a heavy emphasis on performance at Stack Overflow and <a href="http://stackexchange.com">Stack Exchange</a>. Not just because we&#8217;re performance wonks (guilty!), but because we think speed is a competitive advantage. There&#8217;s <a href="http://www.codinghorror.com/blog/2006/11/speed-still-matters.html">plenty of experimental data</a> proving that <b>the slower your website loads and displays, the less people will use it.</b></p>
<blockquote><p>
[Google found that] the page with 10 results took 0.4 seconds to generate. The page with 30 results took 0.9 seconds. Half a second delay caused a 20% drop in traffic. Half a second delay killed user satisfaction.</p>
<p>In A/B tests, [Amazon] tried delaying the page in increments of 100 milliseconds and found that even very small delays would result in substantial and costly drops in revenue.
</p></blockquote>
<p>
I believe the converse of this is also true. That is, the faster your website is, the <i>more</i> people will use it. This follows logically if you think like <a href="http://www.codinghorror.com/blog/2007/06/designing-for-informavores-or-why-users-behave-like-animals-online.html">an information omnivore</a>: the faster you can load the page, the faster you can tell whether that page contains what you want. Therefore, you should always favor fast websites. The opportunity cost for switching on the public internet is effectively nil, and whatever it is that you&#8217;re looking for, there are multiple websites that offer a similar experience. So how do you distinguish yourself? <b>You start by being, above all else, <i>fast</i>.</b></p>
<p>
Do you, too, <a href="http://www.youtube.com/watch?v=OlkInNZ7xis">feel the need &ndash; the need for speed?</a> If so, I have three pieces of advice that I&#8217;d like to share with you.</p>
<p><h3>1. Follow the Yahoo Guidelines. Religiously.</h3>
<p>
The golden reference standard for building a fast website remains <a href="http://www.codinghorror.com/blog/2007/08/yslow-yahoos-problems-are-not-your-problems.html">Yahoo&#8217;s 13 Simple Rules for Speeding Up Your Web Site</a> from 2007. There is one caveat, however:</p>
<blockquote><p>
There&#8217;s some good advice here, but there&#8217;s also a lot of advice that only makes sense if you run a website that gets millions of unique users per day. Do you run a website like that? If so, what are you doing reading this instead of flying your private jet to a Bermuda vacation with your trophy wife?
</p></blockquote>
<p>
So &hellip; a funny thing happened to me since I wrote that four years ago. I now run <a href="http://stackexchange.com/sites">a network of public, community driven Q&amp;A web sites</a> that <i>do</i> get millions of daily unique users. (I&#8217;m still waiting on the jet and trophy wife.) It does depend a little on the size of your site, but if you run a public website, <b>you really should <a href="http://developer.yahoo.com/performance/rules.html">pore over Yahoo&#8217;s checklist</a> and take every line of it to heart</b>. Or use the tools that do this for you:</p>
<ul>
<li><a href="http://developer.yahoo.com/yslow/">Yahoo YSlow</a>
<li><a href="http://code.google.com/speed/page-speed/">Google Page Speed</a>
<li><a href="http://tools.pingdom.com/">Pingdom Tools</a>
</ul>
<p>
We&#8217;ve long since implemented most of the 13 items on Yahoo&#8217;s list, except for one. But it&#8217;s a big one: <a href="http://developer.yahoo.com/performance/rules.html#cdn">Using a Content Delivery Network</a>.</p>
<blockquote><p>
The user&#8217;s proximity to your web server has an impact on response times. Deploying your content across multiple, geographically dispersed servers will make your pages load faster from the user&#8217;s perspective. But where should you start?</p>
<p>
As a first step to implementing geographically dispersed content, don&#8217;t attempt to redesign your web application to work in a distributed architecture. Depending on the application, changing the architecture could include daunting tasks such as synchronizing session state and replicating database transactions across server locations. Attempts to reduce the distance between users and your content could be delayed by, or never pass, this application architecture step.</p>
<p>
Remember that 80-90% of the end-user response time is spent downloading all the components in the page: images, stylesheets, scripts, Flash, etc. This is the <i>Performance Golden Rule</i>. Rather than starting with the difficult task of redesigning your application architecture, it&#8217;s better to first disperse your static content. This not only achieves a bigger reduction in response times, but it&#8217;s easier thanks to content delivery networks.
</p></blockquote>
<p>
As a final optimization step, we just <a href="http://blog.stackoverflow.com/2011/05/the-speed-of-light-sucks/">rolled out a CDN for all our static content</a>. The results are promising; the baseline here is our datacenter in NYC, so the below should be read as <i>&#8220;how much faster did our website get for users in this area of the world?&#8221;</i></p>
<p>
<img alt="Cdn-performance-test-world-map" src="http://www.codinghorror.com/.a/6a0120a85dcdae970b01543324aae7970c-800wi" border="0" /></p>
<p>
In the interests of technical accuracy, static content isn&#8217;t the complete performance picture; you still have to talk to our servers in NYC to get the dynamic content which is the meat of the page. But 90% of our visitors are anonymous, only 36% of our traffic is from the USA, and Yahoo&#8217;s research shows that <a href="http://yuiblog.com/blog/2007/01/04/performance-research-part-2/">40 to 60 percent of daily vistors come in with an empty browser cache</a>. Optimizing this cold cache performance worldwide is a <i>huge</i> win.</p>
<p>
Now, I would not recommend going <i>directly</i> for a CDN. I&#8217;d leave that until later, as there are a bunch of performance tweaks on Yahoo&#8217;s list which are free and trivial to implement. But using a CDN has gotten a heck of a lot less expensive and much simpler since 2007, with lots more competition in the space from companies like <a href="http://aws.amazon.com/cloudfront/">Amazon&#8217;s</a>, <a href="http://www.netdna.com/">NetDNA</a>, and <a href="http://www.cachefly.com/">CacheFly</a>. So when the time comes, and you&#8217;ve worked through the Yahoo list as religiously as I recommend, you&#8217;ll be ready.</p>
<p><h3>2. Love (and Optimize for) Your Anonymous <i>and</i> Registered Users</h3>
<p>
Our Q&amp;A sites are all about making the internet better. That&#8217;s why all the contributed content is <a href="http://blog.stackoverflow.com/category/cc-wiki-dump/">licensed back to the community under Creative Commons</a> and <i>always</i> visible regardless of whether you are logged in or not. I <a href="http://www.codinghorror.com/blog/2007/06/avoiding-walled-gardens-on-the-internet.html">despise walled gardens</a>. In fact, you don&#8217;t actually have to log in <i>at all</i> to participate in Q&amp;A with us. Not even a little!</p>
<p>
The primary source of our traffic is <a href="http://www.codinghorror.com/blog/2011/01/trouble-in-the-house-of-google.html">anonymous users arriving from search engines</a> and elsewhere. It&#8217;s classic &#8220;write once, read &ndash; and <a href="http://blog.stackoverflow.com/2011/02/suggested-edits-and-edit-review/">hopefully edit</a> &ndash; millions of times.&#8221; But we are also making the site richer and more dynamic for our avid community members, who definitely <i>are</i> logged in. We add features all the time, which means we&#8217;re serving up more JavaScript and HTML. There&#8217;s an unavoidable tension here between the download footprint for users who are on the site every day, and users who may visit once a month or once a year. </p>
<p>
Both classes are important, but have fundamentally different needs. Anonymous users are voracious consumers optimizing for rapid browsing, while our avid community members are the source of all the great content that drives the network. These guys (and gals) need each other, and they both deserve special treatment. <b>We design and optimize for two classes of users: anonymous, and logged in.</b> Consider the following Google Chrome network panel trace on a random Super User question I picked:</p>
<table cellpadding="2" cellspacing="2" width="640px">
<tr>
<td>&nbsp;</td>
<td>requests</td>
<td>data transferred</td>
<td>DOMContentLoaded</td>
<td>onload</td>
</tr>
<tr>
<td>Logged in (as me)</td>
<td>29</td>
<td>233.31 KB</td>
<td>1.17 s</td>
<td>1.31 s</td>
</tr>
<tr>
<td>Anonymous</td>
<td>22</td>
<td>111.40 KB</td>
<td>768 ms</td>
<td>1.28 s</td>
</tr>
</table>
<p>
We minimize the footprint of HTML, CSS and Javascript for anonymous users so they get their pages <i>even faster</i>. We load a stub of very basic functionality and dynamically &#8220;rez in&#8221; things like editing when the user focuses the answer input area. For logged in users, the footprint is necessarily larger, but we can also add features for our most avid community members at will without fear of harming the experience of the vast, silent majority of anonymous users.</p>
<p><h3>3. Make Performance a Point of (Public) Pride</h3>
<p>
Now that we&#8217;ve exhausted the Yahoo performance guidance, and made sure we&#8217;re serving the absolute minimum necessary to our anonymous users &ndash; where else can we go for performance? Back to our code, of course. </p>
<p>
When it comes to website performance, there is no getting around one fundamental law of the universe: <b>you can never serve a webpage faster than it you can render it on the server.</b> I know, duh. But I&#8217;m telling you, it&#8217;s very easy to fall into the trap of not noticing a few hundred milliseconds here and there over the course of a year or so of development, and then one day you turn around and your pages are taking almost a full freaking second to render on the server. It&#8217;s a heck of a liability to start <i>1 full second in the hole</i> before you&#8217;ve even transmitted your first byte over the wire!</p>
<p>
That&#8217;s why, as a developer, you need to put performance right in front of your face on every single page, all the time. That&#8217;s exactly what we did with our <a href="http://code.google.com/p/mvc-mini-profiler/">MVC Mini Profiler</a>, which we are contributing back to the world as open source. The simple act of <b>putting a render time in the upper right hand corner of every page we serve</b> forced us to fix all our performance regressions and omissions.</p>
<p>
<a href="http://code.google.com/p/mvc-mini-profiler/"><img alt="Mvc-mini-profiler-question-page" src="http://www.codinghorror.com/.a/6a0120a85dcdae970b014e89452246970d-800wi" border="0" /></a></p>
<p>
(Note that you can click on the SQL linked above to see what&#8217;s actually being run and how long it took in each step. <i>And</i> you can use the share link to share the profiler data for this run with your fellow developers to <s>shame them</s> diagnose a particular problem. <i>And</i> it works for multiple AJAX requests. Have I mentioned that our open source MVC Mini Profiler is totally freaking awesome? If you&#8217;re on a .NET stack, you should really <a href="http://code.google.com/p/mvc-mini-profiler/">check it out</a>. )</p>
<p>
In fact, with the render time appearing on every page for everyone on the dev team, <b>performance became a point of pride</b>. We had so many places where we had just gotten a <i>little</i> sloppy or missed some <i>tiny</i> thing that slowed a page down inordinately. Most of the performance fixes were trivial, and even the ones that were not turned into fantastic opportunities to rearchitect and make things simpler and faster for all of our users.</p>
<p>
Did it work? You bet your sweet <a href="http://msdn.microsoft.com/en-us/library/496e4ekx.aspx">ILAsm</a> it worked:</p>
<p>
<img alt="Google-webmaster-crawl-stats-download-time" src="http://www.codinghorror.com/.a/6a0120a85dcdae970b0154332506cc970c-800wi" border="0" /></p>
<p>
That&#8217;s the Google crawler page download time; the experimental Google <a href="http://www.google.com/support/webmasters/bin/answer.py?answer=158541">Site Performance page</a>, which ostensibly reflects complete full-page browser load time, confirms the improvements:</p>
<p>
<img alt="Google-webmaster-site-performance-overview" src="http://www.codinghorror.com/.a/6a0120a85dcdae970b015433250717970c-800wi" border="0" /></p>
<p>
While server page render time is only part of the performance story, it is the baseline from which you start. I cannot emphasize enough how much the simple act of putting the page render time on the page helped us, as a development team, build a dramatically faster site. Our site was always relatively fast, but even for a historically &#8220;fast&#8221; site like ours, we realized huge gains in performance from this one simple change.</p>
<p>
I won&#8217;t lie to you. Performance isn&#8217;t easy. It&#8217;s been a long, hard road getting to where we are now &ndash; and we&#8217;ve thrown a lot of unicorn dollars toward <a href="http://blog.serverfault.com/post/1432571770/">really nice hardware</a> to run everything on, though I wouldn&#8217;t call any of our hardware choices particularly extravagant. And I did <a href="http://www.codinghorror.com/blog/2008/12/hardware-is-cheap-programmers-are-expensive.html">follow my own advice</a>, for the record.</p>
<p>
I distinctly remember switching from AltaVista to Google back in 2000 in no small part because it was blazing fast. To me, <b>performance is a feature</b>, and I simply like using fast websites more than slow websites, so naturally I&#8217;m going to build a site that I would want to use. But I think there&#8217;s also a lesson to be learned here about the competitive landscape of the public internet, where there are two kinds of websites: <b>the quick and the dead</b>.</p>
<p>
Which one will you be?</p>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/performance-is-a-feature/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Geek Transportation Systems</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/geek-transportation-systems/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/geek-transportation-systems/#comments</comments>
		<pubDate>Thu, 16 Jun 2011 02:52:10 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[dangerous fun]]></category>
		<category><![CDATA[fog creek software]]></category>
		<category><![CDATA[forms of transportation]]></category>
		<category><![CDATA[greatest weakness]]></category>
		<category><![CDATA[having children]]></category>
		<category><![CDATA[rear foot]]></category>
		<category><![CDATA[solid construction]]></category>
		<category><![CDATA[top choice]]></category>
		<category><![CDATA[wheeled vehicle]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/geek-transportation-systems/</guid>
		<description><![CDATA[On my first visit to the Fog Creek Software offices in 2008, I was surprised to see programmers zooming around the office on scooters. I didn&#8217;t realize that scooters were something geeks would be into, but it sure looked like fun, albeit borderline dangerous fun, on the 25th floor of an office building in Manhattan. [...]]]></description>
			<content:encoded><![CDATA[<p>
On my first visit to the Fog Creek Software offices in 2008, I was surprised to see programmers zooming around the office on scooters. I didn&#8217;t realize that scooters were something geeks would be into, but it sure looked like fun, albeit borderline <i>dangerous</i> fun, on the 25th floor of an office building in Manhattan.</p>
<p>
It turns out that having children is a great <s>excuse</s> reason to get into fun things like scooters. I didn&#8217;t know much about scooters for adults, so being an obsessive geek, of course I had to research the heck out of this topic. My research turned up the <a href="http://www.amazon.com/gp/product/B001LUQGYC/codinghorror-20">Xootr MG</a> as a top choice.</p>
<p>
<a href="http://www.amazon.com/gp/product/B001LUQGYC/codinghorror-20"><img alt="Xootr-mg-scooter" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/c5b54_6a0120a85dcdae970b01538f170506970b-800wi" border="0" /></a></p>
<p>
News flash: scooters <i>are</i> fun. Really fun!</p>
<p>
But per my research (and now, personal experience) <b>scooters are also surprisingly practical forms of transportation in certain situations</b>, namely when &hellip;</p>
<ul>
<li>you need to travel 1-3 miles</li>
<li>the route is not too hilly</li>
<li>it is not raining or wet</li>
<li>the route is mostly paved or has sidewalks</li>
<li>you are comfortable being &#8220;that awkward looking guy on a scooter&#8221;</li>
</ul>
<p>
Scooters are <i>very</i> primitive machines; it is both their greatest strength and their greatest weakness. It&#8217;s arguably the simplest personal wheeled vehicle there is. In these short distance scenarios, scooters tend to win over, say, bicycles because there&#8217;s less setup and teardown necessary &ndash; you don&#8217;t have to lock up a scooter, nor do you have to wear a helmet (though I highly recommend one). Just hop on and go! You get almost all the benefits of gravity and wheeled efficiency with a minimum of fuss and maintenance. And yes, it&#8217;s fun, too!</p>
<p>
I&#8217;m just a scooter newbie, but the <a href="http://www.amazon.com/gp/product/B001LUQGYC/codinghorror-20">Xootr MG</a> has a few characteristics I liked a lot, including rock-solid construction, a front brake (not super efficient, but reasonably effective when combined with the rear foot fender brake), and a wide, comfortable platform for your feet. But it does take some effort to kick around &ndash; don&#8217;t forget to alternate your legs &ndash; and the ride can be rough at times depending on the surface. Large bumps and very uneven surfaces are wreck material. And going uphill on a scooter, beyond the absolute wussiest and mildest of grades, is simply out of the question.</p>
<p>
For longer distances, or if the terrain is rougher or hillier, a scooter might work, but it&#8217;d be a tough way to travel. What you need in those cases is a small, portable bicycle &ndash; one you can take with you. I&#8217;ve dabbled in foldable bicycles before, and we own two <a href="http://www.amazon.com/gp/search?ie=UTF8&amp;keywords=dahon%20folding%20bicycle&amp;tag=codinghorror-20">Dahon folding bicycles</a>. They&#8217;re great, versatile and inexpensive bikes. </p>
<p>
<a href="http://www.amazon.com/gp/search?ie=UTF8&amp;keywords=dahon%20folding%20bicycle&amp;tag=codinghorror-20"><img alt="New-foldable-bikes" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/a3ff9_6a0120a85dcdae970b01538f17003b970b-800wi" border="0" /></a></p>
<p>
Dahon makes fine traditional folding bicycles, but they are not quite as pick-up-and-go as I would like for short trips. As an experiment, I purchased something I&#8217;ve had my eye on for a long time: the <a href="http://www.amazon.com/gp/product/B003BO4PKI/codinghorror-20">Strida LT</a> folding bicycle. Or, as I like to call it, my &#8220;mid-life crisis vehicle&#8221;.</p>
<p>
<a href="http://www.amazon.com/gp/product/B003BO4PKI/codinghorror-20"><img alt="Strida-green-side" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/e5d35_6a0120a85dcdae970b01538f17503f970b-800wi" border="0" /></a></p>
<p>
(also pictured: some cool accessories that I recommend for Strida owners: a Cateye Reflex rear LED light on the rack, Knog beetle silicone front LED light on the handlebars, and a Sunlite Bicycle bungie cargo net.)</p>
<p>
The appeal of the Strida is that it folds down to an <i>incredibly</i> small size. </p>
<p>
<a href="http://www.amazon.com/gp/product/B003BO4PKI/codinghorror-20"><img class="asset  asset-image at-xid-6a0120a85dcdae970b014e890a8d60970d image-full" alt="Strida-green-folded" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/1ff43_6a0120a85dcdae970b014e890a8d60970d-800wi" border="0" /></a></p>
<p>
It&#8217;s almost a pogo stick in folded form. I took my Strida on a short trip into San Francisco for a speaking gig in the city, which involved riding on BART, and the Strida in practice is <b>everything I dreamed a modern ultra-portable folding bicycle could be</b>:</p>
<ul>
<li>front and rear disc brakes; superb stoppers
<li>belt drive so no grease on your hands or pants
<li>built in fenders in case you encounter puddles or rain
<li>comfortable, full size(ish) upright riding position
<li>super-easy, crazy fast folding: <a href="http://www.youtube.com/watch?v=y0qx95hxyuQ">five seconds, no kidding!</a>
<li>when folded, the bike can be propped by the rear rack (as pictured) or strolled along by rolling it on its wheels.
</ul>
<p>
The Strida may look odd, and perhaps it is odd, but I found it to be shockingly close to an ideal go-anywhere do-anything convenience bicycle. It isn&#8217;t perfect, of course:</p>
<ul>
<li>My only real beef with the Strida: the seat adjustment is <i>horrendously</i> kludgey. Adjusting the seat height on a Strida is painfully awkward even in the garage; on the go it&#8217;s not an option.
<li>It is a small wheel bicycle, with all the unavoidable physical compromises that entails. It&#8217;ll always be a little twitchy and not something you would want to go on a 10 or 20 mile ride with.
<li>It&#8217;s a single speed, and you&#8217;re not supposed to stand out of the saddle for power pedaling at any time. The frame and belt drive won&#8217;t take it. On anything other than a moderate uphill you&#8217;ll need to hop off and walk. (There is a slightly fancier Strida that has two internal hub gears, but I know nothing about it.)
<li>Because the fold involves a ball joint, it <i>is</i> possible to permanently damage the bike if you aren&#8217;t careful when you fold and force it. I doubt this is a real concern for anyone who has folded a Strida more than once, but if a ham-fisted friend tries to fold your Strida to &#8220;test it out&#8221;, you might be in trouble.
</ul>
<p>
None of these criticisms apply to the Dahon, so hopefully you can get a sense of the dividing line between an ultra-folder and a plain old folding bicycle.</p>
<p>
Being a geek, it&#8217;s <a href="http://www.codinghorror.com/blog/2007/10/geek-diet-and-exercise-programs.html">not like I spend a lot of time outdoors</a>. But when I do venture outside, I like to travel in a manner befitting a geek. That is, with my <a href="http://www.codinghorror.com/blog/2010/08/whats-on-your-utility-belt.html">utility belt fully equipped</a>, and in the <i>dorkiest, most efficient vehicle possible</i> for a trip of that particular length. Scooters, folding bicycles, recumbents, pogo sticks &hellip; whatever it takes. If you, too, would like to geek out around town, consider adding the <a href="http://www.amazon.com/gp/product/B001LUQGYC/codinghorror-20">Xootr MG scooter</a> and <a href="http://www.amazon.com/gp/product/B003BO4PKI/codinghorror-20">Strida LT folding bicycle</a> to your stable of geek transportation systems.</p>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/geek-transportation-systems/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Suspension, Ban or Hellban?</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/suspension-ban-or-hellban/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/suspension-ban-or-hellban/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 23:51:52 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[form of government]]></category>
		<category><![CDATA[frontier town]]></category>
		<category><![CDATA[hellip]]></category>
		<category><![CDATA[homebrewing]]></category>
		<category><![CDATA[initial suspension]]></category>
		<category><![CDATA[new frontier]]></category>
		<category><![CDATA[problematic behaviors]]></category>
		<category><![CDATA[stack overflow]]></category>
		<category><![CDATA[tiny minority]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/suspension-ban-or-hellban/</guid>
		<description><![CDATA[For almost eight months after launching Stack Overflow to the public, we had no concept of banning or blocking users. Like any new frontier town in the wilderness of the internet, I suppose it was inevitable that we&#8217;d be obliged to build a jail at some point. But first we had to come up with [...]]]></description>
			<content:encoded><![CDATA[<p>
For almost eight months after launching Stack Overflow to the public, we had no concept of banning or blocking users. Like any new frontier town in the wilderness of the internet, I suppose it was inevitable that we&#8217;d be obliged to build a jail at some point. But first we had to come up with some form of <i>government</i>. </p>
<p>
Stack Overflow was always intended to be a democracy. With the <a href="http://stackexchange.com/sites">Stack Exchange Q&amp;A network</a>, we&#8217;ve come a long way towards that goal:</p>
<ul>
<li>We create new communities through the open, democratic process defined at <a href="http://area51.stackexchange.com/">Area 51</a>.
<li>Our communities are maintained and operated by the most avid citizens within that community. The more reputation you have, the more <a href="http://blog.stackoverflow.com/2010/10/membership-has-its-privileges/">privileges you earn</a>.
<li>We hold <a href="http://blog.stackoverflow.com/2010/12/stack-exchange-moderator-elections-begin/">yearly moderator elections</a> once each community is large enough to support them.
</ul>
<p>
We strive mightily to build self organizing, self governing communities of people who are passionate about a topic, whether it be <a href="http://mechanics.stackexchange.com/">motor vehicles</a> or <a href="http://homebrew.stackexchange.com/">homebrewing</a> or <a href="http://music.stackexchange.com/">musical instruments</a>, or &hellip; <a href="http://area51.stackexchange.com/"><i>whatever</i></a>. Our general philosophy is <i>power to the people</i>.</p>
<p>
<img class="asset  asset-image at-xid-6a0120a85dcdae970b01538eefee40970b" alt="Power-to-the-people" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/ef612_6a0120a85dcdae970b01538eefee40970b-800wi" border="0" /></p>
<p>
But in the absence of <i>some</i> system of law, the tiny minority of users out to do harm &ndash; intentionally or not &ndash; eventually drive out all the civil community members, leaving behind a lawless, chaotic badland.</p>
<p>
Our method of dealing with disruptive or destructive community members is simple: <b>their accounts are placed in timed suspension.</b> Initial suspension periods range from 1 to 7 days, and increase exponentially with each subsequent suspension. We prefer the term &#8220;timed suspension&#8221; to &#8220;ban&#8221; to emphasize that we <i>do</i> want users to come back to their accounts, <i>if</i> they can learn to refrain from engaging in those disruptive or problematic behaviors. It&#8217;s not so much a punishment as a time for the user to cool down and reflect on the nature of their participation in our community. (Well, at least in theory.)</p>
<p>
Timed suspension works, but much like democracy itself, it is a highly imperfect, noisy system. The transparency provides ample evidence that moderators aren&#8217;t secretly whisking people away in the middle of the night. But it can also be a bit too &hellip; <i>entertaining</i> for some members of the community, leading to hours and hours of meta-discussion about who is suspended, why they are suspended, whether it was <i>fair</i>, what the <i>evidence</i> is, how we are <i>censoring</i> people, and on and on and on. While a certain amount of introspection is important and necessary, it can also become <a href="http://www.codinghorror.com/blog/2009/07/meta-is-murder.html">a substitute for getting stuff done</a>. This might naturally lead one to wonder &ndash; <b>what if we could suspend problematic users without anyone knowing they had been suspended?</b></p>
<p>
There are three primary forms of secretly suspending users that I know of:</p>
<ol>
<li>A <b>hellbanned</b> user is invisible to all other users, but crucially, not himself. From their perspective, they are participating normally in the community but <i>nobody ever responds to them</i>. They can no longer disrupt the community because they are effectively a ghost. It&#8217;s a clever way of enforcing the &#8220;don&#8217;t feed the troll&#8221; rule in the community. When nothing they post ever gets a response, a hellbanned user is likely to get bored or frustrated and leave. I believe it, too; if I learned anything from reading <a href="http://www.amazon.com/dp/0803725906/?tag=codinghorror-20">The Great Brain</a> as a child, it&#8217;s that the silent treatment is the cruelest punishment of them all.
<p>
I&#8217;ve always associated hellbanning with the Something Awful Forums. Per <a href="http://ask.metafilter.com/117775/What-was-the-first-website-to-hide-trolls-activity-to-everyone-but-the-troll-himself">this amazing MetaFilter discussion</a>, it turns out the roots of hellbanning go much deeper &ndash; all the way back to an early Telnet BBS system called <a href="http://anticlimactic.retrovertigo.com/">Citadel</a>, where the &#8220;problem user bit&#8221; was introduced around 1986. Like so many other things in social software, it keeps getting reinvented over and over again by <a href="http://www.wired.com/techbiz/people/magazine/17-04/st_thompson">clueless software developers</a> who believe they&#8217;re the first programmer smart enough to figure out how people work. It&#8217;s supported in most popular forum and blog software, as documented in the <a href="http://drupal.org/project/cave">Drupal Cave module</a>.</p>
<p>
(There is one additional form of hellbanning that I feel compelled to mention because it is particularly cruel &ndash; when hellbanned users can see only themselves <i>and other hellbanned users</i>. Brrr. I&#8217;m pretty sure Dante wrote a chapter about that, <a href="http://en.wikipedia.org/wiki/Inferno_(Dante)">somewhere</a>.)</p>
<li>A <b>slowbanned</b> user has delays forcibly introduced into every page they visit. From their perspective, your site has just gotten terribly, horribly slow. And stays that way. They can hardly disrupt the community when they&#8217;re struggling to get web pages to load. There&#8217;s also science behind this one, because <a href="http://www.codinghorror.com/blog/2006/11/speed-still-matters.html">per research from Google and Amazon</a>, every page load delay directly reduces participation. Get slow enough, for long enough, and a slowbanned user is likely to seek out greener and speedier pastures elsewhere on the internet.
<p><li>An <b>errorbanned</b> user has errors inserted at random into pages they visit. You might consider this a more severe extension of slowbanning &ndash; instead of pages loading slowly, they might not load at all, return cryptic HTTP errors, return the wrong page altogether, fail to load key dependencies like JavaScript and images and CSS, and so forth. I&#8217;m sure your devious little brains can imagine dozens of ways things could go &#8220;wrong&#8221; for an errorbanned user. This one is a bit more esoteric, but it isn&#8217;t theoretical; an existing implementation exists in the form of the <a href="http://drupal.org/project/misery">Drupal Misery module</a>.
</ol>
<p>
Because we try to hew so closely to the real world model of democracy with Stack Exchange, I&#8217;m not quite sure how I feel about these sorts of reality-altering tricks that are impossible in the world of atoms. On some level, they feel disingenuous to me. And it&#8217;s a bit like <a href="http://en.wikipedia.org/wiki/It's_a_Good_Life_(The_Twilight_Zone)">wishing users into the cornfield</a> with superhuman powers far beyond the ken of normal people. But I&#8217;ve also spent many painful hours trapped in public dialog about users who were, <i>at best</i>, just wasting everyone&#8217;s time. Democracy is a wonderful thing, but efficient, it ain&#8217;t.</p>
<p>
That said, every community is different. I&#8217;ve personally talked to people in charge of large online communities &ndash; ones you probably participate in every day &ndash; and part of the reason those communities <i>haven&#8217;t</i> broken down into utter chaos by now is because they secretly <b>hellban</b> and <b>slowban</b> their most problematic users. These solutions do neatly solve the problem of getting troublesome users to &#8220;voluntarily&#8221; decide to leave a community with a minimum of drama. It&#8217;s hard to argue with techniques that are proven to work.</p>
<p>
I think everyone has a right to know what sort of jail their community uses, even these secret, invisible ones. But keep in mind that whether it&#8217;s timed suspensions, traditional bans, or exotic hellbans and beyond, the goal is the same: civil, sane, and safe online communities for everyone. </p>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/suspension-ban-or-hellban/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>The Infinite Version</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-infinite-version/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-infinite-version/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 23:51:33 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[dogtags]]></category>
		<category><![CDATA[epochs]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[internet explorer 7]]></category>
		<category><![CDATA[low hanging fruit]]></category>
		<category><![CDATA[microsoft history]]></category>
		<category><![CDATA[new icon]]></category>
		<category><![CDATA[speech input]]></category>
		<category><![CDATA[two and a half years]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-infinite-version/</guid>
		<description><![CDATA[One of the things I like most about Google&#8217;s Chrome web browser is how often it is updated. But now that Chrome has rocketed through eleven versions in two and a half years, the thrill of seeing that version number increment has largely worn off. It seems they&#8217;ve picked off all the low hanging fruit [...]]]></description>
			<content:encoded><![CDATA[<p>
One of the things I like most about Google&#8217;s Chrome web browser is <a href="http://www.codinghorror.com/blog/2010/09/go-that-way-really-fast.html">how often it is updated</a>. But now that Chrome has rocketed through <a href="http://en.wikipedia.org/wiki/Google_Chrome#Release_history">eleven versions in two and a half years</a>, the thrill of seeing that version number increment has largely worn off. It seems they&#8217;ve picked off all the low hanging fruit at this point and are mostly polishing. The highlights from <b>Version 11</b>, the current release of Chrome?</p>
<blockquote><p>
HTML5 Speech Input API. Updated icon.
</p></blockquote>
<p>
Exciting, eh? Though there was no shortage of hand-wringing over the new icon, <a href="http://www.google.com/search?q=new+google+chrome+icon+sucks">of course</a>.</p>
<p>
Chrome&#8217;s version number has been changing so rapidly lately that every time someone opens a Chrome bug on a Stack Exchange site, I have to check my version against theirs just to make sure we&#8217;re still talking about the same software. And once &#8212; I swear I am not making this up &#8212; <i>the version incremented while I was checking the version</i>.</p>
<p>
<a href="http://twitter.com/#!/codinghorror/status/64432690597871616"><br />
<img alt="another nanosecond, another Chrome version." src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/929ea_6a0120a85dcdae970b014e889ba13c970d-800wi" border="0" /><br />
</a></p>
<p>
That was the day I officially stopped caring what version Chrome is. I mean, I care in the sense that sometimes <a href="http://www.codinghorror.com/blog/2007/02/whats-in-a-version-number-anyway.html">I need to check its dogtags in battle</a>, but as a regular user of Chrome, I no longer think of myself as using <i>a specific version</i> of Chrome, I just &hellip; use Chrome. Whatever the latest version is, I have it automagically.</p>
<p>
For the longest time, web browsers have been strongly associated with specific versions. The very mention of Internet Explorer 6 or Netscape 4.77 should send a shiver down the spine of any self-respecting geek. And for good reason! Who can forget what a breakout hit Firefox 3 was, or the epochs that Internet Explorer 7, 8 and 9 represent in Microsoft history. But Chrome? <b>Chrome is so fluid that it has transcended software versioning altogether.</b></p>
<p>
<img alt="Chrome-infinite-version" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/9fcf6_6a0120a85dcdae970b0154327b11c0970c-800wi" border="0" /></p>
<p>
This fluidity is difficult to achieve for client software that runs on millions of PCs, Macs, and other devices. Google put an extreme amount of engineering effort into making the Chrome auto-update process &#8220;just work&#8221;. They&#8217;ve <a href="http://blog.chromium.org/2009/07/smaller-is-faster-and-safer-too.html">optimized the heck out of the update process</a>.</p>
<blockquote><p>
Rather then push put a whole new 10MB update [for each version], we send out a diff that takes the previous version of Google Chrome and generates the new version. We tried several binary diff algorithms and have been using bsdiff up until now. We are big fans of <a href="http://www.daemonology.net/bsdiff/">bsdiff</a> &#8211; it is small and worked better than anything else we tried.</p>
<p>
But bsdiff was still producing diffs that were bigger than we felt were necessary. So we wrote a new diff algorithm that knows more about the kind of data we are pushing &#8211; large files containing compiled executables. Here are the sizes for the recent 190.1 -&gt; 190.4 update on the developer channel:</p>
<ul>
<li>Full update: 10 megabytes
<li>bsdiff update: 704 kilobytes
<li>Courgette update: 78 kilobytes
</ul>
<p>
The small size in combination with Google Chrome&#8217;s silent update means we can update as often as necessary to keep users safe.
</p></blockquote>
<p>
Google&#8217;s <a href="http://dev.chromium.org/developers/design-documents/software-updates-courgette">Courgette</a> &#8212; the French word for Zucchini, oddly enough &#8212; is an amazing bit of software optimization, capable of producing uncannily small diffs of binary executables. To achieve this, it has to know intimate details about the source code:</p>
<blockquote><p>
The problem with compiled applications is that even a small source code change causes a disproportional number of byte level changes.  When you add a few lines of code, for example, a range check to prevent a buffer overrun, all the subsequent code gets moved to make room for the new instructions.  The compiled code is full of internal references where some instruction or datum contains the address (or offset) of another instruction or datum.  It only takes a few source changes before almost all of these internal pointers have a different value, and there are a lot of them &#8211; roughly half a million in a program the size of chrome.dll.</p>
<p>
The source code does not have this problem because all the entities in the source are symbolic. Functions don&#8217;t get committed to a specific address until very late in the compilation process, during assembly or linking.  If we could step backwards a little and make the internal pointers symbolic again, could we get smaller updates?
</p></blockquote>
<p>
Since the version updates are relatively small, they can be downloaded in the background. But even Google hasn&#8217;t figured out how to install an update while the browser is running. Yes, there are little alert icons to let you know your browser is out of date, and you eventually do get nagged if you are woefully behind, but <b>updating <i>always</i> requires the browser to restart</b>.</p>
<p>
<a href="http://www.flickr.com/photos/factoryjoe/4841343705/"><img alt="Please-restart-google-chrome" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/150d8_6a0120a85dcdae970b01538ea83cb9970b-800wi" border="0" /></a></p>
<p>
Web applications have it far easier, but they have version delivery problems, too. Consider WordPress, one of the largest and most popular webapps on the planet. We run WordPress on multiple blogs and even have <a href="http://wordpress.stackexchange.com/">our own WordPress community</a>. WordPress doesn&#8217;t auto-update to each new version, but it makes it as painless as I&#8217;ve seen for a webapp. Click the update link on the dashboard and WordPress (and its add-ons) update to the latest version all by themselves. There might be the briefest of interruptions in service for visitors to your WordPress site, but then you&#8217;re back in business with the latest update.</p>
<p>
<img alt="Wordpress-update" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/e53cf_6a0120a85dcdae970b014e889bd9cc970d-800wi" border="0" /></p>
<p>
<b>WordPress needs everyone to update to the latest versions regularly</b> for the same reasons Google Chrome does &#8212; security, performance, and stability. An internet full of old, unpatched WordPress or Chrome installations is no less dangerous than an internet full of old, unpatched Windows XP machines. </p>
<p>
These are both relatively seamless update processes. But they&#8217;re nowhere near as seamless as they <i>should</i> be. <b>One click updates that require notification and restart aren&#8217;t good enough.</b> To achieve the infinite version, we software engineers have to go a lot deeper.</p>
<p>
<a href="http://twitter.com/#!/jilliancyork/status/50024539610034176"><br />
<img alt="Twitter-google-docs-infinite-version" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/e53cf_6a0120a85dcdae970b01538ea8419e970b-800wi" border="0" /></a></p>
<p>
Somehow, we have to be able to automatically update software while it is running without interrupting the user at all. <b>Not <i>if</i> &#8212; but <i>when</i> &#8212; the infinite version arrives</b>, our users probably won&#8217;t even know. Or care. And that&#8217;s how we&#8217;ll know we&#8217;ve achieved our goal.</p>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-infinite-version/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Who Needs a Sound Card, Anyway?</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/who-needs-a-sound-card-anyway/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/who-needs-a-sound-card-anyway/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 23:50:59 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[edge pc]]></category>
		<category><![CDATA[maximum bang]]></category>
		<category><![CDATA[pc gamer]]></category>
		<category><![CDATA[plausible case]]></category>
		<category><![CDATA[snake oil]]></category>
		<category><![CDATA[sound chips]]></category>
		<category><![CDATA[sound hardware]]></category>
		<category><![CDATA[sound processing]]></category>
		<category><![CDATA[worth thousands]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/who-needs-a-sound-card-anyway/</guid>
		<description><![CDATA[The last sound card I purchased was in 2006, and that&#8217;s only because I&#8217;m (occasionally) a bleeding edge PC gamer. The very same card was still in my current PC until a few days ago. It&#8217;s perhaps too generous to describe PC sound hardware as stagnant; it&#8217;s borderline irrelevant. The default, built-in sound chips on [...]]]></description>
			<content:encoded><![CDATA[<p>
The last sound card I purchased was in 2006, and that&#8217;s only because I&#8217;m (occasionally) a bleeding edge PC gamer. The very same card was still in my current PC until a few days ago. It&#8217;s perhaps too generous to describe PC sound hardware as stagnant; it&#8217;s borderline <i>irrelevant</i>.</p>
<p>
<b>The default, built-in sound chips on most motherboards have evolved from &#8220;totally crap&#8221; to &#8220;surprisingly decent&#8221; in the last 5 years.</b> But besides that, in this era of ubiquitous quad core CPUs nearing 4 GHz, it&#8217;d be difficult to make a plausible case that you <i>need</i> a discrete set of silicon to handle sound processing, even for <a href="http://www.codinghorror.com/blog/2006/01/3d-positional-audio-and-hrtfs.html">the very fanciest of 3D sound algorithms and HRTFs</a>.</p>
<p>
That said, if you enjoy music even a <i>little</i>, I still strongly recommend investing in a quality set of headphones. As I wrote in 2005&#8242;s <a href="http://www.codinghorror.com/blog/2005/12/headphone-snobbery.html">Headphone Snobbery</a>:</p>
<blockquote><p>
<b>Am I really advocating spending two hundred dollars on a set of headphones?</b> <i>Yes. Yes I am.</i> Now, you could spend a lot more. This is about extracting the maximum bang for your buck:</p>
<ol>
<li>Unlike your computer, or your car, your headphones will never wear out or become obsolete. I hesitate to say lifetime, but they&#8217;re multiple decade investments at the very least.
<li>The number one item that affects the music you hear is the speakers. Without a good set of headphones, everything else is irrelevant.
<li>The right headphones can deliver sound equivalent to extremely high-end floorstanding speakers worth thousands of dollars.
</ol>
<p>
If you&#8217;re the type of person who is perfectly happy listening to 64 kilobit MP3s through a $5 set of beige headphones, that&#8217;s fine. There&#8217;s nothing wrong with that. Keep on scrolling; this post is not for you.
</p></blockquote>
<p>
I realize that there&#8217;s a fine line between audiophile and bats**t insane &#8212; <i>and that line better not be near any sources of interference!</i> But nice headphones require powerful, reasonably clean output to deliver the best listening experience. This isn&#8217;t <a href="http://www.amazon.com/AudioQuest-K2-terminated-speaker-cable/dp/B000J36XR2">high end audio crackpot snake oil</a>, it&#8217;s actual physics.</p>
<p>
I&#8217;ll let the guys at headroom <a href="http://www.headphone.com/learning-center/how-do-i-know-if-my-headphones-need-an-amp.php">explain</a>:</p>
<blockquote><p>
You may have heard of a headphone&#8217;s &#8220;impedance.&#8221; Impedance is the combined resistance and reactivity the headphones present to the amplifier as an electrical load. High impedance cans will usually need more voltage to get up to a solid listening level, so they will often benefit from an amp, especially with portable players that have limited voltage available from their internal batteries. But low impedance cans may require more current, and will lower the damping factor between the amp and headphones. So while low impedance headphones may be driven loud enough from a portable player, the quality of sound may be dramatically improved with an amp.</p>
<p>
The size of your headphone will give you some clues to whether an amp may be warranted. Most earbud and in ear headphones are typically very efficient and are less likely to benefit strongly from an amp. Many larger headphones will benefit, or even require, a headphone amp to reach listenable volume levels with portable players.
</p></blockquote>
<p>
Thus, once you have a set of nice headphones, you <i>do</i> need some kind of amplified output for them. Something like the <a href="http://boostaroo.com/">Boostaroo</a>, or a <a href="http://www.amazon.com/exec/obidos/ASIN/B003WXBFS8/codinghorror-20">Total BitHead</a>. And if you&#8217;re on a laptop these outboard solutions might be your only options.</p>
<p>
<a href="http://www.amazon.com/exec/obidos/ASIN/B003WXBFS8/codinghorror-20"><img alt="Total-bithead" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/77157_6a0120a85dcdae970b014e883fc211970d-800wi" border="0" /></a></p>
<p>
But desktops offer the option of adding a sound card. The good news is that <b>arguably the best sound card on the planet, the <a href="http://www.dpbolvw.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16829132020%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Sound%2BCard-_-ASUS-_-29132020&amp;cjsku=N82E16829132020">Xonar DG</a>, is all of 30 measly bucks.</b> It&#8217;s a big step up in fundamental sound quality from even the best current integrated HD audio motherboard sound chips, per <a href="http://techreport.com/articles.x/19997/1">this Tech Report review</a>.</p>
<table width="700">
<tr>
<td width="*"></td>
<td colspan="9"><a href="http://audio.rightmark.org">RightMark Audio Analyzer</a> audio quality, 16-bit/44.1kHz</td>
</tr>
<tr>
<td width="*"></td>
<td align="center" width="60">freq response</td>
<td align="center" width="60">noise level</td>
<td align="center" width="60">range</td>
<td align="center" width="60">THD</td>
<td align="center" width="60">THD + Noise</td>
<td align="center" width="60">IMD + Noise</td>
<td align="center" width="60">crosstalk</td>
<td align="center" width="60">IMD at 10kHz</td>
<td align="center" width="60">overall</td>
</tr>
<tr>
<td width="*">Realtek ALC892 HD</td>
<td align="center" width="60">5</td>
<td align="center" width="60">4</td>
<td align="center" width="60">4</td>
<td align="center" width="60">3</td>
<td align="center" width="60">1</td>
<td align="center" width="60">3</td>
<td align="center" width="60">5</td>
<td align="center" width="60">3</td>
<td align="center" width="60">4</td>
</tr>
<tr>
<td width="*"><a href="http://www.dpbolvw.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16829132020%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Sound%2BCard-_-ASUS-_-29132020&amp;cjsku=N82E16829132020">Xonar DG</a></td>
<td align="center" width="60">5</td>
<td align="center" width="60">6</td>
<td align="center" width="60">6</td>
<td align="center" width="60">5</td>
<td align="center" width="60">4</td>
<td align="center" width="60">6</td>
<td align="center" width="60">6</td>
<td align="center" width="60">6</td>
<td align="center" width="60">5</td>
</tr>
</table>
<p>It also includes a little something extra of particular interest to us music loving programmers with nice headphones:</b></p>
<blockquote><p>
<b>Built-in headphone amplification</b> is something you won&#8217;t find on a motherboard, but it&#8217;s featured in both Xonars. On the DG, Asus has gone with Texas Instruments&#8217; DRV601RTJR, which is optimized for headphone impedances of 32-150 &Omega; according to the card&#8217;s spec sheet. The Xense gets something considerably fancier: a TI amp capable of pushing headphones with impedances up to 600 &Omega;. Of course, the headphones bundled with the card are rated for an impedance of only 150 &Omega;. Mid-range stereo cans like Sennheiser&#8217;s excellent HD 555s, which we use for listening tests, have a rated impedance of just 50 &Omega;. You don&#8217;t need big numbers for high-quality sound.
</p></blockquote>
<p>
The headphone amplification options are a bit buried in the Xonar driver user interface. To get there, select headphone mode, then click the little hammer icon to bring up the headphone amp gain settings.</p>
<p>
<img alt="Xonar-dg-audio-center-headphones" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/4045d_6a0120a85dcdae970b0154321f2ec1970c-800wi" border="0" /></p>
<p>
After my last upgrade, I was truly hoping I could get away with just the on-board Realtek HD audio my motherboard provides. I resisted mightily &#8212; but the drop in headphone output quality with the onboard stuff was noticeable. Not to mention that I had to absolutely <i>crank</i> the volume to get even moderate loudness with my fancy-ish Sennheiser HD 600 headphones. The Xonar DG neatly solves both of these problems.</p>
<p>
As you probably expected, the answer to the question &#8220;Who needs a sound card?&#8221; is &#8220;Almost nobody.&#8221; <i>Except those of us who <a href="http://www.codinghorror.com/blog/2005/12/headphone-snobbery.html">invested in quality headphones</a>.</i> Rather than spending $30 or $150 on an outboard headphone amp, <a href="http://www.dpbolvw.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16829132020%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Sound%2BCard-_-ASUS-_-29132020&amp;cjsku=N82E16829132020">spend $30 on the Xonar DG</a> to get a substantial sound quality upgrade <i>and</i> a respectable headphone amp to boot.</p>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/who-needs-a-sound-card-anyway/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Hot/Crazy Solid State Drive Scale</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-hotcrazy-solid-state-drive-scale/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-hotcrazy-solid-state-drive-scale/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 23:50:24 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[beta firmware]]></category>
		<category><![CDATA[foremost expert]]></category>
		<category><![CDATA[intel ssd]]></category>
		<category><![CDATA[solid state drive]]></category>
		<category><![CDATA[solid state hard drives]]></category>
		<category><![CDATA[ssd]]></category>
		<category><![CDATA[ssds]]></category>
		<category><![CDATA[stack overflow]]></category>
		<category><![CDATA[unreliable technology]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-hotcrazy-solid-state-drive-scale/</guid>
		<description><![CDATA[As an early advocate of solid state hard drives &#8230; The State of Solid State Hard Drives (October 2009) Revisiting Solid State Hard Drives (October 2010) &#8230; I feel ethically and morally obligated to let you in on a dirty little secret I&#8217;ve discovered in the last two years of full time SSD ownership. Solid [...]]]></description>
			<content:encoded><![CDATA[<p>
As an early advocate of solid state hard drives &hellip;</p>
<ul>
<li><a href="http://www.codinghorror.com/blog/2009/10/the-state-of-solid-state-hard-drives.html">The State of Solid State Hard Drives</a> (October 2009)
<li><a href="http://www.codinghorror.com/blog/2010/09/revisiting-solid-state-hard-drives.html">Revisiting Solid State Hard Drives</a> (October 2010)
</ul>
<p>
&hellip; I feel ethically and morally obligated to let you in on a dirty little secret I&#8217;ve discovered in the last two years of full time SSD ownership. <b>Solid state hard drives fail. A lot.</b> And not just any fail. I&#8217;m talking about <i>catastrophic, oh-my-God-what-just-happened-to-all-my-data instant gigafail</i>. It&#8217;s not pretty.</p>
<p>
I bought a set of three Crucial 128 GB SSDs in October 2009 for the original two members of the Stack Overflow team plus myself. As of last month, two out of three of those had failed. And just the other day I was chatting with Joel on the podcast (yep, <a href="http://blog.stackoverflow.com/2011/04/se-podcast-02/">it&#8217;s back</a>), and he casually mentioned to me that the Intel SSD in his Thinkpad, which was purchased roughly around the same time as ours, had also failed.</p>
<p>
<a href="http://portmanwills.com/">Portman Wills</a>, friend of the company and generally awesome guy, has a far scarier tale to tell. He got infected with the SSD religion based on my original 2009 blog post, and he went all in. He purchased <i>eight</i> SSDs over the last two years &hellip; and <i>all of them failed</i>. The tale of the tape is frankly a little terrifying:</p>
<ul>
<li>Super Talent 32 GB SSD, failed after 137 days
<li>OCZ Vertex 1 250 GB SSD, failed after 512 days
<li>G.Skill 64 GB SSD, failed after 251 days
<li>G.Skill 64 GB SSD, failed after 276 days
<li>Crucial 64 GB SSD, failed after 350 days
<li>OCZ Agility 60 GB SSD, failed after 72 days
<li>Intel X25-M 80 GB SSD, failed after 15 days
<li>Intel X25-M 80 GB SSD, failed after 206 days
</ul>
<p>
You might think after this I&#8217;d be swearing off SSDs as unstable, unreliable technology. Particularly since <a href="http://www.codinghorror.com/blog/2009/12/international-backup-awareness-day.html">I am the world&#8217;s foremost expert on backups</a>.</p>
<p>
Well, you&#8217;d be wrong. I just went out and bought myself <a href="http://www.tkqlhce.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16820227707%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Solid%2BState%2BDisk-_-OCZ%2BTechnology-_-20227707&amp;cjsku=N82E16820227707">a hot new OCZ Vertex 3 SSD</a>, the clear winner of the latest generation of SSDs to arrive this year. <a href="http://www.storagereview.com/ocz_vertex_3_review_240gb">Storage Review</a> calls it <i>the fastest SATA SSD we&#8217;ve seen</i>.</p>
<blockquote><p>
Beta firmware or not though, the Vertex 3 is a scorcher. We&#8217;ll get into the details later in the review, but our numbers show it as clearly the fastest SATA SSD to hit our bench.</p>
<p>
<a href="http://www.tkqlhce.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16820227707%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Solid%2BState%2BDisk-_-OCZ%2BTechnology-_-20227707&amp;cjsku=N82E16820227707"><img alt="ocz-vertex-3" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/20c9e_6a0120a85dcdae970b01543211cee2970c-800wi" border="0" /></a></p>
<p>
While that shouldn&#8217;t be entirely surprising, it&#8217;s not just faster like, &#8220;Woo, it edged out the prior generation SF-1200 SSDs, yeah!&#8221; <b>It&#8217;s faster like, &#8220;Holy @&amp;#% that&#8217;s fast,&#8221; boasting 69% faster results in some of our real-world tests.</b>
</p></blockquote>
<p>
Solid state hard drives are so freaking amazing performance wise, and the experience you will have with them is so transformative, that <i>I don&#8217;t even care if they fail every 12 months on average!</i> I can&#8217;t imagine using a computer without a SSD any more; it&#8217;d be like going back to <a href="http://www.codinghorror.com/blog/2006/05/do-modems-still-matter.html">dial-up internet</a> or 13&#8243; CRTs or single button mice. Over my dead body, man!</p>
<p>
It may seem irrational, but &hellip; well, I believe the phenomenon was explained best on the television show <a href="http://www.imdb.com/title/tt0460649/">How I Met Your Mother</a> by Barney Stinson, a character played brilliantly by geek favorite Neil Patrick Harris:</p>
<blockquote>
<p>
Barney: There&#8217;s no way she&#8217;s above the line on <a href="http://www.youtube.com/watch?v=5zADosF3XoQ">the &#8216;hot/crazy&#8217; scale</a>. </p>
<p>
Ted: She&#8217;s not even on the &#8216;hot/crazy&#8217; scale; she&#8217;s just hot. </p>
<p>
Robin: Wait, &#8216;hot/crazy&#8217; scale? </p>
<p>
Barney: Let me illustrate! </p>
<p>
<a href="http://www.youtube.com/watch?v=5zADosF3XoQ"><img alt="The-hot-crazy-scale1" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/316ad_6a0120a85dcdae970b01538e3ee72e970b-800wi" border="0" /></a></p>
<p>
Barney: A girl is allowed to be crazy as long as she is equally hot. Thus, if she&#8217;s <i>this</i> crazy, she has to be <i>this</i> hot. You want the girl to be above this line. Also known as the &#8216;Vickie Mendoza Diagonal&#8217;. This girl I dated. She played jump rope with that line. She&#8217;d shave her head, then lose 10 pounds. She&#8217;d stab me with a fork, then get a boob job. [pause] I should give her a call.
</p></blockquote>
<p>
Thing is, <b>SSDs are so scorching hot that I&#8217;m willing to put up with their craziness.</b> Consider that just in the last two years, their performance has <i>doubled</i>. Doubled! And the latest, fastest SSDs can even <a href="http://www.anandtech.com/show/4186/ocz-vertex-3-preview-the-first-client-focused-sf2200/5">saturate existing SATA interfaces</a>; they need brand new 6 Gbps interfaces to fully strut their stuff. No CPU or memory upgrade can come close to touching that kind of real world performance increase.</p>
<p>
Just make sure you have a <a href="http://www.codinghorror.com/blog/2008/01/whats-your-backup-strategy.html">good backup plan</a> if you&#8217;re running on a SSD. I do hope they iron out the reliability kinks in the next 2 generations &hellip; but I&#8217;ve spent the last two months checking out the hot/crazy solid state drive scale in excruciating detail, and trust me, you want <a href="http://www.tkqlhce.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16820227707%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Solid%2BState%2BDisk-_-OCZ%2BTechnology-_-20227707&amp;cjsku=N82E16820227707">one of these new Vertex 3 SSDs</a> <i>right now</i>.</p>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-hotcrazy-solid-state-drive-scale/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Working with the Chaos Monkey</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/working-with-the-chaos-monkey/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/working-with-the-chaos-monkey/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 23:50:03 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[amazon web]]></category>
		<category><![CDATA[chaos monkey]]></category>
		<category><![CDATA[first glance]]></category>
		<category><![CDATA[Netflix]]></category>
		<category><![CDATA[network requests]]></category>
		<category><![CDATA[oregon web]]></category>
		<category><![CDATA[preeminent provider]]></category>
		<category><![CDATA[software architecture]]></category>
		<category><![CDATA[web farm]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/working-with-the-chaos-monkey/</guid>
		<description><![CDATA[Late last year, the Netflix Tech Blog wrote about five lessons they learned moving to Amazon Web Services. AWS is, of course, the preeminent provider of so-called &#8220;cloud computing&#8221;, so this can essentially be read as key advice for any website considering a move to the cloud. And it&#8217;s great advice, too. Here&#8217;s the one [...]]]></description>
			<content:encoded><![CDATA[<p><p>
Late last year, the Netflix Tech Blog wrote about <a href="http://techblog.netflix.com/2010/12/5-lessons-weve-learned-using-aws.html">five lessons they learned moving to Amazon Web Services</a>. AWS is, of course, the preeminent provider of so-called &#8220;cloud computing&#8221;, so this can essentially be read as <b>key advice for any website considering a move to the cloud</b>. And it&#8217;s great advice, too. Here&#8217;s the one bit that struck me as most essential:</p>
<blockquote>
<p>
We’ve sometimes referred to the Netflix software architecture in AWS as our Rambo Architecture. Each system has to be able to succeed, no matter what, even all on its own. We’re designing each distributed system to expect and tolerate failure from other systems on which it depends.</p>
<p>
If our recommendations system is down, we degrade the quality of our responses to our customers, but we still respond. We’ll show popular titles instead of personalized picks. If our search system is intolerably slow, streaming should still work perfectly fine.</p>
<p>
One of the first systems our engineers built in AWS is called the Chaos Monkey. <b>The Chaos Monkey’s job is to randomly kill instances and services within our architecture.</b> If we aren’t constantly testing our ability to succeed despite failure, then it isn’t likely to work when it matters most – in the event of an unexpected outage.
</p></blockquote>
<p>
Which, let&#8217;s face it, seems like insane advice at first glance. I&#8217;m not sure many companies even understand why this would be a good idea, much less have the guts to attempt it. Raise your hand if where you work, <i>someone deployed a daemon or service that randomly kills servers and processes in your server farm</i>.</p>
<p>
Now raise your other hand if that person is still employed by your company. </p>
<p>
Who in their right mind would willingly choose to work with a Chaos Monkey?</p>
<p>
<a href="http://www.youtube.com/watch?v=WgjcvxQjpKA"><img class="asset  asset-image at-xid-6a0120a85dcdae970b014e880f778e970d" alt="Angry-monkey-family-guy" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/71766_6a0120a85dcdae970b014e880f778e970d-800wi" border="0" /></a></p>
<p>
Sometimes you don&#8217;t get a choice; the Chaos Monkey chooses you. At <a href="http://stackexchange.com/">Stack Exchange</a>, we struggled for months with a bizarre problem. <b>Every few days, one of the servers in the <a href="http://blog.stackoverflow.com/2010/01/stack-overflow-network-configuration/">Oregon web farm</a> would simply stop responding to all external network requests.</b> No reason, no rationale, and no recovery except for a slow, excruciating shutdown sequence requiring the server to bluescreen before it would reboot. </p>
<p>
We spent months &#8212; literally <i>months</i> &#8212; chasing this <a href="http://serverfault.com/questions/104791/windows-server-2008-r2-network-adapter-stops-working-requires-hard-reboot">problem</a> down. We walked the list of everything we could think of to solve it, and then some:</p>
<ul>
<li>swapping network ports
<li>replacing network cables
<li>a different switch
<li>multiple versions of the network driver
<li>tweaking OS and driver level network settings
<li>simplifying our network configuration and removing <a href="http://www.balabit.com/support/community/products/tproxy">TProxy</a> for more traditional <code>X-FORWARDED-FOR</code>
<li>switching virtualization providers
<li>changing our <a href="http://en.wikipedia.org/wiki/Host_model">TCP/IP host model</a>
<li>getting Kernel hotfixes and applying them
<li>involving high-level vendor support teams
<li>some other stuff that I&#8217;ve now forgotten because I blacked out from the pain
</ul>
<p>
At one point in this saga our team almost came to blows because we were so frustrated. (Well, as close to &#8220;blows&#8221; as a <a href="http://www.codinghorror.com/blog/2010/05/on-working-remotely.html">remote team</a> can get over Skype, but you know what I mean.) Can you blame us? Every few days, one of our servers &#8212; no telling which one &#8212; would randomly wink off the network. <b>The Chaos Monkey strikes again!</b></p>
<p>
Even in our time of greatest frustration, I realized that there was a positive side to all this:</p>
<ul>
<li>Where we had one server performing an essential function, we switched to two.
<li>If we didn&#8217;t have a sensible fallback for something, we created one.
<li>We removed dependencies all over the place, paring down to the absolute minimum we required to run.
<li>We implemented workarounds to stay running at all times, even when services we previously considered essential were suddenly no longer available.
</ul>
<p>
Every week that went by, we made our system a tiny bit more redundant, because we had to. Despite the ongoing pain, it became clear that Chaos Monkey was actually doing us a big favor by forcing us to become extremely resilient. Not tomorrow, not someday, not at some indeterminate &#8220;we&#8217;ll get to it eventually&#8221; point in the future, but <i>right now where it hurts</i>.
</p>
<p>Now, none of this is new news; our problem is long since solved, and the Netflix Tech Blog article I&#8217;m referring to was posted last year. I&#8217;ve been meaning to write about it, but <a href="http://stackexchange.com/sites">I&#8217;ve been a little busy</a>. Maybe the timing is prophetic; <a href="http://www.zdnet.com/blog/btl/amazons-web-services-outage-end-of-cloud-innocence/47731">AWS had a huge multi-day outage last week</a>, which took several major websites down, along with a constellation of smaller sites.</p>
<p>
Notably absent from that list of affected AWS sites? Netflix.</p>
<p>
When you work with the Chaos Monkey, you quickly learn that everything happens for a reason. Except for those things which happen completely randomly. And that&#8217;s why, even though it sounds crazy, <b>the best way to avoid failure is to fail constantly.</b></p>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/working-with-the-chaos-monkey/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Revisiting the Home Theater PC</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/revisiting-the-home-theater-pc-2/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/revisiting-the-home-theater-pc-2/#comments</comments>
		<pubDate>Wed, 30 Mar 2011 09:30:10 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[1080p]]></category>
		<category><![CDATA[case psu]]></category>
		<category><![CDATA[media server]]></category>
		<category><![CDATA[metacritic]]></category>
		<category><![CDATA[mini itx motherboard]]></category>
		<category><![CDATA[power core]]></category>
		<category><![CDATA[rotten tomatoes]]></category>
		<category><![CDATA[s entertainment]]></category>
		<category><![CDATA[windows media center]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/revisiting-the-home-theater-pc-2/</guid>
		<description><![CDATA[It&#8217;s been almost three years since I built my home theater PC. I adore that little machine; it drives all of our family entertainment and serves as a general purpose home media server and streaming box. As I get older, I find that I&#8217;m no longer interested in having a home full of PCs whirring [...]]]></description>
			<content:encoded><![CDATA[<p>
It&#8217;s been almost three years since I <a href="http://www.codinghorror.com/blog/2008/04/building-your-own-home-theater-pc.html">built my home theater PC</a>. I <i>adore</i> that little machine; it drives all of our family entertainment and serves as a general purpose home media server and streaming box. As I get older, I find that I&#8217;m no longer interested in having a home full of PCs whirring away. I only want <i>one</i> PC in my house on all the time, and I want it to be as efficient and versatile as possible.</p>
<p>
My old low-power Athlon X2 based HTPC generally worked great, but still struggled with some occasional 1080p content. And when you have a toddler in the house, believe me, you <i>need</i> reliable 1080p playback. Only the finest in children&#8217;s entertainment for my <a href="http://www.codinghorror.com/blog/2009/03/spawned-a-new-process.html">spawned process</a>, I say!</p>
<p>
When I recently had to transcode <a href="http://www.imdb.com/title/tt1001526/">Megamind</a> down to 720p to get it to play back without stuttering or pausing at times&hellip; I knew my current HTPC&#8217;s days were numbered.</p>
<p>
<a href="http://www.imdb.com/title/tt1001526/"><img alt="Megamind-evil-overlord-small" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/37884_6a0120a85dcdae970b0147e3838486970b-800wi" border="0" /></a></p>
<p>
(Megamind is <i>hilarious</i> and highly recommended, by the way; it&#8217;s far better than its Metacritic and Rotten Tomatoes percentages would seem to indicate.)</p>
<p>
Now that Intel has finally released their Sandy Bridge CPUs &#8212; the first with integrated GPUs &#8212; I was eager to revisit and rebuild. The <a href="http://ark.intel.com/Product.aspx?id=53423">low power Core i3-2100T</a> is the one I had my eye on, with <b>a miserly TDP of 35 watts</b>. Combine that with a decent <a href="http://www.codinghorror.com/blog/2006/01/the-impossibly-small-pc-nano-itx.html">Mini-ITX</a> motherboard and a few other essential parts, and you&#8217;re good to go:</p>
<table cellpadding="4" cellspacing="4" width="350px">
<tr>
<td>CPU
<td><a href="http://www.directron.com/bx80623i32100t.html">Intel Core i3-2100T</a>
<td>$135<br />
</tr>
<tr>
<td>Motherboard
<td><a href="http://www.tkqlhce.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16813157239%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Motherboards%2B-%2BIntel-_-ASRock-_-13157239&amp;cjsku=N82E16813157239">ASRock H67M ITX</a>
<td>$100<br />
</tr>
<tr>
<td>RAM
<td><a href="http://www.anrdoezrs.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16820145278%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Memory%2B%28Desktop%2BMemory%29-_-Corsair-_-20145278&amp;cjsku=N82E16820145278">Corsair 4GB DDR3</a>
<td>$45<br />
</tr>
<tr>
<td>Case + PSU
<td><a href="http://www.dpbolvw.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16811129068%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Cases%2B%28Computer%2BCases%2B-%2BATX%2BForm%29-_-Antec-_-11129068&amp;cjsku=N82E16811129068">Antec ISK 300-65</a>
<td>$70<br />
</tr>
<tr>
<td>HDD
<td><a href="http://www.jdoqocy.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16822149204%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Hard%2BDrives%2B-%2BNotebooks%2B%2F%2BLaptops-_-Toshiba-_-22149204&amp;cjsku=N82E1682214920">750GB 2.5&#8243;</a>
<td>$70<br />
</table>
<p>
Now, I am fudging a bit here. This is just the basic level of hardware to get a functional home theater PC. I didn&#8217;t actually buy a case, PSU, or even hard drive for that matter; I recycled many of my old existing parts, so my personal outlay was all of 300 bucks. I&#8217;m including the fuller part list as courtesy recommendations in case you&#8217;re starting from scratch. You also might want to add a <a href="http://www.jdoqocy.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16827106325%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Blu-Ray%2BDrives-_-Lite-On-_-27106325&amp;cjsku=N82E16827106325">Blu-Ray drive</a>, and perhaps a <a href="http://www.anrdoezrs.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16832116754%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Software%2B-%2BOperating%2BSystems-_-Microsoft-_-32116754&amp;cjsku=N82E16832116754">Windows 7 Home Premium license</a> ($99) for its excellent 10-foot <a href="http://www.codinghorror.com/blog/2007/02/windows-vista-media-center.html">Windows Media Center</a> interface.</p>
<p>
<a href="http://www.tkqlhce.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16813157239%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Motherboards%2B-%2BIntel-_-ASRock-_-13157239&amp;cjsku=N82E16813157239"><img alt="Asrock-mini-itx-h67-motherboard" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/739eb_6a0120a85dcdae970b0147e383d8e7970b-800wi" border="0" /></a></p>
<p>
The magical part here is the extreme level of hardware integration: the CPU has a GPU and memory controller on die, and the motherboard has optical digital out and HDMI out built in. It&#8217;s delightfully simple to build and downright <i>cheap</i>. Just assemble it, install your OS of choice (sorry, Apple fans), then plug it into your receiver and television and boot it up.</p>
<p>
My results? I&#8217;ll just get right to the good part, but please bear in mind <b>each step is about twice as powerful</b> as the one before:</p>
<table cellpadding="4" cellspacing="4" width="550px">
<tr>
<td><a href="http://www.codinghorror.com/blog/2005/02/pentium-m-home-theater-pc.html">2005</a>
<td>~$1000
<td>512 MB RAM, single core CPU
<td>80 watts idle<br />
</tr>
<tr>
<td><a href="http://www.codinghorror.com/blog/2008/04/building-your-own-home-theater-pc.html">2008</a>
<td>~$520
<td>2 GB RAM, dual core CPU
<td>45 watts idle<br />
</tr>
<tr>
<td><b>2011</b></a>
<td><b>~$420</b>
<td><b>4 GB RAM, dual core CPU + GPU</b>
<td><b>22 watts idle</b><br />
</tr>
</table>
<p>
I know I get way too excited about this stuff, but &hellip; <i>holy crap, 22 tesla-lovin&#8217; watts at idle!</i>
<p>
<img alt="Kill-a-watt-2500t" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/9f421_6a0120a85dcdae970b014e60290054970c-800wi" border="0" /></a></p>
<p>
The <a href="http://www.codinghorror.com/blog/archives/001099.html">kill-a-watt never lies</a>. To be fair, it&#8217;s more like 25 watts idle with <a href="http://www.codinghorror.com/blog/2007/02/everybody-loves-bittorrent.html">torrents in the background</a>. This little box is remarkably efficient; even when playing back a 1080p video it&#8217;s not unusual to see CPU usage well under 50%, which equates to around 30-35 watts in practice. Under full, artificial multithreaded Prime95 load, it tops out at an absolute peak of 55 watts.</p>
<p>
This is a killer setup, but don&#8217;t take my word for it. There is an <a href="http://www.missingremote.com/review/intel-core-i3-2100t-and-bh67cf-mini-itx-motherboard">excruciatingly in-depth review</a> of essentially the same system at <a href="http://www.missingremote.com/">Missing Remote</a>, with a particular eye toward home theater duties. Spoiler: they loved the hell out of it too. And it compromises almost nothing in performance, with a Windows Experience score of 5.1 &#8212; that would be a solid 5.8 if you factored out desktop Aero performance.</p>
<p>
<img alt="Windows-experience-score" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/6aaf9_6a0120a85dcdae970b014e602a2c2f970c-800wi" border="0" /></p>
<p>
(Also, in case you&#8217;re wondering, I intentionally dropped the analog cable tuner. All modern cable is now digital, which means awkward DRM-ed up the wazoo CableCard systems. I&#8217;ve cancelled cable altogether; I&#8217;d rather take that $60+ per month and use it to support innovative companies who will deliver media through the internet, like Netflix, Hulu, etcetera. Or as I like to call it: <i>the future</i>, unless the media congolomerates with vaults full of cash manage to <a href="http://www.codinghorror.com/blog/2011/02/the-importance-of-net-neutrality.html">subvert net neutrality</a>.)</p>
<p>
When all is said and done, I have a new always-on, does-anything home theater box that is <b>twice as fast as the one I built in 2008, while consuming less than half the power</b>. </p>
<p>
I&#8217;ve been a computer nerd since age 8, and I just turned 40. I should be jaded by <a href="http://www.codinghorror.com/blog/2007/05/computer-hardware-pornography.html">computer hardware pornography</a> by now, but I still find this progress <i>amazing</i>. At this rate, I can&#8217;t wait to find out what my 2014 home theater PC will look like.</p>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/revisiting-the-home-theater-pc-2/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Revisiting the Home Theater PC</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/revisiting-the-home-theater-pc/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/revisiting-the-home-theater-pc/#comments</comments>
		<pubDate>Wed, 30 Mar 2011 09:30:07 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[1080p]]></category>
		<category><![CDATA[case psu]]></category>
		<category><![CDATA[media server]]></category>
		<category><![CDATA[metacritic]]></category>
		<category><![CDATA[mini itx motherboard]]></category>
		<category><![CDATA[power core]]></category>
		<category><![CDATA[rotten tomatoes]]></category>
		<category><![CDATA[s entertainment]]></category>
		<category><![CDATA[windows media center]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/revisiting-the-home-theater-pc/</guid>
		<description><![CDATA[It&#8217;s been almost three years since I built my home theater PC. I adore that little machine; it drives all of our family entertainment and serves as a general purpose home media server and streaming box. As I get older, I find that I&#8217;m no longer interested in having a home full of PCs whirring [...]]]></description>
			<content:encoded><![CDATA[<p>
It&#8217;s been almost three years since I <a href="http://www.codinghorror.com/blog/2008/04/building-your-own-home-theater-pc.html">built my home theater PC</a>. I <i>adore</i> that little machine; it drives all of our family entertainment and serves as a general purpose home media server and streaming box. As I get older, I find that I&#8217;m no longer interested in having a home full of PCs whirring away. I only want <i>one</i> PC in my house on all the time, and I want it to be as efficient and versatile as possible.</p>
<p>
My old low-power Athlon X2 based HTPC generally worked great, but still struggled with some occasional 1080p content. And when you have a toddler in the house, believe me, you <i>need</i> reliable 1080p playback. Only the finest in children&#8217;s entertainment for my <a href="http://www.codinghorror.com/blog/2009/03/spawned-a-new-process.html">spawned process</a>, I say!</p>
<p>
When I recently had to transcode <a href="http://www.imdb.com/title/tt1001526/">Megamind</a> down to 720p to get it to play back without stuttering or pausing at times&hellip; I knew my current HTPC&#8217;s days were numbered.</p>
<p>
<a href="http://www.imdb.com/title/tt1001526/"><img alt="Megamind-evil-overlord-small" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/c764d_6a0120a85dcdae970b0147e3838486970b-800wi" border="0" /></a></p>
<p>
(Megamind is <i>hilarious</i> and highly recommended, by the way; it&#8217;s far better than its Metacritic and Rotten Tomatoes percentages would seem to indicate.)</p>
<p>
Now that Intel has finally released their Sandy Bridge CPUs &#8212; the first with integrated GPUs &#8212; I was eager to revisit and rebuild. The <a href="http://ark.intel.com/Product.aspx?id=53423">low power Core i3-2100T</a> is the one I had my eye on, with <b>a miserly TDP of 35 watts</b>. Combine that with a decent <a href="http://www.codinghorror.com/blog/2006/01/the-impossibly-small-pc-nano-itx.html">Mini-ITX</a> motherboard and a few other essential parts, and you&#8217;re good to go:</p>
<table cellpadding="4" cellspacing="4" width="350px">
<tr>
<td>CPU
<td><a href="http://www.directron.com/bx80623i32100t.html">Intel Core i3-2100T</a>
<td>$135<br />
</tr>
<tr>
<td>Motherboard
<td><a href="http://www.tkqlhce.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16813157239%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Motherboards%2B-%2BIntel-_-ASRock-_-13157239&amp;cjsku=N82E16813157239">ASRock H67M ITX</a>
<td>$100<br />
</tr>
<tr>
<td>RAM
<td><a href="http://www.anrdoezrs.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16820145278%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Memory%2B%28Desktop%2BMemory%29-_-Corsair-_-20145278&amp;cjsku=N82E16820145278">Corsair 4GB DDR3</a>
<td>$45<br />
</tr>
<tr>
<td>Case + PSU
<td><a href="http://www.dpbolvw.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16811129068%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Cases%2B%28Computer%2BCases%2B-%2BATX%2BForm%29-_-Antec-_-11129068&amp;cjsku=N82E16811129068">Antec ISK 300-65</a>
<td>$70<br />
</tr>
<tr>
<td>HDD
<td><a href="http://www.jdoqocy.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16822149204%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Hard%2BDrives%2B-%2BNotebooks%2B%2F%2BLaptops-_-Toshiba-_-22149204&amp;cjsku=N82E1682214920">750GB 2.5&#8243;</a>
<td>$70<br />
</table>
<p>
Now, I am fudging a bit here. This is just the basic level of hardware to get a functional home theater PC. I didn&#8217;t actually buy a case, PSU, or even hard drive for that matter; I recycled many of my old existing parts, so my personal outlay was all of 300 bucks. I&#8217;m including the fuller part list as courtesy recommendations in case you&#8217;re starting from scratch. You also might want to add a <a href="http://www.jdoqocy.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16827106325%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Blu-Ray%2BDrives-_-Lite-On-_-27106325&amp;cjsku=N82E16827106325">Blu-Ray drive</a>, and perhaps a <a href="http://www.anrdoezrs.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16832116754%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Software%2B-%2BOperating%2BSystems-_-Microsoft-_-32116754&amp;cjsku=N82E16832116754">Windows 7 Home Premium license</a> ($99) for its excellent 10-foot <a href="http://www.codinghorror.com/blog/2007/02/windows-vista-media-center.html">Windows Media Center</a> interface.</p>
<p>
<a href="http://www.tkqlhce.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16813157239%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Motherboards%2B-%2BIntel-_-ASRock-_-13157239&amp;cjsku=N82E16813157239"><img alt="Asrock-mini-itx-h67-motherboard" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/6fa64_6a0120a85dcdae970b0147e383d8e7970b-800wi" border="0" /></a></p>
<p>
The magical part here is the extreme level of hardware integration: the CPU has a GPU and memory controller on die, and the motherboard has optical digital out and HDMI out built in. It&#8217;s delightfully simple to build and downright <i>cheap</i>. Just assemble it, install your OS of choice (sorry, Apple fans), then plug it into your receiver and television and boot it up.</p>
<p>
My results? I&#8217;ll just get right to the good part, but please bear in mind <b>each step is about twice as powerful</b> as the one before:</p>
<table cellpadding="4" cellspacing="4" width="550px">
<tr>
<td><a href="http://www.codinghorror.com/blog/2005/02/pentium-m-home-theater-pc.html">2005</a>
<td>~$1000
<td>512 MB RAM, single core CPU
<td>80 watts idle<br />
</tr>
<tr>
<td><a href="http://www.codinghorror.com/blog/2008/04/building-your-own-home-theater-pc.html">2008</a>
<td>~$520
<td>2 GB RAM, dual core CPU
<td>45 watts idle<br />
</tr>
<tr>
<td><b>2011</b></a>
<td><b>~$420</b>
<td><b>4 GB RAM, dual core CPU + GPU</b>
<td><b>22 watts idle</b><br />
</tr>
</table>
<p>
I know I get way too excited about this stuff, but &hellip; <i>holy crap, 22 tesla-lovin&#8217; watts at idle!</i>
<p>
<img alt="Kill-a-watt-2500t" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/3aff8_6a0120a85dcdae970b014e60290054970c-800wi" border="0" /></a></p>
<p>
The <a href="http://www.codinghorror.com/blog/archives/001099.html">kill-a-watt never lies</a>. To be fair, it&#8217;s more like 25 watts idle with <a href="http://www.codinghorror.com/blog/2007/02/everybody-loves-bittorrent.html">torrents in the background</a>. This little box is remarkably efficient; even when playing back a 1080p video it&#8217;s not unusual to see CPU usage well under 50%, which equates to around 30-35 watts in practice. Under full, artificial multithreaded Prime95 load, it tops out at an absolute peak of 55 watts.</p>
<p>
This is a killer setup, but don&#8217;t take my word for it. There is an <a href="http://www.missingremote.com/review/intel-core-i3-2100t-and-bh67cf-mini-itx-motherboard">excruciatingly in-depth review</a> of essentially the same system at <a href="http://www.missingremote.com/">Missing Remote</a>, with a particular eye toward home theater duties. Spoiler: they loved the hell out of it too. And it compromises almost nothing in performance, with a Windows Experience score of 5.1 &#8212; that would be a solid 5.8 if you factored out desktop Aero performance.</p>
<p>
<img alt="Windows-experience-score" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/37884_6a0120a85dcdae970b014e602a2c2f970c-800wi" border="0" /></p>
<p>
(Also, in case you&#8217;re wondering, I intentionally dropped the analog cable tuner. All modern cable is now digital, which means awkward DRM-ed up the wazoo CableCard systems. I&#8217;ve cancelled cable altogether; I&#8217;d rather take that $60+ per month and use it to support innovative companies who will deliver media through the internet, like Netflix, Hulu, etcetera. Or as I like to call it: <i>the future</i>, unless the media congolomerates with vaults full of cash manage to <a href="http://www.codinghorror.com/blog/2011/02/the-importance-of-net-neutrality.html">subvert net neutrality</a>.)</p>
<p>
When all is said and done, I have a new always-on, does-anything home theater box that is <b>twice as fast as the one I built in 2008, while consuming less than half the power</b>. </p>
<p>
I&#8217;ve been a computer nerd since age 8, and I just turned 40. I should be jaded by <a href="http://www.codinghorror.com/blog/2007/05/computer-hardware-pornography.html">computer hardware pornography</a> by now, but I still find this progress <i>amazing</i>. At this rate, I can&#8217;t wait to find out what my 2014 home theater PC will look like.</p>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/revisiting-the-home-theater-pc/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How to Write Without Writing</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/how-to-write-without-writing/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/how-to-write-without-writing/#comments</comments>
		<pubDate>Sat, 05 Feb 2011 12:12:53 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[best of intentions]]></category>
		<category><![CDATA[dogged persistence]]></category>
		<category><![CDATA[fellow programmers]]></category>
		<category><![CDATA[Joel Spolsky]]></category>
		<category><![CDATA[modicum]]></category>
		<category><![CDATA[pitchforks]]></category>
		<category><![CDATA[programming languages]]></category>
		<category><![CDATA[stack overflow]]></category>
		<category><![CDATA[technical skill]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/how-to-write-without-writing/</guid>
		<description><![CDATA[I have a confession to make: in a way, I founded Stack Overflow to trick my fellow programmers. Before you trot out the pitchforks and torches, let me explain. Over the last 6 years, I&#8217;ve come to believe deeply in the idea that that becoming a great programmer has very little to do with programming. [...]]]></description>
			<content:encoded><![CDATA[<p>
I have a confession to make: in a way, I founded Stack Overflow to <b>trick my fellow programmers</b>.</p>
<p>
Before you trot out the pitchforks and torches, let me explain. </p>
<p>
Over the last 6 years, I&#8217;ve come to believe deeply in the idea that that becoming a great programmer has very little to do with <i>programming</i>. Yes, it takes a modicum of technical skill and dogged persistence, absolutely. But even more than that, it takes <a href="http://www.joelonsoftware.com/articles/CollegeAdvice.html">serious communication skills</a>:</p>
<blockquote><p>
The difference between a tolerable programmer and a great programmer is not how many programming languages they know, and it&#8217;s not whether they prefer Python or Java. <b>It&#8217;s whether they can communicate their ideas.</b> By persuading other people, they get leverage. By writing clear comments and technical specs, they let other programmers understand their code, which means other programmers can use and work with their code instead of rewriting it. Absent this, their code is worthless.
</p></blockquote>
<p>
That is of course a quote from my co-founder Joel Spolsky, and it&#8217;s one of my favorites.</p>
<p>
In defense of my fellow programmers, communication with other human beings is not exactly what we signed up for. We didn&#8217;t launch our careers in software development because we loved chatting with folks. Communication is just plain <i>hard</i>, particularly written communication. How exactly do you get better at something you self-selected out of? <a href="http://www.codinghorror.com/blog/2006/02/fear-of-writing.html">Blogging is one way</a>:</p>
<blockquote><p>
People spend their entire lives learning how to write effectively. It isn&#8217;t something you can fake. It isn&#8217;t something you can buy. You have to work at it.</p>
<p>
That&#8217;s exactly why people who are afraid they <i>can&#8217;t</i> write should be blogging.</p>
<p>
It&#8217;s exercise. No matter how out of shape you are, if you exercise a few times a week, you&#8217;re bound to get fitter. Write a small blog entry a few times every week and you&#8217;re bound to become a better writer. If you&#8217;re not writing because you&#8217;re intimidated by writing, well, you&#8217;re likely to stay that way forever.
</p></blockquote>
<p>
Even with the best of intentions, telling someone &#8220;you should blog!&#8221; never works. I know this from painful first hand experience. Blogging isn&#8217;t for everyone. Even a small blog entry can seem like an insurmountable, impenetrable, arbitrary chunk of writing to the average programmer. How do I get my fellow programmers to blog without blogging, to write without <i>writing?</i></p>
<p>
By cheating like <i>hell</i>, that&#8217;s how.</p>
<p>
Consider <a href="http://blog.stackoverflow.com/2009/04/what-stack-overflow-can-teach-you/">this letter I received</a>:</p>
<blockquote><p>
I’m not sure if you have thought about this side effect or not, but <b>Stack Overflow has taught me more about writing effectively than any class I’ve taken, book I’ve read, or any other experience I have had before.</b></p>
<p>
I can think of no other medium where I can test my writing chops (by writing an answer), get immediate feedback on its quality (particularly when writing quality trumps technical correctness, such as subjective questions) and see other peoples attempts as well and how they compare with mine. Votes don’t lie and it gives me a good indicator of how well an email I might send out to future co-workers would be received or a business proposal I might write.</p>
<p>
Over the course of the past 5 months all the answers I’ve been writing have been more and more refined in terms of the quality. If I don’t end up as the top answer I look at the answer that did and study what they did differently and where I faltered. Was I too verbose or was I too terse? Was I missing the crux of the question or did I hit it dead on?</p>
<p>
I know that you said that writing your Coding Horror blog helped you greatly in refining your writing over the years. Stack Overflow has been doing the same for me and I just wanted to thank you for the opportunity. I’ve decided to setup a coding blog in your footsteps and I just registered a domain today. Hopefully that will go as well as writing on SO has. There are no tougher critics than fellow programmers who scrutinize every detail, every technical remark and grammar structure looking for mistakes. If you can effectively write for and be accepted by a group of programmers you can write for anyone.
</p></blockquote>
<p>
Joel and I have always positioned Stack Overflow, and all the other <a href="http://stackexchange.com/sites">Stack Exchange Q&amp;A sites</a>, as lightweight, focused, &#8220;fun size&#8221; units of writing.</p>
<p>
Yes, by God, <b>we will <i>trick</i> you into becoming a better writer if that&#8217;s what it takes &ndash; and it always does</b>. Stack Overflow has many overtly gamelike elements, but it is a game in service of the greater good &ndash; to make the internet better, and more importantly, to make <i>you</i> better. Seeing my fellow programmers naturally improve their written communication skills while participating in a focused, expert Q&amp;A community with their peers? Nothing makes me prouder. </p>
<p>
Beyond programming, there&#8217;s a whole other community of peers out there who grok how important writing is, and will support you in <a href="http://www.codinghorror.com/blog/2009/03/sharpening-the-saw.html">sharpening your saw, er, pen</a>. We have our own, too.</p>
<p>
<a href="http://writers.stackexchange.com"><img alt="Writers Stack Exchange" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/ad8b1_6a0120a85dcdae970b0147e249d402970b-800wi" border="0" /></a></p>
<p>
If you&#8217;re an <b>author, editor, reviewer, blogger, copywriter, or aspiring writer of <i>any</i> kind, professional or otherwise</b> &ndash; check out <a href="http://writers.stackexchange.com/">writers.stackexchange.com</a>. Becoming a  more effective writer is the one bedrock skill that will further your professional career, no matter <i>what</i> you choose to do.</p>
<p>
But mostly, you should write. I thought Jon Skeet <a href="http://blog.stackoverflow.com/2009/10/podcast-71/#comment-40649">summed it up particularly well here</a>:</p>
<blockquote><p>
Everyone should write a <i>lot</i> &ndash; whether it’s a blog, a book, Stack Overflow answers, emails or whatever. Write, and take some care over it. Clarifying your communication helps you to clarify your own internal thought processes, in my experience. It’s amazing how much you find you don’t know when you try to explain something in detail to someone else. It can start a whole new process of discovery.
</p></blockquote>
<p>
The process of writing is indeed a journey of discovery, one that will last the rest of your life. It doesn&#8217;t ultimately matter whether you&#8217;re writing a novel, a printer review, a Stack Overflow answer, fan fiction, a blog entry, a comment, a technical whitepaper, some emo LiveJournal entry, or even meta-talk about writing itself. Just <b>get out there and <i>write!</i></b></p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">JIRA Studio</a> &#8211; SVN hosting, issue tracking, CI and Google Apps integration. <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">Free trial »</a>
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/how-to-write-without-writing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lived Fast, Died Young, Left a Tired Corpse</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/lived-fast-died-young-left-a-tired-corpse/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/lived-fast-died-young-left-a-tired-corpse/#comments</comments>
		<pubDate>Sat, 05 Feb 2011 12:12:19 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[act of desperation]]></category>
		<category><![CDATA[code rush]]></category>
		<category><![CDATA[dark tone]]></category>
		<category><![CDATA[domain squatter]]></category>
		<category><![CDATA[gallows humor]]></category>
		<category><![CDATA[ipo frenzy]]></category>
		<category><![CDATA[mark zuckerberg]]></category>
		<category><![CDATA[pbs documentary]]></category>
		<category><![CDATA[two films]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/lived-fast-died-young-left-a-tired-corpse/</guid>
		<description><![CDATA[It&#8217;s easy to forget just how crazy things got during the Web 1.0 bubble in 2000. That was over ten years ago. For context, Mark Zuckerberg was all of sixteen when the original web bubble popped. There&#8217;s plenty of evidence that we&#8217;re entering another tech bubble. It&#8217;s just less visible to people outside the tech [...]]]></description>
			<content:encoded><![CDATA[<p>
It&#8217;s easy to forget just <b>how crazy things got during the Web 1.0 bubble in 2000</b>. That was over ten years ago. For context, <a href="http://en.wikipedia.org/wiki/Mark_Zuckerberg">Mark Zuckerberg</a> was all of <i>sixteen</i> when the original web bubble popped.</p>
<p>
<a href="http://finance.yahoo.com/echarts?s=^IXIC+Interactive#chart2:symbol=^ixic"><img alt="Web-bubble-graph-nasdaq" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/07c8c_6a0120a85dcdae970b0147e227522a970b-800wi" border="0" /></a></p>
<p>
There&#8217;s plenty of evidence that <a href="http://www.avc.com/a_vc/2010/11/pacing-yourself.html">we&#8217;re entering <i>another</i> tech bubble</a>. It&#8217;s just less visible to people outside the tech industry because there&#8217;s no corresponding stock market IPO frenzy. <i>Yet.</i></p>
<p>
There are two films which captured the hyperbole and excess of the original dot com bubble especially well.</p>
<p>
<a href="http://www.amazon.com/dp/B00005N5QV/?tag=codinghorror-20"><img class="asset  asset-image at-xid-6a0120a85dcdae970b0147e22782c9970b" alt="Startup-com-dvd-movie" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/30426_6a0120a85dcdae970b0147e22782c9970b-800wi" border="0" /></a></p>
<p>
The first is the documentary <a href="http://www.amazon.com/dp/B00005N5QV/?tag=codinghorror-20">Startup.com</a>. It&#8217;s about the prototypical web 1.0 company: one predicated on an idea that made absolutely no sense, which proceeded to flame out in a spectacular and all too typical way for the era. This one just happened to occur on digital film. The <a href="http://govworks.com/">govworks.com</a> website described in the documentary, the one that burned through $60 million in 18 months, is now one of those ubiquitous domain squatter pages. A sign of the times, perhaps.</p>
<p>
The second film was one I had always wanted to see, but wasn&#8217;t able to until a few days ago: <a href="http://clickmovement.org/coderush">Code Rush</a>. For a very long time, Code Rush was almost impossible to find, but <a href="http://waxy.org/2009/07/code_rush_in_the_creative_commons/">the activism of Andy Baio</a> nudged the director to make the film available under Creative Commons. You can now watch it online &mdash; and you absolutely should.</p>
<p><p>
Remember when people <i>charged money for a web browser?</i> That was Netscape.</p>
<p>
Code Rush is a PBS documentary recorded at Netscape from 1998 &#8211; 1999, focusing on the <a href="http://www.mozilla.org/about/history.html">open sourcing of the Netscape code</a>. As the documentary makes painfully clear, this wasn&#8217;t an act of strategy so much as an act of desperation. That&#8217;s what happens when the company behind the world&#8217;s most ubiquitous operating system decides a web browser should be a standard part of the operating system.</p>
<p>
Everyone in the documentary knows they&#8217;re doomed; in fact, the phrase &#8220;we&#8217;re doomed&#8221; is a common refrain throughout the film. But despite the gallows humor and the dark tone, parts of it are oddly inspiring. These are engineers who are working heroic, impossible schedules for a goal they&#8217;re not sure they can achieve &mdash; or that they&#8217;ll even survive as an organization long enough to even finish.</p>
<p>
The most vivid difference between Startup.com and Code Rush is that Netscape, despite all their other mistakes and missteps, didn&#8217;t just burn through millions of dollars for no discernable reason. They produced a <b>meaningful legacy</b>:</p>
<ul>
<li>Through Netscape Navigator, the original popularization of HTML and the internet itself.
<li>With the release of the Netscape source code on March 31st, 1998, the unlikely birth of the commercial open source movement.
<li>Eventually producing the first credible threat to Internet Explorer in the form of Mozilla Firefox 1.0 in 2004.
</ul>
<p>
Do you want money? Fame? Job security? Or do you want to change the world &hellip; eventually? Consider how many legendary hackers went on to brilliant careers from Netscape: Jamie Zawinski, Brendan Eich, Stuart Parmenter, Marc Andreeseen. The lessons of Netscape live on, even though the company doesn&#8217;t. Code Rush is ultimately a <b>meditation on the meaning of work as a programmer</b>.</p>
<p>
I&#8217;d like to think that when Facebook &ndash; the next Google and Microsoft rolled into one &ndash; <a href="http://dealbook.nytimes.com/2011/01/11/with-facebook-debate-renews-over-i-p-o-regulation/">goes public in early 2012</a>, the markets will react rationally. More likely, people will all collectively lose their damn minds again and we&#8217;ll be thrust into a newer, bigger, even <i>more</i> insane tech bubble than the first one.</p>
<p>
Yes, you will have incredibly lucrative job offers in this bubble. That&#8217;s the easy part. As Startup.com and Code Rush illustrate, the hard part is figuring out <i>why</i> you are working all those long hours. Consider carefully, lest the arc of your career mirror that of so many failed tech bubble companies: <b>lived fast, died young, left a tired corpse.</b></p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">JIRA Studio</a> &#8211; SVN hosting, issue tracking, CI and Google Apps integration. <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">Free trial »</a>
</td>
</tr>
</table>
<p><a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/lived-fast-died-young-left-a-tired-corpse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>24 Gigabytes of Memory Ought to be Enough for Anybody</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/24-gigabytes-of-memory-ought-to-be-enough-for-anybody/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/24-gigabytes-of-memory-ought-to-be-enough-for-anybody/#comments</comments>
		<pubDate>Sat, 22 Jan 2011 20:08:24 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[bill gates]]></category>
		<category><![CDATA[channel memory]]></category>
		<category><![CDATA[computer memory]]></category>
		<category><![CDATA[cpu cooler]]></category>
		<category><![CDATA[killer features]]></category>
		<category><![CDATA[memory slots]]></category>
		<category><![CDATA[obscene amounts]]></category>
		<category><![CDATA[stack overflow]]></category>
		<category><![CDATA[system memory]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/24-gigabytes-of-memory-ought-to-be-enough-for-anybody/</guid>
		<description><![CDATA[Are you familiar with this quote? 640K [of computer memory] ought to be enough for anybody. &#8212; Bill Gates It&#8217;s amusing, but Bill Gates never actually said that: I&#8217;ve said some stupid things and some wrong things, but not that. No one involved in computers would ever say that a certain amount of memory is [...]]]></description>
			<content:encoded><![CDATA[<p>
Are you familiar with this quote?</p>
<blockquote><p>
640K [of computer memory] ought to be enough for anybody. &mdash; Bill Gates
</p></blockquote>
<p>
It&#8217;s amusing, but <a href="http://en.wikiquote.org/wiki/Bill_Gates#Misattributed">Bill Gates never actually said that</a>:</p>
<blockquote><p>
I&#8217;ve said some stupid things and some wrong things, but not that. No one involved in computers would ever say that a certain amount of memory is enough for all time &hellip; I keep bumping into that silly quotation attributed to me that says 640K of memory is enough. There&#8217;s never a citation; the quotation just floats like a rumor, repeated again and again.
</p></blockquote>
<p>
One of the few killer features of the <a href="http://www.codinghorror.com/blog/2009/12/building-a-pc-part-vi-rebuilding.html">otherwise unexciting Intel Core i7 platform upgrade</a>* is the subtle fact that Core i7 chips use <b>triple channel memory</b>. That means three memory slots at a minimum, and in practice most Core i7 motherboards have six memory slots.</p>
<p>
The price of DDR3 ram has declined to the point that populating <b>all six slots</b> of memory with 4 GB memory is, well, not cheap &#8212; but <a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16820231357">quite attainable at $299 and declining</a>.</p>
<p>
<a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16820231357"><img alt="24 gigabytes of DDR3 RAM" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/154c8_6a0120a85dcdae970b0148c7d5a7d4970c-800wi" border="0" /></a></p>
<p>
Twenty-four gigabytes of system memory for a mere $299! That&#8217;s about $12.50 per gigabyte.</p>
<p>
(And if you don&#8217;t have a Core i7 system, they&#8217;re not expensive to build, either. You can pair an <a href="http://www.jdoqocy.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16813157163%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Motherboards%2B-%2BIntel-_-ASRock-_-13157163&amp;cjsku=N82E16813157163">inexpensive motherboard</a> with even the slowest and cheapest triple channel compatible <a href="http://www.newegg.com/Product/Product.aspx?Item=N82E16819115211">i7-950</a>, which is plenty speedy &ndash; and overclocks well, if you&#8217;re into that. Throw in the 24 GB of ram, and it all adds up to about $800 total. Don&#8217;t forget the power supply and CPU cooler, though.)</p>
<p>
Remember when <i>one</i> gigabyte of system memory was considered a lot? For context, <a href="http://blog.stackoverflow.com/2009/01/new-stack-overflow-server-glamour-shots/">our first &#8220;real&#8221; Stack Overflow database server</a> had 24 GB of memory. Now I have that much in my desktop &hellip; just because I can. Well, that&#8217;s not <i>entirely</i> true, as we do work with some sizable databases while building the <a href="http://stackexchange.com/sites">Stack Exchange network</a>.</p>
<p>
<img alt="24-gigabytes-ram-in-use" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/78ae3_6a0120a85dcdae970b0148c7d5b892970c-800wi" border="0" /></p>
<p>
I guess having 24 gigabytes of system memory is a little extravagant, but at these prices &#8212; why not? What&#8217;s the harm in having obscene amounts of memory, making my system effectively future proof?</p>
<blockquote><p>
I have to say that in 1981, making those decisions, I felt like I was providing enough freedom for 10 years. That is, a move from 64k to 640k felt like something that would last a great deal of time. Well, it didn&#8217;t &ndash; it took about only 6 years before people started to see that as a real problem. &mdash; <a href="http://en.wikiquote.org/wiki/Bill_Gates#RAM1989">Bill Gates</a>
</p></blockquote>
<p>
To me, it&#8217;s more about no longer needing to <i>think</i> about memory as a scarce resource, something you allocate carefully and manage with great care. There&#8217;s just .. <i>lots</i>. As <a href="http://www.codinghorror.com/blog/2008/05/its-clay-shirkys-internet-we-just-live-in-it.html">Clay Shirky</a> once related to me, via one of his college computer science professors:</p>
<blockquote><p>
Algorithms are for people who don&#8217;t know how to buy RAM.
</p></blockquote>
<p>
I mean, 24 GB of memory should be enough for anybody&hellip; right?</p>
<p>
* it&#8217;s only blah on the <i>desktop</i>; on the server <a href="http://blog.stackoverflow.com/2010/10/database-upgrade/">the Nehalem architecture is indeed a monster</a> and anyone running a server should upgrade to it, stat.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">JIRA Studio</a> &#8211; SVN hosting, issue tracking, CI and Google Apps integration. <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">Free trial »</a>
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/24-gigabytes-of-memory-ought-to-be-enough-for-anybody/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trouble In the House of Google</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/trouble-in-the-house-of-google/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/trouble-in-the-house-of-google/#comments</comments>
		<pubDate>Wed, 05 Jan 2011 19:42:01 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[exchange network]]></category>
		<category><![CDATA[gift horse in the mouth]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[perpetuity]]></category>
		<category><![CDATA[sharecroppers]]></category>
		<category><![CDATA[sugar daddy]]></category>
		<category><![CDATA[sweet freedom]]></category>
		<category><![CDATA[underclass]]></category>
		<category><![CDATA[web search engine]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/trouble-in-the-house-of-google/</guid>
		<description><![CDATA[Let&#8217;s look at where stackoverflow.com traffic came from for the year of 2010. When 88.2% of all traffic for your website comes from a single source, criticizing that single source feels &#8230; risky. And perhaps a bit churlish, like looking a gift horse in the mouth, or saying something derogatory in public about your Valued [...]]]></description>
			<content:encoded><![CDATA[<p>
Let&#8217;s look at <a href="http://blog.stackoverflow.com/2010/12/stack-overflow-2010-analytics/">where stackoverflow.com traffic came from for the year of 2010</a>.</p>
<p>
<img alt="Stack-overflow-2010-traffic-by-source" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/0da72_6a0120a85dcdae970b0147e139ebc0970b-800wi" border="0" width="629" height="494" /></a> </p>
<p>
<b>When 88.2% of all traffic for your website comes from a single source</b>, criticizing that single source feels &hellip; <i>risky</i>. And perhaps a bit churlish, like looking a gift horse in the mouth, or saying something derogatory in public about your Valued Business Partner<sup>tm</sup>.</p>
<p>
Still, looking at the statistics, it&#8217;s hard to avoid the obvious conclusion. I&#8217;ve been told many times that Google isn&#8217;t a monopoly, but they apparently <a href="http://www.codinghorror.com/blog/2009/02/the-elephant-in-the-room-google-monoculture.html">play one on the internet</a>. You are perfectly free to switch to whichever non-viable alternative web search engine you want at any time. Just breathe in that sweet freedom, folks. </p>
<p>
Sarcasm aside, I greatly admire Google. My goal is not to be acquired, because <a href="http://www.codinghorror.com/blog/2009/01/overnight-success-it-takes-years.html">I&#8217;m in this thing for the long haul</a> &ndash; but if I <i>had</i> to pick a company to be acquired by, it would probably be Google. I feel their emphasis on the information graph over the social graph aligns more closely with our mission than almost any other potential suitor I can think of. Anyway, we&#8217;ve been perfectly happy with Google as our de-facto traffic sugar daddy since the beginning. But last year, something strange happened: <b>the content syndicators began to regularly outrank us in Google for our own content</b>. </p>
<p>
Syndicating our content is not a problem. In fact, it&#8217;s encouraged. It would be deeply unfair of us to assert ownership over the content so generously contributed to our sites and create an <a href="http://www.codinghorror.com/blog/2009/08/are-you-a-digital-sharecropper.html">underclass of digital sharecroppers</a>. Anything posted to Stack Overflow, or any <a href="http://stackexchange.com/sites">Stack Exchange Network site</a> for that matter, is licensed back to the community in perpetuity under <a href="http://creativecommons.org/licenses/by-sa/2.5/">Creative Commons cc-by-sa</a>. The community owns their contributions. We want <i>the whole world</i> to teach each other and learn from the questions and answers posted on our sites. Remix, reuse, share &ndash; and teach your peers! That&#8217;s our mission. That&#8217;s why I get up in the morning.</p>
<p>
<a href="http://startupquote.com/post/2163563107"><br />
<img alt="Jeff Atwood: Teaching peers is one of the best ways to develop mastery" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/5e644_6a0120a85dcdae970b0148c74392f1970c-800wi" width="423" height="442" /><br />
</a></p>
<p>
However, implicit in this strategy was the assumption that we, as the canonical source for the original questions and answers, would always rank first. Consider Wikipedia &ndash; <b>when was the last time you clicked through to a page that was nothing more than a legally copied, properly attributed Wikipedia entry encrusted in advertisements?</b> Never, right? But it is in theory a completely valid, albeit dumb, business model. That&#8217;s why Joel Spolsky and I were confident in sharing content back to the community with almost no reservations &ndash; because Google mercilessly penalizes sites that attempt to game the system by unfairly profiting on copied content. Remixing and reusing is fine, but mass-producing cheap copies encrusted with ads &hellip; isn&#8217;t.</p>
<p>
I think of this as common sense, but it&#8217;s also spelled out explicitly in <a href="http://www.google.com/support/webmasters/bin/answer.py?answer=66361">Google&#8217;s webmaster content guidelines</a>.</p>
<blockquote><p>
However, some webmasters attempt to improve their page&#8217;s ranking and attract visitors by creating pages with many words but little or no authentic content. <b>Google will take action against domains that try to rank more highly by just showing scraped or other auto-generated pages that don&#8217;t add any value to users.</b> Examples include:</p>
<p>
Scraped content. Some webmasters make use of content taken from other, more reputable sites on the assumption that increasing the volume of web pages with random, irrelevant content is a good long-term strategy. Purely scraped content, even from high-quality sources, may not provide any added value to your users without additional useful services or content provided by your site. It&#8217;s worthwhile to take the time to create original content that sets your site apart. This will keep your visitors coming back and will provide useful search results.
</p></blockquote>
<p>
In 2010, our mailboxes suddenly started overflowing with complaints from users &ndash; complaints that they were doing perfectly reasonable Google searches, and ending up on scraper sites that mirrored Stack Overflow content with added advertisements. Even worse, in some cases, the original Stack Overflow question was nowhere to be found in the search results! That&#8217;s <i>particularly</i> odd because our attribution terms require linking directly back to us, the canonical source for the question, without nofollow. Google, in indexing the scraped page, cannot avoid seeing that the scraped page links back to the canonical source. This culminated in, of all things, <a href="http://hackerne.ws/item?id=1985264">a special browser plug-in that redirects to Stack Overflow from the ripoff sites</a>. How totally depressing. Joel and I thought this was impossible. And I felt like I had personally failed all of you.</p>
<p>
The idea that there could be something wrong with Google was inconceivable to me. Google is gravity on the web, an omnipresent constant; <b>blaming Google would be like blaming gravity for my own clumsiness.</b> It wasn&#8217;t even an option. I started with the golden rule: <a href="http://www.codinghorror.com/blog/2008/03/the-first-rule-of-programming-its-always-your-fault.html">it&#8217;s always my fault</a>. We did a ton of due diligence on <a href="http://webmasters.stackexchange.com/">webmasters.stackexchange.com</a> to ensure we weren&#8217;t doing anything overtly stupid, and uber-mensch <a href="http://www.mattcutts.com/blog/">Matt Cutts</a> went out of his way to investigate the hand-vetted search examples contributed in response to my tweet asking for search terms where the scrapers dominated. Issues were found on both sides, and <a href="http://webmasters.stackexchange.com/questions/6556/does-the-order-of-keywords-matter-in-a-page-title">changes were made</a>. Success!</p>
<p>
Despite the semi-positive resolution, I was disturbed. If these dime-store scrapers were doing so well and generating so much traffic on the back of our content &ndash; how was the rest of the web faring? My enduring faith in the gravitational constant of Google had been shaken. Shaken to the very core.</p>
<p>
Throughout my investigation I had nagging doubts that we were seeing <b>serious cracks in the algorithmic search foundations of the house that Google built</b>. But I was afraid to write an article about it for fear I&#8217;d be claimed an incompetent kook. I wasn&#8217;t comfortable sharing that opinion widely, because we might be doing something obviously wrong. Which we tend to do frequently and often. <i>Gravity can&#8217;t be wrong. We&#8217;re just clumsy &hellip; right?</i></p>
<p>
I can&#8217;t help noticing that we&#8217;re not the only site to have serious problems with Google search results in the last few months. In fact, the drum beat of deteriorating Google search quality has been practically <i>deafening</i> of late:</p>
<ul>
<li><a href="http://techcrunch.com/2011/01/01/why-we-desperately-need-a-new-and-better-google-2/">Why We Desperately Need a New (and Better) Google</a>
<li><a href="http://paul.kedrosky.com/archives/2009/12/dishwashers_dem.html">Dishwashers, and How Google Eats Its Own Tail</a>
<li><a href="http://www.readwriteweb.com/archives/content_farms_impact.php">Content Farms: Why Media, Blogs &amp; Google Should Be Worried</a>
<li><a href="http://broadstuff.com/archives/2370-On-the-increasing-uselessness-of-Google......html">On the increasing uselessness of Google</a>
<li><a href="http://shoeblogs.com/2010/12/20/google-google-why-hast-thou-forsaken-the-manolo/#more-13002">Google, Google, Why Hast Thou Forsaken the Manolo?</a>
</ul>
<p>
Anecdotally, my personal search results have also been noticeably worse lately. As part of Christmas shopping for my wife, I searched for &#8220;iPhone 4 case&#8221; in Google. I had to give up completely on the first two pages of search results as utterly useless, and searched Amazon instead.</p>
<p>
People whose opinions I respect have all been echoing the same sentiment &#8212; <b>Google, the once essential tool, is somehow losing its edge. The spammers, scrapers, and SEO&#8217;ed-to-the-hilt content farms are winning.</b></p>
<p>
Like any sane person, I&#8217;m rooting for Google in this battle, and I&#8217;d love nothing more than for Google to tweak a few algorithmic knobs and make this entire blog entry moot. Still, this is the first time since 2000 that I can recall Google search quality ever <i>declining</i>, and it has inspired some rather heretical thoughts in me &#8212; are we seeing the first signs that algorithmic search has failed as a strategy? Is the next generation of search destined to be less algorithmic and more social?</p>
<p>
It&#8217;s a scary thing to even entertain, but <i>maybe gravity really is broken</i>.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">JIRA Studio</a> &#8211; SVN hosting, issue tracking, CI and Google Apps integration. <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">Free trial »</a>
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/trouble-in-the-house-of-google/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Dirty Truth About Web Passwords</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-dirty-truth-about-web-passwords/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-dirty-truth-about-web-passwords/#comments</comments>
		<pubDate>Tue, 14 Dec 2010 16:44:38 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[deadspin]]></category>
		<category><![CDATA[dirty truth]]></category>
		<category><![CDATA[Fleshbot]]></category>
		<category><![CDATA[gawker media]]></category>
		<category><![CDATA[gizmodo]]></category>
		<category><![CDATA[iphone 4]]></category>
		<category><![CDATA[modem firmware]]></category>
		<category><![CDATA[unwanted publicity]]></category>
		<category><![CDATA[web passwords]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-dirty-truth-about-web-passwords/</guid>
		<description><![CDATA[This weekend, the Gawker network was compromised. This weekend we discovered that Gawker Media&#8217;s servers were compromised, resulting in a security breach at Lifehacker, Gizmodo, Gawker, Jezebel, io9, Jalopnik, Kotaku, Deadspin, and Fleshbot. If you&#8217;re a commenter on any of our sites, you probably have several questions. It&#8217;s no Black Sunday or iPod modem firmware [...]]]></description>
			<content:encoded><![CDATA[<p>
This weekend, <b>the Gawker network was compromised</b>.</p>
<blockquote><p>
This weekend we discovered that Gawker Media&#8217;s servers were compromised, resulting in a security breach at Lifehacker, Gizmodo, Gawker, Jezebel, io9, Jalopnik, Kotaku, Deadspin, and Fleshbot. If you&#8217;re a commenter on any of our sites, you probably have several questions.
</p></blockquote>
<p>
It&#8217;s no <a href="http://www.codinghorror.com/blog/2008/05/revisiting-the-black-sunday-hack.html">Black Sunday</a> or <a href="http://www.codinghorror.com/blog/2005/02/ipod-hacking-via-modem.html">iPod modem firmware hack</a>, but it has <i>release notes</i> &#8212; and the story it tells is as epic as Beowulf:</p>
<blockquote><p>
So, here we are again with a monster release of ownage and data droppage. Previous attacks against the target were mocked, so we came along and raised the bar a little. How&#8217;s this for &#8220;script kids&#8221;? Your empire has been compromised, your servers, your databases, online accounts and source code have all been ripped to shreds!</p>
<p>You wanted attention, well guess what, You&#8217;ve got it now!
</p></blockquote>
<p>
<a href="http://www.codinghorror.com/blog/gawker-hack-release-notes.html">Read those release notes</a>. It&#8217;ll explain how the compromise unfolded, blow by blow, from the inside.</p>
<p>
Gawker is operated by Nick Denton, notorious for the unapologetic and often unethical &#8220;publish whatever it takes to get traffic&#8221; methods endorsed on his network. Do you remember the <a href="http://www.fastcompany.com/1621516/iphone-leak-iphone-4-apple-gizmodo">iPhone 4 leak</a>? That was Gawker. Do you remember the article about <a href="http://www.newyorker.com/reporting/2010/10/18/101018fa_fact_mcgrath">bloggers being treated as virtual sweatshop workers</a>? That was Gawker. Do you remember hearing about a blog lawsuit? <a href="http://www.google.com/search?q=gawker+lawsuit">That was probably Gawker, too</a>. </p>
<p>
Some might say having every account on your network compromised is <i>exactly</i> the kind of unwanted publicity attention that Gawker was founded on. </p>
<p>
Personally, I&#8217;m more interested in <b>how we can learn from this hack</b>. Where did Gawker go wrong, and how can we avoid making those mistakes on <i>our</i> projects?</p>
<ol>
<li><b>Gawker saved passwords</b>. You should never, <i>ever</i> store user passwords. If you do, <a href="http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html">you&#8217;re storing passwords incorrectly</a>. Always store the <a href="http://www.codinghorror.com/blog/2007/09/rainbow-hash-cracking.html">salted hash</a> of the password &#8212; <i>never</i> the password itself! It&#8217;s so easy, even <a href="http://www.codinghorror.com/blog/2008/06/smart-enough-not-to-build-this-website.html">members of Mensa</a> er .. can&#8217;t .. figure it out.
<li><b>Gawker used encryption incorrectly</b>. The odd choice of archaic DES encryption meant that the passwords they saved were all truncated to 8 characters. No matter how long your password actually <i>was</i>, you only had to enter the first 8 characters for it to work. So much for <a href="http://www.codinghorror.com/blog/2005/08/passphrase-evangelism.html">choosing a secure pass phrase</a>. Encryption is only as effective as the person using it. I&#8217;m not smart enough to use encryption, either, as you can see in <a href="http://www.codinghorror.com/blog/2009/05/why-isnt-my-encryption-encrypting.html">Why Isn&#8217;t My Encryption.. Encrypting?</a>
<li><b>Gawker asked users to create a username and password on their site</b>. The FAQ they posted about the breach has <a href="http://lifehacker.com/5712785/#2">two interesting clarifications</a>:<br />
<blockquote><p>
<i>2) What if I logged in using Facebook Connect? Was my password compromised?</i><br />
<b>No.</b> We never stored passwords of users who logged in using Facebook Connect.</p>
<p><i>3) What if I linked my Twitter account with my Gawker Media account? Was my Twitter password compromised?</i><br />
<b>No.</b> We never stored Twitter passwords from users who linked their Twitter accounts with their Gawker Media account.
</p></blockquote>
<p>
That&#8217;s right, people who used their <a href="http://www.codinghorror.com/blog/2010/11/your-internet-drivers-license.html">internet driver&#8217;s license</a> to authenticate on these sites <i>had no security problems at all!</i> Does the need to post a comment on Gizmodo really <i>justify</i> polluting the world with <a href="http://www.codinghorror.com/blog/2008/05/openid-does-the-world-really-need-yet-another-username-and-password.html">yet another username and password?</a> It&#8217;s only the poor users who decided to entrust Gawker with a unique username and &#8216;secure&#8217; password who got compromised.
</ol>
<p>
(Beyond that, &#8220;don&#8217;t be a jerk&#8221; is good advice to follow in  business as well as your personal life. I find that you generally get back what you give. When your corporate mission is to succeed by exploiting every quasi-legal trick in the book, surely you can&#8217;t be surprised when you get the same treatment in return.)</p>
<p>
But honestly, as much as we can point and laugh at Gawker and blame them for this debacle, there is absolutely nothing unique or surprising about any of this. Regular readers of my blog are probably bored out of their minds by now because I just trotted out a whole bunch of blog posts I wrote 3 years ago. <a href="http://www.codinghorror.com/blog/2006/03/the-value-of-repetition-again.html">Again</a>. </p>
<p>
<b>Here&#8217;s the dirty truth about website passwords: the internet is full of websites exactly like the Gawker network</b>. Let&#8217;s say you have good old traditional username and passwords on 50 different websites. That&#8217;s 50 different programmers who all have different ideas of how your password should be stored. I hope for your sake you used a different (and extremely secure) password on every single one of those websites. Because <i>statistically speaking, you&#8217;re screwed</i>.</p>
<p>
In other words, the more web sites you visit, the more networks you touch and trust with a username and password combination &#8212; the greater the odds that at least <i>one</i> of those networks will be <b>compromised exactly like Gawker was</b>, and give up your credentials for the world to see. At that point, unless you picked a strong, unique password on every single site you&#8217;ve ever visited, the situation gets ugly.</p>
<p>
The bad news is that most users don&#8217;t pick strong passwords. This has been proven <a href="http://www.codinghorror.com/blog/2009/01/dictionary-attacks-101/comments/page/2/">time and time again</a>, and the Gawker data is <a href="http://blogs.wsj.com/digits/2010/12/13/the-top-50-gawker-media-passwords/">no different</a>. Even worse, most users re-use these bad passwords across multiple websites. That&#8217;s why <a href="http://mashable.com/2010/12/13/acai-berry-twitter-worm-warning/">this ugly Twitter worm</a> suddenly appeared on the back of a bunch of compromised Gawker accounts. </p>
<p>
<a href="http://xkcd.com/792/"><img class="asset  asset-image at-xid-6a0120a85dcdae970b0147e0ad9dbd970b" alt="Xkcd-excerpt" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/f1405_6a0120a85dcdae970b0147e0ad9dbd970b-800wi" border="0" /></a></p>
<p>
Now do you understand why I&#8217;ve been so aggressive about promoting the concept of the <a href="http://www.codinghorror.com/blog/2010/11/your-internet-drivers-license.html">internet driver&#8217;s license</a>? That is, logging on to a web site using a set of <b>third party credentials from a company you can actually trust</b> to not be utterly incompetent at security? Sure, we&#8217;re centralizing risk here to, say, Google, or Facebook &#8212; but I trust Google a heck of a lot more than I trust J. Random Website, and this really is no different in practice than having password recovery emails sent to your GMail account. </p>
<p>
I&#8217;m not here to criticize Gawker. On the contrary, I&#8217;d like to thank them for illustrating in broad, bold relief the dirty truth about website passwords: we&#8217;re all better off without them. If you&#8217;d like to see a future web free of Gawker style password compromises &#8212; <b>stop trusting every random internet site with a unique username and password!</b> Demand that they allow you to use your internet driver&#8217;s license &#8212; that is, your existing Twitter, Facebook, Google, or OpenID credentials &#8212; to log into their website.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">JIRA Studio</a> &#8211; SVN hosting, issue tracking, CI and Google Apps integration. <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">Free trial »</a>
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-dirty-truth-about-web-passwords/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>My Holiday in Beautiful Panau</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/my-holiday-in-beautiful-panau/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/my-holiday-in-beautiful-panau/#comments</comments>
		<pubDate>Mon, 29 Nov 2010 10:45:17 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[company of heroes]]></category>
		<category><![CDATA[explicit goals]]></category>
		<category><![CDATA[fallout 3]]></category>
		<category><![CDATA[game programmer]]></category>
		<category><![CDATA[grand theft autos]]></category>
		<category><![CDATA[guitar hero]]></category>
		<category><![CDATA[panau]]></category>
		<category><![CDATA[running your own business]]></category>
		<category><![CDATA[world of goo]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/my-holiday-in-beautiful-panau/</guid>
		<description><![CDATA[There is a high correlation between &#8220;programmer&#8221; and &#8220;gamer&#8221;. One of the first Area 51 sites we launched, based on community demand, was gaming.stackexchange.com. Despite my fundamental skepticism about gaming as a Q&#38;A topic &#8212; as expressed on episode 87 of Herding Code &#8212; I have to admit it has far exceeded my expectations. But [...]]]></description>
			<content:encoded><![CDATA[<p>
There is a high correlation between &#8220;programmer&#8221; and &#8220;gamer&#8221;. One of the first <a href="http://area51.stackexchange.com/">Area 51 sites</a> we launched, based on community demand, was <a href="http://gaming.stackexchange.com/">gaming.stackexchange.com</a>. Despite my fundamental skepticism about gaming as a Q&amp;A topic &#8212; as expressed on <a href="http://herdingcode.com/?p=263">episode 87 of Herding Code</a> &#8212; I have to admit it has <i>far</i> exceeded my expectations.</p>
<p>
But then maybe I shouldn&#8217;t be so surprised. I&#8217;ve talked about the relationship between gamer and programmer before:</p>
<ul>
<li><a href="http://www.codinghorror.com/blog/2007/08/programming-games-analyzing-games.html">Programming Games, Analyzing Games</a>
<li><a href="http://www.codinghorror.com/blog/2008/04/everything-i-needed-to-know-about-programming-i-learned-from-basic.html">Everything I Needed to Know About Programming I Learned from BASIC</a>
<li><a href="http://www.codinghorror.com/blog/2006/08/game-player-game-programmer.html">Game Player, Game Programmer</a>
</ul>
<p>
I used to recommend games on this very blog that I particularly enjoyed and felt were worthy of everyone&#8217;s attention. I don&#8217;t do this a lot any more, now that my blogging schedule has slipped to one post a week, if I&#8217;m lucky. (If you&#8217;re wondering why, it&#8217;s because running your own business is <i>crazy stupid</i> amounts of work when you <a href="http://blog.stackoverflow.com/2010/05/announcing-our-series-a/">turn it up to eleven</a>.) Here are a few games I&#8217;ve recommended in the past:</p>
<ul>
<li><a href="http://www.codinghorror.com/blog/2005/11/guitar-hero-are-you-ready-to-rock.html">Guitar Hero: Are You Ready to Rock?</a>
<li><a href="http://www.codinghorror.com/blog/2006/02/darwinia.html">Darwinia</a>
<li><a href="http://www.codinghorror.com/blog/2006/10/defcon-shall-we-play-a-game.html">DEFCON: Shall We Play a Game?</a>
<li><a href="http://www.codinghorror.com/blog/2006/09/company-of-heroes.html">Company of Heroes</a>
<li><a href="http://www.codinghorror.com/blog/2007/11/living-the-dream-rock-band.html">Living the Dream: Rock Band</a>
<li><a href="http://www.codinghorror.com/blog/2008/11/feeding-my-graphics-card-addiction.html">Feeding my Graphics Card Addiction (Fallout 3)</a>
<li><a href="http://www.codinghorror.com/blog/2008/12/my-software-is-being-pirated.html">My Software is Being Pirated (World of Goo)</a>
</ul>
<p>
I haven&#8217;t had a ton of time to play games, other than <a href="http://www.fakeplasticrock.com/2010/10/the-ultimate-rock-band-3-setup/">the inevitable Rock Band 3</a>, but I&#8217;ve been consumed by another game I had no idea would become so addictive &#8212; <a href="http://www.justcause.com/home">Just Cause 2</a>.</p>
<p>
<a href="http://www.amazon.com/gp/search?ie=UTF8&amp;keywords=%22just%20cause%202%22&amp;tag=codinghorror-20&amp;index=videogames&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"><img alt="Just-cause-2" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/db6ca_6a0120a85dcdae970b0147e03a2aa6970b-800wi" border="0" /></a></p>
<p>
It&#8217;s what you might call <b>an open world sandbox game</b>, in the vein of the Grand Theft Autos. But I could never get into the GTA games, even after trying GTA 3 and its sequels Vice City and San Andreas. They just left me cold, somehow.</p>
<p>
Where GTA and its ilk often felt a tad too much like work for my tastes, Just Cause 2 is almost the opposite &#8212; it is non-stop, full blown open world pandemonium from start to finish. One of the game&#8217;s explicit goals is that <b>you advance the plot by <i>blowing stuff up</i></b>. No, seriously. I&#8217;m not kidding. You have an entire 1000+ square kilometer island paradise at your disposal, filled with cities and military bases, spanning the range from snowy mountains to deserts to idyllic beaches &#8212; all just waiting for you to turn them into &#8220;chaos points&#8221; &hellip; by any means necessary.</p>
<p>
<a href="http://www.amazon.com/gp/search?ie=UTF8&amp;keywords=%22just%20cause%202%22&amp;tag=codinghorror-20&amp;index=videogames&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"><img alt="Just-cause-2-helicopter" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/63984_6a0120a85dcdae970b0147e03a3c40970b-800wi" border="0" /></a></p>
<p>
Of course, you get around by hijacking whatever vehicles happen by, be they boats, airplanes, jumbo jets, cars, tanks, trucks, buses, monster trucks, motorcycles, scooters, tractors or anything in between. Even <i>on foot</i> it is fun to navigate the island of Panau, because the developers gave us an <b>impossibly powerful personal zipline</b> that you can fire at any object in the game to propel yourself toward it. Combine that with the magical parachute you can deploy anywhere, anytime, and they make for some fascinating diversions (parasailing anyone?). You can also use the zipline to attach any two objects together. Think about that for a second. Have you ever wondered what happens when you zipline a moving vehicle to a tree? Or a pedestrian? Or another vehicle? Hmm. As a result, simply going walkabout on the island is <a href="http://www.rockpapershotgun.com/2010/04/02/postcards-from-panau/">more fun than I ever would have imagined</a>.</p>
<p>
Between the 49 plot missions, 9 stronghold takeovers, 104 unique vehicles, the optional boat/plane/car/parachute race missions,the <a href="http://www.youtube.com/watch?v=nqLNLOaOXbk">opportunities</a> for <a href="http://www.youtube.com/watch?v=ZHlJ7DCdkzw">insane stunt</a> points, the umpteen zillion upgrade crates and faction objects to collect, and the 360+ locations in the 1000+ square kilometers of Panau &#8212; there&#8217;s always something interesting happening around every corner. And whatever it is, it&#8217;s probably beautiful and <i>blows up real good</i>.</p>
<p>
<a href="http://www.amazon.com/gp/search?ie=UTF8&amp;keywords=%22just%20cause%202%22&amp;tag=codinghorror-20&amp;index=videogames&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325"><img alt="Just-cause-2-explosion" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/07775_6a0120a85dcdae970b0147e03a5c9c970b-800wi" border="0" /></a></p>
<p>
In short, <b>Just Cause 2 is deliriously, stupidly, absurdly entertaining</b>. I can&#8217;t even remember the last game I completed where I felt compelled to go back after finishing the main storyline to discover even more areas I missed during my initial playthrough and get (most of) the in-game achievements. Whatever amount of time you have to play, Just Cause 2 will happily fill it with totally unscripted, awesome open world pandemonium.</p>
<p>
Don&#8217;t take my word for it; even the notoriously acidic game reviewer Yahtzee <a href="http://www.escapistmagazine.com/videos/view/zero-punctuation/1632-Just-Cause-2">had almost nothing negative to say about Just Cause 2</a>, which is his version of a positive review. And Metacritic gives Just Cause 2 a <a href="http://apps.metacritic.com/games/platforms/pc/justcause2">solid 84</a>. Not that it can&#8217;t be improved, of course; after such a sublime sandbox experience, I&#8217;m desperately curious to see what they&#8217;ll add for Just Cause 3.</p>
<p>
Luckily for you, the game has been out long enough that it can be <b>picked up for a song on PS3, Xbox, or PC</b>. Steam has <a href="http://store.steampowered.com/app/8190/">Just Cause 2 on sale right now</a> in an 8 player pack for $60, and <a href="http://www.amazon.com/gp/search?ie=UTF8&amp;keywords=%22just%20cause%202%22&amp;tag=codinghorror-20&amp;index=videogames&amp;linkCode=ur2&amp;camp=1789&amp;creative=9325">Amazon has all versions in stock for under $30</a>. Beware, though, as the PC version does require a pretty solid video card along with Windows Vista or newer &#8212; but the upside is that I have mine cranked up to 2048&#215;1152 with almost all the options on, and it rarely dips below 60 fps.</p>
<p>
<b>I spent my holidays on the beautiful island of Panau, and I don&#8217;t regret a second of it.</b> If you&#8217;re looking for a vacation spot, I heartily recommend the open world sandbox of Panau. But while you&#8217;re visiting, <i>do</i> be mindful of any errant gunfire, vehicles, and explosions.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">JIRA Studio</a> &#8211; SVN hosting, issue tracking, CI and Google Apps integration. <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">Free trial »</a>
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/my-holiday-in-beautiful-panau/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Your Internet Driver&#8217;s License</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/your-internet-drivers-license/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/your-internet-drivers-license/#comments</comments>
		<pubDate>Wed, 24 Nov 2010 13:50:34 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[alpha geek]]></category>
		<category><![CDATA[best buy]]></category>
		<category><![CDATA[collective pain]]></category>
		<category><![CDATA[health insurance card]]></category>
		<category><![CDATA[loyalty card]]></category>
		<category><![CDATA[man purse]]></category>
		<category><![CDATA[rental membership]]></category>
		<category><![CDATA[stack overflow]]></category>
		<category><![CDATA[usernames and passwords]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/your-internet-drivers-license/</guid>
		<description><![CDATA[Back in summer 2008 when we were building Stack Overflow, I chose OpenID logins for reasons documented in Does The World Really Need Yet Another Username and Password: I realize that OpenID is far from an ideal solution. But right now, the one-login-per-website problem is so bad that I am willing to accept these tradeoffs [...]]]></description>
			<content:encoded><![CDATA[<p>
Back in summer 2008 when we were building Stack Overflow, I chose OpenID logins for reasons documented in <a href="http://www.codinghorror.com/blog/2008/05/openid-does-the-world-really-need-yet-another-username-and-password.html">Does The World Really Need Yet Another Username and Password</a>:</p>
<blockquote><p>
I realize that OpenID is far from an ideal solution. But right now, the one-login-per-website problem is so bad that I am willing to accept these tradeoffs for a partial <a href="http://www.codinghorror.com/blog/archives/001046.html">worse is better</a> solution. There&#8217;s absolutely no way I&#8217;d put my banking credentials behind an OpenID. But there are also dozens of sites that I don&#8217;t need anything remotely approaching banking-grade security for, and I use these sites far more often than my bank. The <a href="http://www.codinghorror.com/blog/2006/03/the-login-explosion.html">collective pain of remembering all these logins</a> &#8212; and the way my email inbox becomes a de-facto collecting point and <a href="http://www.codinghorror.com/blog/2008/06/please-give-us-your-email-password.html">security gateway</a> for all of them &#8212; is substantial.
</p></blockquote>
<p>
It always pained me greatly that <b>every rinky-dink website on the entire internet demanded that I create a special username and password <i>just for them</i></b>. Yes, if you&#8217;re an alpha geek, then you probably use a combination of special software and USB key from your <a href="http://www.codinghorror.com/blog/2010/08/whats-on-your-utility-belt.html">utility belt</a> to generate secure usernames and passwords for the dozens of websites you frequent. But for the vast, silent majority of normals, who know nothing of security but desire convenience above all, this means one thing: <i>using the same username and password over and over</i>. And it&#8217;s <a href="http://www.codinghorror.com/blog/2009/01/dictionary-attacks-101.html">probably a simple password</a>, too.</p>
<p>
This is the status quo of identity on the internet. It is deeply and fundamentally broken.</p>
<p>
But it doesn&#8217;t have to be this way. If you <a href="http://www.codinghorror.com/blog/2009/04/optimizing-your-wallet.html">open your wallet</a> (or purse, or man-purse, or whatever), I bet you&#8217;ll find a variety of credentials you use to prove your identity wherever you go. </p>
<p>
<a href="http://www.flickr.com/photos/joits/31346894/"><img class="asset  asset-image at-xid-6a0120a85dcdae970b0147e01d0dac970b image-full" alt="Wallet-contents" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/cff00_6a0120a85dcdae970b0147e01d0dac970b-800wi" border="0" /></a></p>
<p>
The average wallet contains a few different forms of identity with varying strengths:</p>
<ul>
<li>Strong: California driver&#8217;s license, student ID
<li>Moderate: credit cards, health insurance card, video rental membership, gym card
<li>Weak: Albertson&#8217;s Preferred Card, Best Buy Rewards Zone Card, Coffee loyalty card
</ul>
<p>
(and sometimes even, uh, cards for free lapdances, apparently)</p>
<p>
<b>In the real world, we don&#8217;t regularly hold two dozen forms of identity like we expect people to on the web.</b> Not only would you be carrying around the <a href="http://www.seinology.com/scripts/script-168.shtml">freaking Constanza wallet</a> at that point, it would be <i>insane</i>. In the real world, we somehow manage to get by with about two or three strong forms of identity, complemented by a few other weaker forms to taste.</p>
<p>
I&#8217;m proposing that our web wallets begin to mimic our physical wallets. <b>Whenever a website needs to know who I am, they should ask to see my Internet Driver&#8217;s License.</b></p>
<p>
<img class="asset  asset-image at-xid-6a0120a85dcdae970b0147e01d3e4b970b" alt="Bigfoot-drivers-license" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/31fdf_6a0120a85dcdae970b0147e01d3e4b970b-800wi" border="0" /></p>
<p>
Now, I don&#8217;t <i>literally</i> mean a driver&#8217;s license. I&#8217;m using this term figuratively to mean online credentials that I can re-use in more than one place on the internet. If all I want to do is leave a comment on a blog &#8212; like, say, <a href="http://www.codinghorror.com/blog/2010/02/welcome-back-comments.html"><i>this one</i></a> &#8212; then one of the weaker forms of identity will surely do. If I&#8217;m starting a new bank account, or setting up a profile on a dating website, then maybe a stronger credential from my virtual wallet is necessary.</p>
<p>
The core concept that users need to get used to is <b>logging in to a website by showing a third party credential</b> to validate their identity. This idea isn&#8217;t nearly as crazy as it seemed in 2008. How many websites can you log into by showing your Facebook, Google, or Twitter credentials now? <i>Lots!</i></p>
<p>
<img class="asset  asset-image at-xid-6a0120a85dcdae970b01348979d2eb970c image-full" alt="Disqus-login" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/85432_6a0120a85dcdae970b01348979d2eb970c-800wi" border="0" /></p>
<p>
The whole online identity situation may seem as impossible as peace in the Middle East at this point. But when faced with a problem that appears intractable, is your solution to throw your hands up, mindlessly embrace the status quo, and wearily sigh <i>&#8220;whaddaya gonna do?&#8221;</i></p>
<p>
Some people do that. It&#8217;s their right. Personally, I prefer to <b>be the change I want to see</b>. So for us, on Stack Overflow and the <a href="http://stackexchange.com/">Stack Exchange network</a>, that means <i>aggressively promoting the concept of the Internet Driver&#8217;s License</i>. Including educating users as necessary. </p>
<p>
For example, consider this ATM machine. To use it, <b>do I need to sign up for an account at Shanghai Peking Development Bank?</b> No. I can use any form of trusted third-party credentials the machine supports.</p>
<p>
<img class="asset  asset-image at-xid-6a0120a85dcdae970b0147e01d60cb970b image-full" alt="Atm-machine" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/d88e8_6a0120a85dcdae970b0147e01d60cb970b-800wi" border="0" /></p>
<p>
Similarly, to log into <a href="http://stackexchange.com/">any Stack Exchange site</a>, including Stack Overflow, <b>present any OpenID or OAuth 2.0 compliant identity provider as your Internet Driver&#8217;s License.</b></p>
<p>
<img class="asset  asset-image at-xid-6a0120a85dcdae970b01348979ddd4970c image-full" alt="Atm-machine-stackoverflow" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/3d2a8_6a0120a85dcdae970b01348979ddd4970c-800wi" border="0" /></p>
<p>
When we founded Stack Overflow, we set out with the explicit mission to make the internet better. Adding yet another meaningless username and password to the fabric of the web does not make it better. <b>What <i>does</i> make the internet better is continued pursuit of better, simpler, re-usable forms of third party online identity.</b> That&#8217;s why I urge you to join me in supporting <a href="http://openid.net/">OpenID</a>, <a href="http://wiki.oauth.net/w/page/25236487/OAuth-2">OAuth 2.0</a>, and any other promising implementations of the Internet Driver&#8217;s License.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">JIRA Studio</a> &#8211; SVN hosting, issue tracking, CI and Google Apps integration. <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">Free trial »</a>
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/your-internet-drivers-license/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Breaking the Web&#8217;s Cookie Jar</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/breaking-the-webs-cookie-jar/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/breaking-the-webs-cookie-jar/#comments</comments>
		<pubDate>Sun, 14 Nov 2010 14:27:08 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[art project]]></category>
		<category><![CDATA[cookie jar]]></category>
		<category><![CDATA[fundamental issue]]></category>
		<category><![CDATA[http headers]]></category>
		<category><![CDATA[network packets]]></category>
		<category><![CDATA[pr stunt]]></category>
		<category><![CDATA[social security number]]></category>
		<category><![CDATA[typical sort]]></category>
		<category><![CDATA[uproar]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/breaking-the-webs-cookie-jar/</guid>
		<description><![CDATA[The Firefox add-in Firesheep caused quite an uproar a few weeks ago, and justifiably so. Here&#8217;s how it works: Connect to a public, unencrypted WiFi network. In other words, a WiFi network that doesn&#8217;t require a password before you can connect to it. Install Firefox and the Firesheep add-in. Wait. Maybe have a latte while [...]]]></description>
			<content:encoded><![CDATA[<p>
The Firefox add-in <a href="http://codebutler.com/firesheep">Firesheep</a> caused quite an uproar a few weeks ago, and justifiably so. Here&#8217;s how it works:</p>
<ul>
<li>Connect to a public, <i>unencrypted</i> WiFi network. In other words, a WiFi network that doesn&#8217;t require a password before you can connect to it.
<li>Install Firefox and the Firesheep add-in.
<li>Wait. Maybe have a latte while you&#8217;re waiting.
<li>Click on the user / website icons that appear over time in Firesheep to <b>instantly log in as that user on that website</b>.
</ul>
<p>
Crazy! This guy who wrote Firesheep must be a world-class hacker, right?</p>
<p>
Well, no. The work to package this up in a point-and-click way that is (sort of) accessible to power users is laudable, but what Firesheep actually <i>does</i> is far from magical. It&#8217;s more of an art project and PR stunt than an actual hack of any kind. Still, I was oddly excited to see Firesheep get so much PR, <b>because it highlights a fundamental issue with the architecture of the web.</b></p>
<p>
The web is kind of a primitive medium. The only way websites know who you are is through tiny, uniquely identifiying strings your browser sends to the webserver on each and every click:</p>
<p><pre>
GET / HTTP/1.1
Host: diy.stackexchange.com
Connection: keep-alive
User-Agent: Chrome/7.0.517.44
Accept-Language: en-US,en;q=0.8
Cookie: diyuser=t=ZlQOG4kege&amp;s=8VO9gjG7tU12s
If-Modified-Since: Tue, 09 Nov 2010 04:41:12 GMT
</pre>
<p>
These are the typical sort of HTTP headers your browser sends to a website on every click. See that little cookie in bright red? To a website, that&#8217;s your fingerprint, DNA, and social security number all rolled into one. <b>Some part of the cookie contains a unique user ID that tells the website you are <i>you</i></b>. </p>
<p>
And guess what? That cookie is always broadcast in plain text every single time you click a link on any website. Right out in the open where anyone &#8212; well, technically, <i>anyone who happens to be on the same network as you and is in a position to view your network packets</i> &#8212; can just grab it out of the ether and <b>immediately impersonate you on any website you are a member of.</b></p>
<p>
<img class="asset  asset-image at-xid-6a0120a85dcdae970b013488f70af1970c" alt="Broken-cookie" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/04830_6a0120a85dcdae970b013488f70af1970c-800wi" border="0" /></p>
<p>
Now that you know how cookies work (and I&#8217;m not saying it&#8217;s rocket surgery or anything), you also know that what Firesheep does is relatively straightforward:</p>
<ol>
<li>Listen to all HTTP traffic.
<li>Wait for HTTP headers from a known website.
<li>Isolate the part of the cookie header that identifies the user.
<li>Launch a new browser session with that cookie. Bam! As far as the target webserver is concerned, you <i>are</i> that user!
</ol>
<p>
All Firesheep has to do, really, is <i>listen</i>. That&#8217;s pretty much all there is to this &#8220;hack&#8221;. Scary, right? Well, then you should be positively quaking in your boots, because <b>this is the way the entire internet has worked since 1994</b>, when <a href="http://en.wikipedia.org/wiki/HTTP_cookie#History">cookies were invented</a>.</p>
<p>
So why wasn&#8217;t this a problem in, say, 2003? Three reasons:</p>
<ol>
<li>Commodity public wireless internet connections were not exactly common until a few years ago.
<li>Average people have moved beyond mostly anonymous browsing and transferred significant parts of their identity online (aka the Facebook effect).
<li>The tools required to listen in on a wireless network are slightly &hellip; less primitive now.
</ol>
<p>
Firesheep came along at the exact inflection point of these three trends. And mind you, it is still not a sure thing &#8212; Firesheep requires a particular set of wireless network chipsets that support <a href="http://en.wikipedia.org/wiki/Promiscuous_mode">promiscuous mode</a> in the lower level WinPcap library that Firesheep relies on. But we can bet that the floodgates have been opened, and future tools similar to this one will become increasingly a one-click affair.</p>
<p>
The other reason this wasn&#8217;t a problem in 2003 is because <b>any website that truly <i>needed</i> security switched to encrypted HTTP &#8212; aka <a href="http://en.wikipedia.org/wiki/HTTP_Secure">Secure HTTP</a> &#8212; long ago</b>. HTTPS was invented in 1994, at the same time as the browser cookie. This was not a coincidence. The creators of the cookie knew from day one they needed a way to protect them from prying eyes. Even way, way back in the dark, primitive ages of 2003, any banking website or identity website worth a damn wouldn&#8217;t even <i>consider</i> using plain vanilla HTTP. They&#8217;d be laughed off the internet!</p>
<p>
The outpouring of concern over Firesheep is justified, because, well, the web&#8217;s cookie jar has always been kind of broken &#8212; and we ought to do something about it. But what?</p>
<p>
Yes, <b>you can naively argue that every website should encrypt all their  traffic all the time</b>, but to me that&#8217;s a &#8220;boil the sea&#8221; solution. I&#8217;d rather see a better, more secure identity protocol than ye olde HTTP cookies. I don&#8217;t actually care if anyone sees the rest of my public activity on Stack Overflow; it&#8217;s hardly a secret. But gee, I sure <i>do</i> care if they <a href="http://www.codinghorror.com/blog/2008/08/protecting-your-cookies-httponly.html">somehow sniff out my cookie and start running around doing stuff as me!</a> Encrypting everything just to protect that one lousy cookie header seems like a whole lot of overkill to me.</p>
<p>
I&#8217;m not holding my breath for that to happen any time soon, though. So here&#8217;s what you can do to protect yourself, right now, today:</p>
<ol>
<li><b>We should be very careful how we browse on unencrypted wireless networks</b>. This is the great gift of Firesheep to all of us. If nothing else, we should be thanking the author for this simple, stark warning. It&#8217;s an unavoidable fact of life: if you must go wireless, seek out <i>encrypted</i> wireless networks. If you have no other choices except unencrypted wireless networks, browse anonymously &#8212; quite possible if all you plan to do is casually surf the web and read a few articles &#8212; and <i>only</i> log in to websites that support https. Anything else risks identity theft.
<li><b>Get in the habit of accessing your web mail through HTTPS</b>. Email is <a href="http://www.codinghorror.com/blog/2008/06/please-give-us-your-email-password.html">the de-facto skeleton key to your online identity</a>. When your email is compromised, all is lost. If your webmail provider does not support secure http, they are idiots. Drop them like a hot potato and <i>immediately</i> switch to one that does. Heck, the smart webmail providers <a href="http://gmailblog.blogspot.com/2010/01/default-https-access-for-gmail.html">already switched to https by default!</a>
<li><b>Lobby the websites you use to offer HTTPS browsing</b>. I think we&#8217;re clearly past the point where only banks and finance sites should be expected to use secure HTTP. As more people shift more of their identities online, it makes sense to protect those identities by moving HTTPS from the domain of a massive bank vault door to just plain <i>locking the door</i>. <a href="http://www.imperialviolet.org/2010/06/25/overclocking-ssl.html">SSL isn&#8217;t as expensive as it used to be</a>, in every dimension of the phrase, so this is not an unreasonable thing to ask your favorite website for.
</ol>
<p>
This is very broad advice, and there are a whole host of technical caveats to the above. But it&#8217;s a starting point toward evangelizing the risks and responsible use of open wireless networks. Firesheep may indeed have broken the web&#8217;s cookie jar. But it was kind of an old, beat up, cracked cookie jar in the first place. I hope the powers that be will use Firesheep as incentive to <b>build a better online identity solution than creaky old HTTP cookies</b>.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">JIRA Studio</a> &#8211; SVN hosting, issue tracking, CI and Google Apps integration. <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">Free trial »</a>
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/breaking-the-webs-cookie-jar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Keyboard Cult</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-keyboard-cult/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-keyboard-cult/#comments</comments>
		<pubDate>Sat, 23 Oct 2010 01:45:53 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[entire network]]></category>
		<category><![CDATA[global printing]]></category>
		<category><![CDATA[hellip]]></category>
		<category><![CDATA[hunt and peck]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iphone 4]]></category>
		<category><![CDATA[Scott Adams]]></category>
		<category><![CDATA[slow typists]]></category>
		<category><![CDATA[touchscreens]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-keyboard-cult/</guid>
		<description><![CDATA[As a guy who spends most of his day typing words on a screen, it&#8217;s hard for me to take touch computing seriously. I love my iPhone 4, and smartphones are the ultimate utility belt item, but attempting to compose any kind of text on the thing is absolutely crippling. It is a reasonable compromise [...]]]></description>
			<content:encoded><![CDATA[<p>
As a guy who spends most of his day <b>typing words on a screen</b>, it&#8217;s hard for me to take touch computing seriously. I love my iPhone 4, and smartphones are the <a href="http://www.codinghorror.com/blog/2010/08/whats-on-your-utility-belt.html">ultimate utility belt item</a>, but attempting to compose any kind of text on the thing is absolutely <i>crippling</i>. It is a reasonable compromise for a device that fits in your pocket &hellip; but that&#8217;s all.</p>
<p>
The minute I switch back to my regular keyboard, I go from being Usain Bolt to <i>the Flash</i>.</p>
<p>
<img alt="Touchscreen-vs-keyboard" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/3675e_6a0120a85dcdae970b0133f5462d3f970b-800wi" border="0" /></p>
<p>
Touchscreens are great for passively browsing, as <a href="http://www.dilbert.com/blog/entry/the_amazingness_of_instant/">Scott Adams noted</a>:</p>
<blockquote><p>
Another interesting phenomenon of the iPhone and iPad era is that we are being transformed from producers of content into consumers. With my BlackBerry, I probably created as much data as I consumed. It was easy to thumb-type long explanations, directions, and even jokes and observations. With my iPhone, I try to avoid creating any message that are over one sentence long. But I use the iPhone browser to consume information a hundred times more than I did with the BlackBerry. I wonder if this will change people over time, in some subtle way that isn&#8217;t predictable. What happens when people become trained to think of information and entertainment as something they receive and not something they create?
</p></blockquote>
<p>
Because we run <a href="http://stackexchange.com/sites">an entire network of websites</a> devoted to learning by typing words on a page, it&#8217;s difficult for me to get past this.</p>
<p>
But I&#8217;m not here to decry the evils of touchscreen computing. It has its place in the pantheon of computing. <b>I&#8217;m here to sing the praises of the humble keyboard</b>. The device that, when combined with the internet, turns every human being into a highly efficient global printing press.</p>
<p>
My love affair with the keyboard goes way back:</p>
<ul>
<li><a href="http://www.codinghorror.com/blog/2005/02/keyboarding.html">Keyboarding</a>
<li><a href="http://www.codinghorror.com/blog/2008/11/we-are-typists-first-programmers-second.html">We Are Typists First, Programmers Second</a>
<li><a href="http://www.codinghorror.com/blog/2009/02/have-keyboard-will-program.html">Have Keyboard, Will Program</a>
</ul>
<p>
Maybe I&#8217;m biased. As I recently <a href="http://programmers.stackexchange.com/questions/492/how-important-is-the-ability-to-touch-type/4339#4339">remarked on programmers.stackexchange.com</a>, I can&#8217;t take slow typists seriously as programmers. <b>When was the last time you saw a hunt-and-peck pianist?</b></p>
<p>
I&#8217;ve been <a href="http://www.codinghorror.com/blog/2005/09/keyboarding-microsoft-natural-ergonomic-4000.html">monogamous with the Microsoft Natural Keyboard 4000</a> for a long time. But in this supposedly happy marriage, I was accidentally neglecting one of the most crucial aspects of the keyboard experience.</p>
<blockquote><p>
The vast majority of keyboards included with white box systems or sold at office supply stores are <b>rubber dome or membrane keyboards</b>.</p>
<p>
<img alt="Membrane-remote-control" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/16658_6a0120a85dcdae970b013488662b93970c-800wi" border="0" /></p>
<p>
They are inexpensive, mass produced, relatively low quality devices that are inconsistent and degrade the user experience. Most users don&#8217;t know this, or simply don&#8217;t care. The appeal of cheap rubber dome or membrane keyboards is that they&#8217;re usually available in a variety of styles, are included &#8220;free&#8221; with a new system, and they may sport additional features like media controls or wireless connectivity. But these cheap keyboards typically don&#8217;t provide users with any tactile feedback, the keys feel mushy and may not all actuate at the same point, and the entire keyboard assemblies themselves tend to flex and move around when typed on. Not fun.
</p></blockquote>
<p>
All this time, I&#8217;ve been <b>typing on keyboards with least-common-denominator rubber dome innards</b>. I was peripherally aware of higher quality mechanical keyboards, but I never appreciated them until I located this <a href="http://www.overclock.net/keyboards/491752-mechanical-keyboard-guide.html">absolutely epic mechanical keyboard guide thread</a>. It&#8217;s also the source of an entire forum of people at <a href="http://geekhack.org">geekhack.org</a> who are mechanical keyboard enthusiasts. These kinds of communities and obsessions, writ so large and with such obvious passion, fascinate me. They are the inspiration for what we are trying to do with Stack Overflow and the <a href="http://stackexchange.com/sites">Stack Exchange network</a>.</p>
<p>
If you don&#8217;t have time to read <a href="http://www.overclock.net/keyboards/491752-mechanical-keyboard-guide.html">that epic guide</a> (but you should!), allow me to summarize:</p>
<ol>
<li>Almost all computer and laptop keyboards today use <b>cheap, low quality switches</b> &#8212; rubber dome, membrane, scissor, or foam element.
<li><b>Mechanical switches</b> are considered superior in every way by keyboard enthusiasts.
<li>Because the general public largely doesn&#8217;t care about keyboard feel or durability, and because mechanical switches are are more expensive, mechanical switch keyboards are quite rare these days.
</ol>
<p>
Mechanical switches look, well, mechanical. They&#8217;re spiritually the same as those old-school arcade buttons we used to mash on in the 1980s. You push down on the key, and the switch physically actuates.</p>
<p>
<img alt="Buckling-spring-switch" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/191c7_6a0120a85dcdae970b0133f546657c970b-800wi" border="0" /></p>
<p>
Yes, we are rapidly approaching the threshold of esoterica here. Mechanical keyboards were already becoming rare even before the internet, so I&#8217;d wager many people now reading this can&#8217;t possibly know the difference between a typical cheap membrane keyboard and a fancy mechanical model because <i>they&#8217;ve never had the opportunity to try one!</i></p>
<p>
We should rectify that.</p>
<p>
If you want to <b>dip your fingers into the world of mechanical switch keyboards</b>, start by asking yourself a few questions:</p>
<ul>
<li>Are you willing to spend $70 to $300 for a keyboard?
<li>How noisy do you want your typing to be?
<li>Do you want a tactile &#8220;snap&#8221; when the key is depressed?
<li>How much force do you type with &#8212; do you have a light or heavy touch?
<li>How much key travel do you want?
</ul>
<p>Next, there are further subtleties to consider, like <i>how the keys are printed</i>:</p>
<ul>
<li><b>Pad Printed</b> &#8212; the standard cheap stuff. Little more than stickers. Keycaps will wear off fast.
<li><b>Laser Etched</b> &#8212; permanent, but leaves tiny surface scars on the keys due to the characters being literally burned into the keys. May also be a tiny bit blurry.
<li><b>Dye Sublimated</b> &#8212; dye set into plastic; expensive but nearly optimal.
<li><b>Injection Molded</b> &#8212; two keys in different colors are physically bonded together. Very expensive but considered as close to perfect as you can get. Notably, NeXT keyboards used this method.
</ul>
<p>
And what about the shape of the keycaps? Cylindrical? Spherical? Flat? And if you&#8217;re an avid keyboard gamer, you might want to consider <a href="http://en.wikipedia.org/wiki/Rollover_(key)">n-key rollover</a>, too. I warned you this rabbit hole was deep.</p>
<p>
Let&#8217;s start looking at a few likely candidates. The one you may already know is <a href="http://www.daskeyboard.com/">Das Keyboard</a>.</p>
<p>
<img alt="Das-keyboard" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/d497a_6a0120a85dcdae970b013488666a2f970c-800wi" border="0" /></p>
<p>
Das is a good, reliable brand of mechanical keyboards. They have two primary models. Each is available in the &#8220;blank keycaps&#8221; versions if you are the sort of ninja typist who doesn&#8217;t need to look at the keyboard &#8212; you type by chanelling the Force.</p>
<ul>
<li><a href="http://www.daskeyboard.com/model-s-professional-silent/">DAS Keyboard Model S Professional silent</a>
<li><a href="http://www.daskeyboard.com/model-s-professional/">DAS Model S Professional</a>
</ul>
<p>
The &#8220;silent&#8221; mechanical switch distinction is an important one: <b>mechanical switches can be loud.</b> How loud? The DAS website <a href="http://store.daskeyboard.com/Reusable-Earplugs/dp/B003ALN3QE">actually sells honest-to-god earplugs as a keyboard accessory</a>. I&#8217;m sure it&#8217;s <i>slightly</i> tongue in cheek. Maybe. But consider yourself warned, and choose the silent model if you aren&#8217;t a fan of the clickety-clack typing.</p>
<p>
If you want the most old-school IBM-esque experience possible, and a true classic <b>buckling spring</b> keyboard, then <a href="http://pckeyboards.stores.yahoo.net//keyboards.html">Unicomp</a> is your huckleberry. The common models are the <a href="http://pckeyboards.stores.yahoo.net//customizer.html">Customizer 104/105</a> and <a href="http://pckeyboards.stores.yahoo.net//en104bl.html">SpaceSaver 104/105</a>. </p>
<p>
<img alt="Unicomp-spacesaver" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/90b03_6a0120a85dcdae970b013488666aed970c-800wi" border="0" /></p>
<p>
Next up is <a href="http://elitekeyboards.com">Elite Keyboards</a>, but I can only recommend the (slightly expensive) <a href="http://elitekeyboards.com/products.php?sub=topre_keyboards,realforce&amp;pid=rf_se02b0">Topre Realforce model</a> due to the cheap pad keycap printing used on their other models. </p>
<p>
<img alt="Topre-realforce" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/bc736_6a0120a85dcdae970b013488666e27970c-800wi" border="0" /></p>
<p>
Finally, <a href="http://www.deckkeyboards.com/">Deck Keyboards</a> &#8212; I remember writing about these guys years ago. They have a full sized keyboard now with a lot of attention to detail: <a href="http://www.deckkeyboards.com/">The Deck Legend</a>.</p>
<p>
<img alt="Deck-legend-keyboard" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/b8303_6a0120a85dcdae970b013488667062970c-800wi" border="0" /></p>
<p>
It is also the only keyboard in its class that is backlit, if that&#8217;s your bag.</p>
<p>
Of course, none of these premium fancypants mechanical switch keyboards are really <i>necessary</i>. The most important aspect of writing isn&#8217;t the keyboard you use, but the simple act of <a href="http://www.codinghorror.com/blog/2006/02/fear-of-writing.html">getting out there and writing as much as you can</a>. But if, like me, you accidentally fall in love with the keyboard and everything it represents &#8212; then I think you owe it to yourself to <b>find out what a great keyboard is <i>supposed</i> to feel like.</b></p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">JIRA Studio</a> &#8211; SVN hosting, issue tracking, CI and Google Apps integration. <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">Free trial »</a>
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-keyboard-cult/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Because Everyone Needs a Router</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/because-everyone-needs-a-router/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/because-everyone-needs-a-router/#comments</comments>
		<pubDate>Wed, 06 Oct 2010 13:35:58 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/because-everyone-needs-a-router/</guid>
		<description><![CDATA[Do you remember when a router used to be an exotic bit of network kit? Those days are long gone. A router is one of those salt-of-the-earth items now; anyone who pays for an internet connection needs a router, for: NAT and basic hardware firewall protection from internet evildoers A wired network hub to connect [...]]]></description>
			<content:encoded><![CDATA[<p>
Do you remember when a router used to be an exotic bit of network kit?</p>
<p>
Those days are long gone. A router is one of those salt-of-the-earth items now; <b>anyone who pays for an internet connection needs a router</b>, for:</p>
<ol>
<li>NAT and basic hardware firewall protection from internet evildoers
<li>A wired network hub to connect local desktop PCs
<li>A wireless hub to connect laptops, phones, consoles, etcetera
</ol>
<p>
Let me put it this way: my mom &#8212; and my wife&#8217;s mom &#8212; both own routers. If that isn&#8217;t the definition of <i>mainstream</i>, I don&#8217;t know what is.</p>
<p>
Since my livelihood revolves around being on the internet, and because I&#8217;m a bit of a tweaker, I have a fancy-ish router. But <a href="http://www.codinghorror.com/blog/2007/12/gifts-for-geeks-2007-edition.html">it is of late 2007 vintage</a>:</p>
<p>
<a href="http://www.amazon.com/exec/obidos/ASIN/B000Z7AKGC/codinghorror-20"><img src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/bb242_6a0120a85dcdae970b0120a86dac17970b-pi" /></a></p>
<p>
Although the <a href="http://www.amazon.com/exec/obidos/ASIN/B000Z7AKGC/codinghorror-20">DGL-4500</a> is a nice router, and it has served me well with no real complaints, the last major firmware update for it was a year and a half ago. There have been some desultory minor updates since then, but clearly the vendor has, shall we say, <i>moved on</i> to focusing on newer models.</p>
<p>
The router is (literally!) the central component in my overall internet experience, and I was growing increasingly uncomfortable with the status quo. Frankly, the prospect of three year old hardware with year old firmware gives me the heebie-jeebies.</p>
<p>
So, I asked the pros at <a href="http://superuser.com/">Super User</a>, even going so far as to set up <a href="http://chat.superuser.com/rooms/19/recommend-me-a-router">a Recommend Me a Router chat room</a>. (We disallow product recommendation questions as they become uselessly out of date so quickly, but this is a perfect topic for a chat room.) I got some fantastic advice from my fellow Super Users via chat, though much of it was of the far too sane &#8220;if it ain&#8217;t broke don&#8217;t fix it&#8221; variety. Well, that&#8217;s just <a href="http://www.codinghorror.com/blog/2004/11/dont-be-afraid-to-break-stuff.html">not how I work</a>. To be fair, the router market is not exactly a hotbed of excitement at the moment; it is both saturated and heavily commoditized, particularly now that the dust has settled from the whole <a href="http://en.wikipedia.org/wiki/IEEE_802.11">802.11 A/B/G/N debacle</a>. There just isn&#8217;t much going on.</p>
<p>
But in the process of doing my router research, I discovered something important, and maybe even revolutionary in its own quiet little way. <b>The best router models all run open source firmware!</b></p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/DD-WRT">DD-WRT</a>
<li><a href="http://en.wikipedia.org/wiki/Tomato_(firmware)">Tomato</a>
</ul>
<p>
That&#8217;s right, the truly great routers <a href="http://www.codinghorror.com/blog/2009/07/oh-you-wanted-awesome-edition.html">are available in &#8220;awesome&#8221; edition</a>. (There may be other open source router firmwares out there, but these are the two I saw most frequently.) I learned that these open source firmwares can turn a boring Clark Kent router into Superman. And they are <i>always</i> kept updated by the community, in perpetuity.</p>
<p>
In my weaker moments, I toyed with the idea of building <a href="http://techreport.com/articles.x/19227">a silent mini x86 PC</a> that could run a routing optimized distribution of Linux, but the reality is that current commodity routers have <i>more</i> than enough memory and embedded CPU power &#8212; not to mention the necessary wireless and gigabit ethernet hub bits already built in. Dedicating a whole x86 PC to routing is power inefficient, overly complex, and awkward.</p>
<p>
Yes, today&#8217;s router marketplace is commoditized and standardized and boring &#8212; but there are still a few clear hardware standouts. I turned to the experts at <a href="http://www.smallnetbuilder.com/">SmallNetBuilder</a> for their in-depth technical reviews, and found two consensus recommendations:</p>
<p>
<a href="http://www.smallnetbuilder.com/wireless/wireless-reviews/30889-buffalo-nfiniti-wireless-n-high-power-router-a-access-point-reviewed">Buffalo Nfiniti Wireless-N High Power Router</a> ($80)</p>
<p>
<a href="http://www.amazon.com/dp/B0028ACYEK/?tag=codinghorror-20"><img class="asset  asset-image at-xid-6a0120a85dcdae970b013487b30216970c" alt="Buffalo_wzr-hp-g300nh" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/ea3a6_6a0120a85dcdae970b013487b30216970c-800wi" border="0" /></a></p>
<p>
<a href="http://www.smallnetbuilder.com/wireless/wireless-reviews/30925-start-your-buying-netgear-wndr3700-reviewed">NETGEAR WNDR3700 RangeMax Dual Band Wireless-N</a> ($150)</p>
<p>
<a href="http://www.amazon.com/dp/B002HWRJY4/?tag=codinghorror-20"><br />
<img class="asset  asset-image at-xid-6a0120a85dcdae970b0133f492443e970b" alt="Netgear-wndr3700-router" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/6ba23_6a0120a85dcdae970b0133f492443e970b-800wi" border="0" /></a></p>
<p>
Both of these models got glowing reviews from the networking experts at SmallNetBuilder, and both are 100% compatible with the <a href="http://www.dd-wrt.com/site/index">all-important open source dd-wrt firmware</a>. You can&#8217;t go wrong with either, but I chose the less expensive <a href="http://www.amazon.com/dp/B0028ACYEK/?tag=codinghorror-20">Buffalo Nfiniti router</a>. Why?</p>
<ol>
<li>It&#8217;s almost half the price, man!
<li>The &#8220;high power&#8221; part is verifiably and benchmarkably true, and I have some <a href="http://www.codinghorror.com/blog/2008/02/extending-your-wireless-network-with-better-antennas.html">wireless range problems at my home</a>.
<li>I do most of my heavy network lifting through wired gigabit ethernet, so I can&#8217;t think of any reason I&#8217;d need the higher theoretical wireless throughput of the Netgear model.
<li>Although the Netgear has a 680 Mhz embedded CPU and 128mb RAM, the Buffalo&#8217;s 400 MHz embedded CPU and 64mb of RAM is not exactly chopped liver, either; it&#8217;s plenty for dd-wrt to work with. I&#8217;d almost go so far as to say the Netgear is a bit overkill&hellip; if you&#8217;re into that sort of thing.
</ol>
<p>
I received my Buffalo Nfiniti and immediately installed dd-wrt on it, which was very simple and accomplished through <a href="http://dd-wrt.com/wiki/index.php/Buffalo_WZR-HP-G300NH">the existing web UI on the router</a>. (Buffalo has a history of shipping rebranded dd-wrt distributions in their routers, so the out-of-box firmware is a kissing cousin.)</p>
<p>
After rebooting, I was in love. The (more) modern gigabit hardware, CPU, and chipset was noticably snappier everywhere, even just dinking around in the admin web pages. And <b>dd-wrt scratches <i>every geek itch I have</i></b> &#8212; putting that newer hardware to great use. Just check out the detailed stats I can get, including that pesky wireless signal strength problem. The top number is the Xbox 360 outside, the bottom number is my iPhone from about 10 feet away.</p>
<p>
<img alt="Dd-wrt-wireless-client-info" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/f2437_6a0120a85dcdae970b013487b30e42970c-800wi" border="0" /></p>
<p>
Worried your router is running low on embedded CPU grunt, or that 64 megabytes of memory is insufficient? Never fear; dd-wrt has you covered. Just check out the detailed, real time memory and cpu load stats.</p>
<p>
<img class="asset  asset-image at-xid-6a0120a85dcdae970b013487b30fb6970c image-full" alt="Dd-wrt-memory-cpu-stats" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/0c3ff_6a0120a85dcdae970b013487b30fb6970c-800wi" border="0" /></p>
<p>
Trying to figure out how much WAN/LAN/Wireless bandwidth you&#8217;re using? How does a real time SVG graph, right from the router admin pages, grab you?</p>
<p>
<img alt="Dd-wrt-bandwidth-graph" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/af91f_6a0120a85dcdae970b0133f49253df970b-800wi" border="0" style="border:1px solid silver" /></p>
<p>
It&#8217;s just great all around. And I haven&#8217;t even covered <a href="http://www.dd-wrt.com/wiki/index.php/What_is_DD-WRT%3F">the proverbial laundry list of features that dd-wrt offers</a> above and beyond most stock firmware! Suffice it to say that this is one of those times when the &#8220;let&#8217;s support everything&#8221; penchant of open source projects works in our favor. Don&#8217;t worry, it&#8217;s all (mostly) disabled by default. Those features and tweaks can all safely be ignored; just know that they&#8217;re available to you when and if you need them.</p>
<p>
This is boring old plain vanilla commodity router hardware, but when combined with an open source firmware, it is a <i>massive</i> improvement over my three year old, proprietary high(ish) end router. The magic router formula these days is <b>a combination of commodity hardware and open-source firmware.</b> I&#8217;m so enamored of this one-two punch combo, in fact, I might even say it represents the future. Not just of the everyday workhorse routers we all need to access the internet &#8212; but the future of all commodity hardware.</p>
<p>
Routers; we all need &#8216;em, and they are crucial to our internet experience. Pick whichever router you like &#8212; as long as it&#8217;s compatible with one of the open source firmware packages! Thanks to a wide variety of mature commodity hardware choices, plus infinitely and perpetually updated open source router firmware, I&#8217;m happy to report that <b>now everyone can have a <i>great</i> router</b>. </p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">JIRA Studio</a> &#8211; SVN hosting, issue tracking, CI and Google Apps integration. <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">Free trial »</a>
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/because-everyone-needs-a-router/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>YouTube vs. Fair Use</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/youtube-vs-fair-use/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/youtube-vs-fair-use/#comments</comments>
		<pubDate>Wed, 06 Oct 2010 13:35:04 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[better off dead]]></category>
		<category><![CDATA[cognitive dissonance]]></category>
		<category><![CDATA[dark ages]]></category>
		<category><![CDATA[excerpt]]></category>
		<category><![CDATA[few days]]></category>
		<category><![CDATA[fingerprint]]></category>
		<category><![CDATA[line position]]></category>
		<category><![CDATA[relationship]]></category>
		<category><![CDATA[YouTube]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/youtube-vs-fair-use/</guid>
		<description><![CDATA[In YouTube: The Big Copyright Lie, I described my love-hate relationship with YouTube, at least as it existed in way back in the dark ages of 2007. Now think back through all the videos you&#8217;ve watched on YouTube. How many of them contained any original content? It&#8217;s perhaps the ultimate case of cognitive dissonance: by [...]]]></description>
			<content:encoded><![CDATA[<p>
In <a href="http://www.codinghorror.com/blog/2007/10/youtube-the-big-copyright-lie.html">YouTube: The Big Copyright Lie</a>, I described my love-hate relationship with YouTube, at least as it existed in way back in the dark ages of 2007.</p>
<blockquote><p>
Now think back through all the videos you&#8217;ve watched on YouTube. How many of them contained any original content? </p>
<p>
It&#8217;s perhaps the ultimate case of cognitive dissonance: by YouTube&#8217;s own rules [which prohibit copyrighted content], YouTube cannot exist. And yet it does.</p>
<p>
How do we reconcile YouTube&#8217;s official hard-line position on copyright with the reality that 90% of the content on their site is clearly copyrighted and clearly used without permission? It seems YouTube has an awfully convenient &#8220;don&#8217;t ask, don&#8217;t tell&#8221; policy&#8211; they make no effort to verify that the uploaded content is either original content or fair use. The copyrighted content stays up until the copyright owner complains. Then, and only then, is it removed.
</p></blockquote>
<p>
Today&#8217;s lesson, then, is <b>be careful what you ask for</b>.</p>
<p>
At the time, I just assumed that YouTube would never be able to resolve this problem through technology. The idea that you could somehow fingerprint every user-created uploaded video against <i>every piece of copyrighted video ever created</i> was so laughable to me that I wrote it off as impossible.</p>
<p>
A few days ago I uploaded a small clip from the movie <a href="http://www.imdb.com/title/tt0088794/">Better Off Dead</a> to YouTube, in order to use it in the <a href="http://www.codinghorror.com/blog/2010/09/go-that-way-really-fast.html">Go That Way, Really Fast</a> blog entry. This is quintessential <b>fair use</b>: a tiny excerpt of the movie, presented in the context of a larger blog entry. So far, so good.</p>
<p>
But then I uploaded a small clip from a different movie that I&#8217;m planning to use in another, future blog entry. Within an hour of uploading it, I received this email:</p>
<blockquote><p>
Dear {username},</p>
<p>
Your video, YouTube vs. Fair Use, may have content that is owned or licensed by {company}.</p>
<p>
No action is required on your part; however, if you are interested in learning how this affects your video, please visit <a href="http://www.youtube.com/my_videos_copyright">the Content ID Matches section of your account</a> for more information.</p>
<p>
Sincerely,<br />
- The YouTube Team
</p></blockquote>
<p>
This 90 second clip is from a recent movie. Not a hugely popular movie, mind you, but a movie you&#8217;ve probably heard of. This email both fascinated and horrified me. <b>How did they match a random, weirdly cropped (thanks, Windows Movie Maker) clip from the middle of a non-blockbuster movie</b> within an hour of me uploading it? This had to be some kind of automated process that checks uploaded user content against every piece of copyrighted content ever created (or the top n subset thereof), <i>exactly the kind that I thought was impossible.</i></p>
<p>
Uh oh.</p>
<p>
I began to do some research. I quickly found <a href="http://www.csh.rit.edu/~parallax/">Fun with YouTube&#8217;s Audio Content ID System</a>, which doesn&#8217;t cover video, but it&#8217;s definitely related:</p>
<blockquote><p>
I was caught by surprise one day when I received an automated email from YouTube informing me that my video had a music rights issue and it was removed from the site. I didn&#8217;t really care.</p>
<p>
Then a car commercial parody I made (arguably one of my better videos) was taken down because I used an unlicensed song. That pissed me off. I couldn&#8217;t easily go back and re-edit the video to remove the song, as the source media had long since been archived in a shoebox somewhere. And I couldn&#8217;t simply re-upload the video, as it got identified and taken down every time. I needed to find a way to outsmart the fingerprinter. I was angry and I had a lot of free time. Not a good combination.</p>
<p>
I racked my brain trying to think of every possible audio manipulation that might get by the fingerprinter. I came up with an almost-scientific method for testing each modification, and I got to work.
</p></blockquote>
<p>
Further research led me to this brief TED talk, <a href="http://www.ted.com/talks/margaret_stewart_how_youtube_thinks_about_copyright.html">How YouTube Thinks About Copyright</a>.</p>
<blockquote><p>
We compare each upload against all the reference files in our database. This heat map is going to show you how the brain of this system works.</p>
<p>
<img src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/b31ab_6a0120a85dcdae970b013487722cc4970c-800wi" border="0" /></p>
<p>
Here we can see the reference file being compared to the user generated content. The system compares every moment of one to the other to see if there&#8217;s a match. This means we can identify a match even if the copy uses just a portion of the original file, plays it in slow motion, and has degraded audio or video.</p>
<p>
The scale and speed of this system is truly breathtaking &#8212; we&#8217;re not just talking about a few videos, we&#8217;re talking about over 100 years of video every day between new uploads and the legacy scans we regularly do across all of the content on the site. And when we compare those 100 years of video, we&#8217;re comparing it against millions of reference files in our database. It&#8217;d be like 36,000 people staring at 36,000 monitors each and every day without as much as a coffee break.
</p></blockquote>
<p>
I have to admit that I&#8217;m astounded by the scope, scale, and sheer effectiveness of  YouTube&#8217;s new copyright detection system <i>that I thought was impossible!</i> Seriously, <a href="http://www.ted.com/talks/margaret_stewart_how_youtube_thinks_about_copyright.html">watch the TED talk</a>. It&#8217;s not long. The more I researched <a href="http://www.google.com/support/youtube/bin/answer.py?hl=en&amp;answer=83766">YouTube&#8217;s video identification tool</a>, the more I realized that <b>resistance is futile</b>. It&#8217;s <i>so</i> good that the only way to defeat it is by degrading your audio and video so much that you have effectively ruined it. And when it comes to copyright violations, if you can achieve mutually assured destruction, then you have won. Absolutely and unconditionally.</p>
<p>
This is an outcome so incredible I am still having trouble believing it. But I have the automatically blocked uploads to prove it.</p>
<p>
Now, <b>I am in no way proposing that copyright is something we should be trying to defeat or work around</b>. I suppose I was just used to the <a href="http://en.wikipedia.org/wiki/Laissez-faire">laissez faire</a> status quo on YouTube, and the idea of a video copyright detection system this effective was completely beyond the pale. My hat is off to the engineers at Google who came up with this system. They aren&#8217;t the bad guys here; they offer some rather sane alternatives when copyright matches are found:</p>
<blockquote><p>
If Content ID identifies a match between a user upload and material in the reference library, it applies the usage policy designated by the content owner. The usage policy tells the system what to do with the video. Matches can be to only the audio portion of an upload, the video portion only, or both.</p>
<p>
There are three usage policies &#8212; <b>Block, Track or Monetize</b>. If a rights owner specifies a <b>Block</b> policy, the video will not be viewable on YouTube. If the rights owner specifies a <b>Track</b> policy, the video will continue to be made available on YouTube and the rights owner will receive information about the video, such as how many views it receives. For a <b>Monetize</b> policy, the video will continue to be available on YouTube and ads will appear in conjunction with the video. The policies can be region-specific, so a content owner can allow a particular piece of material in one country and block the material in another.
</p></blockquote>
<p>
The particular content provider whose copyright I matched chose the draconian block policy. That&#8217;s certainly not Google&#8217;s fault, but I guess you could say <a href="http://www.codinghorror.com/blog/2007/07/googles-number-one-ui-mistake.html">I&#8217;m Feeling Unlucky</a>.</p>
<p>
Although the 90 second clip I uploaded is clearly copyrighted content &#8212; I would never dispute that &#8212; <b>my intent is not to facilitate illegal use, but to &#8220;quote&#8221; the movie scene as part of a larger blog entry.</b> YouTube does provide recourse for uploaders; they make it easy to file a dispute once the content is flagged as copyrighted. So I dutifully filled out the dispute form, indicating that I felt I had a reasonable claim of fair use.</p>
<p>
<img alt="Youtube-fair-use-dispute" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/57cf3_6a0120a85dcdae970b013487721471970c-800wi" style="border:1px solid silver" /></p>
<p>
Unfortunately, my fair use claim was denied without explanation by the copyright holder. </p>
<p>
Let&#8217;s consider the four guidelines for fair use I outlined in <a href="http://www.codinghorror.com/blog/2007/10/youtube-the-big-copyright-lie.html">my original 2007 blog entry</a>:</p>
<ol>
<li>Is the use transformative?
<li>Is the source material intended for the public good?
<li>How much was taken?
<li>What&#8217;s the market effect?
</ol>
<p>
While we&#8217;re clear on 3 and 4, items 1 and 2 are hazy in a mashup. This would definitely be transformative, and I like to think that I&#8217;m writing for the erudition of myself and others, not merely to entertain people. I uploaded with the <i>intent</i> of the video being viewed through a blog entry, with YouTube as the content host only. But it was still 90 seconds of the movie viewable on YouTube by anyone, context free. </p>
<p>
So I&#8217;m torn.</p>
<p>
On one hand, this is an <i>insanely</i> impressive technological coup. The idea that YouTube can (with the assistance of the copyright holders) really validate every minute of uploaded video against <b>every minute of every major copyrighted work</b> is unfathomable to me. When YouTube promised to do this to placate copyright owners, I was sure they were delaying for time. But much to my fair-use-loving dismay, they&#8217;ve actually gone and <i>built</i> the damn thing &#8212; and it works.</p>
<p>
Just, maybe, it works a little <i>too</i> well. I&#8217;m still looking for video sharing services that <a href="http://webapps.stackexchange.com/questions/6445/web-video-sharing-service-with-fair-use-protection">offer some kind of fair use protection</a>. </p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">JIRA Studio</a> &#8211; SVN hosting, issue tracking, CI and Google Apps integration. <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">Free trial »</a>
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/youtube-vs-fair-use/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Revisiting Solid State Hard Drives</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/revisiting-solid-state-hard-drives/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/revisiting-solid-state-hard-drives/#comments</comments>
		<pubDate>Wed, 06 Oct 2010 13:34:13 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[absolute crap]]></category>
		<category><![CDATA[generational leap]]></category>
		<category><![CDATA[intel cpu]]></category>
		<category><![CDATA[long memory]]></category>
		<category><![CDATA[raytracing]]></category>
		<category><![CDATA[solid state hard drive]]></category>
		<category><![CDATA[solid state hard drives]]></category>
		<category><![CDATA[video transcoding]]></category>
		<category><![CDATA[world time]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/revisiting-solid-state-hard-drives/</guid>
		<description><![CDATA[It&#8217;s been almost a year since I covered The State of Solid State Hard Drives. Not a heck of a lot has changed, but the topic is still worth revisiting, because if you care at all about how your computer performs, solid state hard drives remain a life changing experience. Here&#8217;s why: A solid state [...]]]></description>
			<content:encoded><![CDATA[<p>
It&#8217;s been almost a year since I covered <a href="http://www.codinghorror.com/blog/2009/10/the-state-of-solid-state-hard-drives.html">The State of Solid State Hard Drives</a>. Not a heck of a lot has changed, but the topic is still worth revisiting, because if you care at all about how your computer performs, <b>solid state hard drives remain a life changing experience</b>. Here&#8217;s why:</p>
<ol>
<li>A solid state hard drive is easily the best and most obvious performance upgrade you can make on any computer for a given amount of money. Unless your computer is absolute crap to start with.
<li>The practical minimum solid state hard drive size, <b>128 GB</b>, has modestly declined in price &#8212; from about $350 to about $250.
</ol>
<p>
(yes, you can get by with 64 GB, but at least with my Windows installs I find that I have to <i>think</i> about disk space with 64 GB, whereas with 128 GB I don&#8217;t have to worry &#8212; ever. <a href="http://www.codinghorror.com/blog/2005/08/dont-make-me-think-second-edition.html">Don&#8217;t make me think, man!</a>)</p>
<p>
The rest of the components inside your PC are downright boring in comparison. CPUs? All stupid fast at any price, with more cores and gigahertz than you&#8217;ll ever need unless you&#8217;re one of those freaks who does nothing but raytracing and video transcoding all day long. Memory? Dirt cheap, and average users won&#8217;t need more than 2 gigabytes of the stuff in practical use, which at the current going rate for DDR3 is less than 50 bucks.</p>
<p>
Thanks to the <a href="http://www.codinghorror.com/blog/2006/12/moores-law-in-practical-terms.html">neverending march of Moore&#8217;s Law</a>, PCs are becoming speedy at <i>any</i> price these days. It&#8217;s difficult for me to <a href="http://www.codinghorror.com/blog/2009/12/building-a-pc-part-vi-rebuilding.html">muster any enthusiasm for the latest Intel CPU updates</a> when I spend almost zero real world time waiting for the CPU to do anything on my computer. I guess it&#8217;s true: absolute power corrupts absolutely.</p>
<p>
<a href="http://www.despair.com/power.html"><img alt="Absolute-power-corrupts-absolutely" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/5a6f0_6a0120a85dcdae970b0134875d3aa8970c-800wi" border="0" /></a></p>
<p>
But hard drives, now, there&#8217;s where you can pay a bit more and see a groundbreaking, generational leap in performance <i>worthy</i> of that investment &#8212; as long as you skip over the old and busted spinning rust hard drives, and choose a newfangled <b>solid state hard drive</b>.</p>
<p>
The current king of the hill seems to be the <a href="http://www.anrdoezrs.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16820148348%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Solid%2BState%2BDisk-_-Crucial%2BTechnology-_-20148348&amp;cjsku=N82E16820148348">Crucial RealSSD C300</a>.</p>
<p>
<a href="http://www.anrdoezrs.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16820148348%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Solid%2BState%2BDisk-_-Crucial%2BTechnology-_-20148348&amp;cjsku=N82E16820148348"><img alt="RealSSD C300" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/a57d3_6a0120a85dcdae970b0134875d5de7970c-800wi" border="0" /></a></p>
<p>
Pretty sexy, right? Oh, who am I kidding, it&#8217;s a boring slab of aluminum and silicon. But like all truly sexy things, what turns me on is the part I <i>can&#8217;t</i> see &#8212; the <a href="http://www.techreport.com/articles.x/19162/9">sexy, sexy, <i>sexy</i> performance inside this baby</a>.</p>
<p>
<a href="http://www.techreport.com/articles.x/19162/9"><img alt="Tr-drivebench" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/d291d_6a0120a85dcdae970b0134875d8710970c-800wi" border="0" /></a></p>
<p>
See those bars dragging down the bottom of this graph? All spinning rust. Heck, even the SSD I recommended last year is only middle of the pack here. AnandTech <a href="http://www.anandtech.com/show/3812/the-ssd-diaries-crucials-realssd-c300/4">concurs</a> &#8212; the <a href="http://www.anrdoezrs.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16820148348%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Solid%2BState%2BDisk-_-Crucial%2BTechnology-_-20148348&amp;cjsku=N82E16820148348">Crucial RealSSD C300</a> is top dog, at least for now.</p>
<p>
(Be careful, though, that your operating system supports the <a href="http://en.wikipedia.org/wiki/TRIM">SSD TRIM command</a>, otherwise you&#8217;ll suffer severe performance degradation over time with almost any SSD. Operating systems earlier than Windows 7 and the latest, greatest Linux kernel should beware &#8212; and, shockingly, OSX still doesn&#8217;t support TRIM!)</p>
<p>
Where it gets trickier, though, is when you need more than 128 GB of storage, or when you are limited to one 2.5&#8243; hard drive &#8212; like in a laptop. In that case, ideally you&#8217;d like something that has the <i>speed</i> of a solid state hard drive, but the <i>capacity</i> (and economical price per gigabyte) of a traditional magnetic platter hard drive. You might say &hellip; <b>a hybrid hard drive</b>, <a href="http://www.codinghorror.com/blog/2006/09/vista-and-the-rise-of-the-flash-drives.html">the kind I was dreaming about back in 2006</a> &hellip;</p>
<blockquote><p>
After all this analysis, it&#8217;s clear to me that traditional hard drives and flash memory are quite complimentary; they&#8217;re strong in different areas. But flash drives are the future. They will definitely replace hard drives in almost all low end and low power devices&#8211; and future high performance hard drives will need to have a substantial chunk of flash memory on board to stay competitive.
</p></blockquote>
<p>
I had always been disappointed that hybrid hard drives, drives that combine both flash memory <i>and</i> traditional magnetic platters, never came to fruition. It was either traditional or SSD and nothing in between. It seemed like such an obvious &#8220;best of both worlds&#8221; scenario to me. But I recently discovered that <b>decent hybrid drives do finally exist</b> &#8212; though in a small and mostly unheralded way. </p>
<p>
<a href="http://www.dpbolvw.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16822148591%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Hard%2BDrives%2B-%2BNotebooks%2B%2F%2BLaptops-_-Seagate-_-22148591&amp;cjsku=N82E16822148591">Seagate&#8217;s Momentus XT</a> takes a totally respectable 2.5&#8243;, 7200 RPM drive with a 32 megabyte buffer and <b>combines it with 4 gigabytes of flash memory</b>. The result is the <a href="http://www.anandtech.com/show/3734/seagates-momentus-xt-review-finally-a-good-hybrid-hdd">exactly what I had always hoped</a>:</p>
<blockquote><p>
Seagate&#8217;s Momentus XT should become the standard hard drive in any notebook shipped. The biggest problem I have with using any brand new machine, regardless of how fast it is, is that it never feels fast because it usually has a HDD and not an SSD. While the Momentus XT isn&#8217;t quite as fast as an SSD, it&#8217;s a significant improvement over the mechanical drives found in notebooks today.</p>
<p>
In many cases the Momentus XT performs like a VelociRaptor, but in a lower power, quieter package. The impact of adding just a small amount of SLC NAND is tremendous. The potential for hybrid drives continues to be huge; what Seagate has shown here is that with a minimal amount of NAND you can achieve some tremendous performance gains.
</p></blockquote>
<p>
And the best part? <a href="http://www.dpbolvw.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16822148591%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Hard%2BDrives%2B-%2BNotebooks%2B%2F%2BLaptops-_-Seagate-_-22148591&amp;cjsku=N82E16822148591">500 gigabytes of near-SSD performance for $130!</a> Or, if that&#8217;s too spendy, how about <a href="http://www.kqzyfj.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16822148592%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Hard%2BDrives%2B-%2BNotebooks%2B%2F%2BLaptops-_-Seagate-_-22148592&amp;cjsku=N82E16822148592">320 gigabytes of near-SSD performance for $99</a>?</p>
<p>
I&#8217;ve ordered a few of these drives to upgrade my laptops and <a href="http://www.codinghorror.com/blog/2008/04/building-your-own-home-theater-pc.html">home theater PC</a>. Sure, I&#8217;ll invest in a SSD for my beastly desktop, but I can&#8217;t justify $300 to put a SSD in a laptop I spent all of $800 on, or a home theater PC that set me back a mere $500. But <b>a hundred bucks for near-SSD performance <i>and</i> decent capacity</b>? Sign me up. And hard drive vendors: although I love SSDs to death, please keep these improved hybrid drives coming, too, please!</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">JIRA Studio</a> &#8211; SVN hosting, issue tracking, CI and Google Apps integration. <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">Free trial »</a>
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/revisiting-solid-state-hard-drives/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Go That Way, Really Fast</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/go-that-way-really-fast/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/go-that-way-really-fast/#comments</comments>
		<pubDate>Wed, 06 Oct 2010 13:33:09 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[area 51]]></category>
		<category><![CDATA[better off dead]]></category>
		<category><![CDATA[business advice]]></category>
		<category><![CDATA[curtis armstrong]]></category>
		<category><![CDATA[exchange data]]></category>
		<category><![CDATA[exchange network]]></category>
		<category><![CDATA[real time chat]]></category>
		<category><![CDATA[stack overflow]]></category>
		<category><![CDATA[teen comedy]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/go-that-way-really-fast/</guid>
		<description><![CDATA[When it comes to running Stack Overflow, the company, I take all my business advice from one person, and one person alone: Curtis Armstrong. More specifically, Curtis Armstrong as Charles De Mar from the 1985 absurdist teen comedy classic, Better Off Dead. When asked for advice on how to ski down a particularly treacherous mountain, [...]]]></description>
			<content:encoded><![CDATA[<p>
When it comes to running Stack Overflow, <a href="http://stackoverflow.com/about/management">the company</a>, I take all my business advice from one person, and one person alone: <b>Curtis Armstrong</b>.</p>
<p>
<a href="http://www.imdb.com/name/nm0035664/"><img alt="Curtis Armstrong" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/24346_6a0120a85dcdae970b01348740aa43970c-800wi" border="0" /></a></p>
<p>
More specifically, Curtis Armstrong as <b>Charles De Mar</b> from the 1985 absurdist teen comedy classic, <a href="http://www.imdb.com/title/tt0088794/">Better Off Dead</a>. When asked for advice on how to ski down a particularly treacherous mountain, he replied:</p>
<p>
<a href="http://www.youtube.com/watch?v=lEHZJNQ5Y4A"><img alt="Go that way, really fast. If something gets in your way... turn." src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/47d15_6a0120a85dcdae970b0133f4205ea0970b-800wi" /></a></p>
<p>
<b>Go that way, <i>really</i> fast. If something gets in your way &hellip; turn.</b></p>
<p>
(I recommend watching <a href="http://www.youtube.com/watch?v=lEHZJNQ5Y4A">the video clip</a>, or, better yet, <a href="http://www.amazon.com/dp/B00005JKFA/?tag=codinghorror-20">the entire movie</a>. It&#8217;s brilliant in ways I can&#8217;t possibly explain here.)</p>
<p>
In the five months since we <a href="http://blog.stackoverflow.com/2010/05/announcing-our-series-a/">announced our funding</a>, we have &hellip;</p>
<ul>
<li>Built an <a href="http://www.codinghorror.com/blog/2010/05/on-working-remotely.html">international team</a>
<li>Created an entirely new open, democratic process for creating Q&amp;A sites at <a href="http://area51.stackexchange.com/faq">Area 51</a>
<li>Launched ~24 new community-driven <a href="http://stackexchange.com/sites">Stack Exchange network sites</a>
<li>Implemented <a href="http://blog.stackoverflow.com/2010/07/new-per-site-metas/">per-site meta discussion</a> and <a href="http://blog.stackoverflow.com/2010/08/chat-now-in-public-beta/">per-site real time chat</a>
<li>Rolled out new versions of <a href="http://careers.stackoverflow.com/">Careers</a> and <a href="http://careers.stackoverflow.com/Jobs">Jobs</a>
<li>Built and open-sourced a tool for exploring and sharing all our creative commons data in the <a href="http://odata.stackexchange.com/">Stack Exchange Data Explorer</a>
<li>Finalized V1 of the <a href="http://stackapps.com/">Stack Exchange API</a>, for building your own apps against our Q&amp;A platform
</ul>
<p>
&hellip; and honestly, I&#8217;m a little worried we&#8217;re <i>still not going fast enough</i>.</p>
<p>
There are any number of Stack Overflow engine clones out there already, and I say more power to &#8216;em. I&#8217;m proud to have something worth copying. If we do nothing else except help lead the world away from the ancient, creaky, horribly broken bulletin board model of phpBB and vBulletin &#8212; attempting to get information out of those things is like <b>panning for gold in a neverending river of sewage</b> &#8212; then that is more than I could have ever hoped for. </p>
<p>
It is our stated goal as a company to live in harmony with the web, by only doing things that we believe make the internet better, at least in some small way. No, seriously. It&#8217;s in writing and everything, I swear! We&#8217;re not here to subvert or own anyone or anything. We just love community, and we love getting great answers to our questions. So if something gets in our way while doing that, well, we&#8217;re not gonna fight you. <b>We&#8217;ll just turn</b>. And keep going forward, really fast. Which is why those clones better move quick if they want to keep up with us. </p>
<p>
While I like to think that having Charles De Mar as a business advisor is unique to our company, the idea that speed is important is hardly original to us. For example, certain Google projects also appear to understand <a href="http://www.codinghorror.com/blog/2007/02/boyds-law-of-iteration.html">Boyd&#8217;s Law of Iteration</a>.</p>
<blockquote><p>
Boyd decided that the primary determinant to winning dogfights was not observing, orienting, planning, or acting better. The primary determinant to winning dogfights was observing, orienting, planning, and acting <i>faster</i>. In other words, how quickly one could iterate. <i>Speed of iteration</i>, Boyd suggested, beats <i>quality of iteration</i>.
</p></blockquote>
<p>
Speed of iteration &#8212; the <a href="http://en.wikipedia.org/wiki/Google_Chrome">Google Chrome</a> project has it.</p>
<table cellpadding="4">
<tr>
<td>1.0</td>
<td>December 11, 2008</td>
</tr>
<tr>
<td>2.0</td>
<td>May 24, 2009</td>
</tr>
<tr>
<td>3.0</td>
<td>October 12, 2009</td>
</tr>
<tr>
<td>4.0</td>
<td>January 25, 2010</td>
</tr>
<tr>
<td>5.0</td>
<td>May 25, 2010</td>
</tr>
<tr>
<td>6.0</td>
<td>September 2, 2010</td>
</tr>
</table>
<p>
Chrome was a completely respectable browser in V1 and V2. The entire project has moved forward so fast that it now is, at least in my humble opinion, the best browser on the planet. Google went from nothing, no web browser at all, to best-of-breed in <b>under two years</b>. Meanwhile, Internet Explorer took longer than the entire development period of Chrome to go from version 7 to version 8. And by the time Internet Explorer 9 ships &#8212; even though it&#8217;s actually looking like Microsoft&#8217;s best, most competent technical upgrade of the browser yet &#8212; it will be completely outclassed at launch by both Firefox and Chrome.</p>
<p>
The <a href="http://en.wikipedia.org/wiki/Android_(operating_system)">Google Android</a> project is another example. Android doesn&#8217;t have to be better than the iPhone (and it most <i>definitely</i> isn&#8217;t; it&#8217;s been mediocre at best until recent versions). They just need to be <i>faster at improving</i>. Google is pushing out <a href="http://en.wikipedia.org/wiki/Android_(operating_system)#Update_history">Froyos and Gingerbreads and Honeycombs</a> with incredible, breakneck speed. Yes, Apple has indisputably better taste &#8212; and an impeccably controlled experience. But at their current rate of progress, they&#8217;ll be playing second or third fiddle to Google in the mobile space inside a few years. It&#8217;s inevitable.</p>
<p>
So, until further notice, we&#8217;ll be following the same strategy as the Android and Chrome teams. <b>We&#8217;re going to go that way, <i>really</i> fast. And if something gets in our way, we&#8217;ll turn.</b></p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">JIRA Studio</a> &#8211; SVN hosting, issue tracking, CI and Google Apps integration. <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">Free trial »</a>
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/go-that-way-really-fast/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vampires (Programmers) versus Werewolves (Sysadmins)</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/vampires-programmers-versus-werewolves-sysadmins/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/vampires-programmers-versus-werewolves-sysadmins/#comments</comments>
		<pubDate>Wed, 06 Oct 2010 13:31:41 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[audacity]]></category>
		<category><![CDATA[company stack]]></category>
		<category><![CDATA[hellip]]></category>
		<category><![CDATA[kyle brandt]]></category>
		<category><![CDATA[occasional success]]></category>
		<category><![CDATA[overflow internet services]]></category>
		<category><![CDATA[production environment]]></category>
		<category><![CDATA[stack overflow]]></category>
		<category><![CDATA[web development companies]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/vampires-programmers-versus-werewolves-sysadmins/</guid>
		<description><![CDATA[Kyle Brandt, a system administrator, asks Should Developers have Access to Production? A question that comes up again and again in web development companies is: &#8220;Should the developers have access to the production environment, and if they do, to what extent?&#8221; My view on this is that as a whole they should have limited access [...]]]></description>
			<content:encoded><![CDATA[<p>
Kyle Brandt, a system administrator, asks <a href="http://blog.serverfault.com/post/893001713/should-developers-have-access-to-production">Should Developers have Access to Production?</a></p>
<blockquote><p>
A question that comes up <a href="http://serverfault.com/questions/62885/sysadmin-developer-responsibilities">again</a> and <a href="http://serverfault.com/questions/7907/access-to-the-production-systems-for-non-sys-admins">again</a> in web development companies is:</p>
<p>
<i>&#8220;Should the developers have access to the production environment, and if they do, to what extent?&#8221;</i></p>
<p>
My view on this is that as a whole they should have limited access to production. A little<br />
disclaimer before I attempt to justify this view is that this standpoint is in no way based on the perceived quality or attitude of the developers &#8212; so please don&#8217;t take it this way.
</p></blockquote>
<p>
This is a tricky one for me to answer, because, well, I&#8217;m a developer. More specifically, <b>I&#8217;m one of the developers Kyle is referring to</b>. How do I know that? Because Kyle works for our company, Stack Overflow Internet Services Incorporated&copy;&reg;&trade;. And Kyle is a great system administrator. How do I know that? Two reasons:</p>
<ol>
<li>He&#8217;s one of the top <a href="http://serverfault.com">Server Fault</a> users.
<li>He had the audacity to write about this issue on the Server Fault blog.
</ol>
<p>
From my perspective, <i>the whole point of the company</i> is to talk about what we&#8217;re doing. <a href="http://www.codinghorror.com/blog/2007/07/yes-but-what-have-you-done.html">Getting things done is important</a>, of course, but we have to stop occasionally to write up what we&#8217;re doing, how we&#8217;re doing it, and why we&#8217;re even doing it in the first place &#8212; including all our doubts and misgivings and concerns. If we don&#8217;t, we&#8217;re cheating ourselves, and you guys, out of something much deeper. Yes, writing about what we&#8217;re doing and explaining it to the community helps us focus. It lets our peers give us feedback. But most importantly of all, it lets <i>anyone</i> have the opportunity to learn from our many, many mistakes &hellip; and who knows, perhaps even the occasional success. </p>
<p>
That&#8217;s basically the entire philosophy behind our <a href="http://stackexchange.com/">Stack Exchange Q&amp;A network</a>, too. Let&#8217;s <i>all</i> talk about this stuff in public, so that <b>we can teach each other how to get better at whatever the heck it is we love to do</b>.</p>
<p>
(Sometimes I get the feeling this idea makes <a href="http://www.joelonsoftware.com/AboutMe.html">my co-founder</a> nervous, which I continually struggle to understand. If we don&#8217;t walk the walk, why are we even doing this? But I digress.)</p>
<p>
The saga of System Administrators versus Programmers is not a new one; I don&#8217;t think I&#8217;ve ever worked at any company where these two factions weren&#8217;t continually battling with each other in some form. It&#8217;s truly an epic struggle, but to understand it, you have to appreciate that <b>both System Administrators and Programmers have different, and perhaps complementary, supernatural powers</b>.</p>
<p>
Programmers are like <b>vampires</b>. They&#8217;re frequently up all night, paler than death itself, and generally <a href="http://www.codinghorror.com/blog/2007/10/geek-diet-and-exercise-programs.html">afraid of being exposed to daylight</a>. Oh yes, and they tend think of themselves (or at least their code) as immortal.</p>
<p>
<img alt="Bela-lugosi-dracula" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/fec9a_6a0120a85dcdae970b0133f35bd97b970b-800wi" border="0" /></p>
<p>
System Administrators are like <b>werewolves</b>. They may look outwardly ordinary, but are incredibly strong, mostly invulnerable to stuff that would kill regular people &#8212; and prone to strange transformations during a moon &#8220;outage&#8221;.</p>
<p>
<img alt="Wolfman" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/69f89_6a0120a85dcdae970b0133f35bd9a1970b-800wi" border="0" /></p>
<p>
Let me be very clear that just as Kyle respects programmers, I have <a href="http://www.codinghorror.com/blog/2009/05/server-fault-calling-all-lusers.html">a deep respect for system administrators</a>:</p>
<blockquote><p>
Although there is certainly some crossover, we believe that the programming community and the IT/sysadmin community are different beasts. Just because you&#8217;re a hotshot programmer doesn&#8217;t mean you have mastered networking and server configuration. And I&#8217;ve met a few sysadmins who could script circles around my code. That&#8217;s why Server Fault gets its own domain, user profiles, and reputation system.
</p></blockquote>
<p>
Different &#8220;beasts&#8221; indeed.</p>
<p>
Anyway, if you&#8217;re looking for a one size fits all answer to the question of how much access programmers should have to production environments, I&#8217;m sorry, I can&#8217;t give you one. Every company is different, every team is different. I know, it&#8217;s a sucky answer, but <i>it depends</i>. </p>
<p>
However, as anyone who has watched the latest season of <a href="http://en.wikipedia.org/wiki/True_Blood">True Blood</a> (or, God help us all, the <a href="http://www.imdb.com/title/tt1325004/">Twilight Eclipse</a> movie) can attest, there <i>are</i> ways for vampires and werewolves to work together. In a healthy team, everyone feels their abilities are being used and not squandered. </p>
<p>
On our team, we&#8217;re all fair-to-middling sysadmins. But there are a million things to do, and having a professional sysadmin means we can focus on the programming while the networking, hardware, and operational stuff gets a whole lot more TLC and far better (read: non-hacky) processes put in place. We&#8217;re happy to refocus our efforts on what we&#8217;re expert at, and let Kyle put his skills to work in areas that he&#8217;s expert at. Now, that said, we don&#8217;t want to cede full access to the production servers &#8212; but there&#8217;s a happy middle ground where our access becomes infrequent and minor over time, except in the hopefully rare event of an all hands on deck emergency.</p>
<p>
The art of managing vampires and werewolves, I think, is to ensure that they spend their time not fighting amongst themselves, but instead, <b>using those supernatural powers together to achieve a common goal they could not otherwise</b>. In my experience, when programmers and system administrators fight, it&#8217;s because they&#8217;re bored. You haven&#8217;t given them a sufficiently daunting task, one that requires the full combined use of their unique skills to achieve.</p>
<p>
Remember, it&#8217;s not vampires versus werewolves. It&#8217;s vampires <i>and</i> werewolves.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">JIRA Studio</a> &#8211; SVN hosting, issue tracking, CI and Google Apps integration. <a href="http://www.atlassian.com/hosted/studio?utm_source=coding_horror&amp;utm_medium=text&amp;utm_term=Jira_Studio&amp;utm_content=%20%20SVN%20hosting%2C%20issue%20tracking%2C%20CI%20and%20Google%20Apps%20integration&amp;utm_campaign=Display%2BAdvertising%2B-%2BInedo%2BMedia" rel="nofollow">Free trial »</a>
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/vampires-programmers-versus-werewolves-sysadmins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What&#8217;s On Your Utility Belt?</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/whats-on-your-utility-belt/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/whats-on-your-utility-belt/#comments</comments>
		<pubDate>Wed, 06 Oct 2010 13:30:15 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[emergency need]]></category>
		<category><![CDATA[flash drive]]></category>
		<category><![CDATA[flashdrive]]></category>
		<category><![CDATA[led flashlight]]></category>
		<category><![CDATA[mothership]]></category>
		<category><![CDATA[personal utility]]></category>
		<category><![CDATA[pliers]]></category>
		<category><![CDATA[pocket patriot]]></category>
		<category><![CDATA[pulp fiction]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/whats-on-your-utility-belt/</guid>
		<description><![CDATA[Like any self-respecting geek, I&#8217;m mostly an indoor enthusiast. But on those unfortunate occasions when I am compelled &#8212; for reasons entirely beyond my control &#8212; to leave the house, I do so fully armed with my crucial utility belt items. Yes, you heard me, I transform from the geeky Bruce Wayne to the gosh-darned [...]]]></description>
			<content:encoded><![CDATA[<p>
Like any self-respecting geek, I&#8217;m mostly an <a href="http://www.codinghorror.com/blog/2007/10/geek-diet-and-exercise-programs.html">indoor enthusiast</a>.</p>
<p>
But on those unfortunate occasions when I am compelled &#8212; for reasons entirely beyond my control &#8212; to leave the house, I do so fully armed with my crucial <b>utility belt items</b>. Yes, you heard me, I transform from the geeky Bruce Wayne <i>to the gosh-darned Batman!</i></p>
<p>
<img alt="Batman-utility-belt" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/14c8b_6a0120a85dcdae970b0134862e1dcf970c-800wi" border="0" /></p>
<p>
At least, that&#8217;s how I like to think of it.</p>
<p>
I&#8217;ve been talking about this <a href="http://www.codinghorror.com/blog/2008/01/whats-on-your-keychain-2008-edition.html">every-day carry stuff</a> for <a href="http://www.codinghorror.com/blog/2006/06/whats-on-your-keychain-in-2006.html">quite</a> a <a href="http://www.codinghorror.com/blog/2005/03/whats-on-your-keychain.html">while</a> now. The 2010 edition of <b>my personal utility belt</b> is mostly subtle tweaks, but I daresay it&#8217;s the best one yet.</p>
<p>
<img alt="Atwood-keychain-2010" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/db846_6a0120a85dcdae970b0134862e1b74970c-800wi" border="0" /></p>
<p>
The art of <a href="http://en.wikipedia.org/wiki/Every_day_carry">every-day carry</a> must go on. What you see here is the contents of my pocket:</p>
<ol>
<li><b><a href="http://www.amazon.com/exec/obidos/ASIN/B001IWOQXQ/codinghorror-20">Patriot 32 GB USB flash drive</a></b>
<p>Now you can have a whole freakin&#8217; hard drive worth of files in your pocket. Just in case, you know, you have an emergency need to <a href="http://en.wikipedia.org/wiki/Independence_Day_(film)">upload a virus to an alien mothership</a>, or something. Beware the many cheap, slow USB flash drives out there; this one is a real gem. It&#8217;s inexpensive, and per my measurements, about as fast as they get. This is important because the larger the flash drive, <a href="http://www.codinghorror.com/blog/2008/06/large-usb-flash-drive-performance.html">the more important speed becomes</a>. Hard to believe I&#8217;ve gone from carrying a 512 megabyte flash drive in 2005 to a 32 <i>gigabyte</i> flashdrive in 2010.</p>
<li><b><a href="http://www.amazon.com/exec/obidos/ASIN/B0007UQ1CO/codinghorror-20">Leatherman Squirt P4</a></b>
<p>Ounce for ounce, nothing beats the utility of the Leatherman Squirt. This time I opted for the plier (P) version instead of the scissors (S), and after seeing how much more generally useful the pliers are, I am now a little ashamed to admit I ever carried the wussy scissors version. Pliers all the way, baby. And yes, that is a <a href="http://www.imdb.com/title/tt0110912/">Pulp Fiction</a> joke you see on it.  </p>
<li><b><a href="http://www.amazon.com/exec/obidos/ASIN/B002YKL2ZQ/codinghorror-20">Fenix mini AAA LED flashlight model LD01R2</a></b>
<p>Since I&#8217;ve been carrying them in 2005, the average LED flashlight has gone from bright, to very bright, to amazingly bright, to <i>ridiculously blinding laser-like bright</i>. It&#8217;s scary how bright these fancy milled aluminum AAA LED flashlights get now. What I like about this one is that it lets you trade off stupid-brightness for something practical, like greater runtime: you can twist the top to switch levels: 9 Lumens for 11 hours, 28 Lumens for 3.5 hours, or 85 Lumens for 1 hour.</p>
<li><b><a href="http://www.amazon.com/exec/obidos/ASIN/B002MD01KC/codinghorror-20">Small Nite Ize s-biner</a></b>
<p>These little nite-ize carabiners are awesome for quick attachment and detachment of your EDC items, but I&#8217;ll warn you: resist the urge to put everything you carry on a carabiner, because if you do, the weight and &#8220;jangliness&#8221; goes up a lot &#8212; and <a href="http://www.amazon.com/exec/obidos/ASIN/B0037GZZCC/codinghorror-20">this way lies madness</a>. Consider how many items you actually <i>remove</i> from your keychain regularly. For me, the only item I frequently removed to work with was the Squirt, so that&#8217;s the only one I put on a carabiner.
</ol>
<p>
Rest assured, everything here is carefully selected with the appropriate levels of monomaniacal attention to detail. For this weight and size, I don&#8217;t think you can do better. (And don&#8217;t think I&#8217;ve forgotten about <a href="http://www.codinghorror.com/blog/2009/04/optimizing-your-wallet.html">optimizing my wallet</a>, either. Oh no. Quite the contrary.)</p>
<p>
However, I have to add a special category this year for the other must-have EDC utility belt item: the smartphone. <b>What self-respecting superhero would leave the house these days without their smartphone?</b> I&#8217;m not religious about it, but <a href="http://www.codinghorror.com/blog/2009/06/the-iphone-software-revolution.html">I use and rather like the iPhone 4</a>, and I&#8217;m continually amazed how many things it does that I used to carry separate items for:</p>
<ul>
<li>cell phone (obviously)
<li>&#8220;Nintendo DSwhatever&#8221; for portable gaming
<li>GPS
<li>point and shoot digital camera
<li>near-desktop quality mobile web browser and email client
<li>mp3 player with speakers
<li>audio and hi-def video recorder
<li>DVD player
<li>ebook reader
<li>watch, alarm
<li>emergency flashlight (via front facing LED flash control)
<li>scanner
<li>level and ruler
</ul>
<p>
Smartphones really are <a href="http://gadgets.stackexchange.com/">the ultimate gadget</a>. The list of functions is already enormous, and I&#8217;m sure I&#8217;m leaving out a few other things that you can do with a modern smartphone.</p>
<p>
In a pinch, I <i>could</i> conceivably drop the AAA LED flashlight and the USB flash drive from my EDC kit and substitute the smartphone. Not exactly, mind you, but it&#8217;s getting closer every year. At this rate, Apple could introduce a flip-out blade on the iPhone 7 and reduce my entire EDC kit to one item.</p>
<p>
Anyway, that&#8217;s what&#8217;s on my utility belt in 2010. What&#8217;s on yours?</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/hosted/studio/?utm_source=Coding%2BHorror&amp;utm_medium=Text%2BAd&amp;utm_content=A&amp;utm_campaign=Studio%2B2.1" rel="nofollow">JIRA Studio</a> &#8211; Hosted software development suite. Build better software. Faster. <a href="http://www.atlassian.com/hosted/studio/?utm_source=Coding%2BHorror&amp;utm_medium=Text%2BAd&amp;utm_content=A&amp;utm_campaign=Studio%2B2.1" rel="nofollow">Free trial »</a>
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/whats-on-your-utility-belt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Groundhog Day, or, the Problem with A/B Testing</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/groundhog-day-or-the-problem-with-ab-testing/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/groundhog-day-or-the-problem-with-ab-testing/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 11:30:15 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[airplane flight]]></category>
		<category><![CDATA[back of the envelope]]></category>
		<category><![CDATA[classic film]]></category>
		<category><![CDATA[director harold ramis]]></category>
		<category><![CDATA[envelope calculation]]></category>
		<category><![CDATA[groundhog day]]></category>
		<category><![CDATA[harold ramis]]></category>
		<category><![CDATA[life comedy]]></category>
		<category><![CDATA[scary stuff]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/groundhog-day-or-the-problem-with-ab-testing/</guid>
		<description><![CDATA[On a recent airplane flight, I happened to catch the movie Groundhog Day. Again. If you aren&#8217;t familiar with this classic film, the premise is simple: Bill Murray, somehow, gets stuck reliving the same day over and over. It&#8217;s been at least 5 years since I&#8217;ve seen Groundhog Day. I don&#8217;t know if it&#8217;s my [...]]]></description>
			<content:encoded><![CDATA[<p>
On a recent airplane flight, I happened to catch the movie <a href="http://www.imdb.com/title/tt0107048/">Groundhog Day</a>. Again.</p>
<p>
<img class="asset  asset-image at-xid-6a0120a85dcdae970b0133f269b445970b" alt="Groundhog-day-movie-bill-murray" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/1939e_6a0120a85dcdae970b0133f269b445970b-800wi" /></p>
<p>
If you aren&#8217;t familiar with this classic film, the premise is simple: Bill Murray, somehow, gets stuck reliving the same day over and over.</p>
<p>
It&#8217;s been at least 5 years since I&#8217;ve seen Groundhog Day. I don&#8217;t know if it&#8217;s my advanced age, or what, but it really struck me on this particular viewing: this is no comedy. There&#8217;s a veneer of broad comedy, yes, but <b>lurking just under that veneer is a deep, dark existential conundrum.</b></p>
<p>
It might be amusing to relive the same day a few times, maybe even a few dozen times. But an entire year of the same day &#8212; an entire <i>decade</i> of the same day &#8212; everything happening in precisely, exactly the same way? My back of the envelope calculation easily ran to a decade. But I was wrong. The director, Harold Ramis <a href="http://www.wolfgnards.com/index.php/2009/08/18/harold-ramis-responds-to-the-wolf-gnards">thinks it was actually 30 or 40 years</a>.</p>
<blockquote><p>
I think the 10-year estimate is too short. It takes at least 10 years to get good at anything, and alloting for the down time and misguided years [Phil] spent, it had to be more like 30 or 40 years [spent reliving the same day].
</p></blockquote>
<p>
We only see bits and pieces of the full experience in the movie, but this time my mind began filling in the gaps. Repeating the same day for <i>decades</i> plays to our secret collective fear that our lives are irrelevant and ultimately pointless. None of our actions &#8212; even suicide, in endless grisly permutations &#8212; ever change anything. What&#8217;s the point? Why bother? How many of us are trapped in here, and how can we escape?</p>
<p>
This is some dark, scary stuff when you really think about it.</p>
<blockquote><p>
You want a prediction about the weather, you&#8217;re asking the wrong Phil.  </p>
<p>
I&#8217;ll give you a winter prediction.<br />
It&#8217;s gonna be cold,<br />
it&#8217;s gonna be gray,<br />
and it&#8217;s gonna last you for the rest of your life.
</p></blockquote>
<p>
Comedy, my ass. I wanted to cry.</p>
<p>
But there is a way out: redemption through repetition. If you have to watch Groundhog Day a few times to appreciate it, you&#8217;re not alone. Indeed, that seems to be the whole point. Just <a href="http://rogerebert.suntimes.com/apps/pbcs.dll/article?AID=/20050130/REVIEWS08/501300301/1023">ask Roger Ebert</a>:</p>
<blockquote><p>
&#8220;Groundhog Day&#8221; is a film that finds its note and purpose so precisely that its genius may not be immediately noticeable. It unfolds so inevitably, is so entertaining, so apparently effortless, that you have to stand back and slap yourself before you see how good it really is.</p>
<p>
Certainly I underrated it in my original review; I enjoyed it so easily that I was seduced into cheerful moderation. But there are a few films, and this is one of them, that burrow into our memories and become reference points. When you find yourself needing the phrase This is like &#8220;Groundhog Day&#8221; to explain how you feel, a movie has accomplished something.
</p></blockquote>
<p>
There&#8217;s something delightfully <a href="http://en.wikipedia.org/wiki/Ouroboros">Ouroboros</a> about the epiphanies and layered revelations in repeated viewings of a movie <i>that is itself about (nearly) endless repetition</i>.</p>
<p>
Which, naturally, <b>brings me to <a href="http://en.wikipedia.org/wiki/A/B_testing">A/B testing.</a></b> That&#8217;s what Phil spends most of those thirty years doing. He spends it pursuing a woman, technically, but it&#8217;s <i>how</i> he does it that is interesting:</p>
<blockquote><p>
Rita: This whole day has just been one long setup.</p>
<p>
Phil: It hasn&#8217;t.</p>
<p>
Rita: And I hate fudge!</p>
<p>
Phil: [making a mental list] No white chocolate. No fudge.</p>
<p>
Rita: What are you doing? Are you making some kind of list? Did you call my friends and ask what I like and what I don&#8217;t like? Is this what love is for you?</p>
<p>
Phil: This is real. This is love.</p>
<p>
Rita: Stop saying that! You must be crazy.
</p></blockquote>
<p>
Phil doesn&#8217;t just go on one date with Rita, he goes on <i>thousands</i> of dates. During each date, he makes note of what she likes and responds to, and drops everything she doesn&#8217;t. At the end he arrives at &#8212; quite literally &#8212; the perfect date. Everything that happens is the most ideal, most desirable version of all possible outcomes on that date on that particular day. Such are the luxuries afforded to a man repeating the same day forever.</p>
<p>
<img class="asset  asset-image at-xid-6a0120a85dcdae970b0134858f4563970c image-full" alt="Groundhog-day-phil-rita" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/9eb6d_6a0120a85dcdae970b0134858f4563970c-800wi" border="0" /></p>
<p>
<b>This is the purest form of A/B testing imaginable.</b> Given two choices, pick the one that &#8220;wins&#8221;, and keep repeating this ad infinitum until you arrive at the ultimate, most scientifically desirable choice. Your <a href="http://www.codinghorror.com/blog/2009/09/9-ways-marketing-weasels-will-try-to-manipulate-you.html">marketing weasels</a> would probably collapse in an ecstatic, religious fervor if they could achieve anything even remotely close to the level of perfect A/B testing depicted in Groundhog Day.</p>
<p>
But at the end of this perfect date, something impossible happens: <b>Rita rejects Phil</b>.</p>
<p>
Phil wasn&#8217;t making these choices because he honestly believed in them. He was making these choices because he wanted a specific outcome &#8212; winning over Rita &#8212; and the experimental data told him which path he should take. Although the date was technically perfect, it didn&#8217;t ring true to Rita, and that made all the difference.</p>
<p>
That&#8217;s the problem with A/B testing. It&#8217;s empty. It has no feeling, no empathy, and at worst, <a href="http://learningischange.com/2010/01/22/question-22-of-365-farmville-practices-ghetto-testing-why-arent-we/">it&#8217;s dishonest</a>. As my friend Nathan Bowers <a href="http://twitter.com/NathanBowers/status/16801715177">said</a>:</p>
<blockquote><p>
A/B testing is like sandpaper. You can use it to smooth out details, but you can&#8217;t actually create anything with it.
</p></blockquote>
<p>
The next time you reach for A/B testing tools, remember what happened to Phil. You can achieve a shallow local maximum with A/B testing &#8212; but you&#8217;ll never win hearts and minds. If you, or anyone on your team, is still having trouble figuring that out, well, the solution is simple.</p>
<p>
<b>Just watch Groundhog Day again</b>.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/hosted/studio/?utm_source=Coding%2BHorror&amp;utm_medium=Text%2BAd&amp;utm_content=A&amp;utm_campaign=Studio%2B2.1" rel="nofollow">JIRA Studio</a> &#8211; Hosted software development suite. Build better software. Faster. <a href="http://www.atlassian.com/hosted/studio/?utm_source=Coding%2BHorror&amp;utm_medium=Text%2BAd&amp;utm_content=A&amp;utm_campaign=Studio%2B2.1" rel="nofollow">Free trial »</a>
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/groundhog-day-or-the-problem-with-ab-testing/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Whatever Happened to Voice Recognition?</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/whatever-happened-to-voice-recognition/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/whatever-happened-to-voice-recognition/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 12:19:37 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/whatever-happened-to-voice-recognition/</guid>
		<description><![CDATA[Remember that Scene in Star Trek IV where Scotty tried to use a Mac Plus? Using a mouse or keyboard to control a computer? Don&#8217;t be silly. In the future, clearly there&#8217;s only one way computers will be controlled: by speaking to them. There&#8217;s only one teeny-tiny problem with this magical future world of computers [...]]]></description>
			<content:encoded><![CDATA[<p>
Remember that Scene in <a href="http://www.imdb.com/title/tt0092007/">Star Trek IV</a> where Scotty tried to use a Mac Plus?</p>
<p>
<a href="http://www.youtube.com/watch?v=19BWJQ8kjrw"><img class="asset  asset-image at-xid-6a0120a85dcdae970b013484aecc1a970c" alt="Star-trek-4-apple-mac-plus" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/9dc35_6a0120a85dcdae970b013484aecc1a970c-800wi" border="0" /></a></p>
<p>
Using a mouse or keyboard to control a computer? Don&#8217;t be silly. In the future, clearly there&#8217;s only one way computers will be controlled: by <b>speaking to them</b>.</p>
<p>
There&#8217;s only <a href="http://robertfortner.posterous.com/the-unrecognized-death-of-speech-recognition">one teeny-tiny problem</a> with this magical future world of computers we control with our voices.</p>
<p>
<img class="asset  asset-image at-xid-6a0120a85dcdae970b0133f186ffd9970b image-full" alt="Voice-recognition-accuracy-rate-over-time" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/e9c8b_6a0120a85dcdae970b0133f186ffd9970b-800wi" border="0" /></p>
<p>
It doesn&#8217;t work.</p>
<p>
Despite ridiculous, <a href="http://www.codinghorror.com/blog/2006/12/moores-law-in-practical-terms.html">order of magnitude increases in computing power</a> over the last decade, we can&#8217;t figure out how to get speech recognition accuracy above 80% &#8212; when the baseline <i>human</i> voice transcription accuracy rate is anywhere from 96% to 98%!</p>
<blockquote><p>
In 2001 recognition accuracy topped out at 80%, far short of HAL-like levels of comprehension. Adding data or computing power made no difference. Researchers at Carnegie Mellon University checked again in 2006 and found the situation <a href="http://www.cs.brandeis.edu/~marc/misc/proceedings/lrec-2006/pdf/802_pdf.pdf">unchanged</a>. With human discrimination as high as 98%, the unclosed gap left little basis for conversation. But sticking to a few topics, like numbers, helped. Saying “one” into the phone works about as well as pressing a button, approaching 100% accuracy. But loosen the vocabulary constraint and recognition begins to drift, turning to vertigo in the wide-open vastness of linguistic space.
</p></blockquote>
<p>
As Robert Fortner explained in <a href="http://robertfortner.posterous.com/the-unrecognized-death-of-speech-recognition">Rest in Peas: The Unrecognized Death of Speech Recognition</a>, after all these years, we&#8217;re desperately far away from any sort of universal speech recognition that&#8217;s useful or practical.</p>
<p>
Now, we do have to clarify that we&#8217;re talking about universal recognition: saying <i>anything</i> to a computer, and having it reliably convert that into a valid, accurate text representation. When you constrain the voice input to a more limited vocabulary &#8212; say, just numbers, or only the names that happen to be in your telephone&#8217;s address book &#8212; it&#8217;s not unreasonable to expect a high level of accuracy. I tend to think of this as &#8220;voice control&#8221; rather than &#8220;voice recognition&#8221;.</p>
<p>
Still, I think we&#8217;re avoiding the real question: <b>is voice control, even hypothetically <i>perfect</i> voice control, more effective than the lower tech alternatives?</b> In my experience, speech is one of the least effective, inefficient forms of communicating with other human beings. By that, I mean &#8230;</p>
<ul>
<li>typical spoken communication tends to be off-the-cuff and ad-hoc. Unless you&#8217;re extremely disciplined, on average you will be unclear, rambling, and excessively verbose.
<li>people tend to hear about half of what you say at any given time. <a href="http://www.codinghorror.com/blog/2006/03/the-value-of-repetition-again.html">If you&#8217;re lucky</a>.
<li>spoken communication puts a highly disproportionate burden on the listener. Compare the time it takes to process a voicemail versus the time it takes to read an email.
</ul>
<p>
I am by no means <i>against</i> talking with my fellow human beings. I have a very deep respect for those rare few who are great communicators in the challenging medium of conversational speech. Though we&#8217;ve all been trained literally from birth how to use our voices to communicate, <b>voice communication remains filled with pitfalls and misunderstandings</b>. Even in the best of conditions.</p>
<p>
So why in the world &#8212; outside of a disability &#8212; would I want to extend the creaky, rickety old bridge of voice communication to controlling my computer? Isn&#8217;t there a better way?</p>
<p>
Robert&#8217;s <a href="http://robertfortner.posterous.com/the-unrecognized-death-of-speech-recognition">post</a> contains some examples in the comments from voice control enthusiasts:</p>
<blockquote><p>
in addition to extremely accurate voice dictation, there are those really cool commands, like being able to say something like &#8220;search Google for Balloon Boy&#8221; or something like that and having it automatically open up your browser and enter the search term &#8212; something like this is accomplished many times faster than a human could do it. Or, being able to total up a column of numbers in Microsoft Excel by saying simply &#8220;total this column&#8221; and seeing the results in a blink of an eye, literally.
</p></blockquote>
<p>
That&#8217;s funny, because <b>I just fired up the Google app on my iPhone, said &#8220;balloon boy&#8221; into it, and got .. a search for &#8220;blue boy&#8221;</b>. I am not making this up. As for the Excel example, total <i>which</i> column? Let&#8217;s assume you&#8217;ve dealt with the tricky problem of selecting what column you&#8217;re talking about with only your voice. (I&#8217;m sorry, was it D5? B5?) Wouldn&#8217;t it be many times faster to click the toolbar icon with your mouse, or press the keyboard command equivalent, to sum the column &#8212; rather than methodically and tediously saying the words &#8220;sum this column&#8221; out loud?</p>
<p>
I&#8217;m also trying to imagine a room full of people controlling their computers or phones using their voices. It&#8217;s difficult enough to get work done in today&#8217;s chatty work environments without the added burden of a floor full of people saying <a href="http://www.youtube.com/watch?v=Vxq9yj2pVWk">&#8220;zoom &#8230; enhance&#8221;</a> to their computers all day long. Wouldn&#8217;t we all end up hoarse <i>and</i> deaf?</p>
<p>
Let&#8217;s look at another practical example &#8212; YouTube&#8217;s <a href="http://googlesystem.blogspot.com/2009/11/youtube-audio-transcription.html">automatic speech recognition feature</a>. I clicked through to <a href="http://www.youtube.com/ucberkeley#p/u/0/BL9gmMzpRr4">the first UC Berkeley video</a> with this feature, clicked the CC (closed caption) icon, and immediately got .. this.</p>
<p>
<img class="asset  asset-image at-xid-6a0120a85dcdae970b013484af2ad3970c" alt="Uc-berkeley-physics-lecture" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/ee5d6_6a0120a85dcdae970b013484af2ad3970c-800wi" border="0" /></p>
<p>
&#8220;Light exerts force on matter&#8221;. But according to Google&#8217;s automatic speech recognition, it&#8217;s &#8220;like the search for some matter&#8221;. Unsurprisingly, it does not get better from there. You&#8217;d be way more confused than educated if you had to learn this lecture from the automatic transcription.</p>
<p>
Back when Joel Spolsky and I <a href="http://itc.conversationsnetwork.org/series/stackoverflow.html">had a podcast together</a>, <b>a helpful listener suggested using speech recognition to get a basic podcast transcript going</b>. Everything I knew about voice recognition told me this wouldn&#8217;t help, but harm. What&#8217;s worse: transcribing everything by hand, from scratch &#8212; or correcting every third or fourth word in an auto-generated machine transcript? Maybe it&#8217;s just me, but the friction of the huge error rate inherent in the machine transcript seems far more intimidating than a blank slate human transcription. The humans may not be particularly efficient, but they all <i>add</i> value along the way &#8212; collective human judgment can editorially improve the transcript, by removing all the duplication, repetition, and &#8220;ums&#8221; of a literal, by-the-book transcription.</p>
<p>
In 2004, Mike Bliss <a href="http://www.theblisspages.com/cms.php?mbid=147">composed a poem about voice recognition</a>. He then read it to voice recognition software on his PC, and rewrote it as recognized.</p>
<table width="600" cellpadding="4" cellspacing="4">
<tr>
<td valign="top">
a poem by Mike Bliss</p>
<p>like a baby, it listens<br />
it can&#8217;t discriminate<br />
it tries to understand<br />
it reflects what it thinks you say<br />
it gets it wrong&#8230; sometimes<br />
sometimes it gets it right.<br />
One day it will grow up,<br />
like a baby, it has potential<br />
will it go to work?<br />
will it turn to crime?<br />
you look at it indulgently.<br />
you can&#8217;t help loving it, can you?
</td>
<td valign="top">
a poem by like myth</p>
<p>like a baby, it nuisance<br />
it can&#8217;t discriminate<br />
it tries to oven<br />
it reflects lot it things you say<br />
it gets it run sometimes<br />
sometimes it gets it right<br />
won&#8217;t day it will grow bop<br />
Ninth a baby, it has provincial<br />
will it both to look?<br />
will it the two crime?<br />
you move at it inevitably<br />
you can&#8217;t help loving it, cannot you?
</td>
</tr>
</table>
<p>
The real punchline here is that Mike re-ran the experiment in 2008, and after 5 minutes of voice training, <b>the voice recognition got all but 2 words of the original poem correct!</b></p>
<p>
I suspect that&#8217;s still not good enough in the face of the existing simpler alternatives. Remember handwriting recognition? It was all the rage in the era of the <a href="http://en.wikipedia.org/wiki/Newton_(platform)">Apple Newton</a>. </p>
<p>
<img class="asset  asset-image at-xid-6a0120a85dcdae970b013484af3871970c image-full" alt="Doonesbury-newton" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/0eb97_6a0120a85dcdae970b013484af3871970c-800wi" border="0" /></a></p>
<p>
It wasn&#8217;t as bad as Doonesbury made it out to be. I learned <a href="http://en.wikipedia.org/wiki/Graffiti_(Palm_OS)">Palm&#8217;s Graffiti</a> handwriting recognition language and got fairly proficient with it. <b>More than ten years later, you&#8217;d expect to see <i>massively</i> improved handwriting recognition of some sort in today&#8217;s iPads and iPhones and iOthers, right?</b> Well, maybe, if by &#8220;massively improved&#8221; you mean &#8220;nonexistent&#8221;.</p>
<p>
While it still surely has its niche uses, I personally don&#8217;t miss handwriting recognition. Not even a little. And I can&#8217;t help wondering if voice recognition will go the same way.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/software/jira/?utm_source=Coding%2BHorror&amp;utm_medium=Text%2BAd&amp;utm_campaign=JIRA%2B4" rel="nofollow">JIRA 4</a> &#8211; Simplify bug tracking for everyone involved. <a href="http://www.atlassian.com/software/jira/?utm_source=Coding%2BHorror&amp;utm_medium=Text%2BAd&amp;utm_campaign=JIRA%2B4" rel="nofollow">Get started</a> from $10 for 10 users »
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/whatever-happened-to-voice-recognition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Vast and Endless Sea</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-vast-and-endless-sea/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-vast-and-endless-sea/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 20:36:29 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-vast-and-endless-sea/</guid>
		<description><![CDATA[After we created Stack Overflow, some people were convinced we had built a marginally better mousetrap for asking and answering questions. The inevitable speculation began: can we use your engine to build a Q&#38;A site about {topic}? Our answer was Stack Exchange. Pay us $129 a month (and up), and you too can create a [...]]]></description>
			<content:encoded><![CDATA[<p>
After we created Stack Overflow, some people were convinced we had built a marginally better mousetrap for asking and answering questions. The inevitable speculation began: <b>can we use your engine to build a Q&amp;A site about {topic}?</b> Our answer was Stack Exchange. Pay us $129 a month (and up), and you too can create a hosted Q&amp;A community on our engine &#8212; for whatever topic you like!</p>
<p>
Well, I have a confession to make: my heart was never in Stack Exchange. It was a parallel effort in a parallel universe only tangentially related to my own. There&#8217;s a whole host of reasons why, but if I had to summarize it in a sentence, I&#8217;d say that <b>money is poisonous to communities</b>. That $129/month doesn&#8217;t sound like much &#8212; and it isn&#8217;t &#8212; but the commercial nature of the enterprise permeated and distorted everything from the get-go.</p>
<p>
(fortunately, the model is changing with <a href="http://blog.stackexchange.com/post/518474918/stack-exchange-2-0">Stack Exchange 2.0</a>, but that&#8217;s a topic for another blog post.)</p>
<p>
Yes, Stack Overflow Internet Services Incorporated&copy;&reg;&trade; is technically a business, even <a href="http://blog.stackoverflow.com/2010/05/announcing-our-series-a/">a venture capital backed business</a> now &#8212; but I didn&#8217;t co-found it because I wanted to make money. I co-founded it because <b>I wanted to build something cool that made the internet better</b>. Yes, selfishly for myself, of course, but also in conjunction with all of my fellow programmers, because I know <a href="http://www.codinghorror.com/blog/2008/09/stack-overflow-none-of-us-is-as-dumb-as-all-of-us.html">none of us is as dumb as all of us</a>. </p>
<p>
Nobody is participating in Stack Overflow to <i>make money</i>. We&#8217;re participating in Stack Overflow because &hellip;</p>
<ul>
<li>We love programming
<li>We want to leave breadcrumb trails for other programmers to follow so they can avoid making the same dumb mistakes we did
<li>Teaching peers is one of the best ways to develop mastery
<li>We can follow our own interests wherever they lead
<li>We want to collectively build something great for the community with our tiny slices of effort
</ul>
<p>
I don&#8217;t care how much you pay me, you&#8217;ll never be able to recreate the incredibly satisfying feeling I get when <b>demonstrating mastery within my community of peers</b>. That&#8217;s what we do on Stack Overflow: have <i>fun</i>, while making the internet one infinitesimally tiny bit better every day.</p>
<p>
So is it any wonder that some claim <a href="http://meta.stackoverflow.com/questions/28642/why-do-i-get-more-satisfaction-out-of-participating-in-so-than-out-of-my-job">Stack Overflow is more satisfying than their real jobs?</a> Not to me. </p>
<p>
If this all seems like a bunch of <b>communist hippie bullcrap</b> to you, I understand. It&#8217;s hard to explain. But there is quite a bit of science documenting these strange motivations. Let&#8217;s start with <a href="http://www.ted.com/talks/dan_pink_on_motivation.html">Dan Pink&#8217;s 2009 TED talk</a>.</p>
<p><p>
Dan&#8217;s talk centers on <a href="http://en.wikipedia.org/wiki/The_Candle_Problem">the candle problem</a>. Given the following three items &hellip;</p>
<ol>
<li>A candle
<li>A box of thumbtacks
<li>A book of matches
</ol>
<p>
&hellip; how can you attach the candle to the wall?</p>
<p>
It&#8217;s not a very interesting problem on its own &#8212; that is, until you try to <b>incentivize</b> teams to solve it:</p>
<blockquote><p>
Now I want to tell you about an experiment using the candle problem by a scientist from Princeton named Sam Glucksberg. Here&#8217;s what he did. </p>
<p>
To the first group, he said, &#8220;I&#8217;m going to time you to establish norms, averages for how long it typically takes someone to solve this sort of problem.&#8221;</p>
<p>
To the second group, he said, &#8220;If you&#8217;re in the top 25 percent of the fastest times you get five dollars. If you&#8217;re the fastest of everyone we&#8217;re testing here today you get 20 dollars.&#8221; (This was many years ago. Adjusted for inflation, it&#8217;s a decent sum of money for a few minutes of work.)</p>
<p>
Question: How much faster did this group solve the problem?</p>
<p>
Answer: It took them, on average, three and a half minutes longer. Three and a half minutes longer. Now this makes no sense, right? I mean, I&#8217;m an American. I believe in free markets. That&#8217;s not how it&#8217;s supposed to work. If you want people to perform better, you reward them. Give them bonuses, commissions, their own reality show. Incentivize them. That&#8217;s how business works. But that&#8217;s not happening here. <b>You&#8217;ve got a monetary incentive designed to sharpen thinking and accelerate creativity &#8212; and it does just the opposite. It dulls thinking and blocks creativity.</b>
</p></blockquote>
<p>
It turns out that traditional carrot-and-stick incentives are only useful for repetitive, mechanical tasks. The minute you have to do anything even slightly complex that requires even a little problem solving without a clear solution or rules &#8212; those incentives not only don&#8217;t work, they <i>make things worse!</i></p>
<p>
Pink eventually wrote a book about this, <a href="http://www.amazon.com/dp/1594488843/?tag=codinghorror-20">Drive: The Surprising Truth About What Motivates Us</a>.</p>
<p>
<a href="http://www.codinghorror.com/.a/6a0120a85dcdae970b0134828e3150970c-pi"><img alt="Drive by Daniel H. Pink" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/a71f2_6a0120a85dcdae970b0134828e3150970c-800wi" style="border:1px solid silver" /></a></p>
<p>
There&#8217;s no need to read the book; this clever ten minute whiteboard animation will walk you through the main points. If you view only one video today, view this one.</p>
<p><p>
The concept of <a href="http://www.codinghorror.com/blog/2007/04/is-amazons-mechanical-turk-a-failure.html">intrinsic motivation</a> may not be a new one, but I find that very few companies are brave enough to actually implement them.</p>
<p>
<b>I&#8217;ve tried mightily to live up to the ideals that Stack Overflow was founded on when building out my team.</b> I don&#8217;t care when you come to work or what your schedule is. I don&#8217;t care <a href="http://www.codinghorror.com/blog/2010/05/on-working-remotely.html">where in the world you live</a> (provided you have a great internet connection). I don&#8217;t care how you do the work. I&#8217;m not going to micromanage you and assign you a queue of task items. There&#8217;s no need. </p>
<blockquote><p>
If you want to build a ship, don&#8217;t drum up the men to gather wood, divide the work and give orders. Instead, teach them to yearn for the vast and endless sea.<br />
&ndash; Antoine de Saint Exupéry
</p></blockquote>
<p>
Because I know you yearn for the vast and endless sea, just like we do.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/software/jira/?utm_source=Coding%2BHorror&amp;utm_medium=Text%2BAd&amp;utm_campaign=JIRA%2B4" rel="nofollow">JIRA 4</a> &#8211; Simplify bug tracking for everyone involved. <a href="http://www.atlassian.com/software/jira/?utm_source=Coding%2BHorror&amp;utm_medium=Text%2BAd&amp;utm_campaign=JIRA%2B4" rel="nofollow">Get started</a> from $10 for 10 users »
</td>
</tr>
</table>
<p><a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-vast-and-endless-sea/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On Working Remotely</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/on-working-remotely/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/on-working-remotely/#comments</comments>
		<pubDate>Thu, 06 May 2010 15:54:18 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[analysis paralysis]]></category>
		<category><![CDATA[business partner]]></category>
		<category><![CDATA[current team]]></category>
		<category><![CDATA[first mistake]]></category>
		<category><![CDATA[hellip]]></category>
		<category><![CDATA[Joel Spolsky]]></category>
		<category><![CDATA[old friendships]]></category>
		<category><![CDATA[sociopath]]></category>
		<category><![CDATA[stack overflow]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/on-working-remotely/</guid>
		<description><![CDATA[When I first chose my own adventure, I didn&#8217;t know what working remotely from home was going to be like. I had never done it before. As programmers go, I&#8217;m fairly social. Which still means I&#8217;m a borderline sociopath by normal standards. All the same, I was worried that I&#8217;d go stir-crazy with no division [...]]]></description>
			<content:encoded><![CDATA[<p>
When I first <a href="http://www.codinghorror.com/blog/2008/03/choosing-your-own-adventure.html">chose my own adventure</a>, I didn&#8217;t know what working remotely from home was going to be like. I had never done it before. As <i>programmers</i> go, I&#8217;m fairly social. Which still means I&#8217;m a borderline sociopath by normal standards. All the same, I was worried that I&#8217;d go stir-crazy with no division between my work life and my home life.</p>
<p>
Well, I haven&#8217;t gone stir-crazy yet. I think. But in building Stack Overflow, I have learned a few things about what it means to work remotely &#8212; at least when it comes to programming. Our current team encompasses 5 people, distributed all over the USA, along with the team in NYC.</p>
<p>
<img alt="Usa-stack-overflow-team-map" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/2f683_6a0120a85dcdae970b0133ed51b2e9970b-800wi" border="0" /></p>
<p>
My first mistake was <a href="http://www.codinghorror.com/blog/2007/06/in-programming-one-is-the-loneliest-number.html">attempting to program alone</a>. I had weekly calls with my business partner, <a href="http://www.joelonsoftware.com/">Joel Spolsky</a>, which were quite productive in terms of figuring out what it was we were trying to do together &#8212; but he wasn&#8217;t writing code. I was coding alone. Really alone. One guy working all by yourself alone. This didn&#8217;t work <i>at all</i> for me. I was unmoored, directionless, suffering from analysis paralysis, and barely able to get motivated enough to write even a few lines of code. I rapidly realized that I&#8217;d made a huge mistake in not <a href="http://www.codinghorror.com/blog/2009/02/whos-your-coding-buddy.html">having a coding buddy</a> to work with.</p>
<p>
that situation <a href="http://www.codinghorror.com/blog/2010/01/cultivate-teams-not-ideas.html">rectified itself soon enough</a>, as I was fortunate enough to find one of my favorite old coding buddies was available. Even though Jarrod was in North Carolina and I was in California, the shared source code was the mutual glue that stuck us together, motivated us, and kept us moving forward. To be fair, we also had the considerable advantage of prior history, because we had worked together at a previous job. But the minimum bar to work remotely is to find <b>someone who loves code as much as you do</b>. It&#8217;s &hellip; enough. Anything else on top of that &#8212; old friendships, new friendships, a good working relationship &#8212; is icing that makes working together all the sweeter. I eventually expanded the team in the same way by adding another old coding buddy, Geoff, who lives in Oregon. And again by adding Kevin, who I didn&#8217;t know, but had built amazing stuff for us <i>without even being asked to</i>, from Texas. And again by adding Robert, in Florida, who I also didn&#8217;t know, but spent so much time on every single part of our sites that I felt he had been running alongside our team the whole way, there all along.</p>
<p>
The reason remote development worked for us, in retrospect, wasn&#8217;t just shared love of code. I picked developers who I knew &#8212; I had incontrovertible <i>proof</i> &#8212; were amazing programmers. I&#8217;m not saying they&#8217;re perfect, far from it, merely that they were top programmers by any metric you&#8217;d care to measure. <i>That&#8217;s</i> why they were able to work remotely. Newbie programmers, or competent programmers who are phoning it in, are absolutely not going to have the moxie necessary to get things done remotely &#8212; at least, not without a pointy haired manager, or grumpy old team lead, breathing down their neck. Don&#8217;t even <i>think</i> about working remotely with anyone who doesn&#8217;t freakin&#8217; <i>bleed</i> ones and zeros, and has a proven track record of getting things done.</p>
<p>
While Joel certainly had a lot of high level input into what Stack Overflow eventually became, I only talked to him once a week, at best (these calls were <a href="http://itc.conversationsnetwork.org/series/stackoverflow.html">the genesis of our weekly podcast series</a>). <b>I had a strong, clear vision of what I wanted Stack Overflow to be, and how I wanted it to work.</b> Whenever there was a question about functionality or implementation, my team was able to rally around me and collectively make decisions we liked, and that I personally felt were in tune with this vision. And if you know me at all, you know <a href="http://www.codinghorror.com/blog/2004/10/just-say-no.html">I&#8217;m not shy about saying no</a>, either. We were able to build exactly what we wanted, exactly how we wanted.</p>
<p>
Bottom line, we were <a href="http://www.youtube.com/results?search_query=we're+on+a+mission+from+god">on a mission from God</a>. And we still are.</p>
<p>
So, there are a few basic ground rules for remote development, at least as I&#8217;ve seen it work:</p>
<ul>
<li>The minimum remote team size is two. Always have a buddy, even if your buddy is on another continent halfway across the world.
<li>Only grizzled veterans who absolutely <i>love</i> to code need apply for remote development positions. Mentoring of newbies or casual programmers simply doesn&#8217;t work at all remotely.
<li>If your remote team is going to work, they need full autonomy and a leader (PM, if you will) who has a strong vision <i>and</i> the power to fully execute on that vision.
</ul>
<p>
This is all well and good when you have a remote team size of <i>three</i>, as we did for the bulk of Stack Overflow development. And all in the same country. <a href="http://blog.stackoverflow.com/2010/05/announcing-our-series-a/">Now we need to grow the company</a>, and I&#8217;d like to grow it in distributed fashion, by hiring other amazing developers from around the world, many of whom I have met through Stack Overflow itself.
<p>
<b>But how do you scale remote development?</b> Joel had some deep seated concerns about this, so I tapped one of my heroes, Miguel de Icaza &#8212; who I&#8217;m proud to note is on <a href="http://stackoverflow.com/about/management#advisors">our all-star board of advisors</a> &#8212; and he was generous enough to give us some personal advice based on his experience running the <a href="http://www.mono-project.com/">Mono project</a>, which has dozens of developers distributed all over the world.</p>
<p>
<img alt="Time-zone-differences" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/15473_6a0120a85dcdae970b0133ed51a674970b-800wi" border="0" /></p>
<p>
At the risk of summarizing mercilessly (and perhaps too much), I&#8217;ll boil down Miguel&#8217;s advice the best I can. There are three tools you&#8217;ll need in place if you plan to grow a large-ish and still functional remote team:</p>
<ol>
<li><b>Real time chat</b>
<p>When your team member lives in Brazil, you can&#8217;t exactly walk by his desk to ask him a quick question, or bug him about something in his recent checkin. Nope. You need a way to <i>casually</i> ping your fellow remote team members and get a response back quickly. This should be low friction and available to all remote developers at all times. IM, IRC, some web based tool, laser beams, smoke signals, carrier pigeon, two tin cans and a string: whatever. As long as everyone really <i>uses</i> it. </p>
<p>
We&#8217;re currently experimenting with <a href="http://campfirenow.com/">Campfire</a>, but whatever floats your boat and you can get your team to consistently <i>use</i>, will work. Chat is the most essential and omnipresent form of communication you have when working remotely, so you need to make absolutely sure it&#8217;s functioning before going any further.</p>
<li><b>Persistent mailing list</b>
<p>Sure, your remote team may know the details of <i>their</i> project, but what about all the other work going on? How do they find out about that stuff or even know it exists in the first place? You need a virtual bulletin board: a place for announcements, weekly team reports, and meeting summaries. This is where a classic old-school mailing list comes in handy.</p>
<p>
We&#8217;re using <a href="http://groups.google.com/">Google Groups</a> and although it&#8217;s old school in spades, it works plenty well for this. You can get the emails as they arrive, or view the archived list via the web interface. One word of caution, however. Every time you see something arrive in your inbox from the mailing list you better believe, in your heart of hearts, that it contains useful information. The minute the mailing list becomes just another &#8220;whenever I have time to read that stuff&#8221;, noise engine, or distraction from work &hellip; you&#8217;ve let someone cry wolf too much, and ruined it. So be very careful. Noisy, argumentative, or useless things posted to the mailing list should be punishable by death. Or noogies.</p>
<li><b>Voice and video chat</b>
<p>
As much as I love ASCII, sometimes faceless ASCII characters just aren&#8217;t enough to capture the full intentions and feelings of the human being behind them. If you find yourself sending kilobytes of ASCII back and forth, and still are unsatisfied that you&#8217;re <i>communicating</i>, you should instill a reflexive habit of &#8220;going voice&#8221; on your team.</p>
<p>
Never underestimate the power of actually <i>talking</i> to another human being. I know, I know, the whole reason we got into this programming thing was to <i>avoid</i> talking to other people, but bear with me here. You can&#8217;t be face to face on a remote team without flying 6 plus hours, and who the heck has that kind of time? I&#8217;ve got work I need to get done! Well, the next best thing to hopping on a plane is to fire up <a href="http://www.skype.com/">Skype</a> and have a little voice chat. Easy peasy. All that human nuance which is totally lost in faceless ASCII characters (yes, even with our old pal <a href="http://en.wikipedia.org/wiki/Emoticon">*&lt;:-)</a>) will come roaring back if you <i>regularly</i> schedule voice chats. I recommend at least once a week at an absolute minimum; they don&#8217;t have to be long meetings, but it sure helps in understanding the human being behind all those awesome checkins.<br />

</ol>
<p>
Nobody hates meetings and process claptrap more than I do, but there is a certain amount of process you&#8217;ll need to keep a bunch of loosely connected remote teams and developers in sync.</p>
<ol>
<li><b>Monday team status reports</b>
<p>
Every Monday, as in <a href="http://www.youtube.com/results?search_query=somebody's+got+a+case+of+the+mondays">somebody&#8217;s-got-a-case-of-the</a>, each team should produce a brief, summarized rundown of:</p>
<ul>
<li>What we did <u>last week</u>
<li>What we&#8217;re planning to do <u>this week</u>
<li>Anything that is <u>blocking</u> us or we are <u>concerned</u> about
</ul>
<p>
This doesn&#8217;t have to be (and in fact <i>shouldn&#8217;t</i> be) a long report. The briefer the better, but do try to capture all the useful highlights. Mail this to the mailing list every Monday like clockwork. Now, how many &#8220;teams&#8221; you have is up to you; I don&#8217;t think this needs to be done at the individual developer level, but you could.</p>
<li><b>Meeting minutes</b>
<p>
Any time you conduct what you would consider to be a &#8220;meeting&#8221; with someone else, <u>take minutes</u>! That is, write down what happened in bullet point form, so those remote team members who couldn&#8217;t be there can benefit from &#8212; or at least hear about &#8212; whatever happened.</p>
<p>
Again, this doesn&#8217;t have to be long, and if you find taking meeting minutes onerous then you&#8217;re probably doing it wrong. A simple bulleted list of sentences should suffice. We don&#8217;t need to know every little detail, just the big picture stuff: <u>who</u> was there? What <u>topics</u> were discussed? What <u>decisions</u> were made? What are the <u>next steps</u>?
</ol>
<p>
Both of the above should, of course, be mailed out to the mailing list as they are completed so everyone can be notified. You do have a mailing list, right? Of course you do!</p>
<p>
If this seems like a lot of jibba-jabba, well, that&#8217;s because <b>remote development is hard</b>. It takes discipline to make it all work, certainly more discipline than piling a bunch of programmers into the same cubicle farm. But when you imagine what this kind of intellectual work &#8212; and by that I mean not just programming, but anything where you&#8217;re working in mostly thought-stuff &#8212; will be like in ten, twenty, even thirty years &hellip; don&#8217;t you think it will look a lot like what happens every day <i>right now</i> on Stack Overflow? That is, a programmer in Brazil helping a programmer in New Jersey solve a problem?</p>
<p>
If I have learned anything from Stack Overflow it is that the world of programming is <a href="http://www.codinghorror.com/blog/2009/03/the-ugly-american-programmer.html">truly global</a>. I am honored to meet these brilliant programmers from every corner of the world, even if only in a small way through a website. Nothing is more exciting for me than the prospect of adding international members to the Stack Overflow team &#8212; so that the development of Stack Overflow more properly reflects what Stack Overflow <i>is</i>: an international effort of like-minded &#8212; and dare I say <i>totally awesome</i> &#8212; programmers. If I could I&#8217;d hire each and every one of you. OK, maybe I&#8217;m a little biased. But to me, that&#8217;s how awesome the Stack Overflow community is.</p>
<p>
In many ways, <b>remote development represents the future of work</b>. If we have to spend a little time figuring out how this stuff works, and maybe even make some mistakes along the way, it&#8217;s worth it. As far as I&#8217;m concerned, the future is now. Why wait?</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/starter-day/?utm_source=Coding%2BHorror&amp;utm_medium=Text%2BAd&amp;utm_campaign=Starter%2BDay" rel="nofollow">Atlassian Starter Day</a> &#8211; Learn how startups like Boxee and Pandora broke through. <a href="http://www.atlassian.com/starter-day/?utm_source=Coding%2BHorror&amp;utm_medium=Text%2BAd&amp;utm_campaign=Starter%2BDay" rel="nofollow">Sign-up today »</a>
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/on-working-remotely/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What&#8217;s Wrong With CSS</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/whats-wrong-with-css/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/whats-wrong-with-css/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 18:00:17 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[css zen garden]]></category>
		<category><![CDATA[excerise]]></category>
		<category><![CDATA[html skeleton]]></category>
		<category><![CDATA[model view controller]]></category>
		<category><![CDATA[stack overflow]]></category>
		<category><![CDATA[star wars holiday]]></category>
		<category><![CDATA[star wars holiday special]]></category>
		<category><![CDATA[user interface model]]></category>
		<category><![CDATA[vertical alignment]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/whats-wrong-with-css/</guid>
		<description><![CDATA[We&#8217;re currently in the midst of a CSS Zen Garden type excerise on our family of Q&#38;A websites, which I affectionately refer to as &#8220;the Trilogy&#8221;: Server Fault Super User Stack Overflow Meta Stack Overflow (In case you were wondering, yes, meta is the Star Wars Holiday Special.) These sites all run the same core [...]]]></description>
			<content:encoded><![CDATA[<p>
We&#8217;re currently in the midst of a <a href="http://www.codinghorror.com/blog/2005/12/the-css-zen-garden-and-aspnet.html">CSS Zen Garden type excerise</a> on our family of Q&amp;A websites, which I affectionately refer to as <a href="http://blog.stackoverflow.com/2009/05/the-stack-overflow-trilogy/">&#8220;the Trilogy&#8221;</a>:</p>
<ul>
<li><a href="http://serverfault.com">Server Fault</a>
<li><a href="http://superuser.com">Super User</a>
<li><a href="http://stackoverflow.com">Stack Overflow</a>
<li><a href="http://meta.stackoverflow.com">Meta Stack Overflow</a>
</ul>
<p>
(In case you were wondering, yes, meta <i>is</i> the <a href="http://en.wikipedia.org/wiki/The_Star_Wars_Holiday_Special">Star Wars Holiday Special</a>.)</p>
<p>
These sites all run the same core engine, but the logo, domain, and CSS &#8220;skin&#8221; that lies over the HTML skeleton is different in each case:</p>
<table>
<tr>
<td>
<a href="http://serverfault.com"><img alt="serverfault.com screenshot" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/db33a_6a0120a85dcdae970b01348044a079970c-800wi" border="0" style="border:1px solid silver" /></a></p>
<td>
<a href="http://superuser.com"><img alt="superuser.com screenshot" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/dfb0f_6a0120a85dcdae970b01348044a20a970c-800wi" border="0" style="border:1px solid silver" /></a><br />
</tr>
<tr>
<td>
<a href="http://meta.stackoverflow.com"><img alt="meta.stackoverflow screenshot" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/d30ad_6a0120a85dcdae970b01348044a6f4970c-800wi" border="0" style="border:1px solid silver" /></a></p>
<td>
<a href="http://stackoverflow.com"><img alt="stackoverflow.com screenshot" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/4ba75_6a0120a85dcdae970b01348044a788970c-800wi" border="0" style="border:1px solid silver" /><br />
</tr>
</table>
<p>
They are not <i>terribly</i> different looking, it&#8217;s true, but we also want them to be recognizable as a family of sites.</p>
<p>
We&#8217;re working with two amazing designers, <a href="http://www.8164.org/">Jin Yang</a> and <a href="http://uxhero.com/">Nathan Bowers</a>, who are helping us whip the CSS and HTML into shape so they can produce a set of about 10 different Zen Garden designs. As new sites in our network <a href="http://blog.stackexchange.com/post/518474918/stack-exchange-2-0">get democracied into being</a>, these designs will be used as a palette for the community to choose from. (And, later, the community will decide on a domain name and logo as well.)</p>
<p>
Anyway, I bring this up not because <i><a href="http://www.google.com/images?q=my+pokemans+let+me+show+you">my pokemans, let me show you them</a></i>, but because I have to personally maintain four different CSS files. And that number is only going to get larger. <i>Much</i> larger. That scares me a little.</p>
<p>
Most of all, what I&#8217;ve learned from this exercise in site theming is that <b>CSS is kind of painful</b>. I fully support CSS as a (mostly) functional <a href="http://www.codinghorror.com/blog/2008/05/understanding-model-view-controller.html">user interface Model-View-Controller</a>. But even if you have extreme HTML hygiene and Austrian levels of discipline, CSS has some <a href="http://en.wikipedia.org/wiki/Cascading_Style_Sheets#Limitations">serious limitations</a> in practice.</p>
<p>
Things in particular that bite us a lot:</p>
<ul>
<li>Vertical alignment is a giant, hacky PITA. (Tables work great for this though!)
<li>Lack of variables so we have to repeat colors all over the place.
<li>Lack of nesting so we have to repeat huge blocks of CSS all over the place.
</ul>
<p>
In short, CSS violates the living crap out of <a href="http://www.codinghorror.com/blog/2007/03/curlys-law-do-one-thing.html">the DRY principle</a>. You are <i>constantly</i> and <i>unavoidably</i> repeating yourself.</p>
<p>
That&#8217;s why I&#8217;m so intrigued by two Ruby gems that attempt to directly address the deficiencies of CSS.</p>
<p>
1. <b><a href="http://lesscss.org/">Less CSS</a></b></p>
<table width="700">
<tr>
<td valign="top">
<pre>
/* CSS */

#header {
  -moz-border-radius: 5;
  -webkit-border-radius: 5;
  border-radius: 5;
}

#footer {
  -moz-border-radius: 10;
  -webkit-border-radius: 10;
  border-radius: 10;
}
</pre>
</td>
<td valign="top">
<pre>
// LessCSS

.rounded_corners (@radius: 5px) {
  -moz-border-radius: @radius;
  -webkit-border-radius: @radius;
  border-radius: @radius;
}

#header {
  .rounded_corners;
}

#footer {
  .rounded_corners(10px);
}
</pre>
</td>
</table>
<p>
2. <b><a href="http://sass-lang.com/">SASS</a></b></p>
<table width="700">
<tr>
<td valign="top">
<pre>
/* CSS */

.content_navigation {
  border-color: #3bbfce;
  color: #2aaebd;
}

.border {
  padding: 8px;
  margin: 8px;
  border-color: #3bbfce;
}
</pre>
</td>
<td valign="top">
<pre>
// Sass

!blue = #3bbfce
!margin = 16px

.content_navigation
  border-color = !blue
  color = !blue - #111

.border
  padding = !margin / 2
  margin = !margin / 2
  border-color = !blue
</pre>
</td>
</tr>
</table>
<p>
As you can see, in both cases we&#8217;re <b>transmogrifying CSS into a bit more of a programming language</b>, rather than the static set of layout rules it currently exists as. Behind the scenes, we&#8217;re generating plain vanilla CSS using these little dynamic languages. This could be done at project build time, or even dynamically on every page load if you have a good caching strategy.</p>
<p>
I&#8217;m not sure how many of these improvements <a href="http://www.w3.org/Style/CSS/current-work">CSS3</a> will bring, never mind when the bulk of browsers in the world will support it. But I definitely feel that the core changes identified in both <a href="http://lesscss.org/">Less CSS</a> and <a href="http://sass-lang.com/">SASS</a> address very real pain points in practical CSS use. It&#8217;s worth checking them out to understand why they exist, what they bring to the table, and how you could possibly adopt some of these strategies in your own CSS and your favorite programming language.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/starter-day/?utm_source=Coding%2BHorror&amp;utm_medium=Text%2BAd&amp;utm_campaign=Starter%2BDay" rel="nofollow">Atlassian Starter Day</a> &#8211; Learn how startups like Boxee and Pandora broke through. <a href="http://www.atlassian.com/starter-day/?utm_source=Coding%2BHorror&amp;utm_medium=Text%2BAd&amp;utm_campaign=Starter%2BDay" rel="nofollow">Sign-up today »</a>
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/whats-wrong-with-css/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>So You&#8217;d Like to Send Some Email (Through Code)</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/so-youd-like-to-send-some-email-through-code/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/so-youd-like-to-send-some-email-through-code/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 16:19:10 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[aol mailbox]]></category>
		<category><![CDATA[communication mediums]]></category>
		<category><![CDATA[digital equivalent]]></category>
		<category><![CDATA[dulcet tones]]></category>
		<category><![CDATA[explosive exponential growth]]></category>
		<category><![CDATA[hate hate]]></category>
		<category><![CDATA[stack overflow]]></category>
		<category><![CDATA[superfund cleanup]]></category>
		<category><![CDATA[you ve got mail]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/so-youd-like-to-send-some-email-through-code/</guid>
		<description><![CDATA[I have what I would charitably describe as a hate-hate relationship with email. I desperately try to avoid sending email, not just for myself, but also in the code I write. Despite my misgivings, email is the cockroach of communication mediums: you just can&#8217;t kill it. Email is the one method of online contact that [...]]]></description>
			<content:encoded><![CDATA[<p>
I have what I would charitably describe as a <a href="http://www.google.com/search?q=site:codinghorror.com+email">hate-hate</a> relationship with email. I desperately try to avoid sending email, not just for myself, but also in the code I write.</p>
<p>
Despite my misgivings, <b>email is the cockroach of communication mediums: <i>you just can&#8217;t kill it</i></b>. Email is the one method of online contact that almost everyone &#8212; at least for that subset of &#8220;everyone&#8221; which includes people who can bear to touch a computer at all &#8212; is guaranteed to have, and use. Yes, you can make a fairly compelling case that email is <a href="http://www.techdirt.com/articles/20071114/144228.shtml">for old stupid people</a>, but let&#8217;s table that discussion for now.</p>
<p>
So, reluctantly, we come to the issue of <b>sending email through code</b>. It&#8217;s easy! Let&#8217;s send some email through oh, I don&#8217;t know, let&#8217;s say &#8230; Ruby, courtesy of some sample code I found while <a href="http://stackoverflow.com/questions/tagged/ruby">browsing the Ruby tag</a> on Stack Overflow.</p>
<p><pre>
require 'net/smtp'

def send_email(to, subject = "", body = "")
    from = "my@email.com"
    body= "From: #{from}\r\nTo: #{to}\r\nSubject: #{subject}\r\n\r\n#{body}\r\n"

    Net::SMTP.start('192.168.10.213', 25, '192.168.0.218') do |smtp|
        smtp.send_message body, from, to
    end
end

send_email "foo@example.com", "title", "body goes here"
</pre>
<p>
There&#8217;s a bug in this code, though. Do you see it?</p>
<p>
<b>Just because you <i>send</i> an email doesn&#8217;t mean it will arrive.</b> Not by a long shot. Bear in mind this is <i>email</i> we&#8217;re talking about. It was never designed to survive a bitter onslaught of criminals and spam, not to mention the explosive, exponential growth it has seen over the last twenty years. Email is a well that has been truly and thoroughly poisoned &#8212; the digital equivalent of a superfund cleanup site. The ecosystem around email is a dank miasma of half-implemented, incompletely supported anti-spam hacks and workarounds.</p>
<p>
Which means the odds of that random email your code just sent getting to its specific destination is .. spotty. At best.</p>
<p>
If you want email your code sends to actually <i>arrive</i> in someone&#8217;s AOL mailbox, to <a href="http://www.fastcompany.com/magazine/18/voice.html">the dulcet tones of &#8220;You&#8217;ve Got Mail!&#8221;</a>, there are a few things you must do first. And most of them are only peripherally related to writing code.</p>
<p>
<b>1. Make sure the computer sending the email has a Reverse PTR record</b></p>
<p>
What&#8217;s a <a href="http://aplawrence.com/Blog/B961.html">reverse PTR record</a>? It&#8217;s something your ISP has to configure for you &#8212; a way of verifying that the email you send from a particular IP address actually belongs to the domain it is purportedly from.</p>
<blockquote><p>
Not every IP address has a corresponding PTR record. In fact, if you took a random sampling of addresses your firewall blocked because they were up to no good, you&#8217;d probably find most have no PTR record &#8211; a dig -x gets you no information. That&#8217;s also apt to be true for mail spammers, or their PTR doesn&#8217;t match up: if you do a dig -x on their IP you get a result, but if you look up that result you might not get the same IP you started with.</p>
<p>
That&#8217;s why PTR records have become important. Originally, PTR records were just intended as a convenience, and perhaps as a way to be neat and complete. There still are no requirements that you have a PTR record or that it be accurate, but because of the abuse of the internet by spammers, certain conventions have grown up. For example, you may not be able to send email to some sites if you don&#8217;t have a valid PTR record, or if your pointer is &#8220;generic&#8221;.</p>
<p>
How do you get a PTR record? You might think that this is done by your domain registrar &#8211; after all, they point your domain to an IP address. Or you might think whoever handles your DNS would do this. But the PTR record isn&#8217;t up to them, it&#8217;s up to the ISP that &#8220;owns&#8221; the IP block it came from. They are the ones who need to create the PTR record.
</p></blockquote>
<p>
A reverse PTR record is critical. How critical? Don&#8217;t even bother reading any further until you&#8217;ve verified that your ISP has correctly configured the reverse PTR record for the server that will be sending email. It is absolutely the most common check done by mail servers these days. Fail the reverse PTR check, and I guarantee that a <i>huge</i> percentage of the emails you send will end up in the great bit bucket in the sky &#8212; and not in the email inboxes you intended.</p>
<p>
<b>2. Configure DomainKeys Identified Mail in your DNS and code</b></p>
<p>
What&#8217;s <a href="http://en.wikipedia.org/wiki/DKIM">DomainKeys Identified Mail</a>? With DKIM, you &#8220;sign&#8221; every email you send with your private key, a key only <i>you</i> could possibly know. And this can be verified by attempting to decrypt the email using the public key stored in your public DNS records. It&#8217;s really quite clever!</p>
<p>
The first thing you need to do is generate some public-private key pairs (one for every domain you want to send email from) via OpenSSL. I used <a href="http://www.slproweb.com/products/Win32OpenSSL.html">a win32 version I found</a>. Issue these commands to produce the keys in the below files:</p>
<p><pre>
$ openssl genrsa -out rsa.private 1024
$ openssl rsa -in rsa.private -out rsa.public -pubout -outform PEM
</pre>
<p>
These public and private keys are just big ol&#8217; Base64 encoded strings, so plop them in your code as configuration string resources that you can retrieve later.</p>
<p>
Next, add some DNS records. You&#8217;ll need two new TXT records. </p>
<ol>
<li>_domainkey.example.com<br />
&#8220;o=~\; r=contact@example.com&#8221;</p>
<li>selector._domainkey.example.com<br />
&#8220;k=rsa\; p={public-key-base64-string-here}&#8221;
</ol>
<p>
The first TXT DNS record is the global DomainKeys policy and contact email.</p>
<p>
The second TXT DNS record is the public base64 key you generated earlier, as one giant unbroken string. Note that the &#8220;selector&#8221; part of this record can be anything you want; it&#8217;s basically just a disambiguating string. </p>
<p>
Almost done. One last thing &#8212; we need to sign our emails before sending them. In any rational world this would be handled by an email library of some kind. We use <a href="http://www.afterlogic.com/products/net-email-components">Mailbee.NET</a> which makes this fairly painless:</p>
<p><pre>
smtp.Message = dk.Sign(smtp.Message,
               null, AppSettings.Email.DomainKeyPrivate, false, "selector");
</pre>
<p><p>
<b>3. Set up a SenderID record in your DNS</b></p>
<p>
To be honest, <a href="http://en.wikipedia.org/wiki/Sender_ID">SenderID</a> is a bit of a &#8220;nice to have&#8221; compared to the above two. But if you&#8217;ve gone this far, you might as well go the distance. SenderID, while a little antiquated and kind of.. Microsoft/Hotmail centric.. doesn&#8217;t take much additional effort. </p>
<p>
SenderID isn&#8217;t complicated. It&#8217;s another TXT DNS record at the root of, say, example.com, which contains a specially formatted string documenting all the allowed IP addresses that mail can be expected to come from. Here&#8217;s an example:</p>
<p><pre>
"v=spf1 a mx ip4:10.0.0.1 ip4:10.0.0.2 ~all"
</pre>
<p>
You can use the <a href="http://www.microsoft.com/mscorp/safety/content/technologies/senderid/wizard/">Sender ID SPF Record Wizard</a> to generate one of these for each domain you send email from.</p>
<p>
<b>That sucked. How do I know all this junk is working?</b></p>
<p>
I agree, it sucked. Email sucks; what did you expect? I used two methods to verify that all the above was working:</p>
<ol>
<li>Test emails sent to a GMail account.
<p>Use the &#8220;show original&#8221; menu on the arriving email to see the raw message content as seen by the email server. You want to verify that the headers definitely contain the following:</p>
<p><pre>
Received-SPF: pass
Authentication-Results: ... spf=pass ... dkim=pass
</pre>
<p>
If you see that, then the Reverse PTR and DKIM signing you set up is working. Google provides <i>excellent</i> diagnostic feedback in their email server headers, so if something isn&#8217;t working, you can usually discover enough of a hint there to figure out why.</p>
<li>Test emails sent to the Port25 email verifier
<p>Port25 offers a really nifty public service &#8212; you can send email to check-auth@verifier.port25.com and it will reply to the from: address with an extensive diagnostic! Here&#8217;s an example summary result from a test email I just sent to it:</p>
<p><pre>
SPF check:          pass
DomainKeys check:   fail
DKIM check:         pass
Sender-ID check:    pass
SpamAssassin check: ham
</pre>
<p>
You want to pass SPF, DKIM, and Sender-ID. Don&#8217;t worry about the DomainKeys failure, as I believe it is spurious &#8212; DKIM is the &#8220;newer&#8221; version of that same protocol.</p>
</ol>
<p>
Yes, the above three steps are quite a bit of work just to send a lousy email. But I don&#8217;t send email lightly. By the time I&#8217;ve reached the point where I am forced to write code to send out email, <b>I really, <i>really</i> want those damn emails to arrive</b>. By any means necessary.</p>
<p>
And for those who are the unfortunate recipients of these emails: my condolences.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/hosted/studio/?utm_source=Coding%2BHorror&amp;utm_medium=Text%2BAd&amp;utm_content=B&amp;utm_campaign=Studio%2B2.1">JIRA Studio</a> &#8211; SVN hosting, issue tracking, CI and Google Apps integration. <a href="http://www.atlassian.com/hosted/studio/?utm_source=Coding%2BHorror&amp;utm_medium=Text%2BAd&amp;utm_content=B&amp;utm_campaign=Studio%2B2.1" rel="nofollow">Free trial »</a>
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/so-youd-like-to-send-some-email-through-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Three Monitors For Every User</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/three-monitors-for-every-user/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/three-monitors-for-every-user/#comments</comments>
		<pubDate>Wed, 07 Apr 2010 04:00:15 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/three-monitors-for-every-user/</guid>
		<description><![CDATA[As far as I&#8217;m concerned, you can never be too rich, too thin, or have too much screen space. By &#8220;screen&#8221;, I mean not just large monitors, but multiple large monitors. I&#8217;ve been evangelizing multiple monitors since the dark days of Windows Millennium Edition: Multiple Monitors and Productivity Multiple LCDs Joining the Prestigious Three Monitor [...]]]></description>
			<content:encoded><![CDATA[<p>
As far as I&#8217;m concerned, you can never be too rich, too thin, or have too much screen space. By &#8220;screen&#8221;, I mean not just large monitors, but <i>multiple</i> large monitors. I&#8217;ve been evangelizing multiple monitors since the dark days of <a href="http://en.wikipedia.org/wiki/Windows_Me">Windows Millennium Edition</a>:</p>
<ul>
<li><a href="http://www.codinghorror.com/blog/archives/000012.html">Multiple Monitors and Productivity</a>
<li><a href="http://www.codinghorror.com/blog/archives/000217.html">Multiple LCDs</a>
<li><a href="http://www.codinghorror.com/blog/archives/000740.html">Joining the Prestigious Three Monitor Club</a>
<li><a href="http://www.codinghorror.com/blog/archives/000928.html">The Large Display Paradox</a>
<li><a href="http://www.codinghorror.com/blog/archives/000959.html">LCD Monitor Arms</a>
</ul>
<p>
If you&#8217;re a long time reader you&#8217;re probably sick of hearing about this stuff by now, but something rather wonderful has happened since I last wrote about it:</p>
<blockquote><p>
If you&#8217;re only using one monitor, you are cheating yourself out of potential productivity. Two monitors is a no-brainer. It&#8217;s so fundamental that I included it as a part of the <a href="http://www.codinghorror.com/blog/2006/08/the-programmers-bill-of-rights.html">Programmer&#8217;s Bill of Rights</a>.</p>
<p>
But you can do better.</p>
<p>
<b>As good as two monitors is, three monitors is even better</b>. With three monitors, there&#8217;s a &#8220;center&#8221; to focus on. And 50% more display area. While there&#8217;s certainly a point of diminishing returns for additional monitors, I think three is the sweet spot. Even Edward Tufte, in the <a href="http://www.codinghorror.com/blog/archives/000739.html">class I recently attended</a>, explicitly mentioned multiple monitors. I don&#8217;t care how large a single display can be; you can never have enough desktop space.</p>
<p>
Normally, to achieve three monitors, you have to either:</p>
<ol>
<li>Buy an exotic video card that has more than 2 monitor connections.
<li>Install a second video card.
</ol>
</blockquote>
<p>
Fortunately, that is no longer true. I was excited to learn that the latest ATI video cards have gone from two to three video outputs. Which means <b>you can now achieve triple monitors with a single video card upgrade!</b>  They call this <a href="http://sites.amd.com/us/underground/products/eyefinity/Pages/eyefinity.aspx">&#8220;eyefinity&#8221;</a>, but it&#8217;s really just shorthand for &#8220;raising the standard from two display outputs to three&#8221;. </p>
<p>
But, there is a (small) catch. The PC ecosystem is in the middle of shifting display output standards. For evidence of this, you need look no further than the back panel of one of these newfangled triple display capable ATI video cards:</p>
<p>
<img alt="Radeon-eyefinity-video-card-outputs" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/348a0_6a0120a85dcdae970b01347fa6c999970c-800wi" border="0" /></p>
<p>
It contains:</p>
<ul>
<li>two DVI outputs
<li>one HDMI output
<li>one <a href="http://en.wikipedia.org/wiki/DisplayPort">DisplayPort</a> output
</ul>
<p>
I suspect part of this odd connector layout is due to space restrictions (DVI is awfully chunky), but I&#8217;ve always understood DisplayPort to be the new, improved DVI connector for computer monitors, and HDMI to be the new, improved s-video/component connector for televisions. Of course these worlds are blurring, as <a href="http://www.codinghorror.com/blog/2006/12/will-your-next-computer-monitor-be-a-hdtv.html">modern high-definition TVs make surprisingly effective computer monitors</a>, too.</p>
<p>
Anyway, since all my monitors have only DVI inputs, I wasn&#8217;t sure what to do with the other output. So <a href="http://superuser.com/questions/118957/converting-displayport-and-or-hdmi-to-dvi-d">I asked on Super User</a>. The helpful answers led me to discover that, as I suspected, the third output has to be DisplayPort. So to connect my third monitor, I needed to <b>convert DisplayPort to DVI</b>, and there are two ways:</p>
<ol>
<li>a <a href="http://www.amazon.com/dp/B0007MWE1Y/?tag=codinghorror-20">passive, analog DisplayPort to DVI conversion cable</a> for ~$30 that supports up to 1920&#215;1200
<li>an <a href="http://www.amazon.com/dp/B002ISVI3U/?tag=codinghorror-20">active, digital DisplayPort to DVI converter</a> for $110 that supports all resolutions
</ol>
<p>
I ended up going with the active converter, which has mixed reviews, but it&#8217;s worked well for me over the last few weeks. </p>
<p>
<a href="http://www.amazon.com/dp/B002ISVI3U/?tag=codinghorror-20"><img class="asset  asset-image at-xid-6a0120a85dcdae970b01347fa6eaab970c" alt="Accell-ultraav-displayport-to-dvi-adapter" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/32e51_6a0120a85dcdae970b01347fa6eaab970c-800wi" border="0" /></a></p>
<p>
Note that this adapter requires USB power, and given the spotty results others have had with it, some theorize that it needs quite a bit of juice to work reliably. I plugged it into my system&#8217;s nearby rear USB ports which do tend to deliver more power (they&#8217;re closer to the power supply, and have short cable paths). Now, I <i>have</i> gotten the occasional very momentary black screen with it, but nothing severe enough to be a problem or frequent enough to become a pattern. If you have DisplayPort compatible monitors, of course, this whole conversion conundrum is a complete non-issue. But DisplayPort is fairly new, and even my new-ish LCD monitors don&#8217;t support it yet.</p>
<p>
The cool thing about this upgrade, besides <a href="http://www.codinghorror.com/blog/2008/11/feeding-my-graphics-card-addiction.html">feeding my video card addiction</a>, is that <b>I was able to simplify my hardware configuration</b>. That&#8217;s always good. I went from two video cards to one, which means less power consumption, simpler system configuration, and fewer overall driver oddities. Basically, it makes triple monitors &#8212; dare I say it &#8212; almost a <i>mainstream</i> desktop configuration. How could I not be excited about that?</p>
<p>
I was also hoping that Nvidia would follow ATI&#8217;s lead here and <b>make three display outputs the standard for all their new video cards</b>, too, but sadly that&#8217;s not the case. It turns out their new GTX 480 fails in other ways, in that <a href="http://www.maximumpc.com/article/features/nvidias_hot_rod_gtx_480_powerful_and_power_hungry?page=0,1">it&#8217;s basically the Pentium 4 of video cards</a> &#8212; generating ridiculous amounts of heat for very little performance gain. Based on those two facts, I am comfortable endorsing ATI wholeheartedly at this point. But, do be careful, because not all ATI cards support triple display outputs (aka &#8220;eyefinity&#8221;). These are the ones that I know do:</p>
<p>
<ul>
<li><a href="http://www.amazon.com/dp/B0033WSDO2/?tag=codinghorror-20">Radeon HD 5670</a> (~$100)
<li><a href="http://www.amazon.com/dp/B002SP113K/?tag=codinghorror-20">Radeon HD 5770</a> (~$150)
<li><a href="http://www.amazon.com/dp/B0039YOMZI/?tag=codinghorror-20">Radeon HD 5830</a> (~$250)
<li><a href="http://www.amazon.com/dp/B002QEBGGA/?tag=codinghorror-20">Radeon HD 5850</a> (~$320)
<li><a href="http://www.amazon.com/dp/B003D0QQJS/?tag=codinghorror-20">Radeon HD 5870</a> (~$450)
</ul>
<p>
Unless you&#8217;re a gamer, there&#8217;s no reason to care about anything other than the least expensive model here, which will handily <i>crush</i> any 2D or 3D desktop GUI acceleration needs you might have. As an addict, of course I bought the high end model and it absolutely did not disappoint &#8212; more than doubling my framerates in the excellent game <a href="http://www.amazon.com/dp/B002NIP2SM/?tag=codinghorror-20">Battlefield: Bad Company 2</a> over the GTX 280 I had <a href="http://www.codinghorror.com/blog/2008/11/feeding-my-graphics-card-addiction.html">before</a>.</p>
<p>
I&#8217;m excited that a triple monitor setup is now, thanks to ATI, so easily attainable for desktop users &#8212; as long as you&#8217;re aware of the DisplayPort caveat I discussed above. I&#8217;d encourage anyone who is even <i>remotely</i> interested in the (many) productivity benefits of a triple monitor setup to seriously consider an ATI video card upgrade.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/hosted/studio/?utm_source=Coding%2BHorror&amp;utm_medium=Text%2BAd&amp;utm_content=A&amp;utm_campaign=Studio%2B2.1" rel="nofollow">JIRA Studio</a> &#8211; Hosted software development suite. Build better software. Faster. <a href="http://www.atlassian.com/hosted/studio/?utm_source=Coding%2BHorror&amp;utm_medium=Text%2BAd&amp;utm_content=A&amp;utm_campaign=Studio%2B2.1" rel="nofollow">Free trial »</a>
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/three-monitors-for-every-user/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usability On The Cheap and Easy</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/usability-on-the-cheap-and-easy/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/usability-on-the-cheap-and-easy/#comments</comments>
		<pubDate>Sat, 03 Apr 2010 08:00:27 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/usability-on-the-cheap-and-easy/</guid>
		<description><![CDATA[Writing code? That&#8217;s the easy part. Getting your application in the hands of users, and creating applications that people actually want to use &#8212; now that&#8217;s the hard stuff. I&#8217;ve been a long time fan of Krug&#39;s book Don&#39;t Make Me Think. Not just because it&#8217;s a quick, easy read (and it is!) &#8212; but [...]]]></description>
			<content:encoded><![CDATA[<p>
Writing code? That&#8217;s the easy part. Getting your application <a href="http://www.codinghorror.com/blog/2007/01/shipping-isnt-enough.html">in the hands of users</a>, and creating applications that <a href="http://www.codinghorror.com/blog/2004/11/youll-never-have-enough-cheese.html">people actually want to use</a> &#8212; now that&#8217;s the hard stuff.</p>
<p>
I&#8217;ve been a long time fan of Krug&#39;s book <a href="http://www.amazon.com/exec/obidos/ASIN/0321344758/codinghorror-20">Don&#39;t Make Me Think</a>. Not just because it&#8217;s a quick, easy read (and it is!) &#8212; but because it&#8217;s the most concise and most approachable book I&#8217;ve ever found to teach the fundamental importance of usability. As far as I&#8217;m concerned, if you want to help us make the software industry a saner place, the first step is getting <a href="http://www.amazon.com/exec/obidos/ASIN/0321344758/codinghorror-20">Don&#39;t Make Me Think</a> in the hands of as many of your coworkers as you can. <b>If you don&#8217;t have people that care about usability on your project, your project is doomed</b>.</p>
<p>
Beyond getting people over the hurdle of at least <i>paging through</i> the Krug book, and perhaps begrudgingly conceding that this usability stuff <i>matters</i>, the next challenge is figuring out how to integrate usability testing into your project. It&#8217;s easy to say &#8220;Usability is Important!&#8221;, but you have to walk the walk, too. I touched on some low friction ways to get started in <a href="http://www.codinghorror.com/blog/2007/01/low-fi-usability-testing.html">Low-Fi Usability Testing</a>. That rough outline is now available in handy, more complete book form &#8212; <a href="http://www.amazon.com/dp/0321657292/?tag=codinghorror-20">Rocket Surgery Made Easy: The Do-It-Yourself Guide to Finding and Fixing Usability Problems</a>. </p>
<p>
<a href="http://www.amazon.com/dp/0321657292/?tag=codinghorror-20"><img alt="Rocket-surgery-made-easy" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/1fc85_6a0120a85dcdae970b0128779b90b1970c-800wi" border="0" style="border:1px solid silver" /></a></p>
<p>
Don&#8217;t worry, Krug&#8217;s book is just as usable as his advice. It&#8217;s yet another quick, easy read. Take it from the man himself:</p>
<ul>
<li><b>Usability testing is one of the best things people can do to improve Web sites (or almost anything they’re creating that people have to interact with)</b>.
<li>Since most organizations can’t afford to hire someone to do testing for them<br />
on a regular basis, everyone should learn to do it themselves. And &hellip;</p>
<li>I could probably write a pretty good book explaining how to do it.
</ul>
<p>
If you&#8217;re wondering what the beginner&#8217;s &#8220;how do I boil water?&#8221; recipe for software project usability is, stop reading this post and get a copy of <a href="http://www.amazon.com/dp/0321657292/?tag=codinghorror-20">Rocket Surgery Made Easy</a>. Now.</p>
<p>
One of the holy grails of usability testing is <a href="http://www.useit.com/eyetracking/">eyetracking</a> &#8212; measuring where people&#8217;s eyes look as they use software and web pages. Yes, there are clever JavaScript tools that can measure where users move their <i>pointers</i>, but that&#8217;s only a small part of the story. Where the eye wanders, the pointer may not, and vice-versa. But, who has the time and equipment necessary to conduct an actual eyetracking study? Almost nobody. </p>
<p>
That&#8217;s where <a href="http://www.amazon.com/dp/0321498364/?tag=codinghorror-20">Eyetracking Web Usability</a> comes in.</p>
<p>
<a href="http://www.amazon.com/dp/0321498364/?tag=codinghorror-20"><img class="asset  asset-image at-xid-6a0120a85dcdae970b0120a898e9d6970b" alt="Eyetracking-web-usability" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/4cbc9_6a0120a85dcdae970b0120a898e9d6970b-800wi" border="0" /></a></p>
<p>
Eyetracking Web Usability is chock full of incredibly detailed eyetracking data for dozens of websites. Even though you (probably) can&#8217;t afford to do real eyetracking, you can certainly use this book as a reference. There is enough variety in UI and data that you can map the results, observations, and explanations found here to what <i>your</i> project is doing.</p>
<p>
This particular book is rather eyetracking specific, but it&#8217;s just the latest entry in <a href="http://www.codinghorror.com/blog/2007/04/usability-is-timeless.html">a whole series on usability</a>, and I recommend them all highly. These books are a fount of worthwhile data for anyone who works on software and cares about usability, from one of the most preeminent usability experts on the web.</p>
<p>
Usability isn&#8217;t really cheap or easy. It&#8217;s an endless war, with innumerable battlegrounds, stretching all the way back to the dawn of computing. But these books, at least, are cheap and easy in the sense that they give you some <b>basic training in <i>fighting the good (usability) fight</i></b>. That&#8217;s the best I can do, and it&#8217;s all I&#8217;d ask from anyone else I work with.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/hosted/studio/?utm_source=Coding%2BHorror&amp;utm_medium=Text%2BAd&amp;utm_content=A&amp;utm_campaign=Studio%2B2.1" rel="nofollow">JIRA Studio</a> &#8211; Hosted software development suite. Build better software. Faster. <a href="http://www.atlassian.com/hosted/studio/?utm_source=Coding%2BHorror&amp;utm_medium=Text%2BAd&amp;utm_content=A&amp;utm_campaign=Studio%2B2.1" rel="nofollow">Free trial »</a>
</td>
</tr>
</table>
<p><a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/usability-on-the-cheap-and-easy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Opposite of Fitts&#8217; Law</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-opposite-of-fitts-law/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-opposite-of-fitts-law/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 13:00:16 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[clickable areas]]></category>
		<category><![CDATA[ejector seat]]></category>
		<category><![CDATA[kevin hale]]></category>
		<category><![CDATA[random location]]></category>
		<category><![CDATA[small rocket]]></category>
		<category><![CDATA[thought exercises]]></category>
		<category><![CDATA[ui designers]]></category>
		<category><![CDATA[ui elements]]></category>
		<category><![CDATA[work button]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-opposite-of-fitts-law/</guid>
		<description><![CDATA[If you&#8217;ve ever wrangled a user interface, you&#8217;ve probably heard of Fitts&#8217; Law. It&#8217;s pretty simple &#8212; the larger an item is, and the closer it is to your cursor, the easier it is to click on. Kevin Hale put together a great visual summary of Fitts&#8217; Law, so rather than over-explain it, I&#8217;ll refer [...]]]></description>
			<content:encoded><![CDATA[<p>
If you&#8217;ve ever wrangled a user interface, you&#8217;ve probably heard of <a href="http://www.codinghorror.com/blog/2006/08/fitts-law-and-infinite-width.html">Fitts&#8217; Law</a>. It&#8217;s pretty simple &#8212; <b>the larger an item is, and the closer it is to your cursor, the easier it is to click on</b>. Kevin Hale put together <a href="http://particletree.com/features/visualizing-fittss-law/">a great visual summary of Fitts&#8217; Law</a>, so rather than over-explain it, I&#8217;ll refer you there. </p>
<p>
The short version of Fitts&#8217; law, to save you all that tedious <i>reading</i>, is this:</p>
<ul>
<li>Put commonly accessed UI elements on the edges of the screen. Because the cursor automatically stops at the edges, they will be easier to click on.
<li>Make clickable areas as large as you can. Larger targets are easier to click on.
</ul>
<p>
I know, it&#8217;s very simple, almost too simple, but humor me by following along with some thought exercises. Imagine yourself trying to click on &#8230;</p>
<ul>
<li>a 1 x 1 target at a random location
<li>a 5 x 5 target at a random location
<li>a 50 x 50 target at a random location
<li>a 5 x 5 target in the corner of your screen
<li>a 1 x 100 target at the bottom of your screen
</ul>
<p>
Fitts&#8217; Law is mostly common sense, and enjoys enough currency with UI designers that they&#8217;re likely to know about it even if <a href="http://yokozar.org/blog/archives/194">they don&#8217;t follow it as religiously as they should</a>. Unfortunately, I&#8217;ve found that designers are much less likely to consider the <i>opposite</i> of Fitts&#8217; Law, which is arguably just as important.</p>
<p>
If we should make UI elements we <i>want</i> users to click on large, and ideally place them at corners or edges for maximum clickability &#8212; <b>what should we do with UI elements we <i>don&#8217;t</i> want users to click on?</b> Like, say, the &#8220;delete all my work&#8221; button?</p>
<p>
Alan Cooper, in <a href="http://www.codinghorror.com/blog/2007/06/the-three-faces-of-about-face.html">About Face 3</a>, calls this the ejector seat lever.</p>
<blockquote><p>
In the cockpit of every jet fighter is a brightly painted lever that, when pulled, fires a small rocket engine underneath the pilot&#8217;s seat, blowing the pilot, still in his seat,<br />
out of the aircraft to parachute safely to earth. Ejector seat levers can only be used<br />
once, and their consequences are significant and irreversible.</p>
<p>
Applications must have ejector seat levers so that users can—occasionally—move<br />
persistent objects in the interface, or dramatically (sometimes irreversibly) alter the function or behavior of the application. The one thing that must never happen is accidental deployment of the ejector seat.</p>
<p>
<img alt="Unintended-ejection-seat-lever-consequences" src="http://www.codinghorror.com/.a/6a0120a85dcdae970b01310fd5f5e9970c-800wi" border="0" /></p>
<p>
The interface design must assure that a user can never inadvertently fire the ejector seat when all he wants to do is make some minor adjustment to the program.
</p></blockquote>
<p>
I can think of a half-dozen applications I regularly use where <b>the ejector seat button is inexplicably placed right next to the cabin lights button</b>. Let&#8217;s take a look at our old friend GMail, for example:</p>
<p>
<img class="asset  asset-image at-xid-6a0120a85dcdae970b01310fd5e58c970c" alt="Gmail-send-vs-save-now" src="http://www.codinghorror.com/.a/6a0120a85dcdae970b01310fd5e58c970c-800wi" border="0" /></p>
<p>
I can tell what you&#8217;re thinking. Did he click <b>Send</b> or <b>Save Now</b>? Well, to tell you the truth, in all the excitement of composing that angry email, I kind of lost track myself. Good thing we can easily undo a sent mail! Oh wait, we <i>totally can&#8217;t</i>. Consider my seat, or at least that particular rash email, ejected.</p>
<p>
It&#8217;s even worse when I&#8217;m archiving emails.</p>
<p>
<img alt="Gmail-archive-vs-report-spam" src="http://www.codinghorror.com/.a/6a0120a85dcdae970b01310fd5e9f8970c-800wi" border="0" /></p>
<p>
While there were at least 10 pixels between the buttons in the previous example, here there are all of &#8230; <i>three</i>. Every few days I accidentally click <b>Report Spam</b> when I really meant to click <b>Archive</b>. Now, to Google&#8217;s credit, they do offer a simple, obvious undo path for these accidental clicks. But I can&#8217;t help wondering why it is, exactly, that these two buttons with such radically different functionality just <i>have</i> to be right next to each other.</p>
<p>
Undo is powerful stuff, but wouldn&#8217;t it be better still if I wasn&#8217;t pulling the darn ejector seat lever all the time? Wouldn&#8217;t it make more sense to put that risky ejector seat lever in a different location, and make it smaller? Consider the WordPress post editor.</p>
<p>
<img alt="Wordpress-update-vs-trash" src="http://www.codinghorror.com/.a/6a0120a85dcdae970b0120a96ef50c970b-800wi" border="0" /></p>
<p>
Here, the common <b>Update</b> operation is large and obviously a button &#8212; it&#8217;s easy to see and easy to click on. The less common <b>Move to Trash</b> operation is smaller, presented as a vanilla hyperlink, and placed well away from Update.</p>
<p>
The next time you&#8217;re constructing a user interface, you should absolutely follow Fitts&#8217; law. It just makes sense. But don&#8217;t forget to follow the opposite of Fitts&#8217; law, too &#8212; uncommon or dangerous UI items should be <i>difficult</i> to click on!</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">JIRA 4</a> &#8211; Simplify issue tracking for everyone involved. <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">Get started</a> from $10 for 10 users.
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-opposite-of-fitts-law/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Compiled or Bust?</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/compiled-or-bust/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/compiled-or-bust/#comments</comments>
		<pubDate>Sat, 20 Mar 2010 10:24:07 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[code execution]]></category>
		<category><![CDATA[linq]]></category>
		<category><![CDATA[mixed emotions]]></category>
		<category><![CDATA[public internet]]></category>
		<category><![CDATA[query object]]></category>
		<category><![CDATA[sql statement]]></category>
		<category><![CDATA[stack overflow]]></category>
		<category><![CDATA[widget]]></category>
		<category><![CDATA[Widgets]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/compiled-or-bust/</guid>
		<description><![CDATA[While I may have mixed emotions toward LINQ to SQL, we&#8217;ve had great success with it on Stack Overflow. That&#8217;s why I was surprised to read the following: If you are building an ASP.NET web application that&#8217;s going to get thousands of hits per hour, the execution overhead of Linq queries is going to consume [...]]]></description>
			<content:encoded><![CDATA[<p>
While I may have <a href="http://www.codinghorror.com/blog/2009/06/all-abstractions-are-failed-abstractions.html">mixed emotions toward LINQ to SQL</a>, we&#8217;ve had great success with it on Stack Overflow. That&#8217;s why I was <a href="http://weblogs.asp.net/omarzabir/archive/2008/10/28/solving-common-problems-with-compiled-queries-in-linq-to-sql-for-high-demand-asp-net-websites.aspx">surprised to read the following</a>:</p>
<blockquote><p>
If you are building an ASP.NET web application that&#8217;s going to get thousands of hits per hour, the execution overhead of Linq queries is going to consume too much CPU and make your site slow. There’s a runtime cost associated with each and every Linq Query you write. The queries are parsed and converted to a nice SQL Statement on <i>every</i> hit. It’s not done at compile time because there’s no way to figure out what you might be sending as the parameters in the queries during runtime.</p>
<p>
So, if you have common Linq to Sql statements like the following one ..</p>
<p><pre>
var query = from widget in dc.Widgets
            where widget.ID == id &amp;&amp; widget.PageID == pageId
            select widget;
var widget = query.SingleOrDefault();
</pre>
<p>
..  throughout your growing web application, you are soon going to have scalability nightmares.
</p></blockquote>
<p>
J.D. Conley <a href="http://www.jdconley.com/blog/archive/2007/11/28/linq-to-sql-surprise-performance-hit.aspx">goes further</a>:</p>
<blockquote><p>
So I dug into the call graph a bit and found out the code causing by far the most damage was the creation of the LINQ query object for every call! The actual round trip to the database paled in comparison.
</p></blockquote>
<p>
I must admit, these results seem &#8230; unbelievable. Querying the database is so slow (relative to typical code execution) that if you have to ask how long it will take, <i>you can&#8217;t afford it</i>. I have a very hard time accepting the idea that <b>dynamically parsing a Linq query would take longer than round-tripping to the database.</b> Pretend I&#8217;m from Missouri: show me. Because I am unconvinced.</p>
<p>
All of this is very curious, because Stack Overflow uses naive, uncompiled Linq queries on every page, and we are a top 1,000 website on the public internet by most accounts these days. We get a considerable amount of traffic; the last time I checked it was about 1.5 million pageviews per day. We go to great pains to make sure everything is as fast as we can. We&#8217;re not as fast as we&#8217;d like to be yet, but I think we&#8217;re doing a reasonable job so far. The journey is still very much underway &#8212; we realize that <a href="http://www.codinghorror.com/blog/2009/01/overnight-success-it-takes-years.html">overnight success takes years</a>.</p>
<p>
Anyway, <b>Stack Overflow has dozens to hundreds of plain vanilla uncompiled Linq to SQL queries on every page</b>. What we <i>don&#8217;t</i> have is &#8220;scalability nightmares&#8221;. CPU usage has been one of our least relevant constraints over the last two years as the site has grown. We&#8217;ve also heard from other development teams, multiple times, that Linq to SQL is &#8220;slow&#8221;. But we&#8217;ve never been able to reproduce this even when armed with a profiler.</p>
<p>
Quite the mystery.</p>
<p>
Now, it&#8217;s absolutely true that Linq to SQL has the performance peculiarity both posters are describing. We know that&#8217;s true because <a href="http://blogs.msdn.com/ricom/archive/2008/01/14/performance-quiz-13-linq-to-sql-compiled-query-cost-solution.aspx">Rico tells us so</a>, and Rico &#8230; well, Rico&#8217;s <i>the man</i>.</p>
<blockquote><p>
In short the problem is that <b>the basic Linq construction (we don’t really have to reach for a complex query to illustrate) results in repeated evaluations of the query if you ran the query more than once.</b></p>
<p>
Each execution builds the expression tree, and then builds the required SQL. In many cases all that will be different from one invocation to another is a single integer filtering parameter. Furthermore, any databinding code that we must emit via lightweight reflection will have to be jitted each time the query runs. Implicit caching of these objects seems problematic because we could never know what good policy is for such a cache &#8212; only the user has the necessary knowledge.
</p></blockquote>
<p>
It&#8217;s fascinating stuff; you should <a href="http://blogs.msdn.com/ricom/archive/2007/06/22/dlinq-linq-to-sql-performance-part-1.aspx">read the whole series</a>.</p>
<p>
What&#8217;s unfortunate about Linq in this scenario is that you&#8217;re intentionally sacrificing something that any <a href="http://www.yafla.com/dforbes/Getting_Real_about_NoSQL_and_the_SQL_Isnt_Scalable_Lie/">old and busted SQL database</a> gives you for free. When you send a garden variety parameterized SQL query through to a traditional SQL database, it&#8217;s hashed, then matched against existing cached query plans. The computational cost of pre-processing a given query is only paid the first time the database sees the new query. All subsequent runs of that same query use the cached query plan and skip the query evaluation. Not so in Linq to SQL. As Rico said, <b>every single run of the Linq query is fully parsed every time it happens</b>.</p>
<p>
Now, there <i>is</i> a way to compile your Linq queries, but I personally find the syntax kind of &#8230; ugly and contorted. You tell me:</p>
<p><pre>
Func&lt;Northwinds, IQueryable&lt;Orders&gt;, int&gt; q =
     CompiledQuery.Compile&lt;Northwinds, int, IQueryable&lt;Orders&gt;&gt;
                ((Northwinds nw, int orderid) =&gt;
                            from o in nw.Orders
                            where o.OrderId == orderid
                            select o );

Northwinds nw = new Northwinds(conn);

foreach (Orders o in q(nw, orderid))
{
}
</pre>
<p>
Anyway, that&#8217;s neither here nor there; we can confirm the performance penalty of failing to compile our queries ourselves. We recently wrote a one time conversion job against a simple 3 column table containing about 500,000 records. The meat of it looked like this:</p>
<p><pre>
db.PostTags.Where(t =&gt; t.PostId == this.Id).ToList();
</pre>
<p>
Then we compared it with the SQL variant; note that this is also being auto-cast down to the handy <code>PostTag</code> object as well, so the only difference is whether or not the query itself is SQL.</p>
<p><pre>
db.ExecuteQuery(
   "select * from PostTags where PostId={0}", this.Id).ToList();
</pre>
<p>
On an Intel Core 2 Quad running at 2.83 GHz, the former took <b>422 seconds</b> while the latter took <b>275 seconds</b>.</p>
<p>
The penalty for failing to compile this query, across 500k iterations, was 147 seconds. Wow! That&#8217;s 1.5 times slower! Man, only a <i>BASIC programmer</i> would be dumb enough to skip compiling all their Linq queries. But wait a second, no, wait 147 seconds. Let&#8217;s do the math, even though I suck at it. Each uncompiled run of the query took less than <b><i>one third of a millisecond</i></b> longer.</p>
<p>
At first I was worried that every Stack Overflow page was 1.5 times slower than it should be. But then I realized it&#8217;s probably more realistic to make sure that any page we generate isn&#8217;t doing <b>500 freakin&#8217; thousand queries!</b>  Have we found ourselves in <a href="http://www.codinghorror.com/blog/2009/01/the-sad-tragedy-of-micro-optimization-theater.html">the sad tragedy of micro-optimization theater</a> &#8230; again? I think we might have. Now I&#8217;m just depressed.</p>
<p>
While it&#8217;s arguably correct to say that every compiled Linq query (or for that matter, any compiled anything) will be faster, your decisions should be a bit more nuanced than <b>compiled or bust</b>. How much benefit you get out of compilation depends how many times you&#8217;re doing it. Rico would be the first to point this out, and in fact <a href="http://blogs.msdn.com/ricom/archive/2008/01/14/performance-quiz-13-linq-to-sql-compiled-query-cost-solution.aspx">he already has</a>:</p>
<p><pre>
Testing 1 batches of 5000 selects 


uncompiled  543.48 selects/sec
compiled    925.75 selects/sec


Testing 5000 batches of 1 selects 


uncompiled  546.03 selects/sec
compiled    461.89 selects/sec
</pre>
<p>
Have I mentioned that Rico is the man? Do you see the inversion here? Either you&#8217;re doing 1 batch of 5000 queries, or 5000 batches of 1 query. One is dramatically faster when compiled; the other is actually a big honking net negative if you consider the developer time spent converting all those beautifully, wonderfully simple Linq queries to the contorted syntax necessary for compilation. Not to mention the implied code maintenance.</p>
<p>
I&#8217;m a big fan of compiled languages. Even Facebook will tell you that <a href="http://developers.facebook.com/news.php?story=358&amp;blog=1">PHP is about as half as fast as it should be</a> on a good day with a tailwind. But compilation alone is not the entire performance story. Not even close. If you&#8217;re compiling something &#8212; whether it&#8217;s PHP, a regular expression, or a Linq query, don&#8217;t expect <a href="http://en.wikipedia.org/wiki/No_Silver_Bullet">a silver bullet</a>, or you may end up disappointed.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">JIRA 4</a> &#8211; Simplify issue tracking for everyone involved. <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">Get started</a> from $10 for 10 users.
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/compiled-or-bust/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>The Non-Programming Programmer</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-non-programming-programmer/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-non-programming-programmer/#comments</comments>
		<pubDate>Sat, 13 Mar 2010 17:00:12 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-non-programming-programmer/</guid>
		<description><![CDATA[I find it difficult to believe, but the reports keep pouring in via Twitter and email: many candidates who show up for programming job interviews can&#8217;t program. At all. Consider this recent email from Mike Lin: The article Why Can&#8217;t Programmers&#8230; Program? changed the way I did interviews. I used to lead off by building [...]]]></description>
			<content:encoded><![CDATA[<p>
I find it difficult to believe, but the reports keep pouring in via Twitter and email: <b>many candidates who show up for programming job interviews can&#8217;t program. At all.</b> Consider this recent email from Mike Lin:</p>
<blockquote><p>
The article <a href="http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html">Why Can&#8217;t Programmers&#8230; Program?</a> changed the way I did interviews.  I used to lead off by building rapport. That proved to be too time-consuming when, as you mentioned, the vast majority of candidates were simply non-technical. So I started leading off with technical questions. First progressing from easy to hard questions. Then I noticed I identified the rejects faster if I went the other way &ndash; hard questions first &ndash; so long as the hard questions were still in the &#8220;if you don&#8217;t know this then you can&#8217;t work here&#8221; category.  Most of my interviews still took about twenty minutes, because tough questions take some time to answer and evaluate.  But it was a big improvement over the rapport-building method; and it could be done over the phone.</p>
<p>
After reading your article, I started doing code interviews over the phone, using web meetings. My interview times were down to about 15 minutes each to identify people who just can&#8217;t code&mdash; the vast majority.
</p></blockquote>
<p>
I wrote that article in 2007, and I am stunned, but not entirely surprised, to hear that  three years later &#8220;the vast majority&#8221; of so-called programmers who apply for a programming job interview are unable to write the smallest of programs. To be clear, hard is a relative term &#8212; we&#8217;re not talking about complicated, Google-style graduate computer science interview problems. This is <a href="http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html">extremely simple stuff</a> we&#8217;re asking candidates to do. And they can&#8217;t. <b>It&#8217;s the equivalent of attempting to hire a truck driver and finding out that 90 percent of the job applicants can&#8217;t find the gas pedal or the gear shift.</b></p>
<p>
I agree, it&#8217;s insane. But it happens every day, and is (apparently) an epidemic hiring problem in our industry. </p>
<p>
You have to get to the simple technical interview questions immediately to screen out the legions of non-programming programmers. <a href="http://www.codinghorror.com/blog/2008/01/getting-the-interview-phone-screen-right.html">Screening over the telephone</a> is a wise choice, as I&#8217;ve noted before. But screening over the internet is even better, and arguably more natural for code.</p>
<blockquote><p>
I still wasn&#8217;t super-happy with having to start up the web meeting and making these guys share their desktops with me.  I searched for other suitable tools for doing short &#8220;pen-and-paper&#8221; style coding interviews over the web, but I couldn&#8217;t find any.  So I did what any self-respecting programmer would do.  <a href="http://i.seemikecode.com/">I wrote one</a>.</p>
<p>
Man, was it worth it! I schedule my initial technical screenings with job applicants in 15-minute blocks. I&#8217;m usually done in 5-10 minutes, sadly. <b>I schedule an actual interview with them if they can at least write simple a 10-line program.</b> That doesn&#8217;t happen often, but at least I don&#8217;t have to waste a whole lot of time anymore.
</p></blockquote>
<p>
Mike adds a disclaimer that his homegrown coding interview tool isn&#8217;t meant to show off <i>his</i> coding prowess. He needed a tool, so he wrote one &#8212; and thoughtfully shared it with us. There might well be others out there; what online tools do you use to screen programmers?</p>
<p>
Three years later, I&#8217;m still wondering: <b>why do people who can&#8217;t write a simple program <i>even entertain the idea</i> they can get jobs as working programmers?</b> Clearly, some of them must be succeeding. Which means our industry-wide interviewing standards for programmers are woefully inadequate, and that&#8217;s a disgrace. It&#8217;s degrading to every working programmer.</p>
<p>
At least bad programmers <i>can</i> be educated; non-programming programmers are not only hopeless but also cheapen the careers of everyone around them. They must be eradicated, starting with simple technical programming tests that should be a part of <i>every</i> programmer interview.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">JIRA 4</a> &#8211; Simplify issue tracking for everyone involved. <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">Get started</a> from $10 for 10 users.
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-non-programming-programmer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Welcome Back Comments</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/welcome-back-comments/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/welcome-back-comments/#comments</comments>
		<pubDate>Sat, 13 Feb 2010 09:20:05 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/welcome-back-comments/</guid>
		<description><![CDATA[I apologize for the scarcity of updates lately. There have been two things in the way: Continuing fallout from International Backup Awareness Day, which meant all updates to Coding Horror from that point onward were hand-edited text files. Which, believe me, isn&#8217;t nearly as sexy as it &#8230; uh &#8230; doesn&#8217;t sound. I am presenting [...]]]></description>
			<content:encoded><![CDATA[<p>
I apologize for the scarcity of updates lately. There have been two things in the way:</p>
<ol>
<li>
<p>Continuing fallout from <a href="http://www.codinghorror.com/blog/2009/12/international-backup-awareness-day.html">International Backup Awareness Day</a>, which meant all updates to Coding Horror from that point onward were hand-edited text files. Which, believe me, isn&#8217;t <i>nearly</i> as sexy as it &hellip; uh &hellip; doesn&#8217;t sound.</p>
<li>
<p>I am <a href="http://www.webstock.org.nz/10/programme/presentations.php">presenting and conducting a workshop at Webstock 2010</a> in New Zealand. This is a two week trip I&#8217;m taking with the whole family, including our little buddy <a href="http://www.codinghorror.com/blog/2009/03/spawned-a-new-process.html">Rock Hard Awesome</a>, so the preparations have been more intense than usual.
</p>
<p>
On top of all that, <a href="http://www.webstock.org.nz/10/programme/presentations.php">according to the program</a>, I just found that my presentation involves <i>interpretive dance</i>, too. Man. I wish someone had told me! My moves are so rusty, they&#8217;ve barely improved from <a href="http://en.wikipedia.org/wiki/Breakin'_2:_Electric_Boogaloo">Electric Boogaloo</a>. But hey, at least I don&#8217;t have to sing Andrews Sister songs like poor Brian Fling.</p>
</ol>
<p>
And then, of course, there&#8217;s that crazy <a href="http://www.codinghorror.com/blog/2008/04/introducing-stackoverflow-com.html">Stack Overflow thing</a> I&#8217;m always yammering on about. Very busy there, our <a href="http://blog.stackoverflow.com/2010/01/eating-our-own-careers-dogfood/">team is expanding</a>, and we have big plans for this year, too.</p>
<p>
But, there is hope!</p>
<p>
Thanks to the fine folks at <a href="http://www.sixapart.com/">Six Apart</a> &#8212; and more specifically the herculean efforts of one <a href="http://sippey.typepad.com/">Michael Sippey</a> &#8212; <b>Coding Horror is now hosted in the <a href="http://typepad.com/">TypePad</a> ecosystem</b>. Which means, at least in theory, better &#8220;cloud&#8221; type reliability in the future. (cough)</p>
<p>
One accidental bit of collateral damage was that comments, by necessity, were disabled during this two month period. At first, I was relieved. This may seem a bit hypocritical, since I originally wrote <a href="http://www.codinghorror.com/blog/2006/04/a-blog-without-comments-is-not-a-blog.html">A Blog Without Comments is Not a Blog</a>. And I still believe it too. But as I prophetically noted in the very same post:</p>
<blockquote><p>
I am sympathetic to issues of scale. <b>Comments don&#8217;t scale worth a damn.</b> If you have thousands of readers and hundreds of comments for every post, you should disable comments and switch to forums, probably moderated forums at that. But the number of bloggers who have that level of readership is so small as to be practically nil. And when you get there, believe me, you&#8217;ll know. Until then, you should enable comments.
</p></blockquote>
<p>
I guess you can put this in the &#8220;nice problems to have&#8221; category, but let me tell you, it&#8217;s not so nice of a problem when it&#8217;s on your plate. <b>At a large enough scale, comments require active moderation or they rapidly go sour.</b> People get mean, the crazies come out in full force, and the comments start to resemble an out of control trailer park reality show brawl. It&#8217;s fun, I suppose, but in a way that drives out all the sane people. Left unchecked, the best you can hope for is to end up head resident at the sanitarium. And that&#8217;s a hell of a way to go out.</p>
<p>
<a href="http://redwing.hutman.net/~mreed/warriorshtm/howlers.htm"><img alt="Howlers" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/ceca9_6a0120a85dcdae970b01287798c31e970c-800wi" border="0" /></a></p>
<p>
(the above is from Mike Reed&#8217;s <a href="http://www.codinghorror.com/blog/2005/11/which-online-discussion-archetype-are-you.html">amazing Flame Warriors series</a>, by the way. Well worth your time if you haven&#8217;t seen it already.)</p>
<p>
The degeneration of comments was a shame, because it undermined my claim that <a href="http://www.codinghorror.com/blog/2008/06/finally-a-definition-of-programming-i-can-actually-understand.html">comments are awesome</a>.</p>
<blockquote><p>
It&#8217;s an open secret amongst bloggers that the blog comments are often better than the original blog post, and it&#8217;s because the community collectively knows far more than you or I will ever know.</p>
<p>
The best part of a blog post often begins where the blog post ends. If you are offended by that, I humbly submit you don&#8217;t understand why blogs work.
</p></blockquote>
<p>
Why would I have bothered to found Stack Overflow with Joel Spolsky if I didn&#8217;t believe in the power of community &#8212; that <a href="http://www.codinghorror.com/blog/2008/09/stack-overflow-none-of-us-is-as-dumb-as-all-of-us.html">none of us is as dumb as all of us?</a> Honestly, a lot of the design of Stack Overflow comes from my personal observations about how blog comments work. But my creaky old Coding Horror comments offered none of the fancy voting and moderation facilities that make Stack Overflow work. And without ample free personal time and attention from me to weed the comment garden, the comments got out of control.</p>
<p>
<b>Most of all, I blame myself.</b></p>
<p>
I got some amazing emails in lieu of comments on my last few blog posts, and it positively <i>kills</i> me that these emails were only seen by two sets of eyes instead of the thousands they deserve. That&#8217;s a big part of why I <a href="http://www.codinghorror.com/blog/2007/05/maximizing-the-value-of-your-keystrokes.html">hate email silos</a>. And really, <a href="http://blog.stackoverflow.com/2010/02/podcast-83/">email in general</a>. </p>
<p>
But there was another unanticipated side effect of having comments disabled that Stéphane Charette pointed out to me in email.</p>
<blockquote><p>
Here is an interesting &#8220;silver lining&#8221; to the crash you had.  Without<br />
comments, it forces us, your faithful readers, to think more about<br />
what you have to say.</p>
<p>
In a way, things are back to how your blog used<br />
to be.  In recent years, the huge influx of comments means that we &#8212;<br />
or just I? &#8212; end up spending 1/4 of my time reading what you wrote,<br />
and then merging in what everyone else wrote.  Depending on how I feel<br />
about the topic and your approach to the issue, the weight values may<br />
be very different than 50/50.  But regardless, I always have to<br />
consider when clicking on my Coding Horror bookmark:  &#8220;Is now the<br />
right time to check if he has a new entry?  Do I have enough time to<br />
read through a hundred comments?  Should I wait until later tonight<br />
when the kids are in bed to go read his latest article?&#8221; </p>
<p>
I never thought about it until recently.  Your crash is what brought<br />
this up to light.  Like tonight, when I saw your new headline in my<br />
iGoogle page, I didn&#8217;t have to consider whether or not it was the<br />
right time.  I read the article, and then <i>thought for myself</i>. I<br />
didn&#8217;t let other people&#8217;s comments steer my thoughts.  How nice!</p>
<p>
I&#8217;m not certain why it works like this.  Often, the sheer number of<br />
comments distracts from what you wrote, but for some reason, it is<br />
impossible not to at the very least scroll through what people say.<br />
In a way, your blog has ended up like a slashdot article, with a<br />
paragraph or two of content at the top, and then everyone wanting to<br />
insert their $0.02.
</p></blockquote>
<p>
Thinking for yourself. Now there&#8217;s a <a href="http://www.codinghorror.com/blog/2008/10/youre-reading-the-worlds-most-dangerous-programming-blog.html">novel idea</a>. In the reverberating echo chamber that is the internet, I think we would <i>all</i> do well to remind ourselves of that periodically.</p>
<p>
He&#8217;s also right that the psychic burden of all those comments was weighing not just on readers, but on me, the writer, too. That&#8217;s why I had a false sense of freedom when comments were disabled. <i>You mean I can say whatever I want, and nobody can contradict me underneath my very own post? Revolutionary!</i></p>
<p>
There are some absolute gems of insight and observation in comments, but sometimes extracting them was too much like pulling teeth. At the same time, I felt obligated to read all the comments on every post of mine. If I was asking people to read the random words I&#8217;m spewing all over the internet, how could I not extend my commenters the same courtesy? That&#8217;s just rude. </p>
<p>
It seems the only thing worse than comments being on was comments being <i>off</i>. It started to feel empty. As if I was in an enormous room, presenting to an eerily mute audience.</p>
<p>
So, while I am very glad to have comments back, and I welcome dialog with the community, there will be &hellip; changes. For the benefit of everyone&#8217;s mental health.</p>
<ol>
<li>
<p><b>No more anonymous comments</b>. While I would prefer to allow anonymous comments, it is clear that at this scale I don&#8217;t have time to deal properly with anonymous comments. If you want to say something, you&#8217;ll need to authenticate. If what you have to say isn&#8217;t worth authenticating to post, it&#8217;s probably best for both of us if you keep it to yourself anyway.</p>
<p>
The good news is that the TypePad commenting system supports a veritable laundry list of authentication mechanisms &#8212; OpenID (naturally), Twitter, Facebook, Google, Yahoo, and many others. So authenticating to post a comment should only present a mild, but necessary, barrier to conversation.</p>
<li>
<p><b>Comment moderation will be more stringent</b>. If you don&#8217;t have something useful and reasonably constructive to say in your comment, it will be removed without hesitation. You can be <a href="http://www.codinghorror.com/blog/2009/06/i-stopped-reading-your-blog-years-ago.html">as critical of me</a> (or, better still, my arguments and ideas) as you like, but you must convince me that you&#8217;re <i>contributing</i> to the conversation and not just yelling at me or anyone else.</p>
<p>I&#8217;m not looking for sycophants, but shrill argument is every bit as bad. When you comment here, try to show the class something interesting they can use. That&#8217;s all I&#8217;m asking.</p>
</ol>
<p>
It feels good to be back. Thanks to Six Apart for making it happen.</p>
<p>
And, most of all, thanks to <i>you</i> for reading.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">JIRA 4</a> &#8211; Simplify issue tracking for everyone involved. <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">Get started</a> from $10 for 10 users.
</td>
</tr>
</table>
<p><p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/welcome-back-comments/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cultivate Teams, Not Ideas</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/cultivate-teams-not-ideas/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/cultivate-teams-not-ideas/#comments</comments>
		<pubDate>Sat, 13 Feb 2010 04:13:05 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[cooperative student]]></category>
		<category><![CDATA[customer service problems]]></category>
		<category><![CDATA[derek sivers]]></category>
		<category><![CDATA[giving a presentation]]></category>
		<category><![CDATA[massive profits]]></category>
		<category><![CDATA[political science concepts]]></category>
		<category><![CDATA[rational choice theory]]></category>
		<category><![CDATA[tragedy of the commons]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/cultivate-teams-not-ideas/</guid>
		<description><![CDATA[How much is a good idea worth? According to Derek Sivers, not much: It&#39;s so funny when I hear people being so protective of ideas. (People who want me to sign an NDA to tell me the simplest idea.) To me, ideas are worth nothing unless executed. They are just a multiplier. Execution is worth [...]]]></description>
			<content:encoded><![CDATA[<p>How much is a good idea worth? According to Derek Sivers, <a href="http://sivers.org/multiply">not much</a>:</p>
<blockquote><p>
It&#39;s so funny when I hear people being so protective of ideas. (People who want me to sign an NDA to tell me the simplest idea.) To me, <b>ideas are worth nothing unless executed</b>. They are just a multiplier. Execution is worth millions.</p>
<p>
To make a business, you need to multiply the two. The most brilliant idea, with no execution, is worth $20. The most brilliant idea takes great execution to be worth $20,000,000. That&#39;s why I don&#39;t want to hear people&#39;s ideas. I&#39;m not interested until I see their execution.
</p>
</blockquote>
<p>
I was reminded of Mr. Sivers article when <a href="http://groups.google.com/group/barcampla/browse_thread/thread/4b4091eaf6fb6743?pli=1">this email</a> made the rounds earlier this month:</p>
<blockquote><p>
I feel that this story is important to tell you because Kickstarter.com copied us.  I tried for 4 years to get people to take Fundable seriously, traveling across the country, even giving a presentation to FBFund, Facebook&#39;s fund to stimulate development of new apps.  It was a series of rejections for 4 years.  I really felt that I presented myself professionally in every business situation and I dressed appropriately and practiced my presentations.  That was not<br />
enough. The idiots wanted us to show them charts with massive profits and widespread public acceptance so that they didn&#39;t have to take any risks. </p>
<p>
All it took was 5 super-connected people at Kickstarter (especially Andy Baio) to take a concept we worked hard to refine, tweak it with Amazon Payments, and then take credit.  You could say that that&#39;s capitalism, but I still think you should acknowledge people that you take inspiration from.  I do.  I owe the concept of Fundable to many things, including living in cooperative student housing and studying Political Science at Michigan.  Rational choice theory, tragedy of the commons, and collective action are a few political science concepts that are relevant to Fundable. </p>
<p>
Yes, Fundable had some technical and customer service problems. That&#39;s because we had no money to revise it.  I had plans to scrap the entire CMS and start from scratch with a new design.  We were just so burned out that motivation was hard to come by.  What was the point if we weren&#39;t making enough money to live on after 4 years?
</p>
</p>
</blockquote>
<p>
The disconnect between idea and execution here is so vast it&#39;s hard to understand why the author himself can&#39;t see it.</p>
<p>
I wouldn&#39;t call ideas <i>worthless</i>, per se, but it&#39;s clear that ideas alone are a hollow sort of currency. Success is rarely determined by the quality of your ideas. But it <i>is</i> frequently determined by the quality of your execution. So instead of worrying about whether the Next Big Idea you&#39;re all working on is sufficiently brilliant, <b>worry about how well you&#39;re executing.</b></p>
<p>
The criticism that all you need is &quot;super-connected people&quot; to be successful was also leveled at Stack Overflow. In an email to me last year, Andy Baio &#8212; ironically, the very person being cited in the email &#8212; said:</p>
<blockquote><p>
I very much enjoyed <a href="http://www.codinghorror.com/blog/archives/001284.html">the Hacker News conversation about cloning the site in a weekend</a>.  My favorite comments were from the people that believe Stack Overflow is only successful because of the Cult of Atwood &amp; Spolsky. Amazing.
</p></blockquote>
<p>
I don&#39;t care how internet famous you are; <i>nobody</i> gets a pass on execution. Sure, you may have a few more eyeballs at the beginning, but if you don&#39;t build something useful, the world will eventually just shrug its collective shoulders and move along to more useful things. </p>
<p>
One of my all time favorite software quotes is <a href="http://daringfireball.net/2007/08/c4_1_in_a_nut">from Wil Shipley</a>:</p>
<blockquote><p>
This is all your app is: a collection of tiny details.
</p></blockquote>
<p>
<b>In software development, execution is staying on top of all the tiny details that make up your app.</b> If you&#39;re not constantly obsessing over every aspect of your application, relentlessly polishing and improving every little part of it &#8212; no matter how trivial &#8212; you&#39;re not executing. At least, not well.</p>
<p>
And unless you work alone, which is a rarity these days, your ability to stay on top of the collection of tiny details that makes up your app will hinge entirely on whether or not you can build a great team. They are the building block of any successful endeavor. This talk by <a href="http://en.wikipedia.org/wiki/Edwin_Catmull">Ed Catmull</a> is almost exclusively focused on how Pixar learned, through trial and error, to build teams that can <i>execute</i>.</p>
<p>
<a href="http://www.youtube.com/watch?v=k2h2lvhzMDc"><img alt="Ed Catmull talk at Stanford" border="0" class="at-xid-6a0120a85dcdae970b0120a86e262f970b" height="382" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/6020f_6a0120a85dcdae970b0120a86e262f970b-pi" width="500" /></a></p>
<p>
It&#39;s a fascinating talk, full of some great insights, and you should <a href="http://www.youtube.com/watch?v=k2h2lvhzMDc">watch the whole thing</a>. In it, Mr. Catmull amplifies Mr. Sivers&#39; sentiment:</p>
<blockquote><p>
If you give a good idea to a mediocre group, they&#39;ll screw it up. <b>If you give a mediocre idea to a good group, they&#39;ll fix it.</b> Or they&#39;ll throw it away and come up with something else.
</p></blockquote>
<p>
Execution isn&#39;t merely a multiplier. It&#39;s far more powerful. How your team executes has the power to transform your idea from gold into lead, or from lead into gold. That&#39;s why, when building Stack Overflow, I was so fortunate to not only <a href="http://www.codinghorror.com/blog/archives/001101.html">work with Joel Spolsky</a>, but also to cherry-pick two of the best developers I had ever worked with in my previous jobs and drag them along with me. Kicking and screaming if necessary.</p>
<p>
If I had to point to <b>the one thing that made our project successful</b>, it was not the idea behind it, our internet fame, the tools we chose, or the funding we had (precious little, for the record).</p>
<p>
It was our team.</p>
<p>
The value of my advice is debatable. But you would do well to heed the advice of Mr. Sivers and Mr. Catmull. If you want to be successful, stop worrying about the great ideas, and concentrate on cultivating great teams.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">JIRA 4</a> &#8211; Simplify issue tracking for everyone involved. <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">Get started</a> from $10 for 10 users.
</td>
</tr>
</table>
</p>
</p>
</p>
</p>
</p>
</p>
</p>
</p>
</p>
</p>
<p><a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/cultivate-teams-not-ideas/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>The Great Newline Schism</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-great-newline-schism/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-great-newline-schism/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 07:31:36 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[A]]></category>
		<category><![CDATA[ascii text file]]></category>
		<category><![CDATA[Carriage]]></category>
		<category><![CDATA[computer]]></category>
		<category><![CDATA[D UnixLF]]></category>
		<category><![CDATA[dim recollection]]></category>
		<category><![CDATA[electric typewriters]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[invisible characters]]></category>
		<category><![CDATA[line]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[manual typewriters]]></category>
		<category><![CDATA[text]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-great-newline-schism/</guid>
		<description><![CDATA[Have you ever opened a simple little ASCII text file to see it inexplicably displayed as onegiantunbrokenline? Opening the file in a different, smarter text editor results in the file displayed properly in multiple paragraphs. The answer to this puzzle lies in our old friend, invisible characters that we can&#8217;t see but that are totally [...]]]></description>
			<content:encoded><![CDATA[<p>
Have you ever opened a simple little ASCII text file to see it inexplicably displayed as onegiantunbrokenline?</p>
<p>
<img src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/cf932_alice-in-wonderland-notepad.png" width="585" height="153" alt="text file opened in notepad" /></p>
<p>
Opening the file in a different, smarter text editor results in the file displayed properly in multiple paragraphs.</p>
<p>
<img src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/44d45_alice-in-wonderland-notepad2.png" width="616" height="247" alt="text file opened in notepad2" /></p>
<p>
The answer to this puzzle lies in our old friend, <a href="http://www.codinghorror.com/blog/archives/001310.html">invisible characters that we can&#8217;t see but that are <i>totally</i> not out to get us</a>. Well, except when they are. </p>
<p>
The invisible problem characters in this case are <b>newlines</b>.</p>
<p>
Did you ever wonder what was at the end of your lines? As a programmer, I knew there were end of line characters, but I honestly never thought much about them. They just &hellip; <i>worked</i>. But newlines aren&#8217;t a universally accepted standard; they are different depending who you ask, and what platform they happen to be computing on:</p>
<table cellpadding="4" cellspacing="4" width="500">
<tr>
<td><b>DOS / Windows</b></td>
<td>CR LF</td>
<td><code>\r\n</code></td>
<td><code>0x0D 0x0A</code></td>
</tr>
<tr>
<td><b>Mac</b> (early)</td>
<td>CR</td>
<td><code>\r</code></td>
<td><code>0x0D</code></td>
</tr>
<tr>
<td><b>Unix</b></td>
<td>LF</td>
<td><code>\n</code></td>
<td><code>0x0A</code></td>
</tr>
</table>
<p>
The Carriage Return (CR) and Line Feed (LF) terms derive from manual typewriters, and old printers based on typewriter-like mechanisms (typically referred to as <a href="http://en.wikipedia.org/wiki/Daisy_wheel_printer">&#8220;Daisywheel&#8221; printers</a>). </p>
<p>
<img src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/bd5f5_manual-typewriter.jpg" width="500" height="458" alt="manual typewriter" /></p>
<p>
On a typewriter, pressing Line Feed causes the carriage roller to push up one line &#8212; without changing the position of the carriage itself &#8212; while the <a href="http://en.wikipedia.org/wiki/Carriage_return">Carriage Return</a> lever slides the carriage back to the beginning of the line. In all honesty, I&#8217;m not <i>quite</i> old enough to have used electric typewriters, so I have a dim recollection, at best, of the entire process. The distinction between CR and LF does seem kind of pointless &#8212; why would you want to move to the beginning of a line <i>without</i> also advancing to the next line? This is another analog artifact, as Wikipedia explains:</p>
<blockquote><p>
On printers, teletypes, and computer terminals that were not capable of displaying graphics, the carriage return was used without moving to the next line to allow characters to be placed on top of existing characters to produce character graphics, underlines, and crossed out text.
</p></blockquote>
<p>
So far we&#8217;ve got:</p>
<ul>
<li>Confusing terms based on archaic hardware that is no longer in use, and is confounding to new users who have no point of reference for said terms;
<li>Completely arbitrary platform &#8220;standards&#8221; for what is exactly the same function.
</ul>
<p>
Pretty much business as usual in computing. If you&#8217;re curious, as I was, about the historical basis for these decisions, <a href="http://en.wikipedia.org/wiki/Newline#History">Wikipedia delivers all the newline trivia you could possibly want, and more</a>:</p>
<blockquote><p>
The sequence <code>CR+LF</code> was in common use on many early computer systems that had adopted teletype machines, typically an ASR33, as a console device, because this sequence was required to position those printers at the start of a new line. On these systems, text was often routinely composed to be compatible with these printers, since the concept of device drivers hiding such hardware details from the application was not yet well developed; applications had to talk directly to the teletype machine and follow its conventions. <b>The separation of the two functions concealed the fact that the print head could not return from the far right to the beginning of the next line in one-character time. That is why the sequence was always sent with the CR first. In fact, it was often necessary to send extra characters (extraneous CRs or NULs, which are ignored) to give the print head time to move to the left margin.</b> Even after teletypes were replaced by computer terminals with higher baud rates, many operating systems still supported automatic sending of these fill characters, for compatibility with cheaper terminals that required multiple character times to scroll the display.</p>
<p>
CP/M&#8217;s use of <code>CR+LF</code> made sense for using computer terminals via serial lines. MS-DOS adopted CP/M&#8217;s <code>CR+LF</code>, and this convention was inherited by Windows.
</p></blockquote>
<p>
This <i>exciting</i> difference in how newlines work means you can expect to see one of three (or more, as we&#8217;ll find out later) newline characters in those &#8220;simple&#8221; ASCII text files.</p>
<p>
<img src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/44788_alice-line-endings-animation.gif" width="603" height="150" alt="animated line endings comparison" /></p>
<p>
If you&#8217;re fortunate, you&#8217;ll pick a fairly intelligent editor that can detect and properly display the line endings of whatever text files you open. If you&#8217;re less fortunate, you&#8217;ll see onegiantunbrokenline, or a bunch of extra <code>^M</code> characters in the file.</p>
<p>
Even worse, <b>it&#8217;s possible to mix all three of these line endings in the same file.</b> Innocently copy and paste a comment or code snippet from a file with a different set of line endings, then save it. <i>Bam</i>, you&#8217;ve got a file with multiple line endings. That you can&#8217;t see. I&#8217;ve accidentally done it myself. (Note that this depends on your choice of text editor; some will auto-normalize line endings to match the current file&#8217;s settings upon paste.)</p>
<p>
This is complicated by the fact that some editors, even editors that should know better, like Visual Studio, have <b>no mode that shows end of line markers</b>. That&#8217;s why, when attempting to open a file that has multiple line endings, Visual Studio will politely ask you if it can normalize the file to one set of line endings.</p>
<p>
<img src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/f6e59_inconsistent-line-endings.png" width="490" height="282" alt="Visual Studio - Inconsistent Line Endings dialog" /></p>
<p>
This Visual Studio dialog presents the following five (!) possible set of line endings for the file:</p>
<ol>
<li>Windows (CR LF)
<li>Macintosh (CR)
<li>Unix (LF)
<li>Unicode Line Separator (LS)
<li>Unicode Paragraph Separator (PS)
</ol>
<p>
The last two are new to me. I&#8217;m not sure under what circumstances you would want those <a href="http://en.wikipedia.org/wiki/Newline#Unicode">Unicode newline markers</a>.</p>
<p>
Even if you <a href="http://www.codinghorror.com/blog/archives/000178.html">rule out unicode</a> and stick to old-school ASCII, like most Facebook relationships &hellip; it&#8217;s complicated. I find it fascinating that the mundane ASCII newline has so much ancient computing lore behind it, and that it still <i>regularly</i> bites us in unexpected places.</p>
<p>
If you work with text files in any capacity &#8212; and what programmer doesn&#8217;t &#8212; you should know that not all newlines are created equally. <b>The Great Newline Schism is something you need to be aware of</b>. Make sure your tools can show you not just those pesky <a href="http://www.codinghorror.com/blog/archives/001310.html">invisible white space characters</a>, but line endings as well.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">JIRA 4</a> &#8211; Simplify issue tracking for everyone involved. <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">Get started</a> from $10 for 10 users.
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/the-great-newline-schism/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>A Democracy of Netbooks</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/a-democracy-of-netbooks/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/a-democracy-of-netbooks/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 03:40:48 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Apple IIs]]></category>
		<category><![CDATA[Apple Pies]]></category>
		<category><![CDATA[dave winer]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Joey DeVilla]]></category>
		<category><![CDATA[Michael Dell]]></category>
		<category><![CDATA[netbook]]></category>
		<category><![CDATA[netbooks]]></category>
		<category><![CDATA[pervasive internet]]></category>
		<category><![CDATA[platform vendor]]></category>
		<category><![CDATA[reader]]></category>
		<category><![CDATA[sd card reader]]></category>
		<category><![CDATA[smartphone]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/a-democracy-of-netbooks/</guid>
		<description><![CDATA[As a long time reader of Joey DeVilla&#8217;s excellent blog, Global Nerdy, I take exception to his post Fast Food, Apple Pies, and Why Netbooks Suck: The end result, to my mind, is a device that occupies an uncomfortable, middle ground between laptops and smartphones that tries to please everyone and pleases no one. Consider [...]]]></description>
			<content:encoded><![CDATA[<p>
As a long time reader of Joey DeVilla&#8217;s excellent blog, <a href="http://www.globalnerdy.com">Global Nerdy</a>, I take exception to his post <a href="http://www.globalnerdy.com/2009/05/26/fast-food-apple-pies-and-why-netbooks-suck/">Fast Food, Apple Pies, and Why Netbooks Suck</a>:</p>
<blockquote><p>
The end result, to my mind, is a device that occupies an uncomfortable, middle ground between laptops and smartphones that tries to please everyone and pleases no one. Consider the factors:</p>
<ul>
<li>Size: A bit too large to go into your pocket; a bit too small for regular day-to-day work.
<li>Power: Slightly more capable than a smartphone; slightly less capable than a laptop.
<li>Price: Slightly higher than a higher-end smartphone but lacking a phone&#8217;s capability and portability; slightly lower than a lower-end notebook but lacking a notebook&#8217;s speed and storage.
</ul>
<p>To summarize: Slightly bigger and pricier than a phone, but can&#8217;t phone. Slightly smaller and cheaper than a laptop, but not that much smaller or cheaper. To adapt a phrase I used in an article I wrote yesterday, <b>netbooks are like laptops, but lamer.</b>
</p></blockquote>
<p>
This is so wrongheaded I am not sure where to begin. I happen to <a href="http://www.scripting.com/stories/2008/10/22/whyILikeNetbooks.html">agree with Dave Winer&#8217;s definition of &#8220;netbook&#8221;</a>:</p>
<blockquote>
<ol>
<li>Small size.
<li>Low price.
<li>Battery life of 4+ hours. Battery can be replaced by user.
<li>Rugged.
<li>Built-in wifi, 3 USB ports, SD card reader.
<li>Runs my software.
<li>Runs any software I want; no platform vendor to decide what&#8217;s appropriate.
<li>Competition. Users have choice and can switch vendors at any time.
</ol>
</blockquote>
<p>
Netbooks are the endpoint of four decades of computing &#8212; the final, ubiquitous manifestation of <a href="http://en.wikipedia.org/wiki/Microsoft">&#8220;A PC on every desk and in every home&#8221;</a>. But netbooks are more than just PCs. If the internet is the ultimate force of democratization in the world, then netbooks are the instrument by which that democracy will be achieved.</p>
<p>
No monthly fees and contracts.</p>
<p>
No gatekeepers.</p>
<p>
Nobody telling you what you can and can&#8217;t do with your hardware, or on their network.</p>
<p>
To dismiss netbooks as <i>like laptops, but lamer</i> is to completely miss the importance of this pivotal moment in computing &#8212; when pervasive internet and the mass production of inexpensive portable computers finally intersected. I&#8217;m talking about <b>unlimited access to the complete sum of human knowledge, and free, unfettered communication with anyone on earth.</b> For everyone.</p>
<p>
It&#8217;s true that smartphones are slowly becoming little PCs, but they will never be <i>free</i> PCs. They will forever be locked behind an imposing series of gatekeepers and toll roads and walled gardens. Anyone with a $199 netbook and access to the internet can make free Skype videophone calls to anywhere on Earth, for as long as they want. Meanwhile, sending a single text message on a smartphone costs 4 times as much as <a href="http://www.physorg.com/news129793047.html">transmitting data to the Hubble space telescope</a>.</p>
<p>
I don&#8217;t care how &#8220;smart&#8221; your smartphone is, it will never escape those corporate shackles. Smartphones are simply <i>not free enough</i> to deliver the type of democratic transformation that netbooks &#8212; mobile PCs cheap enough and fast enough and good enough for everyone to afford &#8212; absolutely will.</p>
<p>
That&#8217;s why I love netbooks. In all their cheap, crappy glory. And you should too. Because they&#8217;re <a href="http://www.scripting.com/stories/2009/10/14/whatsObviousAboutNetbooks.html">instruments of user power</a>.</p>
<blockquote><p>
The truly significant thing is this &#8212; the users took over.</p>
<p>
Let me say that again: <i>The users took over</i>.</p>
<p>
I always say this is the lesson of the tech industry, but the people in the tech industry never believe it, but this is the loop. In the late 70s and early 80s the minicomputer and mainframe guys said the same kinds of things about Apple IIs and IBM PCs that Michael Dell is saying about netbooks. It happens over and over again, I&#8217;ve recited the loops so many times that every reader of this column can recite them from memory. All that has to be said is that it happened again.</p>
<p>
Once out, the genie never goes back in the bottle.
</p></blockquote>
<p>
Netbooks aren&#8217;t an alternative to notebook computers. <b>They <i>are</i> the new computers.</b></p>
<p>
Cheap and crappy? Maybe those early models were, but having purchased a new netbook for $439 shipped, it is difficult for me to imagine the average user ever paying more than $500 for a laptop.</p>
<p>
<a href="http://www.amazon.com/s?ie=UTF8&amp;keywords=Acer%20AS1410&amp;tag=codinghorror-20&amp;index=blended&amp;link_code=qs"><img src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/c1e22_acer-aspire-1410.jpg" width="449" height="490" alt="acer aspire 1410" border="0" /></a></p>
<p>
For the price, this is an astonishingly capable PC:</p>
<ul>
<li>Dual Core 1.2 GHz Intel CULV Celeron processor
<li>2 GB RAM
<li>Windows 7 Home Premium
<li>11.6&#8243; screen with 1366 x 768 resolution
<li>Thin (1&#8243;) and light (3.5 lbs)
<li>Good battery life (5 hours)
<li>3 USB ports, WiFi, webcam, gigabit ethernet
</ul>
<p>
Windows 7 is a fine OS, but this machine would surely be cheaper without <a href="http://www.codinghorror.com/blog/archives/000870.html">the Microsoft Tax</a>, too.</p>
<p>
The <a href="http://www.amazon.com/s?ie=UTF8&amp;keywords=Acer%20AS1410&amp;tag=codinghorror_20&amp;index=blended&amp;link_code=qs">Acer Aspire 1410</a> isn&#8217;t just an adequate netbook, it&#8217;s a damn good <i>computer</i>. At these specifications, it is a huge step up from those early netbook models in every way. But don&#8217;t take my word for it; read the reviews at <a href="http://netbooked.net/netbook-reviews/review/11.6-acer-aspire-as1410-celeron-su2300-review/">netbooked</a> and <a href="http://www.liliputing.com/2009/11/acer-aspire-1410-review-dual-core-version.html">Liliputing</a>. (Caveat emptor &#8212; there are lots of 1410 models, and the newer dual core CPU version is the one you want.)</p>
<p>
Of particular note is the CPU. While the Intel Atom is <a href="http://www.anandtech.com/cpuchipsets/intel/showdoc.aspx?i=3276">a technological coup</a>, I don&#8217;t feel current Atom CPUs deliver quite enough performance for a modern, JavaScript-heavy, video-intensive internet experience. It is quite clear that Intel is <a href="http://www.anandtech.com/mobile/showdoc.aspx?i=3693&amp;p=8">intentionally hobbling</a> newer iterations of the Atom CPU in the name of market segregation, and to prevent too much netbook price erosion.</p>
<p>
That&#8217;s why the current <a href="http://en.wikipedia.org/wiki/Consumer_Ultra-Low_Voltage">Intel CULV CPUs</a> are far more attractive options &#8212; they&#8217;re <a href="http://www.anandtech.com/mobile/showdoc.aspx?i=3699&amp;p=4">dramatically faster</a>, and have become power-efficient marvels. I hooked up <a href="http://www.codinghorror.com/blog/archives/000353.html">my watt meter</a> to this Aspire 1410 and I was surprised to find it consume <b>between 13 and 16 watts</b> of power in typical use &#8212; while my wife was browsing the web in Firefox, over a wireless connection, with multiple tabs open. I fired up Prime95 torture test to force the CPU to 100% load, and measured <b>21 watts</b> with one CPU core fully loaded, and <b>26 watts</b> when both were. These are wall measurements which reflect power conversion inefficiencies of at least 20%, so real consumption was between 10 and 20 watts. I was wondering why it ran so cool; now I know. It barely uses enough power to generate any heat!</p>
<p>
Modern netbooks are not cheap and crappy. They&#8217;re remarkable computers in their own right, and they&#8217;re getting better every day. Which <a href="http://bits.blogs.nytimes.com/2008/10/21/read-my-lips/">makes me wonder</a>:</p>
<blockquote><p>
A recurring question among Apple watchers for decades has been, “When is Apple going to introduce a low-cost computer?</p>
<p>
Steve Jobs answered that decades-old complaint by stating, &#8220;We don&#8217;t know how to build a sub-$500 computer that is not a piece of junk.&#8221;
</p></blockquote>
<p>
They may be pieces of junk to Mr. Jobs, but to me, these modest little boxes are marvels &#8212; inspiring evidence of the inexorable march of powerful, open computing technology to everyman and everywhere.</p>
<p>
We have produced <b>a democracy of netbooks</b>. And the geek in me can&#8217;t wait to see what happens next.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">JIRA 4</a> &#8211; Simplify issue tracking for everyone involved. <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">Get started</a> from $10 for 10 users.
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/a-democracy-of-netbooks/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Responsible Open Source Code Parenting</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/responsible-open-source-code-parenting/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/responsible-open-source-code-parenting/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 15:12:34 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[God]]></category>
		<category><![CDATA[implementation]]></category>
		<category><![CDATA[John]]></category>
		<category><![CDATA[john gruber]]></category>
		<category><![CDATA[Markdown]]></category>
		<category><![CDATA[markup]]></category>
		<category><![CDATA[markup languages]]></category>
		<category><![CDATA[Michel Fortin]]></category>
		<category><![CDATA[Mr. Gruber]]></category>
		<category><![CDATA[specification]]></category>
		<category><![CDATA[stack overflow]]></category>
		<category><![CDATA[text]]></category>
		<category><![CDATA[unexpected side effects]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/responsible-open-source-code-parenting/</guid>
		<description><![CDATA[I&#8217;m a big fan of John Gruber&#8217;s Markdown. When it comes to humane markup languages for the web, I don&#8217;t think anyone&#8217;s quite nailed it like Mr. Gruber. His philosophy was clear from the outset: Markdown is intended to be as easy-to-read and easy-to-write as is feasible. Readability, however, is emphasized above all else. A [...]]]></description>
			<content:encoded><![CDATA[<p>
I&#8217;m a big fan of <a href="http://daringfireball.net/projects/markdown/">John Gruber&#8217;s Markdown</a>. When it comes to humane markup languages for the web, I don&#8217;t think anyone&#8217;s quite nailed it like Mr. Gruber. His philosophy was clear from the outset:</p>
<blockquote><p>
Markdown is intended to be as easy-to-read and easy-to-write as is feasible.</p>
<p>
Readability, however, is emphasized above all else. <b>A Markdown-formatted document should be publishable as-is, as plain text, without looking like it’s been marked up with tags or formatting instructions.</b> While Markdown’s syntax has been influenced by several existing text-to-HTML filters — including Setext, atx, Textile, reStructuredText, Grutatext, and EtText — the single biggest source of inspiration for Markdown’s syntax is the format of plain text email.
</p></blockquote>
<p>
If you&#8217;re an ASCII-head of any kind, you will feel immediately at home in Markdown. It was so obviously designed by someone who has done a <i>lot</i> of writing online, as it apes common plaintext conventions that we&#8217;ve collectively been using for decades now. It&#8217;s certainly <a href="http://www.codinghorror.com/blog/archives/001116.html">far more intuitive than the alternatives I&#8217;ve researched</a>.</p>
<p>
With a year and a half of real world Markdown experience <a href="http://blog.stackoverflow.com/2009/10/markdown-one-year-later/">under our belts</a> on Stack Overflow, we&#8217;ve been quite happy. I&#8217;d say that Markdown is the <i>worst</i> form of markup except for all the other forms of markup that I&#8217;ve tried. Of course, tastes vary, and there are plenty of viable alternatives, but I&#8217;d promote Markdown without hesitation as one of the best &#8212; if not <i>the</i> best &#8212; humane markup options out there.</p>
<p>
Not that Markdown is perfect, mind you. After exposing it to a large audience, both Stack Overflow <a href="http://github.github.com/github-flavored-markdown/">and GitHub</a> independently discovered that Markdown had three particular characteristics that confused a lot of users:</p>
<ol>
<li>URLs are never hyperlinked without placing them in some kind of explicit markup.
<li>The underscore [_] can be used to delimit bold and italic, but also works for intra-word emphasis. While a typical use like &#8220;_italic_&#8221; is clear, there are disturbing and unexpected side effects in phrases such as &#8220;some_file_name&#8221; and &#8220;file_one and file_two&#8221;.
<li>It is paragraph and not line oriented. Returns are not automatically converted to linebreaks. Instead, paragraphs are detected as one or more consecutive lines of text, separated by one or more blank lines.
</ol>
<p>
Items #1 and #2 are so fundamental and universal that I think <b>they deserve to be changed in the Markdown specification itself</b>. There was so much confusion around unexpected intra-word emphasis and the failure to auto-hyperlink URLs that we changed these Markdown rules before we even came out of private beta. Item #3, the conversion of returns to linebreaks, is somewhat more debatable. I&#8217;m on the fence on that one, but I do believe it&#8217;s significant enough to warrant an explicit choice either way. It should be a standard configurable option in every Markdown implementation that you can switch on or off depending on the intended audience.</p>
<p>
Markdown was originally introduced in 2004, and since then it has gained quite a bit of traction on the web. I mean, <a href="http://www.mediawiki.org/wiki/Help:Formatting">it&#8217;s no MediaWiki</a> (thank God), but it&#8217;s in active use on a bunch of websites, some of them <a href="http://www.joelonsoftware.com/items/2009/12/13.html">quite popular</a>. And for such a popular form of markup, it&#8217;s a bit odd that the last official update to the specification and reference implementation was in late 2004.</p>
<p>
Which leads me to the biggest problem with Markdown: <b>John Gruber</b>.</p>
<p>
I don&#8217;t mean this as a personal criticism. John&#8217;s a <a href="http://daringfireball.net/">fantastic writer</a> and Markdown has a (mostly) solid specification, with a strong vision statement. But the fact that there has been no improvement whatsoever to the specification or reference implementation for <i>five years</i> is &hellip; kind of a problem.</p>
<p>
There are some <b>fairly severe bugs</b> in that now-ancient 2004 Markdown 1.0.1 Perl implementation. Bugs that John has already fixed in eight 1.0.2 betas that have somehow never seen the light of day. Sure, if you know the right Google incantations you can <a href="http://six.pairlist.net/pipermail/markdown-discuss/2007-May/000615.html">dig up the unreleased 1.0.2b8 archive</a>, surreptitiously posted May 2007, and start prying out the bugfixes by hand. That&#8217;s what I&#8217;ve had to do to fix bugs in <a href="http://blog.stackoverflow.com/2009/12/introducing-markdownsharp/">our open sourced C# Markdown implementation</a>, which was naturally based on that fateful (and technically <i>only</i>) 1.0.1 release.</p>
<p>
I&#8217;d also expect a reference implementation to come with some <b>basic test suites or sample input/output files</b> so I can tell if I&#8217;ve implemented it correctly. No such luck; the official archives from Gruber&#8217;s site include the naked Perl file along with a readme and license. The word &#8220;test&#8221; does not appear in either. I had to do a ton more searching to finally <a href="http://six.pairlist.net/pipermail/markdown-discuss/2009-February/001526.html">dig up MDTest 1.1</a>. I can&#8217;t quite tell where the tests came from, but they seem to be maintained by Michel Fortin, the author of the <a href="http://michelf.com/projects/php-markdown/">primary PHP Markdown implementation</a>.</p>
<p>
But John Gruber <i>created</i> Markdown. He came up with the concept and the initial implementation. He is, in every sense of the word, <b>the parent of Markdown</b>. It&#8217;s his baby.</p>
<p>
<img src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/d146f_henry-bath.jpg" width="461" height="614" alt="Henry aka 'Rock Hard Awesome' taking a bath" /></p>
<p>
As Markdown&#8217;s &#8220;parent&#8221;, John has a few key responsibilities in shepherding his baby to maturity. Namely, to lead. To set direction. Beyond that initial 2004 push, he&#8217;s done precious little of either.  <b>John is running this particular open source project the way Steve Jobs runs Apple &#8212; by sheer force of individual ego.</b> And that sucks.</p>
<p>
Since then, all I can find is sporadic activity on obscure mailing lists and a bit of <a href="http://six.pairlist.net/pipermail/markdown-discuss/2008-March/001173.html">passive-aggressive interaction with the community</a>.</p>
<blockquote><p>
On 15 Mar 2008, at 02:55, John Gruber wrote: </p>
<blockquote><p>
<i>I despise what you&#8217;ve done with Text::Markdown, which is to more or less make it an alias for MultiMarkdown, almost every part of which I disagree with in terms of syntax additions.</i>
</p></blockquote>
<p>Wow, that&#8217;s pretty strong language. I&#8217;m glad I&#8217;m provoking strong opinions, and it&#8217;s nice to see you actively contributing to Markdown&#8217;s direction <img src='http://www.neurosoftware.ro/programming-blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>
Personally, I don&#8217;t actually like (or use) the MultiMarkdown extensions. As noted several times on list, I <i>do not</i> consider what I&#8217;ve done to in any way be a good solution technically / internally in it&#8217;s current form, and as such<br />
Markdown.pl is still a better &#8216;reference&#8217; implementation.</p>
<p>
However I find it somewhat ironic that you can criticise an active effort to actually move Markdown forwards (who&#8217;s current flaws have been publicly acknowledged), when it passes more of your test suite than your effort does, and when you haven&#8217;t even been bothered to update your own website about the project since 2004, despite having updated the code which can be found on your site (if you dig) much more recently than this. </p>
<p>
I despise copy-pasted code, and forks for no (real) reason &#8211; seeing <i>another two</i> dead copies of the same code on CPAN made me sad, and so I&#8217;ve done <i>something</i> to take the situation forwards. <b>Maybe if you&#8217;d put the effort into maintaining a community and taking Markdown.pl forwards at any time within the last 4 years, you wouldn&#8217;t be in a situation where people have taken &#8216;your baby&#8217; and perverted it to a point that you despise.</b> If starting with Markdown.pl and going forwards with that <i>had been an option</i>, then that would have been my preferred route &#8211; but I didn&#8217;t see any value in producing what would have been a fifth perl Markdown implementation.
</p></blockquote>
<p>
It&#8217;s almost at the point where John Gruber, the very person who brought us Markdown, is the biggest obstacle preventing Markdown from moving forward and maturing. It saddens me greatly to see such negligent open source code parenting. Why work against the community when you can work with it? It doesn&#8217;t have to be this way. And it shouldn&#8217;t be. </p>
<p>
I think the most fundamental problem with Markdown, in retrospect, is that the official home of the project is <b>a static set of web pages on John&#8217;s site</b>. Gruber could have hosted the Markdown project in a way that&#8217;s more amenable to open source collaboration than a bunch of static HTML. I&#8217;m pretty sure SourceForge was around in late 2004, and there are lots of options for proper open source project hosting today &#8212; GitHub, Google Code, CodePlex, and so forth. What&#8217;s stopping him from setting up shop on any of those sites with Markdown, right now, today? Markdown is Gruber&#8217;s baby, without a doubt, but it&#8217;s also bigger than any one person. It&#8217;s open source. It belongs to the community, too.</p>
<p>
Right now we have the worst of both worlds. Lack of leadership from the top, and a bunch of fragmented, poorly coordinated community efforts to advance Markdown, <i>none</i> of which are officially canon. This isn&#8217;t merely incovenient for anyone trying to find accurate information about Markdown; it&#8217;s actually harming the project&#8217;s future. <b>Maybe it&#8217;s true that you can&#8217;t kill an open source project, but bad parenting is surely enough to cause it to grow up stunted and maybe even a little maladjusted.</b></p>
<p>
I mean no disrespect. I wouldn&#8217;t bring this up if I didn&#8217;t care, if I didn&#8217;t think the project and John Gruber were both eminently worthy. Markdown is a small but important part of the open source fabric of the web, and the project deserves better stewardship. While the community can do a lot with the (many) open source orphan code babies out there, they have a much, much brighter future when their parents take responsibility for them.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">JIRA 4</a> &#8211; Simplify issue tracking for everyone involved. <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">Get started</a> from $10 for 10 users.
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/responsible-open-source-code-parenting/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Building a PC, Part VI: Rebuilding</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/building-a-pc-part-vi-rebuilding/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/building-a-pc-part-vi-rebuilding/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 05:30:12 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[building a pc]]></category>
		<category><![CDATA[building your own pc]]></category>
		<category><![CDATA[cave dwelling]]></category>
		<category><![CDATA[Core]]></category>
		<category><![CDATA[CPU]]></category>
		<category><![CDATA[Don]]></category>
		<category><![CDATA[endless battles]]></category>
		<category><![CDATA[Intel]]></category>
		<category><![CDATA[Kingston]]></category>
		<category><![CDATA[Loyd]]></category>
		<category><![CDATA[Loyd Case]]></category>
		<category><![CDATA[Mac Pro]]></category>
		<category><![CDATA[memory]]></category>
		<category><![CDATA[motherboard]]></category>
		<category><![CDATA[overzealous developers]]></category>
		<category><![CDATA[PC. Take]]></category>
		<category><![CDATA[PC. This]]></category>
		<category><![CDATA[Tom]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/building-a-pc-part-vi-rebuilding/</guid>
		<description><![CDATA[I can&#8217;t believe it&#8217;s been almost two and a half years since I built my last PC. I originally documented that process in a series of posts: Building a PC, Part I: Minimal boot Building a PC, Part II: Burn in Building a PC, Part III: Overclocking Building a PC, Part IV: Now It&#8217;s Your [...]]]></description>
			<content:encoded><![CDATA[<p>I can&#8217;t believe it&#8217;s been almost <b>two and a half years since I built my last PC</b>. I originally documented that process in a series of posts:</p>
<ul>
<li><a href="http://www.codinghorror.com/blog/archives/000905.html">Building a PC, Part I: Minimal boot</a>
<li><a href="http://www.codinghorror.com/blog/archives/000907.html">Building a PC, Part II: Burn in</a>
<li><a href="http://www.codinghorror.com/blog/archives/000908.html">Building a PC, Part III: Overclocking</a>
<li><a href="http://www.codinghorror.com/blog/archives/000918.html">Building a PC, Part IV: Now It&#8217;s Your Turn</a>
<li><a href="http://www.codinghorror.com/blog/archives/001102.html">Building a PC, Part V: Upgrading</a>
</ul>
<p>
Now, lest you think I am some kind of freakish, cave-dwelling luddite, what with my <i>ancient</i> two and a half year old PC, I have <a href="http://www.codinghorror.com/blog/archives/001102.html">upgraded the CPU</a>, <a href="http://www.codinghorror.com/blog/archives/001304.html">upgraded the hard drive</a>, and <a href="http://www.codinghorror.com/blog/archives/001185.html">upgraded the video card</a> since then. I also went from 4 GB of RAM to 8 GB of RAM, but I didn&#8217;t happen to blog about that. Normal computers age in dog years &#8212; every year they get seven years older &#8212; but mine isn&#8217;t so bad with all my upgrades! I swear!</p>
<p>
Judge for yourself; here&#8217;s a picture of it.</p>
<p>
<img src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/be373_digital-vt100-terminal.jpg" width="540" height="542" alt="digital VT-100 terminal" /></p>
<p>
But seriously.</p>
<p>
A big part of the value proposition of building your own PC is <b>upgrading it in pieces and parts over time.</b> When you&#8217;re unafraid to pop the cover off and get your hands dirty with a little upgrading, you can spend a lot less to stay near the top of the performance heap over time. It&#8217;s like the argument for buying a car versus renting it; the smart buyers keep the car for as long as possible to maximize the value of their investment. That&#8217;s what we&#8217;re doing here with our upgrades, and a rebuild is the ultimate upgrade.</p>
<p>
In defense of my creaky old computer, the Core 2 series from Intel has been unusually strong over time, one of their best overall platforms in recent memory. It was <i>almost</i> good enough to banish the excerable Pentium 4 series from my mind. Man <a href="http://www.codinghorror.com/blog/archives/000867.html">those were horrible</a>! But the Core 2 series was a solid design with some serious legs; it and scaled brilliantly, from single to dual to quad core, and in frequency from 1 GHz to 3.5 GHz.</p>
<p>
I was initially unimpressed with the new Core i7 architecture that Intel launched to replace the Core 2. While <a href="http://www.anandtech.com/weblog/showpost.aspx?i=532">the new Nehalem architecture is a <i>huge</i> win on servers</a>, it&#8217;s kind of &#8220;meh&#8221; on the desktop. I have endless battles with overzealous developers who swear up and down that they <a href="http://www.codinghorror.com/blog/archives/000335.html">use their desktops like servers</a>. Sure you do! And you&#8217;re <a href="http://www.codinghorror.com/blog/archives/000113.html">building the space shuttle</a> with it, right? Of course you are. Yeah.</p>
<p>
Meanwhile, back on Planet Desktop, there were some other reasons that I started thinking seriously about upgrading from my <a href="http://www.codinghorror.com/blog/archives/001102.html">overclocked Core 2 Duo</a> to a Core i7 upgrade:</p>
<ul>
<li>The Core i7 platform uses <b>triple channel DDR3 memory</b>. While the benefits of the additional bandwidth are somewhat debatable on the desktop (as usual), one interesting side-effect is that motherboards have 6 memory slots. While 16 GB is theoretically possible on Core 2 systems, it required extremely expensive 8 GB DIMMs. But with 6 memory slots, we can achieve 12 GB without breaking the bank &#8212; by using <b>six 2 GB DIMMs</b>.
<li>The Core i7 is <b>Intel&#8217;s first &#8220;real&#8221; quad-core architecture</b>. Intel&#8217;s previous quad core CPUs were basically two dual core CPUs duct taped together on the same die. No such shortcuts were taken with the i7. While the difference is sort of academic, there are some smallish real world performance implications.
<li>Mainstream <b>software is finally ready for quad core CPUs</b>. It&#8217;s not uncommon today to find applications and games that can actually use two CPU cores reasonably effectively, and those that can use four or more cores are not the extreme rarity they used to be. Don&#8217;t get me wrong, scaling well to four or more CPU cores is still rare, but it&#8217;s no longer spit-take rare.
<li>Intel introduced the <b>mainstream second generation Core i5</b> series, so the platform is fairly mature. All the new architecture bugs are worked out. It&#8217;s also less prohibitively expensive than it was when it was when it was introduced.
</ul>
<p>
At this point, I had the seven year upgrade itch really bad. My 3.8 GHz Core 2 Duo with 8 GB of RAM was not exactly chopped liver, but I started fantasizing a lot about the prospect of having a next generation quad-core CPU (of similar clock speed) with hyperthreading and 12 GB of RAM.</p>
<p>
If you&#8217;re wondering why I need this, or why in fact <i>anyone</i> would need such an embarrassment of desktop power, then I&#8217;ll <a href="http://www.maximumpc.com/article/columns/hard_case_looking_forward_2010">refer you to my friend Loyd Case</a>.</p>
<blockquote><p>
Don’t ask me why I need six cores and 24GB. To paraphrase a Zen master, <b>if you have to ask, you do not know.</b>
</p></blockquote>
<p>
Loyd has indirectly brought up another reason to choose the i7 platform; it&#8217;s pin-compatible with Intel&#8217;s upcoming &#8220;Gulftown&#8221; high end 6-core CPU. So, your upgrade path is clear. (It&#8217;s also rumored that the next iteration of the Mac Pro will have two of these brand new 6-core CPUs, before any other vendor gets access to them, which is totally plausible.)</p>
<p>
As far as I&#8217;m concerned, <b>until everything on my computer happens instantaneously, my computer <i>is not nearly fast enough</i></b>. Besides, relative to how much my time costs, these little $200-$500 upgrades to get amazing performance are freakin&#8217; chump change. If I save a measly 15 minutes a day, it&#8217;s worth it. As I like to remind pointy-haired managers all over the world, <a href="http://www.codinghorror.com/blog/archives/001198.html">Hardware is Cheap, and Programmers are Expensive</a>. OK, maybe I&#8217;m biased, but the conclusion was overwhemingly clear: it&#8217;s UPGRAYEDD time!</p>
<p>
<a href="http://en.wikipedia.org/wiki/Idiocracy"><img src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/0baed_upgrayedd.jpg" width="468" height="308" alt="the character Upgrayedd, from the movie Idiocracy" border="0" /></a></p>
<p>
This is a more than an upgrade, though, it&#8217;s a <b>rebuild</b> &#8212; a platform upgrade. That means I&#8217;ll be assembling the following &hellip;</p>
<ul>
<li>new Motherboard
<li>new RAM
<li>new CPU
<li>new heatsink
</ul>
<p>
&hellip; and dropping that into my existing system, which is <a href="http://www.codinghorror.com/blog/archives/000665.html">highly optimized for silence</a>. The case, power supply, hard drives, DVD-R, etc won&#8217;t change. On the outside, it&#8217;ll look the same, but on the inside, it&#8217;s a whole new PC. This is analogous to replacing the engine in a sports car, I suppose. On the outside, it will appear to be the same car, but there&#8217;s a lot more horses under the hood.</p>
<p>
As I said in <a href="http://www.codinghorror.com/blog/archives/000905.html">the first part of my building your own PC series</a>, if <b>you can assemble a LEGO kit, you can build a PC</b>.</p>
<p>
Take your time, be careful, and go in the right order. So, first things first. Let&#8217;s assemble the CPU, heatsink, and memory on the motherboard &#8212; in that specific sequence, because modern heatsinks can be a pain to attach.</p>
<p>
<img src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/94ad4_rebuild-assembled-motherboard.jpg" width="522" height="666" alt="motherboard, CPU, heatsink, and memory assembled for the rebuild" border="0" /></p>
<p>
Man, check out at all that hot, sweet, PC hardware! I get a little residual thrill just cropping the picture. Love this stuff! Anyway, that gives us a mountable motherboard with all the important bits pre-installed:</p>
<ul>
<li><a href="http://www.jdoqocy.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16813157163%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Motherboards%2B-%2BIntel-_-ASRock-_-13157163&amp;cjsku=N82E16813157163">ASRock X58 Extreme motherboard</a> ($169)<br />
Inexpensive, has all the essential features I care about, and <a href="http://www.tomshardware.com/reviews/asrock-x58-supercomputer,2275-5.html">is recommended by Tom&#8217;s Hardware</a>. I&#8217;m not into fancy, spendy motherboards; I think they&#8217;re a ridiculous waste of money.</p>
<li><a href="http://www.jdoqocy.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16835233003%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-CPU%2BCooling-_-XIGMATEK-_-35233003&amp;cjsku=N82E16835233003">XIGMATEK HDT-S1283 cooler</a> ($35).<br />
Direct contact between the CPU cooler heatpipes and the CPU surface is the new hotness, or rather, coolness. It really works, since <a href="http://www.frostytech.com/top5heatsinks.cfm">all the top performing CPU coolers</a> use it now. This one is fairly inexpensive at $35 and gets <a href="http://www.frostytech.com/articleview.cfm?articleid=2233&amp;page=5">great reviews</a>. Also, I highly recommend <a href="http://www.anrdoezrs.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16835233027%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-CPU%2BCooling-_-XIGMATEK-_-35233027&amp;cjsku=N82E16835233027">the optional screw mount kit</a> ($8). Modern CPU coolers are large, and the mounting mechanism needs to be more solid than plastic pushpins.</p>
<li><a href="http://www.tkqlhce.com/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16820104161%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Memory%2B%28Desktop%2BMemory%29-_-Kingston%2BHyperX-_-20104161&amp;cjsku=N82E16820104161">Kingston HyperX 4GB (2 x 2GB) DDR3 2000</a> ($135) &times; 3<br />
I&#8217;ve had good luck with Kingston in the past. I went with their semi-premium brand this time, as I plan to do a bit of overclocking and the price difference is fairly small. Remember, this is a 12 GB build, so we&#8217;ll need three of these kits to populate all 6 memory slots on the motherboard.</p>
<li><a href="http://www.anrdoezrs.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16819115216%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Processors%2B-%2BDesktops-_-Intel-_-19115216&amp;cjsku=N82E16819115216">Intel Core i7-960 3.2 GHz CPU</a> ($590)<br />
While you could make a very solid argument that the <a href="http://www.anrdoezrs.net/click-2338938-10440897?url=http%3A%2F%2Fwww.newegg.com%2FProduct%2FProduct.aspx%3FItem%3DN82E16819115202%26nm_mc%3DAFC-C8Junction%26cm_mmc%3DAFC-C8Junction-_-Processors%2B-%2BDesktops-_-Intel-_-19115202&amp;cjsku=N82E16819115202">Core i7-920 CPU</a> ($289) is a better choice because it&#8217;s identical and overclocks to the same level, I was willing to spend a bit more here as &#8220;insurance&#8221; that I get to the magical 3.8 Ghz level that my old Core 2 Duo was overclocked to.
</ul>
<p>
It adds up to about <b>$1000</b> all told. A rebuild is definitely more expensive than one-off upgrades of CPU, memory, and hard drive. But, remember, this is a <i>rebuild</i> of my PC &#8212; and a fire-breathing, top of the line performance rebuild at that. That takes spending a moderate (but not exorbitant) amount of money.</p>
<p>
Now that we&#8217;ve got all that stuff assembled, the next thing to do is open my existing PC, disconnect all the cables going to the motherboard, temporarily remove any expansion cards, unscrew the motherboard and lift it out.</p>
<p>
<img src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/7d9ec_rebuild-pc-internals.jpg" width="650" height="548" alt="old PC with motherboard assembly in place" border="0" /></p>
<p>
Once the old motherboard assembly was pulled out, I plopped in the new motherboard, screwed it down, and reattached the cables and expansion cards. <i>Don&#8217;t</i> close up the PC at this point, though. Before powering it on, <b>double check and make sure all the cables are reattached correctly</b>:</p>
<ul>
<li>Power cables from the PSU to the motherboard. There are usually at least two, on modern PCs.
<li>Hard drive cables from the HDDs to the motherboard.
<li>Power switch, Reset switch, Activity light cables. Without the power switch connected, good luck powering up. This motherboard happens to have built-in power and reset switches for testing, but most don&#8217;t.
<li>Fan connectors from the Heatsink and case fans to the motherboard.
<li>Power cables from the PSU to the video card, if you have a fancy video card.
</ul>
<p>
If anything is wrong, we&#8217;ll just have to re-open the case again. On top of that, we need to monitor temperatures and airflow, and that&#8217;s much easier with the case open.</p>
<p>
Fortunately, my rebuild booted up on the first try. If you&#8217;re not so lucky, don&#8217;t fret! Disconnect the power cord, then go back and re-check everything. I get it wrong, sometimes, too; I actually forgot to reconnect the video card power connectors, and was wondering why only the secondary video card was booting up. Once I re-checked, I immediately saw my mistake, fixed it, and rebooted.</p>
<p>
Once you have a successful boot, don&#8217;t even <i>think</i> about booting into the operating system yet. Enter the BIOS (this is typically done by pressing F12 or Delete during bootup) and check the BIOS screens to make sure it&#8217;s detecting your hard drives, memory, and any optical drives successfully. Browse around and do some basic reality checks. Then do not pass GO, do not collect $200, go <i>straight</i> to your motherboard manufacturer&#8217;s website and <b>download the latest BIOS</b>. On another computer, obviously. Most modern motherboards allow updating the BIOS from a USB key, so just copy the BIOS files on the USB key, reboot, and use the BIOS menus to update. After you&#8217;ve updated the BIOS, set BIOS options to taste, and we&#8217;re finally ready to boot into an operating system.</p>
<p>
While this may <i>sound</i> like a lot of work, it really isn&#8217;t. All told it was maybe an hour, tops. I&#8217;m fairly experienced at this stuff, but it&#8217;s fundamentally not that complicated; it&#8217;s still just a very fancy adult LEGO kit.</p>
<p>
<b>Courtesy of this $1000 rebuild, my ancient 2.5 year old PC is reborn as a completely new state-of-the-art PC</b>, at least internally. That was always part of the plan! Next up &#8212; once we&#8217;ve proven that it&#8217;s stable in typical use &#8212; overclocking, naturally. I&#8217;ll have more on that in a future blog post, but I can tell you right now that Core i7 overclocking is &hellip; <i>interesting</i>.<br />
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/building-a-pc-part-vi-rebuilding/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>International Backup Awareness Day</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/international-backup-awareness-day/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/international-backup-awareness-day/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 00:09:27 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[api hooks]]></category>
		<category><![CDATA[aren]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Drive]]></category>
		<category><![CDATA[fin]]></category>
		<category><![CDATA[hard drive failure]]></category>
		<category><![CDATA[Heck]]></category>
		<category><![CDATA[Horror]]></category>
		<category><![CDATA[raid array]]></category>
		<category><![CDATA[raid arrays]]></category>
		<category><![CDATA[Rich]]></category>
		<category><![CDATA[rich skrenta]]></category>
		<category><![CDATA[Rock Hard]]></category>
		<category><![CDATA[stack overflow]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/international-backup-awareness-day/</guid>
		<description><![CDATA[You may notice that commenting is currently disabled, and many old Coding Horror posts are missing images. That&#8217;s because, sometime early on Friday, the server this blog is hosted on suffered catastrophic data loss. Here&#8217;s what happened: The server experienced routine hard drive failure. Because of the hard drive failure, the virtual machine image hosting [...]]]></description>
			<content:encoded><![CDATA[<p>
You may notice that commenting is currently disabled, and many old Coding Horror posts are missing images. That&#8217;s because, sometime early on Friday, <b>the server this blog is hosted on suffered catastrophic data loss</b>.</p>
<p>
Here&#8217;s what happened:</p>
<ol>
<li>The server experienced routine hard drive failure.
<li>Because of the hard drive failure, the virtual machine image hosting this blog was corrupted.
<li>Because the blog was hosted in a virtual machine, the standard daily backup procedures at the host were unable to ever back it up.
<li>Because I am an idiot, I didn&#8217;t have my own (recent) backups of Coding Horror. Man, I wish I had <a href="http://www.codinghorror.com/blog/archives/001045.html">read some good blog entries on backup strategies!</a>
<li>Because there were no good backups, there was catastrophic data loss. Fin, draw curtain, exeunt stage left.
</ol>
<p>
At first, I was upset with our provider, <a href="http://crystaltech.com/dedicated-windows.aspx?uid=101">CrystalTech</a>.</p>
<p>
<img src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/eabb2_our-disaster-recovery-plan.png" alt="Our Disaster Recovery Plan Goes Something Like THis" width="475" height="421" /></p>
<p>
I am still confused how the most common, routine, predictable, and mundane of server hardware failures &#8212; losing a mechanical hard drive &#8212; could cause such extreme data loss carnage. What about, oh, I don&#8217;t know, <a href="http://www.codinghorror.com/blog/archives/001233.html">a RAID array</a>? Aren&#8217;t they <i>designed</i> to prevent this kind of single point of failure drive loss catastrophe? Isn&#8217;t a multi drive RAID array sort of standard on datacenter servers? I know we have multi-drive RAID arrays are on <a href="http://blog.stackoverflow.com/2009/12/stack-overflow-rack-glamour-shots/">all of our Stack Overflow servers</a>.</p>
<p>
I also wish their routine backup procedures had greater awareness of virtual machine images. While I&#8217;ll grant you that backing up a live virtual machine is somewhat complex, and typically requires <a href="http://technet.microsoft.com/en-us/library/cc720377%28WS.10%29.aspx">special operating system support and API hooks</a>, it is not exactly an unknown science at this point in time. Heck, At the very least, just let us know when the backup has been regularly failing each day, every day, for <i>years</i>.</p>
<p>
Then I belatedly realized that this was, after all, <i>my</i> data. And <b>it is irresponsible of me to leave the fate of my data entirely in someone else&#8217;s hands</b>, regardless of how reliable they may or may not be. Responsibility for my data begins with me. If I haven&#8217;t taken appropriate measures, who am I to cast aspersions on others for not doing the same? Glass houses and all that.</p>
<p>
So, I absolve <a href="http://crystaltech.com/dedicated-windows.aspx?uid=101">CrystalTech</a> of all responsibility in this matter. They&#8217;ve given us a great deal on our dedicated server, and performance and reliability (with one recent, uh&#8230; exception) have been excellent to date. <b>It is completely my fault that I neglected to have proper backups in place for Coding Horror.</b> Well, technically, I did have a backup but it was on the virtual machine itself. Does that count? No? Halfsies?</p>
<p>
Apparently, I was <i>gambling</i> that nothing bad would ever happen at the datacenter. Because that&#8217;s what you&#8217;re doing when you run without your own backups. <b>Gambling.</b></p>
<p>
<a href="http://www.amazon.com/dp/B000TE38VA/?tag=codinghorror-20"><img src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/e8221_kenny-rogers-the-gambler.jpg" alt="you gotta know when to hold 'em" width="500" height="500" border="0" /></a></p>
<p>
I&#8217;ll add gambling to the long, long list of things I suck at.</p>
<p>
Now that I&#8217;ve apologized, it&#8217;s time to let the healing begin. And by healing, I mean <b>the excruciatingly painful process of reconstructing Coding Horror from internet caches and the few meager offsite backups I do have</b>. My first order of business was to ask on SuperUser what strategies people recommend for <a href="http://superuser.com/questions/82036/recovering-a-lost-website-with-no-backup">recovering a lost website with no backup</a>. Strategies other than berating me for my obvious mistake.  Also, comments are currently disabled while the site is being reconstructed from static HTML. Oh, <i>darn!</i></p>
<p>
I&#8217;ll let my son <a href="http://twitter.com/rockhardawesome">Rock Hard Awesome</a> stand in for the zinger of a comment that I know some of you were <i>just dying</i> to leave.</p>
<p>
<a href="http://twitter.com/rockhardawesome"><img src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/62afc_i-am-liveblogging-your-fail.jpg" width="600" height="450" alt="I am liveblogging your fail" border="0" /></a></p>
<p>
I&#8217;m not saying I don&#8217;t deserve it. Consider me totally zingatized.</p>
<p>
I mentioned my woes on <a href="http://twitter.com/codinghorror">Twitter</a> and I was humbled by the outpouring of community support. Thanks to everyone who reached out with support of any kind. It is greatly appreciated.</p>
<p>
I was able to get a static HTML version of Coding Horror up almost immediately thanks to Rich Skrenta of <a href="http://blekko.com">blekko.com</a>. He kindly provided a tarball of every spidered page on the site. Some people have goals, and some people have <i><a href="http://www.skrenta.com/2008/03/who_will_stop_google_from_goin.html">big hairy audacious goals</a></i>. Rich&#8217;s is especially awe-inspiring: taking on Google on their home turf of search. That&#8217;s why he just happened to have a complete text archive of Coding Horror at hand. Rich, <a href="http://www.youtube.com/watch?v=oiS8YokFzeY">have I ever told you that you&#8217;re my hero?</a> Anyway, you&#8217;re viewing the static HTML version of Coding Horror right now thanks to Rich. Surprisingly, there&#8217;s not a tremendous amount of difference between a static HTML version of this site and the live site. One of the benefits of being a minimalist, I suppose.</p>
<p>
That pretty much solved all my text post recovery problems in one fell swoop. Through this process, I&#8217;ve learned that anything even remotely popular you put on the web will be archived as text, forever, by a dozen different web spiders. <b>I don&#8217;t think you can actually <i>lose</i> text you post on the web.</b> Not in any meaningful sense; I&#8217;m not sure it&#8217;s possible. As long as you&#8217;re willing to spend the time digging through web spider archives in some form (and yes, I did cheat mightily), you can always get textual content back, all of it.</p>
<p>
The blog <i>images</i>, however, are another matter entirely. I have learned the hard way that <b>there are almost no organizations spidering and storing images on the web</b>. Yes, there is <a href="http://www.archive.org/web/web.php">archive.org</a>, and God bless &#8216;em for that. But they have an impossible job they&#8217;re trying to do with limited resources. Beyond that, there&#8217;s &#8230; well, frankly, a whole lot of nothing. A desperate, depressing void of nothing. In fact, if you can only back up one thing on your public website, <b>it should be the images.</b> Because that&#8217;s the thing you&#8217;ll have the most difficulty recovering when catastrophe happens. I&#8217;m planning to donate $100 to archive.org, as I have a whole new appreciation for how rare an internet-wide full archive service &#8212; one that includes images &#8212; really is.</p>
<p>
That said, There are some limited, painful avenues to explore for recovering lost website images. I started with an ancient complete backup from mid 2006 with full images. And then Maciej Ceglowski of the nifty full-archive bookmarking service <a href="http://pinboard.in/">pinboard.in</a> generously contributed about 200 blog posts that he had images for.</p>
<p>
I also went through a period when <a href="http://www.codinghorror.com/blog/archives/000807.html">I was going on a bandwidth diet</a> and experimenting with hosting Coding Horror images elsewhere on the web. I&#8217;m slowly going through and recovering images locally from there. Beyond that, several avid Coding Horror readers contributed some archived images &#8212; so thanks to Yasushi Aoki, Marcin Gołębiowski, Peter Mortensen, and anybody else I&#8217;ve forgotten.</p>
<p>
Also, I should point out that a few enterprising programmers have proposed clever schemes for automatic recovery of images, such as Niyaz with his blog post <a href="http://www.diovo.com/2009/12/getting-cached-images-in-your-website-from-the-visitors/">Get cached images from your visitors</a>, and <a href="http://arstechnica.com/staff/fatbits/">John Siracusa</a> with his <a href="http://superuser.com/questions/82036/recovering-a-lost-website-with-no-backup/82060#82060">highly voted 304 idea</a>. I haven&#8217;t had time to follow up on these yet but they seem plausible to me.</p>
<p>
I&#8217;ve restored all the images I have so far, but it&#8217;s still woefully incomplete. The most important part of Coding Horror is definitely the text of the posts, but I do have some regrets that I&#8217;ve lost key images from many blog posts, including those about <a href="http://www.codinghorror.com/blog/archives/001242.html">my son</a>. It feels like irresponsible parenting, in the broadest possible sense of the words.</p>
<p>
The process of image recovery is still ongoing. <b>If you&#8217;d like to contribute lost Coding Horror images, please do.</b> I&#8217;d be more than happy to mail stickers on my dime to anyone who contributes an image that is currently a 404 on the site.</p>
<p>
What can we all learn from this sad turn of events?</p>
<ol>
<li>I suck.
<li>No, really, I suck.
<li>Don&#8217;t rely on your host or anyone else to back up your important data. Do it yourself. If you aren&#8217;t <i>personally</i> responsible for your own backups, <b>they are effectively not happening.</b>
<li>If something really bad happens to your data, how would you recover? What&#8217;s the process? What are the hard parts of recovery? I think in the back of my mind I had false confidence about Coding Horror recovery scenarios because I kept thinking of it as mostly text. Of course, the text turned out to be the <i>easiest</i> part. The images, which I had thought of as a &#8220;nice to have&#8221;, were more essential than I realized and far more difficult to recover. Some argue that <a href="http://www.joelonsoftware.com/items/2009/12/14.html">we shouldn&#8217;t be talking about &#8220;backups&#8221;</a>, but recovery.
<li>It&#8217;s worth revisiting your recovery process periodically to make sure it&#8217;s still alive, kicking, and fully functional.
<li>I&#8217;m awesome! No, just kidding. I suck.
</ol>
<p>
So when, exactly, is International Backup Awareness Day? Today. Yesterday. This week. This month. This year. It&#8217;s a trick question. <b><i>Every</i> day is International Backup Awareness Day</b>. And the sooner I figure that out, the better off I&#8217;ll be.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">JIRA 4</a> &#8211; Simplify issue tracking for everyone involved. <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">Get started</a> from $10 for 10 users.
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/international-backup-awareness-day/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Microformats: Boon or Bane?</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/microformats-boon-or-bane/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/microformats-boon-or-bane/#comments</comments>
		<pubDate>Thu, 10 Dec 2009 12:27:11 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[crappy html]]></category>
		<category><![CDATA[div]]></category>
		<category><![CDATA[elevator pitch]]></category>
		<category><![CDATA[hResume]]></category>
		<category><![CDATA[human resource departments]]></category>
		<category><![CDATA[Iowa]]></category>
		<category><![CDATA[microformat]]></category>
		<category><![CDATA[public cvs]]></category>
		<category><![CDATA[span]]></category>
		<category><![CDATA[stack overflow]]></category>
		<category><![CDATA[USA]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/microformats-boon-or-bane/</guid>
		<description><![CDATA[I recently added microformat support to the free public CVs at careers.stackoverflow.com by popular demand. Designed for humans first and machines second, microformats are a set of simple, open data formats built upon existing and widely adopted standards. The official microformat &#8220;elevator pitch&#8221; tells us nothing useful. That&#8217;s not a good sign. It doesn&#8217;t get [...]]]></description>
			<content:encoded><![CDATA[<p>
I recently added <a href="http://en.wikipedia.org/wiki/Microformat">microformat</a> support to the free public CVs at <a href="http://careers.stackoverflow.com/">careers.stackoverflow.com</a> by popular demand.</p>
<blockquote><p>
Designed for humans first and machines second, <b>microformats are a set of simple, open data formats built upon existing and widely adopted standards</b>.
</p></blockquote>
<p>
The <a href="http://microformats.org/">official</a> microformat <a href="http://www.codinghorror.com/blog/archives/000962.html">&#8220;elevator pitch&#8221;</a> tells us nothing useful. That&#8217;s not a good sign. It doesn&#8217;t get much better on the <a href="http://microformats.org/about">learn more</a> link, either.</p>
<p>
I&#8217;m left scratching my head, wondering <b>why I should care</b>. What problem, exactly, do microformats solve for me as a user? As a software developer? There&#8217;s lots of hand-wavy talk about <i>data</i>, but precious little in the way of concrete stories or real world examples.</p>
<p>
But I have a real world example: a CV. To some human resource departments the standard web interchange format for a CV or Resume is already established &#8212; it&#8217;s called &#8220;Microsoft Word&#8221;. I have no beef with Word, but certainly we&#8217;d like to pick a more <b>simple, open data format</b> for our personal data than Microsoft Word &#8212; and the <a href="http://en.wikipedia.org/wiki/HResume">hResume</a> microformat seems to fit the bill. And if your CV is published on the web in a standard(ish) format, it&#8217;s easier to take it with you wherever you need to go. </p>
<p>
I had already implemented the <a href="http://microformats.org/wiki/rel-tag">tag</a> and <a href="http://microformats.org/wiki/rel-me">identity</a> microformats on Stack Overflow many months ago. I wasn&#8217;t convinced of the benefits, but the implementation was so easy that it seemed like more work to argue the point than to actually <i>get it done</i>. Judge for yourself:</p>
<p><pre>
&lt;a href="http://www.codinghorror.com/" rel="me"&gt;codinghorror.com&lt;/a&gt;
&lt;a href="/questions/tagged/captcha" rel="tag"&gt;captcha&lt;/a&gt;
</pre>
<p>
Fairly clean and simple, right? That was the extent of my experience with microformats. Limited, but positive. Then I read through the <a href="http://microformats.org/wiki/hresume">hResume microformat spec</a>. You should read it too. Go ahead. I&#8217;ll wait here.</p>
<p>
My first impression was not positive, to put it mildly. So you want me to <b>take the ambiguous, crappy &#8220;HTML&#8221; markup we already have and layer some ambiguous, crappy &#8220;microformat&#8221; markup on <i>top</i> of it?</b> And that&#8217;s &hellip; a solution? If that&#8217;s what microformats are going to be about, I think I might want off the microbus.</p>
<p>
Let&#8217;s take a look at a representative slice of hResume markup:</p>
<p><pre>
&lt;div class="vcard"&gt;
  &lt;a class="fn org url" href="http://example.com/"&gt;Example&lt;/a&gt;
  &lt;div class="adr"&gt;
    &lt;span class="type"&gt;Work&lt;/span&gt;:
    &lt;div class="street-address"&gt;169 Maple Ave&lt;/div&gt;
    &lt;span class="locality"&gt;Anytown&lt;/span&gt;,
    &lt;abbr class="region" title="Iowa"&gt;IA&lt;/abbr&gt;
    &lt;span class="postal-code"&gt;50981&lt;/span&gt;
    &lt;div class="country-name"&gt;USA&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
</pre>
<p>
As you can see, <b>the crux of microformats is overloading CSS classes</b>. When you give something the &#8220;adr&#8221; class within the &#8220;vcard&#8221; class, that means it&#8217;s the address data field within the hCard, within the hResume.</p>
<p>
While I can see the attraction, this approach makes me uneasy:</p>
<ol>
<li><b>We&#8217;re overloading the class attribute with two meanings.</b> Is &#8220;adr&#8221; the name of a class that contains styling information, or the name of a data field? Or both? It&#8217;s impossible to tell. The minute you introduce a microformat into your HTML, the semantics of the class attribute have been permanently altered.
<li><b>The microformat css class names may overlap with existing css classes</b>. Woe betide the poor developer who has to retrofit a microformat on an established site where &#8220;locality&#8221; or &#8220;region&#8221; have already been defined in the CSS and are associated with elements all over the site. And let me tell you, many of the microformat css field names are, uh, <i>conveniently</i> named what you&#8217;ve probably already used in your HTML somewhere. In the wrong way, inevitably.
<li><b>There&#8217;s no visual indication whatsoever that any given css class is a microformat</b>. If you hire a new developer, how can they possibly be expected to know that &#8220;postal-code&#8221; isn&#8217;t just an arbitrarily chosen CSS class name, it&#8217;s a gosh darned officially blessed <i>microformat</i>? What if they decide they don&#8217;t like dashes in CSS class names and rename the style &#8220;postalcode&#8221;? Wave bye bye to your valid microformat. If it seems fragile and obtuse, that&#8217;s because it is.
<li><b>The spec is <i>incredibly</i> ambiguous</b>. I read through the hResume, hCard, and hCalendar spec multiple times, checked all the samples, viewed source on existing sites, used all the <a href="http://ufxtract.com/">validators</a> I could find, and I <i>still</i> got huge swaths of the format wrong! For a &#8220;simple&#8221; and &#8220;easy&#8221; format, it&#8217;s &hellip; anything but, in my experience. The specification is full of ambiguities and requires a lot of interpretation to even get close. I&#8217;m not the <a href="http://www.codinghorror.com/blog/archives/000051.html">world&#8217;s best developer</a>, but I&#8217;m theoretically competent, and if I can&#8217;t implement hResume without wanting to cut myself and/or writing snarky blog posts like this, how can we expect everyone else to?
<li><b>It doesn&#8217;t handle unstructured data well</b>. On Stack Overflow, we have a single &#8220;location&#8221; field. No city, state, zip, lat, long, and all that jazz: just an unstructured, freeform, enter-whatever-pleases-you &#8220;location&#8221; field. This was awkward to map in hCard, which practically <i>demands</i> that addresses be chopped up into meticulous little sub-fields. This is a bit ironic for a format supposedly designed to work with the loose, unstructured world wide web. Oh, and this goes double for dates. If you don&#8217;t have an ISO datetime value, good luck.
</ol>
<p>
Maybe I have a particular aversion to getting my chocolate data structure mixed up with my peanut butter layout structure, but it totally skeeves me out that the microformat folks actually <i>want</i> us to design our CSS and HTML around these specific, ambiguous and non-namespaced microformat CSS class names. It feels like a hacky overload. While you could argue this is no different than the web and HTML in general &#8212; a giant wobbly teetering tower of nasty, patched-together hacks &#8212; something about it fundamentally bothers me.</p>
<p>
Now, all that said, <b>I still think microformats are useful and worth implementing</b>, if for no other reason than it&#8217;s <i>too easy not to</i>. If you have semi-structured data, and it maps well to an existing microformat, why not? Yes, it is kind of a hack, but it might even be a useful hack if <a href="http://microformats.org/wiki/google-search">Google starts indexing your microformats and presenting them in search results</a>. While I&#8217;m unclear on the general benefits of microformats for end users or developers, seeing stuff like this in search results &hellip;</p>
<p>
<img alt="google-microformat-results-forum.png" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/a988a_google-microformat-results-forum.png" width="544" height="99" /></p>
<p>
<img alt="google-microformat-results-review.png" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/49ca1_google-microformat-results-review.png" width="547" height="96" class="mt-image-none" /></p>
<p>
&hellip; is enough to convince me that microformats are a step in the right direction. Warts and all. While we&#8217;re waiting for HTML5 and <a href="http://ejohn.org/blog/html-5-data-attributes/">its mythical data attributes</a> to ship sometime this century, it&#8217;s better than nothing.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">JIRA 4</a> &#8211; Simplify issue tracking for everyone involved. <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">Get started</a> from $10 for 10 users.
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/microformats-boon-or-bane/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Version 1 Sucks, But Ship It Anyway</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/version-1-sucks-but-ship-it-anyway/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/version-1-sucks-but-ship-it-anyway/#comments</comments>
		<pubDate>Fri, 04 Dec 2009 17:50:02 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Donald Rumsfeld]]></category>
		<category><![CDATA[feedback]]></category>
		<category><![CDATA[internal friction]]></category>
		<category><![CDATA[pale shadow]]></category>
		<category><![CDATA[perfectionist]]></category>
		<category><![CDATA[quick fixes]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[software developers]]></category>
		<category><![CDATA[time]]></category>
		<category><![CDATA[version]]></category>
		<category><![CDATA[world]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/version-1-sucks-but-ship-it-anyway/</guid>
		<description><![CDATA[I&#8217;ve been unhappy with every single piece of software I&#8217;ve ever released. Partly because, like many software developers, I&#8217;m a perfectionist. And then, there are inevitably &#8230; problems: The schedule was too aggressive and too short. We need more time! We ran into unforeseen technical problems that forced us to make compromises we are uncomfortable [...]]]></description>
			<content:encoded><![CDATA[<p>
I&#8217;ve been unhappy with every single piece of software I&#8217;ve ever released. Partly because, like many software developers, I&#8217;m a perfectionist. And then, there are inevitably &hellip; <i>problems</i>: </p>
<ul>
<li>The schedule was too aggressive and too short. We need more time!
<li>We ran into unforeseen technical problems that forced us to make compromises we are uncomfortable with.
<li>We had the wrong design, and needed to change it in the middle of development.
<li>Our team experienced internal friction between team members that we didn&#8217;t anticipate.
<li>The customers weren&#8217;t who we thought they were.
<li>Communication between the designers, developers, and project team wasn&#8217;t as efficient as we thought it would be.
<li>We overestimated how quickly we could learn a new technology.
</ul>
<p>
The list goes on and on. Reasons for failure on a software project <a href="http://www.codinghorror.com/blog/archives/000889.html">are legion</a>.</p>
<p>
At the end of the development cycle, you end up with <b>software that is a pale shadow of the shining, glorious monument to software engineering that you envisioned when you started</b>.</p>
<p>
It&#8217;s tempting, at this point, to throw in the towel &#8212; to add more time to the schedule so you can get it right before shipping your software. Because, after all, <a href="http://www.codinghorror.com/blog/archives/000773.html">real developers ship</a>. </p>
<p>
I&#8217;m here to tell you that <b>this is a mistake</b>. </p>
<p>
Yes, you did a ton of things wrong on this project. But you also did a ton of things wrong that <i>you don&#8217;t know about yet</i>. And there&#8217;s no other way to find out what those things are until you ship this version and get it in front of users and customers. I think <a href="http://www.slate.com/id/2081042/">Donald Rumsfeld put it best</a>:</p>
<blockquote><p>
As we know,<br />
There are known knowns.<br />
There are things we know we know.<br />
We also know<br />
There are known unknowns.<br />
That is to say<br />
We know there are some things<br />
We do not know.<br />
But there are also unknown unknowns,<br />
The ones we don&#8217;t know<br />
We don&#8217;t know.
</p></blockquote>
<p>
In the face of the inevitable end-of-project blues &#8212; rife with compromises and totally unsatisfying quick fixes and partial soutions &#8212; you could hunker down and lick your wounds. You could regroup and spend a few extra months fixing up this version before releasing it. You might even feel good about yourself for making the hard call to get the engineering right before unleashing yet another buggy, incomplete chunk of software on the world.</p>
<p>
Unfortunately, this is an even bigger mistake than shipping a flawed version.</p>
<p>
Instead of spending three months fixing up this version in a sterile, isolated lab, you <i>could</i> be spending that same three month period <b>listening to feedback from real live, honest-to-god, <s>annoying</s>dedicated users of your software</b>. Not the software as you imagined it, and the users as you imagined them, but as they exist in the real world. You can turn around and use that directed, real world feedback to not only <i>fix</i> all the sucky parts of version 1, but spend your whole development budget more efficiently, predicated on hard usage data from your users.</p>
<p>
Now, I&#8217;m not saying you should release crap. Believe me, we&#8217;re all perfectionists here. But the real world can be a cruel, unforgiving place for us perfectionists. It&#8217;s saner to let go and realize that when your software crashes on the rocky shore of the real world, disappointment is inevitable &hellip; <i>but fixable!</i> What&#8217;s important isn&#8217;t so much the initial state of the software &#8212; in fact, some say <a href="http://successfulsoftware.net/2007/08/07/if-you-arent-embarrassed-by-v10-you-didnt-release-it-early-enough/">if you aren&#8217;t embarrassed by v1.0 you didn&#8217;t release it early enough</a> &#8212; but what you do <i>after</i> releasing the software.</p>
<p>
The velocity and responsiveness of your team to user feedback will set the tone for your software, far more than any single release ever could. That&#8217;s what you need to get good at. Not the platonic ideal of shipping mythical, perfect software, but being responsive to your users, to your customers, and demonstrating that through the act of continually improving and refining your software based on their feedback. So to the extent that you&#8217;re optimizing for near-perfect software releases, you&#8217;re optimizing for the wrong thing.</p>
<p>
There&#8217;s no <i>question</i> that, for whatever time budget you have, you will end up with better software by releasing as early as practically possible, and then spending the rest of your time <a href="http://www.codinghorror.com/blog/archives/000788.html">iterating rapidly based on real world feedback</a>.</p>
<p>
So trust me on this one: <b>even if version 1 sucks, ship it anyway</b>. </p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">JIRA 4</a> &#8211; Simplify issue tracking for everyone involved. <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">Get started</a> from $10 for 10 users.
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/version-1-sucks-but-ship-it-anyway/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Buy Bad Code Offsets Today!</title>
		<link>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/buy-bad-code-offsets-today/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/buy-bad-code-offsets-today/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 14:30:24 +0000</pubDate>
		<dc:creator>Facebook-Web-Design</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[code footprint]]></category>
		<category><![CDATA[consuming passion]]></category>
		<category><![CDATA[hellip]]></category>
		<category><![CDATA[open source initiatives]]></category>
		<category><![CDATA[tongue in cheek]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/buy-bad-code-offsets-today/</guid>
		<description><![CDATA[Let&#8217;s face it: we all write bad code. But not every programmer does something about the bad code they&#8217;re polluting the world with, day in and day out. There&#8217;s a whole universe of possibilities: Follow the instructions on the paint can Become a software apprentice Get a coding buddy Practice the fundamentals A program of [...]]]></description>
			<content:encoded><![CDATA[<p>
Let&#8217;s face it: <a href="http://www.codinghorror.com/blog/archives/000099.html">we all write bad code</a>.</p>
<p>
But not every programmer <i>does something</i> about the bad code they&#8217;re polluting the world with, day in and day out. There&#8217;s a whole universe of possibilities:</p>
<ul>
<li><a href="http://www.codinghorror.com/blog/archives/000568.html">Follow the instructions on the paint can</a>
<li><a href="http://www.codinghorror.com/blog/archives/000446.html">Become a software apprentice</a>
<li><a href="http://www.codinghorror.com/blog/archives/001229.html">Get a coding buddy</a>
<li><a href="http://www.codinghorror.com/blog/archives/000954.html">Practice the fundamentals</a>
<li><a href="http://www.codinghorror.com/blog/archives/001138.html">A program of effortful study</a>
<li><a href="http://www.codinghorror.com/blog/archives/001236.html">Participate in the community to sharpen your saw</a>
</ul>
<p>
But that&#8217;s a lot of work. Really freaking <b>hard work!</b> Wouldn&#8217;t it be nice if you could do something a bit simpler and easier to, just &hellip; say &hellip; <i>offset</i> the bad code you&#8217;re producing?</p>
<p>
Well, now you can &#8212; with <b><a href="http://codeoffsets.com/Buy.aspx">Bad Code Offsets</a></b>.</p>
<p>
<a href="http://codeoffsets.com/Buy.aspx"><img alt="bad-code-offset-front.jpg" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/4d08f_bad-code-offset-front.jpg" width="600" height="326" border="0" /></a></p>
<p>
<a href="http://codeoffsets.com/Buy.aspx"><img alt="bad-code-offset-back.jpg" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/2220b_bad-code-offset-back.jpg" width="600" height="326" border="0" /></a></p>
<p>
I am a proud member of the <a href="http://codeoffsets.com">Alliance for Code Excellence</a>, and this is our vision:</p>
<blockquote><p>
We envision a world where software runs cleanly and correctly as it simplifies, enhances and enriches our day to day work and home lives. Mitigating the scope and negative impact of bad code on our jobs, our lives and our world is our all-consuming passion. We foresee a time when bad coding practices and their rotten fruits have been eliminated from this earth and its server farms thereby heralding a new age of software brilliance and efficacy.</p>
<p>
Nettlesome bugs and poorly written code have been constant impediments towards realizing our full potential as programmers and engineers. <b>Bad Code Offsets provides the vehicle for balancing the scales of poor past practice while freeing us to pursue current excellence in code development.</b> Until the dawn of the worldwide, bug free code base, each of us can take steps towards reducing our bad code footprint and remediate the bad code that we have each individually and collectively left behind on the desktops, servers and mainframes at school, at work and at home.
</p></blockquote>
<p>
Yes, this is partly tongue in cheek, but we aren&#8217;t just <a>doing it for the lulz</a>. Bad code offsets cost real money, because the Alliance has a goal:</p>
<blockquote><p>
Q: Where does my money go?</p>
<p>
<b>A: The proceeds from the sale of Bad Code Offsets are donated to various worthy Open Source initiatives that are carrying the fight against bad code on a daily basis.</b> These organizations include:</p>
<ul>
<li><a href="http://jquery.com/">jQuery</a>
<li><a href="http://www.postgresql.org/">PostgreSQL</a>
<li><a href="http://apache.org/">The Apache Software Foundation</a>
</ul>
</blockquote>
<p>
This is the awesome part: the money you spend on Bad Code Offsets <i>really does offset bad code!</i></p>
<p>
All the money spent on bad code offsets goes directly to open source projects that actively make programmers&#8217; lives better. For every ten thousand lines of <a href="http://www.bioinformatics.org/phplabware/sourceer/sourceer.php?&amp;Sfs=htmLawed.php&amp;Sl=./internal_utilities/htmLawed">mind-bendingly bad code</a> produced, we hope to subsidize a thousand lines of quality open source code.</p>
<p>
So, please &#8212; <b><a href="http://codeoffsets.com/Buy.aspx">buy bad code offsets</a></b> today. It is, quite literally, the <i>least</i> you could do.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">JIRA 4</a> &#8211; Simplify issue tracking for everyone involved. <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">Get started</a> from $10 for 10 users.
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/facebook-web-design/programming/buy-bad-code-offsets-today/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parsing Html The Cthulhu Way</title>
		<link>http://www.neurosoftware.ro/programming-blog/blogposter/programming/parsing-html-the-cthulhu-way/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/blogposter/programming/parsing-html-the-cthulhu-way/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 18:21:52 +0000</pubDate>
		<dc:creator>BlogPoster</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[basic multilingual plane]]></category>
		<category><![CDATA[cannot]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Jon]]></category>
		<category><![CDATA[parse]]></category>
		<category><![CDATA[regex]]></category>
		<category><![CDATA[russian hackers]]></category>
		<category><![CDATA[stack overflow]]></category>
		<category><![CDATA[tongue in cheek]]></category>
		<category><![CDATA[Use]]></category>
		<category><![CDATA[using regular expressions]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/blogposter/programming/parsing-html-the-cthulhu-way/</guid>
		<description><![CDATA[Among programmers of any experience, it is generally regarded as A Bad Ideatm to attempt to parse HTML with regular expressions. How bad of an idea? It apparently drove one Stack Overflow user to the brink of madness: You can&#8217;t parse [X]HTML with regex. Because HTML can&#8217;t be parsed by regex. Regex is not a [...]]]></description>
			<content:encoded><![CDATA[<p>
Among programmers of any experience, it is generally regarded as A Bad Idea<sup>tm</sup> to attempt to parse HTML with regular expressions. How bad of an idea? It apparently <a href="http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454">drove one Stack Overflow user to the brink of madness</a>:</p>
<blockquote><p>
You can&#8217;t parse [X]HTML with regex. Because HTML can&#8217;t be parsed by regex. Regex is not a tool that can be used to correctly parse HTML. As I have answered in HTML-and-regex questions here so many times before, the use of regex will not allow you to consume HTML.</p>
<p>
Regular expressions are a tool that is insufficiently sophisticated to understand the constructs employed by HTML. HTML is not a regular language and hence cannot be parsed by regular expressions. Regex queries are not equipped to break down HTML into its meaningful parts. so many times but it is not getting to me. Even enhanced irregular regular expressions as used by Perl are not up to the task of parsing HTML. You will never make me crack. HTML is a language of sufficient complexity that it cannot be parsed by regular expressions.</p>
<p>
Even Jon Skeet cannot parse HTML using regular expressions. Every time you attempt to parse HTML with regular expressions, the unholy child weeps the blood of virgins, and Russian hackers pwn your webapp. Parsing HTML with regex summons tainted souls into the realm of the living. HTML and regex go together like love, marriage, and ritual infanticide. The &lt;center&gt; cannot hold it is too late. The force of regex and HTML together in the same conceptual space will destroy your mind like so much watery putty. If you parse HTML with regex you are giving in to Them and their blasphemous ways which doom us all to inhuman toil for the One whose Name cannot be expressed in the Basic Multilingual Plane, he comes.
</p></blockquote>
<p>
That&#8217;s right, if you attempt to parse HTML with regular expressions, you&#8217;re succumbing to the temptations of the dark god <a href="http://en.wikipedia.org/wiki/Cthulhu">Cthulhu&#8217;s</a> &hellip; er &hellip; <i>code</i>.</p>
<p>
<img alt="kraken-cthulhu.jpg" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/e602e_kraken-cthulhu.jpg" width="540" height="405" /></p>
<p>
This is all good fun, but the warning here is only partially tongue in cheek, and it is born of <a href="http://oubliette.alpha-geek.com/2004/01/12/bring_me_your_regexs_i_will_create_html_to_break_them">a very real frustration</a>. </p>
<blockquote><p>
I have heard this argument before. Usually, I hear it as justification for seeing something like the following code:</p>
<p><pre>
 # pull out data between &lt;td&gt; tags
($table_data) = $html =~ /&lt;td&gt;(.*?)&lt;\/td&gt;/gis;
</pre>
<p>
&#8220;But, it works!&#8221; they say.<br />
&#8220;It&#8217;s easy!&#8221;<br />
&#8220;It&#8217;s quick!&#8221;<br />
&#8220;It will do the job just fine!&#8221;</p>
<p>
I berate them for not being lazy. You need to be lazy as a programmer. <b>Parsing HTML is a solved problem. You do not need to solve it. You just need to be lazy.</b> Be lazy, use CPAN and use <a href="http://search.cpan.org/~nesting/HTML-Sanitizer-0.04/Sanitizer.pm">HTML::Sanitizer</a>. It will make your coding easier. It will leave your code more maintainable. You won&#8217;t have to sit there hand-coding regular expressions. Your code will be more robust. You won&#8217;t have to bug fix every time the HTML breaks your crappy regex
</p></blockquote>
<p>
For many novice programmers, there&#8217;s something unusually seductive about parsing HTML the Cthulhu way instead of, y&#8217;know, using a library like a sane person. Which means this discussion gets reopened almost every single day on Stack Overflow. The above post from five years ago could be a discussion from <i>yesterday</i>. I think we can forgive a momentary lapse of reason under the circumstances.</p>
<p>
Like I said, this is a well understood phenomenon in most programming circles. However, I was surprised to see a few experienced programmers <a href="http://www.metafilter.com/86689/So-does-anyone-know-how-to-make-an-HTML-regex-parser">in metafilter comments</a> actually <b>defend the use of regular expressions to parse HTML</b>. I mean, they&#8217;ve heeded the <a href="http://en.wikipedia.org/wiki/The_Call_of_Cthulhu">Call of Cthulhu</a> &hellip; and <i>liked</i> it.</p>
<blockquote><p>
Many programs will neither need to, nor should, anticipate the entire universe of HTML when parsing. In fact, designing a program to do so may well be a completely wrong-headed approach, if it changes a program from a few-line script to a bullet-proof commercial-grade program which takes orders of magnitude more time to properly code and support. Resource expenditure should always (oops, make that very frequently, I about overgeneralized, too) be considered when creating a programmatic solution.</p>
<p>
In addition, hard boundaries need not always be an HTML-oriented limitation. They can be as simple as &#8220;work with these sets of web pages&#8221;, &#8220;work with this data from these web pages&#8221;, &#8220;work for 98% users 98% of the time&#8221;, or even &#8220;OMG, we have to make this work in the next hour, do the best you can&#8221;.
</p></blockquote>
<p>
 We live in a world full of newbie PHP developers doing the first thing that pops into their collective heads, with more born every day. What we have here is an ongoing education problem. The real enemy isn&#8217;t regular expressions (or, for that matter, <a href="http://www.codinghorror.com/blog/archives/000982.html">goto</a>), but ignorance. The only crime being perpetrated is not knowing what the alternatives are.</p>
<p>
So, while I may <i>attempt</i> to parse HTML using regular expressions <a href="http://www.codinghorror.com/blog/archives/001172.html">in certain situations</a>, I go in knowing that:</p>
<ul>
<li>It&#8217;s generally a bad idea.
<li>Unless you have discipline and put very strict conditions on what you&#8217;re doing, matching HTML with regular expressions rapidly devolves into madness, <i>just how Cthulhu likes it</i>.
<li>I had what I thought to be good, rational, (semi) defensible reasons for choosing regular expressions in this specific scenario.
</ul>
<p>
It&#8217;s considered good form to demand that regular expressions be considered verboten, totally off limits for processing HTML, but I think that&#8217;s just as wrongheaded as demanding <b>every trivial HTML processing task be handled by a full-blown parsing engine</b>. It&#8217;s more important to understand the tools, and their strengths and weaknesses, than it is to knuckle under to knee-jerk dogmatism.</p>
<p>
So, yes, generally speaking, it <i>is</i> a bad idea to use regular expressions when parsing HTML. We should be teaching neophyte developers that, absolutely. Even though it&#8217;s an apparently neverending job. But we should also be teaching them the very real difference between <a href="http://en.wikipedia.org/wiki/Parsing">parsing HTML</a> and the simple expedience of processing a few strings. And how to tell which is the right approach for the task at hand.</p>
<p>
Whatever method you choose &#8212; just don&#8217;t leave the &lt;cthulhu&gt; tag open, for humanity&#8217;s sake.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">JIRA 4</a> &#8211; Simplify issue tracking for everyone involved. <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">Get started</a> from $10 for 10 users.
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/blogposter/programming/parsing-html-the-cthulhu-way/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Whitespace: The Silent Killer</title>
		<link>http://www.neurosoftware.ro/programming-blog/blogposter/programming/whitespace-the-silent-killer/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/blogposter/programming/whitespace-the-silent-killer/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 12:36:57 +0000</pubDate>
		<dc:creator>BlogPoster</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[Control]]></category>
		<category><![CDATA[control freaks]]></category>
		<category><![CDATA[fine]]></category>
		<category><![CDATA[horror movies]]></category>
		<category><![CDATA[My]]></category>
		<category><![CDATA[rabbit hole]]></category>
		<category><![CDATA[regular expression]]></category>
		<category><![CDATA[source]]></category>
		<category><![CDATA[source control]]></category>
		<category><![CDATA[whitespace]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/blogposter/programming/whitespace-the-silent-killer/</guid>
		<description><![CDATA[Ever have one of those days where everything you check into source control is wrong? Also, how exactly is that day is different from any other? But seriously. Code that is visible is code that can be wrong. No surprise there. But did you know that even the code you can&#8217;t see may be wrong, [...]]]></description>
			<content:encoded><![CDATA[<p>
Ever have one of those days where <b>everything you check into source control is wrong?</b></p>
<p>
Also, how exactly is that day is different from any other? But seriously.</p>
<p>
Code that is visible is <a href="http://www.codinghorror.com/blog/archives/000878.html">code that can be wrong</a>. No surprise there. But did you know that even the code you <i>can&#8217;t</i> see may be wrong, too?</p>
<p>
These are the questions that drive young programmers to madness. Take this perfectly innocent code, for example.</p>
<p>
<img alt="code-whitespace-invisible.png" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/07911_code-whitespace-invisible.png" width="453" height="156" /></p>
<p>
Looks fine, doesn&#8217;t it? But hold on. Wait a second. Let&#8217;s take another, closer look.</p>
<p>
<img alt="code-whitespace-visible.png" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/88470_code-whitespace-visible.png" width="455" height="155" /></p>
<p>
<i>OH. MY. <b>GOD!</b></i></p>
<p>
If you&#8217;re not a programmer, you may be looking at these two images and wondering what the big deal is. That&#8217;s fine. But I humbly submit that, well, you&#8217;re not one of us. You don&#8217;t appreciate what it&#8217;s like to spend every freaking minute of every freaking day agonizing over the tiniest details of the programs you write. Not because we <i>want</i> to, you understand, but because the world explodes when we don&#8217;t.</p>
<p>
I mean that literally. Well, <a href="http://bugsniffer.blogspot.com/2007/11/infamous-software-failures.html">almost</a>. If one semicolon is out of place, <a href="http://www.google.com/search?q=failure+'missing+semicolon'">everything goes sideways</a>. That&#8217;s how programming works. It&#8217;s fun! Sometimes! I swear!</p>
<p>
We got into this industry because, quite frankly, we are control freaks. It&#8217;s who we are. It&#8217;s what we do. Now to imagine, to our dismay, that there&#8217;s all this stupid, useless <i>whitespace</i> at the ends of our lines. Stuff that&#8217;s there, but we can&#8217;t see it. Well, those are the nightmares OCD horror movies are made of. I have a full-body itchiness just talking about it.</p>
<p>
Depending on how far down the rabbit-hole you want to go, there&#8217;s any number of things you could do here:</p>
<ul>
<li>Have a post-build step, perhaps something with a regular expression like <code>\s*?$</code> in it, that auto-cleans extra spaces checked into source control
<li>Execute a local macro which removes whitespace from ends of lines
<li>Have a special rule to highlight extra spaces
<li>Run your IDE in whitespace-always-visible mode, or toggle it frequently
</ul>
<p>
OK, fine, so maybe the world won&#8217;t explode if there are a few extra bits of whitespace in my code.</p>
<p>
But all the same, I think I&#8217;ll go back and make <i>extra double plus sure</i> no more of that pesky whitespace has accumulated in my code when I wasn&#8217;t looking. Just because I can&#8217;t see it doesn&#8217;t mean it&#8217;s not out to get me.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">JIRA 4</a> &#8211; Simplify issue tracking for everyone involved. <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">Get started</a> from $10 for 10 users.
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/blogposter/programming/whitespace-the-silent-killer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Preserving Our Digital Pre-History</title>
		<link>http://www.neurosoftware.ro/programming-blog/blogposter/programming/preserving-our-digital-pre-history/</link>
		<comments>http://www.neurosoftware.ro/programming-blog/blogposter/programming/preserving-our-digital-pre-history/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 14:20:02 +0000</pubDate>
		<dc:creator>BlogPoster</dc:creator>
				<category><![CDATA[funny]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[BBS]]></category>
		<category><![CDATA[bbs scene]]></category>
		<category><![CDATA[digital artifacts]]></category>
		<category><![CDATA[history]]></category>
		<category><![CDATA[Jason]]></category>
		<category><![CDATA[Jason Scott]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[Part]]></category>
		<category><![CDATA[single thing]]></category>
		<category><![CDATA[something]]></category>
		<category><![CDATA[The Way]]></category>
		<category><![CDATA[twenty five years]]></category>

		<guid isPermaLink="false">http://www.neurosoftware.ro/programming-blog/blogposter/programming/preserving-our-digital-pre-history/</guid>
		<description><![CDATA[I&#8217;ve spent a significant part of my life online. Not just on the internet, I mean, but on modems and early, primitive online communities. Today&#8217;s internet is everything we couldn&#8217;t have possibly dared to imagine twenty-five years ago, but there is a real risk of these early, tentative digital artifacts &#8212; and for some, the [...]]]></description>
			<content:encoded><![CDATA[<p>
I&#8217;ve spent a significant part of my life online. Not just on the internet, I mean, but on modems and early, primitive online communities. Today&#8217;s internet is everything we couldn&#8217;t have possibly dared to imagine twenty-five years ago, but there is a real risk of these early, tentative digital artifacts &#8212; and for some, the beginnings of <a href="http://www.codinghorror.com/blog/archives/001194.html">our Hacker Odyssey</a> &#8212; being lost forever in the relentless deluge of online progress. Sure, every single thing that happened in 2004 is documented exhaustively online. But 1994? <i>1984?</i> Not so much.</p>
<p>
That&#8217;s where <a href="http://ascii.textfiles.com/">Jason Scott</a> comes in.</p>
<p>
You may know Jason Scott from <a href="http://www.bbsdocumentary.com/">BBS The Documentary</a>. Or, perhaps you&#8217;re familiar with <a href="http://www.textfiles.com/">textfiles.com</a>, his massive (and growing) archive of what passed for blogs and forums in the earliest online era.</p>
<blockquote><p>
A wonderful thing happened in the 1980s: Life started to go online. And as the world continues this trend, everyone finding themselves drawn online should know what happened before, to see where it all really started to come together and to know what went on, before it&#8217;s forgotten.</p>
<p>
When a historian or reporter tries to capture the feelings and themes that proliferated through the BBS Scene of the early 1980&#8242;s, the reader nearly always experiences a mere glimpse of what went on. This is probably true of most any third-party reporting, but when the culture is your own, and when the experiences were your own, the gap between story and reality is that much wider, and it&#8217;s that much harder to sit back and let the cliche-filled summary become &#8220;The Way It Was.&#8221; You want to do something, anything so that the people who stumble onto the part of history that was yours know what it was like to grow up through it, to meet the people you did, to do the things you enjoyed doing. Maybe, you hope, they might even see the broader picture and the conclusions that you yourself couldn&#8217;t see at the time. This is history the way the chronicled want it to be.
</p></blockquote>
<p>
Jason is nothing less than <b>our generation&#8217;s digital historian in residence</b>. When <a href="http://help.yahoo.com/l/us/yahoo/geocities/close/close-01.html">GeoCities went permanently offline</a> a week ago, <a href="http://ascii.textfiles.com/archives/2291">he was there</a> to help preserve it for posterity.</p>
<p>
<a href="http://www.bbsdocumentary.com/"><img alt="bbs-documentary.png" src="http://www.neurosoftware.ro/programming-blog/wp-content/plugins/wp-o-matic/cache/76dda_bbs-documentary.png" width="500" height="449" border="0" /></a></p>
<p>
BBS: The Documentary was a major milestone in his ongoing effort to document our digital pre-history. But it&#8217;s only the beginning; there&#8217;s also a huge documentary on text adventures, <a href="http://www.getlamp.com/">Get Lamp</a>, that&#8217;s been in the works for a few years now. Unfortunately, progress has been slow. Because while being a digital historian is great, it&#8217;s not exactly something you get <i>paid to do</i>.</p>
<p>
But <b>maybe we can change that</b>. Witness <a href="http://www.kickstarter.com/projects/textfiles/the-jason-scott-sabbatical">Jason&#8217;s kickstarter proposal</a>:</p>
<blockquote><p>
Throughout all this, I had a day job &#8211; computer administration. It paid well, but I paid for it with my health. When my most recent employer and I parted ways, I decided I&#8217;d take this time finish some of the bigger projects I&#8217;ve been working on.</p>
<p>
I suddenly thought back to Kickstarter and got this crazy idea &#8211; <b>what if I simply asked the world and fans to contribute a bit of money towards keeping me somewhat solvent, and give me the opportunity to go full-time with computer history?</b> If I was able to get all these things done over the years, what if I just asked people to subscribe or give me some patronage and in return I fill their free time with cool stuff to look at, learn from, and enjoy?
</p></blockquote>
<p>
There are so many people whose online presences I greatly admire. But very few of them will go on to become part of the permanent written history of this era. I have no doubt whatsoever that Jason Scott is one of those people who <i>will</i>, thanks to his tireless efforts to preserve the flotsam and jetsam of our digital past, stuff that would otherwise be overlooked by the mainstream and lost forever.</p>
<p>
I&#8217;ve pledged $100. <b>It is an honor to support his ongoing work of preserving our shared digital pre-history</b>. His history, is my history, is <i>our</i> history. A history of geeks, dorks, dweebs, nerds, and generally computer-obsessed misfits, but nonetheless &#8212; it&#8217;s something we all share. </p>
<p>
If this is something you believe in, I <a href="http://www.kickstarter.com/projects/textfiles/the-jason-scott-sabbatical">urge you to pledge as well</a>.</p>
<table>
<tr>
<td>
[advertisement] <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">JIRA 4</a> &#8211; Simplify issue tracking for everyone involved. <a href="http://www.atlassian.com/software/jira/?s_kwcid=codinghorror&amp;utm_source=codinghorror&amp;utm_medium=referral&amp;utm_campaign=footer_link&amp;utm_content=jira4_from_10" rel="nofollow">Get started</a> from $10 for 10 users.
</td>
</tr>
</table>
<p>
<a href="http://feeds.feedburner.com/codinghorror">Go to Source</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.neurosoftware.ro/programming-blog/blogposter/programming/preserving-our-digital-pre-history/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

