<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5185363813089043049</id><updated>2012-02-02T12:20:06.559+10:00</updated><category term='Random'/><category term='Resharper'/><category term='Pipeline'/><category term='LINQ'/><category term='Windows Mobile'/><category term='Vista'/><category term='tools'/><category term='MVVM'/><category term='javascript'/><category term='SQL'/><category term='Rhomobile'/><category term='VisualStudio'/><category term='knockout.js'/><category term='cheatsheets'/><category term='Design'/><category term='NodeJS'/><category term='Rhosync'/><category term='Generics'/><category term='IIS'/><category term='Stored Procs'/><category term='Web'/><category term='Entity-Framework'/><category term='C#'/><category term='regex'/><category term='nvm'/><category term='android'/><category term='MVC RC2'/><category term='WMDC'/><category term='VMware'/><category term='tips'/><category term='html'/><category term='ORM'/><category term='coffee-script'/><category term='asp.net'/><category term='Areas'/><category term='Rant'/><category term='Ubuntu'/><category term='cloud9'/><category term='Life Hacks'/><category term='asp.net mvc'/><category term='stupid'/><category term='Namespaces'/><title type='text'> Gratuitous Development </title><subtitle type='html'>Random .Net/Ruby/JS Thoughts</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>34</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-4520934353244976008</id><published>2012-02-01T16:40:00.001+10:00</published><updated>2012-02-02T12:20:06.576+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVVM'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='knockout.js'/><title type='text'>Exploring TodoMVC and knockout.js with unobtrusive bindings</title><content type='html'>&lt;p&gt;There’s an interesting project I’ve been keeping an eye on over at github called &lt;a href="https://github.com/addyosmani/todomvc" target="_blank"&gt;TodoMVC&lt;/a&gt; – &lt;em&gt;“a project which offers the same Todo application implemented using MVC concepts in most of the popular JavaScript MV* frameworks of today”.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;I’m also a bit of a sucker for &lt;a href="http://knockoutjs.com/" target="_blank"&gt;knockout.js&lt;/a&gt; which aims to &lt;em&gt;“simplify dynamic JavaScript UIs by applying the Model-View-ViewModel(MVVM) pattern”&lt;/em&gt;. I haven’t used MVVM extensively before, having only dabbled in WPF/Silverlight, so I’m coming at knockout.js without any preconceived notions of any sort. Plus it has great documentation and examples…&lt;/p&gt; &lt;p&gt;To begin with, I thought I would create a JSFiddle based directly on the &lt;a href="https://github.com/addyosmani/todomvc/tree/master/architecture-examples/knockoutjs" target="_blank"&gt;knockout.js version&lt;/a&gt; of TodoMVC. Really very easy to setup, but nice to be able to &lt;a href="http://jsfiddle.net/nkerkin/8BXFP/" target="_blank"&gt;play around with&lt;/a&gt;.&lt;/p&gt;&lt;iframe style="width: 101.56%; height: 300px" src="http://jsfiddle.net/nkerkin/8BXFP/embedded/" frameborder="0" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt; &lt;p&gt;One of the main complaints levelled at knockout.js is the apparent lack of Separation of Concerns regarding how bindings are managed via data-bind attributes, e.g. &lt;/p&gt; &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:66fd9b9c-b37b-4737-91c0-52d6cdf26eb5" class="wlWriterEditableSmartContent"&gt;&lt;pre style=" width: 671px; height: 43px;background-color:White;overflow: auto;;font-family:Courier New;font-size:9.75"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;First name: &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input &lt;/span&gt;&lt;span style="color: #FF0000;"&gt;data-bind&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;=&amp;quot;value: firstName&amp;quot;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;
&lt;p&gt;This didn’t particularly bother me at first but when dealing with lots of elements/attributes it starts to get more difficult to manage the bindings in the html itself. Turns out knockout.js 1.3+ supports &lt;a href="http://www.knockmeout.net/2011/09/ko-13-preview-part-2-custom-binding.html" target="_blank"&gt;custom binding providers&lt;/a&gt; that allow us to refactor the above code into something like (example code only):&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:62393d29-95ea-4f65-9e2b-0afb12493708" class="wlWriterEditableSmartContent"&gt;&lt;pre style=" width: 668px; height: 163px;background-color:White;overflow: auto;;font-family:Courier New;font-size:9.75"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;First name: &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;input &lt;/span&gt;&lt;span style="color: #FF0000;"&gt;data-class&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;=&amp;quot;firstName&amp;quot;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;
&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #000000;"&gt;
&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script &lt;/span&gt;&lt;span style="color: #FF0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span style="color: #FF0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color: #F5F5F5; color: #000000;"&gt;
&lt;/span&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt; &lt;span style="background-color: #F5F5F5; color: #000000;"&gt;    &lt;/span&gt;&lt;span style="background-color: #F5F5F5; color: #0000FF;"&gt;var&lt;/span&gt;&lt;span style="background-color: #F5F5F5; color: #000000;"&gt; viewModel &lt;/span&gt;&lt;span style="background-color: #F5F5F5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #F5F5F5; color: #000000;"&gt; {name: &lt;/span&gt;&lt;span style="background-color: #F5F5F5; color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color: #F5F5F5; color: #000000;"&gt;Ichigo&lt;/span&gt;&lt;span style="background-color: #F5F5F5; color: #000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color: #F5F5F5; color: #000000;"&gt;};
&lt;/span&gt;&lt;span style="color: #008080;"&gt;5&lt;/span&gt; &lt;span style="background-color: #F5F5F5; color: #000000;"&gt;    &lt;/span&gt;&lt;span style="background-color: #F5F5F5; color: #0000FF;"&gt;var&lt;/span&gt;&lt;span style="background-color: #F5F5F5; color: #000000;"&gt; bindings &lt;/span&gt;&lt;span style="background-color: #F5F5F5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #F5F5F5; color: #000000;"&gt; {firstName:  {value: viewModel.name} };
&lt;/span&gt;&lt;span style="color: #008080;"&gt;6&lt;/span&gt; &lt;span style="background-color: #F5F5F5; color: #000000;"&gt;    ko.bindingProvider.instance &lt;/span&gt;&lt;span style="background-color: #F5F5F5; color: #000000;"&gt;=&lt;/span&gt;&lt;span style="background-color: #F5F5F5; color: #000000;"&gt; &lt;/span&gt;&lt;span style="background-color: #F5F5F5; color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="background-color: #F5F5F5; color: #000000;"&gt; ko.customBindingProvider(bindings);  
&lt;/span&gt;&lt;span style="color: #008080;"&gt;7&lt;/span&gt; &lt;span style="background-color: #F5F5F5; color: #000000;"&gt;    ko.applyBindings(viewModel);
&lt;/span&gt;&lt;span style="color: #008080;"&gt;8&lt;/span&gt; &lt;span style="background-color: #F5F5F5; color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;
&lt;p&gt;It might seem like a bit more work to begin with, but now we have true separation between our model and our UI. It also allows much greater flexibility when dealing with complicated UIs. &lt;/p&gt;
&lt;p&gt;With this information in hand I’ve decided to port the knockout.js version of TodoMVC to use unobtrusive bindings. There’s surprisingly little work in the conversion process, it mostly involves just pulling all the data-bind attributes out the html and replacing them with data-class attributes that correspond to the properties of the bindings object.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:6179bd96-d6d2-493c-8064-84c39c4ffa79" class="wlWriterEditableSmartContent"&gt;&lt;pre style=" width: 669px; height: 702px;background-color:White;overflow: auto;;font-family:Courier New;font-size:9.75"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #000000;"&gt;var bindings &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; {
&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;        
&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;    newTodo:  { 
&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;        value: viewModel.current, 
&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;        valueUpdate: &lt;/span&gt;&lt;span style="color: #008000;"&gt;'&lt;/span&gt;&lt;span style="color: #008000;"&gt;afterkeydown', &lt;/span&gt;&lt;span style="color: #008000;"&gt;
&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        enterKey: viewModel.add 
&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;    },
&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;    taskTooltip :  { visible: viewModel.showTooltip },
&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;    checkAllContainer :  {visible: viewModel.todos().length },
&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;    checkAll: {checked: viewModel.allCompleted },
&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;    
&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;    todos: {foreach: viewModel.todos },
&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;    todoListItem: &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;() { return { css: { editing: this.editing } }; },
&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;    todoListItemWrapper: &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;() { return { css: { done: this.done } }; },
&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;    todoCheckBox: &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;() {return { checked: this.done }; },
&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;    todoContent: &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;() { return { 
&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;        text: this.content, 
&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;        event: { dblclick: this.edit } };},
&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #000000;"&gt;    todoDestroy: &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;() {return { click: viewModel.remove };},        
&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #000000;"&gt;        
&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #000000;"&gt;    todoEdit: &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;() { return {
&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;span style="color: #000000;"&gt;        value: this.content, 
&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;span style="color: #000000;"&gt;        valueUpdate: &lt;/span&gt;&lt;span style="color: #008000;"&gt;'&lt;/span&gt;&lt;span style="color: #008000;"&gt;afterkeydown', &lt;/span&gt;&lt;span style="color: #008000;"&gt;
&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        enterKey: this.stopEditing, 
&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt; &lt;span style="color: #000000;"&gt;        event: { blur: this.stopEditing } }; },
&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt; &lt;span style="color: #000000;"&gt;        
&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt; &lt;span style="color: #000000;"&gt;    todoCount: {visible: viewModel.remainingCount},
&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt; &lt;span style="color: #000000;"&gt;    remainingCount: { text: viewModel.remainingCount },
&lt;/span&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt; &lt;span style="color: #000000;"&gt;    remainingCountWord: &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;() { return { 
&lt;/span&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt; &lt;span style="color: #000000;"&gt;        text: viewModel.getLabel(viewModel.remainingCount) };},
&lt;/span&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt; &lt;span style="color: #000000;"&gt;        
&lt;/span&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt; &lt;span style="color: #000000;"&gt;    todoClear: {visible: viewModel.completedCount},
&lt;/span&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt; &lt;span style="color: #000000;"&gt;    todoClearAll: {click: viewModel.removeCompleted},
&lt;/span&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt; &lt;span style="color: #000000;"&gt;    completedCount: { text: viewModel.completedCount },
&lt;/span&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt; &lt;span style="color: #000000;"&gt;    completedCountWord: &lt;/span&gt;&lt;span style="color: #0000FF;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;() { return { 
&lt;/span&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt; &lt;span style="color: #000000;"&gt;        text: viewModel.getLabel(viewModel.completedCount) }; },
&lt;/span&gt;&lt;span style="color: #008080;"&gt;37&lt;/span&gt; &lt;span style="color: #000000;"&gt;        
&lt;/span&gt;&lt;span style="color: #008080;"&gt;38&lt;/span&gt; &lt;span style="color: #000000;"&gt;    todoInstructions: {visible: viewModel.todos().length}
&lt;/span&gt;&lt;span style="color: #008080;"&gt;39&lt;/span&gt; &lt;span style="color: #000000;"&gt;};&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;The important part to note out of this is that you have to specify the context of the value/function you want your data-bound attribute to link to. This is relatively easy for top-level values/functions as you just need to reference them via the viewModel object. &lt;/p&gt;
&lt;p&gt;In order for binding to work on individual items (e.g. todo tasks in viewModel.todos), you need to wrap the bindings in a closure and reference “this” instead of the viewModel directly. &lt;/p&gt;
&lt;p&gt;One caveat to this is that you also need to provide a closure when executing viewModel functions within your bindings (see line 30 and 36 above), otherwise the attributes will always bind to the result of the function when it was first called. Not a particularly easy problem to track down if you haven’t been bitten by closure bugs before.&lt;/p&gt;
&lt;p&gt;Anyway checkout the following jsfiddle to explore the full example. &lt;/p&gt;
&lt;p&gt;&lt;iframe style="width: 100%; height: 430px" src="http://jsfiddle.net/nkerkin/hmq7D/embedded/" frameborder="0" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-4520934353244976008?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/4520934353244976008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2012/02/exploring-todomvc-and-knockoutjs-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/4520934353244976008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/4520934353244976008'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2012/02/exploring-todomvc-and-knockoutjs-with.html' title='Exploring TodoMVC and knockout.js with unobtrusive bindings'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-5680252795358964962</id><published>2011-11-28T20:24:00.001+10:00</published><updated>2011-11-28T20:24:10.020+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cloud9'/><category scheme='http://www.blogger.com/atom/ns#' term='NodeJS'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Setting up Cloud9 on Ubuntu 11.10</title><content type='html'>&lt;p&gt;Ok, so it’s been a while since I’ve played with the Cloud9 IDE. Joyent are now &lt;a href="http://blog.nodejs.org/2011/11/25/node-v0-6-3/" target="_blank"&gt;bundling npm with the Node Windows installer&lt;/a&gt;, so I thought it was high time to revisit cloud9.&lt;/p&gt; &lt;p&gt;If you are on windows I highly recommend using &lt;a href="http://downloads.vmware.com/d/info/desktop_end_user_computing/vmware_player/4_0" target="_blank"&gt;VMware Player&lt;/a&gt;, it’s free, it’s fast, it has unattended Ubuntu installation and Unity is pure awesome sauce.&lt;/p&gt; &lt;p&gt;There’s a couple of things that have changed since last time around though. NodeJS and NPM are now available as debian packages. So no need to install git, dev tools, curl, etc. Secondly, the versions installed by using the default setup seem to all be compatible. Hence, setting up Cloud9 is decidedly simpler now. Behold!&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;sudo apt-get install nodejs
sudo apt-get install npm

