<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:posterous="http://posterous.com/help/rss/1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Joel Hughes's Blog</title>
    <link>http://joelhughes.co.uk</link>
    <description>Most recent posts at Joel Hughes's Blog</description>
    <generator>posterous.com</generator>
    <link xmlns="http://www.w3.org/2005/Atom" href="http://posterous.com/api/sup_update#b7800fbc8" type="application/json" rel="http://api.friendfeed.com/2008/03#sup" />
    
    
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/joelhughes" /><feedburner:info uri="joelhughes" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://posterous.superfeedr.com/" /><feedburner:emailServiceId>joelhughes</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
      <pubDate>Wed, 16 Nov 2011 09:24:00 -0800</pubDate>
      <title>Dog-eared Digital Books</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/wJx6Y-KZ22o/dog-eared-digital-books</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/dog-eared-digital-books</guid>
      <description>&lt;p&gt;
	&lt;p&gt;"&lt;em&gt;If I die tomorrow, well, at least my children, who are approaching as we speak, at least they will have a very good idea of what I was like, of what my mind was like, because they will be able to read my books. So maybe there is an immortalizing principle at work even if it's just for your children. Even if they've forgotten you physically, they could never say that they didn't know what their father was like.&lt;/em&gt;" - Martin Amis [1]&lt;/p&gt;
&lt;p&gt;I recently attended the Books in Browsers (BiB) conference [2] at which I heard Bob Stein make the point that there is meaningful and emotional value in annotating written content [3]. While Martin Amis is referring to the act of writing a novel, we could all share experience, in text, across time. If I carefully annotated my thoughts (likes, associations and criticisms) on The Life of Pi [4], with contextual information (an autumnal commute, in a Mancunian bus, aged 24), my children could perform the same act, with the same text, at the same point in their lifetime. This experience could be extremely poignant.&lt;/p&gt;
&lt;p&gt;While it occurs with physical books (more frequently in academic genres, perhaps), annotation could be promoted and enhanced through digital reading devices and services. A paper based manuscript is limited by the rate it degrades and its physical size, a digital equivalent (as long at its content can be deciphered) can last, and be expanded, indefinitely. Annotating is not a new concept for the web (and therefore formats like ePub), projects like the Open Annotations Standard [5] have been attempting to solve this problem, with limited success, for some time. One key constraint being the transient nature of the source.&lt;/p&gt;
&lt;p&gt;Other BiB talks touched on these subjects. Blaine Cook and Maureen Evans talked about authors being able to use the tools familiar to software developers (source control systems like Git [6]) and social-networkers to aid communal content creation and blur the line between writer and reader (Maureen nurtured a crowd sourced cookery book based on these principals [7]).&lt;/p&gt;
&lt;p&gt;Content creation, in this style, might not be appeal to every reader, but note making could. James Bridle's talk covered some of the key features that bookmarks and annotations should provide [8], an appealing idea he described was:&lt;/p&gt;
&lt;p&gt;"&lt;em&gt;Traditional books, physical paper books, are fantastic. You can read them cover to cover, bookmark them, dog-ear them, write notes in the margin, underline your favourite passages, treasure them, keep them, and lend them to your friends. Ebooks should let you do these things too - but sometimes they don't.&lt;/em&gt;" - James Bridle [9]&lt;/p&gt;
&lt;p&gt;Taking into account all of the above, there is a strong argument for implementing this kind of functionality within eReading tools. In the Open Books Checklist [8] (item three) includes the following: "You should be able to save these marks separate from the book itself." The Open Annotation proposals share the same ideas. There's another way to look at this.&lt;/p&gt;
&lt;p&gt;Borrowing further from software development practices, open source in particular, readers could purchase a "release" of the book. From that point on the book is theirs (their own "version"). Annotations and bookmarks can be added directly to them (in a format that can be hidden/revealed) this version can then be passed on, and on, gaining a life of its own, each reader leaving their mark (as developers leave their comments/foot-prints on a code base). The digital equivalent of browning, dog-eared, written on pages.&lt;/p&gt;
&lt;p&gt;As with software, the user's version may deviate from further "releases" made by the original author. These could be merged or ignored at the reader's discretion, this way the supplements can't be separated from their source material (physically or over time). Example usage might include: a teacher annotating a text, then providing this version to their students, who further branch the content. The teacher could choose to merge the best student content back into their version, and when a new text is released choose whether to merge or continue with the version they have with their next class.&lt;/p&gt;
&lt;p&gt;My copy of the Life of Pi, becomes our family copy. Each of us leaving impressions, a new edition is irrelevant, ours is the version that means the most.&lt;/p&gt;
&lt;p&gt;[1] &lt;a href="http://www.theparisreview.org/interviews/1156/the-art-of-fiction-no-151-martin-amis"&gt;http://www.theparisreview.org/interviews/1156/the-art-of-fiction-no-151-marti...&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[2] &lt;a href="http://bib.archive.org/"&gt;http://bib.archive.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[3] &lt;a href="http://www.slideshare.net/synch101/bi-b-bob-stein"&gt;http://www.slideshare.net/synch101/bi-b-bob-stein&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[4] &lt;a href="http://en.wikipedia.org/wiki/Life_of_Pi"&gt;http://en.wikipedia.org/wiki/Life_of_Pi&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[5] &lt;a href="http://www.openannotation.org/"&gt;http://www.openannotation.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[6] &lt;a href="http://git-scm.com/"&gt;http://git-scm.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[7] &lt;a href="http://eat-tweet.com/"&gt;http://eat-tweet.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[8] &lt;a href="http://www.openbookmarks.org/checklist/"&gt;http://www.openbookmarks.org/checklist/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[9] &lt;a href="http://booktwo.org/notebook/everything-is-the-same-only-different/"&gt;http://booktwo.org/notebook/everything-is-the-same-only-different/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/dog-eared-digital-books"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/dog-eared-digital-books#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=wJx6Y-KZ22o:e_yUeGNSjCs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=wJx6Y-KZ22o:e_yUeGNSjCs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=wJx6Y-KZ22o:e_yUeGNSjCs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=wJx6Y-KZ22o:e_yUeGNSjCs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=wJx6Y-KZ22o:e_yUeGNSjCs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/wJx6Y-KZ22o" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://joelhughes.co.uk/dog-eared-digital-books</feedburner:origLink></item>
    <item>
      <pubDate>Fri, 21 Oct 2011 06:06:00 -0700</pubDate>
      <title>Simple</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/RewToyyk3Lo/simple</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/simple</guid>
      <description>&lt;p&gt;
	&lt;p&gt;Rich Hickey's [1] approach to developing software (or just thinking about and building tools) really chimes with me. His recent talk Simple Made Easy [2] really beautifully sums up how "easy" is a relative term, simple on the other hand is quantifiable and not necessarily "easy".&lt;/p&gt;
&lt;p&gt;Following on from his previous talk on Hammock Driven Development [3] his approach is to solve the right problem. And, to really think about how to solve the right problem well. Being able to hold a problem in your mind is dependent on simplicity; if the problem is complex, the more thinking power it requires. Being able to keep problems encapsulated/modular allows them to be evaluated fully, simply.&lt;/p&gt;
&lt;p&gt;This ties in with themes from previous posts [5] about reducing complexity and technical debt by keeping code small and well tended. Solving the right problem and not adding more than is necessary. To repeat a favorite quote:&lt;/p&gt;
&lt;p&gt;"&lt;em&gt;Real efficiency comes from elegant solutions, not optimized programs.&lt;/em&gt;" Jonathan Sobel [4]&lt;/p&gt;
&lt;p&gt;Efficiency, in this case, applies equally to the execution of the code and to the ability of the team to work with and improve it over a long period. While procedure and testing (agile, XP, CI, TDD and acceptance testing) are tools that I find helpful they do not truly assist with the act of problem solving. Complex code can be well tested and deploy flawlessly.&lt;/p&gt;
&lt;p&gt;Hopefully these references help clarify some of the points I try to make about keeping code small, simple and disposable [5]. Problem solving is an intellectual activity, solving the right problem is key and doesn't require more code. More code requires more mental effort to understand, and in many cases it is easier to solve the next problem by building on top, and the cycle continues.&lt;/p&gt;
&lt;p&gt;Solve the right problem and only the right problem; write less code that does more; solve problems with your brain and constantly ask "do we need this?".&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;&lt;strong&gt; &lt;/strong&gt;
&lt;li&gt;&lt;a href="https://twitter.com/#!/richhickey"&gt;https://twitter.com/#!/richhickey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.infoq.com/presentations/Simple-Made-Easy"&gt;http://www.infoq.com/presentations/Simple-Made-Easy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a&gt;&lt;a href="http://blip.tv/clojure/hammock-driven-development-4475586"&gt;http://blip.tv/clojure/hammock-driven-development-4475586&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cs.indiana.edu/~jsobel/c455-c511.updated.txt"&gt;http://www.cs.indiana.edu/~jsobel/c455-c511.updated.txt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://joelhughes.co.uk/code-life-cycle-every-line-is-technical-debt"&gt;http://joelhughes.co.uk/code-life-cycle-every-line-is-technical-debt&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/simple"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/simple#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=RewToyyk3Lo:rXkd48zC1pk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=RewToyyk3Lo:rXkd48zC1pk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=RewToyyk3Lo:rXkd48zC1pk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=RewToyyk3Lo:rXkd48zC1pk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=RewToyyk3Lo:rXkd48zC1pk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/RewToyyk3Lo" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://joelhughes.co.uk/simple</feedburner:origLink></item>
    <item>
      <pubDate>Thu, 28 Jul 2011 07:54:58 -0700</pubDate>
      <title>Code Life Cycle: Every Line is Technical Debt</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/j0Bd2QeTsX0/code-life-cycle-every-line-is-technical-debt</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/code-life-cycle-every-line-is-technical-debt</guid>
      <description>&lt;p&gt;
	&lt;p&gt;Programming in teams is hard: members favour their own code; ownership is important; once committed, code is hard to remove. Training new members is hard: they may not have confidence in their contributions; senior members my protect "their" work; all are afraid of pollution. It is desirable, but usually not practical, to have the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Freedom to experiment and make mistakes while learning, improving and contributing to production.&lt;/li&gt;
