<rss version="2.0">
        <channel>
            <title>Hacker News</title>
            <link>http://news.ycombinator.com/</link>
            <description>Links for the intellectually curious, ranked by readers.</description>		<item>
        	<title>Professional Hacks: Tricks of the Trade</title>
        	<link>http://www.themorningnews.org/archives/how_to/tricks_of_the_trade.php</link>
        	<comments>http://news.ycombinator.com/item?id=955326</comments>
	        <description>
    	        <![CDATA[
				
	

		A while back I read an interview with a children&#8217;s birthday clown. At one point the interviewer asked, &#147;What if you&#8217;re dying out there? What if the kids are hating it?&#148; And the clown revealed a fascinating trick of the birthday clown trade: Every year, it seems, there are two or three funny words that invariably crack kids up, and when things are going sour, you can blurt one out and bring the house down. But a clown&#8217;s got to keep up to date, because the funny words mysteriously change over time. Where &#147;booger&#148; might have killed in 1998, 2004 demands nothing less than an &#147;underpants.&#148;<p>
Curiously, I&#8217;ve noticed an almost identical aspect in the software development trade. Every year there seems to be a technical whatsit that management recognizes as the sexy-cool new thing but doesn&#8217;t really understand. This year, for instance, a programmer can always tack the phrase &#147;and I&#8217;m thinking of incorporating some XML functionality&#148; onto a project summary to explain why he&#8217;ll need an extra week, account for a missed deadline, or impress a superior. In this respect, the gap between software engineers and birthday clowns is almost negligible.</p><p>
Wondering if there were more of these, I recently asked readers for their &#147;tricks of the trade,&#148; and was amazed by the response. It seems every profession is rich with clever little occupational secrets. Here are some of the best of what I received.
</p><p><h1>Actor</h1>
Every actor eventually is called upon to act drunk. Most do this by slurring their speech, stumbling around, and perhaps drooling a bit. This is what a freshman drama teacher calls &#147;indicating.&#148; A better way to appear drunk is to act very, very sober. Walk very carefully, and try not to let <i>anyone</i> see that you&#8217;re inebriated. This is much more subtle and will register on a level the audience won&#8217;t immediately recognize.
</p><p><h1>Attorney</h1>
Do whatever it takes to fit your contracts onto a single page: Format with single-spacing, use a 10- or 9-point font, and reduce the margins to less than an inch. Most people assume any contract that fits on one page will be simple and straightforward, and even sophisticated negotiators can be charmed by the lack of a staple.
</p><p><h1>Auto Mechanic</h1>
Always put copper grease on the battery terminals after servicing a car. The performance benefit is negligible, but when customers look under the hood they will immediately see that something&#8217;s changed and thus feel happy to pay you.
</p><p><h1>Balloon-Twister</h1>
When you&#8217;re twisting balloons for children, never tell them what you&#8217;re making. The majority of the finished products&#151;despite your best attempts&#151;almost always look like a dog, a blastula, or something vaguely phallic. If you identify what you&#8217;re actually attempting to make, the children will respond to your finished product with, &#147;That doesn&#8217;t look like a [insert animal name]&#133;&#148; But if you make the animals and <i>then</i> ask, &#147;What does it look like to you?&#148; the child&#8217;s imagination will take over, turning the blue, four-legged balloon into Blue from <i>Blue&#8217;s Clues</i>, the blastula into a Pokemon, and the phallic object into an elephant. You&#8217;ll also get bonus points because you were <i>so cool</i> for making exactly what they wanted.
</p><p><h1>Botanist</h1>
When working in the field, stick a strip of duct tape to your pants. You can take it off while working to quickly remove large masses of ticks, biting ants, and thorns.</p><p>
If you know the length of each of your fingers as well as your handbreadth in centimeters, you can measure the leaves of most plants without having to pull the ruler out of your backpack.</p><p>
And when doing botanical work in South America, steer clear of the monkeys: They will throw sticks at you with surprising accuracy.
</p><p><h1>Butcher</h1>
In Australia, the butchers have a secret language called &#147;rechtub klat&#148; that they use to gossip about customers without getting caught. The code is formed by speaking words backward. Old-timers could have entire conversations in the language, but these days a core vocabulary of about 20 to 30 essential words are used. Sometimes, if a word can&#8217;t really be pronounced backwards, a couple of letters will be traded around (e.g., &#147;tish&#148; for &#147;shit&#148;), or the first letter might be pronounced separately (e.g., &#147;bmal&#148; is pronounced &#147;beemal&#148;). The most common words are:
<ul>
<li>kool, toh lrig</li>
<li>cuf ecaf</li>
<li>on erom feeb/gip/bmal</li>
<li>traf</li>
<li>toor</li>
<li>doog tsub</li>
<li>tish</li>
<li>doog esra</li>
<li>gaf</li>
</ul>
Nothing is more enjoyable than shouting at the top of your lungs to the other butchers that the difficult customer right in front of you is a &#147;on doog cuf ecaf.&#148;
</p><p><h1>Cardboard Box Flattener</h1>
When hitting the sealed bottom of a cardboard box to flatten it, do <i>not</i> punch it with your knuckles like you&#8217;re boxing&#151;that will start to hurt real quick. Instead, strike it with the bottom of your fist, as if your hand were a gavel.
</p><p><h1>Cartographer</h1>
Mapmakers will often use &#147;copyright traps,&#148; bits of information in their maps that are purposefully wrong. They might label a body of water &#147;Lake Strongbad,&#148; for instance, and then examine the next editions of competitors&#8217; maps to see if the incorrect information makes an appearance.
</p><p><h1>Clarinetist</h1>
Clarinetists in orchestras often need to swap between a clarinet in the key of B-flat and one in the key of A right in the middle of a piece&#151;with only about two seconds to spare. To do this they must yank the mouthpiece off the instrument they&#8217;re playing, grab the other clarinet from its stand, shove the mouthpiece onto the new clarinet, and drop the other one onto the stand. Worse, clarinets are black, clarinet stands are black, and this maneuver is usually done in the darkness of a concert hall. So what many clarinetists do to know which clarinet they&#8217;re holding is place a piece of blue painter&#8217;s tape on the back of one, or use thumb rests of different colors. And to help aim for the clarinet stand, some paint theirs with glow-in-the-dark paint.
</p><p><h1>Desktop Support</h1>
When desktop support technicians resolve a ticket, they are usually required to document the cause and solution to the problem. Supervisors see these records, so you have to be professional, but can usually get away with using the acronym &#147;PEBKAC&#148; in situations where the user caused the initial problem. PEBKAC stands for &#147;Problem Exists Between Keyboard and Chair.&#148;
</p><p><h1>Forester</h1>
Never walk behind another person in the woods, because yellow jackets build their nests underground. The first person in line will disturb the nest when they walk over it, but it&#8217;s the poor suckers trailing behind who catch the wrath of the stirred-up bees. You can generally tell the more experienced forester in the group because he&#8217;ll be the one in the lead.</p><p>
The senior forester also will be the one either driving the truck or sitting in the middle seat; it&#8217;s the guy who&#8217;s riding &#147;shotgun&#148; who has to get out to open and close every gate they encounter.
</p><p><h1>Graphic Designer</h1>
If you have a client who is unable to approve a proposed design without putting her stamp on it, just put an obvious error in the proposal: a logo that&#8217;s too large, a font that&#8217;s too small, or a few judiciously seeded typos. The client requests the change and feels she&#8217;s done her part&#151;and your design, which was perfect all along, sails through to approval.
</p><p><h1>Jeweler</h1>
When setting a semiprecious gem, set a tiny piece of silver or gold foil behind it to make it sparkle.</p><p>
Also, because most stones are pretty irregular (being stones and all), fill the base of the setting with sawdust so the stone will set evenly.
</p><p><h1>Juggler</h1>
With any routine under seven minutes (which is almost all of them), you only really need one thing: a good closer. And there are only two things you really need to know about a great closer. First, it needs to be impressive. That sounds obvious, but most beginning jugglers think &#147;difficult&#148; and &#147;impressive&#148;  are synonymous. Your closer must <i>look</i> hard, but there&#8217;s no real reason it has to <i>be</i> hard. Secondly, you should intentionally blow your closer on the first two tries. If you get it on the first try it looks too easy, but if you &#147;miss&#148; it a few times it looks harder and builds tension.
</p><p><h1>Landscape Architect</h1>
You will often have to create a large presentation for clients, and will spend hours coloring in landscape illustrations with markers. But if you say the drawings are &#147;rendered&#148; rather than &#147;colored,&#148; you can charge four times as much.
</p><p><h1>Lounge Pianist</h1>
Never agree to Christmas sing-alongs if there is alcohol involved. Your singer will only remember the first two lines of his favorite tunes, or you&#8217;ll waste a half-hour on a drawn-out, stumbling, &#147;12 Days of Christmas.&#148; The singer will be forgiven when he sobers up, but you&#8217;ll look unprofessional.
</p><p><h1>Massage Therapist</h1>
In massage, properly orienting the top sheet over the client is referred to as &#147;draping.&#148; To keep female clients from having their breasts exposed while draping them for an abdominal massage, start with the client face up with the top sheet fully covering her from the neck down. Now, put a pillowcase over her neck, rumpled up. Pinching the pillowcase and sheet together, pull both down, with the pillowcase unraveling and trailing the sheet down the client&#8217;s body. Once  the pillowcase has covered the breasts, leave it behind and continue with only the sheet until her abdomen is exposed. Tuck in pillowcase and sheet, and voila!
</p><p><h1>Mechanic</h1>
If you have to change a light bulb where the glass is broken, you can press a potato into the metal base to unscrew the remains of the bulb from the fixture.
</p><p><h1>Newspaper Headline Writer</h1>
If you can&#8217;t think of a headline for a story, use one of these three magic verbs: &#147;weighs,&#148; &#147;mulls,&#148; or &#147;considers.&#148; They&#8217;ll work for pretty much anything from court stories (&#147;Hamilton mulls plea deal&#148;) to government stories (&#147;Governor weighs Paseo extension&#148;) to entertainment (&#147;Colvin considers new album&#148;) to features (&#147;Benson mulls those who consider weighing Kasey&#8217;s artwork&#148;).
</p><p><h1>Nurse</h1>
Patients will occasionally pretend to be unconscious. A surefire way to find them out is to pick up their hand, hold it above their face, and let go. If they smack themselves, they&#8217;re most likely unconscious; if not, they&#8217;re faking.
</p><p><h1>Paramedic</h1>
When paramedics arrive at a car crash or similar accident, they very, <i>very</i> rarely announce any casualties at the scene&#151;almost all deceased will be pronounced &#147;dead on arrival&#148; at the hospital. This is because it involves about 10 times more paperwork to announce someone dead right in situ than it does to say they expired in the ambulance on the way to the hospital.
</p><p><h1>Photographer</h1>
When taking family portraits that include a dog, don&#8217;t use the dog&#8217;s name or say &#147;doggie, doggie&#148; to get its attention, because it might trot over to you. Instead, call out &#147;kitty, kitty, kitty.&#148; The dog will perk up and look around for a cat, and you can get a great shot if you time it right.
</p><p><h1>Piano Salesman</h1>
If you see a potential customer eyeing a piano, estimate their age and calculate what year it was when they were 18 years old. Play a big hit from that year on the piano they&#8217;re looking at. With a lot of preparation and a little luck, you might play the exact song they were listening to when they lost their virginity, got married, or drove their first car. The emotional resonance will overcome sales resistance and even open their wallets to a more expensive piano.
</p><p><h1>Proofreader</h1>
If you&#8217;re reading too fast, your brain can &#147;correct&#148; typos, preventing you from catching them. That&#8217;s why it&#8217;s sometimes a good idea to read a page upside-down. It forces you to pay closer attention to individual words out of context, and you can&#8217;t race through pages too fast.
</p><p><h1>Software Tester</h1>
Because developers don&#8217;t expect testers to read through their code, doing so is a quick and easy way to find possible bugs. Look for comments like &#147;// HACK&#148; or &#147;// fix this crap later.&#148;
</p><p><h1>Street Performer</h1>
In street performance, it&#8217;s possible to make money without really knowing how to play your instrument. You can pick up a cheap accordion at a thrift store and simply make stuff up on the street corner. Most people usually won&#8217;t stick around and listen for long if you are on a sidewalk where there&#8217;s little room to stand, and you can play the same thing over and over and still make money.
</p><p><h1>Technical Support</h1>
When helping someone fix their computer over the phone, and you want them to see if all the cables are plugged in correctly, don&#8217;t ask, &#147;Have you checked to see if the cable is plugged in?&#148; because the customer will always say, &#147;Of course I did, do you think I&#8217;m a moron?&#148; Instead say, &#147;Remove the cable, blow the dust out of the connector, and plug it back in.&#148; The customer will most likely reply, &#147;Hey, it&#8217;s working now&#151;I guess that dust really builds up in there!&#148;
</p><p><h1>Waitress</h1>
When you realize you have forgotten to submit an order to the kitchen, go to the table and mournfully say, &#147;Did you just hear that crash?&#148; Nine times out of 10, the customers not only will say &#147;yes,&#148; but actually will believe they just heard a noise of some sort. You can then sigh sadly, and say, &#147;Unfortunately, that was the chef dropping your food,&#148; and then scurry back to the kitchen to hand in the neglected order.
</p><p><h1>Wedding Coordinator</h1>
People&#8217;s fingers swell when they get nervous. So, when exchanging rings, tell couples to only slide the ring up to the first knuckle and let the other person push it up the rest of the way. Otherwise you run the risk of the groom breaking his bride&#8217;s finger in the middle of the ceremony.</p><p>

</p>
				
					<br/><a href="http://news.ycombinator.com/item?id=955326">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>Has sci-fi run out of steam?</title>
        	<link>http://www.pcpro.co.uk/features/353485/the-sci-fi-legends-who-shaped-todays-tech</link>
        	<comments>http://news.ycombinator.com/item?id=955239</comments>
	        <description>
    	        <![CDATA[
				
<div>


</div>
<h1 title="The sci-fi legends who shaped today's tech">The sci-fi legends who shaped today&#039;s tech</h1>
<p>Posted on 20 Nov 2009 at 16:17</p>
<p>Science fiction has long inspired real-world technology, but have the authors of sci-fi stories finally run out of steam? Stuart Andrews investigates</p>
<p>From the earliest days of Jules Verne and HG Wells, science fiction and technology have enjoyed a mutually beneficial relationship. Sci-fi stories and novels expressed man’s desire to conquer space, find new worlds or explore the ocean depths, and while man would probably have landed on the moon or launched deep-sea expeditions without them, these tales inspired those who made such giant leaps. </p>
<p>In turn, real-world technology has inspired the science-fiction writer. After all, it’s science fiction that charts what happens when humanity meets high technology, asking what will happen, where it will take us, and what we’ll find when we get there. This is as true of computer technology as it was of the space race. Perhaps, even more so. </p>
<p></p>
<p>The geek and hacker cultures that have powered so much of the PC and internet revolution are hugely sci-fi literate. Writers and experts have even crossed paths; the academics and software engineers becoming sci-fi writers, the writers earning a name as futurologists. </p>
<p>In this feature, we’ll explore how science fiction has motivated trends and products in computing, and catch a glimpse of where this relationship might take us in the future.</p>
<p><h2>Visions of the future</h2></p>
<p>Does sci-fi really have that great an impact on the technology that emerges from the labs of the world’s biggest technology companies? Labs that are so well funded (Microsoft alone spent $8 billion on research last year) that they can afford to scoop up the brightest talent emerging from MIT and beyond? Indeed it does, according to Bruce Hillsberg, director of storage systems at IBM Research in Almaden. For him, the value of science fiction is that it “paints visions of the future that cause people to think about possibilities beyond what is possible today”. </p>
<p><blockquote><p>Sci-fi can consciously or unconsciously help authors think outside the box</p></blockquote></p>
<p>Hillsberg believes the fact so many hi-tech visionaries are sci-fi fans, tied to fiction’s power to stimulate creative thought processes, means that an interest in the genre can lead to real breakthroughs. “I don’t believe sci-fi necessarily sets the agenda for researchers,” said Hillsberg. “That is, I don’t think most researchers try to invent what they read about or see in movies. Rather, they try to move science or technology forward, and sci-fi can consciously or unconsciously help them think outside the box.” </p>
<p>History bears out his theory. Do a little digging and you’ll be surprised to find how many big names in the computing world are sci-fi fans: Apple’s Steve Wozniak, Netscape’s Marc Andreessen, Tim Berners-Lee, Google’s Sergey Brin and the GNU Linux creator Richard Stallman, to name only a few of the tech elite. Microsoft co-founder Paul Allen has even helped fund a museum of science fiction in Seattle. </p>
<p><h2>To Hal and back</h2></p>
<p>It wasn’t long into the history of computing that the sci-fi greats began to see technology’s potential. During the 1950s, Isaac Asimov wrote a sequence of stories featuring Multivac, a huge, artificially intelligent computer, culminating in the classic The Last Question – a tale that tracks the evolution of Multivac and the human race. </p>
<p>Asimov recognised that computers would grow both smaller and more powerful, with Multivac transforming from a sprawling giant into an entity that exists outside of space and time. He merely underestimated the timescale – Asimov thought it would take thousands of years for Multivac to shrink to a vaguely mobile form.</p>
<p>
</p>
				
					<br/><a href="http://news.ycombinator.com/item?id=955239">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>Linus on copyright and &#34;fair use&#34;</title>
        	<link>http://thread.gmane.org/gmane.linux.kernel/475654/focus=476049</link>
        	<comments>http://news.ycombinator.com/item?id=955076</comments>
	        <description>
    	        <![CDATA[
				
				
					<br/><a href="http://news.ycombinator.com/item?id=955076">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>PubSubHubBub Security Concerns</title>
        	<link>http://www.xn--8ws00zhy3a.com/blog/2009/11/pubsubhubbub-security-concerns</link>
        	<comments>http://news.ycombinator.com/item?id=955388</comments>
	        <description>
    	        <![CDATA[
				
<blockquote><p>
<q>All things human hang by a slender thread; and that which seemed to stand strong suddenly falls and sinks in ruins.</q>
<cite>Ovid, 43 BC – AD 18</cite>
</p></blockquote>
<p>For those of you that don’t know, <a href="http://code.google.com/p/pubsubhubbub/">PubSubHubbub</a> is a protocol for facilitating the real-time distribution of Atom and RSS feeds. In some ways it could be considered a competitor to the <a href="http://rsscloud.org/" title="Rebooting the RSS cloud">RSS Cloud</a> protocol which I wrote about <a href="http://www.xn--8ws00zhy3a.com/blog/2009/10/rss-cloud-fail" title="RSS Cloud Fail">last month</a>; although, in my opinion, they really serve quite different roles.</p>
<p>As of right now, the PubSubHubbub protocol has no mention of security anywhere in the specification. <a href="http://www.xn--8ws00zhy3a.com/blog/2009/11/pubsubhubbub-security-concerns#f13.1"><sup>1</sup></a> As a point of comparison, if it were an <a href="http://www.ietf.org/" title="Internet Engineering Task Force">IETF</a> document, having a section on <a href="http://www.ietf.org/rfc/rfc3552.txt" title="RFC 3552: Guidelines for Writing RFC Text on Security Considerations">security considerations</a> would be a <em>requirement</em> for publication.</p>
<p>Whether any of the attacks outlined in this post are genuine threats or not isn’t really of much consequence. I’d just like to see <em>some</em> sign that people are at least considering the potential for such attacks.</p>
<h3>Fake publishing</h3>
<p>Let’s start with publishing. When you want to let a hub know that your feed has been updated, you send it a <a href="http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.2.html#anchor9" title="PubSubHubbub Core 0.2: New Content Notification">New Content Notification</a>. The hub should then fetch your feed to see what has changed, so it can pass on those changes to any subscribers. How does it know where to find your feed? <em>You</em> tell it the URL to use – any URL you want – and it will blindly trust you.</p>
<p>So what happens when an attacker lies, and gives the hub a URL for someone else’s feed? Then tells the hub that said feed is updating constantly – like say a thousand times a second? It requires very little bandwidth to launch such an attack (especially if the hub supports <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1" title="HTTP/1.1: Connections">persistent connections</a>), but can result in a substantial load on the victim’s server.</p>
<p>Now in an ideal world, both the hub and the feed publisher would support <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19" title="HTTP/1.1: Header Field Definitions">ETag</a> and <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.29" title="HTTP/1.1: Header Field Definitions">Last-Modified</a> headers, which would essentially nullify any real damage from this sort of attack. However, there’s an easy way for an attacker to bypass that defence – just use a URL that isn’t actually a feed.</p>
<h3>How do you recognise a feed?</h3>
<p>Typically a hub won’t be sure of the kind of file it is downloading until it has actually finished downloading it. As a result, there’s really nothing stopping an attacker from “publishing” say an image, or a movie, or a multi-gigabyte <a href="http://en.wikipedia.org/wiki/ISO_image" title="Wikipedia: ISO image">ISO</a> if they were lucky enough to find such a thing on the target server.</p>
<p>Not only does this mean that the victim will have to deal with a much higher load, but because the file isn’t a feed, the hub most likely won’t cache it, and won’t store ETags and Last-Modified headers. That means the next time the attacker “publishes” that URL (say a couple of milliseconds later), the hub will be forced to download the entire file all over again.</p>
<p>There are ways of constraining this kind of attack, say by limiting the rate at which a hub accepts new content notifications. But the attacker could then just use multiple hubs to achieve the same effect – it would require very little extra effort on their part.</p>
<h3>Fake subscriptions</h3>
<p>Another potential avenue of attack, involves tricking a server into <a href="http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.2.html#subscribing" title="PubSubHubbub Core 0.2: Subscribing and Unsubscribing">subscribing</a> to a bunch of high-traffic feeds. This then forces the hub (or hubs) to <a href="http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.2.html#contentdistribution" title="PubSubHubbub Core 0.2: Content Distribution">push</a> a load of unwanted content at the target server. The server doesn’t even need to be a feed subscriber of any sort – as long as it’s listening for HTTP connections it’s a potential target.</p>
<p>Now the PubSubHubbub subscription mechanism does have <a href="http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.2.html#verifysub" title="PubSubHubbub Core 0.2: Hub Verifies Intent of the Subscriber">a form of authentication</a> to verify that the subscriber did genuinely request a subscription, but that’s fairly easy for an attacker to work around.</p>
<p>All they have to do is setup a temporary domain name pointing to their own server, and subscribe to a bunch of feeds as if they were a regular subscriber. Once the verification process was complete, and the hub was satisfied that the subscriptions were genuine, the attacker could then reconfigure their <a href="http://en.wikipedia.org/wiki/Domain_Name_System" title="Wikipedia: Domain Name System">DNS</a> to redirect the flood of updates to their victim’s IP address.</p>
<p>Now because the DNS entry is faked, the <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.23" title="HTTP/1.1: Header Field Definitions">host</a> headers in the update will obviously not match the target server. Thus, depending on how the server is configured, and the kind of web framework they are running, it’s possible this attack won’t have much effect. However, I’ve done enough testing to know that at least some server configurations would be vulnerable.</p>
<h3>Controlling the feed source</h3>
<p>At the end of the day, though, fake subscriptions are a fairly limited form of attack. Since data is only pushed to the victim’s server when a feed actually updates, the attacker would likely have to subscribe to hundreds of thousands of feeds to have any noticeable impact; and even then it wouldn’t be a particularly reliable attack vector.</p>
<p>So let’s consider a different approach. What if the attacker were providing the feed themselves? Since they have complete control over the source, they could make sure that the feed was different every time it was refreshed. And of course they could send new content notifications to the hub as frequently as they liked.</p>
<p>You might think that the attacker would then suffer the same bandwidth hit as the victim’s computer, but that’s not necessarily true. If the hub supports <a href="http://www.w3.org/TR/xml11/#sec-entexpand" title="XML 1.1: Expansion of Entity and Character References">XML entity expansion</a> (and some implementations clearly do), the attacker could easily create a feed that is minuscule on their end, but would expand considerably when pushed to the victim’s server.</p>
<p>Similar results can be achieved with <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5" title="HTTP/1.1: Protocol Parameters">HTTP compression</a>. If the hub supports compressed downloads (which is highly probable), the attacker can serve up a tiny <a href="http://www.ietf.org/rfc/rfc1952.txt" title="RFC 1952: GZIP file format specification">gzipped</a> feed, that would expand into something much more massive.</p>
<h3>Duplicate subscriptions</h3>
<p>While the hub and target server may have mechanisms in place to limit the amount of data that can be POSTed, there is another way an attacker can magnify the attack. The trick is to subscribe multiple times – perhaps thousands of times – using a different <a href="http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.2.html#rfc.section.6.1.1" title="PubSubHubbub Core 0.2: Subscription Parameter Details">callback URL</a> each time; say with a random path or query string.</p>
<p>From the point of view of the hub, each subscription is unique, so while the attacker’s source feed is only downloaded once, the victim’s computer would be hit with thousands of notification POSTs each time there was an update.</p>
<p>What’s worse, since these POSTs would likely result in an error response, the hub is encouraged by the specification to <a href="http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.2.html#contentdistribution" title="PubSubHubbub Core 0.2: Content Distribution">retry the notification attempt</a>, repeatedly. It’s almost as if the protocol has been <em>designed</em> to cause as much damage as possible.</p>
<h3>Unintentional attacks</h3>
<p>So far we’ve been considering deliberate attacks against specific targets, but there is also potential for unintentional (or at least undirected) attacks.</p>
<p>Consider a user on a home computer running some form of PubSubHubbub client software. If their <a href="http://en.wikipedia.org/wiki/Internet_service_provider" title="Wikipedia: Internet service provider">ISP</a> assigns them a <a href="http://en.wikipedia.org/wiki/IP_address#Static_and_dynamic_IP_addresses" title="Wikipedia: IP address">dynamic IP address</a>, as is often the case, and their connection to the Internet is disconnected, what happens to all of their subscriptions?</p>
<p>Sooner or later that ISP is going to recycle the IP address and assign it to another user, and that lucky user could find themselves inundated with incoming notifications that were never requested. If they also happen to be running a PubSubHubbub client, listening on the same port (not unlikely given the limited port support <a href="http://www.xn--8ws00zhy3a.com/blog/2009/11/pubsubhubbub-security-concerns#f13.2"><sup>2</sup></a>), this could cause them considerable grief.</p>
<p>While this scenario may not be likely, it has the potential to be quite damaging if it does occur. Home users often have limited bandwidth, and in some cases may be charged considerable fees for exceeding their <a href="http://en.wikipedia.org/wiki/Bandwidth_Caps#Download_quota" title="Wikipedia: Bandwidth cap">download quota</a>. They may not even realise anything is wrong until they find themselves with a massive bill at the end of the month.</p>
<h3>Conclusions</h3>
<p>It seems to me that the PubSubHubbub protocol is potentially quite dangerous. However, it’s equally possible that I’m wrong, the above-mentioned attacks are no threat at all, and my concerns are unfounded.</p>
<p>Either way, though, I think the specification is flawed in not having a section on security considerations. If nothing else, I hope that at least is something that the authors will address.</p>


				
					<br/><a href="http://news.ycombinator.com/item?id=955388">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>At a Software Powerhouse, the Good Life Is Under Siege</title>
        	<link>http://www.nytimes.com/2009/11/22/business/22sas.html?_r=1</link>
        	<comments>http://news.ycombinator.com/item?id=955061</comments>
	        <description>
    	        <![CDATA[
				
				
					<br/><a href="http://news.ycombinator.com/item?id=955061">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>ACM censors linking</title>
        	<link>http://realtimecollisiondetection.net/blog/?p=101</link>
        	<comments>http://news.ycombinator.com/item?id=955115</comments>
	        <description>
    	        <![CDATA[
				
<p>OK, WTF, this got me so annoyed that I had to get out of blog posting dormancy. I just went to Ke-Sen Huang&#8217;s <a href="http://kesen.huang.googlepages.com/">brilliant page</a> of conference papers on the web. Except, this time, all ACM pages (such as <a href="http://kesen.huang.googlepages.com/sig2009.html">SIGGRAPH 2009</a>, <a href="http://kesen.huang.googlepages.com/i3d2009Papers.htm">I3D 2009</a>, etc) have been taken down, with the comment &#8220;This page has been removed at the request of the ACM Publications Board.&#8221;</p>
<p><b>What the fuck!?</b></p>
<p>ACM has no rights to <strike>request</strike> require(*) someone to remove links to pages on the net, and it&#8217;s unfortunate that their request was complied with.</p>
<p>According to <a href="http://www.acm.org/publications/panel?pageIndex=4">this page</a> the ACM Publications Board is run by the following nasty little censoring asses:</p>
<p>Ronald F Boisvert (chair) - <a href="mailto: boisvert@acm.org, holly@acm.org, ozsu@acm.org, wh@ecs.soton.ac.uk">boisvert@acm.org</a><br />
Holly E Rushmeier (co-chair) - <a href="mailto: boisvert@acm.org, holly@acm.org, ozsu@acm.org, wh@ecs.soton.ac.uk">holly@acm.org</a><br />
Tamer M. Ozsu (vice-chair) - <a href="mailto: boisvert@acm.org, holly@acm.org, ozsu@acm.org, wh@ecs.soton.ac.uk">ozsu@acm.org</a></p>
<p>I strongly urge you to email them, with a cc to the ACM president <a href="http://www.acm.org/about/bios">Wendy Hall</a> (<a href="mailto: boisvert@acm.org, holly@acm.org, ozsu@acm.org, wh@ecs.soton.ac.uk">wh@ecs.soton.ac.uk</a>), to tell them what you really feel about ACM practicing censorship on Ke-Sen Huang&#8217;s pages (or anywhere)!</p>
<p>And if you have anything to do with ACM and SIGGRAPH, as people in the games industry tend to do, then I implore you to immediately stop your involvement and furthermore that you boycott their conferences (SIGGRAPH in particular) until they straighten their shit out.</p>
<p>Do not let their censoring of free information stand!</p>
<p>(*) Changed the wording here, because some dip-shit on Reddit can&#8217;t understand the message otherwise.</p>
<h3>Similar Posts:</h3>
<ul>
<li><a href="http://realtimecollisiondetection.net/blog/?p=75" rel="bookmark" title="August 10, 2008">SIGGRAPH and books</a></li>
<li><a href="http://realtimecollisiondetection.net/blog/?p=35" rel="bookmark" title="October 1, 2007">More Capcom/CEDEC bean-spilling</a></li>
<li><a href="http://realtimecollisiondetection.net/blog/?p=50" rel="bookmark" title="March 27, 2008">Programmers wanted!</a></li>
<li><a href="http://realtimecollisiondetection.net/blog/?p=51" rel="bookmark" title="April 3, 2008">Learning patterns and the game of Flip</a></li>
<li><a href="http://realtimecollisiondetection.net/books/list/">My recommended books</a></li></ul>
<p><!-- Similar Posts took 5.804 ms --></p>


				
					<br/><a href="http://news.ycombinator.com/item?id=955115">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>Awesome SQL blog</title>
        	<link>http://explainextended.com/</link>
        	<comments>http://news.ycombinator.com/item?id=954565</comments>
	        <description>
    	        <![CDATA[
				<p><a href="http://explainextended.com/ask-a-question"><strong>Ask me a question</strong></a></p>
(this form actually works)

<p><a href="http://explainextended.com/drop-me-a-line"><strong>Drop me a line</strong></a></p>
(this form works too)
<h3>Should I?</h3>
<p>Yes. Feel free to ask questions and write me. An interesting question is a pleasure to answer, and I really enjoy receiving feedback</p>
<!-- footer -->
				
					<br/><a href="http://news.ycombinator.com/item?id=954565">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>How to fix capitalism</title>
        	<link>http://pietersz.co.uk/2009/11/fix-capitalism</link>
        	<comments>http://news.ycombinator.com/item?id=955398</comments>
	        <description>
    	        <![CDATA[
				
<p id="heading"><a href="http://pietersz.co.uk">Graeme&#8217;s</a></p>
<h1><a href="http://pietersz.co.uk/2009/11/fix-capitalism" rel="bookmark">How to fix capitalism</a></h1><p><a href="http://pietersz.co.uk/about/subscribe">You can read new posts by RSS, email or through Facebook</a></p> 
<p>The recession and the crisis and banking are the least of the reasons for thinking that we need reforms. the crisis of capitalism goes much deeper: the <a href="http://pietersz.co.uk/2009/11/business-undermines-market">influence big business has on governments</a> (and the warped policies this leads to), increasing central control of the economy and the general  <a href="http://pietersz.co.uk/2007/02/not-free-markets">move away from free markets.</a>. I have some modest proposals on how to fix capitalism.<span id="more-392"></span></p>
<h2>Break up monopolies and oligopolies</h2>
<p>Under existing competition (anti-trust in American) laws, it is necessary to prove abuse of the <a href="http://moneyterms.co.uk/monopoly/">monopoly</a>. This allows a business to avoid competition, because it has not been proved to have used particular practices. Competition may be locked out (for example, by <a href="http://moneyterms.co.uk/network-effects/">network effects</a>) and consumers may suffer from a lack of innovation or product quality, but none of that is illegal.</p>
<p>The solution is to assume that monopolies are harmful and should be broken up. Either this should be an invariable rule, or it should be up to the monopolist to prove that the monopoly is somehow beneficial. An exception should be made for <a href="http://moneyterms.co.uk/natural-monopoly/"> natural monopolies</a>, but the price of that should be tight regulation, nationalisation, or (best of all) mutualisation.</p>
<p>That still leaves the problem of <a href="http://moneyterms.co.uk/oligopoly/">olgopolies</a>. The answer is simple: break up any company with enough market share to have a noticeable influence on prices &mdash; say more than 5% nationally or 10% at a city/county level. Again, they would need to make the case of exceptions.</p>
<p>Doing this would also mean that there would be no &#8220;too big to fail&#8221; banks, so a financial crisis would be easier to solve: let them go bust and nationalise the assets and liabilities.</p>
<h2>Remove barriers to entry</h2>
<ul>
<li>Abolish patents. They have not been proven to speed progress: the evidence seems to be to the contrary. They definitely increase costs, are <a href="http://pietersz.co.uk/2007/02/patents-inefficient"> an inefficient way of funding R &amp; D</a> and allow <a href="http://moneyterms.co.uk/cross-licensing/">oligopolists to block competition</a>.</li>
<li>Reduce the copyright term to the optimal length suggested by research of <a href="http://www.rufuspollock.org/2007/07/09/forever-minus-a-day-some-theory-and-empirics-of-optimal-copyright/">about 15 years</a>. It ought to be obvious that works produced in the reign of Queen Victoria should not be in copyright in the 21<sup>st</sup> century.</li>
<li>Exclude works distributed with <a href="http://www.defectivebydesign.org/what_is_drm">DRM</a> from copyright to ensure that copyright works do fall into the public domain when the copyright expires.</li>
<li>Reduce the copyright term on computer software to two years, and make copyright contingent on disclosing source code (so others can alter the software when it comes out of copyright).</li>
<li>Abolish region of origin rules. It should be legal to describe a Cava (when selling it) as having been made in the same way as Champagne.</li>
<li>Abolish unnecessarily restrictive licensing. Many US states require people to be licensed to work as interior designers or hairdressers. I can understand requiring doctors or auditors to be licensed, but these are just <a href="http://moneyterms.co.uk/barriers-to-entry/">barriers to entry</a>.</li>
</ul>
<h2>Reduce bureaucracy</h2>
<p>The best example of the problem (or opportunity from his point of view) that I have heard, is something Ted Tuppen, the founder and CEO of the huge British pub chain Enterprise Inns, said. I may not have got the wording exactly right, but, as I remember it, it was:</p>
<blockquote><p>There will always be pubs available to buy because owners of free houses are driven out of the business by the amount of bureaucracy.</p></blockquote>
<p>Small businesses cannot cope with tight regulation. Big businesses can hire teams of lawyers and paper-pushers. This is one of the many problems with patents. The government, far from discouraging oligopolies, is actually encouraging their formation.</p>
<h2>Stop being &#8220;business friendly&#8221;</h2>
<p>People seem to be thinking much less clearly about this now than they did in the 18<sup>th</sup> century. Back then, the business friendly ideology was called &#8220;mercantilism&#8221;, and it was this was the primary source of opposition to free markets. Now, governments profess to be in favour of free markets and &#8220;business friendly&#8221;.</p>
<p>Of course, businesses sometimes want free markets, for example they do not want to regulated. On the other hand they also want to minimise competition, reduce costs, receive subsidies and form cartels. Businesses are usually in favour of free markets in general, but not in the specific case of their own industry.</p>
<p>The new mercantilism is the root cause of the problems most of my other proposals seek to solve. It has also lead to a failure to regulate properly. The obvious examples are the clear failures in the regulation of banks (such as allowing deposit takers to have high risk investment banking operations), but there are others: the US broke up Standard Oil and AT &amp; T, but failed to break up Microsoft, reflecting the general trend towards letting businesses do as they like.</p>
<p>New mercantilism has dropped the one aspect of the 18<sup>th</sup> century form that I find has some redeeming features: economic nationalism. Democracy is compromised by the economic pressure tyrants can bring in a globalised economy. I also find it extremely odd that governments will minutely examine an applicant for a holiday visa, but allow a dubious foreign tycoon to gain great influence within their country by buying influential businesses.</p>
<p>New mercantilism is dishonest. It does not openly oppose free markets. Instead it relies on conflating free markets with capitalism.</p>
<h2>Financially penalise large businesses</h2>
<p>This idea is simple. Tax big companies more. This will discourage mergers except where there are clear gains. British tax law already has lower rates for small companies, but this does not go far enough. The rates should keep increasing as companies get larger (at the moment there are no further increases on companies with profits greater than £1.5m: I would suggest bands at say £15m, £150m and £1.5bn as well). Obviously, we would need similar systems in all major economies.</p>
<p>The size criteria should not be based on profit. It should be based on <a href="http://moneyterms.co.uk/value-added/">value added</a>: so a big company that has a bad year would not see its tax <em>rate</em> reduce (obviously taxes paid would do down in proportion to profit).</p>
<h2>Give shareholders control</h2>
<p>Shareholders are supposed to the owners of a company, but in the case of large listed companies this control is limited. This does lead to problems:</p>
<ul>
<li>Shareholders have to resort to expensive and disruptive means such as <a href="http://moneyterms.co.uk/hostile-takeover-bid/">accepting hostile takeover bids</a> to replace incompetent management &mdash; this also tends to encourage consolidation where there is no real economic benefit.</li>
<li>Management have an incentive to focus on the short term. They can take their bonuses and leave, while accumulating problems for the future.</li>
<li>Management tend to overpay themselves. As J.K. Galbraith said: &#8220;The high salary of the chief executive of a large corporation is not a market reward for achievement. It is frequently in the nature of a warm personal gesture from an individual to himself.&#8221;</li>
<li>Management indulge their egos, buy engaging in exciting takeovers, and risky businesses, rather than getting on with the humdrum but reliably profitable. It is impossible to prove what people were thinking, but it is hard not to believe that this contributed to the destruction of GEC/Marconi</li>
</ul>
<h2>Reject the corrosive &#8220;greed is good&#8221; ideology</h2>
<p>Adam Smith never intended that the idea of the &#8220;invisible hand&#8221; should be interpreted as meaning that people should pursue their own interests, and that this would lead to an optimum outcome. He wrote extensively on morality.</p>
<p>The reason for those troublesome bonus schemes for directors is that it is assumed that they would not run the company as well as they could unless they were &#8220;incentivised&#8221; with payments for success. This contradicts management theory: <a href="http://www.netmba.com/mgmt/ob/motivation/herzberg/">Herzberg classifies pay as a &#8220;hygine factor&#8221;</a>, a poor motivator compared to, for example, job satisfaction.</p>
<p>What is even worse is that by telling people that they are expected to be selfish, they become more selfish. <a href="http://www.robert-h-frank.com/PDFs/ES.2.17.05.pdf">Economics students become more selfish</a> because they are repeatedly taught to expect that people are rational and selfish: the association between the two can only strengthen the effect.</p>
<p>Society is permeated, especially in business, politics and economics, with the idea that is people pursue their own interests, this will automatically lead to the best outcome, and that, therefore, people should be selfish. This cannot be fixed by endless incentives to align interests: life and business is too complex for that to work. A free market is not a substitute for integrity.</p>
<h2>Break the loop</h2>
<p>What matters most is the rejection of the new mercantilism, which will at least stop things getting worse, but we still need to undo the legislation and the structures that have been put into place at the behest of the mercantilists. The two go together: the rise of the new mercantilism is partly the result of the lobbying power of large corporations. Break them up and reduce their power and they lose their influence.</p>
<p>Education is also important. Most people cannot, at the moment, distinguish between capitalism and free markets, or see the parallels between the original and the new mercantilism.</p>
<p></p>
<h3 id="comments">Comments(4)</h3>

<p>[...] it up on my door, as it were. So here it is, in full.  The full essay with all its many links is on Graeme&#8217;s site, along with many of his other thoughtful pieces, so go there if you want the Full Monty:  The [...]</p>

<p>What a splendid manifesto. I&#8217;m nailing it to my blog.</p>

<p>Thanks Charles and Alan. Please note that it is under a Creative Commons attribution non-commercial no derivatives license so it can be reproduced by most blogs and other websites as long as you link back here. Commercial is OK as long as people do not have to pay to read it.</p>

<p>[...] Tweets about this great post on TwittLink.com [...]</p>
<a id="respond"></a>



				
					<br/><a href="http://news.ycombinator.com/item?id=955398">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>The First Universal Quantum Processor</title>
        	<link>http://www.physorg.com/news177515046.html</link>
        	<comments>http://news.ycombinator.com/item?id=954924</comments>
	        <description>
    	        <![CDATA[
				
<h2>Scientists demonstrate 'universal' programmable quantum processor</h2>
<small>November 15, 2009 </small>
<!-- Main -->
<!-- <div id="news-main"> -->
<span>
<img src="http://www.physorg.com/newman/gfx/news/33-scientistsde.jpg" align="left" alt="Scientists demonstrate 'universal' programmable quantum processor" /></span><p><a rel="lightbox" href="http://www.physorg.com/newman/gfx/news/hires/33-scientistsde.jpg" title="NIST postdoctoral researcher David Hanneke at the laser table used to demonstrate the first universal
programmable processor for a potential quantum computer. A pair of beryllium ions (charged atoms) that hold information in the processor are trapped inside the cylinder at the lower right. A colorized
image of the two ions is displayed on the monitor in the background. Credit: J. Burrus/NIST">Enlarge</a></p>

<!-- google_ad_section_start -->
<p>NIST postdoctoral researcher David Hanneke at the laser table used to demonstrate the first universal
programmable processor for a potential quantum computer. A pair of beryllium ions (charged atoms) that hold information in the processor are trapped inside the cylinder at the lower right. A colorized
image of the two ions is displayed on the monitor in the background. Credit: J. Burrus/NIST</p>
<p>
<strong>Physicists at the National Institute of Standards and Technology have demonstrated the first "universal" programmable quantum information<br />processor able to run any program allowed by quantum mechanics -- the rules governing the submicroscopic world -- using two quantum bits (qubits) of information. The processor could be a module in a future quantum computer, which theoretically could solve some important problems that are intractable today.</strong>
</p>
<!-- Google FISRT Adsense block -->



<p>The NIST demonstration, described in <i>Nature Physics</i>, marks the first time any research group has moved beyond demonstrating individual tasks for a quantum processoras done previously at NIST and elsewhereto perform programmable processing, combining enough inputs and continuous steps to run any possible two-qubit program. </p>
<p>The NIST team also analyzed the quantum processor with the methods used in traditional computer science and electronics by creating a diagram of the processing circuit and mathematically determining the 15 different starting values and sequences of processing operations needed to run a given program. "This is the first time anyone has demonstrated a programmable quantum processor for more than one <a href="http://www.physorg.com/tags/qubit/" rel="tag">qubit</a>," says NIST postdoctoral researcher David Hanneke, first author of the paper. "It's a step toward the big goal of doing calculations with lots and lots of qubits. The idea is you'd have lots of these processors, and you'd link them together." </p>
<p>The NIST processor stores binary information (1s and 0s) in two beryllium ions (electrically charged atoms), which are held in an electromagnetic trap and manipulated with ultraviolet lasers. Two <a href="http://www.physorg.com/tags/magnesium/" rel="tag">magnesium</a> ions in the trap help cool the beryllium ions. </p>
<p>NIST scientists can manipulate the states of each <a href="http://www.physorg.com/tags/beryllium/" rel="tag">beryllium</a> qubit, including placing the ions in a "superposition" of both 1 and 0 values at the same time, a significant potential advantage of information processing in the quantum world. Scientists also can "entangle" the two qubits, a quantum phenomenon that links the pair's properties even when the ions are physically separated. </p>
<p>With these capabilities, the NIST team performed 160 different processing routines on the two qubits. Although there are an infinite number of possible two-qubit programs, this set of 160 is large and diverse enough to fairly represent them, Hanneke says, making the processor "universal." Key to the experimental design was use of a random number generator to select the particular routines that would be executed, so all possible programs had an equal chance of selection. This approach was chosen to avoid bias in testing the processor, in the event that some programs ran better or produced more accurate outputs than others. <!-- inj G3 --><br />
<!-- Google FISRT Adsense block -->



</p>
<p>Ions are among several promising types of qubits for a quantum computer. If they can be built, quantum computers have many possible applications such as breaking today's most widely used encryption codes, such as those that protect electronic financial transactions. In addition to its possible use as a module of a quantum computer, the new processor might be used as a miniature simulator for interactions in any quantum system that employs two energy levels, such as the two-level ion qubit systems that represent energy levels as 0s and 1s. Large quantum simulators could, for example, help explain the mystery of high-temperature superconductivity, the transmission of electricity with zero resistance at temperatures that may be practical for efficient storage and distribution of electric power. </p>
<p>The new paper is the same NIST research group's third major paper published this year based on data from experiments with trapped ions. They <a href="http://www.physorg.com/news168791155.html">previously demonstrated sustained quantum information processing and entanglement</a> in a <a href="http://www.physorg.com/news163253992.html">mechanical system</a> similar to those in the macroscopic everyday world. NIST <a href="http://www.physorg.com/tags/quantum+computing/" rel="tag">quantum computing</a> research contributes to advances in national priority areas, such as information security, as well as NIST mission work in precision measurement and atomic clocks. </p>
<p>In the latest NIST experiments reported in Nature Physics, each program consisted of 31 logic operations, 15 of which were varied in the programming process. A logic operation is a rule specifying a particular manipulation of one or two qubits. In traditional computers, these operations are written into software code and performed by hardware. </p>
<p>The programs did not perform easily described mathematical calculations. Rather, they involved various single-qubit "rotations" and two-qubit entanglements. As an example of a rotation, if a qubit is envisioned as a dot on a sphere at the north pole for 0, at the south pole for 1, or on the equator for a balanced superposition of 0 and 1, the dot might be rotated to a different point on the sphere, perhaps from the northern to the southern hemisphere, making it more of a 1 than a 0. </p>
<p>Each program operated accurately an average of 79 percent of the time across 900 runs, each run lasting about 37 milliseconds. To evaluate the processor and the quality of its operation, NIST scientists compared the measured outputs of the programs to idealized, theoretical results. They also performed extra measurements on 11 of the 160 programs, to more fully reconstruct how they ran and double-check the outputs. </p>
<p>As noted in the paper, many more qubits and logic operations will be required to solve large problems. A significant challenge for future research will be reducing the errors that build up during successive operations. Program accuracy rates will need to be boosted substantially, both to achieve fault-tolerant computing and to reduce the computational "overhead" needed to correct errors after they occur, according to the paper. </p>
<p>As a non-regulatory agency of the U.S. Department of Commerce, NIST promotes U.S. innovation and industrial competitiveness by advancing measurement science, standards and technology in ways that enhance economic security and improve our quality of life. </p>
<p><u>More information:</u> D. Hanneke, J.P. Home, J.D. Jost, J.M. Amini, D. Leibfried & D.J. Wineland. 2009. Realization of a programmable two-qubit quantum processor. <i><a href="http://www.physorg.com/tags/nature+physics/" rel="tag">Nature Physics</a></i>. Posted online Nov. 15.</p>
<p>Source: National Institute of Standards and Technology (<a href="http://www.physorg.com/partners/national-institute-of-standards-and-technology/" rel="news">news</a> : <a href="http://www.nist.gov/index.html" target="_blank">web</a>)<br /></p>
<br />
<!-- Google second Adsense block -->

<!-- google adsense -->

<!--post footer here//-->
<div>
<a href="http://www.physorg.com/print177515046.html"><img src="http://www.physorg.com/tmpl/default/img/icon-small-print.gif" alt="print this article" /></a>
<a href="http://www.physorg.com/email177515046.html"><img src="http://www.physorg.com/tmpl/default/img/icon-small-email.gif" alt="email this article" /></a>
<a href="http://www.physorg.com/pdf177515046.pdf"><img src="http://www.physorg.com/tmpl/default/img/icon-small-pdf.gif" alt="download pdf" /></a>
<a href="http://www.physorg.com/blog177515046.html" nclick="window.open('http://www.physorg.com/blog177515046.html','BlogIt','scrollbars=no,menubar=no,toolbar=no,location=no,status=no,height=450,width=450,resizable=yes'); return false;"><img src="http://www.physorg.com/tmpl/default/img/icon-small-edit.gif" alt="blog this article" /></a>
<a href="http://www.physorg.com/profile/?code=fav&amp;nid=177515046"><img src="http://www.physorg.com/tmpl/default/img/icon-small-fave.gif" alt="bookmark this article" /></a>		
									
									&nbsp;&nbsp;&nbsp;
									 
									<a href="http://www.stumbleupon.com/submit?url=http://www.physorg.com/news177515046.html&amp;title=Scientists+demonstrate+%27universal%27+programmable+quantum+processor" title="Stumble it"><img border="0" src="http://cdn.stumble-upon.com/images/16x16_su_solid.gif" width="16" height="16" alt="Stumble it" /></a>
<a href='http://digg.com/submit?url=http://www.physorg.com/news177515046.html&amp;title=Scientists demonstrate &squot;universal&squot; programmable quantum processor&amp;bodytext=Physicists at the National Institute of Standards and Technology have demonstrated the first "universal" programmable quantum informationprocessor able to run any program allowed by quantum mechanics -- the rules governing the submicroscopic world -- using two quantum bits (qubits) of information. The processor could be a module in a future quantum computer, which theoretically could solve some important problems that are intractable today.&amp;media=news&amp;topic=general_sciences' title="Digg it"><img src="http://www.physorg.com/tmpl/default/img/digg.png" width="16" height="16" alt="Digg this" /></a>
<a href="http://www.facebook.com/share.php?u=http://www.physorg.com/news177515046.html" title="share on Facebook"><img src="http://www.physorg.com/tmpl/default/img/facebook.png" width="16" height="16" alt="share on Facebook" /></a>
<!-- twitter -->
<a href="http://twitter.com/home?status=RT+@physorg_com+Scientists+demonstrate+%27universal%27+programmable+quantum+processor+http://www.physorg.com/news177515046.html" title="retweet" target="_blank"><img src="http://www.physorg.com/tmpl/default/img/twitter-icon.gif" width="16" height="16" alt="retweet" /></a>
<a href="http://reddit.com/submit?url=http://www.physorg.com/news177515046.html&amp;title=Scientists+demonstrate+%27universal%27+programmable+quantum+processor" title="share on Reddit"><img src="http://www.physorg.com/tmpl/default/img/reddit.png" width="16" height="16" alt="share on Reddit" /></a>
<a href="http://del.icio.us/post?url=http://www.physorg.com/news177515046.html" title="add to delicious"><img src="http://www.physorg.com/tmpl/default/img/symb-deli1.gif" width="19" height="19" alt="add to delicious" /></a>
<!-- <p class="sharethis"></p>	 -->

</div>
<!--post footer here//-->
<div>
									Rate this story - <span id="bottom-vote">4.6 /5 (21 votes)</span>
<!--rating footer here//-->
<div>
<ul id="nwvoteBt">
<li>rank</li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="rateit('177515046','1', 'bottom-vote'); return false;" title="1 star out of 5">1</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="rateit('177515046','2', 'bottom-vote'); return false;" title="2 stars out of 5">2</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="rateit('177515046','3', 'bottom-vote'); return false;" title="3 stars out of 5">3</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="rateit('177515046','4', 'bottom-vote'); return false;" title="4 stars out of 5">4</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="rateit('177515046','5', 'bottom-vote'); return false;" title="5 stars out of 5">5</a></li>
</ul>
</div>

<!--rating footer here//-->
</div>
<!--comments here//-->
<div>
<!-- first comment -->
<a name="firstCmt"></a>

<p>Move the slider to adjust rank threshold, so that you can hide some of the comments.</p>
<br />
</div>

<br />
<ul id="comments">
<li>
<small><a href="http://www.physorg.com/profile/user/NeilFarbstein">NeilFarbstein</a> - Nov 15, 2009</small>
<ul>
<li>Rank: <span id="rk-70560">not rated yet</span></li>
</ul>

<ul>
<li><a href="http://www.physorg.com/news177515046.html#flag" onclick="FlagComment(70560); return false;">report abuse</a></li>
<li>
<ul id="rate-70560">
<li>Current rank</li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70560,1); return false;" title="1 star out of 5">1</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70560,2); return false;" title="2 stars out of 5">2</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70560,3); return false;" title="3 stars out of 5">3</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70560,4); return false;" title="4 stars out of 5">4</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70560,5); return false;" title="5 stars out of 5">5</a></li>
</ul>
</li>
</ul>
</li> <li>
<small><a href="http://www.physorg.com/profile/user/Damon_Hastings">Damon_Hastings</a> - Nov 15, 2009</small>
<ul>
<li>Rank: <span id="rk-70588">not rated yet</span></li>
</ul>
<div id="cm_70588">I think it has something to do with the superposition of states allowing massively parallel computation within a single processor.  In essence, the processor tries out all possible solutions to a problem simultaneously, with each potential solution represented by one state in the superposition.  The correct solution is then &quot;chosen&quot; by the instantaneous waveform collapse (where the collapse is guided by the probability distribution function carefully crafted by the processor).  Thus, the processor tries out thousands of solutions in the time it would normally take to try only one.  And now put tons of those processors on the same chip!<p>But I don't pretend to really understand any of this.  As a computer programmer, I'm beginning to wonder whether I'm going to need QM classes to program future computers effectively...</p></div>
<ul>
<li><a href="http://www.physorg.com/news177515046.html#flag" onclick="FlagComment(70588); return false;">report abuse</a></li>
<li>
<ul id="rate-70588">
<li>Current rank</li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70588,1); return false;" title="1 star out of 5">1</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70588,2); return false;" title="2 stars out of 5">2</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70588,3); return false;" title="3 stars out of 5">3</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70588,4); return false;" title="4 stars out of 5">4</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70588,5); return false;" title="5 stars out of 5">5</a></li>
</ul>
</li>
</ul>
</li> <li>
<small><a href="http://www.physorg.com/profile/user/Arikin">Arikin</a> - Nov 15, 2009</small>
<ul>
<li>Rank: <span id="rk-70591">not rated yet</span></li>
</ul>
<div id="cm_70591">Damon_Hastings,  You won't need QM classes.  That is the whole point of the &quot;programs&quot; they were testing.  Abstraction from the inner hardware workings allows you the programmer to program and not think about that.<p>This is almost the same process of current computers when the modern version started out.  Think of room sized computers with punch cards that could barely do anything.</p></div>
<ul>
<li><a href="http://www.physorg.com/news177515046.html#flag" onclick="FlagComment(70591); return false;">report abuse</a></li>
<li>
<ul id="rate-70591">
<li>Current rank</li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70591,1); return false;" title="1 star out of 5">1</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70591,2); return false;" title="2 stars out of 5">2</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70591,3); return false;" title="3 stars out of 5">3</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70591,4); return false;" title="4 stars out of 5">4</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70591,5); return false;" title="5 stars out of 5">5</a></li>
</ul>
</li>
</ul>
</li> <li>
<small><a href="http://www.physorg.com/profile/user/Damon_Hastings">Damon_Hastings</a> - Nov 15, 2009</small>
<ul>
<li>Rank: <span id="rk-70594">not rated yet</span></li>
</ul>
<div id="cm_70594">Well, the programs they were testing in this article consisted entirely of esoteric quantum operations such as &quot;rotations&quot; and &quot;entanglements&quot;.  Same story with all existing &quot;quantum programming languages&quot; listed at <a href="http://en.wikipedia.org/wiki/Quantum_programming" title="http://en.wikipedia.org/wiki/Quantum_programming" rel="nofollow" target="_blank">http://en.wikiped...gramming</a><p>There are efforts underway to create a functional (conventional) Quantum Programming language, but they're still very much in the early stages: <a href="http://www.dcs.gla.ac.uk/~simon/publications/QPLsurvey.pdf" title="http://www.dcs.gla.ac.uk/~simon/publications/QPLsurvey.pdf" rel="nofollow" target="_blank">http://www.dcs.gl...rvey.pdf</a> -- and they'll be... weird.</p><p>&quot;quantum computers raise interesting problems<br />for the design of programming languages&quot;</p><p>&quot;it was only in 1996 that work towards the design of [high-level Quantum Programming] languages began to be published.&quot;</p><p>I'm certain today's programs will run on tomorrow's quantum computers, but they might not actually make use of those computers' &quot;quantumness&quot;, i.e. the massive internal parallelism that will provide such incredible speed -- unless you translate the programs to a QP language.</p></div>
<ul>
<li><a href="http://www.physorg.com/news177515046.html#flag" onclick="FlagComment(70594); return false;">report abuse</a></li>
<li>
<ul id="rate-70594">
<li>Current rank</li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70594,1); return false;" title="1 star out of 5">1</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70594,2); return false;" title="2 stars out of 5">2</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70594,3); return false;" title="3 stars out of 5">3</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70594,4); return false;" title="4 stars out of 5">4</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70594,5); return false;" title="5 stars out of 5">5</a></li>
</ul>
</li>
</ul>
</li> <li>
<small><a href="http://www.physorg.com/profile/user/ReeseJ2">ReeseJ2</a> - Nov 16, 2009</small>
<ul>
<li>Rank: <span id="rk-70605">not rated yet</span></li>
</ul>

<ul>
<li><a href="http://www.physorg.com/news177515046.html#flag" onclick="FlagComment(70605); return false;">report abuse</a></li>
<li>
<ul id="rate-70605">
<li>Current rank</li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70605,1); return false;" title="1 star out of 5">1</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70605,2); return false;" title="2 stars out of 5">2</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70605,3); return false;" title="3 stars out of 5">3</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70605,4); return false;" title="4 stars out of 5">4</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70605,5); return false;" title="5 stars out of 5">5</a></li>
</ul>
</li>
</ul>
</li> <li>
<small><a href="http://www.physorg.com/profile/user/Damon_Hastings">Damon_Hastings</a> - Nov 16, 2009</small>
<ul>
<li>Rank: <span id="rk-70611"><span>5</span> / 5 (2)</span></li>
</ul>

<ul>
<li><a href="http://www.physorg.com/news177515046.html#flag" onclick="FlagComment(70611); return false;">report abuse</a></li>
<li>
<ul id="rate-70611">
<li>Current rank</li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70611,1); return false;" title="1 star out of 5">1</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70611,2); return false;" title="2 stars out of 5">2</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70611,3); return false;" title="3 stars out of 5">3</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70611,4); return false;" title="4 stars out of 5">4</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70611,5); return false;" title="5 stars out of 5">5</a></li>
</ul>
</li>
</ul>
</li> <li>
<small><a href="http://www.physorg.com/profile/user/Noumenon">Noumenon</a> - Nov 16, 2009</small>
<ul>
<li>Rank: <span id="rk-70615">not rated yet</span></li>
</ul>
<div id="cm_70615">&quot;.... have many possible applications such as breaking today's most widely used encryption codes, such as those that protect electronic financial transactions&quot;<p>Why would anyone want to do this? <br /></p></div>
<ul>
<li><a href="http://www.physorg.com/news177515046.html#flag" onclick="FlagComment(70615); return false;">report abuse</a></li>
<li>
<ul id="rate-70615">
<li>Current rank</li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70615,1); return false;" title="1 star out of 5">1</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70615,2); return false;" title="2 stars out of 5">2</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70615,3); return false;" title="3 stars out of 5">3</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70615,4); return false;" title="4 stars out of 5">4</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70615,5); return false;" title="5 stars out of 5">5</a></li>
</ul>
</li>
</ul>
</li> <li>
<small><a href="http://www.physorg.com/profile/user/Noumenon">Noumenon</a> - Nov 16, 2009</small>
<ul>
<li>Rank: <span id="rk-70616">not rated yet</span></li>
</ul>