npm install cloud9

mkdir NewApp
cd NewApp

~/bin/cloud9 –l 192.168.19.12&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

&lt;/style&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will launch Cloud9 in your NewApp directory. The –l param is optional, although it allows you to access Cloud9 from your Windows host. I didn’t do extensive testing, but editing/debugging works out of the box. &lt;/p&gt;
&lt;p&gt;Unfortunately, the version of Cloud9 in the NPM repo seems a bit old (0.5.1 vs 1.9.1 at the time of writing), which includes some pretty impressive features, such as code completion. If you want the latest and greatest, you’ll have to use &lt;a href="http://c9.io" target="_blank"&gt;c9.io&lt;/a&gt; or let me know in the comments if you’re interested and I’ll investigate further.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-5680252795358964962?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/5680252795358964962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2011/11/setting-up-cloud9-on-ubuntu-1110.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/5680252795358964962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/5680252795358964962'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2011/11/setting-up-cloud9-on-ubuntu-1110.html' title='Setting up Cloud9 on Ubuntu 11.10'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-5369377841918124837</id><published>2011-05-10T18:52:00.001+10:00</published><updated>2011-05-10T18:52:37.286+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='stupid'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>Skype and discoverability aka Resize Chat Message Width</title><content type='html'>&lt;p&gt;For a while now I’ve been quite annoyed by how narrow the chat window is in Skype, especially when pasting code, exception logs, e.g: &lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_MI35RBOjtgE/Tcj8w_OU3BI/AAAAAAAAANE/8ragYulXJ7Y/s1600-h/image%5B10%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_MI35RBOjtgE/Tcj808VnOMI/AAAAAAAAANI/8i7i1z2CRJ0/image_thumb%5B6%5D.png?imgmax=800" width="923" height="501"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Not very useful at times, especially given the real estate available, and this was only at 1366 horizontal resolution. Initial binging (and googling) turned up nothing, so I mentally filed it away in the (increasingly larger) pile of Things That Piss Me Off™.&lt;/p&gt; &lt;p&gt;Alas, today i went to vertically resize a non-skype related window that was hovering over skype. To my surprise I see a horizontal resize cursor rather than it’s vertical equivalent. Seems as though the chat width CAN be resized by grabbing the edges of the text entry field. The only indication that this is possible is the cursor change when hovering. Now, I understand that not &lt;a href="http://www.scottberkun.com/essays/26-the-myth-of-discoverability/" target="_blank"&gt;everything can be discoverable&lt;/a&gt;, but to me this is a bit ridiculous.&lt;/p&gt; &lt;p&gt;Re-searching this turns out that other people have &lt;a href="http://masochismtango.com/2009/05/27/skype-4-window-resize-is-feature-not-bug-allegedly/" target="_blank"&gt;discovered this long before me&lt;/a&gt;. Unfortunately the size of my Things That Piss Me Off™ pile hasn’t decreased…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-5369377841918124837?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/5369377841918124837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2011/05/skype-and-discoverability-aka-resize.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/5369377841918124837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/5369377841918124837'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2011/05/skype-and-discoverability-aka-resize.html' title='Skype and discoverability aka Resize Chat Message Width'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_MI35RBOjtgE/Tcj808VnOMI/AAAAAAAAANI/8i7i1z2CRJ0/s72-c/image_thumb%5B6%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-4641799265215053167</id><published>2011-04-07T21:31:00.001+10:00</published><updated>2011-04-07T21:31:46.225+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='Life Hacks'/><title type='text'>Standup Desk V1</title><content type='html'>&lt;p&gt;For a long time i have struggled with posture while sitting at a desk for 8+ hours a day so I finally got off my ass and decided to acquire a standup desk. The benefits of standup desks are documented all over the interwebs, so I won’t cover them all here. Suffice to say that not sitting all day long is A Good Thing™. &lt;/p&gt; &lt;p&gt;Now choosing a standup desk is a very difficult decision, they’re often quite expensive, and I found that there are to many display models around that you can go and try out. This is in a city of 2 million+ people, YMMV. &lt;/p&gt; &lt;p&gt;For some reason I was fixated upon getting a height-adjustable desk so that I could lower it to a normal desk height, if and when my legs grew tired. There’s plenty of options out there for this style.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Height-adjustable pros:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Adjust to suit anyone’s height  &lt;li&gt;When lowered look just like a normal desk  &lt;li&gt;Many come equipped with DC motors for fast, easy height adjustment  &lt;li&gt;Most seem to be mounted on wheels and can be easily relocated  &lt;li&gt;Certain “coolness” factor  &lt;li&gt;Keep your old (possibly very expensive) office chair &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Height-adjustable cons:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Tend to be fairly expensive, especially the ones with DC motors  &lt;li&gt;Loss of space, while not prohibitive, most height-adjustable desks seem not too have a set of drawers underneath like most normal desks&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt; &lt;p&gt;Due to a lack of affordable, viewable options of height adjustable desks in my area, I decided to investigate fixed height standup desks.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Fixed-height pros:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Tend to work out quite a bit cheaper than most height-adjustables, again YMMV  &lt;li&gt;Lots more space, i.e. drawers and more shelves  &lt;li&gt;No moving parts to wear out or break down&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Fixed-height cons:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Kind of have to be custom fit for whoever is going to be using the desk, not so much of an issue for me as I’ll be the only one using it.  &lt;li&gt;Tend to be much “uglier” than height-adjustables, more space = more clutter as well  &lt;li&gt;Need to purchase a higher chair/stool to compensate for not being able to sit at your desk regularly anymore&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt; &lt;p&gt;In the end the lure of extra-space and lower cost prompted my to invest in a fixed height desk. And when I say invest, I went to the local hardware store and bought some 16mm melamine and slide runners to fashion up an extra level to my existing desk. The result being:&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_MI35RBOjtgE/TZ2gmgLCrUI/AAAAAAAAAM8/OyW231xow2E/s1600-h/P11300178.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto; padding-top: 0px" title="P1130017" border="0" alt="P1130017" src="http://lh5.ggpht.com/_MI35RBOjtgE/TZ2goS4GitI/AAAAAAAAANA/ba3S1OfxoNA/P1130017_thumb5.jpg?imgmax=800" width="588" height="792"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Yes, ugly i know. But for $50 worth of materials and a couple of hours of time, it works for me. Although I feel as though the desk is about 50mm to high, my wrists don’t seem to be in&amp;nbsp; a perfectly natural position.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Now, I have been using this desk for two straight weeks now and I can honestly say I don’t think I’ll ever go back to a normal desk. My biggest problem was the fact that my feet were getting very sore, even within half an hour of standing still. &lt;/p&gt; &lt;p&gt;To remedy this I bought a balance board from a sports store to stand on (black and red disk on the floor in the above photo). It makes a world of difference and I find I can stand for hours without getting sore feet. Helps to keep the hips, etc in a “non-locked” position or so I’ve read. The added benefit of this is the fact that the board is about 50mm high, making the desk a perfect height for me. Genius at work here. No really.&lt;/p&gt; &lt;p&gt;I planned on buying a drafters stool so that i could sit at this desk when necessary, but now i don’t really see the point. I’ve got a couch in my study that i can relax on when taking phone calls etc.&lt;/p&gt; &lt;p&gt;Anyway, would love to hear others thoughts on my setup or experiences with standup desks in general.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-4641799265215053167?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/4641799265215053167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2011/04/standup-desk-v1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/4641799265215053167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/4641799265215053167'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2011/04/standup-desk-v1.html' title='Standup Desk V1'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_MI35RBOjtgE/TZ2goS4GitI/AAAAAAAAANA/ba3S1OfxoNA/s72-c/P1130017_thumb5.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-6355753932398232251</id><published>2011-04-07T14:38:00.001+10:00</published><updated>2011-04-07T14:38:51.073+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='stupid'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>c# Linq Compound Froms</title><content type='html'>&lt;p&gt;I’m a bit embarrassed to admit this, but even after using linq in it’s various form for a couple of years now, I hadn’t really ever noticed compound from expressions e.g.  &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Linq16()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    List&amp;lt;Customer&amp;gt; customers = GetCustomerList();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    var orders =&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        from c &lt;span class="kwrd"&gt;in&lt;/span&gt; customers&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        from o &lt;span class="kwrd"&gt;in&lt;/span&gt; c.Orders&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd"&gt;where&lt;/span&gt; o.OrderDate &amp;gt;= &lt;span class="kwrd"&gt;new&lt;/span&gt; DateTime(1998, 1, 1)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        select &lt;span class="kwrd"&gt;new&lt;/span&gt; { c.CustomerID, o.OrderID, o.OrderDate };&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    ObjectDumper.Write(orders);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;/p&gt;
&lt;p&gt;(&lt;a href="http://msdn.microsoft.com/en-us/vcsharp/aa336758#SelectManyCompoundfrom2" target="_blank"&gt;from 101 LINQ samples&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Very handy for flattening an object hierarchy, etc. In the end though it’s just syntactic sugar over SelectMany (like a good deal of &lt;a href="http://igoro.com/archive/one-linq-operator-to-rule-them-all/" target="_blank"&gt;many LINQ functions&lt;/a&gt;). Anyway, another tool in the belt.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-6355753932398232251?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/6355753932398232251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2011/04/c-linq-compound-froms.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/6355753932398232251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/6355753932398232251'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2011/04/c-linq-compound-froms.html' title='c# Linq Compound Froms'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-8950049598052179987</id><published>2011-03-29T20:33:00.001+10:00</published><updated>2011-03-29T20:33:50.960+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='coffee-script'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud9'/><category scheme='http://www.blogger.com/atom/ns#' term='NodeJS'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Expose shell in cloud9 console to run any command</title><content type='html'>&lt;p&gt;One of the main reasons I wanted to explore nodejs and cloud9 was due to my interest in coffee-script and other npm modules. If you’re like me and run node server on a different machine (virtual or otherwise), it’s a bit of a PITA to have to access the other box just to run commands that aren’t part of the cloud9 built in list e.g. ls, mkdir, git.&lt;/p&gt; &lt;p&gt;To enable any command to be run in the cloud9 console, setup the latest devel branch (&lt;a href="http://gratdevel.blogspot.com/2011/03/easier-way-of-setting-up-cloud9-on.html" target="_blank"&gt;v2 required&lt;/a&gt;) and make the following changes - &lt;/p&gt; &lt;p&gt;Modify cloud9/server/cloud9/ext/shell/index.js:line 22&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;this&lt;/span&gt;.command = &lt;span class="kwrd"&gt;function&lt;/span&gt;(user, message, client) {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (!&lt;span class="kwrd"&gt;this&lt;/span&gt;[message.command])
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;

        &lt;span class="kwrd"&gt;this&lt;/span&gt;[message.command](message);

        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;
    };&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;/p&gt;
&lt;p&gt;to look like&lt;/p&gt;&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;this&lt;/span&gt;.command = &lt;span class="kwrd"&gt;function&lt;/span&gt;(user, message, client) {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (!&lt;span class="kwrd"&gt;this&lt;/span&gt;[message.command])
            &lt;span class="kwrd"&gt;this&lt;/span&gt;[&lt;span class="str"&gt;"ls"&lt;/span&gt;](message);
        &lt;span class="kwrd"&gt;else&lt;/span&gt;            
            &lt;span class="kwrd"&gt;this&lt;/span&gt;[message.command](message);

        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;
    };&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Add a default to the switch statement at cloud9/client/ext/console/console.js:500&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;default&lt;/span&gt;:
    res = message.body;
    &lt;span class="kwrd"&gt;this&lt;/span&gt;.logNodeStream(res.&lt;span class="kwrd"&gt;out&lt;/span&gt; || res.err);
    &lt;span class="kwrd"&gt;this&lt;/span&gt;.log(&lt;span class="str"&gt;""&lt;/span&gt;, &lt;span class="str"&gt;"divider"&lt;/span&gt;);
    &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;/p&gt;