&lt;li&gt;A small, flexible code-base (particularly vital in JavaScript).&lt;/li&gt;
&lt;li&gt;Easily learnt and maintained tools.&lt;/li&gt;
&lt;li&gt;Ability to keep maintenance interesting and evenly applied.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is particularly applicable to teams working on languages like JavaScript. There are many approaches and styles that can be applied to a given problem. Less experienced members may fear making polluting mistakes, as will their teammates. And, despite their brilliance, most engineers would concede that the code they wrote today is superior to last year's/last week's/yesterday's equivalent. We all live with past mistakes, everything decays over time.&lt;/p&gt;
&lt;p&gt;Even with the most detailed foresight and planning, over the lifetime of a code-base, technical debt grows and maintenance becomes increasingly expensive. It is easier to add than remove; large applications are harder to learn; complexity leads to mistakes and introduces bugs. More code, more complexity, more bugs, more maintenance (less flexibility), more training for new team members, more developers and so on. It may not be possible to eradicate these flaws in the development process but there may be ways to reduce, or slow, their effects.&lt;/p&gt;
&lt;h2&gt;Freshness: a Possible Solution&lt;/h2&gt;
&lt;p&gt;Practises such as TDD, XP, code review, lint and quality control all aim to minimise the ravages of large teams and time on projects. However, these do little to keep the size of the code-base down. Less code is easier to manage, read, learn and maintain (as long as it stays small). As a concise, well formed, sentence is easier to read and understand; a brief but poorly worded passage is easier to discuss and edit. New developers should be encouraged to get involved and feel comfortable to learn via their mistakes.&lt;/p&gt;
&lt;p&gt;In his article &lt;a href="http://michaelfeathers.typepad.com/michael_feathers_blog/2011/05/the-carrying-cost-of-code-taking-lean-seriously.html" target="blank"&gt;The Carrying-Cost of Code: Taking Lean Seriously&lt;/a&gt; Michael Feathers makes the case for a 3 month lifetime imposed on every line of code (at which point it would vanish from the repository). By being forced to completely rewrite applications over an over: it becomes impractical to make the code-base larger as there simply wouldn't be time to cover it all.&lt;/p&gt;
&lt;p&gt;This approach may be heavy handed, there would be cases where perfectly good code would be rewritten: preventing work in more valuable areas. However, over time requirements change; a perfect solution last week may become less so as the project's focus shifts. These areas are also ideal for training, a developer can resolve a well understood problem (backed up with API contracts and unit tests) while colleagues can advise and support. Coupled with the easy branching, which tools like Git provide: rewriting, reviewing and merging/rejecting are straight forward.&lt;/p&gt;
&lt;p&gt;Code can be graded by its "last modified" or "last reviewed" date, regular code reviews and the ability to monitor "freshness" would ensure all members of the team understand the mechanics of their project.&lt;/p&gt;
&lt;p&gt;The more central the code the shorter the life-span. With JavaScript in particular, more code means poorer performance (whether it is time to download, execute or understand). The modules and functions that are called most frequently are those that need the deepest understanding. Conversely, repetitive "cookie cutter" functionality, typically found in areas such as views and templates, could be given longer to atrophy.&lt;/p&gt;
&lt;p&gt;Reaching the end of a life-span doesn't necessarily mean it has to be rewritten. If the code is still solving the problem it set out to, in the most efficient and readable manner, then its life-span can be extended. The code can be held up as an example of good practice and made the subject of comparison and code review.&lt;/p&gt;
&lt;h2&gt;Next Time: Implementation&lt;/h2&gt;
&lt;p&gt;Although the intention is to make the process more behavioural than technical, there would need to be a method of visualising the ageing process. This could easily be incorporated into a documentation tool such as &lt;a href="https://github.com/rudenoise/selfDoc.js" target="blank"&gt;selfDoc&lt;/a&gt;, and then utilised during code reviews. Next post will cover the tooling (improvements to &lt;em&gt;selfDoc.js&lt;/em&gt;) and practise (based on experiences from a trial run inside a large team, building JS applications).&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/code-life-cycle-every-line-is-technical-debt"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/code-life-cycle-every-line-is-technical-debt#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=j0Bd2QeTsX0:HvckI1OVY68:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=j0Bd2QeTsX0:HvckI1OVY68:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=j0Bd2QeTsX0:HvckI1OVY68:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=j0Bd2QeTsX0:HvckI1OVY68:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=j0Bd2QeTsX0:HvckI1OVY68:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/j0Bd2QeTsX0" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://joelhughes.co.uk/code-life-cycle-every-line-is-technical-debt</feedburner:origLink></item>
    <item>
      <pubDate>Sat, 16 Jul 2011 04:32:00 -0700</pubDate>
      <title>In Favour of Test Driven Development</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/oUHbh5M5fhM/in-favour-of-test-driven-development</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/in-favour-of-test-driven-development</guid>
      <description>&lt;p&gt;
	&lt;p&gt;"It sounds very mechanical, but the effect is the exact opposite. What it does is free you to write. It liberates you to write."&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.theparisreview.org/interviews/5997/the-art-of-nonfiction-no-3-john-mcphee" target="blank"&gt;John McPhee on having a system to write to&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;"Art is freedom; and in art, as in life, there is no freedom without law."&lt;/p&gt;
&lt;p&gt;Martin Amis on the importance of having rules and a code of conduct.&lt;/p&gt;
&lt;p&gt;While referring to literature, these quotes resonate strongly with my feelings on writing software (JavaScript in particular) Imposing constraints on the process leads to greater clarity of thought. In writing: correct grammar, consistent style and brevity; in code: strict lint rules, clear design and, again, brevity.&lt;/p&gt;
&lt;p&gt;Test Driven Development (TDD) is another self-imposed constraint. The following relates to a recent StackExchange Podcast, who's hosts are not enthusiastic about its supposed benefits and have evidence to back up their assertions.&lt;/p&gt;
&lt;p&gt;"[...] a survey of all of the studies that have been done on TDD have shown that the better the study done, the weaker the signal as to its benefit."&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.stackoverflow.com/2011/06/se-podcast-09/"&gt;Greg Wilson&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A small concession is made that, for the majority of projects, TDD is poorly understood and executed. In which case I agree; used for its own sake or inappropriately: TDD has little value. For example, retrofitting unit tests misses the point entirely.&lt;/p&gt;
&lt;p&gt;Used on functional, self-contained, code (JavaScript, perhapse) TDD provides constraining benefits that free the developer to solve their problem. Thinking about and exploring a solution is never a waste of effort, writing a test is a chance to frame a problem with greater clarity. Each test further tightens focus on the task. Each test is a tangible step forward, a possible break point and a starting point for the next push.&lt;/p&gt;
&lt;p&gt;TDD has little benefit when interacting with existing APIs (DOM interactions, UI or web services). Only code, over which the developer has complete control (new, independent functions), can be discovered creatively. Otherwise the tests are simply a collection of roll-played guesses. The do not clarify the author's thoughts and intentions, instead they can easily reinforce her misconceptions.&lt;/p&gt;
&lt;p&gt;"The fact is that everything I've written is very soon going to be absolutely nothing - and I mean nothing."&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.theparisreview.org/interviews/5997/the-art-of-nonfiction-no-3-john-mcphee" target="blank"&gt;John McPhee, again, on leaving a legacy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If it isn't providing satisfaction or feels like a drain on progress then TDD is counterproductive. In the hands of a developer who enjoys the process it becomes valuable aid.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/in-favour-of-test-driven-development"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/in-favour-of-test-driven-development#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=oUHbh5M5fhM:lYruVrXVmcw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=oUHbh5M5fhM:lYruVrXVmcw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=oUHbh5M5fhM:lYruVrXVmcw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=oUHbh5M5fhM:lYruVrXVmcw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=oUHbh5M5fhM:lYruVrXVmcw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/oUHbh5M5fhM" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://joelhughes.co.uk/in-favour-of-test-driven-development</feedburner:origLink></item>
    <item>
      <pubDate>Fri, 10 Jun 2011 07:49:00 -0700</pubDate>
      <title>selfDoc.js: JavaScript that Documents Itself</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/y8W3e9r3XRw/selfdocjs-javascript-that-documents-itself</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/selfdocjs-javascript-that-documents-itself</guid>
      <description>&lt;p&gt;
	&lt;p&gt;Thanks to its interpreter, JavaScript can coerce functions to strings. These strings can be used as documentation. &lt;a href="https://github.com/rudenoise/selfDoc.js" title="selfDoc.js on GitHub"&gt;&lt;em&gt;selfDoc.js&lt;/em&gt;&lt;/a&gt; is a JavaScript function that takes a function or object literal (containing a JavaScript application built in a modular style) and returns an object that describes the application's API. This can be combined with a templating tool (&lt;a href="https://github.com/rudenoise/lm.js" title="lm.js" target="blank"&gt;lm.js&lt;/a&gt;, perhaps) to produce a dynamic HTML document.&lt;/p&gt;
&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;var test = function () {
    // A function that does nothing
  };
  test.subFunction = function () {
    // Another useless function
  };
  selfDoc(&amp;quot;Test&amp;quot;, test, &amp;quot;A test application using selfDoc.js&amp;quot;);
  // Returns an object describing the app
  /**
  {
    appName: &amp;quot;Test&amp;quot;,
    comment: [&amp;quot;A function that does nothing&amp;quot;],
    overview: &amp;quot;A test application using selfDoc.js&amp;quot;
    properties: [{
      name: &amp;quot;subFunction&amp;quot;
      comment: [&amp;quot;Another useless function&amp;quot;],
      implementation: &amp;quot;function () { ... }&amp;quot;
    }]
  }
  */&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The documentation is refreshed every time &lt;em&gt;selfDoc&lt;/em&gt; is called. &lt;em&gt;selfDoc&lt;/em&gt; can be kept alongside unit tests or demos providing a dynamic set of documentation that is always up to date. Combine the resulting object with your &lt;a href="https://github.com/rudenoise/lm.js" title="lm.js" target="blank"&gt;favorite templating tool&lt;/a&gt; and you have &lt;a href="https://github.com/rudenoise/selfDoc.js/tree/master/demo" title="selfDoc demo" target="blank"&gt;dynamic HTML documentation&lt;/a&gt;. The comments are only extracted from the first continuous block (at the top of each function).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;selfDoc&lt;/em&gt; is low on dependencies, a browser is the only requirement. &lt;em&gt;selfDoc&lt;/em&gt; coerces the public/current-scope functions to strings, extracting  their comments (FireFox/JaegerMonkey removes comments at run time, so functionality is hampered here).&lt;/p&gt;
&lt;p&gt;There are numerous alternatives. The majority are designed to be added into a build process, such as Maven or ant. Typically they are written in a language other than JavaScript, requiring a development environment with these tools/languages installed. These may be more appropriate to large projects with established build systems.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/jsdoc-toolkit/" target="blank"&gt;jsdoc toolkit&lt;/a&gt; (java)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pdoc.org/" target="blank"&gt;PDoc&lt;/a&gt; (ruby)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.naturaldocs.org" target="blank"&gt;Natural Docs&lt;/a&gt; (?)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://developer.yahoo.com/yui/yuidoc/" target="blank"&gt;YUI Doc&lt;/a&gt; (python)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ajaxdoc.codeplex.com/" target="blank"&gt;AjaxDoc&lt;/a&gt; (C#)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are alternatives that also have native JavaScript implementations, docco looks particularly tasty.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://jashkenas.github.com/docco/" target="blank"&gt;docco&lt;/a&gt; (node.js coffee/java script)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://jquery.bassistance.de/docTool/docTool.html" target="blank"&gt;Doc Tool&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://github.com/rudenoise/selfDoc.js" title="selfDoc.js on GitHub"&gt;Get &lt;em&gt;selfDoc.js&lt;/em&gt; from GitHub&lt;/a&gt;&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/selfdocjs-javascript-that-documents-itself"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/selfdocjs-javascript-that-documents-itself#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=y8W3e9r3XRw:kKp0iKKR4Ac:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=y8W3e9r3XRw:kKp0iKKR4Ac:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=y8W3e9r3XRw:kKp0iKKR4Ac:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=y8W3e9r3XRw:kKp0iKKR4Ac:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=y8W3e9r3XRw:kKp0iKKR4Ac:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/y8W3e9r3XRw" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://joelhughes.co.uk/selfdocjs-javascript-that-documents-itself</feedburner:origLink></item>
    <item>
      <pubDate>Sun, 17 Apr 2011 10:35:00 -0700</pubDate>
      <title>Introducing LM.JS - Write HTML in JavaScript using Less Markup</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/D8gCQ428cpc/lmjs-wirte-html-in-javascript-using-less-mark</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/lmjs-wirte-html-in-javascript-using-less-mark</guid>
      <description>&lt;p&gt;
	&lt;p&gt;Producing HTML from JavaScript is clumbersom. You're either writing out the mark-up using strings, or generating DOM nodes directly. &lt;a href="http://www.delicious.com/rudenoise/template" target="blank"&gt;Templating engines&lt;/a&gt; reduce effort and abstract away some of the inconvenience, but they have shortcomings when mixing logic with the generation of HTML/DOM (whether or not logic should be in a templating engine is another issue).&lt;/p&gt;
