<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.1.2" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>Code, the Universe and Everything.</title>
	<link>http://www.redrobinsoftware.net/blog</link>
	<description>Thoughts on coding, agile, rails and things typed at runtime.</description>
	<pubDate>Tue, 05 Aug 2008 11:54:15 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.1.2</generator>
	<language>en</language>
			<item>
		<title>Agile2008 on FriendFeed - Viral Campaign</title>
		<link>http://www.redrobinsoftware.net/blog/2008/08/05/20/</link>
		<comments>http://www.redrobinsoftware.net/blog/2008/08/05/20/#comments</comments>
		<pubDate>Tue, 05 Aug 2008 11:53:11 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
		
		<category><![CDATA[friendfeed]]></category>

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

		<guid isPermaLink="false">http://www.redrobinsoftware.net/blog/2008/08/05/20/</guid>
		<description><![CDATA[Almost a week ago, my colleague Vladimir and I launched a an agile 2008 room on friendfeed. I wrote about the experiment in a previous post. In this post, I&#8217;ll describe our viral campaign and preliminary observations so far.
Some stats
First of, some statistics: on Monday, the room had 31 members, the number of posts was [...]]]></description>
			<content:encoded><![CDATA[<p>Almost a week ago, my colleague Vladimir and I launched a <a href="http://friendfeed.com/rooms/agile-2008">an agile 2008 room</a> on <a href="http://friendfeed.com">friendfeed</a>. I wrote about the experiment in a <a href="http://www.redrobinsoftware.net/blog/2008/07/29/agile2008-on-friendfeed-an-experiment/">previous</a> post. In this post, I&#8217;ll describe our viral campaign and preliminary observations so far.</p>
<p><strong>Some stats</strong><br />
First of, some statistics: on Monday, the room had 31 members, the number of posts was above 50, including shared items, comments, pictures from <a href="http://www.flickr.com/">flickr</a>. Mind that these stats are gathered on a moment the actual conference wasn&#8217;t even started. Among the items posted in the room were (shameless) plugs of sessions, messages about where to eat Belgian food and a bit of thought sharing on which sessions to attend. </p>
<p><strong>A mini viral campain to get traction</strong><br />
A room without members is nothing, so the first thing we needed to do was get people to actually join the room and participate.<br />
Vladimir and I started  a mini <a href="http://en.wikipedia.org/wiki/Viral_marketing">viral campaign</a> to do that.Some of the things we did where:</p>
<ul>
<li>Post a message on mailing lists, like the <a href="http://tech.groups.yahoo.com/group/leandevelopment/">lean software development</a>, <a href="http://groups.yahoo.com/group/scrumdevelopment">the scrum</a> and the <a href="http://tech.groups.yahoo.com/group/xp-be/"> Belgian xp</a> mailing lists</li>
<li>For a long time, I&#8217;m subscribed to the rss feed from <a href="http://agileplanet.org/">agileplanet.org</a>. I commented on a couple of posts that were about agile 2008, mentioning the room.</li>
<li>A bit of mailing to personal contacts that I knew were going there.</li>
</ul>
<p>So far, we managed to indeed spread the virus, albeit very moderate. We also saw <a href="http://agilesoftwaredevelopment.com/Agile2008">others</a> <a href="http://www.reddit.com/r/agile/">mentioning</a> the room, thus spreading the message more. A big thanks for doing so! I am curious to see how the use of the friendfeed room will evolve over the course of the conference. And more important, I&#8217;m very interested to see if the room can capture some of the discussions/feedback/insights, etc that will no doubt occur during the conference. What else would you do to give the room more visibility? Did we forget to do some obvious steps? Any feedback is appreciated.</p>
<p><strong>Screenshots</strong><br />
To close of this post, some screenshots of the room, as it was on Monday noon Belgian time.</p>
<p>Promotion of sessions.<br />
<a href='http://www.redrobinsoftware.net/blog/wp-content/uploads/2008/08/ff_08_02_08_promoting_sessions.jpg' title='Self promotion of session'><img src='http://www.redrobinsoftware.net/blog/wp-content/uploads/2008/08/ff_08_02_08_promoting_sessions.thumbnail.jpg' alt='Self promotion of session' /></a></p>
<p>Members of the room.<br />
<a href='http://www.redrobinsoftware.net/blog/wp-content/uploads/2008/08/ff_08_02_08_members.jpg' title='Room members'><img src='http://www.redrobinsoftware.net/blog/wp-content/uploads/2008/08/ff_08_02_08_members.thumbnail.jpg' alt='Room members' /></a></p>
<p>During the next few days, I will try to post more observations, insights and whatever I can think of for our little room.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.redrobinsoftware.net/blog/2008/08/05/20/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Agile2008 on FriendFeed, an experiment</title>
		<link>http://www.redrobinsoftware.net/blog/2008/07/29/agile2008-on-friendfeed-an-experiment/</link>
		<comments>http://www.redrobinsoftware.net/blog/2008/07/29/agile2008-on-friendfeed-an-experiment/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 07:26:01 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
		
		<category><![CDATA[agile]]></category>

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

		<guid isPermaLink="false">http://www.redrobinsoftware.net/blog/2008/07/29/agile2008-on-friendfeed-an-experiment/</guid>
		<description><![CDATA[Next week is Agile 2008. Unfortunately, I won&#8217;t be able to go. But a couple of people I know are going. So, in order not to miss too much of the fun, I will be monitoring the Agile 2008 FriendFeed room.
I have to admit, I&#8217;m becoming a FriendFeed addict. I find myself using the service [...]]]></description>
			<content:encoded><![CDATA[<p>Next week is <a href="http://www.agile2008.org/">Agile 2008</a>. Unfortunately, I won&#8217;t be able to go. But a couple of people I know are going. So, in order not to miss too much of the fun, I will be monitoring <a href="http://friendfeed.com/rooms/agile-2008">the Agile 2008 FriendFeed room</a>.</p>
<p>I have to admit, I&#8217;m becoming a FriendFeed addict. I find myself using the service a lot and I&#8217;m curious to see how it will evolve. What I find most interesting on FriendFeed is the concept of rooms they have there. At work, we started using a private room of our own, where we post ideas, share little snippets, etc&#8230; Some of my team members were already using <a href="http://del.icio.us/">delicious</a>, where we agreed on a common tag that is only used by our team, and that works. But having the ability to comment, like, etc on the things you share, gives IMHO a much richer experience. Using FriendFeeds imaginary friends, we actually &#8220;source in&#8221; the stuff we tag on delicious into our private room for work. The only gotcha there is to not use the delicious sharing feature of FriendFeed, but rather the &#8220;blog&#8221; feature of FriendFeed, and set it up so that it reads the rss feed from your specific tag. </p>
<p>So, to come back to the original topic of this post, I am very excited to see whether enough people will join and participate on the <a href="http://friendfeed.com/rooms/agile-2008">the Agile 2008 FriendFeed room</a> room, and that it will give me, someone who is not participating in agile 2008, enough information so that I at least get a serious idea of what I am missing.</p>
<p>**edit** If you happen to know existing agile 2008 related forums, mailing lists, groups, etc, please let me know about them, or better, spread the word about this FriendFeed group.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.redrobinsoftware.net/blog/2008/07/29/agile2008-on-friendfeed-an-experiment/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ruby&#8217;s Operator Expressions and Message Expressions using Operator Methods Yield Different Results</title>
		<link>http://www.redrobinsoftware.net/blog/2008/02/21/rubys-operator-method-invocation-is-inconsistent/</link>
		<comments>http://www.redrobinsoftware.net/blog/2008/02/21/rubys-operator-method-invocation-is-inconsistent/#comments</comments>
		<pubDate>Thu, 21 Feb 2008 20:45:23 +0000</pubDate>
		<dc:creator>Koen</dc:creator>
		
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.redrobinsoftware.net/blog/2008/02/21/rubys-operator-method-invocation-is-inconsistent/</guid>
		<description><![CDATA[In pure object-oriented languages, such as Smalltalk, numerical and boolean expressions are expressed as message expressions. Non-pure object-oriented languages typically provide operators like +, -, *, /, &#038;&#038;, &#124;&#124;  to write numerical and boolean expressions, and they have precedence rules for operators, so that a numerical expression has the same semantics as in mathematics.
Interestingly, [...]]]></description>
			<content:encoded><![CDATA[<p>In pure object-oriented languages, such as Smalltalk, numerical and boolean expressions are expressed as message expressions. Non-pure object-oriented languages typically provide operators like +, -, *, /, &#038;&#038;, ||  to write numerical and boolean expressions, and they have precedence rules for operators, so that a numerical expression has the same semantics as in mathematics.</p>
<p>Interestingly, Ruby includes operators and some of them are implemented as methods, so-called operator methods. Let&#8217;s try some examples.</p>
<pre class="console">
irb(main):001:0> 3 + 4 * 6
=> 27
</pre>
<p>That is what we expect. It shows that Ruby implements operator precedence. * has precedence over +.</p>
<p>* and + are implemented as operator methods. The pickaxe book states that: <em>&#8220;If the operator in an operator expression corresponds to a redefinable method, Ruby will execute the operator expression expr1 operator expr2 as if it had been written (expr1).operator(expr2).&#8221;</em> This means that the previous example can also be written as:</p>
<pre class="console">
irb(main):002:0> 3.+(4).*(6)
=> 42
</pre>
<p>The result is what we expect. Messages are sent from left to right in an expression like this. The precedence rules do not apply when using the message passing form.</p>
<p>But according to the book, the two forms should yield the same result. They don&#8217;t.</p>
<p>Classes can implement operator methods as well, as shown in this example:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="ruby"><span style="color:#9966CC; font-weight:bold;">class</span> Number
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>initialValue = <span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@value</span> = initialValue
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">def</span>  value
    <span style="color:#0066ff; font-weight:bold;">@value</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> +<span style="color:#006600; font-weight:bold;">&#40;</span>other<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9966CC; font-weight:bold;">class</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">value</span> + other.<span style="color:#9900CC;">value</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> *<span style="color:#006600; font-weight:bold;">&#40;</span>other<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9966CC; font-weight:bold;">class</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">value</span> * other.<span style="color:#9900CC;">value</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Let&#8217;s try some expressions:</p>
<pre class="console">
irb(main):003:0> (Number.new(3) + Number.new(4) * Number.new(6)).value
=> 27
</pre>
<p>This is consistent the precedence rules of the operators. When this expression is rewritten with messages, this is the result:</p>
<pre class="console">
irb(main):004:0> Number.new(3).+(Number.new(4)).*(Number.new(6)).value
=> 42
</pre>
<p>Again, this shows that the precedence rules do not apply.</p>
<p>Although I expect that, consistent with other object-oriented languages, no precedence rules apply when messages are sent in sequence, Ruby states that using the operator form and the message passing form should be equivalent, but they clearly are not. That is very confusing and error-prone.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.redrobinsoftware.net/blog/2008/02/21/rubys-operator-method-invocation-is-inconsistent/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Distributed User Acceptance Test Session</title>
		<link>http://www.redrobinsoftware.net/blog/2008/01/25/distributed-user-acceptance-test-session/</link>
		<comments>http://www.redrobinsoftware.net/blog/2008/01/25/distributed-user-acceptance-test-session/#comments</comments>
		<pubDate>Fri, 25 Jan 2008 08:31:43 +0000</pubDate>
		<dc:creator>Koen</dc:creator>
		
		<category><![CDATA[agile]]></category>

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

		<guid isPermaLink="false">http://www.redrobinsoftware.net/blog/2008/01/25/distributed-user-acceptance-test-session/</guid>
		<description><![CDATA[Nick and I are working on a web application (of which we will blog later). Yesterday evening we organized the first user acceptance test session.
Instead of getting together in one location, we set up a distributed user acceptance test session, using web technology and tools. All participants were at home. We used Skype to set [...]]]></description>
			<content:encoded><![CDATA[<p>Nick and I are working on a web application (of which we will blog later). Yesterday evening we organized the first user acceptance test session.<br />
Instead of getting together in one location, we set up a distributed user acceptance test session, using web technology and tools. All participants were at home. We used <a href="http://www.skype.com/">Skype</a> to set up a communication channel. Skype supports conference calls upto 5 people and that was enough for yesterday&#8217;s session. We used <a href="http://docs.google.com">Google Docs</a> to share a document where the participants could record issues, suggestions and new features. A Google spreadsheet allows multiple users to edit the spreadsheet simultaneously. It shows which cells are being edited, so that it is clear where another contributor should not change the document. And of course, the participants also opened the web application in a web browser.<br />
When all participants were online with Skype and they had the spreadsheet and the web application open in their browsers, the session started. The conference call enabled us to have discussions about features and issues. The shared spreadsheet enabled us to quickly write down issues and suggestions. All the participants saw the changes to the spreadsheet and could immediately review what was written down. Often this gave rise to new discussions to clarify what was written down and it often resulted in short brainstorms about new features.<br />
The session was fun. We had lively discussions and we laughed with ideas that built on other ideas about extra functionality. The feedback flowed easily into the spreadsheet. We had interesting discussions about end-user and technical aspects of the application. One participant&#8217;s girlfriend joined the conversation and gave very good feedback from an end-user standpoint.<br />
From this session I learned that the right tools are available to set up distributed work sessions. I really enjoyed it and I hope to do it again soon. I like to thank the participants for their contribution. We owe them a beer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.redrobinsoftware.net/blog/2008/01/25/distributed-user-acceptance-test-session/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Installing Ruby In Your Home Folder On Dreamhost</title>
		<link>http://www.redrobinsoftware.net/blog/2007/11/22/installing-ruby-in-your-home-folder-on-dreamhost/</link>
		<comments>http://www.redrobinsoftware.net/blog/2007/11/22/installing-ruby-in-your-home-folder-on-dreamhost/#comments</comments>
		<pubDate>Thu, 22 Nov 2007 21:48:39 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
		
		<category><![CDATA[rails]]></category>

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

		<guid isPermaLink="false">http://www.redrobinsoftware.net/blog/2007/11/22/installing-ruby-in-your-home-folder-on-dreamhost/</guid>
		<description><![CDATA[I wanted to install a more recent ruby on my dreamhost hosting, with more recent gems then provided standard, so I decided to install ruby in my home directory. Below the steps I took to get it working. It worked out of the box for me, so now, I have full control over which exact [...]]]></description>
			<content:encoded><![CDATA[<p>I wanted to install a more recent ruby on my <a href="http://www.dreamhost.com/">dreamhost</a> hosting, with more recent gems then provided standard, so I decided to install ruby in my home directory. Below the steps I took to get it working. It worked out of the box for me, so now, I have full control over which exact gems and versions I use, independent of what dreamhost provides.</p>
<p>First, download the ruby tar ball:<br />
wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p110.tar.gz<br />
(note: be sure to check on the ruby site to get the latest stable sources, in the mean time, newer patchlevels might be available)</p>
<p>untar the tar ball:</p>
<p>tar -xvf ../ruby-1.8.6-p110.tar.gz</p>
<p>In your home folder, create a ruby directory to hold the installation:</p>
<p>mkdir ~/ruby</p>
<p>Change directory to the untarred directory. In that directory, run configure pointing to your local ruby directory:</p>
<p>./configure &#8211;prefix=/home/username/ruby</p>
<p>Then run:</p>
<p>make<br />
make install</p>
<p>You now should have a ruby installation in /home/username/ruby.</p>
<p>In your home folder, edit your .bash_profile file and add the ruby bin folder to your path:</p>
<p>export PATH=&#8221;$HOME/ruby/bin:$PATH&#8221;</p>
<p>Source this file and run ruby -v</p>
<p>source ~/.bash_profile<br />
ruby -v</p>
<p>SUCCESS:<br />
ruby 1.8.6 (2007-09-23 patchlevel 110) [i686-linux]</p>
<p>Next, install ruby gem, the ruby package manager. Ruby gems can be found <a href="http://rubygems.org">here</a></p>
<p>Get the latest version:</p>
<p>wget http://rubyforge.org/frs/download.php/28174/rubygems-0.9.5.tgz</p>
<p>untar:</p>
<p>tar -xvzf rubygems-0.9.5.tgz</p>
<p>cd rubygems-0.9.5</p>
<p>ruby setup.rb   (note, be sure that you have your home backed ruby in your path!!)</p>
<p>Install <a href="http://docs.rubyrake.org/shelf">rake</a>:</p>
<p>gem install &#8211;remote rake</p>
<p>gem install fcgi</p>
<p>Do not forget to update the shebang in the dispatcher.fcgi file to the correct path</p>
<p>#!/home/username/ruby/bin/ruby</p>
<p>Then, install rails:</p>
<p>gem install rails</p>
<p>And you are rolling!!!</p>
<p>Note that in order to deploy in production mode, you need to uncomment the ENV[&#8217;RAILS_ENV&#8217;] ||= &#8216;production&#8217; line in environment.rb.</p>
<p>Below the deployment recipe I used:</p>
<p><code><br />
ssh_options[:paranoid] = false<br />
set :user, 'user'<br />
set :password, 'passwd'<br />
set :application, "app"<br />
set :repository,  "http://url_to_svn_repository"<br />
set :deploy_to, "/home/username/www.killerapp.com"</p>
<p>role :app, "www.killerapp.com"<br />
role :web, "www.killerapp.com"<br />
role :db,  "www.killerdb.com", :primary => true</p>
<p>set :checkout, "export"</p>
<p>namespace :deploy do<br />
desc "Restart the FCGI processes on the app server as a regular user."<br />
task :restart, :roles => :app do<br />
  run "#{current_path}/script/process/reaper --dispatcher=dispatch.fcgi"<br />
end</p>
<p>end<br />
</code></p>
<p>Thanks to <a href="http://nubyonrails.com/pages/shovel_dreamhost">Geoffrey Grosenbach</a> for getting the inspiration for this recipe. </p>
<p>Hope this helps.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.redrobinsoftware.net/blog/2007/11/22/installing-ruby-in-your-home-folder-on-dreamhost/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Multi-lingual site in Drupal</title>
		<link>http://www.redrobinsoftware.net/blog/2007/09/20/multi-lingual-site-in-drupal/</link>
		<comments>http://www.redrobinsoftware.net/blog/2007/09/20/multi-lingual-site-in-drupal/#comments</comments>
		<pubDate>Thu, 20 Sep 2007 20:31:01 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
		
		<category><![CDATA[drupal]]></category>

		<guid isPermaLink="false">http://www.redrobinsoftware.net/blog/2007/09/20/multi-lingual-site-in-drupal/</guid>
		<description><![CDATA[Some time ago a friend of mine asked if I could build a website for him. The requirements were simple: it had to be easy to add content for my non-technical savvy friend, the look and feel should be in line of his record store (he owns and runs 2 records stores specialized in jazz [...]]]></description>
			<content:encoded><![CDATA[<p>Some time ago a friend of mine asked if I could build a website for him. The requirements were simple: it had to be easy to add content for my non-technical savvy friend, the look and feel should be in line of his record store (he owns and runs 2 records stores specialized in jazz and classical music) and it had to be multilingual, Dutch, French and English. Last requirement was relatively cheap and easy hosting.</p>
<p>After some initial looking around on the web, I thought I&#8217;d give <a href="http://www.drupal.org">drupal</a> a go. I was looking for an excuse to get to know some drupal basics anyway :)</p>
<p>In this post, I&#8217;ll describe how I&#8217;m setting up this site, especially the multilingual part. I&#8217;m still a complete drupal newby, so all suggestions are welcome.</p>
<p>So without further ado, this is what I did. I started with a fresh copy of drupal on the <a href="http://drupal.org/drupal-5.2">drupal site</a>. I then installed and enabled the following modules:</p>
<ul>
<li>Internationalization</li>
<li>CCK</li>
<li>Views</li>
</ul>
<p>In the drupal <a href="http://drupal.org/node/133977">handbook</a> for the internationalization project, I found an elaborate <a href="http://drupal.org/node/81094">how-to</a> on getting the whole internationalization thing to work. Key things I learned where:</p>
<ul>
<li><strong>Menus:</strong> with the internationalization module, it is possible to have different menus for different languages. This is typically  <strong>not</strong> what you want. You rather want one menu structure with text that changes if you switch languages. Therefor, use the &#8220;manage strings&#8221; functionality found in Administer -> Site Configuration -> Localization.</li>
<li>The menu items should link to node_name, not to en/node. The internationalization module will rewrite the link to en/node_name at runtime when you have the language set to English.</li>
<li><strong>Nodes:</strong> Make sure to add a language to each individual node, this avoids an occasional piece of content in another language popping up.</li>
<li>Enable the path module under the core-optional family of modules. You will need to change the default path of a node to e.g. en/node_name for an English page.</li>
<li>Be sure to enable multilingual support for all content types you are using.</li>
<li>Do not forget to add the language switcher block to your site ;)</li>
</ul>
<p>All in all setting up these basic things went smooth, I do have a couple of remarks/questions:</p>
<ul>
<li>Is it possible to automatically set the correct path name e.g. en/node_name, rather then to have to do this manually for each individual node?</li>
<li>How can I theme/style the language switcher so that I only have the little flags, not the language name?</li>
<li>Are there other tips and tricks, obvious things or deeply hidden features I should be aware about? </li>
</ul>
<p>All suggestions welcome, thanks in advance!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.redrobinsoftware.net/blog/2007/09/20/multi-lingual-site-in-drupal/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Transcending CSS</title>
		<link>http://www.redrobinsoftware.net/blog/2007/09/11/transcending-css/</link>
		<comments>http://www.redrobinsoftware.net/blog/2007/09/11/transcending-css/#comments</comments>
		<pubDate>Tue, 11 Sep 2007 18:38:53 +0000</pubDate>
		<dc:creator>Koen</dc:creator>
		
		<category><![CDATA[css]]></category>

		<category><![CDATA[web design]]></category>

		<guid isPermaLink="false">http://www.redrobinsoftware.net/blog/2007/09/11/transcending-css/</guid>
		<description><![CDATA[I read the book Transcending CSS and I am very impressed. It is not a book, like so many, that goes into all the details of CSS. Instead it is about design and creating beautiful things. And it also states that a web designer should look at the future (CSS3 for instance) instead of accepting [...]]]></description>
			<content:encoded><![CDATA[<p>I read the book <a href="http://www.transcendingcss.com/">Transcending CSS</a> and I am very impressed. It is not a book, like so many, that goes into all the details of CSS. Instead it is about design and creating beautiful things. And it also states that a web designer should look at the future (CSS3 for instance) instead of accepting the shortcomings of the (still) most popular browser.</p>
<p>I learned a lot from this book. In particular I learned how to build a web page from the content out: first write the content and then do the styling. I did some exercises to apply that way of working and the results are astonishing.</p>
<p>I recommend this book to everybody who likes to improve his/her web design skills.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.redrobinsoftware.net/blog/2007/09/11/transcending-css/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Announcing JyDT 1.5.0</title>
		<link>http://www.redrobinsoftware.net/blog/2007/06/09/announcing-jydt-150/</link>
		<comments>http://www.redrobinsoftware.net/blog/2007/06/09/announcing-jydt-150/#comments</comments>
		<pubDate>Sat, 09 Jun 2007 08:47:10 +0000</pubDate>
		<dc:creator>Koen</dc:creator>
		
		<category><![CDATA[eclipse]]></category>

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

		<guid isPermaLink="false">http://www.redrobinsoftware.net/blog/2007/06/09/announcing-jydt-150/</guid>
		<description><![CDATA[After nearly a year of inactivity, I found the time to add new functionality to JyDT, the Jython Development Tools for Eclipse. I added a PyUnit runner, very similar in look and feel to the JUnit runner. The screenshot below shows the PyUnit runner in action.

At the time of writing, almost 75% of the functionality [...]]]></description>
			<content:encoded><![CDATA[<p>After nearly a year of inactivity, I found the time to add new functionality to <a href="http://www.redrobinsoftware.net/jydt/">JyDT</a>, the Jython Development Tools for <a href="http://www.eclipse.org/">Eclipse</a>. I added a PyUnit runner, very similar in look and feel to the JUnit runner. The screenshot below shows the PyUnit runner in action.</p>
<p align="center"><a href='http://www.redrobinsoftware.net/blog/wp-content/uploads/2007/06/pyunitrunner.gif' title='PyUnit Runner'><img src='http://www.redrobinsoftware.net/blog/wp-content/uploads/2007/06/pyunitrunner.gif' alt='PyUnit Runner' /></a></p>
<p>At the time of writing, almost 75% of the functionality is ready. I expect to release the PyUnit runner by the end of the month, as part of JyDT 1.5.0.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.redrobinsoftware.net/blog/2007/06/09/announcing-jydt-150/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ruby&#8217;s &#8220;private&#8221;: not as Private as You Expect</title>
		<link>http://www.redrobinsoftware.net/blog/2007/04/24/rubys-private-not-as-private-as-you-expect/</link>
		<comments>http://www.redrobinsoftware.net/blog/2007/04/24/rubys-private-not-as-private-as-you-expect/#comments</comments>
		<pubDate>Tue, 24 Apr 2007 18:21:16 +0000</pubDate>
		<dc:creator>Koen</dc:creator>
		
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.redrobinsoftware.net/blog/2007/04/24/rubys-private-not-as-private-as-you-expect/</guid>
		<description><![CDATA[I expect that, if a language borrows a concept from another language, and if that language even uses the same name for the concept, the concept also has the same semantics. That is not the case for &#8220;private&#8221; access control in Ruby.
In Java and C++, the sematics of the &#8220;private&#8221; access modifier for a method [...]]]></description>
			<content:encoded><![CDATA[<p>I expect that, if a language borrows a concept from another language, and if that language even uses the same name for the concept, the concept also has the same semantics. That is not the case for &#8220;private&#8221; access control in Ruby.</p>
<p>In Java and C++, the sematics of the &#8220;private&#8221; access modifier for a method is: the method can only be called by methods of the class that declares the private method.</p>
<p>In Ruby, the semantics is (taken from the pickaxe book, page 35): <cite>private methods can be called only in the context of the current object</cite>. A bit further in the book: <cite>The difference between &#8220;protected&#8221; and &#8220;private&#8221; is fairly subtle and is different in Ruby than in most common OO languages</cite>.</p>
<p>Indeed, the difference is subtle, certainly for C++ and Java developers learning Ruby. As the sematics above already indicate, C++ and Java have a class focus, while Ruby has an instance focus. Private in C++ and Java means: private to the class. In Ruby, it means: private to the instance.</p>
<p>There is another aspect of the semantics that is important. In C++ and Java, a private method can be called on a different instance than the one executing the current method. In Ruby, private methods can only be invoked on the same instance, which is enforced syntactically: private methods can only be invoked without a receiver or with self.</p>
<p>Because in Ruby private methods are private to an instance, they can be invoked by methods in a subclass, illustrated by  the following code snippet:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="ruby"><span style="color:#9966CC; font-weight:bold;">class</span> Superclass
    private
        <span style="color:#9966CC; font-weight:bold;">def</span> m1<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
            <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Superclass.m1&quot;</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> Subclass &lt; Superclass
    public
        <span style="color:#9966CC; font-weight:bold;">def</span> m2<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
            m1<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
            <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Subclass.m2&quot;</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Subclass.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">m2</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></td></tr></table></div>

<p>The output of the program is:</p>
<pre class="console">
irb(main):017:0> Subclass.new().m2()
Superclass.m1
Subclass.m2
=> nil
</pre>
<p>Private methods  can also be overridden, as shown in this code snippet:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="ruby"><span style="color:#9966CC; font-weight:bold;">class</span> Superclass
    private
        <span style="color:#9966CC; font-weight:bold;">def</span> m<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
            <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Superclass.m&quot;</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> Subclass &lt; Superclass
    public
        <span style="color:#9966CC; font-weight:bold;">def</span> m<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
            <span style="color:#9966CC; font-weight:bold;">super</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
            <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Subclass.m&quot;</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Subclass.<span style="color:#9900CC;">new</span>.<span style="color:#9900CC;">m</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></td></tr></table></div>

<p>The output of the program is:</p>
<pre class="console">
irb(main):017:0> Subclass.new.m()
Superclass.m
Subclass.m
=> nil
</pre>
<p>A singleton method can even override a private method of the class of the instance, as illustrated by this code snippet:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>33
34
35
36
37
38
39
40
41
42
43
44
45
</pre></td><td class="code"><pre class="ruby"><span style="color:#9966CC; font-weight:bold;">class</span> MyClass
    private
        <span style="color:#9966CC; font-weight:bold;">def</span> m<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
            <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;MyClass.m&quot;</span>
        <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
object = MyClass.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">def</span> object.<span style="color:#9900CC;">m</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">super</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;object.m&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
object.<span style="color:#9900CC;">m</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></td></tr></table></div>

<p>The output of the program is:</p>
<pre class="console">
irb(main):013:0> object.m()
MyClass.m
object.m
=> nil
</pre>
<p>The conclusion is that Ruby has no way to make methods private in the C++ and Java sense. In my opinion, that is a good thing, because private methods are bad for reusability. But I do not believe that using the word &#8220;private&#8221; was a good choice.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.redrobinsoftware.net/blog/2007/04/24/rubys-private-not-as-private-as-you-expect/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Stacked Bar Graph in Rails</title>
		<link>http://www.redrobinsoftware.net/blog/2007/04/21/stacked-bar-graph-in-rails/</link>
		<comments>http://www.redrobinsoftware.net/blog/2007/04/21/stacked-bar-graph-in-rails/#comments</comments>
		<pubDate>Sat, 21 Apr 2007 20:01:52 +0000</pubDate>
		<dc:creator>Nick</dc:creator>
		
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.redrobinsoftware.net/blog/2007/04/21/6/</guid>
		<description><![CDATA[A while ago, I stumbled upon some nice ccs-graphs that did precisely what I needed at work. I wanted to show the evolution of some stats over time, in stacked-bar format. After some googling, I found a simple rails helper for css graphs. I needed some more stuff, but is was definitely a very good [...]]]></description>
			<content:encoded><![CDATA[<p>A while ago, I stumbled upon some nice <a href="http://www.terrill.ca/design/vertical_bar_graphs/" target="_blank">ccs-graphs</a> that did precisely what I needed at work. I wanted to show the evolution of some stats over time, in stacked-bar format. After some googling, I found a simple <a href="http://http://nubyonrails.com/pages/css_graphs" target="_blank">rails helper</a> for css graphs. I needed some more stuff, but is was definitely a very good starting point.</p>
<p>The final graph I wanted to have looks something like this:</p>
<style> #graph { background:#EEEEEE url(wp-content/uploads/2007/04/horizontal_line.png) repeat scroll left bottom; border:4px solid #999999; font-family:Helvetica,Geneva,sans-serif; font-size:11px; font-size-adjust:none; font-stretch:normal; font-style:normal; font-variant:normal; font-weight:normal; height:200px; width: 401px; line-height:normal; margin:1em 0pt; padding:0pt; position:relative;  text-indent : 0;} #graph li { background:#666666  repeat-y scroll right top; border-color:#555555 rgb(85, 85, 85) -moz-use-text-color; border-style:solid solid none; border-width:1px 1px medium; bottom:0pt; color:#FFFFFF; list-style-image:none; list-style-position:outside; list-style-type:none; margin:0pt; padding:0pt; position:absolute; text-align:center; width:39px; } #graph li.p1{ background-color: green;} #graph li.p2{ background-color: red;} #graph li.p{ margin: 0 0 0 0} #graph li.p:before {content: ""}</p>
</style>
<ul id="graph">
<li class="p p2" title="Tue Apr 10 15:52:38 +0200 2007" style="height: 67px; left: 360px">38</li>
<li class="p p1" title="Tue Apr 10 15:52:38 +0200 2007" style="height: 29px; left: 360px">29</li>
<li class="p p2" title="Wed Apr 11 15:52:38 +0200 2007" style="height: 64px; left: 320px">36</li>
<li class="p p1" title="Wed Apr 11 15:52:38 +0200 2007" style="height: 28px; left: 320px">28</li>
<li class="p p2" title="Thu Apr 12 15:52:38 +0200 2007" style="height: 61px; left: 280px">34</li>
<li class="p p1" title="Thu Apr 12 15:52:38 +0200 2007" style="height: 27px; left: 280px">27</li>
<li class="p p2" title="Fri Apr 13 15:52:38 +0200 2007" style="height: 58px; left: 240px">32</li>
<li class="p p1" title="Fri Apr 13 15:52:38 +0200 2007" style="height: 26px; left: 240px">26</li>
<li class="p p2" title="Sat Apr 14 15:52:38 +0200 2007" style="height: 55px; left: 200px">30</li>
<li class="p p1" title="Sat Apr 14 15:52:38 +0200 2007" style="height: 25px; left: 200px">25</li>
<li class="p p2" title="Sun Apr 15 15:52:38 +0200 2007" style="height: 52px; left: 160px">28</li>
<li class="p p1" title="Sun Apr 15 15:52:38 +0200 2007" style="height: 24px; left: 160px">24</li>
<li class="p p2" title="Mon Apr 16 15:52:38 +0200 2007" style="height: 49px; left: 120px">26</li>
<li class="p p1" title="Mon Apr 16 15:52:38 +0200 2007" style="height: 23px; left: 120px">23</li>
<li class="p p2" title="Tue Apr 17 15:52:38 +0200 2007" style="height: 46px; left: 80px">24</li>
<li class="p p1" title="Tue Apr 17 15:52:38 +0200 2007" style="height: 22px; left: 80px">22</li>
<li class="p p2" title="Wed Apr 18 15:52:38 +0200 2007" style="height: 43px; left: 40px">22</li>
<li class="p p1" title="Wed Apr 18 15:52:38 +0200 2007" style="height: 21px; left: 40px">21</li>
<li class="p p2" title="Thu Apr 19 15:52:38 +0200 2007" style="height: 40px; left: 0px">20</li>
<li class="p p1" title="Thu Apr 19 15:52:38 +0200 2007" style="height: 20px; left: 0px">20</li>
</ul>
<p> <a href="http://www.redrobinsoftware.net/blog/2007/04/21/stacked-bar-graph-in-rails/#more-6" class="more-link">(more&#8230;)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.redrobinsoftware.net/blog/2007/04/21/stacked-bar-graph-in-rails/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