&lt;p&gt;Restart node, and you should now be able to run most commands from within the cloud9 console, things like npm and coffee -c are now at your fingertips. Keep in mind this approach hasn’t been battle tested.&lt;/p&gt;
&lt;p&gt;Yes this is very dodgy and I wouldn’t expect to put this into production at any point, it’s simply a nice little shortcut that piggybacks on the standard ls functionality. Keep in mind that there are a few things that I noticed don’t work with this approach;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;interactive scripts (e.g. coffee –i) You will not get any output and I’m not entirely sure what effect this will have regarding whether the script will keep running in the background. &lt;/li&gt;
&lt;li&gt;quoted arguments (`which node`) seem to be disabled as well, i haven’t needed to use them as yet. YMMV&lt;/li&gt;
&lt;li&gt;sudo is also disabled explicitly in the cloud9 console. It shouldn’t be difficult to remove the restriction if you so wish. Doing so may open up some serious security holes though. Though you can sudo make me a sandwich&lt;/li&gt;
&lt;li&gt;I haven’t tested this with long running processes (like node itself) either&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;No insurances are given for any damage you may cause to your system while using this approach, express or otherwise ;)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-8950049598052179987?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/8950049598052179987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2011/03/expose-shell-in-cloud9-console-to-run.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/8950049598052179987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/8950049598052179987'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2011/03/expose-shell-in-cloud9-console-to-run.html' title='Expose shell in cloud9 console to run any command'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-5541898217096384727</id><published>2011-03-21T22:16:00.001+10:00</published><updated>2011-03-25T12:00:52.949+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cloud9'/><category scheme='http://www.blogger.com/atom/ns#' term='NodeJS'/><category scheme='http://www.blogger.com/atom/ns#' term='nvm'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Easier Way of Setting up Cloud9 on Ubuntu 10.10 32-bit desktop w/ nvm</title><content type='html'>&lt;p&gt;&lt;strong&gt;EDIT:&lt;/strong&gt; &lt;a href="https://groups.google.com/d/msg/cloud9-ide/iHpVnIoXk5A/FKTNX8iyxb0J" target="_blank"&gt;Thanks to William Rayner&lt;/a&gt;, it seems the current npm module can be used with the latest stable node. It’s those pesky o3 tools causing problems again. Anyway, check out v3 below for a non-version dependant install script for cloud9.&lt;/p&gt; &lt;p&gt;Ok, lets try this again. &lt;a href="http://gratdevel.blogspot.com/2011/03/setting-up-cloud9-on-ubuntu-1010-32-bit.html" target="_blank"&gt;Last time around&lt;/a&gt; I spent a lot of time fumbling in the dark, hitting various errors and generally using a sledgehammer approach to getting the Cloud9-ide app running. Hopefully this time around it’ll be more like a Pozidriv. &lt;/p&gt; &lt;p&gt;Now I think the following script should install the latest versions of node, npm and cloud9. Hopefully, if someone stumbles upon this post in the future they’ll be able to follow this regardless of what the current versions and dependencies are.&lt;/p&gt; &lt;p&gt;v1) *Unstable* – node stable, npm stable, cloud9 0.2.0 w/ o3 binaries&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre&gt;sudo apt-get install -y git-core libssl-dev curl&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;git clone git:&lt;span class="rem"&gt;//github.com/creationix/nvm.git ~/.nvm&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;. ~/.nvm/nvm.sh&lt;/pre&gt;&lt;pre&gt;nvm sync&lt;/pre&gt;&lt;pre class="alt"&gt;nvm install stable&lt;/pre&gt;&lt;pre&gt;nvm use stable&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;npm install cloud9&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;cloud9&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Note: I stumbled upon the fact that once you install cloud9, that you can launch it just by calling cloud9 (instead of “user@machine&amp;gt; node /path/to/cloud9.js”). Not sure if this is a standard npm thing or specific to cloud9, nice to know regardless.&lt;/p&gt;
&lt;p&gt;This all seems a little too good to be true. Unfortunately, for now, it is. It seems the current combination of the latest node and the cloud9 module are incongruous, so you’ll just have to follow &lt;a href="http://gratdevel.blogspot.com/2011/03/setting-up-cloud9-on-ubuntu-1010-32-bit.html" target="_blank"&gt;my previous guide&lt;/a&gt; for now ;)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;… or a combination of the two. Use this if you want the most up-to-date cloud9&lt;/p&gt;
&lt;p&gt;v2) *Stable*, node stable, npm stable, cloud9 devel branch, compiled o3 tools&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;sudo apt-get update&lt;/pre&gt;&lt;pre&gt;sudo apt-get install -y build-essential g++ curl libssl-dev apache2-utils git libxml2-dev&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;git clone git://github.com/creationix/nvm.git ~/.nvm&lt;/pre&gt;&lt;pre class="alt"&gt;. ~/.nvm/nvm.sh&lt;/pre&gt;&lt;pre&gt;nvm sync&lt;/pre&gt;&lt;pre class="alt"&gt;nvm install stable&lt;/pre&gt;&lt;pre&gt;nvm use stable &lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;git clone git://github.com/ajaxorg/cloud9.git&lt;/pre&gt;&lt;pre class="alt"&gt;cd cloud9&lt;/pre&gt;&lt;pre&gt;git checkout devel&lt;/pre&gt;&lt;pre class="alt"&gt;git submodule update --init --recursive&lt;/pre&gt;&lt;pre&gt;bin/cloud9.sh&lt;/pre&gt;&lt;pre class="alt"&gt;cd ..&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;git clone http://github.com/ajaxorg/o3&lt;/pre&gt;&lt;pre&gt;cd o3&lt;/pre&gt;&lt;pre class="alt"&gt;./tools/node_modules_build&lt;/pre&gt;&lt;pre&gt;cp build/&lt;span class="kwrd"&gt;default&lt;/span&gt;/o3.node ../cloud9/support/jsdav/support/node-o3-xml-v4/lib/o3-xml/&lt;/pre&gt;&lt;pre class="alt"&gt;cd .. &lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;node ~/cloud9/bin/cloud9.js -w ~/yourproject&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;v3) *Stable*, node stable, npm stable, cloud9 0.2.0, compiled o3 tools&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;sudo apt-get install -y git-core libssl-dev curl libxml2-dev&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;git clone git://github.com/creationix/nvm.git ~/.nvm&lt;/pre&gt;&lt;pre&gt;. ~/.nvm/nvm.sh&lt;/pre&gt;&lt;pre class="alt"&gt;nvm sync&lt;/pre&gt;&lt;pre&gt;nvm install stable&lt;/pre&gt;&lt;pre class="alt"&gt;nvm use stable&lt;/pre&gt;&lt;pre&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;npm install cloud9&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;git clone https://github.com/ajaxorg/o3.git&lt;/pre&gt;&lt;pre&gt;cd o3 &lt;/pre&gt;&lt;pre class="alt"&gt;./tools/node_modules_build&lt;/pre&gt;&lt;pre&gt;sudo cp build/&lt;span class="kwrd"&gt;default&lt;/span&gt;/o3.node ~/.nvm/`node -v`/lib/node/clo9/support/jsdav/support/node-o3-xml/lib/o3-xml/&lt;/pre&gt;&lt;pre class="alt"&gt; &lt;/pre&gt;&lt;pre&gt;cloud9&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Again, good luck!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-5541898217096384727?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/5541898217096384727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2011/03/easier-way-of-setting-up-cloud9-on.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/5541898217096384727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/5541898217096384727'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2011/03/easier-way-of-setting-up-cloud9-on.html' title='Easier Way of Setting up Cloud9 on Ubuntu 10.10 32-bit desktop w/ nvm'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-4803757057815265571</id><published>2011-03-05T14:30:00.001+10:00</published><updated>2011-03-29T10:56:10.469+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VMware'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud9'/><category scheme='http://www.blogger.com/atom/ns#' term='NodeJS'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Setting up Cloud9 on Ubuntu 10.10 32-bit desktop</title><content type='html'>&lt;p&gt;&lt;strong&gt;EDIT:&lt;/strong&gt; I’ve posted an easier version of this &lt;a href="http://gratdevel.blogspot.com/2011/03/easier-way-of-setting-up-cloud9-on.html" target="_blank"&gt;setup routine&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;After many failed attempts to get Cloud9 up and running on ubuntu, someone finally &lt;a href="https://groups.google.com/d/msg/cloud9-ide/nhcoUqTRzsM/o3lUEIqPSxcJ" target="_blank"&gt;posted some decent installation instructions&lt;/a&gt;. Andre used archlinux, so i thought I would try to do the same with ubuntu.&lt;/p&gt; &lt;p&gt;Below is the sequence of steps i followed to get up and running:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Install Ubuntu 10.10 i686, choose any of the following:  &lt;ol&gt; &lt;li&gt;&lt;a href="http://www.ubuntu.com/desktop/get-ubuntu/download" target="_blank"&gt;Local install&lt;/a&gt;  &lt;li&gt;Cloud based install &lt;a href="http://teeparham.posterous.com/ubuntu-1010-ec2-setup-tips" target="_blank"&gt;amazon ec2&lt;/a&gt;, rackspace, etc  &lt;li&gt;Virtual Machine with VMware, Parallels, Virtual PC, etc&lt;/li&gt;&lt;/ol&gt; &lt;li&gt;I chose to use VMware Server 2.0 (formerly GSX server) for no other reason than I have used it before. It is free and quite powerful. I can never get bridged networking to work with wireless network on the host, so i plugged a cheapo separate wireless-network adapter into my laptop and configured VMware to pass that through to ubuntu. Anyway use whatever method you want, just get to the ubuntu desktop/terminal with network access.  &lt;li&gt;Update ubuntu  &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;sudo apt-get update&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;li&gt;Need to install various packages and tools in order to compile node, o3, cloud9, etc. The big one I missed here was libxml2-dev, o3 won’t compile without it, and it wasn’t exactly obvious for me that I need this particular package. Also, you probably won’t need all of these, YMMV. 
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;sudo apt-get install -y build-essential g++ curl libssl-dev apache2-utils git libxml2-dev&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;li&gt;Due to various folder permission errors you may get down the track, it’s worth setting up a local bin path to install nodejs into and add that path to bash&lt;pre class="csharpcode"&gt;echo &lt;span class="str"&gt;'export PATH=$HOME/local/bin:$PATH'&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc
. ~/.bashrc
mkdir ~/local &lt;/pre&gt;
&lt;li&gt;Setup nodejs. Now there are &lt;a href="https://gist.github.com/579814" target="_blank"&gt;various ways of doing this&lt;/a&gt;, you could even &lt;a href="https://github.com/creationix/nvm" target="_blank"&gt;try nvm&lt;/a&gt;. This is what worked for me. There are newer versions of node than v0.4.0 already (4.1, 4.2, 5.0-pre, etc) but it seemed stable enough for me so I stuck with it. Now not all these steps are necessary, e.g. test and –v, but i put them in just to keep my sanity in check. Set configure to ~/local makes sure we install node to the ~/local/bin path we setup earlier 
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;git clone git://github.com/joyent/node.git&lt;/pre&gt;&lt;pre&gt;cd node&lt;/pre&gt;&lt;pre class="alt"&gt;git checkout v0.4.0&lt;/pre&gt;&lt;pre&gt;./configure --prefix=~/&lt;span class="kwrd"&gt;local&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;make&lt;/pre&gt;&lt;pre&gt;make install&lt;/pre&gt;&lt;pre class="alt"&gt;make test&lt;/pre&gt;&lt;pre&gt;cd ..&lt;/pre&gt;&lt;pre class="alt"&gt;node -v&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;li&gt;Setup npm, I think this step is optional but we may need it down the track 
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;curl http://npmjs.org/install.sh | sh&lt;/pre&gt;&lt;pre&gt;npm -v&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;li&gt;Setup cloud9. This doesn’t really seem to be very well documented, but the suggestion is to use the development branch of cloud9. This part will take quite a while to update all the submodules. You will probably get an error on bin/cloud9.sh, I really don’t know if it is necessary (it is mentioned in the &lt;a href="https://github.com/ajaxorg/cloud9" target="_blank"&gt;cloud9 installation instructions&lt;/a&gt;)&amp;nbsp;&amp;nbsp; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;git clone git://github.com/ajaxorg/cloud9.git&lt;/pre&gt;&lt;pre&gt;cd cloud9&lt;/pre&gt;&lt;pre class="alt"&gt;git checkout devel&lt;/pre&gt;&lt;pre&gt;git submodule update --init --recursive&lt;/pre&gt;&lt;pre class="alt"&gt;bin/cloud9.sh&lt;/pre&gt;&lt;pre&gt;cd ..&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;li&gt;Build o3. I had plenty of problems with this step due to not having libxml2-dev installed. This copies the new o3 binaries into cloud9 
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;git clone http://github.com/ajaxorg/o3&lt;/pre&gt;&lt;pre&gt;cd o3&lt;/pre&gt;&lt;pre class="alt"&gt;./tools/node_modules_build&lt;/pre&gt;&lt;pre&gt;cp build/&lt;span class="kwrd"&gt;default&lt;/span&gt;/o3.node ../cloud9/support/jsdav/support/node-o3-xml-v4/lib/o3-xml/&lt;/pre&gt;&lt;pre class="alt"&gt;cd ..&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;li&gt;Create a new directory for your project ~/yourproject and add an app.js file containing 
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt; http = require(&lt;span class="str"&gt;'http'&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;http.createServer(&lt;span class="kwrd"&gt;function&lt;/span&gt; (req, res) {&lt;/pre&gt;&lt;pre&gt;  res.writeHead(200, {&lt;span class="str"&gt;'Content-Type'&lt;/span&gt;: &lt;span class="str"&gt;'text/plain'&lt;/span&gt;});&lt;/pre&gt;&lt;pre class="alt"&gt;  res.end(&lt;span class="str"&gt;'Hello World\n'&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;}).listen(3001, &lt;span class="str"&gt;"0.0.0.0"&lt;/span&gt;); &lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;li&gt;Almost there. You should now be able to run cloud9 like so (although switches are optional) 
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;node ~/cloud9/bin/cloud9.js -w ~/yourproject&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;li&gt;Now you should be able to open up the cloud9 ide @ &lt;a href="http://127.0.0.1:3000"&gt;http://127.0.0.1:3000&lt;/a&gt; 
&lt;li&gt;Now not everything is perfect (ctrl-s doesn’t save you file, instead calls up the firefox save as dialog for me for some reason), but it’s good enough for me to live with. 
&lt;li&gt;Lastly, why do this instead of using the free, already configured &lt;a href="cloud9ide.com" target="_blank"&gt;cloud9ide.com&lt;/a&gt;? Well this allows me to control everything, as well as run commands like the &lt;a href="http://jashkenas.github.com/coffee-script/" target="_blank"&gt;coffeescript cli&lt;/a&gt;, etc&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Good luck!&lt;/p&gt;
&lt;p&gt;You may want to hit up the cloud9 ide google group if you have issues&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-4803757057815265571?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/4803757057815265571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2011/03/setting-up-cloud9-on-ubuntu-1010-32-bit.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/4803757057815265571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/4803757057815265571'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2011/03/setting-up-cloud9-on-ubuntu-1010-32-bit.html' title='Setting up Cloud9 on Ubuntu 10.10 32-bit desktop'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-1903401583926504476</id><published>2010-10-27T16:56:00.000+10:00</published><updated>2010-10-27T16:59:25.071+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rhosync'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='stupid'/><category scheme='http://www.blogger.com/atom/ns#' term='Rhomobile'/><title type='text'>Rhosync Compile Errors–Rake Log File</title><content type='html'>&lt;p&gt;Standard behaviour to &lt;a href="http://wiki.rhomobile.com/index.php/Rhosync_Tutorial" target="_blank"&gt;run a Rhosync webserver&lt;/a&gt; requires running the following command in the folder containing your Rhosync server app (talking windows here):&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;rake rhosync:start&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;which will run in a new cmd window. Problem is if there is a compile error, this window will close before you get to see the error. I was expecting to see errors in logs somewhere, but my limited searching turned up nothing.&lt;/p&gt;
&lt;p&gt;Easy fix is to just call rake instead. e.g. 
&lt;p&gt;&amp;nbsp; &lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;rake&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Probably easy for most people to work out, but for us linux noobs simple things can sometimes seem very difficult :( &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-1903401583926504476?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/1903401583926504476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2010/10/rhosync-compile-errorsrake-log-file.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/1903401583926504476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/1903401583926504476'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2010/10/rhosync-compile-errorsrake-log-file.html' title='Rhosync Compile Errors–Rake Log File'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-6293770943065712625</id><published>2010-10-26T15:36:00.000+10:00</published><updated>2010-10-27T16:59:59.677+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life Hacks'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Android &lt;3 – 5 Best Apps</title><content type='html'>&lt;p&gt;Purchased a Samsung Galaxy S a couple of months ago after trying to hold out for a Windows Phone 7 … phone. Never made it and my Samsung Omnia was getting a bit long in the tooth (though custom roms from XDA made it bearable). For various, probably unreasonable, reasons I was reluctant to but another samsung phone. Bit the bullet, and I’m glad I did. Phone is awesome yada, yada, yada. Just thought I’d share my top 5 favourite apps:&lt;/p&gt; &lt;h3&gt;&lt;a href="http://www.appbrain.com/app/launcherpro/com.fede.launcher" target="_blank"&gt;Launcher Pro Plus&lt;/a&gt; – US$2.99&lt;/h3&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_MI35RBOjtgE/TMe6qlbmZSI/AAAAAAAAALM/B8DIS_C0Zvc/s1600-h/LPP%5B3%5D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="LPP" border="0" alt="LPP" align="left" src="http://lh3.ggpht.com/_MI35RBOjtgE/TMe6rcJOy7I/AAAAAAAAALQ/bmf2ldlcWN8/LPP_thumb%5B1%5D.jpg?imgmax=800" width="162" height="286"&gt;&lt;/a&gt;Launcher app to replace Samsung’s iPhone-ish TouchWiz Launcher. I can’t give LauncherPro Plus enough wraps, smooth, powerful, intuitive, customizable. The ability to create shortcuts on your home-screens is invaluable. Not just app shortcuts though, webpages, contacts, activities(i.e. message a contact, navigate to a destination, etc). Really makes this phone fun to use. Free Version is full-featured but I recommend purchasing the app to help out the developers.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;&amp;nbsp;&lt;/h3&gt; &lt;h3&gt;&lt;a href="http://www.appbrain.com/app/handcent-sms/com.handcent.nextsms" target="_blank"&gt;Handcent SMS&lt;/a&gt; – FREE&lt;/h3&gt; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_MI35RBOjtgE/TMe6r-sSEzI/AAAAAAAAALU/SrBNblsBZwo/s1600-h/Hancent%5B3%5D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Hancent" border="0" alt="Hancent" align="left" src="http://lh4.ggpht.com/_MI35RBOjtgE/TMe6sheCcbI/AAAAAAAAALY/FU0KTM626Ao/Hancent_thumb.jpg?imgmax=800" width="164" height="244"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Replaces the standard android/samsung messaging app. Again really nice app to use, highly customizable, fast, etc. Best feature would have to be the “Quick Reply” popup that allows you to reply to an SMS without having the entire messaging app open up.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;&amp;nbsp;&lt;/h3&gt; &lt;h3&gt;&lt;a href="http://forum.xda-developers.com/showthread.php?t=630887" target="_blank"&gt;BRUT Mod&lt;/a&gt; – FREE &lt;/h3&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_MI35RBOjtgE/TMe6tMoa8lI/AAAAAAAAALc/_5vADffcVHo/s1600-h/brut%5B3%5D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="brut" border="0" alt="brut" align="left" src="http://lh5.ggpht.com/_MI35RBOjtgE/TMe6t86-ROI/AAAAAAAAALg/vizF1Ll80ok/brut_thumb%5B1%5D.jpg?imgmax=800" width="164" height="290"&gt;&lt;/a&gt;Worldwide navigation using Google Maps Directions, map tiles caching on SD card, etc. ‘nuff said&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;&amp;nbsp;&lt;/h3&gt; &lt;h3&gt;&lt;a href="http://www.appbrain.com/" target="_blank"&gt;AppBrain&lt;/a&gt; – FREE (Ad supported)&lt;/h3&gt; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_MI35RBOjtgE/TMe6uoLrUlI/AAAAAAAAALk/mhhpdxugo4w/s1600-h/appbrain%5B3%5D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="appbrain" border="0" alt="appbrain" align="left" src="http://lh4.ggpht.com/_MI35RBOjtgE/TMe6vBbUKfI/AAAAAAAAALo/sxRZNS24ep4/appbrain_thumb%5B1%5D.jpg?imgmax=800" width="167" height="277"&gt;&lt;/a&gt;Replacement market app. Manage you apps online. Hot apps, recommendations, backups, app lists. It’s got them all. Fast clean, interface. I would probably purchase this to get rid of the ads, but they seem to only have a donate option :S&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h3&gt;&amp;nbsp;&lt;/h3&gt; &lt;h3&gt;&lt;a href="http://www.appbrain.com/app/winamp/com.nullsoft.winamp" target="_blank"&gt;Winamp&lt;/a&gt; – FREE&lt;/h3&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_MI35RBOjtgE/TMe6v543uXI/AAAAAAAAALs/HW9rLIwLXvI/s1600-h/winamp%5B3%5D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="winamp" border="0" alt="winamp" align="left" src="http://lh3.ggpht.com/_MI35RBOjtgE/TMe6wsPNs6I/AAAAAAAAALw/IujK-Mi1E28/winamp_thumb%5B1%5D.jpg?imgmax=800" width="173" height="306"&gt;&lt;/a&gt;Only just installed this, but it looks like it will be my number one music player for the foreseeable future. It’s got playlists, it’s fast, it’s smooth, has a great homescreen widget and best of all a lock screen widget. Not sure I could ask for much else in a media player.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;It’s not really surprising that all these apps are just replacements for existing functions on the Galaxy S which are all severely hindered in some way. Next time I’ll look at apps that actually add features… &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-6293770943065712625?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/6293770943065712625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2010/10/android-5-best-apps.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/6293770943065712625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/6293770943065712625'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2010/10/android-5-best-apps.html' title='Android &amp;lt;3 – 5 Best Apps'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_MI35RBOjtgE/TMe6rcJOy7I/AAAAAAAAALQ/bmf2ldlcWN8/s72-c/LPP_thumb%5B1%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-1555133858870954676</id><published>2010-10-25T17:09:00.000+10:00</published><updated>2010-10-26T17:23:37.590+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NodeJS'/><category scheme='http://www.blogger.com/atom/ns#' term='stupid'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Node != Nodejs</title><content type='html'>&lt;p&gt;Recently built a new Ubuntu 10 VM to test out a few Node.js ideas. While &lt;a href="http://ajaxian.com/archives/node-net-running-node-on-windows-via-net" target="_blank"&gt;support for windows&lt;/a&gt; is improving, it just isn’t ready for &lt;a href="http://codebetter.com/blogs/matthew.podwysocki/archive/2010/09/07/getting-started-with-node-js-on-windows.aspx" target="_blank"&gt;prime time&lt;/a&gt;. I’m very much a linux noob so I just tried following the &lt;a href="http://www.codediesel.com/linux/installing-node-js-on-ubuntu-10-04/" target="_blank"&gt;various&lt;/a&gt; &lt;a href="http://giantflyingsaucer.com/blog/?p=894" target="_blank"&gt;guides&lt;/a&gt; out there.&lt;/p&gt; &lt;p&gt;I’ve followed these steps successfully recently so it came as a surprise when running:  &lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;neil@ubuntu:~$ cd node&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;neil@ubuntu:~/node$ ./configure&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;resulted in: 
&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;neil@ubuntu:~/node$ ./configure: 4: autoconf: not found&lt;/pre&gt;&lt;/div&gt;(or some other such error) 
&lt;p&gt;Now trying to brute my way through the install I pushed on and ran:&lt;/p&gt;
&lt;p&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;neil@ubuntu:~/node$ make&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;neil@ubuntu:~/node$ sudo make install&lt;/pre&gt;&lt;/div&gt;furthers errors ensued… 
&lt;p&gt;However then running: 
&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;neil@ubuntu:~/node$ node&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;gave me the oh so informative:&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;The program &lt;span class="str"&gt;'node'&lt;/span&gt; is currently not installed.  You can install it by typing:&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;sudo apt-get install node&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;&lt;font size="6"&gt;DO NOT RUN&lt;/font&gt; &lt;font size="2" face="Courier New"&gt;sudo apt-get install node&lt;/font&gt;&lt;/h3&gt;
&lt;p&gt;As this will install the node module. Confused? Well node != nodejs. node is apparently a &lt;a href="http://packages.ubuntu.com/lucid/node" target="_blank"&gt;Amateur Packet Radio Node&lt;/a&gt; program. Not what we want unless you’re into ham radios… Attempting to run node will usually result in something along the lines of:&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;axconfig: port 1 not active &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;axconfig: port 2 not active &lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;How to fix all this? Well thanks to &lt;a href="http://stackoverflow.com/questions/2424346/getting-error-while-running-simple-javascript-using-node-framework" target="_blank"&gt;stack-overflow&lt;/a&gt; and the &lt;a href="http://groups.google.com/group/nodejs/browse_thread/thread/5d30251c16db9ac5/e8459c93999f32bc?lnk=gst&amp;amp;q=axconfig#e8459c93999f32bc" target="_blank"&gt;nodejs group&lt;/a&gt; at least I knew where to start:&lt;/p&gt;
&lt;p&gt;First remove the node package:&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;sudo apt-get remove --purge node&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;sudo apt-get clean&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;And then run the following to get a stable version of nodeJS running (e.g. v0.2.4): &lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;sudo apt-get install build-essential&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;cd node&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;git checkout v0.2.4&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;./configure&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;make&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;sudo make install&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;You should now be able to run nodeJS scripts. YMMV&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-1555133858870954676?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/1555133858870954676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2010/10/node-nodejs.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/1555133858870954676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/1555133858870954676'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2010/10/node-nodejs.html' title='Node != Nodejs'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-6498379355572533294</id><published>2010-08-19T14:32:00.001+10:00</published><updated>2010-08-19T14:32:34.036+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Resharper'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='VisualStudio'/><title type='text'>Visual Studio – Tip #1</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://weblogs.asp.net/infinitiesloop/archive/2008/07/18/visual-studio-tip-disable-f1.aspx" target="_blank"&gt;Like a lot of people&lt;/a&gt;, I find F1 in Visual Studio practically useless. I did read a suggestion to remap F1 to Debug-&amp;gt;Run just so it did something useful. &lt;/p&gt; &lt;p&gt;Not wanting to waste a precious key I’ve decided to remap F1 to run the &lt;a href="http://www.jetbrains.com/resharper/features/previews/unit_test_sessions.png" target="_blank"&gt;currently selected unit test&lt;/a&gt; in &lt;a href="http://www.jetbrains.com/resharper/features/unit_testing.html" target="_blank"&gt;Resharper’s Unit Test Sessions&lt;/a&gt; window via the ReSharper_UnitTestSession_RunProcess command. Only problem is that windows needs to be selected before RunProcess will work. Visual Studio Macros to the rescue:&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;    &lt;span class="kwrd"&gt;Sub&lt;/span&gt; Run_Current_Session()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        DTE.Windows.Item(&lt;span class="str"&gt;"{B2BC9916-E3E6-43A8-AD5F-3BDB95F53DB5}"&lt;/span&gt;).Activate()&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        DTE.ExecuteCommand(&lt;span class="str"&gt;"ReSharper_UnitTestSession_RunProcess"&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;End&lt;/span&gt; Sub&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;

&lt;p&gt;Moving on I’ve applied the same tactic to map F6 to ReSharper_UnitTestSession_DebugProcess. The productivity increase has been quite noticeable. &lt;/p&gt;
&lt;p&gt;More random tips soon…&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-6498379355572533294?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/6498379355572533294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2010/08/visual-studio-tip-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/6498379355572533294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/6498379355572533294'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2010/08/visual-studio-tip-1.html' title='Visual Studio – Tip #1'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-2443542757886464186</id><published>2010-03-11T11:43:00.001+10:00</published><updated>2010-03-11T11:45:03.714+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Resharper'/><category scheme='http://www.blogger.com/atom/ns#' term='Areas'/><category scheme='http://www.blogger.com/atom/ns#' term='Namespaces'/><category scheme='http://www.blogger.com/atom/ns#' term='MVC RC2'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net mvc'/><title type='text'>ASP.NET MVC2 RC2 Areas Namespace Conflict</title><content type='html'>&lt;p&gt;While converting an MVC1 app to MVC RC2 I created an Area and moved my existing controllers into said area. Resharper identified the “Namespace does not correspond to file location, should be: AAA.Areas.BBB.Controllers” as expected. A simple “Move declarations to namespace ‘AAA.Areas.BBB.Controllers’” was sufficient to alleviate the issue.&lt;/p&gt;  &lt;p&gt;At this point I also realised I needed to change my default namespace for the project to “XXX.AAA” and hence the namespace of my controller needed to change to “XXX.AAA.Areas.BBB.Controllers”. No problem.&lt;/p&gt;  &lt;p&gt;Tried to navigate to said controller and received http 404, “The Resource cannot be found”. Debugged and found the route was being registered via AreaRegistraion.RegisterArea but the controller constructor wasn’t being hit.&lt;/p&gt;  &lt;p&gt;Fix 1 (The hard way) : context.MapRoute(name, url, defaults, namespaces) allows you to specify the controller’s namespace/s as outlined by &lt;a href="http://haacked.com/archive/2010/01/12/ambiguous-controller-names.aspx" target="_blank"&gt;haacked&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Fix 2 (The easy way): make sure the area registration uses the same namespace as the controller i.e. “XXX.AAA.Areas.BBB” instead of the original “AAA.Areas.BBB”.&lt;/p&gt;  &lt;p&gt;Now everyone’s happy :)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-2443542757886464186?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/2443542757886464186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2010/03/aspnet-mvc2-rc2-areas-namespace.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/2443542757886464186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/2443542757886464186'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2010/03/aspnet-mvc2-rc2-areas-namespace.html' title='ASP.NET MVC2 RC2 Areas Namespace Conflict'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-5711186126187923178</id><published>2009-12-24T01:24:00.001+10:00</published><updated>2009-12-24T01:27:38.147+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='Generics'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Devil’s in the details : typeof Generics C#</title><content type='html'>&lt;p&gt;Been a while since I’ve posted but thought this tidbit was interesting. &lt;/p&gt;  &lt;p&gt;Given the types:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; X {}
&lt;span class="kwrd"&gt;class&lt;/span&gt; Y&amp;lt;A&amp;gt;{}
&lt;span class="kwrd"&gt;class&lt;/span&gt; Z&amp;lt;A,B&amp;gt;{}&lt;/pre&gt;
&lt;style type="text/css"&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;The following statements are legal:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;var tx = &lt;span class="kwrd"&gt;typeof&lt;/span&gt; (X);             &lt;span class="rem"&gt;//simples&lt;/span&gt;
var ty1 = &lt;span class="kwrd"&gt;typeof&lt;/span&gt; (Y&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;);       &lt;span class="rem"&gt;//fine&lt;/span&gt;
var ty2 = &lt;span class="kwrd"&gt;typeof&lt;/span&gt; (Y&amp;lt;&amp;gt;);          &lt;span class="rem"&gt;//and again&lt;/span&gt;
var tz1 = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Z&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;);   &lt;span class="rem"&gt;//easy enough&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Interesting behaviour starts occurring when you working with generics based on multiple types:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;var tz2 = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Z&amp;lt;&amp;gt;);       &lt;span class="rem"&gt;//ruh-roh!!  Error: Using the generic type 'Z&amp;lt;A,B&amp;gt;' requires '2' type arguments&lt;/span&gt;
var tz3 = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Z&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;,&amp;gt;);   &lt;span class="rem"&gt;//Error: Type expected&lt;/span&gt;
var tz4 = &lt;span class="kwrd"&gt;typeof&lt;/span&gt; (Z&amp;lt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;); &lt;span class="rem"&gt;//Same again&lt;/span&gt;
var tz5 = &lt;span class="kwrd"&gt;typeof&lt;/span&gt; (Z&amp;lt;,&amp;gt;);     &lt;span class="rem"&gt;//Great success!&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;So it seems you either have specify ALL the types or NONE of the types, which made me wonder why the need to put the comma in tz5? Answer is because it is perfectly legal to have multiple types use the same class name e.g. &lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Z {}
&lt;span class="kwrd"&gt;class&lt;/span&gt; Z&amp;lt;A&amp;gt; {}
&lt;span class="kwrd"&gt;class&lt;/span&gt; Z&amp;lt;A,B&amp;gt;  {}&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Effectively the generic parameters (or lack thereof) are part the class signature.&lt;/p&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-5711186126187923178?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/5711186126187923178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2009/12/devils-in-details-typeof-generics-c.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/5711186126187923178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/5711186126187923178'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2009/12/devils-in-details-typeof-generics-c.html' title='Devil’s in the details : typeof Generics C#'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-7960669402014974386</id><published>2009-09-03T11:14:00.001+10:00</published><updated>2009-09-03T11:14:35.388+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='stupid'/><category scheme='http://www.blogger.com/atom/ns#' term='Life Hacks'/><title type='text'>Work Smarter Not Harder</title><content type='html'>&lt;p&gt;Lately I’ve been getting into the habit of writing down the little snippets of goodness I happen upon in my daily web traversing. It’s kinda like twitter but on paper, I force myself to write one “item” per line, e.g. “Use mocks as a last resort, stubs as standard. 95% of testing is state-based, 5% interaction – Roy Osherove”. &lt;/p&gt;  &lt;p&gt;I’ve found it really useful of late as they tend to be important things to remember that I don’t want to lose in the bookmark/tag cloud. Writing them down also helps me remember them in the first place.&lt;/p&gt;  &lt;p&gt;Onto the title of this post however… I was doing some Asp.Net MVC work today when I half remembered something along the lines of “if you’re doing x, then you should use y”. I was doing x but for the life of me couldn’t remember what y was. I chastised myself for not writing it down on my “twitter-sheet” and spent half an hour re-finding the quote which I promptly wrote down. &lt;/p&gt;  &lt;p&gt;Turns out I had previously written it down. Two lines above my fresh version. Live and learn…&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-7960669402014974386?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/7960669402014974386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2009/09/work-smarter-not-harder.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/7960669402014974386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/7960669402014974386'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2009/09/work-smarter-not-harder.html' title='Work Smarter Not Harder'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-6857964248206243834</id><published>2009-08-26T23:55:00.000+10:00</published><updated>2009-08-26T23:55:48.068+10:00</updated><title type='text'>Roy Osherove TDD Masterclass UK</title><content type='html'>Roy Osherove is giving an hands-on TDD Masterclass in the UK, September 21-25. Roy is author of "The Art of Unit Testing" (&lt;a href="http://www.artofunittesting.com/" linkindex="20"&gt;http://www.artofunittesting.com/&lt;/a&gt;), a leading tdd &amp;amp; unit testing book; he maintains a blog at &lt;a href="http://iserializable.com/" linkindex="21"&gt;http://iserializable.com&lt;/a&gt; (which amoung other things has critiqued tests written by Microsoft for &lt;a href="http://asp.net/" linkindex="22"&gt;asp.net&lt;/a&gt; MVC - check out the testreviews category) and has recently been on the Scott Hanselman podcast (&lt;a href="http://bit.ly/psgYO" linkindex="23"&gt;http://bit.ly/psgYO&lt;/a&gt;) where he educated Scott on best practices in Unit Testing techniques. For a further insight into Roy's style, be sure to also check out Roy's talk at the recent Norwegian Developer's Conference (&lt;a href="http://bit.ly/NuJVa" linkindex="24"&gt;http://bit.ly/NuJVa&lt;/a&gt;).&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Full Details here: &lt;a href="http://bbits.co.uk/tddmasterclass" linkindex="25"&gt;http://bbits.co.uk/tddmasterclass&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
bbits are holding a raffle for a free ticket for the event. To be eligible to win the ticket (worth £2395!) you MUST paste this text, including all links, into your blog and email &lt;a href="mailto:Ian@bbits.co.uk"&gt;Ian@bbits.co.uk&lt;/a&gt; with the url to the blog entry.&amp;nbsp; The draw will be made on September 1st and the winner informed by email and on &lt;a href="http://bbits.co.uk/blog" linkindex="26"&gt;bbits.co.uk/blog&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-6857964248206243834?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/6857964248206243834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2009/08/roy-osherove-tdd-masterclass-uk.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/6857964248206243834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/6857964248206243834'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2009/08/roy-osherove-tdd-masterclass-uk.html' title='Roy Osherove TDD Masterclass UK'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total><georss:featurename>London W36QG, UK</georss:featurename><georss:point>51.5141868 -0.2620851</georss:point><georss:box>51.5108483 -0.2693806 51.517525299999996 -0.2547896</georss:box></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-1204752347363364483</id><published>2009-06-09T02:49:00.007+10:00</published><updated>2009-06-09T04:45:05.913+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Stored Procs'/><category scheme='http://www.blogger.com/atom/ns#' term='ORM'/><title type='text'>Stored Procs vs ... not Stored Procs (ORM)</title><content type='html'>Over the last few years I had believed that the general consensus was that stored procedures had become largely irrelevant for business logic (CRUD) DB interactions. I believe this would have a lot to do with the large increase in popularity of ORM's, &lt;a href="https://www.hibernate.org/"&gt;Hibernate&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/bb425822.aspx"&gt;Linq-to-Sql&lt;/a&gt; in particular. I understand they may still be necessary for reporting/data import/etc.
&lt;br/&gt;&lt;br/&gt;
However it &lt;a href="http://stackoverflow.com/questions/15142/what-are-the-pros-and-cons-to-keeping-sql-in-stored-procs-versus-code"&gt;seems that there are a large number of people still believe stored procedures are the better option&lt;/a&gt;. Each to his own I guess but they seem to come up with some strange reasoning behind their decisions which I want to explore.  Basically I wanted to outline my own experiences by looking at different aspects and see if I am missing the point somewhere. In general I much prefer to provide access to a database via a service layer.
&lt;br/&gt;&lt;br/&gt;
Note: I'll specifically talk about ORMs here but inline sql is just as applicable (if not as desirable though :) .
&lt;br/&gt;&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;Performance&lt;/span&gt;
For all intents and purposes ORMs are just as &lt;a href="http://boulter.com/blog/2004/08/19/performant-is-not-a-word/"&gt;performant&lt;/a&gt; as stored procs. Batching queries tend to make up for any shortfall in database round trips. Stored procedures that manipulate large datasets can be tuned more effectively. I wouldn't even attempt to do this with code. Basically I feel manipulating large datasets is one of the only reasons to actually use stored procs. This is where the DBA's expertise comes into play.
&lt;br/&gt;&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;Security&lt;/span&gt;
Not sure why anyone would think that stored procedures are more secure than direct table access. Is it that hard to set the correct permissions on DB objects? It always scares me when developers have access to live databases. I used to work in a government department and you needed written permissions from the "business owner" as well as the head of the deployment team if you wanted to get ANY information from a live database/application.
&lt;br/&gt;&lt;br/&gt;
This way we only needed to set permissions on 3 logins (sa, application, reporting).
&lt;br/&gt;&lt;br/&gt;
Scared about SQL injection attacks because those lazy dev's who don't sanitize their input. See Testing.
&lt;br/&gt;&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;Loosely Coupled&lt;/span&gt;
Not entirely sure why people think this is a good idea for a database ie the DBA can change the underlying query/t-sql etc without changing the interface. Great. How often does this need to happen? What processes are in place for testing, version control, etc? Applications and databases are tightly coupled by nature. At the moment, if my business requirements change, I need to make at most 3 changes - DB Script/ORM/Code. I don't want to have to write a bunch of extra update scripts to change a bunch of stored proc "interfaces" as well.
&lt;br/&gt;&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;Reuse of Functionality&lt;/span&gt;
People argue that multiple clients can access stored procs which is DRYer than each client rewriting the same functionality. This scares me. Not to mention the overhead of configuring security for each client,  but any shared complicated business logic &lt;span style="font-weight: bold;"&gt;NEEDS&lt;/span&gt; to be pushed down into the the database. Personally I find it much easier to express business rules with OO concepts etc.
&lt;br/&gt;&lt;br/&gt;
Now we have DBAs with the ability to change business rules without needing to go through all that guff such as version control, peer review, comprehensive testing, documentation etc ;) I'd much rather have my rules locked down in a dll where only the qualified development teams have change rights. And yes that does require a recompile. OMG the horror of a recompile!!! With the correct processes in place, this isn't a big deal.
&lt;br/&gt;&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;Script Management&lt;/span&gt;
Personally I find stored proc buckets to be a PITA to manage. There's a reason people prefer to write business rules in Visual Studio rather then Management Studio.
&lt;br/&gt;&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;Testing&lt;/span&gt;
Last time I checked there were &lt;a href="http://nhprof.com/"&gt;far better options&lt;/a&gt; for testing applications as a whole. Show me the equivalent stack of Unit/Integration/Acceptance/Regression/Load/Security/etc tools for testing and profiling stored procedure changes?
&lt;br/&gt;&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;Portability&lt;/span&gt;
Wow. I can't believe &lt;a href="http://stackoverflow.com/questions/15142/what-are-the-pros-and-cons-to-keeping-sql-in-stored-procs-versus-code/131926#131926"&gt;some people think&lt;/a&gt; that stored procedures are good because both a) Reuse of functionality allows multiple clients to access the same database, DRY etc and b) stored procedures can be ported to a different database. Last time I checked there was no standard stored procedure language that could be used across all database. Hell, most SQL isn't even portable. &lt;a href="https://www.hibernate.org/361.html"&gt;ORMs on the other hand...&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
Yes I know Linq-to-Sql only supports SQL Server, just use EF instead :)
&lt;br/&gt;&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;Seperation of Concerns&lt;/span&gt;
SoC... huh? I thought we were talking about databases.
&lt;br/&gt;&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;Easier Refactoring&lt;/span&gt;
WTF! Now they're really clutching at straws.
&lt;br/&gt;&lt;br/&gt;
&lt;span style="font-weight: bold;"&gt;"You don't have to write inline SQL anymore!"&lt;/span&gt;
I give up...

