<?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-4048544774153045973</id><updated>2012-01-31T10:52:31.751+01:00</updated><category term='install'/><category term='ruby'/><category term='couchdb'/><category term='pronounceable passwords'/><category term='installation'/><category term='machinist'/><category term='erlang'/><category term='developing'/><category term='ActiveRecord'/><category term='javadoc'/><category term='couchdb4j'/><category term='jira'/><category term='conversion'/><category term='technique'/><category term='benchmark'/><category term='environment'/><category term='disk'/><category term='ad-hoc views'/><category term='syntax'/><category term='lion'/><category term='osx'/><category term='hardy'/><category term='ruby rails rails3 activerecord habtm'/><category term='atlassian'/><category term='test'/><category term='hashmap'/><category term='developers'/><category term='agile'/><category term='plugin'/><category term='analysis'/><category term='planning'/><category term='rails'/><category term='ruby mysql rails table'/><category term='script'/><category term='todo'/><category term='access'/><category term='performance'/><category term='autospec'/><category term='vim'/><category term='code'/><category term='hg'/><category term='bdd'/><category term='football'/><category term='rails multiparameter activerecord form helpers'/><category term='repository'/><category term='database'/><category term='addressbook'/><category term='postgresql ruby gem rubygems pg tricks tips'/><category term='apache'/><category term='estimating'/><category term='italian'/><category term='i18n'/><category term='factorygirl'/><category term='person'/><category term='team building'/><category term='tail recursive'/><category term='mysql'/><category term='java'/><category term='fields'/><category term='junior'/><category term='xpeppers'/><category term='relational'/><category term='programming'/><category term='mixin'/><category term='freemind'/><category term='document'/><category term='views'/><category term='example'/><category term='rake rails db rollback activerecord'/><category term='metaprogramming'/><category term='textmate'/><category term='shared pomodoro'/><category term='bash'/><category term='named views'/><category term='latest'/><category term='bitbucket'/><category term='rspec'/><category term='italian passwords'/><category term='futon'/><category term='build'/><category term='chromium'/><category term='colorschemes'/><category term='pomodoro technique'/><category term='monkey patching'/><category term='ubuntu'/><category term='pomodoro'/><category term='plugins'/><category term='mercurial'/><category term='examples'/><category term='db'/><category term='screencast'/><title type='text'>Just another developer blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-7026258190777429179</id><published>2012-01-31T10:38:00.006+01:00</published><updated>2012-01-31T10:52:31.758+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='colorschemes'/><title type='text'>Vim color scheme samples</title><content type='html'>&lt;div style="text-align: left;"&gt;I have a lot of Vim colorschemes, and I like to change them very often, reflecting my mood. I needed a way to showcase them all and quickly pick one.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The original &lt;a href="https://code.google.com/p/vimcolorschemetest/"&gt;Vim Color Scheme Test&lt;/a&gt; script by maverick.woo is written in Perl and the build works on Windows systems. I wanted to add some new features, and to test it with my own colorschemes, but as I'm not very confident with Perl, I preferred to start over with a new Ruby version instead of forking his project. Here's my version (and here's the &lt;a href="https://github.com/metalelf0/VimColorSchemeTest-Ruby"&gt;github&lt;/a&gt; page):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="https://github.com/metalelf0/VimColorSchemeTest-Ruby/raw/master/screenshots/screenshot_01.png" border="0" alt="" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 550px; " /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="https://github.com/metalelf0/VimColorSchemeTest-Ruby/raw/master/screenshots/screenshot_02.png" border="0" alt="" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 550px; " /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;The script loads all your colorschemes from your default vim directory (~/.vim/colors), and writes into the output dir an HTML file for each colorscheme, with a render of a Ruby file using this colorscheme. It also writes a different copy for each language present in the samples/ directory. It also builds an index page for each language, with a showcase of how the colorschemes render the sample code, a download link for each colorscheme and a nice lightbox to preview it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;To make it run, you'll need:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ruby&lt;/li&gt;&lt;li&gt;macvim&lt;/li&gt;&lt;li&gt;tilt rubygem (to render the index template)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;What still needs to be done:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Separate light and dark colorschemes&lt;/li&gt;&lt;li&gt;Make this work with versions of vim different from MacVim&lt;/li&gt;&lt;li&gt;Add the current language name to index pages&lt;/li&gt;&lt;li&gt;Add more languages (currently only Ruby and Python are supported)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;ATM, the script uses a vim server named VIMCOLORS and sends it remote commands. This was made to make it faster, because opening a single macvim instance for each script required too much time. However, the --remote-send command of vim doesn't wait for previous remote-sends to be completed, so I had to add a "sleep 1" command in the script to prevent it from messing up the execution flow. Any hint to solve this is greatly appreciated.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-7026258190777429179?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/7026258190777429179/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2012/01/vim-color-scheme-samples.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/7026258190777429179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/7026258190777429179'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2012/01/vim-color-scheme-samples.html' title='Vim color scheme samples'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-9146423729339156033</id><published>2011-10-28T11:07:00.004+02:00</published><updated>2011-10-28T11:18:52.888+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails multiparameter activerecord form helpers'/><title type='text'>Using virtual attributes for multi-parameter form helpers in Rails</title><content type='html'>In a Rails application I am working on, I needed to setup a form with a field with a non-standard behaviour. The field represents a date object, so the FormHelper date_select helper looked great; however, the date to display was not the actual date to be set on the database, but the day before. Changing all the data on the DB was a bit risky, so I had to stick with this requirement.&lt;br/&gt; I decided to use a virtual attribute to do this, as it seemed the most elegant solution, so I wrote this in my model:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1321926.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;And this in my controller:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1321928.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;However, trying to send this data to the controller resulted in a "1 error(s) on assignment of multiparameter attributes" error.&lt;br /&gt;&lt;br /&gt;The solution I found after some search was this one:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1321930.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Reference:&lt;br /&gt;&lt;a href="http://gabeodess.heroku.com/posts/14"&gt;http://gabeodess.heroku.com/posts/14&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-9146423729339156033?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/9146423729339156033/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2011/10/using-virtual-attributes-for-multi.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/9146423729339156033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/9146423729339156033'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2011/10/using-virtual-attributes-for-multi.html' title='Using virtual attributes for multi-parameter form helpers in Rails'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-2814688931946401448</id><published>2011-07-20T22:42:00.004+02:00</published><updated>2011-07-21T08:27:03.706+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='disk'/><category scheme='http://www.blogger.com/atom/ns#' term='install'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><category scheme='http://www.blogger.com/atom/ns#' term='lion'/><title type='text'>OSX Lion: "This disk cannot be used to start up your computer"</title><content type='html'>Today I downloaded the installer for OSX Lion from the App Store. I ran it, and when it came to choose the disk to install to, it told me that "this disk cannot be used to start up your computer". I had a setup with 4 partitions: the hidden EFI system partition, the Macintosh HD partition, and two linux partitions (an ext3 one + a swap one).&lt;br /&gt;&lt;br /&gt;So, the solution was to resize the Macintosh HD partition. I booted my Mac from the Lion install DVD (you can burn it from the installer package, just search google to know how to do it), went into disk utility, checked all partitions for errors (this was necessary because I wasn't able to resize them otherwise) then I resized only the Macintosh HD partition shrinking it by some GBs.&lt;br /&gt;&lt;br /&gt;After this, I ran the installer again and installation started smoothly.&lt;br /&gt;&lt;br /&gt;HTH!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-2814688931946401448?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/2814688931946401448/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2011/07/osx-lion-this-disk-cannot-be-used-to.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/2814688931946401448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/2814688931946401448'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2011/07/osx-lion-this-disk-cannot-be-used-to.html' title='OSX Lion: &quot;This disk cannot be used to start up your computer&quot;'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-5780103303529821809</id><published>2011-06-19T10:28:00.006+02:00</published><updated>2011-06-19T18:10:08.829+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='factorygirl'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='xpeppers'/><category scheme='http://www.blogger.com/atom/ns#' term='machinist'/><category scheme='http://www.blogger.com/atom/ns#' term='db'/><title type='text'>Machinist vs Factory Girl: Machinist win!</title><content type='html'>&lt;p&gt;Today I decided to verify if &lt;a href="https://github.com/notahat/machinist"&gt;Machinist&lt;/a&gt; could be a good replacement for &lt;a href="https://github.com/thoughtbot/factory_girl"&gt;Factory Girl&lt;/a&gt;. In our project, we have a big problem with Factory Girl: even if you tell her not to hit the database, using the &lt;span style="font-weight:bold;"&gt;Factory.build&lt;/span&gt; method, if an object has associations, these are saved on the DB. And this causes a huge slowdown in specs using factories. We've been using Factory Girl for nearly two years, and if we could find a way to stop him hitting the DB, we could really have a huge improvent in our test suite running time.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;To verify if Machinist could perform better, I set up a basic rails app. Look at this example:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1033984.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;If you do a &lt;span style="font-weight:bold;"&gt;tail -f log/test.log&lt;/span&gt; and you run this spec, you'll see something like this:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1033991.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The &lt;span style="font-weight:bold;"&gt;Factory.build&lt;/span&gt; method has to save dependencies on the DB to set the foreign keys on the objects and validate them.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Let's try with machinist:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1033995.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This time, running tail on the test.log file and running the spec, doesn't shown any DB hit, and of yeah, we have a green test.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I verified this also by putting a &lt;span style="font-weight:bold;"&gt;debugger&lt;/span&gt; line after the validation and inspecting the DB from within the debugger after the validation has run - with FactoryGirl, it revealed an Address object saved on the DB, while with Mechanist it didn't.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I still haven't looked inside machinist to show how it handles this, but I'll do it soon, so keep in touch!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-5780103303529821809?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/5780103303529821809/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2011/06/machinist-vs-factory-girl-machinist-win.html#comment-form' title='8 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/5780103303529821809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/5780103303529821809'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2011/06/machinist-vs-factory-girl-machinist-win.html' title='Machinist vs Factory Girl: Machinist win!'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-2417965336599205661</id><published>2011-03-10T14:51:00.003+01:00</published><updated>2011-03-10T14:56:01.587+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rake rails db rollback activerecord'/><title type='text'>Howto: Run a rake task in sandbox mode</title><content type='html'>If you have a Rails rake task that somehow changes your DB data, but you want to be sure that the DB will be rolled back to its previous state after the rake task has completed, you can simply include this snippet right after your task definition:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/864117.js?file=rollback.rb"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;If you wonder where is this code coming from, it's directly from the rails console code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-2417965336599205661?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/2417965336599205661/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2011/03/howto-run-rake-task-in-sandbox-mode.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/2417965336599205661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/2417965336599205661'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2011/03/howto-run-rake-task-in-sandbox-mode.html' title='Howto: Run a rake task in sandbox mode'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-1083887192036312715</id><published>2011-01-28T14:34:00.004+01:00</published><updated>2011-01-28T14:40:23.407+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby rails rails3 activerecord habtm'/><title type='text'>Rails 3 scopes with HABTM (has and belongs to many) relations</title><content type='html'>There are already many posts about this, but maybe this simple example will help you understand this subject even better.&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/800262.js"&gt; &lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-1083887192036312715?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/1083887192036312715/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2011/01/rails-3-scopes-with-habtm-has-and.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/1083887192036312715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/1083887192036312715'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2011/01/rails-3-scopes-with-habtm-has-and.html' title='Rails 3 scopes with HABTM (has and belongs to many) relations'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-4717521773039700490</id><published>2011-01-18T16:03:00.001+01:00</published><updated>2011-01-18T16:10:54.150+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgresql ruby gem rubygems pg tricks tips'/><title type='text'>invalid option: --with-pg-dir=/opt/PostgreSQL/9.0</title><content type='html'>I'd bet a lot of ruby devs actually found themselves stuck in this problem. You checkout a github repo, you run a bundle install and = duh = a gem cannot install because of a missing library.&lt;br /&gt;You're sure you've already installed the library or dependency or whatever, but in a different path from the standard one (in this example I'm talking about PostgreSQL installed via the graphical installer instead of the ubuntu apt repo); so you issue the command&lt;br /&gt;&lt;br /&gt;gem install pg -v0.9.0 --with-pg-dir=/opt/PostgreSQL/9.0&lt;br /&gt;&lt;br /&gt;And you get this error message: invalid option: --with-pg-dir=/opt/PostgreSQL/9.0&lt;br /&gt;&lt;br /&gt;What's the problem? You need to separate options with another pair of dashes:&lt;br /&gt;&lt;br /&gt;gem install pg -v0.9.0 -- --with-pg-dir=/opt/PostgreSQL/9.0&lt;br /&gt;&lt;br /&gt;And everything will work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-4717521773039700490?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/4717521773039700490/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2011/01/just-reminder.html#comment-form' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/4717521773039700490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/4717521773039700490'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2011/01/just-reminder.html' title='invalid option: --with-pg-dir=/opt/PostgreSQL/9.0'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-3416109297315936963</id><published>2010-09-30T12:50:00.013+02:00</published><updated>2010-11-16T21:15:53.863+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby mysql rails table'/><title type='text'>Format the results of a MySQL query like MySQL! In Rails!</title><content type='html'>It may happen that you need to display the results of a MySQL query on a page. E.g., your customer asks you to add a report on a page, and you don't want to build a custom template, but just write the query and see the results.&lt;br /&gt;&lt;br /&gt;We can do this easily thanks to the terminal-table gem (see &lt;a href="http://github.com/visionmedia/terminal-table"&gt;http://github.com/visionmedia/terminal-table&lt;/a&gt;). This gem allows printing an ASCII table, just like the one you see when you use MySQL from the terminal. Look at its page on GitHub to see how easy it is.&lt;br /&gt;&lt;br /&gt;To integrate it with MySQL and Rails, we can use ActiveRecord::Base.connection.execute("some_sql_query"). This method extracts the result of our query to a Mysql::Result object, which consists of a set of hashes with the results of the query. We can navigate through this hashes iterating over the all_hashes method, and throw these results into a table. Here's the code:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/702423.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;So all we need to do is include our module and call the method print_results_of_query. Look at this example in script/console:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/702418.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;All you have to do if you want to put this in a page is wrap it into &amp;lt;% and %&amp;gt; markers in your .html.erb template. Have fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-3416109297315936963?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/3416109297315936963/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2010/09/format-results-of-mysql-query-like.html#comment-form' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/3416109297315936963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/3416109297315936963'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2010/09/format-results-of-mysql-query-like.html' title='Format the results of a MySQL query like MySQL! In Rails!'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-1399806528795807554</id><published>2010-07-02T08:18:00.001+02:00</published><updated>2010-07-02T08:20:00.991+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='screencast'/><category scheme='http://www.blogger.com/atom/ns#' term='textmate'/><title type='text'>SCREENCAST REVIEW - Vim for Rails Developers, by Ben Orenstein</title><content type='html'>(link: www.codeulatescreencasts.com)&lt;br /&gt;&lt;br /&gt;In the last months I've been working on a Rails project in an Agile team. I worked mostly on TextMate, and its speed is really amazing. It has a full set of features, with snippets, bundles, syntaxes and so on. It has many shortcuts, and apparently there's no need to switch away from TextMate.&lt;br /&gt;&lt;br /&gt;But, it has its drawbacks: it's a Mac only application, so I can't use it on my Linux box. Also, it's a commercial application, and even if its cost is not too high, I don't like to pay for software. Finally, it's a GUI application, and it cannot be used over SSH to work on a production machine.&lt;br /&gt;&lt;br /&gt;VIM always looked like the perfect answer to these needs - but yet, getting the productivity I reached after one full year of TextMate requires some time. Every time I tried using VIM for some serious work, I ended up discouraged, because even the most basic stuff like file navigation and launching tests took ages, compared to the snap of fingers of TextMate.&lt;br /&gt;&lt;br /&gt;I always like to challenge me though, so when I saw this screencast by Ben Orenstein I immediately decided to give it a try. And yes, it was a good decision!&lt;br /&gt;&lt;br /&gt;The screencast begins with some general hints about typing speed, keyboard layouts and Dvorak keyboards. Even if it may not look strictly related to the main subject of the screencast, I appreciated this part, and I think many people will find it useful.&lt;br /&gt;&lt;br /&gt;Then the video moves on to the vim-rails plugin by Tim Pope and highlights its main functionalities. Here you'll see clearly how this screencast is mostly intended to tell "stuff that matters" instead of just giving a plain list of features that you'll never use in ages.&lt;br /&gt;&lt;br /&gt;In this section, the screencast shows how to launch tests, navigate between files, and execute Rake commands directly from your VIM session. I think this plugin has really a lot of features, too many to be covered in this screencast; Ben managed to make a good choice, selecting the fundamentals you'll use everyday.&lt;br /&gt;&lt;br /&gt;Another amazing plugin is Snipmate: it allows to insert snippets of code by just inserting a few characters and hitting TAB. Ben quickly overviews it and shows its use - another must-have for TextMate aficionados like me ;)&lt;br /&gt;&lt;br /&gt;After this follows a section about ctags and their integration with Rails and VIM. This is also really useful, and combined with rails-vim it provides a quick way to navigate between project files.&lt;br /&gt;&lt;br /&gt;Finally, there's an overview of ACK - a grep replacement, focused on ease of use and speed - and its simple VIM integration. I'm also using Ack.mate, so I already knew it, and it's one of those tools you feel the lack of when you don't find it installed.&lt;br /&gt;&lt;br /&gt;Before ending the screencast, Ben also shows an overviews of single commands and configurations that he finds particularly useful. Again, they're being selected with usefulness in mind, so you'll end up with that "Wow, I need to try these now!" wonderful sensation.&lt;br /&gt;&lt;br /&gt;What else can I say? The screencast is well done, has a nice music, a simple and clean layout and it's spoken in a clear English ;) This should be obvious but I've found a lot of screencasts with crazily fast voices, so it's not so obvious :)&lt;br /&gt;&lt;br /&gt;To improve this screencast, I have nothing to say about its content: it's really great! I would only add some OSD with keys when key combinations are being explained, so that it could be even simpler to memorize them.&lt;br /&gt;&lt;br /&gt;I would definitely recommend this to any Rails developer wanting to try VIM, or to any VIM user who is starting to code Rails and wants to boost his productivity. It has a good amount of tricks and hints that can be useful both for the VIM neophyte and the VIM master starting a Rails project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-1399806528795807554?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/1399806528795807554/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2010/07/screencast-review-vim-for-rails.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/1399806528795807554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/1399806528795807554'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2010/07/screencast-review-vim-for-rails.html' title='SCREENCAST REVIEW - Vim for Rails Developers, by Ben Orenstein'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-8325855771690496657</id><published>2010-05-14T14:14:00.009+02:00</published><updated>2010-11-16T21:18:51.989+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='todo'/><category scheme='http://www.blogger.com/atom/ns#' term='textmate'/><category scheme='http://www.blogger.com/atom/ns#' term='syntax'/><title type='text'>TextMate Syntax Highlighting Howto: A simple todo list</title><content type='html'>&lt;p&gt;Today I wanted to add a syntax highlight for my todo list favourite format to TextMate. &lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XPYUQVFU0pU/S-1AWa--6HI/AAAAAAAAEpg/2l_vtTV49Q4/s1600/Schermata+2010-05-14+a+14.20.55.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 80px;" src="http://3.bp.blogspot.com/_XPYUQVFU0pU/S-1AWa--6HI/AAAAAAAAEpg/2l_vtTV49Q4/s320/Schermata+2010-05-14+a+14.20.55.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5471099876269811826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Here's how to do it. In TextMate, go to Bundles, then Bundles Editor, then Edit Languages...&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Click on the plus button in the lower left corner and choose "New Language". Paste the following code in place of the example code provided.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/702430.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This defines three patterns for each condition. They should be self-explanatory, I used only simple regexps here. Save your language definition, and it should appear in the languages combo of your Textmate.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;To complete syntax highlighting, you also have to add the colors to your current textmate theme. In the application menu, go to Textmate, then Preferences, then Fonts &amp; Colors. For each pattern name, click the plus button and create a new element. It must have the pattern name as scope selector. Choose colors as you like.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XPYUQVFU0pU/S-1CFirQNjI/AAAAAAAAEpw/RjteBwVjrgo/s1600/Schermata+2010-05-14+a+14.28.17.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 190px;" src="http://2.bp.blogspot.com/_XPYUQVFU0pU/S-1CFirQNjI/AAAAAAAAEpw/RjteBwVjrgo/s320/Schermata+2010-05-14+a+14.28.17.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5471101785300022834" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;References: &lt;br/&gt;&lt;br /&gt;&lt;a href="http://manual.macromates.com/en/language_grammars#example_grammar" target="_new"&gt;Textmate help&lt;/a&gt;&lt;br /&gt;&lt;a href="http://macdevcenter.com/pub/a/mac/2007/04/11/customizing-textmate.html" target="_new"&gt;Mac Dev Center&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-8325855771690496657?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/8325855771690496657/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2010/05/textmate-syntax-highlighting-howto.html#comment-form' title='3 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/8325855771690496657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/8325855771690496657'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2010/05/textmate-syntax-highlighting-howto.html' title='TextMate Syntax Highlighting Howto: A simple todo list'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_XPYUQVFU0pU/S-1AWa--6HI/AAAAAAAAEpg/2l_vtTV49Q4/s72-c/Schermata+2010-05-14+a+14.20.55.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-7766531482157274559</id><published>2010-04-23T08:23:00.008+02:00</published><updated>2010-11-16T21:21:02.803+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='monkey patching'/><category scheme='http://www.blogger.com/atom/ns#' term='mixin'/><category scheme='http://www.blogger.com/atom/ns#' term='examples'/><category scheme='http://www.blogger.com/atom/ns#' term='metaprogramming'/><title type='text'>Ruby Mixin and monkey patching examples</title><content type='html'>&lt;span class="Apple-style-span"   style="  ;font-family:Times;font-size:medium;"&gt;&lt;pre    style="background-color: transparent; border-top-width: 1px; border-top-style: none; border-top-color: rgb(204, 204, 204); border-bottom-width: 1px; border-bottom-style: none; border-bottom-color: rgb(204, 204, 204); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px;   margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-right-style: none; border-left-style: none; border-width: initial; border- overflow-x: auto; overflow-y: auto; font-family:'Bitstream Vera Sans Mono', monospace;font-size:13px;color:initial;"&gt;&lt;span class="Apple-style-span"   style=" white-space: normal;  font-family:Times;font-size:medium;"&gt;Let's explore a couple of solutions to dynamically add a &lt;/span&gt;&lt;span class="Apple-style-span"  style="white-space: normal;  font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;split_by_half&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"   style=" white-space: normal;  font-family:Times;font-size:medium;"&gt; behaviour to an array object. The first technique is the &lt;a href="http://en.wikipedia.org/wiki/Mixin"&gt;mixin&lt;/a&gt;: it allows to add the method to a single array instance. The second one is called &lt;a href="http://en.wikipedia.org/wiki/Monkey_patch"&gt;monkey patching&lt;/a&gt;, and adds the method directly to the Array class, adding this behaviour to every array instance.&lt;/span&gt;&lt;/pre&gt;&lt;pre    style="background-color: transparent; border-top-width: 1px; border-top-style: none; border-top-color: rgb(204, 204, 204); border-bottom-width: 1px; border-bottom-style: none; border-bottom-color: rgb(204, 204, 204); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px;   margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-right-style: none; border-left-style: none; border-width: initial; border- overflow-x: auto; overflow-y: auto; font-family:'Bitstream Vera Sans Mono', monospace;font-size:13px;color:initial;"&gt;&lt;span class="Apple-style-span"   style=" white-space: normal;  font-family:Times;font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/702437.js"&gt; &lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-7766531482157274559?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/7766531482157274559/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2010/04/ruby-mixin-and-monkey-patching-examples.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/7766531482157274559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/7766531482157274559'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2010/04/ruby-mixin-and-monkey-patching-examples.html' title='Ruby Mixin and monkey patching examples'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-4725122646082085816</id><published>2010-04-12T09:08:00.005+02:00</published><updated>2010-04-23T08:39:34.238+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='build'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='chromium'/><category scheme='http://www.blogger.com/atom/ns#' term='latest'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>Script to download the latest Chromium build for OSX</title><content type='html'>&lt;script type="syntaxhighlighter" class="brush: bash"&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;latest="$(curl http://build.chromium.org/buildbot/snapshots/chromium-rel-mac/LATEST)"&lt;br /&gt;echo "Getting release $latest..."&lt;br /&gt;download="Y"&lt;br /&gt;if [ -e chrome-$latest-mac.zip ]; then&lt;br /&gt; echo "File chrome-$latest-mac.zip already exist, should I download it again? Y/N"&lt;br /&gt; echo -n " &gt; "&lt;br /&gt; read download&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;if [ $download = "Y" ]; then&lt;br /&gt; touch chrome-$latest-mac.zip&lt;br /&gt; curl http://build.chromium.org/buildbot/snapshots/chromium-rel-mac/$latest/chrome-mac.zip &gt; chrome-$latest-mac.zip&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;if [ -d chrome-mac ]; then rm -rf chrome-mac ; fi&lt;br /&gt;echo "Ready to install release $latest, ok? Y/N"&lt;br /&gt;echo -n " &gt; "&lt;br /&gt;read command&lt;br /&gt;if [ $command = 'Y' ]; then&lt;br /&gt; echo "Unzipping chrome-$latest-mac.zip..."&lt;br /&gt; unzip chrome-$latest-mac.zip&lt;br /&gt; echo "Creating backup copy of /Applications/Chromium.app in /tmp/chromium-old.app..."&lt;br /&gt; mv /Applications/Chromium.app /tmp/chromium-old.app&lt;br /&gt; echo "Installing release $latest in /Applications/Chromium.app..."&lt;br /&gt; mv chrome-mac/Chromium.app /Applications/&lt;br /&gt; rm -rf chrome-mac&lt;br /&gt; echo "Done!"&lt;br /&gt;fi&lt;br /&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-4725122646082085816?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/4725122646082085816/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2010/04/script-to-download-latest-chromium.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/4725122646082085816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/4725122646082085816'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2010/04/script-to-download-latest-chromium.html' title='Script to download the latest Chromium build for OSX'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-8534254855333607562</id><published>2010-02-22T14:51:00.002+01:00</published><updated>2010-02-23T10:34:32.802+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='estimating'/><category scheme='http://www.blogger.com/atom/ns#' term='planning'/><title type='text'>The way we plan</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: arial; font-size: small; "&gt;In our Agile team, we have iterations lasting one week, and we plan our work every Monday morning. Our customer comes to our office, we gather around a table, and we watch the project backlog to choose the new stories to be worked in the current week.&lt;div&gt;For the majority of the User Stories, we already have an estimate made at the beginning of the project. This estimate has been made in Story Points, and sometimes it's really inaccurate, because when we started our project some features looked really different to our eyes; so, we have to re-estimate these stories. For this we use another measuring unit, the Pomodoro (look &lt;a href="http://www.pomodorotechnique.com/"&gt;here&lt;/a&gt; if you don't know what I'm talking about).&lt;/div&gt;&lt;div&gt;After these estimates, we decide with our customer which user stories are to be worked in the current iteration, trying to balance the business value and the stories costs. We plan stories to fit our work capacity for the iteration (e.g., 3 developer pairs work each 10 pomodori per day, so in a week we can plan 150 pomodori/pair).&lt;/div&gt;&lt;div&gt;Of course, when we discuss features with the customers, some new stories may be introduced, some could get splitted, and some others delayed for future releases.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There's something wrong with this. First of all, estimating in Pomodori needs a lot of deep analysis to be made to get to an accurate estimate. This slows the estimating process a lot, because we end up talking about implementation details. Of course our customer gets bored soon, as he's not a technical customer. We introduced this way of estimating after the first iterations of the project, because we were estimating using Story Points, and we were having a very low accuracy; later, we never tried to switch back to Story Points, even if now our accuracy could have improved. Just to mess things up, we also use a "fake" Story Point measuring, obtained just multiplying pomodori by 10.  So we estimate 10 pomodori, and we write 1 story point. Using the Real Story Points could speed up our planning work a lot, because we could step up by an order of magnitude, and estimate user stories comparing them with the ones already worked.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another problem we are having is that we're splitting stories too much. We're following a rule of thumb, like "no stories bigger than 2 points". Such a rule had been voted in a retrospective, after a couple of weekly fails. We had some big stories (like 4 points stories) not being accepted by our customer because of minor issues; so we decided to split them up, to minimize the impact of a rejected user story on the iteration score. The wrong thing with this approach is that we're just changing the way of measuring our system to obtain better measures. Think about it: an iteration ends, and you discover a bug during the demo. Of course you'll have to fix it in the following iteration, and of course this will cost you some additional work. If the iteration scores are 2-10 or 5-7, nothing changes in the system; you still would need to do some additional work. The only thing changing is a couple of numbers written on a spreadsheet. Also, different iteration scores would impact only on the short term velocity, and would instead have no effect on the long term velocity. The short term measure gives no confidence and is much less important than the long term one, so there's no need of getting better short term results. This "hack" on measuring, in our case, is also introducing new problems. We spend time thinking about ways to correctly split stories, we introduce unneeded dependencies and we get to stories which are really difficult to demonstrate to the customer.&lt;/div&gt;&lt;div&gt;  &lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-8534254855333607562?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/8534254855333607562/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2010/02/way-we-plan.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/8534254855333607562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/8534254855333607562'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2010/02/way-we-plan.html' title='The way we plan'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-7999344421223420901</id><published>2009-09-03T09:56:00.006+02:00</published><updated>2010-04-23T08:43:22.010+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='ActiveRecord'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Some ActiveRecord fun</title><content type='html'>&lt;p&gt;Many of you have already used &lt;code&gt;has_many&lt;/code&gt; and &lt;code&gt;belongs_to&lt;/code&gt; Active Record relationships. This is really easy to do when you have a single attribute to map; like, in example, an Article with many Comments. You’d write something like&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush: ruby"&gt;&lt;code&gt;class Article &amp;lt; ActiveRecord::Base&lt;br /&gt;  has_many :comments&lt;br /&gt;  ...&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;pre class="brush: ruby"&gt;&lt;code&gt;class Comment &amp;lt; ActiveRecord::Base&lt;br /&gt;  belongs_to :article&lt;br /&gt;  ...&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Combining these declarations with a &lt;code&gt;article_id&lt;/code&gt; column in your comments table would allow you to:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;access all the comments of an article with &lt;code&gt;article.comments&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;access the article a comment belongs to with &lt;code&gt;comment.article&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;There are situations, however, when things get a little more tricky. Think about this example: you have a Movement object, which identifies a cash flow between two Accounts. You also have an accounts table; so, in your movements table, you would add columns like &lt;code&gt;from_account_id&lt;/code&gt; and &lt;code&gt;to_account_id&lt;/code&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;How can this be mapped with ActiveRecord? We need to write two &lt;code&gt;belongs_to&lt;/code&gt; declaration, this way:&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush: ruby"&gt;&lt;code&gt;class Movement &amp;lt; ActiveRecord::Base&lt;br /&gt;  belongs_to :from_account, :class_name =&amp;gt; "Account", :foreign_key =&amp;gt; "from_account_id"&lt;br /&gt;  belongs_to :to_account,   :class_name =&amp;gt; "Account", :foreign_key =&amp;gt; "to_account_id"&lt;br /&gt;  ...&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;This tells ActiveRecord that the movement class must reference two Account objects. One is accessed with &lt;code&gt;movement.from_account&lt;/code&gt; and the other with &lt;code&gt;movement.to_account&lt;/code&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;You can do the same thing for your Account class:&lt;/p&gt;&lt;br /&gt;&lt;pre class="brush: ruby"&gt;&lt;code&gt;class Account &amp;lt; ActiveRecord::Base&lt;br /&gt;  has_many :movements_out, :class_name =&amp;gt; "Movement", :foreign_key =&amp;gt; "from_account_id"&lt;br /&gt;  has_many :movements_in, :class_name  =&amp;gt; "Movement", :foreign_key =&amp;gt; "to_account_id"&lt;br /&gt;  ...&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;This way, with &lt;code&gt;account.movements_in&lt;/code&gt;, you can get all the cash flows to the account, and with &lt;code&gt;account.movements_out&lt;/code&gt; all the cash flows going out of the account.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Plain and simple! :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-7999344421223420901?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/7999344421223420901/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2009/09/some-activerecord-fun_03.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/7999344421223420901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/7999344421223420901'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2009/09/some-activerecord-fun_03.html' title='Some ActiveRecord fun'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-3526655648260443373</id><published>2009-08-15T14:33:00.005+02:00</published><updated>2011-02-23T12:29:53.209+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='autospec'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='bdd'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Autospec for Rails + libnotify on ubuntu howto</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_XPYUQVFU0pU/SoatRsbd0wI/AAAAAAAAAWw/2xoqidPMMDE/s1600-h/rails_success.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 137px;" src="http://4.bp.blogspot.com/_XPYUQVFU0pU/SoatRsbd0wI/AAAAAAAAAWw/2xoqidPMMDE/s320/rails_success.png" alt="" id="BLOGGER_PHOTO_ID_5370170125181637378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Hallo! After a couple of hours of work I finally managed to get autospec popup notifications on my ubuntu machine. Now I can start autotest in the background, and whenever I save a file into my project folder, after a few seconds I receive a notification message on my desktop about the tests.&lt;br /&gt;Here are the steps to get the same result:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;install the required gems (&lt;span style="font-family: courier new;"&gt;ZenTest&lt;/span&gt;, and obviously &lt;span style="font-family: courier new;"&gt;rspec&lt;/span&gt; and &lt;span style="font-family: courier new;"&gt;rspec-rails&lt;/span&gt;);&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: courier new;"&gt;sudo aptitude install libnotify-bin&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;edit the file .autotest in your home folder (I said home, not the root of your project!) with the content from this link: &lt;a href="https://gist.github.com/840314"&gt;https://gist.github.com/840314&lt;/a&gt;&lt;/li&gt;&lt;li&gt;save the two pictures &lt;span style="font-family: courier new;"&gt;rails_ok.png&lt;/span&gt; and &lt;span style="font-family: courier new;"&gt;rail_fail.png&lt;/span&gt; from &lt;a href="http://blog.internautdesign.com/2006/11/12/autotest-growl-goodness"&gt;http://blog.internautdesign.com/2006/11/12/autotest-growl-goodness&lt;/a&gt; and put them into your ~/Pictures/rails folder.&lt;/li&gt;&lt;/ol&gt;At this point you are supposed to only run autospec in your project root folder, save a file and see a notification like the one at the top of this article! Happy BDD!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-3526655648260443373?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/3526655648260443373/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2009/08/autospec-for-rails-libnotify-on-ubuntu.html#comment-form' title='3 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/3526655648260443373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/3526655648260443373'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2009/08/autospec-for-rails-libnotify-on-ubuntu.html' title='Autospec for Rails + libnotify on ubuntu howto'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_XPYUQVFU0pU/SoatRsbd0wI/AAAAAAAAAWw/2xoqidPMMDE/s72-c/rails_success.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-6461737754473050275</id><published>2009-08-09T15:44:00.003+02:00</published><updated>2009-08-09T16:25:34.135+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='italian'/><category scheme='http://www.blogger.com/atom/ns#' term='italian passwords'/><category scheme='http://www.blogger.com/atom/ns#' term='pronounceable passwords'/><title type='text'>Building a pronounceable password generator in Ruby</title><content type='html'>Heya guys! Today I tried to build a pronounceable password generator. To keep it simple, I started from a simple concatenation of words - in my case, italian words. This is really easy, but you'll see that results will be very good.&lt;br /&gt;&lt;br /&gt;I took a list of italian words from this site: &lt;a href="http://members.xoom.virgilio.it/trasforma/ispell/"&gt;Italian dictionary and affix file for ispell&lt;/a&gt;. It's a good choice because ispell dictionaries are prepared to be declined; concatenating two words without suffixes will give good results for pronounceability.&lt;br /&gt;&lt;br /&gt;Before proceeding, however, I needed to narrow the words list:&lt;br /&gt;&lt;br /&gt;I removed the ispell affix definitions, to get words like "abaco" instead of "abaco/G":&lt;blockquote style="color: rgb(51, 0, 153);"&gt;&lt;span style="font-family: courier new;"&gt;cat italian.words | sed 's/\/[A-Z]*//g' &gt; parole.txt&lt;/span&gt;&lt;/blockquote&gt;I removed all words containing capital letters, like "Yamaha", "Windows", and "Acicastello":&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote style="color: rgb(51, 0, 153);"&gt;cat parole.txt | sed '/[a-z]*[A-Z][a-z]*/d' &gt; paroleNoCapital.txt&lt;/blockquote&gt;Finally, I sedded out some cuss words - not writing them here, for the sake of decency! :)&lt;br /&gt;&lt;br /&gt;I was then ready to write the following ruby script:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="color: rgb(51, 0, 153);"&gt;def genera_pass_da(parole, n = 2)&lt;br /&gt;    how_many_words = parole.size&lt;br /&gt;    word = ''&lt;br /&gt;    1.upto(n) do&lt;br /&gt;      word += parole[rand(how_many_words)].chomp&lt;br /&gt;    end&lt;br /&gt;    word&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;file = File.open("parole.txt")&lt;br /&gt;parole = file.lines.to_a.select { |word| word.size &lt; 7 }&lt;br /&gt;1.upto(10) do&lt;br /&gt;  puts genera_pass_da parole&lt;br /&gt;end&lt;/blockquote&gt;Even if it's far from being polished and optimized, launching this gives a good set of pronounceable passwords. They're all lowercase and without numbers - so probably not the best choice for your remote banking account - but still ok for other uses. Here's a shot:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;metalelf0@eagleone$ ruby rapg.rb &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;uditovoi&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;vammimidi&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;gechitua&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;dareisisma&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;ecoivi&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;ancabatto&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;unotacca&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;fangopupe&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;apesella&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;bemasire&lt;/span&gt;&lt;/blockquote&gt;Someday I'll improve it by adding numbers, some capital letters, customizing choices and so on - but many friends are yelling me that it's sunday and I need to go out, so... see ya soon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-6461737754473050275?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/6461737754473050275/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2009/08/building-pronounceable-password.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/6461737754473050275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/6461737754473050275'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2009/08/building-pronounceable-password.html' title='Building a pronounceable password generator in Ruby'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-5661389845042384269</id><published>2009-06-28T10:44:00.004+02:00</published><updated>2009-06-29T10:01:04.428+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shared pomodoro'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='pomodoro'/><category scheme='http://www.blogger.com/atom/ns#' term='pomodoro technique'/><title type='text'>Shared pomodoro part II</title><content type='html'>&lt;img style="float:left; margin:0 10px 10px 0;cursor:hand;width: 252px; height: 189px;" src="http://mindshortcut.com/wp-content/uploads/2008/10/pomodoro-technique.jpg" border="0" alt="" /&gt;&lt;br /&gt;Last month I posted an article about the Shared Pomodoro, a shared timer for all the members of an Agile team. By sharing a common timer, all the team members can have pauses at the same time; so, there's nobody hanging around speaking or joking when someone else is working.&lt;br /&gt;&lt;br /&gt;We are trying to apply this in our Agile team, without much success. The main area of debate is focused on pauses: a lot of times the developers keep working for 1-2 minutes after the ring of the timer, and then they want to take a 5 minutes break like their team partners. But in a shared timer environment, this is not possible. Shared pomodoro should also mean shared pauses.&lt;br /&gt;&lt;br /&gt;Also, when somebody is on a difficult task at the end of a pomodoro, and wants to finish it before having a pause, it's common that he needs more focus and concentration. This is really difficult if the other developers are pausing, and talking loudly in the same room.&lt;br /&gt;&lt;br /&gt;Another problem we had with pauses was that they sometimes extended after 5 minutes.&lt;br /&gt;In our latest retrospective, a week ago, we decided to ban the usage of personal laptops during the 5-minutes break, to remove on of the most common sources of oversized pauses. However, some of the pauses lasted more anyway, because somebody was going out of the room to get a snack, smoke a cigarette, go to the toilet and so on. &lt;br /&gt;&lt;br /&gt;Personally, I don't think that forcing all the team members to finish exactly at the same time and start over exactly at the same time could be more productive than leaving each couple free to take its own rhythm. If a couple works 28 minutes and then takes a 5 minutes pause, they're not working less than a couple doing 25-5. But I think that the couple working 28 minutes still needs a 5 minutes pause, and it wouldn't be correct to force them to a 2 minutes pause just to keep the shared pomodoro rhythm alive. I know that the strict application of the Pomodoro Technique would prohibit any work after 25 minutes, but in my experience I think this doesn't compromise the technique effectiveness too much. After all, the technique leaves space for flexibility in the pauses duration (both short and long pauses), so even applying it strictly could lead to not synchronized couples.&lt;br /&gt;&lt;br /&gt;I've read on the Pomodoro Technique official mailing list (&lt;a href="http://tinyurl.com/l55un2"&gt;http://tinyurl.com/l55un2&lt;/a&gt;) that some other teams tried using a shared pomodoro without much success. At this point, I think the best solution is having a pomodoro for each couple. It has its downsides too, but IMHO they can be overcome much more easily.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-5661389845042384269?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/5661389845042384269/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2009/06/shared-pomodoro-part-ii.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/5661389845042384269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/5661389845042384269'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2009/06/shared-pomodoro-part-ii.html' title='Shared pomodoro part II'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-8755924637411012204</id><published>2009-05-21T09:29:00.005+02:00</published><updated>2009-06-29T10:00:27.261+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='team building'/><category scheme='http://www.blogger.com/atom/ns#' term='football'/><category scheme='http://www.blogger.com/atom/ns#' term='developers'/><category scheme='http://www.blogger.com/atom/ns#' term='junior'/><title type='text'>Don't leave juniors on the bench</title><content type='html'>&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 235px; height: 144px;" src="http://farm4.static.flickr.com/3157/3102358906_c68e76b614.jpg" border="0" alt="" /&gt;&lt;br /&gt;Recently I've read many articles about how to choose the best junior developers, and how to train them. This is an hot topic for project managers, as they need to have good and cheap developers: usually, this also means "young" developers.&lt;br /&gt;&lt;br /&gt;I still haven't found any article, though, approaching this subject from a psychological point of view. Typically, these writings are about technical training, or maybe about how to productively insert a junior resource into a team: but not about how to make the junior motivated to give everything for the project.&lt;br /&gt;&lt;br /&gt;I think it's a really different situation from inserting an already expert developer into a team. A young developer still needs to understand almost everything about team work, daily planning, and so on. Sometimes universities don't give them any hint about the situation they'll find in a real work place, so it's time for them to find out. I suggest, let them find out the hard way.&lt;br /&gt;&lt;br /&gt;A young developer needs to be involved in all the team activities. He really should be able to write a lot of code, discuss planning, design and so on, since the start of his work in the project. In an agile team, this means that he should write code at least as often as he drives his pair; he should be able to speak while the team writes down user stories, and participate actively to retrospectives.&lt;br /&gt; &lt;br /&gt;Don't care too much about the impact this could have on both the developer and your team: in the worst case, you'll have a small loss of productivity, but we'll discuss this in detail later in this article.&lt;br /&gt;&lt;br /&gt;I think a good analogy can be done with football. Yeah, I wrote football - after all, it's a team game, where the cohesion between all the team members is important to achieve success.&lt;br /&gt;&lt;br /&gt;In a football team, as players get old, young players come in, and they need to be inserted into the first team. This process can be really difficult, no matter how good the young players are: for a coach, leaving the 33 years old world-class striker on the bench and throwing the 17 years old promise on the field, could result in both a success or a failure covered with critics.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;However, if you ask any football coach what's the best way for young players to improve, they will answer the same: experience. They need to *play*. A young player, if left on the bench, can not grow, even if he has the chance to train with the best footballers in the world. He needs to feel the adrenaline of important matches, receive the ball and face the toughest opponents.&lt;br /&gt;&lt;br /&gt;Going back to our junior developer, it's exactly the same situation. If you want him to improve, you must not leave him on the bench, thinking that time will help him. &lt;br /&gt;&lt;br /&gt;Such a cautious and mild approach could result in a demotivated young resource, compromising both his morale and his productivity. Also, you'll need a lot of time to evaluate his real skills.&lt;br /&gt;&lt;br /&gt;You should let him code, even if he's half as fast as your other developers, and hear his opinion about the practices of your team. Involve him in all the team activities, and try to teach him what he needs to start working with your team.&lt;br /&gt;Obviously, this can be done only if he has at least some basic skills, but choosing the best young resources is another topic - I won't dwelve into this right now.&lt;br /&gt;&lt;br /&gt;Maybe you'll realize he's such a good developer that after some weeks he'll be perfectly inserted in the team, contributing interesting ideas and giving a productivity boost, but even if this takes more time, it's the right thing to do.&lt;br /&gt;&lt;br /&gt;Such a steep approach is obviously not productive in the first weeks, but as time goes on, you'll be able to evaluate better not only the technical skills of your junior, but also his resistance to pressure and work load. These characteristics are as important as the technical skills, maybe even more, so finding them out is definitely useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-8755924637411012204?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/8755924637411012204/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2009/05/dont-leave-juniors-on-bench.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/8755924637411012204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/8755924637411012204'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2009/05/dont-leave-juniors-on-bench.html' title='Don&apos;t leave juniors on the bench'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3157/3102358906_c68e76b614_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-3545468505790130931</id><published>2009-05-11T11:04:00.003+02:00</published><updated>2009-05-11T11:11:23.893+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='pomodoro'/><category scheme='http://www.blogger.com/atom/ns#' term='technique'/><title type='text'>Shared pomodoro - to share or not to share?</title><content type='html'>Last week a very interesting discussion emerged in our Agile Team. We are 10 developers, and we all work in the same room. We use the popular "&lt;span style="font-style:italic;"&gt;Pomodoro Technique&lt;/span&gt;", conceived by Francesco Cirillo, to organize our daily work. If you have never heard about it, visit &lt;a href="http://www.pomodorotechnique.com"&gt;www.pomodorotechnique.com&lt;/a&gt;; shortly, its main characteristic is that it divides the daily work into very small iterations called &lt;span style="font-style:italic;"&gt;pomodori&lt;/span&gt;, all of 25 minutes, separated by regular pauses of 5 minutes.&lt;br /&gt;&lt;br /&gt;The technique works really well; we had some discussions about the nature of timers - somebody loved the kitchen mechanical ones, somebody else was irritated by their ringing sound and preferred software timers. But apart from this, there were no problems.&lt;br /&gt;&lt;br /&gt;A month ago, we added two couples of developers to our team. The new guys came from another popular Agile team, and they proposed the idea of a "shared &lt;span style="font-style:italic;"&gt;pomodoro&lt;/span&gt;": an unique timer being shared by the whole team. The &lt;span style="font-style:italic;"&gt;Pomodoro Technique&lt;/span&gt; defines clearly how to setup work iterations and pauses, and it's also really strict about the need of stopping work exactly after 25 minutes; so, there's no reason for not synchronizing all the developers.&lt;br /&gt;&lt;br /&gt;Before this fact, we didn't follow the technique too strictly; somebody prefered to work for 50 minutes and take a longer pause thereafter; others used &lt;span style="font-style:italic;"&gt;pomodori&lt;/span&gt; just to track their work, without caring too much about pauses duration.&lt;br /&gt;&lt;br /&gt;As you can imagine, the shared &lt;span style="font-style:italic;"&gt;pomodoro&lt;/span&gt; is quite difficult to apply in such an environment.&lt;br /&gt;&lt;br /&gt;Let's try to summarize briefly the advantages of a shared &lt;span style="font-style:italic;"&gt;pomodoro&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;- pauses are shared too, so the whole team can have a pause together;&lt;br /&gt;- when you're working, everybody else is working too; so, you don't have distractions from other people having a pause;&lt;br /&gt;- there's more discipline: all the developers have to keep the same rhythm, even if they're tired;&lt;br /&gt;- the team actually behaves like a team, and this common practices may increase the cohesion between the team members.&lt;br /&gt;&lt;br /&gt;The disadvantages of the shared &lt;span style="font-style:italic;"&gt;pomodoro&lt;/span&gt; are almost symmetric:&lt;br /&gt;&lt;br /&gt;- if you *really* need to take a pause, for any reason, you break the team rhythm;&lt;br /&gt;- if you want to work for more than 25 minutes without a pause, you can't;&lt;br /&gt;- every time there's a pause, the whole team has to wait for all the team members coming back to the open space (but hey, this is called discipline!);&lt;br /&gt;- the team behavior looks more chaotic, and it's more difficult to organize common activities.&lt;br /&gt;&lt;br /&gt;So it's mostly a choice between discipline and relaxed rules. It's not easy to choose which solution is the best for you, or which one will give you more productivity. The author of the &lt;span style="font-style:italic;"&gt;pomodoro technique&lt;/span&gt;, Francesco Cirillo, reports that studies have been made to find the maximum time a human brain can keep concentrated on a single subject, and the average value found out is 25 minutes. So, if his theory is right, following the technique strictly is the best way to keep concentrated, work better and consequentially improve productivity.&lt;br /&gt;&lt;br /&gt;Enough said? Not exactly. In the previous statement, there's an important word: "average". This means that the "25 minutes" value is not the same for everyone, or for any situation. Sometimes it may happen that you work on a really hard subject, and after a &lt;span style="font-style:italic;"&gt;pomodoro&lt;/span&gt; of work you need a slightly longer pause, because you're tired; some other times, you're feeling a good rhythm, with many tests passing, and you want to take a shorter pause. This kind of behaviour is definitely not compatible with a shared &lt;span style="font-style:italic;"&gt;pomodoro&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;If you want to decide whether a shared &lt;span style="font-style:italic;"&gt;pomodoro&lt;/span&gt; is right for your team, try to ask your team members how confident they are with the rhythm described by Francesco Cirillo. If they're already using the technique strictly and they feel confident with it, you can try out the shared &lt;span style="font-style:italic;"&gt;pomodoro&lt;/span&gt; for a month or so, and then decide whether yo keep it or not. Otherwise, you can try to tend to it, if you feel that your team is too chaotic.&lt;br /&gt;&lt;br /&gt;The only approach I find not correct is imposing a shared &lt;span style="font-style:italic;"&gt;pomodoro&lt;/span&gt; from above, without asking any opinion to the team members. This may lead to unhappy team members, cause they could feel their freedom and creativity is constrained by a timer. If all of your team members feel like this, maybe you should put the shared &lt;span style="font-style:italic;"&gt;pomodoro&lt;/span&gt; apart - or find other team members! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-3545468505790130931?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/3545468505790130931/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2009/05/shared-pomodoro-to-share-or-not-to.html#comment-form' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/3545468505790130931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/3545468505790130931'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2009/05/shared-pomodoro-to-share-or-not-to.html' title='Shared pomodoro - to share or not to share?'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-3944387373672173909</id><published>2008-09-25T11:35:00.003+02:00</published><updated>2008-09-25T11:37:41.751+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='couchdb'/><category scheme='http://www.blogger.com/atom/ns#' term='benchmark'/><title type='text'>MySQL - CouchDB performance comparison</title><content type='html'>Here you are with the results of our benchmarks!&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe src='http://docs.google.com/EmbedSlideshow?docid=dgpgwtph_31x735rzg7' frameborder='0' width='410' height='342'&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-3944387373672173909?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/3944387373672173909/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/mysql-couchdb-performance-comparison.html#comment-form' title='4 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/3944387373672173909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/3944387373672173909'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/mysql-couchdb-performance-comparison.html' title='MySQL - CouchDB performance comparison'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-3279338227312544062</id><published>2008-09-24T12:47:00.003+02:00</published><updated>2008-09-24T12:55:43.360+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='couchdb'/><category scheme='http://www.blogger.com/atom/ns#' term='benchmark'/><title type='text'>CouchDB performance testing: first results</title><content type='html'>We are trying to test the performances of CouchDB by measuring the times it takes to execute a query (=a view) in different conditions.&lt;br /&gt;&lt;br /&gt;We used a modified version of the default test suite - I'm not posting it now cause the code isn't very readable, but if you need it, just ask and I'll fix it up.&lt;br /&gt;&lt;br /&gt;In this version we put some functions to create a named view and execute it with a single argument; then we ran the test suite from the Futon utility, we collected execution times from the test suite and put them into &lt;a href="http://spreadsheets.google.com/pub?key=pqlRY38EsJ8cURe1QFY0NYg"&gt;a google document&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Results show more shadows than lights: the database is fast when executing queries already indexed, but it's really slow into creating indexes.&lt;br /&gt;&lt;br /&gt;We are working to expand this test with different sample-data size. So keep in touch!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-3279338227312544062?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/3279338227312544062/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/couchdb-performance-testing-first.html#comment-form' title='4 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/3279338227312544062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/3279338227312544062'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/couchdb-performance-testing-first.html' title='CouchDB performance testing: first results'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-2311210260345418755</id><published>2008-09-24T11:14:00.002+02:00</published><updated>2008-09-24T11:17:21.173+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='named views'/><category scheme='http://www.blogger.com/atom/ns#' term='freemind'/><category scheme='http://www.blogger.com/atom/ns#' term='ad-hoc views'/><category scheme='http://www.blogger.com/atom/ns#' term='couchdb'/><category scheme='http://www.blogger.com/atom/ns#' term='views'/><title type='text'></title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://img151.imageshack.us/img151/945/viewsdc6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 373px; height: 38px;" src="http://img151.imageshack.us/img151/945/viewsdc6.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here is a mind map I made to explain the differences between CouchDB views. Thanks to FreeMind application!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-2311210260345418755?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/2311210260345418755/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/here-is-small-i-hope-not-too-small.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/2311210260345418755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/2311210260345418755'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/here-is-small-i-hope-not-too-small.html' title=''/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-1750490585089282242</id><published>2008-09-24T08:42:00.003+02:00</published><updated>2008-09-24T09:02:21.113+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='named views'/><category scheme='http://www.blogger.com/atom/ns#' term='futon'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='couchdb'/><category scheme='http://www.blogger.com/atom/ns#' term='views'/><category scheme='http://www.blogger.com/atom/ns#' term='couchdb4j'/><title type='text'>Yesterday... and plans for today</title><content type='html'>Yesterday we completed two user stories of our project in java using couchdb4j:&lt;br /&gt;&lt;br /&gt;- add a custom field and be able to see it in listings;&lt;br /&gt;- find records by a specific field.&lt;br /&gt;&lt;br /&gt;Then we switched to a more difficult task: evaluate the performance differences between CouchDB and MySQL. It's a difficult task because the two databases are logically very different, and it's not easy to find the common operations to test and compare.&lt;br /&gt;&lt;br /&gt;In example, the "find" operation in MySQL can be done with a query; it can be a compiled query or an interpreted one.&lt;br /&gt;In CouchDB we need to create a view function and execute it; we can have "named" views - that resemble the MySQL compiled queries - and temporary views, that are executed on demand.&lt;br /&gt;&lt;br /&gt;In the CouchDB Futon utility - the web application builtin with CouchDB - it is possible to run a suite of tests and see their execution time.&lt;br /&gt;Editing the file /usr/local/share/couchdb/www/script/couch_tests.js it is possible to modify the default tests or to add new ones, so we quickly wrote a new javascript function to check the execution time of a named view.&lt;br /&gt;&lt;br /&gt;Our results were really poor for the first access, when the view is created - around 1 second to create a view on a single field, for a database with only 5000 records; after the view was created, access times were much slower, in the range of 5 to 15 ms.&lt;br /&gt;&lt;br /&gt;I don't know if this problem is related to any error we made in the test-writing process, but I'm pretty sure I can exclude this; maybe there is another way to iprove performances of the standard javascript view server, I'll try to find out today. Otherwise, we'll have to change our project, because such a poor performance would make CouchDB not usable in any productive environment.&lt;br /&gt;&lt;br /&gt;Keep in touch! Andrea&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-1750490585089282242?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/1750490585089282242/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/yesterday-and-plans-for-today.html#comment-form' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/1750490585089282242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/1750490585089282242'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/yesterday-and-plans-for-today.html' title='Yesterday... and plans for today'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-8524386733890665061</id><published>2008-09-22T20:03:00.003+02:00</published><updated>2008-09-22T20:10:39.414+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='fields'/><category scheme='http://www.blogger.com/atom/ns#' term='hashmap'/><category scheme='http://www.blogger.com/atom/ns#' term='couchdb'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='person'/><title type='text'>What a day of work! :)</title><content type='html'>Today's work has been really intense. You can see this also from this post's issue hour: it's 20 pm here, and for the first time I took some work home.&lt;br /&gt;&lt;br /&gt;Today we started working on the CouchDb handling of custom fields. In our application - you can see the link in the previous post - we already wrote the CRD parts of the CRUD; we needed the Update functionalities.&lt;br /&gt;At first we wrote our code keeping the previous structure with fixed fields in the class Person. This was not so good for the CouchDB approach: when we had to insert a custom field, we had to overcome the limitation of the fixed fields.&lt;br /&gt;So we decided to make a major design change into our application: we switched from the standard class design to a more flexible one, where instead of fixed named attributes we put them into an HashMap.&lt;br /&gt;This way we could handle variable-length lists of attributes, and also attributes with variable names; in a while it was possible to handle the update part successfully.&lt;br /&gt;We had some problems because a part of our application was still old-fashion code, and we forgot to convert it; when we got that, we felt really stupid, because we were getting mad looking for the cause of some missing functionalities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-8524386733890665061?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/8524386733890665061/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/what-day-of-work.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/8524386733890665061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/8524386733890665061'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/what-day-of-work.html' title='What a day of work! :)'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-8630620657829063051</id><published>2008-09-19T17:40:00.002+02:00</published><updated>2008-09-19T17:49:48.426+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='bitbucket'/><category scheme='http://www.blogger.com/atom/ns#' term='couchdb'/><category scheme='http://www.blogger.com/atom/ns#' term='repository'/><category scheme='http://www.blogger.com/atom/ns#' term='hg'/><category scheme='http://www.blogger.com/atom/ns#' term='addressbook'/><category scheme='http://www.blogger.com/atom/ns#' term='couchdb4j'/><title type='text'>Today's work</title><content type='html'>Today we worked on the project addressbookcouchdb4j. It's an explanation project for the couchdb4j libraries, and I hope it will prove itself useful for anybody trying to work on couchdb in Java.&lt;br /&gt;&lt;br /&gt;I found some difficulties in this work. Some were due to my not perfect knowledge of java; some others to the lack of documentation on both couchdb and the libraries. However I contacted Marcus Breeze, the developer of couchdb4j, and he explained us something we missed. Maybe we could join our works to help the couchdb user base: thanks a lot Marcus!&lt;br /&gt;&lt;br /&gt;The current state of our work can be seen easily at the following address:&lt;br /&gt;&lt;a href="http://www.bitbucket.org/metalelf0/addressbookcouchdb4j/overview/"&gt;&lt;br /&gt;http://www.bitbucket.org/metalelf0/addressbookcouchdb4j/overview/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Feel free to clone the hg repository if you want to sneak at the code ;)&lt;br /&gt;&lt;br /&gt;Actually our code allows to insert, remove and list elements into a simple couchdb database. It's an addressbook - jeje, not so original, but it was the simplest test case that came to our mind. We'll add some more functions in the next days, so stay in touch!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-8630620657829063051?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/8630620657829063051/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/todays-work.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/8630620657829063051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/8630620657829063051'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/todays-work.html' title='Today&apos;s work'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-7378835801779514471</id><published>2008-09-18T08:55:00.002+02:00</published><updated>2008-09-18T09:07:11.215+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='couchdb'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='couchdb4j'/><title type='text'>What we did in the last two days</title><content type='html'>This is a summary of the work I did with my colleague, Simone Albertini, in the last two days.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;&lt;ins&gt;Tuesday, september 16&lt;/ins&gt;&lt;/em&gt;&lt;br /&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Study of couchDB on the official site. Read the introduction, technical overview and wiki. Studied the difference between relational and non-relational DBs, and concepts of document, view.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Local installation on a linux VM of a working CouchDB.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Work on the local DB. Experimented the http communication system with CouchDB. Tried the ruby basic access library.&lt;/li&gt;&lt;li&gt;Started using CouchDB in a java environment. Installation and tryout of the couchdb4j libraries and needed dependencies.&lt;/li&gt;&lt;/ul&gt;   &lt;p&gt;&lt;em&gt;&lt;ins&gt;Wednesday, September 17&lt;/ins&gt;&lt;/em&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Getting deep into CouchDB.&lt;/li&gt;&lt;li&gt;Brainstorming about possible techniques we can use to reimplement a relational DB into a document-oriented one.&lt;/li&gt;&lt;li&gt;Downloaded and studied the source files of couchdb4j, ran the tests included, and saw they didn't pass.&lt;/li&gt;&lt;li&gt;Partial reimplementation of the provided tests, to make them pass and to understand the library behaviour.&lt;/li&gt;&lt;li&gt;Read some introductions about Lucene and its applicability fields.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-7378835801779514471?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/7378835801779514471/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/what-we-did-in-last-two-days.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/7378835801779514471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/7378835801779514471'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/what-we-did-in-last-two-days.html' title='What we did in the last two days'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-2662426102520948072</id><published>2008-09-17T11:43:00.005+02:00</published><updated>2008-09-17T12:44:14.443+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='conversion'/><category scheme='http://www.blogger.com/atom/ns#' term='couchdb'/><category scheme='http://www.blogger.com/atom/ns#' term='relational'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='document'/><category scheme='http://www.blogger.com/atom/ns#' term='db'/><title type='text'>Relational to document based: what to do?</title><content type='html'>I'm trying to figure out how to "convert" a relational database to a document based one. Specifically, an existent (legacy) relational database.&lt;br /&gt;&lt;br /&gt;As an example, think about a DB where the record can be represented by the following Java class:&lt;br /&gt;&lt;br /&gt;public class Person {&lt;br /&gt;   String name;&lt;br /&gt;   String surname;&lt;br /&gt;   Date registration_date;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;If I want to write an instance of Person to a document based DB, as CoachDB, I can use the following approaches.&lt;br /&gt;&lt;br /&gt;The simplest one that may come to mind is making Person implement the Serializable interface, serialize the instance of the class, and then write the obtained bit-code to a Document. However, this would make the DB completely useless: in the DB I would have only bit-codes, and I wouldn't be able to retrieve data without the Java serializer/deserializer. I would use the DB as a file system, so this approach is definitely bad.&lt;br /&gt;&lt;br /&gt;Another idea could be: for each field, write it to the document in a form like&lt;br /&gt;&lt;br /&gt;{ field.key , field.value.toString() }&lt;br /&gt;&lt;br /&gt;However this would work without problems only for the first two fields. In fact, when we write to the document the registration_date.toString(), we would have some problems reconstructing it back from the document.&lt;br /&gt;&lt;br /&gt;I'm currently searching for a solution about this topic. Stay in touch!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-2662426102520948072?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/2662426102520948072/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/relational-to-document-based-what-to-do.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/2662426102520948072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/2662426102520948072'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/relational-to-document-based-what-to-do.html' title='Relational to document based: what to do?'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-1047017165000765261</id><published>2008-09-17T10:22:00.004+02:00</published><updated>2008-09-17T14:42:05.148+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='access'/><category scheme='http://www.blogger.com/atom/ns#' term='couchdb'/><category scheme='http://www.blogger.com/atom/ns#' term='javadoc'/><category scheme='http://www.blogger.com/atom/ns#' term='couchdb4j'/><title type='text'>CouchDB accessing issues</title><content type='html'>I installed on my local system the CouchDB database, without any problem. Then I tried the given Ruby code to access the DB. It's really easy as CouchDB has no query language, but it uses http messages as directives; so, as I supposed, the Ruby code worked flawlessly.&lt;br /&gt;&lt;br /&gt;THEN, I tried the Java code. I'm still trying it.Unluckily, as you can see on this page,&lt;br /&gt;&lt;a href="http://couchdb4j.googlecode.com/svn/trunk/javadoc/index.html"&gt;&lt;br /&gt;http://couchdb4j.googlecode.com/svn/trunk/javadoc/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;the documentation is lacking. I'll work on this during the next days to make it better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-1047017165000765261?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/1047017165000765261/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/couchdb-accessing-issues.html#comment-form' title='3 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/1047017165000765261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/1047017165000765261'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/couchdb-accessing-issues.html' title='CouchDB accessing issues'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-7410183617524576788</id><published>2008-09-16T11:15:00.003+02:00</published><updated>2008-09-17T10:32:04.867+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='installation'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='couchdb'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='hardy'/><title type='text'>CouchDB</title><content type='html'>CouchDB is a document-based database developed by Apache Foundation. Its primary features are eventual consistency, high availability and extreme scalability. It's written in Erlang. Here's the related link on wikipedia: &lt;a href="http://en.wikipedia.org/wiki/CouchDB"&gt;http://en.wikipedia.org/wiki/CouchDB&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's a link to a good installation guide on Ubuntu Hardy 8.04:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://barkingiguana.com/2008/06/28/installing-couchdb-080-on-ubuntu-804"&gt;http://barkingiguana.com/2008/06/28/installing-couchdb-080-on-ubuntu-804&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It works perfectly also with the latest version of CouchDB (currently 0.8.1).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-7410183617524576788?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/7410183617524576788/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/couchdb.html#comment-form' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/7410183617524576788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/7410183617524576788'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/couchdb.html' title='CouchDB'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-7412512885014395177</id><published>2008-09-15T12:29:00.003+02:00</published><updated>2008-09-15T12:39:48.421+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='example'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='tail recursive'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>15/09/2008: Erlang</title><content type='html'>Today I'm continuing my Friday work on Erlang. Sorry for not posting about that, but we had some network problems and I forgot to update during the weekend.&lt;br /&gt;&lt;br /&gt;Here is some sample code to explain TAIL RECURSION in Erlang.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(20, 19, 18);"&gt;&lt;b&gt;-module&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 128, 224);"&gt;sum&lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;).&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(20, 19, 18);"&gt;&lt;b&gt;-export&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;([&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(20, 19, 18);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(255, 128, 224);"&gt;sum&lt;/span&gt;&lt;span style="color: rgb(20, 19, 18);"&gt;&lt;b&gt;/&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(176, 128, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(20, 19, 18);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(255, 128, 224);"&gt;sum_acc_caller&lt;/span&gt;&lt;span style="color: rgb(20, 19, 18);"&gt;&lt;b&gt;/&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(176, 128, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(20, 19, 18);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(255, 128, 224);"&gt;sum_acc&lt;/span&gt;&lt;span style="color: rgb(20, 19, 18);"&gt;&lt;b&gt;/&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(176, 128, 0);"&gt;2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(20, 19, 18);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;]).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;sum([&lt;/span&gt;&lt;span style="color: rgb(0, 87, 174);"&gt;H&lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(0, 87, 174);"&gt;T&lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;])&lt;/span&gt;&lt;span style="color: rgb(20, 19, 18);"&gt;  &lt;b&gt;-&gt;&lt;/b&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 87, 174);"&gt;H&lt;/span&gt;&lt;span style="color: rgb(20, 19, 18);"&gt; &lt;b&gt;+&lt;/b&gt; &lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;sum(&lt;/span&gt;&lt;span style="color: rgb(0, 87, 174);"&gt;T&lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;sum([])&lt;/span&gt;&lt;span style="color: rgb(20, 19, 18);"&gt;  &lt;b&gt;-&gt;&lt;/b&gt; &lt;/span&gt;&lt;span style="color: rgb(176, 128, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;sum_acc([&lt;/span&gt;&lt;span style="color: rgb(0, 87, 174);"&gt;H&lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(0, 87, 174);"&gt;T&lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;],&lt;/span&gt;&lt;span style="color: rgb(20, 19, 18);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 87, 174);"&gt;X&lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(20, 19, 18);"&gt; &lt;b&gt;-&gt;&lt;/b&gt; &lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;sum_acc(&lt;/span&gt;&lt;span style="color: rgb(0, 87, 174);"&gt;T&lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(20, 19, 18);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 87, 174);"&gt;X&lt;/span&gt;&lt;span style="color: rgb(20, 19, 18);"&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 87, 174);"&gt;H&lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;sum_acc([],&lt;/span&gt;&lt;span style="color: rgb(20, 19, 18);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 87, 174);"&gt;X&lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(20, 19, 18);"&gt;  &lt;b&gt;-&gt;&lt;/b&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 87, 174);"&gt;X&lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;sum_acc_caller(&lt;/span&gt;&lt;span style="color: rgb(0, 87, 174);"&gt;H&lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(20, 19, 18);"&gt; &lt;b&gt;-&gt;&lt;/b&gt; &lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;sum_acc(&lt;/span&gt;&lt;span style="color: rgb(0, 87, 174);"&gt;H&lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(20, 19, 18);"&gt; &lt;/span&gt;&lt;span style="color: rgb(176, 128, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(100, 74, 155);"&gt;).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;The basic problem we face is the sum of the integers in a list. In this code you can see two functions:&lt;br /&gt;&lt;br /&gt;- the first one is sum/1. This is the basic, non-tail-recursive function. It calls itself (n-1) times, where n is the size of the list, and then returns the expected value.&lt;br /&gt;- the second one is sum_acc/2. This is the tail-recursive function: it uses an accumulator variable X to keep the value of the sum while traversing the list. It keeps adding to this variable until the remaining part of the list (tail) has size 0; then it returns the sum.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-7412512885014395177?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/7412512885014395177/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/15092008-erlang.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/7412512885014395177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/7412512885014395177'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/15092008-erlang.html' title='15/09/2008: Erlang'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-4547019045938115045</id><published>2008-09-11T17:01:00.006+02:00</published><updated>2008-09-11T17:24:11.578+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='analysis'/><category scheme='http://www.blogger.com/atom/ns#' term='environment'/><title type='text'>Using JIRA in an agile environment</title><content type='html'>&lt;h1 id="using_jira_in_an_agile_environment"&gt;Using JIRA in an agile environment&lt;/h1&gt;    &lt;p&gt;Although JIRA is not explicitely designed for use in an agile environment, its flexibility allows agile developers to adapt it to their needs, making it a good complementary software for project management.&lt;/p&gt;    &lt;p&gt;After a first look, there are some obstacles in JIRA issue management, that we’ll need to workaround:&lt;/p&gt;    &lt;ul&gt;&lt;li&gt;there is no &lt;strong&gt;“difficulty point”&lt;/strong&gt; variable for the issues;&lt;/li&gt;&lt;li&gt;there’s no &lt;strong&gt;“iteration”&lt;/strong&gt; concept: we’ll need to use the “version” variable to represent the iteration;&lt;/li&gt;&lt;li&gt;the available reports and graphs are based on the concept of tasks per version. However, in an agile environment, this information is not important, as it’s much more important the difficulty of the task than the number of them.&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;Finding a solution to these problems is not easy. Anyway, there are some plugins - both commercial and freeware - that can help us to improve our Jira experience. Let’s see the most important ones.&lt;/p&gt;&lt;br /&gt;&lt;h2 id="greenhopper"&gt;GreenHopper&lt;/h2&gt;    &lt;p&gt;GreenHopper by GreenPepper Software is at the moment the most used plugin for Agile developers using JIRA. It’s a stable project with very frequent updates (they claim one release every 2.5 weeks). But it’s not a free plugin: the licence prices range from 350 canadian dollars (234 €) to 1150 canadian dollars (768 €) per production server. They offer a free licence too, but only for managers of open-source projects.&lt;/p&gt;    &lt;blockquote&gt;    &lt;p&gt;GreenHopper is a full implementation of the Agile planning wall in a JIRA plugin. &lt;/p&gt;     &lt;p&gt;It represents all of your JIRA issues as an index card; different types of issues are different colors. Each card displays the Summary and the other information crucial to planning, like estimates and time-remaining. It hides all of the other information: full description, comments, etc., but they’re all just a click away. You can drag and re-order the tasks. You can edit them on the fly, to add comments or log work.&lt;/p&gt;     &lt;p&gt;The Planning Board helps you schedule many issues over an entire release cycle. GreenHopper also offers a Task Board to show you the work-queue for a version or component. And there is a Chart Board which will show you the burn-down chart for a release.&lt;/p&gt;     &lt;p&gt;The chart board offers the following graphs:&lt;/p&gt;   &lt;/blockquote&gt;    &lt;ul&gt;&lt;li&gt;Display of the burndown curve&lt;/li&gt;&lt;li&gt;Display of the team effort curve&lt;/li&gt;&lt;li&gt;Display of the estimation accuracy curve&lt;/li&gt;&lt;li&gt;Burndown chart based on a custom field&lt;/li&gt;&lt;li&gt;Burnup chart based on a custom field&lt;/li&gt;&lt;li&gt;Value chart based on a custom field&lt;/li&gt;&lt;li&gt;Issue filtering&lt;/li&gt;&lt;li&gt;Configurable start date and end date&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;The most evident downsides of this plugin are that the graphs it produces are limited to a single iteration (or version); and these graphs can be seen only after the iteration is closed.&lt;/p&gt;    &lt;p&gt;This problem is mostly due to the internal Jira structure; like previously said, the Jira application lacks an “iteration” concept. The team effort curve for a single iteration, telling how many story points are being completed every day, doesn’t give any information about the overall project.&lt;/p&gt;    &lt;p&gt;The Planning board, instead, is a good way to keep track of the story cards of the project. However many agile developers still prefer to have physical papers, sticky notes and a real blackboard.&lt;/p&gt;    &lt;p&gt;Link: &lt;a href="http://www.greenpeppersoftware.com/confluence/display/GH/Plugin"&gt;GreenHopper plugin&lt;/a&gt;&lt;/p&gt;    &lt;h2 id="cfo_approval_required"&gt;CFO Approval Required&lt;/h2&gt;    &lt;p&gt;CFO Approval Required is a plugin developed by Go2Group. Its original target was different from the one an agile group could use it for, but sometimes it may find its space. It’s a free plugin, so try it if you need it. It’s not maintained since the original 1.0 version, released in April 2007. &lt;/p&gt;    &lt;blockquote&gt;    &lt;p&gt;This plug-in is designed to allow a CFO or manager to approve issues based on the amount of a requested purchase. The issue is then forwarded for approval to a second user, such as a Controller or Project Manager.&lt;/p&gt;     &lt;p&gt;This plug-in is also used for any generic approval process such as travel request, vacation request, Feature Request, Test Requests, PO, etc.&lt;/p&gt;     &lt;p&gt;This plug-in can be useful in scenarios such as developer changeset (set of associated changed source code files) for verification to a team member, if approved by the team member the changeset is then marked as ready for test. This scenario has proven useful to shops working in xtreme - scrum - agile environments.&lt;/p&gt;   &lt;/blockquote&gt;    &lt;p&gt;In my opinion, this plugin can be useful only in big teams, or in outsourced development teams. Agile practices encourage communication as the most important value, so decisions are usually taken in the open space. However in different environments this plugin could help a lot.&lt;/p&gt;    &lt;p&gt;Link: &lt;a href="http://www.go2group.com/services/spla/jira_services.php"&gt;CFO Approval Required plugin&lt;/a&gt;&lt;/p&gt;    &lt;h2 id="custom_issue_order"&gt;Custom Issue Order&lt;/h2&gt;    &lt;p&gt;This freeware plugin is very simple, yet it can be very useful. It’s not being updated since November 2007.&lt;/p&gt;    &lt;blockquote&gt;    &lt;p&gt;(it adds a) Custom field to order issues. With this plugin, any issue list can be ordered in a custom way. Useful for work queues or fine grained prioritizing.&lt;/p&gt;   &lt;/blockquote&gt;    &lt;p&gt;It can be a cheap alternative (even if less eye-pleasing) to the GreenHopper planning board: if your only need is to sort user stories, and you don’t mind colors and stuff, this one is for you. The custom field, however, cannot solve the big problems noted before: it’s related to the single issue, not to iterations (= versions).&lt;/p&gt;    &lt;p&gt;Link: &lt;a href="http://atlasbits.sourceforge.net/"&gt;Custom Issue Order&lt;/a&gt;&lt;/p&gt;    &lt;h2 id="laughing_panda_jira_agile_report_plugins"&gt;Laughing Panda JIRA Agile Report Plugins&lt;/h2&gt;    &lt;p&gt;This free plugin offers at the moment a single graph: specifically, it’s a workload burndown chart (in hour or from a custom field like story points). Again, it suffers the same problems of its bigger brother GreenHopper: graphs are related to the single iteration, so they don’t give any “wide view” of the project.&lt;/p&gt;    &lt;p&gt;Link: &lt;a href="http://www.laughingpanda.org/mediawiki/index.php/Agile_Plugins"&gt;Laughing Panda&lt;/a&gt;&lt;/p&gt;    &lt;h2 id="agile_velocity_tracking_plugin"&gt;Agile Velocity Tracking plugin&lt;/h2&gt;    &lt;blockquote&gt;    &lt;p&gt;This free plugin offers a report that will generate velocity tracking charts over versions. The report displays charts for Velocity Points tracking. Versions are treated as iterations. The points are gathered from a custom field which must be manually added. Iterations can be of variable length. Forecasting is currently done on ‘yesterday’s weather.&lt;/p&gt;   &lt;/blockquote&gt;    &lt;p&gt;This plugin offers something really different from the previous ones: it’s giving the chance to analyze more than a single iteration. The information gathered from its graphs are usually more important to the agile developer’s eyes: points over stories, points burndown.&lt;/p&gt;    &lt;p&gt;We could argue that this plugin needs a couple of iterations completed before proving its strength, as it doesn’t give any information about the current iteration; the predictions made by this plugin are not based on a very complex model, so they could be inaccurate and should be treated carefully.&lt;/p&gt;    &lt;p&gt;The development of this plugin is not going on since August 2007.&lt;/p&gt;    &lt;p&gt;Link: &lt;a href="http://confluence.atlassian.com/display/JIRAEXT/Agile+Velocity+Tracking+plugin"&gt;Agile Velocity Tracking Plugin&lt;/a&gt;&lt;/p&gt;    &lt;h2 id="agile_wall_plugin"&gt;Agile Wall Plugin&lt;/h2&gt;    &lt;p&gt;This is another free plugin, offering a display of a Project Wall. &lt;/p&gt;    &lt;blockquote&gt;    &lt;p&gt;Report for viewing issue statuses in the same way as in agile project progress walls (issues in three columns: to do/in progress/done). Many agile teams use task walls to represent the current status of the sprint (or project). Tasks are grouped by their status to three columns: Not started, In progress and Done. Tasks are usually also sorted so that top priority issues are on the top and low level issues are on the bottom.&lt;/p&gt;     &lt;p&gt;Agile Wall Report plugin tries to mimic this view in JIRA so that team members can use a same kind of a view for a current project version that is being developed.&lt;/p&gt;     &lt;p&gt;Note that current version uses default JIRA statuses. Issues with “In Progress” status are rendered in the middle and issues with “Closed” status are rendered as done. Other status types are rendered in the Not started column.&lt;/p&gt;   &lt;/blockquote&gt;    &lt;p&gt;The biggest limitation of this plugin is the impossibility of using custom issue status (e.g. “waiting for approval”, test related statuses and so on). However it’s still a good plugin, allowing a visual representation of a chosen sprint (or version) to be seen in Jira. Like said for the GreenHopper plugin, many agile developers prefer a real board, so the real need of this plugin is subjective; but this one is free, so you can try it and decide by yourself.&lt;/p&gt;    &lt;p&gt;The latest release was made on 2007, July 17.&lt;/p&gt;    &lt;p&gt;Link: &lt;a href="http://www.substanceofcode.com/software/jira-plugins/"&gt;Agile Wall Plugin&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-4547019045938115045?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/4547019045938115045/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/using-jira-in-agile-environment.html#comment-form' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/4547019045938115045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/4547019045938115045'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/using-jira-in-agile-environment.html' title='Using JIRA in an agile environment'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-7796427792281229263</id><published>2008-09-11T10:25:00.012+02:00</published><updated>2008-09-11T16:46:35.018+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='i18n'/><category scheme='http://www.blogger.com/atom/ns#' term='developing'/><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><title type='text'>11/9/2008</title><content type='html'>Morning task: &lt;span style="font-weight: bold;"&gt;try to figure out how i18n works&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Setting a text variable in a .properties file and referencing it in the view is working.&lt;br /&gt;&lt;br /&gt;I.e., if the file is called assigned_portlet.properties, and its path in the plugin dir is&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;src/etc/com/atlassian/jira/plugin/portlets/example/assigned/assigned_portlet.properties&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;it should be referenced in the atlassian-plugin.xml with a line like this one:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&amp;lt;resource type="i18n" name="i18n" location="com.atlassian.jira.plugin.portlets.&lt;br /&gt;example.assigned.assigned_portlet"&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Now, I have to understand which variables or properties are not explicitely being assigned by the user.&lt;br /&gt;&lt;br /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Update: I think those values are being set in another file; the problem is that I have only the jar file and I'm not able to see the source code of it. As a developer, trying to evaluate a product like jira without being able to see its code, is really a tough task.&lt;br /&gt;&lt;br /&gt;In the afternoon I switched to a simplier task. I'm writing a paper about available Jira plugins for agile developers.&lt;br /&gt;&lt;br /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-7796427792281229263?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/7796427792281229263/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/1192008.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/7796427792281229263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/7796427792281229263'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/1192008.html' title='11/9/2008'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-7071124860921662128</id><published>2008-09-10T10:46:00.012+02:00</published><updated>2008-09-11T11:58:19.169+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='developing'/><title type='text'>10/9/2008</title><content type='html'>Task: &lt;span style="font-weight: bold;"&gt;Try to write a more complicated Jira plugin&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Again, the Jira developer resources SUCK. They provide a developer toolkit without any readme file. They provide plugin examples that don't build. They &lt;span style="font-weight: bold;"&gt;don't&lt;/span&gt; provide any step-by-step tutorial or explanation about how to do things. It's like trying to study marine biology, fishing on a lonely ship in the middle of the ocean.&lt;br /&gt;&lt;br /&gt;The provided &lt;span style="font-style: italic;"&gt;helper&lt;/span&gt; command "&lt;span style="font-weight: bold;"&gt;mvn eclipse:eclipse&lt;/span&gt;"should generate an eclipse project file for a new plugin. Ok, every time I launch it, it downloads more than an hundred MBs from the web. No matter if the files are already in the local repository: it *has* to download them again. I'm getting sick wasting my time waiting for a damn &lt;span style="font-style: italic;"&gt;helper&lt;/span&gt; tool to finish.&lt;br /&gt;&lt;br /&gt;Update: reading in some &lt;span style="font-weight: bold;"&gt;forum comments&lt;/span&gt; (yeah, not in official documentation, in comments!) I found out that jira/atlassian plugins have to be built with the version 1.x of Maven. Amazing. The newest version, 2.0.x, is not working anymore; it's kind of a completely different application. This thing should be written in capital letters with a huge font in EVERY developer page. Instead, it's in a forum comment. Great work, atlassian guys! What a wonderful documentation you have!&lt;br /&gt;&lt;br /&gt;Then I tried to build a plugin, this time successfully. However, I can't understand the parameter-passing format of the velocity templates. There's a variable being printed correctly without being assigned anywhere; and assigning manually a value to a variable is not working. Still searching for a solution on this. This should be a i18n (internationalization) variable, and I can't find any documentation about this.&lt;br /&gt;&lt;br /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;Still stuck on the i18n issue. Posted a question about this on the atlassian jira forum:&lt;br /&gt;&lt;a href="http://forums.atlassian.com/thread.jspa?threadID=28566&amp;amp;tstart=0"&gt;&lt;br /&gt;http://forums.atlassian.com/thread.jspa?threadID=28566&amp;amp;tstart=0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-7071124860921662128?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/7071124860921662128/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/1092008.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/7071124860921662128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/7071124860921662128'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/1092008.html' title='10/9/2008'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-4223703480044214088</id><published>2008-09-09T11:05:00.002+02:00</published><updated>2008-09-09T14:35:08.215+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='developing'/><title type='text'>9/9/2008</title><content type='html'>Writing a sample Jira plugin:&lt;br /&gt;&lt;br /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" /&gt; &lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" border="0" /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" border="0" /&gt;&lt;img style="border-color: white; width: 28px; height: 26px;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Found a great tutorial for a "hello, world" servlet plugin:&lt;span style="text-decoration: underline;"&gt; &lt;a href="http://ximoneighteen.com/xeightee/blog/index.php?/archives/9-How-to-write-a-Hello-World%21-Jira-plugin.html"&gt;Sample hello world plugin tutorial&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;However be careful if you copy'n'paste from this tutorial, cause the syntax is a little messed up from the blog platform.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Maven sucks! &lt;/span&gt;&lt;/span&gt;&lt;span&gt;At compile time it doesn't check if the xml files provided are valid. It says everything is ok, then when you start the tomcat server you have to discover by yourself what is stopping it from loading, searching in the start log. What a PITA!&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;After&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;4 pomodori I finally managed to get a working plugin. This whole thing is a mess. Just to get an "Hello, world!" string on my Jira front page I had to write around 70 lines of code in many different files. Ok, it's only my second day of work on this subject; but the lack of informations (the *simple* ones) is getting me mad.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;a href="http://rapidshare.com/files/143867341/HelloWorldPlugin_jar.tar.gz.html"&gt;Here&lt;/a&gt; is the link to the jar file I generated. Install it as usual in your jira installation to try it.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-4223703480044214088?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/4223703480044214088/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/992008.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/4223703480044214088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/4223703480044214088'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/992008.html' title='9/9/2008'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4048544774153045973.post-3944614273881128281</id><published>2008-09-09T10:37:00.000+02:00</published><updated>2008-09-09T12:33:34.026+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jira'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='developing'/><title type='text'>8/9/2008</title><content type='html'>- Jira installation on local machine and exploration of the application:&lt;br /&gt;&lt;br /&gt;&lt;img style="width: 28px; height: 26px; border-color: white;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" border="0" /&gt;&lt;img style="width: 28px; height: 26px; border-color: white;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;- Jira and XP: plugins, graphs. Research for informations about Jira usage in XP environments.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;img style="width: 28px; height: 26px; border-color: white;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" border="0" /&gt;&lt;img style="width: 28px; height: 26px; border-color: white;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;- Example jira plugin. Installed plugin developer toolkit, tried to understand the basic structure of a plugin. Tried to write a sample plugin, without success.&lt;br /&gt;&lt;br /&gt;&lt;img style="width: 28px; height: 26px; border-color: white;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" border="0" /&gt;&lt;img style="width: 28px; height: 26px; border-color: white;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" border="0" /&gt;&lt;img style="width: 28px; height: 26px; border-color: white;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" border="0" /&gt;&lt;img style="width: 28px; height: 26px; border-color: white;" src="http://www.tomatofarmsrl.it/images/pomodoro.jpg" alt="" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Note: simply installing the developer resources took 2 pomodori: the download process of the needed files was very long.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4048544774153045973-3944614273881128281?l=metalelf0dev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metalelf0dev.blogspot.com/feeds/3944614273881128281/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/892008.html#comment-form' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/3944614273881128281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4048544774153045973/posts/default/3944614273881128281'/><link rel='alternate' type='text/html' href='http://metalelf0dev.blogspot.com/2008/09/892008.html' title='8/9/2008'/><author><name>MetalElf0</name><uri>http://www.blogger.com/profile/12401211849017533078</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_XPYUQVFU0pU/TNfwBSqYo_I/AAAAAAAAEw0/cKGDywhBcD4/S220/gravatar.jpg'/></author><thr:total>0</thr:total></entry></feed>
