<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Reflections of a computer linguist</title>
	<atom:link href="http://computerlinguist.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://computerlinguist.com</link>
	<description>The right tool isn't always the most familiar one...</description>
	<lastBuildDate>Tue, 09 Jun 2009 20:27:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='computerlinguist.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/efbe7d0e22cc8883ce1bc1fb12ca6632?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>Reflections of a computer linguist</title>
		<link>http://computerlinguist.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://computerlinguist.com/osd.xml" title="Reflections of a computer linguist" />
	<atom:link rel='hub' href='http://computerlinguist.com/?pushpress=hub'/>
		<item>
		<title>E-mail has changed. Our inboxes need to change, too.</title>
		<link>http://computerlinguist.com/2009/06/09/e-mail-has-changed-our-inboxes-need-to-change-too/</link>
		<comments>http://computerlinguist.com/2009/06/09/e-mail-has-changed-our-inboxes-need-to-change-too/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 20:22:06 +0000</pubDate>
		<dc:creator>computerlinguist</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://computerlinguist.com/?p=83</guid>
		<description><![CDATA[It&#8217;s true. Software designers are still thinking about e-mail wrong. I love Gmail, and have used Outlook, Live Mail, Apple Mail, Entourage, Postbox, Thunderbird, Xobni, and a few others. But everyone is still stuck in a decade-old rut.  E-mail is much more than a way for people to communicate. For freqent users of e-mail, it [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=computerlinguist.com&blog=4562296&post=83&subd=computerlinguist&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s true. Software designers are still thinking about e-mail wrong. I love Gmail, and have used Outlook, Live Mail, Apple Mail, Entourage, Postbox, Thunderbird, Xobni, and a few others. But everyone is still stuck in a decade-old rut. </p>
<p>E-mail is much more than a way for people to communicate.   For freqent users of e-mail, it becomes their personal queue as well. The next generation of e-mail software needs to focus on making e-mail fulfill that role more smoothly.</p>
<p>One major challenge we often face is maintaining e-mail&#8217;s ease-of-use as our inbox gets filled with newsletters, notifications, sales reciepts, usenet posts, and chain e-mails from distant acquaintances.</p>
<p>Our inbox contains messages that vary in priority from nearly-spam notifications to critical conversations and high-priority to-do items. Notifications bury the important items quickly, and I find myself forwarding e-mails to myself so they stay on top a little while longer. It doesn&#8217;t have to be this hard! Most e-mail services and clients offer tagging features or flagging, but stop short of integrating those into a smooth workflow or allowing the inbox to be customized to take advantage of the data. To-do lists are great, but I never see them unless they appear in my inbox alongside my e-mails. Most to-do items originate <em>from</em> e-mails, so it makes sense that to-do items should really just be a tag or label for an e-mail. (E-mails sent to yourself should automatically get this tag).</p>
<p>50-70% of e-mails I receive come from a computer, not a human. I still need to see them, but only once, and I don&#8217;t need to reply. These crowd my inbox, and hide other much more important items. More on how these are easy to label later. </p>
<h2>Introducing the Thinbox</h2>
<p>Some people like absolute control, others are lazy. I&#8217;m one of the lazy folk who want my computer to do all the work an keep things simple for me.  To handle this kind of person &#8211; I&#8217;m suggesting a whole new type of inbox &#8211; the thinbox&#8230;  This could live alongside the &#8216;inbox&#8217; without any compatibility issues, I think. Gmail could implement this without a lot of trouble.</p>
<p>The thinbox is minimalistic. The goal is to only show items that need to be dealt with.  If I&#8217;m caught up, it&#8217;s empty &#8211; a blank screen. To achieve this feat, the user is &#8216;guided&#8217; to deal with e-mails as they are read, and the view is limited to a certain time span (such as the last week or month). Archived items are never shown.</p>
<p>First, what types of e-mails do we get?</p>
<ol>
<li>E-mails we want to see and handle now
<ol>
<li>Reply, and the conversation disappears</li>
<li>Read and act on. No reply needed; click Archive.</li>
<li>Read and Archive. Completed conversations, or boring newsletters, sales reciepts, ship notifications, automatic notifications..</li>
</ol>
</li>
<li>And ones I want to see later
<ol>
<li>Skim and read later. Interesting newsletters, usenet posts, etc. Cool, but not right now.</li>
<li>Read and remember to do something on a certain day. To-do item arrive in the form of an e-mail from a colleage or boss, an appointment reminder, or a bill.</li>
<li>Read and reply later&#8230; when I have more data, or when I have more time, or when they get back from vacation/trip/etc</li>
</ol>
</li>
</ol>
<p>This brings us to a feature that we need to achieve our goal &#8211; we need to be able to have a e-mail re-appear at the top of an inbox on a given day. This could be implemented with a &#8216;reappearOn&#8217; field. This allows us to &#8216;postpone&#8217; an e-mail/todo.</p>
<h2>Supporting features needed for thinbox</h2>
<ul>
<li>Limiting by age in needed, because I will never sort my 9,079 old e-mails: Hide older than 1 day | week | month | all (probably needs to be group level)</li>
</ul>
<ul>
<li>Results from following queries displayed one after another in the thinbox, with no divider (just a different background color, and a pop-out tab on the left that vertically spans all group items.
<ul>
<li>&#8220;Needs Reply&#8221;: Search inbox (not all mail) for e-mails I haven&#8217;t replied to, and aren&#8217;t flagged automatic, review, or to-do. Plus all e-mails tagged &#8220;Needs reply&#8221;. Defaults to 1 week visibility.</li>
<li>&#8220;Automatic&#8221;: Could be done with filters, but would be best done as a learning set of heuristics, based of user preferences. Users could black/whitelist addresses. Defaults to 1 day visibility.</li>
<li>&#8220;Up for review&#8221;: Articles tagged &#8216;review&#8217;, and have a review date before current time. This is a way to postpone/schedule e-mails and e-mails tagged &#8216;to-do&#8217;. A way to remind oneself about an e-mail at a certain time in the future &#8211; simply set a future date for it to reappear in the inbox (just sort by scheduled date instead of sent date when present). Defaults to 1 week visibility.</li>
<li>&#8220;to-do&#8221;: A simple default label. E-mails to oneself are automatically tagged. Defaults to 1 month visibility.</li>
<li>&#8220;Bored?&#8221;: (optional) A &#8216;quick&#8217; label for e-mails that I don&#8217;t have time to read right now&#8230; Should probably stay minimized untill the other groups are empty.</li>
</ul>
</li>
<li>Quick links (on hover) for marking an item as &#8220;to-do&#8221;, &#8220;review&#8221;, &#8220;automatic&#8221;. Then choosing &#8220;soon, tomorrow, next week, next month&#8221; as the review time.</li>
<li>It should be easy to manage groups as a whole: &#8211; a tab for each group in a left colum should allow batch archving, postponement, or re-labeling. </li>
<li>Automatic archiving when I reply (Send and Archive is default). Forwarded e-mails should suggest &#8220;Archive&#8221; and &#8220;Check Later&#8221;</li>
<li>It is important to keep things clean&#8230; Instead of displaying the 5+ groups in separate boxes, put them inline, ordered by group, then date. Background color should differ by group. Groups disappear when they have no items.</li>
</ul>
<h3>Labeling &#8216;automatic&#8217; e-mails.</h3>
<p>Separating such &#8216;no reply&#8217; e-mails from the rest isn&#8217;t very difficult &#8211; we can look for &#8216;unsubscribe&#8217; links (newsletters) , large quantities of e-mail addresses in the TO field and the body (chain e-mails), keywords such as &#8220;order confirmation&#8221; or &#8220;reciept&#8221;, or addresses like no-reply/donotreply@domain.com.  I think we can flag these with 90% accuracy at least, and allow users to correct algorithm mistakes at the e-mail and e-mail adress levels.</p>
<h3>Other gripes</h3>
<p>Viewing all e-mails by a particular address should be a 1-click operation. If I&#8217;m looking at an e-mail from johndoe@company.com, there should be a &#8220;See all conversations with this person&#8221; link. It could appear when hovering over any e-mail address in the entire application &#8211; easy to implement. Preferably, other recent conversations should appear below the current conversation as links&#8230; Maybe the last 3?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/computerlinguist.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/computerlinguist.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/computerlinguist.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/computerlinguist.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/computerlinguist.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/computerlinguist.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/computerlinguist.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/computerlinguist.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/computerlinguist.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/computerlinguist.wordpress.com/83/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=computerlinguist.com&blog=4562296&post=83&subd=computerlinguist&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://computerlinguist.com/2009/06/09/e-mail-has-changed-our-inboxes-need-to-change-too/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e246b32ac5e470afb71f8221a9759da2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">computerlinguist</media:title>
		</media:content>
	</item>
		<item>
		<title>Language features vs. Libraries: Why we love extensible languages.</title>
		<link>http://computerlinguist.com/2009/05/21/language-features-vs-libraries-why-we-love-extensible-languages/</link>
		<comments>http://computerlinguist.com/2009/05/21/language-features-vs-libraries-why-we-love-extensible-languages/#comments</comments>
		<pubDate>Thu, 21 May 2009 12:29:48 +0000</pubDate>
		<dc:creator>computerlinguist</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://computerlinguist.com/?p=80</guid>
		<description><![CDATA[Here, I&#8217;m doing it again. Linkblogging. But hey&#8230; It&#8217;s too good to pass up. How to implement several new high-profile .NET features in SmallTalk in less than a page of code. Your Language Features Are My Libraries by Benjamin Pollack<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=computerlinguist.com&blog=4562296&post=80&subd=computerlinguist&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Here, I&#8217;m doing it again. Linkblogging. But hey&#8230; It&#8217;s too good to pass up.</p>
<p>How to implement several new high-profile .NET features in SmallTalk in less than a page of code.</p>
<p><a href="http://blog.bitquabit.com/2009/05/20/your-language-features-are-my-libraries/">Your Language Features Are My Libraries </a>by Benjamin Pollack</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/computerlinguist.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/computerlinguist.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/computerlinguist.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/computerlinguist.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/computerlinguist.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/computerlinguist.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/computerlinguist.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/computerlinguist.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/computerlinguist.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/computerlinguist.wordpress.com/80/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=computerlinguist.com&blog=4562296&post=80&subd=computerlinguist&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://computerlinguist.com/2009/05/21/language-features-vs-libraries-why-we-love-extensible-languages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e246b32ac5e470afb71f8221a9759da2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">computerlinguist</media:title>
		</media:content>
	</item>
		<item>
		<title>Clojure &#8211; cross platform, fast, concurrent, concise</title>
		<link>http://computerlinguist.com/2008/11/10/clojure-cross-platform-fast-concurrent-concise/</link>
		<comments>http://computerlinguist.com/2008/11/10/clojure-cross-platform-fast-concurrent-concise/#comments</comments>
		<pubDate>Mon, 10 Nov 2008 18:34:20 +0000</pubDate>
		<dc:creator>computerlinguist</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://computerlinguist.wordpress.com/?p=45</guid>
		<description><![CDATA[I recently ran across this video on Clojure&#8230; Very compelling presentation.  I originally thought of lisp as being interpreted.. It&#8217;s easy to build a simple lisp interpreter. Clojure, however, is compiled lisp &#8211; but still quite as dynamic, and it supports edit-and-continue. Watch the video Looks very promising<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=computerlinguist.com&blog=4562296&post=45&subd=computerlinguist&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I recently ran across this video on Clojure&#8230; Very compelling presentation. </p>
<p>I originally thought of lisp as being interpreted.. It&#8217;s easy to build a simple lisp interpreter.</p>
<p>Clojure, however, is compiled lisp &#8211; but still quite as dynamic, and it supports edit-and-continue.</p>
<p><a href="http://blip.tv/file/982823">Watch the video</a></p>
<p>Looks very promising</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/computerlinguist.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/computerlinguist.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/computerlinguist.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/computerlinguist.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/computerlinguist.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/computerlinguist.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/computerlinguist.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/computerlinguist.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/computerlinguist.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/computerlinguist.wordpress.com/45/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=computerlinguist.com&blog=4562296&post=45&subd=computerlinguist&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://computerlinguist.com/2008/11/10/clojure-cross-platform-fast-concurrent-concise/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e246b32ac5e470afb71f8221a9759da2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">computerlinguist</media:title>
		</media:content>
	</item>
		<item>
		<title>Use &#8216;scripting&#8217; languages when possible</title>
		<link>http://computerlinguist.com/2008/09/04/use-scripting-languages-when-possible/</link>
		<comments>http://computerlinguist.com/2008/09/04/use-scripting-languages-when-possible/#comments</comments>
		<pubDate>Thu, 04 Sep 2008 20:46:42 +0000</pubDate>
		<dc:creator>computerlinguist</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://computerlinguist.wordpress.com/?p=30</guid>
		<description><![CDATA[Are you guilty of subconsciously regarding &#8216;scripting&#8217; languages as inferior? Do you think real programming means using C, C++, C#, or Java? Does your conscience accuse you of laziness when you feel tempted to use a truly high-level language for your app? If so, don&#8217;t be too hard on yourself. It&#8217;s unfortunate, but the computer [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=computerlinguist.com&blog=4562296&post=30&subd=computerlinguist&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Are you guilty of subconsciously regarding &#8216;scripting&#8217; languages as inferior? Do you think real programming means using C, C++, C#, or Java? Does your conscience accuse you of laziness when you feel tempted to use a truly high-level language for your app?</p>
<p>If so, don&#8217;t be <em>too</em> hard on yourself. It&#8217;s unfortunate, but the computer industry is more prone to group-think than any other. The inherent complexity requires us to take other people&#8217;s word for most things&#8230; Besides, it would seem that scripting languages are for scripts&#8230;right?</p>
<p>It&#8217;s true that scripting languages are fantastic at gluing libraries and applications together quickly. But they&#8217;re not just for scripts. Truthfully, any language can be used for &#8216;scripting&#8217;&#8230; But sophisticated high-level languages that excel at the job have an tendency to get branded. Ironic, eh?</p>
<h3><strong>Javascript, for instance</strong></h3>
<p>As a language, Javascript is one of the most high-level languages in existence. It was designed from the ground-up for object-oriented development (although with a quirky syntax). Its dynamic, reflective, and functional nature allows excellent code reuse (mix-ins, events, delegation, aspect integration), and the excellent array and dictionary syntax makes the language suitable for representing data and expressing domain-specific logic. It&#8217;s easy to unit test, and there are great IDEs for it (Aptana, Flex Builder).</p>
<p>Javascript is multi-paradigm. It is imperative, procedural, object-oriented, functional, and dynamic. If you want to write procedural garbage and use global variables, javascript will let you do it.</p>
<p>Javascript code you see on the Internet tends to be poorly written, buggy, and ugly. It&#8217;s not because the language is bad &#8211; it&#8217;s because few people learn how to use it properly. Developers copy and paste bad javascript, then write more code just like it. Thankfully, this trend is starting to reverse, and we&#8217;re seeing good javascript on a wide variety of sites. High-quality libraries like jQuery, Mootools, and YUI are showing developers what Javascript *should* look like, and how powerful it can be.</p>
<p><strong>Javascript doesn&#8217;t get in your way, even if you&#8217;re doing something incredibly stupid. <span style="font-weight:normal;">True, the syntax for making namespaces and classes could be improved, but the inherent flexibility lets you change even this &#8211; you can write defineNamespace(), defineClass(), and addMembers() functions if you so desire. Sometimes this freedom can get to your head, so remember that discipline is as important as ingenuity when writing code.</span></strong></p>
<p><strong>Javascript is a very high-level language, with excellent support for a variety of paradigms. It&#8217;s built into the JVM, every modern browser, and has over 20 <a href="http://en.wikipedia.org/wiki/Server-side_JavaScript">server-side implementations.</a></strong></p>
<p>The fact that it is possible to write javascript applications that run on a range of browers (implementations) is really amazing. Try writing an application that can run on Windows, Linux, and OS X without having targeted versions of the executable or the executing framework. Like everything else, javascript is easier in a consistent environment, like an AIR, Mozilla, or HTA app&#8230; Don&#8217;t blame the language for the framework. Don&#8217;t blame Javascript for the DOM.</p>
<h4>On the desktop</h4>
<p>The XML+Javascript combo is very suitable for large applications. Tying libraries together and defining the behavior of an application is definitely a job for a high-level dynamic language.</p>
<p>Here&#8217;s just a few desktop apps that use the Mozilla (XUL+Javascript) platform: Firefox, Flock, SeaMonkey, Thunderbird, Chatzilla, Nvu, Sunbird, ActiveState Komodo (my Python IDE), Joost, Miro, and Instantbird.</p>
<p>HTA (Microsoft HTML applications) have been around forever (2001?), and are used extensively within Microsoft products. I&#8217;ve written a few also, for windows-only tasks. They&#8217;re just HTML files with a .hta extension and local filesystem permissions. If only IE had debugging&#8230;.</p>
<p>Adobe AIR is gaining immense popularity, and there are already thousands of apps out there. Need I say more? Javascript has proven itself a mature, capable language, suitable for big things.</p>
<h4>Thank you, javascript</h4>
<p>We have a lot to thank Javascript for. It&#8217;s a vector for single-paradigm developers to expand their horizons with. It&#8217;s pushing the performance boundaries of dynamic languages. Every six months a new virtual machine seems to be <a href="http://ejohn.org/blog/tracemonkey/">leapfrogging</a> 50% over the previous leader. Smart just-in-time compilation is bringing incredible speeds to javascript, and with tiny initialization costs.</p>
<h3>Python, for instance</h3>
<p>Python is a little less implicit that Javascript, and follows the DRY principle very closely. It is designed to enforce readability, wheras Javascript relies on programmer discipline (which is needed anyway).</p>
<p>Python is used as a scripting language in lots of heavy-duty applications like GIMP, Inkscape, Blender, Maya, PSP, and&#8230; Linux. But it&#8217;s not named PythonScript, thank goodness, so the &#8216;scriptiness percepection index&#8217; is much lower than javascript.</p>
<p>Lots of popular stuff is written in Python, like BitTorrent, Trac, Bazaar, Mercurial, TinyERP, ClamWin, Yum (linux package management system), Zope, and Django (my favorite). There are actually some drivers written in python. It&#8217;s pretty speedy.</p>
<p>Python is probably a good balance between power and guidance. It supports a variety of paradigms, but has great default behavior and tends to guide you towards doing things one way. Python is reflective, object-oriented, dynamic, and functional much like javascript. It&#8217;s a little stricter, but not enough to really annoy.</p>
<h3>Ruby, Lisp, and Perl</h3>
<p>I&#8217;m lumping these three together since I don&#8217;t have much experience with them. I&#8217;ve been studying them, though, and all three seem very powerful and sufficient in their own way. All three are incredibly popular, with hundreds of thousands of apps in the wild.</p>
<h3>My defintion of high-level</h3>
<p>At one time C was considered a high-level language. At one time C++ was considered a high-level language. Not too long ago I considered Java a high-level language.</p>
<p>In my opinion, a true high-level language must allow programming with the following paradigms as a minimum</p>
<ul>
<li>dynamic (Any member can be overridden, objects act like dictionaries)</li>
<li>reflective (Members are enumerable, executable, and can be referenced by string name)</li>
<li>functional (Functions are first-class objects, with members)</li>
<li>object-oriented (Functionality can be organized into objects, which can have instances containing state)</li>
<li>Imperative</li>
</ul>
<p>It must also have these features</p>
<ul>
<li>In-line documentation</li>
<li>Built-in list and dictionary syntax.</li>
<li><a href="http://en.wikipedia.org/wiki/Variadic_function">Variadic functions</a></li>
<li>Easy &#8216;undefined&#8217; and null checks</li>
<li>Exception management</li>
<li><a href="http://en.wikipedia.org/wiki/Duck_typing">Duck typing</a> (optional explicit typing is OK)</li>
<li>Automatic memory management</li>
<li>Closures, anonymous functions</li>
<li>Good list, dictionary, string, math, and date libraries.</li>
</ul>
<p> </p>
<p><strong><span style="color:#f66c08;">I don&#8217;t believe the future is in contract-based programming. The contract safety that interfaces and classes provide is shallow and of questionable value. It is behavior, not integration that typically causes problems.<br />
</span></strong></p>
<p><strong><span style="color:#f66c08;"><br />
</span></strong></p>
<p><span style="color:#00ff00;"><strong><span style="color:#f66c08;">A far better approach is to use a language that facilitates defensive programming and easy unit testing.</span></strong></span></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/computerlinguist.wordpress.com/30/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/computerlinguist.wordpress.com/30/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/computerlinguist.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/computerlinguist.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/computerlinguist.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/computerlinguist.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/computerlinguist.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/computerlinguist.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/computerlinguist.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/computerlinguist.wordpress.com/30/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/computerlinguist.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/computerlinguist.wordpress.com/30/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=computerlinguist.com&blog=4562296&post=30&subd=computerlinguist&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://computerlinguist.com/2008/09/04/use-scripting-languages-when-possible/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e246b32ac5e470afb71f8221a9759da2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">computerlinguist</media:title>
		</media:content>
	</item>
		<item>
		<title>Command chaining</title>
		<link>http://computerlinguist.com/2008/08/20/command-chaining/</link>
		<comments>http://computerlinguist.com/2008/08/20/command-chaining/#comments</comments>
		<pubDate>Wed, 20 Aug 2008 18:06:35 +0000</pubDate>
		<dc:creator>computerlinguist</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://computerlinguist.wordpress.com/?p=22</guid>
		<description><![CDATA[Even if you&#8217;re still stuck using a non-dynamic language (Java, C#, etc), you can steal a trick or two from the other side. Command chaining is an easy practice that can really simplify your code. It&#8217;s easy. Put return this; before the end of each method in your class. Just say no to void! Of [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=computerlinguist.com&blog=4562296&post=22&subd=computerlinguist&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Even if you&#8217;re still stuck using a non-dynamic language (Java, C#, etc), you can steal a trick or two from the other side. Command chaining is an easy practice that can really simplify your code.</p>
<p>It&#8217;s easy. Put <strong>return this;</strong><em> </em>before the end of each method in your class. Just say <em>no</em> to <strong>void</strong>!</p>
<p>Of course, you wouldn&#8217;t do it on <em>functions</em>. They&#8217;re supposed to return data. But following this practice for &#8216;command&#8217; methods makes perfect sense, and allows calling code to be much cleaner.</p>
<p>Compare:</p>
<pre>Element para = new Element("p");
para.set("class","song");
para.append("Hello World");
para.appendTo(document);</pre>
<p>to</p>
<pre>new Element("p") .set("class","song") .append("Hello World") .appendTo(document);</pre>
<p>or</p>
<pre>new Element("p") .set("class","song")
                 .append("Hello World")
                 .appendTo(document);</pre>
<p>#2 and #3 are far more readable. If you want to draw attention to the commands (say they aren&#8217;t transparently obvious, or need inline comments), #3 is a better choice. If you want to focus on the surrounding logic, #2 cuts line usage down tremendously.</p>
<p>Both remove repetition and reduce re-factoring costs. As a bonus, you don&#8217;t have to clutter the scope with another arbitrarily named variable; you&#8217;ve created and finished with the object all in one statement.</p>
<p>Like all coding practices, there is a short adjustment period while you get used to reading and writing this style; however, I&#8217;m confident you&#8217;ll find it much faster to read and write code without that superfluous, repetitive text. <a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">DRY</a>.</p>
<p>Just say no to <strong>void. Be nice to your callers.</strong></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/computerlinguist.wordpress.com/22/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/computerlinguist.wordpress.com/22/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/computerlinguist.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/computerlinguist.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/computerlinguist.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/computerlinguist.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/computerlinguist.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/computerlinguist.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/computerlinguist.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/computerlinguist.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/computerlinguist.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/computerlinguist.wordpress.com/22/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=computerlinguist.com&blog=4562296&post=22&subd=computerlinguist&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://computerlinguist.com/2008/08/20/command-chaining/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e246b32ac5e470afb71f8221a9759da2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">computerlinguist</media:title>
		</media:content>
	</item>
		<item>
		<title>Regular expressions are mandatory</title>
		<link>http://computerlinguist.com/2008/08/20/regular-expressions-are-mandatory/</link>
		<comments>http://computerlinguist.com/2008/08/20/regular-expressions-are-mandatory/#comments</comments>
		<pubDate>Wed, 20 Aug 2008 17:51:46 +0000</pubDate>
		<dc:creator>computerlinguist</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://computerlinguist.wordpress.com/?p=11</guid>
		<description><![CDATA[I admit that regular expressions (regexes) are intimidating. I avoided them like a disease for six years. I wasn&#8217;t quite sure what they did, but seeing stuff like this was enough to make me lose interest quick: &#60;(?&#60;tagname&#62;[\\w:-]+)(?&#60;attrpair&#62;\\s+(?&#60;attrname&#62;\\w[-\\w:]*) (\\s*=\\s*\"(?&#60;attrval&#62;[^\"]*)\"&#124; \\s*=\\s*'(?&#60;attrval&#62;[^']*)'&#124; \\s*=\\s*(?&#60;attrval&#62;&#60;%#.*?%&#62;)&#124; \\s*=\\s*(?&#60;attrval&#62;[^\\s=/&#62;]*)&#124; (?&#60;attrval&#62;\\s*?)))* \\s*(?&#60;insertattrs&#62;)(?:(?&#60;empty&#62;/&#62;)&#124;&#62; (?s:(?&#60;contents&#62;.*?) (?i:&#60;/\\s*\\k&#60;tagname&#62;\\s*&#62;))) Whenever I did string parsing, I usually ended up [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=computerlinguist.com&blog=4562296&post=11&subd=computerlinguist&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I admit that regular expressions (regexes) are intimidating. I avoided them like a disease for six years. I wasn&#8217;t quite sure what they did, but seeing stuff like this was enough to make me lose interest quick:</p>
<pre style="line-height:1.2em;">&lt;(?&lt;tagname&gt;[\\w:-]+)(?&lt;attrpair&gt;\\s+(?&lt;attrname&gt;\\w[-\\w:]*)
(\\s*=\\s*\"(?&lt;attrval&gt;[^\"]*)\"|
\\s*=\\s*'(?&lt;attrval&gt;[^']*)'|
\\s*=\\s*(?&lt;attrval&gt;&lt;%#.*?%&gt;)|
\\s*=\\s*(?&lt;attrval&gt;[^\\s=/&gt;]*)|
(?&lt;attrval&gt;\\s*?)))*
\\s*(?&lt;insertattrs&gt;)(?:(?&lt;empty&gt;/&gt;)|&gt;
(?s:(?&lt;contents&gt;.*?)
(?i:&lt;/\\s*\\k&lt;tagname&gt;\\s*&gt;)))</pre>
<p>Whenever I did string parsing, I usually ended up with masses of loops and indexOf calls. I tried to avoid anything complicated, but the parsing code inevitably ended up huge, fragile, and difficult to read.</p>
<p>During those six years, I probably wrote over ten thousand lines of string parsing code that could have been replaced with <strong>ten or twenty <em>lines</em> of regular expressions. Really.<br />
</strong></p>
<p>If you do any kind of programming, or even just work with text, you need to understand regular expressions. They&#8217;re very, very useful. So useful, in fact, that it&#8217;s near impossible to find a language that doesn&#8217;t support them.  Perl, PHP, Ruby and Javascript even add syntactic sugar to make them easier to use.</p>
<h1>Regex patterns</h1>
<p>Regex patterns don&#8217;t have to be complicated to be useful. You&#8217;ll probably get the most mileage out of simple patterns &#8211; quick regexes that save you a few dozen lines of code.</p>
<p>For example, you might scan text for simple e-mail addresses with this pattern:</p>
<p><span style="color:#008000;"><strong><tt class="regex">[a-z</tt></strong></span><tt class="regex"><span style="color:#008000;"><strong>]+</strong></span><span style="color:#339966;"><span style="color:#000000;">@</span><strong>[</strong></span></tt><span style="color:#339966;"><strong><tt class="regex">a-z</tt></strong></span><tt class="regex"><span style="color:#339966;"><strong>]+</strong></span>\.<span style="color:#008000;"><strong>[</strong></span></tt><span style="color:#008000;"><strong><tt class="regex">a-z</tt><tt class="regex">]</tt></strong></span></p>
<p>Within square brackets, you can list allowed characters like this: <em>[abcdefghijklm]</em> or specify a range: <em>[a-m].</em></p>
<p>The + symbol means &#8216;one or more&#8217; of whatever it is following. So &#8220;A+&#8221; would match A or AAA or AAAAA. (*) means &#8217;0 or more&#8217;.</p>
<p>The period (.) means &#8216;any character&#8217;. Since we&#8217;re actually trying to <em>match</em> a period, we have to &#8216;escape&#8217; it with a backslash: \.</p>
<p>Unfortunately, the above regex dosen&#8217;t match e-mail addresses like <em>joe@example.co.uk</em>. It also won&#8217;t match <em>joe@example-domain.com</em> or <em>first-last@me9.com</em>. Here&#8217;s an improved version.</p>
<p><tt class="regex"><span style="color:#008000;">[a-z0-9._-]+</span>@<span style="color:#008000;">[a-z0-9.-]+</span>\.<span style="color:#008000;">[a-z]</span></tt></p>
<p>And here&#8217;s an even more sophisticated version. It excludes domains that start or end in an hyphen. It also prevents more than one period in a row in the domain or username.</p>
<p><strong>[</strong>a-z0-9!#$%&amp;'*+/=?^_`{|}~-<strong>]+(?:</strong>\\.<strong>[</strong>a-z0-9!#$%&amp;'*+/=?^_`{|}~-<strong>]+)*</strong></p>
<p>@<strong>(?:[</strong>a-z0-9<strong>](?:[</strong>a-z0-9-<strong>]*[</strong>a-z0-9<strong>])?</strong>\\.<strong>)+[</strong>a-z0-9<strong>](?:[</strong>a-z0-9-<strong>]*[</strong>a-z0-9<strong>])?</strong></p>
<h1>Experiment</h1>
<p><a href="http://rubular.com/">http://rubular.com/</a></p>
<h1>Continued</h1>
<p><a href="http://en.wikipedia.org/wiki/Regular_expression">http://en.wikipedia.org/wiki/Regular_expression</a></p>
<p><a href="http://www.regular-expressions.info/">http://www.regular-expressions.info/</a></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/computerlinguist.wordpress.com/11/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/computerlinguist.wordpress.com/11/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/computerlinguist.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/computerlinguist.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/computerlinguist.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/computerlinguist.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/computerlinguist.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/computerlinguist.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/computerlinguist.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/computerlinguist.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/computerlinguist.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/computerlinguist.wordpress.com/11/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=computerlinguist.com&blog=4562296&post=11&subd=computerlinguist&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://computerlinguist.com/2008/08/20/regular-expressions-are-mandatory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e246b32ac5e470afb71f8221a9759da2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">computerlinguist</media:title>
		</media:content>
	</item>
	</channel>
</rss>