&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;





Another big negative I see is the fact that a lot of devs I know shouldn't be writing stored procedures. Large scale use of stored procs would require far more time from a DBA when a dev could get a lot more done with a lot less effort. Let DBAs use there expert skills where they can be put to good use.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-1204752347363364483?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/1204752347363364483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2009/06/stored-procs-vs-well-not-stored-procs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/1204752347363364483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/1204752347363364483'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2009/06/stored-procs-vs-well-not-stored-procs.html' title='Stored Procs vs ... not Stored Procs (ORM)'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-4473030182705654881</id><published>2009-06-07T03:07:00.002+10:00</published><updated>2009-06-13T03:11:13.025+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Pipeline'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net mvc'/><title type='text'>ASP.Net MVC Pipeline – Part 1</title><content type='html'>&lt;p&gt;This is Part 1 of a series of posts I hope to write exploring the Asp.Net MVC pipeline. It won’t be your typical “this is a view, this is a controller, right click add new item…” type series although it will start off fairly basic and I will attempt to simplify things where necessary.&lt;/p&gt;  &lt;p&gt;I’ll also be exploring some best practice and testing concerns along the way. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Pipeline 101&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;When I talk about the pipeline, I’ll mostly be talking about the stuff that happens OUTSIDE of your views, models and controllers. You might be wondering why you would want to do that? Well Asp.Net provides quite an array of conventions that can be overridden by the developer. Ever wondered how on earth you can specify an action to receive a populated instance of one of your domain classes? Well these &lt;a href="http://codeclimber.net.nz/archive/2009/04/08/13-asp.net-mvc-extensibility-points-you-have-to-know.aspx" target="_blank"&gt;“extensibility points”&lt;/a&gt; points allow you to change this type of behaviour.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Our First Request&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_MI35RBOjtgE/SjKLc2hnOuI/AAAAAAAAAK0/L06kp29g0ZA/s1600-h/image20.png"&gt;&lt;img style="border-width: 0px; display: inline;" title="First Request" alt="First Request" src="http://lh4.ggpht.com/_MI35RBOjtgE/SjKLd8qSDOI/AAAAAAAAAK4/GChh9XvPbX0/image_thumb24.png?imgmax=800" border="0" width="451" height="465" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Like I said, I was going to simplify things :) Anyone who’s had a cursory glance at Asp.Net MVC should be able to understand what’s going on here. I won’t go into great detail for each step but there are a few things I’d like to point out.&lt;/p&gt;  &lt;p&gt;If we look at the controller action definition, it is simply: &lt;/p&gt; &lt;textarea class="c#" name="code" cols="80"&gt;public ActionResult Index() 
{ 
    return View(); 
}&lt;/textarea&gt;   &lt;p&gt;Other than the method name, nowhere does it specify what view to actually use. We can verify this with the following test which will fail in this scenario&lt;/p&gt; &lt;textarea class="c#" name="code" cols="80" rows="10"&gt;[TestMethod]
public void Index_Returns_ViewName_Index() { 
    AccountController ac = new AccountController(); 
    ViewResult viewResult = ac.Index() as ViewResult;

    Assert.AreEqual(viewResult.ViewName, "Index"); 
}&lt;/textarea&gt;   &lt;p&gt;So how does the pipeline know to render the view at “~/Views/Account/Index.aspx”? Well that’s a convention of the default MVC pipeline that we can extend and control as we see fit.&lt;/p&gt;  &lt;p&gt;This also means that the controller action and view are not tightly bound too each other. The action cares not what happens with the action result it returns nor does the view care which action its data comes from. In this way we can even replace entire parts of the pipeline e.g &lt;a href="http://codebetter.com/blogs/jeffrey.palermo/archive/2008/01/27/mvccontrib-now-offers-four-4-alternative-view-engines-for-asp-net-mvc.aspx" target="_blank"&gt;alternate view engines&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;This separation really sets MVC apart from webforms and allows for much easier testing. Despite their appearances controllers and views can still “Do Bad Things” like make calls to Response.Redirect(…) etc. Generally from upon though :)&lt;/p&gt;  &lt;p&gt;In Part 2 we’ll be examining probably the easiest way to manipulate the pipeline: Routes!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-4473030182705654881?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/4473030182705654881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2009/06/aspnet-mvc-pipeline-part-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/4473030182705654881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/4473030182705654881'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2009/06/aspnet-mvc-pipeline-part-1.html' title='ASP.Net MVC Pipeline – Part 1'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_MI35RBOjtgE/SjKLd8qSDOI/AAAAAAAAAK4/GChh9XvPbX0/s72-c/image_thumb24.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-7492437223742127456</id><published>2009-06-04T07:08:00.006+10:00</published><updated>2010-03-11T11:48:09.283+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WMDC'/><category scheme='http://www.blogger.com/atom/ns#' term='Vista'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Mobile'/><title type='text'>Vista, WMDC and Microsoft Windows Mobile Device Emulator</title><content type='html'>In the past I had always assumed that for some reason or another Vista, Windows Mobile Device Center and Windows Mobile Device Emulator just didn't work together, i.e. i could never get "Active Sync" to work. So much so that I even reverted back to using XP as my primary development environment.  Lately I haven't had that option due to driver incompatibilities with my laptop so I've effectively avoided doing any real Windows Mobile development.  &lt;br /&gt;
&lt;br /&gt;
However I recently purchased a &lt;a href="http://omnia.samsungmobile.com/"&gt;Samsung Omnia&lt;/a&gt;* and wanted to write a quick app for it. Vista syncs fine with real devices but I just couldn't get it to work with the emulator. Seems my thoughts were justified as &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=dd567053-f231-4a64-a648-fea5e7061303&amp;amp;DisplayLang=en"&gt;Microsoft Device Emulator v2&lt;/a&gt; is required for Vista. To my surprise I already had V3 installed (not sure whether through VS 2008 or Windows Mobile 6 SDKs) but sync still no worky... &lt;br /&gt;
&lt;br /&gt;
Turns out you have to &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/microsoftdeviceemu/thread/9c050895-b5b1-4b92-9f26-cca42cac0e06"&gt;enable DMA in WMDC&lt;/a&gt;. Did this and saw "Connect to - DMA Default" message flash up on the emulator. Done. I thought. It didn't actually sync though and after 20 more minutes of stuffing about i still couldn't get it to work. Finally stumbled upon a &lt;a href="http://jasonrshaver.com/blog/windows-mobile-device-center-wmdc-does-not-see-a-cradled-emulator/"&gt;post by Jason R. Shaver&lt;/a&gt; that states &lt;br /&gt;
&lt;blockquote&gt;Make sure WMDC is set to listen to connections using DMA, then uncheck it and recheck it (fixes it sometimes)&lt;/blockquote&gt;. Lo and behold everything worked...shithouse! &lt;br /&gt;
&lt;br /&gt;
* "Should have bought an iPhone" I hear you say, well a) the wife has one already and i'm not that fussed by it and b) I need a Windows Mobile Device for an upcoming (real) work project :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-7492437223742127456?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/7492437223742127456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2009/06/vista-wmdc-and-microsoft-windows-mobile.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/7492437223742127456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/7492437223742127456'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2009/06/vista-wmdc-and-microsoft-windows-mobile.html' title='Vista, WMDC and Microsoft Windows Mobile Device Emulator'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-1525274752014598602</id><published>2009-06-03T00:25:00.007+10:00</published><updated>2009-06-03T00:49:25.985+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rant'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net mvc'/><title type='text'>Let them have their cake</title><content type='html'>I have been reading a lot of &lt;a href="http://codebetter.com/blogs/rob.conery/archive/2009/04/22/i-spose-i-ll-just-say-it-you-should-learn-mvc.aspx"&gt;blogs&lt;/a&gt; and &lt;a href="http://stackoverflow.com/questions/390693/does-anyone-beside-me-just-not-get-asp-net-mvc"&gt;forums&lt;/a&gt; lately with heated &lt;a href="http://www.coderjournal.com/2008/12/introducing-aspnet-mvc-part-2-aspnet-mvc-vs-webforms/"&gt;discussions&lt;/a&gt; on why you should/shouldn't use &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2009/04/24/my-quick-oversimplified-asp-net-mvc-pros-and-cons.aspx"&gt;Asp.Net MVC over Asp.Net Webforms&lt;/a&gt;. Starting to get a little tired of it all now as it's turned into the same sort of debates that happened when RoR hit the market. Although it's fun to note that (for once) this discussion can't devolve into the obligatory microsoft == CRAP shit fight.&lt;br/&gt;&lt;br/&gt;

