<?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-7398295447271170513</id><updated>2011-04-22T06:17:56.136+01:00</updated><category term='Seminars'/><category term='TDD'/><category term='tools'/><category term='frameworks'/><category term='Agile'/><category term='Ruby'/><category term='BDD'/><category term='Javascript'/><category term='patterns'/><category term='security'/><category term='languages'/><category term='games'/><category term='podcasts'/><category term='code'/><category term='RubyOnRails'/><category term='learning'/><category term='.NET'/><category term='Web'/><category term='ASP.NET'/><title type='text'>Joakim's blog</title><subtitle type='html'>A blog about software development.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Joakim</name><uri>http://www.blogger.com/profile/16544014178916193168</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>25</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-3598536303219541294</id><published>2008-05-29T23:58:00.002+02:00</published><updated>2008-05-30T00:02:37.872+02:00</updated><title type='text'>The blog is moving...</title><content type='html'>I'm moving the blog to &lt;a href="http://www.rubyblocks.se"&gt;rubyblocks.se&lt;/a&gt;. Please update your bookmarks and subscriptions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-3598536303219541294?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/3598536303219541294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=3598536303219541294' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/3598536303219541294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/3598536303219541294'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2008/05/blog-is-moving.html' title='The blog is moving...'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-1395142620492519740</id><published>2008-05-22T01:22:00.007+02:00</published><updated>2008-05-30T03:30:00.677+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='RubyOnRails'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>make_resourceful and odd controller names</title><content type='html'>I've been debugging make_resourceful to try to figure out why it fails to generate an index action for a controller named &lt;i&gt;NewsController&lt;/i&gt;. After a couple of hours I found the now slightly obvious reason in lib/resourceful/default/accessors.rb...&lt;br /&gt;&lt;br /&gt;The &lt;i&gt;singular?&lt;/i&gt; method returns true for "News".&lt;br /&gt;&lt;br /&gt;A simple solution would be to define &lt;i&gt;singular?&lt;/i&gt; in your controller and let it return false.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class NewsController &lt; ApplicationController&lt;br /&gt;  def singular?; false end &lt;br /&gt; &lt;br /&gt;  make_resourceful do&lt;br /&gt;    actions :all&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;See also: &lt;a href="http://www.rubyblocks.se/2008/5/30/more-on-odd-controller-names"&gt;More on odd controller names&lt;/a&gt;&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/7398295447271170513-1395142620492519740?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/1395142620492519740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=1395142620492519740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/1395142620492519740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/1395142620492519740'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2008/05/makeresourceful-and-odd-controller.html' title='make_resourceful and odd controller names'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-6313445139793571910</id><published>2008-05-20T18:49:00.004+02:00</published><updated>2008-05-20T18:58:22.200+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='RubyOnRails'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>response.should have_tag problems</title><content type='html'>I use "integrate_views" to combine controller and view specs. The thing I discovered just now is that if you have nested describes, you have to place "integrate_views" inside the inner describe or "have_tag" won't work.&lt;br /&gt;&lt;br /&gt;The error you typically get otherwise (even when the element exists) is:&lt;br /&gt;&lt;i&gt;Expected at least 1 element matching "div#content", found 0.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;For this particular project I'm using RSpec 1.1.3.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-6313445139793571910?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/6313445139793571910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=6313445139793571910' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/6313445139793571910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/6313445139793571910'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2008/05/responseshould-havetag-problems.html' title='response.should have_tag problems'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-4843182870696107742</id><published>2008-03-31T13:55:00.007+02:00</published><updated>2008-03-31T15:04:03.613+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='RubyOnRails'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>In Place Editor using Scriptaculous and Prototype in Rails 2.0</title><content type='html'>I've been using the scriptaculous &lt;a href="http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor"&gt;InPlaceEditor&lt;/a&gt;  and thought I would share some useful snippets.&lt;br /&gt;&lt;br /&gt;The code is setup to save on blur and being able to handle empty fields.&lt;br /&gt;&lt;br /&gt;The creation script:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;var inplace_editor_edit_hint = 'Click to edit...';&lt;br /&gt;&lt;br /&gt;function createInplaceEditor(field, update_path, highlightcolor,&lt;br /&gt;                             highlightendcolor, width)&lt;br /&gt;{&lt;br /&gt;   fillIfEmpty($(field));&lt;br /&gt;  &lt;br /&gt;   new Ajax.InPlaceEditor(field, update_path, { &lt;br /&gt;     highlightcolor: highlightcolor, &lt;br /&gt;     highlightendcolor: highlightendcolor,&lt;br /&gt;     okButton: false,&lt;br /&gt;     cancelLink: false,&lt;br /&gt;     submitOnBlur: true,     &lt;br /&gt;     cols: width,&lt;br /&gt;     callback: function(form) {&lt;br /&gt;        input_field = form.elements[0];&lt;br /&gt;        &lt;br /&gt;        // This is to ensure we don't save the edit hint if&lt;br /&gt;        // the user accidentally clicked an empty field&lt;br /&gt;        if(input_field.value == inplace_editor_edit_hint)&lt;br /&gt;          input_field.value = '';&lt;br /&gt;        &lt;br /&gt;        return Form.serialize(form);                   &lt;br /&gt;      },&lt;br /&gt;     onComplete: function(transport, element)&lt;br /&gt;     { &lt;br /&gt;       fillIfEmpty(element);&lt;br /&gt;       &lt;br /&gt;       if(transport.statusText != "Internal Server Error")&lt;br /&gt;           onEditorSuccess(); // cb&lt;br /&gt;       &lt;br /&gt;       new Effect.Highlight(element, {&lt;br /&gt;           startcolor: this.options.highlightcolor,&lt;br /&gt;           endcolor: this.options.highlightendcolor&lt;br /&gt;       });&lt;br /&gt;     },&lt;br /&gt;     onFailure: function(element, transport) {&lt;br /&gt;       onEditorFailure(transport.responseText); // cb&lt;br /&gt;     }&lt;br /&gt;   });&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function fillIfEmpty(element)&lt;br /&gt;{&lt;br /&gt;  if(element.innerHTML == '')&lt;br /&gt;    element.innerHTML = inplace_editor_edit_hint;  &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In the view I have a bit of script that binds the callbacks for success and failure.&lt;br /&gt;&lt;br /&gt;The validation errors is displayed in the error notice, this isn't exactly ideal, but works as an example of how to handle validation.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  function onEditorSuccess()&lt;br /&gt;  {&lt;br /&gt;    $('error').innerHTML = '';&lt;br /&gt;    $('notice').innerHTML = 'Model was successfully updated.';&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  function onEditorFailure(response)&lt;br /&gt;  {&lt;br /&gt;    response = response.evalJSON();&lt;br /&gt;    &lt;br /&gt;    var lines = new Array();&lt;br /&gt;   &lt;br /&gt;    for(var i = 0; i &lt; response.length; i++)&lt;br /&gt;      lines.push(response[i][0] + ' ' + response[i][1]);&lt;br /&gt;            &lt;br /&gt;    $('notice').innerHTML = '';&lt;br /&gt;    $('error').innerHTML = 'Error: ' + lines.join('. ')&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The controller code looks something like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def update_field&lt;br /&gt;  model = Model.find(params[:id])&lt;br /&gt;  if model.update_attributes(field_to_update =&gt; params[:value])&lt;br /&gt;    render :text =&gt; params[:value]&lt;br /&gt;  else&lt;br /&gt;    render :text =&gt; model.errors.to_json, :status =&gt; 500&lt;br /&gt;  end   &lt;br /&gt;end&lt;br /&gt; &lt;br /&gt;private&lt;br /&gt;&lt;br /&gt;def field_to_update&lt;br /&gt;  params[:editorId].split('_')[1]&lt;br /&gt;end &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And finally I create them using something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;p id="prefix_title"&amp;gt;&amp;lt;%= model.title %&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;createInplaceEditor("prefix_title", '/path/to/action',&lt;br /&gt;                    "#FFFFFF", "#AAAAAA", 10);&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Though I recommend wrapping it in a helper to keep it nice and DRY...&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/7398295447271170513-4843182870696107742?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/4843182870696107742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=4843182870696107742' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/4843182870696107742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/4843182870696107742'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2008/03/in-place-editor-using-scriptaculous-and.html' title='In Place Editor using Scriptaculous and Prototype in Rails 2.0'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-5862637059943636366</id><published>2008-02-05T13:33:00.001+01:00</published><updated>2008-03-19T12:51:52.371+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RubyOnRails'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>HABTM issue with Rails 2.0.2 and SQLite3</title><content type='html'>When using SQLite3 with rails you must make sure not to add an id column to your join tables (probably a good idea in any case).&lt;br /&gt;&lt;br /&gt;The error I got when I did have an id column where something like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SQL logic error or missing database: INSERT INTO&lt;br /&gt;podcasts_tags("podcast_id", "id", "tag_id") VALUES (3, 3, 1)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To avoid this, make sure you include :id =&gt; false when creating the join table:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;create_table :podcast_tags, :id =&gt; false do |t|&lt;br /&gt;  t.integer :podcast_id, :null =&gt; false&lt;br /&gt;  t.integer :tag_id, :null =&gt; false&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-5862637059943636366?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/5862637059943636366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=5862637059943636366' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/5862637059943636366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/5862637059943636366'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2008/02/habtm-issue-with-rails-202-and-sqlite3.html' title='HABTM issue with Rails 2.0.2 and SQLite3'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-8359701088142010619</id><published>2008-01-28T14:28:00.000+01:00</published><updated>2008-01-28T14:37:12.768+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='frameworks'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>NCover in a relative path</title><content type='html'>Just a small note for anyone trying to get NCover to run in a relative path.&lt;br /&gt;&lt;br /&gt;Make sure you include CoverLib.dll and &lt;span style="font-weight:bold;"&gt;register&lt;/span&gt; it (run Regsvr32 CoverLib.dll).&lt;br /&gt;&lt;br /&gt;I had errors where it would run on one computer but not on another and that when it couldn't find the dll it's simply froze after the unit tests had run. I'm using v1.5.8.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-8359701088142010619?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/8359701088142010619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=8359701088142010619' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/8359701088142010619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/8359701088142010619'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2008/01/ncover-in-relative-path.html' title='NCover in a relative path'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-6648701304869141826</id><published>2007-11-26T22:50:00.000+01:00</published><updated>2007-11-26T23:05:20.805+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Seminars'/><category scheme='http://www.blogger.com/atom/ns#' term='learning'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Interaction design, UCD and Agile</title><content type='html'>Today I was at yet another seminar, this time at &lt;a href="http://agical.se/"&gt;Agical&lt;/a&gt; about how UCD combined with Agile methods does work and how it can be beneficial.&lt;br /&gt;&lt;br /&gt;It began with Illugi Ljótsson och Eric Idebro describing the "write a big document and throw it over the wall"-problem and that &lt;a href="http://en.wikipedia.org/wiki/User-centered_design"&gt;UCD&lt;/a&gt; and Agile development methods weren't that far apart if they where only allowed to work together, iteratively.&lt;br /&gt;&lt;br /&gt;To allow for this they would have an interaction designer in their scrum. In a 4 week scrum the interaction designer helped with usability and each friday he did user testing to get feedback for the coming week.&lt;br /&gt;&lt;br /&gt;I got the impression that this kind of feedback would work and that it would help a great deal to have that kind of expertise at hand during development.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Do we really need a 4 step publication routine with document comparison if all the users really need is a way to get text out on the web quickly?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;They also made the point that what the product owner asked for and what the users actually needed where quite some way apart. When using this method you have more material to help guide your decisions on what to build in addition to making the application more user friendly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-6648701304869141826?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/6648701304869141826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=6648701304869141826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/6648701304869141826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/6648701304869141826'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2007/11/interaction-design-ucd-and-agile.html' title='Interaction design, UCD and Agile'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-6275536204440349902</id><published>2007-11-15T22:55:00.000+01:00</published><updated>2007-11-15T23:32:51.873+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='podcasts'/><category scheme='http://www.blogger.com/atom/ns#' term='Seminars'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='RubyOnRails'/><category scheme='http://www.blogger.com/atom/ns#' term='learning'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Andy Hunt: ”How Hard Can it Be?” at Valtech</title><content type='html'>Today I was at a seminar by Andy Hunt called &lt;a title="Event information in swedish" href="http://www.valtech.se/templates/JobSubPage.aspx?id=2626"&gt;"How Hard Can It Be?" at Valtech&lt;/a&gt; (Stockholm, Sweden). &lt;br /&gt;&lt;br /&gt;It was a great and very funny seminar and I recommend anyone that has a chance to go to the next one.&lt;br /&gt;&lt;br /&gt;One thing that got to me was the discussion about complexity... that is accidental complexity and essential complexity. One example he used was the way a language like Java could isn't very intuitive for people new to development compared to a language like Ruby due to accidental complexity.&lt;br /&gt;&lt;br /&gt;In Java you would need "public static void Main(.... System.out.println(..." for the basic Hello, World example, whereas in Ruby you would type 'puts "Hello, World!"'.&lt;br /&gt;&lt;br /&gt;IDE's do us a great disservice in hiding accidental complexity by using macros to autogenerate code that is required by the language, but probably isn't of any value for the task at hand.&lt;br /&gt;&lt;br /&gt;The point of it all is that when the domain is complex, we have essential complexity, but we should avoid accidental complexity, extra code that creates noice, making the code less readable without adding any value.&lt;br /&gt;&lt;br /&gt;He also hinted on the irony of the &lt;a href="http://en.wikipedia.org/wiki/Waterfall_model"&gt;waterfall&lt;/a&gt; method that it wasn't supposed to be used the way it has and in fact the document describing the method was a example of a flawed, non-working model of development.&lt;br /&gt;&lt;br /&gt;Some time ago I found a really nice book that uses this way of avoiding accidental complexity that Ruby does for introducing newcomers to programming, &lt;a href="http://www.pragprog.com/titles/fr_ltp"&gt;Learn to program&lt;/a&gt; (pragmatic bookshelf).&lt;br /&gt;&lt;br /&gt;On the way home I listened to a podcast about RoR, the &lt;a href="http://podcast.rubyonrails.org/programs/1/episodes/stuart-halloway"&gt;Ruby on Rails Podcast&lt;/a&gt; episode featuring Stuart Halloway. I've only listened to one episode so far but it was great :), got me thinking of contributing a bit more to Open Source.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-6275536204440349902?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/6275536204440349902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=6275536204440349902' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/6275536204440349902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/6275536204440349902'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2007/11/andy-hunt-how-hard-can-it-be-at-valtech.html' title='Andy Hunt: ”How Hard Can it Be?” at Valtech'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-8233404838545925154</id><published>2007-11-08T14:24:00.000+01:00</published><updated>2007-11-08T22:01:55.614+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='frameworks'/><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='RubyOnRails'/><category scheme='http://www.blogger.com/atom/ns#' term='learning'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Degrading link_to_remote</title><content type='html'>I've been learning RubyOnRails and I noticed that the 'link_to_remote' helper didn't degrade gracefully...&lt;br /&gt;&lt;br /&gt;Here's the fix I used (Inspired by &lt;a href="http://blog.codefront.net/2007/03/24/drying-up-link_to_remote-for-degradable-urls/"&gt;this blog post&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;(in helpers/application_helper.rb)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  def link_to_remote(name, options = {}, html_options = {})&lt;br /&gt;    unless html_options[:href]&lt;br /&gt;      html_options[:href] = url_for(options[:url])&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    link_to_function(name, remote_function(options),&lt;br /&gt;                                         html_options)&lt;br /&gt;  end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Just keep in mind that this uses a HTTP GET when javascript is disabled. A HTTP GET should not have side effects. I can't think of a good way to do a HTTP POST from a link (trigger a form-post) without using javascript.&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/7398295447271170513-8233404838545925154?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/8233404838545925154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=8233404838545925154' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/8233404838545925154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/8233404838545925154'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2007/11/degrading-linktoremote.html' title='Degrading link_to_remote'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-2306677745724815075</id><published>2007-09-25T19:01:00.000+02:00</published><updated>2007-09-25T19:33:24.216+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BDD'/><category scheme='http://www.blogger.com/atom/ns#' term='learning'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Dojo at Agical</title><content type='html'>Yesterday I was at a &lt;a href="http://dojo.responsive.se/"&gt;dojo&lt;/a&gt; at &lt;a href="http://www.agical.com/"&gt;Agical&lt;/a&gt; in Stockholm.&lt;br /&gt;&lt;br /&gt;The idea of a dojo is to as a group drive out the design of a piece of code using TDD. The goal is to practice TDD outside of real live projects.&lt;br /&gt;&lt;br /&gt;We used a method called randori that meant that we worked on the code as a pair, describing to everyone what we did and switching out one of us every now and then. It was a trilling experience to say the least, if only too short! I'm definitely going to go to more of these dojo's :)&lt;br /&gt;&lt;br /&gt;When we where done we got into discussing the differences between BDD and TDD. What does it really mean to drive your development based on behavior?&lt;br /&gt;&lt;br /&gt;The sense I got from it was to not let the testing run away with you. To focus on the real behaviour. What is the point of creating tests for code that define a behavior that you don't have any story for? Excessive error handling can be a suspect in this category.&lt;br /&gt;&lt;br /&gt;Aside from that I also got some repetition on the TDD cycle: Red, Green and Refactor. Focus on passing the test, save all refactoring for when it's green. To get ahead of yourself is like premature optimization, tempting but probably not a good idea...&lt;br /&gt;&lt;br /&gt;The discussion then continued into whether Code Coverage is a good metric from a BDD perspective. When doing BDD/TDD the number will be high, but it will not tell you if you implemented functionality that was really required or not. You're goal is to solve the problem at hand, not achieving full coverage.&lt;br /&gt;&lt;br /&gt;But there are uses for it, one opinion where that the coverage serve as well needed positive feedback for the developers, another that it can be a great tool for finding uncovered code that ought to be run by a test.&lt;br /&gt;&lt;br /&gt;I wish that I'd had the time to stay after the dojo, but it was late and I had an early morning :(. It's not often that you get the chance to meet people that actually know their way around these concepts in real life!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-2306677745724815075?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/2306677745724815075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=2306677745724815075' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/2306677745724815075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/2306677745724815075'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2007/09/dojo-at-agical.html' title='Dojo at Agical'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-6235035261490420418</id><published>2007-08-17T14:12:00.000+02:00</published><updated>2007-08-17T14:56:19.263+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><title type='text'>Just a heads up on some Opera browser behavior...</title><content type='html'>I just discovered a bit of a quirk of Opera (9.01). When you read the .value of a text field and the text field contains something like "Hello &amp;lt;b&amp;gt;world&amp;lt;/b&amp;gt;", opera returns "Hello &amp;lt;B&amp;gt;world&amp;lt;/B&amp;gt;". I did not find any way of fixing this, except to not assume lowercase input (which seems obvious to me now :). However, I found &lt;a href="http://www.xulplanet.com/ndeakin/article/278?show=c"&gt;this interesting blog post&lt;/a&gt; about this upcase behavior and other similar things. Just hope this post can help someone avoid the premature assumption that the browser would return what's actually there :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-6235035261490420418?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/6235035261490420418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=6235035261490420418' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/6235035261490420418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/6235035261490420418'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2007/08/just-heads-up-on-some-opera-browser.html' title='Just a heads up on some Opera browser behavior...'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-8392478034481365420</id><published>2007-07-19T09:46:00.000+02:00</published><updated>2007-08-10T09:12:28.354+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>TinyMCE inside of an ASP.NET Ajax UpdatePanel</title><content type='html'>Yesterday I went hunting for information on how to get the&lt;br /&gt;web WYSIWYG editor &lt;a href="http://tinymce.moxiecode.com/"&gt;TinyMCE&lt;/a&gt; to work inside of an ASP.NET UpdatePanel.&lt;br /&gt;&lt;br /&gt;There are a few solutions for this on the web, nothing near as complete as &lt;a href="http://codeodyssey.se/blog.aspx?id=243"&gt;Jesper Lind's post&lt;/a&gt; (Swedish), but even that failed to work. I replied to the post asking if he had some simple example that he could show and as a result we now have &lt;a href="http://codeodyssey.com/blog.aspx?id=334"&gt;this complete example&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here is a &lt;a href="http://codecreations.se/misc/UpdatePanelAndTinyMCEInVBNET.rar"&gt;VB.NET version of Jesper's example&lt;/a&gt; I made when adapting the code to work in my VB.NET project at work.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Update: 2007-07-30&lt;/span&gt;&lt;br /&gt;Having had some experience with using this I'd highly recommend that you use &lt;a href="http://www.asp.net/ajax/documentation/live/tutorials/ASPNETAJAXWebServicesTutorials.aspx"&gt;webservices&lt;/a&gt; as the editors inside of any non-trivial updatepanel setup can become quite slow to reload.&lt;br /&gt;&lt;br /&gt;To use TinyMCE on an Ajax form, load TinyMCE at page load as usual, but run "tinyMce.updateContent(text-area-id)" after you load text into the textareas so that it is displayed. If you have any problems with IE6 not updating the content, &lt;a href="http://tinymce.moxiecode.com/punbb/viewtopic.php?pid=19871"&gt;check this thread out&lt;/a&gt;. Also run tinyMCE.triggerSave(true, true) before saving so that TinyMCE copies text back from the editors.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-8392478034481365420?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/8392478034481365420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=8392478034481365420' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/8392478034481365420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/8392478034481365420'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2007/07/tinymce-inside-of-aspnet-ajax.html' title='TinyMCE inside of an ASP.NET Ajax UpdatePanel'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-1036641277991837830</id><published>2007-05-15T20:36:00.000+02:00</published><updated>2007-08-10T09:12:44.236+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='podcasts'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Neat session state trick</title><content type='html'>Just thought I'd share a neat little bit of code for handling session state in ASP.NET.&lt;br /&gt;&lt;br /&gt;The trick is to create a class that keeps it's own sessionstate, like this:&lt;font size="1"&gt;&lt;pre&gt;&lt;br /&gt;public class CustomerSession&lt;br /&gt;{&lt;br /&gt;    private string mName = "";&lt;br /&gt;    private string mTelephone = "";&lt;br /&gt;&lt;br /&gt;    // To enshure unique session key&lt;br /&gt;    private static string mGuid = "PlaceGUIDHere";&lt;br /&gt;&lt;br /&gt;    public string Name&lt;br /&gt;    {&lt;br /&gt;        get { return mName; }&lt;br /&gt;        set { mName = value; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public string Telephone&lt;br /&gt;    {&lt;br /&gt;        get { return mTelephone; }&lt;br /&gt;        set { mTelephone = value; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private CustomerSession() { }&lt;br /&gt;&lt;br /&gt;    public static CustomerSession GetInstance(HttpSessionState session)&lt;br /&gt;    {&lt;br /&gt;        CustomerSession o = (CustomerSession)session[mGuid];&lt;br /&gt;        if(o == null) {&lt;br /&gt;            o = new CustomerSession();&lt;br /&gt;            session[mGuid] = o;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return o;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/font&gt;&lt;br /&gt;Then you can save data in session like this:&lt;font size="1"&gt;&lt;pre&gt;&lt;br /&gt;protected void btnSave_Click(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;   CustomerSession data = CustomerSession.GetInstance(Session);&lt;br /&gt;   data.Name = txtName.Text;&lt;br /&gt;   data.Telephone = txtTelephone.Text;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/font&gt;&lt;br /&gt;I heard about this in &lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=82"&gt;.NET Rocks! episode 82&lt;/a&gt; where Richard Hale Shaw where speaking of his way of storing session state in a safe way. It's at about 54 minutes into the podcast episode if you want to check it out for yourself =)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-1036641277991837830?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/1036641277991837830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=1036641277991837830' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/1036641277991837830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/1036641277991837830'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2007/05/neat-session-state-trick.html' title='Neat session state trick'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-7950616366242278204</id><published>2007-05-06T18:10:00.000+02:00</published><updated>2007-05-06T18:58:55.989+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='patterns'/><title type='text'>Partial classes and regions</title><content type='html'>Just &lt;a href="http://aussiebloke.blogspot.com/2007/05/c-partial-classes-and-file-naming.html"&gt;read this blog post&lt;/a&gt; about using partial classes to separate the public interface and the private and protected members, which is a great idea.&lt;br /&gt;&lt;br /&gt;This got me thinking of a problem I faced this week when working on using the &lt;a href="http://www.polymorphicpodcast.com/shows/mv-patterns/"&gt;MVP pattern&lt;/a&gt; for windows forms development.&lt;br /&gt;&lt;br /&gt;One of the forms had two very distinct areas. The left side contained lists to lookup information and the right side displayed the details. This seemed to me like the perfect place to use two views. Now to implement two views in the same code-behind file you'd want some way to separate them. Regions goes some way to solving this, but it's hardly ideal. I'd much rather switch between partial classes in different files than between regions.&lt;br /&gt;&lt;br /&gt;Now here's the issue... if you create another partial class to a windows form (in addition to the .Designer partial) the Visual Studio 2005 IDE automatically thinks it is another designer form. You would think they had thought of this scenario?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-7950616366242278204?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/7950616366242278204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=7950616366242278204' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/7950616366242278204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/7950616366242278204'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2007/05/partial-classes-and-regions.html' title='Partial classes and regions'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-110383047790439018</id><published>2007-04-21T20:08:00.000+02:00</published><updated>2007-08-10T09:14:01.264+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='learning'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Validation logic, security and the web</title><content type='html'>I just &lt;a href="http://www.lhotka.net/WeBlog/ShouldValidationBeInTheUIOrInBusinessObjects.aspx"&gt;read a blog post&lt;/a&gt; by Rocky Lhotka where he discusses where to put the validation logic. This interests me quite a bit because it's one of those caveats I've found around ASP.NET and web development in general.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The problem with validation in a web environment&lt;/b&gt;&lt;br /&gt;In web projects you often want validation to take place on the client (to reduce the number of post backs and give a better user experience), but it's not an environment you can trust.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How not to do validation&lt;/b&gt;&lt;br /&gt;For obvious reasons, as stated above, you should not exclusively put validation on the client.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;One way of solving it&lt;/b&gt;&lt;br /&gt;I would agree with Rocky Lhotka that you should put validation in the business layer to begin with, and then duplicate that to the frontend to give the user a better experience. The main point here is that the business layer will be the deciding factor what gets though no matter if the UI validation isn't working as it's intended to.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Preparing for the future&lt;/b&gt;&lt;br /&gt;Another important point Rocky touches on is that the UI is more frequently replaced than the business layer code, which gives some value to having the validation there no matter if it's implemented in the UI.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Security&lt;/b&gt;&lt;br /&gt;One good rule I've come across is that you should treat everything coming from the user as potentially dangerous, and even better, do the same for anything that comes from the database. With this in mind, putting at least the critical validation in the  business layer seems like a good idea.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Patterns and practices?&lt;/b&gt;&lt;br /&gt;I'm looking into ways of building robust applications by using the MVP pattern (supervising controller) and TDD. I'll probably write more about that when I've gotten a bit more experience on the subject.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-110383047790439018?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/110383047790439018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=110383047790439018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/110383047790439018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/110383047790439018'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2007/04/validation-logic-security-and-web.html' title='Validation logic, security and the web'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-5969501494693510780</id><published>2007-04-05T21:20:00.000+02:00</published><updated>2007-04-05T22:32:09.185+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='podcasts'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='learning'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Weeks of .NET</title><content type='html'>This last month have been spent coding in .NET (mostly VB.NET) at my full time practice at &lt;a href="http://www.avancit.se"&gt;Avancit AB&lt;/a&gt;. I thought I would share a few things I've come across in the projects I've been working on during that time.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;T-SQL&lt;/b&gt;&lt;br /&gt;I had a problem where I needed to get all mail addresses of all groups in a company except those in the current group. This was solved by the SP shown below:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ALTER PROCEDURE [dbo].[sp_GetMailAddressesByCompany]&lt;br /&gt;(&lt;br /&gt; @intCompID INT,&lt;br /&gt; @excludeGroupID INT&lt;br /&gt;)&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt; — Get all addresses in company that are NOT in the excluded group&lt;br /&gt; SELECT addr.* FROM tblMailAddresses addr&lt;br /&gt;  INNER JOIN tblMailGroupsToAddresses con&lt;br /&gt;  ON con.intMailAddressID = addr.intMailAddressID&lt;br /&gt;  WHERE addr.intCompID = @intCompID&lt;br /&gt;  AND addr.intMailAddressID NOT IN&lt;br /&gt;  (&lt;br /&gt;   — Get all addresses in the excluded group&lt;br /&gt;   SELECT addr.intMailAddressID FROM tblMailAddresses addr&lt;br /&gt;    JOIN tblMailGroupsToAddresses con&lt;br /&gt;    ON con.intMailAddressID = addr.intMailAddressID&lt;br /&gt;    WHERE con.intMailGroupID = @excludeGroupID&lt;br /&gt;  )      &lt;br /&gt;END&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;BCP versus SqlBulkCopy&lt;/b&gt;&lt;br /&gt;Another problem was where we had an application that needed to push tables from a client to a server effectively. The current version at the time used BCP which was run from a batch process and sometimes (but very rarely) failed.&lt;br /&gt;&lt;br /&gt;I started to look around and I found that people where replacing BCP with SQLBulkLoad. I suggested we'd try it and we successfully implemented the transfer using it. As the whole process now took place inside the .NET application it was simple to setup a better error handling than was possible with BCP.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Macros&lt;/b&gt;&lt;br /&gt;As for productivity, I've started to look into using macros in VS2005. The first macro I installed was one that reversed assignments. I know there are tools that do this, I think ReSharper has this ability, but I don't have it yet so a macro works just as good. You can find this macro at: http://www.codeproject.com/useritems/macroswapassignments.asp&lt;br /&gt;&lt;br /&gt;&lt;b&gt;DNR&lt;/b&gt;&lt;br /&gt;Anyone still not listening to &lt;a href="http://www.dotnetrocks.com"&gt;DotNetRocks&lt;/a&gt; are missing some great stuff. As I'm on a train or a bus for 3 hours a day I've listened to quite a few episodes in the last few weeks (1 to 40). Even the early episodes are great, they give a good insight into why things are the way they are and what is new in .NET 2.0 (as I started with 2.0, I don't have much of a reference as to the differences compared to 1.1).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TDD&lt;/b&gt;&lt;br /&gt;Next week we're starting a project that will use TDD (Test Driven Development) for the first time within Avancit. It will be lots of fun and I'll probably write how that goes here later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-5969501494693510780?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/5969501494693510780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=5969501494693510780' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/5969501494693510780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/5969501494693510780'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2007/04/weeks-of-net.html' title='Weeks of .NET'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-781466976198562745</id><published>2007-02-28T20:03:00.000+01:00</published><updated>2007-02-28T23:56:17.962+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='learning'/><title type='text'>As a student...</title><content type='html'>As a student I've got a problem... there is just so much information out there. &lt;br /&gt;&lt;br /&gt;You know when you have a fair bit of knowledge about a topic but there are several big gaps missing? I've encountered this while I worked on a CakePHP site where I often had to search in the documentation as I couldn't get myself to read the entire thing to begin with.&lt;br /&gt;&lt;br /&gt;To solve this I started up a new tiddler in my TiddlyWiki where I wrote down the sections in the manual. Then I began skimming though the manual and noted every potentially useful bit of information. There is nothing incredibly new about this study technique, but it works for me. This approach of course requires that you have a project in mind.&lt;br /&gt;&lt;br /&gt;What I really would like is some way to attach little notes to places in texts and podcasts, and have them indexed, labeled and searchable. Maybe there is such a thing, a Firefox plugin perhaps?&lt;br /&gt;&lt;br /&gt;On a side note I've been working on a few projects, including a CakePHP site and a couple of ASP.NET/C#/VB.NET sites. Also been using my TiddlyWiki a lot, it has even replaced the need for FreeMind to some degree as it is searchable, indexable, has labels and can take really long and formatted texts :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-781466976198562745?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/781466976198562745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=781466976198562745' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/781466976198562745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/781466976198562745'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2007/02/as-student.html' title='As a student...'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-1970624807385484055</id><published>2007-01-13T17:05:00.000+01:00</published><updated>2007-01-13T17:39:27.005+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>Keeping track</title><content type='html'>&lt;a href="http://www.tiddlywiki.com/"&gt;TiddlyWiki&lt;/a&gt; - Wiki in a single .html file that stores info into itself and runs on basically anything. It uses a very nice Web2.0'ish interface. I replaced my remaining text files with a TiddlyWiki today.&lt;br /&gt;&lt;br /&gt;Worth mentioning twice, &lt;a href="http://freemind.sourceforge.net/wiki/index.php/Main_Page"&gt;Freemind&lt;/a&gt; - Great mind-mapping software. I use it for keeping track of projects, classes, assignments, todos...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;On the web&lt;/span&gt;&lt;br /&gt;As for web resources, I'd say &lt;a href="http://www.gmail.com"&gt;gmail&lt;/a&gt; got email just right. Used it for years and never felt like switching to anything else. I also use the google &lt;a href="http://www.google.com/calendar"&gt;calendar&lt;/a&gt;, &lt;a href="http://www.google.com/reader"&gt;reader&lt;/a&gt; and of course &lt;a href="http://www.blogger.com/"&gt;blogger&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As for self-improvement I've been trying &lt;a href="http://www.joesgoals.com/"&gt;Joe's goals&lt;/a&gt; for a little while.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-1970624807385484055?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/1970624807385484055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=1970624807385484055' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/1970624807385484055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/1970624807385484055'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2007/01/keeping-track.html' title='Keeping track'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-4213764268801001885</id><published>2007-01-08T18:14:00.000+01:00</published><updated>2007-01-08T18:28:46.300+01:00</updated><title type='text'>Books...</title><content type='html'>Books... seems there is no end to the books you absolutely need to read when you're attempting to be a decent developer. In my random browsing trough the web I stumbled upon "&lt;a href="http://jroller.com/page/rolsen?entry=five_more_books_for_developers"&gt;Five more books for developers&lt;/a&gt;" which is not a list of computer books as you might expect, instead it's a list of books that a developer might want to read anyway. I really like the neat twist at the end of the blog post. I'd recommend any sci-fi addict to read &lt;a href="http://en.wikipedia.org/wiki/Peter_f_hamilton"&gt;Peter F Hamilton&lt;/a&gt;'s works (especially the &lt;a href="http://en.wikipedia.org/wiki/Commonwealth_Saga"&gt;Commonwealth Saga (2002-2005)&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-4213764268801001885?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/4213764268801001885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=4213764268801001885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/4213764268801001885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/4213764268801001885'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2007/01/books.html' title='Books...'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-1481078889667145081</id><published>2006-12-25T20:19:00.000+01:00</published><updated>2007-01-04T20:35:58.009+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='frameworks'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>Eclipse with PHP and Java</title><content type='html'>I have been using Eclipse for some time now and it's the first IDE that I can compare to Visual Studio 2005. In some respects I'd say it's better than VS, but then I use them for different languages. I like the fact that Eclipse is multi-platform and free (as in open source).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Pluggabe!&lt;/span&gt;&lt;br /&gt;One of the best things about Eclipse is that it is easily pluggable and has as a result lots of great plug-ins. I've been using the &lt;a href="http://www.easyeclipse.org/site/distributions/expert-java.html"&gt;EasyEclipse Expert Java&lt;/a&gt; distribution with some of the &lt;a href="http://www.easyeclipse.org/site/plugins/index.html"&gt;EasyEclipse plug-ins&lt;/a&gt;, one of which is &lt;a href="http://www.easyeclipse.org/site/plugins/phpeclipse.html"&gt;PHP Eclipse&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Slow?&lt;/span&gt;&lt;br /&gt;I've heard some people speak of not using Eclipse because it's Java and "Slow". Now I don't have a fast computer (laptops are expensive things), but I'd have to say Eclipse is very responsive, way more so than VS.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Java and Eclipse&lt;/span&gt;&lt;br /&gt;I found one site that is great for beginners of both Eclipse and Java. Dave Powell at Elon University has created a &lt;a href="http://jonah.cs.elon.edu/dpowell2/Courses/EclipseTutorial/EclipseTutorial.htm"&gt;great video tutorial&lt;/a&gt; on everything from setting up Eclipse, debugging and GUI programming to unit testing in Java using Eclipse.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Experience with CakePHP and Eclipse&lt;/span&gt;&lt;br /&gt;CakePHP is a rapid application development toolkit for PHP centered around the Model-View-Controller pattern. I've found it by way of searching for a PHP alternative to Ruby-On-Rails (as rails hosting is still harder to come by).&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Maybe I just don't know how, but I could not seem to make Eclipse use the correct coloring or syntax-helpers with the default .thtml view file suffix. I've solved this for now by using .phtml and in the controller set &lt;span style="font-style:italic;"&gt;$this-&gt;ext = '.phtml';&lt;/span&gt;. After that Eclipse has been very comfortable to work with.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Im using &lt;a href="http://www.easyphp.org/"&gt;EasyPHP&lt;/a&gt; as my LAMP server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-1481078889667145081?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/1481078889667145081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=1481078889667145081' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/1481078889667145081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/1481078889667145081'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2006/12/eclipse-with-php-and-java.html' title='Eclipse with PHP and Java'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-4240581138789881704</id><published>2006-12-09T14:54:00.000+01:00</published><updated>2006-12-14T12:51:06.882+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='frameworks'/><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET game-related frameworks</title><content type='html'>Last Thursday I was at the first "Game Developers Evening" at KTH/Stockholm listening to a speech about XNA by &lt;a href="http://blogs.msdn.com/johanl/archive/2006/11/24/och-nu-till-n-aring-got-helt-annat.aspx"&gt;Johan Lindfors&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This will be the first of a series of GDE's, hosted by various game development  companies during the next year (have not found the schedule).&lt;br /&gt;&lt;br /&gt;I will sum up some of the points of the XNA speech below.&lt;br /&gt;&lt;br /&gt;One benefit of XNA could be said to be that you can develop games for both the PC (Windows) and the XBOX360. You have to have different projects for the XBOX360 and PC game but they claim that you can reuse 95% of your code.&lt;br /&gt;&lt;br /&gt;Another benefit could be that it has a component structure that you can use to share game components, like an in-game browser or a special camera orientation.&lt;br /&gt;&lt;br /&gt;As for using XNA to build games for the XBox360 you have to pay a subscription fee of $49 or $99 (4 months or a year I think) to get access to the runtime used. In the first release you would not have any way of distributing your games to others except by source to others that subscribe as developers on Live. Also you can't use networking in your game and subsequently the only option for more than one player is a split screen game.&lt;br /&gt;&lt;br /&gt;At this point XNA uses DirectX 9, I'm not shure if this is supposed to change with a later release.&lt;br /&gt;&lt;br /&gt;I think I will take this opportunity to mention about other .NET game related frameworks, namely &lt;a href="boogame.sf.net"&gt;BooGame&lt;/a&gt; and &lt;a href="http://axiomengine.sourceforge.net"&gt;Axiom&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;BooGame is a 2D-Game framework that is very similar to XNA in how you build the game, in other words, inherit from a base class, let BooGame run the game loop and have events or overrides tell you when to update or draw. The clear benefit of using BooGame is that you get a multi platform application. Also it never hurts to support an open source initiative. It uses OpenGL to render the 2D game which makes it very fast. I have not tried to use it with emulated OpenGL, but I guess that would work too.&lt;br /&gt;&lt;br /&gt;I use BooGame for my NetPlanes game.&lt;br /&gt;&lt;br /&gt;As for Axiom it's a 3D engine (not a game-engine like BooGame). It's a port of &lt;a href="http://ogre3d.org"&gt;Ogre&lt;/a&gt;, a very good C++ 3D engine. There are a couple of wrappers for Ogre to use it with .NET programs. I have not personally decided what the best method is, Axiom isn't as mature as Ogre but the wrappers have some problems too.&lt;br /&gt;&lt;br /&gt;My contribution to Axiom thus far is porting the &lt;a href="http://axiomengine.sourceforge.net/wiki/index.php/Basic_Tutorial_1"&gt;first basic tutorial&lt;/a&gt; and writing a &lt;a href="http://www.codecreations.se/misc/ExampleApplication.cs"&gt;base code&lt;/a&gt; (inspired by that of Ogre) to use (inherit from) in examples.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-4240581138789881704?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/4240581138789881704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=4240581138789881704' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/4240581138789881704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/4240581138789881704'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2006/12/net-game-related-frameworks.html' title='.NET game-related frameworks'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-785217816016550286</id><published>2006-12-01T09:39:00.001+01:00</published><updated>2006-12-14T12:51:29.377+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='podcasts'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><title type='text'>.NET podcasts and more</title><content type='html'>&lt;a href="http://www.dotnetrocks.com/"&gt;.NET Rocks&lt;/a&gt; has a huge collection of hour long episodes (currently 204) which seems to be mostly interviews. Then there are &lt;a href="http://www.polymorphicpodcast.com/"&gt;Polymorphic Podcast&lt;/a&gt; that is smaller but has a lot of value to it (not just the show but the show notes with links and source code). Each, in it's own way is a good resource to keep track of the .NET world.&lt;br /&gt;&lt;br /&gt;Another one is the &lt;a href="http://softwareas.com/"&gt;Software As Shes Developed&lt;/a&gt; podcast which I haven't gotten into listening to yet. It's described to be about "Web/Ajax, Usability, Programming (Rails/Java/OO), Patterns, Agile" which are certainly interesting topics.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-785217816016550286?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/785217816016550286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=785217816016550286' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/785217816016550286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/785217816016550286'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2006/12/net-podcasts-and-more.html' title='.NET podcasts and more'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-8704613996865680946</id><published>2006-11-27T13:48:00.000+01:00</published><updated>2006-11-27T16:19:33.601+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>FreeMind</title><content type='html'>Some time back while browsing for something completely different I found this application called FreeMind. As it turns out I converted most of my text files into FreeMind mind maps and haven't turned back since =).&lt;br /&gt;&lt;br /&gt;I love the way you can move nodes to change the tree structure and hide nodes you don't want to see. Or the feature where you can link to other FreeMind documents, web addresses and folders and have them open as you would expect them to.&lt;br /&gt;&lt;br /&gt;Another neat thing is if you want to export the data to plain tab-structured text, you just copy-paste from the tree.&lt;br /&gt;&lt;br /&gt;I'd recommend anyone who has to keep notes (for projects, studies, ... anything really), to go and check out FreeMind at &lt;a href="http://freemind.sourceforge.net"&gt;http://freemind.sourceforge.net&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-8704613996865680946?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/8704613996865680946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=8704613996865680946' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/8704613996865680946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/8704613996865680946'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2006/11/freemind.html' title='FreeMind'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-1189990086322394102</id><published>2006-11-23T15:53:00.001+01:00</published><updated>2006-12-14T12:50:14.299+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='languages'/><title type='text'>First impressions: Ruby</title><content type='html'>People have been talking a lot about Ruby... and I haven't actually heard anything bad about it this far. And I like good things :), so I decided to try it out.&lt;br /&gt;&lt;br /&gt;To start with many recommended this site: &lt;a href="http://tryruby.hobix.com/"&gt;http://tryruby.hobix.com&lt;/a&gt;. And it's great except I never got past the File.copy section, seemed a bit buggy.&lt;br /&gt;&lt;br /&gt;I'm quite used to C and C++ so I found &lt;a href="http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-c-and-c-/"&gt;To Ruby From C and C++&lt;/a&gt; interesting. After reading that I went on to go trough the official &lt;a href="http://www.ruby-lang.org/en/documentation/quickstart"&gt;Quickstart&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The best learning resource I've found this far would be &lt;a href="http://sitekreator.com/satishtalim/index.html"&gt;Learning Ruby&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The .chm of "Programming Ruby" included in the Ruby documentation isn't bad either.&lt;br /&gt;&lt;br /&gt;The way of installing a Ruby environment is generally said to be the &lt;a href="http://rubyforge.org/projects/rubyinstaller"&gt;One-Click Ruby Installer&lt;/a&gt;.  It's a pack containing ruby, libraries, docs and the gem packet manager (and more).  Never did get the included &lt;span style="font-style: italic;"&gt;FreeRIDE&lt;/span&gt; to work (no output). SciTE and the &lt;a href="http://www.sapphiresteel.com/"&gt;Ruby In Steel&lt;/a&gt; plugin to VS2005 worked about equally as good (colors, no auto-completion).&lt;br /&gt;&lt;br /&gt;As I'm on my way to becoming a .NET programmer I'm of course interested in the &lt;a href="http://plas.fit.qut.edu.au/Ruby.NET"&gt;Ruby.NET&lt;/a&gt; project, and I've tried their beta version with some small programs. I'm a bit interested in using it for scripting, but I'll probably end up with Boo for that (as that language is written for .NET to begin with).&lt;br /&gt;&lt;br /&gt;One of the best uses I've found this far for Ruby is with ruby-on-rails and I'm definitely going to try making a site with &lt;a href="http://www.rubyonrails.org/"&gt;ruby-on-rails&lt;/a&gt; someday.&lt;br /&gt;&lt;br /&gt;So.. what are my first impressions of Ruby?&lt;br /&gt;&lt;br /&gt;I'd say it's about the same as I had with Perl or Python: it's fast and easy to write small applications but I miss the robust feeling of C++ or C#. However, you should certainly use the right tools for the job at hand so you'll never know when it might be usefull :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-1189990086322394102?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/1189990086322394102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=1189990086322394102' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/1189990086322394102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/1189990086322394102'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2006/11/first-impressions-ruby_23.html' title='First impressions: Ruby'/><author><name>Joakim</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7398295447271170513.post-2627953231464655443</id><published>2006-11-22T13:48:00.000+01:00</published><updated>2006-11-22T14:58:15.533+01:00</updated><title type='text'>Welcome to my blog =)</title><content type='html'>I've been thinking of creating some kind of homepage for myself, but it never really got further than that :). Some friends of mine started getting blogs and I like the simplicity of it all. This blog is intended to be about the tech side of my life. My intention is to use this blog to post information on various projects I'm working on and write about useful things I find as I keep myself updated on programming and technology in general.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7398295447271170513-2627953231464655443?l=joakimk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://joakimk.blogspot.com/feeds/2627953231464655443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7398295447271170513&amp;postID=2627953231464655443' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/2627953231464655443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7398295447271170513/posts/default/2627953231464655443'/><link rel='alternate' type='text/html' href='http://joakimk.blogspot.com/2006/11/welcome-to-my-blog.html' title='Welcome to my blog =)'/><author><name>Joakim</name><uri>http://www.blogger.com/profile/16544014178916193168</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry></feed>