<ul>
<li><a href="http://www.physorg.com/news177515046.html#flag" onclick="FlagComment(70616); return false;">report abuse</a></li>
<li>
<ul id="rate-70616">
<li>Current rank</li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70616,1); return false;" title="1 star out of 5">1</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70616,2); return false;" title="2 stars out of 5">2</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70616,3); return false;" title="3 stars out of 5">3</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70616,4); return false;" title="4 stars out of 5">4</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70616,5); return false;" title="5 stars out of 5">5</a></li>
</ul>
</li>
</ul>
</li> <li>
<small><a href="http://www.physorg.com/profile/user/eachus">eachus</a> - Nov 16, 2009</small>
<ul>
<li>Rank: <span id="rk-70617">not rated yet</span></li>
</ul>
<div id="cm_70617">Damon_Hastings: <blockquote>  Man, I hope you're right.  After a few hours of studying QM, I inevitably start to feel like someone must have slipped a tab of acid into my drink...  </blockquote><br />You are getting there.  I used to think that, &quot;You don't need to be crazy to understand quantum menchanics, but it helps.&quot;  Now I realize that anyone who understands QM had better conceal that understanding around psychiatrists.  You have to think in a way that they would see as a non-functional world view.<p>Will we get to the point where a classical world-view will be recognized as a special case of QM?  I doubt it.  The views are just too different.  In a QM experiment, I have to accept that the calculated probability of a particle being in a particular place has to be understood as the particle being smeared over all possible positions.  Not two places at once, but an infinite (aleph-1) number of positions.<br /></p></div>
<ul>
<li><a href="http://www.physorg.com/news177515046.html#flag" onclick="FlagComment(70617); return false;">report abuse</a></li>
<li>
<ul id="rate-70617">
<li>Current rank</li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70617,1); return false;" title="1 star out of 5">1</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70617,2); return false;" title="2 stars out of 5">2</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70617,3); return false;" title="3 stars out of 5">3</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70617,4); return false;" title="4 stars out of 5">4</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70617,5); return false;" title="5 stars out of 5">5</a></li>
</ul>
</li>
</ul>
</li> <li>
<small><a href="http://www.physorg.com/profile/user/avacoder">avacoder</a> - Nov 16, 2009</small>
<ul>
<li>Rank: <span id="rk-70620">not rated yet</span></li>
</ul>

<ul>
<li><a href="http://www.physorg.com/news177515046.html#flag" onclick="FlagComment(70620); return false;">report abuse</a></li>
<li>
<ul id="rate-70620">
<li>Current rank</li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70620,1); return false;" title="1 star out of 5">1</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70620,2); return false;" title="2 stars out of 5">2</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70620,3); return false;" title="3 stars out of 5">3</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70620,4); return false;" title="4 stars out of 5">4</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70620,5); return false;" title="5 stars out of 5">5</a></li>
</ul>
</li>
</ul>
</li> <li>
<small><a href="http://www.physorg.com/profile/user/Noumenon">Noumenon</a> - Nov 16, 2009</small>
<ul>
<li>Rank: <span id="rk-70627"><span>1</span> / 5 (1)</span></li>
</ul>

<ul>
<li><a href="http://www.physorg.com/news177515046.html#flag" onclick="FlagComment(70627); return false;">report abuse</a></li>
<li>
<ul id="rate-70627">
<li>Current rank</li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70627,1); return false;" title="1 star out of 5">1</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70627,2); return false;" title="2 stars out of 5">2</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70627,3); return false;" title="3 stars out of 5">3</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70627,4); return false;" title="4 stars out of 5">4</a></li>
<li><a href="http://www.physorg.com/news177515046.html" onclick="RateComment(70627,5); return false;" title="5 stars out of 5">5</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<span id="postbox"></span>
<!-- google_ad_section_end -->