I'm as used to rejection as the next IT nerd, so guys if people don't want to use your beloved MVC, get over it! MVC will grow and prosper regardless of whether EVERY Asp.Net Webforms developer starts using it. Let's just concentrate on &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2008/10/23/our-opinions-on-the-asp-net-mvc-introducing-the-thunderdome-principle.aspx"&gt;making MVC a better product&lt;/a&gt; instead of trying to convince the naysayers to convert.&lt;br/&gt;&lt;br/&gt;


I must admit i was wary of things like Tag Soup, dealing with raw HTML/HTTP, etc as I've mostly done Asp.Net Webforms with a little Perl and RoR on the side. But the difficulty in utilizing these concepts is nothing compared to dealing with Page Lifecycle, View State, obfuscated element ids, etc, etc, etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-1525274752014598602?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/1525274752014598602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2009/06/let-them-have-their-cake.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/1525274752014598602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/1525274752014598602'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2009/06/let-them-have-their-cake.html' title='Let them have their cake'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-5117336068389038836</id><published>2009-06-02T08:30:00.006+10:00</published><updated>2009-06-02T09:02:34.944+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Rant'/><title type='text'>Hate for Trackback/Pingbacks :(</title><content type='html'>Is there anything more annoying in the webosphere than having to filter out trackbacks/pingbacks that just add &lt;a href="http://codebetter.com/blogs/jeremy.miller/archive/2008/10/23/our-opinions-on-the-asp-net-mvc-introducing-the-thunderdome-principle.aspx"&gt;inane noise to otherwise interesting blog comment discussions&lt;/a&gt;? No? Must just be me then... &lt;br /&gt;
&lt;br /&gt;
I understand that blog engines provide facilities for this to happen automatically, I'm probably even responsible for some myself. I just wish there were more that &lt;a href="http://www.ryanjparker.net/separating-pingbacks-and-trackbacks-from-comments-in-wordpress/"&gt;"filtered" these into another section of the page&lt;/a&gt; by default.&lt;br /&gt;
&lt;br /&gt;
A quick google search didn't unearth an easy solution for blogspot, any ideas appreciated. Not that i think they're affecting the gripping discussions going on here :) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Edit: Had a look through blogspot settings and will have a play.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-5117336068389038836?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/5117336068389038836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2009/06/hate-for-trackbackpingbacks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/5117336068389038836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/5117336068389038836'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2009/06/hate-for-trackbackpingbacks.html' title='Hate for Trackback/Pingbacks :('/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-2862925199131276224</id><published>2009-06-02T04:34:00.006+10:00</published><updated>2009-06-02T06:45:34.400+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='stupid'/><category scheme='http://www.blogger.com/atom/ns#' term='VisualStudio'/><title type='text'>Asp.Net Web Development Server Tip</title><content type='html'>Well call me slow but I just realized that the built in Asp.Net Web Development Server allows you to recompile/deploy your assemblies without the need to restart the web server. This seems to have been available since at least VS 2005 so all this time I've been debugging through pages for apparently no reason... I seem to remember that closing IE would kill the web server while debugging, which definitely isn't the case (anymore?).