&lt;p&gt;To get to the point: I saw &lt;a href="http://trapm.com/vana-templating-an-utterly-sensible-templatin" target="blank"&gt;:vana-templating&lt;/a&gt;, an elegant and expressive tool for Common Lisp. I wanted a JS version and built it. &lt;a href="https://github.com/rudenoise/LM.JS" target="blank"&gt;LM.JS is on GitHub for your perusal.&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Using LM.JS&lt;/h3&gt;
&lt;p&gt;The aim was to be able to produce a :vana like data structure that could represent HTML. JS Arrays are most like Lisp's lists, objects made good key-value stores for attributes and nesting is handled by nesting the arrays. Recurse the array and evaluate each portion to a DOM node. No string parse step, only a small regular expression and little need for strict convention.&lt;/p&gt;
&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;lm(['ul',
  ['li',
    ['p', 'one']],
  ['li',
    ['p', 'two']]]);

// Returns this DOM tree:
// &amp;lt;ul&amp;gt;
//   &amp;lt;li&amp;gt;
//     &amp;lt;p&amp;gt;one&amp;lt;/p&amp;gt;
//   &amp;lt;/li&amp;gt;
//   &amp;lt;li&amp;gt;
//     &amp;lt;p&amp;gt;two&amp;lt;/p&amp;gt;
//   &amp;lt;/li&amp;gt;
// &amp;lt;/ul&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Add some attributes and nest within text:&lt;/p&gt;
&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;lm(['p', 'Some text ', ['em', 'emphasised'], ' and a ', ['a', {href: '#nest'}, 'link']]);

// &amp;lt;p&amp;gt;Some text &amp;lt;em&amp;gt;emphasised&amp;lt;/em&amp;gt; and a &lt;a href="#nest"&gt;link&lt;/a&gt;&amp;lt;/p&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;What about logic? As the Array is JS, simply build the array using JavaScript's logic, no need to implement a mini-language.&lt;/p&gt;
&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;lm(['ul', (function () {
  var rtn = [], i;
  for (i = 0; i &amp;lt; 10; i += 1) {
    rtn.push(['li', (i + ' item')]);
  }
  return rtn;
}())]);

// &amp;lt;ul&amp;gt;
//    &amp;lt;li&amp;gt;0 item&amp;lt;/li&amp;gt;...&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;lm.js differs from templating solutions as JavaScript logic can be used in-line.&lt;/p&gt;
&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;lm.render(function (obj) {
  return lm(['p', obj.text]);
}, {text: 'hello'});

// &amp;lt;p&amp;gt;hello&amp;lt;/p&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;Performance&lt;/h3&gt;
&lt;p&gt;The aim of this version was to gain the expressive markup and feel of vana in JavaScript. While performance is an issue, it was not the sole aim to be fast at the expense of ease of use.&lt;/p&gt;
&lt;p&gt;This &lt;a href="http://jsperf.com/dom-vs-innerhtml-based-templating/133" target="blank"&gt;templating performance test on JSPerf&lt;/a&gt; has LM.JS coming out in last place, 1% behind mustache.js. In the coming weeks I aim to place LM.JS higher up the list. However, the techniques used to satisfy this particular test may not be desirable in the long run. Using more intelligent caching and priming those caches are techniques that could be employed. On the other hand, creating a cache of each element, or element group, has its own overhead in execution speed and memory. "Cold start" performance matters too and memory is a major factor on mobile.&lt;/p&gt;
&lt;p&gt;One improvement may be to use string concatenation with innerHTML as opposed to the current DOM elements attached to document fragments (a technique covered in &lt;a href="http://www.youtube.com/watch?v=mHtdZgou0qU" target="blank"&gt;Nicholas Zaka's Google tech talk&lt;/a&gt;).&lt;/p&gt;
&lt;h3&gt;LM.JS - The pros&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Some of the style from :vana in JavaScript&lt;/li&gt;
&lt;li&gt;No string parsing, lexing or heavy validation needed&lt;/li&gt;
&lt;li&gt;Uses native JS Arrays as core data type&lt;/li&gt;
&lt;li&gt;Provides a very flexible way to deal with DOM generation&lt;/li&gt;
&lt;li&gt;Requires fewer characters to produce well formed HTML, smaller JS payloads too&lt;/li&gt;
&lt;li&gt;Can be used as a &lt;a href="http://daringfireball.net/projects/markdown/" target="blank"&gt;markdown&lt;/a&gt; like tool for quickly producing HTML&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;LM.JS - The cons&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Slower than a templating engine, although not by a lot and dependent on the benchmarking rules&lt;/li&gt;
&lt;li&gt;JS is not as syntactically suited to list processing as Lisp, vana is more elegant&lt;/li&gt;
&lt;li&gt;Templates are tightly bound to JS, it would be hard to replicate the exact logic in another environment&lt;/li&gt;
&lt;li&gt;Only works in browser, e.g. node.js would require a rewrite using string concatenation&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Next Steps&lt;/h3&gt;
&lt;p&gt;Building up LM.JS to cover more traditional templating functionality and move up the performance table at JSPerf. Just how far up is a difficult question, optimisation could be handled by the user in a case-by-case basis.&lt;/p&gt;
&lt;p style="color: #777; font-size: 1em; margin-top: 1em;"&gt;Comment/Vote at &lt;a href="http://news.ycombinator.com/item?id=2458420" target="blank"&gt;Hacker News&lt;/a&gt; or &lt;a href="http://www.reddit.com/r/javascript/comments/gstci/introducing_lmjs_write_html_in_javascript_using/" target="blank"&gt;Reddit:JavaScript&lt;/a&gt;&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/lmjs-wirte-html-in-javascript-using-less-mark"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/lmjs-wirte-html-in-javascript-using-less-mark#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=D8gCQ428cpc:gJYkFF0GkPc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=D8gCQ428cpc:gJYkFF0GkPc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=D8gCQ428cpc:gJYkFF0GkPc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=D8gCQ428cpc:gJYkFF0GkPc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=D8gCQ428cpc:gJYkFF0GkPc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/D8gCQ428cpc" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://joelhughes.co.uk/lmjs-wirte-html-in-javascript-using-less-mark</feedburner:origLink></item>
    <item>
      <pubDate>Sat, 20 Nov 2010 06:37:00 -0800</pubDate>
      <title>Tools for Reading, wRiting and aRithmetic</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/IE2e9KXLmBo/tools-for-reading-writing-and-arithmetic</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/tools-for-reading-writing-and-arithmetic</guid>
      <description>&lt;p&gt;
	&lt;p&gt;The &lt;a href="http://en.wikipedia.org/wiki/The_three_Rs" target="blank"&gt;3 Rs&lt;/a&gt; are the basis of education. So fundamental are these skills I inevitably use, improve and enjoy them daily. The tools needed to perform them vary, but I currently favour the following:&lt;/p&gt;
&lt;p&gt;&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="3rskit" height="375" src="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2010-11-20/CvdwxIzJixlGFgAqAcEhxnxdgHvGdnrrstqshwEhkBfpIhrBjfDArheBhqna/3RsKit.jpg.scaled500.jpg" width="500" /&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h2&gt;Reading: Amazon Kindle&lt;/h2&gt;
&lt;p&gt;Like the Portable MP3 Player's effect on music collections, portability has changed the way I consume writing. I often have three books on the go (programming for work, something educational and a novel), I read as I walk to work and have the kindle within reach pretty much the entire day. I still have plenty of physical material, but having my entire library at hand is a real luxury. I'd be very surprised if the momentum of e-reading doesn't equal that of portable audio soon. The kindle is simple, light and lacks the distractions offered by more complex devices. Mix in some &lt;a href="http://en.slow-media.net/manifesto" target="blank"&gt;Slow-Media&lt;/a&gt; philosophy: using long-form reading tools like &lt;a href="http://www.instapaper.com" target="blank"&gt;Instapaper&lt;/a&gt; and custom &lt;a href="http://hpricot.com/" target="blank"&gt;Hpricot&lt;/a&gt; scraping scripts, you can read web-content away from the distractions of a PC.&lt;/p&gt;
&lt;h2&gt;wRiting: Squared &lt;a href="http://www.whitelines.se/en/products" target="blank"&gt;Whitelines Notepads&lt;/a&gt; (1 A4 Wire Bound, 1 Pocket), Pencils and a &lt;a href="http://www.penciltalk.org/2007/09/kum-automatic-longpoint-sharpener" target="blank"&gt;Kum Automatic Longpoint Sharpener&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Notepad and pencil are a simple, effective, low-tech, way to record ideas. Electronics are fragile (Kindle included), transient and, comparably, hamstrung by their inputs. Tablets may be improving, but drawing and writing are elegantly straight forward and tactile the old way.&lt;/p&gt;
&lt;p&gt;I like to have a slim, pocket, notebook to hand at all times for quick use. &lt;a href="http://www.moleskine.com/catalogue/classic/cahier/" target="blank"&gt;Moleskin's Cahire&lt;/a&gt; and &lt;a href="http://fieldnotesbrand.com/" target="blank"&gt;Field Notes&lt;/a&gt; are great, but, to me, &lt;a href="http://www.whitelines.se/en/products" target="blank"&gt;Whitelines&lt;/a&gt; are the best match with an HB pencil for readability. An A4 pad is essential for prolonged note making. I prefer squared paper as it suites diagrams, notes, equations and can be used in any direction.&lt;/p&gt;
&lt;p&gt;I'm still experimenting with pencils (recommendations welcome), although most HBs will satisfy (I know many readers will have favourite pens, but there is a &lt;a href="http://idler.co.uk/readers-letters/in-praise-of-the-pencil/" title="In Praise of the Pencil (The Idler)" target="blank"&gt;unique charm&lt;/a&gt; to the humble wood and graphite &lt;a href="http://en.wikipedia.org/wiki/Pencil#Notable_pencil_users" title="Notable Pencil Users" target="blank"&gt;pencil&lt;/a&gt;). It is the sharpener that I think makes the largest difference, thanks to &lt;a href="http://brendandawes.posterous.com/this-pencil-sharpener-is-bloody-amazing-kum-a" title="This pencil sharpener is bloody amazing. Kum Automatic Long Point" target="blank"&gt;Brendan Dawes&lt;/a&gt;, I've discovered that &lt;a href="http://www.penciltalk.org/2007/09/kum-automatic-longpoint-sharpener" target="blank"&gt;Kum's Automatic Longpoint Sharpener&lt;/a&gt; is a cut above any other I've used. Seriously, you may scoff but it's properly cool.&lt;/p&gt;
&lt;h2&gt;aRithmetic: &lt;a href="http://en.wikipedia.org/wiki/HP-10C_series#HP-12C" target="blank"&gt;HP-12c Finance Calculator&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;My wife rolled her eyes at discovery of my &lt;a href="http://en.wikipedia.org/wiki/HP-10C_series#HP-12C" target="blank"&gt;HP-12c finance calculator&lt;/a&gt;. It looks dated, for the uninitiated, the &lt;a href="http://en.wikipedia.org/wiki/Reverse_Polish_notation" target="blank"&gt;reverse-polish&lt;/a&gt; input is hard to operate and it's expensive (compared with bog-standard models). But this calculator is a classic, a design that has barely evolved in the last 30 years. It hasn't changed because it doesn't need to. &lt;a href="http://scottlocklin.wordpress.com/2009/08/10/icons-of-engineering-quality-part-1/" title="Icons of engineering quality: part 1" target="blank"&gt;Scott Locklin gives a better account than I&lt;/a&gt;, and the mechanical Curta could be a worth contender, if I could get my hand on one.&lt;/p&gt;
&lt;p&gt;These tools all have a certain low-tech appeal, even the kindle. They feel like a gentle antidote to the hectic computing environment in which I spend most of each day. Although the HP-12c and Kindle are digital, and require power, they do not flicker, beep or emit light - and are, largely, dependency free (provided the Kindle is amply stocked). In combination, I feel that they could provide a life-time's worth of insight and enjoyment. Throw in a reliable solar charger and these tools could make a desert island a very enjoyable place to be marooned.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/tools-for-reading-writing-and-arithmetic"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/tools-for-reading-writing-and-arithmetic#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=IE2e9KXLmBo:Shka1FgEXlo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=IE2e9KXLmBo:Shka1FgEXlo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=IE2e9KXLmBo:Shka1FgEXlo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=IE2e9KXLmBo:Shka1FgEXlo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=IE2e9KXLmBo:Shka1FgEXlo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/IE2e9KXLmBo" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
      <media:content type="image/jpeg" height="375" width="500" url="http://getfile8.posterous.com/getfile/files.posterous.com/temp-2010-11-20/CvdwxIzJixlGFgAqAcEhxnxdgHvGdnrrstqshwEhkBfpIhrBjfDArheBhqna/3RsKit.jpg">
        <media:thumbnail height="375" width="500" url="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2010-11-20/CvdwxIzJixlGFgAqAcEhxnxdgHvGdnrrstqshwEhkBfpIhrBjfDArheBhqna/3RsKit.jpg.scaled500.jpg" />
      </media:content>
    <feedburner:origLink>http://joelhughes.co.uk/tools-for-reading-writing-and-arithmetic</feedburner:origLink></item>
    <item>
      <pubDate>Tue, 16 Nov 2010 12:53:00 -0800</pubDate>
      <title>Functional, TDD JavaScript (influenced by Haskell, Lisp, Erlang...)</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/82Q81ZCOtbI/functional-tdd-javascript-influenced-by-haske</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/functional-tdd-javascript-influenced-by-haske</guid>
      <description>&lt;p&gt;
	&lt;p&gt;Having developed a taste for Functional Programming (FP), I've found that there are many aspects that make building software in a TDD style easier. Functions are the basis of FP, a function that takes arguments and returns values is easy to test. If this function is side effect free (i.e. doesn't effect the program from outside its internal scope; has no infulence on, or effect from, state), you can be confident that that function will always work the way your tests expect.&lt;/p&gt;
