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

<channel>
	<title>The Random Register</title>
	<atom:link href="http://souja.net/feed" rel="self" type="application/rss+xml" />
	<link>http://souja.net</link>
	<description>Jayson Vantuyl&#039;s Blog</description>
	<lastBuildDate>Sun, 12 Feb 2012 13:10:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>The Blog Lives Again!</title>
		<link>http://souja.net/2012/02/the-blog-lives-again</link>
		<comments>http://souja.net/2012/02/the-blog-lives-again#comments</comments>
		<pubDate>Sun, 12 Feb 2012 13:09:12 +0000</pubDate>
		<dc:creator>Jayson Vantuyl</dc:creator>
				<category><![CDATA[Posts]]></category>

		<guid isPermaLink="false">http://souja.net/?p=92</guid>
		<description><![CDATA[After quite a hiatus, I&#8217;ve finally found the time to set up new blogging software and import all of my old content.  It was actually a remarkable amount of work, but I think it&#8217;s turned out rather nicely. Stay tuned here for more entirely personal posts.  If you&#8217;re looking for technical / professional goodness, you might want to look at my other blog.]]></description>
			<content:encoded><![CDATA[<p>After quite a hiatus, I&#8217;ve finally found the time to set up new blogging software and import all of my old content.  It was actually a remarkable amount of work, but I think it&#8217;s turned out rather nicely.</p>
<p>Stay tuned here for more entirely personal posts.  If you&#8217;re looking for technical / professional goodness, you might want to look <a href="http://needlesslymessianic.com">at my other blog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://souja.net/2012/02/the-blog-lives-again/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blogger Sucks</title>
		<link>http://souja.net/2010/03/blogger-sucks</link>
		<comments>http://souja.net/2010/03/blogger-sucks#comments</comments>
		<pubDate>Sun, 14 Mar 2010 17:14:00 +0000</pubDate>
		<dc:creator>Jayson Vantuyl</dc:creator>
				<category><![CDATA[Posts]]></category>
		<category><![CDATA[google fail]]></category>

		<guid isPermaLink="false">http://newww.souja.net/?p=8</guid>
		<description><![CDATA[Well, it&#8217;s the end of an era folks. Whenever I have the time, I&#8217;ll have to move this blog to something else. In the meantime, Google is remove a feature that has been with Blogger since the beginning. They claim that keeping this particular feature is holding them back. I can&#8217;t help but think that they&#8217;re just lazy or perhaps being evil. What feature is this you ask? It&#8217;s called SFTP. Basically, it uses a secure connection to upload my blog to my server. When I post, Google renders all of the pages and uploads static copies of them toRead more]]></description>
			<content:encoded><![CDATA[<p>Well, <a href="http://blogger-ftp.blogspot.com/2010/01/deprecating-ftp.html">it&#8217;s the end of an era folks</a>.</p>
<p>Whenever I have the time, I&#8217;ll have to move this blog to something else.  In the meantime, Google is remove a feature that has been with Blogger since the beginning.  They claim that keeping this particular feature is holding them back.  I can&#8217;t help but think that they&#8217;re just lazy or perhaps being evil.</p>
<p>What feature is this you ask?  It&#8217;s called SFTP.  Basically, it uses a secure connection to upload my blog to my server.  When I post, Google renders all of the pages and uploads static copies of them to my server.  Why is this important?  Two reasons.</p>
<p>First, when someone uses my blog, my server sends them a file.  That&#8217;s it.  No ifs, ands, or buts.  This is great because, when I get tons of traffic, my site stays up.  The more work my server has to do, the less likely my page is to stay up.  This doesn&#8217;t matter so much for Google, as they can plausibly claim that whatever they will put together can take a hurricane-force storm of traffic.  Still, when it does go down (and Google has outages more frequently than most realize), I will have absolutely no introspection as to why.  When someone can&#8217;t get to my blog, I&#8217;ll have no way to figure out what&#8217;s going on.  This leads me to the next issue.</p>
<p>Second, this feature was the only way to effectively integrate Blogger into another website.  Almost any blog worth reading is part of a larger website.  I might have code posted if I&#8217;m a programmer.  I might have web tools if I&#8217;m a business.  I might have special access for clients / investors / employees.  As of this switch, these sites are dead in the water.  The only way to integrate the blog into your site either involves rickety forwarding setups, or doing your best to make Google&#8217;s site LOOK like it&#8217;s part of yours, without it actually being so.</p>
<p>That&#8217;s primarily why I used Blogger.  Not only did I use it for that reason, I cannot automatically migrate to their new setup without breaking things&#8211;precisely because I used it this way.</p>
<p>People have had stuff running this way for literally a decade.  Tons of small businesses and consultants (and big businesses for that matter) were just given eight weeks to track down a consultant and pay them to basically re-engineer their entire site.  Bad show Google.  Bad show.</p>
<p>So, this is probably the last post here until I figure this out.  I doubt I have too many readers of this particular blog, but it&#8217;ll be sad to see it go.  All of the content will still be here (ironically, another useful property of SFTP that will never people possible with Blogger again).</p>
<p>Good night, and good luck.  <img src='http://souja.net/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://souja.net/2010/03/blogger-sucks/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Technical Blog</title>
		<link>http://souja.net/2009/12/new-technical-blog</link>
		<comments>http://souja.net/2009/12/new-technical-blog#comments</comments>
		<pubDate>Wed, 16 Dec 2009 00:19:00 +0000</pubDate>
		<dc:creator>Jayson Vantuyl</dc:creator>
				<category><![CDATA[Posts]]></category>

		<guid isPermaLink="false">http://newww.souja.net/?p=9</guid>
		<description><![CDATA[I&#8217;ve recently started to find that the mix of technical entries and personal entries is slightly confusing to my family and rather boring to my technical readers. To help remedy that, I&#8217;ve started a new technical blog at http://needlesslymessianic.com. If you&#8217;re one of my technical readers, feel free to head over and read some of my new posts.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve recently started to find that the mix of technical entries and personal entries is slightly confusing to my family and rather boring to my technical readers.  To help remedy that, I&#8217;ve started a new technical blog at <a href="http://needlesslymessianic.com">http://needlesslymessianic.com</a>.</p>
<p>If you&#8217;re one of my technical readers, feel free to head over and read some of my new posts.</p>
]]></content:encoded>
			<wfw:commentRss>http://souja.net/2009/12/new-technical-blog/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vindictive Botnets?</title>
		<link>http://souja.net/2009/08/vindictive-botnets</link>
		<comments>http://souja.net/2009/08/vindictive-botnets#comments</comments>
		<pubDate>Thu, 06 Aug 2009 17:20:00 +0000</pubDate>
		<dc:creator>Jayson Vantuyl</dc:creator>
				<category><![CDATA[Posts]]></category>
		<category><![CDATA[bots]]></category>
		<category><![CDATA[conspiracy]]></category>
		<category><![CDATA[tinfoil]]></category>

		<guid isPermaLink="false">http://newww.souja.net/?p=10</guid>
		<description><![CDATA[On Wednesday, an ISP that served as command and control for some botnets was taken offline. On Thursday, a distributed denial-of-service attack disrupted three major US social network sites. No solid evidence has been released as to why this may have happened or if the above two things are related. That means it&#8217;s time for a conspiracy theory! Maybe this wasn&#8217;t automated, but it&#8217;s an insidious idea. What if this was automated retribution for attacking the botnets&#8217; C&#038;C; infrastructure? Think of it as a bold new stride in mutually-assured-destruction between the security community and cyber-criminals. Would security professionals (or theRead more]]></description>
			<content:encoded><![CDATA[<p>On Wednesday, an ISP that served as command and control for some botnets <a href="http://www.pcworld.com/businesscenter/article/169635/after_links_to_cybercrime_latvian_isp_is_cut_off.html">was taken offline</a>.</p>
<p>On Thursday, a distributed denial-of-service attack <a href="http://www.usatoday.com/tech/news/2009-08-06-twitter-attack_N.htm">disrupted three major US social network sites</a>.</p>
<p>No solid evidence has been released as to why this may have happened or if the above two things are related.  That means it&#8217;s time for a conspiracy theory!</p>
<p>Maybe this wasn&#8217;t automated, but it&#8217;s an insidious idea.  What if this was automated retribution for attacking the botnets&#8217; C&#038;C; infrastructure?  Think of it as a bold new stride in mutually-assured-destruction between the security community and cyber-criminals.</p>
<p>Would security professionals (or the people at ISPs that work with them) be less likely to help cooperatively police the internet if they were going to be implicated in the next major disruption of public services?  I bet so.  Even if the professionals resist the coercion, it&#8217;s hard to imagine that their bosses are immune, and there&#8217;s no motivation like a disappearing paycheck.</p>
<p>I can only imagine Gary Oldman being cast as the disgruntled Latvian cyber-criminal.  Bruce Willis plays the FBI agent?  Or maybe Harrison Ford if this becomes the next Clancy novel.  Don Cheadle as Barack Obama?  The mind reels at the Hollywood possibilities.</p>
<p>If this is related, I just hope that it doesn&#8217;t become more fodder for legitimizing government control over the Internet &#8220;because it needs it&#8221;.  Government law enforcement support might be helpful, but not invasive manipulation.</p>
]]></content:encoded>
			<wfw:commentRss>http://souja.net/2009/08/vindictive-botnets/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Quick Guide To Twitter</title>
		<link>http://souja.net/2009/06/a-quick-guide-to-twitter</link>
		<comments>http://souja.net/2009/06/a-quick-guide-to-twitter#comments</comments>
		<pubDate>Thu, 18 Jun 2009 15:17:00 +0000</pubDate>
		<dc:creator>Jayson Vantuyl</dc:creator>
				<category><![CDATA[Posts]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://newww.souja.net/?p=11</guid>
		<description><![CDATA[It seems like I have to explain Twitter every few days. While I think it&#8217;s a wonderful service, I think everyone can agree that it&#8217;s a bit obtuse. In order to save myself some trouble, I&#8217;m writing this post so that I can refer people to it. Call me lazy. What Is Twitter? This is a very good place to start. The easiest way to describe Twitter is: A little bird that tweets in all of your friends&#8217; ears. Basically, Twitter is a service to make communication easier. This is important to keep in mind. It is VERY easy toRead more]]></description>
			<content:encoded><![CDATA[<p>It seems like I have to explain Twitter every few days.  While I think it&#8217;s a wonderful service, I think everyone can agree that it&#8217;s a bit obtuse.  In order to save myself some trouble, I&#8217;m writing this post so that I can refer people to it.  Call me lazy.
<div>
<div><b><span class="Apple-style-span" style="font-size:x-large;">What Is Twitter?</span></b></div>
<div></div>
<div>This is a very good place to start.  The easiest way to describe Twitter is:</div>
<div>
<blockquote></blockquote>
<blockquote><p>A little bird that tweets in all of your friends&#8217; ears.</p></blockquote>
</div>
<div>Basically, Twitter is a service to make communication easier.  This is important to keep in mind.  It is VERY easy to publicly humiliate yourself on Twitter.  One wrong character can make a private Tweet very, very public.</div>
<div></div>
<div><b><span class="Apple-style-span" style="font-size:x-large;">The Terminology of Twitter</span></b></div>
<div></div>
<div>You&#8217;ve already probably noticed that I call a message sent via Twitter a &#8220;tweet&#8221;.  Here&#8217;s the exhaustive list of terms you&#8217;ll find useful:</div>
<div>
<ul>
<li>twitter: (n) a messaging service.</li>
<li>tweet: (n) a message sent via the Twitter messaging service.</li>
<li>(to) tweet: (v) the act of sending a message via Twitter</li>
<li>twitter client: (n) a program used to Tweet on Twitter</li>
<li>follow: (v) indicating that you are interested in a person&#8217;s Tweets (often used to refer to your group of followers or the people that you follow)</li>
<li>at-reply: (n) a PUBLIC reply on the Twitter service, denoted by beginning with an @username</li>
<li>at-mentions: (n) a PUBLIC mention of someone on Twitter, denoted by having @username somewhere other than the beginning of a message</li>
<li>direct-reply: (n) a PRIVATE reply to someone on Twitter, sent by starting a message with &#8220;d username&#8221;</li>
<li>tweeple, tweeps: (n,pl) the group of people who follow you on Twitter</li>
<li>retweet: (v) the process of posting an interesting Tweet that you received from someone</li>
</ul>
<div><b><span class="Apple-style-span" style="font-size:x-large;">Strange Limitations</span></b></div>
<div></div>
<div>Twitter, like MySpace before it, is a service that really &#8220;happened&#8221; more than it was &#8220;planned&#8221;.  Because of this, you may notice that it can be a bit rough around the edges.  The factors that shaped it have given it some particular warts that I&#8217;ll try to mention.</div>
<div></div>
<div><i>Message Length</i>: Messages on Twitter can only be 140 characters.  Longer messages are cut off.</div>
<div><i><br /></i></div>
<div><i>Cryptic Commands</i>: Private messages, at-replies, and at-mentions focus a rather crusty mix of single letters and symbols.</div>
<div><i><br /></i></div>
<div><i>Slowness</i>: At times, Twitter can be behind by hours.</div>
<div><i><br /></i></div>
<div><i>Link Mangling</i>: Web-links in messages are rewritten in a way that hides where they point.</div>
<div></div>
<div>It turns out that every one of these limitations comes from one of Twitter&#8217;s biggest strengths&#8211;SMS support.  Twitter, from the beginning, has been made to be used on a simple, unadorned cellphone.  While this undoubtedly has made it a success, we have to live with the above problems.</div>
<div></div>
<div>Cell phone messages (so-called SMS messages) are limited to 160 characters.  This means that messages from Twitter have to be shortened.  This is where the length limitation comes from.  It&#8217;s worth noting that messages longer than 160 characters are supported by some phones, but the other phones hold us back.  Some people feel that the brevity forced by this limitation is what makes Twitter enjoyable&#8211;it forces people to be succinct.</div>
<div></div>
<div>The cryptic commands and link mangling are both ways to cope with the limited space.  The commands have to be short, and the link mangling is done to make the web-link shorter.</div>
<div></div>
<div>The slowness is just the nature of the beast.  It turns out, that <a href="http://twitter.com/aplusk">some</a> <a href="http://twitter.com/barackobama">people</a> have lots of followers.  When these people Tweet, every one of their followers must be notified.  Today, those two users alone are responsible for over 15 million messages that must be sent.  To put that in perspective, if they started at midnight (which they didn&#8217;t), that would be 264 messages per second!</div>
<div></div>
<div>Suddenly it makes sense why Twitter falls behind!</div>
<div></div>
<div><b><span class="Apple-style-span" style="font-size:x-large;">How To Use Twitter On The Phone</span></b></div>
<div></div>
<div>There&#8217;s a list of commands <a href="http://help.twitter.com/forums/10711/entries/14020">here</a>.</div>
<div></div>
<div>To send a public message to all of your tweeps, just message the Twitter number (40404 in the US).</div>
<div></div>
<div>To reply to a user named kagato, send a message like &#8220;@kagato I liked your omelet recipe.&#8221;.  This message will appear on your public profile as your Latest Tweet, appear in your public timeline, and generally be messaged to that user.</div>
<div></div>
<div>To mention a user named kagato, send a message like &#8220;Omelets are AWESOME! Right @kagato?&#8221;.  In this case, the message will appear as your Latest Tweet, be messaged to all of your Tweeple, and generally be messaged to that user as well.</div>
<div></div>
<div>You&#8217;ll often see mentions like &#8220;Hanging at out an awesome Omelet Bar in Vegas with @kagato and @freeformz&#8221;.</div>
<div></div>
<div>To send a private reply to a user named kagato, send a message like &#8220;d kagato Pssst! Omelet&#8217;s make me gassy.&#8221;.  Be <b><i>very careful</i></b> when sending private messages.  It is very easy to accidentally type &#8220;dkagato &#8230;&#8221;.  In that case, your message would go to all of your tweeple!</div>
<div></div>
<div>To mark a user&#8217;s last tweet as one of your favorites, send a message like &#8220;fav kagato&#8221;.  Note that this will sometimes mark a later tweet than the one that you intended when Twitter gets behind.  You can also just send &#8220;fav&#8221; to mark the last tweet you received (from whoever) as a favorite.  Again, this can suffer when Twitter gets behind.</div>
<div></div>
<div>To follow a new user, send a message like &#8220;follow kagato&#8221;.</div>
<div></div>
<div>To nudge a user (silently indicating to them that they aren&#8217;t talkative enough), just send a message like &#8220;nudge kagato&#8221;.  Not many people use this one.</div>
<div></div>
<div>To disable all phone messages, send &#8220;off&#8221;.  To enable them, send &#8220;on&#8221;.  You can also put a user&#8217;s name after them to just muzzle a specific person.  That can be helpful when people are drunk-tweeting.  Just don&#8217;t forget to unmuzzle them when they sober up.</div>
<div></div>
<div>To find out information about a user, send &#8220;whois kagato&#8221;.</div>
<div></div>
<div>To retrieve the latest tweet from someone, send &#8220;get kagato&#8221;.</div>
<div></div>
<div>To be vain and get information about yourself, send &#8220;stats&#8221;.</div>
<div></div>
<div>To invite someone to twitter by text-message, send &#8220;invite 415 555 1212&#8243; (substituting whatever their number is).</div>
<div></div>
<div><b><span class="Apple-style-span" style="font-size:x-large;">How To Use Twitter on the Web</span></b></div>
<div></div>
<div>Just play around at <a href="http://twitter.com/">twitter.com</a>.</div>
<div></div>
<div>Ironically, one you log in, just type a message like you would on your phone.  There are buttons for most of the features (following people for instance), but messages, @replies, @mentions, and direct messages all work in the little box.</div>
<div></div>
<div>The search functions here can be nice.  The public timeline can be nice.  Otherwise, it&#8217;s about like your phone (at least in terms of functionality).</div>
<div></div>
<div>The most useful feature that is on the website is the ability to control whether you get &#8220;mobile updates&#8221; for a user.  This lets you get realtime updates for some people, while other people only appear on the web (or in your Twitter Client, if you use one).</div>
<div></div>
<div>I mostly have close friends and coworkers enabled for mobile updates.  This lets me catch messages like &#8220;Anybody up for dinner?&#8221;.  Setting dinner plans over Twitter can be a very cool pick-me-up at the end of the workday.</div>
<div></div>
<div>On the other hand, I have many other people I follow.  I occasionally (maybe once every other day) check my Twitter client.  This lets me pull in the full volume of Twitter on my own time (instead of over my entire day).</div>
<div></div>
<div><b><span class="Apple-style-span" style="font-size:x-large;">Other Neat Stuff</span></b></div>
<div></div>
<div>There are other services available over Twitter.</div>
<div></div>
<div>You can use <a href="http://twitpic.com/">twitpic.com</a> to put links to pictures in your Twitter messages.</div>
<div></div>
<div>People often put &#8220;tags&#8221; in their messages for people to search for.  Whenever you see a message like &#8220;I love Chicken Tikka Masala #food&#8221;, the #food part is a tag available for searching.</div>
<div></div>
<div>Sometimes you&#8217;ll see a message like &#8220;Just bought some $AAPL because $MSFT is down&#8221;.  These are used to indicate that a word is a stock symbol.</div>
<div></div>
<div>Some people even put links to their location on a map.  The possibilities are really endless.</div>
<div></div>
<div><b><span class="Apple-style-span" style="font-size:x-large;">Twitter Clients</span></b></div>
<div></div>
<div>If you become a &#8220;hardcore&#8221; Twitter user, you may download a special program just to access Twitter.  If you&#8217;re really into it, you might even get a special one for your iPhone or BlackBerry.</div>
<div></div>
<div>Twitter Clients are where things get pretty crazy.  The functionality like stock symbols, location links, @replies, TwitPics are all integrated into various Twitter clients.  From my phone, I can take a picture of something and Tweet about it with a link to the location on a map.  It&#8217;s surreal.</div>
<div></div>
<div><b><span class="Apple-style-span" style="font-size:x-large;">Other Twitter Quirks</span></b></div>
<div></div>
<div>The one other thing that always seems to trip people up is retweets.  Let&#8217;s say that you hear about some new thing you like.  For example, you might receive a message like &#8220;freeformz: A bank car overturned at 4th and King, free money!&#8221;.  You, understandably, might want to send this to all of your friends so they can become wealthy with you.</div>
<div></div>
<div>However, knowing that freeformz will soon be a rich man, you don&#8217;t want to offend him by implicitly claiming that you are the source of this blessed information.  This seemingly simple scenario can be confusing.</div>
<div></div>
<div>Many people re-tweet with a message like &#8220;RT @freeformz: A bank car overturned at 4th and King, free money!&#8221;.  The RT indicates that it is a retweet.  Some people will do it like this: &#8220;A bank car overturned at 4th and King, free money! (via @freeformz)&#8221;.  In either case, it does the same thing.</div>
<div></div>
<div>To complicate things, sometimes people want to add some more to the message.  This makes it <i>really</i> confusing.  For example, you might see this &#8220;RT @freeformz: A bank car overturned at 4th and King, free money!&#8211; I&#8217;m RICH!&#8221;.  In this case, it&#8217;s easy to miss that @freeformz was the one with the initial message and that the re-tweeter added &#8220;I&#8217;m RICH!&#8221;.</div>
<div></div>
<div>In other words, read carefully, and watch for signs that someone added a message to the end of a re-tweet.</div>
<div></div>
<div><b><span class="Apple-style-span" style="font-size:x-large;">Conclusion</span></b></div>
<div></div>
<div>Twitter is a powerful and useful tool for forcing people to effectively communicate through cryptic abbreviations and haikus.  Hopefully it can be as transformative for your time-wasting as it has been for mine.</div>
<div></div>
<div>Good luck, and have a lot of fun!</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://souja.net/2009/06/a-quick-guide-to-twitter/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interpreting The Evidence on Human Reasoning</title>
		<link>http://souja.net/2009/06/interpreting-the-evidence-on-human-reasoning</link>
		<comments>http://souja.net/2009/06/interpreting-the-evidence-on-human-reasoning#comments</comments>
		<pubDate>Tue, 02 Jun 2009 17:47:00 +0000</pubDate>
		<dc:creator>Jayson Vantuyl</dc:creator>
				<category><![CDATA[Posts]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[politics]]></category>

		<guid isPermaLink="false">http://newww.souja.net/?p=5</guid>
		<description><![CDATA[I recently read two largely unrelated articles. Much like french fries and milkshakes, they go together well even though you might not expect it. If you have a technical bent, read this whole article. It&#8217;s about a guy building electronic brains, and it&#8217;s fascinating. If you just want the salty-sweet juxtaposition, just read the first question on the third page here. Now read this article on the recent friction between science and politics. What&#8217;s interesting is the fact that the observations of the first article cast the second article in a disturbing but understandable light.  As thinking creatures in whatRead more]]></description>
			<content:encoded><![CDATA[<p>I recently read two largely unrelated articles.  Much like french fries and milkshakes, they go together well even though you might not expect it.</p>
<p>If you have a technical bent, read <a href="http://discovermagazine.com/2009/feb/16-what-makes-you-uniquely-you/article_view?b_start:int=0&amp;-C=">this</a> whole article.  It&#8217;s about a guy building electronic brains, and it&#8217;s fascinating.  If you just want the salty-sweet juxtaposition, just read the first question on the third page <a href="http://discovermagazine.com/2009/feb/16-what-makes-you-uniquely-you/article_view?b_start:int=2&amp;-C=">here</a>.
<div></div>
<div>Now read <a href="http://www.juliansanchez.com/2009/04/06/climate-change-and-argumentative-fallacies/">this article</a> on the recent friction between science and politics.</div>
<div></div>
<div>What&#8217;s interesting is the fact that the observations of the first article cast the second article in a disturbing but understandable light.  As thinking creatures in what some assume is an age of reason, it&#8217;s comforting to think of reason as being somehow inherent in ourselves.  In a democracy, it&#8217;s most depressing to conceive that your voting peers might lack that spark of reason that we&#8217;ve hoped drives a democracy towards informed legislation.</div>
<div></div>
<div>The sad truth appears to be that the brain is really just a powerful, dynamic pattern-matching system.  While this makes it very generally applicable, it also means that it&#8217;s possible to train it to match in a way that is wholly incompatible with logic and reason.  I guess nurture wins out of nature on this one.</div>
<div></div>
<div>What I find to be most interesting is that this is a clue that many AI researchers are focusing in the wrong places.  It&#8217;s pretty clear that achieving intelligence in a human sense will have to be highly statistical in implementation.  While I do sincerely hope that we can someday build a logic processor that is based entirely on semantically-infused logic, I wonder at how such a machine would contrast with humanity.</div>
]]></content:encoded>
			<wfw:commentRss>http://souja.net/2009/06/interpreting-the-evidence-on-human-reasoning/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>What Java Should Learn From Ruby and Rails</title>
		<link>http://souja.net/2009/04/what-java-should-learn-from-ruby-and-rails</link>
		<comments>http://souja.net/2009/04/what-java-should-learn-from-ruby-and-rails#comments</comments>
		<pubDate>Mon, 27 Apr 2009 11:59:00 +0000</pubDate>
		<dc:creator>Jayson Vantuyl</dc:creator>
				<category><![CDATA[Posts]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jruby]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[sun]]></category>

		<guid isPermaLink="false">http://newww.souja.net/?p=6</guid>
		<description><![CDATA[I hate to say this, but Java has gotten a bad rap among some programmers. It&#8217;s deserved at times, but it&#8217;s worth noting that it&#8217;s often more about the people behind Java than the technology itself. Here&#8217;s an example. Clearly, this is horribly wrong. Sun refuses to fix a bug because people have worked around it, thus it must be maintained&#8211;to the detriment of all programmers to follow. This gradual growth of cruft is one thing that has driven people away from Java. Why is this important to me? Well, it&#8217;s mostly important because I think that it prevents goodRead more]]></description>
			<content:encoded><![CDATA[<p>I hate to say this, but Java has gotten a bad rap among some programmers.  It&#8217;s deserved at times, but it&#8217;s worth noting that it&#8217;s often more about the people behind Java than the technology itself.</p>
<p>Here&#8217;s an example.  Clearly, <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4273532">this is horribly wrong</a>.  Sun refuses to fix a bug because people have worked around it, thus it must be maintained&#8211;to the detriment of all programmers to follow.  This gradual growth of cruft is one thing that has driven people away from Java.</p>
<p>Why is this important to me?  Well, it&#8217;s mostly important because I think that it prevents good comparisons of technologies.  It sends the wrong message when people move to Rails because Java is riddled with unnecessary complexity and buggy libraries. While it is some compliment that it says that Ruby is easy to use compared to Java, it doesn&#8217;t emphasize what makes Ruby such a different way of doing things.</p>
<p>Real improvements like reduction in code through expressiveness, flexible extension of types, the block syntax, et cetera get lost in the shuffle.  What&#8217;s worse, it doesn&#8217;t send the message that Ruby can be used to solve industrial problems.  The eternal mantra of the Ruby naysayers&#8211;that it doesn&#8217;t scale&#8211;is at least partially reinforced when people flock to it for simple projects.</p>
<p>For those who have built scalable applications on top of Ruby, this is laughable.  Yet the point remains that dynamic languages in general and Ruby in particular have a great deal of value to deliver to real, serious software development.  Even though it&#8217;s fun to play with, it&#8217;s not just a toy.</p>
<p>Similarly, when people legitimately work on projects like JRuby that work gets ignored by people who just don&#8217;t want to deal with the cruft.  While that&#8217;s a great reason to avoid a class-library, it&#8217;s a horrible way to allocate our resources as an industry.  In a world where languages live or die by their &#8220;standard libraries&#8221;, this just makes people&#8217;s lives harder and guarantees that we spend more energy to move the same distance.</p>
<p>I can only hope that Oracle&#8217;s recent acquisition of Sun might change this attitude and position Java as a more useful technology.  It&#8217;s a shame to see all of the hard work people have put into the JVM be squandered because some people are afraid to break an API.  If anything, this could have been turned into an opportunity for Java to offer versioned APIs, but instead it was met with duplication of functionality and degradation of the clarity of their class library.</p>
<p>I feel that this puts work on Rails 3 in an important light.  The Merb project was about a lot of things, but one of its most important aspects was that the people behind it continued the march towards a better product.  The Rails core team did a great thing by welcoming the best of Merb into Rails.  It&#8217;s letting us build a better future, and it&#8217;s showing that we can maintain compatibility and still move forward.</p>
<p> We just need to always be mindful that the day that we stop improving Rails is the day that someone starts writing its replacement.  More than anything, we need to insist that there is no excuse for not fixing a bug.</p>
]]></content:encoded>
			<wfw:commentRss>http://souja.net/2009/04/what-java-should-learn-from-ruby-and-rails/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Random MacOSX TCP Behavior</title>
		<link>http://souja.net/2009/04/random-macosx-tcp-behavior</link>
		<comments>http://souja.net/2009/04/random-macosx-tcp-behavior#comments</comments>
		<pubDate>Sat, 25 Apr 2009 19:41:00 +0000</pubDate>
		<dc:creator>Jayson Vantuyl</dc:creator>
				<category><![CDATA[Posts]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[tcp]]></category>

		<guid isPermaLink="false">http://newww.souja.net/?p=12</guid>
		<description><![CDATA[TCP is an interesting protocol. It&#8217;s interesting mostly because it is less a specification of bytes and more a specification of behavior. Most TCP implementations have developed from the sort of arcane knowledge that you can only amass after trying to implement such a basic protocol over a long period of time. By the time TCP (and indeed the whole IP stack) has made it to my desktop, it had been on a long journey. MacOSX&#8217;s network has a storied pedigree that goes back deep into the iterations of the original BSD Unix. There is, as they say, heavy voodoo.Read more]]></description>
			<content:encoded><![CDATA[<p>TCP is an interesting protocol.  It&#8217;s interesting mostly because it is less a specification of bytes and more a specification of behavior.  Most TCP implementations have developed from the sort of arcane knowledge that you can only amass after trying to implement such a basic protocol over a long period of time.</p>
<p>By the time TCP (and indeed the whole IP stack) has made it to my desktop, it had been on a long journey.  MacOSX&#8217;s network has a storied pedigree that goes back deep into the iterations of the original BSD Unix.  There is, as they say, heavy voodoo.</p>
<p>Today I hit a corner case that only made sense after some pretty serious debugging.  I&#8217;m sharing it here with the hopes that it may save you the headache.</p>
<p>The backbone of the Internet is designed to just have these routes disappear for a while.  You get a few ICMP messages back if you&#8217;re very lucky.  Otherwise, your packets might just disappear.</p>
<p>One of the nice features of TCP is that it&#8217;s incredibly resilient to network links just disappearing.  This is no problem for it.  In fact, if you&#8217;re not sending any traffic, you may not even notice that you&#8217;re down.  Failures being invisible is a nice feature when you&#8217;re not doing anything.</p>
<p>That said, there are protocols that really want to know when they&#8217;re down.  XMPP is one of them.  For protocols like XMPP, there is a pretty standard procedure of having some sort of &#8220;keep-alive&#8221; data that you occasionally send.  Since XMPP data streams are just XML documents, most XMPP implementations just send a few whitespace bytes in between stanzas when idle.</p>
<p>Today, I was debugging an XMPP connection over a 3G modem.  This manifests itself under a ppp0 link in MacOSX.  While I wasn&#8217;t thinking about it, I walked around with my laptop.  One spot caused the phone connection to lose signal and it failed.  When I noticed, I reconnected the modem.  This provoked some very interesting behavior (or rather lack of behavior) from the BSD IP stack.</p>
<p>Normally, when some fundamental aspect of network changes, there is some device that will interrupt your connection.  For example, if my XMPP server had lost power, when it recovered the keepalive packets would have triggered a TCP reset, which breaks the connection.  Similarly, if I remove an IP address from a Linux machine, connections on that IP are interrupted.  It just so happens that in this case, the IP stack did NOT break the connections.</p>
<p>In fact, it just silently ate any data that the connections attempted to send.  So the keepalives completely failed to kill the dead connection.  It took almost fifteen minutes until some sort of behavior that caused the IP stack to notice that the connection should be killed.</p>
<p>It took a while to track down what was happening, but apparently the connections were maintained (so says netstat) and the sent packets just disappeared without any sort of sending error!  Very weird behavior triggered by an odd corner case.  I&#8217;ve also discovered that this appears to also happen when you close your laptop and go to another wireless access point.  This is ugly for my use-case, as I want the agent on the laptop to reconnect when it has a new address.  If anyone has a good way to detect this in a portable way (i.e. not plugging into Apple&#8217;s NetKit watchers), please let me know.</p>
<p>While I find this mildly annoying, I have to admit that I can&#8217;t fault TCP.  If the packets are just disappearing, the best behavior is to just resend and keep waiting for the connection to come back up for a reasonably long time out.  This is exactly what happened.  Instead, I hope that Apple will eventually do what Linux does and push an error into the socket when it tries to send from an address that isn&#8217;t valid for that machine anymore.</p>
]]></content:encoded>
			<wfw:commentRss>http://souja.net/2009/04/random-macosx-tcp-behavior/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>One Year Update</title>
		<link>http://souja.net/2009/04/one-year-update</link>
		<comments>http://souja.net/2009/04/one-year-update#comments</comments>
		<pubDate>Thu, 23 Apr 2009 08:40:00 +0000</pubDate>
		<dc:creator>Jayson Vantuyl</dc:creator>
				<category><![CDATA[Posts]]></category>
		<category><![CDATA[omgcute]]></category>

		<guid isPermaLink="false">http://newww.souja.net/?p=13</guid>
		<description><![CDATA[Who gave this guy permission to grow?  I sure didn&#8217;t!  I guess it&#8217;s okay, though&#8230;  :) Here are some good pics grandma Vantuyl got of the birthday boy: One down, seventeen to go.  ;P]]></description>
			<content:encoded><![CDATA[<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://souja.net/uploaded_images/P4110359-711276.jpg"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://souja.net/uploaded_images/P4110359-711264.jpg" border="0" alt="" /></a><br />Who gave this guy permission to grow?  I sure didn&#8217;t!  I guess it&#8217;s okay, though&#8230;  :)
<div></div>
<div>Here are some good pics grandma Vantuyl got of the birthday boy:</div>
<div></div>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://souja.net/uploaded_images/P4110355-711249.jpg"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://souja.net/uploaded_images/P4110355-711235.jpg" border="0" alt="" /></a>
<div></div>
<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://souja.net/uploaded_images/P4110370-767407.jpg"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://souja.net/uploaded_images/P4110370-767390.jpg" border="0" alt="" /></a>
<div></div>
<div>One down, seventeen to go.  ;P</div>
]]></content:encoded>
			<wfw:commentRss>http://souja.net/2009/04/one-year-update/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On Tail Recursion Elimination</title>
		<link>http://souja.net/2009/04/on-tail-recursion-elimination</link>
		<comments>http://souja.net/2009/04/on-tail-recursion-elimination#comments</comments>
		<pubDate>Thu, 23 Apr 2009 06:36:00 +0000</pubDate>
		<dc:creator>Jayson Vantuyl</dc:creator>
				<category><![CDATA[Posts]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tailrecursion]]></category>

		<guid isPermaLink="false">http://newww.souja.net/?p=14</guid>
		<description><![CDATA[There was a bit of a controversial post on Guido van Rossum&#8217;s blog that I thought deserved a little comment. To sum up Guido&#8217;s argument, he doesn&#8217;t feel like implementing Tail Recursion Elimination (henceforth referred to as TRE) in Python because: Stack traces help debug, TRE makes them useless TRE Is Not An Optimization (it creates a class of code that explodes without it) Guido does not subscribe to the &#8220;Recursion is the basis of all programming&#8221; idea Due to Python&#8217;s highly dynamic namespaces, it&#8217;s very nontrivial to know if a call is a recursion. The funny thing is that,Read more]]></description>
			<content:encoded><![CDATA[<p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/f/fa/Ouroboros.png"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 358px; height: 380px;" src="http://upload.wikimedia.org/wikipedia/commons/f/fa/Ouroboros.png" border="0" alt="" /></a><br />There was a bit of <a href="http://neopythonic.blogspot.com/2009/04/tail-recursion-elimination.html">a controversial post</a> on Guido van Rossum&#8217;s blog that I thought deserved a little comment.
<div></div>
<div>To sum up Guido&#8217;s argument, he doesn&#8217;t feel like implementing <a href="http://www.itl.nist.gov/div897/sqg/dads/HTML/tailRecursion.html">Tail Recursion Elimination</a> (henceforth referred to as TRE) in Python because:</div>
<div></div>
<div>
<ol>
<li>Stack traces help debug, TRE makes them useless</li>
<li>TRE Is Not An Optimization (it creates a class of code that explodes without it)</li>
<li>Guido does not subscribe to the &#8220;Recursion is the basis of all programming&#8221; idea</li>
<li>Due to Python&#8217;s highly dynamic namespaces, it&#8217;s very nontrivial to know if a call is a recursion.</li>
</ol>
<div>The funny thing is that, even though I am a big supporter of TRE, I actually agree with all of these points.  Taking them in turn:</div>
<div></div>
<div>Stack traces are critical to debugging code.  Ruby and Erlang both started out with uglier stack traces than they have today.  They were adjusted because they are important.  Similarly, the most difficult Python frameworks have always been that way due to their affect on stack traces.  Zope and Twisted&#8211;I mean you.  Zope would create absolutely titanic stack traces.  Twisted, on the other hand, creates virtually no useful stack traces (as a consequence of the deferred model).</div>
<div></div>
<div>While I find this to be telling, I would caution against considering this in the context of TRE.  Why?  Simple.  Some styles of programming don&#8217;t generate good stack traces.  As an example, consider the construct of a loop.  Loops don&#8217;t generate stack traces.  When code explodes in a loop, you have no idea what state led-up to that explosion.  Does that mean that loops are &#8220;bad&#8221;?  No.  It simply means that what we want is not a stack-trace, but rather information about what led up to the failure.</div>
<div></div>
<div>For some classes of code, stack-traces provide that fairly economically.  The catch is that other types of code don&#8217;t benefit from them at all.  Guido&#8217;s statement that you can trivially rewrite any TRE function as a loop is very practical, but it actually detracts from his point.  It&#8217;s pretty clear that the type of code that benefits from tail recursion doesn&#8217;t benefit from stack-traces.  This means that effectively he&#8217;s deciding that Python just doesn&#8217;t tailor to a certain type of code.  I&#8217;m mildly opposed to this and I think there&#8217;s a good case for a type of TRE in Python.</div>
<div></div>
<div>Taking the second point, Guido has this right.  The fact that there is code that would explode without TRE is a good reason not to just add it to the language.  That said, it doesn&#8217;t mean that we shouldn&#8217;t do it.  In fact, it is largely an argument to do so in the main Python runtime.  If anything, fragmenting the Python codebase is negative.  However, TRE tailors to a certain type of code, and the fragmenting effect of that reality means that he is really choosing between fragmenting the Python codebase and driving people to other languages that handle the use-case better.  He might be okay with that, but I don&#8217;t really believe it to be necessary.</div>
<div></div>
<div>Taking the third point, talking about the &#8220;basis of all programming&#8221; is a little tough.  From a very high level, design a language without recursion.  What&#8217;s left that defines programming?  In all seriousness, I think that the statement that &#8220;recursion&#8221; is the basis for all programming has a strong case assuming that you mean &#8220;recursion&#8221; in terms of the function call (or subroutine, or whatever you call it).</div>
<div></div>
<div>Without functions, you don&#8217;t really have anything but a long list of instructions.  All control statements are pretty much functions or branches.  Branches without the concept of subroutine are effectively <span class="Apple-style-span" style="font-family:'courier new';">goto</span> statements, which have always been as controversial as they can be useful.  The point being that TRE allows you to turn one of the most fundamental constructs of programming and use it in a way that increases its utility.  If recursion isn&#8217;t the basis of all programming, it&#8217;s still pretty fundamental.</div>
<div></div>
<div>Addressing the final point, I recall part of the Zen of Python, &#8220;Explicit is better than implicit.&#8221;  The statement that Python has difficulty (at compile time) determining whether a call is recursion is a good one.  There&#8217;s a really simple solution to this.  Add a keyword to make tail-recursion explicit.  Perhaps we could propose abusing the pass keyword.  Basically, where <span class="Apple-style-span" style="font-family:'courier new';">pass</span> is used now, consider it to mean &#8220;<span class="Apple-style-span" style="font-family:'courier new';">pass None</span>&#8220;.  The idea is that it is either passed a function call or None to indicate tail recursion.  The nice bit of magic here is that it reuses an existing keyword compatibly, clearly indicates what&#8217;s happening, easily translates to bytecode, and works really well for TRE&#8217;s most powerful use-case (coroutines).</div>
<div></div>
<div>So, as an example, consider the following code:</div>
<div></div>
<div></div>
<blockquote><div><span class="Apple-style-span" style="font-family:'courier new';"><span class="Apple-style-span" style=" ;font-family:Georgia;">
<div><span class="Apple-style-span" style="font-family:'courier new';">class <span class="Apple-style-span" style="font-weight: bold;">cli</span>:</span></div>
<div><span class="Apple-style-span" style="font-family:'courier new';">  def <span class="Apple-style-span" style="font-weight: bold;">start</span>(self):</span></div>
<div><span class="Apple-style-span" style="font-family:'courier new';">    print &#8220;Welcome to the CLI&#8221;</span></div>
<div><span class="Apple-style-span" style="font-family:'courier new';">    pass <span class="Apple-style-span" style="font-style: italic;">self</span>.loop()</span></div>
<div><span class="Apple-style-span" style="font-family:'courier new';"><br /></span></div>
<div><span class="Apple-style-span" style="font-family:'courier new';">  def <span class="Apple-style-span" style="font-weight: bold;">main</span>(self):</span></div>
<div><span class="Apple-style-span" style="font-family:'courier new';">    print_prompt()</span></div>
<div><span class="Apple-style-span" style="font-family:'courier new';">    cmd,args = parse_line()</span></div>
<div><span class="Apple-style-span" style="font-family:'courier new';">    cmd = getattr(self,&#8217;cmd_&#8217; + cmd,None)</span></div>
<div><span class="Apple-style-span" style="font-family:'courier new';">    if cmd is not None and callable(cmd):</span></div>
<div><span class="Apple-style-span" style="font-family:'courier new';">      pass cmd(*args)</span></div>
<div><span class="Apple-style-span" style="font-family:'courier new';">    else:</span></div>
<div><span class="Apple-style-span" style="font-family:'courier new';">      print &#8220;Command not found&#8221;</span></div>
<div><span class="Apple-style-span" style="font-family:'courier new';">    pass self.start()</span></div>
<div><span class="Apple-style-span" style="font-family:'courier new';"><br /></span></div>
<div><span class="Apple-style-span" style="font-family:'courier new';">  def <span class="Apple-style-span" style="font-weight: bold;">cmd_help</span>(self):</span></div>
<div><span class="Apple-style-span" style="font-family:'courier new';">    &#8230;</span></div>
<div><span class="Apple-style-span" style="font-family:'courier new';">    pass self.main()</span></div>
<div><span class="Apple-style-span" style="font-family:'courier new';"><br /></span></div>
<div><span class="Apple-style-span" style="font-family:'courier new';">&#8230;</span></div>
<p></span></span></div>
</blockquote>
<div></div>
<div></div>
<div>The above code may seem slightly convoluted, but it&#8217;s actually interesting because it tackles one use-case that Python is bad at.  Admittedly, the above could have been factored as a loop, but the more steps you insert into the process, the uglier it gets.  What is the purpose of continually having to implement some sort of mini-scheduler in a  loop?  Why have all this convoluted logic that has to handle a random series of states and detect an &#8220;end-state&#8221;.  This is just simpler, and more importantly &#8220;Beautiful is better than ugly.&#8221;</div>
<div></div>
<div>Critics might say that loops give you an easier understanding of the top-level flow of the program.  I would contend that any problem that needs the above technique would instead result in a loop so complex that it would generally serve to reduce the understanding of the problem&#8211;replete with various <span class="Apple-style-span" style="font-family:'courier new';">if</span>s, <span class="Apple-style-span" style="font-family:'courier new';">return</span>s, <span class="Apple-style-span" style="font-family:'courier new';">while</span>s, and <span class="Apple-style-span" style="font-family:'courier new';">break</span>s.</div>
<div></div>
<div>In assembly, C, or any number of other systems, this would have been implemented with <span class="Apple-style-span" style="font-family:'courier new';">goto</span> statements.  The problem with <span class="Apple-style-span" style="font-family:'courier new';">goto</span> statements is that they very easily obscure the boundaries of single bits of code and can poorly document the intent of the <span class="Apple-style-span" style="font-family:'courier new';">goto</span>.  This is a nice abstraction that allows the use of <span class="Apple-style-span" style="font-family:'courier new';">goto</span>-like functionality without losing information about what&#8217;s supposed to be going on.  There comes a point where the above would get factored into a general state machine implementation, but it&#8217;s not really necessary.</div>
<div></div>
<div>Another thing to notice about the above is that it gives you a really good point for debugging.  Any Python implementation of the above type of problem would not have stack-traces to debug.  However, the <span class="Apple-style-span" style="font-family:'courier new';">pass</span> statement gives you a place to track behavior.  In a debugger it&#8217;s pretty clear what&#8217;s going on.  At the beginning of each iteration, the function arguments clearly define the state of execution.</div>
<div></div>
<div>This is something that is much more useful that implementing this with a loop.  With a loop, the state is invisibly contained in the current binding namespace.  Temporary values easily leak.  There&#8217;s not a clear point where the state of the iteration is distilled.  This is why people want TRE.</div>
<div></div>
<div>There are just a lot of situations where people would benefit from greater control over the constructs of flow control.  Right now we&#8217;ve already abrogated the model of nested-call-return with generators.  Most control structures that are difficult in Python could benefit from further disentangling the assumptions of function calls.</div>
<div></div>
<div>Someday, I would love to see the work that was started with generators end with easy coroutines, promises / lazy evaluation, message passing, and smarter code replacement.  Every language has idioms for what a recursion or evaluation means.  We have the opportunity to make this handling explicit, and I suspect that we would benefit from it.</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://souja.net/2009/04/on-tail-recursion-elimination/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>