&lt;br/&gt;&lt;br/&gt;
What's even more interesting is that Session data is preserved across deployments. Was hoping authentication would be as well but I haven't had time to test that properly. 
&lt;br/&gt;&lt;br/&gt;
I'm mostly using Asp.Net MVC these days which tends to mitigate the need to do the old login-&gt;browse-&gt;debug routine. Still handy to remember though&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-2862925199131276224?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/2862925199131276224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2009/06/aspnet-web-development-server-tips.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/2862925199131276224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/2862925199131276224'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2009/06/aspnet-web-development-server-tips.html' title='Asp.Net Web Development Server Tip'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-1694586038067810617</id><published>2009-06-01T20:18:00.003+10:00</published><updated>2009-06-01T20:26:10.211+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rant'/><title type='text'>Downloading "Setup.exe"</title><content type='html'>Why do people insist on offering downloads of their software using the annoyingly uninformative filename "setup.exe"? &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=04D26402-3199-48A3-AFA2-2DC0B40A73B6&amp;displaylang=en"&gt;Case in point...&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;

This is especially annoying if your download manager is set not to ask for download location etc..

Something along the lines of {ProductName}_{Version}.exe would be perfectly acceptable i.e bare minimum. Feel free to chuck in {Publisher}, {ReleaseDate}, _setup, etc if you feel that way inclined ;)