&lt;div class="code"&gt;
&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;// SIDE EFFECT FREE
fAddOne = function (num) {
    return (num + 1);
};

test(&amp;quot;fAddOne&amp;quot;, function () {
    eq(fAddOne(0), 1);
    eq(fAddOne(1), 2);
});

// SIDE EFFECT DEPENDENT
obj = {
    num: 0,
    pAddOne: function () {
        this.num += 1
    }
};

test(&amp;quot;pAddOne&amp;quot;, function () {
    obj.num = 1;
    obj.pAddOne();
    eq(1, obj.num);
});&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;
&lt;p&gt;In the above examples, fAddOne will work anywhere within the app, pAddOne is side-effect based and needs to be called within the scope of an object with a num property. If a refactor in needed, fAddOne, and its tests, can move arround or change applications. pAddOne has some requirements that unit tests don't describe as easily, refactoring will be a little trickier. In effect pAddOne's tests are testing side effects not functionality.&lt;/p&gt;
&lt;p&gt;However, the example oversimplifies the problem. In reality side effects are essential, I/O can't be avoided. In (browser based) JavaScript this is usualy in the from of DOM API interaction. In &lt;a href="https://github.com/rudenoise/GB.js" target="blank"&gt;GB.js I attempt to keep a CYOA/GameBook engine independent of side effects&lt;/a&gt;, in the demo, DOM building and events are kept to a minimum and try not to overlap. This is fine for individuals working to their own requirements. Teams have different problems; in JS, side effects are easy and the syntax&amp;nbsp;encourages&amp;nbsp;them, in most cases it's easier to just cave in. It may even get work done faster (at first). But, from a Unit Testing perspective quality drops or, at least, refactoring become trickier.&lt;/p&gt;
&lt;p&gt;FP is a tool industry could gain more of value from, as does by adopting its features and principals (closures, currying, recursion etc...). The problem for me is&amp;nbsp;blending&amp;nbsp;Object Oriented (OO) and FP styles with TDD. Refactoring and reuse are important, and when a shortcut is made with OO then quality can suffer.&lt;/p&gt;
&lt;p&gt;Another gain with FP can be shorter code, but when using TDD with loosely typed languages (JS, Erlang, Lisp etc...) type checking causes length to creep up. While rewriting some of excersises from "The Little Schemer" (with TDD JS) it became apparent that if you want high confidence in the Unit Tests then a lot of type checking happens. This is why I have a set of type checking functions that I use constantly. So, if I'm typechecking a lot am I just re-inserting the type safty of a strongly typed language?&lt;/p&gt;
&lt;p&gt;Looking at other FP languages, Haskell currently satisfys me the most. Sepparating &amp;nbsp;side effects into Monads (I'm still in the process of learning this concept) and using strong typing (and a compiler) feels like it provides real confidence in quality. In fact, by having to decide types in the function definitions there is no need to have tests to cover type safety.&amp;nbsp;So the extra "boiler plate" (that isn't even required by the compiler) can reduce the overall lines of code typed.&lt;/p&gt;
&lt;p&gt;I'm hoping that by delving deeper into Haskell's approach I can get a clearer steer on how to construct functional JavaScript applications.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/functional-tdd-javascript-influenced-by-haske"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/functional-tdd-javascript-influenced-by-haske#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=82Q81ZCOtbI:X7n8X5b9taE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=82Q81ZCOtbI:X7n8X5b9taE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=82Q81ZCOtbI:X7n8X5b9taE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=82Q81ZCOtbI:X7n8X5b9taE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=82Q81ZCOtbI:X7n8X5b9taE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/82Q81ZCOtbI" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://joelhughes.co.uk/functional-tdd-javascript-influenced-by-haske</feedburner:origLink></item>
    <item>
      <pubDate>Sun, 18 Jul 2010 16:35:00 -0700</pubDate>
      <title>Moved (to Posterous). Giving away GoodBaad</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/gKunuV4rkag/moved-to-posterous-giving-away-goodbaad</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/moved-to-posterous-giving-away-goodbaad</guid>
      <description>&lt;p&gt;
	&lt;p&gt;It's been a long time since my last post, so to give myself a bit of a boost I've decided to move the blog to Posterous (sorry if this causes a flurry of reposts in you RSS reader). This should make posting a little easier and means I can get rid of my VPS server and save a few pennies.&lt;/p&gt;
