<?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-542274948422156627</id><updated>2011-10-11T10:21:38.998+02:00</updated><category term='linux'/><category term='guidelines'/><category term='xml'/><category term='lean'/><category term='timeloss'/><category term='oss'/><category term='gpg'/><category term='scala'/><category term='tools'/><category term='java'/><category term='process'/><category term='security'/><category term='jenkins'/><category term='junit'/><category term='deployment'/><category term='xunit'/><category term='maven'/><category term='oslo'/><category term='hosting'/><category term='communication'/><category term='backups'/><category term='hudson'/><category term='it history'/><category term='misc'/><category term='gradle'/><category term='android'/><category term='people'/><category term='eapps'/><category term='opensource'/><category term='git'/><category term='js'/><category term='python'/><category term='groovy'/><category term='unix'/><category term='ci'/><category term='windows'/><category term='dev'/><category term='quality'/><category term='opendata'/><category term='fun'/><category term='code'/><category term='testing'/><category term='bdd'/><category term='svn'/><title type='text'>CoffeeBreaks, by Jerome</title><subtitle type='html'>Mostly personal notes on IT development and life that you may or may not find useful.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>62</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-4979597952025328355</id><published>2011-08-14T14:24:00.002+02:00</published><updated>2011-08-14T14:31:39.792+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oslo'/><title type='text'>Bislet bad web site</title><content type='html'>Trying to find information about the Bislet swimming pool. The bisletbad.no site is parked. The bisletbad.com web site is unmaintained (no opening hours, incorrect phone number) but the swimming pool is functionning and isn't that bad !&lt;br /&gt;&lt;br /&gt;Looks like the new owners are in some kind of domain dispute with the previous ones...&lt;br /&gt;&lt;br /&gt;The whois entry of the .com site contains:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   Domain Name: BISLETBAD.COM&lt;br /&gt;   Registrar: ENOM, INC.&lt;br /&gt;   Whois Server: whois.enom.com&lt;br /&gt;   Referral URL: http://www.enom.com&lt;br /&gt;   Name Server: NS3.NETBOX.NO&lt;br /&gt;   Name Server: NS4.NETBOX.NO&lt;br /&gt;   Name Server: NS5.NETBOX.NO&lt;br /&gt;   Status: clientTransferProhibited&lt;br /&gt;   Updated Date: 23-sep-2010&lt;br /&gt;   Creation Date: 23-sep-2010&lt;br /&gt;   Expiration Date: 23-sep-2011&lt;br /&gt;&lt;br /&gt;Domain name: bisletbad.com&lt;br /&gt;&lt;br /&gt;Registrant Contact:&lt;br /&gt;   BISLET BAD LIMITED&lt;br /&gt;   Dawson E. Hamilton ()&lt;br /&gt;   &lt;br /&gt;   Fax: &lt;br /&gt;   Pilestredet 60&lt;br /&gt;   995901099&lt;br /&gt;   Oslo, Oslo 0167&lt;br /&gt;   NO&lt;br /&gt;&lt;br /&gt;Administrative Contact:&lt;br /&gt;   BISLET BAD LIMITED&lt;br /&gt;   Dawson E. Hamilton (pt@jamfit.no)&lt;br /&gt;   +47.23333810&lt;br /&gt;   Fax: &lt;br /&gt;   Pilestredet 60&lt;br /&gt;   995901099&lt;br /&gt;   Oslo, Oslo 0167&lt;br /&gt;   NO&lt;br /&gt;&lt;br /&gt;Technical Contact:&lt;br /&gt;   BISLET BAD LIMITED&lt;br /&gt;   Dawson E. Hamilton (pt@jamfit.no)&lt;br /&gt;   +47.23333810&lt;br /&gt;   Fax: &lt;br /&gt;   Pilestredet 60&lt;br /&gt;   995901099&lt;br /&gt;   Oslo, Oslo 0167&lt;br /&gt;   NO&lt;br /&gt;&lt;br /&gt;Status: Locked&lt;br /&gt;   &lt;br /&gt;Creation date: 23 Sep 2010 16:03:00&lt;br /&gt;Expiration date: 23 Sep 2011 11:03:00&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The old Norwegian company points to http://w2.brreg.no/enhet/sok/detalj.jsp?orgnr=995901099 and the company is non existant.&lt;br /&gt;&lt;br /&gt;This has been ongoing for months. Why don't they set up a temporary site with basic information (phone number, prices, opening hours) until they resolve their dispute.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-4979597952025328355?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/4979597952025328355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2011/08/bislet-bad-web-site.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4979597952025328355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4979597952025328355'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2011/08/bislet-bad-web-site.html' title='Bislet bad web site'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-2851198560673677720</id><published>2011-04-20T08:52:00.003+02:00</published><updated>2011-04-20T09:36:49.324+02:00</updated><title type='text'>Scripts pour surveiller une Livebox 2</title><content type='html'>[For once something in French, as it's targeted to customers of a French ISP]&lt;br /&gt;&lt;br /&gt;Mes parents ont des problemes de deconnections sur leur Livebox 2 d'Orange. J'ai ecris &lt;a href="https://github.com/lacostej/livebox"&gt;un petit script bash&lt;/a&gt; pour recuperer les donnees presentes sur les pages de status, generer un fichier de donnees.&lt;br /&gt;&lt;br /&gt;Les donnees sont actuellement extraites sous la forme suivante:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;20110419-094018;27.5 dB;49.6 dB;8 dB;17 dB;640 kb/s;2304 kb/s;0;0;1850;10091;0;86.201.220.177;00:19:55;mardi 19 avril, 08:22:02;00:18:15;mardi 19 avril, 08:20:04&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Le script peut etre utilisee en ligne de commande, ou plus simplement dans un cron.&lt;br /&gt;&lt;br /&gt;Une fois les donnees recuperees, on peut par example utiliser gnuplot afin de generer des graphes. Un example de fichier de configuration pour gnuplot est fourni. Dans mon cas il m'a permit de generer:&lt;br /&gt;&lt;br /&gt;&lt;img src="https://github.com/lacostej/livebox/blob/master/doc/plot-bw-and-noise-margin.png?raw=true" width="642" height="469" alt="bandwidth and noise margin over time"&gt;&lt;br /&gt;&lt;br /&gt;Sachant que la livebox tourne probablement sous Linux, il est dommage que la live box n'expose pas ces donnees dans un format facilement lisible par une machine, ainsi que donne access aux logs du systeme. Le kernel etant en GPLv2, il permet cependant la &lt;a href="http://fr.wikipedia.org/wiki/Tivoisation"&gt;tivoisation&lt;/a&gt;...&lt;br /&gt;&lt;br /&gt;Dans le cas de mes parents, il semblerait que le probleme soit lie a une marge au bruit fluctuante et trop faible, occasionant les deconnections. La bande passante negociee est parfois relativement faible (e.g. 700 kbps descendant!) et la marge au bruit associee est large ce qui donne une certaine stabilite. Nous allons laisser le script tourner quelques jours afin de voir si certaines periodes sont plus instables que d'autres... Affaire a suivre&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-2851198560673677720?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/2851198560673677720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2011/04/scripts-pour-surveiller-une-livebox-2.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/2851198560673677720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/2851198560673677720'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2011/04/scripts-pour-surveiller-une-livebox-2.html' title='Scripts pour surveiller une Livebox 2'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-2353707397107998992</id><published>2011-03-23T10:04:00.002+01:00</published><updated>2011-03-23T10:15:18.108+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opendata'/><category scheme='http://www.blogger.com/atom/ns#' term='oslo'/><title type='text'>Trafikanten &amp; open data update - things happened</title><content type='html'>Following up my &lt;a href="http://lacostej.blogspot.com/2011/01/trafikanten-open-data-update-things-are.html"&gt;post from about 2 months ago&lt;/a&gt;, I was announcing good news on the way. As you may already know, the bigs news is finally out there: &lt;a href="http://www.digi.no/865776/sanntids-trafikkdata-til-alle"&gt;Trafikanten has opened up their data&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;I would like to thank the various people involved in getting this in place, in no particular order, Bent Flyen, Christopher Worren and Jarl Eliassen from Trafikanten, Bjorn Tennøe from Iterate, Marius Mårnes Mathiesen from Shortcut and the numerous people whose name I've forgot along the way.&lt;br /&gt;&lt;br /&gt;What's next ?&lt;br /&gt;&lt;br /&gt;* I hope that now some people will come up with cool things building upon this free data &amp; API&lt;br /&gt;&lt;br /&gt;* yesterday I found &lt;a href="http://codebutler.com/announcing-farebot-for-android"&gt;farebot for android&lt;/a&gt;, and I would love to see the Flexus card data supported by similar applications. I already contacted trafikanten, and will follow up here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-2353707397107998992?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/2353707397107998992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2011/03/trafikanten-open-data-update-things.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/2353707397107998992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/2353707397107998992'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2011/03/trafikanten-open-data-update-things.html' title='Trafikanten &amp; open data update - things happened'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-6051103666854937121</id><published>2011-02-25T06:28:00.003+01:00</published><updated>2011-02-25T06:39:24.810+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='timeloss'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>getting svn and git svn to work long paths on windows</title><content type='html'>It appears that no latest stable SVN client (1.6.15 latest today) work well when working with projects with long paths (i.e. &gt; ~ 250 characters). Noone on the team had problems as they used TortoiseSVN, but I insist on checkout out from the command line, and I also want to use git svn.&lt;br /&gt;&lt;br /&gt;Now there's a &lt;a href="http://svn.haxx.se/users/archive-2010-05/0164.shtml"&gt;work-around&lt;/a&gt;, but it seems relatively unknown. Yes you read well: use absolute paths instead of relative paths. That's it. Basically do:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$  svn co http://server/project/trunk c:\Projects\project.git&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For git svn, from the git batch command line:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$  git svn clone [options] http://server/project/trunk /c/Projects/project.git&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It also appears that svn client 1.7, out Q1 2011, will also fix that. But I couldn't confirm it from the &lt;a href="http://subversion.apache.org/roadmap.html"&gt;roadmap&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-6051103666854937121?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/6051103666854937121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2011/02/getting-svn-and-git-svn-to-work-long.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/6051103666854937121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/6051103666854937121'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2011/02/getting-svn-and-git-svn-to-work-long.html' title='getting svn and git svn to work long paths on windows'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-603665141946172980</id><published>2011-02-12T09:56:00.004+01:00</published><updated>2011-02-14T21:19:35.653+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='junit'/><title type='text'>Ignoring JUnit tests at runtime</title><content type='html'>Sometimes I want to ignore particular test failures. In fact I don't want the tests to run at all because I know they will fail. Not that they are broken, but because they depend on part of the infrastructure that isn't available right now.&lt;br /&gt;&lt;br /&gt;E.g. in the &lt;a href="https://github.com/lacostej/web-validators"&gt;web-validators&lt;/a&gt; project, I wanted to have the ability to ignore the integration tests (which test remote validation services integration) when the remote sites aren't reachable.&lt;br /&gt;&lt;br /&gt;I could also have used &lt;a href="http://junit.sourceforge.net/javadoc/org/junit/Assume.html"&gt;Assume&lt;/a&gt;, but somewhat I am not completely satisfied with that solution. The Assume calls go in the test code and&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;can't be used at a class level&lt;/li&gt;&lt;br /&gt;&lt;li&gt;aren't as good from a self-documenting perspective&lt;/li&gt;&lt;br /&gt;&lt;li&gt;don't have access to method information, e.g. other annotations&lt;/li&gt;&lt;br /&gt;&lt;li&gt;will execute my test code anyway, which can cause slow-downs, etc (time outs generally take a bit of time to trigger)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;I could also have grouped my network dependent tests in a special suite or &lt;a href="http://weblogs.java.net/blog/johnsmart/archive/2010/04/25/grouping-tests-using-junit-categories-0"&gt;using a Category&lt;/a&gt;, but then I have to enable or disable it myself (i.e. make suites that match my grouping).&lt;br /&gt;&lt;br /&gt;I prefer tests that enable themselves automatically.&lt;br /&gt;&lt;br /&gt;So I came up with &lt;a href="https://github.com/lacostej/web-validators/commit/1a4d08e3336a8689dd3f4fae0941d1b498057d0f"&gt;this solution&lt;/a&gt;: I have created a new Runner, and a new version of the Ignore annotation called RuntimeIgnore to which I specify optional extra argument(s): the name of a class to instantiate and execute to check whether an ignore condition is satisfied.&lt;br /&gt;&lt;br /&gt;The disadvantage of the current patch is that I still have to have my own Runner. I don't like that too much (because to combine multiple enhancements you might have to combine runners) so I submitted &lt;a href="https://github.com/lacostej/junit/tree/runtime-ignore"&gt;an enhancement to JUnit&lt;/a&gt; as I merged that approach into the existing JUnit 4 Runner and @Ignore annotation.&lt;br /&gt;Note: the patch isn't fully complete (cleanups, documentation left aside), it's more like a RFC. Feel free to comment.&lt;br /&gt;&lt;br /&gt;How could you use this ? Instead of doing something like:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;@Category("LinuxIT")&lt;br /&gt;@Test thisTestShouldOnlyRunOnLinux() {&lt;br /&gt;  // my test code&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;and then enable your group of tests using Suites.&lt;br /&gt;&lt;br /&gt;or&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;@Test thisTestShouldOnlyRunOnLinux() {&lt;br /&gt;  if (notOnLinux()) {&lt;br /&gt;    // my test code&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You can do:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;@Ignore(ifTrue=NotOnLinux.class)&lt;br /&gt;@Test thisTestShouldOnlyRunOnLinux() {&lt;br /&gt;  // my test code&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The same apply to classes, e.g.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;@Ignore(if=NotOnLinux.class)&lt;br /&gt;class MyLinuxTests {&lt;br /&gt;  @Test ...&lt;br /&gt;  @Test ...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You can also take advantage of DRY principles on Convention over Configuration doing&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;@Ignore(ifTrue=TestNameDoesntMatchPlatform.class)&lt;br /&gt;@Test onLinux_aTest() {&lt;br /&gt;  // my test code for Linux&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Ignore(ifTrue=TestNameDoesntMatchPlatform.class)&lt;br /&gt;@Test onWindows_aTest() {&lt;br /&gt;  // my test code for Windows&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(&lt;strong&gt; in case you haven't followed the above code will not run in code taken from the JUnit official repository ! &lt;/strong&gt;)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Update 1&lt;/strong&gt;: after a comment from a JUnit commiter on &lt;a href="https://github.com/KentBeck/junit/pull/190"&gt;my pull request/RFC&lt;/a&gt;, I made a slightly different version of the patch that doesn't require any change made to JUnit. By using MethodRules intead of a custom Runner, I am achieving almost the same thing. See the change &lt;a href="https://github.com/lacostej/web-validators/commit/2e1af8e1d9d1bf206849702d4231961563457815"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-603665141946172980?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/603665141946172980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2011/02/ignoring-junit-tests-at-runtime.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/603665141946172980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/603665141946172980'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2011/02/ignoring-junit-tests-at-runtime.html' title='Ignoring JUnit tests at runtime'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-5433323234752807422</id><published>2011-02-05T01:56:00.010+01:00</published><updated>2011-02-05T11:16:50.996+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oss'/><category scheme='http://www.blogger.com/atom/ns#' term='jenkins'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><title type='text'>Sonatype's Hudson's bright future - answer</title><content type='html'>So Sonatype's Jason Van Zyl posted about &lt;a href="http://www.sonatype.com/people/2011/02/hudsons-bright-future/"&gt;Hudson's future&lt;/a&gt;. I wonder if that response is related to Hudson-Dev's email thread &lt;a href="/2011/02/future-of-hudson.html"&gt;"The Future of Hudson"&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;While I agree with some of the things Oracle and Sonatype are doing, I strongly disagree with the wording of this post and some of the comments.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;"mostly dependent on a single individual for core changes" (aka hudson dependance on KK). There are 115 different contributors in core according to git (for jenkins, but that shouldn't be a big difference in hudson). yes he made the main decisions at start, but there are now more than 350 hosted plugins. From that perspective, his decisions sounded right&lt;/li&gt;&lt;br /&gt;&lt;li&gt;criticizing jelly ? I agree that it's not the best choice for a project starting today. But it's not that bad. And have you looked at how much code jelly represents in the plugins ? If I look at the official plugins from middle July 2010: 420k lines java, 44k jelly. That's &lt;strong&gt;10%&lt;/strong&gt;, a huge problem, right? And it's not because jelly didn't make sense for maven that it didn't for hudson. Actually it makes much more sense in hudson than in maven.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;lack of documentation: most projects lack it. Even &lt;a href="http://maven.apache.org/docs-required.html"&gt;Maven&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;"too many forked dependencies". Think of them as patched dependencies, not forks. Who hasn't done that in the enterprise world? You know how hard it is to get a commit upstream sometimes. And it's easy to know why they were forked. Check the release logs for the deps. Or ask !&lt;/li&gt;&lt;br /&gt;&lt;li&gt;provenance: commits come with issue number and/or link to online discussion / report in the mailing list. Code comes from commits. Do you mean it could have been copied from another project without appropriate copyright ? This can happen anywhere. And it's solved the same way everywhere: by rewriting the code. Nothing dramatic.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;licensing issues: yes you're right. BTW, mentionning Saas really sounds like attacking Cloudbees...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;automation tests. Yeah ! All for it. There are 800+ tests right now in test harness. It's not that bad then. And you know how hard it is to come up with a good coverage right ? Maven 2.0.x took a long time to stabilize... As for providing tests for all plugins, it's hard. In maven it's easier because most are not hosted by Apache itself (think codehaus, etc)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;"maven 3.0 support" in your worklog sounds like hudson/jenkins doesn't support it. How does &lt;a href="http://ci.jenkins-ci.org/"&gt;that run&lt;/a&gt; then ? You might want improving it, or providing an alternative. Fine. But don't do as there's no support for maven 3.0 today in hudson/jenkins.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;I could go on but I don't want to be too picky.&lt;br /&gt;&lt;br /&gt;To summarize. Technical debt ? Oh yeah. Old dependencies? Double that. What kind of old projects doesn't have that ? How many times did you rewrite maven already ? You know it's hard to get it right the first time.&lt;br /&gt;&lt;br /&gt;The reason I wanted to answer Sonatype's post was that line.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;"Working with the community, Oracle and Sonatype [...]"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I think (and I may be wrong) that you've been working with a subset of the community. You didn't seem to publish your RFEs on the wiki on in Jira when the hudson developers asked (did you?).&lt;br /&gt;&lt;br /&gt;You probably worked with Oracle and some of its customers, perhaps getting paid for your company's work. Nothing wrong about that in itself. Even great!&lt;br /&gt;&lt;br /&gt;But please don't say 'the community'...&lt;br /&gt;&lt;br /&gt;Anyway, the wording aside, I can't wait to see your contributions. I am sure they will help to make Hudson (and indirectly Jenkins) a better product.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-5433323234752807422?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/5433323234752807422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2011/02/sonatypes-hudsons-bright-future-answer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/5433323234752807422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/5433323234752807422'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2011/02/sonatypes-hudsons-bright-future-answer.html' title='Sonatype&apos;s Hudson&apos;s bright future - answer'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-4866847444045753737</id><published>2011-02-02T06:20:00.003+01:00</published><updated>2011-02-02T06:25:36.578+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jenkins'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><title type='text'>The Future of Hudson</title><content type='html'>&lt;a href="http://www.flickr.com/photos/7344281@N03/5408603218/" title="Unsubscribe @ hudson by Jerome Lacoste, on Flickr"&gt;&lt;img src="http://farm6.static.flickr.com/5213/5408603218_11fb9ebafa_b.jpg" width="1024" height="637" alt="Unsubscribe @ hudson" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Looks like quite a few people think that unssubcribing the developper mailing list is the way to put "the saga behind".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-4866847444045753737?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/4866847444045753737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2011/02/future-of-hudson.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4866847444045753737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4866847444045753737'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2011/02/future-of-hudson.html' title='The Future of Hudson'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5213/5408603218_11fb9ebafa_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-3062379367081147736</id><published>2011-02-02T06:04:00.003+01:00</published><updated>2011-02-02T06:15:19.728+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ci'/><category scheme='http://www.blogger.com/atom/ns#' term='jenkins'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><title type='text'>Hudson vs CruiseControl, presentation from 2008</title><content type='html'>(Note: Because it's historical, I will still keep the hudson name in that post, but that content of course also applies to Jenkins.)&lt;br /&gt;&lt;br /&gt;Looks like Google Docs doesn't allow viewing my Open Office presentations. I digged that old &lt;a href="https://docs.google.com/present/view?id=dkgggr3_141hmt8qhg9"&gt;Hudson vs CC presentation&lt;/a&gt; I made in 2008. You may find some interesting notes in particular:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Slide 13: some stats on hudson source&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Slide 14: some stats on hudson releases where I plotted releases from 1.04 to 1.210 (pretty impressive rate at the time !)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Slides 15&amp;16: Hudson success factors&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Slides 17: Benefits&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Slides 18: 4 things to do:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Try it&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Like it&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Use it&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Contribute&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-3062379367081147736?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/3062379367081147736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2011/02/hudson-vs-cruisecontrol-presentation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/3062379367081147736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/3062379367081147736'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2011/02/hudson-vs-cruisecontrol-presentation.html' title='Hudson vs CruiseControl, presentation from 2008'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-1771278291098221846</id><published>2011-01-30T13:11:00.008+01:00</published><updated>2011-02-07T11:55:47.403+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jenkins'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>The Hudson rename/fork. Part 1 - a question of fears and mis-communications</title><content type='html'>(Disclaimer: I am a registered Hudson developer, although I haven't commited much on the project. I use Hudson on site at most clients. I have always been interested in CI and am a former external contributor to the cruisecontrol project. I also voted yes to the fork/rename, for reasons I may explain in a further post)&lt;br /&gt;&lt;br /&gt;For those who don't know, the renaming/forking of &lt;a href="http://hudson-labs.org"&gt;Hudson&lt;/a&gt; into Jenkins &lt;a href="http://hudson.361315.n4.nabble.com/Rename-Vote-Results-tt3246526.html"&gt;was decided a few hours ago&lt;/a&gt;, 214 votes against 14.&lt;br /&gt;Although a lot will happen around those projects in the next future, I think it is important to have a look at this event right now.&lt;br /&gt;To me, this renaming/fork symbolizes the big culture gap between open source and corporate driven projects, and I could add, between Sun (RIP) and Oracle.&lt;br /&gt;&lt;br /&gt;The information I gathered here come from the different public documents found on the web and a few private conversations/communications with some of the main actors of Hudson's community.&lt;br /&gt;&lt;br /&gt;I'll cut this post in 4 sections&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="#sec1"&gt;an historical perspective&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="#sec2"&gt;an analysis of the current problem&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;some previsions about what may happen&lt;/li&gt;&lt;br /&gt;&lt;li&gt;a few learnings for current or wanabe open source projects and/or for companies wanting to build models around open source&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The first 2 sections will be addressed in this document, the 2 later ones in a later post.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note: This article contains mostly facts and a few personal opinions. I've tried to keep the facts in this document. There might some innaccuracies. If you find any, please accept my apologies if any and feel free to point them out.&lt;br /&gt;&lt;br /&gt;&lt;a name="sec1"&gt;&lt;/a&gt;&lt;h2&gt;I - The historical perspective&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;If you know all about Hudson's history, you might want to skip this section.&lt;br /&gt;&lt;br /&gt;The key moments&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Kohsuke Kawaguchi started Hudson end of 2004 as a hobby project. Kohsuke was working at Sun on various Java related projects (e.g. Jaxb)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;the first public release that I know of was release 1.04, released on the 9th of February 2005, and weigthed 2.32M (!) [LINK]&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Hudson has irregular releases up to early 2006, but from Februar of that year, hudson was released almost at least once a week, except maybe in June and early July 2006. I guess Kohsuke took some holidays !&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Hudson quickly became one of the top community projects on java.net and &lt;a href="http://wiki.hudson-ci.org/pages/viewpage.action?pageId=31064095"&gt;was itself heavily used at Sun&lt;/a&gt; (over 15 servers in Sep 2007). I'll come back to that part later on.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;in Mai 2008, &lt;a href="http://weblogs.java.net/blog/2008/05/29/ill-be-spending-more-time-hudson-going-forward"&gt;Sun allowed Kohsuke to work on hudson full time&lt;/a&gt;. This was great news and probably not unexpected as Sun was at the time a full open source company and was seen this as a nice opportunity&lt;/li&gt;&lt;br /&gt;&lt;li&gt;April 20th 2009 &lt;a href="http://www.oracle.com/us/corporate/press/018363"&gt;Oracle announced it bought Sun&lt;/a&gt;. The &lt;a href="http://www.oracle.com/us/corporate/press/044428"&gt;acquisition was completed&lt;/a&gt; on January 27th 2010&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://weblogs.java.net/blog/kohsuke/archive/2010/04/05/good-bye-sunoracle"&gt;Kohsuke announced it was leaving Oracle&lt;/a&gt; in the following early April, and registered hudson-labs.org a few days later (14-Apr-2010 05:05:13 UTC according to &lt;a href="http://www.whois.net/whois/hudson-labs.org"&gt;whois.net&lt;/a&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;then in the past few months, things accelerated. The community took some decisions, Oracle others, and the clash grew. &lt;a href="http://www.hudson-labs.org/node/268"&gt;This article&lt;/a&gt; is a good summary, I'll let you read it's "The facts" section&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I'll just note that on 2010.10.29 Oracle Oracle filled for the Hudson Trademark in Europe (&lt;a href="http://oami.europa.eu/bulletin/ctm/2010/2010_231/009482902.htm"&gt;application nb: 009482902&lt;/a&gt;) and on 2010.12.08 &lt;a href="http://tess2.uspto.gov/bin/showfield?f=doc&amp;state=4001:n27jpl.6.12"&gt;in USA&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="sec2"&gt;&lt;/a&gt;&lt;h2&gt;II - analysing the problem&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Rewind the few last weeks and watch the dominoes fall. The last moves are crucial.&lt;br /&gt;&lt;br /&gt;At some point, Oracle registers the trademark (without notifying the community).&lt;br /&gt;At about the same time they ask for co-ownership of the project on java.net. The community agrees "as a nice gesture". Then the java.net migration indicent is the straw that broke the camel's back. The community finally took the decision to move the mailing lists to google groups and the code hosting to github, because they needed a working solution.&lt;br /&gt;From then on, the gap is there, and even if the 2 parties still exchange ideas, there's a communication gap, and that leads to the rename/fork.&lt;br /&gt;&lt;br /&gt;Note that I keep talking about &lt;strong&gt;rename/fork&lt;/strong&gt;. That's because the 2 parties don't agree on how to name the act. The developers, thinking the project is theirs, are simpling renaming the project to solve some legal issues, and move the infrastructure elsewhere. Oracle who intend to keep the name Hudson for their own version, considers this move a fork.&lt;br /&gt;&lt;br /&gt;It's all a question of perspective. And to further understand the root of the problem, let's try to place ourselves from both perspectives.&lt;br /&gt;&lt;br /&gt;I am a big fan of &lt;a href="http://en.wikipedia.org/wiki/Nonviolent_Communication"&gt;Non Violent Communication&lt;/a&gt;, and I will try to list here the actions each party took, and how these affected the feelings of the other party&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;once Oracle purchased Sun, they needed whether or not to keep the project running. &lt;a href="http://blogs.sun.com/GeorgeTrujillo/entry/d_day_at_sun_microsystems"&gt;Hudson was clearly a strategic asset to Oracle&lt;/a&gt;. I am not sure, but they probably increased the number of resources on the project. &lt;em&gt;"We are here, trying to work in a community we have been part of for almost a year, trying to make it better for everyone and promote it's growth and potential."&lt;/em&gt; &lt;a href="http://hudson.361315.n4.nabble.com/hudson-java-net-is-alive-tp3058272p3065827.html"&gt;source&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;java.net is also strategic to Oracle. Understandably Oracle wants to federate the projects resolving around Java on this development platform.&lt;br /&gt;  To me and many in the community this is irrelevant. Java.net is notorious for its instability, and for many the only reason we go there, is named "Hudson"... The rest of the world holds the most interesting java projects (Apache, Codehaus, github, Google code...).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;keep in mind that a lot of people in the open source community fear what Oracle might do to the Open Source projects formerly owned by Sun. &lt;a href="http://pelegri.wordpress.com/2011/01/16/a-year-after-the-open-source-projects/"&gt;This summary&lt;/a&gt; (by Kohsuke's former boss) seems to indicate that some of these fears have some substance.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;the Oracle Hudson trademark registration happening behind the back of the community, effectively 'breaking Sun's promise' doesn't help keeping trust between the parties. This happens a few days before Oracle asked to co-own the Hudson project on java.net. This combined with the java.net infrastructure upgrade incident, a move uniteraly decided by Oracle for the benefits of all, and the community feels that Oracle is asserting ownership of the hudson project.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;by then, Oracle comes with many interesting issues regarding hudson: core licensing issues (over 10 OSS licenses gravitate over the core), quality/stability issues, reasons for enforcing the branding of the project, size of the community much bigger than what the mailing lists are seeing ("tip of the iceberg"), etc&lt;/li&gt;&lt;br /&gt;&lt;li&gt;but Oracle is feared and not trusted. The community reacts by making demands that Oracle can't accept. Transferring the trademark to a third party entity isn't accepted. Replacing the Oracle contributor agreement to something more balanced aren't things Oracle can't let happen that fast. This is Oracle, one of the biggest software corporation of the world. It purchased Sun right ?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;then it is clear from Kohsuke's latest blog entry that the clash has now grown very emotional. According to him, Oracle asked him to &lt;em&gt;"find something else to work on"&lt;/em&gt;(&lt;a href="http://kohsuke.org/2011/01/26/one-last-plea-for-hudsonjenkins-vote/"&gt;source&lt;/a&gt;). Hudson being his pet project to start with, and having used lots of free time on it, I understand he feels threatened in his rights, and a bit of lack of respect, from a company who's probably earning some money from that project.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;you don't want the main reason behind a project to want to publicly ask for a fork/rename. Game over.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;What I find interesting is that &lt;strong&gt;most arguments&lt;/strong&gt; raised by Oracle are valid to me. Alone these could have been let aside for the moment. But the chain of events make this impossible.&lt;br /&gt;And all arguments raised by the community are also valid! And those combined arguments can probably be solved in a manner satisfying by all. Yet the divorce is innevitable. The 2 parties can't listen to each other. Or at least the community cannot trust Oracle, and Oracle isn't clearing their fears.&lt;br /&gt;&lt;br /&gt;Let me guess what happened here. Oracle probably assessed Hudson's status internally. And they asked their customers.&lt;br /&gt;I can guess their sales department giving a few phone calls to big businesses. "You aren't using Hudson ? Why ?" And feeding the answers up to Oracle project managers and engineers who come up with a "Plan" to fix it all. Here are the issues to address: solve licensing, make the product more stable, etc... How is this solved ? By adding more control...&lt;br /&gt;java.net sucks ? Oh yeah, let's move to Kenai. As for the risk of brand dillution ? Let's make sure Hudson means Hudson, trademark the thing to make sure we can control how the external people name hudson. And the Oracle machine moves on, implementing the decisions. For the good of the community.&lt;br /&gt;&lt;br /&gt;Yet &lt;strong&gt;without&lt;/strong&gt; talking with the community.&lt;br /&gt;&lt;br /&gt;And when they talk, and show &lt;a href="http://hudson-ci.org/docs/process_summary.html"&gt;their plan&lt;/a&gt;, or try to keep the community on java.net, saying they're working in the project's best interest, it's already too late. They bring arguments that the community can't grasp. Oracle feels that their decisions are right: they are indeed proxying the voice of many of their users/potential customers! And they have probably done a bit of work to find this information and try to solve the issues.&lt;br /&gt;Yet in an open source world, users are taken into account if they raise their voice. They should interact, or even better act!&lt;br /&gt;&lt;br /&gt;The developer community, who feels they are properly answering to the community of users (the one they see), cannot accept this from a (currently) minor contributor. There's a culture gap. Oracle tries to manage Hudson as a product, the community is only interested in the project. The cathedral meets the bazaar.&lt;br /&gt;&lt;br /&gt;Yet if you go back to each parties motives, you can see that most would benefit the project!&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;The community's motives&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;better infrastructure (DVCS vs svn, better lists, more control of their own tools)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;independence of the community&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Oracle's motives&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;provide compatibility and stability across instances of things calling themselves Hudson.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;represent the voice of their many users&lt;/li&gt;&lt;br /&gt;&lt;li&gt;enforce quality through development process (commit reviews, developer agreement)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;strong branding&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Yet the means to resolve those motives aren't shared. Because of a lack of early communication and mistrust. Too bad.&lt;br /&gt;&lt;br /&gt;What now ? I am hopeful that things will move forward in a positive manner and issues will settle. Whether engineers will work to make one or 2 very differing projects, I don't know yet.&lt;br /&gt;&lt;br /&gt;One thing I know? People will shut up and code will talk. Long live Hudson, Long live Jenkins !&lt;br /&gt;&lt;br /&gt;In a later post I will address the 2 next sections, i.e. previsions and learnings from this very interesting incident.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-1771278291098221846?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/1771278291098221846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2011/01/hudson-renamefork-part-1-question-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/1771278291098221846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/1771278291098221846'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2011/01/hudson-renamefork-part-1-question-of.html' title='The Hudson rename/fork. Part 1 - a question of fears and mis-communications'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-5711395802065039869</id><published>2011-01-20T13:40:00.002+01:00</published><updated>2011-01-20T13:43:41.843+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opendata'/><category scheme='http://www.blogger.com/atom/ns#' term='timeloss'/><category scheme='http://www.blogger.com/atom/ns#' term='oslo'/><title type='text'>Trafikanten &amp; open data update - things are happening!</title><content type='html'>I am just back from a meeting with Trafikanten (where I met the Advisor for realtime data and the QA responsible). The meeting has been from my point of view pretty constructive. We've then spent a bit of time to better understand our needs. We've exchanged thoughts around their current data offering, the licensing, etc and came up with ideas that I think will make many people happy. I won't say much more for the moment, as I am waiting for them to actually implement the ideas we talked about, but as soon as I know more, you'll be posted. I would like again to thank Trafikanten for their time and I really wish them good luck with their changes. Exiting times!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-5711395802065039869?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/5711395802065039869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2011/01/trafikanten-open-data-update-things-are.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/5711395802065039869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/5711395802065039869'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2011/01/trafikanten-open-data-update-things-are.html' title='Trafikanten &amp; open data update - things are happening!'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-4740646373545719161</id><published>2011-01-10T14:57:00.003+01:00</published><updated>2011-01-10T15:05:18.854+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opendata'/><category scheme='http://www.blogger.com/atom/ns#' term='oslo'/><title type='text'>Trafikanten: meeting on license and open data next week</title><content type='html'>A follow up after &lt;a href="http://lacostej.blogspot.com/2010/11/trafikanten.html"&gt;my last post on the topic of opendata/trafikanten&lt;/a&gt;. It seems that being constructive and open to new possibilities has some results. Trafikanten is revising their API license, in oart to be attractive to smaller actors as well. They invited me to a meeting on the 20th of January to present and discuss their new license proposal.&lt;br /&gt;&lt;br /&gt;If you have some meaning on the topic, feel free to contact me, publicly or privately.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-4740646373545719161?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/4740646373545719161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2011/01/trafikanten-meeting-on-license-and-open.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4740646373545719161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4740646373545719161'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2011/01/trafikanten-meeting-on-license-and-open.html' title='Trafikanten: meeting on license and open data next week'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-5596478121325029802</id><published>2011-01-05T14:03:00.002+01:00</published><updated>2011-01-05T14:14:59.591+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gpg'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Publishing your signed OSS project to the Sonatype OSS repository</title><content type='html'>One thing I wanted to do was to publish the &lt;a href="https://github.com/lacostej/yui-runner"&gt;yui-runner&lt;/a&gt; releases to ibiblio. It's now pretty easy thanks to the Sonatype OSS repository, which will help you stage and release your repositories.&lt;br /&gt;&lt;br /&gt;See &lt;a href="https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide"&gt;the official Sonatype OSS Maven Repository guide&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Because of a few choices (git, scala), I ran into a few troubles or quirks that are worth noting though. Here's the outline of the procedure I picked up:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;clean up your POM as per the documentation&lt;br /&gt;&lt;/li&gt;&lt;li&gt;no need yet to add sections for javadoc, pgp, release etc. They are by default included once the parent is inherited from. If you wish to test javadoc or pgp, you should then enable the &lt;strong&gt;sonatype-oss-release&lt;/strong&gt; profile to your maven execution when needed.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;if you do add the javadoc attach-sources goal, you might ran into problems that causes the reactor to not find the project's own internal dependencies. This is because I think that particular goal forks maven. See &lt;a href="https://github.com/lacostej/yui-runner/commit/7f15baa5a73c0da773a283800521a12d8c20a905"&gt;https://github.com/lacostej/yui-runner/commit/7f15baa5a73c0da773a283800521a12d8c20a905&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;you might want to configure the git push off by default (&lt;a href="http://jira.codehaus.org/browse/SCM-444"&gt;http://jira.codehaus.org/browse/SCM-444&lt;/a&gt;). This I think fits well with the staging principle of the Sonatype OSS repo. Use something like:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;     &amp;lt;plugin&amp;gt;&lt;br /&gt;       &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;       &amp;lt;artifactId&amp;gt;maven-release-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;       &amp;lt;version&amp;gt;2.1&amp;lt;/version&amp;gt;&lt;br /&gt;       &amp;lt;configuration&amp;gt;&lt;br /&gt;         &amp;lt;pushChanges&amp;gt;false&amp;lt;/pushChanges&amp;gt;&lt;br /&gt;       &amp;lt;/configuration&amp;gt;&lt;br /&gt;     &amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;during release, you might want to add the use of the gpg agent if you don't like to enter your GPG passphrase for every module&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;     &amp;lt;plugin&amp;gt;&lt;br /&gt;       &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;       &amp;lt;artifactId&amp;gt;maven-gpg-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;       &amp;lt;version&amp;gt;1.1&amp;lt;/version&amp;gt;&lt;br /&gt;       &amp;lt;configuration&amp;gt;&lt;br /&gt;         &amp;lt;useAgent&amp;gt;true&amp;lt;/useAgent&amp;gt;&lt;br /&gt;       &amp;lt;/configuration&amp;gt;&lt;br /&gt;     &amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;li&gt;the Sonatype OSS repository expects releases to have a javadoc artifact. As the &lt;a href="https://github.com/davidB/maven-scala-plugin"&gt;maven-scala-plugin&lt;/a&gt; doesn't yet behave like the maven-javadoc-plugin, and doesn't produce nor attach a javadoc artifact to your build, I &lt;a href="https://github.com/lacostej/yui-runner/commit/374b84546f7299ec9d39eec7ba4b0290ce72c2c6"&gt;cheated a bit&lt;/a&gt;. This is of course temporary.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Deploying will require the use of GPG signatures. This is what i did on Ubuntu 10.10 to get it working as I wanted (with a gpg-agent):&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;create a signing key:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;jerome@lenovo-w510:~ $ gpg --gen-key&lt;br /&gt;jerome@lenovo-w510:~ $ gpg --list-keys&lt;br /&gt;jerome@lenovo-w510:~ $ gpg --keyserver pgp.mit.edu --send-key 576831db3ae26aaf&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;li&gt;install the agent:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;root@lenovo-w510:~ # apt-get install gnupg-agent&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;configure the gpg-agent. Under ~/.gnupg/gpg-agent.conf, write&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;pinentry-program /usr/bin/pinentry-gtk-2&lt;br /&gt;default-cache-ttl 86400&lt;br /&gt;max-cache-ttl 86400&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;start the agent and copy the output in the terminal (this can be moved to your DE session startup instead later on)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;jerome@lenovo-w510:~ $ gpg-agent --daemon&lt;br /&gt;GPG_AGENT_INFO=/tmp/gpg-t61OEn/S.gpg-agent:28820:1; export GPG_AGENT_INFO;&lt;br /&gt;jerome@lenovo-w510:~ $ GPG_AGENT_INFO=/tmp/gpg-t61OEn/S.gpg-agent:28820:1; export GPG_AGENT_INFO;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Now the release takes the form of:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;clean your directory (git status, git ignore, etc)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;mvn release:clean (optional)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;mvn release:prepare&lt;br /&gt;&lt;/li&gt;&lt;li&gt;git push --tags &amp;amp;&amp;amp; git push (if you disabled push)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;mvn release:perform&lt;br /&gt;&lt;/li&gt;&lt;li&gt;follow the Sonatype doc for testing your staging repo and releasing it. If you run into problems, don't forget to drop your repo before releasing again.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&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/542274948422156627-5596478121325029802?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/5596478121325029802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2011/01/publishing-your-signed-oss-project-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/5596478121325029802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/5596478121325029802'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2011/01/publishing-your-signed-oss-project-to.html' title='Publishing your signed OSS project to the Sonatype OSS repository'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-5514463340663531363</id><published>2011-01-05T13:43:00.006+01:00</published><updated>2011-01-05T14:03:13.972+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='js'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>yui-runner, what it's for ?</title><content type='html'>I've released the first public version of yui-runner, a small framework for automating the running of YUI javascript unit tests and reporting of their results.&lt;br /&gt;&lt;br /&gt;See &lt;a href="https://github.com/lacostej/yui-runner"&gt;https://github.com/lacostej/yui-runner&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As the main goal is to be able to run your tests from anywhere, the integration is done thanks to a JUnit runner. This means your tests will run in maven thanks to surefire or in your favorite editor.&lt;br /&gt;&lt;br /&gt;An example project can be found under &lt;a href="https://github.com/lacostej/yui-runner/tree/master/yui-runner-it/src/test/resources"&gt;https://github.com/lacostej/yui-runner/tree/master/yui-runner-it/src/test/resources&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The project will soon be available on ibiblio, something I'll blog about.&lt;br /&gt;&lt;br /&gt;Note: the API for yui-runner is going to change for more flexibility in selecting the URLs to load.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-5514463340663531363?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/5514463340663531363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2011/01/yui-runner-what-its-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/5514463340663531363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/5514463340663531363'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2011/01/yui-runner-what-its-for.html' title='yui-runner, what it&apos;s for ?'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-454933968560235974</id><published>2010-12-12T10:09:00.003+01:00</published><updated>2010-12-12T12:15:05.820+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='js'/><title type='text'>user.js scripts for browser (firefox &amp; chromium)</title><content type='html'>I wrote a Greasemonkey script for a friend: &lt;a href="http://lacostej.github.com/disable-keyboard/ "&gt;Disable keyboard input&lt;/a&gt;. As strange as it sounds, the goal is to let someone navigate with a mouse but not use they keyboard to enter stuff. The user suffers &lt;a href="http://en.wikipedia.org/wiki/Alzheimer's_disease"&gt;Alzheimer's disease&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I found out by accident that chrome also supports firefox greasemonkey user.js. It treats them as extensions. Now chromium doesn't seem to have a GUI to manage the installed scripts, and as it changes the script's file name upon installation, I had to use &lt;code&gt;grep&lt;/code&gt; to find the proper file. On linux, that particular installation went under:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/home/jerome/.config/chromium/Default/Extensions/hlikiangigedihjlmhceanglikpccjoi/1.0_0/script.js&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Stop the browser, delete the directory and restart the browser to get the extension removed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-454933968560235974?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/454933968560235974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2010/12/userjs-scripts-for-browser-firefox.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/454933968560235974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/454933968560235974'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2010/12/userjs-scripts-for-browser-firefox.html' title='user.js scripts for browser (firefox &amp; chromium)'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-6140032432363841299</id><published>2010-12-12T08:40:00.002+01:00</published><updated>2010-12-12T08:49:51.166+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='dev'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Intellij issues on Ubuntu 64 bits with encrypted /home</title><content type='html'>Kept running into strange index issues with my Intellij 9 and 10 installations. The system/log/idea.log file was filled with:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;java.lang.RuntimeException: java.lang.IllegalArgumentException: can't position buffer to offset 43716&lt;br /&gt;        at com.intellij.util.io.PersistentEnumerator.valueOf(PersistentEnumerator.java:499)&lt;br /&gt;        at com.intellij.util.io.StringRef.getString(StringRef.java:48)&lt;br /&gt;        at com.intellij.util.io.StringRef.toString(StringRef.java:92)&lt;br /&gt;[..]&lt;br /&gt;Caused by: java.lang.IllegalArgumentException: can't position buffer to offset 43716&lt;br /&gt;        at com.intellij.util.io.PagedFileStorage.get(PagedFileStorage.java:181)&lt;br /&gt;        at com.intellij.util.io.PagedFileStorage.getInt(PagedFileStorage.java:127)&lt;br /&gt;        at com.intellij.util.io.ResizeableMappedFile.getInt(ResizeableMappedFile.java:141)&lt;br /&gt;[..]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;or&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;java.lang.IndexOutOfBoundsException: off=1006632960 key.owner.length()=17582&lt;br /&gt;        at com.intellij.util.io.PagedFileStorage$StorageLock$BuffersCache.createValue(PagedFileStorage.java:66)&lt;br /&gt;        at com.intellij.util.io.PagedFileStorage$MyCache.get(PagedFileStorage.java:329)&lt;br /&gt;        at com.intellij.util.io.PagedFileStorage.getBuffer(PagedFileStorage.java:280)&lt;br /&gt;        at com.intellij.util.io.PagedFileStorage.get(PagedFileStorage.java:176)&lt;br /&gt;        at com.intellij.util.io.PagedFileStorage.getInt(PagedFileStorage.java:127)&lt;br /&gt;        at com.intellij.util.io.ResizeableMappedFile.getInt(ResizeableMappedFile.java:141)&lt;br /&gt;        at com.intellij.util.io.PersistentEnumerator.hashCodeOf(PersistentEnumerator.java:479)&lt;br /&gt;        at com.intellij.util.io.PersistentEnumerator.enumerateImpl(PersistentEnumerator.java:328)&lt;br /&gt;        at com.intellij.util.io.PersistentEnumerator.enumerate(PersistentEnumerator.java:222)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I seem to have fixed the issue by moving the IDEA config and caches into a non encrypted partition.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ diff -u /usr/local/lib/idea/bin/idea.properties.orig /usr/local/lib/idea/bin/idea.properties&lt;br /&gt;--- /usr/local/lib/idea/bin/idea.properties.orig 2010-12-10 15:50:01.916136005 +0100&lt;br /&gt;+++ /usr/local/lib/idea/bin/idea.properties 2010-12-10 15:50:44.096136000 +0100&lt;br /&gt;@@ -10,13 +10,13 @@&lt;br /&gt; # Note for Windows users: please make sure you're using forward slashes. I.e. c:/idea/system&lt;br /&gt; &lt;br /&gt; # path to IDEA config folder. Make sure you're using forward slashes&lt;br /&gt;-idea.config.path=${user.home}/.IntelliJIdea10/config&lt;br /&gt;+idea.config.path=/usr/local/${user.home}/.IntelliJIdea10/config&lt;br /&gt; &lt;br /&gt; # path to IDEA system folder. Make sure you're using forward slashes&lt;br /&gt;-idea.system.path=${user.home}/.IntelliJIdea10/system&lt;br /&gt;+idea.system.path=/usr/local/${user.home}/.IntelliJIdea10/system&lt;br /&gt; &lt;br /&gt; # path to user installed plugins folder. Make sure you're using forward slashes&lt;br /&gt;-idea.plugins.path=${user.home}/.IntelliJIdea10/config/plugins&lt;br /&gt;+idea.plugins.path=/usr/local/${user.home}/.IntelliJIdea10/config/plugins&lt;br /&gt; &lt;br /&gt; #---------------------------------------------------------------------&lt;br /&gt; # Maximum file size (kilobytes) IDEA should provide code assistance for.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;See also &lt;a href="http://devnet.jetbrains.net/docs/DOC-181"&gt;http://devnet.jetbrains.net/docs/DOC-181&lt;/a&gt; and &lt;a href="http://devnet.jetbrains.net/message/5259840"&gt;http://devnet.jetbrains.net/message/5259840&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-6140032432363841299?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/6140032432363841299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2010/12/intellij-issues-on-ubuntu-64-bits-with.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/6140032432363841299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/6140032432363841299'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2010/12/intellij-issues-on-ubuntu-64-bits-with.html' title='Intellij issues on Ubuntu 64 bits with encrypted /home'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-4244798188130354041</id><published>2010-12-09T11:14:00.005+01:00</published><updated>2010-12-09T12:08:12.770+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Git svn tree corruption</title><content type='html'>I use git over svn for all my subversion projects. This morning I hit the following problem:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$ git svn rebase&lt;br /&gt;error: garbage at end of loose object 'd0df538270dcaf65a232fb4127b7c59212420129'&lt;br /&gt;fatal: object d0df538270dcaf65a232fb4127b7c59212420129 is corrupted&lt;br /&gt;diff-index HEAD --: command returned error: 128&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Mmm no backup accessible right now, and no way I am pulling remotely a git svn for this 7 years old tree.&lt;br /&gt;&lt;br /&gt;First let's find information on the commit.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$ mv .git/objects/d0/df538270dcaf65a232fb4127b7c59212420129 ../d0df538270dcaf65a232fb4127b7c59212420129&lt;br /&gt;$ git fsck --full&lt;br /&gt;broken link from    tree 066ce753000ca9e1cfbd07a709cac4c7c3e5da47&lt;br /&gt;              to    tree d0df538270dcaf65a232fb4127b7c59212420129&lt;br /&gt;dangling tree 866d5ac672d6ef4009319e176f195fd01697165c&lt;br /&gt;missing tree d0df538270dcaf65a232fb4127b7c59212420129&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;What does the previous tree contains ?&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$ git ls-tree 066ce753000ca9e1cfbd07a709cac4c7c3e5da47&lt;br /&gt;100755 blob 888ed870384e87dad0642199b4d7d938246946a8 xxx1&lt;br /&gt;100755 blob 346bd13c9ba0d15046af891ccc88aa225d3c7ee3 xxx2&lt;br /&gt;100755 blob 2eef3f1f2985ff1d9cdd4a23c8ebca54a9af1010 xxx3&lt;br /&gt;100644 blob 6a501e34ee0fb197fa6770b2a8cc40cdf276607a xxx4&lt;br /&gt;100755 blob fe61ef5d88201a7502057a2ff5fdd45db44f5075 xxx5&lt;br /&gt;040000 tree 38354b54d3dca537d9c7c9d9ec1668c0c7287bc9 ddd1&lt;br /&gt;040000 tree 50be3bfee5b37fc97b379ae04fe961a212a70a32 ddd2&lt;br /&gt;040000 tree 6b108f1b534bb9465c2e31efe51d06fb05499376 ddd3&lt;br /&gt;040000 tree 532a6da6ece3151b43a1cd0fd174fdadb071e402 ddd4&lt;br /&gt;040000 tree 45363718750ed5142fad1d7be311581748057297 ddd5&lt;br /&gt;040000 tree d0df538270dcaf65a232fb4127b7c59212420129 ddd6&lt;br /&gt;040000 tree b77d3e9240185ed148727e01d4d03ad726411724 ddd7&lt;br /&gt;040000 tree 8b69621e177132f3dc822c427501f1921f39bbe1 ddd8&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Didn't help much.&lt;br /&gt;&lt;br /&gt;In that SVN tree, my history is pretty linear. I try to find the commit before or after the one that fails:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$ git log --raw | grep svn+ssh | tail -1 | cut -d '@' -f 2&lt;br /&gt;fatal: unable to read destination tree (d0df538270dcaf65a232fb4127b7c59212420129)&lt;br /&gt;4321 20108eba-4dfa-0310-bbc5-8f3fd2a08cff&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Log fails to find the full history, and I now know which commits maps to the broken tree: 4320: the one before the last succesffuly logged commit (4321).&lt;br /&gt;&lt;br /&gt;Let's verify:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$ git svn find-rev r4320&lt;br /&gt;4e0264e69a5289c5ac5c461085c900009c90c5b9&lt;br /&gt;$ git show 4e0264e69a5289c5ac5c461085c900009c90c5b9&lt;br /&gt;fatal: unable to read destination tree (d0df538270dcaf65a232fb4127b7c59212420129)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now let's just fetch some versions around that commit and replace our broken tree file.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$ svn clone svn+ssh://blablabla.com/opt/svn-repository/xxx/trunk/xxx -r 4318:4322 xxx2.git&lt;br /&gt;$ mv xxx2.git/.git/objects/d0/df538270dcaf65a232fb4127b7c59212420129 .git/objects/d0/&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Check the commit ?&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$ git show 4e0264e69a5289c5ac5c461085c900009c90c5b9&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;git svn rebase now works !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-4244798188130354041?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/4244798188130354041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2010/12/git-svn-tree-corruption.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4244798188130354041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4244798188130354041'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2010/12/git-svn-tree-corruption.html' title='Git svn tree corruption'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-2930759583911094565</id><published>2010-11-11T13:37:00.003+01:00</published><updated>2010-11-11T14:05:34.995+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opendata'/><category scheme='http://www.blogger.com/atom/ns#' term='oslo'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>Opendata @ Trafikanten, answer strategies</title><content type='html'>Obviously (and unfortunately) &lt;a href="http://lacostej.blogspot.com/2010/11/open-trafikanten-data-update.html"&gt;Trafikanten isn't willing to cooperate to open up their data&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I have to answer them within about 10 days and I am left with different strategies:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;abandon&lt;br /&gt;&lt;li&gt;confrontation&lt;br /&gt;&lt;li&gt;negotiate&lt;br /&gt;&lt;li&gt;workaround&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;The first question one has to ask oneself is of course whether to &lt;b&gt;abandon&lt;/b&gt; or not. Is this worth our time? I will have to ponder that.&lt;br /&gt;&lt;br /&gt;The second option is go on with the &lt;b&gt;confrontation&lt;/b&gt;. It's clear to say that now, using lawyers to defend themselves, Trafikanten isn't currently very open for negotiation. Hard to say who caused the situation, and it's not even important. It's just a fact. I am pretty sure I can find arguments to counter their answer, or even find things that as a public company they are obliged to do causing them problems. I am not very interested in that, and I would prefer negotiation/cooperation.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Cooperation&lt;/b&gt;, a WIN/WIN solution would have been the best. Making Trafikanten truly a leader in open data in Norway, finding a gradual path that leads for opening their data little by little. It might be possible. But right now I don't know. The tone is set and probably hard to change and they've made it clear they didn't want to help small companies nor their users. But I am optimist by nature, so why not?&lt;br /&gt;&lt;br /&gt;As for the last solution, &lt;b&gt;workaround&lt;/b&gt;, I am also sure I can find a technical solution that solves my issue independently of them. Trafikanten has a public API, and I can probably build the DB of the interesting data based on it. It might be completely inefficient, maybe illegal, incomplete, but I will sure be able to gather part of this data.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-2930759583911094565?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/2930759583911094565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2010/11/trafikanten.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/2930759583911094565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/2930759583911094565'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2010/11/trafikanten.html' title='Opendata @ Trafikanten, answer strategies'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-1073671909835286186</id><published>2010-11-05T11:40:00.002+01:00</published><updated>2010-11-05T11:46:19.363+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opendata'/><category scheme='http://www.blogger.com/atom/ns#' term='timeloss'/><category scheme='http://www.blogger.com/atom/ns#' term='oslo'/><title type='text'>Open Trafikanten data, update</title><content type='html'>A little update after &lt;a href="http://lacostej.blogspot.com/2010/09/open-trafikanten-data-better-future.html"&gt;my latest encouraging post&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/7344281@N03/5148400180/" title="trafikanten by Jerome Lacoste, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4111/5148400180_222cd70a11_m.jpg" width="170" height="240" alt="trafikanten" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It doesn't seem that Trafikanten is ready to open some of its data. They are on the defensive now... I have 3 weeks to answer what I can answer to that mail.&lt;br /&gt;&lt;br /&gt;Too bad. I think we could have worked towards an open and better service for Norway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-1073671909835286186?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/1073671909835286186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2010/11/open-trafikanten-data-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/1073671909835286186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/1073671909835286186'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2010/11/open-trafikanten-data-update.html' title='Open Trafikanten data, update'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm5.static.flickr.com/4111/5148400180_222cd70a11_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-7658178022179448030</id><published>2010-09-16T08:31:00.005+02:00</published><updated>2010-09-16T08:59:01.193+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opendata'/><category scheme='http://www.blogger.com/atom/ns#' term='timeloss'/><category scheme='http://www.blogger.com/atom/ns#' term='oslo'/><title type='text'>Open Trafikanten data, a better future ?</title><content type='html'>Bjørn started a &lt;a href="http://www.facebook.com/#!/group.php?gid=350434171855"&gt;Facebook group&lt;/a&gt; to push for open communications from Trafikanten and NSB. I am all for it.&lt;br /&gt;&lt;br /&gt;Last year I tried to get access to similar information from Trafikanten and Ruter. I didn't manage to get anything.&lt;br /&gt;&lt;br /&gt;Here's a few extract from communications I had with them.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;From: Me&lt;br /&gt;To: rutekonto@trafikanten.no&lt;br /&gt;&lt;br /&gt;Subject: Programmatic cccess to "rute &amp; sanntid" information&lt;br /&gt;&lt;br /&gt;Hei,&lt;br /&gt;&lt;br /&gt;I am searching for information on how to programmatically access route&lt;br /&gt;and 'true-time' information for community transport services in Oslo.&lt;br /&gt;The intent is to develop innovative applications related to public&lt;br /&gt;transportation.&lt;br /&gt;&lt;br /&gt;Is there someone at Trafikanten who can tell me more about this ? Or&lt;br /&gt;should I contact another company (Sporveien ? NRI ?).&lt;br /&gt;&lt;br /&gt;[...]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Answer:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;viser til telefonsamtalen nå i dag. Det hadde vært fint hvis du kunne sende&lt;br /&gt;noe (kort) generell informasjon om selskapet ditt på e-post, med oversikt &lt;br /&gt;over for eksempel relaterte tjenester og samarbeidspartnere. Vi vil deretter&lt;br /&gt;diskutere saken internt, og komme tilbake til deg.&lt;br /&gt;&lt;br /&gt;Med vennlig hilsen&lt;br /&gt;Torbjørn B.&lt;br /&gt;Trafikanten AS&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And after my mail:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;og takk for henvendelsen, som jeg har tatt opp her internt. Som jeg nevnte i går,&lt;br /&gt;har vi den type datautveksling som du skisserer, hovedsakelig mot våre etablerte&lt;br /&gt;partnere. Unntaksvis har vi også samarbeidet med større partnere som Universitetet&lt;br /&gt;i Oslo, Telenor og Opera Software om mer spesielle prosjekter.&lt;br /&gt;&lt;br /&gt;Beklageligvis har vi ikke mulighet til å inngå et tilsvarende samarbeid med ditt&lt;br /&gt;firma nå. Vi ønsker likevel lykke til i jakten på samarbeidspartnere!&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So I turned to Ruter and here's the answer I got from them:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Hi Jerome.&lt;br /&gt;&lt;br /&gt;Looks like you already got your answer.&lt;br /&gt;&lt;br /&gt;Gry&lt;br /&gt;&lt;br /&gt;-----Opprinnelig melding-----&lt;br /&gt;Fra: Magne B. [mailto:xxxxxxxxxx@trafikanten.no]&lt;br /&gt;Sendt: 14. april 2008 11:18&lt;br /&gt;Til: I. Gry&lt;br /&gt;Emne: SV: Programmatic access to "rute &amp; sanntid" information&lt;br /&gt;&lt;br /&gt;Hei Gry,&lt;br /&gt;&lt;br /&gt;Han fikk svar av Torbjørn i forrige uke.&lt;br /&gt;&lt;br /&gt;Vennlig hilsen&lt;br /&gt;Magne B.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I answered:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Yes. Trafikanten said they were unable to help me, so I turn to Ruter&lt;br /&gt;AS instead.&lt;br /&gt;&lt;br /&gt;Aren't Ruter AS and Trafikanten 2 different companies ? Aren't you the&lt;br /&gt;producer of the information Trafikanten exposes on the Internet ?&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;to which Gry answered:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Trafikanten is owned partly bu Ruter. But no, they produce most of their info themselves.&lt;br /&gt;&lt;br /&gt;have an nice day!&lt;br /&gt;&lt;br /&gt;Yours sincerely,&lt;br /&gt;&lt;br /&gt;Med vennlig hilsen&lt;br /&gt;Gry I.&lt;br /&gt;Informasjonssjef&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A few more phone calls and emails to Trafikanten, NRI, Ruter etc... Nothing productive. I also had a talk with some developers in Oslo, e.g. people from &lt;a href="http://shortcut.no/"&gt;Shortcut AS&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I gave up.&lt;br /&gt;&lt;br /&gt;The situation on this topic is hopefully to change soon ! I would love to have an API that one can use freely with a small number of requests. A la Google Maps.&lt;br /&gt;&lt;br /&gt;Such open data developer infrastructure could be shared with all public companies in Norway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-7658178022179448030?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/7658178022179448030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2010/09/open-trafikanten-data-better-future.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7658178022179448030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7658178022179448030'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2010/09/open-trafikanten-data-better-future.html' title='Open Trafikanten data, a better future ?'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-3768082661048996899</id><published>2010-09-15T13:25:00.003+02:00</published><updated>2010-09-15T13:37:27.386+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>The sad state of Java decompilers</title><content type='html'>There are no good complete Java decompilers it seems. And this is sad.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;I use java decompiler often. Because I am curious how something works. Because sometimes I need to modify/fix something I don't have the code for. Because I need to prove a bug is in a third party component. Because I need to be able to find a way to find a workaround to a broken system. Etc.&lt;br /&gt;&lt;br /&gt;Yet to my knowledge there's no more world class Java decompiler:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;jad (&lt;a href="http://www.varaneckas.com/jad"&gt;http://www.varaneckas.com/jad&lt;/a&gt;), while still one of the best, hasn't been maintained properly since 2001! Still one of the best. But it doesn't support latest byte code formats. &lt;br /&gt;&lt;li&gt;Java Decompiler (&lt;a href="http://java.decompiler.free.fr/"&gt;http://java.decompiler.free.fr/&lt;/a&gt;) is not bad, fast, maintained but not open source and lacks many basic options to my taste (e.g. command line...). It will not be open sourced, etc. Will it end like jad ? or will it replace it as the current freeware best decompiler ?&lt;br /&gt;&lt;li&gt;fernflower (&lt;a href="http://www.reversed-java.com/fernflower/"&gt;http://www.reversed-java.com/fernflower/&lt;/a&gt;) doesn't work anymore. And it's based on a web service. Which cannot be used sometimes.&lt;br /&gt;&lt;li&gt;jdec (&lt;a href="http://jdec.sourceforge.net/"&gt;http://jdec.sourceforge.net/&lt;/a&gt;) lacks basic java 5 features (enums, ...), the command line version relies on a property file, and is slow, etc...&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;etc. etc. &lt;a href="http://stackoverflow.com/questions/2718814/any-maintained-open-source-java-decompiler"&gt;http://stackoverflow.com/questions/2718814/any-maintained-open-source-java-decompiler&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But most importantly, none of the programs above produce compilable code. That means I have to revert to javap again to fill in the gaps. Even for things that don't seem too hard to get.&lt;br /&gt;&lt;br /&gt;Now that Java is as much a platform as a language, it would be nice to have a proper (and hopefully open) decompiler that supports java 5 (released in 2004), and optionally other languages (groovy, scala, etc).&lt;br /&gt;&lt;br /&gt;Strange that noone started something like that at codehaus or other Apache license friendly organization.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-3768082661048996899?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/3768082661048996899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2010/09/sad-state-of-java-decompilers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/3768082661048996899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/3768082661048996899'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2010/09/sad-state-of-java-decompilers.html' title='The sad state of Java decompilers'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-1339936629885770810</id><published>2010-08-25T12:17:00.004+02:00</published><updated>2010-08-25T13:19:08.192+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='process'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='bdd'/><title type='text'>Minimalist groovy BDD framework, from executable documentation to readable tests</title><content type='html'>In many projects, my target customers are other developers, not an end user that write prose. I am a developer. I don't write documentation, I write code, &lt;strong&gt;documented code&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;When it comes to testing, I like the BDD approach. I've tested various BDD frameworks (easyb, cucumber, spock...). But I wasn't completely satisfied for various reasons (setup complexity, issues, maintainability, toolchain).&lt;br /&gt;&lt;br /&gt;So I've gone back from executable documentation to readable tests. And I have settled on my own framework. Framework is a big name, you will see. In combination with mockito and a few coding conventions, it's the 1% that give me the 99% that I am looking for.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/**&lt;br /&gt; * Simple Groovy BDD framework.&lt;br /&gt; *&lt;br /&gt; * To use with static imports. See BDDTest.groovy code for example&lt;br /&gt; *&lt;br /&gt; * We prefix method names with underscores characters to not conflict with things like Mockito.&lt;br /&gt; *&lt;br /&gt; * @author jerome@coffeebreaks.org&lt;br /&gt;*/&lt;br /&gt;class BDD {&lt;br /&gt; static def _given(Closure block) {&lt;br /&gt;   block.run()&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; static def _when(Closure block) {&lt;br /&gt;   block.run()&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; static def _then(Closure block) {&lt;br /&gt;   block.run()&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That's it.&lt;br /&gt;&lt;br /&gt;Example usage:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class Doer {&lt;br /&gt;  def Listener listener;&lt;br /&gt;&lt;br /&gt;  def hello(name) {&lt;br /&gt;    listener.notify("hello " + name);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;interface Listener {&lt;br /&gt;  def notify(String msg)&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The tests themselves&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import static BDD.*&lt;br /&gt;import static org.mockito.Mockito.*&lt;br /&gt;import org.junit.Test&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Example test using the simple BDD framework&lt;br /&gt; *&lt;br /&gt; * @author jerome@coffeebreaks.org&lt;br /&gt; */&lt;br /&gt;public class BDDTest {&lt;br /&gt; def sum(a, b) {&lt;br /&gt;   return a + b&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Test&lt;br /&gt; void summing() {&lt;br /&gt;   def a, b, s&lt;br /&gt;   _given {&lt;br /&gt;     a = 1&lt;br /&gt;     b = 1&lt;br /&gt;   }&lt;br /&gt;   _when {&lt;br /&gt;     s = sum(a, b)&lt;br /&gt;   }&lt;br /&gt;   _then {&lt;br /&gt;     assert s == 2&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Test&lt;br /&gt; void mockitoIntegration() {&lt;br /&gt;   def listener, doer&lt;br /&gt;   _given {&lt;br /&gt;     listener = mock(Listener)&lt;br /&gt;     doer = new Doer()&lt;br /&gt;     doer.listener = listener&lt;br /&gt;   }&lt;br /&gt;   _when {&lt;br /&gt;     doer.hello("bdd")&lt;br /&gt;   }&lt;br /&gt;   _then {&lt;br /&gt;     verify(listener).notify("hello bdd")&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;When I have complex scenarios, e.g. for acceptance test, I write the scenarios using camel case methods and a base class for set up tear down&lt;br /&gt;&lt;br /&gt;E.g.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class SystemStartupTest extends AbstractSystemTest {&lt;br /&gt;  @Test&lt;br /&gt;  void systemStartedInXModeDisplaysProperGUI() {&lt;br /&gt;    _given {&lt;br /&gt;      aSystemConfiguredWithOptions(Mode.X, [Options.A, Options.C]&lt;br /&gt;    }&lt;br /&gt;    _when {&lt;br /&gt;      systemStarts()&lt;br /&gt;    }&lt;br /&gt;    _then {&lt;br /&gt;      theAPanelShouldBeVisible()&lt;br /&gt;      theXButtonShouldBeActivated()&lt;br /&gt;      theXTableShouldBeFocused()&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  void theXTableShouldBeFocused() {&lt;br /&gt;    assert system.getView().getXTable().hasFocus()&lt;br /&gt;  }&lt;br /&gt;  [...]&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Benefits:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; the setup complexity is ridiculous simple, no special build and IDE plugin, no special syntax, etc&lt;br /&gt;&lt;li&gt; I can reorganize my code the way I want and refactor it at will (extract methods...)&lt;br /&gt;&lt;li&gt; I stick to known frameworks (JUnit, Groovy assert, mockito) and coding syntax&lt;br /&gt;&lt;li&gt; I don't have text -&gt; code mapping to maintain. Maintenance is bloody easy&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Drawbacks:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; I don't have nice colored reports when I have a failure (which I don't necessarily care of as long as I have my stack trace...)&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Some might say it's not readable, that the GWT blocks pollute the code, that the camel case methods aren't practical to read, and sometimes have to be expressed differently as the arguments are postfixed.&lt;br /&gt;&lt;br /&gt;But I am used to these limitations, I live in them since I write code, and I will be the one maintaining the code anyway.&lt;br /&gt;&lt;br /&gt;So this might not be for you. But for me, so far, on selected projects, it works.&lt;br /&gt;&lt;br /&gt;Ask yourself: what is it you can't leave without from your BDD framework ? If you were to have a minimalist BDD framework, what would you have in it ?&lt;br /&gt;&lt;br /&gt;For me it wasn't the framework itself, it was the process, the communication that was enforced upfront. And this doesn't depend on your framework.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-1339936629885770810?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/1339936629885770810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2010/08/minimalist-groovy-bdd-framework-from.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/1339936629885770810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/1339936629885770810'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2010/08/minimalist-groovy-bdd-framework-from.html' title='Minimalist groovy BDD framework, from executable documentation to readable tests'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-7801305566928089969</id><published>2010-07-13T10:07:00.005+02:00</published><updated>2010-07-13T10:26:49.874+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Migrating from Android JF1.5 to CM6 (Froyo) on my G1/ADP1</title><content type='html'>My notes regarding my upgrade of Android 1.5 to 2.2 on my G1/ADP1. Also how I manually imported /data after failing to rerun my 1.5 OS.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Some links&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://forum.xda-developers.com/showpost.php?p=4647751&amp;amp;postcount=1"&gt;http://forum.xda-developers.com/showpost.php?p=4647751&amp;amp;postcount=1&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://forum.xda-developers.com/showthread.php?t=722801"&gt;http://forum.xda-developers.com/showthread.php?t=722801&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://developer.htc.com/adp.html"&gt;http://developer.htc.com/adp.html&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Normal OS Upgrade&lt;/h2&gt;&lt;br /&gt;Before:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# rooted: yes&lt;br /&gt;# fastboot capable: yes&lt;br /&gt;# HBOOT-0.95.3000&lt;br /&gt;# CPLD-4&lt;br /&gt;# RADIO 2.22.19.26I&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ md5sum fastboot&lt;br /&gt;9851bb6ad29cd4b60c9ba9d011ba9efd  fastboot&lt;br /&gt;$ ./fastboot devices&lt;br /&gt;HT846GZ39709 fastboot&lt;br /&gt;$ md5sum 2.2/recovery-RA-dream-v1.7.0.img&lt;br /&gt;4b9f198aa8ada3ca1ed5537e9c25e427  2.2/recovery-RA-dream-v1.7.0.img&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Boot in fast mode (BACK+HANG)&lt;br /&gt;&lt;br /&gt;Plug USB&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ ./fastboot flash recovery 2.2/recovery-RA-dream-v1.7.0.img&lt;br /&gt;sending 'recovery' (4594 KB)... FAILED (command write failed (Protocol error))&lt;br /&gt;jerome@expresso2:~/Code/MyAndroid$ ./fastboot devices&lt;br /&gt;???????????? fastboot&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ouch!&lt;br /&gt;&lt;br /&gt;rebooted (CALL+MENU+HANG) and tried again&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ ./fastboot flash recovery 2.2/recovery-RA-dream-v1.7.0.img&lt;br /&gt;sending 'recovery' (4594 KB)... OKAY&lt;br /&gt;writing 'recovery'... OKAY&lt;br /&gt;&lt;br /&gt;$ ./fastboot reboot&lt;br /&gt;rebooting...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nandroid&lt;br /&gt;&lt;br /&gt;boot into recovery (HOME+HANG)&lt;br /&gt;&lt;br /&gt;verify that Build is RA-dream-1.7.0&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ pushd /home/jerome/local/lib/nandroid-2.0/&lt;br /&gt;jerome@expresso2:~/local/lib/nandroid-2.0$ ./nandroid.sh ~/Code/MyAndroid/backups/backup_20100712_1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;boot normally&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ sha1sum 2.2/spl-signed.zip&lt;br /&gt;34b26d57985a610f538633e6571d1847c8a4800b  2.2/spl-signed.zip&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;forgot to copy the CM rom onto the sdcard ... so added it while in recovery mode:&lt;br /&gt;&lt;br /&gt;go to console&lt;br /&gt;mount /sdcard&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;adb push 2.2/update-cm-6.0.0-DS-RC1-signed.zip /sdcard/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;verify md5&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Correct according to&lt;br /&gt;&lt;a href="http://code.google.com/p/sapphire-port-dream/downloads/detail?name=spl-signed.zip&amp;amp;can=2&amp;amp;q="&gt;http://code.google.com/p/sapphire-port-dream/downloads/detail?name=spl-signed.zip&amp;amp;can=2&amp;amp;q=&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ cp 2.2/spl-signed.zip /media/3436-3337/&lt;br /&gt;jerome@expresso2:~/Code/MyAndroid$ md5sum 2.2/spl-signed.zip /media/3436-3337/spl-signed.zip&lt;br /&gt;2112b7df6ed9d0a56897ac23b0399bb5  2.2/spl-signed.zip&lt;br /&gt;2112b7df6ed9d0a56897ac23b0399bb5  /media/3436-3337/spl-signed.zip&lt;br /&gt;&lt;br /&gt;$ cp 2.2/gapps-mdpi-FRF91-3-signed.zip /media/3436-3337/&lt;br /&gt;jerome@expresso2:~/Code/MyAndroid$ md5sum 2.2/gapps-mdpi-FRF91-3-signed.zip /media/3436-3337/gapps-mdpi-FRF91-3-signed.zip&lt;br /&gt;1f64c3ff2d6f3f7078185af216f550df  2.2/gapps-mdpi-FRF91-3-signed.zip&lt;br /&gt;1f64c3ff2d6f3f7078185af216f550df  /media/3436-3337/gapps-mdpi-FRF91-3-signed.zip&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;umount partition&lt;br /&gt;turn off USB storage from G1&lt;br /&gt;reboot into receovey&lt;br /&gt;&lt;br /&gt;flashed spl-signed.zip&lt;br /&gt;&lt;br /&gt;rebooted via home+back&lt;br /&gt;&lt;br /&gt;G1 auto reboots into recovery mode and finish installing SPL&lt;br /&gt;&lt;br /&gt;wipe data/factory reset&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;flashed&lt;br /&gt;&lt;br /&gt;booted&lt;br /&gt;OK&lt;br /&gt;&lt;br /&gt;Welcome to Froyo ! Configure at will&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Issues&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Main problem was that applications are missing their data. (e.g. smses, etc).&lt;br /&gt;&lt;br /&gt;So I tried to return to 1.5 from backup with intent to install &lt;a href="http://matrixrewriter.com/android/"&gt;Titanium backup&lt;/a&gt; or similar. &lt;br /&gt;&lt;br /&gt;first wipe&lt;br /&gt;&lt;br /&gt;second recover nandroid backup (I don't recover recovery.img)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;./fastboot&lt;br /&gt;./fastboot devices&lt;br /&gt;./fastboot erase userdata&lt;br /&gt;./fastboot erase cache&lt;br /&gt;./fastboot flash boot backups/backup_20100712_1/boot.img&lt;br /&gt;./fastboot flash system backups/backup_20100712_1/system.tar&lt;br /&gt;./fastboot reboot&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;But this never worked...&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Reinstalling apps and associated data manually&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Prerequisites, have a data.tar somewhere from an android backup. Untar it.&lt;br /&gt;&lt;br /&gt;Reinstalling the apps&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ls -1 data/app/*.apk | xargs -l1 adb install&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;df -k /data on mobile vs du -sk on PC to verify there's enough space&lt;br /&gt;&lt;br /&gt;backup as in you never know&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;tar cvf /sdcard/data.tar /data/data&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Copy files and fix permissions.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;adb push data/misc/wifi/wpa_supplicant.conf /data/misc/wifi/wpa_supplicant.conf&lt;br /&gt;chown system:wifi /data/misc/wifi/wpa_supplicant.conf&lt;br /&gt;chmod 660 /data/misc/wifi/wpa_supplicant.conf&lt;br /&gt;&lt;br /&gt;adb push data/data /data/data/&lt;br /&gt;&lt;br /&gt;# http://wiki.cyanogenmod.com/index.php?title=Fix_permissions&lt;br /&gt;/system/bin/fix_permissions&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This takes a while..&lt;br /&gt;&lt;br /&gt;Boots properly. Requires to enter gmail account ?!&lt;br /&gt;Done.&lt;br /&gt;&lt;br /&gt;Contacts didn't import properly. In logcat:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;I/Gmail   ( 1457): MainSyncRequestProto: lowestBkwdConvoId: 0, highestHandledServerOp: 701502, normalSync: true&lt;br /&gt;D/Gmail   ( 1457): IO exception: java.net.SocketTimeoutException: Read timed out&lt;br /&gt;D/SyncManager(  112): failed sync operation authority: gmail-ls account: Account {name=jerome.lacoste@gmail.com, type=com.google} extras: [] syncSource: 0 when: 40290 expedited: false, SyncResult: stats [ numIoExceptions: 1]&lt;br /&gt;I/Gmail   ( 1457): MainSyncRequestProto: lowestBkwdConvoId: 0, highestHandledServerOp: 701502, normalSync: true&lt;br /&gt;D/dalvikvm( 1457): GC_FOR_MALLOC freed 9193 objects / 451656 bytes in 102ms&lt;br /&gt;&lt;br /&gt;I/ActivityManager(  112): Process com.google.android.gm (pid 1457) has died.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Moved some apps to sdcard to free some space. GMail sync started working&lt;br /&gt;&lt;br /&gt;Fixed widgets&lt;br /&gt;&lt;br /&gt;Fixed screens (going from 3 to 5 home screens end up shifting not centering my screens)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-7801305566928089969?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/7801305566928089969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2010/07/migrating-from-android-jf15-to-cm6.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7801305566928089969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7801305566928089969'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2010/07/migrating-from-android-jf15-to-cm6.html' title='Migrating from Android JF1.5 to CM6 (Froyo) on my G1/ADP1'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-6097757301986519357</id><published>2010-02-03T14:30:00.003+01:00</published><updated>2010-02-03T14:32:57.399+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>A glimpse of the workflow around the Linux stable tree</title><content type='html'>Found this small &lt;a href="screencast http://www.kroah.com/log/linux/how-i-do-stable.html"&gt; fun to watch&lt;/a&gt;.  Notice how using scripts and aliases can make things quite fast.&lt;br /&gt;&lt;br /&gt;Reminds me when I was using quilt to manage extra patches on top of cruisecontrol (about 6 years ago...).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-6097757301986519357?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/6097757301986519357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2010/02/glimpse-of-workflow-around-linux-stable.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/6097757301986519357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/6097757301986519357'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2010/02/glimpse-of-workflow-around-linux-stable.html' title='A glimpse of the workflow around the Linux stable tree'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-4616145203235025891</id><published>2010-02-03T07:45:00.009+01:00</published><updated>2010-07-13T10:23:10.173+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gradle'/><category scheme='http://www.blogger.com/atom/ns#' term='timeloss'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy/java/maven: ultra short coding cycles, not</title><content type='html'>The whole Java (maven, groovy, gradle, ...) experience starts pissing me off more and more. I want to write code with ultra short compile/test cycles.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I've been working with python a bit last year. I had a pretty nice albeit crude development environment. Editor: gedit. No completion, no refactoring, nada. Together with &lt;a href="http://github.com/lacostej/nosyd"&gt;nosyd&lt;/a&gt; I had 3-5 seconds feedback cycle between end of coding and test results. Great.&lt;br /&gt;&lt;br /&gt;For various reasons, I am doing something similar with groovy now. Build time on the command line: 15-25 seconds (e.g. with &lt;a href="http://gradle.org/"&gt;gradle&lt;/a&gt;). This is too long. I've been spoiled. So ok. I've set up a full editor to speed up the build. I'll try avoiding firing it many times a day. I am back to around 5-8 seconds cycles (if the code was freshly compiled, 40 otherwise....). I can manage that... I have to, right ?&lt;br /&gt;&lt;br /&gt;Then I need to add a dependency and the nightmare starts again.&lt;br /&gt;&lt;a href="http://youtrack.jetbrains.net/issue/IDEABKL-5686"&gt;Gradle dependencies aren't managed by intellij&lt;/a&gt;. So I think, I give up gradle and back to maven2. At least I know. Enters &lt;a href="http://docs.codehaus.org/display/GMAVEN/"&gt;gmaven&lt;/a&gt;, the Groovy maven build environment. And after mucking around I find out that the latest gmaven dependencies are&lt;strike&gt;n't&lt;/strike&gt; available in the official repo. &lt;strong&gt;(*)&lt;/strong&gt; and I need them otherwise I hit &lt;a href="http://jira.codehaus.org/browse/GMAVEN-49"&gt;this bug&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So I am spending time with the editor, the build system instead of writing code. My code runs 2-3 times slower than with python (it does things differently though). My development cycles are too long. &lt;br /&gt;&lt;br /&gt;My productivity has halved (if not more). Makes me wonder if I should go back to python.&lt;br /&gt;&lt;br /&gt;Morning argggggggggggggggggg !!!!!!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;update&lt;/strong&gt;: OK Tim, you were right, the solution was in the bug, except that:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;the gmaven project has changed groupId. Perhaps obvious to someone following gmaven, but not to me when reading the issue&lt;br /&gt;&lt;li&gt;the change wasn't sufficient, once I finally used the proper groupId, I ended up with this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[INFO] Unexpected node: Node[3:1,64,ANNOTATIONS]&lt;br /&gt;&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[INFO] Trace&lt;br /&gt;org.apache.maven.lifecycle.LifecycleExecutionException: Unexpected node: Node[3:1,64,ANNOTATIONS]&lt;br /&gt; at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:719)&lt;br /&gt; at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:556)&lt;br /&gt; at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:535)&lt;br /&gt; at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387)&lt;br /&gt; at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348)&lt;br /&gt; at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180)&lt;br /&gt; at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328)&lt;br /&gt; at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)&lt;br /&gt; at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)&lt;br /&gt; at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)&lt;br /&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt; at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt; at java.lang.reflect.Method.invoke(Method.java:597)&lt;br /&gt; at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)&lt;br /&gt; at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)&lt;br /&gt; at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)&lt;br /&gt; at org.codehaus.classworlds.Launcher.main(Launcher.java:375)&lt;br /&gt;Caused by: org.apache.maven.plugin.MojoExecutionException: Unexpected node: Node[3:1,64,ANNOTATIONS]&lt;br /&gt; at org.codehaus.gmaven.plugin.MojoSupport.execute(MojoSupport.java:85)&lt;br /&gt; at org.codehaus.gmaven.plugin.stubgen.AbstractGenerateStubsMojo.execute(AbstractGenerateStubsMojo.java:60)&lt;br /&gt; at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490)&lt;br /&gt; at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)&lt;br /&gt; ... 17 more&lt;br /&gt;Caused by: org.codehaus.gmaven.runtime.support.stubgen.UnexpectedNodeException: Unexpected node: Node[3:1,64,ANNOTATIONS]&lt;br /&gt; at org.codehaus.gmaven.runtime.support.stubgen.parser.NodeSupport.ensure(NodeSupport.java:96)&lt;br /&gt; at org.codehaus.gmaven.runtime.support.stubgen.model.ModelFactorySupport.identifier(ModelFactorySupport.java:896)&lt;br /&gt; at org.codehaus.gmaven.runtime.support.stubgen.model.ModelFactorySupport.importDef(ModelFactorySupport.java:185)&lt;br /&gt; at org.codehaus.gmaven.runtime.support.stubgen.model.ModelFactorySupport.process(ModelFactorySupport.java:122)&lt;br /&gt; at org.codehaus.gmaven.runtime.support.stubgen.model.ModelFactorySupport.create(ModelFactorySupport.java:90)&lt;br /&gt; at org.codehaus.gmaven.runtime.support.stubgen.model.ModelFactorySupport.create(ModelFactorySupport.java:61)&lt;br /&gt; at org.codehaus.gmaven.runtime.v1_6.StubCompilerFeature$StubCompilerImpl.render(StubCompilerFeature.java:101)&lt;br /&gt; at org.codehaus.gmaven.runtime.v1_6.StubCompilerFeature$StubCompilerImpl.compile(StubCompilerFeature.java:90)&lt;br /&gt; at org.codehaus.gmaven.plugin.stubgen.AbstractGenerateStubsMojo.compile(AbstractGenerateStubsMojo.java:160)&lt;br /&gt; at org.codehaus.gmaven.plugin.stubgen.AbstractGenerateStubsMojo.process(AbstractGenerateStubsMojo.java:131)&lt;br /&gt; at org.codehaus.gmaven.plugin.ComponentMojoSupport.doExecute(ComponentMojoSupport.java:60)&lt;br /&gt; at org.codehaus.gmaven.plugin.MojoSupport.execute(MojoSupport.java:69)&lt;br /&gt; ... 20 more&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt; this was more or less solved by using the &lt;a href="http://permalink.gmane.org/gmane.comp.lang.groovy.user/47119"&gt;POM extract referenced here&lt;/a&gt;, &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  &amp;lt;dependencies&amp;gt;&lt;br /&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;      &amp;lt;groupId&amp;gt;org.codehaus.groovy&amp;lt;/groupId&amp;gt;&lt;br /&gt;      &amp;lt;artifactId&amp;gt;groovy-all&amp;lt;/artifactId&amp;gt;&lt;br /&gt;      &amp;lt;version&amp;gt;1.7.0&amp;lt;/version&amp;gt;&lt;br /&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;    &amp;lt;dependency&amp;gt;&lt;br /&gt;      &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;br /&gt;      &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;br /&gt;      &amp;lt;version&amp;gt;4.7&amp;lt;/version&amp;gt;&lt;br /&gt;      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;br /&gt;    &amp;lt;/dependency&amp;gt;&lt;br /&gt;  &amp;lt;/dependencies&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;build&amp;gt;&lt;br /&gt;    &amp;lt;plugins&amp;gt;&lt;br /&gt;      &amp;lt;plugin&amp;gt;&lt;br /&gt;        &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;        &amp;lt;version&amp;gt;2.0.2&amp;lt;/version&amp;gt;&lt;br /&gt;        &amp;lt;configuration&amp;gt;&lt;br /&gt;          &amp;lt;encoding&amp;gt;UTF-8&amp;lt;/encoding&amp;gt;&lt;br /&gt;          &amp;lt;source&amp;gt;1.5&amp;lt;/source&amp;gt;&lt;br /&gt;          &amp;lt;target&amp;gt;1.5&amp;lt;/target&amp;gt;&lt;br /&gt;        &amp;lt;/configuration&amp;gt;&lt;br /&gt;      &amp;lt;/plugin&amp;gt;&lt;br /&gt;      &amp;lt;plugin&amp;gt;&lt;br /&gt;        &amp;lt;groupId&amp;gt;org.codehaus.gmaven&amp;lt;/groupId&amp;gt;&lt;br /&gt;        &amp;lt;artifactId&amp;gt;gmaven-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;        &amp;lt;version&amp;gt;1.2&amp;lt;/version&amp;gt;&lt;br /&gt;        &amp;lt;configuration&amp;gt;&lt;br /&gt;          &amp;lt;providerSelection&amp;gt;1.7&amp;lt;/providerSelection&amp;gt;&lt;br /&gt;        &amp;lt;/configuration&amp;gt;&lt;br /&gt;        &amp;lt;executions&amp;gt;&lt;br /&gt;          &amp;lt;execution&amp;gt;&lt;br /&gt;            &amp;lt;goals&amp;gt;&lt;br /&gt;              &amp;lt;goal&amp;gt;generateStubs&amp;lt;/goal&amp;gt;&lt;br /&gt;              &amp;lt;goal&amp;gt;compile&amp;lt;/goal&amp;gt;&lt;br /&gt;              &amp;lt;goal&amp;gt;generateTestStubs&amp;lt;/goal&amp;gt;&lt;br /&gt;              &amp;lt;goal&amp;gt;testCompile&amp;lt;/goal&amp;gt;&lt;br /&gt;            &amp;lt;/goals&amp;gt;&lt;br /&gt;          &amp;lt;/execution&amp;gt;&lt;br /&gt;        &amp;lt;/executions&amp;gt;&lt;br /&gt;        &amp;lt;!--dependencies&amp;gt;&lt;br /&gt;          &amp;lt;dependency&amp;gt;&lt;br /&gt;            &amp;lt;groupId&amp;gt;org.codehaus.groovy&amp;lt;/groupId&amp;gt;&lt;br /&gt;            &amp;lt;artifactId&amp;gt;groovy-all&amp;lt;/artifactId&amp;gt;&lt;br /&gt;            &amp;lt;version&amp;gt;1.7.0&amp;lt;/version&amp;gt;&lt;br /&gt;          &amp;lt;/dependency&amp;gt;&lt;br /&gt;          &amp;lt;dependency&amp;gt;&lt;br /&gt;            &amp;lt;groupId&amp;gt;org.codehaus.gmaven.runtime&amp;lt;/groupId&amp;gt;&lt;br /&gt;            &amp;lt;artifactId&amp;gt;gmaven-runtime-1.7&amp;lt;/artifactId&amp;gt;&lt;br /&gt;            &amp;lt;version&amp;gt;1.2&amp;lt;/version&amp;gt;&lt;br /&gt;            &amp;lt;exclusions&amp;gt;&lt;br /&gt;              &amp;lt;exclusion&amp;gt;&lt;br /&gt;                &amp;lt;groupId&amp;gt;org.codehaus.groovy&amp;lt;/groupId&amp;gt;&lt;br /&gt;                &amp;lt;artifactId&amp;gt;groovy-all&amp;lt;/artifactId&amp;gt;&lt;br /&gt;              &amp;lt;/exclusion&amp;gt;&lt;br /&gt;            &amp;lt;/exclusions&amp;gt;&lt;br /&gt;          &amp;lt;/dependency&amp;gt;&lt;br /&gt;        &amp;lt;/dependencies--&amp;gt;&lt;br /&gt;      &amp;lt;/plugin&amp;gt;&lt;br /&gt;    &amp;lt;/plugins&amp;gt;&lt;br /&gt;  &amp;lt;/build&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;until I hit:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[INFO] Trace&lt;br /&gt;org.apache.maven.BuildFailureException: Compilation failure&lt;br /&gt;myorihect/target/generated-sources/groovy-stubs/main/genesis/GenesisException.java:[15,0] reference to RuntimeException is ambiguous, both method RuntimeException(java.lang.String) in java.lang.RuntimeException and method RuntimeException(java.lang.Throwable) in java.lang.RuntimeException match&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:715)&lt;br /&gt; at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:556)&lt;br /&gt; at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:535)&lt;br /&gt; at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387)&lt;br /&gt; at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348)&lt;br /&gt; at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180)&lt;br /&gt; at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328)&lt;br /&gt; at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)&lt;br /&gt; at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)&lt;br /&gt; at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)&lt;br /&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt; at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt; at java.lang.reflect.Method.invoke(Method.java:597)&lt;br /&gt; at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)&lt;br /&gt; at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)&lt;br /&gt; at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)&lt;br /&gt; at org.codehaus.classworlds.Launcher.main(Launcher.java:375)&lt;br /&gt;Caused by: org.apache.maven.plugin.CompilationFailureException: Compilation failure&lt;br /&gt;myProject/target/generated-sources/groovy-stubs/main/genesis/GenesisException.java:[15,0] reference to RuntimeException is ambiguous, both method RuntimeException(java.lang.String) in java.lang.RuntimeException and method RuntimeException(java.lang.Throwable) in java.lang.RuntimeException match&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; at org.apache.maven.plugin.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:516)&lt;br /&gt; at org.apache.maven.plugin.CompilerMojo.execute(CompilerMojo.java:114)&lt;br /&gt; at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490)&lt;br /&gt; at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)&lt;br /&gt; ... 17 more&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;[INFO] Total time: 9 seconds&lt;br /&gt;[INFO] Finished at: Thu Feb 04 14:05:14 CET 2010&lt;br /&gt;[INFO] Final Memory: 21M/77M&lt;br /&gt;[INFO] ------------------------------------------------------------------------&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The culprit? an innocent project exception:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class GenesisException extends RuntimeException {&lt;br /&gt;  GenesisException(s) { super(s) }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Which I've changed to:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class GenesisException extends RuntimeException {}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;to please someone in the stack tool.&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Note that this code compiled properly without changes in intellij as well as with gradle and the following lines&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;usePlugin 'groovy'&lt;br /&gt;repositories {&lt;br /&gt;    mavenCentral()&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;dependencies {&lt;br /&gt;    groovy 'org.codehaus.groovy:groovy:1.7.0'&lt;br /&gt;    testCompile 'junit:junit:4.7' // latest not yet available. see http://github.com/KentBeck/junit/issues/issue/66&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A bit simpler isn't it ?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To take a bit of perspective I initially started this because intellij doesn't support fully gradle and that I had to manualy handle the dependencies in both gradle and intellij. I don't like that. Hence maven. I don't really want to use maven on that project, I just wanted to sync Intellij and the command line build dependencies easily.&lt;br /&gt;&lt;br /&gt;So was this worth it ? How many features/bug fixes would I have implemented in the mean time using my 5 seconds compile/test feedback cycle ? Mmm. Better not to think about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-4616145203235025891?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/4616145203235025891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2010/02/groovyjavamaven-ultra-short-coding.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4616145203235025891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4616145203235025891'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2010/02/groovyjavamaven-ultra-short-coding.html' title='Groovy/java/maven: ultra short coding cycles, not'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-696302670115304023</id><published>2010-01-11T13:16:00.002+01:00</published><updated>2010-01-11T13:20:34.486+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='timeloss'/><title type='text'>To wean</title><content type='html'>the unix way&lt;br /&gt;&lt;br /&gt;2. To detach from that to which one is strongly habituated or devoted&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ grep 127.0.0.1 /etc/hosts&lt;br /&gt;127.0.0.1 localhost&lt;br /&gt;127.0.0.1 lemonde.fr liberation.fr rue89.com lequipe.fr alterslash.org aftenposten.no&lt;br /&gt;127.0.0.1       www.lemonde.fr www.liberation.fr www.rue89.com www.lequipe.fr www.alterslash.org www.aftenposten.no&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-696302670115304023?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/696302670115304023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2010/01/to-wean.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/696302670115304023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/696302670115304023'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2010/01/to-wean.html' title='To wean'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-6476263861733434707</id><published>2010-01-09T10:58:00.003+01:00</published><updated>2010-01-09T11:12:58.869+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><category scheme='http://www.blogger.com/atom/ns#' term='timeloss'/><title type='text'>Deleting large amount of emails from gmail make your account unaccessible for several minutes.</title><content type='html'>My Gmail account has been too slow lately. As it approached 90% size, I tried to reduce its size, by deleting old mailing list emails. &lt;br /&gt;&lt;br /&gt;I deleted 3 times more than ~50 k emails, and each time, my account became unavailable for several minutes (about 30), including through IMAP! Got several errors on the web page (16 or 17 and 67 if I recall properly).&lt;br /&gt;&lt;br /&gt;You've been warned. Plan ahead if you try to do the same thing :)&lt;br /&gt;&lt;br /&gt;Final words: I am now down to 57% gmail usage. Need to find or write a tool to be able to identify the culprits. Maybe some kind of FUSE IMAP file system to reuse something like baobab (aka http://windirstat.info/ for Gnome) ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-6476263861733434707?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/6476263861733434707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2010/01/deleting-large-amount-of-emails-from.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/6476263861733434707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/6476263861733434707'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2010/01/deleting-large-amount-of-emails-from.html' title='Deleting large amount of emails from gmail make your account unaccessible for several minutes.'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-6340496674820796516</id><published>2009-12-23T11:49:00.003+01:00</published><updated>2009-12-23T12:00:42.044+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>"To tag" en francais</title><content type='html'>Searching for how to write taguer/tagger/tagguer in French. I won't use &lt;a href="http://www.framalang.org/wiki/Vocabulaire_Subversion"&gt;etiqueter&lt;/a&gt; neither. Nobody will understand...&lt;br /&gt;&lt;br /&gt;So I found &lt;a href="http://gambette.blogspot.com/2006/09/taguer-tagguer-ou-tagger.html"&gt;this&lt;/a&gt;. Not sure that's conclusive either...&lt;br /&gt;&lt;br /&gt;Fun read anyway. In particular the longest sentence written using the 4 ADN 'letters' A, C, G and T. &lt;br /&gt;&lt;br /&gt;Here's my version:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"Cata, ta tata gaga gâta, tagga 'caca! tacatac !', ça t'agaça !&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-6340496674820796516?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/6340496674820796516/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/12/to-tag-en-francais.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/6340496674820796516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/6340496674820796516'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/12/to-tag-en-francais.html' title='&quot;To tag&quot; en francais'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-8140384918184154555</id><published>2009-12-21T16:13:00.002+01:00</published><updated>2009-12-21T16:19:37.948+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>Kung-fu coding</title><content type='html'>Derived from KUNG FU FIGHTING (Douglas, 1974)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Everybody was kung-fu coding&lt;br /&gt;Those devs were fast as lightning&lt;br /&gt;In fact it was a little bit frightning&lt;br /&gt;But they coded with expert timing&lt;br /&gt;&lt;br /&gt;They were funky Geeky men from funky Geekytown&lt;br /&gt;They were coding things up and they were hacking them down&lt;br /&gt;It's an ancient Geeky art and everybody knew their part&lt;br /&gt;From a fix into a script, and coding from the heart&lt;br /&gt;&lt;br /&gt;Everybody was kung-fu coding&lt;br /&gt;Those devs were fast as lightning&lt;br /&gt;In fact it was a little bit frightning&lt;br /&gt;But they coded with expert timing&lt;br /&gt;&lt;br /&gt;There was funky Billy Joy and little Sam Ruby&lt;br /&gt;He said here comes the big job, lets get it on&lt;br /&gt;We took a bow and made a stand, started writing with the hand&lt;br /&gt;The sudden action made me flip now we're into a brand knew trip&lt;br /&gt;&lt;br /&gt;Everybody was kung-fu coding&lt;br /&gt;Those devs were fast as lightning&lt;br /&gt;In fact it was a little bit frightning&lt;br /&gt;But they coded with expert timing&lt;br /&gt;&lt;br /&gt;(repeat)..make sure you have expert timing&lt;br /&gt;Kung-fu coding, had to be fast as lightning&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Licensed under fair-use/parody/whatever you have to do to not get sued for copyright infrigement these days.&lt;br /&gt;&lt;br /&gt;(first one to upload a video on youtube with him singing that song, dressed as a kungfu coder gets some drinks from me)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-8140384918184154555?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/8140384918184154555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/12/kung-fu-coding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/8140384918184154555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/8140384918184154555'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/12/kung-fu-coding.html' title='Kung-fu coding'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-7735682309522936580</id><published>2009-12-07T10:44:00.002+01:00</published><updated>2011-02-02T05:57:57.570+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xunit'/><category scheme='http://www.blogger.com/atom/ns#' term='ci'/><category scheme='http://www.blogger.com/atom/ns#' term='jenkins'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><title type='text'>Interesting CI / test distribution strategy</title><content type='html'>From: &lt;a href="http://n4.nabble.com/Mysterious-JUnit-Test-Result-Reporting-Inconsistencies-td948952.html"&gt;the hudson user list&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt; In order to split our build across multiple servers, we have implemented a JUnit "PartitionedSuite" class.  When we run our build in maven, we say -Dtest=PartitionedSuite and we pass in an "x/y" parameter like "2/5" or "1/5".  The "PartitionedSuite" class scans the classpath for JUnit test classes and puts them in "y" buckets based on the hash of the Test Class name, and then only executes the Tests in bucket number "x".  This way, we just define the "x/y" parameter as a per-server variable, and execute the build on y servers, and each server runs one "Partition" of Tests. &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-7735682309522936580?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/7735682309522936580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/12/interesting-ci-test-distribution.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7735682309522936580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7735682309522936580'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/12/interesting-ci-test-distribution.html' title='Interesting CI / test distribution strategy'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-7932958555665516744</id><published>2009-12-07T08:45:00.003+01:00</published><updated>2009-12-07T08:51:31.313+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Secret questions</title><content type='html'>Just saw that Flickr requires me now to have 2 secret questions for password recovery needs. Among the proposed questions:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;name of favorite author&lt;br /&gt;&lt;li&gt;name of favorite book&lt;br /&gt;&lt;li&gt;name of favorite movie character&lt;br /&gt;&lt;li&gt;etc&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Are those answers supposed to be immutable ? Is my taste cast in stone ?&lt;br /&gt;&lt;br /&gt;Update: one of my answers involved a 3 letters name, but Yahoo refused it as it isn't long enough.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-7932958555665516744?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/7932958555665516744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/12/secret-questions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7932958555665516744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7932958555665516744'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/12/secret-questions.html' title='Secret questions'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-3499243020278594663</id><published>2009-12-05T12:20:00.002+01:00</published><updated>2009-12-05T12:27:03.595+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Skandiabanken with chromium</title><content type='html'>Now that &lt;a href="http://code.google.com/p/chromium/issues/detail?id=16830"&gt;basic SSL certificate support&lt;/a&gt; has been committed, it is possible to get Skandiabanken to work on Chromium Linux. It lacks a UI. Here are the steps I followed to get it to work.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This assumes your version is recent and contains the checkin from the 23rd of october.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; from firefox, go to preferences / Advanced / Encryption / View Certificates, select your Skandiabanken certificate and chose backup. Pick a password.&lt;br /&gt;&lt;li&gt; import your certificate &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  pk12util -d sql:$HOME/.pki/nssdb -i /home/jerome/JeromeLacosteSkandiaCert.pkcs12.p12&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;  (type your password at prompt)&lt;br /&gt;&lt;li&gt; verify your import&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  $ certutil -L -d sql:$HOME/.pki/nssdb&lt;br /&gt;  ...&lt;br /&gt;  Jerome Lacoste's SkandiaBanken Aktiebolag (publ) ID          u,u,u&lt;br /&gt;  SkandiaBanken Internetbank CA03 - SkandiaBanken Aktiebolag (publ) C,,  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;li&gt; start chromium from the command line with the proper option:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  chromium-browser --auto-ssl-client-auth&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Works !&lt;br /&gt;&lt;br /&gt;If you need to cleanup use something like&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  certutil -D -n "Jerome Lacoste's SkandiaBanken Aktiebolag (publ) ID" -d sql:$HOME/.pki/nssdb&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-3499243020278594663?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/3499243020278594663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/12/skandiabanken-with-chromium.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/3499243020278594663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/3499243020278594663'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/12/skandiabanken-with-chromium.html' title='Skandiabanken with chromium'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-7653631266749632608</id><published>2009-11-25T22:38:00.006+01:00</published><updated>2009-11-27T14:45:41.625+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='lean'/><category scheme='http://www.blogger.com/atom/ns#' term='timeloss'/><title type='text'>Efficiency of a one time debugging session.</title><content type='html'>Value stream mapping of a debugging session of a fast moving open source project.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;svn update: 3 min&lt;br /&gt;&lt;li&gt;mvn install (downloads the world) [FAILURE]: 3 min&lt;br /&gt;&lt;li&gt;mvn clean install (downloads the world) [FAILURE]: 3 min&lt;br /&gt;&lt;li&gt;manualy clean the workspace (remove deleted files): 1 min&lt;br /&gt;&lt;li&gt;mvn install (finishes downloading the world): 5 min&lt;br /&gt;&lt;li&gt;mvn -DdownloadSources=true idea:idea (downloads the world II, the source return): 10 min&lt;br /&gt;&lt;li&gt;start idea: 3 min&lt;br /&gt;&lt;li&gt;open project inside idea: 5 min&lt;br /&gt;&lt;li&gt;configure a newer JDK in idea: 3 min&lt;br /&gt;&lt;li&gt;start the program in debugging mode: 30 sec&lt;br /&gt;&lt;li&gt;add a breakpoint: 15 sec&lt;br /&gt;&lt;li&gt;reproduce the problem: 15 sec&lt;br /&gt;&lt;li&gt;find the bug: 15 sec&lt;br /&gt;&lt;li&gt;mail the user: 1 min&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Total time: 48 min 15 sec&lt;br /&gt;Time effectively spent on the issue: 2 min 15 sec&lt;br /&gt;Efficiency: 4.66%&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;YMMV. Done on an almost 3 years old laptop running Ubuntu (1.83GHz Dual core, 2G RAM, 320G disk).&lt;br /&gt;&lt;br /&gt;(those timings are from memory, but they seem consistent with the time I used between &lt;a href="http://n4.nabble.com/Remote-API-sends-incorrect-port-td787564.html#none"&gt;my mails&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Potential conclusions:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;don't do random development on semi-complex open source projects ?&lt;br /&gt;&lt;li&gt;use less complex toolkits/development environments. I usually just read the code in less, nano or gedit. Hint: if someone gives me a simple editor that allows me to navigate between classes, that fires up very quickly, by just reading a maven pom, that would be pretty cool. If that editor had a terminal, even better. Maybe it is time for me to revisit emacs and its ecb...&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;There was a time when firing IDEA was a joy. Is my machine too old ? Did I lose something?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-7653631266749632608?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/7653631266749632608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/11/efficiency-of-one-time-debugging.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7653631266749632608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7653631266749632608'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/11/efficiency-of-one-time-debugging.html' title='Efficiency of a one time debugging session.'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-1962758799694477988</id><published>2009-11-25T15:25:00.004+01:00</published><updated>2009-11-25T15:42:04.871+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>ssh/sftp in java</title><content type='html'>Some years ago, we had to deal with SFTP file transfers. We solved the problem by reusing the Apache licensed projects &lt;a href="http://commons.apache.org/vfs/"&gt;Commons VFS&lt;/a&gt; and the org.apache.commons.vfs.provider.sftp.SftpFileProvider class. This reuses the &lt;a href="http://www.jcraft.com/jsch/"&gt;jsch library&lt;/a&gt;, and after having to troubleshoot some issues wrt threads and strange disconnections, it left a sour taste in my mouth. (jsch code isn't really my taste, and there's little logging for example, even though the author praises openssh's -v arguments. I don't want to diminish the author's accomplishments, but debugging production server issues with a debugger isn't fun).&lt;br /&gt;&lt;br /&gt;I've found the &lt;a href="http://techtavern.wordpress.com/2008/11/13/about-trilead-ssh-open-source-project/"&gt;Trilead project&lt;/a&gt;, but this project is &lt;a href="http://www.trilead.com/SSH_Library/"&gt;unsupported&lt;/a&gt; now. Latest code is available e.g. &lt;a href="http://virologie.free.fr/documents/openSSH/ssh_liens.html"&gt;from here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Then another &lt;a href="http://techtavern.wordpress.com/2008/09/30/about-jsch-open-source-project/"&gt;blog entry&lt;/a&gt; (also rambling on the code quality of the jsch project...) led me to &lt;a href="http://code.google.com/p/commons-net-ssh/"&gt;commons-net-ssh&lt;/a&gt;, which sounds like a compelling alternative for SFTP file transfers.&lt;br /&gt;&lt;br /&gt;Apache licensed, it looks active, somewhat documented and with a couple of unit tests...&lt;br /&gt;&lt;br /&gt;The README says "GSOC project "SSH and SCP for Apache Commons-Net"", and &lt;a href="http://www.theresearchkitchen.com/blog/archives/457"&gt;this blog entry&lt;/a&gt; hints that the project should be retrofitted one day into apache commons-net. Can't wait for that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-1962758799694477988?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/1962758799694477988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/11/sshsftp-in-java.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/1962758799694477988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/1962758799694477988'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/11/sshsftp-in-java.html' title='ssh/sftp in java'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-7189965690493701634</id><published>2009-11-24T15:01:00.002+01:00</published><updated>2009-11-24T15:07:44.449+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='timeloss'/><title type='text'>xhtml, html and file extensions</title><content type='html'>I lost 30 min trying to understand why my proposal for handling &lt;a href="http://jira.codehaus.org/browse/MPIR-171"&gt;String timezones in maven POM files&lt;/a&gt; (a la 'Europe/Oslo' instead of '+1' that doesn't take into account summer time) wasn't working in firefox 3.5.5 but was working in chrome 4.0.250.0 and opera 10.01:&lt;br /&gt;&lt;br /&gt;If I understood well, files served as .html are loaded as HTML files not as XHTML files in firefox, even if the doctype is XHTML transitional. So &amp;gt;script ... /&amp;gt; are turned into &amp;gt;script&amp;lt; and thus mess up the next element... w3c validation doesn't say anything.&lt;br /&gt;&lt;br /&gt;I am still unsure this is how it should work, but using &amp;lt;script ...&amp;gt;&amp;lt;/script&amp;gt; solves it.&lt;br /&gt;&lt;br /&gt;thanks to #firefox on moznet for help.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-7189965690493701634?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/7189965690493701634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/11/xhtml-html-and-file-extensions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7189965690493701634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7189965690493701634'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/11/xhtml-html-and-file-extensions.html' title='xhtml, html and file extensions'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-7905453971691214543</id><published>2009-11-19T12:30:00.004+01:00</published><updated>2011-02-02T05:57:57.571+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ci'/><category scheme='http://www.blogger.com/atom/ns#' term='jenkins'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Strategies for managing many small maven2 and hudson projects</title><content type='html'>So you finally decided to structure your maven2 projects properly, e.g. identify the correct set of plugin versions/configurations that work well in your environment, introduce a set of corporate POMs.... You also decided to clean up your hudson usage, use new plugins, etc...&lt;br /&gt;&lt;br /&gt;You have to change many POMs, probably adapt hudson projects as well. You don't want to change all those configurations one by one. The good news is that both maven and hudson use XML as storage for the config files. &lt;br /&gt;&lt;br /&gt;Here are some tips and tools you might want to use:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Managing maven POMs&lt;/h2&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;I like to have my maven POMs to be ordered and formatted properly. It's helps a lot when looking at diff files. So I wrote these little tools to help me [1] [2]. Note you could reuse those tools for managing any kind of XML files (e.g. web.xml, abator config files, etc...).&lt;br /&gt;&lt;li&gt;similarly if you have many POMs to transform, you can use the same programs to help you applying transformations. E.g. &lt;br /&gt;  add/update an &lt;scm&gt; tag, convert some dependencies, etc...&lt;br /&gt;&lt;li&gt;you can also use the &lt;a href="http://mojo.codehaus.org/versions-maven-plugin/"&gt;maven versions plugin&lt;/A&gt; to make some specific transformations. e.g. mvn versions:update-parent&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Note: the xml tools I wrote don't know the maven model, while I presume the Maven2 versions plugin does.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Managing hudson configs&lt;/h2&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Groovy scripts are great. See some examples here [3]&lt;br /&gt;&lt;li&gt;Hudson project copying. Create a template project and recreate your projects based on that one&lt;br /&gt;&lt;li&gt;Modify the config.xml files and reload them from hudson. Advised to use scripts (e.g. groovy/ruby/python or custom groovy_xml_tools transformation scripts) to transform your hudson project files. I've had strange issues when doing heavy changes (e.g. converting free style to maven2 projects, etc...). In those case, I falled back on option 1 and 2&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Getting overview of your Hudson project configs&lt;/h3&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;use the groovy console&lt;br /&gt;&lt;li&gt;use standard unix tools. By using ssh, together with ssh keys and installing simple scripts on your server, you can do things like&lt;br /&gt;&lt;br /&gt;    ssh hudsonserver "list_job_options.sh mavenOpts"&lt;br /&gt;&lt;br /&gt;In this particular case, list_job_options.sh contains &lt;br /&gt;&lt;br /&gt;   grep $1 $HUDSON_HOME/jobs/*/config.xml&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Further notes&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;I like using templates in order to achieve some kind of &lt;strong&gt;standardization&lt;/strong&gt; when managing many small projects in a small team. This doesn't fit all environments, but in some cases it is good to avoid variation across your environment. When I was contributing to cruisecontrol I spent a bit of time implementing &lt;a href="http://cruisecontrol.sourceforge.net/main/plugins.html#preconfiguration"&gt;full project pre-configuration&lt;/a&gt;. This was I think one of the best feature of CruisecControl. To my knowledge Hudson doesn't support that today, but you can achieve similar results it by generating your files, reconfiguring on the fly using the groovy console, etc...&lt;br /&gt;&lt;br /&gt;Drop me a line if you find a use of the tools below !&lt;br /&gt;&lt;br /&gt;[1] &lt;a href="http://github.com/lacostej/groovy_xml_tools"&gt;http://github.com/lacostej/groovy_xml&lt;/a&gt;_tools&lt;br /&gt;[2] &lt;a href="http://github.com/lacostej/groovy_maven_pom_tools"&gt;http://github.com/lacostej/groovy_maven_pom_tools&lt;/a&gt;&lt;br /&gt;[3] &lt;a href="http://sites.google.com/site/jeromelacoste/HudsonScriptReceipes.groovy?attredirects=0&amp;d=1"&gt;some Hudson Script receipes&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-7905453971691214543?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/7905453971691214543/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/11/strategies-for-managing-many-small.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7905453971691214543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7905453971691214543'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/11/strategies-for-managing-many-small.html' title='Strategies for managing many small maven2 and hudson projects'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-8881664019233690125</id><published>2009-10-27T04:35:00.007+01:00</published><updated>2009-10-27T04:54:35.909+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Tips: extra contextual shell information for multiple environments</title><content type='html'>On my desktop, I often work on multiple projects at the same time and I am a fan of command line and terminals.&lt;br /&gt;&lt;br /&gt;These projects have different environments (e.g. java 1.5 and maven 2.2.1 on one, java 1.6 and maven 2.0.9 on the other one).&lt;br /&gt;&lt;br /&gt;In order to have information about the projects quickly available, I display some version information in the terminal title.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6z-qrQem7g8/SuZtuN0RIGI/AAAAAAAAAL0/y2UYPfYZW9Q/s1600-h/bash_context_versions_info.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 800px; height: 45px;" src="http://2.bp.blogspot.com/_6z-qrQem7g8/SuZtuN0RIGI/AAAAAAAAAL0/y2UYPfYZW9Q/" border="0" alt=""id="BLOGGER_PHOTO_ID_5397121844200415330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;I often set up a end.sh script that contains my project specific environment setup.&lt;br /&gt;&lt;br /&gt;My [Ubuntu] .bashrc is modified like this:&lt;br /&gt;&lt;pre&gt;function versions {&lt;br /&gt;  mvn_version=`mvn --version | grep "Maven" | cut -d ':' -f 2`&lt;br /&gt;  jdk_version=`mvn --version | grep "Java" | cut -d ':' -f 2`&lt;br /&gt;  svn_version=`svn --version | grep "^svn"`&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function prompt_extra { echo ""&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# If this is an xterm set the title to user@host:dir&lt;br /&gt;case "$TERM" in&lt;br /&gt;xterm*|rxvt*)&lt;br /&gt;    export PROMPT_COMMAND_EXTRA=`prompt_extra`&lt;br /&gt;    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~} - $PROMPT_COMMAND_EXTRA\007"'&lt;br /&gt;    ;;&lt;br /&gt;*)&lt;br /&gt;    ;;&lt;br /&gt;esac&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then my per project environment scripts that look like:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;export MAVEN_HOME=/usr/local/lib/apache-maven-2.0.9&lt;br /&gt;export PATH=$MAVEN_HOME/bin:$PATH&lt;br /&gt;&lt;br /&gt;versions&lt;br /&gt;&lt;br /&gt;function prompt_extra { echo "MVN:$mvn_version JDK:$jdk_version $svn_version" &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;reset_prompt&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-8881664019233690125?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/8881664019233690125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/10/tips-extra-contextual-shell-information.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/8881664019233690125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/8881664019233690125'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/10/tips-extra-contextual-shell-information.html' title='Tips: extra contextual shell information for multiple environments'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-6101351938369281274</id><published>2009-10-27T04:19:00.004+01:00</published><updated>2009-10-29T00:11:01.758+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>[ANNOUNCE] Groovy cmd module</title><content type='html'>Introducing &lt;a href="http://github.com/lacostej/groovy_cmd"&gt;Groovy Cmd&lt;/a&gt;, a very basic Groovy module allowing to create line oriented command interpreters in Groovy. Based on &lt;a href="http://jline.sourceforge.net/"&gt;jline&lt;/a&gt;. MIT Licensed.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;update&lt;/strong&gt;: renamed from grails_cmd into groovy_cmd..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-6101351938369281274?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/6101351938369281274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/10/announce-grails-cmd-module.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/6101351938369281274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/6101351938369281274'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/10/announce-grails-cmd-module.html' title='[ANNOUNCE] Groovy cmd module'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-6638241890222564324</id><published>2009-10-16T08:42:00.003+02:00</published><updated>2009-10-16T08:46:30.915+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Flash least green desktop  application ?</title><content type='html'>After a while, Flash consistently takes 80-100% CPU on my desktop. Whether it is youtube, grooveshark or any other media player, I end up having to kill the browser and restart it. This with chrome and firefox (on Linux). I keep reading similar comments on the web, apparently also for people not using Linux.&lt;br /&gt;&lt;br /&gt;I wonder what impact does this have on the world. How many trees per day would we save by not using a broken media player ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-6638241890222564324?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/6638241890222564324/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/10/flash-least-green-desktop-application.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/6638241890222564324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/6638241890222564324'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/10/flash-least-green-desktop-application.html' title='Flash least green desktop  application ?'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-2551699447052449519</id><published>2009-10-15T18:16:00.000+02:00</published><updated>2009-10-15T18:16:28.630+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Split testing</title><content type='html'>Found this little &lt;a href="http://bitbucket.org/akoha/django-lean"&gt;django framework&lt;/a&gt; to implement &lt;a href="http://www.startuplessonslearned.com/search/label/split-test"&gt;split testing&lt;/a&gt;. Nice. Do you do split testing ?&lt;br /&gt;&lt;br /&gt;Some links. A &lt;a href="http://www.youtube.com/watch?v=cV7TsqKN8UU"&gt;1h video from Google&lt;/a&gt; (too long, I want the slides), a nice &lt;a href="http://elem.com/~btilly/effective-ab-testing/"&gt;s5 presentation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Updates&lt;/strong&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;2009-10-15: &lt;a href="http://www.niemanlab.org/2009/10/how-the-huffington-post-uses-real-time-testing-to-write-better-headlines/"&gt;AB testing used by The Huffington Post&lt;/a&gt;.&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-2551699447052449519?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/2551699447052449519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/10/split-testing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/2551699447052449519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/2551699447052449519'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/10/split-testing.html' title='Split testing'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-5164402844087970896</id><published>2009-10-14T10:41:00.004+02:00</published><updated>2009-10-14T10:54:24.251+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Is the market getting better ?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6z-qrQem7g8/StWRK8YQktI/AAAAAAAAALs/UDHO--rSD-Y/s1600-h/jobserve_stats.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_6z-qrQem7g8/StWRK8YQktI/AAAAAAAAALs/UDHO--rSD-Y/s320/jobserve_stats.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5392375746038633170" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I compiled jobserve UK stats out of my gmail IMAP box, thanks to &lt;a href="http://matplotlib.sourceforge.net/"&gt;mathplotlib&lt;/a&gt;. Note the graph depicts j2ee related jobs in Europe between July 2007 and now. These are not new jobs, but the amount of jobs advertised by Jobserve UK per day.&lt;br /&gt;&lt;br /&gt;Here are the &lt;a href="http://github.com/lacostej/jobstats"&gt;scripts&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-5164402844087970896?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/5164402844087970896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/10/is-market-getting-better.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/5164402844087970896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/5164402844087970896'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/10/is-market-getting-better.html' title='Is the market getting better ?'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_6z-qrQem7g8/StWRK8YQktI/AAAAAAAAALs/UDHO--rSD-Y/s72-c/jobserve_stats.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-4442529384445993486</id><published>2009-10-13T13:54:00.004+02:00</published><updated>2009-10-13T14:04:00.140+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Bank terminal GPRS failure</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6z-qrQem7g8/StRq0EovY3I/AAAAAAAAALk/8TX9juluSCI/s1600-h/20091012_bbs_receipt_failure.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 161px; height: 320px;" src="http://2.bp.blogspot.com/_6z-qrQem7g8/StRq0EovY3I/AAAAAAAAALk/8TX9juluSCI/s320/20091012_bbs_receipt_failure.png" border="0" alt="bank terminal receipt showing Java stack trace" id="BLOGGER_PHOTO_ID_5392052096699687794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.banksys.be"&gt;be.banksys.smash.UnexpectedErrorSmashException: Timeout occured&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I don't think this was expected to be printed out as is on the credit card receipt !&lt;br /&gt;&lt;br /&gt;Happened to me yesterday while paying for a lunch in town. Someone from &lt;a href="http://www.bbs.no"&gt;BBS&lt;/a&gt; might want to look at that ;) Feel free to contact me for more info, if needed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-4442529384445993486?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/4442529384445993486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/10/bank-terminal-gprs-failure.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4442529384445993486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4442529384445993486'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/10/bank-terminal-gprs-failure.html' title='Bank terminal GPRS failure'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_6z-qrQem7g8/StRq0EovY3I/AAAAAAAAALk/8TX9juluSCI/s72-c/20091012_bbs_receipt_failure.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-5674438500589426004</id><published>2009-10-12T20:33:00.002+02:00</published><updated>2009-10-12T20:41:33.543+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hosting'/><category scheme='http://www.blogger.com/atom/ns#' term='backups'/><title type='text'>Backup failures on small servers</title><content type='html'>In light of a catastrophic data loss @ T-Mobile, I went to verify backup setups I am responsible of and found out that one of them wasn't working as expected. Damn it. That's what happens when you have very little resources for a custom solution.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;This &lt;a href="http://slashdot.org/comments.pl?sid=09/10/12/1418202&amp;threshold=1&amp;commentsort=0&amp;mode=nested&amp;cid=29718923"&gt;slashdot comment&lt;/a&gt; on the T-Mobile issue is particularly relevant:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;As a wise auditor once told me: You can outsource the work, but you can not outsource the responsibility.&lt;br /&gt;&lt;br /&gt;If your data is important to you - you must back it up, and you must test your backups.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;But how can you say that to a customer, when the customer is small and not specialized in IT, and has low budget? Here's part of my mail to them.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Hei,&lt;br /&gt;&lt;br /&gt;I went to check the backup solution and found out it hadn't been working properly for a while. I fixed it. [...]&lt;br /&gt;&lt;br /&gt;So I wanted to remind you that the backup solution I have implemented is very simple and not full proof. The main reasons for this are:&lt;br /&gt;* I rely on other parties (hosting company)&lt;br /&gt;* risk management is also a question of resources. And I've allocated the minimum of resources to this setup&lt;br /&gt;* backup isn't my specialty, even thought I know my share&lt;br /&gt;&lt;br /&gt;In theory one should verify backups often, etc... but I 've had to make a tradeoff between costs and results. I verify it once in a while, but I haven't put a solution in place that notifies me automatically if something goes really wrong.&lt;br /&gt;&lt;br /&gt;In case of a total disaster where we haven't lost the data and lost the system, reinstalling the full system fully might take up to 2 days.&lt;br /&gt;In the worse case, we could also lose the latest backups, e.g. if the backups I have now are somewhat corrupted, if the hosting company has some failures on their  own backups etc...&lt;br /&gt;The risk is low, but it can always happen...&lt;br /&gt;&lt;br /&gt;It would be great if you could assess the consequences for your company if you lost the latest system data, and think of the following questions:&lt;br /&gt;* how much data are you prepared to lose in the worst case&lt;br /&gt;* how long you can stay without a running system&lt;br /&gt;&lt;br /&gt;I can then review and see if I should verify the quality of the backup setup more often.&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;&lt;br /&gt;Jerome&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;To summarize, plan for the worst, hope for the best ! And be pragmatic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-5674438500589426004?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/5674438500589426004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/10/backup-failures-on-small-servers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/5674438500589426004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/5674438500589426004'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/10/backup-failures-on-small-servers.html' title='Backup failures on small servers'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-1009567495859337630</id><published>2009-10-12T19:43:00.000+02:00</published><updated>2009-10-12T19:46:27.083+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>Online (free) issue trackers</title><content type='html'>I've been trying and using various issue trackers in the past months, in particular &lt;a href="http://task2gather.com/"&gt;task2gather&lt;/a&gt; and &lt;a href="http://pivotaltracker.com/"&gt;pivotal tracker&lt;/a&gt;. This for very small projects (1-3 developers).&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;I wasn't satisfied with task2gather. In particular, I found it was too much in my way and also often failed in a way that made me lose my data (it clears your form when submitting, and if for whatever it fails, you lose your text). Other limitations (as for *August* 2009):&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;lacks attachments (for free version)&lt;br /&gt;&lt;li&gt;lacks text formatting. If I paste code it is garbled...&lt;br /&gt;&lt;li&gt;reassigning a task to a new folder is cumbersome (cut / paste process).&lt;br /&gt;&lt;li&gt;workflow too fixed&lt;br /&gt;&lt;li&gt;I've seen strange issues with duplicate issues with changed titles. No history explaining it.&lt;br /&gt;&lt;li&gt;small inconveniences:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;like when you create an issue, the url in the browser urlbar isn't&lt;br /&gt;always updated to reflect the issue url&lt;br /&gt;&lt;li&gt;for some reason, T2G doesn't let firefox to keep the password.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;But I am so far happy with pivotal tracker. There are of course small things that could be improved, but the tool isn't in my way, which is what I expect most from a tool. The fact that is has a simple export to CSV and isn't down is also great. Check it out !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-1009567495859337630?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/1009567495859337630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/09/online-free-issue-trackers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/1009567495859337630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/1009567495859337630'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/09/online-free-issue-trackers.html' title='Online (free) issue trackers'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-7697593914307945533</id><published>2009-10-12T18:31:00.006+02:00</published><updated>2009-10-13T09:23:44.083+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Synchronize firefox and chrome profiles passwords</title><content type='html'>I have been using chromium more and more on Linux. But all my passwords are saved in Firefox profile. So I wrote 2 tools to help me deal with my use of both chromium and firefox. One to dump firefox passwords, one to merge the dump into chromium's profile. Seems to work in my very limited test...&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://github.com/lacostej/firefox_password_dump"&gt;firefox_password_dump&lt;/a&gt; helps you dump firefox decrypted passwords into a CSV file&lt;br /&gt;&lt;li&gt;&lt;a href="http://github.com/lacostej/sync_ff_chrome_profiles"&gt;sync_ff_chrome_profiles&lt;/a&gt; one way sync from firefox passwords into chrome. Shouldn't be hard to write a tool that does the opposite. 2 ways sync is harder as firefox doesn't seem to keep timestamps. Read the limitations section !&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;I plan to keep Firefox as my main password storage, and chromium will be synced that way.&lt;br /&gt;&lt;br /&gt;Tested with firefox 3.5, chromium 4.0 on Ubuntu Linux. Credits to &lt;a href="http://fz-corp.net"&gt;fz-corp.net&lt;/a&gt; for the &lt;a href="http://fz-corp.net/?p=199"&gt;initial Windows Firefox password dump&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Was fun. Long time I hadn't written C :)&lt;br /&gt;&lt;br /&gt;Note: the code I wrote is far from being pretty...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Update&lt;/strong&gt;: of course, one can use the inbuilt Import saved passwords option (Options / Personnal Stuff / Import data, but you can tune this piece of code to do what you really want. E.g. try to sync both ways, import from a non default profile, filter out duplicates, etc... And for the curious, Chrome's import code is &lt;a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/importer/firefox3_importer.cc?revision=28117&amp;view=markup"&gt;here&lt;/a&gt; and &lt;a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/importer/nss_decryptor.cc?revision=23503&amp;view=markup"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-7697593914307945533?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/7697593914307945533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/10/synchronize-firefox-and-chrome-profiles.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7697593914307945533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7697593914307945533'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/10/synchronize-firefox-and-chrome-profiles.html' title='Synchronize firefox and chrome profiles passwords'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-647117483401079098</id><published>2009-10-09T17:00:00.004+02:00</published><updated>2009-10-09T17:13:59.742+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ci'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>[ANNOUNCE] nosyd 0.0.5</title><content type='html'>Changes since last announced version:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;0.0.5 (2009-10-09)&lt;br /&gt;==================&lt;br /&gt;&lt;br /&gt;- Nosyd should now run on Mac OS X&lt;br /&gt;- Mac OS X / Growl notifier support (http://growl.info/)&lt;br /&gt;- new Django builder&lt;br /&gt;- new CLI options (--stop)&lt;br /&gt;- be smarter at identifying the monitored project files&lt;br /&gt;- some performance improvements (cache some of the monitored files resolution to lower CPU usage)&lt;br /&gt;- auto-rebuild project when .nosy file is changed&lt;br /&gt;&lt;br /&gt;0.0.4 (2009-10-06)&lt;br /&gt;==================&lt;br /&gt;&lt;br /&gt;- setuptools support. Project split into multiple files&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6z-qrQem7g8/Ss9Q_8YTRAI/AAAAAAAAALc/Aaz_KwZSk-I/s1600-h/pynotify.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 155px;" src="http://4.bp.blogspot.com/_6z-qrQem7g8/Ss9Q_8YTRAI/AAAAAAAAALc/Aaz_KwZSk-I/s320/pynotify.png" border="0" alt="pynotify support" id="BLOGGER_PHOTO_ID_5390616338455806978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_6z-qrQem7g8/Ss9Q_nPXeJI/AAAAAAAAALU/ukJ0hMoMdxU/s1600-h/growl.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 101px;" src="http://3.bp.blogspot.com/_6z-qrQem7g8/Ss9Q_nPXeJI/AAAAAAAAALU/ukJ0hMoMdxU/s320/growl.png" border="0" alt="Growl support" id="BLOGGER_PHOTO_ID_5390616332781189266" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;More info &lt;a href="http://pypi.python.org/pypi/Nosyd/"&gt;here&lt;/a&gt;. Code still on &lt;a href="http://github.com/lacostej/nosyd"&gt;github&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;(Thanks to Sergio for testing on Mac OX X)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-647117483401079098?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/647117483401079098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/10/announce-nosyd-005.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/647117483401079098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/647117483401079098'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/10/announce-nosyd-005.html' title='[ANNOUNCE] nosyd 0.0.5'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6z-qrQem7g8/Ss9Q_8YTRAI/AAAAAAAAALc/Aaz_KwZSk-I/s72-c/pynotify.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-4634265058543328059</id><published>2009-10-09T00:14:00.002+02:00</published><updated>2009-10-09T00:26:49.489+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='oslo'/><title type='text'>Python Oslo Group</title><content type='html'>Today we hold our first meeting of the new &lt;a href="http://groups.google.com/group/oslo-python"&gt;Oslo Python/Django discussion group&lt;/a&gt;. Feel free to join! We will try to meet once a month.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;We discussed various things, including but not limited to&lt;br /&gt;&lt;lu&gt;&lt;br /&gt;&lt;li&gt;django/python projects in Norway&lt;br /&gt;&lt;li&gt;&lt;a href="http://peak.telecommunity.com/DevCenter/EasyInstall"&gt;easy_install&lt;/a&gt;, &lt;a href="http://pypi.python.org/pypi/virtualenv"&gt;virtualenv&lt;/a&gt;, &lt;a href="http://pip.openplans.org/"&gt;pip&lt;/a&gt;&lt;br /&gt;&lt;li&gt;rails like migrations for django with &lt;a href="http://south.aeracode.org/"&gt;south&lt;/a&gt;&lt;br /&gt;&lt;li&gt;Nokia phones &amp; python. And BTW, BrowserNG (Nokia's browser) &lt;a href="http://trac.webkit.org/wiki/S60Webkit"&gt;is&lt;/a&gt; webkit.&lt;br /&gt;&lt;li&gt;&lt;a href="http://reductivelabs.com/products/puppet"&gt;puppet&lt;/a&gt; for configuration management&lt;br /&gt;&lt;li&gt;cloud computing (Mosso/Cloudscape's offering, slicehost, gandi)&lt;br /&gt;&lt;li&gt;android (who said we should stick to python ???)&lt;br /&gt;&lt;li&gt;the upcoming &lt;a href="http://smidig2009.no/"&gt;smidig&lt;/a&gt; conference&lt;br /&gt;&lt;lu&gt;&lt;br /&gt;I demoed the latest &lt;a href="http://github.com/lacostej/nosyd"&gt;Nosyd&lt;/a&gt; (0.0.5 is soon out and comes with new features, including basic support for Django).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-4634265058543328059?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/4634265058543328059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/10/python-oslo-group.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4634265058543328059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4634265058543328059'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/10/python-oslo-group.html' title='Python Oslo Group'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-81647636071124420</id><published>2009-10-07T14:04:00.005+02:00</published><updated>2009-10-07T14:25:46.385+02:00</updated><title type='text'>Skype ramblings</title><content type='html'>For years Skype has been a second class citizen on my desktop of choice, Linux.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Every new version of skype brings nice new features (usualy years after the Windows version...) but also brings its new share of bugs. The latest skype beta finally sort of fixes audio on my Ubuntu desktop, but brings 2 major new issues. First skype now causes pulseaudio to take 100% CPU once in a while. Second sending video isn't working anymore. My camera is recognized but the video it sends is blank.&lt;br /&gt;&lt;br /&gt;Many will say use Windows ! But most programs I run on my computer have no problem being good citizens on my OS.&lt;br /&gt;&lt;br /&gt;For a long time I've dreamed of a reverse engineered Skype. I use it only because some contacts use it. Some &lt;a href="http://saunderslog.com/2006/07/13/skype-cracked/"&gt;claims of actual reverse engineering in 2006&lt;/a&gt; never took off. An interesting EADS document, &lt;a href="http://www.ossir.org/windows/supports/2005/2005-11-07/EADS-CCR_Fabrice_Skype.pdf"&gt;Skype Uncovered&lt;/a&gt;, can be found on the web. But nothing new lately.&lt;br /&gt;&lt;br /&gt;And in the past months there have been a few interesting news:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.techcrunch.com/2009/09/11/wrong-way-skype/"&gt;Skype killing its Extra program&lt;/a&gt;&lt;br /&gt;&lt;li&gt;a &lt;a href="http://lwn.net/Articles/350352/"&gt;Skype Trojan&lt;/a&gt; appeared in the wild. The whole LWN article is interesting, as usual.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;This last link had a very interesting quote from Alan Cox (a very known Linux developer):&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;I would imagine anyone doing so (ndlr: reverse engineering skype's protocol) is keeping fairly quiet - there is big money on offer from the bad guys for skype trojans, intercepts and clients, while anyone on the good side fiddling with it faces jail and harrasment - a fine example of perverse economic incentives.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;So here we stand. Skype's business model is based upon non working interoperability. It doesn't allow us to use it a service. It runs all the time on our computers and hides what it does. I don't like that at all. I really hope that this gets replaced by something more open (in terms of standards).&lt;br /&gt;&lt;br /&gt;I have a SIP service at home, and I wish I wish my provider (Telio) could let me use the service on my desktop and / or android SIP phone without extra costs. That would solve 50% of my needs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-81647636071124420?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/81647636071124420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/10/skype-ramblings.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/81647636071124420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/81647636071124420'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/10/skype-ramblings.html' title='Skype ramblings'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-2670418761174052296</id><published>2009-10-07T09:40:00.004+02:00</published><updated>2009-10-07T09:47:35.383+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quality'/><title type='text'>Consider using application level checksums</title><content type='html'>From this 1999 document titled &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=121882C18EA863DF5C2801947BD96487?doi=10.1.1.27.7611&amp;rep=rep1&amp;type=pdf"&gt;When The CRC and TCP Checksum Disagree&lt;/a&gt;, analysing abnormous rates of errors in network transfers.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Our conclusion is that vital applications should strongly consider augmenting the TCP checksum with an application sum.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Even if you're not concerned with security, it maybe wise to implement an MD5 check (or like) at the application level for your multi-gigs file transfer before you start processing them.&lt;br /&gt;&lt;br /&gt;Source: &lt;a href="http://slashdot.org/comments.pl?sid=1394619&amp;cid=29662547"&gt;slashdot&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-2670418761174052296?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/2670418761174052296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/10/consider-using-application-level.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/2670418761174052296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/2670418761174052296'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/10/consider-using-application-level.html' title='Consider using application level checksums'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-7731761407634531524</id><published>2009-09-26T15:42:00.005+02:00</published><updated>2009-10-05T10:13:36.445+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ci'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>[ANNOUNCE] nosyd 0.0.3</title><content type='html'>Some more features since 0.0.1:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;support of maven2/surefire builds and (untested) trial&lt;br /&gt;&lt;li&gt;new command line features: --clean&lt;br /&gt;&lt;li&gt;auto-reload of nosyd and project configurations&lt;br /&gt;&lt;li&gt;configuration for nosyd&lt;br /&gt;&lt;li&gt;try to be more cross platform (untested)&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I still don't expect this to work for you on non-Linux platform, but it should be closer.&lt;br /&gt;&lt;br /&gt;Get it from &lt;a href="http://github.com/lacostej/nosyd"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's the latest embedded help page:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ nosyd.py -h&lt;br /&gt;Usage: nosyd.py [options]&lt;br /&gt;&lt;br /&gt;Options:&lt;br /&gt;  --version     show program's version number and exit&lt;br /&gt;  -h, --help    show this help message and exit&lt;br /&gt;  -a, --add     Start monitoring the specified or current directory&lt;br /&gt;  -r, --remove  Stop monitoring the specified or current directory&lt;br /&gt;  -l, --list    List the monitored projects&lt;br /&gt;  -c, --clean   Clean the projects nosyd can't track anymore (links point to&lt;br /&gt;                nowhere)&lt;br /&gt;  -1, --local   Run the standalone nosyd on the specified or current directory&lt;br /&gt;&lt;br /&gt;Default behavior:&lt;br /&gt;  Start nosyd&lt;br /&gt;&lt;br /&gt;Comments &amp; bugs to &amp;lt;jerome.lacoste@gmail.com&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Update&lt;/strong&gt;: github url updated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-7731761407634531524?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/7731761407634531524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/09/announce-nosyd-003.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7731761407634531524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7731761407634531524'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/09/announce-nosyd-003.html' title='[ANNOUNCE] nosyd 0.0.3'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-7622558242380248608</id><published>2009-09-25T13:40:00.000+02:00</published><updated>2009-09-25T13:54:43.092+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ci'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>CITConf Paris followup</title><content type='html'>I was supposed to attend CITConf last week-end, but some real-life virus forced me to  cancel my trip. The same virus that kept me in bed most of the week. #&amp;#"(¤/"&lt;br /&gt;&lt;br /&gt;There have been interesting discussions on the mailing list:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://gojko.net/2009/09/24/top-10-reasons-why-teams-fail-with-acceptance-testing/"&gt;top 10 reasons why teams fail with agile acceptance testing&lt;/a&gt;. I've experienced my share here, and probably caused some of these issues as well. Hei. One doesn't learn to walk without falling.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Techniques to speed up builds and give faster feedback&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://blogs.atlassian.com/developer/2009/05/40_7_how_we_sped_up_confluences_build_by_5.html"&gt;Confluence's optimized builds&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://infinitest.org"&gt;infinitest&lt;/a&gt; for automatically running JUnit tests in eclipse/intellij&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;I will update the page as I find more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-7622558242380248608?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/7622558242380248608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/09/citconf-paris-followup.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7622558242380248608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/7622558242380248608'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/09/citconf-paris-followup.html' title='CITConf Paris followup'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-4284789564759497654</id><published>2009-09-25T13:21:00.007+02:00</published><updated>2009-10-05T10:14:23.639+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ci'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><title type='text'>[ANNOUNCE] nosyd 0.0.1</title><content type='html'>I got tired of having multiple nosy.py windows. So I daemonized the whole thing to run a unique instance per user.&lt;br /&gt;&lt;br /&gt;Forget (my version of) nosy, here's &lt;strong&gt;&lt;a href="http://github.com/lacostej/nosyd/tree/0.0.1"&gt;nosyd&lt;/a&gt;, the _minimalist_ personal command line friendly CI server&lt;/strong&gt;. It's initialy geared towards building python projects (hence the name).&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Usage:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# add it to your PATH then&lt;br /&gt;nosyd.py&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then from another shell:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;nosyd.py --add&lt;br /&gt;or&lt;br /&gt;nosyd.py --add path/to/your/project&lt;br /&gt;or&lt;br /&gt;nosyd.py --delete&lt;br /&gt;or&lt;br /&gt;nosyd.py --delete path/to/your/project&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;One can also list the monitored projects&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;nosyd.py --list&lt;br /&gt;nosyd monitors 4 project(s)&lt;br /&gt;/home/jerome/Code/Customers/Xxx/Maths/eureka&lt;br /&gt;/home/jerome/Code/Customers/Me/nosyd.git/nosyd&lt;br /&gt;/home/jerome/Code/Customers/Yyy/projectx&lt;br /&gt;/home/jerome/Code/Customers/Zzz/projecty&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Get it while it's hot ! Feedback appreciated.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Notes&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; you might want to change the default time_period from 10 to 1.&lt;br /&gt;&lt;li&gt; only tested on Ubuntu 9.04 !&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Update&lt;/strong&gt;: github url updated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-4284789564759497654?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/4284789564759497654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/09/announce-nosyd-001.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4284789564759497654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4284789564759497654'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/09/announce-nosyd-001.html' title='[ANNOUNCE] nosyd 0.0.1'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-8682725797023711119</id><published>2009-09-24T05:55:00.007+02:00</published><updated>2009-09-24T10:50:27.811+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ci'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Lightweight personal continous integration</title><content type='html'>Getting timely feedback is the key to improved software development productivity and software quality. That's why we have automated testing and CI servers.&lt;br /&gt;&lt;br /&gt;Running a full CI server on your machine is a solution I've used in the past for some middle size projects. Using a personnal branch on a distributed SCM is another solution for complex projects / long running branches.&lt;br /&gt;&lt;br /&gt;For simple projects, you can easily run a basic CI-like system on your machine. I call this &lt;em&gt;lightweight personal CI&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.jeffwinkler.net/2006/04/27/keeping-your-nose-green/"&gt;Jeff Winkler's original nosy script&lt;/a&gt; is a great reminder that software should be kept simple and right to the point.&lt;br /&gt;&lt;br /&gt;See also &lt;a href="http://douglatornell.ca/software/python/Nosy-1.0.tar.gz"&gt;Doug Latornell's version&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_6z-qrQem7g8/SrrweEuj9QI/AAAAAAAAALI/aPazEjRlUVg/s1600-h/nosy-notify.png"&gt;&lt;img style="float: right; margin:10px 10px 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 155px;" src="http://4.bp.blogspot.com/_6z-qrQem7g8/SrrweEuj9QI/AAAAAAAAALI/aPazEjRlUVg/s320/nosy-notify.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5384880703930627330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's &lt;a href="http://github.com/lacostej/nosy-python"&gt;my humble version&lt;/a&gt;, with a couple of extra features, in particular Gnome notifications and parsing of the XUnit like XML result.&lt;br /&gt;&lt;br /&gt;Too bad I am hitting a &lt;a href="https://bugs.launchpad.net/ubuntu/+source/notify-python/+bug/435742"&gt;lib notify Markup notification issue on Ubuntu 9.04&lt;/a&gt;, I can't display pretty HTML. On an unrelated note, launchpad 3.0 launched yesterday.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-8682725797023711119?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/8682725797023711119/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/09/lightweight-personal-continous.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/8682725797023711119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/8682725797023711119'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/09/lightweight-personal-continous.html' title='Lightweight personal continous integration'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_6z-qrQem7g8/SrrweEuj9QI/AAAAAAAAALI/aPazEjRlUVg/s72-c/nosy-notify.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-999793252285997656</id><published>2009-09-24T03:14:00.009+02:00</published><updated>2011-02-02T05:57:57.573+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jenkins'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='eapps'/><title type='text'>Building python projects on eapps.com</title><content type='html'>Eapps.com VPS currently use CentOs 5.2 and python 2.4. Here's my worklog for getting python2.6 projects to build with nose on my hudson server hosted by eapps.com.&lt;br /&gt;&lt;br /&gt;Here's the result:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6z-qrQem7g8/SrrSG11VfFI/AAAAAAAAAK4/lIomnl27-rs/s1600-h/Hudson_Eureka.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 199px;" src="http://1.bp.blogspot.com/_6z-qrQem7g8/SrrSG11VfFI/AAAAAAAAAK4/lIomnl27-rs/s320/Hudson_Eureka.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5384847319446682706" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Prerequisites:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; a &lt;a href="/2009/09/hudson-maven-and-git-on-eappscom-vps.html"&gt;working (CentOs 5.2) hudson CI installation&lt;/a&gt;&lt;br /&gt;&lt;li&gt; a python project hosted on a SCM that uses nose for its unit testing needs. See &lt;a href="/2009/09/python-and-testing.html"&gt;alternatives&lt;/a&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h2&gt;CentOS system setup and python installation&lt;/h2&gt;&lt;br /&gt;&lt;b&gt;Install yum&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;Install yum from the eApps PBA Control Panel. Then&lt;br /&gt;&lt;pre&gt;yum update&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Install rpmbuild&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;yum install rpm-build&lt;br /&gt;# accept the keys&lt;br /&gt;warning: rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY, key ID e8562897&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Install python 2.4 devel package&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;&lt;pre&gt;yum install python-devel&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Install python 2.6&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;You can use &lt;a href="http://www.geekymedia.com/python_26_centos.html"&gt;pre-built CentOS python 2.6 RPMs&lt;/a&gt; or build from source. I chose the former:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;rpm -i python26-2.6-geekymedia1.i386.rpm python26-libs-2.6-geekymedia1.i386.rpm python26-devel-2.6-geekymedia1.i386.rpm&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Installing easy_install&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;&lt;em&gt;Building from src RPM fails&lt;/em&gt;&lt;br/&gt;&lt;br /&gt;I tried to install the spec file, but this failed&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mkdir /usr/src/redhat # otherwise you get error: cannot create %sourcedir/usr/src/redhat/SOURCES&lt;br /&gt;rpm  -Uvh  setuptools-0.6c9-1.src.rpm&lt;br /&gt;cd /usr/src/redhat/SPECS&lt;br /&gt;rpmbuild -bp setuptools.spec&lt;br /&gt;[...]&lt;br /&gt;+ python setup.py install --single-version-externally-managed --root=/var/tmp/setuptools-buildroot --record-rpm=INSTALLED_OBJECTS&lt;br /&gt;usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]&lt;br /&gt;or: setup.py --help [cmd1 cmd2 ...]&lt;br /&gt;or: setup.py --help-commands&lt;br /&gt;or: setup.py cmd --help&lt;br /&gt;&lt;br /&gt;error: option --record-rpm not recognized&lt;br /&gt;error: Bad exit status from /var/tmp/rpm-tmp.30227 (%install)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;em&gt;Install from egg file&lt;/em&gt;&lt;br/&gt;&lt;br /&gt;Find the packages &lt;a href="http://pypi.python.org/pypi/setuptools"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;pre&gt;sh setuptools-0.6c9-py2.6.egg&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Build setup and hudson configuration&lt;/h2&gt;&lt;br /&gt;I use &lt;a href="http://code.google.com/p/python-nose/"&gt;nose&lt;/a&gt; for testing and report using its &lt;a href="http://somethingaboutorange.com/mrl/projects/nose/0.11.1/plugins/xunit.html"&gt;xunit plugin&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Install your python project dependencies&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;Make sure you install them into python 2.6 site-packages. If needed&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ln -s /usr/bin/python26 python&lt;br /&gt;export PATH=.:$PATH&lt;br /&gt;# do something with python 2.6&lt;br /&gt;# the clean up&lt;br /&gt;rm python&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You can now used easy_install whenever possible. For one of my projects, I installed:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; nose&lt;br /&gt;&lt;li&gt; &lt;a href="http://www.dabeaz.com/ply/"&gt;ply&lt;/a&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://pypi.python.org/pypi/xlrd"&gt;xlrd&lt;/a&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Hudson config for python project&lt;/b&gt;&lt;br/&gt;&lt;br /&gt;Here's hudson config for the newly created "free-style software project":&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;new Hudson custom build.&lt;br /&gt;&lt;li&gt;execute shell&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;nosetests --with-xunit&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;li&gt;Publish JUnit test result report&lt;br /&gt;&lt;pre&gt;**/nosetests.xml&lt;/pre&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Voila !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-999793252285997656?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/999793252285997656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/09/building-python-projects-on-eappscom.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/999793252285997656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/999793252285997656'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/09/building-python-projects-on-eappscom.html' title='Building python projects on eapps.com'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_6z-qrQem7g8/SrrSG11VfFI/AAAAAAAAAK4/lIomnl27-rs/s72-c/Hudson_Eureka.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-4807196476758373991</id><published>2009-09-24T03:05:00.003+02:00</published><updated>2009-09-24T03:11:56.645+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>G1 / Android settings for 3G / MMS in Norway</title><content type='html'>If you need to configure your Android phone for 3G / MMS, look into &lt;a href="http://wiki.xda-developers.com/index.php?pagename=[APNs%20for%20Android]"&gt;this page from the XDA developers wiki&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For my operator, the information could also be found on &lt;a href="http://www.telenor.no/privat/kundeservice/iqRequest.do?create=kb:Kunnskapsdatabase&amp;view(1)=p[problem_oppsett]&amp;forward=l2Problem"&gt;Telenor's web site&lt;/a&gt;, but Telenor doesn't seem to support the G1 not make it as easy as the XDA page to configure your Android phone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-4807196476758373991?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/4807196476758373991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/09/g1-android-settings-for-mms-in-norway.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4807196476758373991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4807196476758373991'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/09/g1-android-settings-for-mms-in-norway.html' title='G1 / Android settings for 3G / MMS in Norway'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-5295566863898989548</id><published>2009-09-23T00:03:00.006+02:00</published><updated>2009-09-25T13:21:30.165+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Play.com crappy security policy</title><content type='html'>We're in 2009 and we still have web merchants able to resend you your exact password if you have forgotten it. I just tested this with Play.com a UK sells it all web site (no link to them sorry. Bad boys!) which I just used to purchase &lt;a href="http://www.imdb.com/title/tt0454776/"&gt;"Amazing Grace"&lt;/a&gt; (nice movie BTW).&lt;br /&gt;&lt;br /&gt;Hey guys, if you don't fix this, I won't place an order again with you.&lt;br /&gt;&lt;br /&gt;Because if I you treat my password like other data I gave you (in particular my credit card details), I can't give you my money.&lt;br /&gt;&lt;br /&gt;Can't you do the right thing ? Some tips (at a minimum):&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; store the hash of the password&lt;br /&gt;&lt;li&gt; &lt;a href="http://en.wikipedia.org/wiki/Salt_%28cryptography%29"&gt;salt it&lt;/a&gt;&lt;br /&gt;&lt;li&gt; compare salted password hashes !&lt;br /&gt;&lt;li&gt; regenerate a new password randomly if the user has lost his password&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Why ? Because someone (a cracker or a disgruntled employee) could fetch the customer / passwords list and as most people don't have a new password per site, use it to not only make purchases on play.com, but to access all other accounts, up to probably the customer's mail box. And from there access all his accounts.&lt;br /&gt;&lt;br /&gt;Note to self: always test the "send me my password" function on any new web site I use.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update&lt;/b&gt;: at least &lt;a href="http://jeffwinkler.net/2008/03/09/great-validation-email/"&gt;some other sites know what they are doing&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-5295566863898989548?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/5295566863898989548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/09/playcom-crappy-security-policy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/5295566863898989548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/5295566863898989548'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/09/playcom-crappy-security-policy.html' title='Play.com crappy security policy'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-6532180978285889127</id><published>2009-09-17T10:15:00.004+02:00</published><updated>2009-09-17T10:28:09.934+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>nose, subversion and executable bits</title><content type='html'>For some reason, nose wasn't executing some of my tests. I found out that nose doesn't select test files if they have an executable bit, and that subversion was configured to create the files with the executable bit. That's a bit unfortunate as I want some python files to be executable, other not. I guess I will let them non executable by default. Worklog below&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ nosetests&lt;br /&gt;&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;Ran 0 tests in 0.009s&lt;br /&gt;&lt;br /&gt;OK&lt;br /&gt;$ nosetests --verbosity 4 2&gt;&amp;1 | grep skipped | grep tests&lt;br /&gt;nose.selector: INFO: /home/jerome/Code/Customers/..../tests/test_parse_results.py is executable; skipped&lt;br /&gt;&lt;br /&gt;$ chmod -x  tests/test_parse_results.py&lt;br /&gt;&lt;br /&gt;$ nosetests&lt;br /&gt;......&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;Ran 6 tests in 1.846s&lt;br /&gt;&lt;br /&gt;OK&lt;br /&gt;&lt;br /&gt;$ grep "^\*.py " /home/jerome/.subversion/config&lt;br /&gt;*.py        = svn:mime-type=text/x-python; svn:eol-style=native; svn:keywords=Id; svn:executable&lt;br /&gt;&lt;br /&gt;# edited the file&lt;br /&gt;&lt;br /&gt;$ grep "^\*.py " /home/jerome/.subversion/config&lt;br /&gt;*.py        = svn:mime-type=text/x-python; svn:eol-style=native; svn:keywords=Id&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-6532180978285889127?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/6532180978285889127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/09/nose-subversion-and-exectubale-bits.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/6532180978285889127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/6532180978285889127'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/09/nose-subversion-and-exectubale-bits.html' title='nose, subversion and executable bits'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-3233690228876397924</id><published>2009-09-11T08:06:00.004+02:00</published><updated>2009-09-11T08:15:51.919+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='people'/><category scheme='http://www.blogger.com/atom/ns#' term='it history'/><title type='text'>Britain apologies to Alan Turing</title><content type='html'>The official site of the UK Prime Minister's office just published &lt;a href="http://www.number10.gov.uk/Page20571"&gt;Gordon Brown's apologies to Alan Turing&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Kind of them to finally recognize the contribution and inhumane treatment of &lt;a href="http://en.wikipedia.org/wiki/Alan_Turing"&gt;this great man&lt;/a&gt; without who I might not have worked in IT (and might speak German as well).&lt;br /&gt;&lt;br /&gt;Thanks Alan.&lt;br /&gt;&lt;br /&gt;And when I think about the changes in the society in the past 60 years, I can't help to feel lucky, happy, and somewhat scared that this could regress pretty quickly... We've still a long road ahead though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-3233690228876397924?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/3233690228876397924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/09/britain-apologies-to-alan-turing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/3233690228876397924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/3233690228876397924'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/09/britain-apologies-to-alan-turing.html' title='Britain apologies to Alan Turing'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-2362511032529081575</id><published>2009-09-11T07:11:00.014+02:00</published><updated>2009-09-24T03:12:35.475+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='process'/><category scheme='http://www.blogger.com/atom/ns#' term='guidelines'/><title type='text'>Software commit guidelines and tips</title><content type='html'>Having and following good commit guidelines is critical to ensure you're not doing cowboy coding. Here are my guidelines. I will update them as time goes. Feel free to comment.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;General goals&lt;/h2&gt;&lt;br /&gt;Overall goal: &lt;b&gt;quality quality quality. Every single of my revisions should be deployable&lt;/b&gt;. More details:&lt;ul&gt;&lt;li&gt;&lt;em&gt;a change should introduce as few new issues as possible&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;a change should be easy to review (now and in the future)&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;a change should have the least negative impact on the project.&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;reverting a change should be as least painful as possible.&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Things to ask yourself&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;make sure you update your local code before you commit&lt;/li&gt;&lt;li&gt;check that you are committing on the right branch&lt;/li&gt;&lt;li&gt;if your development process allows it, have you published your patch for review&lt;/li&gt;&lt;li&gt;don't break the build. Did you run your tests ?&lt;/li&gt;&lt;li&gt;does the change come with a unit test ? Why not ? If you don't know how to write one, get some help.&lt;/li&gt;&lt;li&gt;does the change come with a documentation update ? Why not ? Think about things you can add, change or remove.&lt;br /&gt;  Also think about the various documentation levels: local to the code, javadoc at the method, class, package level, or some more high level documentation.&lt;/li&gt;&lt;li&gt;commit your changes as single logical changes:&lt;ul&gt;  &lt;li&gt;don't hesitate to make several checkins related to the same feature, as long as they are grouped logically (not physically). I.e. try to make small code increments. They make the code reviewing easier&lt;/li&gt;  &lt;li&gt;try to group documentation changes with code changes in a single commit.&lt;/li&gt;  &lt;li&gt;don't put unrelated changes in the same commit. E.g. a code cleanup and a new feature shouldn't be committed together.&lt;/li&gt;  &lt;li&gt;if your change is related to several modules/projects, try to group the changes in the same commit. If not, try to make the commit so that the build won't break.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;if you are unsure of a change, even if its tests are passing, get someone to review it&lt;/li&gt;&lt;li&gt;make sure you provide a meaningful commit message. The message should contain:&lt;ul&gt;  &lt;li&gt;the issue number the change is related to&lt;br /&gt;&lt;/li&gt;&lt;li&gt;in the unfortunate event you have to make several unrelated changes in a single commit (which you should avoid as most as possible), make sure every changes is described in the message.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;write a meaningful message. Spending some time to write a meaningful message is &lt;bold&gt;very&lt;/bold&gt; important.&lt;br /&gt;    And it's usually a very small fraction of the time spent on a particular issue, so it's not lost time!&lt;br /&gt;    Finally focusing on your intent often helps you identify potential issue in your commit.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;is the code &lt;bold&gt;formatted&lt;/bold&gt; appropriately ?? (you do have a codign standard right ?)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;bold&gt;Here is a potential template&lt;/bold&gt;:&lt;br /&gt;&lt;pre&gt;--------------------------------&lt;br /&gt;&lt;br /&gt;#XXXX: one line description of the change&lt;br /&gt;&lt;br /&gt;Details: further long description, that can&lt;br /&gt;be stored in multiple lines. Can also contain&lt;br /&gt;multiple elements if the change was big&lt;br /&gt;- changed this&lt;br /&gt;- changed that&lt;br /&gt;--------------------------------&lt;/pre&gt;&lt;bold&gt;Example of &lt;em&gt;bad&lt;/em&gt; commit message&lt;/bold&gt;:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; "" (empty message)&lt;/li&gt;&lt;li&gt;"fixed the bug"&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;bold&gt;Example of &lt;em&gt;better&lt;/em&gt; commit messages&lt;/bold&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;"#344: refactoring the code before implementing feature Xxx. Details: move common code into utils module."&lt;/li&gt;&lt;li&gt;"#345: add a caching mechanism in front of the module connecting to the Customer Information server to reduce and speed up communications. Details: the cache is configurable thanks to a property stored in the database. No User Interface option to change this value yet."&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Last tip&lt;/h2&gt;&lt;em&gt;Just before you commit, review the changes in the files selected as part of your upcoming commit. Is your commit message good enough ? Did you forget a file ? Do you need to split your commit ?&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-2362511032529081575?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/2362511032529081575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/09/software-commit-guidelines-and-tips.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/2362511032529081575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/2362511032529081575'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/09/software-commit-guidelines-and-tips.html' title='Software commit guidelines and tips'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-948641258394596254</id><published>2009-09-08T21:11:00.006+02:00</published><updated>2011-02-02T05:57:57.574+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ci'/><category scheme='http://www.blogger.com/atom/ns#' term='deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='jenkins'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><title type='text'>Tips for autodeploying J2EE apps on Unix platforms</title><content type='html'>With a little bit of configuration you can have a nice autodeployment setup to save you time and remove potential errors.&lt;br /&gt;&lt;br /&gt;For example this is something I can usually do after spending a few hours on the development infrastructure:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# from the build server, deploy the latest build for the specified project onto the 3 dev servers&lt;br /&gt;deploy_build projectName trunk latest dev1 dev2 dev3&lt;br /&gt;&lt;br /&gt;# deploy specified build for specified project&lt;br /&gt;deploy_build projectName trunk build65 dev4&lt;br /&gt;&lt;br /&gt;# deploy latest branch 2.0 onto specified server&lt;br /&gt;deploy_build projectName 2.0 latest dev5&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Also with a little bit more glue code those same commands can be run through your CI server interface, allowing one click deployment from the CI server GUI.&lt;br /&gt;&lt;br /&gt;This is one way of achieving it, using standard Unix tools.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Fast deployment&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;First, take advantage of the autodeployment features supported by your application server (particularly in your development/test environment). &lt;br /&gt;&lt;br /&gt;Autodeployment is typically triggered by you copying your WAR/EAR file into a particular directory on the target server:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://docs.sun.com/app/docs/doc/819-3660/6n5s7klpb?a=view#beaea"&gt;glassfish's&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.jboss.org/file-access/default/members/jbossas/freezone/docs/Installation_And_Getting_Started_Guide/5/html/index.html"&gt;jboss's&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;On Unix, to copy your file from your CI server (you do use Continuous Integration, right?), you have several alternatives: share the disks through NFS, use scp, ... I prefer to use &lt;b&gt;rsync&lt;/b&gt;. The reason?&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;First &lt;em&gt;it takes less time&lt;/em&gt;. The EAR/WAR zip format is well handled by rsync's delta-transfer algorythm&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Second, it is &lt;em&gt;atomic&lt;/em&gt;. For those who have tried SCP, you might have noticed that the operation happens in place. If you have a network problem, you lose the old file and the new one isn't fully transfered. Worse, the app server will probably have tried loading the artifact before the copying operation is done. You end up with a failed restart, some errors in your logs, and some lost time. Rsync on the other hand will (by default) only move the file onto its target location once the full file has been transfered. This makes the operation atomic and you're sure the server won't fail because of an incomplete file&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;For rsync to work, you have to probably have to do the following:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;install rsync and ssh on all servers (CI + target servers)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;make sure the target file name doesn't change or you lose rsync!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;optionally configure .ssh/options to make is even easier to connect to your servers&lt;/li&gt;&lt;br /&gt;&lt;li&gt;probably use ssh keys and agent, maybe even start ssh-agent before your CI server is started, that way you can use your deployment scripts as automatic post build operations. You might want to look into &lt;a href="http://lacostej.blogspot.com/2009/09/hudson-maven-and-git-on-eappscom-vps.html"&gt;this setup and the related hudson startup scripts&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;automatically integrate the deployment script into your CI server GUI, or from the file system if the CI server is script friendly (like hudson)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Good luck and feel free to report your own successes !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-948641258394596254?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/948641258394596254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/09/tips-for-autodeploying-j2ee-apps-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/948641258394596254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/948641258394596254'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/09/tips-for-autodeploying-j2ee-apps-on.html' title='Tips for autodeploying J2EE apps on Unix platforms'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-2334405274478087786</id><published>2009-09-02T23:19:00.003+02:00</published><updated>2009-09-11T11:05:52.184+02:00</updated><title type='text'>Python and testing</title><content type='html'>Here's a list of links I've found when building my python testing knowledge, categorized under Unit testing, Mocks, Articles, Web testing, Google App Engine and Code Coverage.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Unit testing&lt;/h2&gt;&lt;br /&gt;&lt;a href="http://somethingaboutorange.com/mrl/projects/nose/0.11.1/"&gt;http://somethingaboutorange.com/mrl/projects/nose/0.11.1/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://docs.djangoproject.com/en/dev/topics/testing/"&gt;http://docs.djangoproject.com/en/dev/topics/testing/&lt;/a&gt; (Django client)&lt;br /&gt;&lt;a href="http://pyunit.sourceforge.net/"&gt;http://pyunit.sourceforge.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Mocks&lt;/h2&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/pymox/"&gt;http://code.google.com/p/pymox/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://python-mock.sourceforge.net/"&gt;http://python-mock.sourceforge.net/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.voidspace.org.uk/python/mock/"&gt;http://www.voidspace.org.uk/python/mock/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://labix.org/mocker"&gt;http://labix.org/mocker&lt;/a&gt;&lt;br /&gt;&lt;a href="http://farmdev.com/projects/fudge/"&gt;http://farmdev.com/projects/fudge/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://codespeak.net/py/dist/test.html"&gt;http://codespeak.net/py/dist/test.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.testoob.org/"&gt;http://www.testoob.org/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/mockito/wiki/MockitoForPython"&gt;http://code.google.com/p/mockito/wiki/MockitoForPython&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Articles&lt;/h2&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/191673/preferred-python-unit-testing-framework"&gt;http://stackoverflow.com/questions/191673/preferred-python-unit-testing-framework&lt;/a&gt;&lt;br /&gt;&lt;a href="http://domderrien.blogspot.com/2009/01/automatic-testing-of-gae-applications.html"&gt;http://domderrien.blogspot.com/2009/01/automatic-testing-of-gae-applications.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://agiletesting.blogspot.com/2009/07/python-mock-testing-techniques-and.html"&gt;http://agiletesting.blogspot.com/2009/07/python-mock-testing-techniques-and.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://domderrien.blogspot.com/2009/01/automatic-testing-of-gae-applications.html"&gt;http://domderrien.blogspot.com/2009/01/automatic-testing-of-gae-applications.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.cuberick.com/2008/11/unit-test-your-google-app-engine-models.html"&gt;http://www.cuberick.com/2008/11/unit-test-your-google-app-engine-models.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blog.appenginefan.com/2008/06/unit-tests-for-google-app-engine-apps.html"&gt;http://blog.appenginefan.com/2008/06/unit-tests-for-google-app-engine-apps.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.djangosnippets.org/snippets/705/"&gt;http://www.djangosnippets.org/snippets/705/&lt;/a&gt; django coverage integration&lt;br /&gt;&lt;a href="http://code.activestate.com/recipes/52298/"&gt;http://code.activestate.com/recipes/52298/&lt;/a&gt; custom html coverage reporting&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Web testing&lt;/h2&gt;&lt;br /&gt;&lt;a href="http://pythonpaste.org/webtest/"&gt;http://pythonpaste.org/webtest/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;GAE&lt;/h2&gt;&lt;br /&gt;&lt;a href="http://appengine-cookbook.appspot.com/recipe/app-engine-test-runner/"&gt;http://appengine-cookbook.appspot.com/recipe/app-engine-test-runner/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/gaeunit/"&gt;http://code.google.com/p/gaeunit/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/nose-gae/"&gt;http://code.google.com/p/nose-gae/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Code Coverage&lt;/h2&gt;&lt;br /&gt;&lt;a href="http://darcs.idyll.org/~t/projects/figleaf/README.html"&gt;http://darcs.idyll.org/~t/projects/figleaf/README.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://nedbatchelder.com/code/coverage/"&gt;http://nedbatchelder.com/code/coverage/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Feel free to point me to something important I may have missed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-2334405274478087786?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/2334405274478087786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/09/python-and-testing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/2334405274478087786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/2334405274478087786'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/09/python-and-testing.html' title='Python and testing'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-4381176633837171724</id><published>2009-09-02T06:49:00.022+02:00</published><updated>2011-02-02T05:57:57.576+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ci'/><category scheme='http://www.blogger.com/atom/ns#' term='jenkins'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='hosting'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><category scheme='http://www.blogger.com/atom/ns#' term='eapps'/><title type='text'>Hudson, maven and git on eapps.com VPS</title><content type='html'>VPS hosting from eapps.com is a reasonable compromise between cost and hosting service quality. I use it to host a &lt;a href="https://hudson.dev.java.net/"&gt;hudson&lt;/a&gt; CI server.&lt;br /&gt;&lt;br /&gt;This entry explains how I set it up up to a point where I can build using maven a java project hosted on a ssh protected git repository (on github). I will not go into the hudson specific stuff, the hudson wiki is usually complete &amp; well worded. But I will spend more time on the OS specific stuff such as daemon configuration, ssh specifics, etc...&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The files I used to start/stop/upgrade hudson are located on this &lt;a href="http://github.com/lacostej/my-hudson-nix-setup/tree/master"&gt;github project&lt;/a&gt;. I've used them on several setup so far and I am happy with them. They probably could be improved and some features may be deprecated thanks to general improvement in hudson. I use them successfully on projects involving xvnc plugin, ssh connections, etc.&lt;br /&gt;&lt;br /&gt;Enjoy and &lt;em&gt;build early build often&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Hudson setup overview&lt;/h2&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;installed under /opt/hudson&lt;/li&gt;&lt;br /&gt;&lt;li&gt;can be upgraded thanks to /opt/hudson/upgrade_hudson.sh (as root)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;runs using java -jar hudson.war, together with ssh-agent&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Installation worklog&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Install Java 1.6 (JDK) using eapps control panel. Then proceed with the configuration.&lt;br /&gt;&lt;br /&gt;As youruser:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mkdir ~/Code&lt;br /&gt;cd ~/Code&lt;br /&gt;git clone git://github.com/lacostej/my-hudson-nix-setup.git &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then, as root&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;adduser hudson&lt;br /&gt;mkdir -p /opt/hudson&lt;br /&gt;chown hudson:hudson /opt/hudson&lt;br /&gt;&lt;br /&gt;mkdir -p /opt/latest&lt;br /&gt;cd /opt/latest&lt;br /&gt;ln -s /usr/lib/jvm/java-1.6.0 java # replace with what is the most appropriate on your server&lt;br /&gt;# install my hudson scripts.&lt;br /&gt;cd ~youruser/Code/my-hudson-nix-setup/&lt;br /&gt;cp etc/init.d/hudson /etc/init.d/&lt;br /&gt;cp opt/hudson/*.sh /opt/hudson/&lt;br /&gt;&lt;br /&gt;chmod +x /opt/hudson/*.sh /etc/init.d/hudson&lt;br /&gt;&lt;br /&gt;chkconfig --add hudson&lt;br /&gt;&lt;br /&gt;/etc/init.d/hudson restart&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Getting hudson to talk to github&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Hudson above was configured to automatically use a default SSH key. This key should have no passphrase(*). Let's create it. As hudson user, generate a key (with _no_ passphrase)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt; ssh-keygen&lt;br /&gt;Generating public/private rsa key pair.&lt;br /&gt;Enter passphrase (empty for no passphrase): &lt;br /&gt;Enter same passphrase again: &lt;br /&gt;Your identification has been saved in /home/hudson/.ssh/id_rsa.&lt;br /&gt;Your public key has been saved in /home/hudson/.ssh/id_rsa.pub.&lt;br /&gt;The key fingerprint is:&lt;br /&gt;ae:32:c2:f5:0f:ee:c8:2c:2b:62:3a:2c:6f:ab:25:e9 hudson@yourserver.virtual.vps-host.net&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;On github, add the public key to your &lt;a href="https://github.com/account"&gt;account&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;then let's configure git. As hudson user:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;git config --global user.email "hudson@yourcompany.org"&lt;br /&gt;git config --global user.name "MyCompany Hudson Daemon"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Configure Hudson security&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;I chose to Hudson's own user database and remove all anonymous browsing. Hudson wiki offers &lt;a href="http://wiki.hudson-ci.org/display/HUDSON/Securing+Hudson"&gt;more choices&lt;/a&gt;.&lt;br /&gt;From the Hudson main configuration page, chose&lt;br /&gt;Enable Security&lt;br /&gt;Hudson's own user database&lt;br /&gt;Tick out Allow users to sign up&lt;br /&gt;&lt;br /&gt;Matrix-based security&lt;br /&gt;Add a new user called admin&lt;br /&gt;Give him all permissions&lt;br /&gt;Don't give any permissions to anonymous user.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Install maven&lt;/h2&gt;&lt;br /&gt;I install maven manually. wget from apache server/mirror, unzip under /opt.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Configure hudson&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Open http://yourserver:8082/configure to &lt;br /&gt;&lt;br /&gt;add a JDK (can point to /opt/latest/java if you feel like)&lt;br /&gt;add maven&lt;br /&gt;specify smtp server, from email&lt;br /&gt;test SMTP&lt;br /&gt;&lt;br /&gt;add your project (you probably want to add some notification, like emails or gtalk)&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Follow up&lt;/h2&gt;&lt;br /&gt;Now there are plenty of small things left for you to work on&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;configure maven / and your artifact repository (e.g. &lt;a href="http://nexus.sonatype.org/"&gt;nexus&lt;/a&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;handle deployment / release etc..&lt;/li&gt;&lt;br /&gt;&lt;li&gt;...&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;I may cover these topics in a later post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/542274948422156627-4381176633837171724?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/4381176633837171724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/09/hudson-maven-and-git-on-eappscom-vps.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4381176633837171724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/4381176633837171724'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/09/hudson-maven-and-git-on-eappscom-vps.html' title='Hudson, maven and git on eapps.com VPS'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-542274948422156627.post-1020788152327050888</id><published>2009-05-07T18:38:00.003+02:00</published><updated>2009-05-07T18:42:27.711+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Temporarily using a different python version on Debian/Ubuntu</title><content type='html'>&lt;span id="ml3b" style="color: rgb(68, 68, 68);font-family:Verdana;font-size:85%;"  &gt;On my Ubuntu 9.04 box, python 2.4, 2.5 and 2.6 are installed. 2.6 is used by default. repo, the android git wrapper script requires python 2.5. If you use 2.6, you get the following nasty error:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/home/jerome/Code/OSS/android/.repo/repo/codereview/proto_client.py:19: DeprecationWarning: the md5 module is deprecated; use hashlib instead&lt;br /&gt;import md5&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;File "/home/jerome/Code/OSS/android/.repo/repo/main.py", line 34, in &lt;module&gt;&lt;br /&gt;  from manifest import Manifest&lt;br /&gt;File "/home/jerome/Code/OSS/android/.repo/repo/manifest.py", line 21, in &lt;module&gt;&lt;br /&gt;  from project import Project, MetaProject, R_HEADS&lt;br /&gt;File "/home/jerome/Code/OSS/android/.repo/repo/project.py", line 27, in &lt;module&gt;&lt;br /&gt;  from gerrit_upload import UploadBundle&lt;br /&gt;File "/home/jerome/Code/OSS/android/.repo/repo/gerrit_upload.py", line 21, in &lt;module&gt;&lt;br /&gt;  from codereview.proto_client import HttpRpc, Proxy&lt;br /&gt;File "/home/jerome/Code/OSS/android/.repo/repo/codereview/proto_client.py", line 31, in &lt;module&gt;&lt;br /&gt;  from need_retry_pb2 import RetryRequestLaterResponse;&lt;br /&gt;File "/home/jerome/Code/OSS/android/.repo/repo/codereview/need_retry_pb2.py", line 9, in &lt;module&gt;&lt;br /&gt;  from froofle.protobuf import descriptor_pb2&lt;br /&gt;File "/home/jerome/Code/OSS/android/.repo/repo/froofle/protobuf/descriptor_pb2.py", line 879, in &lt;module&gt;&lt;br /&gt;  class FileDescriptorSet(message.Message):&lt;br /&gt;File "/home/jerome/Code/OSS/android/.repo/repo/froofle/protobuf/reflection.py", line 155, in __init__&lt;br /&gt;  superclass.__init__(cls, name, bases, dictionary)&lt;br /&gt;TypeError: Error when calling the metaclass bases&lt;br /&gt;  type.__init__() takes 1 or 3 arguments&lt;br /&gt;&lt;/module&gt;&lt;/module&gt;&lt;/module&gt;&lt;/module&gt;&lt;/module&gt;&lt;/module&gt;&lt;/module&gt;&lt;/pre&gt;&lt;br /&gt;As I don't want to change the default python version, and until Google comes with a proper repo script, I used the following ugly trick:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ln -s /usr/bin/python2.5 python&lt;br /&gt;export PATH=`pwd`:$PATH&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If someone has a better idea, let me know.&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/542274948422156627-1020788152327050888?l=lacostej.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lacostej.blogspot.com/feeds/1020788152327050888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://lacostej.blogspot.com/2009/05/temporarily-using-different-python.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/1020788152327050888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/542274948422156627/posts/default/1020788152327050888'/><link rel='alternate' type='text/html' href='http://lacostej.blogspot.com/2009/05/temporarily-using-different-python.html' title='Temporarily using a different python version on Debian/Ubuntu'/><author><name>Jerome Lacoste</name><uri>http://www.blogger.com/profile/15152097047371467890</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
