<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.2.1" -->
<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/"
	>

<channel>
	<title>jamesladdcode.com</title>
	<link>http://jamesladdcode.com</link>
	<description>code koans and other food for thought ...</description>
	<pubDate>Tue, 15 May 2012 01:55:32 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2.1</generator>
	<language>en</language>
			<item>
		<title>The Sound of Javascript: How to solve a problem with Maria &#8230;</title>
		<link>http://jamesladdcode.com/2012/05/15/the-sound-of-javascript-how-to-solve-a-problem-with-maria/</link>
		<comments>http://jamesladdcode.com/2012/05/15/the-sound-of-javascript-how-to-solve-a-problem-with-maria/#comments</comments>
		<pubDate>Tue, 15 May 2012 01:53:46 +0000</pubDate>
		<dc:creator>james</dc:creator>
		
		<category><![CDATA[web html css]]></category>

		<category><![CDATA[tips]]></category>

		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://jamesladdcode.com/2012/05/15/the-sound-of-javascript-how-to-solve-a-problem-with-maria/</guid>
		<description><![CDATA[

Overview
Have you noticed the growing movement to developing thick clients on the browser? These thick clients move a complexity from the server to the browser while promising enhanced experiences tailored to the client device. A common theme with this movement is the use of Javascript, the Model View Controller (MVC) pattern and sending data between [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-problem1.png" title="maria"></a></p>
<p style="text-align: center"><a href="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-problem1.png" title="maria"><img src="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-problem1.png" alt="maria" /></a></p>
<p><strong>Overview</strong></p>
<p>Have you noticed the growing movement to developing thick clients on the browser? These thick clients move a complexity from the server to the browser while promising enhanced experiences tailored to the client device. A common theme with this movement is the use of Javascript, the Model View Controller (MVC) pattern and sending data between client and server, typically in JSON format.</p>
<p>This post is about developing just enough of an MVC based client on the browser to see how and where all the parts fit together, what design considerations might need to be taken into account and how the MVC pattern is applied. What is not implemented is the mechanism for communicating between the client and the server to remove a complexity that might otherwise obscure the client code. Client to server communications will be discussed without implementing code.</p>
<p>I&#8217;ll walk you through the code to exemplify the approach taken and how MVC comes into play. A goal is be to keep things minimal and clear in the hope you can use one or more of the techniques and tools outlined in your own projects. This post may even help you select alternative tools and frameworks.</p>
<p>* * The title of this blog is a play on the musical The Sound Of Music which contains the song &#8220;<a href="http://en.wikipedia.org/wiki/Maria_%281959_song%29" target="_blank">Maria</a>&#8220;.</p>
<p><strong>The Code</strong></p>
<p>The code discussed in this post can be found <a href="https://github.com/jamesladd/todo-maria" target="_blank">here</a></p>
<p><strong>Goal </strong></p>
<p>My goal is to develop a small yet exemplary application and the canonical Todo application fits that bill quite nicely, with its simple data model and a user interface that needs little explanation. A Todo application can also be quite useful without server side functionality so conceptually its a whole application. The Todo Applications core model is essentially a list of entries outlining what is to be done, with each entry having a flag indicating if the entry has been completed and a description of what is to be done. To make the design and the use of MVC as clear as I can I have chosen to model the client side application as separate from the Todo model it manipulates. I find this helped me keep the separation of Client side and Server side clear and provide a more obvious &#8216;entry point&#8217; for see where the Client Application begins and ends.</p>
<blockquote><p><em>Tip - I strongly suggest that when Client Server data exchange is implemented that the data exchanged is not a direct mapping of the AppModel, rather it is an exchange of messages to manipulate each &#8217;sides&#8217; model indirectly. For example, when server data is processed it becomes a series of calls on the AppController rather than a direct replacement of the AppModel. A direct replacement or manipulation of the AppModel would be a tight coupling that would lead to possible change impact issues later. </em></p></blockquote>
<p><strong>MVC - Model View Controller</strong></p>
<p>The Todo Client Application is embodied in the classes AppModel, AppView and AppController (see figure x), with the file src/js/initializer.js bringing them into existence when the browsers window load event is fired. The initializer.js code is the equivelant of a Java or &#8216;C&#8217; programs &#8216;main&#8217; function. Each class (AppModel, AppView &amp; AppController) implements their part in the Model View Controller (MVC) pattern. There is a lot of material out there describing the MVC pattern in depth so I wont regurgitate it here, suffice to say I&#8217;m following the pattern as described by <a href="http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612" target="_blank">GOF</a> and implemented in Smalltalk examples.</p>
<p>In a nutshell a View listens for events to happen on a HTML Element. When an event happens like the input field has changed the View is notified (by Maria). The View then extracts or builds whatever data is needed so it can communicate the event to the Controller by calling one of its methods. The Controller takes the notification and applies whatever Business logic it embodies (via other classes - don&#8217;t contain it within the controller) and calls a method on the associated Model to inform it of the change. The Model applies the appropriate changes to the model and then notifies all the observers of the model (via Maria) that the Model has changed. A View typically observes both a HTML Element and a Model meaning it will have a method called on it when either the HTML element or Model changes. When the HTML element changes the Controller is notified, when the Model changes the View is rendered. This is the circle of MVC life.</p>
<p>Looking at src/js/AppController.js you will notice little more than what is required to subclass the Maria Controller class and some may feel the controller is therefore unnecessary. Resist the urge to remove a Controller that is as simple as this because doing so removes a clear indication of where certain functionality belongs and tempts the lazy or uninformed developer to directly bind aspects of the Model to the View and that isn&#8217;t MVC. Not following MVC quickly couples and bridles the parts of an application with responsibilities that don&#8217;t belong, starting you on a road to despair.</p>
<p><strong>Maria</strong></p>
<p>To implement MVC I wanted to use a library that would implement MVC effectively yet not dictate an approach with lots of methods or classes that must be implemented, nor require a large library of dependent Javascript to be loaded. The Maria library developed by Peter Michaux and <a href="https://github.com/petermichaux/maria" target="_blank">available here</a> is such a library. Maria is thin and un-opinionated<strong>*</strong> making working with it simple and quick. At the time of writing this Maria is not well documented but I was lucky enough to have the support from Peter for my experiment. Maria is so straight forward that I rarely called on Peter to explain the library, instead we mostly discussed design issues like the progressive enhancement of existing HTML or the dynamic rendering of HTML by View objects, both of which Maria supports. Even if you don&#8217;t use Maria I suggest you have a look at the code behind it as an example of good Javascript.</p>
<p><strong>*</strong> Maybe Maria is opinionated and I just happen to agree with the opinion.</p>
<p><strong>Design Considerations</strong></p>
<p>I chose to use a kind of progressive enhancement approach in the Todo Application, where the AppView attaches sub-views to HTML elements already present on the page when the AppView is created. This supported my working style where I created the HTML separately to writing and running my Javascript. With most applications there will come a time when a view cannot attach to an existing HTML element and will have to create elements at runtime. Consider this when making the choice of which style you want to use. Doing both helps make my Todo Application an example of both approaches.</p>
<p>Another design decision I made was to ensure dependencies are passed to a class instance when they&#8217;re are created. For me this helped make the dependencies more explicit and facilitated easier testing. However Javascript is such a flexible beast that inverting dependencies for testing isn&#8217;t strictly required as you can get at the innards of an object quite easily. I&#8217;d say that I probably inverted the dependencies more out of a personal style or ethic of not referring to global variables and not instantiating what could be passed in. Note that Maria follows the Smalltalk MVC implementation closely and will create a Controller for a view on demand (see maria getDefaultControllerConstructor) but I didn&#8217;t use this approach, and to Maria&#8217;s credit this didn&#8217;t cause any problems.</p>
<p>A design decision I have touched on already is embodied in AppModel, a Class that represents the data of the Client Application as a whole. The AppModel contains a reference to the set of Todos that are being manipulated. This set of Todos could be seen as the core model but a higher level abstraction helps here as the Model in MVC is typically manipulated through an assortment of views and sub-views created on the same Model. When this model is not the &#8216;parent&#8217; you eventually end up with a Controller needing to track a parent and a child model, or a model that keeps a parent relationship unnecessarily. Typically the top level model will expose the behavior that manipulates sub-models making it ideal as a parent and &#8216;documenting&#8217; the behavior of the Application, ie: addTodo().</p>
<p><strong>The Application</strong></p>
<p>My Todo Application is minimal in that it only captures items to be done and doesn&#8217;t currently allow you to mark an item as done. This is enough to illustrate the points I wanted to make in code and to use the Maria framework in a &#8216;real&#8217; way.  The code for the Todo application is available in here (link) and what follows is a walk through of the code from the entry point through each class as it participates in the MVC pattern to enable the collection of Todos. It is hoped that following the code from the entry point down with a description of each line is the most appropriate way of describing what is going on and how the parts of the application come to interact with each other.</p>
<p align="center"><a href="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-files.png" title="maria-files"><img src="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-files.png" alt="maria-files" /></a></p>
<p align="left"><strong>Running The Application</strong></p>
<p align="left">To run the Todo Application you need to make the todo-maria.js file by issuing the &#8220;make&#8221; command in the root folder. This results in a todo-maria.js file being created in a &#8216;build&#8217; sub-folder. When this is done you can open the index.html file with your browser and you should see the Todo Application. Should you run into problems please check the README file in the distribution.</p>
<p align="left"><strong>src/js/initializer.js</strong></p>
<p align="center"><a href="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-initializer.png" title="maria-initializer"><img src="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-initializer.png" alt="maria-initializer" /></a></p>
<p>This file is packaged into the todo-maria.js file by the &#8216;Makefile&#8217; where the initializer code is run as the full todo-maria.js is interpreted. The code in this initializer<br />
creates the root triad of AppModel, AppView and AppController with their dependencies when the browser window has loaded. Since the AppView requires an existing HTML document there is no need to create the view before the document is ready. The initializer fragment of code uses the Maria event listener API to register our function to be called when the window loads. The initializer tests if the global &#8216;window&#8217; object is defined before continuing because in my test scenarios the &#8216;window&#8217; object is not present. There is probably a nicer approach than this but I have not looked into it.</p>
<p align="left"><strong>src/js/AppView.js</strong></p>
<p><a href="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-appview.png" title="maria-appview"></a></p>
<p style="text-align: center"><a href="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-appview.png" title="maria-appview"><img src="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-appview.png" alt="maria-appview" /></a></p>
<p>The AppView is the main view of the application but it doesn&#8217;t attach itself to any HTML element, instead it binds other views to HTML elements using the DocumentToViewBinder class. The AppView requests the DocumentToViewBinder to bind the HTML elements &#8216;entry&#8217; and &#8216;list&#8217; to the associated View and Controllers, with each sharing the same AppModel. You can think of the AppView as an Abstract View. You should note that the AppView is an observer of the AppModel and when the AppModel is changed the update() method is called on the AppView. This update() method doesn&#8217;t perform any action as the sub-views themselves perform these actions as they are also observers of the AppModel.</p>
<p><strong>src/js/AppModel.js</strong></p>
<p align="center"><a href="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-appmodel.png" title="maria-appmodel"><img src="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-appmodel.png" alt="maria-appmodel" /></a></p>
<p>The AppModel class represents the data model for the whole application and is composed of a set to contain the Todo&#8217;s. The &#8216;Set&#8217; class is provided by Maria and it has some neat Collection methods making working with a collection more natural than when working with an array. When additional data is required for the application it would be added to the AppModel. When a Controller needs to manipulate data it calls a method on the AppModel to ask it to do the work. At the time of writing this the AppModel exposes the Todo set with a method and this is wrong, wrong, wrong. The AppModel should instead allow a function to be applied to each element of the Todo Set, keeping the implementation private and using the Tell Don&#8217;t Ask principle. I&#8217;ll be changing this as a priority.</p>
<p><strong>src/js/AppController.js</strong></p>
<p><a href="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-appcontroller.png" title="maria-appcontroller"></a></p>
<p style="text-align: center"><a href="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-appcontroller.png" title="maria-appcontroller"><img src="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-appcontroller.png" alt="maria-appcontroller" /></a></p>
<p>The AppController coordinates requests from the View to update the model. Looking at the code right now you can see that the AppController does nothing more than subclass the Maria Controller and remember the associated Model. Not all the controllers in the Todo Application are this trivial but resist the urge to remove the ones that are. Controllers that do nothing provide two things, a place to add functionality when needed and a clear indication that the associated View doesn&#8217;t make requests to modify the associated model. A Controller is the ideal place to expose the behaviour needed to update the model, typically taking the notification from the View and then packaging that up in a new object before calling a method on the model. This flow is shown in the InputController which I&#8217;ll detail below.</p>
<p><strong>src/js/DocumentToViewBinder.js</strong></p>
<p>The DocumentToViewBinder is a Factory for finding a HTML element from the DOM and creating an associated View and Controller. It is the element map passed to the DocumentToViewBinder that defines which Views are bound to which HTML elements, and these views will typically register to be notified when certain events are fired by the elements they are bound to. See InputView as an example of this. Technically the DocumentToViewBinder should be constructed with another class that handles the finding of the HTML element to be bind, as mixing this responsibility into the DocumentToViewBinder class violates the Single Responsibility Principle. I&#8217;ll add this as a TODO for me.</p>
<p><strong>src/js/namespace.js</strong></p>
<p>The namespace.js file ensures that a todo object exists into which all the todo application components can be bound. Using a namespace reduces the probability that class names and function names will collide with already defined classes and functions.</p>
<p><strong>src/js/InputView.js</strong></p>
<p><a href="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-inputview.png" title="maria-inputview"></a></p>
<p style="text-align: center"><a href="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-inputview.png" title="maria-inputview"><img src="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-inputview.png" alt="maria-inputview" /></a></p>
<p>The InputView class listens for events on the associated HTML text input field, and for notifications of the AppModel being updated. Maria will call the &#8216;initialize&#8217; method on a View to give it the opportunity to register for the events on the HTML element that is it interested in. In this case the InputView is interested in the &#8216;change&#8217; event on the HTML element and when that event occurs it wants the &#8216;inputChanged&#8217; method called on the InputView. When the &#8216;inputChanged&#8217; method is called the View extracts the contents of the HTML text input field and tells the associated InputController that the view changed passing the input text along. The InputView also provides an &#8216;update&#8217; method which is called (by Maria) when the AppModel has been updated. In this case the InputView does nothing with this notification and I could remove this method as Maria provides a no-operation implementation, however I left it defined as an explicit extension point for people less familiar with Maria or myself at a future date.</p>
<p><strong>src/js/InputController.js</strong></p>
<p><a href="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-inputcontroller.png" title="maria-inputcontroller"></a></p>
<p style="text-align: center"><a href="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-inputcontroller.png" title="maria-inputcontroller"><img src="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-inputcontroller.png" alt="maria-inputcontroller" /></a></p>
<p>The InputController provides a method to be called when input has been given via the InputView. When input is received it is packaged up into a simple object and the method for adding todo entries is called on the AppModel. The View is also asked to clear its input ready for the next input.</p>
<p><strong>src/js/ListView.js</strong></p>
<p><a href="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-listview.png" title="maria-listview"></a></p>
<p style="text-align: center"><a href="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-listview.png" title="maria-listview"><img src="http://jamesladdcode.com/wp-content/uploads/2012/05/maria-listview.png" alt="maria-listview" /></a></p>
<p>The ListView class is slightly different to the InputView in that it doesn&#8217;t listen for event on any HTML elements, instead it listens only for notifications that the<br />
AppModel has changed. When the AppModel has changed the ListView clears the associated HTML unordered list and adds each of the items in the Todo set as items in the unordered list.</p>
<p><strong>Testing</strong></p>
<p>I used the BusterJS framework for testing for two main reasons, firstly it provides behavior style testing that I am used to from my use of Ruby and RSpec, and secondly because it was being used by Maria for it&#8217;s testing. I found BusterJS to be fast and effective and its ability to automatically test on different browsers is very attractive.</p>
<p>At times I found that my tests would fail but running them two more times and they would pass. I have not looked into this and would not use BusterJS in a Continuous Integration environment until I could find out why this is happening.</p>
<p>You should note that some of the tests are not up to my usual standard as they don&#8217;t check all arguments passed to methods when they check a method call. This means it is possible to forget a parameter and tests continue to pass. I let the tests get this way as I was new to BusterJS and the underlying SinonJS library. I&#8217;ll be tightening up the tests.</p>
<p><strong>Conclusions</strong></p>
<p>Writing my Todo Application as a browser based client was a worth while experience and it helped me get a grasp on what it means to develop this style of application. Some important things I learned were:</p>
<ol>
<li>Follow MVC and always have a Controller even if it does nothing. Don&#8217;t communicate directly from View to Model, or Model to View. The MVC circle of life is all about being called back in response to events on objects being observed.</li>
<li>Create a top level Model composed of other models to conceptualize the Client as a whole. I went so far as to have a top level Controller and View which helped.</li>
<li>Use Maria or another MVC framework that is light and unobtrusive. I recommend you start with Maria even if you plan on moving onto more opinionated frameworks as it will provide a grounded understanding of MVC principles.</li>
</ol>
<p>Your feedback is welcomed.</p>
]]></content:encoded>
			<wfw:commentRss>http://jamesladdcode.com/2012/05/15/the-sound-of-javascript-how-to-solve-a-problem-with-maria/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Courtesy is catching &#8230;</title>
		<link>http://jamesladdcode.com/2012/04/18/courtesy-is-catching/</link>
		<comments>http://jamesladdcode.com/2012/04/18/courtesy-is-catching/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 09:27:52 +0000</pubDate>
		<dc:creator>james</dc:creator>
		
		<category><![CDATA[tips]]></category>

		<category><![CDATA[communication]]></category>

		<guid isPermaLink="false">http://jamesladdcode.com/2012/04/18/courtesy-is-catching/</guid>
		<description><![CDATA[

I received an email from a friend regarding my interactions with him, and the positive effect they have had on him and his interactions with others. It appears that courtesy is catching.
Here is the email:
&#8220;We haven&#8217;t had a chance to chat for a while but the things you write have had an impact on my [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://jamesladdcode.com/2012/04/18/courtesy-is-catching/bowing/" rel="attachment wp-att-367" title="bowing"></a></p>
<p style="text-align: center"><a href="http://jamesladdcode.com/2012/04/18/courtesy-is-catching/bowing/" rel="attachment wp-att-367" title="bowing"><img src="http://jamesladdcode.com/wp-content/uploads/2012/04/istock_000018990602xsmall.jpg" alt="bowing" /></a></p>
<p>I received an email from a friend regarding my interactions with him, and the positive effect they have had on him and his interactions with others. It appears that courtesy is catching.</p>
<p>Here is the email:</p>
<p>&#8220;We haven&#8217;t had a chance to chat for a while but the things you write have had an impact on my interactions with others. One thing I noticed is you take the time for a pleasantries like &#8220;nice to chat with you&#8221;. I always try to be polite with others when I interact with them but never quite as far as showing appreciation just for the opportunity to interact. Lately I&#8217;ve been adding a few of these kinds of pleasantries when interacting with others. Even with people I have good working relationships with, I&#8217;m finding they appreciate the acknowledgement and I enjoy giving it. So it is a bonus for everyone.</p>
<p>So thanks for leading me by example. <img src='http://jamesladdcode.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> &#8220;</p>
]]></content:encoded>
			<wfw:commentRss>http://jamesladdcode.com/2012/04/18/courtesy-is-catching/feed/</wfw:commentRss>
		</item>
		<item>
		<title>RASMATAZ: a safer assembler &#8230;</title>
		<link>http://jamesladdcode.com/2011/11/12/rasmataz-a-safer-assembler/</link>
		<comments>http://jamesladdcode.com/2011/11/12/rasmataz-a-safer-assembler/#comments</comments>
		<pubDate>Sat, 12 Nov 2011 02:28:09 +0000</pubDate>
		<dc:creator>james</dc:creator>
		
		<category><![CDATA[ruby]]></category>

		<category><![CDATA[assembler]]></category>

		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://jamesladdcode.com/2011/11/12/rasmataz-a-safer-assembler/</guid>
		<description><![CDATA[ 
I like Assembly language. Assembly is clean and simple and fast, although verbose. I like Ruby&#8217;s interactive command line (IRB). Ruby&#8217;s interactive command line is quick to start and easy to use to test snippets of code. So what about having both of these, that is RASMATAZ, an Assembler written in Ruby that you can [...]]]></description>
			<content:encoded><![CDATA[<p align="center"> <a href="http://jamesladdcode.com/wp-content/uploads/2011/11/istock_000016580794xsmall.jpg" title="pipes"><img src="http://jamesladdcode.com/wp-content/uploads/2011/11/istock_000016580794xsmall.jpg" alt="pipes" /></a></p>
<p>I like Assembly language. Assembly is clean and simple and fast, although verbose. I like Ruby&#8217;s interactive command line (IRB). Ruby&#8217;s interactive command line is quick to start and easy to use to test snippets of code. So what about having both of these, that is RASMATAZ, an Assembler written in Ruby that you can interact with via IRB or just execute from the command line. The biggest win is not having to re-start you machine when the instructions go off and give the operating system conniptions.</p>
<p>This is an example of the assembly you can execute with RASMATAZ:</p>
<p><code>mov rax, [rdx]<br />
label :spin<br />
push rax<br />
pop rcx<br />
dec rcx<br />
jnz :spin<br />
</code><br />
The assembly loosely follows the Intel syntax and you can see the full instructions and add your own in the file &#8216;machine.rb&#8217;.</p>
<p>You can interact with RASMATAZ using IRB by starting IRB and issuing a load to load your program, for example:</p>
<p><code>&gt; load 'example.rasm', nil</code></p>
<p>For here you can interact with your program using one of the following commands:</p>
<ul>
<li>registers<br />
dumps the current values of the registers, for example<br />
&gt;registers<br />
=&gt; {:rax=&gt;0, :rbx=&gt;0, :rcx=&gt;0, :rdx=&gt;0, :rsi=&gt;0, :rdi=&gt;0, :rbp=&gt;0, :rip=&gt;0, :rsp=&gt;0}</li>
<li>stack<br />
dumps the current value on the stack, for example<br />
=&gt; []</li>
<li>memory<br />
dumps the current values in memory, for example<br />
=&gt; [#&lt;RASMATAZ::Instruction:0&#215;00000002924af8 @pointer=0, @mnemonic=:label, @arg1=:start&gt;, &#8230;</li>
<li>step<br />
steps forward by executing a single instruction. For example<br />
#&lt;RASMATAZ::Instruction:0&#215;00000001c97308 @pointer=0, @mnemonic=:label, @arg1=:start&gt;<br />
=&gt; 1</li>
<li>go<br />
executes from current instruction until the program ends.</li>
</ul>
<p>RASMATAZ is written entirely in Ruby with the assembly instructions being a DSL, the machine, stack, memory and registers are all Ruby objects. The DSL is defined in the file rasmataz/dsl.rb and the instructions and the virtual machine they execute against are defined in the file rasmataz/machine.rb.</p>
<p>RASMATAZ is an experiment of mine to see how far I could go with an assembler with out of the box Ruby. It is at the proof of concept stage but available to anyone to fork and continue if they wanted to. I&#8217;ll be coming back to RASMATAZ at a future point to develop of prototype for a new type of virtual machine that is not based around executing instructions like traditional virtual machines.</p>
<p>The source for RASMATAZ is <a href="https://jamesladd@github.com/jamesladd/rasmataz.git" target="_blank">here on github</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://jamesladdcode.com/2011/11/12/rasmataz-a-safer-assembler/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A Goal Pyramid: Helping make decisions &#8230;</title>
		<link>http://jamesladdcode.com/2011/10/30/a-goal-pyramid/</link>
		<comments>http://jamesladdcode.com/2011/10/30/a-goal-pyramid/#comments</comments>
		<pubDate>Sun, 30 Oct 2011 02:43:50 +0000</pubDate>
		<dc:creator>james</dc:creator>
		
		<category><![CDATA[tips]]></category>

		<category><![CDATA[software development]]></category>

		<category><![CDATA[communication]]></category>

		<guid isPermaLink="false">http://jamesladdcode.com/2011/10/30/a-goal-pyramid/</guid>
		<description><![CDATA[

When a Team starts on a piece of work they implicitly know the goal is to get the job done as efficiently as possible. There are probably other goals that are not verbalised and therefore not implicitly in the minds of the Team and this is a big problem, big enough to destroy the Team [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://jamesladdcode.com/wp-content/uploads/2011/10/screenshot-3.png" title="goalpyramid"></a></p>
<p style="text-align: center"><a href="http://jamesladdcode.com/wp-content/uploads/2011/10/screenshot-3.png" title="goalpyramid"><img src="http://jamesladdcode.com/wp-content/uploads/2011/10/screenshot-3.png" alt="goalpyramid" /></a></p>
<p>When a Team starts on a piece of work they implicitly know the goal is to get the job done as efficiently as possible. There are probably other goals that are not verbalised and therefore not implicitly in the minds of the Team and this is a big problem, big enough to destroy the Team and significantly hamper getting the job done. A shared understanding of the goals of the Team helps focus decisions as each decision can be related to how it helps accomplish the goals. Without established goals decisions making can break down into a battle of wills which is extremely costly in multiple ways (this is covered in the book &#8216;Getting to Yes&#8217; which I blogged about <a href="http://jamesladdcode.com/2007/03/20/getting-to-yes-in-five-minutes/" target="_blank">here</a>. The goals of the Team are not just the Company goals they are also Team members personal goals like &#8216;I want to learn technology X&#8217; or &#8216;I think the design should be Y&#8217;. These personal goals are rarely explicit bubbling along just below the surface with a building current that can derail a project.</p>
<p>Explicit and honest goals can help a Team focus and make decisions quickly and in a manner that feels more cohesive and transparent rather than driven by the loudest person, biggest personality or <em>&lt;insert sterotype here&gt;</em>. What follows is a proposed technique for making the goals of the Team explicit and prioritised to enable a Team to move forward efficiently with a transparent mechanism for making decisions quickly, reducing personal conflict and focusing the Team on getting the job done. After all, getting the job done is always the number one goal.</p>
<p>A Goal Pyramid is a hierarchy of ten (10) Goals starting with one at the top, two on the next row, three on the next and so on to form a Pyramid. It is suggested that the Goal Pyramid be kept to ten (10) goals. The first and highest priority goal is the core Business goal, &#8220;to get the job done as efficiently as possible&#8221;. If this isn&#8217;t the Goal at your Company then you should change the first and highest priority goal to that. This top goal is not a negotiable goal like the rest that make up the pyramid. To find and fill out the other goals you need the team to list all the goals they can think of and then prioritize them into the top nine (9). These top nine (9) goals will make up the rest of the pyramid from left to right, top to bottom starting on row two. The goals on row two have a higher importance than those on row three etc. A pyramid is used rather than a list or another shape as it allows the number one (1) goal to be clear while allowing the remaining goals to share in importance on each row, and have priority over those on lower rows.</p>
<p>The list of goals to prioritize should be succinct and clear to each team member so they know what they will be voting for to form their top nine (9). Each goal should have a title, a description and a &#8220;because when we don&#8217;t &#8230;&#8221; section which lists the impact/remifications of not focusing on the goal back to the number one (1) goal. For example, &#8220;Goal: Clean Code. Description: We should follow the principles set out in the book Clean Code. Because: When we don&#8217;t the code base becomes harder to work with slowing our ability to &#8216;&lt;number 1 goal here&gt;&#8217;&#8221;. In arranging your pyramid graphically I suggest putting the &#8216;Goal:&#8217; in the Pyramid and having a legend under it to elaborate on the &#8216;Goal:&#8217;. However, nothing should stop you from having all this information in each pyramid segment if you wish.</p>
<p>A difficulty and thing to watch out for in forming the pyramid is getting the team members to be open, honest and transparent in why the goal matters. For example, a goal of &#8220;Keep Simple&#8221; looks fine until you dig deeper and draw out the fear behind this goal which might be a fear of meeting the deadline or a fear of a design that is not fully understood. ie: I want to keep the design simple because I don&#8217;t understand your proposed design. This particular example draws out a different issue, that of information sharing / knowledge transfer to understand a design more. This is an intended side effect of forming the Goal Pyramid. Encourage your team to think hard about the goals and to be as honest and fearless in presenting them to be voted upon. Wanting to use a particular tool or approach is a fine goal and it needs to be related back to the number one goal, made known and prioritised with the team. Letting the who team in on a goal means we can all work together towards multiple goals. A win-win situation.</p>
<ul>
<li>
<ul>
<li>Goal: Simple Goal statement</li>
<li>Description: A longer more informative description of the goal.</li>
<li>Because:  A set of reasons for the goal.</li>
</ul>
</li>
</ul>
<p>Once your Goal Pyramid is formed you can refer to it in situations where a decision is required, helping focus the discussions on the goals and to break deadlocks which can occur when Team members are in a <a href="http://jamesladdcode.com/2007/03/20/getting-to-yes-in-five-minutes/" target="_blank">battle of wills</a>. A systematic analysis of how a path of action effects reaching the number one Team Goal will usually be resolved quicker than battle of wills and assist in preserving ego. For example, lets say a Team member wants to use a new and exciting piece of technology and a goal in the pyramid is &#8220;Goal: No risk. Description: Don&#8217;t take unnecessary risks. Because: When we take risks where a tried and proven path exists we jeopardize our ability to &#8216;&lt;number 1 goal here&gt;&#8217;, we can say no in a non-personal and professional manner by pointing out this &#8216;agreed&#8217; team goal. Note, we don&#8217;t have to say no, we can say yes in a way that meets our goals. For example, in the same case above we might ask the team member for a plan or strategy for mitigating the risks, or offer our own like &#8220;why don&#8217;t you make a branch and work on this after hours or weekends to prove it out, taking the risk away from the team?&#8221;.</p>
<p>I have not yet tried a Goal Pyramid, and I plan to do so as soon as I can. I formulated it because I see a use for it in solving problems I have experienced in my career. One thing I have learnt in many years is that there are rarely if any technical problems that hamper a team delivering, rather people problems have been the root cause. I hope to use a Goal Pyramid as a tool to facilitate getting through some of these people challenges. Should you make or use a Goal Pyramid then please let me know as I would like to provide feedback here on success or failure of this approach. I will do the same.</p>
<p>Edit: This link was emailed to me and I think it is relevant to this post: <a href="http://blog.8thlight.com/brian-pratt/2011/10/25/simplicity-of-teamwork.html" target="_blank">http://blog.8thlight.com/brian-pratt/2011/10/25/simplicity-of-teamwork.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jamesladdcode.com/2011/10/30/a-goal-pyramid/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Tips for iOS development &#8230;</title>
		<link>http://jamesladdcode.com/2011/10/14/playup-tips-for-ios-development/</link>
		<comments>http://jamesladdcode.com/2011/10/14/playup-tips-for-ios-development/#comments</comments>
		<pubDate>Fri, 14 Oct 2011 00:06:10 +0000</pubDate>
		<dc:creator>james</dc:creator>
		
		<category><![CDATA[software development]]></category>

		<category><![CDATA[communication]]></category>

		<guid isPermaLink="false">http://jamesladdcode.com/2011/10/14/playup-tips-for-ios-development/</guid>
		<description><![CDATA[

Monday mornings at work there is a buzz about the weekend, especially  the outcome of sporting events. Someone is usually strutting around on a  high because their team won, or ribbing someone because their team  lost. This social interaction is what PlayUp have captured in their flag  ship application PlayUp Live, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://jamesladdcode.com/wp-content/uploads/2011/10/playup_logo_rgb_x.png" title="logo"></a></p>
<p style="text-align: center"><a href="http://jamesladdcode.com/wp-content/uploads/2011/10/playup_logo_rgb_x.png" title="logo"><img src="http://jamesladdcode.com/wp-content/uploads/2011/10/playup_logo_rgb_x.png" alt="logo" /></a></p>
<p>Monday mornings at work there is a buzz about the weekend, especially  the outcome of sporting events. Someone is usually strutting around on a  high because their team won, or ribbing someone because their team  lost. This social interaction is what PlayUp have captured in their flag  ship application PlayUp Live, along with live scores, fixtures and more. <strong>You should click</strong> <a href="http://itunes.playupgp.com" target="_blank">this link</a> <strong>now</strong> and check it out.</p>
<p>The  journey over the last six months to get the iOS version out (support for  other mobile platforms is coming) has been quite a challenge and this  post is about those challenges and key take-outs you wont want to miss  if you are developing an iOS app that connects to a back end. PlayUp is  really exciting and it will grow to be as big as a Twitter or a  Facebook, so Im expecting a few more challenges and growing pains and it  will be worth it. While this isn&#8217;t a job advertisement feel free to  contact me if you think this sort of challenge is for you (james dot ladd at iplayup.com).</p>
<p>These are my personal top #5 take-outs from working on the project</p>
<p><strong>#1 Small Team</strong></p>
<p>The  number one #1 learning from working on the project is to keep the team  small, with two people on the UI and two people the backend integration  with the server. The server side is not factored into this count as this  is quite variable, however the typical code base size for an iPhone app  suggests 4 - 6 developers maximum.</p>
<p><strong>#2 Shared Vision</strong></p>
<p>The team should share a consistent vision of  the product they are building. Multiple competing visions or changes in  the vision can derail the project significantly. There is a reasonably  common held belief that a key person leaving a project can kill it, and  this is even more so if that person is the vision holder. A vision  holder who is strongly focused and driven to reach that vision with good  communication skills is a must.</p>
<p><strong>#3 One Application</strong></p>
<p>The back end of an iPhone application is  as important as the front-end, and involving both teams in understanding  the requirements of the other is essential. Both parts are crucial to  the overall success of the product and directly effect the schedule and  outcomes. A shared design and understanding of the architecture is key.</p>
<p><strong>#4 Fast Feedback</strong></p>
<p>The cycle time on building a feature and  showing the relevant stakeholders effects the schedule and this loop  should be as small as humanly possible. Getting the app onto the  stakeholders device is nice and in some cases essential but it takes  longer. Getting the stakeholders to be ok with a &#8216;first-draft&#8217; that isn&#8217;t  pixel perfect is another way to reduce cycle time to get feedback  quickly, so is not writing tests for this &#8216;first-draft&#8217;. However, there  are some cases where writing tests in the &#8216;first-draft&#8217; will allow you  to make changes faster later on. You know your app and will have to  decide on your own balance.</p>
<p><strong>#5 Libraries</strong></p>
<p>Depending on your application you may need to  use off the shelf libraries, and these libraries need to be thoroughly  evaluated. Take the time to do this because in the heat of battle is  probably not the best time to find out it was not the most robust  choice.</p>
]]></content:encoded>
			<wfw:commentRss>http://jamesladdcode.com/2011/10/14/playup-tips-for-ios-development/feed/</wfw:commentRss>
		</item>
		<item>
		<title>East example code &#8230;</title>
		<link>http://jamesladdcode.com/2011/08/10/east-example-code/</link>
		<comments>http://jamesladdcode.com/2011/08/10/east-example-code/#comments</comments>
		<pubDate>Wed, 10 Aug 2011 00:42:11 +0000</pubDate>
		<dc:creator>james</dc:creator>
		
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://jamesladdcode.com/2011/08/10/east-example-code/</guid>
		<description><![CDATA[People still ask me about East Oriented code. I hope what follows helps shed some light on the topic of East and immutable objects and how they play nicely with each other. Attached are some files (I hope I can attach them) in Ruby which implements a contrived example.
In my example I have a Customer [...]]]></description>
			<content:encoded><![CDATA[<p>People still ask me about East Oriented code. I hope what follows helps shed some light on the topic of <span class="il">East</span> and immutable objects and how they play nicely with each other. Attached are some files (I hope I can attach them) in Ruby which implements a contrived example.</p>
<p>In my example I have a Customer object which can be initialised with  values and after which these values can not be changed = immutable. To print the Customer you send the printOn message passing in the &#8216;thing&#8217; you want the customer printed on to.</p>
<p>Customer forms a customer writer &#8216;contract&#8217; between itself and classes that implement the customer writer contract. This contract enables the customer to print onto any object that supports the &#8216;contract&#8217; - essential any object that responds to the messages the Customer sends from printOn.</p>
<p>To help with the example I have two objects that implement the &#8216;contract&#8217;, CustomerConsoleWriter and CustomerJsonWriter.</p>
<p>The magic is that the Customer doesn&#8217;t need to change when you introduce new writers, be they a CustomerDatabaseWriter or  a CustomerHtmlWidgetWriter etc.</p>
<p>You can further extend this magic by having writers that know how to delegate to other writers - for example you could construct a CustomerFileWriter with a CustomerHtmlWidgetWriter to write a Html representation of the Customer to a file.</p>
<p>I have left this <strong>combinatory</strong> magic to you.</p>
<p>Here is a run using the interractive ruby shell (IRB) showing this magic in action (I have removed output that isnt relevant)</p>
<p><span style="font-family: courier new,monospace">:001 &gt; $:.unshift File.dirname(__FILE__)</span><br style="font-family: courier new,monospace" /> <span style="font-family: courier new,monospace">:002 &gt; require &#8216;customer&#8217;</span><br style="font-family: courier new,monospace" /><span style="font-family: courier new,monospace">:004 &gt; require &#8216;customer_writer&#8217;</span><br style="font-family: courier new,monospace" /> <span style="font-family: courier new,monospace">:005 &gt; require &#8216;customer_console_writer&#8217;</span><br style="font-family: courier new,monospace" /><span style="font-family: courier new,monospace">:006 &gt; require &#8216;customer_json_writer&#8217;</span><br style="font-family: courier new,monospace" /> <span style="font-family: courier new,monospace">:007 &gt; c = Customer.new(&#8217;Ronny&#8217;, &#8216;H&#8217;, 33)</span><br style="font-family: courier new,monospace" /><span style="font-family: courier new,monospace"> =&gt; #&lt;Customer:0&#215;2a7de90 @name=&#8221;Ronny&#8221;, @surname=&#8221;H&#8221;, @age=33&gt; </span><br style="font-family: courier new,monospace" /> <span style="font-family: courier new,monospace">:008 &gt; w1 = CustomerConsoleWriter.new</span><br style="font-family: courier new,monospace" /><span style="font-family: courier new,monospace"> =&gt; #&lt;CustomerConsoleWriter:<wbr></wbr>0&#215;2a74318&gt; </span><br style="font-family: courier new,monospace" /> <span style="font-family: courier new,monospace">:009 &gt; w2 = CustomerJsonWriter.new</span><br style="font-family: courier new,monospace" /><span style="font-family: courier new,monospace"> =&gt; #&lt;CustomerJsonWriter:<wbr></wbr>0&#215;2a33db8&gt; </span><br style="font-family: courier new,monospace" /> <span style="font-family: courier new,monospace">:010 &gt; c.printOn(w1)</span><br style="font-family: courier new,monospace" /><span style="font-family: courier new,monospace">Name: Ronny</span><br style="font-family: courier new,monospace" /> <span style="font-family: courier new,monospace">Surname: H</span><br style="font-family: courier new,monospace" /><span style="font-family: courier new,monospace">Age: 33</span><br style="font-family: courier new,monospace" /> <span style="font-family: courier new,monospace"> =&gt; nil </span><br style="font-family: courier new,monospace" /><span style="font-family: courier new,monospace">:011 &gt; c.printOn(w2)</span><br style="font-family: courier new,monospace" /> <span style="font-family: courier new,monospace">{&#8221;Name&#8221;=&gt;&#8221;Ronny&#8221;, &#8220;Surname&#8221;=&gt;&#8221;H&#8221;, &#8220;Age&#8221;=&gt;33}</span><br style="font-family: courier new,monospace" /><span style="font-family: courier new,monospace"> =&gt; nil </span><br style="font-family: courier new,monospace" /><br />
*end* I cut out some of the Ruby IRB text.</p>
<p>So now you see an immutable object go <span class="il">East</span> and provide a mechanism that allows a loose coupling and unlimited possibilities for printing Customers - e: limited by whatever classes you supply.</p>
<p>The  internals of the Customer object can change without effecting the  contract. Other contracts could be created - like a translation contract  or a storage contract (see below).</p>
<p>For testing you can use a Mock with expectations on it to test that a  Customer is conforming to the Customer Writer contract and you don&#8217;t  need any existing writers. Likewise you can test CustomerWriters without having any valid Customer objects.</p>
<p>What objects need the data from Customer - all those that implement the CustomerWriter contract.</p>
<p>What about storing ?  I suggest a storeOn method in Customer that send store message. eg: storeName<br />
The difference would be what the Writers do with that message. Like writing the binary rather than string representation. Id probably separate classes that respond to storeOn from those that understood printOn.</p>
<p>With  the dynamics of languages like Ruby or Smalltalk you can make the  writers even more magic. Consider the Customers age being a class Age  rather than a number - When passed to the writer with printAge() the writer  could then send it as_date() and now both a Date and an Age object can  be printed. This is more about making writers smarter than <span class="il">East</span> and immutability.</p>
<p>Imagine if you took the approach of using a dynamic factory approach  to the writers whereby the Customer could use a factory to lookup the  writer given the thing you are writing to - for example:    customer.printOn({})    would take the type / class of the object  supplied and dynamically create an instance of the writer to use - in this case the passed  objects is a hash, so the factory would find a CustomerHashWriter to  write to.    There are a lot of possibilities.</p>
<p>When I think about it the only things I typically do with an object can be categorised as one of the following:</p>
<p>1. print - human representation<br />
2. store - non-human representation<br />
3. read - from non-human representation<br />
4. convert - from one representation to another.</p>
<p>I typically use the following methods corresponding to the categories above:</p>
<p>1. printOn<br />
2. storeOn<br />
3. readFrom<br />
4. convertTo</p>
<p>Creation and destruction are needed too, but these are typically handled by the implementation language.</p>
<p>I have in the past written an entire system using this approach and it was simple to modify and understand.</p>
<p>Here is the Ruby code: <a href="http://jamesladdcode.com/wp-content/uploads/2011/08/east-ruby-example.zip" title="East Ruby Example">East Ruby Example</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jamesladdcode.com/2011/08/10/east-example-code/feed/</wfw:commentRss>
		</item>
		<item>
		<title>More East &#8230;</title>
		<link>http://jamesladdcode.com/2011/06/12/more-east-2/</link>
		<comments>http://jamesladdcode.com/2011/06/12/more-east-2/#comments</comments>
		<pubDate>Sun, 12 Jun 2011 04:15:40 +0000</pubDate>
		<dc:creator>james</dc:creator>
		
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://jamesladdcode.com/2011/06/12/more-east-2/</guid>
		<description><![CDATA[
Recently I was a special guest on ADDcasts back in episode 4: http://addcasts.com/2011/04/21/episode-4-special-guest-james-ladd-talks-to-us-about-running-smalltalk-on-the-jvm-immutability-and-how-to-write-good-oo-code/. After the episode aired I received some questions about East. What follows is part of my response which I am posting to continue the discussion on East in the hope that more people try the technique.
Im interested in learning new ways to write [...]]]></description>
			<content:encoded><![CDATA[<p align="center"><a href="http://jamesladdcode.com/wp-content/uploads/2011/06/istock_000010117095xsmall.jpg" title="more-east"><img src="http://jamesladdcode.com/wp-content/uploads/2011/06/istock_000010117095xsmall.jpg" alt="more-east" /></a></p>
<p>Recently I was a special guest on ADDcasts back in episode 4: <a href="http://addcasts.com/2011/04/21/episode-4-special-guest-james-ladd-talks-to-us-about-running-smalltalk-on-the-jvm-immutability-and-how-to-write-good-oo-code/" target="_blank">http://addcasts.com/2011/<wbr></wbr>04/21/episode-4-special-guest-<wbr></wbr>james-ladd-talks-to-us-about-<wbr></wbr>running-smalltalk-on-the-jvm-<wbr></wbr>immutability-and-how-to-write-<wbr></wbr>good-oo-code/</a>. After the episode aired I received some questions about East. What follows is part of my response which I am posting to continue the discussion on East in the hope that more people try the technique.</p>
<p>Im interested in learning new ways to write software and make what I am writing more readable to others, so Im ok with people disagreeing. I learn more if they do.</p>
<p>I think I led with a poor example and reasoning as I have limited time to think on weekends as I look after my twin boys who are 2.5</p>
<p>Lets forget the accessor and mutator side of things and just focus on the implications of asking an object for information and working on it, rather than asking that object with the information to do the work. This is the key principle - Tell Don&#8217;t Ask</p>
<p>When we allow callers to ask for data and we want to know what they do with that data we have to find all callers and look in detail at what they do with the data. Usually what they do with it will be spread over multiple statements, even if those statements just a &#8216;get&#8217; of multiple attributes. When they can ask for each &#8216;field&#8217; this task becomes larger and possibly harder. Why did they &#8216;get&#8217; just 2 attributes here but in other code they &#8216;get&#8217; 6?</p>
<p>In addition, when we allow callers to ask for the data I usually see multiple callers doing the same processing on the returned data. This might be as subtle as a conversion to uppercase, but I have seen much more repetition creep in. How often have you seen this in the caller:</p>
<p>returned_collection.each {}</p>
<p>This repetitive processing should be in one place - and highlites a missing concept/abstraction. For example, Why does the caller iterate over the returned_collection?</p>
<p>When you face the calls <span class="il">East</span> and ask the object with the information to do the work then the use cases become more evident. For example, &#8220;customer.printOn envelope&#8221; provides more meaning than looking at multiple call sites. Note I&#8217;m not discussing the implementation of Envelope here - personally Id be using an object, even if in Ruby/Smalltalk.</p>
<p>When the use cases are encapsulated in an object like Envelope then the commonality of multiple &#8220;functional object&#8221; objects can be refactored and kept DRY.</p>
<p>Testing in the case where you can ask an object for attributes requires a lot of setup like when I call this accessor, then return that value&#8221;. In contrast when faced <span class="il">East</span> the testing  changes. Usually there is a simpler expectation like &#8220;when I call this method, that object receives these calls.&#8221;</p>
<p>What I would like to see happen is for people to try this approach and see how it effects their design and their process of getting from A to B. Personally I have found the process to be more effective in time and the ability to understand the resulting code, which I also find there is less of.</p>
]]></content:encoded>
			<wfw:commentRss>http://jamesladdcode.com/2011/06/12/more-east-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Duran Duran: The Man Who Stole a Leopard</title>
		<link>http://jamesladdcode.com/2011/05/01/duran-duran-the-man-who-stole-a-leopard/</link>
		<comments>http://jamesladdcode.com/2011/05/01/duran-duran-the-man-who-stole-a-leopard/#comments</comments>
		<pubDate>Sun, 01 May 2011 04:21:15 +0000</pubDate>
		<dc:creator>james</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://jamesladdcode.com/2011/05/01/duran-duran-the-man-who-stole-a-leopard/</guid>
		<description><![CDATA[
Here is a concept for The Man Who Stole a Leopard by Duran Duran.
I contacted their manager Wendy (wendy@magusentertainment.com) and sent it through, and even after inquiring a bit later I still have not heard anything. Not even a thank you for the submission.
What do you think of it?
DuranDuranVideoConcept
]]></description>
			<content:encoded><![CDATA[<p align="center"><a href="http://jamesladdcode.com/wp-content/uploads/2011/05/ayninimages.jpeg" title="aynin"><img src="http://jamesladdcode.com/wp-content/uploads/2011/05/ayninimages.jpeg" alt="aynin" /></a></p>
<p>Here is a concept for The Man Who Stole a Leopard by Duran Duran.</p>
<p>I contacted their manager Wendy (<span class="gI"><span class="go">wendy@magusentertainment.com) and sent it through, and even after inquiring a bit later I still have not heard </span></span>anything. Not even a thank you for the submission.</p>
<p>What do you think of it?</p>
<p><a href="http://jamesladdcode.com/wp-content/uploads/2011/05/video-concept-1024x768.pdf" title="DuranDuranVideoConcept">DuranDuranVideoConcept</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jamesladdcode.com/2011/05/01/duran-duran-the-man-who-stole-a-leopard/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A fart in a jar&#8230;</title>
		<link>http://jamesladdcode.com/2011/01/22/350/</link>
		<comments>http://jamesladdcode.com/2011/01/22/350/#comments</comments>
		<pubDate>Sat, 22 Jan 2011 02:43:41 +0000</pubDate>
		<dc:creator>james</dc:creator>
		
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://jamesladdcode.com/2011/01/22/350/</guid>
		<description><![CDATA[

Recently I spoke to some people about commercializing some software I was helping develop and the discussion was very short. After the discussion I remembered a lesson I learned in 2000 after I&#8217;d tried to &#8217;sell&#8217; an idea to get funding.
What I remembered is that it is all about numbers. You could be selling a [...]]]></description>
			<content:encoded><![CDATA[<p align="left"><a href="http://jamesladdcode.com/wp-content/uploads/2011/01/istock_000011907861xsmall.jpg" title="jar"></a></p>
<p style="text-align: center"><a href="http://jamesladdcode.com/wp-content/uploads/2011/01/istock_000011907861xsmallsmall.jpg" title="jarjar"><img src="http://jamesladdcode.com/wp-content/uploads/2011/01/istock_000011907861xsmallsmall.jpg" alt="jarjar" /></a></p>
<p align="left">Recently I spoke to some people about commercializing some software I was helping develop and the discussion was very short. After the discussion I remembered a lesson I learned in 2000 after I&#8217;d tried to &#8217;sell&#8217; an idea to get funding.</p>
<p align="left">What I remembered is that it is all about numbers. You could be selling a &#8216;fart in a jar&#8217; and as long as the numbers are good you probably have a chance. Focus on the numbers and don&#8217;t spend a great deal of time on describing the service or product - or at least leave that to last. The investors are looking for a &#8216;risk to reward&#8217; that suits them. Give them this information first, and if asked, tell them what the product or service is. They will probably want to know, but after the numbers appeal to them.</p>
<p align="left">What numbers will they want to know?</p>
<ol>
<li>How many &#8216;farts in a jar&#8217; do think you will sell over 1, 2 and 5 years?</li>
<li>How much will people pay for a &#8216;fart in a jar&#8217;?</li>
<li>What is the cost of putting a &#8216;fart in a jar&#8217; and delivering it to the purchaser?</li>
<li>How much of the &#8216;profit&#8217; will they get?</li>
<li>How much money do they have to risk to get that &#8216;profit&#8217; and in what time frame?</li>
</ol>
<p>There are some other things that investors will want to know like the competition and if there are other risks involved in getting a &#8216;fart into a jar&#8217; etc etc. However, my experiences suggest this will be of secondary value to the numbers.</p>
<p>On another note, does anyone know a good way of finding out what someone would pay for a service (not a &#8216;fart in a jar&#8217;) ?</p>
]]></content:encoded>
			<wfw:commentRss>http://jamesladdcode.com/2011/01/22/350/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Presenting at Smalltalk Solutions 2011</title>
		<link>http://jamesladdcode.com/2011/01/19/presenting-at-smalltalk-solutions-2011/</link>
		<comments>http://jamesladdcode.com/2011/01/19/presenting-at-smalltalk-solutions-2011/#comments</comments>
		<pubDate>Tue, 18 Jan 2011 21:01:16 +0000</pubDate>
		<dc:creator>james</dc:creator>
		
		<category><![CDATA[smalltalk]]></category>

		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://jamesladdcode.com/2011/01/19/presenting-at-smalltalk-solutions-2011/</guid>
		<description><![CDATA[
For some time now I have been working on a personal project: Redline Smalltalk and blogging about it here.
In March 2011 Ill be presenting the journey so far at Smalltalk Solutions 2011 in Las Vegas
If you get along to the conference please come and say g&#8217;day.
]]></description>
			<content:encoded><![CDATA[<p align="center"><a href="http://jamesladdcode.com/wp-content/uploads/2011/01/small-redline.jpg" title="Redline"><img src="http://jamesladdcode.com/wp-content/uploads/2011/01/small-redline.jpg" alt="Redline" /></a></p>
<p>For some time now I have been working on a personal project: <a href="http://redline.st" target="_blank">Redline Smalltalk</a> and blogging about it <a href="http://blog.redline.st" target="_blank">here</a>.</p>
<p>In March 2011 Ill be presenting the journey so far at <a href="http://www.stic.st/events/smalltalk-solutions-2011-conference-agenda/" target="_blank">Smalltalk Solutions 2011 in Las Vegas</a></p>
<p>If you get along to the conference please come and say g&#8217;day.</p>
]]></content:encoded>
			<wfw:commentRss>http://jamesladdcode.com/2011/01/19/presenting-at-smalltalk-solutions-2011/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