&lt;/rant&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-1694586038067810617?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/1694586038067810617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2009/06/downloading-setupexe.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/1694586038067810617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/1694586038067810617'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2009/06/downloading-setupexe.html' title='Downloading &quot;Setup.exe&quot;'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-7922568483834209003</id><published>2009-05-29T19:08:00.000+10:00</published><updated>2009-05-29T19:08:11.872+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='stupid'/><title type='text'>Deploying ASP.NET 2.0 + (IIS, "The page cannot be found", 404.2)</title><content type='html'>It's been a while since I've had to setup a Windows 2003 server to test Asp.Net apps on so i was a bit baffled when when i couldn't get the website to serve aspx pages. Navigating to the site would result in "The page cannot be found" http 404. &lt;br /&gt;
&lt;br/&gt;&lt;br /&gt;
Did all the usual googling, checked the logs at %WINDIR%\System32\Logfiles\W3SVC* which contained lines similar to:&lt;BR/&gt;&lt;br /&gt;
2002-11-25 05:46:15 127.0.0.1 GET /default.asp - 80 - 127.0.0.1 - 404 2 1260 &lt;br /&gt;
&lt;BR/&gt;&lt;br /&gt;
Right, just need to &lt;a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/0f4ac79a-dc2b-4a5f-89c1-d57266aa6ffe.mspx?mfr=true"&gt;lookup what the "404 2 1260" error means&lt;/a&gt;. Despite the detail on that page there's no concrete answers. &lt;br/&gt;&lt;br /&gt;
Anyway long story short, i had forgotten to register Asp.Net 2.0 with IIS using the old chestnut: aspnet_regiis -i. Allow Asp.Net 2.0 in IIS-&gt;Web Service Extensions and away we go.&lt;br /&gt;
&lt;br/&gt;&lt;br /&gt;
I'll just slink back to my cave now :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-7922568483834209003?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/7922568483834209003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2009/05/deploying-aspnet-20-iis-page-cannot-be.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/7922568483834209003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/7922568483834209003'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2009/05/deploying-aspnet-20-iis-page-cannot-be.html' title='Deploying ASP.NET 2.0 + (IIS, &quot;The page cannot be found&quot;, 404.2)'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-876349744332016137</id><published>2009-05-24T04:31:00.009+10:00</published><updated>2009-05-29T19:08:47.641+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Entity-Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>Shaping Entity Framework Results</title><content type='html'>In order to comply with an interface I needed to write code similar to the following:
&lt;br/&gt;
&lt;textarea class="c#" cols="80" name="code" rows="10"&gt;&lt;br /&gt;return (from ActionRule ar in db.ActionRuleSet.Include("ConditionExpression")&lt;br /&gt;        select new ActionRuleDataDTO()            &lt;br /&gt;        {                &lt;br /&gt;            Expresions = (from ConditionExpression ce in ar.ConditionExpression&lt;br /&gt;                          select new  RuleExpressionDTO()&lt;br /&gt;                          {&lt;br /&gt;                              Type = ce.Operator,&lt;br /&gt;                              BoolOperator = ce.NextExpressionOperator&lt;br /&gt;                          }).ToArray()            &lt;br /&gt;        }).ToArray(); &lt;br /&gt;&lt;/textarea&gt;

Which results in:&lt;br/&gt;
&lt;i style="color: rgb(255, 102, 0); font-weight: bold;"&gt;LINQ to Entities does not recognize the method  'EhrAdmin.Services.MSSQL.DTO.RuleExpressionDTO[]  ToArray[RuleExpressionDTO](System.Collections.Generic.IEnumerable`1[EhrAdmin.Services.MSSQL.DTO.RuleExpressionDTO])'  method, and this method cannot be translated into a store expression.&lt;/i&gt;
&lt;br/&gt;
I'll revisit this when i get a chance but the fix at the moment is to convert ObjectQuery&amp;lt;actionrule&amp;gt; to List&amp;lt;actionrule&amp;gt; using the ToList() method.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-876349744332016137?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/876349744332016137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2009/05/shaping-entity-framework-results.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/876349744332016137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/876349744332016137'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2009/05/shaping-entity-framework-results.html' title='Shaping Entity Framework Results'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-6158286847889729815</id><published>2009-05-22T08:33:00.007+10:00</published><updated>2009-05-22T08:46:57.731+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='VisualStudio'/><title type='text'>Visual Studio Tip - Hiding Toolbars</title><content type='html'>I had a funny realization a couple of days ago that I don't actually use any of the default toolbars in Visual Studio. For someone who normally developments on a 24" 1920*1200 monitor it hasn't really been an issue in the past. However I'm currently doing all my development on a 1024*768 laptop, (yeah i know, lame huh?) so I really need all the space I can get.&lt;br/&gt;&lt;br/&gt;



Funny thing is I don't think I've one needed to reinstated a toolbar yet. Keyboard shortcuts seem to be sufficient for just about everything, &lt;a href="http://www.jetbrains.com/resharper/"&gt;ReSharper&lt;/a&gt; obviously helps though :)
&lt;br/&gt;&lt;br/&gt;


I'm even tempted to &lt;a href="http://www.codinghorror.com/blog/archives/000315.html"&gt;generate the list of Keyboard Shortcuts&lt;/a&gt; I currently have enabled.&lt;br/&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-6158286847889729815?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/6158286847889729815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2009/05/visual-studio-tip-hiding-toolbars.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/6158286847889729815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/6158286847889729815'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2009/05/visual-studio-tip-hiding-toolbars.html' title='Visual Studio Tip - Hiding Toolbars'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-4722426622741745185</id><published>2009-05-22T07:21:00.002+10:00</published><updated>2009-05-22T07:38:12.130+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net mvc'/><title type='text'>Html.ActionLink gotcha</title><content type='html'>For some reason I keep getting tripped up by the following sort of code:

&lt;textarea name="code" class="c#" cols="60" rows="10"&gt;&lt;br /&gt;&lt;%=Html.ActionLink("Back to List", "Details", "ActionRule", new { id = Model.ActionRuleId } )%&gt;&lt;br /&gt;&lt;/textarea&gt;

 Seems simple enough but you end up with a link like :
http://localhost:5825/ActionRule/Details?Length=10

Easy fix is to add a null parameter to the end of the list. Why? Well the compiler treats the first call as:

&lt;textarea name="code" class="c#" cols="60" rows="10"&gt;
System.Web.Mvc.Html.LinkExtensions.ActionLink(this System.Web.Mvc.HtmlHelper htmlHelper, string linkText, string actionName, object routeValues, object htmlAttributes)
&lt;/textarea&gt;

