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

<channel>
	<title>Jay by Jay Fresh</title>
	<atom:link href="http://jaybyjayfresh.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://jaybyjayfresh.com</link>
	<description>Right-on slack-jawed yokel-type tech-farmer</description>
	<lastBuildDate>Mon, 06 Jul 2009 23:45:37 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<image>
		<url>http://www.gravatar.com/blavatar/0e0a1a8d2dafb9295d82d2e4f0c9187e?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Jay by Jay Fresh</title>
		<link>http://jaybyjayfresh.com</link>
	</image>
			<item>
		<title>Adapting WireIt to work with independent data stores</title>
		<link>http://jaybyjayfresh.com/2009/07/06/adapting-wireit-to-work-with-independent-data-stores/</link>
		<comments>http://jaybyjayfresh.com/2009/07/06/adapting-wireit-to-work-with-independent-data-stores/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 23:45:37 +0000</pubDate>
		<dc:creator>Jonathan Lister</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[bbc]]></category>
		<category><![CDATA[couchdb]]></category>
		<category><![CDATA[lshift]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[prototyping]]></category>
		<category><![CDATA[streams]]></category>
		<category><![CDATA[tarpipe]]></category>
		<category><![CDATA[wireit]]></category>
		<category><![CDATA[yahoo pipes]]></category>
		<category><![CDATA[yahoopipes]]></category>

		<guid isPermaLink="false">http://jaybyjayfresh.com/?p=669</guid>
		<description><![CDATA[I&#8217;ve been working during the last fortnight on the &#8220;Streams&#8221; project, which LShift, an IT consultancy in Shoreditch, are building in conjunction with the BBC. My part in this project has been to prototype the interface that a non-technical person would use to edit and create Streams, which are box-and-wire visual workflows similar to those [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=669&subd=jayfresh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I&#8217;ve been working during the last fortnight on the &#8220;Streams&#8221; project, which <a title="LShift - technology from back to front" href="http://www.lshift.net/" target="_blank">LShift</a>, an IT consultancy in Shoreditch, are building in conjunction with the BBC. My part in this project has been to prototype the interface that a non-technical person would use to edit and create Streams, which are box-and-wire visual workflows similar to those found in Yahoo! Pipes or Tarpipe.</p>
<p>(The most interesting difference is that Streams combines Tarpipe&#8217;s event-driven model with Yahoo! Pipe&#8217;s modular data processing model. For more on this project and its ambition to open-sourcing, see <a title="Untangling the BBC's data feeds - LShift blog" href="http://www.lshift.net/blog/2009/05/08/untangling-the-bbcs-data-feeds" target="_blank">LShift&#8217;s</a> and the <a title="Introducing... BBC Feeds Hub on Radio Labs blog" href="http://www.bbc.co.uk/blogs/radiolabs/2009/04/introducing_bbc_feeds_hub.shtml" target="_blank">BBC&#8217;s</a> blog posts.)</p>
<p>I have been using <a title="WireIt - a JavaScript Wiring Library" href="http://javascript.neyric.com/wireit/" target="_blank">WireIt</a>, an open-source JavaScript library, to aid with the interface prototyping. Fortunately for me, WireIt&#8217;s latest version (v0.4), announced shortly before I started this project, includes a fully-featured &#8220;Wiring Editor&#8221;, which gets you up and running with the familiar Yahoo! Pipes-style editor.</p>
<p style="text-align:center;"><img class="aligncenter" title="WireIt Wiring Editor screenshot" src="http://img.skitch.com/20090706-bgrwghqusm9i4bjgak6wpt5un3.jpg" alt="" width="589" height="392" /></p>
<p>The brief for the prototype was to be able to complete a round-trip of loading up a Stream (stored as a document in <a title="The Apache CouchDB project" href="http://couchdb.apache.org/" target="_blank">CouchDB</a>), edit it, save it (back to CouchDB) and be able to load it up again.</p>
<p>I thought it would be helpful to bring to your attention the things you need to be aware of if you want to use WireIt&#8217;s Wiring Editor and adapt it to work with an independent source of module and workflow data.</p>
<h2>Stage 1 &#8211; different data formats</h2>
<p>It is hardly worth saying that there is no point trying to persuade your data store owners to change their data format so your job is made easier. Apart from this obvious need to convert from one data format to another, you also have to deal with the fact that WireIt only keeps hold of the data it needs to display and configure its modules.</p>
<p>The best place I could find to hook into the loading process was by overriding the function called after the load button is pressed:</p>
<pre name="code" class="jscript">
WireIt.WiringEditor.prototype._onLoad = WireIt.WiringEditor.prototype.onLoad;
WireIt.WiringEditor.prototype.onLoad = function() {
    this.service.listWirings({group:true}, {
        success: function(result) {
            var responseText = result.responseText;
            if(responseText) {
	        this.pipes = convertFromStreams(responseText);
                this.pipesByName = {};
                this.renderLoadPanel();
                this.updateLoadPanelList();
                this.loadPanel.show();
            }
        },
        failure:function() {
            console.log(&#039;failure when loading, args:&#039;,arguments);
        },
        scope: this
    });
};
</pre>
<p>The data format of a combination of blocks and wires in WireIt looks like this:</p>
<pre name="code" class="jscript">
var modules = [
	{
		name: ,
		working: {}
	}
]
where &lt;em&gt;working&lt;/em&gt; is defined as:
working = {
	&quot;modules&quot;:[
		{
			&quot;name&quot;:&quot;FormContainer&quot;,
			&quot;config&quot;:{
				&quot;position&quot;:[115,58]
			},
			&quot;value&quot;:{
				&quot;email&quot;:&quot;&quot;,
				&quot;firstname&quot;:&quot;&quot;,
				&quot;happy&quot;:true,
				&quot;lastname&quot;:&quot;Dupont&quot;,
				&quot;title&quot;:&quot;Mr&quot;,
				&quot;website&quot;:&quot;&quot;
			}
		}],
	&quot;properties&quot;:{
		&quot;description&quot;:&quot;&quot;,
		&quot;name&quot;:&quot;teste&quot;
	},
	&quot;wires&quot;:[
		{
			&quot;src&quot;:{
				&quot;moduleId&quot;:0,
				&quot;terminal&quot;:&quot;br&quot;
			},
			&quot;tgt&quot;:{
				&quot;moduleId&quot;:1,
				&quot;terminal&quot;:&quot;tr&quot;
			}
		}
	]
}
</pre>
<p>The <code>convertStreams</code> function changes each stream document available in CouchDB into the format above.</p>
<p>WireIt doesn&#8217;t keep hold of any properties you attach to blocks that aren&#8217;t used explicitly. This means you need to keep hold of any properties you need to save back to your data store. I did this by keeping a globally available variable, <code>WireIt.customFields</code>:</p>
<pre name="code" class="jscript">
...
if(node.type) {
    WireIt.customFields.nodes[i].type = node.type;
} else {
    WireIt.customFields.nodes[i].terminal = node.terminal;
}
...
</pre>
<h2>Stage 2 &#8211; loading the list of blocks from your data store</h2>
<p>As well as loading up descriptions of a full combination of blocks and wires, I wanted to load all the available blocks in CouchDB into WireIt so they&#8217;d be available for making workflows with.</p>
<p>The WireIt Wiring Editor doesn&#8217;t load its blocks from a remote system, you have to provide all the definitions in a JSON &#8220;language&#8221; file when you create the Wiring Editor. I hooked into the setup of the Wiring Editor after it had finished loading its backend-describing SMD file (see below for explanation of this SMD malarkey):</p>
<pre name="code" class="jscript">
WireIt.WiringEditor.prototype.onSMDsuccess = function() {
	WireIt.customFields = {};
	this.populateModules();
};
</pre>
<p>The <code>populateModules</code> function is responsible for turning the description of the block from CouchDB into the format WireIt uses for defining available blocks, which looks like this (<em>note it is different to the format used to describe a block that is part of a workflow, described above</em>):</p>
<pre name="code" class="jscript">
var modules = [
	{
		&quot;name&quot;: &quot;detect_iplayer&quot;,
		container: {
			xtype: &quot;WireIt.FormContainer&quot;,
			type: &quot;regexp_replace&quot;,
			title: &quot;Detect iplayer and remove&quot;,
			icon: &quot;images/detect_iplayer.png&quot;,
			fields: [
				{&quot;inputParams&quot;: {&quot;name&quot;: &quot;caseinsensitive&quot;, &quot;label&quot;: &quot;case insensitive?&quot;, &quot;value&quot;:true}, &quot;type&quot;: &quot;boolean&quot;},
				{&quot;inputParams&quot;: {&quot;name&quot;: &quot;regexp&quot;, &quot;label&quot;: &quot;regular expression&quot;, &quot;value&quot;: &quot;(iplayer)&quot;}},
				{&quot;inputParams&quot;: {&quot;name&quot;: &quot;dotall&quot;, &quot;label&quot;: &quot;dot matches all?&quot;, &quot;value&quot;: false}, &quot;type&quot;: &quot;boolean&quot;},
				{&quot;inputParams&quot;: {&quot;name&quot;: &quot;multiline&quot;, &quot;label&quot;: &quot;multiline?&quot;, &quot;value&quot;: false}, &quot;type&quot;: &quot;boolean&quot;},
				{&quot;inputParams&quot;: {&quot;name&quot;: &quot;replacement&quot;, &quot;label&quot;: &quot;replacement&quot;, &quot;value&quot;: &quot;\\1&quot;}}
			],
			width:250,
			terminals: [
				{&quot;name&quot;: &quot;input&quot;, direction: [-1,0], offsetPosition: {left: 110, top: -15}},
				{&quot;name&quot;: &quot;positive&quot;, direction: [1,0], offsetPosition: {left: 60, bottom: -15}},
				{&quot;name&quot;: &quot;negative&quot;, direction: [1,0], offsetPosition: {right: 60, bottom: -15}}
			]
		}
	},
	...
]
</pre>
<h2>Stage 3 &#8211; adding default layout</h2>
<p>The Streams data store doesn&#8217;t contain any information about how the blocks in a stream should be laid out, as this is not important to the execution of the streams. However, for loading a stream into WireIt, I wanted to give the blocks a default layout so they didn&#8217;t end up on top of each other.</p>
<p>I picked a layout that put the blocks equally spaced around a ring. This algorithm gives you the coordinates of a set of <code>count</code> blocks. It assumes the blocks are going to be square, and sets the radius of the ring so that the blocks would just touch if they were square.</p>
<pre name="code" class="jscript">
function calculateLayout(count,width) {
	var coords = [];
	var n = count || 4;
	var h = width || 100;
	var radius = (n/Math.PI + 1.5)*h/Math.sqrt(2);
	var theta = 0;
	for (var i=0; i&lt;n; i++) {
		theta = 2*Math.PI*i/n;
		coords[i] = [];
		coords[i][0] = radius*(1+Math.cos(theta)); // x
		coords[i][1] = radius*(1-Math.sin(theta)); // y
	}
	return coords;
}
</pre>
<h2>Stage 4 &#8211; different load/save API (and the limitation of yui-rpc)</h2>
<p>The Wiring Editor is hard-wired to use an implementation of <a title="Service Mapping Description Proposal - JSON Schema" href="http://groups.google.com/group/json-schema/web/service-mapping-description-proposal" target="_blank">JSON-Schema</a> called &#8220;YUI-RPC&#8221;, along with a defining Service Mapping Description (SMD &#8211; think WSDL for JavaScript). The down-side to this is that the implementation does not currently support HTTP verbs other than GET and POST, nor is it obvious how to extend the implementation in line with the spec. If your API requires the use of PUT (as CouchDB does to update or create named documents), then you will need to do something about this.</p>
<p>YUI-RPC supported what I needed for loading, so supporting CouchDB was only as hard as changing one of the method specifications:</p>
<pre name="code" class="jscript">
&quot;listWirings&quot;: {
    &quot;transport&quot;: &quot;GET&quot;,
    &quot;envelope&quot;: &quot;URL&quot;,
    &quot;target&quot;: &quot;couchdb/_design/feeds/_view/join&quot;,
    &quot;parameters&quot;: [
        {&quot;name&quot;:&quot;group&quot;, &quot;type&quot;:&quot;boolean&quot;}
    ],
    &quot;description&quot;: &quot;Get a list of streams&quot;
}
</pre>
<p>To support PUT for saving, I overrode <code>WireIt.WiringEditor.prototype.saveModule</code> and, deciding to go with what I know, stuck in a block of <a title="jQuery: The Write Less, Do More, JavaScript library" href="http://jquery.com/" target="_blank">jQuery</a> that I&#8217;d had hanging around from a test working with <a title="Documentation for CouchDB's HTTP API" href="http://wiki.apache.org/couchdb/HTTP_Document_API" target="_blank">CouchDB&#8217;s API</a>.</p>
<h2>General comments on prototyping with single-page applications</h2>
<p>I made the prototype as an application that could just be served as a single HTML page from a file: URI. I strongly support this over trying to make your prototype work with some web framework or other, as you will lose valuable time setting up the framework in the first place.</p>
<p>Working with HTML files loaded as files gives you a couple of special properties: you can read and write from the file system and make cross-domain XMLHttpRequests (on many browsers). I had to modify YUI&#8217;s Connect object a bit to support the cross-domain XHR requests. For more information on the special properties of HTML pages viewed over file: URI&#8217;s, see <a title="HTTP Requests section of a W3C paper submitted by Paul Downey of Osmosoft" href="http://www.w3.org/2008/security-ws/papers/osmosoft.html#HTTP%20Requests" target="_blank">these</a> <a title="File Saving section of a W3C position paper submitted by Paul Downey of Osmosoft" href="http://www.w3.org/2008/security-ws/papers/osmosoft.html#File%20Saving" target="_blank">sections</a> of a W3C position paper about <a title="A portable, non-linear, personal web notebook" href="http://www.tiddlywiki.com" target="_blank">TiddlyWiki</a> written by <a title="Osmosoft - open source from BT" href="http://osmosoft.com" target="_blank">Osmosoftonian</a> <a title="Paul Downey - sketching the web since 2008" href="http://blog.whatfettle.com" target="_blank">Paul Downey</a>.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jayfresh.wordpress.com/669/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jayfresh.wordpress.com/669/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jayfresh.wordpress.com/669/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jayfresh.wordpress.com/669/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jayfresh.wordpress.com/669/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jayfresh.wordpress.com/669/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jayfresh.wordpress.com/669/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jayfresh.wordpress.com/669/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jayfresh.wordpress.com/669/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jayfresh.wordpress.com/669/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=669&subd=jayfresh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jaybyjayfresh.com/2009/07/06/adapting-wireit-to-work-with-independent-data-stores/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ddf442971aebf6ce72763d02ead1c832?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jayfresh</media:title>
		</media:content>

		<media:content url="http://img.skitch.com/20090706-bgrwghqusm9i4bjgak6wpt5un3.jpg" medium="image">
			<media:title type="html">WireIt Wiring Editor screenshot</media:title>
		</media:content>
	</item>
		<item>
		<title>Joyent Smart Platform &#8211; a replacement for AppJet?</title>
		<link>http://jaybyjayfresh.com/2009/07/06/joyent-smart-platform-a-replacement-for-appjet/</link>
		<comments>http://jaybyjayfresh.com/2009/07/06/joyent-smart-platform-a-replacement-for-appjet/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 16:45:38 +0000</pubDate>
		<dc:creator>Jonathan Lister</dc:creator>
				<category><![CDATA[web]]></category>
		<category><![CDATA[ajaxian]]></category>
		<category><![CDATA[appjet]]></category>
		<category><![CDATA[brian leroux]]></category>
		<category><![CDATA[brianleroux]]></category>
		<category><![CDATA[jgate]]></category>
		<category><![CDATA[jim pick]]></category>
		<category><![CDATA[jimpick]]></category>
		<category><![CDATA[joyent]]></category>
		<category><![CDATA[jsconf]]></category>
		<category><![CDATA[smart platform]]></category>
		<category><![CDATA[smartplatform]]></category>

		<guid isPermaLink="false">http://jaybyjayfresh.com/?p=664</guid>
		<description><![CDATA[I&#8217;m totally two months behind with this news, but I noticed today that Joyent&#8217;s Smart Platform was Brian LeRoux&#8217;s top pick at JSConf back in May. This, coupled with poking from Joyent-er Jim Pick and his response to the Ajaxian coverage of AppJet&#8217;s closure, encouraged me to sign up to the Smart Platform beta today.
A [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=664&subd=jayfresh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://smart.joyent.com"><img class="alignright" title="Joyent have small logos" src="http://www.joyent.com/img/bg/joyentLink.png" alt="" width="69" height="36" /></a>I&#8217;m totally two months behind with this news, but I noticed today that Joyent&#8217;s <a title="Joyent Smart Platform beta" href="http://smart.joyent.com/" target="_blank">Smart Platform</a> was <a title="Brian LeRoux on Twitter" href="http://twitter.com/brianleroux" target="_blank">Brian LeRoux</a>&#8217;s <a title="JSConf rundown by Brian LeRoux" href="http://developer.yahoo.net/blog/archives/2009/05/jsconf_retrospective_leroux.html" target="_blank">top pick</a> at JSConf back in May. This, coupled with poking from Joyent-er <a title="Jim Pick on Twitter" href="http://twitter.com/jimpick" target="_blank">Jim Pick</a> and his response to the <a title="Ajaxian cover the closure of AppJet" href="http://ajaxian.com/archives/appjet-users-look-to-migrate-apps" target="_blank">Ajaxian coverage</a> of AppJet&#8217;s closure, encouraged me to sign up to the Smart Platform beta today.</p>
<p>A month ago, I <a title="AppJet make boo-boo: they closed" href="http://jaybyjayfresh.com/2009/06/02/appjet-make-boo-boo-they-closed/" target="_blank">wrote about</a> how sad I was that AppJet were closing their doors to developers, leaving those of us who want easy-to-edit server-side JavaScript without any decent options. A ray of light seemed to emerge in the form of <a title="AppJet clone" href="http://apps.jgate.de" target="_blank">JGate.de</a>, but with uptime worse than <a title="Is Twitter Down?" href="http://istwitterdown.com/" target="_blank">Twitter</a>&#8217;s, that appears to be unusable.</p>
<p>Jim poked me about Smart Platform because, I think, he knows I want hosted JavaScript that&#8217;s simple. And, if you&#8217;re even an entry-level web developer, Smart Platform looks pretty simple. Joining <a title="Heroku - hosted rails apps" href="http://heroku.com/" target="_blank">Heroku</a> in the there-isn&#8217;t-any deployment model, pushing your code to your Joyent <a title="Git Version Control System" href="http://git-scm.com/" target="_blank">git</a> repository is all you need to do to deploy your web app. Brian&#8217;s <a title="Brian LeRoux's JSConf retrospective" href="http://developer.yahoo.net/blog/archives/2009/05/jsconf_retrospective_leroux.html" target="_blank">JSConf article</a> claims the platform is super-scalable and all that, so from a distance, Smart Platform looks like a worthy addition to the hosted development (aka <a title="Platform as a Service on Wikipedia" href="http://en.wikipedia.org/wiki/Platform_as_a_service" target="_blank">Platform as a Service</a>) brigade.</p>
<p>However, I&#8217;m not coming at this from the point of view of a git-wielding web developer, I&#8217;m representing a swathe of people who can cope with a bit of JavaScript and logic, but have neither the time nor the inclination to get into the world of desktop development. When AppJet was still around, we had an edit button, a single page of a few dozen lines and a cross-domain AJAX API. This, surprisingly enough, was all you needed to apply some programmatic patching to a bunch of different use-cases: automated workflows, Facebook applications, mini web-services.</p>
<p>In fact that last one &#8211; mini web-services &#8211; is the crux of what I&#8217;m getting at here: programming doesn&#8217;t have to be about applications, it can be tiny web services that do something for <em>you</em> that you&#8217;ve cloned from someone else and tweaked until it works.</p>
<p>I&#8217;ve said it before and I&#8217;ll say it again &#8211; I will pay for what AppJet were providing. <em>People</em> will pay for what AppJet were providing. If you can&#8217;t get a squillion to provide this platform for free, that doesn&#8217;t mean you shouldn&#8217;t provide it for a charge. I&#8217;ll be your first customer.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jayfresh.wordpress.com/664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jayfresh.wordpress.com/664/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jayfresh.wordpress.com/664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jayfresh.wordpress.com/664/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jayfresh.wordpress.com/664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jayfresh.wordpress.com/664/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jayfresh.wordpress.com/664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jayfresh.wordpress.com/664/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jayfresh.wordpress.com/664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jayfresh.wordpress.com/664/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=664&subd=jayfresh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jaybyjayfresh.com/2009/07/06/joyent-smart-platform-a-replacement-for-appjet/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ddf442971aebf6ce72763d02ead1c832?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jayfresh</media:title>
		</media:content>

		<media:content url="http://www.joyent.com/img/bg/joyentLink.png" medium="image">
			<media:title type="html">Joyent have small logos</media:title>
		</media:content>
	</item>
		<item>
		<title>Why I love Osmosoft and why leaving is the best thing I can do for BT</title>
		<link>http://jaybyjayfresh.com/2009/06/28/why-i-love-osmosoft-and-why-leaving-is-the-best-thing-i-can-do-for-bt/</link>
		<comments>http://jaybyjayfresh.com/2009/06/28/why-i-love-osmosoft-and-why-leaving-is-the-best-thing-i-can-do-for-bt/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 07:58:27 +0000</pubDate>
		<dc:creator>Jonathan Lister</dc:creator>
				<category><![CDATA[reactions]]></category>
		<category><![CDATA[bt]]></category>
		<category><![CDATA[osmosoft]]></category>

		<guid isPermaLink="false">http://jaybyjayfresh.com/?p=654</guid>
		<description><![CDATA[I announced my intention to leave Osmosoft in a blog post just over a month ago, and it became real this week. When I posted my resignation, it was all about me &#8211; why I was leaving, what my plans were &#8211; but said nothing about my relationship with BT and Osmosoft, so I thought [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=654&subd=jayfresh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://osmosoft.com"><img class="alignright" title="Osmosoft black badge" src="http://osmosoft.com/badges/badge_Osmosoft_black.png" alt="" width="150" height="81" /></a>I announced my intention to leave Osmosoft <a title="Handing in my notice" href="http://www.jaybyjayfresh.com/2009/05/20/this-is-not-an/" target="_blank">in a blog post</a> just over a month ago, and it became real this week. When I posted my resignation, it was all about me &#8211; why I was leaving, what my plans were &#8211; but said nothing about my relationship with BT and Osmosoft, so I thought I&#8217;d rectify that.</p>
<p>I have something to say on how I feel personally about Osmosoft, my opinion about Osmosoft&#8217;s &#8220;success&#8221; and why BT will get its biggest return on investment from those of us that leave.</p>
<p>First of all, I am and will always be grateful to <a title="Treat with Jermolene - Jeremy Ruston's blog" href="http://jermolene.com" target="_blank">Jeremy</a> and <a title="Confused of Calcutta - JP Rangaswami's blog" href="http://confusedofcalcutta.com" target="_blank">JP</a> for creating and maintaining Osmosoft&#8217;s environment, as it allowed me to transform from some sort-of technical consultant, with little track record of actually building things, into the fully-functional member of society you know today.</p>
<p>This is the environment I&#8217;m talking about: one that allowed me to learn systems development on the job, encouraged everyone to follow their creative hunches and organise their own time, broadcast our individual personalities on to the web and into the conference arena and gave us the time to shape our attitudes about open source and the web into a pretty homogenous set of principles (in effect, if not in concrete).</p>
<p>Over two years, Osmosoft has transformed from a vehicle for one man&#8217;s project and the incipient commercialisation thereof, through being a public flag-bearer for a private corporation, into a software house specialising in collaboration systems and web prototyping. At Osmosoft&#8217;s offsites, held roughly once every six months, we regularly brought up two questions (<a title="Nick Webb on Twitter" href="http://twitter.com/nickwebb" target="_blank">@nickwebb</a> deserves a lot of credit for not letting these go unanswered): &#8220;what is Osmosoft for?&#8221; and &#8220;how do we know if Osmosoft is successful?&#8221;. We never came up with good answers. Retrospectively, I think now I&#8217;d answer them like this (and as I write this, I am aware that Jeremy will likely maintain that this represents the truth as he has always seen it):</p>
<p>Osmosoft is for developing and demonstrating what BT thinks about the web and about open source software. Although Jeremy bears the title &#8220;Head of Open Source Innovation&#8221; at BT, Osmosoft is as much about attitudes towards the web as it is attitudes towards open source. And the funny thing is, BT has, like, a million people writing systems that you use through a web browser. AND we&#8217;ve been using linux and php and mysql and tomcat and asterisk and ALL THAT for years, but it&#8217;s taken a dude deposited into the executive with a job-title like Jeremy&#8217;s, narrowly focussing on a toolset like TiddlyWiki, before anybody has accepted that BT has a line on either of these things.</p>
<p>Does this mean that BT is justified in spending circa £2,000,000 over 2 years to keep us in pains aux chocolate and conference passes? Depends how you see it. What else does £2m buy you in BT? 2% of the <a title="Prison Phones contract coverage on PRNewswire" href="http://www.prnewswire.co.uk/cgi/news/release?id=36192" target="_blank">Prison Phones contract</a>; 0.2% of the <a title="BT NHS contract hits £1 billion, on IT Pro" href="http://www.itpro.co.uk/606087/bt-s-nhs-it-contract-hits-1-billion" target="_blank">NHS IT project</a>; 0.02% of the <a title="UK firms feel in the dark about 21CN, on sourcewire" href="http://www.sourcewire.com/releases/rel_display.php?relid=38080" target="_blank">Next Generation Network</a>. Maybe a worthwhile investment if the practices and principles Osmosoft represents does, as Jeremy&#8217;s boss JP hopes, save Global Services (which, for the 99% of you who have never heard of them, currently earns 33% of BT&#8217;s income and about 100% of it&#8217;s net loss).</p>
<p>I&#8217;ve left all this behind and as I&#8217;ve already claimed via the title to this post, I think that&#8217;s great for BT. As I mentioned above, I was not a fabricator when I joined Osmosoft, tiny as it was, two years ago; now I think nothing of erecting savage Frakensteins to get an idea across, or delicately architecting part of the web&#8217;s nervous system (or concocting flamboyant metaphors). The magnitude of this change and the Osmosoft-centredness of it is not lost on me. Now I&#8217;m free of the obligations that go with someone paying your wage, it is natural to feel that I am also breaking free from Osmosoft and BT. However, this isn&#8217;t right. I am an Osmosoftonian, and as an alumni I will always be an Osmosoftonian. And it is here that BT should look for their return on investment.</p>
<p>In case you have just elevated your eye-brows, this is what I mean: To be optimistic would be to hope that in a year&#8217;s time I will have a non-zero portfolio of happy clients, for whom I have done interesting and impactful work to improve their individual measure of success. I will have done this by being an Osmosoftonian: using the tools, principles and brilliant brains I have got used to having around me.</p>
<p>At the start of Osmosoft&#8217;s journey with BT in May 2007, we thought we&#8217;d have overcome some pretty impressive hurdles if we could be a catalyst for changing views, both inside and outside BT. I think there will be no greater testament to the success of this ambition if BT&#8217;s leaders can point to its own successors and effectively say, with pride, &#8220;we made that&#8221;.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jayfresh.wordpress.com/654/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jayfresh.wordpress.com/654/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jayfresh.wordpress.com/654/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jayfresh.wordpress.com/654/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jayfresh.wordpress.com/654/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jayfresh.wordpress.com/654/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jayfresh.wordpress.com/654/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jayfresh.wordpress.com/654/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jayfresh.wordpress.com/654/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jayfresh.wordpress.com/654/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=654&subd=jayfresh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jaybyjayfresh.com/2009/06/28/why-i-love-osmosoft-and-why-leaving-is-the-best-thing-i-can-do-for-bt/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ddf442971aebf6ce72763d02ead1c832?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jayfresh</media:title>
		</media:content>

		<media:content url="http://osmosoft.com/badges/badge_Osmosoft_black.png" medium="image">
			<media:title type="html">Osmosoft black badge</media:title>
		</media:content>
	</item>
		<item>
		<title>Alto Coffee comes to the new Maida Hill Market</title>
		<link>http://jaybyjayfresh.com/2009/06/14/alto-coffee-comes-to-the-new-maida-hill-market/</link>
		<comments>http://jaybyjayfresh.com/2009/06/14/alto-coffee-comes-to-the-new-maida-hill-market/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 12:54:22 +0000</pubDate>
		<dc:creator>Jonathan Lister</dc:creator>
				<category><![CDATA[reactions]]></category>
		<category><![CDATA[alto cafe]]></category>
		<category><![CDATA[altocafe]]></category>
		<category><![CDATA[maida hill market]]></category>
		<category><![CDATA[maidahillmarket]]></category>

		<guid isPermaLink="false">http://jaybyjayfresh.com/?p=648</guid>
		<description><![CDATA[At the quiet intersection of the busy Harrow Road and lengthy Elgin Avenue, a gourmet food and gifts market has been set up by Westminster Council, opening this weekend and breathing new life into a space that has functioned as a haunt for local drunks and drug dealers.

The cheery green and white awnings of the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=648&subd=jayfresh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>At the <a title="Maida Hill Market on Google Maps" href="http://maps.google.com/maps/ms?msa=0&amp;msid=108037410034890008270.00046bdcd0501708a1648&amp;hl=en&amp;ie=UTF8&amp;ll=51.524465,-0.201541&amp;spn=0.004286,0.006706&amp;z=17" target="_blank">quiet intersection</a> of the busy Harrow Road and lengthy Elgin Avenue, a gourmet food and gifts market has been set up by Westminster Council, opening this weekend and breathing new life into a space that has functioned as a haunt for local drunks and drug dealers.</p>
<p><a href="http://www.flickr.com/photos/jayfresh/3624273205/"><img class="aligncenter" title="Maida Hill Market looking shiny" src="http://farm4.static.flickr.com/3369/3624273205_1a38ba2edc.jpg?v=0" alt="" width="375" height="500" /></a></p>
<p>The cheery green and white awnings of the dozen-or-so market stalls almost entirely obscure the green and white &#8220;Costcutter Express&#8221; sign that would otherwise set the tone. The sky-blue Maida Hill Gallery is clearly in sight and, as I write this at a plastic garden table, its artificial grass lawn out front is hosting a number of happy shoppers with hog roast sandwiches.</p>
<p><a href="http://www.flickr.com/photos/jayfresh/3625116650/"><img class="aligncenter" title="A tasty morsel for Saturday lunch..." src="http://farm4.static.flickr.com/3606/3625116650_3f972a8d95.jpg?v=0" alt="" width="500" height="375" /></a></p>
<p>The reason I am here is to give some support to Fabio and Robert, the baristas of <a title="Alto Café website" href="http://www.altocafe.com/gb.html" target="_blank">Alto Café</a>, which operates five days a week from a small van parked on <a title="Google StreetView of Strutton Ground, SW1P" href="http://maps.google.co.uk/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=strutton+ground,+sw1&amp;ie=UTF8&amp;z=16&amp;layer=c&amp;cbll=51.497859,-0.133975&amp;panoid=NdtgclFpW73ImKTEaKmF0Q&amp;cbp=12,159.31,,0,6.58" target="_blank">Strutton Ground</a>, almost within the shadow of <a title="Osmosoft.com - open source from BT" href="http://osmosoft.com" target="_blank">Osmosoft</a>&#8217;s 4th floor office in <a title="Osmosoft.com - Contact us" href="http://osmosoft.com/#[[Contact%20us]]" target="_blank">Westminster Telephone Exchange</a>.</p>
<p>Apart from anything, we owe a great debt of gratitude to <a title="Fabio Henrique Ferreira's blog" href="http://blessedblend.blogspot.com/" target="_blank">Fabio</a>, Brazil&#8217;s champion barista, for saving the coffee of SW1. Until we became aware of Fabio&#8217;s and, as he was trained up, Robert&#8217;s delicious and caffeinated creations, the only way to get a decent cup was to trot 20 minutes down Buckingham Palace Road to <a title="Tomtom Cigars &amp; Coffee" href="http://www.tomtom.co.uk/" target="_blank">Tomtom</a>.</p>
<p><a href="http://www.flickr.com/photos/jayfresh/3624273005/"><img class="aligncenter" title="Happy chappies from Alto Café" src="http://farm4.static.flickr.com/3599/3624273005_89efa71b2d.jpg?v=0" alt="" width="500" height="375" /></a></p>
<p>It looks like Alto (the UK&#8217;s only branch of the award-winning French franchise) are going from strength to strength &#8211; they have recently introduced <a title="Square Mile Coffee Roasters" href="http://shop.squaremilecoffee.com/" target="_blank">Square Mile coffee</a> as an alternative to the Alto blend, stock an expanding range of <a title="VillandryBakery on Twitter" href="http://twitter.com/Villandrybakery" target="_blank">Villandry</a> <a title="Nom-nom cheesecake from Villandry" href="http://www.flickr.com/photos/jayfresh/3624273393/in/photostream/" target="_blank">pastries</a> and now have secured a Saturday slot at the Maida Hill market. On top of this, Alto are going up to Edinburgh for two weeks in August to run three coffee stalls during the festival.</p>
<p>Fabio and Robert represent exactly the kind of business I am leaving Osmosoft to help, so I have started to poke them with some ideas like using Twitter for taking local orders. It would be awesome to figure something out for the Edinburgh festival, perhaps a micro-site for festival-going coffee lovers promoting the locations of their three stalls; or something to take the pain out of managing the stock of the three locations.</p>
<p>If you&#8217;re in North West London on a Saturday, go spend some time at Maida Hill market. The square has a very intimate feel to it and is a bit like someone&#8217;s transplanted a chunk of Borough market, without all the tourists. And say hi to Fabio and Robert from me. Oh, and try a vanilla shakerato, it&#8217;s a few shades of awesome.</p>
<p><em>[MyVillage.com has a video <a title="MyVillage.com video of Maida Hill Market" href="http://www.myvillage.com/video/video/show?id=2243387%3AVideo%3A3439242" target="_blank">here</a>]</em></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jayfresh.wordpress.com/648/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jayfresh.wordpress.com/648/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jayfresh.wordpress.com/648/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jayfresh.wordpress.com/648/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jayfresh.wordpress.com/648/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jayfresh.wordpress.com/648/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jayfresh.wordpress.com/648/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jayfresh.wordpress.com/648/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jayfresh.wordpress.com/648/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jayfresh.wordpress.com/648/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=648&subd=jayfresh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jaybyjayfresh.com/2009/06/14/alto-coffee-comes-to-the-new-maida-hill-market/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ddf442971aebf6ce72763d02ead1c832?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jayfresh</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3369/3624273205_1a38ba2edc.jpg?v=0" medium="image">
			<media:title type="html">Maida Hill Market looking shiny</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3606/3625116650_3f972a8d95.jpg?v=0" medium="image">
			<media:title type="html">A tasty morsel for Saturday lunch...</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3599/3624273005_89efa71b2d.jpg?v=0" medium="image">
			<media:title type="html">Happy chappies from Alto Café</media:title>
		</media:content>
	</item>
		<item>
		<title>Using TiddlyWeb as a content management system for ILGA.org</title>
		<link>http://jaybyjayfresh.com/2009/06/13/using-tiddlyweb-as-a-content-management-system-for-ilga-org/</link>
		<comments>http://jaybyjayfresh.com/2009/06/13/using-tiddlyweb-as-a-content-management-system-for-ilga-org/#comments</comments>
		<pubDate>Sat, 13 Jun 2009 17:36:50 +0000</pubDate>
		<dc:creator>Jonathan Lister</dc:creator>
				<category><![CDATA[tiddlywiki]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[content management system]]></category>
		<category><![CDATA[contentmanagementsystem]]></category>
		<category><![CDATA[ilga]]></category>
		<category><![CDATA[osmosoft]]></category>
		<category><![CDATA[tiddlyweb]]></category>

		<guid isPermaLink="false">http://jaybyjayfresh.com/?p=639</guid>
		<description><![CDATA[I saw Mike posting recently about how he is using TiddlyWeb with theTiddlyDocs and TiddlyGuv projects and I thought I would put something out about how we&#8217;ve been using TiddlyWeb with another Osmosoft project &#8211; the redesign of ILGA.org for the International Lesbian and Gay Association.

The ILGA project has taken our use of TiddlyWeb in unexplored directions. The essential problem that we&#8217;re using this system to solve is that we [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=639&subd=jayfresh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I saw <a title="Michael Mahemoff on Twitter" href="http://twitter.com/mahemoff" target="_blank">Mike</a> <a title="TiddlyDocs, TiddlyCMS and permissioning models on Michael Mahemoff's blog" href="http://softwareas.com/tiddlydocs-tiddlycms-and-permissioning-models" target="_blank">posting</a> <a title="easy_install - prerequisite for TiddlyWeb on softwareas.com" href="http://softwareas.com/easy_install-prerequisite-for-tiddlyweb" target="_blank">recently</a> about <a title="TiddlyCMS plugins from TiddlyGuv on softwareas.com" href="http://softwareas.com/tiddlycms-plugins-from-tiddlyguv" target="_blank">how</a> he is using <a title="TiddlyWeb - a python-based web framework inspired by TiddlyWiki" href="http://tiddlyweb.com" target="_blank">TiddlyWeb</a> with the<a title="TiddlyDocs - document collaboration by divide and conquer" href="http://tiddlydocs.com/" target="_blank">TiddlyDocs</a> and <a title="TiddlyGuv - open-source software to manage open-source licenses" href="http://softwareas.com/tiddlyguv" target="_blank">TiddlyGuv</a> projects and I thought I would put something out about how we&#8217;ve been using TiddlyWeb with another <a title="Osmosoft - Open Source @ BT" href="http://osmosoft.com" target="_blank">Osmosoft</a> project &#8211; the redesign of <a title="ILGA.org - International Lesbian and Gay Association" href="http://ilga.org" target="_blank">ILGA.org</a> for the International Lesbian and Gay Association.</p>
<p><a href="http://www.flickr.com/photos/jayfresh/3622767536/"><img class="aligncenter" title="Screen grab from development version of the new ILGA.org - theres a month or so left until launch..." src="http://farm4.static.flickr.com/3625/3622767536_6a2845ca4e.jpg?v=0" alt="" width="408" height="500" /></a></p>
<p>The ILGA project has taken our use of TiddlyWeb in unexplored directions. The essential problem that we&#8217;re using this system to solve is that we have a set of people around the world who wish to contribute content to a website, which is then stored and displayed to a visitor when they access the site. It is, simply, a <a title="Content Management System on Wikipedia" href="http://en.wikipedia.org/wiki/Content_management_system" target="_blank">CMS</a> problem as solved a hundred times over by projects, public and private, around the world.</p>
<p>Chris Dent <a title="Twoter - TiddlyWeb-based web clippings on Chris Dent's blog" href="http://cdent.tumblr.com/post/51774343/twoter-tiddlyweb-based-web-clippings" target="_blank">did not want</a> to create a framework when creating TiddlyWeb , but with this is what he has done. With ILGA, we have been determined to push the limits of the system and expose new patterns of use and holes for further development.</p>
<p>The following describes how we&#8217;ve used TiddlyWeb to solve the problems of content-editing and publishing. The natural progression has been to work with a TiddlyWeb plugin, cheekily called &#8220;jinx&#8221;, when the existing toolset didn&#8217;t seem to be adequate. As you&#8217;ll see, revisions of our methods have used more and more of TiddlyWeb&#8217;s innards as we&#8217;ve gone along, showing what you can do with the system in its native form.</p>
<h2 style="font-size:1.5em;">Accepting content from contributors</h2>
<h3 style="font-size:1.17em;">Where and how to publish</h3>
<p>TiddlyWeb uses the concepts of &#8220;<strong>bags</strong>&#8220;, which are spheres of permissions, and &#8220;<strong>recipes</strong>&#8220;, which collect bags and pour out the tiddlers through filters. Tiddlers themselves do not have permissions assigned to them, which in a sense, helps you with your decision about where to let people put content. Each contributor gets their own bag, and anything that they contribute ends up in this bag.</p>
<p>In a finally enlightening cycle of development, we discovered that the connection between a recipe and the bags it references is implemented in a useful and elegant way: when you create a new tiddler and save it back to TiddlyWeb, it will end up in whichever is the first bag you have permission to PUT to, counting up from the bottom of the recipe. This means that if your own bag is the last line in the recipe, any new tiddlers will be assigned to that bag. A neat syntactical trick in creating the recipe can make it generic for any contributor:</p>
<pre style="font:normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace;"><code>recipe
   /bags/system/tiddlers
   /bags/common/tiddlers
   /bags/{{ user }}/tiddlers</code></pre>
<p>This simple construction saved us large chunks of code that had been written as TiddlyWeb plugins before this mechanism was properly understood.</p>
<h3 style="font-size:1.17em;">The TiddlyWiki as content manager</h3>
<p>Although the pages that we wanted to show to site visitors had to behave like ordinary web pages, there is no such limitation on pages that the relatively small number of contributors use to edit and publish content, as they are effectively private. This allowed us to take advantage of the full power of <a title="TiddlyWiki - a portable micro-content wiki" href="http://tiddlywiki.com" target="_blank">TiddlyWiki</a> as an editor and manager of the content in someone&#8217;s bag.</p>
<h3 style="font-size:1.17em;">Draft vs. publish</h3>
<p>One feature we added to the TiddlyWiki editor early on was a button to publish a piece of content. Initially, this involved a lot of custom code to handle PUTing an article, until the understanding of the bag and recipe concept outlined above encouraged us to use the default behaviour. Setting a flag on a tiddler that indicates which bag it comes from overrides the recipe-based bag selection and keeps publishing to different bags simple.</p>
<h2 style="font-size:1.5em;">Displaying content to visitors</h2>
<p>Now that we have content safely tucked up in bags, the question is how to get it out again for visitors to the site, outside of the shackles of a standard TiddlyWiki. This is because TiddlyWikis are not suitable as our ordinary web pages for reasons of accessibility, page size and search engine optimization. This has so far been the area most in need of attention and experimentation, as TiddlyWeb does not make content presentation as obvious as content saving.</p>
<h3 style="font-size:1.17em;">Getting stuff out &#8211; recipes, filters and tiddler selection</h3>
<p><em>[Update: this techniques described in this section continue to evolve, but I think it is worth posting this as it shows where we came from and does include some useful generic techniques.]</em></p>
<p>The complement to the content-storing bags mentioned above are the recipes, which deliver a filtered set of tiddlers that come from any number of bags. We&#8217;ve set each person up with their own bag to store their tiddlers. We found two difficulties with using recipes to deliver content:</p>
<ol>
<li>You can&#8217;t dynamically add the title of a tiddler you&#8217;re looking for to a recipe, unless you have a single recipe for e.g. each news article. This means that our recipes deliver a large number of tiddlers, which then have to be filtered further in some way, either in the template or in the jinx plugin;</li>
<li>A further consequence is that the recipes get longer as you add more contributors, and have to be maintained. It would be easier to be able to point to all contributors&#8217; bags in a recipe.</li>
</ol>
<p>As mentioned above, further selection is required after a recipe has delivered a set of tiddlers. This is where the jinx plugin has been developed (and repeatedly re-worked!) the most. Because we can examine the URL requested in the plugin, there is an interdependency between the URL&#8217;s structure and the filtering applied to a set of tiddlers returned by a recipe. The URL structure itself is examined further down.</p>
<p>The scenarios we have for wanting to get content out of TiddlyWeb and the corresponding recipes and tiddler selection we&#8217;ve set up in the jinx plugin are:</p>
<ul>
<li>Pages with one news article (a tiddler tagged &#8216;article&#8217;)</li>
</ul>
<pre style="font:normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace;"><code>recipe
   /bags/JON/tiddlers?filter=[tag[article]]
   /bags/BOB/tiddlers?filter=[tag[article]]
   /bags/PETER/tiddlers?filter=[tag[article]]

selection
   get_tiddler_from_recipe(tiddler_name,recipe_name)</code></pre>
<ul>
<li>Pages with many news articles</li>
</ul>
<pre style="font:normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace;"><code>recipe
   /bags/JON/tiddlers?filter=[tag[article]]
   /bags/BOB/tiddlers?filter=[tag[article]]
   /bags/PETER/tiddlers?filter=[tag[article]]

selection (no further filtering)
   get_tiddlers_from_recipe(recipe_name)</code></pre>
<ul>
<li>Pages with country profile information (tiddlers tagged &#8216;countryprofile&#8217; from a single contributor), news articles for that country, a tiddler defining themes for a map and a tiddler for the country itself</li>
</ul>
<pre style="font:normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace;"><code>recipe
   /bags/countries/tiddlers?filter=JAPAN
   /bags/BOB/tiddlers?filter=[tag[countryprofile]]
   /bags/JON/tiddlers?filter=[tag[article]location[JAPAN]]
   /bags/PETER/tiddlers?filter=[tag[article]location[JAPAN]]
   /bags/BOB/tiddlers?filter=[tag[article]location[JAPAN]]
   /bags/ILGA/tiddlers?filter=[tag[maptheme]]

selection (no further filtering)
   get_tiddlers_from_recipe(recipe_name,named_tiddlers_array)</code></pre>
<p>The final example, although still developing, illustrates how difficult it can be to get the tiddlers you need in a way that you can tell them apart. We added the second argument to the <code>get_tiddlers_from_recipe</code> function so that we could pass in tiddlers as named variables to the next step, HTML templating, and refer to them directly rather than iterating through a huge loop of tiddlers each time we wanted to find one.</p>
<h3 style="font-size:1.17em;">Formatting stuff &#8211; templates</h3>
<p>Right from the word go, we&#8217;ve wanted to &#8220;template&#8221; tiddler content through HTML templates, inserting bits and pieces of tiddlers into the relevant places in a mainly static page. The approach we&#8217;ve developed so far involves using the jinx plugin to map a particular URL path, say <code>/articles/MyArticle</code>, to a function that collects a set of tiddlers as described above (in this case probably &#8220;articles&#8221;) and pushes them through a templating process to generate the HTML pages.</p>
<p>A technique we&#8217;ve found ourselves using quite frequently is iterating through the delivered set of tiddlers to find the one we want. For example, on country page, we want to be able to isolate the tiddlers which are news articles. At the moment, we can do that like this:</p>
<pre style="font:normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace;"><code>{% for tiddler in tiddlers %}
   {% for tag in tiddler.tags %}
      {% if tag == 'article' %}
         &lt;h2&gt;{{tiddler.title}}&lt;/h2&gt;
      {% endif %}
   {% endfor %}
{% endfor %}</code></pre>
<p>This structure is less than ideal and it would be much easier to be able to access the groups of tiddlers directly, which is why the <code>named_tiddlers_array</code>parameter was created for <code>get_tiddlers_from_recipe</code>. However, this doesn&#8217;t feel very solid yet.</p>
<h3 style="font-size:1.17em;">Accessing stuff &#8211; URL&#8217;s</h3>
<p>The URL used to access a tiddler can be accessed and acted on by the jinx plugin, so we have used it to determine what is presented and how, through two methods: first, by mapping various URL structures to functions inside the jinx plugin; second, by using the sections of a URL&#8217;s path as variables in these functions, determining things like which template is used, or which tiddler is retrieved.</p>
<p>The mappings we are using are listed below. TiddlyWeb differentiates between<code>/resource</code> and <code>/resource/</code>, so there are double entries for most mappings:</p>
<pre style="font:normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace;"><code>config['selector'].add('/index.html', GET=get_index)
config['selector'].add('/myactivism', GET=get_myactivism)
config['selector'].add('/myactivism/', GET=get_myactivism)
config['selector'].add('/allies', GET=get_allies)
config['selector'].add('/allies/', GET=get_allies)
config['selector'].add('/article/{name:segment}', GET=get_article)
config['selector'].add('/countries/{country:segment}', GET=get_country_section)
config['selector'].add('/countries/{country:segment}/', GET=get_country_section)
config['selector'].add('/countries/{country:segment}/{section:segment}/', GET=get_country_section)
config['selector'].add('/countries/{country:segment}/{section:segment}', GET=get_country_section)</code></pre>
<p>It seems that, in the pursuit of genericism, <code>GET /path/to/resource</code> should be understood as <code>GET /path/to/recipe/tiddler</code> - accessing a recipe, pushing the results through a template (perhaps with the same name as the recipe), and selecting the named tiddler.</p>
<div><span style="font-family:arial;line-height:normal;white-space:pre-wrap;"><br />
</span></div>
<div><span style="font-family:arial;line-height:normal;white-space:pre-wrap;"> </span></div>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jayfresh.wordpress.com/639/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jayfresh.wordpress.com/639/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jayfresh.wordpress.com/639/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jayfresh.wordpress.com/639/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jayfresh.wordpress.com/639/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jayfresh.wordpress.com/639/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jayfresh.wordpress.com/639/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jayfresh.wordpress.com/639/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jayfresh.wordpress.com/639/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jayfresh.wordpress.com/639/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=639&subd=jayfresh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jaybyjayfresh.com/2009/06/13/using-tiddlyweb-as-a-content-management-system-for-ilga-org/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ddf442971aebf6ce72763d02ead1c832?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jayfresh</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3625/3622767536_6a2845ca4e.jpg?v=0" medium="image">
			<media:title type="html">Screen grab from development version of the new ILGA.org - theres a month or so left until launch...</media:title>
		</media:content>
	</item>
		<item>
		<title>A warning about Agile methodology in early-stage development</title>
		<link>http://jaybyjayfresh.com/2009/06/09/a-warning-about-agile-methodology-in-early-stage-development/</link>
		<comments>http://jaybyjayfresh.com/2009/06/09/a-warning-about-agile-methodology-in-early-stage-development/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 11:33:23 +0000</pubDate>
		<dc:creator>Jonathan Lister</dc:creator>
				<category><![CDATA[reactions]]></category>
		<category><![CDATA[agile development]]></category>
		<category><![CDATA[agiledevelopment]]></category>
		<category><![CDATA[daniel morris]]></category>
		<category><![CDATA[danielmorris]]></category>
		<category><![CDATA[geekmap]]></category>
		<category><![CDATA[osmosoft]]></category>
		<category><![CDATA[software prototyping]]></category>
		<category><![CDATA[softwareprototyping]]></category>

		<guid isPermaLink="false">http://jaybyjayfresh.com/?p=629</guid>
		<description><![CDATA[Late last year, I helped Dan Morris with a project called &#8220;Geekmap&#8220;. The idea was to create &#8220;a social infrastructure for geeks&#8221;, as he put it, which resembled a social network like LinkedIn in that it allowed people to make professional contact, but the whole interface was focussed on navigating via geography and people&#8217;s skills. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=629&subd=jayfresh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Late last year, I helped <a title="Daniel Morris on chi.mp" href="http://stompysto.mp/" target="_blank">Dan Morris</a> with a project called &#8220;<a title="Geekmap - social infrastructure for geeks" href="http://geekmap.co.uk" target="_blank">Geekmap</a>&#8220;. The idea was to create &#8220;a social infrastructure for geeks&#8221;, as he put it, which resembled a social network like <a title="LinkedIn - a professional social network" href="http://linkedin.com" target="_blank">LinkedIn</a> in that it allowed people to make professional contact, but the whole interface was focussed on navigating via geography and people&#8217;s skills. The original idea sounded pretty cool when Dan described it in March, but we didn&#8217;t start doing anything serious with it until November. Three months later, in February 2009, we launched the first version and followed it up in March with <a title="Blog post about Geekmap's second release" href="http://blog.geekmap.co.uk/2009/03/05/new-design-and-features/" target="_blank">another release</a>.</p>
<div class="wp-caption aligncenter" style="width: 484px"><a href="http://www.geekmap.co.uk/"><img class=" " title="Geekmap release 2" src="http://img.skitch.com/20090305-ca8b2fskak8aah7wsq59fp98pp.jpg" alt="" width="474" height="362" /></a><p class="wp-caption-text">geekmap v2</p></div>
<p>The problem is, we haven&#8217;t done anything significant since that March release. In fact, we had a crisis of confidence when we realised that despite our best efforts, the people who we had in mind to first use the site didn&#8217;t have a reason to use it. Our reaction was to plan to add some things for some different people and see how that went; except, with the wind already falling from our sails, this lack of encouragement made it very difficult to maintain any momentum and we put the project on hold shortly thereafter.</p>
<p>Today, just over three months since that second release, I think I know why that momentum died &#8211; it comes down to our use of <a title="Agile software development on Wikipedia" href="http://en.wikipedia.org/wiki/Agile_software_development" target="_blank">Agile methodology</a> to guide our development. Agile starts from the people using the site and their goals, and encapsulates these in &#8220;<a title="User story on Wikipedia" href="http://en.wikipedia.org/wiki/User_story" target="_blank">User Stories</a>&#8220;, which are your units of development. Having used it all the way through Geekmap and in other projects, I think it&#8217;s great for prioritizing your development energy and keeping close to all the non-developers.</p>
<p>I think that the problem was that we used Agile <em>right from the start</em>.</p>
<p>With the best intentions, we used User Stories to figure out the most basic goals of the people using Geekmap and built from there. The eventual outcome was that the site received a fair amount of development attention, but crucially, <em>without any compelling features being built</em>. This was becuase the Agile approach encouraged us to choose the lowest-complexity solution for any given problem &#8211; the innovations conceived in the seed idea were always tabled for some time in the near future (always the <em>near</em> future&#8230;).</p>
<h2>Building to throw away</h2>
<p>I think the answer lies in <a title="Software prototyping on Wikipedia" href="http://en.wikipedia.org/wiki/Software_prototyping" target="_blank">prototyping</a>. We should have started by building a prototype from the original, visionary ideas.</p>
<p>With hindsight, it seems like this would have been very useful for three reasons:</p>
<ol>
<li>unknown or complicated ideas could have been explored in order to find their real utility, which would have made them candidates for fulfilling User Stories</li>
<li>people other than Dan could have used the prototype to get to the point where they believed in what they were building and shared the vision</li>
<li>it&#8217;s a lot easier to find people prepared to become the first customers and become a part of the development if they can see you are making exciting things</li>
</ol>
<p>I&#8217;ve heard <a title="The Prototype Pitfall by Jeff Atwood on CodingHorror.com" href="http://www.codinghorror.com/blog/archives/000256.html" target="_blank">plenty</a> of <a title="Discussion about throwing away prototype code on Joel on Software discussion forum" href="http://discuss.techinterview.org/default.asp?joel.3.631605.16" target="_blank">times</a> that the best thing to do with a prototype is to throw it away. I can understand that now in terms of the benefits of starting fresh with all the experience of making that prototype. (Maybe don&#8217;t throw it away, open source it&#8230;)</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jayfresh.wordpress.com/629/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jayfresh.wordpress.com/629/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jayfresh.wordpress.com/629/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jayfresh.wordpress.com/629/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jayfresh.wordpress.com/629/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jayfresh.wordpress.com/629/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jayfresh.wordpress.com/629/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jayfresh.wordpress.com/629/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jayfresh.wordpress.com/629/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jayfresh.wordpress.com/629/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=629&subd=jayfresh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jaybyjayfresh.com/2009/06/09/a-warning-about-agile-methodology-in-early-stage-development/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ddf442971aebf6ce72763d02ead1c832?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jayfresh</media:title>
		</media:content>

		<media:content url="http://img.skitch.com/20090305-ca8b2fskak8aah7wsq59fp98pp.jpg" medium="image">
			<media:title type="html">Geekmap release 2</media:title>
		</media:content>
	</item>
		<item>
		<title>AppJet make boo-boo: they closed</title>
		<link>http://jaybyjayfresh.com/2009/06/02/appjet-make-boo-boo-they-closed/</link>
		<comments>http://jaybyjayfresh.com/2009/06/02/appjet-make-boo-boo-they-closed/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 09:19:21 +0000</pubDate>
		<dc:creator>Jonathan Lister</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[aaron iba]]></category>
		<category><![CDATA[aaroniba]]></category>
		<category><![CDATA[apatana]]></category>
		<category><![CDATA[appjet]]></category>
		<category><![CDATA[aptana cloud]]></category>
		<category><![CDATA[aptanacloud]]></category>
		<category><![CDATA[hosted programming]]></category>
		<category><![CDATA[hostedprogramming]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[server-side javascript]]></category>
		<category><![CDATA[serversidejavascript]]></category>

		<guid isPermaLink="false">http://jaybyjayfresh.com/?p=622</guid>
		<description><![CDATA[
AppJet is dead. Long live AppJet.
Aaron Iba, AppJet&#8217;s CEO, has made the decision to close AppJet because they realised that EtherPad, their real-time document collaboration product, is commercially viable. Never mind that there is a growing community using the free product: hosting for Server-Side JavaScript with an in-browser editor.
I think this is the worst possible [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=622&subd=jayfresh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:center;"><a href="http://appjet.com/hosting"><img class="aligncenter" title="Savage." src="http://farm3.static.flickr.com/2477/3588797102_850eae40eb.jpg?v=0" alt="" width="416" height="96" /></a></p>
<p style="text-align:left;"><a title="AppJet's notice of discontinuation of free hosting" href="http://appjet.com/hosting" target="_blank">AppJet is dead</a>. Long live AppJet.</p>
<p>Aaron Iba, AppJet&#8217;s CEO, has made the decision to close AppJet because they realised that <a title="Real-time document collaboration" href="http://etherpad.com/" target="_blank">EtherPad</a>, their real-time document collaboration product, is commercially viable. Never mind that there is a growing community using the free product: hosting for <a title="Server Side JavaScript on Wikipedia" href="http://en.wikipedia.org/wiki/Server-side_JavaScript" target="_blank">Server-Side JavaScript</a> with an in-browser editor.</p>
<p>I think this is the worst possible reaction AppJet could have had to the realisation that EtherPad could make them some money. I think this because AppJet is currently the <em>only</em> tool out there where you get the in-browser editor combined with hosting of applications.</p>
<p>The closest competitor to AppJet is Jaxer&#8217;s <a title="Aptana Cloud - develop, host and manage web apps in the Cloud" href="http://www.aptana.com/cloud" target="_blank">Aptana Cloud</a> service which, although it has a free account, charges $20/month for its cheapest paid-for package. It&#8217;s not apples for apples in this case, as Aptana Cloud provides a great deal more in the hosting side of things, such as infrastructure scaling and integration with databases.</p>
<p>However, Aptana Cloud relies on <a title="Aptana Studio - the Web 2.0 IDE" href="http://www.aptana.com/studio" target="_blank">Aptana Studio</a>, which is a chunky piece of desktop software used for developing web software. AppJet gave you a tiny application editor that you accessed through your browser. This encouraged you to think of your applications as <em>pieces of the web</em>, capable of working with other pieces of the web, such as the libraries and applications that other AppJet users had built. The requirement for free hosting was that your application source was published.</p>
<p>These patterns encouraged a vision of the community providing little applications that performed singular tasks.  This is a much different construction to the Aptana Cloud product, which is essentially individualistic hosting of entire web applications and web sites.</p>
<p>It&#8217;s true that focussing on a core product is often a good thing to do, and EtherPad is a pretty cool real-time document collaboration tool. The problem that I have with this is that people are <a title="Real-time collaborative document editors" href="http://en.wikipedia.org/wiki/Collaborative_real-time_editor#List_of_current_editors" target="_blank">already doing that</a>.</p>
<p>I guess this move will work out well for AppJet in the end. I&#8217;m just hoping someone somewhere will pick up from where they left off.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jayfresh.wordpress.com/622/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jayfresh.wordpress.com/622/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jayfresh.wordpress.com/622/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jayfresh.wordpress.com/622/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jayfresh.wordpress.com/622/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jayfresh.wordpress.com/622/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jayfresh.wordpress.com/622/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jayfresh.wordpress.com/622/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jayfresh.wordpress.com/622/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jayfresh.wordpress.com/622/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=622&subd=jayfresh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jaybyjayfresh.com/2009/06/02/appjet-make-boo-boo-they-closed/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ddf442971aebf6ce72763d02ead1c832?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jayfresh</media:title>
		</media:content>

		<media:content url="http://farm3.static.flickr.com/2477/3588797102_850eae40eb.jpg?v=0" medium="image">
			<media:title type="html">Savage.</media:title>
		</media:content>
	</item>
		<item>
		<title>This is not an&#8230;</title>
		<link>http://jaybyjayfresh.com/2009/05/20/this-is-not-an/</link>
		<comments>http://jaybyjayfresh.com/2009/05/20/this-is-not-an/#comments</comments>
		<pubDate>Wed, 20 May 2009 19:35:13 +0000</pubDate>
		<dc:creator>Jonathan Lister</dc:creator>
				<category><![CDATA[life]]></category>
		<category><![CDATA[bt]]></category>
		<category><![CDATA[jnthnlstr]]></category>
		<category><![CDATA[osmosoft]]></category>

		<guid isPermaLink="false">http://jaybyjayfresh.com/?p=608</guid>
		<description><![CDATA[Tomorrow is Osmosoft&#8217;s 2nd birthday.
Today I&#8217;m handing in my resignation: this is it. In just over four weeks, I&#8217;ll be working for myself. In a recession? Yeah.
I think it&#8217;s a fair assumption that I&#8217;ll take on some freelance work to pay the bills, but hey, everyone like&#8217;s to dream, so here&#8217;s the plan:
I want to help [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=608&subd=jayfresh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://www.flickr.com/photos/jayfresh/3549637888/"><img class="aligncenter" src="http://farm4.static.flickr.com/3357/3549637888_657d6272d5.jpg?v=0" alt="" width="500" height="319" /></a>Tomorrow is Osmosoft&#8217;s 2nd birthday.</p>
<p>Today I&#8217;m handing in my resignation: this is it. In just over four weeks, I&#8217;ll be working for myself. In a recession? Yeah.</p>
<p>I think it&#8217;s a fair assumption that I&#8217;ll take on some freelance work to pay the bills, but hey, everyone like&#8217;s to dream, so here&#8217;s the plan:</p>
<p>I want to help independent, creative people use technology, particularly the web, to expand their market or make their company more efficient. They could be a t-shirt seller in a market, an independent pub-owner, or even run a magazine. It&#8217;s a pretty broad definition, but the people I&#8217;m thinking of are doing what they&#8217;re doing because of both the aesthetic of the thing and because they love it.</p>
<p>I think people like this share a couple of characteristics:</p>
<ul>
<li>they are under a lot of pressure to grow their company and make it a success, so they are unlikely to have the time to figure out how to use technology to their advantage;</li>
<li>they don&#8217;t have a lot of capital hanging around to pay for consultants to help them out</li>
</ul>
<p>I can empathize with this second point, as it&#8217;s exactly the position I find myself in now, so I&#8217;ve decided on doing things like this: I don&#8217;t want to charge people big fees, I want to be a part of their success. This means I&#8217;d do something like take a part of whatever increase in profits I can help them make. Which means I need to measure them, but I think that&#8217;s a pretty cool thing anyway.</p>
<p>But, like I said, I&#8217;ve got to sort out how to pay those regular bills first. So&#8230; if you fancy paying me for anything you see me writing about on this blog, please get in touch!</p>
<p><a href="http://www.flickr.com/photos/jayfresh/3549637888/"></a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jayfresh.wordpress.com/608/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jayfresh.wordpress.com/608/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jayfresh.wordpress.com/608/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jayfresh.wordpress.com/608/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jayfresh.wordpress.com/608/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jayfresh.wordpress.com/608/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jayfresh.wordpress.com/608/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jayfresh.wordpress.com/608/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jayfresh.wordpress.com/608/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jayfresh.wordpress.com/608/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=608&subd=jayfresh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jaybyjayfresh.com/2009/05/20/this-is-not-an/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ddf442971aebf6ce72763d02ead1c832?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jayfresh</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3357/3549637888_657d6272d5.jpg?v=0" medium="image" />
	</item>
		<item>
		<title>Release Early, Release Often (even if it&#8217;s shit to begin with)</title>
		<link>http://jaybyjayfresh.com/2009/05/14/release-early-release-often-even-if-its-shit-to-begin-with/</link>
		<comments>http://jaybyjayfresh.com/2009/05/14/release-early-release-often-even-if-its-shit-to-begin-with/#comments</comments>
		<pubDate>Thu, 14 May 2009 14:07:22 +0000</pubDate>
		<dc:creator>Jonathan Lister</dc:creator>
				<category><![CDATA[reactions]]></category>
		<category><![CDATA[bt]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[codejam]]></category>
		<category><![CDATA[globant]]></category>
		<category><![CDATA[hackday]]></category>
		<category><![CDATA[mediawikiunplugged]]></category>
		<category><![CDATA[osmosoft]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[tiddlywiki]]></category>
		<category><![CDATA[webdesign]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[webdevelopment]]></category>

		<guid isPermaLink="false">http://jaybyjayfresh.com/?p=603</guid>
		<description><![CDATA[Yesterday, we had a &#8220;code jam&#8221; at Osmosoft Towers, with the aim of releasing, at 6pm GMT, a polished and usable version of &#8220;MediaWiki Unplugged&#8221;.
MediaWiki Unplugged is a web application you run locally (in your browser), that downloads content from a MediaWiki, allows you to edit it and sync&#8217;s back. The idea, a collaboration between [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=603&subd=jayfresh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Yesterday, we had a &#8220;code jam&#8221; at Osmosoft Towers, with the aim of releasing, at 6pm GMT, a polished and usable version of &#8220;MediaWiki Unplugged&#8221;.</p>
<p>MediaWiki Unplugged is a web application you run locally (in your browser), that downloads content from a MediaWiki, allows you to edit it and sync&#8217;s back. The idea, a collaboration between <a title="Globant - Software Product Development &amp; Maintenance" href="http://www.globant.com/Content/Home/" target="_blank">Globant</a> and <a title="Osmosoft - open source innovation in BT" href="http://osmosoft.com" target="_blank">Osmosoft</a>, is that you&#8217;d use this when your Internet connection is flakey or absent, or just to give you a bit of breathing time when composing edits. We did it and the results are here: <a title="MediaWiki Unplugged - an offline MediaWiki editor" href="http://mediawikiunplugged.com" target="_blank">http://mediawikiunplugged.com</a> &#8211; the hashtag is <a title="#mediawikiunplugged on Twitter Search" href="http://search.twitter.com/search?q=mediawikiunplugged" target="_blank">#mediawikiunplugged</a>.</p>
<div class="wp-caption aligncenter" style="width: 385px"><a href="http://www.flickr.com/photos/38362569@N03/3530966260/in/set-72157618003212307/"><img title="Jeremy has a talent for finding an occasion for champagne in most situations" src="http://farm4.static.flickr.com/3217/3530966260_abe34926f0.jpg?v=0" alt="from genglebiennes flickr stream" width="375" height="500" /></a><p class="wp-caption-text">from genglebienne&#39;s flickr stream</p></div>
<p>Here&#8217;s the &#8216;ting &#8211; it&#8217;s a bit shit. I mean, it works and everything, but it&#8217;s not something that we&#8217;re really PROUD of. This is a problem for some. For me, this is one of the progressive things we&#8217;ve done for a long time and, in my opinion, should set the precedent for how Osmosoft functions as a team. MediaWiki Unplugged might be rough; however, it is new, potentially very helpful and, fundamentally, THERE.</p>
<p>There&#8217;s a principle in <a title="Agile Software Development on Wikipedia.org" href="http://en.wikipedia.org/wiki/Agile_software_development" target="_blank">Agile Development</a>, which Google Code appears <a title="Google Code search" href="http://code.google.com/hosting/" target="_blank">to have taken</a> as its motto &#8211; &#8220;Release early, release often&#8221;. This is a scary thing for many people creating new things &#8211; there&#8217;s always something that can be improved or a problem to fix. The &#8220;sensible&#8221; way to release new things is to keep them hidden from view until they are polished to a perfect shine, then release to a triumphant fanfare in the form of a press release and flurry of feathery tweets. Sadly, this expectation of great consequence will turn out unmet, the carefully composed press release will go uncited and the tweetstorm will fail to materialise.</p>
<p>To mitigate against this disappointment and optimize your chances of making a big splash with your new stuff, I suggest you instantly adopt the practice of releasing early and often. Here&#8217;s why:</p>
<ol>
<li><strong>Other people might not care</strong> about the things you think they care about; and there&#8217;s a good chance they won&#8217;t care about the things you care about. When you&#8217;re developing early-stage stuff, this is really important &#8211; you give out your product and everyone starts to use it in ways you hadn&#8217;t imagined, they put up with the things you thought would kill the experience and they complain about things you&#8217;d overlooked. Get your stuff out there earlier, with your hypotheses in your head, and watch and learn as people surprise you.</li>
<li>If you let out something you&#8217;re not proud of (a software fart, perhaps), <strong>it gives you one helluva motivation</strong> to sort it out. There are few things more stimulating than criticism or the fear of criticism.</li>
<li><strong>You&#8217;ll do a better job next time</strong>. The eternal feedback loop has commenced and it feels hard. That&#8217;s because you&#8217;re learning about what shape your things need to be before people will love them. You&#8217;d pay people thousands of pounds for this kind of information in the controlled laboratory of market research.</li>
</ol>
<p>Back to MediaWiki Unplugged then: my ears are open. As are the ears of everyone in the Osmosoft/Globant team. Roll on the next version.</p>
<div class="wp-caption aligncenter" style="width: 385px"><a href="http://www.flickr.com/photos/38362569@N03/3530970454/in/set-72157618003212307/"><img title="Happy endings at OsmoTowers" src="http://farm3.static.flickr.com/2402/3530970454_a0a675a683.jpg?v=0" alt="from genglebiennes flickr stream" width="375" height="500" /></a><p class="wp-caption-text">from genglebienne&#39;s flickr stream</p></div>
<p>[Globant CTO Guibert Englebienne <a title="MediaWiki Unplugged photo set on Flickr" href="http://www.flickr.com/photos/38362569@N03/sets/72157618003212307/" target="_blank">took lots of photos</a> and posted them to Flickr, along with <a title="Jeremy gives the TiddlyWiki angle on MediaWiki Unplugged" href="http://www.flickr.com/photos/38362569@N03/3530901718/in/set-72157618003212307/" target="_blank">a video of Jeremy</a> talking about MediaWiki Unplugged as a TiddlyWiki application, <a title="Guibert describes the transatlantic triumph" href="http://www.flickr.com/photos/38362569@N03/3530133275/in/set-72157618003212307/" target="_blank">another of himself</a> talking about the day; he also set up a <a title="Tumblr for MedaiWiki Unplugged code jam" href="http://mediawikiunplugged.tumblr.com" target="_blank">tumblr for the day</a>]</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jayfresh.wordpress.com/603/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jayfresh.wordpress.com/603/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jayfresh.wordpress.com/603/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jayfresh.wordpress.com/603/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jayfresh.wordpress.com/603/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jayfresh.wordpress.com/603/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jayfresh.wordpress.com/603/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jayfresh.wordpress.com/603/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jayfresh.wordpress.com/603/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jayfresh.wordpress.com/603/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=603&subd=jayfresh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jaybyjayfresh.com/2009/05/14/release-early-release-often-even-if-its-shit-to-begin-with/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ddf442971aebf6ce72763d02ead1c832?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jayfresh</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3217/3530966260_abe34926f0.jpg?v=0" medium="image">
			<media:title type="html">Jeremy has a talent for finding an occasion for champagne in most situations</media:title>
		</media:content>

		<media:content url="http://farm3.static.flickr.com/2402/3530970454_a0a675a683.jpg?v=0" medium="image">
			<media:title type="html">Happy endings at OsmoTowers</media:title>
		</media:content>
	</item>
		<item>
		<title>The Will to Build</title>
		<link>http://jaybyjayfresh.com/2009/05/11/the-will-to-build/</link>
		<comments>http://jaybyjayfresh.com/2009/05/11/the-will-to-build/#comments</comments>
		<pubDate>Mon, 11 May 2009 10:59:56 +0000</pubDate>
		<dc:creator>Jonathan Lister</dc:creator>
				<category><![CDATA[reactions]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[openhacklondon]]></category>
		<category><![CDATA[yahoo]]></category>

		<guid isPermaLink="false">http://jaybyjayfresh.com/?p=596</guid>
		<description><![CDATA[I went to the first day of Yahoo! Open Hack London this weekend &#8211; three rooms at Covent Garden&#8217;s Congress Centre, a couple of hundred hackers and liberal supplies of catering coffee.

For those unacquainted with the Yahoo!-brand recipe for hack days, their flavour goes something like this: a morning&#8217;s talks about Yahoo! hack-worthy technologies and [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=596&subd=jayfresh&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I went to the first day of Yahoo! Open Hack London this weekend &#8211; three rooms at Covent Garden&#8217;s <a title="Congress Centre in Covent Garden" href="http://www.congresscentre.co.uk/location.asp" target="_blank">Congress Centre</a>, a couple of hundred hackers and liberal supplies of catering coffee.</p>
<p style="text-align:center;"><a href="http://www.flickr.com/photos/phploveme/3518522216/"><img class="aligncenter" title="derived from Jinho.Jung's photo on Flickr" src="http://img.skitch.com/20090511-e52n32t71fbf9nayk27w7pf4w.jpg" alt="" width="528" height="406" /></a></p>
<p>For those unacquainted with the Yahoo!-brand recipe for hack days, their flavour goes something like this: a morning&#8217;s talks about Yahoo! hack-worthy technologies and general interest, followed by a 24-hour hackathon started by a supposedly inspiring video and keynote (aka &#8220;gas&#8221;) from a Yahoo! founder. The day later, the hackers present their produce and prizes are awarded. Everyone goes home to sleep off their pizza hangover.</p>
<p>I wasn&#8217;t around on the second day to see the presentations, which is a shame, as I missed out on some good shit: the Dr. Who theme played on <a title="London iPhone geek orchestra from Yahoo! hack day, on YouTube" href="http://www.youtube.com/watch?v=Uso0GnKJ3zo" target="_blank">an orchestra of 6 iphones</a> and 2 wiimotes, a site that lets you know <a title="TodayIsA... is it a good or bad day in the UK?" href="http://todayisa.com/" target="_blank">whether it&#8217;s a good or bad day</a> for the UK, a <a title="OpenFreeCycle - a search engine for FreeCycle" href="http://dharmafly.com/openfreecycle" target="_blank">search engine for FreeCycle</a>, a <a title="IntelliSearch - side-scrolling single-touch accessible Google search" href="http://fluttercookie.zandrok.com/intellisearch.html" target="_blank">side-scrolling single-touch accessible Google search</a>, an <a title="EU-wide TheyWorkForYou - translated transcripts of EU parliament sittings" href="http://theyworkfor.eu/" target="_blank">EU-wide TheyWorkForYou</a> (with translations!), a searchable database of all the nation&#8217;s <a title="OpenPlaques - information about all the blue (and black) plaques on the nation's buildings" href="http://staging.openplaques.org/">blue (and black) plaques</a>, a <a title="HackMyRide - a Twitter-powered taxi-sharing service" href="http://hackmyride.locl.mobi/" target="_blank">Twitter-powered taxi-sharing service</a>, a <a title="FireEagle guest pass - share your location for a limited time with people you don't know" href="http://feguestpass.appspot.com/" target="_blank">one-shot guest pass</a> for sharing your location&#8230;</p>
<p>(The full list of hacks shown is <a title="Hacks presented at OpenHackLondon" href="http://developer.yahoo.com/hacku/show/2009/may/londonopenhack" target="_blank">here</a>, but not all have URL&#8217;s; see this <a title="OpenHackLondon on Tweetmeme" href="http://hackday09.tweetmeme.com/?page=2" target="_blank">Tweetmeme</a> page for popular links.)</p>
<p>In the wake of this massive amount of creativity and technical competence, I was thinking about the hacker&#8217;s response to problems, as reflected in the <a title="Search for &quot;hack near London&quot; on Upcoming.org" href="http://upcoming.yahoo.com/search/?type=events&amp;rt=1&amp;rollup=&amp;q=hack&amp;loc=London" target="_blank">frequency of this type of event</a>. That is, put a problem in front of a hacker, and they will try to concoct some sort of solution to it. They will <em>build</em> their way over the problem. &#8220;Hacker&#8221; here is a description of a mindset, not a specific label for the techno-geek. Hackers can be public-service policy wonks, or garden-centre owners as well as PHP nerds.</p>
<p>I think there&#8217;s a lot of this &#8220;hack-ish&#8221; response to things. To shoot straight to the point I want to elaborate, I think that often, it can be disadvantageous, wasteful of resources and time and disappointing. There is a need for events like this weekend&#8217;s hack day, and the smart thing to do is recognise what the effect of 52 interesting hacks is &#8211; it is not 52 viable new products and services on the marketplace, it is 52 influences and idea-forming pressures in the heads of the people who, at the end of the day, are the builders and maintenance men of the web. To hack within a hack day is right, it helps. To expect that you can go much further with the hacks is wrong. Hacking on a problem must be understood for its exploratory and inspiring nature, it does not solve the problem.</p>
<p>There&#8217;s a phrase used in big biz that describes the hacker&#8217;s response &#8211; &#8220;not made here&#8221;. This is applied to product development groups who ignore all of the useful resources outside of the company in favour of building from scratch using the talent in their team (often ignoring the talent in other parts of the company). This is supposed to be a BAD THING, something we are supposed to strive to change. I have spent the last two years working <a title="Osmosoft.com - open source innovation for BT" href="http://osmosoft.com" target="_blank">in a team</a> dedicated to the adoption of open source software, possibly the world&#8217;s biggest melting pot of already-fixed problems. I know how true it is that there is no such thing as a new idea. And yet, I&#8217;m often guilty of assuming that everyone else has done it the wrong way or is irrevocably committed to the wrong path, that the way to implement such-and-such a new idea is to do it again from scratch, myself.</p>
<p>And how many times I&#8217;ve been proven wrong! How many half-baked tools and un-loved applications sit on the shelves of my <a title="Jonathan Lister's contributors directory for TiddlyWiki" href="http://svn.tiddlywiki.org/Trunk/contributors/JonathanLister/" target="_blank">source</a> <a title="Jonathan Lister's repositories on GitHub" href="http://github.com/jayfresh" target="_blank">code</a> repositories. Bah.</p>
<p>Sure, hack. But don&#8217;t think that you can transfer a hack to a new, real thing and not have it consume your life. Products take love, care and commitments (like <a title="Suw Charman - advocate of kittehz" href="http://chocolateandvodka.com/" target="_blank">kittehz</a>). They take some big-ass mutherfucka sitting on someone&#8217;s head until they fix the bug that no-one wants to tackle but kills it for 66% of people. They take late night seances with the Google PageRank devils. They take more time, effort, pizza and people than you ever thought they would. And they take all these things over and over again.</p>
<p>Someone else is doing all that right now, with your idea. So give over with your glory-seeking and start co-operating.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/jayfresh.wordpress.com/596/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jayfresh.wordpress.com/596/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/jayfresh.wordpress.com/596/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jayfresh.wordpress.com/596/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/jayfresh.wordpress.com/596/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jayfresh.wordpress.com/596/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/jayfresh.wordpress.com/596/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jayfresh.wordpress.com/596/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/jayfresh.wordpress.com/596/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jayfresh.wordpress.com/596/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jaybyjayfresh.com&blog=786754&post=596&subd=jayfresh&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://jaybyjayfresh.com/2009/05/11/the-will-to-build/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ddf442971aebf6ce72763d02ead1c832?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">jayfresh</media:title>
		</media:content>

		<media:content url="http://img.skitch.com/20090511-e52n32t71fbf9nayk27w7pf4w.jpg" medium="image">
			<media:title type="html">derived from Jinho.Jung's photo on Flickr</media:title>
		</media:content>
	</item>
	</channel>
</rss>