<?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>Artful Code</title>
	<atom:link href="http://www.artfulcode.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.artfulcode.net</link>
	<description>Resources and tips for dynamic, interactive languages.</description>
	<lastBuildDate>Fri, 09 Sep 2011 02:15:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Newlisp modules</title>
		<link>http://www.artfulcode.net/articles/newlisp-modules/</link>
		<comments>http://www.artfulcode.net/articles/newlisp-modules/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 02:13:30 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Site news]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[newlisp]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/articles/newlisp-modules/</guid>
		<description><![CDATA[The newlisp modules, including web.lsp, are now being maintained actively by Kanen Flowers on github. Thank you, Kanen. I have not had much time to work on any personal projects between family and work, so I appreciate his stewardship tremendously. You can check out his site at ScruffyThinking.com. Submit article]]></description>
			<content:encoded><![CDATA[<p>The newlisp modules, including web.lsp, are now being maintained actively by Kanen Flowers on <a href="https://github.com/LifeZero/artful-newlisp">github</a>. Thank you, Kanen. I have not had much time to work on any personal projects between family and work, so I appreciate his stewardship tremendously. You can check out his site at <a href="http://www.scruffythinking.com"  alt="ScruffyThinking.com">ScruffyThinking.com</a>.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-modules%2F&amp;title=Newlisp+modules" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-modules%2F&amp;title=Newlisp+modules" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Newlisp+modules&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-modules%2F&amp;title=Newlisp+modules" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-modules%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-modules%2F&amp;title=Newlisp+modules" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-modules%2F&amp;title=Newlisp+modules" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-modules%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Newlisp+modules+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnewlisp-modules%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/newlisp-modules/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fixed &#8211; Blackberry OS 7</title>
		<link>http://www.artfulcode.net/articles/fixed-blackberry-os-7/</link>
		<comments>http://www.artfulcode.net/articles/fixed-blackberry-os-7/#comments</comments>
		<pubDate>Thu, 08 Sep 2011 16:05:18 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Soap box]]></category>
		<category><![CDATA[blackberry]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/articles/fixed-blackberry-os-7/</guid>
		<description><![CDATA[I just bought the Blackberry Bold 9930 with OS 7' newly available from Verizon (I have heard that the Torch will be available later this week). After some very hairy experiences with OS 6, I was both excited and anxious to experience the new OS on a handset with the hardware to run it well.]]></description>
			<content:encoded><![CDATA[<p>I just bought the Blackberry Bold 9930 with OS 7 newly available from Verizon (I have heard that the Torch will be available later this week). After some very hairy experiences with OS 6, I was both excited and anxious to experience the new OS on a handset with the hardware to run it well.<span id="more-846"></span></p>
<p>My initial impression is good. After a bit of difficulty related to the new App World 3 (I recommend sticking with v2 for now), my data and applications are restored and I am chugging away.</p>
<p><strong>The keyboard</strong></p>
<p>While most smart phones now use soft keys, I still prefer the Bold&#8217;s hardware keyboard. Those who share the preference will absolutely <em>love</em> the new Bold&#8217;s keyboard. For one thing, it is larger and wider, with a slight curve, making it easier to reach the keys on the outside. It feels very nice to use as well. Many will scoff, but I think that this is just about its most attractive feature; after all, the keyboard is so integral to the Bold experience that it makes a disproportionate difference in the &#8220;feel&#8221; of the phone.</p>
<p><strong>Touch Screen</strong></p>
<p>The touch screen is pleasantly surprising. The screen itself is crisp and bright, and very touch responsive. I was not a big fan of the new layout on OS 6, but with the touch screen it is quite easy and even efficient to use.</p>
<p>The screen is also slightly larger with a better resolution. Users of the Torch or other smart phones won&#8217;t see it, but Tour/Bold and Curve users will appreciate the boost in screen real estate.</p>
<p><strong>The OS</strong></p>
<p>OS 7 deals with most of the issues I had with OS 6. It is much faster, in part due to the new phone&#8217;s hardware. Transitions and effects are now hardware-accelerated, reducing the time (and power) required to process them. Not only is it faster than the slow, bogged down experience I had with OS 6, but it is snappier and more responsive than any BB I have owned to date. Even the Desktop-based interactions, like backups and sync, are much faster.</p>
<p>Additionally, universal search is faster and indexes much more quickly. Once painful to use in OS 6, it is now the fastest way to find applications and messages.</p>
<p><strong>Battery life</strong></p>
<p>Blackberry has always been king of battery life. No other smart phone ever comes close to a BlackBerry, and that has traditionally been one of the (extremely few) advantages of shipping much slower hardware.</p>
<p>That said, the new Bold has a smaller battery than my last Bold (the 9650), but appears to last every bit as long. Whether it is due to efficiency gains in the software or the faster hardware, it has made a difference.</p>
<p>It is not intuitive, but just as a heavier vehicle will use more gas with an under powered-engine, software can draw a lot of power when the hardware cannot keep up. This is especially true of embedded programming, where the environment places such constraints on resources. My suspicion is that the combination of GPU-accelerated graphics and better reception are helping to keep the OS from pegging the CPU so heavily. In any case, it is a welcome enhancement.</p>
<p><strong>The ugly</strong></p>
<p>I still can&#8217;t send pictures or video directly from the browser. You can only send or post a link, or go to the trouble of saving the file, sending it, and deleting it. I would not think it should be too hard to add this feature, and a number of folks miss it. It is one of those &#8220;super app&#8221; features that make BB pleasant to use. It saves time by linking apps tightly.</p>
<p><strong>Conclusion</strong></p>
<p>If you have been hanging onto your old Bold or Tour because of OS 6, now is the time to upgrade. It is well worth the money (to me, anyway) to get the new Bold 9930. it is everything I had hoped that my last phone would be, and BB users are going to love it. It is good to see RIM roll with the punches and get back up again.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Ffixed-blackberry-os-7%2F&amp;title=Fixed+%26%238211%3B+Blackberry+OS+7" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Ffixed-blackberry-os-7%2F&amp;title=Fixed+%26%238211%3B+Blackberry+OS+7" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Fixed+%26%238211%3B+Blackberry+OS+7&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Ffixed-blackberry-os-7%2F&amp;title=Fixed+%26%238211%3B+Blackberry+OS+7" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Ffixed-blackberry-os-7%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Ffixed-blackberry-os-7%2F&amp;title=Fixed+%26%238211%3B+Blackberry+OS+7" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Ffixed-blackberry-os-7%2F&amp;title=Fixed+%26%238211%3B+Blackberry+OS+7" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Ffixed-blackberry-os-7%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Fixed+%26%238211%3B+Blackberry+OS+7+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Ffixed-blackberry-os-7%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/fixed-blackberry-os-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My thoughts on Blackberry OS 6</title>
		<link>http://www.artfulcode.net/articles/my-thoughts-on-blackberry-os-6/</link>
		<comments>http://www.artfulcode.net/articles/my-thoughts-on-blackberry-os-6/#comments</comments>
		<pubDate>Mon, 16 May 2011 01:32:12 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Soap box]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[blackberry]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/?p=840</guid>
		<description><![CDATA[I have been using Blackberry OS 6 on my Bold 9650 (pre-installed) for a few weeks. I love some of the new functionality, especially search and the new context menus. Search works very similarly to Spotlight on OSX. The new context menus do a good job of splitting common contextual options out of the BB menu. I also like the quicker boot time.]]></description>
			<content:encoded><![CDATA[<p>I have been using Blackberry OS 6 on my Bold 9650 (pre-installed) for a few weeks. I love some of the new functionality, especially search and the new context menus. Search works very similarly to Spotlight on OSX. The new context menus do a good job of splitting common contextual options out of the BB menu. I also like the quicker boot time.<span id="more-840"></span></p>
<p>It feels pretty top heavy, though. I think they tried to bolt the QNX UI on top of BB OS, but without the power and efficiency underneath the hood to make it perform adequately on my handset. The 9650 seems high end for OS 5 but low end for OS 6. Some of the rendering, smooth scrolling, and transparency effects really bog down the system, at least on the 9650’s hardware.</p>
<p>The only other real problem I have with it is that it is missing a feature I really like from OS 5 &#8211; the ability to send a picture via MMS directly from the browser.</p>
<p>For a while, I used an OS 5 theme which eliminated many of the more expensive UI elements, like app tabs, but at some point I lost the ability to use themes, even after a clean install.</p>
<p>So for now, I’m back to OS 5, and my phone is much snappier again. Oh well. Better to be a big fish in a little pond, I suppose.</p>
<p>&nbsp;</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fmy-thoughts-on-blackberry-os-6%2F&amp;title=My+thoughts+on+Blackberry+OS+6" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fmy-thoughts-on-blackberry-os-6%2F&amp;title=My+thoughts+on+Blackberry+OS+6" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=My+thoughts+on+Blackberry+OS+6&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fmy-thoughts-on-blackberry-os-6%2F&amp;title=My+thoughts+on+Blackberry+OS+6" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fmy-thoughts-on-blackberry-os-6%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fmy-thoughts-on-blackberry-os-6%2F&amp;title=My+thoughts+on+Blackberry+OS+6" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fmy-thoughts-on-blackberry-os-6%2F&amp;title=My+thoughts+on+Blackberry+OS+6" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fmy-thoughts-on-blackberry-os-6%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+My+thoughts+on+Blackberry+OS+6+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fmy-thoughts-on-blackberry-os-6%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/my-thoughts-on-blackberry-os-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blackberry Bridge and the Playbook</title>
		<link>http://www.artfulcode.net/articles/blackberry-bridge-and-the-playbook/</link>
		<comments>http://www.artfulcode.net/articles/blackberry-bridge-and-the-playbook/#comments</comments>
		<pubDate>Mon, 02 May 2011 23:44:32 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Soap box]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[blackberry]]></category>
		<category><![CDATA[playbook]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[rim]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/?p=832</guid>
		<description><![CDATA[After silently drooling over the usefulness of my wife's iPad for the last few months, I finally gave in to temptation and decided to get a tablet. Of course, being a Blackberry man, I was ecstatic about the release of the Playbook. The Playbook OS is QNX, and ultra fast, light-weight, real time unix that I have been a fan of since college. I always felt that it would have been a wonderful system for Apple to have built OSX on, but it seems that Blackberry at least gets to beat Apple to the punch on something, anyway.]]></description>
			<content:encoded><![CDATA[<p>After silently drooling over the usefulness of my wife&#8217;s iPad for the last few months, I finally gave in to temptation and decided to get a tablet. Of course, being a Blackberry man, I was ecstatic about the release of the Playbook. The Playbook OS is QNX, and ultra fast, light-weight, real time unix that I have been a fan of since college. I always felt that it would have been a wonderful system for Apple to have built OSX on, but it seems that Blackberry at least gets to beat Apple to the punch on something, anyway. <span id="more-832"></span></p>
<p>The Playbook has suffered from a rash of poor reviews, largely due to the lack of apps and RIM&#8217;s decision to release without  the native PIM suite ready. These things obviously detract from the experience, especially the absence of email and messaging software.</p>
<p>I try to take the long view, though. This is a brand new tablet platform, and software environment will eventually get a complete host of apps, some useful, some not, just as is the case with the Apple app store as well as the Android marketplace. For the moment, though, it is mostly filled with what appear to be very mediocre experiments with the platform. Very few are worth the money at the moment.</p>
<p>The system is very slick, though. The navigation becomes very natural with very little effort, and the browser is lightening fast. The bridge functionality is excellent, although it will frustrate the unenlightened (read: non-Blackberry users) that it requires a Blackberry hand set to use.</p>
<p>Bridge is extremely cool. It gets overlooked as a stop-gap until RIM releases the official, native PIM, but it gives Blackberry users something important that a more typical suite might easily overlook. Messages are pushed to a Blackberry, rather than synchronized, as is the case with IMAP. Bridge maintains control over those messages on the hand held, rather than the tablet. That&#8217;s the right way, because a phone is going to stay with you much more than a tablet (new toy syndrome notwithstanding).</p>
<p>Bridge gives me an extra piece of awesome, too. The Bridge Browser, while not running at native speed, provides a decent web experience without tethering charges. That not only saves me money, but it keeps me feeling young by letting me pretend that I am sticking it to the man, and you just can&#8217;t put a price on that.</p>
<p>Therefore, I really hope that bridge is not condemned once RIM releases their PIM suite. I really want to see them add to it and give it the polish that RIM is so good at. I hope it continues as a special extra for BB users, and becomes fully integrated, which is one of the major areas of polish were RIM lords it over the competition</p>
<p>On another note, I also very humbly ask that whoever is in charge of the keyboard make it behave exactly as it does on my Blackberry. I am tired of having to type apostrophes and capitalize with a separate button, thank you very much.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fblackberry-bridge-and-the-playbook%2F&amp;title=Blackberry+Bridge+and+the+Playbook" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fblackberry-bridge-and-the-playbook%2F&amp;title=Blackberry+Bridge+and+the+Playbook" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Blackberry+Bridge+and+the+Playbook&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fblackberry-bridge-and-the-playbook%2F&amp;title=Blackberry+Bridge+and+the+Playbook" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fblackberry-bridge-and-the-playbook%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fblackberry-bridge-and-the-playbook%2F&amp;title=Blackberry+Bridge+and+the+Playbook" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fblackberry-bridge-and-the-playbook%2F&amp;title=Blackberry+Bridge+and+the+Playbook" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fblackberry-bridge-and-the-playbook%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Blackberry+Bridge+and+the+Playbook+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fblackberry-bridge-and-the-playbook%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/blackberry-bridge-and-the-playbook/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hacking Vim</title>
		<link>http://www.artfulcode.net/articles/hacking-vim/</link>
		<comments>http://www.artfulcode.net/articles/hacking-vim/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 02:18:03 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[vim software]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/?p=825</guid>
		<description><![CDATA[Vim has the potential to dramatically increase a programmer's productivity if you have the time and wherewithal to learn it. And it is a challenge to learn because it is unlike any other text editor (leaving aside other vi clones). It takes work not only to learn the editor's features and commands, but also to train yourself to use them effectively. Even experienced vim users will discover new, exciting features from time to time. And that is what makes Hacking Vim a real treat. It takes you on a brief tour of some of the coolest features of vim without getting bogged down in any one of them.]]></description>
			<content:encoded><![CDATA[<p>Vim has the potential to dramatically increase a programmer&#8217;s productivity if you have the time and wherewithal to learn it. And it is a challenge to learn because it is unlike any other text editor (leaving aside other vi clones). It takes work not only to learn the editor&#8217;s features and commands, but also to train yourself to use them effectively. Even experienced vim users will discover new, exciting features from time to time. And that is what makes <a href="https://www.packtpub.com/Vim/book">Hacking Vim</a>, by Kim Schulz, a real treat. It takes you on a brief tour of some of the coolest features of vim without getting bogged down in any one of them.<span id="more-825"></span></p>
<p>Hacking Vim bills itself as a recipe book. While it provides quite a few good ones, it seems to be organized more like a tutorial, using the examples to walk through some of the cooler features of vim. That said, the recipes it provides are very useful and a good number have made it into my ~/.vimrc.</p>
<p>I found some examples to be overly contrived. The author could have done a better job relating samples to real-world situations. I also wish it had gone into more depth when explaining some examples early on. If you don&#8217;t skip ahead and read the section on vim scripting (or know it already), there are a few traps in the examples.</p>
<p>For all that, though, my now heavily dog-eared and ruffled copy was well worth the money. Like other books from the same publisher, Hacking Vim stays on subject, maintaining its focus and pragmatism. Definitely a good source of worthwhile tips.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fhacking-vim%2F&amp;title=Hacking+Vim" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fhacking-vim%2F&amp;title=Hacking+Vim" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Hacking+Vim&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fhacking-vim%2F&amp;title=Hacking+Vim" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fhacking-vim%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fhacking-vim%2F&amp;title=Hacking+Vim" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fhacking-vim%2F&amp;title=Hacking+Vim" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fhacking-vim%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Hacking+Vim+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fhacking-vim%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/hacking-vim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>goto statement considered</title>
		<link>http://www.artfulcode.net/articles/goto-statement-considered/</link>
		<comments>http://www.artfulcode.net/articles/goto-statement-considered/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 03:09:40 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Soap box]]></category>
		<category><![CDATA[goto]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/?p=816</guid>
		<description><![CDATA[Everyone knows not to use goto, right?  Dijkstra's words on the subject have risen to the level of gospel in the programming community. Not that I do not completely agree... in most cases.]]></description>
			<content:encoded><![CDATA[<p>Everyone knows not to use goto, right?  Dijkstra&#8217;s words on the subject have risen to the level of gospel in the programming community. Not that I do not completely agree&#8230; in most cases.<span id="more-816"></span></p>
<p>I have to admit that I occasionally resort to goto myself. This week was one such an occasion. But before you pick up your torch and farming implement of choice and join the mob heading for my castle gates, please consider that  Dijkstra&#8217;s letter was complaining about unrestricted goto, which was a popular feature of languages at the time. It was an unstructured precursor of the subroutine and structured programming, which put goto on a leash and taught it not to bark at the neighbors. In restricting goto to local jumps, as most modern languages supporting the feature do, the beast became much less fearsome. In fact, a while loop is just a structured goto, as is try/catch (albeit with a little extra magic.)</p>
<p>Perl, of course, does not impose such restrictions on a programmer (although it does prohibit jumping into blocks that require initialization, such as other functions.) With a little discipline, though, goto is a feature and quite useful. It can be used to make extremely complex loops explicit and easy to follow as well as allow a loop to break to any outer loop in the current call stack.</p>
<p>As an example, I recently wrote a function to increment a string of arbitrary alphanumeric characters, where letters must maintain their case but increment as base-26 numbers and numbers increment normally (base 10). For example, if a letter increments past z, it becomes a and the next character to the left is then incremented. The increment logic fit into a function that took two of these strings and calculated all possible values in between to support some limited set operations against two alphanumeric ranges.</p>
<p>My original code for the increment logic was grisly at best. It took a series of nested while loops and state variables that were incremented or decremented as needed. I avoided recursion because the sequences were of arbitrary length. Breaking the code into subroutines made it more complex to maintain loop state. Using goto allowed me to break apart the logic into blocks without the overhead or state-passing necessary to shoehorn the logic into subroutines. I was able to label each part clearly and jump between them as needed to increment or &#8220;carry the 1.&#8221; I reduced the size of the code to just a couple dozen lines, including safety checks, and found that the goto code was much easier to read and reason about.</p>
<p>That said, I want to emphasize strongly that goto should be kept local. Jumping to outer function calls makes the logic of a program difficult to reason about and changes scope in confusing ways. But as a way of structuring complex loops and iterative logic, you just can&#8217;t beat goto.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fgoto-statement-considered%2F&amp;title=goto+statement+considered" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fgoto-statement-considered%2F&amp;title=goto+statement+considered" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=goto+statement+considered&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fgoto-statement-considered%2F&amp;title=goto+statement+considered" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fgoto-statement-considered%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fgoto-statement-considered%2F&amp;title=goto+statement+considered" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fgoto-statement-considered%2F&amp;title=goto+statement+considered" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fgoto-statement-considered%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+goto+statement+considered+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fgoto-statement-considered%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/goto-statement-considered/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>New projects and updates</title>
		<link>http://www.artfulcode.net/articles/new-projects-and-updates/</link>
		<comments>http://www.artfulcode.net/articles/new-projects-and-updates/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 19:37:38 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Site news]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/?p=803</guid>
		<description><![CDATA[Just a few updates and some new projects. newLISP modules A Google Code project has been created for my newLISP modules. Anyone who would like to contribute is welcome. It can be found at http://code.google.com/p/actools-newlisp/. Phorms The Phorms library also has a Google Project page, located at http://code.google.com/p/php-phorms/. Contributions, as always, are welcome. PHP Pipeline [...]]]></description>
			<content:encoded><![CDATA[<p>Just a few updates and some new projects.</p>
<p><strong>newLISP modules</strong></p>
<p>A Google Code project has been created for my newLISP modules. Anyone who would like to contribute is welcome. It can be found at <a href="http://code.google.com/p/actools-newlisp/">http://code.google.com/p/actools-newlisp/</a>.</p>
<p><strong>Phorms</strong></p>
<p>The Phorms library also has a Google Project page, located at <a href="http://code.google.com/p/php-phorms/">http://code.google.com/p/php-phorms/</a>. Contributions, as always, are welcome.</p>
<p><strong>PHP Pipeline</strong></p>
<p>PHP Pipeline is an asynchronous HTTP pool. It is very simple to use and extremely efficient on resources. Code and samples available at <a href="http://code.google.com/p/php-pipeline/">http://code.google.com/p/php-pipeline/</a>.</p>
<p><strong>JoQ</strong></p>
<p><a href="http://code.google.com/p/joq/">JoQ</a> is a simple message broker written in Java. Its design goals are efficiency, speed, and ease of use. It is optimized for use as a massive job queue for multiple work flows. One neat feature is the ability to create multiple queues on the fly and add jobs to multiple queues; retrieved jobs are removed from all queues in which they appear.</p>
<p>This is a fairly new project and there is not much code yet written, but if anyone has any suggestions, comments, or contributions, I am happy to hear them.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnew-projects-and-updates%2F&amp;title=New+projects+and+updates" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnew-projects-and-updates%2F&amp;title=New+projects+and+updates" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=New+projects+and+updates&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnew-projects-and-updates%2F&amp;title=New+projects+and+updates" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnew-projects-and-updates%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnew-projects-and-updates%2F&amp;title=New+projects+and+updates" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnew-projects-and-updates%2F&amp;title=New+projects+and+updates" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnew-projects-and-updates%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+New+projects+and+updates+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fnew-projects-and-updates%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/new-projects-and-updates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The rebirth of the BBS</title>
		<link>http://www.artfulcode.net/articles/the-rebirth-of-the-bbs/</link>
		<comments>http://www.artfulcode.net/articles/the-rebirth-of-the-bbs/#comments</comments>
		<pubDate>Fri, 14 Aug 2009 17:56:24 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Soap box]]></category>
		<category><![CDATA[culture]]></category>
		<category><![CDATA[social networking]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/?p=777</guid>
		<description><![CDATA[A few of us are old enough to remember the days before the Internet, when "online" meant you had Prodigy, AOL, or CompuServe. Some of us are venerable enough to predate even those dinosaurs and recall the age of 300 baud modems, Telix, typing ATDT into the terminal, and local BBSes with names like Gunner's Grotto and Elfstone (and if you recognize those two, you probably know where I lived in high school). I spent quite a few late nights chatting on the Grotto, a lavish MajorBBS with more than a dozen phone lines on rotary. I remember getting that brand new 9600 baud modem and being awed by its speed.]]></description>
			<content:encoded><![CDATA[<p>A few of us are old enough to remember the days before the Internet, when &#8220;online&#8221; meant you had Prodigy, AOL, or CompuServe. Some of us are venerable enough to predate even those dinosaurs and recall the age of 300 baud modems, Telix, typing ATDT into the terminal, and local BBSes with names like Gunner&#8217;s Grotto and Elfstone (and if you recognize those two, you probably know where I lived in high school). I spent quite a few late nights chatting on the Grotto, a lavish MajorBBS with more than a dozen phone lines on rotary. I remember getting that brand new 9600 baud modem and being awed by its speed.<span id="more-777"></span></p>
<h3>At the dawn of time&#8230;</h3>
<p>The old BBS is terribly antiquated by today&#8217;s standards. A <em>sysop</em> (or webmaster for you young folk) would dedicate perhaps half a dozen phone lines to their server, running MajorBBS (which was not a PHP-powered forum), Angelfire (which was not a defunct web hosting company), or Wildcat. Each had their strong points, but they usually had some form of user-to-user chat, in-system messaging, file sharing, and games (who remembers spending all night playing <strong>Legend of the Red Dragon </strong>or <strong>Tradewars</strong>?)</p>
<p>The Internet freed us from this more intimate world. Email now worked between all systems, and in-house email either conformed or disappeared. Prodigy and CompuServe died, while AOL adapted (for a while, anyway). Files could be shared simply and quickly, and anyone with basic knowledge of HTML and an ad-supported account somewhere could participate.</p>
<h3>Modern day</h3>
<p>These days it&#8217;s for granted that everyone and everything is connected. With Twitter, even an everyday Joe can be sure that all of their friends are kept up to date on how much they are enjoying that ham sandwich.</p>
<p>The social networking trend is interesting to me because I see it as a shift back to the more intimate realm of the BBS. Counter to the culture of full exposure engendered by the Internet, folks are gravitating toward sites that provide a more limited experience. Even the most curmudgeonly of us grudgingly accept Facebook and use it to filter our social lives online.</p>
<p>Networking sites provide a safe haven &#8211; a controlled community, much in the style of the old BBS. We prefer their primitive messaging to full-featured email clients when communicating with our friends and family, not because we are Luddites, but because it is more personal. There is something quite uncomfortable about sending your mother an email at hotmomma288@yahoo.com.</p>
<h3>Looking back</h3>
<p>This is something of a rehash of an article I wrote <a title="Social Networks" href="/articles/social-networks/">last year</a>. In fact, reading back, I even took the same grumpy tone :). I was a bit late signing up for Facebook, but I have to admit that I enjoy it. Now, if they could just port <strong>Legend of the Red Dragon</strong> over&#8230;</p>
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fthe-rebirth-of-the-bbs%2F&amp;title=The+rebirth+of+the+BBS" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fthe-rebirth-of-the-bbs%2F&amp;title=The+rebirth+of+the+BBS" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=The+rebirth+of+the+BBS&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fthe-rebirth-of-the-bbs%2F&amp;title=The+rebirth+of+the+BBS" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fthe-rebirth-of-the-bbs%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fthe-rebirth-of-the-bbs%2F&amp;title=The+rebirth+of+the+BBS" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fthe-rebirth-of-the-bbs%2F&amp;title=The+rebirth+of+the+BBS" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fthe-rebirth-of-the-bbs%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+The+rebirth+of+the+BBS+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fthe-rebirth-of-the-bbs%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/the-rebirth-of-the-bbs/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>From TextMate to Vim</title>
		<link>http://www.artfulcode.net/articles/from-textmate-to-vim/</link>
		<comments>http://www.artfulcode.net/articles/from-textmate-to-vim/#comments</comments>
		<pubDate>Mon, 03 Aug 2009 15:13:06 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[textmate]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/?p=756</guid>
		<description><![CDATA[TextMate is an excellent editor, but it is beginning to show its age. It has a few squeaky wheels that have yet to be oiled, and it looks as though the author may be getting bogged down in the minutiae of his next release. With the next version apparently due sometime after the colonization of Mars, it seemed an auspicious time to try out another editor.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.macromates.com">TextMate</a> is an excellent editor, but it is beginning to show its age. It has a few squeaky wheels that have yet to be oiled, and it looks as though the author may be getting bogged down in the minutiae of his next release. With the <a href="http://blog.macromates.com/2009/working-on-it/">next version</a> apparently due sometime after the colonization of Mars, it seemed an auspicious time to try out another editor.<span id="more-756"></span></p>
<h3>What I like about TextMate</h3>
<p>Let me repeat that I like TextMate. I have happily used it for years. It has some wonderful features. It is reasonably fast and its indentation is great. It has a great selection of plugins for a wide variety of languages and is easy to extend with new language modules. It has a decent macro system based on regular expressions that, while not nearly as powerful as scripted editors, provides 80% of what most users need.</p>
<h3>Problems with TextMate</h3>
<p>TextMate, for all its sterling qualities &#8211; and there are many &#8211; has a few problems that, while not deal-breakers in themselves, together provide a less-than-satisfactory experience.</p>
<h4>Split-windows</h4>
<p>This is a rather stark issue, and is a feature that has been promised in the next release. Nevertheless, its absence often means either filling my screen with open TextMate windows or firing up emacs when I need to look at many files at once &#8211; or many parts of the same file at once. C, in particular, tends toward long functions, and is especially painful to write in TextMate.</p>
<h4>Large files</h4>
<p>TextMate handles many open files well, but a single large file will hang the entire application. I can accept a large file taking a long time to load, but please! Load the file in the background, so that I can keep working. Even opening a large file in a second window blocks the entire application. Find and replace also choke on larger documents, sometimes taking minutes to complete.</p>
<h4>Key-bindings</h4>
<p>TextMate&#8217;s key-bindings can be puzzling. Many common commands (especially in Python), such as converting between spaces and tabs in a document, don&#8217;t have bindings and are several levels deep in the menu. Other commands of dubious utility are given simple bindings, such as &#8220;Execute line/selection inserting result&#8221; (control-R.) Many have extremely difficult combinations, such as control-alt-command-D to toggle to project drawer, or control-option-shift-P to toggle text mode (and then &#8211; because several bundles use this same key-binding, god knows why &#8211; you are given a drop-down to choose which command you wanted.)</p>
<h3>Choosing a new editor</h3>
<p>I was initiated into the cult of emacs in college and have used it for several years. I&#8217;ve played with BBEdit (which I think is horribly cluttered and completely lost in the pre-OSX world), NetBeans, and Eclipse (which is, amazingly, slower and clunkier than NetBeans.) I love emacs&#8217; extensibility and its indentation is second to none. It suffers from the key-binding issue as well, though. Becoming efficient in emacs is a journey, not a destination. I find myself spending more time navigating its arcane and bureaucratic configuration system than actually writing code in it.</p>
<p>NetBeans in some ways seems very polished, and the new Python module is very good (I have <a href="http://www.artfulcode.net/articles/python-in-netbeans/">written about this</a> before.) Refactoring across files is extremely useful. It has good debugger integration. Unfortunately, tight integration with any particular language costs a great deal in load times and can lead to an unresponsive UI. And for god&#8217;s sake &#8211; why does it have to be such a chore to open a file outside of a project?</p>
<p>Panic&#8217;s Coda is pretty and has some neat features, but in the end, SubEthaEdit (its editor) has poor syntax support and its extension system feels very clunky. Editra is nice, but <em>slow</em> and buggy on OSX.</p>
<h3>Vim</h3>
<p>After a disappointing look around the net for better choices, I decided to give Vim another try. I had a passing familiarity with some of its basic functionality from my days as a system administrator, it is scriptable, and it has a large number of plugins for syntax support.</p>
<h4>Lack of distractions</h4>
<p>Overall, I am satisfied with Vim&#8217;s minimalism. Its indentation is pretty second rate, but I can live with it. Vim feels extremely comfortable. Over the years, Vim has gently washed away all of the &#8220;features&#8221; of an editor that actually get in the programmer&#8217;s way and come up with a system that drastically increases productivity and makes coding a more satisfying experience.</p>
<h4>Load speed</h4>
<p>While not the primary measure of an editor, load time is important. How many programmers (myself included) give up on Eclipse or NetBeans right away because it takes more than half a minute to start up? Load time is one of those things that, while really just an annoyance, can completely color the experience of using a program. Vim loads quickly. It is one less thing to get in the way of productivity.</p>
<h4>Efficiency</h4>
<p>Nothing beats Vim for efficiency. If you ever wonder why so many applications have modes that mimic Vim, it is because once you learn Vim&#8217;s bindings, there is nothing faster. Jumping around a file with precision is a breeze. Coming from emacs, I expected it to take a lot longer to become comfortable with Vim&#8217;s style and bindings, but it has a much milder learning curve than emacs. Search and replace is also fast and easy to use. I quickly found myself giving up <a href="http://code.google.com/p/macvim/">MacVim</a> in favor of the command line. Copy and paste &#8211; the biggest barrier to command-line editors for me &#8211; is fast and easy with Vim&#8217;s visual mode.</p>
<h4>Other features</h4>
<p>Vim 7 has auto-complete, although I rarely use it. I&#8217;m much more comfortable with an enormous stack of O&#8217;Reilly books. Vim&#8217;s code folding is also very nice. I generally turn code folding off because it slows most editors down so drastically, but it does not appear to affect Vim.</p>
<p>Two of Vim&#8217;s features really stand out for me: reformatting text and retabbing a document. I love being able to convert a file&#8217;s tabs to spaces just by typing <code>:retab</code>. It is much more efficient than having to go through two levels of menus in TextMate. And being able to reformat Python doc strings is very useful. It removes an annoyance that can make updating documentation a real chore.</p>
<h3>Conclusion</h3>
<p>Vim strikes the perfect balance for me. At first glance, it seems archaic, especially for those born after the mouse became standard. After a few days of using it, though, I find myself enabling Vim bindings mode in any application that has it, using the <a href="https://addons.mozilla.org/en-US/firefox/addon/4891">Vimperator plugin for Firefox</a>, and wishing that OSX&#8217;s terminal was more easily scriptable. If you haven&#8217;t used Vim, give it a chance. Coming from a graphic editor like TextMate, it is a much different experience and, arguably, a more satisfying one.</p>
<p>Here are some other folks&#8217; experiences with the transition in both directions:</p>
<ul>
<li><a href="http://weblog.jamisbuck.org/2008/10/10/coming-home-to-vim">Coming home to Vim</a></li>
<li><a href="http://cosine.org/2007/08/25/vim-textmate/">From Vim to TextMate</a></li>
</ul>
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.
<p><strong>Edit [2009-08-03 15:50]:</strong> added links to similar stories</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Ffrom-textmate-to-vim%2F&amp;title=From+TextMate+to+Vim" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Ffrom-textmate-to-vim%2F&amp;title=From+TextMate+to+Vim" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=From+TextMate+to+Vim&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Ffrom-textmate-to-vim%2F&amp;title=From+TextMate+to+Vim" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Ffrom-textmate-to-vim%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Ffrom-textmate-to-vim%2F&amp;title=From+TextMate+to+Vim" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Ffrom-textmate-to-vim%2F&amp;title=From+TextMate+to+Vim" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Ffrom-textmate-to-vim%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+From+TextMate+to+Vim+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Ffrom-textmate-to-vim%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/from-textmate-to-vim/feed/</wfw:commentRss>
		<slash:comments>58</slash:comments>
		</item>
		<item>
		<title>Runtime ChoiceField filtering in Django&#8217;s admin</title>
		<link>http://www.artfulcode.net/articles/runtime-choicefield-filtering-in-djangos-admin/</link>
		<comments>http://www.artfulcode.net/articles/runtime-choicefield-filtering-in-djangos-admin/#comments</comments>
		<pubDate>Fri, 31 Jul 2009 13:34:03 +0000</pubDate>
		<dc:creator>Jeff</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.artfulcode.net/?p=741</guid>
		<description><![CDATA[Django 1.x brought with it much finer grained control over the admin application with admin forms and inline form sets. However, I still keep running into the same problem that I have since I started using Django &#8211; you cannot provide a limited queryset for a select field that depends on other instance variables. Take [...]]]></description>
			<content:encoded><![CDATA[<p>Django 1.x brought with it much finer grained control over the admin application with admin forms and inline form sets. However, I still keep running into the same problem that I have since I started using Django &#8211; you cannot provide a limited queryset for a select field that depends on other instance variables.<span id="more-741"></span></p>
<p>Take this trivial example:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">db</span> <span style="color: #ff7700;font-weight:bold;">import</span> models
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Sport<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    name = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;">50</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Season<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:
    starts = models.<span style="color: black;">DateField</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    ends = models.<span style="color: black;">DateField</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    sport = models.<span style="color: black;">ForeignKey</span><span style="color: black;">&#40;</span>Sport<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Team<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    name = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span>
    sport = models.<span style="color: black;">ForeignKey</span><span style="color: black;">&#40;</span>Sport<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Game<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    season = models.<span style="color: black;">ForeignKey</span><span style="color: black;">&#40;</span>Season<span style="color: black;">&#41;</span>
    home_team = models.<span style="color: black;">ForeignKey</span><span style="color: black;">&#40;</span>Team, related_name=<span style="color: #483d8b;">&quot;home_games&quot;</span><span style="color: black;">&#41;</span>
    away_team = modesl.<span style="color: black;">ForeignKey</span><span style="color: black;">&#40;</span>Team, related_name=<span style="color: #483d8b;">&quot;away_games&quot;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>In the admin change form for <code>Game</code>, it is obviously desirable to only permit teams to be selected that match the <code>Season</code>&#8216;s <code>Sport</code>. Unfortunately, because fields are defined on the <em>class</em> rather than the <em>instance</em> (such as inside of <code>__init__</code>), there is no obvious way to create a relationship based on the values in the instance.</p>
<p>Inside the <code>ModelAdmin</code> class is the method <code>get_formset(self, request, obj=None, **kwargs)</code>. The parameter <code>obj</code> stores the current instance, if any. The significance of this is that this method is a hook with access to the instance data and is called for every form as it is built.</p>
<p>That makes it possible to filter the <code>Teams</code> based on the current form&#8217;s instance.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span> <span style="color: #ff7700;font-weight:bold;">import</span> admin
<span style="color: #ff7700;font-weight:bold;">from</span> django <span style="color: #ff7700;font-weight:bold;">import</span> forms
<span style="color: #ff7700;font-weight:bold;">from</span> myapp.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> Team, Game
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> game_form_factory<span style="color: black;">&#40;</span>sport<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">class</span> RuntimeGameForm<span style="color: black;">&#40;</span>forms.<span style="color: black;">ModelForm</span><span style="color: black;">&#41;</span>:
        home_team = forms.<span style="color: black;">ModelChoiceField</span><span style="color: black;">&#40;</span>label=<span style="color: #483d8b;">&quot;Home&quot;</span>,
                queryset=Team.<span style="color: black;">objects</span>.<span style="color: #008000;">filter</span><span style="color: black;">&#40;</span>sport=sport<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        away_team = forms.<span style="color: black;">ModelChoiceField</span><span style="color: black;">&#40;</span>label=<span style="color: #483d8b;">&quot;Away&quot;</span>,
                queryset=Team.<span style="color: black;">objects</span>.<span style="color: #008000;">filter</span><span style="color: black;">&#40;</span>sport=sport<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">class</span> Meta:
            model = Game
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> RuntimeGameForm
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> GameAdmin<span style="color: black;">&#40;</span>admin.<span style="color: black;">modelAdmin</span><span style="color: black;">&#41;</span>:
    model = Game
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_formset<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, request, obj=<span style="color: #008000;">None</span>, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> obj <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">form</span> = game_form_factory<span style="color: black;">&#40;</span>obj.<span style="color: black;">season</span>.<span style="color: black;">sport</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>GameAdmin, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">get_formset</span><span style="color: black;">&#40;</span>request, obj, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span></pre></div></div>

<p>Here is how it works. When the <code>GameAdmin</code> form is built, <code>get_formset</code> is called. If this is an edit form (add form&#8217;s will not have instance data) the <code>Game</code> instance is passed as the <code>obj</code> parameter. In this case, the instance sets the form attribute to be the result of calling <code>game_form_factory</code>, which is a class factory function.</p>
<p>What if we want the <code>Game</code> form to be an inline form for the <code>Season</code> form? The major difference with inline form sets is that the instance passed to <code>get_formset</code> is now that of the parent form, rather than the form set model (in this case, <code>Season</code> instead of <code>Game</code>.)</p>
<p>The class factory function remains essentially unchanged. The <code>Game</code> admin model requires only a small change.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> GameAdminInline<span style="color: black;">&#40;</span>admin.<span style="color: black;">TabularInline</span><span style="color: black;">&#41;</span>:
    model = Game
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_formset<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, request, obj=<span style="color: #008000;">None</span>, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> obj <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">form</span> = game_form_factory<span style="color: black;">&#40;</span>obj.<span style="color: black;">sport</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># obj is a Season</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>GameAdminInline, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: black;">get_formset</span><span style="color: black;">&#40;</span>request, obj,
                <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span></pre></div></div>

<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Submit article</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fruntime-choicefield-filtering-in-djangos-admin%2F&amp;title=Runtime+ChoiceField+filtering+in+Django%26%238217%3Bs+admin" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fruntime-choicefield-filtering-in-djangos-admin%2F&amp;title=Runtime+ChoiceField+filtering+in+Django%26%238217%3Bs+admin" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Runtime+ChoiceField+filtering+in+Django%26%238217%3Bs+admin&amp;url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fruntime-choicefield-filtering-in-djangos-admin%2F&amp;title=Runtime+ChoiceField+filtering+in+Django%26%238217%3Bs+admin" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fruntime-choicefield-filtering-in-djangos-admin%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fruntime-choicefield-filtering-in-djangos-admin%2F&amp;title=Runtime+ChoiceField+filtering+in+Django%26%238217%3Bs+admin" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fruntime-choicefield-filtering-in-djangos-admin%2F&amp;title=Runtime+ChoiceField+filtering+in+Django%26%238217%3Bs+admin" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fruntime-choicefield-filtering-in-djangos-admin%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Runtime+ChoiceField+filtering+in+Django%26%238217%3Bs+admin+@+http%3A%2F%2Fwww.artfulcode.net%2Farticles%2Fruntime-choicefield-filtering-in-djangos-admin%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://www.artfulcode.net/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.artfulcode.net/articles/runtime-choicefield-filtering-in-djangos-admin/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