&lt;p&gt;I've also decided that I need an outlet for the code I produce out of working hours. Therefore I've started a &lt;a href="http://www.github.com" target="_blank"&gt;GitHub&lt;/a&gt; account so that others can benefit from the work I've done.&lt;/p&gt;
&lt;p&gt;The first chunk of code is my &lt;a href="http://goodbaad.com" title="Good Baad" target="_blank"&gt;GoodBaad&lt;/a&gt; web-app that was started around 2 years ago. It was a lot of fun and was a chance to try my hand at building a scalable PHP site from scratch (year's of working with frameworks like &lt;a href="http://cakephp.org/" target="_blank"&gt;CakePHP&lt;/a&gt; left me with a feeling that I needed to understand the process of building one from scratch).  Although it's a bit old now I think I learned a great deal about being economical with code and building small flexible units that were short, easy to understand and ran quickly. Some rough benchmarks on my workstation lead me to think  that this stack could out-perform the equivalent CakePHP stack by around 10 times. These gains were done without any data abstraction (I preferred raw SQL)  or a templating engine (PHP is a templating engine if you ask me), and the app didn't need page caching as it was pretty dynamic (and you could always use memcached if it became a requirement) .&lt;/p&gt;
&lt;p&gt;The core MVC was loosely based on ideas described in &lt;a href="http://toys.lerdorf.com/" target="_blank"&gt;Rasmus Lerdorf&lt;/a&gt;'s &lt;a href="http://toys.lerdorf.com/archives/38-The-no-framework-PHP-MVC-framework.html" target="_blank"&gt;no-framework PHP MVC framework&lt;/a&gt; blog post. I agreed that many frameworks simply bring too much code to a application and for me this hid the most interesting parts of writing code. So, the result was an MVC app that sits somewhere between the no-framework stack and something larger like Cake.&lt;/p&gt;
&lt;p&gt;So, if you'd like to run your own version of GoodBaad or need a lightweight PHP MVC stack you can take a look at mine for inspiration:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://github.com/rudenoise/GoodBaad" target="_blank"&gt;GoodBaad on github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That's all for now, I'll be posting some functional programming stuff shortly (expect plenty of Lisp/Scheme/Clojure and JavaScript!).&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/moved-to-posterous-giving-away-goodbaad"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/moved-to-posterous-giving-away-goodbaad#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=gKunuV4rkag:SJWmTLWG6GQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=gKunuV4rkag:SJWmTLWG6GQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=gKunuV4rkag:SJWmTLWG6GQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=gKunuV4rkag:SJWmTLWG6GQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=gKunuV4rkag:SJWmTLWG6GQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/gKunuV4rkag" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://joelhughes.co.uk/moved-to-posterous-giving-away-goodbaad</feedburner:origLink></item>
    <item>
      <pubDate>Fri, 02 Oct 2009 12:13:19 -0700</pubDate>
      <title>Vim is a great text editor</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/cbOticC3NDI/vim-is-a-great-text-editor</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/vim-is-a-great-text-editor</guid>
      <description>&lt;p&gt;
	&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Vim_(text_editor)" target="_blank"&gt;Vim is a text editor (evolved from Vi) that originated on the Amiga&lt;/a&gt;. Starting out as a command line only tool, all text editing was carried out via key strokes rather than via mouse and GUI. I first came across Vim on Linux servers, it was confusing and I struggled with the simplest editing tasks.&lt;/p&gt;

&lt;p&gt;Today Vim has become my primary text editor. I love it. I use it on Windows and Linux as a standalone app and &lt;a href="http://eclim.sourceforge.net/" target="_blank"&gt;embedded into the Eclipse IDE&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What makes it so good? In short, once you have mastered a few basic commands (similar to shortcuts) you find yourself working with text in a more efficient/involved way. Your hands rarely leave the keyboard, you can complete complicated tasks in fewer steps resulting in a greater feeling of involvement with the code. The physical task of writing code hasn't changed a great deal over the years and Vim has been refined, over the last 18 years, to suit this task. Basically: "it doesn't get in the way".&lt;/p&gt;

&lt;p&gt;If you want to get to know vim a little better here are a few links that I have found really helpful:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Find the appropriate version of &lt;a href="http://www.vim.org/download.php" target="_blank"&gt;Vim for your OS and install&lt;/a&gt;.&lt;/li&gt;
    &lt;li&gt;Start learning the ropes with these tutorials:
        &lt;ul&gt;
            &lt;li&gt;&lt;a href="http://www.eecs.harvard.edu/~cduan/technical/vi/vi-1.shtml" target="_blank"&gt;Using Vi/Vim: A Brief Tutorial&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="http://jmcpherson.org/editing.html" target="_blank"&gt;Efficient Editing With vim&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="http://jmcpherson.org/windows.html" target="_blank"&gt;Splits and multi-file editing&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="http://www.tuxfiles.org/linuxhelp/vimcheat.html" target="_blank"&gt;The Vim commands cheat sheet - 1.2&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="http://vim.wikia.com/wiki/Best_Vim_Tips" target="_blank"&gt;Vim Tips wiki&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Vim is very customisable, the settings are stored in the &lt;em&gt;vimrc&lt;/em&gt; file which resides in the install's directory (&lt;em&gt;C:\Program Files\Vim\_vimrc&lt;/em&gt; on my version of windows). These links helped me out:
       &lt;ul&gt;
            &lt;li&gt;&lt;a href="http://groups.google.com/group/vim_use/msg/355844152db8fcb3" target="_blank"&gt;Select colour scheme and font&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="http://tedlogan.com/techblog3.html" target="_blank"&gt;Secrets of tabs in vim (set indent type and depth)&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="http://jmcpherson.org/vimrc.html" target="_blank"&gt;vimrc tips&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="http://www.vi-improved.org/vimrc.php" target="_blank"&gt;Example .vimrc&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="http://news.ycombinator.com/item?id=856051" target="_blank"&gt;Favourite tips (Hacker News)&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There may be a steep learning curve but the rewards are well worth it!&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/vim-is-a-great-text-editor"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/vim-is-a-great-text-editor#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=cbOticC3NDI:oGTqKGJqksY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=cbOticC3NDI:oGTqKGJqksY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=cbOticC3NDI:oGTqKGJqksY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=cbOticC3NDI:oGTqKGJqksY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=cbOticC3NDI:oGTqKGJqksY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/cbOticC3NDI" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://joelhughes.co.uk/vim-is-a-great-text-editor</feedburner:origLink></item>
    <item>
      <pubDate>Fri, 25 Sep 2009 11:59:41 -0700</pubDate>
      <title>Web development is changing to meet mobile needs</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/mAOKAxntMoU/web-development-is-changing-to-meet-mobile-ne</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/web-development-is-changing-to-meet-mobile-ne</guid>
      <description>&lt;p&gt;
	&lt;p&gt;Since the I-Phone's release, the "general public" has been switched on to mobile computing in a new way. Previously expensive, high end, "smart phones"/mobile-devices were marketed to business users and geeks. Now the landscape has changed: devices are springing up from many manufacturers and Apple’s App Store model is popular across the board.&lt;/p&gt;
&lt;p&gt;It seems logical that, as these devices become more widely used, the way users interact with web services will incorporate the mobile platform as a core method of interaction.&lt;/p&gt;
&lt;p&gt;Next time I'm building a new service that needs to be accessible on multiple platforms I think it would make sense to build an API before a website. Until recently I've planned projects around browser based distribution, now &lt;a href="http://www.joelhughes.co.uk/blog/2009/06/goodbye-browsers-what-next/" target="blanks"&gt;the browser may become less dominant&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Having useful services open to many developers over an API will aid proliferation of the tool. Developers would be free to provide the applications for the various platforms (as Twitter have done, I suppose that's why the next step on from "hello world" is becoming the Twitter client on many SDK tutorials). I know this is nothing new, but as mobile becomes more embedded into daily life: the way developers build services on the web will need to shift to accommodate it.&lt;/p&gt;
&lt;p&gt;This isn't really a "proper post" more of a stream of consciousness; I'm about to make the shift from Web Developer to Mobile Developer and am very excited about the new possibilities.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/web-development-is-changing-to-meet-mobile-ne"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/web-development-is-changing-to-meet-mobile-ne#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=mAOKAxntMoU:b4VznAi-mzo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=mAOKAxntMoU:b4VznAi-mzo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=mAOKAxntMoU:b4VznAi-mzo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=mAOKAxntMoU:b4VznAi-mzo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=mAOKAxntMoU:b4VznAi-mzo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/mAOKAxntMoU" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://joelhughes.co.uk/web-development-is-changing-to-meet-mobile-ne</feedburner:origLink></item>
    <item>
      <pubDate>Tue, 28 Jul 2009 10:06:29 -0700</pubDate>
      <title>"The more people do, the more society develops, the more problems arise."</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/f6yDfFDwdfw/the-more-people-do-the-more-society-develops</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/the-more-people-do-the-more-society-develops</guid>
      <description>&lt;p&gt;
	&lt;p&gt;The title of this post is an excerpt (from an excerpt) of a &lt;a href="http://idler.co.uk/news/quote-for-the-day/" target="blank"&gt;quote by Masanobu Fukuoka&lt;/a&gt; (posted by &lt;a href="http://en.wikipedia.org/wiki/Tom_Hodgkinson" target="blank"&gt;Tom Hodgkinson&lt;/a&gt; on &lt;a href="http://idler.co.uk" target="blank"&gt;The Idler blog&lt;/a&gt;). &lt;a href="http://en.wikipedia.org/wiki/Masanobu_Fukuoka" target="blank"&gt;Masanobu Fukuoka&lt;/a&gt; was a soil scientist who turned his back on the perceived wisdom of modern agricultural practices to develop a technique of "natural farming" that more closely mimics nature.&lt;/p&gt;

&lt;p&gt;This approach appeals to me. As a developer it is a core skill to innovate and find solutions to problems. Often these are solutions built on top of other solutions. By taking a step back and viewing the developments from a broader perspective the solution may be to cut away "innovations" rather than adding to them.&lt;/p&gt;

&lt;h3&gt;Running Shoe Technology Goes Full Circle&lt;/h3&gt;

&lt;p&gt;I have recently become the owner of a pair of &lt;a href="http://www.vibramfivefingers.com/" target="blank"&gt;Vibram FiveFingers shoes&lt;/a&gt;. These are basically a thin covering for the soles of my feet allowing me to walk and run "barefoot" (the actual soles of my feet are far too soft to be practical).&lt;/p&gt;

&lt;p&gt;I came across FiveFingers in the comments for this article about how &lt;a href="http://www.dailymail.co.uk/home/moslive/article-1170253/The-painful-truth-trainers-Are-expensive-running-shoes-waste-money.html" target="blank"&gt;the invention of cushioned shoes has changed the way humans walk and run&lt;/a&gt;. Sports shoes have lead to many humans walking and running in a fashion that differs from the way the foot evolved to be used. As a result many runners (tired of injuries associated with landing on the heel of the foot) are using "barefoot" training methods to keep their bodies healthy.&lt;/p&gt;

&lt;p&gt;Here's a rough illustration of how barefoot running has come back around:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Humans evolved to walk on their hind legs, their feet acting a a shock absorber along with the ankles an knees&lt;/li&gt;
    &lt;li&gt;Shoes similar to &lt;a href="http://barefootted.com/shop/" target="blank"&gt;huarache sandals&lt;/a&gt; arrive allowing the wearer to withstand uncomfortable surfaces&lt;/li&gt;
    &lt;li&gt;Fashion and innovation combine leading the majority of the developed world to wear shoes with some sort of heal&lt;/li&gt;
    &lt;li&gt;Around 1972 modern athletic shoes are invented, coinciding with the growth of sports sciences&lt;/li&gt;
    &lt;li&gt;Today more people than ever suffer from sport and posture related injuries which need corrective orthopedic treatments. Shoes like the &lt;a href="http://www.swissmasai.com" target="blank"&gt;MBT&lt;/a&gt; are invented to "correct" the foot and allow us to walk "naturally"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It seems that many of the claims that are made for the benefits of orthopedic insoles and MBT shoes are mirrored by simply wearing no shoes at all.&lt;/p&gt;

&lt;h3&gt;How about software and programming?&lt;/h3&gt;

&lt;p&gt;One example of the over-engineering that goes on in software development industry might be: &lt;a href="http://www.smarty.net/" target="blank"&gt;templateing engines&lt;/a&gt; creeping into PHP.&lt;/p&gt;

&lt;p&gt;PHP started life as a way to customise static web pages (e.g. adding today's date or simple hit counters), it then evolved into a way to manage page layouts and behaviour, effectively an interactive templating language. Further evolution has lead to PHP becoming a full blown Object Oriented Language, and with this development have come various frameworks that improve code reuse and working practices.&lt;/p&gt;

&lt;p&gt;Then came an innovation that (in my eyes) went too far, templating languages were introduced to make them manageability of page layout and data representation easier. This meant more code to interpret them and therefore further load on the system running it.&lt;/p&gt;

&lt;p&gt;One of PHP's core appeals is its ability to mesh directly with HTML, a language truly intertwined with the web; templating seemed an unnecessary step away from that.&lt;/p&gt;

&lt;p&gt;For some applications abstraction layers may be a step too far especially when it is an abstraction based on an abstraction.&lt;/p&gt;

&lt;p&gt;In a broader sense this could apply to software in the form of &lt;a href="http://en.wikipedia.org/wiki/Feature_creep" target="blank"&gt;feature creep&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I'm not saying that innovation is a bad thing, far from it. But, it may make sense to look at the whole process and in some cases whittle it back down to provide the best solution.&lt;/p&gt;

&lt;h3&gt;To conclude the rambling&lt;/h3&gt;

&lt;p&gt;It is a paradox. If you define the success of a species by ability to bend the environment around to their will, then humans most productive trait is the desire to innovate.&lt;/p&gt;

&lt;p&gt;However, innovation upon innovation can lead to imperfections and further problems (which in turn will need further solutions).&lt;/p&gt;

&lt;p&gt;A valuable skill, to those who's vocation it is to innovate (software developers especially), may be to recognise when a problem can be solved by removing a layer of complication rather than adding yet another "solution".&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/the-more-people-do-the-more-society-develops"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/the-more-people-do-the-more-society-develops#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=f6yDfFDwdfw:HCr56DRzPCM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=f6yDfFDwdfw:HCr56DRzPCM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=f6yDfFDwdfw:HCr56DRzPCM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=f6yDfFDwdfw:HCr56DRzPCM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=f6yDfFDwdfw:HCr56DRzPCM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/f6yDfFDwdfw" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://joelhughes.co.uk/the-more-people-do-the-more-society-develops</feedburner:origLink></item>
    <item>
      <pubDate>Fri, 26 Jun 2009 13:11:54 -0700</pubDate>
      <title>Pocket Programming: Learning New Skills Anywhere</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/PHK5QL-PpKE/pocket-programming-learning-new-skills-anywhe</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/pocket-programming-learning-new-skills-anywhe</guid>
      <description>&lt;p&gt;
	&lt;p&gt;Summer is here, and in a few days I'm off on holiday. Aside from the eating, drinking, sleeping, sight-seeing and reading: it may be a good chance to hone my problem solving and Python skills.&lt;/p&gt;

&lt;p&gt;I'll be travelling light, taking in the east coast of Spain. So, any coding has to be done in the most portable/light-weight fashion.&lt;/p&gt;

&lt;div class='p_embed p_image_embed'&gt;
&lt;img alt="Media_httpwwwjoelhugh_geikz" height="300" src="http://getfile5.posterous.com/getfile/files.posterous.com/import-goxa/sqzfuFzDnjqfhbuefsIDpdIBDAgfaBgobEEEfBDGeDqJCwbrqEEflauzphhu/media_httpwwwjoelhugh_gEikz.jpg.scaled500.jpg" width="400" /&gt;
&lt;/div&gt;


&lt;p&gt;Here is my pocket sized kit list for an ultra-portable programming environment:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;
        &lt;h3&gt;Hardware:&lt;/h3&gt;
        &lt;ul&gt;
            &lt;li&gt;
&lt;a href="http://europe.nokia.com/find-products/devices/nokia-e71" target="blank"&gt;Nokia E71&lt;/a&gt;, which uses Symbian's S60 OS&lt;/li&gt;
            &lt;li&gt;Mini notebook, &lt;a href="http://www.moleskine.co.uk/styles/" target="blank"&gt;Moleskin Cahier&lt;/a&gt; style are my current favourite, small and scruffy but very handy&lt;/li&gt;
            &lt;li&gt;Pen&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;h3&gt;Software:&lt;/h3&gt;
        &lt;ul&gt;
            &lt;li&gt;&lt;a href="http://opensource.nokia.com/projects/pythonfors60/" target="blank"&gt;Python S60&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;
&lt;a href="http://code.google.com/p/ped-s60/" target="blank"&gt;Ped&lt;/a&gt;, pocket Python IDE&lt;/li&gt;
            &lt;li&gt;
&lt;a href="http://pdis.hiit.fi/pdis/download/miso/" target="blank"&gt;Miso&lt;/a&gt;, fun python library with access to the phone's hardware (vibrate, lights etc...)&lt;/li&gt;
            &lt;li&gt;
&lt;a href="http://www.opera.com/mobile/download/" target="blank"&gt;Opera Mobile&lt;/a&gt;, for browsing HTML E-books&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;h3&gt;Documentation:&lt;/h3&gt;
        &lt;ul&gt;
            &lt;li&gt;&lt;a href="http://oreilly.com/catalog/9780596001896/" target="blank"&gt;O'Reilly Pocket Python&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;
&lt;a href="http://diveintopython.org/" target="blank"&gt;Dive into Python&lt;/a&gt; E-Book, HTML version&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;h3&gt;Problems to solve:&lt;/h3&gt;
        &lt;ul&gt;
            &lt;li&gt;
&lt;a href="http://codekata.pragprog.com/2007/01/code_kata_backg.html" target="blank"&gt;Code Katers&lt;/a&gt;, exercises that aim to improve programming technique&lt;/li&gt;
            &lt;li&gt;
&lt;a href="http://projecteuler.net/" target="blank"&gt;Project Euler&lt;/a&gt;, "challenging mathematical/computer programming problems"&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This list is weighted towards to those of you with Symbian phones, but most smart phones have some sort of access to a programming language.&lt;/p&gt;

&lt;p&gt;The one of the most appealing aspects of this kit: it is super cheap. The phone was "free" on a 1 year £25 p/m contract, the O'Reilly Book is about £6, pen and notebook another three quid: that's a cheap way to learn some valuable skills.&lt;/p&gt;

&lt;p&gt;I'm sure there are a ton of alternative setups (&lt;a href="http://www.talkandroid.com/1225-android-scripting-environment/" target="blank"&gt;Android&lt;/a&gt;, &lt;a href="http://stackoverflow.com/questions/275436/are-there-any-good-programming-environments-ides-for-windows-mobile-devices" target="blank"&gt;Windows Mobile&lt;/a&gt;, &lt;a href="http://smallbasic.sourceforge.net/" target="blank"&gt;Palm&lt;/a&gt;, I-Phone?). A bare minimum set of requirements could be: a text editor and a web browser capable of parsing JavaScript (this may be possible on not so "smart phones").&lt;/p&gt;

&lt;p&gt;If you're using an alternative setup, or have &lt;a href="http://www.educalc.net/146663.page" target="blank"&gt;another way&lt;/a&gt; to program on the move, please add it to the comments.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/pocket-programming-learning-new-skills-anywhe"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/pocket-programming-learning-new-skills-anywhe#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=PHK5QL-PpKE:qoObeFSwLQI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=PHK5QL-PpKE:qoObeFSwLQI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=PHK5QL-PpKE:qoObeFSwLQI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=PHK5QL-PpKE:qoObeFSwLQI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=PHK5QL-PpKE:qoObeFSwLQI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/PHK5QL-PpKE" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
      <media:content type="image/jpeg" height="300" width="400" url="http://getfile9.posterous.com/getfile/files.posterous.com/import-goxa/sqzfuFzDnjqfhbuefsIDpdIBDAgfaBgobEEEfBDGeDqJCwbrqEEflauzphhu/media_httpwwwjoelhugh_gEikz.jpg">
        <media:thumbnail height="300" width="400" url="http://getfile5.posterous.com/getfile/files.posterous.com/import-goxa/sqzfuFzDnjqfhbuefsIDpdIBDAgfaBgobEEEfBDGeDqJCwbrqEEflauzphhu/media_httpwwwjoelhugh_gEikz.jpg.scaled500.jpg" />
      </media:content>
    <feedburner:origLink>http://joelhughes.co.uk/pocket-programming-learning-new-skills-anywhe</feedburner:origLink></item>
    <item>
      <pubDate>Tue, 23 Jun 2009 14:34:20 -0700</pubDate>
      <title>Which Language Combination?</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/egDo0RajpgI/which-language-combination</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/which-language-combination</guid>
      <description>&lt;p&gt;
	&lt;p&gt;I'm trying to be a better programmer. I have been writing and learning as much code as I can, the benefits are a threefold positive feedback loop:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Learning is, in itself, very pleasurable (it makes you feel clever, which is nice)&lt;/li&gt;
    &lt;li&gt;New knowledge transfers to, and enhances, existing skills&lt;/li&gt;
    &lt;li&gt;New tools and skills provide a greater resource for providing solutions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But, how does a developer know which skills to learn and which languages are best to learn with? (&lt;em&gt;Assuming that you're learning for fun rather than as a work requirement&lt;/em&gt;.)&lt;/p&gt;

&lt;p&gt;If Google is a good bench mark (assuming that they can take their pick of the best developers), one requirement (taken from an ad for a Software Engineer) asks for:&lt;/p&gt;

&lt;blockquote class="posterous_short_quote"&gt;&lt;p&gt;Fluency in two or more of C, C++, Java, Shell, PHP, Perl or Python.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;If you are specifically aiming for a career at Google then making sure you are fluent in two major languages is probably the way to go, and there is certainly no downside to a developer broadening their skill set. In my experience, each foray into new languages has improved my PHP, and in turn, I feel pretty comfortable in Ruby and Python.&lt;/p&gt;

&lt;p&gt;When deciding to learn something new: you could argue that PHP, Ruby, Python, Perl etc... are pretty much different brands of the same tool (procedural, interpreted languages). It's great to have the option to use each, but these languages are not necessarily complimentary. It is unlikely that you would write a system with a combination of PHP, Python and Ruby. But, it is conceivable that you could have a project requiring C, PHP and Erlang skills.&lt;/p&gt;

&lt;p&gt;Rather than learning interchangable skills, complementary languages might offer the opportunity to become a more rounded developer:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Interpreted, procedural (PHP, Ruby, Python, JS)&lt;/li&gt;
    &lt;li&gt;Compiled, procedural (C/C++, Java)&lt;/li&gt;
    &lt;li&gt;Functional, concurrent (Erlang, Scala, F#)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Assuming that side stepping between similar languages is easier than picking up a completely new concept: it would seem learning these varied skills opens up more possibilities.&lt;/p&gt;

&lt;p&gt;Sometimes I worry that by learning a particular, none mainstream, language (like Erlang) I could be backing the "wrong horse". However, bearing in mind my earlier ramblings, there's little downside to picking up a new way of doing things, for example Elang may not prove popular, but the functional approach will give me a head start learning F# or Scala.&lt;/p&gt;

&lt;p&gt;This slide from &lt;a href="http://www.erlang-factory.com/upload/presentations/7/erlang_in_ecommerce_no_anim-erikstenman.pdf" target="blank"&gt;Painless Payment Processing by Erik Stenman&lt;/a&gt; points out other benefits of learning more "unusual" languages:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;h3&gt;Nice paradox:&lt;/h3&gt;
    &lt;p&gt;The lack of Erlang programmers makes it easier for us to find great programmers.&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;There are many great C and Java programmers, I'm sure, but they are hidden by hordes of mediocre programmers.&lt;/li&gt;
        &lt;li&gt;Programmers who know a functional programming language are often passionate about programming.&lt;/li&gt;
        &lt;li&gt;Passionate programmers makes Great Programmers&lt;/li&gt;
    &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or am I talking nonsense?&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/which-language-combination"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/which-language-combination#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=egDo0RajpgI:GDH8nslYq_8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=egDo0RajpgI:GDH8nslYq_8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=egDo0RajpgI:GDH8nslYq_8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=egDo0RajpgI:GDH8nslYq_8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=egDo0RajpgI:GDH8nslYq_8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/egDo0RajpgI" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://joelhughes.co.uk/which-language-combination</feedburner:origLink></item>
    <item>
      <pubDate>Thu, 11 Jun 2009 14:06:56 -0700</pubDate>
      <title>What I've been reading/learning this week</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/LvnmbTqEhz4/what-ive-been-readinglearning-this-week</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/what-ive-been-readinglearning-this-week</guid>
      <description>&lt;p&gt;
	&lt;p&gt;I've been too busy this week to form a proper blog post, so instead I thought I'd mention some good content I've consumed.&lt;/p&gt;

&lt;h3&gt;&lt;a href="http://www.infoq.com/presentations/joe-armstrong-erlang-qcon08" target="blank"&gt;Functions + Messages + Concurrency = Erlang : Joe Armstrong&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;This talk from &lt;a href="http://armstrongonsoftware.blogspot.com/" target="blank"&gt;Joe Armstrong&lt;/a&gt; (author of &lt;a href="http://www.pragprog.com/titles/jaerlang/programming-erlang" target="blank"&gt;Programming Erlang&lt;/a&gt;) gives a really clear breakdown of the reasons concurrent languages (like Erlang) are becoming more important as processors gain more cores. The following quite gives good flavour:&lt;/p&gt;

&lt;p&gt;
    &lt;em&gt;Due to hardware changes:&lt;/em&gt;
    &lt;/p&gt;&lt;ul&gt;
        &lt;li&gt;&lt;em&gt;Each year your sequential programs will go slower&lt;/em&gt;&lt;/li&gt;
        &lt;li&gt;&lt;em&gt;Each year your concurrent programs will go faster&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;


&lt;p&gt;Although Joe focuses on Erlang, this applies to all languages tackling concurrency (Scala, F# etc...), thoroughly recommended to developers wanting to know more.&lt;/p&gt;

&lt;h3&gt;&lt;a href="http://www.guardian.co.uk/books/2008/apr/06/society" target="blank"&gt;McMafia, Seriously Organised Crime : Misha Glenny&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;This book has nothing to do with programming (directly), and it may appear at first glance to be some sort of "aren't gangsters cool" book for macho teenagers. Far from it.&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;Misha Glenny&lt;/a&gt; has been a BBC correspondent covering eastern Europe's wars, politics and then crime (if you've ever heard or read his reports and articles you'll know he's a very clued up chap). This interest lead him to investigate organised crime around the world. The resulting book is unbelievable (in the literal sense), it reveals how deeply organised crime is intertwined with our day-to-day lives.&lt;/p&gt;

&lt;p&gt;The entire book is fascinating, and highlights they way organised crime can eventually gain so much power it becomes a part of the establishment and has influence over global politics (not just as an issue but as an instigator). It literally effects the lives of everyone on the planet.&lt;/p&gt;

&lt;p&gt;Perhaps one of the areas that gets the least coverage is "digital crime". This is not due to it's insignificance, quite the reverse. It is huge and vastly profitable, the problem seems to be that researching it is almost impossible. Police forces simply don't have the funding and resources to gain enough understanding of the way the cyber criminals operate. It's a subject I'd love to know more about, and one that I'm sure will become more and more important over the coming years.&lt;/p&gt;

&lt;p&gt;I can't recomend it highly enough.&lt;/p&gt;

&lt;h3&gt;&lt;a href="http://www.cc2e.com/" target="blank"&gt;Code Complete 2 : Steve McConnell&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;People have been &lt;a href="http://www.codinghorror.com/blog/archives/000020.html" title="Jeff Atwood's Recomendations" target="blank"&gt;banging on&lt;/a&gt; about this book for ages, so I caved in and started reading it (especially as I found it in the work bookshelf, saving me 30 quid).&lt;/p&gt;

&lt;p&gt;I'm only 1/3 in but it already lives up to the hype. Clear, humorous and very well written. One misconception I had was that it is a straight manual to writing code. In many ways it is, but it goes much further into the thinking processes developers use. It highlights familiar problems and explains the solutions in a way that "just works".&lt;/p&gt;

&lt;p&gt;Basically, if you heard about it and thought it might be worth a read: it is. Read it sooner rather than later, two chapters in I felt like I understood my trade better and that I was on the right track.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/what-ive-been-readinglearning-this-week"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/what-ive-been-readinglearning-this-week#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=LvnmbTqEhz4:3uBkOw8KvPQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=LvnmbTqEhz4:3uBkOw8KvPQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=LvnmbTqEhz4:3uBkOw8KvPQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=LvnmbTqEhz4:3uBkOw8KvPQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=LvnmbTqEhz4:3uBkOw8KvPQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/LvnmbTqEhz4" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://joelhughes.co.uk/what-ive-been-readinglearning-this-week</feedburner:origLink></item>
    <item>
      <pubDate>Wed, 03 Jun 2009 14:16:16 -0700</pubDate>
      <title>Goodbye Browsers: What Next?</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/o5wK9cN_D5Q/goodbye-browsers-what-next</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/goodbye-browsers-what-next</guid>
      <description>&lt;p&gt;
	&lt;p&gt;It has been mooted &lt;a href="http://www.carsonified.com/future-predictions/the-future-is-one-ubiquitous-interface-to-the-web" target="blank"&gt;fairly often&lt;/a&gt;: that the web may be breaking free from the browser, and I'm enclined to agree. So what does this mean to developers and how will this effect the web development process (and my first Erlang Web App)?&lt;/p&gt;

&lt;p&gt;I'm currently upgrading a site that will need dynamic elements and interactivety intertwined with flat HTML files in a standard directory structure. During the technical design process it is also becomming apparent that these dynamic features will need to be distributed over various media and platforms.&lt;/p&gt;

&lt;p&gt;None of these are unusual requirements and I've been developing similar projects for a number of years. However, my approach is beggining to change. Previously I would have built the whole system with my PHP framework of choice (&lt;a href="http://cakephp.org/" target="blank"&gt;CakePHP&lt;/a&gt;) and used it's inbuilt Views to publish the content in various formats (e.g. HTML and RSS), I'm now rethinking.&lt;/p&gt;

&lt;p&gt;Our content needs to spread onto the ever widening array of platforms and media, so our publishing methods need to become more flexible. The solution I'm favouring is to publish content over some sort of web service or API and have the client platform, what ever it may be, interpret (and possibly redistribute) it. The &lt;a href="http://www.w3.org/RDF/" target="blank"&gt;RDF Standard&lt;/a&gt; is one format that is gaining popularity, especially as &lt;a href="http://www.w3.org/2001/sw/" target="blank"&gt; semantic technologies&lt;/a&gt; become more mainstream.&lt;/p&gt;

&lt;p&gt;These principals are probably further advanced in the realm of Web Applications: it is becoming common place to produce an API allowing other platforms to interact with them. Turning the app into a platform (via an API) allows other's to build on top in turn engraining it into their business model (For example &lt;a href="http://www.goodbaad.com" title="Good Baad: The Definitive Record of Public Oppinion" target="blank"&gt;Good Baad&lt;/a&gt; relies on 5 or 6 different APIs). Google have been providing useful APIs for years and the results are plain to see.&lt;/p&gt;

&lt;p&gt;It seem likely to me that the development process may change as a result. Currently an web app or content is built first as a website and then expanded into and API or feed. It seems more practical to build the API first and then this can be adapted to other platforms.&lt;/p&gt;

&lt;p&gt;For example: I moved my blog consumption to &lt;a href="http://www.google.co.uk/reader" target="blank"&gt;Google Reader&lt;/a&gt;, now I rarely see the sites that the content originates from; I interact with blogs entirely via their RSS feed over the platform of my choosing. With web applications it seems like the same is becoming true, very few people interact with Twitter directly, but prefer to interact via the API (3rd party apps is one key to their phenomenal growth). And, if concepts like &lt;a href="http://labs.mozilla.com/projects/ubiquity/" target="blank"&gt;Ubiquity&lt;/a&gt; take hold: the web may break free of the browser entirely.&lt;/p&gt;

&lt;p&gt;And this brings me around to my Erlang project: I'm still mulling over ideas, but it seems to me that a real-time app that is purely an API would be a very good first project. Also, Erlang seems very well suited to the Web API building task, e.g: from a data distribution view point &lt;a href="http://couchdb.apache.org/" target="blank"&gt;Couch DB&lt;/a&gt; is pretty much all you need.&lt;/p&gt;

&lt;p&gt;Over the next few weeks I'll build a simple Erlang app that interacts with the web over an API, it's possible I won't need to worry about building a client at all.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/goodbye-browsers-what-next"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/goodbye-browsers-what-next#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=o5wK9cN_D5Q:4ShLvFsqJrM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=o5wK9cN_D5Q:4ShLvFsqJrM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=o5wK9cN_D5Q:4ShLvFsqJrM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=o5wK9cN_D5Q:4ShLvFsqJrM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=o5wK9cN_D5Q:4ShLvFsqJrM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/o5wK9cN_D5Q" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://joelhughes.co.uk/goodbye-browsers-what-next</feedburner:origLink></item>
    <item>
      <pubDate>Thu, 28 May 2009 17:35:02 -0700</pubDate>
      <title>Notepad-Plus-Plus Plus Erlang</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/kw5naW2l4HE/notepad-plus-plus-plus-erlang</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/notepad-plus-plus-plus-erlang</guid>
      <description>&lt;p&gt;
	&lt;p&gt;My primary dev environment is Windows, my main IDE is &lt;a href="http://www.eclipse.org/" target="blank"&gt;Eclipse&lt;/a&gt; or &lt;a href="http://www.aptana.com/" target="blank"&gt;Aptana&lt;/a&gt; (leaning slightly towards Aptana's flavour of Eclipse lately, especially for PHP and Ruby on Rails), and for quick code edits, messing about and text editing I use &lt;a href="http://notepad-plus.sourceforge.net/uk/site.htm" target="blank"&gt;Notepad++&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Notepad++ has served me well over the years: it's free, loads up fast (unlike the big IDEs) and gets the job done. I know that there are &lt;a href="http://net.tutsplus.com/articles/web-roundups/22-neat-code-editors-for-windows/" title="NetTutes Code Editor Round Up" target="blank"&gt;quite a few alternatives&lt;/a&gt; (&lt;a href="http://intype.info/home/index.php" target="blank"&gt;In Type&lt;/a&gt; looks particularly appealing), but NP++ does what I need nicely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;However&lt;/strong&gt;, I was quite surprised and disappointed that there was no inbuilt support for my new favourite language: Erlang! A quick Google around revealed that I'd have to add a &lt;em&gt;user defined language&lt;/em&gt; to my installation, less quick was tracking down an example file for Erlang. I eventually discovered this &lt;a href="http://www.mailinglistarchive.com/notepad-plus-plus@lists.sourceforge.net/msg00024.html" target="blank"&gt;old mailing list post&lt;/a&gt;. I then built my own variation that suites dark backgrounds, you can download it below.&lt;/p&gt;

&lt;p&gt;To install you will need to replace or merge with the &lt;em&gt;*path-to-AppData*/Notepad++/userDefineLang.xml&lt;/em&gt;&lt;/p&gt; file. If you don't use a dark background alter the &lt;em&gt;WordStyle&lt;/em&gt; tag properties: &lt;em&gt;fgColor&lt;/em&gt; and &lt;em&gt;bgColor&lt;/em&gt; to suit.

&lt;p&gt;Download the &lt;a href="http://www.joelhughes.co.uk/userDefineLang.xml" title="Notepad++ Erlang userDefinedLang.xml download"&gt;userDefinedLang.xml&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let me know if you know of any better versions or edits, I'm sure mine is incomplete.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/notepad-plus-plus-plus-erlang"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/notepad-plus-plus-plus-erlang#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=kw5naW2l4HE:AyZ6tNa_aTg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=kw5naW2l4HE:AyZ6tNa_aTg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=kw5naW2l4HE:AyZ6tNa_aTg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=kw5naW2l4HE:AyZ6tNa_aTg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=kw5naW2l4HE:AyZ6tNa_aTg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/kw5naW2l4HE" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://joelhughes.co.uk/notepad-plus-plus-plus-erlang</feedburner:origLink></item>
    <item>
      <pubDate>Wed, 27 May 2009 10:06:00 -0700</pubDate>
      <title>Hear my voice (on the Guardian Tech PodCast)</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/3LmAH6BYneA/hear-my-voice-on-the-guardian-tech-podcast</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/hear-my-voice-on-the-guardian-tech-podcast</guid>
      <description>&lt;p&gt;
	&lt;p&gt;Last Friday I went along to the &lt;a href="http://www.guardian.co.uk/technology/series/techweekly" target="blank"&gt;Guardian Tech Weekly&lt;/a&gt; Tour's visit to &lt;a href="http://maps.google.co.uk/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;q=Bristol,+United+Kingdom&amp;amp;sll=53.800651,-4.064941&amp;amp;sspn=17.916772,46.582031&amp;amp;ie=UTF8&amp;amp;cd=1&amp;amp;geocode=FVElEQMdYnPY_w&amp;amp;split=0&amp;amp;t=h&amp;amp;z=11&amp;amp;iwloc=A" target="blank"&gt;Bristol&lt;/a&gt; (in case you didn't know I mostly grew up and now live in Bristol).&lt;/p&gt;

&lt;p&gt;I thought it'd be a good chance to meet up with a few faces from the local start-ups and web-development scene. So, I was pleasantly supprised to be able to have a chat with &lt;a href="http://jemimakiss.com/" target="blank"&gt;Jemima Kiss&lt;/a&gt; and get a bit of advice/insight into the projects I'm working on, I assumed that she'd be mobbed and too busy. She gave some really constructive and positive feedback on the web apps I'm building; it was a pleasant end to the week.&lt;/p&gt;

&lt;p&gt;While there I was also interviewed for the podcast about what makes Bristol a good location for web development and starting a business (not that I know a great deal about the latter). I was slightly drunk on one and a half pints (it happens that way sometimes) so didn't expect to make it into the show... But, I did - so if you want to hear my weird high-pitched voice listen to &lt;a href="http://www.guardian.co.uk/technology/blog/audio/2009/may/26/tech-weekly-podcast-bristol-digital" target="blank"&gt;Tech Weekly: On the road in Bristol&lt;/a&gt; (I pop up at 22:38).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PS:&lt;/strong&gt; &lt;em&gt;If you're bored of posts about my day-to-day existence: fear not, there's some solid programming fun coming up later this week...&lt;/em&gt;&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/hear-my-voice-on-the-guardian-tech-podcast"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/hear-my-voice-on-the-guardian-tech-podcast#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=3LmAH6BYneA:G-tS5SwICF4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=3LmAH6BYneA:G-tS5SwICF4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=3LmAH6BYneA:G-tS5SwICF4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=3LmAH6BYneA:G-tS5SwICF4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=3LmAH6BYneA:G-tS5SwICF4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/3LmAH6BYneA" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://joelhughes.co.uk/hear-my-voice-on-the-guardian-tech-podcast</feedburner:origLink></item>
    <item>
      <pubDate>Fri, 22 May 2009 12:03:42 -0700</pubDate>
      <title>This week's fun</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/EMw1JqCrGrg/this-weeks-fun</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/this-weeks-fun</guid>
      <description>&lt;p&gt;
	&lt;p&gt;No big post this week, due to being pretty busy, so instead I'll round up some of the bits and pieces that have occupied my mind this week.&lt;/p&gt;

&lt;h3&gt;Erlang:&lt;/h3&gt;

&lt;p&gt;On the Erlang front I'm wading through some slightly less blog-worthy chapters of &lt;a href="http://www.pragprog.com/titles/jaerlang/programming-erlang" target="blank"&gt;Programming Erlang: Software for a Concurrent World&lt;/a&gt;, getting to grips with error handling and exeptions. I'm going to try and tackle a more unusual task next week.&lt;/p&gt;

&lt;h3&gt;At work:&lt;/h3&gt;

&lt;p&gt;I've been wresteling with Servers. One site is flat HTML, and should therefore run super fast - however, due to a huge quantity of internal redirects and a sudden upsurge in traffic the server was grinding to a halt! Solution: move the redirects from &lt;em&gt;.htaccess&lt;/em&gt; files over to &lt;em&gt;vhost.conf&lt;/em&gt;, but I think they are going to have to be whittled down very soon.&lt;/p&gt;

&lt;p&gt;I also set up a CentOS Virtual Machine as a staging/testing environment and was pretty pleased by how much I can get done from memory using &lt;em&gt;the shell&lt;/em&gt;. It's a while since I realy played with Linux for more than a couple of hours and I could definitely envisage moving over to it on a more permanent basis. Quite a few dev tasks are easier there.&lt;/p&gt;

&lt;h3&gt;Personal Projects:&lt;/h3&gt;

&lt;p&gt;Development on my second web app (the first being &lt;a href="http://www.goodbaad.com" title="Good Baad: the definitive record of public opinion" target="blank"&gt;Good Baad&lt;/a&gt;) is coming together nicely. The working prototype is built with my "ultra-lightweight" PHP MVC framework, which I'll write about some time soon. Although I'm wondering about porting to Erlang as it's a heavily realtime system that could take advantage of Erlang's concurrency.&lt;/p&gt;

&lt;h3&gt;Random Thought:&lt;/h3&gt;

&lt;p&gt;I've been worrying about the environmental impact of the web, and most discussions focus on the huge server farms used by mega-sites like Google and Facebook. However, I'm sure that individual developers and small companies could be working more actively on these problems too.&lt;/p&gt;

&lt;p&gt;What a dull post! I'll step it up next time, promise. Just to spice things up here's a video of a nutty robot:&lt;/p&gt;

&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/W1czBcnX1Ww&amp;amp;hl=en&amp;amp;fs=1" /&gt;
&lt;param name="allowFullScreen" value="true" /&gt;
&lt;param name="allowscriptaccess" value="always" /&gt;
&lt;embed src="http://www.youtube.com/v/W1czBcnX1Ww&amp;amp;hl=en&amp;amp;fs=1" allowfullscreen="true" type="application/x-shockwave-flash" allowscriptaccess="always" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/this-weeks-fun"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/this-weeks-fun#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=EMw1JqCrGrg:Z5yYetgV_ZA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=EMw1JqCrGrg:Z5yYetgV_ZA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=EMw1JqCrGrg:Z5yYetgV_ZA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=EMw1JqCrGrg:Z5yYetgV_ZA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=EMw1JqCrGrg:Z5yYetgV_ZA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/EMw1JqCrGrg" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://joelhughes.co.uk/this-weeks-fun</feedburner:origLink></item>
    <item>
      <pubDate>Thu, 14 May 2009 12:39:30 -0700</pubDate>
      <title>Erlang FizzBuzz Showdown (pt2)</title>
      <link>http://feedproxy.google.com/~r/joelhughes/~3/SGqcTn0UacA/erlang-fizzbuzz-showdown-pt2</link>
      <guid isPermaLink="false">http://joelhughes.co.uk/erlang-fizzbuzz-showdown-pt2</guid>
      <description>&lt;p&gt;
	&lt;p&gt;In my last post I documented some of the steps involved in building a simple &lt;a href="http://www.joelhughes.co.uk/blog/2009/05/erlang-fizzbuzz-showdown-pt-1"&gt;FizzBuzz script in Erlang&lt;/a&gt; and compared the code to its equivalents in Python, Ruby and PHP. So far we've simply covered using a tail-recursive function to creat a list of numbers 1-100.&lt;/p&gt;

&lt;p&gt;The next problem to tackle is checking whether a number is: just a number, a &lt;strong&gt;Fizz&lt;/strong&gt; (divisible by 3), a &lt;strong&gt;Buzz&lt;/strong&gt; (divisible by 5) or a &lt;strong&gt;FizzBuzz&lt;/strong&gt; (divisible by 3 and 5). As I'm in the habit of using &lt;em&gt;if statements&lt;/em&gt; to perform checks (I'm primarily a PHP developer) my first attempt looked like this:&lt;/p&gt;

&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;fizzbuzz(I) -&amp;gt;
    if
        ((I rem 3 =:= 0 ) and (I rem 5 =:= 0 )) -&amp;gt;
            fizzbuzz;
        I rem 3 =:= 0 -&amp;gt;
            fizz;
        I rem 5 =:= 0 -&amp;gt;
            buzz;
        true -&amp;gt;
            I
    end.&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;This works just fine, but isn't a good example of writing Erlang in a functional manner, this is more like &lt;a href="http://en.wikipedia.org/wiki/Imperative_programming" target="blank"&gt;imperative programming&lt;/a&gt; in style. For example, it is not dissimilar to this python function:&lt;/p&gt;

&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;# python

def fizzbuzz(i):
  if i % 3 == 0 and i % 5 == 0:
    return 'Fizzbuzz'
        
  elif i % 3 == 0:
    return 'Fizz'
        
  elif i % 5 == 0:
    return 'Buzz'
        
  else:
    return i&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;In Erlang (and I assume functional programming in general) &lt;a href="http://en.wikibooks.org/wiki/Erlang_Programming/guards" title="Erlang Guards" target="blank"&gt;Guards&lt;/a&gt; rather than &lt;em&gt;if statements&lt;/em&gt; are far more appropriate. So, using the multiple entry points for a function and combining them with a guard I ended up with this:&lt;/p&gt;

&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;fizzbuzz(N) when N rem 3 == 0, N rem 5 == 0 -&amp;gt; &amp;quot;FizzBuzz&amp;quot;;
fizzbuzz(N) when N rem 3 == 0 -&amp;gt; &amp;quot;Fizz&amp;quot;;
fizzbuzz(N) when N rem 5 == 0 -&amp;gt; &amp;quot;Buzz&amp;quot;;
fizzbuzz(N) -&amp;gt; N.&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Once I'd taken on board the functional approach the FizzBuzz function has not lost any readability (if anything this is easier to follow) and has become more compact and efficient. From what I've seen so far: Erlang programs rarely need &lt;em&gt;if statements&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The next stage in the FizzBuzz program is to combine this with my earlier &lt;em&gt;range function&lt;/em&gt; and loop through the numbers 1-100. Attempt 1 worked like so:&lt;/p&gt;

&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;combine(To) -&amp;gt;
  F = (fun(I) -&amp;gt;  fizzbuzz(I) end),
  lists:map(F,range(1,To,[])).&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Again, this works: the function &lt;em&gt;combine&lt;/em&gt; takes in the number to be counted up to (e.g. 100), then a &lt;em&gt;&lt;a href="http://erlang.org/doc/programming_examples/funs.html" target="blank"&gt;Fun&lt;/a&gt;&lt;/em&gt; is created (basically a mini function that can be passed into other functions as an argument) that is a copy of &lt;em&gt;fizzbuzz&lt;/em&gt;, and then uses the inbuilt module/function &lt;em&gt;lists/map&lt;/em&gt; to apply it to each number in the list returning a new list with the appropriate changes. But again this can be condensed to make better use of Elang's functional syntax.&lt;/p&gt;

&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;combine(To) -&amp;gt;
  [fizzbuzz(X) || X 

The end result is the same but the function now uses a pattern matching/balancing style syntax to produce the new list. The process breaks down like this:&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
    &lt;li&gt;
&lt;em&gt;[]&lt;/em&gt; is the list notation, and using the pipes to separate the two haves of the process (&lt;em&gt;[X || X ) means that the result of the right hand site is passed into the left (as X, formed by breaking the list down &lt;em&gt;X ), forming a new list one element at a time.&lt;/em&gt;&lt;/em&gt;
&lt;/li&gt;
    &lt;li&gt;The input list is formed using the &lt;em&gt;range function&lt;/em&gt; on the right.&lt;/li&gt;
    &lt;li&gt;Then the &lt;em&gt;fizzbuzz function&lt;/em&gt; processes the incoming elements of the new list on the left.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that almost concludes my Erlang FizzBuzz program. However, it is returning a list rather than printing one line at a time. This is the module so far:&lt;/p&gt;

&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;-module(fizzbuzz).
-export([fizzbuzz/1,range/3,combine/1]).

fizzbuzz(N) when N rem 3 == 0, N rem 5 == 0 -&amp;gt; &amp;quot;FizzBuzz&amp;quot;;
fizzbuzz(N) when N rem 3 == 0 -&amp;gt; &amp;quot;Fizz&amp;quot;;
fizzbuzz(N) when N rem 5 == 0 -&amp;gt; &amp;quot;Buzz&amp;quot;;
fizzbuzz(N) -&amp;gt; N.

range(To,To,List) -&amp;gt; [To|List];
range(From,To,List) when From  range(From, To -1, [To|List]);
range(From,To,List) when From &amp;gt; To -&amp;gt; List.

combine(To) -&amp;gt;
  [fizzbuzz(X) || X 

And being used in the console:


Eshell V5.6.5  (abort with ^G)
1&amp;gt; c(fizzbuzz).
{ok,fizzbuzz}
2&amp;gt; fizzbuzz:combine(100).
[1,2,&amp;quot;Fizz&amp;quot;,4,&amp;quot;Buzz&amp;quot;,&amp;quot;Fizz&amp;quot;,7,8,&amp;quot;Fizz&amp;quot;,&amp;quot;Buzz&amp;quot;,11,&amp;quot;Fizz&amp;quot;,13,
 14,&amp;quot;FizzBuzz&amp;quot;,16,17,&amp;quot;Fizz&amp;quot;,19,&amp;quot;Buzz&amp;quot;,&amp;quot;Fizz&amp;quot;,22,23,&amp;quot;Fizz&amp;quot;,
 &amp;quot;Buzz&amp;quot;,26,&amp;quot;Fizz&amp;quot;,28,29|...]


Finally, this can be condensed one last time by turning the range function into a tool for applying the fizzbuzz function to each number recursively, printing the results to the console as it goes:


-module(fb_final).
-export([fizzbuzz/1,fbr/2]).

fizzbuzz(N) when N rem 3 == 0, N rem 5 == 0 -&amp;gt;
  io:format(&amp;quot;FizzBuzz\n&amp;quot;);

fizzbuzz(N) when N rem 3 == 0 -&amp;gt;
  io:format(&amp;quot;Fizz\n&amp;quot;);

fizzbuzz(N) when N rem 5 == 0 -&amp;gt;
  io:format(&amp;quot;Buzz\n&amp;quot;);

fizzbuzz(N) -&amp;gt;
  io:format([integer_to_list(N) | &amp;quot;\n&amp;quot;]).

fbr(To,To) -&amp;gt; fizzbuzz(To);
fbr(From,To) when From  fizzbuzz(From), fbr(From + 1, To).



And with that I'm pretty pleased. The fb_final module makes good use of the functional approach, is concise but still fairly easy to read. In conclusion I'm enjoying Erlang a great deal.

P.S:
There is one last small modification that makes fbr/range reusable allowing higher order functions to be passed into it:


range(To,To,F) -&amp;gt; F(To);
range(From,To,F) when From  F(From), range(From + 1, To,F).


This executes using the following console script (inserting fizzbuzz into range as a higher order function):


Eshell V5.6.5  (abort with ^G)
1&amp;gt; c(fb_final).
{ok,fb_final}
2&amp;gt; fb_final:range(1,15,fun(N) -&amp;gt; fb_final:fizzbuzz(N) end).
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
ok



Done and dusted! And here are some other ways of getting FizzBuzz done in a functional style.&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://joelhughes.co.uk/erlang-fizzbuzz-showdown-pt2"&gt;Permalink&lt;/a&gt; 

	| &lt;a href="http://joelhughes.co.uk/erlang-fizzbuzz-showdown-pt2#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=SGqcTn0UacA:gR48EkIK5RI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=SGqcTn0UacA:gR48EkIK5RI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=SGqcTn0UacA:gR48EkIK5RI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?i=SGqcTn0UacA:gR48EkIK5RI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joelhughes?a=SGqcTn0UacA:gR48EkIK5RI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joelhughes?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joelhughes/~4/SGqcTn0UacA" height="1" width="1"/&gt;</description>
      <posterous:author>
        <posterous:userImage>http://files.posterous.com/user_profile_pics/645778/35179_420834342104_587742104_5007585_1222930_n.jpg</posterous:userImage>
        <posterous:profileUrl>http://posterous.com/users/4aARuBe6w2WJ</posterous:profileUrl>
        <posterous:firstName>Joel</posterous:firstName>
        <posterous:lastName>Hughes</posterous:lastName>
        <posterous:nickName>Rudenoise</posterous:nickName>
        <posterous:displayName>Joel Hughes</posterous:displayName>
      </posterous:author>
    <feedburner:origLink>http://joelhughes.co.uk/erlang-fizzbuzz-showdown-pt2</feedburner:origLink></item>
  </channel>
</rss>