<!-- </div> -->
<!-- Main end //-->

				
					<br/><a href="http://news.ycombinator.com/item?id=954924">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>Number Gossip</title>
        	<link>http://www.numbergossip.com/</link>
        	<comments>http://news.ycombinator.com/item?id=955329</comments>
	        <description>
    	        <![CDATA[
				
<h1>Number Gossip</h1>

<p id="instructions">(Enter a number and I'll tell you everything you wanted to know about it but were afraid to ask.)</p>



				
					<br/><a href="http://news.ycombinator.com/item?id=955329">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>Morality, Compassion and the Sociopath</title>
        	<link>http://www.ribbonfarm.com/2009/11/21/morality-compassion-and-the-sociopath/</link>
        	<comments>http://news.ycombinator.com/item?id=955072</comments>
	        <description>
    	        <![CDATA[
				
				
					<br/><a href="http://news.ycombinator.com/item?id=955072">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>All this learning means nothing until you make something happen</title>
        	<link>http://sivers.org/confidence</link>
        	<comments>http://news.ycombinator.com/item?id=954661</comments>
	        <description>
    	        <![CDATA[
				<!-- Confidence required -->
<p>
Most of the time, we are working hard, head down, using what we know.
</p><p>
We get better and better at it. We make little improvements, and keep working. Our expertise and confidence keeps increasing.
</p><p>
We can’t afford to stop and question everything. We can’t go back to school. We have work to do.
</p><p>
Until we don’t.
</p><p>
Last year I left my company, and decided to start a new one.
</p><p>
I wanted to <strong>replace my old thoughts with new ones</strong>.  I had been working hard, doing one thing in one mindset for ten years, and needed to install a new operating system in my brain.
</p><p>
I read <a href="http://sivers.org/book">a lot of books</a> on <a href="http://sivers.org/book/EMythRevisited">business</a>, <a href="http://sivers.org/book/Influence">social psychology</a>, <a href="http://sivers.org/book/UltimateSalesMachine">management</a>, <a href="http://sivers.org/book/HowWeDecide">behavioral economics</a>, <a href="http://sivers.org/book/FourPillarsOfInvesting">investing</a>, <a href="http://sivers.org/book/PredictablyIrrational">cognitive biases</a>, <a href="http://sivers.org/book/WisdomOfCrowds">crowds</a>, <a href="http://sivers.org/book/CultingOfBrands">marketing</a>, <a href="http://sivers.org/book/NeverEatAlone">networking</a>, <a href="http://sivers.org/book/ArtOfLearning">learning</a>, and <a href="http://sivers.org/book/YouInc">communication</a>.
</p><p>
But each book that made me feel smarter (“Aha! I think I understand the world better now!”) also made me feel dumber (“Wow, I’ve been an idiot. It’s surprising I survived at all.”)
</p><p>
For example, when I read “<a href="http://sivers.org/book/WhatGotYouThere">What Got You Here Won’t Get You There</a>”, I realized what a horrible manager I’d been - how I’ve been dealing with people all wrong. It felt like the author had been hiding under my desk for 10 years, making a list of what not to do, and he was right. I’ve got so much to learn to be a good manager.
</p><p>
Business experts like <a href="http://sivers.org/book/Execution">Ram Charan</a>, <a href="http://sivers.org/book/InnovatorsSolution">Clayton Christensen</a>, <a href="http://sivers.org/book/ArtOfProfitability">Adrian Slywotzky</a> and <a href="http://www.poorcharliesalmanack.com/">Charlie Munger</a> made me feel like a court jester next to a samurai. I long to have their insight and expertise. I could study hard for 30 years and barely catch up.
</p><p>
Plus an ex-employee I’d fired, and an ex-girlfriend I’d broken up with, made sure I knew what a horrible horrible person I am. Not only am I an idiot, I’m dangerous! Destroying others in my path.
</p><p>
<strong>It was all very humbling.</strong>
</p><p>
So humbling, that I found it hard to do anything at all.
</p><p>
I had designed and announced my new company. I was psyched for it to exist. But when it came down to doing the necessary work, I hesitated and procrastinated. “Who am I to be starting another company? I’m just going to fuck it up like last time.“
</p><p>
After all I’ve learned, I can’t believe anyone actually thinks they’ll succeed in the complex world of business.  Don’t they see all the really smart people who have tried and failed?
</p><p>
I can’t believe how foolish I was to start my first company. Just <a href="http://www.jpfolks.com/ECRoadTrip00/ECpages/cdbaby.html">me in my bedroom</a> with no experience, making a little website, when I was up against giant IPO-funded competitors.
</p><p>
I was an over-confident punk, thinking I had the answer, and everyone else didn’t.
</p><p>
But it worked.
</p><p>
And in fact, <strong>isn’t that kind of confidence absolutely required to get anything done?</strong>
</p><p>
Isn’t the role of the entrepreneur to be the bold, daring, audacious one?  The over-confident reckless one who says, “<a href="http://www.virgin.com/richard-branson/books/screw-it-lets-do-it/">Screw it. Let’s do it!</a>”?
</p><p>
Yes! Of course! It’s the essential final lesson: that <strong>all this learning means nothing until you make something happen</strong>.
</p><p>
Whether you think you'll win or not - you need to jump in the game, and say, “Let’s go!”
</p><p>
Whether your confidence is naïve, inspired or crafted - you need its high-horsepower engine to get uphill and go anywhere.
</p><p>
And no matter how humbling the lessons of life are, this final lesson is the most important of all.
</p><p>
And thus, I graduated from my self-created Entrepreneur 102 class.
</p><p>
Time to go make <a href="http://muckwork.com">something</a> happen.
</p>
				
					<br/><a href="http://news.ycombinator.com/item?id=954661">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>Ask HN: What APIs do you wish existed?</title>
        	<link>http://news.ycombinator.com/item?id=955077</link>
        	<comments>http://news.ycombinator.com/item?id=955077</comments>
	        <description>
    	        <![CDATA[
				
				
					<br/><a href="http://news.ycombinator.com/item?id=955077">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>Google Ad Planner has much better site traffic stats</title>
        	<link>https://www.google.com/adplanner/</link>
        	<comments>http://news.ycombinator.com/item?id=955322</comments>
	        <description>
    	        <![CDATA[
				
<h1>
              Which websites attract your target customers?
            </h1>

<br />
<p>
              Refine your online advertising with Google Ad Planner, a free media planning tool that can help you:
            </p>
<strong>Identify websites your target customers are likely to visit</strong>
<ul>
<li>Define audiences by demographics and interests.
              </li>
<li>Search for websites relevant to your target audience.
              </li>
<li>Access unique users, page views, and other data for millions of websites from over 40 countries.
              </li>
</ul>
<strong>Easily build media plans for yourself or your clients</strong>
<ul>
<li>Create lists of websites where you'd like to advertise.
              </li>
<li>Generate aggregated website statistics for your media plan.
              </li>
</ul>

				
					<br/><a href="http://news.ycombinator.com/item?id=955322">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>Morgan Stanley’s $9 Billion Check</title>
        	<link>http://www.andrewrosssorkin.com/?p=355</link>
        	<comments>http://news.ycombinator.com/item?id=954766</comments>
	        <description>
    	        <![CDATA[
				
<p>As detailed in <a href="http://www.amazon.com/Too-Big-Fail-Washington-FinancialSystem/dp/0670021253/ref=pd_sim_b_3">Too Big to Fail: How Wall Street and Washington Fought to Save the Financial System &#8212; and Themselves</a>, Morgan Stanley received a $9 billion investment from Mitsubishi UFJ in the fall of 2008 that kept the firm from collapsing. The payment was supposed to be wired electronically, but because it needed to be made on an emergency basis on a holiday, Mitsubishi cut a physical check, perhaps the largest ever written.</p>
<p>Below is a copy of the $9,000,000,000.00 check.</p>
<p><atitle>Too Big to Fail: The $9 Billion Japanese Check to Morgan Stanley  </atitle></p>


				
					<br/><a href="http://news.ycombinator.com/item?id=954766">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>The Henry Ford of Heart Surgery</title>
        	<link>http://online.wsj.com/article/SB125875892887958111.html</link>
        	<comments>http://news.ycombinator.com/item?id=955090</comments>
	        <description>
    	        <![CDATA[
				<h3>By <a href="http://online.wsj.com/search/search_center.html?KEYWORDS=GEETA+ANAND&amp;ARTICLESEARCHQUERY_PARSER=bylineAND">GEETA ANAND</a>
</h3><p>BANGALORE -- Hair tucked into a surgical cap, eyes hidden behind thick-framed magnifying glasses, Devi Shetty leans over the sawed open chest of an 11-year-old boy, using bright blue thread to sew an artificial aorta onto his stopped heart.</p>
<p>As Dr. Shetty pulls the thread tight with scissors, an assistant reads aloud a proposed agreement for him to build a new hospital in the Cayman Islands that would primarily serve Americans in search of lower-cost medical care. The agreement is inked a few days later, pending approval of the Cayman parliament.</p>
<p>Dr. Shetty, who entered the limelight in the early 1990s as Mother Teresa's cardiac surgeon, offers cutting-edge medical care in India at a fraction of what it costs elsewhere in the world. His flagship heart hospital charges $2,000, on average, for open-heart surgery, compared with hospitals in the U.S. that are paid between $20,000 and $100,000, depending on the complexity of the surgery.</p>
<p>The approach has transformed health care in India through a simple premise that works in other industries: economies of scale. By driving huge volumes, even of procedures as sophisticated, delicate and dangerous as heart surgery, Dr. Shetty has managed to drive down the cost of health care in his nation of one billion.</p>
<p>His model offers insights for countries worldwide that are struggling with soaring medical costs, including the U.S. as it debates major health-care overhaul.</p>
<p>"Japanese companies reinvented the process of making cars. That's what we're doing in health care," Dr. Shetty says. "What health care needs is process innovation, not product innovation."</p>
<p>At his flagship, 1,000-bed Narayana Hrudayalaya Hospital, surgeons operate at a capacity virtually unheard of in the U.S., where the average hospital has 160 beds, according to the American Hospital Association.</p>
<p>Narayana's 42 cardiac surgeons performed 3,174 cardiac bypass surgeries in 2008, more than double the 1,367 the Cleveland Clinic, a U.S. leader, did in the same year. His surgeons operated on 2,777 pediatric patients, more than double the 1,026 surgeries performed at Children's Hospital Boston.</p>
<p>Next door to Narayana, Dr. Shetty built a 1,400-bed cancer hospital and a 300-bed eye hospital, which share the same laboratories and blood bank as the heart institute. His family-owned business group, Narayana Hrudayalaya Private Ltd., reports a 7.7% profit after taxes, or slightly above the 6.9% average for a U.S. hospital, according to American Hospital Association data.</p>
<p>The group is fueling its expansion plans through private equity, having raised $90 million last year. The money is funding four more "health cities" under construction around India. Over the next five years, Dr. Shetty's company plans to take the number of total hospital beds to 30,000 from about 3,000, which would make it by far the largest private-hospital group in India.</p>
<p>At that volume, he says, he would be able to cut costs significantly more by bypassing medical equipment sellers and buying directly from suppliers.</p>
<p>Then there are the Cayman Islands, where he plans to build and run a 2,000-bed general hospital an hour's plane ride from Miami. Procedures, both elective and necessary, will be priced at least 50% lower than what they cost in the U.S., says Dr. Shetty, who hopes to draw Americans who are uninsured or need surgery their plans don't cover.</p>
<p>By next year, six million Americans are expected to travel to other countries in search of affordable medical care, up from the 750,000 who did so in 2007, according to a report by Deloitte LLP. A handful of U.S. insurance plans now give people the choice to be treated in other countries.</p>
<p>Some in India question whether Dr. Shetty is taking his high volume model too far, risking quality.</p>
<p>"On one level, it's a damn good idea. My only issue with it comes from the fact that if you pursue wholesale volumes, you may give up something -- which is usually quality," says Amit Varma, a physician who serves as president of health-care initiatives for Religare Enterprises Ltd., a publicly listed financial services group in Delhi. Religare is part of a conglomerate that also owns Fortis Healthcare Ltd., a rival hospital chain.</p>
<p>"I think he has reached the point where if you increase volume any more, you could compromise patient care unless backed up by very robust standard operating procedures and processes," Dr. Varma says.</p>
<p>But Jack Lewin, chief executive of the American College of Cardiology, who visited Dr. Shetty's hospital earlier this year as a guest lecturer, says Dr. Shetty has done just the opposite -- used high volumes to improve quality. For one thing, some studies show quality rises at hospitals that perform more surgeries for the simple reason that doctors are getting more experience. And at Narayana, says Dr. Lewin, the large number of patients allows individual doctors to focus on one or two specific types of cardiac surgeries.</p>
<p>In smaller U.S. and Indian hospitals, he says, there aren't enough patients for one surgeon to focus exclusively on one type of heart procedure.</p>
<p>Narayana surgeon Colin John, for example, has performed nearly 4,000 complex pediatric procedures known as Tetralogy of Fallot in his 30-year career. The procedure repairs four different heart abnormalities at once. Many surgeons in other countries would never reach that number of any type of cardiac surgery in their lifetimes.</p>
<p>Dr. Shetty's success rates appear to be as good as those of many hospitals abroad. Narayana Hrudayalaya reports a 1.4% mortality rate within 30 days of coronary artery bypass graft surgery, one of the most common procedures, compared with an average of 1.9% in the U.S. in 2008, according to data gathered by the Chicago-based Society of Thoracic Surgeons.</p>
<p>It isn't possible truly to compare the mortality rates, says Dr. Shetty, because he doesn't adjust his mortality rate to reflect patients' ages and other illnesses, in what is known as a risk-adjusted mortality rate. India's National Accreditation Board for Hospitals &amp; Healthcare Providers asks hospitals to provide their mortality rates for surgery, without risk adjustment.</p>
<p>Dr. Lewin believes Dr. Shetty's success rates would look even better if he adjusted for risk, because his patients often lack access to even basic health care and suffer from more advanced cardiac disease when they finally come in for surgery.</p>
<p>Dr. Shetty, 54 years old, is a lanky and chatty man. He grew up in Mangalore, another south Indian city, the eighth of nine children. Doctors were gods in the Shetty household, swooping in to save his restaurateur father who suffered from chronic diabetes and fell into diabetic comas several times in the young boy's life.</p>
<p>He had already resolved to be a doctor when his fifth-grade teacher told the class that a South African surgeon had just performed the world's first heart transplant. In that moment, Dr. Shetty says he decided to become a heart surgeon.</p>
<p>After graduating from medical college in India, Dr. Shetty trained in cardiac surgery at Guy's Hospital in London, one of Europe's top medical facilities. He had been operating there for six years when the Birla family, leading industrialists in India, decided to start a heart hospital in Calcutta. Dr. Shetty was brought in as the first director.</p>
<p>On returning to India in 1989, Dr. Shetty performed the first neonatal heart surgery in the country on a 9-day-old baby. He also confronted the reality that almost none of the patients who came to him could pay the $2,400 cost of open-heart surgery.</p>
<p>"When I told patients the cost, they would disappear. They literally didn't even ask about lowering the price," he says.</p>
<p>During that time, Mother Teresa had a heart attack, and Dr. Shetty was called to operate on her. From then on, he served as her personal physician. Two pictures of Mother Teresa still adorn the white walls of Dr. Shetty's office, one with white type saying, "Hands that serve are more sacred than lips that pray."</p>
<p>Dr. Shetty set about pursuing a heart hospital big enough to make a difference in a country where most of the people needing heart surgery can't afford it. His father-in-law, the owner of a large construction company, agreed to build and finance a heart hospital in his wife's hometown of Bangalore.</p>
<p>In 2001, the white-washed, red-roofed Narayana Hrudayalaya Hospital opened on 25 acres that had been a marshland around a cement factory.</p>
<p>A lobby with seating for hundreds is encircled by dozens of offices for surgeons to consult with patients. A giant statue of a many-headed deity -- representing gods in the Hindu pantheon -- stands in the center of the lobby.</p>
<p>In a second-floor operating room one October morning, Dr. Shetty finished sewing a new aorta onto the heart of his 11-year-old patient. The process provided an example of how he slashes costs. Four years ago, the sutures would have been bought from a Johnson &amp; Johnson subsidiary. Today they are made by a Mumbai company, Centennial Surgical Suture Ltd.</p>
<p>Four years ago, Dr. Shetty scrutinized his annual bill for sutures -- then $100,000 and rising by about 5% each year. He made the switch to cheaper sutures by Centennial, cutting his expenditures in half to $50,000.</p>
<p>"In health care you can't do one big thing and reduce the price," Dr. Shetty says. "We have to do 1,000 small things."</p>
<p>He says he would also like to find lower-cost versions of his priciest medical equipment. But the Chinese makers that have brought good quality, cheaper machines to market don't yet have enough local service centers to ensure regular maintenance.</p>
<p>So he is still buying equipment from General Electric Co. He pays $60,000 for echocardiography machines, which use sound waves to create a moving image of the heart, and $750,000 for cardiac catheterization labs, which produce images of blood flow in the arteries and allow surgeons to clear some blockages using stents and other devices.</p>
<p>V. Raja, head of GE's health-care business in India, declined to comment on specific pricing, but says Dr. Shetty drives a hard bargain and wrestles some savings because he is such a big customer. Between Narayana Hrudayalaya and another hospital he runs in Calcutta, Dr. Shetty's group performs 12% of India's cardiac surgeries, Mr. Raja says.</p>
<p>Dr. Shetty also gets more use out of each machine by using some of them 15 to 20 times a day, at least five times more than the typical U.S. hospital.</p>
<p>Cardiac surgeons at Dr. Shetty's hospitals are paid the going rate in India, between $110,000 and $240,000 annually, depending on experience, says Viren Shetty, a director of the hospital group and one of Dr. Shetty's sons.</p>
<p>Dr. Shetty was paid almost $500,000 last year, according to the group's audited financial statements.</p>
<p>Here, too, Dr. Shetty finds additional savings on the per-patient cost. His surgeons perform two or three procedures a day, six days a week. They typically work 60 to 70 hours a week, they say. Residents work the same number of hours.</p>
<p>In comparison, surgeons in the U.S. typically perform one or two surgeries a day, five days a week, operating fewer than 60 hours.</p>
<p>Dr. Shetty says doctor fatigue isn't an issue at his hospital, and in general, his surgeons take breaks after three or four hours in surgery. The morning after Dr. Shetty operated on 11-year-old Mahesh Parashivappa, the boy sat in bed in the pediatric intensive care unit, a white bandage on his bare chest.</p>
<p>Virtually all of the 80 beds in the unit were full. K. Parashivappa, the boy's father, a sugarcane worker from a village eight hours away, held a cup of water to his son's lips. He says he's known his son needed surgery since he was born with a congenital heart defect. The boy has never been able to run and play cricket like other children, hobbled by chronic shortness of breath and weakness.</p>
<p>Mr. Parashivappa says he can't himself pay for the surgery, but it is covered by a farmers' insurance plan that Dr. Shetty began several years ago in partnership with the state of Karnataka, which includes Bangalore.</p>
<p>Nearly one third of the hospital's patients are enrolled in this insurance plan, which costs $3 a year per person and reimburses the hospital $1,200 for each cardiac surgery.</p>
<p>That is about $300 below the hospital's break-even cost of $1,500 per surgery.</p>
<p>The hospital makes up the difference by charging $2,400 to the 40% of its patients in the general ward who aren't enrolled in the plan. An additional 30% who opt for private or semi-private rooms pay as much as $5,000.</p>
<p>The father, in an untucked brown shirt, raised both hands to offer the traditional Indian greeting, "Namaste," to Dr. Shetty as the hospital head stopped by his son's bed. "Thank you for giving my son his life back."</p>
<p>
<strong>Write to </strong>Geeta Anand at <a href="mailto:geeta.anand@wsj.com">geeta.anand@wsj.com</a>
</p>
<cite>Printed in The Wall Street Journal, page A1</cite><!-- article end -->

				
					<br/><a href="http://news.ycombinator.com/item?id=955090">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>#1 Thought Leader: Steve Jobs by Fake Steve Jobs</title>
        	<link>http://2010.newsweek.com/top-10/new-thought-leaders/steve-jobs.html</link>
        	<comments>http://news.ycombinator.com/item?id=954734</comments>
	        <description>
    	        <![CDATA[
				<p>First of all, thanks for singling me out as the one human being who has done more than anyone else to shape life on our planet over the past decade. I definitely deserve it. I’ve done many amazing things in the last 10 years, but I think the best single thing I’ve done is to get people to stop thinking about computers and the Internet as weird, complicated things for techies. Thanks to me, computers and the Web are omnipresent in our lives and easy to use. You no longer “go online”—you’re always online. And you’re no longer chained to a clunky box while using the Web. Instead, you have a skinny glass-and-metal slice of magic called the iPhone. (Unless you use a BlackBerry or a Palm Pre, in which case I will pray for your soul.) Of course, I’ve also dramatically changed the music industry. Music used to be sold in quaint little places called “music stores,” shipped on discs, and controlled by record labels. Now it’s sold by a software company (Apple), shipped as digital bits, and controlled by me. Movies are headed that way, too, and soon I’ll be running that business as well. Publishing: you’re next. In our brave new world, whoever controls the devices and the distribution is king. That’s why millions of fanboys see me not as a mere CEO, but as a Silicon Jesus who has come to Earth to restore a sense of childlike wonder to their lives. I can’t say I disagree.</p>

				
					<br/><a href="http://news.ycombinator.com/item?id=954734">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>Flixel: flash game framework</title>
        	<link>http://flixel.org/</link>
        	<comments>http://news.ycombinator.com/item?id=954461</comments>
	        <description>
    	        <![CDATA[
				<img src="http://flixel.org/flixel.png" /><p>flixel</p>
				
					<br/><a href="http://news.ycombinator.com/item?id=954461">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>Server side JavaScript with node.js</title>
        	<link>http://sapessi.com/2009/11/server-side-javascript-with-node-js/</link>
        	<comments>http://news.ycombinator.com/item?id=954682</comments>
	        <description>
    	        <![CDATA[
				
<p>While skimming through my RSS feed I stumpled upon an interesting <a href="http://ajaxian.com/archives/full-frontal-09-simon-willison-on-server-side-javascript-and-node-js" target="_blank">article on Ajaxian about server side JavaScript programming</a>.</p>
<p>I really, really enjoy writing JavaScript code so I decided to read through the article and take a look at the <a href="http://nodejs.org/" target="_blank">node.js library linked there</a>.</p>
<p><a href="http://nodejs.org" target="_blank"><img title="node.js logo" src="http://sapessi.com/wp-content/uploads/2009/11/node_js_logo.jpg" alt="node.js logo" width="293" height="90" /></a></p>
<p>Node is a framework to build server-side event-driven JavaScript applications. Developed in Python on top of <a href="http://en.wikipedia.org/wiki/V8_%28JavaScript_engine%29" target="_blank">Google&#8217;s V8 JavaScript engine</a> Node seems to make building distributed (over a network), fast applications a piece of cake even for inexperienced developers.<br />
Event-driven here really is the keyword because it represent a big change in the way applications are built (and architected in your brain).</p>
<blockquote><p>Node is similar in design to and influenced by systems like Ruby&#8217;s <a href="http://rubyeventmachine.com/">Event Machine</a> or Python&#8217;s <a href="http://twistedmatrix.com/">Twisted</a>.  Node takes the event         model a bit furtherâit presents the event loop as a language         construct instead of as a library. In other systems there is always         a blocking call to start the event-loop.  Typically one defines         behavior through callbacks at the beginning of a script and at the         end starts a server through a blocking call like

</p><p>. In Node there is no such         start-the-event-loop call.  Node simply enters the event loop after         executing the input script.</p></blockquote>
<p>The example below (taken from Node&#8217;s website) will make everything clear&#8230; hopefully.</p>
<div>
<div><span>var</span> sys <span>=</span> require<span>&#40;</span><span>&#8217;sys&#8217;</span><span>&#41;</span><span>,</span><br />
&nbsp; &nbsp; &nbsp;http <span>=</span> require<span>&#40;</span><span>&#8216;http&#8217;</span><span>&#41;</span><span>;</span>
<p>http.<span>createServer</span><span>&#40;</span><span>function</span> <span>&#40;</span>req<span>,</span> res<span>&#41;</span> <span>&#123;</span><br />
&nbsp; setTimeout<span>&#40;</span><span>function</span> <span>&#40;</span><span>&#41;</span> <span>&#123;</span><br />
&nbsp; &nbsp; res.<span>sendHeader</span><span>&#40;</span><span>200</span><span>,</span> <span>&#123;</span><span>&#8216;Content-Type&#8217;</span><span>:</span> <span>&#8216;text/plain&#8217;</span><span>&#125;</span><span>&#41;</span><span>;</span><br />
&nbsp; &nbsp; res.<span>sendBody</span><span>&#40;</span><span>&#8216;Hello World&#8217;</span><span>&#41;</span><span>;</span><br />
&nbsp; &nbsp; res.<span>finish</span><span>&#40;</span><span>&#41;</span><span>;</span><br />
&nbsp; <span>&#125;</span><span>,</span> 2000<span>&#41;</span><span>;</span><br />
<span>&#125;</span><span>&#41;</span>.<span>listen</span><span>&#40;</span>8000<span>&#41;</span><span>;</span><br />
sys.<span>puts</span><span>&#40;</span><span>&#8216;Server running at http://127.0.0.1:8000/&#8217;</span><span>&#41;</span><span>;</span></p></div>
</div>
<p>Can you see the beauty?!</p>
<p>I have only one worry. This is an open-source effort. The community behind it on Google groups is just 181 members strong (so far). What if node.js suddenly stops being the cool thing and the community disappears.</p>
<p>As much as I love writing JavaScript and I can really see the value in what they are building I&#8217;ll still wait until there are 100 Google Groups for node.js and a trillion members in each before using it in anything close to a production system.</p>
<p>Having said that I&#8217;m going back to writing silly node.js apps now. Well done to all the developers involved in the project and keep it up!</p>
 
				
					<br/><a href="http://news.ycombinator.com/item?id=954682">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>Apple&#39;s Mistake</title>
        	<link>http://paulgraham.com/apple.html</link>
        	<comments>http://news.ycombinator.com/item?id=950751</comments>
	        <description>
    	        <![CDATA[
				<a href="http://paulgraham.com/index.html"><img src="http://ep.yimg.com/ca/I/paulgraham_2082_3232" width="410" height="45" border="0" hspace="0" vspace="0" /></a><p><table border="0" cellspacing="0" cellpadding="0" width="455"><tr valign="top"><td width="455"><img src="http://ep.yimg.com/ca/I/paulgraham_2081_909" width="129" height="18" border="0" hspace="0" vspace="0" alt="Apple's Mistake" /></td></tr></table></p><p><font size="2" face="verdana">November 2009</font></p><p>I don't think Apple realizes how badly the App Store approval process
is broken.  Or rather, I don't think they realize how much it matters
that it's broken.</p><p>The way Apple runs the App Store has harmed their reputation with
programmers more than anything else they've ever done. 
Their reputation with programmers used to be great.
It used to be the most common complaint you heard
about Apple was that their fans admired them too uncritically.
The App Store has changed that.  Now a lot of programmers
have started to see Apple as evil.</p><p>How much of the goodwill Apple once had with programmers have they
lost over the App Store?  A third?  Half?  And that's just so far.
The App Store is an ongoing karma leak.</p><p><center>* * *</center></p><p>How did Apple get into this mess?  Their fundamental problem is
that they don't understand software.</p><p>They treat iPhone apps the way they treat the music they sell through
iTunes.  Apple is the channel; they own the user; if you want to
reach users, you do it on their terms. The record labels agreed,
reluctantly.  But this model doesn't work for software.  It doesn't
work for an intermediary to own the user.  The software business
learned that in the early 1980s, when companies like VisiCorp showed
that although the words "software" and "publisher" fit together,
the underlying concepts don't.  Software isn't like music or books.
It's too complicated for a third party to act as an intermediary
between developer and user.   And yet that's what Apple is trying
to be with the App Store: a software publisher.  And a particularly
overreaching one at that, with fussy tastes and a rigidly enforced
house style.</p><p>If software publishing didn't work in 1980, it works even less now
that software development has evolved from a small number of big
releases to a constant stream of small ones.  But Apple doesn't
understand that either.  Their model of product development derives
from hardware.  They work on something till they think it's finished,
then they release it.  You have to do that with hardware, but because
software is so easy to change, its design can benefit from evolution.
The standard way to develop applications now is to launch fast and
iterate.  Which means it's a disaster to have long, random delays
each time you release a new version.</p><p>Apparently Apple's attitude is that developers should be more careful
when they submit a new version to the App Store.  They would say
that.  But powerful as they are, they're not powerful enough to
turn back the evolution of technology.  Programmers don't use
launch-fast-and-iterate out of laziness.  They use it because it
yields the best results.  By obstructing that process, Apple is
making them do bad work, and programmers hate that as much as Apple
would.</p><p>How would Apple like it if when they discovered a serious bug in
OS&nbsp;X, instead of releasing a software update immediately, they had
to submit their code to an intermediary who sat on it for a month
and then rejected it because it contained an icon they didn't like?</p><p>By breaking software development, Apple gets the opposite of what
they intended: the version of an app currently available in the App
Store tends to be an old and buggy one.  One developer told me:
<blockquote>
  As a result of their process, the App Store is full of half-baked
  applications. I make a new version almost every day that I release
  to beta users. The version on the App Store feels old and crappy.
  I'm sure that a lot of developers feel this way: One emotion is
  "I'm not really proud about what's in the App Store", and it's
  combined with the emotion "Really, it's Apple's fault."
</blockquote>
Another wrote:
<blockquote>
  I believe that they think their approval process helps users by
  ensuring quality.  In reality, bugs like ours get through all the
  time and then it can take 4-8 weeks to get that bug fix approved,
  leaving users to think that iPhone apps sometimes just don't work.
  Worse for Apple, these apps work just fine on other platforms
  that have immediate approval processes.
</blockquote>
Actually I suppose Apple has a third misconception: that all the
complaints about App Store approvals are not a serious problem.
They must hear developers complaining.  But partners and suppliers
are always complaining.  It would be a bad sign if they weren't;
it would mean you were being too easy on them.  Meanwhile the iPhone
is selling better than ever.  So why do they need to fix anything?</p><p>They get away with maltreating developers, in the short term, because
they make such great hardware.  I just bought a new 27" iMac a
couple days ago.  It's fabulous.  The screen's too shiny, and the
disk is surprisingly loud, but it's so beautiful that you can't
make yourself care.</p><p>So I bought it, but I bought it, for the first time, with misgivings.
I felt the way I'd feel buying something made in a country with a
bad human rights record.  That was new.  In the past when I bought
things from Apple it was an unalloyed pleasure.  Oh boy!  They make
such great stuff.  This time it felt like a Faustian bargain.  They
make such great stuff, but they're such assholes.  Do I really want
to support this company?</p><p><center>* * *</center></p><p>Should Apple care what people like me think?  What difference does
it make if they alienate a small minority of their users?</p><p>There are a couple reasons they should care.  One is that these
users are the people they want as employees.  If your company seems
evil, the best programmers won't work for you.  That hurt Microsoft
a lot starting in the 90s.  Programmers started to feel sheepish
about working there.  It seemed like selling out.  When people from
Microsoft were talking to other programmers and they mentioned where
they worked, there were a lot of self-deprecating jokes about having
gone over to the dark side.  But the real problem for Microsoft
wasn't the embarrassment of the people they hired.  It was the
people they never got.  And you know who got them?  Google and
Apple.  If Microsoft was the Empire, they were the Rebel Alliance.
And it's largely because they got more of the best people that
Google and Apple are doing so much better than Microsoft today.</p><p>Why are programmers so fussy about their employers' morals?  Partly
because they can afford to be.  The best programmers can work
wherever they want.  They don't have to work for a company they
have qualms about.</p><p>But the other reason programmers are fussy, I think, is that evil
begets stupidity.  An organization that wins by exercising power
starts to lose the ability to win by doing better work.  And it's
not fun for a smart person to work in a place where the best ideas
aren't the ones that win.  I think the reason Google embraced "Don't
be evil" so eagerly was not so much to impress the outside world
as to inoculate themselves against arrogance.
<font color="#999999">[<a href="http://paulgraham.com/apple.html#f1n"><font color="#999999">1</font></a>]</font></p><p>That has worked for Google so far.  They've become more
bureaucratic, but otherwise they seem to have held true to their
original principles. With Apple that seems less the case.  When you
look at the famous 
<a href="http://www.uriahcarpenter.info/1984.html">1984 ad</a> 
now, it's easier to imagine Apple as the
dictator on the screen than the woman with the hammer.
<font color="#999999">[<a href="http://paulgraham.com/apple.html#f2n"><font color="#999999">2</font></a>]</font>
In fact, if you read the dictator's speech it sounds uncannily like a
prophecy of the App Store.
<blockquote>
  We have triumphed over the unprincipled dissemination of facts.</blockquote></p><p>We have created, for the first time in all history, a garden of
  pure ideology, where each worker may bloom secure from the pests
  of contradictory and confusing truths.

The other reason Apple should care what programmers think of them
is that when you sell a platform, developers make or break you.  If
anyone should know this, Apple should.  VisiCalc made the Apple II.</p><p>And programmers build applications for the platforms they use.  Most
applications&mdash;most startups, probably&mdash;grow out of personal projects.
Apple itself did.  Apple made microcomputers because that's what
Steve Wozniak wanted for himself.  He couldn't have afforded a
minicomputer. 
<font color="#999999">[<a href="http://paulgraham.com/apple.html#f3n"><font color="#999999">3</font></a>]</font>
 Microsoft likewise started out making interpreters
for little microcomputers because
Bill Gates and Paul Allen were interested in using them.  It's a
rare startup that doesn't build something the founders use.</p><p>The main reason there are so many iPhone apps is that so many programmers
have iPhones.  They may know, because they read it in an article,
that Blackberry has such and such market share.  But in practice
it's as if RIM didn't exist. If they're going to build something,
they want to be able to use it themselves, and that means building
an iPhone app.</p><p>So programmers continue to develop iPhone apps, even though Apple
continues to maltreat them.  They're like someone stuck in an abusive
relationship.  They're so attracted to the iPhone that they can't
leave.  But they're looking for a way out.  One wrote:
<blockquote>
  While I did enjoy developing for the iPhone, the control they
  place on the App Store does not give me the drive to develop
  applications as I would like. In fact I don't intend to make any
  more iPhone applications unless absolutely necessary.
<font color="#999999">[<a href="http://paulgraham.com/apple.html#f4n"><font color="#999999">4</font></a>]</font>
</blockquote>
Can anything break this cycle?  No device I've seen so far could.
Palm and RIM haven't a hope.  The only credible contender is Android.
But Android is an orphan; Google doesn't really care about it, not
the way Apple cares about the iPhone.  Apple cares about the iPhone
the way Google cares about search.</p><p><center>* * *</center></p><p>Is the future of handheld devices one locked down by Apple?  It's
a worrying prospect.  It would be a bummer to have another grim
monoculture like we had in the 1990s.  In 1995, writing software
for end users was effectively identical with writing Windows
applications.  Our horror at that prospect was the single biggest
thing that drove us to start building <a href="http://paulgraham.com/road.html">web apps</a>.</p><p>At least we know now what it would take to break Apple's lock.
You'd have to get iPhones out of programmers' hands.  If programmers
used some other device for mobile web access, they'd start to develop
apps for that instead.</p><p>How could you make a device programmers liked better than the iPhone?
It's unlikely you could make something better designed.  Apple
leaves no room there.  So this alternative device probably couldn't
win on general appeal.  It would have to win by virtue of some
appeal it had to programmers specifically.</p><p>One way to appeal to programmers is with software.  If you
could think of an application programmers had to have, but that
would be impossible in the circumscribed world of the iPhone, 
you could presumably get them to switch.</p><p>That would definitely happen if programmers started to use handhelds
as development machines&mdash;if handhelds displaced laptops the
way laptops displaced desktops.  You need more control of a development
machine than Apple will let you have over an iPhone.</p><p>Could anyone make a device that you'd carry around in your pocket
like a phone, and yet would also work as a development machine?
It's hard to imagine what it would look like.  But I've learned
never to say never about technology.  A phone-sized device that
would work as a development machine is no more miraculous by present
standards than the iPhone itself would have seemed by the standards
of 1995.</p><p>My current development machine is a MacBook Air, which I use with
an external monitor and keyboard in my office, and by itself when
traveling.  If there was a version half the size I'd prefer it.
That still wouldn't be small enough to carry around everywhere like
a phone, but we're within a factor of 4 or so.  Surely that gap is
bridgeable.  In fact, let's make it an
<a href="http://ycombinator.com/rfs5.html">RFS</a>. Wanted: 
Woman with hammer.</p><p></p><p></p><p></p><p><b>Notes</b></p><p>[<a name="f1n"><font color="#000000">1</font></a>]
When Google adopted "Don't be evil," they were still so small
that no one would have expected them to be, yet.</p><p>
[<a name="f2n"><font color="#000000">2</font></a>]
The dictator in the 1984 ad isn't Microsoft, incidentally;
it's IBM.  IBM seemed a lot more frightening in those days, but
they were friendlier to developers than Apple is now.</p><p>[<a name="f3n"><font color="#000000">3</font></a>]
He couldn't even afford a <i>monitor</i>.  That's why the Apple
I used a TV as a monitor.</p><p>[<a name="f4n"><font color="#000000">4</font></a>]
Several people I talked to mentioned how much they liked the
iPhone SDK.  The problem is not Apple's products but their policies.
Fortunately policies are software; Apple can change them instantly
if they want to.  Handy that, isn't it?</p><p><b>Thanks</b> to Sam Altman, Trevor Blackwell, Ross Boucher, 
James Bracy, Gabor Cselle,
Patrick Collison, Jason Freedman, John Gruber, Joe Hewitt, Jessica Livingston, and
Robert Morris for reading drafts of this.</p><p></p>
				
					<br/><a href="http://news.ycombinator.com/item?id=950751">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>ARM Assembly Language Programming</title>
        	<link>http://www.arm.com/miscPDFs/9658.pdf</link>
        	<comments>http://news.ycombinator.com/item?id=954516</comments>
	        <description>
    	        <![CDATA[
				
				
					<br/><a href="http://news.ycombinator.com/item?id=954516">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>Brain-Like Chip May Solve Computers&#39; Big Problem: Energy</title>
        	<link>http://discovermagazine.com/2009/oct/06-brain-like-chip-may-solve-computers-big-problem-energy/article_view?b_start:int=0&amp;-C=</link>
        	<comments>http://news.ycombinator.com/item?id=955214</comments>
	        <description>
    	        <![CDATA[
				
<p><img src="http://discovermagazine.com/2009/oct/06-brain-like-chip-may-solve-computers-big-problem-energy/boahen_kwabena1.jpg" alt="" />Image: Kwabena Boahen/Stanford University</p>
<p> Kwabena Boahen’s love affair with digital computers began and ended in 1981, when he was 16.</p>
<p>Boahen lived outside the city of Accra in the West African nation of Ghana. His family’s sprawling block house stood in a quiet field of mango and banana trees. One afternoon Boahen’s father rolled down the driveway with a surprise in the trunk of his Peugeot: a RadioShack TRS-80—the family’s first computer—purchased in England.</p>
<p>Young Boahen parked the machine at a desk on the porch, where he usually dismantled radios and built air guns out of PVC pipe. He plugged the computer into a TV set to provide a screen and a cassette recorder so he could store programs on tapes, and soon he was programming it to play Ping-Pong. But as he read about the electronics that made it and all other digital computers work, he soured on the toy.</p>
<p>Moving the Ping-Pong ball just one pixel across the screen required thousands of 1s and 0s, generated by transistors in the computer’s processor that were switching open and shut 2.5 million times per second. Boahen had expected to find elegance at the heart of his new computer. Instead he found a Lilliputian bureaucracy of binary code. “I was totally disgusted,” he recalls. “It was so brute force.” That disillusionment inspired a dream of a better solution, a vision that would eventually guide his career.</p>
<hr size="1" />


<hr size="1" />
<br />
<p>Boahen has since crossed the Atlantic Ocean and become a prominent scientist at Stanford University in California. There he is working to create a computer that will fulfill his boyhood vision—a new kind of computer, based not on the regimented order of traditional silicon chips but on the organized chaos of the human brain. Designing this machine will mean rejecting everything that we have learned over the past 50 years about building computers. But it might be exactly what we need to keep the information revolution going for another 50.</p>
<p>The human brain runs on only about 20 watts of power, equal to the dim light behind the pickle jar in your refrigerator. By contrast, the computer on your desk consumes a million times as much energy per calculation. If you wanted to build a robot with a processor as smart as the human brain, it would require 10 to 20 megawatts of electricity. “Ten megawatts is a small hydroelectric plant,” Boahen says dismissively. “We should work on miniaturizing hydroelectric plants so we can put them on the backs of robots.” You would encounter similar problems if you tried to build a medical implant to replace just 1 percent of the neurons in the brain, for use in stroke patients. That implant would consume as much electricity as 200 households and dissipate as much heat as the engine in a Porsche Boxster.</p>
<p>“Energy efficiency isn’t just a matter of elegance. It fundamentally limits what we can do with computers,” Boahen says. Despite the amazing progress in electronics technology—today’s transistors are 1/100,000 the size that they were a half century ago, and computer chips are 10 million times faster—we still have not made meaningful progress on the energy front. And if we do not, we can forget about truly intelligent humanlike machines and all the other dreams of radically more powerful computers.</p>
<p>Getting there, Boahen realized years ago, will require rethinking the fundamental balance between energy, information, and noise. We encounter the trade-offs this involves every time we strain to hear someone speaking through a crackly cell phone connection. We react instinctively by barking more loudly into the phone, trying to overwhelm the static by projecting a stronger signal. Digital computers operate with almost zero noise, but operating at this level of precision consumes a huge amount of power—and therein lies the downfall of modern computing.</p>
<p>In the palm of his hand, Boahen flashes a tiny, iridescent square, a token of his progress in solving that problem. This silicon wafer provides the basis for a new neural supercomputer, called <a href="http://www.stanford.edu/group/brainsinsilicon/neurogrid.html">Neurogrid</a>, that he has nearly finished building. The wafer is etched with millions of transistors like the ones in your PC. But beneath that veneer of familiarity hides a radical rethinking of the way engineers do business.</p>
<p>Traditional digital computers depend on millions of transistors opening and closing with near perfection, making an error less than once per 1 trillion times. It is impressive that our computers are so accurate—but that accuracy is a house of cards. A single transistor accidentally flipping can crash a computer or shift a decimal point in your bank account. Engineers ensure that the millions of transistors on a chip behave reliably by slamming them with high voltages—essentially, pumping up the difference between a 1 and a 0 so that random variations in voltage are less likely to make one look like the other. That is a big reason why computers are such power hogs.</p>
<p>Radically improving that efficiency, Boahen says, will involve trade-offs that would horrify a chip designer. Forget about infinitesimal error rates like one in a trillion; the transistors in Neurogrid will crackle with noise, misfiring at rates as high as 1 in 10. “Nobody knows how we’re going to compute with that,” Boahen admits. “The only thing that computes with this kind of crap is the brain.”</p>
<p>It sounds cockamamy, but it is true. Scientists have found that the brain’s 100 billion neurons are surprisingly unreliable. Their synapses fail to fire 30 percent to 90 percent of the time. Yet somehow the brain works. Some scientists even see neural noise as the key to human creativity. Boahen and a small group of scientists around the world hope to copy the brain’s noisy calculations and spawn a new era of energy-efficient, intelligent computing. Neurogrid is the test to see if this approach can succeed.</p>
<p>Most modern supercomputers are the size of a refrigerator and devour $100,000 to $1 million of electricity per year. Boahen’s Neurogrid will fit in a briefcase, run on the equivalent of a few D batteries, and yet, if all goes well, come close to keeping up with these Goliaths.</p>
<p> The problem of computing with noise first occurred to a young neuro­scientist named <a href="http://www.zoo.cam.ac.uk/zoostaff/laugh.htm">Simon Laughlin</a> three decades ago. Laughlin, then at the Australian National University in Canberra, spent much of 1975 sitting in a black-walled, windowless laboratory with the lights off. The darkness allowed him to study the retinas of blowflies captured from Dumpsters around campus. In hundreds of experiments he glued a living fly to a special plastic platform under a microscope, sunk a wisp-thin electrode into its honeycombed eye, and recorded how its retina responded to beams of light. Laughlin would begin recording at noon and finish after midnight. As he sat in the gloomy lab, watching neural signals dance in green light across an oscilloscope, he noticed something strange.</p>
<p>Each fly neuron’s response to constant light jittered up and down from one milli­second to the next. Those fluctuations showed up at every step in the neurons’ functioning, from the unreliable absorption of light by pigment molecules to the sporadic opening of electricity-conducting proteins called ion channels on the neurons’ surfaces. “I began to realize that noise placed a fundamental limit on the ability of neurons to code information,” Laughlin says.</p>

				
					<br/><a href="http://news.ycombinator.com/item?id=955214">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>Isildur1 and the week that changed online poker</title>
        	<link>http://blogs.cardrunners.com/BLAG/an-unstoppable-force-meets-1258491260</link>
        	<comments>http://news.ycombinator.com/item?id=954273</comments>
	        <description>
    	        <![CDATA[
				


<meta http-equiv="Content-Type" text="text" />
<meta name="ProgId" word.document="Word.Document" />
<meta name="Generator" microsoft="Microsoft" word="Word" />
<meta name="Originator" microsoft="Microsoft" word="Word" />
<link rel="File-List" href="file:///C:DOCUME~1DOGISH~1LOCALS~1Tempmsohtmlclip1�1clip_filelist.xml" />
<link rel="themeData" href="file:///C:DOCUME~1DOGISH~1LOCALS~1Tempmsohtmlclip1�1clip_themedata.thmx" />
<link rel="colorSchemeMapping" href="file:///C:DOCUME~1DOGISH~1LOCALS~1Tempmsohtmlclip1�1clip_colorschememapping.xml" /><span><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
LatentStyleCount="267">
<w:LsdException Locked="false" Priority="0" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Normal"  />
<w:LsdException Locked="false" Priority="9" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="heading 1"  />
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"  />
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"  />
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"  />
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"  />
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"  />
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"  />
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"  />
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"  />
<w:LsdException Locked="false" Priority="39" Name="toc 1"  />
<w:LsdException Locked="false" Priority="39" Name="toc 2"  />
<w:LsdException Locked="false" Priority="39" Name="toc 3"  />
<w:LsdException Locked="false" Priority="39" Name="toc 4"  />
<w:LsdException Locked="false" Priority="39" Name="toc 5"  />
<w:LsdException Locked="false" Priority="39" Name="toc 6"  />
<w:LsdException Locked="false" Priority="39" Name="toc 7"  />
<w:LsdException Locked="false" Priority="39" Name="toc 8"  />
<w:LsdException Locked="false" Priority="39" Name="toc 9"  />
<w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"  />
<w:LsdException Locked="false" Priority="10" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Title"  />
<w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"  />
<w:LsdException Locked="false" Priority="11" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtitle"  />
<w:LsdException Locked="false" Priority="22" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Strong"  />
<w:LsdException Locked="false" Priority="20" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Emphasis"  />
<w:LsdException Locked="false" Priority="59" SemiHidden="false"
UnhideWhenUsed="false" Name="Table Grid"  />
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"  />
<w:LsdException Locked="false" Priority="1" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="No Spacing"  />
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading"  />
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List"  />
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid"  />
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1"  />
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2"  />
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1"  />
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2"  />
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1"  />
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2"  />
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3"  />
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List"  />
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading"  />
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List"  />
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid"  />
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 1"  />
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 1"  />
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 1"  />
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"  />
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"  />
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 1"  />
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"  />
<w:LsdException Locked="false" Priority="34" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"  />
<w:LsdException Locked="false" Priority="29" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Quote"  />
<w:LsdException Locked="false" Priority="30" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"  />
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 1"  />
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"  />
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"  />
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"  />
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 1"  />
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 1"  />
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 1"  />
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 1"  />
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 2"  />
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 2"  />
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 2"  />
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"  />
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"  />
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 2"  />
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 2"  />
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"  />
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"  />
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"  />
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 2"  />
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 2"  />
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 2"  />
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 2"  />
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 3"  />
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 3"  />
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 3"  />
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"  />
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"  />
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 3"  />
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 3"  />
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"  />
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"  />
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"  />
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 3"  />
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 3"  />
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 3"  />
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 3"  />
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 4"  />
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 4"  />
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 4"  />
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"  />
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"  />
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 4"  />
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 4"  />
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"  />
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"  />
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"  />
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 4"  />
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 4"  />
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 4"  />
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 4"  />
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 5"  />
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 5"  />
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 5"  />
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"  />
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"  />
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 5"  />
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 5"  />
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"  />
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"  />
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"  />
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 5"  />
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 5"  />
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 5"  />
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 5"  />
<w:LsdException Locked="false" Priority="60" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Shading Accent 6"  />
<w:LsdException Locked="false" Priority="61" SemiHidden="false"
UnhideWhenUsed="false" Name="Light List Accent 6"  />
<w:LsdException Locked="false" Priority="62" SemiHidden="false"
UnhideWhenUsed="false" Name="Light Grid Accent 6"  />
<w:LsdException Locked="false" Priority="63" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"  />
<w:LsdException Locked="false" Priority="64" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"  />
<w:LsdException Locked="false" Priority="65" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 1 Accent 6"  />
<w:LsdException Locked="false" Priority="66" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium List 2 Accent 6"  />
<w:LsdException Locked="false" Priority="67" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"  />
<w:LsdException Locked="false" Priority="68" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"  />
<w:LsdException Locked="false" Priority="69" SemiHidden="false"
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"  />
<w:LsdException Locked="false" Priority="70" SemiHidden="false"
UnhideWhenUsed="false" Name="Dark List Accent 6"  />
<w:LsdException Locked="false" Priority="71" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Shading Accent 6"  />
<w:LsdException Locked="false" Priority="72" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful List Accent 6"  />
<w:LsdException Locked="false" Priority="73" SemiHidden="false"
UnhideWhenUsed="false" Name="Colorful Grid Accent 6"  />
<w:LsdException Locked="false" Priority="19" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"  />
<w:LsdException Locked="false" Priority="21" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"  />
<w:LsdException Locked="false" Priority="31" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"  />
<w:LsdException Locked="false" Priority="32" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"  />
<w:LsdException Locked="false" Priority="33" SemiHidden="false"
UnhideWhenUsed="false" QFormat="true" Name="Book Title"  />
<w:LsdException Locked="false" Priority="37" Name="Bibliography"  />
<w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"  />
</w:LatentStyles>
</xml><![endif]--></span><text>css"><</text>style><span><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin-top:0in;
mso-para-margin-right:0in;
mso-para-margin-bottom:10.0pt;
mso-para-margin-left:0in;
line-height:115%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:"Times New Roman";
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;}
</style>
<![endif]--> </span>
<p msonormal="MsoNormal"><span><br />
It&rsquo;s been a while since I&rsquo;ve written a blog post. Poker hasn&rsquo;t really picked up any for me, but I felt like I should keep writing in this blog and try my best to keep it alive in some way. Today I&rsquo;m going to sell out a bit and write not about myself, but about online poker and recent events. My topic is vague enough that this post may wander th</span><span>rough different topics, but it will be centered around Isildur and his recent appearance in high stakes online poker. It is largely a product of my curiosity, experience, and confusion, and I hope that some of these ideas might speak to some of you as well.</span></p>
<p msonormal="MsoNormal"><span><b><o:p>&nbsp;</o:p></b></span><b><o:p></o:p></b></p>
<p msonormal="MsoNormal">&nbsp;</p>
<span>
</span><p msonormal="MsoNormal"><b><o:p></o:p></b></p>

<p msonormal="MsoNormal"><span>One of the reasons why I wanted to write something like this was because, as most of you know, we have just witnessed a monumental event in the history of online poker &ndash; the entrance of Isildur into our world of online poker<i>. </i>A number of other commentators have offered their insight on this event, and there&rsquo;s no doubt that the commotion over him has rocked the world of high stakes online poker. I felt that given the huge amount of speculation, misinformation, and downright stupidity that has flooded twoplustwo and other forums, it wouldn&rsquo;t hurt to give the less informed half of the poker world a more accurate glimpse of the high stakes poker world.</span></p>
<span><br />
</span>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span><b>A Word of Warning</b></span><b><o:p></o:p></b></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p><p>
</p>
<p msonormal="MsoNormal"><span>It&rsquo;s important to understand that what Isildur has done (and how hot he has run) is truly amazing. It is also important to understand that almost every high stakes poker player who has insight into him or the dynamics that are occurring around him are all public figures. What I mean by that is that they either have some sort of a sponsorship or an otherwise monetary or emotional connection to their own reputation. This gives everyone two layers of incentives &ndash; the first incentive is to openly talk about him, since everybody else wants to know about Isildur and only a small group of people can actually say anything meaningful about him. The second incentive is to stay quiet &ndash; since Isildur is very much a player in the online poker world, nobody wants to say anything about him that could jeopardize or negatively affect their relationship with him as an opponent in a poker game.&nbsp; What I mean to say is that anybody who right now would speak about Isildur is going to speak discreetly. Nobody will be direct, and yet everyone acknowledges his enormity. He&rsquo;s going to be the elephant in the room. You won&rsquo;t hear any outright admissions of how good he is, who thinks who is better than who, or even who people think Isildur is. And that&rsquo;s just the nature of the game. The social dynamics of online poker have changed in the last few years, and the reaction to Isildur has shown us some of that.</span></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span>What I want you the reader to understand is that I will not say everything that I think about Isildur. Nobody will. Online poker is at its heart a secretive industry, but as obvious as that is, I want to say this outright because I hope it will give some of you the awareness to look more closely at the discourse of online poker. Not everything is as it seems, and the asymmetry of information is as real here as it is anywhere else.</span></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p><p>
</p>
<p msonormal="MsoNormal"><span><b>The Story of Isildur</b></span><b><o:p></o:p></b></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p><p>
</p>
<p msonormal="MsoNormal"><span>That being said, it&rsquo;s very obvious that Isildur is an extremely good NLHU and HUPLO player. His grasp of handreading, leveling and betsizing is second to none. Nobody who has watched Isildur play from the rail has any idea what kind of a player he is except that he seems to be aggressive and overbets a lot, and of course that he wins &ndash; his betting patterns, his style of reasoning, and his depth of thought are aspects that can only be appreciated within an actual match and by a player of adequate skill &ndash; that&rsquo;s the nature of online poker. Isildur is a very good player and with the results he&rsquo;s had, it&rsquo;s impossible to deny it. He has rocked the boat in a big way, which is best exemplified by Tom &ldquo;Durrrr&rdquo; Dwan and the match they played, which is at this point a legendary one in the history of online poker.</span></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span>For those of you who don&rsquo;t know, Isildur won more than 3 million USD from Durrrr, which adds up to well over 30 buyins won. I&rsquo;m not sure exactly how many hands were played, but as far as I know it was over 30,000 hands.&nbsp; It was an epic match, and I mean that in the strongest sense of the word. Allow me to contextualize it a bit.</span></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span>(Disclaimer: some of this may be inaccurate, I&rsquo;m piecing this together from what I know with little to no extraneous research. But for the most part it&rsquo;s true enough.)</span></p>
<p msonormal="MsoNormal"><span><b><o:p></o:p></b></span><span><b><o:p>&nbsp;</o:p></b></span><b><o:p></o:p></b></p>
<p msonormal="MsoNormal">&nbsp;</p>
<span>
</span><p msonormal="MsoNormal"><b><o:p></o:p></b></p>

<p msonormal="MsoNormal"><span>Isildur first showed up on Full Tilt around 25/50 NLHE. I don&rsquo;t know who the first person he played was, but I remember hearing about him from some 25/50 grinders who had played him or had seen him around. The word was that Isildur was the new semireg on the block. Supposedly, he was hyperaggro, barreled like a monkey, and was really easy to get to stick his stacks in.&nbsp; Of course there are some 25/50 regs for whom this description was not enough to play a non-clueless opponent, but a number of regs were thrilled to have a new reg willing to play a bunch of tables and donk off stacks. Among the first few to play him in extended matches were Jungleman and I Win Flips (Tcorbin16). From what I heard from both of them, they both thought that they had significant edges on Isildur, although Corbin actually lost a decent clip to him (in typical Corbin fashion).</span></p>
<p msonormal="MsoNormal"><span>&nbsp;</span></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span><b>Our Battle</b></span><b><o:p></o:p></b></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p><p>
</p>
<p msonormal="MsoNormal"><span>About a week later I was sitting at tables without any action when Isildur showed up at one of my 25/50 NL tables. I was bored and willing to play anything, so when he offered to play 6 tables (although usually I max out at 4), I decided to take him up on his offer and play a serious NLHE HU match for the first time in a long while. As the match progressed, all of what I&rsquo;d heard about him being hyperaggro and barrelly checked out, but as I watched the lines he took to bluff, valuebet, and the way he reacted to my betting patterns, he seemed uncannily perceptive. Nevertheless, within the first hour or so I had won about 30k and was feeling pretty confident.&nbsp; He sat out on all of the tables and I assumed that the match was over and was about to check out. But about a minute later he said &ldquo;brb,&rdquo; and so I decided to wait for him and continue the match.</span></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span>From that point, I started losing. Bad. There weren&rsquo;t really any particular pots where I got badly outplayed, but before I knew it, due to beats coolers and him outmaneuvering me in a few spots, he was up 50k. 6-tabling 25/50 that&rsquo;s not an unheard of swing to one opponent, so I asked him if he wanted to take it up to 50/100NL. He agreed, and we played a very short session there where I just repeatedly ran into the nuts &ndash;&nbsp; I thought I played well, but somehow he always had the best hand, despite his aggressiveness and how many big pots he was getting into. After losing 5 buyins at 50/100 I decided I&rsquo;d had enough, and wasn&rsquo;t feeling that great about my NL game and didn&rsquo;t feel any point in going forward when he had all of the momentum and seemed to know my game pretty well. I told him GG and quit all of the tables.</span></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span>Ten minutes later, he sat with me at 100/200 PLO, telling me he was bored and just wanted some action. I consulted my friend who told me that he had played Isildur and had crushed him &ndash; Isildur is clueless, he said. So I shrugged my shoulders and went with it &ndash; I have a lot of confidence in my PLO game, and I know that there are only a few people in the world who can come out on top against me there. If he&rsquo;s as degenerate as he seems, it&rsquo;s possible that I have a huge edge and that he just dumps it back. So I played.</span></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span>PLO is quite different from NL because it&rsquo;s much more transparent, not just to observers but also to the players themselves.&nbsp; When hands get in or big pots are played, it&rsquo;s often a lot easier to dissect ranges, understand decisions, and evaluate EV than it is in NL. What that means that, for both observers and for the players themselves, it&rsquo;s a lot easier to see who&rsquo;s running bad and who&rsquo;s getting outplayed in PLO compared to NL. Well, I ended up losing about 400k to him at PLO, and according to HEM I ran 300k below EV. We played probably 1000 hands or less of PLO. It was a bloodbath, but not quite a slaughter, since the poker gods were doing a lot more of the work than he was, which will happen in PLO. At the time I was pretty devastated, but after having reviewed the match carefully, I am sure that I ran bad. I&rsquo;m not sure that I had an edge, but I am sure that my expectation was nowhere near what I lost, or even a quarter of that. But to all of you, I was only the beginning of the story of Isildur.</span></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p><p>
</p>
<p msonormal="MsoNormal"><span><b>The Rise of Isildur</b></span><b><o:p></o:p></b></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p><p>
</p>
<p msonormal="MsoNormal"><span>After I lost to him I took a break from playing, but there was a lot of chatter on NVG and among other high stakes players about this Isildur fellow. Since I&rsquo;m a fish, most weren&rsquo;t phased by seeing me lose so much to him, and wanted to try their hand. The next up to bat was Ugotabanana, an 18 year old PLO extraordinaire. He&rsquo;s well known for being an enormous lucksack (I love you Harry), but even he could not overcome the Promethean run-good of Isildur. He lost 250k over 5000 hands of 100/200 PLO. Again, not a lot for the stakes played and variance, but at this point Isildur&rsquo;s run was starting to border on the horizon of statistical significance.</span></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span>Over the next few days I wasn&rsquo;t watching as closely, but apparently he undertook matches with Cole South, Brian Hastings, and Brian Townsend in both PLO and NL. The matches were very back and forth and were grabbing the attention of a lot of railbirds and high stakes players alike. Generally when top class players like Cole and Townsend are swooping in to play a bunch of tables with a new player, the new player ends up going bust pretty quick, but despite tripping up every now and then, Isildur seemed to be holding his ground. They were playing as high as 200/400 and 300/600; stacks were being thrown around and leads were sometimes taken, but never held onto. Nobody doubted that Isildur was losing, it was only a matter of when. He seemed to be solid and certainly not easy to beat, but against the titans of online poker, nobody gave him a chance.</span></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span>It was after a couple of days of battling against these players, Isildur being up a decent but by no means decisive amount on his opponents, that Durrrr entered into the fray. Right off the bat they agreed to 6-table HU at 300/600NL, and it was at that point that all eyes turned to what was inevitably going to be one of the most memorable matches in the history of online poker. Despite being overshadowed by the televised WSOP main event, tens of thousands of online poker players and poker aficionados logged onto Full Tilt to observe these games. The 300/600 didn&rsquo;t last long, after a short while of playing and being down a few buyins Durrrr asked Isildur to take it to 500/1000 and Isildur happily agreed. What followed then was one of the most aggressive, volatile, intense heads up matches ever played. I will do my best to resist characterizing the dynamics or what specifically occurred in the match, but I think it was best described by a phrase I used at the time &ndash; &ldquo;an unstoppable force meets an immovable object,&rdquo; the former being Isildur and the latter being Durrrr. It was one of those rare heads up matches that exemplifies at once both art and spectacle. Railbirds couldn&rsquo;t get enough.</span></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span>After the first day with a ton of back and forth and a lot of action, Isildur ended up around +1.5M. Despite having played for a very long session with few breaks, few observers thought that this win was conclusive, despite being over 15 buyins in winnings for Isildur. Before Durrrr finally quit the session he and Isildur made an agreement to play again the next day, and so when night fell again (in the USA), the match continued.</span></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span>That session was the most significant. Despite Durrrr&rsquo;s shenanigans and suckouts, it seemed as though he was finally starting to reveal his strength. His style had changed and the tables were turning, the unstoppable momentum of Isildur seemed to have been shattered. At one point Durrrr was within 350k of even, and in that moment many of us who had been disheartened from Durrrr&rsquo;s loss felt a feeling of relief. This was a moment of comfort in the world of high stakes poker. When I read that Durrrr was almost even, I thought to myself &ldquo;well, I suppose that&rsquo;s that. This guy&rsquo;s run is finally over.&rdquo; But when I was resigning to my bed, the rest of the online poker world was glued to its monitors. For Isildur, the night was far from over.</span></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span>What happened next no one at all expected, not even those who were rooting for Isildur. With Durrr having steamrolled back, Isildur, who people were before calling the masked marauder of high stakes poker, seemed to be back to his previous title of a luckbox shot-taking degen. And yet, slowly but surely, Isildur started winning his money back. He won a couple of big pots as soon as Durrrr hit his peak, and from that point Durrrr seemed to not have a chance to protest or get even a word in. The tides had turned, the poker gods had spoken, and Isildur once again seemed to not be able to lose an all-in, winning and winning, and when the score came back to +1.5M for Isildur &ndash; he kept going, winning more and more, as if not to leave any doubt in Durrrr&rsquo;s or anybody else&rsquo;s mind that his win was no fluke. After that night he was up over 2M, and by the time of my writing this and a couple more sessions later, Isildur is up well over 3M on Durrrr. Since then, he has battled again with Cole and Townsend and stood his ground, and has massacred both Patrik Antonius and David Benyamine. He is now up well over 5M on Full Tilt poker, and is currently fourth on the all time leaderboard on HSDB behind Phil Ivey, Phil Galfond, and Patrik Antonius. He has cemented his name in the annals of online poker as one of the strongest players of all time.</span></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span>It has been only two weeks since Isildur started playing high stakes on Full Tilt Poker. We truly have witnessed something incredible. But what we &ndash; the online poker community &ndash; and have not done, is interpreted this event. Made sense of it. Decided what it means. Not just for Durrrr, for Isildur, for high stakes players, or even for railbirds. What does this event mean for online poker? I haven&rsquo;t the insight to speak for others, but I think that for me, Isildur&rsquo;s upheaval of the online poker world has caused me to realize and question some things.</span></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal">&nbsp;</p>
<span>
</span><p msonormal="MsoNormal"><span><b>The European Hierarchy</b></span></p>
<span>
</span><p msonormal="MsoNormal">&nbsp;</p>
<span> </span>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span>It&rsquo;s important to realize that the online poker world is split into a number of different worlds. Our world is what I will call the Western poker world (the word is poorly chosen but it works well enough). It includes 2p2, Cardplayer, Tableratings, and extends to the major American poker sites &ndash; Stars, Full Tilt, and Ultimatebet. The other major world is the Euro poker world, which includes sites like Ipoker, Prima, Party, Betfair, Svenka Spel, and some other sites that are only open to various European players (I don&rsquo;t know enough about this poker world to mention any other specific sites, forums, etc.). These poker worlds are generally pretty strongly segregated &ndash; most of the top players in the Western poker world only play on Western sites, either because they&rsquo;re American or because the nosebleed action on FTP/Stars runs more regularly. And in the same way, most of the top players in the Euro poker world only play on Eurosites and make most of their money there. But in each poker world there has been established a pecking order &ndash; a hierarchy.</span></p><p>
</p>
<p msonormal="MsoNormal"><span>From years of poker pros playing each other in different combinations and matchups, people have figured out who is better than who. Over the long run there is not much fluctuation in these hierarchies, as the better players continue to get better and don&rsquo;t let players lower in the food chain catch up. It is also generally acknowledged that the Western hierarchy is stronger than the Euro hierarchy &ndash; the games are tougher and more selective, there are fewer fish, and so the Western hierarchy has bred the best poker players in the world. The Western poker world is tougher, and for that, it is stronger. But Isildur has challenged that. Isildur is from the Euro poker world, and his blitzkrieg against the entire Western poker hierarchy is a direct challenge to this precept. Many Swedish and other European players cheer on the march of Isildur for precisely this reason &ndash; to them, Isildur represents their hierarchy taking back control of the poker world. And so Isildur has become, to some, a symbol of the European hierarchy.</span></p><p>
</p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span><b>The Mythology of Online Poker</b></span><b><o:p></o:p></b></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p><p>
</p>
<p msonormal="MsoNormal"><span>&nbsp;When I saw on that first day that Durrrr was playing Isildur and was down a lot, my feelings were mixed. I think that a lot of people in my situation would think &ldquo;well, if Durrrr lost to him, then I guess that validates my loss,&rdquo; and there was probably a dash of that emotion somewhere, but it certainly wasn&rsquo;t decisive. As with everybody else on the sidelines, I had to decide who to root for. You can&rsquo;t really stand outside a cage match and just hope it&rsquo;s a good fight - no matter how objective you claim to be, somebody in the ring is representing you. If that&rsquo;s not true, then you&rsquo;re not watching with enough intensity. And if there ever were a poker game that could be considered a cage match, it would be this one.</span></p><p>
</p>
<p msonormal="MsoNormal"><span>A lot of people who aren&rsquo;t initiated into the world of high stakes poker are quick to compare high stakes players to each other, but the world of high stakes poker is more rigidly divided than it might seem. Durrrr exists in an echelon of online poker that I haven&rsquo;t reached, and probably never will. He plays for amounts of money that, even if I had the bankroll, probably wouldn&rsquo;t be playing. Not only that, but his courage &ndash;&nbsp; and degeneracy &ndash; &nbsp;are miles above what I could handle. He is truly in another league, and so in a way he is just as distant to me as he is to any of you. Not only that, but I don&rsquo;t really know Tom, although I know some people who do and I&rsquo;m sure he&rsquo;s a good person. But I have no personal reason to root for him.</span></p><p>
</p>
<p msonormal="MsoNormal"><span>&nbsp;And while this is all true, there was something in me that I couldn&rsquo;t quite explain that was rooting for Durrrr. Well, more than that. I think there was something inside me that deeply needed Durrrr to win. At first I didn&rsquo;t really bother to think about it, and maybe I accepted the easy explanation that I just wanted to see Isildur lose. But as the scale of the match grew larger and larger, and the impact of Isildur grew greater and greater, I began to realize that Durrrr represented something else to me in this match. He represented more than just a vicarious avenger. In fact, he was more than just Tom Dwan, more than just a single poker player, who one can choose to like or dislike. Durrrr represents something else, something much larger.</span></p><p>
</p>
<p msonormal="MsoNormal"><span>To me, Durrrr represents my generation. He represents my hierarchy. He represents the entire empire of the Western poker world. &nbsp;He is the king, and upon his head rests the crown of Western poker. That crown is more than just a piece of jewelry &ndash; it is a justification. He wears the crown upon his head because he is the proof that the Western poker world is great. It is proof that we are wise, that we are powerful, and <b>that we are right to think that we are the best in the world</b>. Durrrr holds all of this upon his head. We have imbued it in him. If nobody else in the world can beat Isildur, and if Isildur fights his way to the throne of our poker world, we know that Durrrr will be waiting for him. Durrrr is our last word. He is our proof that ourpoker works, that our poker is powerful, and that we were right to think that our poker is the epitome of all poker.</span></p><p>
</p>
<p msonormal="MsoNormal"><span>But, to me, Durrrr represents even more than that. Because you have to realize that this significance that I just mentioned is not granted to Durrrr because he is Durrrr &ndash; it is granted to him because of how much he&rsquo;s won, because of who he&rsquo;s beaten, and because of the respect and fear that he has garnered. But somebody else could just as easily have been in his place, someone else who might have had the same winnings and accomplishments. There&rsquo;s something significant because of who Durrrr is and what he&rsquo;s about that makes him an especially important symbol.</span></p><p>
</p>
<p msonormal="MsoNormal"><span>Durrrr can be dumb. Sometimes he makes mistakes, he tilts, he makes clearly &ndash;EV calls and he sticks huge stacks in with rags against the nuts over and over again. Durrrr is often reckless, sometimes emotional, and even at times irrational. Durrrr is fallible. He is imperfect. And yet, somehow he wins. He outplays, he outmaneuvers, and outthinks. He reached the top. He beat everyone. He became the king. He symbolizes the human in all of us, and he bears testament that one does not need to be perfect, unphaseable, untiltable in order to become great.&nbsp; The juggernauts of online poker can sometimes seem to possess an otherworldly stoicism and mental composure. Durrrr is certainly a titan, but his edges are jagged, just as the rest of us. That&rsquo;s what Durrrr symbolizes to me. I too am sometimes dumb, sometimes I make tilty calls and chase losses. Durrrr is my validation.&nbsp; </span></p><p>
</p>
<p msonormal="MsoNormal"><span>To me then, Isildur represents something totally alien. He represents the nameless feeling that we all know when we play somebody who we feel that we just cannot beat.&nbsp; The pre-rational feeling that no matter what we do we cannot win; this force (it does not congeal into a person) will push us down and there is no way to fight back, to go up for air &ndash; our only option is to surrender. No matter what cards we are dealt or what flop we see, somehow we end up losing or getting outplayed. To a poker player, there is no feeling as terrifying as losing and not knowing why. When Isildur appeared, nobody knew who he was. Nobody knew why he played the way he did, how he was so good, or why he won so much. He surprised everyone, and in a whirlwind he destroyed almost everybody he played. He was a faceless force who suddenly disrupted all of the sensible hierarchy of the Western poker world. Whether or not we acknowledge it, everybody became afraid. Afraid that maybe he would tear everything down. That all of our hierarchies would be rendered irrelevant. Maybe he was the greatest poker player in the world. But to claim that title, he must answer to the king. To me, that is the symbolism behind the battle between Durrrr and Isildur.</span></p><p>
</p>
<p msonormal="MsoNormal"><span>But my perspective is not the only one, and I will not pretend that my interpretation is any more valid than anyone else&rsquo;s. For some railbirds who have a more disinterested relationship to the poker hierarchy, many probably are enthralled by the march of Isildur because of all of the action and excitement that he stirs up, and I certainly cannot deny that if making things interesting is the only criterion, Isildur takes the cake. Yet others choose to root against Durrrr because to them Durrrr represents the old order, and Isildur, a newcomer overthrowing an empire, empowers some them in relation to the poker hierarchy. Maybe others dislike Durrrr because they think he represents an older and more fortunate generation of poker players, or maybe others see him as everything wrong with the culture of internet poker players. And a great many others root against Durrrr because they support Europe over America. The battle between Durrrr and Isildur means many different things to many observers, which is part of the reason why the match has been followed and commented on so passionately.</span></p><p>
</p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span><b>The Aftermath</b></span><b><o:p></o:p></b></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p><p>
</p>
<p msonormal="MsoNormal"><span>Ultimately, as I&rsquo;m sure you all know, Durrrr lost. Their battle was grand, awesome, and decisive. Isildur triumphed. Now, as the chroniclers of our age of online poker, it is up to us to interpret what that means. There is a lot that I could say about the nature of variance, the significance of leaderboards and results, and the poverty of information &ndash; these are issues that we are all grappling with as both students of this world, and as members of it. What did it really mean that Durrrr was up so much money in online poker? That he had beaten so many people, and seemed to be as good as it was? Was it really ever that significant? Were we all fooled by the randomness? We have all seen the simulations where one or two arbitrary lines bound absurdly high above the lot &ndash; was Durrrr just an anomaly, his greatness a blip of chance? Or maybe his loss to Isildur was a fluke, the product of bad play, of overconfidence &ndash; maybe we have yet to see what Durrrr is really capable of.</span></p><p>
</p>
<p msonormal="MsoNormal"><span>There are many who think that Isildur is now the best HU NLHE player in the world. Part of what made Durrrr so powerful and feared was his image &ndash; not just his image within the context of an actual match, but merely the awareness that Durrrr did not to lose to anyone. It might seem like a secondary aspect of his game, but if you believe your opponent is someone awesome, someone who no one else can stand up to, it invests your opponent with a great deal of power. It was with this invincible image that Durrrr ruled high stakes NL, but Isildur has shattered that illusion. At this point, having bested almost everybody who stood up to him, Isildur has assumed an even more powerful image, which will make it even more difficult for someone to overthrow him. There are some who&rsquo;d say that Isildur has proven himself as the new king of online poker.</span></p><p>
</p>
<p msonormal="MsoNormal"><span>Or perhaps it is Isildur who is the anomaly, and as fantastically as he entered this world, he will supernova when he leaves it. Since the time I began writing this article, Isildur has lost 2.5M to Patrik Antonius in PLO, cutting his winnings on FTP in half. The significance of this event is certainly smaller than Isildur&rsquo;s prolonged battle with Durrrr, but nevertheless the tides are rolling in, and the poker gods are plotting their next spectacle. Is this heralding the fall of Isildur, or is this merely the beginning of another battle? The world of online poker is shifting rapidly and much has yet to be seen. I cannot answer any of the questions I have posed, but I hope that you will all consider them as you continue to observe the path that the world of online poker takes from here.</span></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span>Durrrr and Isildur.</span></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span>Goddamn, were they meant for each other.</span></p>
<p msonormal="MsoNormal"><o:p><span>&nbsp;</span></o:p></p>
<p msonormal="MsoNormal"><span>Until next time,</span></p>
<p msonormal="MsoNormal"><span>Haseeb, aka Dogishead</span><o:p><span><br />
</span></o:p></p>
<p msonormal="MsoNormal"><o:p></o:p><o:p></o:p><o:p><span><br />
</span></o:p></p>



 
<div id="blog_comments_39770">
<div id="blogCommentDiv_35645">
<br />
<p>
                Nov 17, 09 14:21:42<br />
</p>

<p id="commentBody_35645">blag</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=134&amp;Itemid=44">Taylor</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35656">
<br />
<p>
                Nov 17, 09 14:36:06<br />
</p>

<p id="commentBody_35656">good read.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=56064&amp;Itemid=44">TiltinBuddha</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35660">
<br />
<p>
                Nov 17, 09 14:51:30<br />
</p>

<p id="commentBody_35660">your blogs and the way your write them are really enjoyable. fun read</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=35439&amp;Itemid=44">thewillofd</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35662">
<br />
<p>
                Nov 17, 09 14:53:49<br />
</p>

<p id="commentBody_35662">great post</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=40979&amp;Itemid=44">lclee</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35663">
<br />
<p>
                Nov 17, 09 15:00:46<br />
</p>

<p id="commentBody_35663">really nice read. Like your point of view.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=42590&amp;Itemid=44">laziale87</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35665">
<br />
<p>
                Nov 17, 09 15:07:04<br />
</p>

<p id="commentBody_35665">Thanks for this.  You should start a blog.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=344&amp;Itemid=44">jtphila</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35666">
<br />
<p>
                Nov 17, 09 15:30:55<br />
</p>

<p id="commentBody_35666">I love your interpretation of this hu match between durrr and Isildur1.  It was def historical for online poker.</p><p>
Personally, I was rooting for durrr to win.  Then I started to root for sildur1 because this guy would play everyone.  As a railbird, it's fun to watch high stakes poker online.</p><p>
In the end, I do want to see durrr win though because I'm American.  Poker is our game and we are the best at it.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=3004&amp;Itemid=44">AppleSeed</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35667">
<br />
<p>
                Nov 17, 09 15:32:42<br />
</p>

<p id="commentBody_35667">wow, excellent read, thank you haseeb.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=69654&amp;Itemid=44">pernicious84</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35668">
<br />
<p>
                Nov 17, 09 15:37:39<br />
</p>

<p id="commentBody_35668">dings dangs dongs!</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=63100&amp;Itemid=44">igetmoneyobv</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35669">
<br />
<p>
                Nov 17, 09 15:46:35<br />
</p>

<p id="commentBody_35669">what a great piece of writing.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=5777&amp;Itemid=44">LoneGoose</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35670">
<br />
<p>
                Nov 17, 09 15:57:45<br />
</p>

<p id="commentBody_35670">pitch n putt?</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=18770&amp;Itemid=44">downosaur</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35673">
<br />
<p>
                Nov 17, 09 16:06:51<br />
</p>

<p id="commentBody_35673">Amazing insight. This is why your so good at poker.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=70611&amp;Itemid=44">dj_604</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35674">
<br />
<p>
                Nov 17, 09 16:07:46<br />
</p>

<p id="commentBody_35674">he will go broke obviously. he's riding high on tons of confidence and momentum. i remember one time last year on cakepoker i had 4k on there and had been playing 1/2. suddenly i decided to play 2/4 and quickly won 5k. i now had 9k online. then i sat in 5/10 NL. i was suddenly glued and addicted to the games. i was up 30k at 5/10 NL in 1 day. the rush was unbelievable. i could not quit. alls i could do was think about playuing more and more and higher. i played 10/20 heads up and quicvkly won 8k off a guy. i then sat in 25/50 with 40k online because the rush was so crazy and i was playing so good without even trying. well, my run ended there because i ran bad and ran out of money. well, ilsidur simply kept running good and propelled this same mindset into the millions he's got now. he will lose everything back, beleive me. poker aint no sprint, it's a marathon. have u ever sprinted a marathon? u fucking die. he's sprinting. he will die.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=1212&amp;Itemid=44">gambler2k4</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35677">
<br />
<p>
                Nov 17, 09 16:42:33<br />
</p>

<p id="commentBody_35677">well done haseeb, good job, great ending.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=8568&amp;Itemid=44">kingc11</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35678">
<br />
<p>
                Nov 17, 09 16:43:56<br />
</p>

<p id="commentBody_35678">nice post!</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=33219&amp;Itemid=44">Spurious</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35679">
<br />
<p>
                Nov 17, 09 16:44:07<br />
</p>

<p id="commentBody_35679">nice post!</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=33219&amp;Itemid=44">Spurious</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35680">
<br />
<p>
                Nov 17, 09 16:47:03<br />
</p>

<p id="commentBody_35680">So, you've never played euro games but you just assume they're softer? :o</p><p>
If that's the case why there's a lot of euros playing highstakes on FTP when they have to pay taxes on FTP winnings and euro-sites would be tax free?</p><p>
And why are two of FTPs biggest winners this year both scandis? (and isildur too)</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=72271&amp;Itemid=44">chinz</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35681">
<br />
<p>
                Nov 17, 09 16:56:50<br />
</p>

<p id="commentBody_35681">Best blog post I have ever read. Amazing.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=12679&amp;Itemid=44">Nookx</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35683">
<br />
<p>
                Nov 17, 09 16:58:23<br />
</p>

<p id="commentBody_35683">Thanks for the gr8 read Haseeb.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=44680&amp;Itemid=44">Thibo</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35684">
<br />
<p>
                Nov 17, 09 17:05:02<br />
</p>

<p id="commentBody_35684">blog of the year imo</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=7909&amp;Itemid=44">nomo4life</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35685">
<br />
<p>
                Nov 17, 09 17:11:28<br />
</p>

<p id="commentBody_35685">Nice post.  I'm rooting for Isildur1.  I hate bum hunters, which is what nosebleeds has come to with the dangs, galfonds, and others of the world.  Durrr isn't a bum hunter, as you aren't either.  However, there is excitement which is what the HSNL world needs.  If the money goes to Isildur1, it may trickle down the system, whereas if it goes to Durrrr, odds are we never see it again.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=2523&amp;Itemid=44">TrevRob</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35687">
<br />
<p>
                Nov 17, 09 17:25:33<br />
</p>

<p id="commentBody_35687">a+</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=13748&amp;Itemid=44">DamnRinger</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35688">
<br />
<p>
                Nov 17, 09 17:31:50<br />
</p>

<p id="commentBody_35688">I think you're a bit wrong about the Western/European thingy, if you look at alltime money winners a good bunch of them is european, larzluzak(Once considered best nlhe player in the world?) Patrik Antonius obv, ziigmund, david benyamine(french lol!), kaiibuxxe/Niki jedlicka and probably some other names. </p><p>
Ofc, if you look at the hs part 10/20 -&gt; 50/100 very few would be european but that is pretty easy to conclude why, it's really not worth the problem of moving funds from euro sites and risking taxes if you play those stakes because you ain't really upping the amount of action moving to FTP at those stakes, you really have to go skyrocket high to up the amount of action you get.</p><p>
And alot of ppl hate durrr because of the fact that galfond, and the dangs have kinda dragged him with them in the dirt because he is by ALOT of railbirds affiliated with bumhunting because of his friends and the relationship they have.</p><p>
(Obv, scumming loads of do' from gus and guy have to to do with it... u know what i mean.)</p><p>
Great blog btw, great read...There is alot of strong europlayers that have been trying to break isildur1 on euro sites for some time but what he does to them and did to durrrr is pretty much the same, dragging em to a game of variance and aggression he is simply better at IMO.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=18114&amp;Itemid=44">dayellow</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35689">
<br />
<p>
                Nov 17, 09 17:34:03<br />
</p>

<p id="commentBody_35689">Larz haven't won much tho, i forgot about his massive downswing and what it did to him regarding the nosebleed action participation.</p><p>
And yea, i didnt mean that he is better at handling variance i just mean he is really good at a high variance game, he is so freakin' beasty that he somehow takes the game in a way he wants it... except against PA yesterday when he played those NLHE games so friggin slow in comparison to PLO so he semitilted him right of the bat there.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=18114&amp;Itemid=44">dayellow</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35690">
<br />
<p>
                Nov 17, 09 17:34:29<br />
</p>

<p id="commentBody_35690">great post, excellent writing style too.</p><p>
I agree fully on the fact that there are 2 poker worlds. The top Euros are truly very very good, and given more time it will become obvious to most people that they are actually better than the top American pros.</p><p>
I play on euro sites so this is why I root for isildur1</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=27958&amp;Itemid=44">rajmaster</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35692">
<br />
<p>
                Nov 17, 09 17:37:57<br />
</p>

<p id="commentBody_35692">All I know is there are a lot of top swede's focus almost fully on GTO play and dont care about gameflow, a style that will be very hard to beat. </p><p>
I dont know if isildur1 is one of these guys but it wouldnt surprise me.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=27958&amp;Itemid=44">rajmaster</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35693">
<br />
<p>
                Nov 17, 09 17:43:17<br />
</p>

<p id="commentBody_35693">please please please write more.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=47557&amp;Itemid=44">BananaBalla</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35694">
<br />
<p>
                Nov 17, 09 17:45:36<br />
</p>

<p id="commentBody_35694">Very good read.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=63659&amp;Itemid=44">iReadSouls</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35695">
<br />
<p>
                Nov 17, 09 17:52:44<br />
</p>

<p id="commentBody_35695">best blog ever!!!</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=54566&amp;Itemid=44">JohnnyAbove</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35696">
<br />
<p>
                Nov 17, 09 18:04:21<br />
</p>

<p id="commentBody_35696">i had the exact same feelings as you about the durrrr v. isildur battle but could never write it so well in a million years, best blog post ever</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=24504&amp;Itemid=44">Eagle314</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35697">
<br />
<p>
                Nov 17, 09 18:06:18<br />
</p>

<p id="commentBody_35697">Really great read!</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=77478&amp;Itemid=44">wigumobv</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35698">
<br />
<p>
                Nov 17, 09 18:06:31<br />
</p>

<p id="commentBody_35698">Really great read!</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=77478&amp;Itemid=44">wigumobv</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35700">
<br />
<p>
                Nov 17, 09 18:17:45<br />
</p>

<p id="commentBody_35700">One of the best blog posts I've ever read.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=3613&amp;Itemid=44">wetleg</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35701">
<br />
<p>
                Nov 17, 09 18:46:13<br />
</p>

<p id="commentBody_35701">Tremendous. Thanks for sharing your perspective.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=15914&amp;Itemid=44">DeusExMachina</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35704">
<br />
<p>
                Nov 17, 09 19:29:45<br />
</p>

<p id="commentBody_35704">Excellent. <br />
Thanks for sharing your thoughts. You put a lot of effort into writing your blog well. I appreciate that.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=13861&amp;Itemid=44">epdog</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35706">
<br />
<p>
                Nov 17, 09 20:01:58<br />
</p>

<p id="commentBody_35706">i think there is a good chance that you might be fuckin crazy.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=38623&amp;Itemid=44">mmfb</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35709">
<br />
<p>
                Nov 17, 09 22:01:36<br />
</p>

<p id="commentBody_35709">Is this a joke? Durrr is supposed to be the example of our &quot;King&quot;...lol. He obv. a good player<br />
but waaaaaaaaay overstated here. I realize that highstakesdb is not completely accurate but in 08 it show his + almost 6mill and now for 09 he down 6mill. So in an entire 2 years he hasnt made shit (under his name) ...and he's the King?? How about Patrick Ant. + around 11mill over 2 years or IVY?...</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=70216&amp;Itemid=44">Slatey</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35711">
<br />
<p>
                Nov 17, 09 22:09:02<br />
</p>

<p id="commentBody_35711">Epic post, you are a poet and a scholar sir</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=10946&amp;Itemid=44">Peeda</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35713">
<br />
<p>
                Nov 17, 09 22:17:12<br />
</p>

<p id="commentBody_35713">great read!</p><p>
thanks!</p><p>
hopefully cts can dig himself out of his current hole to the faceless challenger</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=64104&amp;Itemid=44">Poolside</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35717">
<br />
<p>
                Nov 17, 09 22:32:26<br />
</p>

<p id="commentBody_35717">awesome post.  i really felt oddly interested in the match beyond what i anticipated and also found myself rooting for durrr for many of the reasons you stated.  poker has a lot of levels.</p><p>
as far as the match is concerned, i think it was a lot closer than results indicated.  isildur was a total unknown - everyone knows durrr and has had ample time to study his play.  early edge clearly goes to isildur.  kudos to him for taking advantage and making it stick, and then holding off the comeback at those stakes.  but given how aggro these guys play in hu matches and the variance those styles of play would generate i don't think 30k hands is even remotely enough hands to determine who the better player is.  even if one or the other had a very slight edge, there would be 30 bi swings up and down on a regular basis.  whoever is running better, not just in all ins, but in coolers, hitting good bluff cards, semibluffing and lucksacking rivers, etc, will be the one taking the lead.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=37093&amp;Itemid=44">tilllttt</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35721">
<br />
<p>
                Nov 17, 09 23:37:25<br />
</p>

<p id="commentBody_35721">great post, thank you</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=47816&amp;Itemid=44">VegasRisen</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35722">
<br />
<p>
                Nov 17, 09 23:37:47<br />
</p>

<p id="commentBody_35722">sick post.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=28262&amp;Itemid=44">Probability</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35723">
<br />
<p>
                Nov 17, 09 23:44:15<br />
</p>

<p id="commentBody_35723">One thing that hasn't been meantioned is, what the rise of Isldur1 means is that there will be others to follow. The lansdcape is constantly changing...</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=23055&amp;Itemid=44">wilneedheart</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35727">
<br />
<p>
                Nov 18, 09 00:13:09<br />
</p>

<p id="commentBody_35727">48th!</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=32014&amp;Itemid=44">cpar1</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35728">
<br />
<p>
                Nov 18, 09 00:38:02<br />
</p>

<p id="commentBody_35728">gambler2k4 no offense 2 u, but u cant compare your run to isildurs, im sure hes at the top because hes good not just running good</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=58170&amp;Itemid=44">DBKKK</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35729">
<br />
<p>
                Nov 18, 09 00:43:39<br />
</p>

<p id="commentBody_35729">very nice read although i do think ur being a bit overdramatic about it all lol</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=9274&amp;Itemid=44">jcl</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35730">
<br />
<p>
                Nov 18, 09 01:15:02<br />
</p>

<p id="commentBody_35730">slatey, incase you didnt know, Antonius is from Finland.</p><p>
Great post!</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=29497&amp;Itemid=44">Mayb</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35733">
<br />
<p>
                Nov 18, 09 02:13:06<br />
</p>

<p id="commentBody_35733">i will play high stakes one day soon, and i should thank this blog for the encouragement<br />
haseeb you killed it<br />
cheers bro</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=67813&amp;Itemid=44">vonMech</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35736">
<br />
<p>
                Nov 18, 09 02:45:52<br />
</p>

<p id="commentBody_35736">Too early to say anything about how good the guy is. And yes, the post is a bit over dramatic.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=35268&amp;Itemid=44">SubZero616</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35738">
<br />
<p>
                Nov 18, 09 03:29:35<br />
</p>

<p id="commentBody_35738">Still think he needs to have a match similar to this vs ivey.  ivey's image is beyond that of durrr's.  he just always seems to come out good in the end.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=65349&amp;Itemid=44">td8507</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35739">
<br />
<p>
                Nov 18, 09 03:44:42<br />
</p>

<p id="commentBody_35739">nice post</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=47009&amp;Itemid=44">Koln4ever</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35740">
<br />
<p>
                Nov 18, 09 03:44:54<br />
</p>

<p id="commentBody_35740">nice post</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=47009&amp;Itemid=44">Koln4ever</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35743">
<br />
<p>
                Nov 18, 09 04:16:53<br />
</p>

<p id="commentBody_35743">until he beats these games regularly, we can't really surmise much.  I remember Dustin Dirksen was crushing the NL games for a while too, and everyone was talking about him......</p><p>
haven't heard from him in a while have we??</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=41733&amp;Itemid=44">Totals</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35744">
<br />
<p>
                Nov 18, 09 05:44:39<br />
</p>

<p id="commentBody_35744">I loved the blog until you started about the western/euro stuff. In the history books I read, Europe is part of the western world. Seperating Europe from the western world is like starting the cold war again. I dont know why you are thinking this way, maybe it's inherent for Americans who always want to be creating wars and thinking themselves as the superior. Maybe it's something else. </p><p>
You made me laugh when comparing Durrr to the older poker generation. The past months Durrr was &quot;the new kid in town&quot; who was teaching the old generation how to play. Now he gets beaten hard, and all of a sudden he is the old generation. Does not compute IMO.</p><p>
But of course I'm just a low stakes grinder, so not my stakes. </p><p>
Just a quick laugh as before ending: You wanna know why Euro players play with without fear? The \$\$ comes so cheap! :D</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=79354&amp;Itemid=44">MrMich</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35745">
<br />
<p>
                Nov 18, 09 06:12:49<br />
</p>

<p id="commentBody_35745">great post, thank you!</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=68621&amp;Itemid=44">Dary_Legen</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35658">
<br />
<p>
                Nov 18, 09 09:06:51<br />
</p>

<p id="commentBody_35658">I actually read all of that, and I'm even late to go do something else. Well written, good sir!</p><p>
Edit: The part about USA/Europe was a bit stupid, though. :I<br />
</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=75436&amp;Itemid=44">Sigridsirvice</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35750">
<br />
<p>
                Nov 18, 09 09:16:28<br />
</p>

<p id="commentBody_35750">absolutly an EPIC post.. great read and really entertaining!!</p><p>
you should write scripts man</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=70486&amp;Itemid=44">funky80</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35751">
<br />
<p>
                Nov 18, 09 09:24:09<br />
</p>

<p id="commentBody_35751">Such a great blog, awesome read. Cheers</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=40373&amp;Itemid=44">TallisKid</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35753">
<br />
<p>
                Nov 18, 09 10:22:33<br />
</p>

<p id="commentBody_35753">epic</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=39636&amp;Itemid=44">Knumsi</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35758">
<br />
<p>
                Nov 18, 09 11:58:37<br />
</p>

<p id="commentBody_35758">thanks - great read especially coming from some one who was on the wrong side of the isildur rampage.  I wish you the best of luck in your comeback sir.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=72918&amp;Itemid=44">walt</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35761">
<br />
<p>
                Nov 18, 09 12:22:05<br />
</p>

<p id="commentBody_35761">I don't know what these haters are talking about. The part about Euro/US and the players' symbolic roles spoke very deeply to my thoughts on the matter.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=47816&amp;Itemid=44">VegasRisen</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35768">
<br />
<p>
                Nov 18, 09 12:52:25<br />
</p>

<p id="commentBody_35768">I think people hugely underestimate the variance of such matches. There's a good chance one of the players stands to make \$3000 an hour (or less) plus/minus a random swing of \$300K (or more).</p><p>
Run some simulations of 50 hours of such a match and revel in the variance. No really, do it. It's pretty sick.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=14723&amp;Itemid=44">Gnug315</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35779">
<br />
<p>
                Nov 18, 09 14:29:42<br />
</p>

<p id="commentBody_35779">Best poker blog entry I ever read.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=18315&amp;Itemid=44">erikejw</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35783">
<br />
<p>
                Nov 18, 09 15:04:40<br />
</p>

<p id="commentBody_35783">Ivey is still king in my book. Until he crushes ivey for 5 million + he still has something to prove. Im sure durrrr has not said his final word yet. SAme goes for Cole and Antonius.</p><p>
I watched for about 2 hours last night and its obv that he over bluffs a bit 2 much. Ivey picked him off with a pair of sevens for a 400k pot with a gross overbet on the river but Isal.</p><p>
I also saw cole pick him off also. I think what is so diffrent about him is that he calls ATC out of popo, he fires a lot of flops and floats a lot out of popo. Kinda plays against &quot;the standard&quot; way.</p><p>
<br />
Anyway, when antonius started a NLHU match last night, Isil asked him if he wanted to play 4 tables. Patrick did not respond. </p><p>
Im not sure if he was goin to close a few of his other HU if patrick would of accepted. Isal was already play 6 HU at the time of the request.</p><p>
<br />
SICK stuff</p><p>
<br />
Great entry, very well written.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=39208&amp;Itemid=44">streetfamep</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35784">
<br />
<p>
                Nov 18, 09 15:14:56<br />
</p>

<p id="commentBody_35784">Your posts aren`t blogposts, they`re more like world class philosophical articles...</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=14433&amp;Itemid=44">kaiser1985</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35785">
<br />
<p>
                Nov 18, 09 15:19:41<br />
</p>

<p id="commentBody_35785">Epic blog</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=63163&amp;Itemid=44">Tw33Ty</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35787">
<br />
<p>
                Nov 18, 09 15:31:00<br />
</p>

<p id="commentBody_35787">excellent post</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=57264&amp;Itemid=44">xouridas</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35789">
<br />
<p>
                Nov 18, 09 16:07:37<br />
</p>

<p id="commentBody_35789">Great read.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=42681&amp;Itemid=44">Tufe</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35790">
<br />
<p>
                Nov 18, 09 16:07:50<br />
</p>

<p id="commentBody_35790">Great read.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=42681&amp;Itemid=44">Tufe</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35791">
<br />
<p>
                Nov 18, 09 16:21:57<br />
</p>

<p id="commentBody_35791">Should  Patrick be considered part of European or Western-FTP team?</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=61445&amp;Itemid=44">Rufus</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35796">
<br />
<p>
                Nov 18, 09 17:26:02<br />
</p>

<p id="commentBody_35796">Phil Ivey does NOT approve this message</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=11587&amp;Itemid=44">LesW</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35803">
<br />
<p>
                Nov 18, 09 20:53:15<br />
</p>

<p id="commentBody_35803">My god this was an epic blog post. Loved it. Good work</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=78770&amp;Itemid=44">Reft</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35811">
<br />
<p>
                Nov 19, 09 01:27:46<br />
</p>

<p id="commentBody_35811">probably one of the best poker-related things I have ever read.  Nice job, and thanks.<br />
Poopy</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=9366&amp;Itemid=44">pokerpoopy</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35812">
<br />
<p>
                Nov 19, 09 01:27:58<br />
</p>

<p id="commentBody_35812">probably one of the best poker-related things I have ever read.  Nice job, and thanks.<br />
Poopy</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=9366&amp;Itemid=44">pokerpoopy</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35813">
<br />
<p>
                Nov 19, 09 02:46:43<br />
</p>

<p id="commentBody_35813">wow! Some people just got it like that.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=31601&amp;Itemid=44">wordhappy</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35825">
<br />
<p>
                Nov 19, 09 07:41:51<br />
</p>

<p id="commentBody_35825">This is a great post, but I find it interesting that you managed to write so much about the online poker hierarchy without mentioning the word &quot;Ivey&quot;. Isildur has definitely shaken up the high stakes world, but I don't think you can say that the established order has fallen while Ivey remains intact.</p><p>
To me, Ivey and Dwan are both looked up to as the king(s) of online poker. They give online players a sense of security. Even if someone comes and goes on a crazy heater against other high stakes regs, people say &quot;oh yeah? just wait til he plays Ivey or Dwan!&quot; </p><p>
What is the difference between Dwan and Ivey? I think Dwan gets talked about more online because he is younger and better represents our generation of internet players, and I think you're right about his imperfection making him easier to relate to. On the other hand, Ivey is almost viewed as a machine, taking people apart with mechanical precision. He doesn't represent the &quot;average&quot; young high stakes grinder, but that doesn't make him any less of a force to be reckoned with. The throne of online poker is shared equally between Dwan and Ivey imo...</p><p>
On another note, I think you're right about the aura of invulnerability thing. In many cases, it only takes one person to take down the &quot;champion&quot; and then a lot of people will come out of the woodwork and start beating him because that psychological barrier has been broken. For people who follow tennis, I bring up the example of Roger Federer. Once his aura of invulnerabilty was shattered by Nadal, lots of the other top 10 players started beating him too.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=43446&amp;Itemid=44">LingXY</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35827">
<br />
<p>
                Nov 19, 09 08:35:35<br />
</p>

<p id="commentBody_35827">fantastic read.<br />
What i dont get is the Western/Eastern, America/Europe thing. Im from Europe and i was routing for durrrr, because i think hes a really good person and the best HUNL player in the world.<br />
Why would you root for a poker player based on which country he is, i mean its poker not soccer or so. For me it would make more sense if i were you to root for Isildur because then there is a better chance that I could become the best &quot;West&quot; player one time.<br />
Also you said that you wouldnt play as high as durrrr even if you had the bankroll, that was really leaving me speechless.<br />
Maybee i just dont understand the american mentality. In Europe its more like when you start a game keep on fighting till u are the best at what u do and if u fail u go broke, so what.<br />
Dont get me wrong im a nit as well, using bankroll management and so on, but how can u motivate urself and keep on grinding if theres no goal anymore?<br />
greetz kohi</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=50847&amp;Itemid=44">kohi</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35836">
<br />
<p>
                Nov 19, 09 12:27:51<br />
</p>

<p id="commentBody_35836">Great writing wow!</p><p>
You shoudl write a book.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=41227&amp;Itemid=44">Sick Cards</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35848">
<br />
<p>
                Nov 19, 09 19:27:50<br />
</p>

<p id="commentBody_35848">But isildur is actually new to PLO. His main game is NL and from what ive heard he has mostly played some tiltgames before joining FTP. Sick good post though!</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=15916&amp;Itemid=44">almtom</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35849">
<br />
<p>
                Nov 19, 09 19:28:03<br />
</p>

<p id="commentBody_35849">But isildur is actually new to PLO. His main game is NL and from what ive heard he has mostly played some tiltgames before joining FTP. Sick good post though!</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=15916&amp;Itemid=44">almtom</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35853">
<br />
<p>
                Nov 19, 09 20:53:35<br />
</p>

<p id="commentBody_35853">you should be a writer or spokesman for poker with a stirring, profound and honest article like this!   keep up the good work.  i basically agree with your viewpoint, and watch with excitement to see what happens next at this historical time for poker.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=58639&amp;Itemid=44">__data__</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35856">
<br />
<p>
                Nov 19, 09 23:29:45<br />
</p>

<p id="commentBody_35856">Thank you very much for that indulgent, insightful, and remarkably well-written blog post.</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=9809&amp;Itemid=44">PtM</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35859">
<br />
<p>
                Nov 20, 09 04:05:36<br />
</p>

<p id="commentBody_35859">I might take action based on the odds Isildur1 a superuser</p><p>
seems pretty obv now you say he was playing 25/50 LOL</p><p>
*puts down haterade*</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=11587&amp;Itemid=44">LesW</a></p>
<p><hr />
</p></div>
<div id="blogCommentDiv_35863">
<br />
<p>
                Nov 20, 09 07:27:34<br />
</p>

<p id="commentBody_35863">Your final comment about Antonius turning the tides again is slightly wrong of course, as he is from the European heirarchy (if such a thing exists).</p>
<p><a href="http://www.cardrunners.com/members/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=2507&amp;Itemid=44">alpatters</a></p>
<p><hr />
</p></div>

</div>

<hr />

<div id="entryFooter">
<table>
<tr>
<td valign="middle"><a href="http://blogs.cardrunners.com/rss/internetpokers.rss"><img src="http://blogs.cardrunners.com/templates/template2/images/rss.png" border="0" /></a></td>
<td valign="middle"><a href="http://blogs.cardrunners.com/rss/internetpokers.rss">Subscribe to this feed</a></td>
<td valign="middle"><img src="http://blogs.cardrunners.com/templates/template2/images/dot.jpg" border="0" /></td>
<td valign="middle"><span onclick="toggleFavorites('39770')" id="favorite">Add to Favorites</span></td>
<td valign="middle"><img src="http://blogs.cardrunners.com/templates/template2/images/dot.jpg" border="0" /></td>
<td valign="middle"><a href="http://blogs.cardrunners.com/BLAG/an-unstoppable-force-meets-1258491260" onclick="window.open('http://blogs.cardrunners.com/templates/template2/blog_email.php?blog=39770&amp;url=BLAG','Send','menubar=no,width=525,height=260,toolbar=no');"><img src="http://blogs.cardrunners.com/templates/template2/images/send.png" border="0" /></a></td>
<td valign="middle"><a href="http://blogs.cardrunners.com/BLAG/an-unstoppable-force-meets-1258491260" onclick="window.open('http://blogs.cardrunners.com/templates/template2/blog_email.php?blog=39770&amp;url=BLAG','Send','menubar=no,width=525,height=260,toolbar=no');">Send to Friend</a></td>
</tr>
</table>
</div>
<hr />

				
					<br/><a href="http://news.ycombinator.com/item?id=954273">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>The Unlambda Programming Language</title>
        	<link>http://www.madore.org/~david/programs/unlambda/</link>
        	<comments>http://news.ycombinator.com/item?id=955154</comments>
	        <description>
    	        <![CDATA[
				
<h1>The Unlambda Programming Language</h1>
<p><big>Unlambda: Your Functional Programming
Language Nightmares Come True</big></p>
<h2>Table of contents</h2>
<ul>
<li><a href="http://www.madore.org/~david/programs/unlambda/#whats_new">What's New in Unlambda World?</a></li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#intro">Introduction</a>
<ul>
<li><a href="http://www.madore.org/~david/programs/unlambda/#what_is">What is Unlambda?</a></li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#what_looks">What does Unlambda look like?</a></li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#principles">What are the principles of Unlambda?</a></li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#links-obf">Links and meta-links to other obfuscated
programming languages</a></li>
</ul>
</li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#tut">Tutorial</a>
<ul>
<li><a href="http://www.madore.org/~david/programs/unlambda/#fun__app">Functions and application</a></li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#combi">Combinators</a></li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#lambda_elim">Abstraction elimination</a>
<ul>
<li><a href="http://www.madore.org/~david/programs/unlambda/#shortcuts">Making abstraction elimination more
efficient</a></li>
</ul>
</li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#more_bi">More Unlambda builtins</a>
<ul>
<li><a href="http://www.madore.org/~david/programs/unlambda/#void"><code>v</code></a></li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#print"><code>.<var>x</var></code></a></li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#delay"><code>d</code></a></li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#callcc"><code>c</code></a></li>
</ul>
</li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#howto">HOWTO: various programming techniques</a>
<ul>
<li><a href="http://www.madore.org/~david/programs/unlambda/#howto_loop">How do I write a loop in Unlambda?</a></li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#howto_num">How can I represent numbers in
Unlambda?</a></li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#howto_lists">How can I represent lists (and related data
structures) in Unlambda?</a></li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#howto_bool">How do I write tests and booleans in
Unlambda?</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#quine">A note about the Unlambda Quine Contest</a></li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#impl">Implementing Unlambda</a>
<ul>
<li><a href="http://www.madore.org/~david/programs/unlambda/#impl_func">First-class functions</a></li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#impl_cont">First-class continuations</a></li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#impl_gc">Garbage collection</a></li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#impl_prom">Promises</a></li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#impl_comp">Can Unlambda be compiled?</a></li>
</ul>
</li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#ref">Unlambda reference</a></li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#distrib">Unlambda distribution</a> (download Unlambda
here)</li>
<li><a href="http://www.madore.org/~david/programs/unlambda/#cuan">Comprehensive Unlambda Archive Network</a></li>
</ul>
<h2><a name="whats_new">What's New in Unlambda World?</a></h2>
<p>(If you don't know what Unlambda is, skip this section and move
directly to the <a href="http://www.madore.org/~david/programs/unlambda/#intro">introduction</a> below.)</p>
<p>[2001/08] This page is being revised in preparation of the
Unlambda&nbsp;3 distribution.</p>
<h2><a name="intro">Introduction</a></h2>
<blockquote>
<p>&ldquo;It's disgusting &mdash; it's revolting &mdash; we love
it.&rdquo;
<cite>CyberTabloid</cite></p>
</blockquote>
<blockquote>
<p>&ldquo;Unlambda, the language in which every program is an
IOUCC.&rdquo;
<cite>Encyclop&aelig;dia Internetica</cite></p>
</blockquote>
<blockquote>
<p>&ldquo;The worst thing to befall us since Intercal.&rdquo;
<cite>Computer Languages Today</cite></p>
</blockquote>
<blockquote>
<p>&ldquo;The effect of reading an Unlambda program is like habing
your brains smashed out by a Lisp sexp wrapped around an ENIAC.  You
won't find anything like it west of Alpha Centauri.&rdquo;
<cite>The Hitch-Hacker's Guide to Programming</cite></p>
</blockquote>
<h3><a name="what_is">What is Unlambda?</a></h3>
<p>Unlambda is a programming language.  Nothing remarkable there.  The
originality of Unlambda is that it stands as the unexpected
intersection of two marginal families of languages:</p>
<ul>
<li>Obfuscated programming languages, of which the canonical
representative is <a href="http://www.catb.org/~esr/intercal/">Intercal</a>.  This means
that the language was deliberately built to make programming painful
and difficult (i.e.&nbsp;fun and challenging).</li>
<li>Functional programming languages, of which the canonical
representative is <a href="http://www.swiss.ai.mit.edu/projects/scheme/">Scheme</a> (a Lisp
dialect).  This means that the basic object manipulated by the
language (and indeed the <em>only</em> one as far as Unlambda is
concerned) is the function.</li>
</ul>
<p>Obfuscated programming languages (see <a href="http://www.madore.org/~david/programs/unlambda/#links-obf">below</a> for links) are typically made nasty by
either strongly restricting the set of allowed operations in the
language, or making them very different from what programmers are used
to, or both.  (Of course, the goal is to do that while still being
Turing-complete.)  Unlambda does this (note, however, that the
operations permitted were not chosen at random: they have their
theoretical importance).  But whereas most obfuscated programming
languages try to somehow model the Turing Machine paradigm, Unlambda
does not use a tape, array or stack.  Nor is it binary-oriented; as a
matter of fact, it does not manipulate integers in any way.  Other
remarkable (un)features of Unlambda are the fact that it does not have
any variables, data structures or code constructs (such as loops,
conditionals and such like).</p>
<p>Rather, Unlambda uses a functional approach to programming: the
only form of objects it manipulates are functions.  Each function
takes a function as argument and returns a function.  Apart from a
binary &ldquo;apply&rdquo; operation, Unlambda provides several builtin
functions (the most important ones being the K and S combinators).
User-defined functions can be created, but not saved or named, because
Unlambda does not have any variables.</p>
<p>Despite all these apparently unsurmountable limitations, Unlambda
is fully Turing-equivalent.</p>
<p>Mathematically, the core of the language can be described as an
implementation of the lambda-calculus without the lambda operation,
relying entirely on the K and S combinators.  Hence the name
&ldquo;Unlambda&rdquo;.  It uses head (&ldquo;eager&rdquo;, &ldquo;by
value&rdquo;, &ldquo;strict&rdquo;) evaluation.  I cannot claim
originality there.  However, as far as I know, I am the first to have
taken this theoretical concept and made it into an actual
(deliberately obfuscated) programming language.  I added a couple of
functions (chosen for their obscurity) to the language so as to make
output (and, in version 2, input) possible, or just to make things
even more obscure (delay and call/cc are such).</p>
<p><small><em>A note on terminology:</em> The phrase &ldquo;purely
functional programming language&rdquo; is usually applied to
languages, like <a href="http://www.haskell.org/">Haskell</a> or
<a href="http://www.cs.kun.nl/~clean/">Clean</a>, which are lazy and
demand explicit sequencing of side effects.  I dislike this
terminology: for one thing, a &ldquo;functional&rdquo; programming
language is one in which functions have first-class citizenship, so a
&ldquo;purely functional&rdquo; one should be one where, as in
Unlambda, <em>only</em> functions have first-class citizenship.  And
what are usually called &ldquo;purely functional programming
languages&rdquo; should be called, exactly as I just did, lazily
evaluating programming languages with explicitly sequenced side
effects.  All these points are orthogonal: it is quite possible to
conceive a lazy programming language which is not functional, or an
eager (i.e.&nbsp;non-lazy) functional programming language which still
demands explicit sequencing of side effects.  In any case, this is to
say that I might, on occasion, speak of Unlambda as a &ldquo;purely
functional&rdquo; programming language, although, with the usual
terminology, it is not.</small></p>
<h3><a name="what_looks">What does Unlambda look like?</a></h3>
<p>Well, let's discuss an example: the following Unlambda program
calculates and prints the Fibonacci numbers (as lines of
asterisks)</p>
<pre>
```s``s``sii`ki
  `k.*``s``s`ks
 ``s`k`s`ks``s``s`ks``s`k`s`kr``s`k`sikk
  `k``s`ksk
</pre>
<p>(All whitespace is optional and arbitrary.  Some former versions of
this page gave a uselessly complicated and inefficient program.)</p>
<p>You're right: it's not very readable.  Writing Unlambda programs
isn't really as hard as it might seem; however, <em>reading</em>
Unlambda programs is practically impossible.  We'll be <a href="http://www.madore.org/~david/programs/unlambda/#tut">explaining</a> what all this means later on, but let's
just stick to basic observations for the moment.</p>
<p>As you can see, the most common character (essentially, it makes up
half of any Unlambda program) is the backquote (ASCII number 96=0x60).
The backquote represents Unlambda's <em>apply</em> operation.  After
that come the S and K combinators (and I, but I can be done away with
entirely).  Some other characters can occur in Unlambda programs but
they are not nearly so common.  Besides the backquote and the letters
<code>s</code>, <code>k</code> and <code>i</code>, the above program
has <code>r</code> and <code>.*</code> as its only other building
blocks: these are the Unlambda printing functions (<code>r</code>
prints a newline and <code>.*</code> prints an asterisk).  The more
sophisticated Unlambda functions (<code>v</code>, <code>d</code>,
<code>c</code>, <code>e</code> and the input functions) are not used
here at all.</p>
<h3><a name="principles">What are the principles of Unlambda?</a></h3>
<p>The number one principle of the Unlambda language is that
<em>everything is a function</em>: this is true in the sense that
Unlambda is a profile of the pure untyped lambda calculus.  (Well, to
be honest, the <code>d</code> builtin isn't precisely a function, but
we will consider it as such anyway.)</p>
<p>Despite Unlambda being a form of the lambda calculus, it does not
have a lambda (abstraction) operation.  Rather, this operation must be
replaced by the use of the S, K and I combinators &mdash; this can be
done mechanically using <a href="http://www.madore.org/~david/programs/unlambda/#lambda_elim">abstraction
elimination</a>.  Because there is no abstraction, functions are not
named in Unlambda (except the builtin ones): there are no variables or
such thing.  This doesn't mean you can't build up your own functions.
Nor does the fact that there are only functions in Unlambda prevent
you from coming up with data structures and the like, but you just
have to represent them with <i lang="la">ad hoc</i> functions.  In
fact, you can so well build your own structures and such that Unlambda
is (and, to work, must be) garbage-collected like any decent
high-level language.</p>
<p>So, everything is a function.  To start with, you have the builtin
functions (<code>i</code>, <code>k</code>, <code>s</code> and the
like), and you can do one thing: apply a function <var>F</var> to a
function <var>G</var>, the result being denoted
<code>`<var>F</var><var>G</var></code>.  It is from this basic idea
that Unlambda is built.</p>
<h3><a name="links-obf">Links and meta-links to other obfuscated
programming languages</a></h3>
<ul>
<li><a href="http://www.mines.edu/students/b/bolmstea/randlang/">The
Random Programming Languages List</a>, by <a href="http://www.mines.edu/students/b/bolmstea/">Ben Olmstead</a>
(also the inventor of <a href="http://www.mines.edu/students/b/bolmstea/malbolge/">Malbolge</a>,
probably <em>the</em> most devilish language in existence), is a quite
comprehensive list of evil programming languages.  It <a href="http://www.mines.edu/students/b/bolmstea/randlang/#unlambda">mentions
Unlambda</a>.</li>
<li><a href="http://www.geocities.com/ResearchTriangle/Station/2266/tarpit/tarpit.html">The
Turing Tarpit</a>, by <a href="http://www.geocities.com/ResearchTriangle/Station/2266/">Brian
Connors</a> (named after an <a href="http://www.catb.org/~esr/jargon/html/T/Turing-tar-pit.html">entry</a>
in the <a href="http://www.catb.org/~esr/jargon/">Jargon File</a>), is
a similar list of Bad Languages and other cyberlinguistic horrors.  It
also mentions Unlambda.</li>
<li><a href="http://pages.prodigy.net/rkusnery/">Ryan Kusnery</a>'s
list of <a href="http://pages.prodigy.net/rkusnery/weird.html">Weird
Programming Languages</a> is also quite good, despite its not
mentioning Unlambda.</li>
<li><a href="http://www2.thecia.net/users/prfnoff/">Prfnoff</a>'s <a href="http://www2.thecia.net/users/prfnoff/obslang/obslang.html">Obfuscated
Languages list</a> mentions two languages he wrote (not usually
included in similar lists): Fromage and BAK.</li>
<li><a href="http://www.catb.org/~esr/">Eric S. Raymond</a>'s famous
<a href="http://www.catb.org/~esr/retro/">Retrocomputing Museum</a>
lists a few thinks that cause a feeling &ldquo;between nostalgia and
nausea&rdquo;.</li>
<li><a href="http://www.catb.org/~esr/intercal/">Intercal</a> remains
the archetype of the Obfuscated Programming Language.</li>
<li><a href="http://www.catseye.mb.ca/">Cats-Eye Technologies</a>
(used to be <code>http://www.cats-eye.com/</code> and has moved to
<code>http://www.catseye.mb.ca/</code>: thanks to Rafael Kaufmann for
pointing this out) hosts a lot of items of related interest, including
the famous <a href="http://www.catseye.mb.ca/esoteric/bf/">BrainF***</a> language,
whose name quite appropriately describes the point of all these
languages.  They also have a page on fortune's <a href="http://www.catseye.mb.ca/vintage/lesserknown/">lesser-known
programming languages</a>.</li>
<li>The <a href="http://www.purists.org/">&ldquo;Institute of Applied
Iconoclasm&rdquo;</a> maintains an <a href="http://www.purists.org/esoteric/">Esoteric Languages
Database</a>, which <a href="http://www.purists.org/esoteric/i10057.html">lists Unlambda</a>.
They also seem to have a very high opinion of it, and of
myself&nbsp;;-)</li>
<li><a href="http://lightning.prohosting.com/~kgaughan/esolang.html">The
Esoteric Programming Languages Ring</a> of which this site is part:<br />
[
<a href="http://nav.webring.org/cgi-bin/navcgi?ring=esolang;id=6;prev5">Previous 5 Sites</a>
|
<a href="http://nav.webring.org/cgi-bin/navcgi?ring=esolang;id=6;prev">Previous</a>
|
<a href="http://nav.webring.org/cgi-bin/navcgi?ring=esolang;id=6;next">Next</a>
|
<a href="http://nav.webring.org/cgi-bin/navcgi?ring=esolang;id=6;next5">Next 5 Sites</a>
|
<a href="http://nav.webring.org/cgi-bin/navcgi?ring=esolang;random">Random Site</a>
|
<a href="http://nav.webring.org/cgi-bin/navcgi?ring=esolang;list">List Sites</a>
]
</li>
</ul>
<h2><a name="tut">Tutorial</a></h2>
<p>Although the very idea of a tutorial for such an obfuscated
language as Unlambda is patently absurd, I shall try to give a brief
introduction to the concepts before dwelling in the details of the
reference section (which is also very short considering how small
Unlambda is as a whole).</p>
<h3><a name="fun__app">Functions and application</a></h3>
<p>As has been mentioned in the <a href="http://www.madore.org/~david/programs/unlambda/#intro">introduction</a>, the
only objects that the Unlambda programming language manipulates are
<em>functions</em>.  Every function takes exactly one argument (that
is also a function) and returns one value (that is also a
function).</p>
<p>The basic building blocks for Unlambda programs are the <em>primitive
functions</em> and the <em>application operation</em>.  There are
seven primitive functions in Unlambda version 1: <code>k</code>,
<code>s</code>, <code>i</code>, <code>v</code>, <code>d</code>,
<code>c</code> and <code>.<var>x</var></code> (where <var>x</var> is
an arbitrary characters &mdash; so actually that makes 6+256 primitive
functions, but we shall consider <code>.<var>x</var></code> as a
single function; the <code>r</code> function is but a commodity
synonym for <code>.<var>x</var></code> where <var>x</var> is the
newline character).  Unlambda version 2 adds the following new
primitive functions: <code>e</code>, <code>@</code>,
<code>?<var>x</var></code> (where <var>x</var> is a character) and
<code>|</code>.</p>
<p>Function application is designated with the backquote (ASCII number
96=0x60) character.  The notation is prefix, in other words,
<code>`<var>F</var><var>G</var></code> means <var>F</var> applied to
<var>G</var>.</p>
<p>We'll be explaining in detail what application means exactly, but
for the moment, we'll just say that it means that <var>F</var> will do
something with the value of <var>G</var>, including applying other
functions to it, or applying it to other functions.  (That's about the
only thing it can do, as a matter of fact.)  Just how <var>F</var>
does this will become clear later on (or it should).  We have to note,
of course, that both <var>F</var> and <var>G</var> may themselves be
obtained by applying various functions to each other.</p>
<p>The fact that every Unlambda function is unary (takes exactly one
argument) means that the backquote notation is unambiguous, and we do
not need parentheses (or, if you prefer, the backquote plays the role
of the open parenthesis of Lisp, but the closed parenthesis is
unnecessary).  For example,
<code>``<var>F</var><var>G</var><var>H</var></code> means
(<var>F</var> applied to <var>G</var>) applied to <var>H</var> whereas
<code>`<var>F</var>`<var>G</var><var>H</var></code> means <var>F</var>
applied to (<var>G</var> applied to <var>H</var>).  To check whether
an expression is a valid Unlambda expression, there is a simple
criterion: start at the left with a counter equal to the number 1, and
move from left to right: for every backquote encountered, increment
the counter, and for every primitive function encountered, decrement
it; the counter must always remain positive except at the very end
when it must reach zero.</p>
<p><a name="curry">Since all Unlambda functions take exactly one
argument, when we wish to handle a function of several arguments, it
is necessary to &ldquo;curry&rdquo; that function.</a> That is, read the
arguments one after another.  For example, if <var>F</var> is a
function that should take three variables, it will be applied thus:
<code>```<var>F</var><var>G<sub>1</sub></var><var>G<sub>2</sub></var><var>G<sub>3</sub></var></code>.
The idea being that <var>F</var> will do nothing but read the first
argument and return (without side effects) a function that reads the
second argument and returns a function that reads the third argument
and finally do whatever calculation it is <var>F</var> was supposed to
perform.  Thus, both
<code>``<var>F</var><var>G<sub>1</sub></var><var>G<sub>2</sub></var></code>
and <code>`<var>F</var><var>G<sub>1</sub></var></code> are legal, but
they don't do much except wait for more arguments to come.</p>
<p>The previous discussion is not so theoretical.  Of course, when the
user is defining his own functions, he may use whatever mechanism he
seems fit for reading the functions' arguments (but such a
currying is certainly the best because pairs and lists are so
horribly difficult to define in Unlambda).  But the builtin
<code>k</code> and <code>s</code> functions take respectively 2 and 3
arguments, and the several arguments are passed in the manner which we
have just described.  (<a name="zero_note">As a side note</a>, I
remark that it is, if not impossible, at least inconvenient, to
construct functions that take zero arguments because preventing
evaluation until all arguments have been read is good but when there
are no arguments to be read, the situation is not pleasant; in the
pure lambda calculus there is no problem because evaluation order is
unspecified and irrelevant, but in Unlambda we have a bigger problem.
Here the <code>d</code> function might help.)</p>
<p>A note about evaluation order: when Unlambda is evaluating an
expression <code>`<var>F</var><var>G</var></code>, it evaluates
<var>F</var> first, and then <var>G</var> (the exception being when
<var>F</var> evaluates to <code>d</code>), and then applies
<var>F</var> to <var>G</var>.  Evaluation is idempotent: that is,
evaluating an already evaluated expression in Unlambda does not have
any effect (there is no level-of-quotation concept as in m4 or <a href="http://www.eleves.ens.fr:8080/home/madore/programs/simple/simple.html">SIMPLE</a>).</p>
<p>(Perhaps it would be clearer to describe things by distinguishing
<em>expressions</em> and <em>functions</em>, where the latter are
obtained by evaluating the former.  This is what the Java version of
the Unlambda interpreter does, for example (whereas the Scheme version
does not).  It is merely a matter of choice.  True, the distinction
might help in understanding the <code>d</code> builtin, since it keeps
an <em>expression</em> in its unevaluated form.)</p>
<p>We now turn to the description of the Unlambda builtins.</p>
<h3><a name="combi">Combinators</a></h3>
<p>The <code>k</code> and <code>s</code> builtins are the core of the
language.  Just these two suffice to make Unlambda Turing complete
(although <code>.<var>x</var></code> is also necessary if you want to
print anything).  The <code>k</code> builtin is easy enough to
describe: it takes two arguments (in curried fashion, as explained <a href="http://www.madore.org/~david/programs/unlambda/#curry">above</a>) and returns the first.  Thus,
<code>``k<var>X</var><var>Y</var></code> evaluates to
<code><var>X</var></code> (evaluated).  Note that <var>Y</var> is
still evaluated in the process.  The <code>s</code> builtin is
slightly more delicate.  It takes three arguments, <var>X</var>,
<var>Y</var> and <var>Z</var>, and evaluates as does
<code>``<var>X</var><var>Z</var>`<var>Y</var><var>Z</var></code>.</p>
<p>So, let's get things straight: <code>k</code> doesn't do much until
it is applied to two arguments, in which case it throws the second one
away and returns the first.  As for <code>s</code>, it doesn't do much
until it is applied to three arguments, at which point it applies the
first to the third, and the second to the third, and the result of the
former application to the result of the latter.</p>
<p>To take an example, consider <code>```skss</code>: here <code>s</code>
is applied to three arguments, <code>k</code>, <code>s</code> and
<code>s</code>, so it performs the evaluation of <code>``ks`ss</code>.
But here we see that the first k is applied to two arguments
(<code>s</code> and <code>`ss</code>), so that it returns the first
(namely <code>s</code>), and the final result is <code>s</code>.</p>
<p>We also mention immediately the <code>i</code> function: it is simply
the identity function In other words, it takes an argument and returns
it intact.  The <code>i</code> function is not strictly necessary but
it is practical.  It could be replaced by <code>``skk</code>.
(Indeed, <code>```skk<var>X</var></code> evaluates as
<code>``k<var>X</var>`k<var>X</var></code> because of the
<code>s</code>, which in turn evaluates as <code><var>X</var></code>
because of the <code>k</code>.)</p>
<p>To summarize, the <code>k</code> builtin is a &ldquo;constant
function constructor&rdquo;.  That is, for all <var>X</var>,
<code>`k<var>X</var></code> is the constant function with value
<var>X</var>.  The <code>s</code> builtin corresponds to
&ldquo;substituted application&rdquo;: that is,
<code>``s<var>X</var><var>Y</var></code> is a function that, instead
of applying <var>X</var> to <var>Y</var> directly, will apply each of
them to <var>Z</var> (the argument) first, and then one to the other.
Finally, <code>i</code> is the identity function.</p>
<h3><a name="lambda_elim">Abstraction elimination</a></h3>
<p>We will now try to describe the central process of abstraction
elimination.  This is not necessary to understand how Unlambda works,
but it is necessary to understand how you can do anything with it.</p>
<p>The central feature which <em>appears</em> to be missing from
Unlambda is that of variables.  This is precisely what abstraction
elimination enables us to recover.  The problem is, given an
expression <var>F</var> that contains, apart from ordinary Unlambda
symbols, one &ldquo;variable&rdquo; symbol which we will write
<code>$<var>x</var></code>, to build a function that, when applied to
some <var>X</var>, will return the value of <var>F</var> with
<var>X</var> substituted in place of <code>$<var>x</var></code>.  In
other words, we want to build a function (which we will write
<code>^<var>x</var><var>F</var></code>) which takes a value
<var>X</var> for <code>$<var>x</var></code> and does some operation
(specified by <var>F</var>) on it.  This is the <dfn>lambda</dfn> (or
<em>abstraction</em>) operation of the lambda calculus (our notation
<code>^</code> is supposed to stand for a lambda).  Unfortunately,
Unlambda, as its name indicates, does not have this lambda operation,
and our problem is to eliminate it, in a systematic way, from
expressions (hence the name <em>abstraction elimination</em>).  For
example, <code>^x$x</code> (the function of <code>$x</code> which
simply returns <code>$x</code>) is supposed to give <code>i</code> (or
something equivalent) when abstraction elimination is performed.</p>
<p>So, we take an expression <var>F</var> involving
<code>$<var>x</var></code>, and we want to eliminate the starting
lambda in <code>^<var>x</var><var>F</var></code>.  We do this by
induction on the complexity of <var>F</var>; there are three cases
which must be taken into account: either <var>F</var> is builtin (or
some variable other than <code>$<var>x</var></code>, if we permit
this), or <var>F</var> is <code>$<var>x</var></code>, or <var>F</var>
is an application, say, <code>`<var>G</var><var>H</var></code>, with
<var>G</var> and <var>H</var> simpler expressions (which, by
induction, we know how to reduce).  So we consider these three cases
separately:</p>
<ul>
<li><a name="elim_case1">In the first case</a>, we want to eliminate
the lambda from <code>^<var>x</var><var>F</var></code>, where
<var>F</var> does not depend on <code>$<var>x</var></code>.  So it is
the constant function with value <var>F</var>.  But, as we know, this
is <code>`k<var>F</var></code>.  So we know how to eliminate
abstraction in this case.</li>
<li>In the second case, we want to eliminate the lambda from
<code>^<var>x</var>$<var>x</var></code>.  But this is precisely the
identity function, so it reduces as <code>i</code>.</li>
<li>In the third case, we want to eliminate the lambda from
<code>^<var>x</var>`<var>G</var><var>H</var></code>, assuming we know
how to eliminate the lambda from
<code>^<var>x</var><var>G</var></code> and from
<code>^<var>x</var><var>H</var></code>.  But the function we are
considering takes an <var>X</var> and applies it to
<code>^<var>x</var><var>G</var></code>, then to
<code>^<var>x</var><var>H</var></code>, and finally applies the result
of one to the result of the other.  This is precisely the role of the
<code>s</code> builtin.  So
<code>^<var>x</var>`<var>G</var><var>H</var></code> is no other than
<code>``s^<var>x</var><var>G</var>^<var>x</var><var>H</var></code>
(and by eliminating the lambda from the inner expressions we get what
we wanted).</li>
</ul>
<p>Finally, abstraction elimination is described mechanically as
follows: consider the expression <var>F</var> and we want to eliminate
the lambda from <code>^<var>x</var><var>F</var></code>.  Scan the
<var>F</var> expression from left to right: for every <code>`</code>
(backquote) encountered, write <code>``s</code> (by virtue of the
third case above); for every <code>$<var>x</var></code> encountered,
write <code>i</code> (by virtue of the second case); and for any
builtin or any variable other than <code>$<var>x</var></code>, write
<code>`k</code> followed by the thing in question.</p>
<p>As an example, the function <code>^x`$xk</code>, which takes a
function and applies that function to the function <code>k</code>,
transforms as <code>``si`kk</code>.</p>
<p>If several lambdas need to be eliminated from one expression, the
trick is to start with the innermost ones, and to eliminate the
outermost lambdas last.  As an example, <code>^x^y`$y$x</code> becomes
first <code>^x``si`k$x</code> (upon eliminating the innermorst lambda)
and then <code>``s``s`ks`ki``s`kki</code> (upon eliminating the
outermost).</p>
<p>If several lambdas are present, i.e.&nbsp;if several abstraction
eliminations are performed as explained in the previous paragraph, the
length of the resulting expression grows exponentially (with factor 3
for each lambda).  A single <code>`</code> becomes <code>``s</code>
after one abstraction elimination, then <code>``s``s`ks</code> after a
second, <code>``s``s`ks``s``s`ks``s`kk`ks</code> after a third,
<code>``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s``s`ks``s`kk`ks``s``s`ks``s`kk`kk``s`kk`ks</code>
after a fourth.  Similar giveaway sequences appear before any
builtin.</p>
<h4><a name="shortcuts">Making abstraction elimination more
efficient</a></h4>
<p>It is sometimes desirable to obtain a shorter result when
performing lambda elimination.  Shortcuts can be used, but they demand
some care.</p>
<p>Consider the <a href="http://www.madore.org/~david/programs/unlambda/#elim_case1">first case</a> we described above.
We explained that when <var>F</var> is a builtin or a variable other
than <code>$<var>x</var></code> then we can eliminate the lambda from
<code>^<var>x</var><var>F</var></code> by simply rewriting it as
<code>`k<var>F</var></code>.  This is quite correct.  However, this
rule applies a bit more widely than we have suggested: this is true as
long as <var>F</var> does not involve <code>x</code>, because it is
then a constant, and creating constants is precisely what the K
builtin is good at.  So if <var>F</var> is a lengthy expression not
involving <code>$<var>x</var></code>, instead of going through the
tedious process of eliminating in <var>F</var>, we can shortcut the
whole thing and rewrite it as <code>`k<var>F</var></code>.</p>
<p>There is a danger, however, in so doing.  While all this works
without glitch in the blessed realm of the pure untyped lambda
calculus, i.e.&nbsp;in the absence of side effects (the functions we
have seen so far do not create any side effects) and as long as we
don't express excessive worries about nontermination, there is a
slight difficulty involved when evaluating <var>F</var> causes a side
effect or might not terminate.  Indeed, when we write
<code>^<var>x</var><var>F</var></code>, we probably expect the side
effect (or nontermination) in question to be delayed until the
function is applied (i.e.&nbsp;until <code>$<var>x</var></code>
receives a value, even if that value is ignored); this is indeed the
case if we perform abstraction elimination through the canonical
(long) way.  If, however, we short-cut and rewrite this as
<code>`k<var>F</var></code>, then <var>F</var> <em>is</em> evaluated
as soon as this expression is encountered, even if the function is not
applied to anything.  This might not be what you wanted.</p>
<p>So the shortcut is really this: you can rewrite
<code>^<var>x</var><var>F</var></code> as <code>`k<var>F</var></code>
provided (a)&nbsp;<var>F</var> does not involve
<code>$<var>x</var></code>. amd (b)&nbsp;you can prove that evaluating
<var>F</var> terminates and performs no side effect.  One easy way of
making sure of (b) is to check that the only applications found in
<var>F</var> are of the form: the K builtin applied to <em>one</em>
argument, or the S builtin applied to <em>one</em> or <em>two</em>
arguments, or the D builtin applied to any expression whatsoever (see
<a href="http://www.madore.org/~david/programs/unlambda/#delay">below</a> about this).</p>
<p>If <var>F</var> does not involve <var>x</var> but <em>does</em>
involve evaluations which might (or do) cause side effects or
nontermination, there is still a way to perform abstraction
elimination from <code>`k<var>F</var></code> without peering in the
entrails of <var>F</var>.  Namely, to use the D builtin described <a href="http://www.madore.org/~david/programs/unlambda/#delay">below</a>, and write <code>`d`k<var>F</var></code>.  A
true purist, however, does not rely on the D to make his program
work.</p>
<p>Another shortcut in abstraction elimination is to spot expressions
such as <code>^<var>x</var>`<var>F</var>$<var>x</var></code> and to
rewrite them as simply <code><var>F</var></code> &mdash; provided of
course the variable <code>$<var>x</var></code> does not appear in
<var>F</var>.  This is pretty benign if <var>F</var> is just a builtin
<em>other than D</em>, or a variable other than
<code>$<var>x</var></code>.  But if <var>F</var> can produce side
effects, this presents the same risks as the other shortcut we just
described (and you can also get around them by writing
<code>`d<var>F</var></code>).</p>
<p>Note also that the <a href="http://www.madore.org/~david/programs/unlambda/#void">V</a> builtin can always be
abstracted to itself.  (That is, <code>`kv</code> is functionally
identical to <code>v</code>.)</p>
<h3><a name="more_bi">More Unlambda builtins</a></h3>
<h4><a name="void"><code>v</code></a></h4>
<p>The <code>v</code> function is a kind of &ldquo;black hole&rdquo;.
It takes an argument, ignores it and returns <code>v</code>.  It can
be used to swallow any number of arguments.</p>
<p>The <code>v</code> function can be implemented using <code>s</code>,
<code>k</code> and <code>i</code> (and hence, using <code>s</code> and
<code>k</code> only).  Indeed, it can be written using the lambda
expression <code>`^h^x`$h$h^h^x`$h$h</code> (which evaluates to
<code>^x</code> of the same thing), and <a href="http://www.madore.org/~david/programs/unlambda/#lambda_elim">abstraction elimination</a> shows that this is
<code>` ``s``s`kskk ``s``s`kskk</code> (here is an example when some
incorrect <a href="http://www.madore.org/~david/programs/unlambda/#shortcuts">shortcuts</a> in an abstraction
elimination can be disastrous, for example if <code>` ``s`kk``sii
``s`kk``sii</code> were used instead, as obtained by attempting to
reduce <code>^h^x`$h$h</code> as
<code>^h`k`$h$h</code>).</p>
<h4><a name="print"><code>.<var>x</var></code></a></h4>
<p>The <code>.<var>x</var></code> function is the only way to perform
output in Unlambda (note that in Unlambda version 1 there is no way to
perform input).  This function takes an argument and, like the
identity function, returns it unchanged.  Only contrary to the
identity function it has a side effect, namely to print the character
<var>x</var> on the standard output (this writing takes place when
<code>.<var>x</var></code> is applied).  Note that while this function
is written with two characters, it is still <em>one</em> function; on
no account should <code>.<var>x</var></code> be thought of as
something applied to <var>x</var> (and, just to insist, <em>there is
no such function as <code>.</code> (dot)</em>, only
<code>.<var>x</var></code> (dot <var>x</var>)).  The <code>r</code>
function is just one instance of the <code>.<var>x</var></code>
function, namely when <var>x</var> is the newline character.  Thus,
the <code>`ri</code> program has the effect of printing a newline (so
would <code>`rv</code> or <code>`rr</code> or
<code>`r<var>(anything)</var></code>, but <code>r</code> alone doesn't
do it, because here the <code>r</code> function isn't applied: here my
<a href="http://www.madore.org/~david/programs/unlambda/#zero_note">note</a> about the impossibility of <a href="http://www.madore.org/~david/programs/unlambda/#curry">currying</a> functions of zero arguments should become
clearer).</p>
<h4><a name="delay"><code>d</code></a></h4>
<p>The <code>d</code> function is an exception to the normal rules of
evaluation (hence it should be called a <em>special form</em> rather
than a function).  When Unlambda is evaluating
<code>`<var>F</var><var>G</var></code> and <var>F</var> evaluates to
<code>d</code> (for example when <var>F</var> <em>is</em>
<code>d</code>) then <var>G</var> is not evaluated.  The result
<code>`d<var>G</var></code> is a <em>promise</em> to evaluate
<var>G</var>: that is, <var>G</var> is kept unevaluated until the
promise is itself applied to an expression <var>H</var>.  When that
happens, <var>G</var> is finally evaluated (<em>after</em>
<var>H</var> is), and it is applied to <var>H</var>.  This is called
<em>forcing</em> the promise.</p>
<p>For example, <code>`d`ri</code> does nothing (and remains
unevaluated), and <code>``d`rii</code> prints a blank line (because we
are forcing the promise).  Another point to note is that
<code>``dd`ri</code> prints a blank line: indeed, <code>`dd</code> is
first evaluated, and since it is not the <code>d</code> function
(instead, it is a promise to evaluate <code>d</code>), it does not
prevent the <code>`ri</code> expression from being evaluated (to
<code>i</code>, with the side effect of printing a newline), so that
when finally <code>d</code> is applied, it is already too late to
prevent the newline from being printed; to summarize, the
<code>d</code> function can delay the <code>d</code> function itself.
On the other hand, <code>``id`ri</code> does not print a blank line
(because <code>`id</code> does evaluate to <code>d</code>).
Similarly, <code>```s`kdri</code> is first transformed to
<code>```kdi`ri</code>, in which <code>``kdi</code> is evaluated to
<code>d</code>, which then prevents <code>`ri</code> from being
evaluated so no newline gets printed.</p>
<p>Writing <code>`d`k<var>F</var></code> is another form of promise
(perhaps more customary but at the same time less transparent): when
it is applied to an arbitrary argument <var>Y</var>, then <var>Y</var>
is ignored and <var>F</var> is evaluated and returned.  This
possibility has already been mentioned in the discussion on <a href="http://www.madore.org/~david/programs/unlambda/#shortcuts">shortcuts</a> during abstraction elimination.</p>
<h4><a name="callcc"><code>c</code></a></h4>
<p>The <code>c</code> (&ldquo;call with current continuation&rdquo;)
function is probably the most difficult to explain (if you are
familiar with the corresponding function in Scheme, it will help a
lot).  I suggest you try reading the <a href="http://www.eleves.ens.fr:8080/home/madore/computers/callcc.html"><code>call/cc</code>
page</a> at this point.  <code>c</code> called with an argument
<var>F</var> will apply <var>F</var> to <em>the current
continuation</em>.  The current continuation is a special function
which, when it is applied to <var>X</var>, has the effect of making
<code>c</code> return immediately the value <var>X</var>.  In other
words, <code>c</code> can return in two ways: if <var>F</var> applied
to the continuation evaluates normally, then its return value is that
of <code>c</code>; but if <var>F</var> calls the continuation at some
point, <code>c</code> will immediately return the value passed to the
continuation.</p>
<p>Note that the continuation can even escape from the <code>c</code>
call, in which case calling it will have the effect of going &ldquo;back in
time&rdquo; to that <code>c</code> call and making it return whatever value
was passed to the continuation.  For a more detailed discussion, see
any book on Scheme or the <a href="http://www.eleves.ens.fr:8080/home/madore/computers/callcc.html"><code>call/cc</code>
page</a> mentioned.</p>
<p>Examples of <code>c</code> include <code>``cir</code>: here,
<code>`ci</code> evaluates to the continuation of the <code>c</code>
which we shall write <code>&lt;cont&gt;</code>, and we have
<code>`&lt;cont&gt;r</code>: here, the continuation is applied, so it
makes the <code>c</code> call return <code>r</code>, and we are left
with <code>`rr</code> which prints a newline. Another interesting
example is <code>`c``s`kr``si`ki</code>: in this expression, the
argument <code>``s`kr``si`ki</code> (which does not evaluate any
further) is applied to the continuation of the <code>c</code>, giving
<code>```s`kr``si`ki&lt;cont&gt;</code> (where we have written
<code>&lt;cont&gt;</code> for the continuation in question); this
gives <code>` ``kr&lt;cont&gt; ```si`ki&lt;cont&gt;</code> which
evaluates to <code>`r``i&lt;cont&gt;``ki&lt;cont&gt;</code>, hence to
<code>`r`&lt;cont&gt;i</code> (this was where we wanted to get), and
in this expression, the continuation is applied, so that the
<code>c</code> in the initial expression immediately returns
<code>i</code>, and the remaining calculations are lost (in
particular, the <code>r</code> is lost and no newline gets
printed).</p>
<p>Expressions including <code>c</code> function calls tend to be
hopelessly difficult to track down.  This was, of course, the reason
for including it in the language in the first place.</p>
<p>As an exercice in using <code>c</code>, you might try constructing
an expression that when applied to <code>v</code> returns
<code>i</code>, and when applied to <code>i</code> returns
<code>v</code> (this is not possible in the absence of
<code>c</code>).  Answer is in the <a href="http://www.madore.org/~david/programs/unlambda/#howto_bool">HOWTO section
on booleans</a>.</p>
<h3><a name="howto">HOWTO: various programming techniques</a></h3>
<h4><a name="howto_loop">How do I write a loop in Unlambda?</a></h4>
<p>We'll explain this with a simple example: how to write a loop that
prints &ldquo;Hello, world!&rdquo; over and over, followed by a
certain number of asterisks, each line having one more asterisk than
the previous.</p>
<p>The first step is to write the loop using tail-recursion.  We want
to write a function <code><var>&lt;loop&gt;</var></code>: it will take
as its argument a function <code>$f</code> that prints a certain
number of asterisks, it will print &ldquo;Hello, world!&rdquo;,
followed by the asterisks, and a newline, and then it will call itself
with a new function that prints one more asterisk.</p>
<p>To get things straight, we assume that
<code><var>&lt;msg&gt;</var></code> is a function that acts like the
identity with the side-effect of printing &ldquo;Hello, world!&rdquo;,
and we assume that similarly, <code>$f</code> acts like the identity
with the side effect of printing the asterisks.  Moreover, we will
write a function <code><var>&lt;inc&gt;</var></code> that takes such
an <code>$f</code> and returns a new one that prints one more
asterisk.</p>
<p>Our first attempt at writing <code><var>&lt;loop&gt;</var></code>
is the following:

<code>^f``r`$f`<var>&lt;msg&gt;</var><var>&lt;loop&gt;</var>`<var>&lt;inc&gt;</var>$f</code>.

The main ideas are: first, to &ldquo;increase&rdquo; <code>$f</code>,
we simply call the same function again with
<code>`<var>&lt;inc&gt;</var>$f</code> as argument (this is the
standard use of tail-recursion to avoid imperative constructions like
variable change).  Second, to make sure we have the side effects of
writing the message, the asterisks and the newline, we apply them to
the operator (we could have equally well applied them to the operand),
which works since they act like the identity.</p>
<p>Only one thing is wrong with our attempt:
<code><var>&lt;loop&gt;</var></code> cannot be part of its own
expansion.  Here is how we get around this: we add one more parameter,
<code>$h</code>, to <code><var>&lt;loop&gt;</var></code>, and we
decide that <code><var>&lt;loop&gt;</var></code> will be called with
this parameter equal to <code><var>&lt;loop&gt;</var></code> itself.
Now there is no difficulty in writing the loop: it is

<code>^h^f```r`$f`<var>&lt;msg&gt;</var>$h$h`<var>&lt;inc&gt;</var>$f</code>.

<a href="http://www.madore.org/~david/programs/unlambda/#lambda_elim">Eliminating abstraction</a>, we find
<code><var>&lt;loop&gt;</var></code> equal to

<code>``s``s`ks``s``s`ks``s`k`s`kr``s`k`si``s`kd``s`kk<var>&lt;msg&gt;</var>k`k<var>&lt;inc&gt;</var></code>

and it remains to write the <code><var>&lt;msg&gt;</var></code> and
<code><var>&lt;inc&gt;</var></code> functions.  We obtain them by
eliminating abstraction respectively from
<code>^x`````````````.H.e.l.l.o.,. .w.o.r.l.d.!$x</code> and
<code>^f^x`$f`.*$x</code>.</p>
<p>Finally, to start our program, we apply to
<code><var>&lt;loop&gt;</var></code> the function
<code>^h``$h$hi</code> (i.e.&nbsp;<code>``s``sii`ki</code>), and our
final program is</p>
<pre>
```s``sii`ki
 ``s``s`ks
     ``s``s`ks``s`k`s`kr
               ``s`k`si``s`k`s`k
                               `d````````````.H.e.l.l.o.,. .w.o.r.l.d.!
                        k
      k
  `k``s``s`ksk`k.*
</pre>
<p>(Concerning indentation: the idea is that, if we insert a line
break between an expression <var>F</var> and an expression
<var>G</var> to which <var>F</var> is applied, then we start
<var>G</var> on the same column as <var>F</var>; furthermore, we then
always insert a line break after <var>G</var>.)</p>
<h4><a name="howto_num">How can I represent numbers in
Unlambda?</a></h4>
<p>There are many ways to do that.  In the <a href="http://www.madore.org/~david/programs/unlambda/#howto_loop">previous example</a>, we have (implicitly)
represented the integer <var>n</var> by the function that acts like
the identity but with the side effect of printing <var>n</var>
asterisks.  Such a representation is fine for adding integers (just
compose the functions, i.e.&nbsp;the addition function is
<code>^m^n^x`$m`$n$x</code>), but you won't be able to multiply them
for example.</p>
<p>Generalizing a little we can arive at a representation of integers
which is quite standard and which allows any kind of manipulation
(i.e.&nbsp;any recursive function on the integers can be represented
in the pure lambda calculus using this representation), the so-called
&ldquo;Church integers&rdquo; (named after Alonzo Church, the inventor
of the lambda calculus).  Our previous representation represented
<var>n</var> as the <var>n</var>-th iterate of the function
<code>.*</code>: this is not good because we can't do much with
<code>.*</code>.  Rather to try to find a function which is general
enough to permit arbitrary manipulations (it can be found but it is a
bit long), we represent <var>n</var> as the <var>n</var>-th iterate of
a <em>parameter</em> function <code>$<var>f</var></code>.  So we
write</p>
<ul>
<li><code>&lt;0&gt;</code> is <code>^f^x$x</code>
(i.e.&nbsp;<code>`ki</code>).</li>
<li><code>&lt;1&gt;</code> is <code>^f^x`$f$x</code>
(i.e.&nbsp;<code>i</code>).</li>
<li><code>&lt;2&gt;</code> is <code>^f^x`$f`$f$x</code>
(i.e.&nbsp;<code>``s``s`kski</code>).</li>
<li><code>&lt;3&gt;</code> is <code>^f^x`$f`$f`$f$x</code>
(i.e.&nbsp;<code>``s``s`ksk``s``s`kski</code>).</li>
<li>and so on&hellip;</li>
</ul>
<p>Using this representation, the various operations are quite simple
to perform on numbers:</p>
<ul>
<li>The function <code>&lt;print&gt;</code> which prints a Church
integer as a line of asterisks is <code>^n`r``$n.*i</code>,
i.e.&nbsp;<code>``s`kr``s``si`k.*`ki</code>.</li>
<li>The function <code>&lt;inc&gt;</code> which increments a Church
integer is <code>^n^f^x`$f``$n$f$x</code>,
i.e.&nbsp;<code>`s``s`ksk</code> (this is a <em>very</em> highly <a href="http://www.madore.org/~david/programs/unlambda/#shortcuts">optimized</a> abstraction elimination).</li>
<li>The function <code>&lt;add&gt;</code> which adds two Church
integers is <code>^m`$m&lt;inc&gt;</code>,
i.e.&nbsp;<code>``si`k`s``s`ksk</code>.</li>
<li>The function <code>&lt;mul&gt;</code> which multiplies two Church
integers (by applying them consecutively to the same function) is
<code>^m^n^f`$m`$n$f</code>, i.e.&nbsp;<code>``s`ksk</code>.</li>
<li>The function <code>&lt;pow&gt;</code> which raises its second
argument to the power of its first, by applying the first argument to
the second (thus multiplying it with itself as many times as given by
the first) is <code>^m^n`$m$n</code>, i.e.&nbsp;<code>i</code>
(impressive, isn't it?).</li>
</ul>
<p>As an example of the use of Church integers, we construct an
Unlambda program that prints a line of 1729 stars.  To do this, we use
the fact that 1729 is the sum of 10<sup>3</sup> and 9<sup>3</sup>
(Srinivasa Ramanujan <i lang="la">in memoriam</i>), so we write the
program as
<code>`&lt;print&gt;`^n``&lt;add&gt;`&lt;3&gt;$n`&lt;3&gt;`&lt;inc&gt;$n`&lt;2&gt;&lt;3&gt;</code>,
(we have used the fact that 9 is 3<sup>2</sup> and 10 is its
successor), so
<code>`&lt;print&gt;```s``s`k&lt;add&gt;&lt;3&gt;``s`k&lt;3&gt;&lt;inc&gt;`&lt;2&gt;&lt;3&gt;</code>
and after replacement our program is finally</p>
<pre>
```s`kr``s``si`k.*`ki
 ```s``s`k``si`k`s``s`ksk``s``s`ksk``s``s`kski
   ``s`k``s``s`ksk``s``s`kski`s``s`ksk
  ```s``s`kski``s``s`ksk``s``s`kski
</pre>
<p>How about <em>comparing</em> the Church integers?  Sure enough,
that can be done.  I suggest the following &mdash; however, keep in
mind that their performance (both in size and time) is far worse than
the previous functions, and they are on the whole far less
&ldquo;polished&rdquo;.</p>
<ul>
<li>The function <code>&lt;test&gt;</code> which returns
<code>i</code> if its argument is nonzero, and <code>v</code>
otherwise, is <code>^n``$n`kiv</code>,
i.e.&nbsp;<code>``s``si`k`kiv</code>.  A faster (but longer) version
of the same uses call/cc to return immediately when the argument has
been discovered to be non-zero: <code>^n`c^q`v``$n$qi</code>,
i.e.&nbsp;<code>``s`kc``s`k`sv``ss`k`ki</code>.</li>
<li>The function <code>&lt;leq&gt;</code> which returns <code>i</code>
if its first argument is less or equal to its second, and
<code>v</code> othwerise, is
<code>^m^n```$m&lt;A&gt;^ti``$n&lt;A&gt;^tv</code> where
<code>&lt;A&gt;</code> is <code>^f^g`$g$f</code> (I suggest working
this out to understand the <i lang="la">modus operandi</i>); so
<code>&lt;leq&gt;</code> is
<code>``s``s`ks``s`kk``s``si`k``s`k`sik`k`ki`k``s``si`k``s`k`sikv</code>.</li>
</ul>
<p>To decrement (and hence to substract) Church integers is by no
means impossible.  I don't know if it can be done with even moderate
efficiency, however.  The following scheme will work, but it is
hopeless algorithmically:</p>
<ul>
<li>Consider <code>``$ni`ki</code>: it evaluates to <code>`ki</code>
for any Church integer <code>$n</code>, and, if <code>$n</code> is
<code>`k`kk</code>, then it evaluates to <code>k</code>.
Consequently, <code>^n````$ni`ki`ki`&lt;inc&gt;$n</code> returns
<code>`&lt;inc&gt;$n</code> if applied to an argument <code>$n</code>
which is a Church integer, and <code>`ki</code> (i.e.&nbsp;the Church
integer <code>&lt;0&gt;</code>) if applied to <code>`k`kk</code>.
Call this function <code>&lt;_inc&gt;</code>.  It is
<code>``s``s``s``si`ki`k`ki`k`ki`s``s`ksk</code>.</li>
<li>Consequently, the function <code>&lt;dec&gt;</code>, which
decrements a Church integer, can be written as
<code>^n``$n&lt;_inc&gt;`k`kk</code>, i.e.
<code>``s``si`k``s``s``s``si`ki`k`ki`k`ki`s``s`ksk`k`k`kk</code>.
Note that this function takes <code>&lt;0&gt;</code>
(i.e.&nbsp;<code>`ki</code>) to <code>`k`kk</code>) &mdash; so you
should only use it on Church integers which were
<code>&lt;test&gt;</code>ed as non zero.</li>
<li>The substraction function can be built from the
<code>&lt;dec&gt;</code> function.  I won't even write it because it's
too ugly.</li>
</ul>
<p>Note that the Church integers are by no means the only way to
represent integers in Unlambda.  Essentially, there are two paths: you
can either use a representation which is particular to your problem at
hand (as we did <a href="http://www.madore.org/~david/programs/unlambda/#howto_loop">above</a>) and which is not
completely general, or you can use a universal representation,
i.e.&nbsp;one which can be transformed into the Church integers and <i lang="la">vice versa</i> (and which differs only by questions of
convenience).  An example of a non-universal representation is:
representing <var>n</var> by a function that prints <var>n</var>
asterisks.  An example of a universal representation is: representing
<var>n</var> by a <a href="http://www.madore.org/~david/programs/unlambda/#howto_lists">list</a> of length
<var>n</var>, or representing <var>n</var> by a function which
evaluates its argument applied to <code>i</code> <var>n</var>
times.</p>
<h4><a name="howto_lists">How can I represent lists (and related data
structures) in Unlambda?</a></h4>
<p>We discuss how to create two types: products (i.e.&nbsp;pairs) and
unions.</p>
<p>To create products we represent the pair of <code>$u</code> and
<code>$v</code> as a function which is capable, on demand, of
producing one or the other variable:</p>
<ul>
<li>The <code>&lt;cons&gt;</code> function (creates a pair from its
two arguments) is <code>^u^v^f``$f$u$v</code>,
i.e.&nbsp;<code>``s``s`ks``s`kk``s`ks``s`k`sik`kk</code>.</li>
<li>The <code>&lt;car&gt;</code> function (returns the pair's first
element) is <code>^p`$pk</code>, i.e.&nbsp;<code>``si`kk</code>.</li>
<li>The <code>&lt;cdr&gt;</code> function (returns the pair's second
element) is <code>^p`$p`ki</code>,
i.e.&nbsp;<code>``si`k`ki</code>.</li>
</ul>
<p>A union type is one which is capable of retaining one of two cases,
with one datum in each case, and distinguish the two cases.  It is
dual to a product type:</p>
<ul>
<li>The <code>&lt;q1&gt;</code> function (creates a union in the first
case) is <code>^u^f^g`$f$u</code>,
i.e.&nbsp;<code>``s`k`s`kk``s`k`sik</code>.</li>
<li>The <code>&lt;q2&gt;</code> function (creates a union in the
second case) is <code>^v^f^g`$g$v</code>,
i.e.&nbsp;<code>``s`kk``s`k`sik</code>.</li>
<li>The <code>&lt;switch&gt;</code> function (takes a union and two
functions and applies the first one to the union's data in the first
case, the second one in the second case) is
<code>^q^f^g``$q$f$g</code>, i.e.&nbsp;<code>i</code>.</li>
</ul>
<p>What you can do with these types is up to your imagination.  A list
might be created as a chain of pairs, for example.  There is a little
difficulty at the end of the list (to represent the empty list, that
is).  The obvious way around it is to represent a list by a union
type, where the first case represents the empty list and the second
case represents a pair of the first element and the rest of the list.
This works but it is long.  Another solution is use <code>v</code> for
the empty list: this is more practical for some operations
(essentially, because it is shorter), and less for others (essentially
because <code>v</code> is a bit tricky to detect, and requires call/cc
for that).</p>
<h4><a name="howto_bool">How do I write tests and booleans in
Unlambda?</a></h4>
<p>A pair of <dfn>boolean values</dfn> is a pair of Unlambda functions
used (arbitrarily) to represent &ldquo;true&rdquo; and
&ldquo;false&rdquo;.  The essential thing is that they be universal,
i.e.&nbsp;there should exist an <code>&lt;ifthenelse&gt;</code>
function which takes three arguments: if the first is the boolean
<code>&lt;true&gt;</code> then it returns the second, if the first is
the boolean <code>&lt;false&gt;</code> then it returns the third.</p>
<p>Many pairs of functions can be used to represent booleans.  Here
are a few suggestions:</p>
<ul>
<li><code>i</code> and <code>v</code>: this choice is the &ldquo;standard&rdquo;
(or &ldquo;internal&rdquo;) Unlambda choice of booleans (because it is used by
the input functions, and because the functions are already part of the
language).  They have some advantages, for example then
<code>&lt;and&gt;</code> function is very easy to write (it is
<code>^p^q`$p$q</code>, hence <code>i</code>).  They are frequently
useful in the case where <code>$f</code> is a function which performs
some side effects (when passed an argument <code>$x</code>, say): if
you want to make the side effects happen according to the value of a
boolean <code>$b</code>, just replace <code>`$f$x</code> by
<code>``$b$f$x</code>.  However, because <code>v</code> is difficult
to test, the <code>&lt;ifthenelse&gt;</code> function is a bit
complex: it is <code>^b`c^q``k`ki``$b$qk</code>,
i.e.&nbsp;<code>``s`kc``s`k`s`k`k`ki``ss`k`kk</code></li>
<li><code>k</code> and <code>`ki</code>: this choice is also very
standard.  The advantage is that the
<code>&lt;ifthenelse&gt;</code> function is extremely simple: it is
<code>^b^x^y``$b$x$y</code>, i.e.&nbsp;<code>i</code> (notice how
<code>i</code> plays many roles in Unlambda?).  The perspicacious
reader will observe that, because of this, we build the
<code>&lt;ifthenelse&gt;</code> of the other boolean pairs by
converting them to this pair.</li>
<li><code>^x^y`$x$y</code> (i.e.&nbsp;<code>i</code>) and
<code>^y^x`$y$x</code> (i.e.&nbsp;<code>``s`k`sik</code>).  Then the
<code>&lt;ifthenelse&gt;</code> is <code>^b``$b`kk`k`ki</code>,
i.e.&nbsp;<code>``s``si`k`kk`k`k`ki</code>.</li>
<li><code>i</code> and <code>`ki</code>: these are the two first
Church integers.  The <code>&lt;ifthenelse&gt;</code> function is then
<code>^b``$b`kk`ki</code>,
i.e.&nbsp;<code>``s``si`k`kk`k`ki</code>.</li>
</ul>
<h2><a name="quine">A note about the Unlambda Quine Contest</a></h2>
<p>Recall that a <a href="http://www.eleves.ens.fr:8080/home/madore/computers/quine.html">quine</a>
is a program that prints its own listing.  By the <a href="http://www.eleves.ens.fr:8080/home/madore/computers/quine.html#sec_fp">fixed
point theorems</a> in logic, such a program exists in any
Turing-complete language in which printing an arbitrary string is
possible (by a computable program of the string &mdash; a technical
criterion which is satisfied in <em>all</em> programming languages in
existence).  Although the fixed point theorem is constructive (and
thus actually algorithmically produces a quine), actually writing down
the program can be difficult.  See my <a href="http://www.eleves.ens.fr:8080/home/madore/computers/quine.html">quine
page</a> and my <a href="http://www.eleves.ens.fr:8080/home/madore/programs/#prog_selfrep">personal
collection of quines</a> for examples of quines in (ordinary, non
obfuscated) programming languages.</p>
<p>From 1999/10/27 to 1999/11/03, I opened the Unlambda Quine Contest:
I had written <a href="ftp://quatramaran.ens.fr/pub/madore/unlambda/CUAN/quine/quine00.unl">a
quine</a> in Unlambda myself, and I invited anyone else to do so.
During that week, the quines were kept secret (only their md5
fingerprint was revealed so that it could be later checked), in order
that their independence be guaranteed.  I offered a copy of the <a href="http://www.amazon.com/exec/obidos/ASIN/0262510871/002-3800222-4622653">Wizard
Book</a> to the first person to produce a quine (retrospecively I find
that I should have offered it to the best quine, or to the shortest
one, or some such thing, but no matter).</p>
<p>The contest is now over.  Olivier Wittenberg (<em><a href="mailto:olivier.wittenberg@ens.fr">olivier.wittenberg@ens.fr</a></em>)
won the prize with his <a href="ftp://quatramaran.ens.fr/pub/madore/unlambda/CUAN/quine/quine01.unl">one
megabyte quine</a> that he sent me within a few hours of the contest's
opening.  Subsequent quines were written by Panu Kalliokoski (<em><a href="mailto:Panu.Kalliokoski@nokia.com">Panu.Kalliokoski@nokia.com</a></em>),
<a href="http://www.eleves.ens.fr:8080/home/marot/">Jean Marot</a>
(<em><a href="mailto:jean.marot@ens.fr">jean.marot@ens.fr</a></em>),
<a href="http://www.eleves.ens.fr:8080/home/auroux/">Denis Auroux</a>
(<em><a href="mailto:denis.auroux@ens.fr">denis.auroux@ens.fr</a></em>) and
Jacob Mandelson (<em><a href="mailto:jlm@ghs.com">jlm@ghs.com</a></em>).</p>
<p>All these quines are truly gems (and, once again, I congratulate
all the authors).  The <a href="ftp://quatramaran.ens.fr/pub/madore/unlambda/CUAN/quine/quine06.unl">shortest
one</a> is only 491 bytes long, and was written by Jean Marot.  The <a href="ftp://quatramaran.ens.fr/pub/madore/unlambda/CUAN/quine/quine14.unl">most
efficient</a> one (in terms of data/code size ratio) was written by
Denis Auroux.  <a href="ftp://quatramaran.ens.fr/pub/madore/unlambda/CUAN/quine/quine11.unl">Jacob
Mandelson's quine</a> is also very remarkable in that it minimizes the
number of dots (dots are printing functions in Unlambda) to only
60.</p>
<p>The full list of quines can be found in the <a href="ftp://quatramaran.ens.fr/pub/madore/unlambda/CUAN/quine/"><code>quine/</code>
directory</a> on the <a href="ftp://quatramaran.ens.fr/pub/madore/unlambda/CUAN/">FTP
repository</a> of the <a href="http://www.madore.org/~david/programs/unlambda/#cuan">Comprehensive Unlambda Archive
Network</a>.</p>
<p>I don't have any special remarks to make about how quines can be
written in Unlambda.  My general <a href="http://www.eleves.ens.fr:8080/home/madore/computers/quine.html">quine
page</a> already contains everything I have to say about quines; as
for the particular case of Unlambda, well, for my part, I used a <a href="http://www.madore.org/~david/programs/unlambda/#howto_lists">list representation</a> of the data, but many more
subtle and compact representations were found later.</p>
<h2><a name="impl">Implementing Unlambda</a></h2>
<p>Writing programs in Unlambda is a good exercice in patience, order
and method.  It is not fundamentally difficult, being mainly a
question of applying <a href="http://www.madore.org/~david/programs/unlambda/#lambda_elim">abstraction
elimination</a> to expressions of the untyped lambda calculus (of
course, obtaining these expressions in the first place is not
necessarily evident); if you're messy it will turn into a nightmare.
Debugging or reading Unlambda programs is just about impossible.</p>
<p>Another problem is to write <em>implementations</em> of the
Unlambda language (i.e.&nbsp;interpreters, that is, a program that
takes an Unlambda program as input, and executes it).  This is a task
that demands less caution (an Unlambda interpreter is far easier to
debug, or to read if someone else wrote it, than an Unlambda program)
but more smartness, especially if the targeted language (the language
in which the interpreter is written) is a low-level language like C.
For the Unlambda programming language combines the difficulties of its
two families: of functional languages as far as writing an interpreter
goes and of obfuscated languages as far as writing programs goes.  At
any rate, Unlambda certainly has some nasty features that make it hard
to write an interpreter for; and we now discuss some of these nasty
features and how to get around them.</p>
<p>Writing an Unlambda interpreter is certainly pedagogically
interesting.  I think it can be a good introduction to some important
concepts in theoretical computer science, because it presents the
major difficulties (the &ldquo;nasty features&rdquo; as I called them a minute
ago) of high-level language interpreters without some of the technical
burden of typing or variable bindings (these are interesting also, but
it may be good to postpone learning about them to a later lesson).
For my part, I certainly learned a good deal by writing various
Unlambda interpreters.  Unfortunately, I have neither the place nor
the knowledge to go in the details of all the important theoretical
concepts, but you will learn a lot by trying to write an Unlambda
interpreter yourself.</p>
<p>The first interpreter written was the one in Scheme, which forms
the Unlambda&nbsp;1.0.0 distribution.  This interpreter is not really
interesting, for one thing because Scheme has so many features it
makes it almost trivial to interpret Unlambda in.  The Unlambda 2.0.0
distribution, however, includes interpreters in several other
languages.  I suggest beginners to start with the one in Java.  It is
only of pedagogical interest (being <em>very</em> inefficient), and I
have taken care to put a <em>lot</em> of comments in it, and to write
it very cleanly (despite the comments themselves' claim to the
contrary).</p>
<p>One question which is yet open, however, is how difficult it is to
write an Unlambda interpreter in Unlambda.  That more or less combines
the two classes of difficulty (writing Unlambda programs and writing
Unlambda interpreters).  I still think that the first class (the
difficulty of writing Unlambda programs) would be the dominant one;
for one thing, Unlambda (as Scheme) already has all the necessary
bells and whistles (such as a <a href="http://www.eleves.ens.fr:8080/home/madore/computers/callcc.html"><code>call/cc</code></a>
function) making interpreting Unlambda (relatively) easy.</p>
<p>Basically, any functional language interpreter is centered, as
explained in the <a href="http://www.amazon.com/exec/obidos/ASIN/0262510871/002-3800222-4622653">Wizard
Book</a>, on the so-called <i>eval</i>/<i>apply</i> cycle, with two
functions, <i>eval</i> and <i>apply</i>, calling each other
recursively.  <i>Eval</i> takes an expression of the language and
evaluates it (i.e.&nbsp;executes it), whereas <i>apply</i> takes a
function (already evaluated) and some arguments, and applies the
former to the latter.  <i>Eval</i> calls on <i>apply</i> to evaluate
applications (what in Unlambda we write
<code>`<var>F</var><var>G</var></code>), and <i>apply</i> calls on
<i>eval</i> to evaluate the body of a function (in Unlambda, we can
argue that functions don't have bodies, but still, when <i>apply</i>
is told, for example, to apply <code>s</code> to three arguments
<var>X</var>, <var>Y</var> and <var>Z</var>, it calls <i>eval</i> on
<code>``<var>X</var><var>Z</var>`<var>Y</var><var>Z</var></code>).</p>
<p>So, the basic Unlambda interpreter (forgetting about <code>d</code>
for the moment), written in a sufficently high-level language is very
simple: <i>eval</i> evaluates all the builtins to themselves and calls
<i>apply</i> to evaluate applications; in turn, <i>apply</i> makes
<code>``k<var>X</var><var>Y</var></code> into <var>X</var> and
<code>```s<var>X</var><var>Y</var><var>Z</var></code> into
<code>``<var>X</var><var>Z</var>`<var>Y</var><var>Z</var></code>
(which is again fed to <i>eval</i>).  Certain features of Unlambda, or
unfeatures of the meta language, will complicate the evaluator.</p>
<h3><a name="impl_func">First-class functions</a></h3>
<p>Unlambda has first-class functions.  In my sketchy description above,
I've simply omitted the important fact that an Unlambda function can
be something like <code>`s<var>X</var></code> (a &ldquo;partially applied&rdquo;
<code>s</code>).</p>
<p>If the underlying language (the language in which the interpreter is
written, aka the &ldquo;meta&rdquo; language) has first-class functions, then
the obvious thing is to represent Unlambda functions by functions of
the underlying language, in which case the <i>apply</i> function of
the interpreter becomes particularly trivial (it is just the
<i>apply</i> function of the underlying language).  Actually, this is
not what has been done in the interpreters that accompany the Unlambda
distribution (for one thing, because it was more tempting to make the
<i>eval</i> function trivial than the <i>apply</i> function), even in
languages where this would have been possible (see the SML/NJ version
of the interpreter for a good example of this).  But it is something
worth thinking on (an Unlambda interpreter in Unlambda would probably
use this system).</p>
<p>Rather than using first-class functions of the underlying language
to represent first-class functions in Unlambda, we can represent them
using data structures: represent <code>`k<var>X</var></code> as a
function <code>k1</code> with a hidden parameter <var>X</var>:
applying <code>k</code> yields <code>k1</code>, and applying
<code>k1</code> yields the hidden parameter.  These hidden parameters
are what would correspond, if we were interpreting a real high-level
(functional) language, to closures (i.e.&nbsp;function environments).
It should be noted that these closures can become arbitrarily complex
(indeed, they are the only kind of data structures we have in
Unlambda), and that they will require some kind of memory management
(see <a href="http://www.madore.org/~david/programs/unlambda/#impl_gc">below</a>).</p>
<p>Furthermore, if the underlying language (say, CAML) has first-class
functions and is tail-recursive, then, even if it does not have
first-class continuations, the difficulties we have with implementing
the <a href="http://www.madore.org/~david/programs/unlambda/#impl_cont">continuations</a> of Unlambda are greatly
alleviated.  Indeed, we can then rewrite the interpreter in <a href="http://www.eleves.ens.fr:8080/home/madore/computers/callcc.html#sec_CPS">Continuation
Passing Style</a> (see <a href="http://www.madore.org/~david/programs/unlambda/#impl_cont">below</a>) and represent
the (passed) continuations as functions of the underlying language,
which get called in a tail-recursive manner.</p>
<p>If the underlying language does not have first-class functions,
then they must be emulated by means of data structures (indeed, the
only &ldquo;variable&rdquo; part in a first-class function is its closure, and
that can be represented by a data structure, since the code is always
the same).  This is more or less clear in the Java version of the
Unlambda interpreter (Java does not have first-class functions, so we
use classes and methods instead, as we are supposed to).</p>
<h3><a name="impl_cont">First-class continuations</a></h3>
<p>Continuations are the major pain for implementing Unlambda when the
underlying language does not have them.  I refer to my <a href="http://www.eleves.ens.fr:8080/home/madore/computers/callcc.html"><code>call/cc</code></a>
page (hoping for it to be finished some day) for a more detailed
discussion on first-class continuations.</p>
<p>Essentially, the canonical method is to rewrite the interpreter in
<a href="http://www.eleves.ens.fr:8080/home/madore/computers/callcc.html#sec_CPS">Continuation
Passing Style</a>.  Then <i>eval</i> and <i>apply</i> take one more
argument: a continuation, and instead of returning their result, they
throw that result to the continuation they were given (the
continuation represents the &ldquo;future of computation&rdquo; at this point,
and it is the continuation which will call the further <i>eval</i> and
<i>apply</i> functions as needed).</p>
<p>If the underlying language has first-class continuations, of
course, then we do not need CPS, because we can represent the
continuations of Unlambda by continuations in the meta language (this
is what has been done in the Scheme and SML/NJ versions of the
interpreter).  If it does not, but at least it has first-class
functions and is properly tail-recursive, then we can very easily
rewrite the interpreter in CPS, by representing continuations of
Unlambda by functions in the meta language (this is what has been done
in the Caml version of the interpreter, since Caml has first-class
functions but not first-class continuations; it may be instructive to
compare the Caml version with the SML/NJ version).  In this case, the
<i>eval</i> and <i>apply</i> functions each terminate by calling their
continuation in tail-recursive manner, so tail-recursion is heavily
used.</p>
<p>If the underlying language (or, more precisely, its implementation)
is not properly tail-recursive, then we cannot use CPS directly,
because CPS calls are tail-recursive, they never terminate (except at
the very end of the program), so in a non properly tail-recursive
language, this will give a stack overflow (consider, for example, the
RCS revision 1.5 of the Unlambda interpreter in Java that is included
in the distribution).  There are various ways to work around this.  I
don't know what is &ldquo;standard&rdquo;, if anything.  One way which I find
elegant is to introduce &ldquo;tasks&rdquo;: rather than having <i>apply</i> and
<i>eval</i> never terminate and finish by calling their continuation,
have them return a &ldquo;task&rdquo;, which is something like a continuation
plus a value about to be thrown to the continuation, and when the task
is run, it proceeds with the computation.  For details, consider the
changes between RCS revisions 1.5 and 1.6 of the interpreter in
Java.</p>
<p>[All this discussion does not specifically concern Unlambda.  It
should be moved to my <a href="http://www.eleves.ens.fr:8080/home/madore/computers/callcc.html"><code>call/cc</code></a>
page when I find the time.]</p>
<p>If the underlying language has <em>neither</em> first-class
continuations <em>nor</em> first-class functions <em>nor</em> proper
tail-recursion, as is the case of C, then things are even more messy.
All the missing abstraction layers have to be built up from scratch.
First-class functions, as noted <a href="http://www.madore.org/~david/programs/unlambda/#impl_func">earlier</a>, have
to be replaced by the appropriate data structures, both in the
handling of the Unlambda functions themselves, and in the handling of
the Unlambda continuations.  Yuck.</p>
<h3><a name="impl_gc">Garbage collection</a></h3>
<p>As in any language having first-class (higher-order) functions,
and, therefore, escaping closures, the lifetime of the various
structures is not statically determined in Unlambda, and some kind of
automatic memory management (aka &ldquo;garbage collection&rdquo;) is necessary.
If the underlying language has first-class functions and Unlambda
functions are represented by functions of the meta language, then the
garbage collection system for the meta language is used in Unlambda as
well, and all is transparent.  If it does not, data structures must be
used to replace the missing functionalities, and these data structures
have to be garbage collected.  If the underlying language has garbage
collection (e.g. Java), then all is for the better, because, there
again, we can rest on the existing structures.  But if it doesn't,
some kind of memory management has to be added to the interpreter.
The simplest solution is to use an external garbage collector (for
example, the <a href="http://www.hpl.hp.com/personal/Hans_Boehm/gc/">Hans Boehm
conservative C/C++ garbage collector</a>, which I used in the C
version of the interpreter).</p>
<p>But, as Jacob Mandelson (<em><a href="mailto:jlm@ghs.com">jlm@ghs.com</a></em>) pointed out to me (and
as he demonstrated in <a href="ftp://quatramaran.ens.fr/pub/madore/unlambda/contrib/mandelson-unlambda.c">his
Unlambda interpreter</a>, full garbage collection is not necessary in
Unlambda.  Indeed, since the language is without side-effects, and in
particular without the possibility of modifying pointers (in the
closures) once they are created, new objects can only point to older
objects, and cycles cannot be created.  Under those circumstances, a
simpler memory mangement system will suffice: reference counting
(i.e.&nbsp;keeping a count of the number of references to each object,
and freeing a pointer when the reference count becomes 0).  The
interpreter present in the <code>c-refcnt/</code> directory of the
Unlambda distribution uses this reference counting method (and is
otherwise identical to the garbage-collected interpreter in the
<code>c/</code> directory).</p>
<h3><a name="impl_prom">Promises</a></h3>
<p>Promises (i.e.&nbsp;the use of the <code>d</code> function) make
Unlambda a bit more of a mess.  Without them, the <i>eval</i> function
would be completely straightforward: call <i>eval</i> on the operator,
call <i>eval</i> on the operand, and then call <i>apply</i> of the
former on the latter.  But in fact, the result of the first
<i>eval</i> must be checked: if it happens to be <code>d</code>, then
the further steps are not performed, the operand is bundled
(unevaluated) in a <em>promise</em>, and that promise is returned
(e.g. thrown to the continuation) as the result of the computation.
Promises are forced in the <i>apply</i> function: when <i>apply</i>
receives a promise as operator, it must call <i>eval</i> to
<em>force</em> the promise, and to evaluate the part that was left
unevaluated, and finally apply it to the operand.</p>
<p>It may, therefore, seem that the <i>apply</i> function will never
receive <code>d</code> as operator (it is held back at the level of
the <i>eval</i> function).  Indeed, if you consider the SML/NJ or Caml
versions of the interpreter, that part of the pattern matching is
commented out.  But there are subtleties: what about something like
<code>`cd</code>: the <a href="http://www.madore.org/~david/programs/unlambda/#ref">Unlambda specifications</a>
clearly state that this evaluate <code>`d&lt;cont&gt;</code>, with
<code>&lt;cont&gt;</code> being the appropriate continuation.  But
instead of constructing the <code>`d&lt;cont&gt;</code> expression and
calling <i>eval</i> on it, we may prefer to directly call <i>apply</i>
on <code>d</code> and the appropriate continuation, in which case
<i>apply</i> will, indeed, receive <code>d</code> as operator.  (See
the note in the <code>invoke</code> method of the
<code>DelContinuation</code> class in the interpreter written in
Java.)</p>
<h3><a name="impl_comp">Can Unlambda be compiled?</a></h3>
<p>An interesting question, and one whose answer I do not really know,
for one thing because I'm not entirely certain as to what
&ldquo;compiling&rdquo; should mean.</p>
<p>On the one hand, we can certainly write a program (technically,
using the snm theorem) that takes an Unlambda program, possibly parses
it, and bundles it with an Unlambda interpreter, and call that the
&ldquo;compiled&rdquo; version.  I don't think that qualifies as a compiler: a
compiler should turn Unlambda code into <em>code</em> of the target
language, not <em>data</em> that will be interpreted by some generic
code.  Unfortunately, the boundaries between code and data are not as
clear as I would like them to be (see also my <a href="http://www.eleves.ens.fr:8080/home/madore/computers/quine.html">quine
page</a> for more thoughts on the subject).  Unlambda can certainly be
compiled in Unlambda at least, by the identity function.  Jacob
Mandelson (<em><a href="mailto:jlm@ghs.com">jlm@ghs.com</a></em>)
observed that it is more reasonable to try &ldquo;decompiling&rdquo; Unlambda
than &ldquo;compiling&rdquo; it.</p>
<p>If we restrict ourselves to the S, K and I combinators (as well as
printing functions), removing the troublesome C and D functions, then
Unlambda can be compiled, at least in a high-level functional language
(which can then be compiled in low-level imperative languages using
standard methods): for example, <code>```sii``sii</code> (an endless
loop) would be trivially compiled, using a lisp-like notation, in
<code>(((S I) I) ((S I) I))</code>, where <code>S</code> and
<code>I</code> are part of the &ldquo;Unlambda run-time library&rdquo;.  This
may seem like a void assertion, but note the important difference
between this and producing <code>(interpret '(((S I) I) ((S I)
I)))</code>, where only <code>interpret</code> is defined: the former
is a true (albeit trivial) compilation, and the latter is merely
bundling the program as data with an interpreter to read the data.
The <code>c</code> (call/cc) function would not cause considerable
trouble either, if the underlying language (the target language for
compilation) has first-class continuations, and even if it doesn't, we
can emulate them for example by producing CPS code.</p>
<p>Promises are a much bigger problem: I don't think it is possible to
compile Unlambda, with the <code>d</code> special form, in a
reasonable programming language.  Indeed, whereas we could convert
&ldquo;apparent&rdquo; promises, such as <code>`d<var>X</var></code>, into
promises from the target language, it is not possible to know
beforehand whether a piece of code will really be interpreted or
merely made into a promise.</p>
<p>On the other hand, promises aren't anything like an
<code>eval</code> function (something that canonically can't be
compiled &mdash; or at any rate, to compile it you need to bundle the
program with an entire interpreter or compiler).  So maybe it is
possible after all, but I'm very uncertain as to the way it should
work.  I wish I could express myself more clearly.</p>
<h2><a name="ref">Unlambda reference</a></h2>
<p>First we must specify that whitespace is ignored in an Unlambda
program (wherever it may be, except, naturally, between the period and
the character in the <code>.<var>x</var></code> function name).
Comments are also ignored, a comment being anything starting from the
<code>#</code> character to the end of the line.</p>
<p>If <var>F</var> and <var>G</var> are two Unlambda expressions, then
the expression <code>`<var>F</var><var>G</var></code> is also an
expression (called the <em>application</em> of <var>F</var> to
<var>G</var>).  It is evaluated as follows: <em>first</em>,
<var>F</var> is evaluated (and its value is a function, since there is
no other kind of values in Unlambda); if the value of <var>F</var> is
not <code>d</code>, <em>then</em>, <var>G</var> is evaluated, and
finally the value of <var>F</var> is applied to the value of
<var>G</var>.</p>
<p>To complete the description of Unlambda, we need therefore only
specify what happens when <var>F</var> is applied to <var>G</var>, and
to do that we consider each possible value of <var>F</var>.</p>
<dl>
<dt><code>k</code> (&ldquo;constant generator&rdquo;)</dt><dd>The <code>k</code>
function takes an argument <var>X</var> and returns the function
<code>`k<var>X</var></code> (see below).</dd>
<dt><code>`k<var>X</var></code> (&ldquo;constant function&rdquo;)</dt><dd>The
<code>`k<var>X</var></code> function (which is not primitive but
obtained by applying the primitive function <code>k</code> to some
function <var>X</var>) takes an argument, ignores it and returns
<var>X</var>.</dd>
<dt><code>s</code> (&ldquo;substitution&rdquo;)</dt><dd>The <code>s</code>
function takes an argument <var>X</var> and returns the function
<code>`s<var>X</var></code> (see below).</dd>
<dt><code>`s<var>X</var></code> (&ldquo;substitution first
partial&rdquo;)</dt><dd>The <code>`s<var>X</var></code> function (which is
not primitive but obtained by applying the primitive function
<code>s</code> to some function <var>X</var>) takes an argument
<var>Y</var> and returns the function
<code>``s<var>X</var><var>Y</var></code> (see below).</dd>
<dt><code>``s<var>X</var><var>Y</var></code> (&ldquo;substituted
application&rdquo;)</dt><dd>The <code>``s<var>X</var><var>Y</var></code>
function (which is not primitive but obtained by applying the
primitive function <code>s</code> to two functions <var>X</var> and
<var>Y</var> successively) takes an argument <var>Z</var> and returns
the evaluation of
<code>``<var>X</var><var>Z</var>`<var>Y</var><var>Z</var></code>.</dd>
<dt><code>i</code> (&ldquo;identity&rdquo;)</dt><dd>The <code>i</code> function
takes an argument and returns that argument.</dd>
<dt><code>v</code> (&ldquo;void&rdquo;)</dt><dd>The <code>v</code> function
takes an argument <var>X</var> and returns <code>v</code> itself.</dd>
<dt><code>c</code> (&ldquo;call with current continuation&rdquo;)</dt><dd>The
<code>c</code> function takes an argument <var>X</var> and returns
either the evaluation of <code>`<var>X</var>&lt;cont&gt;</code> where
<code>&lt;cont&gt;</code> is <code>c</code>'s current continuation
(see below), or else the value passed to <code>&lt;cont&gt;</code> if
the latter was applied (with the effect of making <code>c</code>
return immediately).</dd>
<dt><code>&lt;cont&gt;</code> (a continuation)</dt><dd>Continuations
take an argument and non-locally jump to the point in history when the
evaluator was waiting for the corresponding <code>c</code> to return,
making that <code>c</code> return that argument.</dd>
<dt><code>d</code> (&ldquo;delay&rdquo;)</dt><dd>The <code>d</code> function is
never truly applied (it is a special form).  It only occurs in the
form <code>`d<var>F</var></code> where <var>F</var> is an Unlambda
expression (see below).</dd>
<dt><code>`d<var>F</var></code> (&ldquo;promise&rdquo;)</dt><dd>The
<code>`d<var>F</var></code> function takes an argument <var>Y</var>
and evaluates <var>F</var>, giving a function <var>X</var>, and
returns the evaluation of <code>`<var>X</var><var>Y</var></code>.</dd>
<dt><code>.<var>x</var></code> (&ldquo;print&rdquo;) and <code>r</code>
(&ldquo;carriage return&rdquo;)</dt><dd>The <code>.<var>x</var></code> function
is written using <em>two</em> characters.  The first character is a
period and the second is any character.  Nevertheless,
<code>.<var>x</var></code> is a single function in Unlambda, and
<var>x</var> in this expression is merely a character (read during
parsing), not a parameter to the function.  The <code>r</code>
function is exactly equivalent to <code>.<var>(newline)</var></code>.
The <code>.<var>x</var></code> function behaves like the
<code>i</code> (identity) function, with the side effect that it
prints the character <var>x</var> (to the standard output) when it is
applied.  The <code>r</code> function also behaves like the identity
and prints a newline character.</dd>
<dt><code>e</code> (&ldquo;exit&rdquo;) <strong>only in Unlambda version 2 and
greater</strong></dt><dd>The <code>e</code> function takes an argument
<var>X</var>.  It exits immediately, pretending (if the interpreter
cares) that the result of the evaluation of the program is
<var>X</var>.</dd>
<dt><code>@</code> (&ldquo;read&rdquo;) <strong>only in Unlambda version 2 and
greater</strong></dt><dd>The <code>@</code> function takes an argument
<var>X</var>.  It reads one character from the standard input, making
it the &ldquo;current character&rdquo; and returns the evaluation of
<code>`<var>X</var>i</code> or of <code>`<var>X</var>v</code>
according as one character has been read successfully or not (for
example on EOF).</dd>
<dt><code>?<var>x</var></code> (&ldquo;compare character read&rdquo;)
<strong>only in Unlambda version 2 and greater</strong></dt><dd>The
<code>?<var>x</var></code> function (where <var>x</var> is a
character, as in the <code>.<var>x</var></code> function) takes an
argument <var>X</var>.  It returns the evaluation of
<code>`<var>X</var>i</code> or of <code>`<var>X</var>v</code>
according as the current character (the one read by the last
application of <code>@</code>) is <var>x</var> or not (if
<code>@</code> has not been applied or if it has encountered an EOF,
there is no current character, and <var>x</var> is deemed not to be
equal to the current character).</dd>
<dt><code>|</code> (&ldquo;reprint character read&rdquo;) <strong>only in
Unlambda version 2 and greater</strong></dt><dd>The <code>|</code>
function takes an argument <var>X</var>.  It returns the evaluation of
<code>`<var>X</var>.<var>x</var></code>, where <var>x</var> is the
current character (the one read by the last application of
<code>@</code>) or of <code>`<var>X</var>v</code> if there is no
current character (i.e.&nbsp;if <code>@</code> has not yet been
applied or if it has encountered an EOF).</dd>
</dl>
<h2><a name="distrib">Unlambda distribution</a></h2>
<p>Unlambda 2.0.0 is now available.  You can download it using <a href="ftp://quatramaran.ens.fr/pub/madore/unlambda/unlambda-2.0.0.tar.gz">FTP</a>
or using <a href="http://www.eleves.ens.fr:8080/home/madore/unlambda-2.0.0.tar.gz">HTTP</a>,
but using FTP is preferred if you have the choice.  If you want older
versions, they are available in this <a href="ftp://quatramaran.ens.fr/pub/madore/unlambda/">FTP
directory</a>.</p>
<p>Unlambda is distributed under the terms of the <a href="http://www.gnu.org/copyleft/gpl.html">GNU General Public
License</a>, either version 2 of this license, or, at your option, any
later version.  Since Unlambda is Free Software, it comes with
<strong>absolutely no warranty</strong>: see the GNU General Public
License for more details.</p>
<p>(Note that this concerns the <em>distribution</em>.  There is no
copyright on the <em>language</em> itself: you do not need to ask for
my permission to write an Unlambda interpreter, and you are permitted
(though by no means encouraged) to write a non-free interpreter.  As a
matter of fact, there exists at least one non-free Unlambda
interpreter, <a href="ftp://quatramaran.ens.fr/pub/madore/unlambda/contrib/mandelson-unlambda.c">the
one</a> written by Jacob Mandelson (<em><a href="mailto:jlm@ghs.com">jlm@ghs.com</a></em>), which is <em>far</em>
more efficient than the interpreters in the Unlambda
distribution.)</p>
<p>This document is included in the Unlambda distribution.  You can
also find it on the World Wide Web at <a href="http://www.eleves.ens.fr:8080/home/madore/programs/unlambda/">http://www.eleves.ens.fr:8080/home/madore/programs/unlambda/</a>.</p>
<p>Please send comments and suggestions about Unlambda and its
interpreters to <a href="mailto:david.madore@ens.fr">david.madore@ens.fr</a>.</p>
<p>Happy hacking!</p>
<h2><a name="cuan">Comprehensive Unlambda Archive Network</a></h2>
<p>The goal of the Comprehensive Unlambda Archive Network is to gather
all the Unlambda programs that are written (provided their authors
agree, of course).  Since there are very few programs in Unlambda
altogether, it is convenient to centralize everything in one place, it
will not take too much disk space, and a copy of the archive is
included in the Unlambda distribution.</p>
<p>You can find the archive in the directory <a href="ftp://quatramaran.ens.fr/pub/madore/unlambda/CUAN/"><code>/pub/madore/unlambda/CUAN/</code></a>
on <a href="ftp://quatramaran.ens.fr/">the &ldquo;Quatramaran&rdquo; FTP
site</a>.  See <a href="ftp://quatramaran.ens.fr/pub/madore/unlambda/CUAN/MANIFEST">the
<code>MANIFEST</code> file</a> for a list of the programs in the CUAN.
Please <a href="mailto:david.madore@ens.fr">drop me a note</a> if you
have a program you want to add to the archive.</p>
<hr />
<p>
This site is part of <a href="http://lightning.prohosting.com/~kgaughan/esolang.html">the
Esoteric Programming Languages Ring</a>:<br />
[
<a href="http://nav.webring.org/cgi-bin/navcgi?ring=esolang;id=6;prev5">Previous 5 Sites</a>
|
<a href="http://nav.webring.org/cgi-bin/navcgi?ring=esolang;id=6;prev">Previous</a>
|
<a href="http://nav.webring.org/cgi-bin/navcgi?ring=esolang;id=6;next">Next</a>
|
<a href="http://nav.webring.org/cgi-bin/navcgi?ring=esolang;id=6;next5">Next 5 Sites</a>
|
<a href="http://nav.webring.org/cgi-bin/navcgi?ring=esolang;random">Random Site</a>
|
<a href="http://nav.webring.org/cgi-bin/navcgi?ring=esolang;list">List Sites</a>
]
</p>
<address>
<a href="mailto:david.madore@ens.fr">David Madore</a>
</address>
<p>Last modified: $Date: 2003/08/10 22:24:48 $</p>

				
					<br/><a href="http://news.ycombinator.com/item?id=955154">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>Ask HN: I want to learn statistics and data mining</title>
        	<link>http://news.ycombinator.com/item?id=954677</link>
        	<comments>http://news.ycombinator.com/item?id=954677</comments>
	        <description>
    	        <![CDATA[
				
				
					<br/><a href="http://news.ycombinator.com/item?id=954677">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>Corruption in textbook-adoption proceedings: &#39;Judging Books by Their Covers&#39;</title>
        	<link>http://www.textbookleague.org/103feyn.htm</link>
        	<comments>http://news.ycombinator.com/item?id=955265</comments>
	        <description>
    	        <![CDATA[
				
<h2>Judging Books by Their Covers</h2>
<h4>Richard P. Feynman</h4>

I was giving a series of freshman physics lectures [in 1964], and
after one of them, Tom Harvey, who assisted me in putting on the
demonstrations, said, "You oughta see what's happening to
mathematics in schoolbooks!  My daughter comes home with a lot of
crazy stuff!"
<p>
I didn't pay much attention to what he said.
</p><p>
But the next day I got a telephone call from a pretty famous lawyer
here in Pasadena, Mr. Norris, who was at that time on the State
Board of Education.  He asked me if I would serve on the State
Curriculum Commission, which had to choose the new schoolbooks for
the state of California.  You see, the state had a law that all of
the schoolbooks used by all of the kids in all of the public schools
have to be chosen by the State Board of Education, so they have a
committee to look over the books and to give them advice on which
books to take.
</p><p>
It happened that a lot of the books were on a new method of
teaching arithmetic that they called "new math," and since usually
the only people to look at the books were schoolteachers or
administrators in education, they thought it would be a good idea to
have somebody who <i>uses</i> mathematics scientifically, who knows
what the end product is and what we're trying to teach it for, to
help in the evaluation of the schoolbooks.
</p><p>
I must have had, by this time, a guilty feeling about not
cooperating with the government, because I agreed to get on this
committee.
</p><p>
<i>Immediately</i> I began getting letters and telephone calls from
schoolbook publishers.  They said things like, "We're very glad to
hear you're on the committee because we really wanted a scientific
guy . . ." and "It's wonderful to have a scientist on the committee,
because our books are scientifically oriented . . ."  But they also
said things like, "We'd like to explain to you what our book is
about . . ." and "We'll be very glad to help you in any way we can
to judge our books . . ."  That seemed to me kind of crazy.  I'm an
objective scientist, and it seemed to me that since the only thing
the kids in school are going to get is the books (and the teachers
get the teacher's manual, which I would also get), any <i>extra</i>
explanation from the company was a distortion.  So I didn't want to
speak to any of the publishers and always replied, "You don't have
to explain; I'm sure the books will speak for themselves."
</p><p>
I represented a certain district, which comprised most of the Los
Angeles area except for the city of Los Angeles, which was
represented by a very nice lady from the L.A. school system named
Mrs. Whitehouse.  Mr. Norris suggested that I meet her and find out
what the committee did and how it worked.
</p><p>
Mrs. Whitehouse started out telling me about the stuff they were
going to talk about in the next meeting (they had already had one
meeting; I was appointed late).  "They're going to talk about the
counting numbers."  I didn't know what that was, but it turned out
they were what I used to call integers.  They had different names
for everything, so I had a lot of trouble right from the start.
</p><p>
She told me how the members of the commission normally rated the new
schoolbooks.  They would get a relatively large number of copies of
each book and would give them to various teachers and administrators
in their district.  Then they would get reports back on what these
people thought about the books.  Since I didn't know a lot of
teachers or administrators, and since I felt that I could, by
reading the books myself, make up my mind as to how they looked to
<i>me,</i> I chose to read all the books myself. . . .

<center><h2>&#149;</h2></center>

A few days later a guy from the book depository called me up and
said, "We're ready to send you the books, Mr. Feynman; there are
three hundred pounds."
</p><p>
I was overwhelmed.
</p><p>
"It's all right, Mr. Feynman; we'll get someone to help you read
them."
</p><p>
I couldn't figure out how you <i>do</i> that: you either read them
or you don't read them.  I had a special bookshelf put in my study
downstairs (the books took up seventeen feet), and began reading all
the books that were going to be discussed in the next meeting.  We
were going to start out with the elementary schoolbooks.
</p><p>
It was a pretty big job, and I worked all the time at it down in
the basement.  My wife says that during this period it was like
living over a volcano.  It would be quiet for a while, but then all
of a sudden, "BLLLLLOOOOOOWWWWW!!!!" -- there would be a big
explosion from the "volcano" below.
</p><p>
The reason was that the books were so lousy.  They were false.  They
were hurried.  They would <i>try</i> to be rigorous, but they would
use examples (like automobiles in the street for "sets") which were
<i>almost</i> OK, but in which there were always some subtleties. 
The definitions weren't accurate.  Everything was a little bit
ambiguous -- they weren't <i>smart</i> enough to understand what was
meant by "rigor."  They were faking it.  They were teaching
something they didn't understand, and which was, in fact,
<i>useless,</i> at that time, for the child.
</p><p>
I understood what they were trying to do.  Many [Americans] thought
we were behind the Russians after Sputnik, and some mathematicians
were asked to give advice on how to teach math by using some of the
rather interesting modern concepts of mathematics.  The purpose was
to enhance mathematics for the children who found it dull.
</p><p>
I'll give you an example: They would talk about different bases of
numbers -- five, six, and so on -- to show the possibilities.  That
would be interesting for a kid who could understand base ten -- 
something to entertain his mind.  But what they turned it into, in
these books, was that <i>every</i> child had to learn another base! 
And then the usual horror would come: "Translate these numbers,
which are written in base seven, to base five."  Translating from
one base to another is an <i>utterly useless</i> thing.  If you
<i>can</i> do it, maybe it's entertaining; if you <i>can't</i> do
it, forget it.  There's no <i>point</i> to it.
</p><p>
Anyhow, I'm looking at all these books, all these books, and none of
them has said anything about using arithmetic in science.  If there
are any examples on the use of arithmetic at all (most of the time
it's this abstract new modern nonsense), they are about things like
buying stamps.
</p><p>
Finally I come to a book that says, "Mathematics is used in science
in many ways.  We will give you an example from astronomy, which is
the science of stars."  I turn the page, and it says, "Red stars
have a temperature of four thousand degrees, yellow stars have a
temperature of five thousand degrees . . ." -- so far, so good.  It
continues: "Green stars have a temperature of seven thousand
degrees, blue stars have a temperature of ten thousand degrees, and
violet stars have a temperature of . . . (some big number)."  There
are no green or violet stars, but the figures for the others are
roughly correct.  It's <i>vaguely</i> right -- but already, trouble! 
That's the way everything was: Everything was written by somebody
who didn't know what the hell he was talking about, so it was a
little bit wrong, always!  And how we are going to teach well by
using books written by people who don't <i>quite</i> understand what
they're talking about, I <i>cannot</i> understand.  I don't know
why, but the books are lousy; UNIVERSALLY LOUSY!
</p><p>
Anyway, I'm <i>happy</i> with this book, because it's the first
example of applying arithmetic to science.  I'm a <i>bit</i> unhappy
when I read about the stars' temperatures, but I'm not very unhappy
because it's more or less right -- it's just an example of error. 
Then comes the list of problems.  It says, "John and his father go
out to look at the stars.  John sees two blue stars and a red star. 
His father sees a green star, a violet star, and two yellow stars. 
What is the total temperature of the stars seen by John and his
father?" -- and I would explode in horror.
</p><p>
My wife would talk about the volcano downstairs.  That's only an
example: it was <i>perpetually</i> like that.  Perpetual absurdity! 
There's no purpose whatsoever in adding the temperature of two
stars.   Nobody <i>ever</i> does that except, maybe, to then take
the <i>average</i> temperature of the stars, but <i>not</i> to find
out the <i>total</i> temperature of all the stars!  It was awful! 
All it was was a game to get you to add, and they didn't understand
what they were talking about.  It was like reading sentences with a
few typographical errors, and then suddenly a whole sentence is
written backwards.  The mathematics was like that.  Just hopeless!
</p><p>
Then I came to my first meeting.  The other members had given some
kind of ratings to some of the books, and they asked me what
<i>my</i> ratings were.  My rating was often different from theirs,
and they would ask, "Why did you rate that book low?"  I would say
the trouble with that book was this and this on page so-and-so -- I
had my notes.
</p><p>
They discovered that I was kind of a goldmine: I would tell them, in
detail, what was good and bad in all the books; I had a reason for
every rating.
</p><p>
I would ask them why they had rated this book so high, and they
would say, "Let us hear what you thought about such and such a
book."  I would never find out why they rated anything the way they
did.  Instead, they kept asking me what <i>I</i> thought.
</p><p>
We came to a certain book, part of a set of three supplementary
books published by the same company, and they asked me what I
thought about it.
</p><p>
I said, "The book depository didn't send me that book, but the
other two were nice."
</p><p>
Someone tried repeating the question: "What do you think about that
book?"
</p><p>
"I said they didn't send me that one, so I don't have any judgment
on it."
</p><p>
The man from the book depository was there, and he said, "Excuse me;
I can explain that.  I didn't send it to you because that book
hadn't been completed yet.  There's a rule that you have to have
every entry in by a certain time, and the publisher was a few days
late with it.  So it was sent to us with just the covers, and it's
blank in between.  The company sent a note excusing themselves and
hoping they could have their set of three books considered, even
though the third one would be late."
</p><p>
It turned out that the blank book had a rating by some of the other
members!  They couldn't believe it was blank, because [the book] had
a rating.  In fact, the rating for the missing book was a little bit
higher than for the two others.  The fact that there was nothing in
the book had nothing to do with the rating.
</p><p>
I believe the reason for all this is that the system works this way:
When you give books all over the place to people, they're busy;
they're careless; they think, "Well, a lot of people are reading
this book, so it doesn't make any difference."  And they put in some
kind of number -- <i>some</i> of them, at least; not all of them,
but <i>some</i> of them.  Then when you receive your reports, you
don't know <i>why</i> this particular book has fewer reports than
the other books -- that is, perhaps one book has ten, and this one
only has six people reporting -- so you average the rating of those
who reported; you don't average the ones who didn't report, so you
get a reasonable number.  This process of averaging all the time
misses the fact that there is absolutely nothing between the covers
of the book!
</p><p>
I made that theory up because I saw what happened in the curriculum
commission: For the blank book, only six out of the ten members were
reporting, whereas with the other books, eight or nine out of the
ten were reporting.  And when they averaged the six, they got as
good an average as when they averaged with eight or nine.  They were
very embarrassed to discover they were giving ratings to that book,
and it gave me a little bit more confidence.  It turned out the
other members of the committee had done a lot of work in giving out
the books and collecting reports, and had gone to sessions in which
the book publishers would <i>explain</i> the books before they read
them; I was the only guy on that commission who read all the books
and didn't get any information from the book publishers except what
was in the books themselves, the things that would ultimately go to
the schools.
</p><p>
This question of trying to figure out whether a book is good or bad
by looking at it carefully or by taking the reports of a lot of
people who looked at it carelessly is like this famous old problem:
Nobody was permitted to see the Emperor of China, and the question
was, What is the length of the Emperor of China's nose?  To find
out, you go all over the country asking people what they think the
length of the Emperor of China's nose is, and you <i>average</i> it. 
And that would be very "accurate" because you averaged so many
people.  But it's no way to find anything out; when you have a very
wide range of people who contribute without looking carefully at it,
you don't improve your knowledge of the situation by averaging.
</p><p>
At first we weren't supposed to talk about the cost of the books. 
We were told how many books we could choose, so we designed a
program which used a lot of supplementary books, because all the new
textbooks had failures of one kind or another.  The most serious
failures were in the "new math" books: there were no applications;
not enough word problems.  There was no talk of selling stamps;
instead there was too much talk about commutation and abstract
things and not enough translation to situations in the world.  What
do you do: add, subtract, multiply, or divide?  So we suggested some
books which <i>had</i> some of that as supplementary -- one or two
for each classroom -- in addition to a textbook for each student. 
We had it all worked out to balance everything, after much
discussion.
</p><p>
When we took our recommendations to the Board of Education, they
told us they didn't have as much money as they had thought, so we'd
have to go over the whole thing and cut out this and that, . . . . 
When the senate budget committee got to it, the program was
emasculated still further.  Now it was <i>really</i> lousy!  I was
asked  to appear before the state senators when the issue was being
discussed, but I declined: By that time, having argued this stuff so
much, I was tired.  We had prepared our recommendations for the
Board of Education, and I figured it was <i>their</i> job to present
it to the state -- which was <i>legally</i> right, but not
politically sound.  I shouldn't have given up so soon, but to have
worked so hard and discussed so much about all these books to make a
fairly balanced program, and then to have the whole thing scrapped
at the end -- that was discouraging!  The whole thing was an
unnecessary effort that could have been turned around and done the
opposite way: <i>start</i> with the cost of the books, and buy what
you can afford.
</p><p>
What finally clinched it, and made me ultimately resign, was that
the following year we were going to discuss science books.  I
thought maybe the science would be different, so I looked at a few
of them.
</p><p>
The same thing happened: something would look good at first and then
turn out to be horrifying.  For example, there was a book that
started out with four pictures: first there was a windup toy; then
there was an automobile; then there was a boy riding a bicycle; then
there was something else.  And underneath each picture it said,
"What makes it go?"
</p><p>
I thought, "I know what it is: They're going to talk about
mechanics, how the springs work inside the toy; about chemistry, how
the engine of the automobile works; and biology, about how the
muscles work."
</p><p>
It was the kind of thing my father would have talked about: "What
makes it go?  Everything goes because the sun is shining."  And then
we would have fun discussing it:
</p><p>
"No, the toy goes because the spring is wound up," I would say. 
"How did the spring get wound up?" he would ask.
</p><p>
"I wound it up."
</p><p>
"And how did you get moving?"
</p><p>
"From eating."
</p><p>
"And food grows only because the sun is shining.  So it's because
the sun is shining that all these things are moving."  That would
get the concept across that motion is simply the
<i>transformation</i> of the sun's power.
</p><p>
I turned the page.  The answer was, for the wind-up toy, "Energy
makes it go."  And for the boy on the bicycle, "Energy makes it
go."  For everything, "<i>Energy</i> makes it go."
</p><p>
Now that doesn't <i>mean</i> anything.  Suppose it's "Wakalixes." 
That's the general principle: "Wakalixes makes it go."  There's no
knowledge coming in.  The child doesn't learn anything; it's just a
<i>word</i>!
</p><p>
What they should have done is to look at the wind-up toy, see that
there are springs inside, learn about springs, learn about wheels,
and never mind "energy."  Later on, when the children know something
about how the toy actually works, they can discuss the more general
principles of energy.
</p><p>
It's also not even true that "energy makes it go," because if it
stops, you could say, "energy makes it stop" just as well.  What
they're talking about is concentrated energy being transformed into
more dilute forms, which is a very subtle aspect of energy.  Energy
is neither increased nor decreased in these examples; it's just
changed from one form to another.  And when the things stop, the
energy is changed into heat, into general chaos.
</p><p>
But that's the way all the books were: They said things that were
useless, mixed-up, ambiguous, confusing, and partially incorrect. 
How anybody can learn science from these books, I don't know,
because it's not science.
</p><p>
So when I saw all these horrifying books with the same kind of
trouble as the math books had, I saw my volcano process starting
again.  Since I was exhausted from reading all the math books, and
discouraged from its all being a wasted effort, I couldn't face
another year of that, and had to resign.
</p><p>
Sometime later I heard that the energy-makes-it-go book was going to
be recommended by the curriculum commission to the Board of
Education, so I made one last effort.  At each meeting of the
commission the public was allowed to make comments, so I got up and
said why I thought the book was bad.
</p><p>
The man who replaced me on the commission said, "That book was
approved by sixty-five engineers at the Such-and-such Aircraft
Company!"
</p><p>
I didn't doubt that the company had some pretty good engineers, but
to take sixty-five engineers is to take a wide range of ability --
and to necessarily include some pretty poor guys!  It was once again
the problem of <i>averaging</i> the length of the emperor's nose, or
the ratings on a book with nothing between the covers. . . .
</p><p>
I couldn't get through to him, and the book was approved by the
board. . . .

<center><h2>&#149;</h2></center>

[During my time on the commission,] there were two books that we
were unable to come to a decision about after much discussion; they
were extremely close.  So we left it open to the Board of Education
to decide.  Since the board was now taking the cost into
consideration, and since the two books were so evenly matched, the
board decided to open the bids and take the lower one.
</p><p>
Then the question came up, "Will the schools be getting the books at
the regular time, or could they, perhaps, get them a little earlier,
in time for the coming term?"
</p><p>
One publisher's representative got up and said, "We are happy that
you accepted our bid; we can get it out in time for the next term."
</p><p>
A representative of the publisher that lost out was also there, and
he got up and said, "Since our bids were submitted based on the
later deadline, I think we should have a chance a bid again for the
earlier deadline, because we too can meet the earlier deadline."
</p><p>
Mr. Norris, the Pasadena lawyer on the board, asked the guy from the
other publisher, "And how much would it <i>cost</i> for us to get
your books at the earlier date?"
</p><p>
And he gave a number: It was <i>less</i>!
</p><p>
The first guy got up: "If <i>he</i> changes his bid, I have the
right to change <i>my</i> bid!" -- and his bid is <i>still</i> less!
</p><p>
Norris asked, "Well how <i>is</i> that -- we get the books earlier
and it's <i>cheaper</i>?"
</p><p>
"Yes," one guy says.  "We can use a special offset method we
wouldn't normally use . . ." -- some excuse why it came out cheaper. 
The other guy agreed: "When you do it quicker, it costs less!"
</p><p>
That was really a shock.  It ended up <i>two million dollars</i>
cheaper.  Norris was really incensed by this sudden change.
</p><p>
What happened, of course, was that the uncertainty about the date
had opened the possibility that these guys could bid against each
other.  Normally, when books were supposed to be chosen without
taking the cost into consideration, there was no reason to lower the
price; the book publishers could put the prices at any place they
wanted to.  There was no advantage in competing by lowering the
price; the way you competed was to impress the members of the
curriculum commission.
</p><p>
By the way, whenever our commission had a meeting, there were book
publishers entertaining curriculum commission members by taking them
to lunch and talking to them about their books.  I never went.
</p><p>
It seems obvious now, but I didn't know what was happening the time
I got a package of dried fruit and whatnot delivered by Western
Union with a message that read, "From our family to yours, Happy
Thanksgiving -- The Pamilios."
</p><p>
It was from a family I had never heard of in Long Beach, obviously
someone wanting to send this to his friend's family who got the name
and address wrong, so I thought I'd better straighten it out.  I
called up Western Union, got the telephone number of the people who
sent the stuff, and I called them.
</p><p>
"Hello, my name is Mr. Feynman.  I received a package . . ."
</p><p>
"Oh, hello, Mr. Feynman, this is Pete Pamilio" and he says it in
such a friendly way that I think I'm supposed to know who he is! 
I'm normally such a dunce that I can't remember who anyone is.
</p><p>
So I said, "I'm sorry, Mr. Pamilio, but I don't quite remember who
you are . . ."
</p><p>
It turned out he was a representative of one of the publishers
whose books I had to judge on the curriculum commission.
</p><p>
"I see.  But this could be misunderstood."
</p><p>
"It's only family to family."
</p><p>
"Yes, but I'm judging a book that you're publishing, and maybe
someone might misinterpret your kindness!"  I knew what was
happening, but I made it sound like I was a complete idiot.
</p><p>
Another thing like this happened when one of the publishers sent me
a leather briefcase with my name nicely written in gold on it.  I
gave them the same stuff: "I can't accept it; I'm judging some of
the books you're publishing.  I don't think you understand that!"
</p><p>
One commissioner, who had been there for the greatest length of
time, said, "I never accept the stuff; it makes me very upset.  But
it just goes on."
</p><p>
But I <i>really</i> missed one opportunity.  If I had only thought
fast enough, I could have had a <i>very</i> good time on that
commission.  I got to the hotel in San Francisco in the evening to
attend my very first meeting the next day, and I decided to go out
to wander in the town and eat something.  I came out of the
elevator, and sitting on a bench in the hotel lobby were two guys
who jumped up and said, "Good evening, Mr. Feynman.  Where are you
going?  Is there something we can show you in San Francisco?"  They
were from a publishing company, and I didn't want to have anything
to do with them.
</p><p>
"I'm going out to eat."
</p><p>
"We can take you out to dinner."
</p><p>
"No, I want to be alone."
</p><p>
"Well, whatever you want, we can help you."
</p><p>
I couldn't resist.  I said, "Well, I'm going out to get myself in
trouble."
</p><p>
"I think we can help you in <i>that,</i> too."
</p><p>
"No, I think I'll take care of that myself."  Then I thought, "What
an error!  I should have let <i>all</i> that stuff operate and [kept]
a diary, so the people of the state of California could find out how
far the publishers will go!". . . .




</p><p><hr /></p><p>

Richard P. Feynman (1918-1988) was one of the premier physicists of
the second half of the 20th century.  He worked on atomic weapons at
Los Alamos during World War 2, then spent several years on the
faculty of Cornell University, and then (in 1950) became a professor
at the California Institute of Technology.  He remained at Caltech
for the rest of his career.  Feynman worked on the theory of
superfluidity, predicted the existence of quarks, and was one of the
three men whose contributions to quantum electrodynamics were
commemorated by the 1965 Nobel Prize in physics.  The two other men
were Julian Schwinger and Sin-Itiro Tomonaga.

</p><p><hr /></p><p>
<b>Editor's postscript</b>
</p><p>
We don't know of any other case in which state functionaries have given high marks to a book
whose pages were blank, but all the other follies and outrages described in Feynman's
narrative are familiar.
</p><p>
During the past ten years we have studied adoptions operated by state agencies in California
and elsewhere, and we have seen -- again and again -- the same practices that Feynman
observed in 1964.  As a rule, state textbook-adoption proceedings are bureaucratic shams. 
As a rule, the evaluation committees assembled by state agencies are manifestly unqualified
to appraise textbooks or to render any meaningful advice.
</p><p>
Recall Feynman's observation that "usually the only people to look at the books were
schoolteachers or administrators in education."  That is still true.  In a typical case, a
state agency creates an evaluation committee that consists of schoolteachers and 
school-district officials, perhaps augmented by an ordinary citizen or two.  Then the agency
charges this committee with the task of appraising some number of books in a given subject,
even though the committee lacks anyone who possesses expert knowledge of the subject in
question.  The members of the committee then engage in a silly, scripted ritual, producing
collective judgments about books that few (if any) members have actually tried to read --
and they eventually contrive some unexplained, unsupported, collective recommendations,
declaring that the books should be accepted for use in schools.  They don't write individual
reports, so the taxpayers cannot know who did what -- i.e., the taxpayers cannot determine
who (if anyone) inspected and endorsed any particular book.  No one is responsible for
anything.
</p><p>
If a state agency really wanted to obtain legitimate evaluations of textbooks, the agency
could achieve this by using a process that is very well known: Send each book to a
knowledgeable reviewer who will appraise it, who will write a report to set forth and
explain his appraisal, and who will sign his name to his report.  This is the process
employed by the book-review editors of newspapers, magazines and professional journals
throughout the land.  It works, and it can be repeated to any desired extent: To obtain
several appraisals of a given book, simply send the book to several reviewers.
</p><p>
As a rule, however, state agencies <i>don't</i> want legitimate evaluations of the textbooks
that publishers submit for adoption, because the agencies are allied with the publishers. 
The adoption proceedings staged by these agencies are not designed to help school
districts, to protect students, or to serve the interests of taxpayers.  Rather, they are
designed to serve the interests of the publishers, to generate approvals and certifications
for the publishers' books, and to help the publishers sell those books to local schools.
</p><p>
This is why we continue to see, in state after state, the same absurdities that Feynman saw
thirty-five years ago.  In state after state, the legitimate reviewing of books is shunned. 
In state after state, incompetent committees engage in group-grope "evaluation" shams which
embody the emperor's-nose fallacy -- the nonsensical notion that a question can be answered
by averaging a bunch of guesses proffered by people who don't know what they are talking
about.  In state after state, corrupt proceedings are corrupted further by publishers'
"presentations": The publishers send salesmen to describe, explain and promote their books
to the evaluation committees, to other state functionaries, and even to members of state
boards of education.  Feynman refused to hear such pitches, because he held that a book
should be able to speak for itself.  He was right, of course -- but in many states,
evaluation committees are routinely subjected to "presentations" by publishers' pitchmen.
</p><p>
Some state agencies are so strongly allied with publishers that the agencies help the
publishers to market their books to unwary school districts.  Consider, for example, what
goes on in Florida.  Each year, the Florida Department of Education issues a document called
the <i>Florida Catalog of State Adopted Instructional Materials,</i> which includes many
anonymous descriptions of textbooks and other materials that have been approved for use in
Florida's public schools.  The descriptions actually are advertisements.  They are
promotional claims written by the companies that sell the materials, but this fact is
concealed.  Florida school districts are led to believe that the glowing descriptions
printed in the <i>Catalog</i> represent appraisals developed by the state's evaluation
teams.  This matter will be described at greater length in another issue of <i>The Textbook
Letter.</i>
</p>
				
					<br/><a href="http://news.ycombinator.com/item?id=955265">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>Ask HN: What did google do with my search results?</title>
        	<link>http://news.ycombinator.com/item?id=955307</link>
        	<comments>http://news.ycombinator.com/item?id=955307</comments>
	        <description>
    	        <![CDATA[
				
				
					<br/><a href="http://news.ycombinator.com/item?id=955307">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>From Oxford to Wall Street</title>
        	<link>http://www.washingtonpost.com/wp-dyn/content/article/2009/11/20/AR2009112003374.html</link>
        	<comments>http://news.ycombinator.com/item?id=954752</comments>
	        <description>
    	        <![CDATA[
				
<p>
For more than a century Rhodes scholars have left Oxford with virtually any job available to them. For much of this time, they have overwhelmingly chosen paths in scholarship, teaching, writing, medicine, scientific research, law, the military and public service. They have reached the highest levels in virtually all fields.
</p>
<p>
In the 1980s, however, the pattern of career choices began to change. Until then, even though business ambitions and management degrees have not been disfavored in our competition, business careers attracted relatively few Rhodes scholars. No one suggested this was an unfit domain; it was simply the rare scholar who went to Wall Street, finance and general business management. Only three American Rhodes scholars in the 1970s (out of 320) went directly into business from Oxford; by the late 1980s the number grew to that many in a year. Recently, more than twice as many went into business in just one year than did in the entire 1970s.
</p>
<p>
This break in an almost century-old pattern coincided with great increases in occupational earnings differentials, which have continued to grow, seemingly exponentially. It seems quaint, if not unfathomable, that just three decades ago the differentials in earnings -- generally two- to fivefold between business leaders and doctors or lawyers, or five- to tenfold with professors, scientists and public servants -- were often rationalized by Rhodes scholars as reasonable additional compensation to balance the lower standing of business jobs among their peers.
</p>
<p>
When differentials could become a hundredfold or far more -- and as investment banking and similar firms started to recruit young Rhodes scholars who had degrees in math, physics or even history, English and theology -- the yawning prospective wealth chasm understandably became impossible for many to ignore. Even for a few of those most deeply committed to other, more public-spirited pursuits, the lure of such rewards, especially as they are reasonably attainable for people of such high abilities, became much harder to resist.
</p>
<p>
So what is the matter with this picture?
</p>
<p>
Nothing -- if one believes that such differentials are necessary for our economic system to thrive. But do many believe that differentials need be this grotesquely large to motivate and reward people adequately, if not richly? No; they are that large today simply because they <i>can</i> be that large, not because of some virtuous working of the market. This is not Adam Smith's capitalism. Just as Smith decried the inevitable greed and corruption of monopoly, he would surely rail against today's self-serving and closed systems of compensation review.
</p>
<p>
Similarly, nothing is wrong with this picture if one believes that changed career paths of a few privileged people is not of any larger significance. Never mind that some have gifts that realistically could be expected to lead to world-changing breakthroughs, cures or innovations; to greater respect for politics; or to hundreds of profoundly moved and inspired students.
</p>
<p>
Or if one believes that the social benefits, macroeconomic included, that can be expected as a collective consequence of radically more remunerative paths taken will be as great or greater than would have followed from those not taken. (Does anyone seriously believe that? Isn't the innovation that the country needs most for continued prosperity likely to come from scientists and engineers?)
</p>
<p>
Or if one believes the rules and practices of corporate governance are adequate to assure reasonable compensation practices. (Can anyone maintain they do, given the undemocratic ways in which corporate directors are chosen and elected, and the myriad examples of executive compensation perversely related to shareholder return?)
</p>
<p>
Or if one believes the fabric of our democracy might not be frayed by a steadily widening gap between the very rich and the middle class, a gap that could become as cavernous here as it already has in some of the world's least harmonious and most dispiriting countries.
</p>
<p>
Or if one believes that 10 or 20 years down those career tracks, when going back to earlier ambitions is rarely possible, those choices will be the ones that have created the greatest happiness for those individuals.
</p>
<p>
Many thought a silver lining of last year's financial crisis -- or from the populist rage that flared against Wall Street excess and to profits born not from creativity but from leverage -- would be that earnings differentials would return from obscene to merely enormous levels, if not to the very generous multiples that had long been adequate to fuel a vibrant economy. Well, the hyper-bonuses are back -- astonishingly having been made even easier to achieve with taxpayers socializing the downside risks. And the crisis? What crisis?
</p>
<p>
So how many more of America's young and brightest will ask themselves what kind of chumps they are to give up the chance to earn 100 or 500 times as much as their mentors, their doctors, their favorite professors, their idols and heroes?
</p>
<p>
<i>The writer is American secretary of the Rhodes Trust and executive vice president of the Aspen Institute.</i>
</p>
<p>
</p>
<p>
</p>

				
					<br/><a href="http://news.ycombinator.com/item?id=954752">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>Conventions at Light Speed: What Hackers Can Learn From SF Fandom</title>
        	<link>http://catb.org/~esr/writings/sfshows/index.html</link>
        	<comments>http://news.ycombinator.com/item?id=954717</comments>
	        <description>
    	        <![CDATA[
				<p xmlns="http://www.w3.org/1999/xhtml">By the time I went to my first Linux convention in May 1997, I had
been going to science-fiction conventions for twenty years.  I
immediately noticed that the people who attend and organize Linux
conventions are much like science-fiction fans; they have similar
interests, strengths, and weaknesses.</p><p xmlns="http://www.w3.org/1999/xhtml">I also noticed that, by the standards of SF conventions, hacker-run
gatherings are, well, <span xmlns="http://www.w3.org/1999/xhtml"><i xmlns="http://www.w3.org/1999/xhtml">primitive</i></span>.  SF fans have a
continuous tradition of amateur-run conventions going back sixty years; in
that time, they've forgotten more about how to run conventions than hackers
have yet had time to learn.</p><p xmlns="http://www.w3.org/1999/xhtml">In this document, I try to adapt and summarize some of these
techniques for the use of people running Linux and open-source gatherings.
If you apply these, I guarantee you'll give the customers a better time and
be less stressed-out from running things.</p>
				
					<br/><a href="http://news.ycombinator.com/item?id=954717">Comments</a>
				]]>
        	</description>
    	</item>		<item>
        	<title>Time-lapse map of unemployment rates by U.S. county during recession</title>
        	<link>http://cohort11.americanobserver.net/latoyaegwuekwe/multimediafinal.html</link>
        	<comments>http://news.ycombinator.com/item?id=953325</comments>
	        <description>
    	        <![CDATA[
				
				
					<br/><a href="http://news.ycombinator.com/item?id=953325">Comments</a>
				]]>
        	</description>
    	</item></channel>
        </rss>