<?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:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Ben Godfrey</title><link>http://aftnn.org/</link><description /><language>en-GB</language><lastBuildDate>Tue, 13 Oct 2009 18:39:09 +0200</lastBuildDate><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/afternoon" /><feedburner:info uri="afternoon" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>51.4779</geo:lat><geo:long>-0.2136</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by-nd/2.0/</creativeCommons:license><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><item><title>Mixcloud is a great site for sharing mixes
</title><link>http://feedproxy.google.com/~r/afternoon/~3/PdBXR-8TTpc/</link><description>&lt;p&gt;&lt;span class="caps"&gt;UK&lt;/span&gt; startup Mixcloud has built a great site for sharing &lt;span class="caps"&gt;DJ&lt;/span&gt; mixes. It was fun enough that I typed out the full track-listing for my now-venerable &lt;a href="http://aftnn.org/stuff/music/afternoon_-_make_it_minimal.mp3"&gt;Make It Minimal&lt;/a&gt; mix, all 43&amp;nbsp;tracks!&lt;/p&gt;

&lt;div&gt;&lt;object width="300" height="300"&gt;&lt;param name="movie" value="http://www.mixcloud.com/media/swf/player/mixcloudLoader.swf?v=13"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;param name="flashVars" value="feed=http://www.mixcloud.com/api/1/cloudcast/afternoon/make-it-minimal.json"&gt;&lt;/param&gt;&lt;embed src="http://www.mixcloud.com/media/swf/player/mixcloudLoader.swf?v=13" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" flashvars="feed=http://www.mixcloud.com/api/1/cloudcast/afternoon/make-it-minimal.json" width="300px" height="300px"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="clear:both; height:3px;"&gt;&lt;/div&gt;&lt;p style="display:block; font-size:12px; font-family:Helvetica, Arial, sans-serif; margin:0; padding: 3px 4px 3px 4px; color:#999;"&gt;&lt;a href="http://www.mixcloud.com/afternoon/make-it-minimal/" style="color:#02a0c7; font-weight:bold;"&gt;Make It Minimal&lt;/a&gt; by &lt;a href="http://www.mixcloud.com/afternoon/" style="color:#02a0c7; font-weight:bold;"&gt;Afternoon&lt;/a&gt; on &lt;a href="http://www.mixcloud.com/" style="color:#02a0c7; font-weight:bold;"&gt;&amp;nbsp;Mixcloud&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both; height:3px;"&gt;&lt;/div&gt;&lt;/div&gt;

</description><pubDate>Tue, 13 Oct 2009 18:39:09 +0200</pubDate><guid isPermaLink="false">http://aftnn.org/2009/oct/13/mixcloud-great-site-sharing-mixes/</guid><category>minimal</category><category>mixcloud</category><feedburner:origLink>http://aftnn.org/2009/oct/13/mixcloud-great-site-sharing-mixes/</feedburner:origLink></item><item><title>How I work
</title><link>http://feedproxy.google.com/~r/afternoon/~3/XaawEFT_lUU/</link><description>&lt;p&gt;I&amp;#8217;m an independent software engineer working on a contract basis. I have a process for projects. It&amp;#8217;s a relatively lightweight, loosely &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;agile&lt;/a&gt; methodology. It attempts to ensure projects run smoothly by building software in a series of short&amp;nbsp;iterations.&lt;/p&gt;

&lt;h2&gt;Face-to-face or Skype&amp;nbsp;meeting&lt;/h2&gt;

&lt;p&gt;After an introduction is made, I organise a face-to-face or Skype meeting. I get an overview of the requirements and the context in which the application will sit, the business goals. Clients often have preconceptions about what I&amp;#8217;ll do, how long it will take, etc. I like to learn about the project so I can challenge those preconceptions if necessary. For example, if a client asks me to create a blogging tool, I&amp;#8217;ll make sure that none of the off-the-shelf tools will do before proceeding. I&amp;#8217;m actually pretty vigorous in recommending alternate approaches. &lt;a href="http://aftnn.org/2009/may/19/software-development-advice-startups/"&gt;My experience is that a lot of stress and heartache can be avoided&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Because I practise agile software development, I encourage clients to find a minimum set of features which can be implemented an iteration lasting up to 2 weeks. This is a useful process. It encourages both me and my clients to think about the business goals first. If those goals can be met without software or with off-the-shelf tools, we can make that decision&amp;nbsp;now.&lt;/p&gt;

&lt;h2&gt;Specification&amp;nbsp;document&lt;/h2&gt;

&lt;p&gt;After the initial meeting and a follow-up email or 2, I will produce an iteration specification document. I usually get this to the client within a few days to a week depending on how busy I am. I can rush it through if&amp;nbsp;necessary.&lt;/p&gt;