Obviously the parameters are resolved incorrectly as there is no method signature such as:

&lt;textarea name="code" class="c#" cols="60" rows="10"&gt;
 System.Web.Mvc.Html.LinkExtensions.ActionLink(this System.Web.Mvc.HtmlHelper, string, string, string, object)
&lt;/textarea&gt;

I really should write an extension method to cover this (fairly common for me) scenario. Who cares you say? Well to this point it seems that this is the only situation using ASP.Net MVC where I've had to add a null parameter on the end of a call to get the desired result. Not saying it's a bug...just interesting none the less.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-4722426622741745185?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/4722426622741745185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2009/05/htmlactionlink-gotcha.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/4722426622741745185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/4722426622741745185'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2009/05/htmlactionlink-gotcha.html' title='Html.ActionLink gotcha'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-5582578021019782195</id><published>2009-05-13T18:53:00.000+10:00</published><updated>2009-05-13T18:53:36.719+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net mvc'/><title type='text'>The view 'Logon' or its master could not be found frustration</title><content type='html'>Ran into this one again today:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&lt;i&gt;The view 'Logon' or its master could not be found. The following locations were searched:&lt;br /&gt;
~/Views/Account/Logon.aspx&lt;br /&gt;
~/Views/Account/Logon.ascx&lt;br /&gt;
~/Views/Shared/Logon.aspx&lt;br /&gt;
~/Views/Shared/Logon.ascx&lt;/i&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
of course all the files were present because it was working 5 minutes ago (and the 2 weeks or so before that). &lt;br /&gt;
&lt;br /&gt;
I had been using the &lt;a href="http://blog.codeville.net/2009/02/03/using-the-aspnet-mvc-source-code-to-debug-your-app/"&gt;ASP.Net MVC source&lt;/a&gt; project to debug a few things, but reverted to the GAC dll before checking in so that the other devs didn't end up with some phantom project reference. Hence I thought I had not reverted my web.config (and ~/Views/web.config) changes properly.&lt;br /&gt;
&lt;br /&gt;
Anyway half an hour later and a lot of head scratching later I thought I'd see if setting the System.Web.MVC reference to "Copy Local =True" would make any difference&lt;br /&gt;
...&lt;br /&gt;
it did.&lt;br /&gt;
&lt;br /&gt;
End of story.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-5582578021019782195?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/5582578021019782195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2009/05/view-logon-or-its-master-could-not-be.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/5582578021019782195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/5582578021019782195'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2009/05/view-logon-or-its-master-could-not-be.html' title='The view &apos;Logon&apos; or its master could not be found frustration'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-3273167404293887683</id><published>2009-02-23T11:49:00.025+10:00</published><updated>2009-02-23T12:53:41.151+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stupid'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>HTML Engine Automatic Tag Expanding</title><content type='html'>Well this one had me stumped for a little while...


I'm using the JQuery UI library for an ASP.NET (MVC) project. I was trying something quickly using FireBug I grabbed this piece of markup and pasted it into my .aspx page:


&lt;pre name="code" class="html:nocontrols" cols="60" rows="10"&gt;
&lt;p&gt;
lt span class="ui-icon ui-icon-info" / gt
&lt;strong&gt;Hey!&lt;/strong&gt; Sample
&lt;/p&gt;
&lt;/pre&gt;

Easy i thought. I was expecting some CSS conflicts so it was no surprise that my aspx version didn't look the same as the example.html version. But for the life of me couldn't work out which attribute/element combinations were different. They &lt;span class="Apple-style-span" style="font-style: italic;"&gt;looked&lt;/span&gt; identical, they actual CSS &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;was&lt;/span&gt; identical.&lt;div&gt;

&lt;/div&gt;&lt;div&gt;
&lt;div&gt;After much hair pulling I discovered a mysterious closing span tag that wasn't present in my pasted code??? Seems most HTML rendering engines (IE, FF, Chrome)  don't like to output inline closing tags for elements that should obviously have content e.g . Unfortunately for me, instead of converting:&lt;/div&gt;


&lt;pre name="code" class="html:nocontrols"&gt;
&lt;p&gt; span /  ...&lt;/p&gt;

&lt;/pre&gt;

to:


&lt;pre name="code" class="html:nocontrols"&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;...&lt;/p&gt;&lt;/pre&gt;


they decide to "fill out" the element within its parent, such that:


&lt;pre name="code" class="html:nocontrols"&gt;
&lt;p&gt;&lt;span&gt;...&lt;/span&gt;&lt;/p&gt;
&lt;/pre&gt;


and hence destroyed the CSS rules :(&lt;div&gt;

&lt;div&gt;
&lt;/div&gt;&lt;div&gt;
&lt;div&gt;Examing the network request/response in Firebug reveals that the HTML that comes down from the server is in fact the same as the .aspx file.&lt;/div&gt;&lt;div&gt;

&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Note to self&lt;/span&gt;: to blindly copy/paste example code even when it really should work :)&lt;/div&gt;&lt;div&gt;

&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Edit:&lt;/span&gt; I use &lt;a href="http://code.google.com/p/syntaxhighlighter/"&gt;Syntax Highlighter&lt;/a&gt; to format my code, but again the HTML engines seems to insist on messing up my inline lt span / gt tags for this post, grrr.... &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-3273167404293887683?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/3273167404293887683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2009/02/aspnet-automatic-tag-expanding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/3273167404293887683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/3273167404293887683'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2009/02/aspnet-automatic-tag-expanding.html' title='HTML Engine Automatic Tag Expanding'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-5584145533856263960</id><published>2008-10-14T16:11:00.003+10:00</published><updated>2009-05-13T18:59:50.364+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Random'/><title type='text'>Bug fix bingo</title><content type='html'>In case you have seen this before I recommend you print it out and stick it over the top of one of your Dilbert comics or something :)

&lt;a href="http://www.kjross.com.au/page/Resources/Testing_Games"&gt;Bug Fix Bingo&lt;/a&gt;

Better still it's from a Queensland company!

&lt;a href="http://www.kjross.com.au/page/Resources/Testing_Games"&gt;
&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-5584145533856263960?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/5584145533856263960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2008/10/bug-fix-bingo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/5584145533856263960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/5584145533856263960'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2008/10/bug-fix-bingo.html' title='Bug fix bingo'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-5642306624951219385</id><published>2008-10-14T15:31:00.005+10:00</published><updated>2008-10-14T16:03:52.413+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='cheatsheets'/><category scheme='http://www.blogger.com/atom/ns#' term='regex'/><title type='text'>Regular Expressions (regex)</title><content type='html'>Still kinda surprises me the number of developers I know who are completely oblivious to the power of Regular Expressions. I'm certainly no expert on the subject but I find myself using them on quite a regular basis, probably around once a week off the top of my head.&lt;div&gt;&lt;br/&gt;
The funny thing is that they are applicable in so many situations from &lt;a href="http://msdn.microsoft.com/en-us/library/2k3te2cs.aspx"&gt;Find and Replace in Visual Studio&lt;/a&gt; to &lt;a href="http://msdn.microsoft.com/en-us/library/eahwtc9e(VS.85).aspx"&gt;Validating ASP.Net Form Fields&lt;/a&gt; to jQuery matching (though i gave up on this before i could get it to work)  to parsing comma delimeted files &lt;a href="http://regex.info/blog/2006-09-15/247"&gt;(j/k)&lt;/a&gt;  &lt;/div&gt;&lt;div&gt;&lt;br/&gt;
&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Any Drawbacks? I find the major drawback is the fact that just about every regex provider uses a slightly different syntax, so you need to trawl the reference docs to find the right symbol. Heck, even Visual Studio's regex provider is slightly different to System.Text.RegularExpressions :S &lt;/div&gt;&lt;div&gt;&lt;br/&gt;
&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;To combat this there are numerous cheatsheets somewhere in the pile of papers on my desk that help to remedy this situation:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.addedbytes.com/cheat-sheets/regular-expressions-cheat-sheet/"&gt;Added Bytes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://regexlib.com/CheatSheet.aspx"&gt;http://regexlib.com/CheatSheet.aspx&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/search?q=regex+cheatsheet"&gt;etc, etc&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br/&gt;
&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;And how could I forget the obligatory quote for any blog post concerning regular expressions:&lt;/div&gt;&lt;br/&gt;
&lt;div&gt;&lt;blockquote&gt;Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems.

--Jamie Zawinski, in comp.lang.emacs  &lt;/blockquote&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-5642306624951219385?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/5642306624951219385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2008/10/regular-expressions-regex.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/5642306624951219385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/5642306624951219385'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2008/10/regular-expressions-regex.html' title='Regular Expressions (regex)'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-7529825524061305751</id><published>2008-10-14T09:52:00.010+10:00</published><updated>2008-10-14T11:55:39.570+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stupid'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.net mvc'/><title type='text'>Don't name your View "View"</title><content type='html'>but if you must don't try to use code like this:

&lt;textarea name="code" class="c#" cols="60" rows="10"&gt;
public class PostController : Controller
{ 
 public ActionResult View()
 {
  ViewData["Title"] = "View Post";
  return View();
 }
}
&lt;/textarea&gt;

Obviously you'll just end up with a StackOverflowException. 
&lt;strong&gt;ActionName&lt;/strong&gt; attribute to the rescue!

&lt;textarea name="code" class="c#" cols="60" rows="10"&gt;
[ActionName("View")]
public ActionResult Show()
{
 ViewData["Title"] = "View Post";
 return View();
}
&lt;/textarea&gt;

It's strange what working in a different environment or with different technology can lead you to make the most simple mistakes :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-7529825524061305751?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/7529825524061305751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2008/10/dont-name-you-view-view.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/7529825524061305751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/7529825524061305751'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2008/10/dont-name-you-view-view.html' title='Don&apos;t name your View &quot;View&quot;'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-5681851273870612456</id><published>2008-10-12T15:46:00.003+10:00</published><updated>2009-05-13T19:02:38.299+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Random'/><title type='text'>Latex</title><content type='html'>&lt;a href="http://www.codecogs.com/components/equationeditor/equationeditor.php?lang=en-en"&gt;Kick ass latex equation editor&lt;/a&gt; (if you're into that kind of thing)

&lt;div&gt;
&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-5681851273870612456?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/5681851273870612456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2008/10/latex.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/5681851273870612456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/5681851273870612456'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2008/10/latex.html' title='Latex'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5185363813089043049.post-9215137631585090007</id><published>2008-10-12T14:18:00.004+10:00</published><updated>2008-10-12T14:40:50.825+10:00</updated><title type='text'>Welcome to Gratuitous Development!</title><content type='html'>Welcome to Gratuitous Development, my belated first attempt at blogging. My focus for this site is to keep a log (funnily enough) of activities relating to Software Development primarily regarding the .net framework and surrounding technologies. Off the top of my head a few areas I hope to explore include:&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.asp.net/mvc/"&gt;ASP.Net MVC&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Client Side e.g AJAX and &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Application Architecture 
&lt;/li&gt;&lt;li&gt;Development Methodologies
&lt;/li&gt;&lt;li&gt;ORMs such as &lt;a href="http://www.hibernate.org/"&gt;NHibernate&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Tools I find useful like &lt;a href="http://www.jetbrains.com/resharper/"&gt;ReSharper&lt;/a&gt;&lt;/li&gt;&lt;li&gt;and various other random things like &lt;a href="http://www.db4o.com"&gt;DB4O&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;This is very much a learning experience for myself so any &lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;constructive&lt;/span&gt;&lt;/span&gt; criticism would be greatly appreciated. &lt;del&gt; If &lt;/del&gt; When I do something stupid please don't just point it out, provide a solution. Eventually I'm hoping that this may in some small way benefit the .net community, however small that contribution may be :) &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5185363813089043049-9215137631585090007?l=gratdevel.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gratdevel.blogspot.com/feeds/9215137631585090007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gratdevel.blogspot.com/2008/10/welcome-to-gratuitous-development.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/9215137631585090007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5185363813089043049/posts/default/9215137631585090007'/><link rel='alternate' type='text/html' href='http://gratdevel.blogspot.com/2008/10/welcome-to-gratuitous-development.html' title='Welcome to Gratuitous Development!'/><author><name>Neil Kerkin</name><uri>https://profiles.google.com/100335020407740452245</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-4lJw6iZuDb8/AAAAAAAAAAI/AAAAAAAAAMs/pqipBvgBE3Q/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