&lt;p&gt;The specification will list the set of user stories (how the app will be used, tasks it will support) and the features required (the actual stuff I&amp;#8217;ll build). The feature set will take no more than 2 weeks to develop, test and deploy. Additional features are left for subsequent&amp;nbsp;iterations.&lt;/p&gt;

&lt;p&gt;If the client is happy, work begins. Otherwise the spec is revised. The spec is my statement of intention, this is my understanding of what the client wants me to build. I ask my clients to check this carefully. If I&amp;#8217;ve got something wrong, it&amp;#8217;s time-consuming to fix later. It&amp;#8217;s often hard to make spec docs exhaustive and unambiguous and this can lead to disagreements, I try hard to avoid&amp;nbsp;that.&lt;/p&gt;

&lt;h2&gt;Developing&amp;nbsp;iteratively&lt;/h2&gt;

&lt;p&gt;The work begins on the first iteration. I will develop the required features and test and deploy the software within the stated time period. During this period communication slows down a bit. Coding requires a really quite extreme level of concentration so I tend to close my email, Skype, etc and put my headphones&amp;nbsp;on.&lt;/p&gt;

&lt;p&gt;Only quite minor changes to the spec can be accommodated once an iteration has begun. If changes are frequent, it&amp;#8217;s very hard to get up to speed. A car can go much faster on a straight road. The client&amp;#8217;s desire to provide new feedback and ideas and the developer&amp;#8217;s desire to get the job done are often in competition. The beauty of developing in short iterations is that this competition can be resolved. Ideas can wait a week or 2, in fact they benefit from more consideration, meanwhile the develop can code away&amp;nbsp;undisturbed.&lt;/p&gt;

&lt;p&gt;Towards the end of the iteration, the new code is deployed to somewhere where it can be tested by myself, the client and other stakeholders, often a staging site. Bugs are found and fixed. Loose ends are tied up. Finally, the software is put into production. Bug testing and fixing takes from 25-50% of the iteration time. Deployment is generally straightforward, but can still take a few hours, for that reason it&amp;#8217;s only done once per&amp;nbsp;iteration.&lt;/p&gt;

&lt;p&gt;When an iteration is complete, the process begins again. A face-to-face or Skype meeting allows the client and I to assess what&amp;#8217;s been achieved so far. Learning from one iteration goes into the next. A new spec is produced and I get back to&amp;nbsp;work.&lt;/p&gt;

</description><pubDate>Tue, 29 Sep 2009 15:12:34 +0200</pubDate><guid isPermaLink="false">http://aftnn.org/2009/sep/29/how-i-work/</guid><category>process</category><category>software</category><feedburner:origLink>http://aftnn.org/2009/sep/29/how-i-work/</feedburner:origLink></item><item><title>Clojure: a stateless dynamically-typed Lisp on the JVM
</title><link>http://feedproxy.google.com/~r/afternoon/~3/zAHtoFE7tlc/</link><description>&lt;p&gt;I&amp;#8217;m a big fan of programming without state in languages like Haskell and Erlang. &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt; is a modern Lisp, but follows the stateless style very closely, taking ideas from Haskell and &lt;span class="caps"&gt;ML&lt;/span&gt;. Clojure is implemented in Java and runs on the &lt;span class="caps"&gt;JVM&lt;/span&gt;, providing full access to all of Java&amp;#8217;s&amp;nbsp;libraries.&lt;/p&gt;

&lt;h2&gt;Modern&lt;/h2&gt;

&lt;p&gt;Clojure is a lot less crufty than other Lisp implementations, some of which are now pretty long in the tooth. Maps and vectors and a few other things are given syntax. Macros still work though, so I guess it&amp;#8217;s still all s-expressions (&lt;code&gt;[1 2 3]&lt;/code&gt; could trivially map to &lt;code&gt;(vector 1 2 3)&lt;/code&gt;). Clojure has a terse syntax with lots of good code smells (e.g. &lt;code&gt;*constant*&lt;/code&gt; and &lt;code&gt;predicate?&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;Structural&amp;nbsp;sharing&lt;/h2&gt;

&lt;p&gt;Clojure benefits from state of the art data structure research. Clojure&amp;#8217;s key data structures (lists, vectors, maps) are implemented using a technique called structural sharing. If you add an element to the front of an existing list, the new list is simply the new item plus the existing list. The existing list can be stored once. The new item simply points to the head of the existing list. This technique preserves complexity characteristics of operations on data structures (insert, remove, access, etc), minimises memory footprint and provides immutable state! Very cool&amp;nbsp;stuff.&lt;/p&gt;

&lt;h2&gt;Dynamic&amp;nbsp;typing&lt;/h2&gt;

&lt;p&gt;Clojure is dynamically-typed like Python or Ruby. This makes it a good entry point from these languages. For programmers looking to program without state other options are Haskell or Erlang. Erlang is awesome for building highly available, concurrent applications. It&amp;#8217;s syntax is kind of fun, but not for everyone. Haskell is strongly typed, pure and lazy. This unique mix of features can be very powerful, but can also trip you up. Both languages have a sweet spot, Clojure feels more general purpose. For me, that means great for scripting and writing web apps&amp;nbsp;:-).&lt;/p&gt;

&lt;p&gt;I like Django&amp;#8217;s minimal template language. There is an implementation in Erlang, but Erlang&amp;#8217;s string processing is somewhat weak. Templating and other string processing, like parsing &lt;span class="caps"&gt;JSON&lt;/span&gt;, is a bit long-winded. Haskell doesn&amp;#8217;t have any good template languages, the best option is &lt;a href="http://www.haskell.org/ghc/docs/latest/html/libraries/xhtml/Text-XHtml.html"&gt;Text.Xhtml&lt;/a&gt;, a combinator library. Not very designer-friendly. Haskell&amp;#8217;s powerful type system isn&amp;#8217;t very useful for implementing a text template language. It gets in the way more than it helps. It feels like an impedance mismatch. It would be an interesting project to build a template processor compatible with Django in&amp;nbsp;Clojure.&lt;/p&gt;

&lt;h2&gt;Recommended&amp;nbsp;viewing&lt;/h2&gt;

&lt;p&gt;For a more complete description &lt;a href="http://blip.tv/file/812787"&gt;watch Clojure creator Rich Hickey describing Clojure and walking through a concurrent application&lt;/a&gt;.&lt;/p&gt;

</description><pubDate>Tue, 21 Jul 2009 13:15:38 +0200</pubDate><guid isPermaLink="false">http://aftnn.org/2009/jul/21/clojure-stateless-dynamicly-typed-lisp-jvm/</guid><category>clojure</category><category>erlang</category><category>functionalprogramming</category><category>haskell</category><category>lisp</category><feedburner:origLink>http://aftnn.org/2009/jul/21/clojure-stateless-dynamicly-typed-lisp-jvm/</feedburner:origLink></item><item><title>Software development advice for startups
</title><link>http://feedproxy.google.com/~r/afternoon/~3/DYutT8fXzUY/</link><description>&lt;p&gt;You&amp;#8217;ve got a great idea! You want to build a web site that saves people time and money and helps them make friends! You&amp;#8217;ve written a rough business plan, now you want to find someone to build your&amp;nbsp;site.&lt;/p&gt;

&lt;p&gt;Software development is complicated, expensive, error-prone, regularly boring and complicated. As a programmer, here&amp;#8217;s what I think you should know before we meet for&amp;nbsp;coffee.&lt;/p&gt;

&lt;h2&gt;1. Avoid developing&amp;nbsp;software&lt;/h2&gt;

&lt;p&gt;As a general rule, you should avoid doing anything you don&amp;#8217;t need to do in a startup or new project. You have plenty of things to worry about. If you can possibly avoid writing software, do so. Need a website? Use WordPress. &lt;a href="http://intruders.tv/"&gt;Intruders.tv&lt;/a&gt; and &lt;a href="http://icanhascheezburger.com/"&gt;I Can Has Cheezburger&lt;/a&gt; are 2 great businesses built on WordPress. Need something like a social network? Use Ning. Prove that you can build the community, then transition to a bespoke platform to build features. Since 2004, an amazing number of high quality, free or low-cost tools have come on to the market. Tools don&amp;#8217;t have to be perfect. Maybe half your product is already implemented by someone else&amp;#8217;s &lt;span class="caps"&gt;API&lt;/span&gt;. Use that, build the other half. Worry about strategic risks later. You&amp;#8217;re prototyping&amp;nbsp;remember.&lt;/p&gt;

&lt;h2&gt;2. Software is&amp;nbsp;complex&lt;/h2&gt;

&lt;p&gt;Software is complex and fragile. Even a simple piece of software is many times more complex than a car engine for example. Even simple web apps built with standard tools don&amp;#8217;t tend to share that many common parts. Understanding an application later and modifying it is really a very complex task&amp;nbsp;indeed.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s many times easier to change an idea or a document or a diagram than to change software. Try to make changes early and avoid making them late if possible. The agile methodology, building software bit by bit in short sprints, makes it more likely that you&amp;#8217;ll change something before it&amp;#8217;s been coded, tested and&amp;nbsp;deployed.&lt;/p&gt;

&lt;h2&gt;3. Don&amp;#8217;t make a big long list of features stretching until the end of time and&amp;nbsp;space&lt;/h2&gt;

&lt;p&gt;Decide what the very core of your offering is, find out if your customers are interested and build the minimum that can solve their&amp;nbsp;problem.&lt;/p&gt;

&lt;p&gt;This approach costs less and is less risky than building your perfect dream. When you have the minimum viable product built, solicit feedback from your customers. By making the big list, you&amp;#8217;re second guessing what they want. You&amp;#8217;re probably&amp;nbsp;wrong.&lt;/p&gt;

&lt;p&gt;Ideas happen much more quickly than the code. An idea might take a day to think through and a week or a month to implement. If you make a list of features, those features will be irrelevant by the time the programmers get around to building them. Stay in the moment. Keep the list to what your customers are asking for&amp;nbsp;today.&lt;/p&gt;

&lt;h2&gt;4. Let your developers (and designers) do their&amp;nbsp;job&lt;/h2&gt;

&lt;p&gt;Cheaper development teams are great when you have a known problem and a known solution. When you&amp;#8217;re launching a new product, you have only one or neither. Communication is critical, but it&amp;#8217;s also important to respect the software development process. Remember that writing software is complex, boring and error-prone. This means most of the time, developers have to get their heads down and work, work, work. I find 2 weeks a good length for a block of work because it gives a good mix of regular points for communication, keeping the product connected to reality, and time to get things&amp;nbsp;done.&lt;/p&gt;

&lt;p&gt;Be flexible enough to create an environment where your team can get on with delivering a great product, and you can get on with everything&amp;nbsp;else.&lt;/p&gt;

&lt;p&gt;Bonus point: If you engage a designer, let them design. You have to be proud of the way your application or site looks, but you are not the customer, the customer is. Experienced designers are good at making things that work well and look good for the larger audience. Try not to make personal judgement, like &amp;#8220;I don&amp;#8217;t like that grey.&amp;#8221; Your customers probably won&amp;#8217;t care as long as the site or service looks professional and is easy to use. If you have &lt;a href="http://en.wikipedia.org/wiki/A/B_testing"&gt;A/B test&lt;/a&gt; data to show that the grey has lower conversion rates, that&amp;#8217;s different (Google actually tests different shades of&amp;nbsp;blue).&lt;/p&gt;

&lt;h2&gt;5. Don&amp;#8217;t&amp;nbsp;micromanage&lt;/h2&gt;

&lt;p&gt;This is kind of the same as the previous point, but it&amp;#8217;s vitally important for software. If you&amp;#8217;re launching a product and you start involving yourself in the minutiae of development, you will slow the process down hugely. Development takes focus, handling a micromanaging client takes time and destroys that focus, leading to mistakes and&amp;nbsp;delays.&lt;/p&gt;

&lt;p&gt;Let small decisions go. Revisit them if they really are wrong.  You don&amp;#8217;t know if your product will be a hit yet. You need to get something out there as quickly and as cheaply as possible. If it later turns out you need to change the core product (which you almost certainly will), all the time spent fine tuning before launch is time&amp;nbsp;wasted.&lt;/p&gt;

&lt;h2&gt;6. Software is only part of the&amp;nbsp;puzzle&lt;/h2&gt;

&lt;p&gt;Finding money, figuring out a product and having it built is not easy, but it is well understood and, given a sensible spec, can be acheived in a finite amount of&amp;nbsp;time.&lt;/p&gt;

&lt;p&gt;Most new products don&amp;#8217;t fail because the implementation was bad, they fail because the customers never came. Make sure the customer is there before you start. Make sure you know where they will come from, why they will use your product. Make sure you know this inside out. It&amp;#8217;s very possible that your idea, though neat, isn&amp;#8217;t a workable business. You really want to learn that before investing time and effort in building a product. &lt;a href="http://www.amazon.co.uk/New-Business-Road-Test-Entrepreneurs/dp/0273708058/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1254230145&amp;amp;sr=8-1"&gt;The New Business Road Test&lt;/a&gt; is an excellent book on evaluating&amp;nbsp;opportunities.&lt;/p&gt;

&lt;h2&gt;7. Rewriting is&amp;nbsp;common&lt;/h2&gt;

&lt;p&gt;Once a piece of software has been around the block once or twice, the task it&amp;#8217;s being used for ends up pretty far from the one is was intended for. Maintaining it becomes increasingly difficult. At this point, it&amp;#8217;s time to consider a rewrite. This is a good thing. New tools and practices will have emerged that you can take advantage of. You know more about the business you&amp;#8217;re in and you can cut out the features you don&amp;#8217;t need and concentrate on making the ones you do much better. Rewriting is good. Plan to rewrite. Get stuff done simply and quickly at first, revisit it later when you know&amp;nbsp;more.&lt;/p&gt;

&lt;p&gt;This is a controversial point. Trying to change software is like trying to change a car into a boat, it can be done with time and effort, but building a boat from scratch will be easier and the final boat will keep water out better, go faster, look nicer and generally be more fit for purpose. Data from &lt;span class="caps"&gt;NASA&lt;/span&gt; cited in &lt;a href="http://www.amazon.com/Facts-Fallacies-Software-Engineering-Development/dp/0321117425"&gt;Facts and Fallacies of Software Engineering&lt;/a&gt; suggest that if as little as 30% of an application needs to be changed, it is less time-consuming and expensive to start&amp;nbsp;over.&lt;/p&gt;

&lt;h2&gt;And&amp;nbsp;finally&amp;#8230;&lt;/h2&gt;

&lt;p&gt;There are many great books about software engineering, but I can personally recommend none more than Robert L Glass&amp;#8217;s &lt;a href="http://www.amazon.com/Facts-Fallacies-Software-Engineering-Development/dp/0321117425"&gt;Facts and Fallacies of Software Engineering&lt;/a&gt;.  It is a mine of empirical data about what makes software projects succeed and fail. If your company&amp;#8217;s business is making software (which it is if you&amp;#8217;re a web business), you need to read this&amp;nbsp;book.&lt;/p&gt;

&lt;p&gt;There are also a number of great websites about startups, few are finer than Eric Ries&amp;#8217; &lt;a href="http://startuplessonslearned.blogspot.com/"&gt;Startup Lessons Learned&lt;/a&gt;. Read it all. Twice.&amp;nbsp;Carefully.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.amazon.co.uk/New-Business-Road-Test-Entrepreneurs/dp/0273708058/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1254230145&amp;amp;sr=8-1"&gt;The New Business Road Test&lt;/a&gt; is a great tool for stopping yourself from diving in to an ill-advised venture. Reading it may save you a lot of time and money and prevent&amp;nbsp;hair-loss.&lt;/p&gt;

</description><pubDate>Tue, 19 May 2009 20:59:59 +0200</pubDate><guid isPermaLink="false">http://aftnn.org/2009/may/19/software-development-advice-startups/</guid><category>development</category><category>startups</category><feedburner:origLink>http://aftnn.org/2009/may/19/software-development-advice-startups/</feedburner:origLink></item><item><title>Django, Drupal, Webmachine: Different frameworks for different projects
</title><link>http://feedproxy.google.com/~r/afternoon/~3/Ff82POZPsJI/</link><description>&lt;p&gt;&lt;a href="http://www.djangoproject.com/"&gt;Django&lt;/a&gt; is an awesome framework but different projects have different needs. The last 2 projects I&amp;#8217;ve been involved with have been using &lt;a href="http://drupal.org/"&gt;Drupal&lt;/a&gt;. Other projects I&amp;#8217;m planning call for very RESTful designs. &lt;a href="http://bitbucket.org/justin/webmachine/wiki/Home"&gt;Webmachine&lt;/a&gt;, an Erlang framework, is a great fit for&amp;nbsp;these.&lt;/p&gt;

&lt;p&gt;I do still very much love Python and Django, perhaps even more that I&amp;#8217;m using &lt;span class="caps"&gt;PHP&lt;/span&gt; day to day. I miss the &lt;span class="caps"&gt;REPL&lt;/span&gt;. I miss first class functions. I miss Django&amp;#8217;s very tidy organisation of&amp;nbsp;code.&lt;/p&gt;

&lt;p&gt;Drupal is something I&amp;#8217;ve studiously avoided for a long time, thinking it to be a Zope-like mire. That&amp;#8217;s true to an extent: there are many versions and a lot of code. Drupal apps do have good separation of concerns. The internal organisation of modules and themes is useful, although there&amp;#8217;s a little bit too much function name magic going on (&amp;#8220;Why isn&amp;#8217;t my validator firing? Who knows!&amp;#8221;). I&amp;#8217;m interested in hooks, although I haven&amp;#8217;t needed them yet. The same concept has served Django hackers&amp;nbsp;well.&lt;/p&gt;

&lt;h2&gt;Leaky&amp;nbsp;abstractions&lt;/h2&gt;

&lt;p&gt;Django and Drupal are both leaky abstractions. It&amp;#8217;s easy to create great big joins with Django&amp;#8217;s &lt;span class="caps"&gt;ORM&lt;/span&gt;. Drupal generates a mammoth set of &lt;span class="caps"&gt;CSS&lt;/span&gt; and &lt;span class="caps"&gt;JS&lt;/span&gt; imports per page. Both of these can be addressed with programmer discipline, but sometimes it&amp;#8217;s nice to have a thinner level of abstraction to make you think carefully about each requirement and how best to implement it. Webmachine is such an abstraction. What it does provide, however, is system management built on top of Erlang and &lt;span class="caps"&gt;OTP&lt;/span&gt;. People doing scale (a group I&amp;#8217;m not a member of) find that writing the initial app is easy, scaling it is&amp;nbsp;hard.&lt;/p&gt;

&lt;h2&gt;Easy hacking, easy&amp;nbsp;scaling&lt;/h2&gt;

&lt;p&gt;Newer frameworks seek to make initial implementation easy and scaling easy too. Webmachine is undoubtedly somewhat harder to code for than Django, there are less batteries included, but, in theory at least, scaling is easier. Only a little of that is due to implementation, most is due to architectural style. Webmachine does get in your way a bit less when hacking RESTfully. Django does things like setting cookies on every hit, making caching harder, increasing load on your&amp;nbsp;app.&lt;/p&gt;

&lt;p&gt;I think the current leader for easy hacking, easy scaling is Google App Engine. The core of Django runs happily, the system scales to Google&amp;#8217;s infrastructure, deployment is very simple. &lt;span class="caps"&gt;GAE&lt;/span&gt; has one flaw though, porting to another platform involves work modifying code and extracting data. While the code scales effortlessly, scaling a business around that code seems harder. If your goals don&amp;#8217;t chime with Google&amp;#8217;s, you&amp;#8217;re stuck. Frameworks running on open source software stacks are more trustable and it&amp;#8217;s for this reason that &lt;span class="caps"&gt;EC2&lt;/span&gt; is so much more popular than &lt;span class="caps"&gt;GAE&lt;/span&gt; to&amp;nbsp;date.&lt;/p&gt;

</description><pubDate>Wed, 13 May 2009 13:26:02 +0200</pubDate><guid isPermaLink="false">http://aftnn.org/2009/may/13/django-drupal-webmachine-different-frameworks-different-projects/</guid><category>django</category><category>drupal</category><category>webmachine</category><feedburner:origLink>http://aftnn.org/2009/may/13/django-drupal-webmachine-different-frameworks-different-projects/</feedburner:origLink></item><item><title>Python syntax highlighting with Chili
</title><link>http://feedproxy.google.com/~r/afternoon/~3/G0JVsAvLUK8/</link><description>&lt;p&gt;I&amp;#8217;ve enabled syntax highlighting on this site using the very tidy &lt;a href="http://noteslog.com/chili/"&gt;Chili&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The standard distribution of Chili doesn&amp;#8217;t include a Python language definition (or Erlang, or Haskell&amp;#8230;), so I wrote&amp;nbsp;one.&lt;/p&gt;

&lt;p&gt;&lt;a href="/stuff/code/python.js"&gt;Download Python recipe for&amp;nbsp;Python&lt;/a&gt;&lt;/p&gt;

</description><pubDate>Fri, 24 Apr 2009 15:54:11 +0200</pubDate><guid isPermaLink="false">http://aftnn.org/2009/apr/24/python-syntax-highlighting-chili/</guid><category>chili</category><category>jquery</category><category>python</category><feedburner:origLink>http://aftnn.org/2009/apr/24/python-syntax-highlighting-chili/</feedburner:origLink></item><item><title>Use SSH public key authentication with Fabric
</title><link>http://feedproxy.google.com/~r/afternoon/~3/X7O-9pYGmeE/</link><description>&lt;p&gt;&lt;a href="http://www.nongnu.org/fab/"&gt;Fabric&lt;/a&gt; is a very useful Python tool for scripting administration of remote servers. Like &lt;a href="http://www.capify.org/"&gt;Capistrano&lt;/a&gt; it allows you to define tasks as a mixture of local and remote operations and then run them for lots of hosts, different groups of hosts,&amp;nbsp;etc.&lt;/p&gt;

&lt;p&gt;Increasingly I&amp;#8217;m using configuring &lt;code&gt;sshd&lt;/code&gt; to allow public key authentication only. Using this method makes your server more secure against increasingly common &lt;span class="caps"&gt;SSH&lt;/span&gt; brute force attacks. You can also configure an &lt;code&gt;ssh-agent&lt;/code&gt; app to allow password-less&amp;nbsp;logins.&lt;/p&gt;

&lt;p&gt;If you want your Fabric tasks to access machines using public key authentication, add something like to your&amp;nbsp;Fabfile:&lt;/p&gt;

&lt;pre&gt;&lt;code class="python"&gt;from paramiko import RSAKey

config.fab_user = "jhacker"
config.fab_pkey = RSAKey.from_private_key_file("/path/to/keyfile")&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Simple, and very&amp;nbsp;useful.&lt;/p&gt;

</description><pubDate>Fri, 24 Apr 2009 14:13:12 +0200</pubDate><guid isPermaLink="false">http://aftnn.org/2009/apr/24/use-ssh-public-key-authentication-fabric/</guid><category>fabric</category><category>ssh</category><feedburner:origLink>http://aftnn.org/2009/apr/24/use-ssh-public-key-authentication-fabric/</feedburner:origLink></item><item><title>Working from Bali, working from London
</title><link>http://feedproxy.google.com/~r/afternoon/~3/wrgYSzSeOzA/</link><description>&lt;p&gt;I&amp;#8217;m flying long haul from Bali to London. I&amp;#8217;m returning from 3 months spent in Bali, during which I worked on and off, sometimes even for money. Long-distance telecommuting is an interesting experience. Being away from London has made me think about living and working there in a new&amp;nbsp;light.&lt;/p&gt;

&lt;p&gt;Telecommuting from a relatively well-developed place like South Bali is very easy. Free wifi is readily available and backed by &amp;#8220;fast enough&amp;#8221; internet connections (up to 1Mbps at time of writing). Enough for a Skype call, sometimes even video.  Coffee and food are cheap enough that you can pick a café and make it your full-time office. (My thanks go to the proprietors and staff of Grocer and Grind, Sticky Fingers, Bali Buddha and Café Lazumba and Café&amp;nbsp;Local.)&lt;/p&gt;

&lt;p&gt;Contract software development lends itself well to telework. It requires some kind of rigorous technical specification to be agreed by contractor and client.  The work itself involves periods of focus. This means  communication is generally quite minimal. It can be concentrated into daily bursts for example, and is often better than&amp;nbsp;way.&lt;/p&gt;

&lt;p&gt;I found it difficult to work around the time difference. My &lt;span class="caps"&gt;UK&lt;/span&gt; clients would start work as my day was finishing, so the end of the day should have been set aside for communication. In reality I was often busy with other things by then, my girlfriend finished work at 5 and I got into Pilates and other pleasant evening activities. I ended up having email conversations with a 24-hour reply&amp;nbsp;frequency.&lt;/p&gt;

&lt;p&gt;I also found it difficult to sell clients my services from Bali. Work I agreed before I left went well, but people were reluctant to commit to new work without face to face meetings, though they weren&amp;#8217;t explicit about this. After the window of remaining time shrank to less than a month, conversations degenerated to &amp;#8220;email me when you get back&amp;#8221; frustratingly quickly. I have a list of 14 people to email this&amp;nbsp;week.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m looking forward to coming back to London. I&amp;#8217;ve missed my friends, my family, the tech start-up community (and my bikes). I&amp;#8217;m planning a busy period to make up for all the slacking I did in Bali. Amusingly enough, much of the &amp;#8220;slacking&amp;#8221; involved hacking away on personal stuff or projects for charity. It was great to get the mental space for things like &lt;a href="http://followize.appspot.com/"&gt;Followize&lt;/a&gt;, the redesign of this site, learning more Haskell and doing some serious&amp;nbsp;reading.&lt;/p&gt;

&lt;p&gt;My busy period kicks off with a return to the tech start-up scene &amp;mdash; attending a bunch of events to catch up with people and activity &amp;mdash; and with lots of meetings with people I haven&amp;#8217;t seen for a while. When I left in December, startups in London was perceived to be coping with the economicrisis better than those in some other cities. I&amp;#8217;m intrigued to see how views have changed in the first quarter of this year, whether people are starting to feel the pinch more accutely. Many of the companies I know well are pre-revenue. Others (e.g.  &lt;a href="http://huddle.net/"&gt;Huddle&lt;/a&gt;) offer concrete cost-savings to their customers and thus may even benefit from the&amp;nbsp;downturn.&lt;/p&gt;

&lt;p&gt;Since becoming a freelancer again I&amp;#8217;ve been considering what I want my future role to be. I have a fair amount of web tech experience and quite a bit of startup experience (all learning from my mistakes). I like to think that my role could be as a consultant technologist attractive to some of the great companies building their products. I wonder how long I want to stick at a non-scalable profession. I took on the challenge of MyMart to chase that big pay-off that comes to the companies that win. We failed sadly, but I&amp;#8217;m interested in buying another lottery&amp;nbsp;ticket.&lt;/p&gt;

</description><pubDate>Wed, 18 Mar 2009 19:20:17 +0200</pubDate><guid isPermaLink="false">http://aftnn.org/2009/mar/18/working-bali-working-london/</guid><category>bali</category><category>downturn</category><category>london</category><category>telecommuting</category><feedburner:origLink>http://aftnn.org/2009/mar/18/working-bali-working-london/</feedburner:origLink></item><item><title>Client-side MVC is maturing
</title><link>http://feedproxy.google.com/~r/afternoon/~3/qwKCxfBBB94/</link><description>&lt;p&gt;Rich Internet Applications (RIAs) are still increasing in popularity. We&amp;#8217;ve reached the stage where they aren&amp;#8217;t called RIAs any more, they&amp;#8217;re just cool websites. (Ever heard someone call Facebook an &lt;span class="caps"&gt;RIA&lt;/span&gt;?) There is a increasing demand for tools to build great UIs easily and to build JavaScript-only applications for platforms such as OpenSocial. There are a range of toolkits for building RIAs but most of them are tied to a specific server&amp;nbsp;platform.&lt;/p&gt;

&lt;p&gt;A framework takes care of repetitive tasks. In an &lt;span class="caps"&gt;RIA&lt;/span&gt;, these include building screens, including providing rich controls, validation etc. The framework should also provide an abstraction for maintaining state and requesting data from web services via &lt;span class="caps"&gt;XHR&lt;/span&gt;. While building an OpenSocial application in December, I could have saved a lot of time developing on top of such a&amp;nbsp;framework.&lt;/p&gt;

&lt;p&gt;&lt;span class="caps"&gt;MVC&lt;/span&gt; is the dominant model for &lt;span class="caps"&gt;UI&lt;/span&gt; development in the desktop world. A modified form is very popular in web development. It makes a lot of sense to stick to &lt;span class="caps"&gt;MVC&lt;/span&gt; for &lt;span class="caps"&gt;RIA&lt;/span&gt; development. RIAs running in the browser (or Flash or &lt;span class="caps"&gt;AIR&lt;/span&gt;) bear close resemblance to desktop&amp;nbsp;applications.&lt;/p&gt;

&lt;p&gt;Of the server-and-client toolkits, &lt;a href="http://code.google.com/webtoolkit/"&gt;Google Web Toolkit&lt;/a&gt; is perhaps the best known. You write Java code and it compiles it to a web application complete with &lt;span class="caps"&gt;HTML&lt;/span&gt;, JavaScript and &lt;span class="caps"&gt;CSS&lt;/span&gt;. This is an interesting idea, but the server-side component is not interchangeable and requires Java. It also leaves virtually no visibility in the compiled&amp;nbsp;code.&lt;/p&gt;

&lt;p&gt;Wouldn&amp;#8217;t it be great if there were a client-side only JavaScript framework which allowed you to build nice UIs quickly and easily and load data from any server back-end? Given the variety of technologies for server-side web app code, you think this would be an active area. Doesn&amp;#8217;t it slightly suck that you have an interesting web toolkit in &lt;span class="caps"&gt;GWT&lt;/span&gt; and a cool cloud hosting platform in App Engine, both from the same company, but you can&amp;#8217;t use them&amp;nbsp;together?&lt;/p&gt;

&lt;p&gt;I was pleased to see that the cunningly-named &lt;a href="http://javascriptmvc.com/"&gt;JavaScriptMVC&lt;/a&gt; framework got it&amp;#8217;s &lt;a href="http://javascriptmvc.com/wiki/index.php?title=1.5"&gt;version 1.5 release&lt;/a&gt;. This version adds some new development tools and documentation, but it&amp;#8217;s still back-end independent. On the other hand it does look a little&amp;nbsp;heavyweight.&lt;/p&gt;

&lt;p&gt;Topper Bowers just open-sourced his &lt;a href="http://blog.toppingdesign.com/2009/03/15/mamoo-released-as-open-source/"&gt;Mamoo&lt;/a&gt; framework. Although Mamoo doesn&amp;#8217;t seem to be a run-of-the-mill &lt;span class="caps"&gt;RIA&lt;/span&gt; platform, it does provide some of the &lt;span class="caps"&gt;MVC&lt;/span&gt; goodness that those applications&amp;nbsp;need.&lt;/p&gt;

&lt;p&gt;I look forward to checking out both of these projects in more depth. Certainly JavaScript-only &lt;span class="caps"&gt;MVC&lt;/span&gt; frameworks are needed if smaller development operations are to produce applications with the level of quality and &lt;span class="caps"&gt;UI&lt;/span&gt; finesse seen in, for example, Facebook or&amp;nbsp;GMail.&lt;/p&gt;

</description><pubDate>Wed, 18 Mar 2009 01:52:27 +0200</pubDate><guid isPermaLink="false">http://aftnn.org/2009/mar/18/client-side-mvc-maturing/</guid><category>javascript</category><category>mvc</category><category>ria</category><feedburner:origLink>http://aftnn.org/2009/mar/18/client-side-mvc-maturing/</feedburner:origLink></item><item><title>Announcing aftnn.org version 2.0
</title><link>http://feedproxy.google.com/~r/afternoon/~3/HKIWxIxQBKM/</link><description>&lt;p&gt;Version 2.0 of &lt;a href="http://aftnn.org/"&gt;aftnn.org&lt;/a&gt; is&amp;nbsp;here!&lt;/p&gt;

&lt;p&gt;The new site is powered by the &lt;a href="http://byteflow.su/"&gt;Byteflow&lt;/a&gt; with a few some custom bits. Byteflow runs on top of &lt;a href="http://djangoproject.com/"&gt;Django&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Some of the features I&amp;#8217;m happiest&amp;nbsp;about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;My &lt;a href="http://friendfeed.com/afternoon/"&gt;FriendFeed&lt;/a&gt; collects all the stuff I&amp;#8217;ve been doing on the web and I re-use that feed&amp;nbsp;here.&lt;/li&gt;
&lt;li&gt;The vast majority of old urls still work. My nginx config contains a rewrite line for each blog post. Not pretty, but&amp;nbsp;fast.&lt;/li&gt;
&lt;li&gt;The Content and Photos sections are dynamically generated, making them easier to&amp;nbsp;maintain.&lt;/li&gt;
&lt;li&gt;I can finally write blog posts in &lt;a href="http://daringfireball.net/projects/markdown/syntax"&gt;Markdown&lt;/a&gt;, not raw &lt;span class="caps"&gt;HTML&lt;/span&gt;. Byteflow actually allows me to select a text renderer per-post, so I can write one post in Markdown, the next in MediaWiki&amp;nbsp;markup.&lt;/li&gt;
&lt;li&gt;Comments are hosted locally again, not by Intense Debate, and are protected by &lt;span class="caps"&gt;CAPTCHA&lt;/span&gt;. Alternatively, you can log in with your OpenID to&amp;nbsp;comment.&lt;/li&gt;
&lt;li&gt;nginx serves up static content very quickly and gzips everything&amp;nbsp;too.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are always some down-sides&amp;nbsp;though.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="/blanket/"&gt;Blanket&lt;/a&gt; is gone. It was a resource hog and I didn&amp;#8217;t want to port it to Python.&amp;nbsp;Sorry.&lt;/li&gt;
&lt;li&gt;Byteflow and Django don&amp;#8217;t play as nicely with caches as I would like. Byteflow doesn&amp;#8217;t provide &lt;code&gt;Last-Modified&lt;/code&gt;, &lt;code&gt;Expires&lt;/code&gt; or &lt;code&gt;ETag&lt;/code&gt; headers for it&amp;#8217;s pages. Django sets cookies immediately, instead of when a session is actually used, so it&amp;#8217;s page are effectively uncacheable. Also, Django does not provide &lt;code&gt;Content-Length&lt;/code&gt; headers for responses. All this degrades the performance of my&amp;nbsp;site.&lt;/li&gt;
&lt;li&gt;The Intense Debate comment import process lost the threading. I&amp;#8217;ll try to fix the relevant posts by hand some&amp;nbsp;time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope you like the new site. Please post a comment if you find a bug or have any other&amp;nbsp;feedback.&lt;/p&gt;

</description><pubDate>Fri, 06 Mar 2009 12:16:50 +0200</pubDate><guid isPermaLink="false">http://aftnn.org/2009/mar/06/announcing-aftnnorg-version-20/</guid><category>byteflow</category><category>django</category><category>nginx</category><feedburner:origLink>http://aftnn.org/2009/mar/06/announcing-aftnnorg-version-20/</feedburner:origLink></item></channel></rss>
