<?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-5811557</id><updated>2011-11-22T02:00:33.289+01:00</updated><category term='obm'/><category term='minig'/><title type='text'>The G in MiniG does not stand for Gmail</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>65</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5811557.post-3113542931347900336</id><published>2011-11-22T01:52:00.003+01:00</published><updated>2011-11-22T02:00:33.296+01:00</updated><title type='text'>Back to business with BlueMind</title><content type='html'>&lt;p&gt;&lt;a href="http://www.blue-mind.net/"&gt;BlueMind&lt;/a&gt; fait ses débuts et premières démonstrations au salon JRES à Toulouse.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Plus d'informations sur le &lt;a href="http://sylvaingarcia.blogspot.com/2011/11/bonjour-tous-aujourdhui-apres-plus-dun.html"&gt;Blog de Sylvain&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-3113542931347900336?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/3113542931347900336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=3113542931347900336' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3113542931347900336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3113542931347900336'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2011/11/back-to-business-with-bluemind.html' title='Back to business with BlueMind'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-267254319041077423</id><published>2011-10-05T00:28:00.002+02:00</published><updated>2011-10-05T00:30:56.789+02:00</updated><title type='text'>Jobs available</title><content type='html'>E-DEAL recrute !&lt;br /&gt;4 Ingé. de Développement / Chef de projet Junior&lt;br /&gt;2 Ingé. Recherche &amp; Développement&lt;br /&gt;1 Chargé(e) de Comm.&lt;br /&gt;1 Responsable de la Lead Generation&lt;br /&gt; &lt;br /&gt;En savoir plus, postuler : &lt;a href="http://www.e-deal.com/gestion-relation-client/recrutement-crm.html"&gt;http://www.e-deal.com/gestion-relation-client/recrutement-crm.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;More groupware related news coming soon. My non-compete clause is over :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-267254319041077423?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/267254319041077423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=267254319041077423' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/267254319041077423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/267254319041077423'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2011/10/jobs-available.html' title='Jobs available'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-141133407671703245</id><published>2010-11-06T16:39:00.003+01:00</published><updated>2010-11-06T16:49:15.921+01:00</updated><title type='text'>You have been unsubscribed from the Obm mailing list</title><content type='html'>Nice move from my past employer, pushing me out of our free (?) software mailing list.&lt;br /&gt;&lt;br /&gt;I guess helping people without getting anything in return does not comply with the new rules... &lt;a href="http://obm.org/doku.php?id=tools:ml:charte"&gt;http://obm.org/doku.php?id=tools:ml:charte&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-141133407671703245?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/141133407671703245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=141133407671703245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/141133407671703245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/141133407671703245'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2010/11/you-have-been-unsubscribed-from-obm.html' title='You have been unsubscribed from the Obm mailing list'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-5919252226062504164</id><published>2010-08-19T16:54:00.002+02:00</published><updated>2010-08-19T16:58:04.335+02:00</updated><title type='text'>minig 2.3.10.1545</title><content type='html'>Few things fixed in this release :&lt;ul&gt;&lt;br /&gt;&lt;li&gt;login with complicated characters in password&lt;/li&gt;&lt;br /&gt;&lt;li&gt;html email was not correctly indexed&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;This should fix opush problems as opush &amp; minig IMAP lib are shared.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-5919252226062504164?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/5919252226062504164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=5919252226062504164' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/5919252226062504164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/5919252226062504164'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2010/08/minig-23101545.html' title='minig 2.3.10.1545'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-5984376152421431084</id><published>2010-08-13T16:24:00.001+02:00</published><updated>2010-08-13T16:26:47.881+02:00</updated><title type='text'>The place to be</title><content type='html'>&lt;a href="https://notearbitre.com"&gt;Rate your rugby referee !&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-5984376152421431084?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/5984376152421431084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=5984376152421431084' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/5984376152421431084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/5984376152421431084'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2010/08/place-to-be.html' title='The place to be'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-4241176438688771764</id><published>2010-08-12T21:10:00.002+02:00</published><updated>2010-08-12T21:35:26.462+02:00</updated><title type='text'>Singleton for dummies</title><content type='html'>While searching for some coding practices, I realized some people are wondering how to do a singleton in Java (I know, this is considered an anti-pattern when badly used) :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public class Controller {&lt;br /&gt; &lt;br /&gt; private static final Controller ctrl;&lt;br /&gt; &lt;br /&gt; static {&lt;br /&gt;  ctrl = new Controller();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private Controller() {&lt;br /&gt; &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public static Controller get() {&lt;br /&gt;  return ctrl;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That's the _only_ way to do it correctly in Java. Your static block is protected by the classloader lock, so everything is fine. This implementation _can_ bug, but that supposes you know how to subclass/implement a ClassLoader. In a webapp it's fine if you're wondering (well tomcat will leak your singleton memory if you abuse hot deploy).&lt;br /&gt;&lt;br /&gt;I made this post as I'm reviewing some opush contributed code. What you can find on the net about java &amp; singleton is quite &lt;a href="http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html"&gt;fun&lt;/a&gt;. Nice article by someone who didn't know what are static blocks. Static blocks are "Java approved" since 2000.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-4241176438688771764?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/4241176438688771764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=4241176438688771764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/4241176438688771764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/4241176438688771764'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2010/08/singleton-for-dummies.html' title='Singleton for dummies'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-459337969467236891</id><published>2010-08-04T02:07:00.002+02:00</published><updated>2010-08-04T02:23:33.444+02:00</updated><title type='text'>Leaving my current job</title><content type='html'>I'll switch to another job in october. My work on MiniG &amp; OPush will continue. I created those projects and I'm proud of them. tcataldo@minig.org is a working email to reach me.&lt;br /&gt;&lt;br /&gt;I'll have some time to fix flawed things in MiniG with my next assignment ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-459337969467236891?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/459337969467236891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=459337969467236891' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/459337969467236891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/459337969467236891'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2010/08/leaving-my-current-job.html' title='Leaving my current job'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-6497151563008199042</id><published>2010-07-17T00:24:00.005+02:00</published><updated>2010-07-17T04:45:51.934+02:00</updated><title type='text'>Bigger than free software</title><content type='html'>Having fun with all our co-workers&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FrEZyE0A1YA/TEDc9voi4FI/AAAAAAAACcs/kEbdKi9N6Gw/s1600/team_building.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 158px;" src="http://3.bp.blogspot.com/_FrEZyE0A1YA/TEDc9voi4FI/AAAAAAAACcs/kEbdKi9N6Gw/s320/team_building.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5494634498708660306" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-6497151563008199042?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/6497151563008199042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=6497151563008199042' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/6497151563008199042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/6497151563008199042'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2010/07/bigger-than-free-software-or-buying.html' title='Bigger than free software'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FrEZyE0A1YA/TEDc9voi4FI/AAAAAAAACcs/kEbdKi9N6Gw/s72-c/team_building.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-187734845218521126</id><published>2010-04-06T22:13:00.004+02:00</published><updated>2010-04-06T22:18:00.419+02:00</updated><title type='text'>New minig feature</title><content type='html'>MiniG can now handle email priority in its conversation list. Threads with a high priority email are shown in red. They can be found using is:important.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://3.bp.blogspot.com/_FrEZyE0A1YA/S7uWI2Fi2fI/AAAAAAAACbo/F2IGyUqSOlk/s1600/mail_priority.png"/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-187734845218521126?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/187734845218521126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=187734845218521126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/187734845218521126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/187734845218521126'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2010/04/new-minig-feature.html' title='New minig feature'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FrEZyE0A1YA/S7uWI2Fi2fI/AAAAAAAACbo/F2IGyUqSOlk/s72-c/mail_priority.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-2561247194268054872</id><published>2010-03-30T03:26:00.004+02:00</published><updated>2010-03-30T03:29:14.421+02:00</updated><title type='text'>Working late</title><content type='html'>Answered flag is now handled by minig (on conversations &amp; messages).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_FrEZyE0A1YA/S7FTabCa7WI/AAAAAAAACbE/7AbfHcuG_wc/s1600/answeredEmail.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 292px; height: 206px;" src="http://3.bp.blogspot.com/_FrEZyE0A1YA/S7FTabCa7WI/AAAAAAAACbE/7AbfHcuG_wc/s320/answeredEmail.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5454232337121996130" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-2561247194268054872?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/2561247194268054872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=2561247194268054872' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2561247194268054872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2561247194268054872'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2010/03/working-late.html' title='Working late'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_FrEZyE0A1YA/S7FTabCa7WI/AAAAAAAACbE/7AbfHcuG_wc/s72-c/answeredEmail.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-1719845964232668981</id><published>2010-03-22T22:54:00.003+01:00</published><updated>2010-03-22T23:05:38.061+01:00</updated><title type='text'>BigG, GrosG, MaxiG, you name it....</title><content type='html'>First step is complete : BigG now has an ltmp compliant daemon. At least it's compliant with postfix lmtp client which is sufficient for my needs.&lt;br /&gt;&lt;br /&gt;It does not do a lot for now, just outputs some logs while doing the LMTP dialog: &lt;pre&gt;2010-03-22 22:49:59,458 RunnableExtensionLoader INFO - DeliveryFactory loaded.&lt;br /&gt;2010-03-22 22:49:59,462 RunnableExtensionLoader INFO - ValidatorFactory loaded.&lt;br /&gt;2010-03-22 22:49:59,462 RunnableExtensionLoader INFO - Loaded 2 implementors of org.obm.lmtp.lmtpbackendfactory&lt;br /&gt;2010-03-22 22:49:59,499 LMTPDaemon INFO - Starting LMTP daemon...&lt;br /&gt;2010-03-22 22:49:59,565 MinaServer INFO - mina lmtp server created&lt;br /&gt;2010-03-22 22:49:59,578 MinaCodecFactory INFO - mina codec factory created&lt;br /&gt;2010-03-22 22:49:59,589 MinaLmtpServer INFO - Starting listener. active: true h: org.obm.mina.MinaIoHandler@128ae45a&lt;br /&gt;2010-03-22 22:49:59,589 LmtpServer INFO - server started&lt;br /&gt;2010-03-22 22:49:59,589 LMTPDaemon INFO - LMTP daemon started.&lt;br /&gt;2010-03-22 22:50:17,969 BiggLmtpBackend INFO - addressStatus(sga@zz.com)&lt;br /&gt;2010-03-22 22:50:17,969 LdapValidator INFO - validating sga@zz.com&lt;br /&gt;2010-03-22 22:50:18,039 BiggLmtpBackend INFO - deliver(org.obm.lmtp.backend.LmtpEnvelope@7a19a37a, blob: Blob: { path=/tmp/blob2739528671992765153.bin, size=null }&lt;br /&gt;2010-03-22 22:50:18,040 CassandraAgent INFO - delivering to a cassandra node... in the near feature :/&lt;br /&gt;2010-03-22 22:50:18,043 MinaIoHandler INFO - session closed&lt;/pre&gt;&lt;br /&gt;Postfix is happy with that: &lt;pre&gt;Mar 22 22:50:17 obm23 postfix/pickup[6601]: E27B85E82: uid=0 from=&lt;root&gt;&lt;br /&gt;Mar 22 22:50:18 obm23 postfix/cleanup[6827]: E27B85E82: message-id=&lt;20100322215017.E27B85E82@lenny.buffy.kvm&gt;&lt;br /&gt;Mar 22 22:50:18 obm23 postfix/qmgr[1996]: E27B85E82: from=&lt;root@lenny.buffy.kvm&gt;, size=284, nrcpt=1 (queue active)&lt;br /&gt;Mar 22 22:50:18 obm23 postfix/lmtp[6829]: E27B85E82: to=&lt;sga@zz.com&gt;, relay=10.0.0.1[10.0.0.1]:2400, delay=0.48, delays=0.21/0.05/0.15/0.07, dsn=2.1.5, status=sent (250 2.1.5 Delivery OK)&lt;br /&gt;Mar 22 22:50:18 obm23 postfix/qmgr[1996]: E27B85E82: removed&lt;/pre&gt;&lt;br /&gt;Next step is to parse the mail with mime4j before giving it to &lt;a href="http://code.google.com/p/bigg/source/browse/trunk/plugins/org.obm.delivery.cassandra/src/org/obm/delivery/cassandra/CassandraAgent.java"&gt;CassandraAgent&lt;/a&gt;. The agent will push everything to a cassandra node.&lt;br /&gt;&lt;br /&gt;Coming soon to &lt;a href="http://code.google.com/p/bigg/"&gt;BigG (mostly empty) website&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-1719845964232668981?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://code.google.com/p/bigg/' title='BigG, GrosG, MaxiG, you name it....'/><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/1719845964232668981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=1719845964232668981' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/1719845964232668981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/1719845964232668981'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2010/03/bigg-grosg-maxig-you-name-it.html' title='BigG, GrosG, MaxiG, you name it....'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-3435173845588480457</id><published>2010-02-13T14:47:00.002+01:00</published><updated>2010-02-13T14:49:29.993+01:00</updated><title type='text'>Jabber in minig</title><content type='html'>After a first experiment, we are now committed to complete chat support in minig.&lt;br /&gt;&lt;br /&gt;Here is a screenshot showing what already works.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FrEZyE0A1YA/S3atww8AydI/AAAAAAAACac/4mqhlUpQKfY/s1600-h/jabber.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_FrEZyE0A1YA/S3atww8AydI/AAAAAAAACac/4mqhlUpQKfY/s320/jabber.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5437724653378390482" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-3435173845588480457?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/3435173845588480457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=3435173845588480457' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3435173845588480457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3435173845588480457'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2010/02/jabber-in-minig.html' title='Jabber in minig'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_FrEZyE0A1YA/S3atww8AydI/AAAAAAAACac/4mqhlUpQKfY/s72-c/jabber.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-1657489638022219945</id><published>2010-02-09T21:53:00.002+01:00</published><updated>2010-02-09T22:01:39.144+01:00</updated><title type='text'>Filters in MiniG for 2.3.2</title><content type='html'>After 6 month with filters code disabled in MiniG, I finally took the last steps to enable them : vacation &amp; forward handling using OBM infos.&lt;br /&gt;&lt;br /&gt;The finishing touch was pretty boring : &lt;ul&gt;&lt;li&gt;adding APIs to OBM sync for updating forward and vacation infos in the UserObm table.&lt;/li&gt;&lt;li&gt;Completing the vacation ui in MiniG&lt;/li&gt;&lt;li&gt;Adding an interface to set email forwarding&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Well it's done and will be available with all 2.3.2+ obm installs.&lt;br /&gt;&lt;br /&gt;Everything is not perfect : obm vacation &amp; forward modules must be disabled as they have no knowledge of the filters stored in minig private database. A quick fix is possible as making an HTTP POST to minig-backend/regenerateSieve.do (login/password required) will generate a correct sieve script with forward, vacation &amp; filter rules.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-1657489638022219945?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/1657489638022219945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=1657489638022219945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/1657489638022219945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/1657489638022219945'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2010/02/filters-in-minig-for-232.html' title='Filters in MiniG for 2.3.2'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-6968568702745718880</id><published>2010-01-29T21:47:00.003+01:00</published><updated>2010-01-29T22:03:06.298+01:00</updated><title type='text'>Back in Toulouse</title><content type='html'>Just spent one month in Paris to meet few customers and give some training to our Paris "obm core team".&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some projects are now on track : Gilles Blanc is working on a BES (Blackberry Enterprise Server) connector for OBM. Nicolas Chauvet is deploying OBM+MiniG servers and should soon work on improving our redhat packages.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;While in Paris, Thomas Chemineau gave Sylvain &amp;amp; I a big training session on LemonLDAP. While I hate having all my code proxied by some perl crap, LemonLDAP is pretty cool. At least it is the only SSO solution that works as a proxy and gives you clean single sign out. I did a &lt;a href="http://minig.googlecode.com/svn/wiki/sso/lemon_obm.png"&gt;simple diagram on how we could implement minig sso using lemon&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This week I'll work on finishing MiniG sieve filtering code :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;handle vacation settings from obm&lt;/li&gt;&lt;li&gt;use email forwarding infos from the obm database&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-6968568702745718880?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/6968568702745718880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=6968568702745718880' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/6968568702745718880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/6968568702745718880'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2010/01/back-in-toulouse.html' title='Back in Toulouse'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-9002775471599181300</id><published>2009-12-02T00:51:00.003+01:00</published><updated>2009-12-02T01:06:49.806+01:00</updated><title type='text'>Brown paper bag release</title><content type='html'>For the first time in minig history, x.y.z.1166 seems ok. Two new bug reports so far, one of them being that minig requires 1280x1024 for real use. The other one relates to "whole folder actions".&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Biggest known bug in my list is "body part selection" : identify which part of an email is the body that must be shown to the user. Separating an email sent as "send as text and html" from a "text email with an html attachment". &lt;/div&gt;&lt;div&gt;&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/5811557-9002775471599181300?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/9002775471599181300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=9002775471599181300' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/9002775471599181300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/9002775471599181300'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/12/brown-paper-bag-release.html' title='Brown paper bag release'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-2096284578065259716</id><published>2009-11-25T21:02:00.004+01:00</published><updated>2009-11-26T14:29:46.452+01:00</updated><title type='text'>All your folders are belong to us</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;My hate for a folder tree in MiniG never was a secret :&lt;div&gt;&lt;ul&gt;&lt;li&gt;It requires lot of screen real estate&lt;/li&gt;&lt;li&gt;very hard to mana&lt;a href="http://minig.googlecode.com/svn/wiki/screenshots/barafolder.png"&gt;&lt;/a&gt;ge in a web context&lt;/li&gt;&lt;li&gt;a tree helps for mail triage. When I began using internet, altavista was becoming a leader and yahoo was loosing marketshare. Google didn't exist. At this time yahoo was trying to "categorize" the web while altavista understood that trying to create a tree on top of internet-scale data was a lost fight.&lt;/li&gt;&lt;li&gt;Displaying a tree is the easy solution : first thing I learned while attending Algorithm101 was that in computer science, everything can be represented with a tree.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;A tree was clearly not the way I wanted to go. It's fine for a small bunch of data. It's also fine when you don't have any other way to do the triage of your data.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To make things short, folder tree is out of minig, for good. As I have to live with IMAP servers, I still had to find an efficient replacement. The replacement has the following features :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;dynamic displays that only shows folders with unread emails by default&lt;/li&gt;&lt;li&gt;incremental search : a text field on top pushes the search paradigm of minig to your folders. Just type "m" in the field and you'll get your "MiniG" "Mini Me" "foo/mmm/bar" folders&lt;/li&gt;&lt;li&gt;dynamic color assignment : each folders gets a color. This color is used when showing search results to easily identify where they are stored (in your inbox, in a shared folder, in your sent messages)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Even some of my users that felt in the "A folder tree on the left of a mail client is mandatory" category are saying some nice things about the new display.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;BaraFolder (internal name of the new folder widget) (lot's of private jokes around that name) is available in the latest stable MiniG release we did today (2.2.15.1166). This release will hit about 1500 customer's mailboxes next week. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A release candidate of this minig version was shown to one of our customers last week and he said "no, I don't need the calendar demo, I want this" (ok, he was an easy target as we deployed horde/imp for him years ago). Given the time me, david and others dedicated into this release, I hope users will enjoy it.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Next steps are not set in stone, but big minig deployments (as in 8000 mailboxes) are planned. My work items should be :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;clustered deployement : N-frontend, M-backend&lt;/li&gt;&lt;li&gt;bugfixes&lt;/li&gt;&lt;li&gt;showing the filter feature in the UI. MiniG can write sieve filters, but it's disabled in released build as it conflicts with some obm features (vacation, forwarding, etc)&lt;/li&gt;&lt;li&gt;bugfixes&lt;/li&gt;&lt;li&gt;composer. this part of minig really needs some love. Even more when you see what google wave can do (no, the plan is not to be able to insert a "poll widget" in your signature)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;PS : MiniG is free software, released as GPLv3. No paying-customers-only-crap-for-the-others version.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-2096284578065259716?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/2096284578065259716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=2096284578065259716' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2096284578065259716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2096284578065259716'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/11/all-your-folders-are-belong-to-us.html' title='All your folders are belong to us'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-4215953621904431944</id><published>2009-11-01T17:06:00.002+01:00</published><updated>2009-11-01T17:14:26.760+01:00</updated><title type='text'>Random links of the weekend</title><content type='html'>Still exploring what Cassandra could provide as a clustered mail storage.&lt;br /&gt;&lt;br /&gt;Easy read on cassandra data model : &lt;a href="http://arin.me/code/wtf-is-a-supercolumn-cassandra-data-model"&gt;http://arin.me/code/wtf-is-a-supercolumn-cassandra-data-model&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Using this article, I drafted an early data model :&lt;br /&gt;&lt;pre&gt;Conversations : { // CF&lt;br /&gt;    INBOX/123-1 : { // Row key is the conv id&lt;br /&gt; timeuuid_1 : messageId1&lt;br /&gt; timeuuid_2 : messageId2&lt;br /&gt;    }      &lt;br /&gt;    INBOX/123-2 : { // Row key is the conv id&lt;br /&gt;         timeuuid_3 : messageId3&lt;br /&gt;         timeuuid_4 : messageId4&lt;br /&gt;    }       &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Folders : { // CF&lt;br /&gt;     INBOX : {&lt;br /&gt;           timeuuid_1 : INBOX/123-1&lt;br /&gt;           timeuuid_3 : INBOX/123-2&lt;br /&gt;     }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Messages : { // CF&lt;br /&gt;   messageId1 : { // row key&lt;br /&gt;       subject: bla bla&lt;br /&gt;     to: xx&lt;br /&gt;     cc: yy&lt;br /&gt;     bcc: zz&lt;br /&gt;     preview : hello world&lt;br /&gt;                   body: hello world ! qdqsd&lt;br /&gt;                   hasAttach: true&lt;br /&gt;                   hasInvitation: false&lt;br /&gt;                   attachments: attach_123, attach_456&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Attachments : {&lt;br /&gt;    attch_123 : {&lt;br /&gt;        filename: fileName1&lt;br /&gt; size: 123456&lt;br /&gt;        content: xazeqsdqdqsd_base_64&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Article on lucene/solr + cassandra : &lt;a href="http://nicklothian.com/blog/2009/10/27/solr-cassandra-solandra/"&gt;http://nicklothian.com/blog/2009/10/27/solr-cassandra-solandra/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As I wanted to store my tests on those technologies somewhere, I created the &lt;a href="bigg.googlecode.com"&gt;BigG project&lt;/a&gt; on googlecode.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-4215953621904431944?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/4215953621904431944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=4215953621904431944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/4215953621904431944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/4215953621904431944'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/11/random-links-of-weekend.html' title='Random links of the weekend'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-5169818079164090982</id><published>2009-10-28T22:15:00.009+01:00</published><updated>2009-10-28T23:02:44.587+01:00</updated><title type='text'>My (not so) secret plan</title><content type='html'>Did some work on re-packing Cassandra as an OSGi based daemon. The secret plan is to have 3 eclipse products :&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Cassandra node&lt;/h2&gt;&lt;br /&gt;Cassandra is the clustered DB. This kind of databases are designed with high availability in mind and operates in "multi-master" mode by default. Optimal configuration starts at 3 nodes : set your database to "validate transactions" when at least 2 nodes have a copy of the data, read your data from any node and routing of your requests will happen magically (well, multicast, versionning of data, but let's call it "magic"). &lt;br /&gt;Want more performance ? add a node and reads will hit multiple nodes &amp; use some map-reduce. Cassandra was benchmarked to out-perform mysql at 8 nodes. Yes, it means 8 1U low-cost servers to outperform a single mysql. But now you can scale easily, without requiring expensive hardware. &lt;br /&gt;Want more availability ? add a node and set your "transaction safety level" to more nodes than 2.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;LMTP over tcp daemon&lt;/h2&gt;&lt;br /&gt;This one would be the second daemon. It would handle lmtp, apply advanced filtering, interrogate cassandra for similar data to perform conversation grouping.&lt;br /&gt;This one doesn't store anything and would be completly stateless. Deploy as much as needed to handle your postfix load. Just hide those behind some basic DNS round-robin.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;IMAP connector&lt;/h2&gt;&lt;br /&gt;This one is needed to keep thunderbird in the loop. Reads cassandra data. IMAP client was a 20days job, so this one shouldn't be too hard. Just deploy some of them with DNS round-robin.&lt;br /&gt;MiniG backend would hit cassandra nodes directly.&lt;br /&gt;&lt;br /&gt;No code available on the net yet, but I want to try a messaging system built this way. This is just a personnal "will try" project. PostgreSQL, Cyrus+Murder &amp; Heartbeat are not out of the loop... yet :D&lt;br /&gt;&lt;br /&gt;Edit : to give some obm relevance to this blog entry, Adrien added email support to o-push. Works fine on Win Mobile, very slow on Nicolas's Android 2.x (htc magic with custom firmware for native exchange support), very fast on my iPhone, mixed results on Mehdi's Nokia E71. Expect a blog entry dedicated to that once first round of fixes hits googlecode.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-5169818079164090982?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/5169818079164090982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=5169818079164090982' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/5169818079164090982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/5169818079164090982'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/10/my-not-so-secret-plan.html' title='My (not so) secret plan'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-9082395413583825082</id><published>2009-10-23T00:44:00.002+02:00</published><updated>2009-10-23T00:46:49.646+02:00</updated><title type='text'>Innovation from mozilla team</title><content type='html'>&lt;a href="http://labs.mozilla.com/raindrop/"&gt;Mozilla raindrop project&lt;/a&gt; just appeared on the web.&lt;br /&gt;&lt;br /&gt;Like it or not, but at least Google with GMail &amp; Wave is not the only one trying to innovate in email business any more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-9082395413583825082?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/9082395413583825082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=9082395413583825082' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/9082395413583825082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/9082395413583825082'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/10/innovation-from-mozilla-team.html' title='Innovation from mozilla team'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-2103405968698815347</id><published>2009-10-21T23:48:00.002+02:00</published><updated>2009-10-22T00:26:31.393+02:00</updated><title type='text'>Status update</title><content type='html'>OBM 2.3 freeze mode is on.&lt;br /&gt;&lt;br /&gt;MiniG isn't branched, so I'm trying to add small features without destroying mail reading.&lt;br /&gt;&lt;br /&gt;obm sync receives lots of performance related commits. We tweaked most of our sql queries to get good performance on both mysql &amp; pg.&lt;br /&gt;&lt;br /&gt;MySQL &amp; PostgreSQL do not require the same kind of tuning. MySQL prefers 2 queries with select a from b ... and select c from b where b.id in (). PostgreSQL performs better with select c from b inner join a where... If we do the one query version postgresql wins &amp; mysql crawls to death. If we do the 2 query version, mysql outperforms postgresql a little on low-cost hardware benchmarks.&lt;br /&gt;&lt;br /&gt;We (re)did o-push tests on Nokia E71 with MailForExchange. The calendar part of o-push is working very well. We still need to take a look at contacts. We expect to release obm-2.3 rc0 with contacts &amp; calendar working in o-push. Adrien is working on the mail part of o-push and discovered that microsoft has an alternative to locales. Forget iso-8859-1, let's call it 28591. utf-8 is 65001. o-push just won a new mapping table.&lt;br /&gt;&lt;br /&gt;Still wondering if obm new contact screen will be ready for prime time. As it is, I don't like it. Knowing Mehdi &amp; David skills with CSS &amp; Javascript, I think we can still have a new killer module for OBM 2.3. Right now, removing MiniG contact screen to use the OBM one would get the "Over my dead body" response. But as we're all inspired by Snow Leopard Addressbook, Google Contacts and mobile me, we'll find a UI that satisfies everyone, including users ;-)&lt;br /&gt;&lt;br /&gt;MiniG seems in a pretty good shape (lot's of people use it as their only mail software, including me). People on the obm mailing seems to have a hard time installing it. I need to figure out why :/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-2103405968698815347?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/2103405968698815347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=2103405968698815347' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2103405968698815347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2103405968698815347'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/10/status-update.html' title='Status update'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-3490129109589666863</id><published>2009-10-11T15:12:00.003+02:00</published><updated>2009-10-11T16:23:02.685+02:00</updated><title type='text'>New round of MiniG changes</title><content type='html'>Hottest topic for minig was thread grouping. I did all the modifications to make it use Cyrus support for &lt;a href="http://tools.ietf.org/html/rfc5256"&gt;RFC5256&lt;/a&gt;. This is slower than the algorithm I came out with, but well my code was faster because it ignored the case that forces you to work with the "References" header.&lt;br /&gt;&lt;br /&gt;"Slower" is something that should be taken with care. The load on minig backend JVM is greatly reduced. The "UID THREAD REFERENCES UTF-8 ALL" imap command forces cyrus to do the hard work. The new code replaces MiniG JVM load by Cyrus I/O load. As most sysadmins are OK to dedicate their SAN resources to cyrus, but tends to hate JaveVM, this ok : they will see a waiting JVM not sucking any resource and a cyrus crawling the SAN mounts to death :-)&lt;br /&gt;&lt;br /&gt;I also fixed MiniG backend memory usage. MiniG works with conversations, IMAP servers with messages. MiniG needs to maintain a mapping between Conversation's identifiers and IMAP messages UIDs. This mapping was sucking lot of memory. MiniG already has an on-disk version of this mapping. Easy solution : Java SoftReference. A SoftReference is a Java reference that the JVM is allowed to collect when it is under memory pressure. Most of the time, minig will use the in-memory mapping. When memory pressure is to high, to cache will be evicted &amp; rebuilt on demand. After 11years of Java programming, this was the first time I used &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ref/SoftReference.html"&gt;SoftReference&lt;/a&gt;. I knew how strong/weak/soft/phantom references work in Java, but it's the first time my code cannot work without using them.&lt;br /&gt;&lt;br /&gt;As it was "optimisation week-end", I also worked on MiniG bandwidth consumption. MiniG was already very good for remote access with limited bandwidth, but things could be made better.&lt;br /&gt;&lt;br /&gt;When you display your inbox, every 20sec, minig javascript polls the backend for changes. This AJAX call downloaded the current page of messages &amp; redrawn the grid. This transfer is in the 2KB range. I introduced versioning to minig caches. The AJAX call now sends its last know version to the frontend. Frontend relays it the backend. The backend answers with http 304 when no change occurs. Frontend sends a "UseCachedData" RuntimeException the javascript. The most common case "nothing changed" goes from a 2KB transfer to a 81byte transfer. Quite nice improvement.&lt;br /&gt;&lt;br /&gt;For now this is only done for IMAP folders, not for search results. But I as bought the "SOLR 1.4 Enterprise Search Server" book (very good investment for solr users), their number one recommandation for solr performance is to enable "proxy support" which will make solr respond with http 304 when your last search gives the same result. That's why I started implementing support of HTTP 304 in minig backend &amp; frontend. Adding 304 support to minig search will give a big performance boost to "Unread" mail fans.&lt;br /&gt;&lt;br /&gt;Upcoming release also adds a user visible feature : when you read a conversation, all unread emails are auto-expanded. &lt;br /&gt;&lt;br /&gt;Next bug on my list is about composer, iframes in design mode &amp; cut'n'paste. After 2 years of minig work, I tend to hate those "browser dependent" bugs.&lt;br /&gt;&lt;br /&gt;I'm still hoping to do a stable minig release this week with obm 2.2.14, the composer bug being the last known release blocker.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-3490129109589666863?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/3490129109589666863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=3490129109589666863' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3490129109589666863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3490129109589666863'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/10/new-round-of-minig-changes.html' title='New round of MiniG changes'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-2303422809951746049</id><published>2009-10-10T00:26:00.005+02:00</published><updated>2009-10-10T00:57:14.869+02:00</updated><title type='text'>Status of my OBM parts before oct 15th freeze</title><content type='html'>Worked 4/5 days on making sure that obm-sync was performing correctly on a 13GB OBM 2.3 PostgreSQL database. I must thank again yourkit.com for the license they granted me for MiniG. Their software is not free (as in speech), but they give away licences for free softwares. This kind of ubber cool software just tells you when your code is shit.&lt;br /&gt;&lt;br /&gt;Small commit on obm-caldav to prevent it from fetching all calendar permissions from database. Yourkit helped on this one too.&lt;br /&gt;&lt;br /&gt;MiniG thread grouping still needed some work. Slashdot article from Cyrus most active contributors (fastmail.fm) gave me some hints. Answer "UID THREAD REFERENCES UTF-8 ALL". This simple IMAP command forces cyrus to do all the threading calculation for you. The minig part is still complicated but from a performance pov, it's a win.&lt;br /&gt;&lt;br /&gt;Ok, I really depend on cyrus features. For today deadlines, that's fine. But the architecture I want to have for minig is :&lt;br /&gt;&lt;br /&gt;incoming mail -&gt; ironport (or any other _efficient_ spam filtering solution) -&gt; minig_lmtp -&gt; cassandra clustered db&lt;br /&gt;&lt;br /&gt;Solr would be plugged into cassandra (cassandra is the big table implementation that facebook released to the apache group as free software).&lt;br /&gt;&lt;br /&gt;Yes cyrus does not exist in the architecture I'm hoping to get minig to. (s|l)mtp connector to clustered db with full text indexer is google architecture. This architecture seems like the right one to me. murder + heartbeat seems pretty fragile when you compare it to cassandra/big table reliability.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-2303422809951746049?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/2303422809951746049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=2303422809951746049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2303422809951746049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2303422809951746049'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/10/status-of-my-obm-parts-before-oct-15th.html' title='Status of my OBM parts before oct 15th freeze'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-3042409379736338223</id><published>2009-10-04T23:16:00.006+02:00</published><updated>2009-10-04T23:59:49.767+02:00</updated><title type='text'>Release often, Release early</title><content type='html'>Very early in some cases... We had to prepare a demo of o-push with obm 2.3 trunk (bleeding egde) and minig.&lt;br /&gt;&lt;br /&gt;I had to stop working on minig temporarily to get o-push in a demo-able state.&lt;br /&gt;&lt;br /&gt;OPush work was stalled by higher priority tasks, but after working on it all the week-end, it's in a pretty cool shape. I've just committed true push support for calendars.&lt;br /&gt;&lt;br /&gt;Here is a demo video I did with my test setup : every modification in obm 2.3 calendar appears in the pda few seconds later.&lt;br /&gt;&lt;br /&gt;(Yes, it's not perfect, I still don't know why I add to go back to the activesync application while recording)&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/cMJ20G_P2Sk&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/cMJ20G_P2Sk&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;PS: I had to convert the video to xvid as youtube seems to do shit with ogv's from gtk-recordMyDesktop&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-3042409379736338223?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/3042409379736338223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=3042409379736338223' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3042409379736338223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3042409379736338223'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/10/release-often-release-early.html' title='Release often, Release early'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-522390472679127136</id><published>2009-09-27T13:33:00.004+02:00</published><updated>2009-09-27T14:06:22.269+02:00</updated><title type='text'>OBM Barcamp</title><content type='html'>We spent friday afternoon &amp; saturday on a barcamp dedicated to OBM with some co-workers from Paris.&lt;br /&gt;&lt;br /&gt;At the end of the first afternoon, I was pretty dissapointed : &lt;ul&gt;&lt;li&gt;Lots of talking&lt;/li&gt;&lt;li&gt;No actions&lt;/li&gt;&lt;/ul&gt; My first impression was that I lost an afternoon of minig bugfixing. The second day changed my opinion.&lt;br /&gt;&lt;br /&gt;Mehdi &amp; Guillaume merged most of the patches we maintained for our main production setup.&lt;br /&gt;&lt;br /&gt;Sylvain worked with Erwan to figure out the best way to make LemonLDAP + OBM + MiniG work out of the box.&lt;br /&gt;&lt;br /&gt;David &amp; Vincent did some improvements on 2.3 calendar.&lt;br /&gt;&lt;br /&gt;Tony worked on obm-automation improvements to allow running update.pl at login time for auto-provisionning of mailboxes &amp; ldap entries.&lt;br /&gt;&lt;br /&gt;I worked with Michel &amp; Guillaume to figure out how to handle really big mailboxes in MiniG. Michel mailbox is a 20GB one. To give you an idea, our cyrus setup in Toulouse is only 35GB for 44 mailboxes &amp; lots of mailshares.&lt;br /&gt;&lt;br /&gt;Michel's mailbox was a very interesting test-case. It triggered a "too many open files" pretty rapidly. We identified a very old bug : the class that read minig configuration files left a file descriptor open.&lt;br /&gt;&lt;br /&gt;This jumbo mailbox has other properties : it is big enough to trigger bugs that only occured on Toulouse production setup after more than 24h. As we are still unsure if the deadlock timeout that occurs on some jdbc transactions is derby's fault or minig's fault, I just committed the switch from a derby internal database to an external PostgreSQL instance. This change will permit one thing: identify if the bug was in derby.&lt;br /&gt;&lt;br /&gt;Some easier to fix bugs were also identified : &lt;ul&gt;&lt;li&gt;Advanced search misshandled searches on subject with two keywords&lt;/li&gt;&lt;li&gt;Tony helped me fix the filter that was used for autocomplete when ldapContacts.pl is active&lt;/li&gt;&lt;/ul&gt; Some decision were taken: &lt;ul&gt;&lt;li&gt;We confirmed that OBM feature &amp; ui freeze will be effective on Oct 15th.&lt;/li&gt;&lt;li&gt;Contact search in OBM &amp; MiniG will move from SQL queries to a SOLR core (we're not sure yet if it will meet the 2.3 freeze date). We will also try to do the same for events.&lt;/li&gt;&lt;li&gt;We are going to integrate a real LemonLDAP sso provider in minig. One that will not require OBM sso subsystem&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;If I consider the complete barcamp session, It was needed &amp; productive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-522390472679127136?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/522390472679127136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=522390472679127136' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/522390472679127136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/522390472679127136'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/09/obm-barcamp.html' title='OBM Barcamp'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-5967455551656953630</id><published>2009-09-23T20:21:00.003+02:00</published><updated>2009-09-23T20:31:15.522+02:00</updated><title type='text'>Spinner of death (tm) Improvement</title><content type='html'>Sometime things can go wrong in MiniG, even with legitimate reasons :&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;You suspended your laptop and your minig session is expired when your browser comes back to life&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Your beloved administrator restarted a tomcat server without notifying anybody&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Your network was down more than 3 minutes (MiniG frontend session duration)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;This case will be handled in a next releases.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FrEZyE0A1YA/SrpouXuvxKI/AAAAAAAACWk/TK2d2f-8jE4/s1600-h/tartiflette.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 172px;" src="http://1.bp.blogspot.com/_FrEZyE0A1YA/SrpouXuvxKI/AAAAAAAACWk/TK2d2f-8jE4/s320/tartiflette.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5384731450328204450" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Yes, the texts are temporary and TartifletteMode is only how an expired session is called in the code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-5967455551656953630?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/5967455551656953630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=5967455551656953630' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/5967455551656953630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/5967455551656953630'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/09/spinner-of-death-tm-improvement.html' title='Spinner of death (tm) Improvement'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_FrEZyE0A1YA/SrpouXuvxKI/AAAAAAAACWk/TK2d2f-8jE4/s72-c/tartiflette.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-8716703179260254437</id><published>2009-09-17T22:00:00.007+02:00</published><updated>2009-09-18T10:51:36.208+02:00</updated><title type='text'>(Temporary) Epic Fail</title><content type='html'>Changing MiniG mail grouping is more tricky than expected. &lt;br /&gt;&lt;br /&gt;The previous algorithm worked like this :&lt;br /&gt; - read the subject&lt;br /&gt; - compute its root, "Fwd: Re: Hello sent the 2009-08-07" becomes "hello sent the xxxx-xx-xx"&lt;br /&gt; - simply use an equality comparison on the subject roots.&lt;br /&gt;&lt;br /&gt;First version with real threads used an hacked version of subject grouping. It was just a hack on the "equality comparison". Instead of comparing suject roots, it used lists of Message-ID headers and was doing comparisons on the differences between those 2. It worked. For mailboxes &lt; 1000 messages. Sylvain's 100k mails Junk folder took more than 1hour to process. We needed a linear algorithm to do the thread grouping.&lt;br /&gt;&lt;br /&gt;The new algorithm works on other headers : Message-ID and In-Reply-To.&lt;br /&gt;&lt;br /&gt;It works this way. We maintain a ThreadRoot list which holds known conversations with the message-id's in them&lt;br /&gt;&lt;br /&gt;When we detect that messages are added/changed or deleted to a folder, we first process removals. When a ThreadRoot has no more messages, we mark it as dead and flag it for removal.&lt;br /&gt;&lt;br /&gt;Then we process updates, this is the tricky part.&lt;br /&gt;&lt;br /&gt;We have 2 lists : &lt;br /&gt; - List&amp;lt;ThreadRoot&amp;gt;, all the known thread roots not flagged as dead.&lt;br /&gt; - a List&amp;lt;RawMessage&amp;gt; called leafCandidates where we have all the not yet processed messages.&lt;br /&gt;&lt;br /&gt;We then run :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;unmerged = 0;&lt;br /&gt;merged = -1;&lt;br /&gt;while (merged &amp;lt; unmerged) {&lt;br /&gt;    unmerged = leafCandidates.size();&lt;br /&gt;    doMerge();&lt;br /&gt;    merged = leafCandidates.size();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then doMerge() does all the job :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;for (RawMessage r : leafCandidates) {&lt;br /&gt;    if rootsIds.contains(r.messageId) {&lt;br /&gt;       flagUpdate(threadRoot, r);&lt;br /&gt;    } else if (r.inReplyTo == null) {&lt;br /&gt;       createThreadRoot(r);&lt;br /&gt;    } else {&lt;br /&gt;       ThreadRoot tr = rootIds.get(r.inReplyTo);&lt;br /&gt;       if (tr) {&lt;br /&gt;         tr.merge(r);&lt;br /&gt;       } else {&lt;br /&gt;         // corner cases, most problems are not here&lt;br /&gt;         // exemple : a mail with an In-Reply-To and the father mail is deleted&lt;br /&gt;       }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This algorithm is mostly linear... Its real complexity depends X, Y, Z where X is how much new mail you receive, Y how much you receive replies to existing emails and Z, how much the user changes flags on existing emails. It can easily process Sylvain 100k spams in 20sec, so let's assume the complixity is OK.&lt;br /&gt;&lt;br /&gt;Most MiniG problems on our trunk version are in the "flagUpdate(threadRoot, r)" process. This creates all kind of strange bugs : conversations that still look read, mark as read/unread that only work "sometime".&lt;br /&gt;&lt;br /&gt;Flags are still broken, but the new algorith is pretty promising. The load on our test &amp; production mail server is lighter, really lighter. Some tuning of the last corner cases will make it a very good change. In fact the new code while still buggy is so fast that it exposed race conditions in the indexing code ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-8716703179260254437?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/8716703179260254437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=8716703179260254437' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/8716703179260254437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/8716703179260254437'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/09/temporary-epic-fail.html' title='(Temporary) Epic Fail'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-817302506159660065</id><published>2009-09-13T17:52:00.002+02:00</published><updated>2009-09-13T18:03:30.156+02:00</updated><title type='text'>Long time no blog</title><content type='html'>Massive changes are coming to minig. Real thread sorting, by message actions, etc.&lt;br /&gt;&lt;br /&gt;We added a second minig installation to our test setup. We now have a MiniG setup running on our production mail server, and another one running on a lenny 64bit kvm. Both are using our production mail server.&lt;br /&gt;&lt;br /&gt;The one running in kvm allows a first round of testing on live mailboxes. Performance testing is easier on this one, as the IMAP load and the java load are cleanly splitted on two servers. &lt;br /&gt;&lt;br /&gt;With this new setup I already identified an easy optimisation : the select imap command forces Cyrus to write a log line. Storing the selected imap folder in the org.minig.imap lib might provide sensible speed improvements to initial mailbox indexing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-817302506159660065?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/817302506159660065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=817302506159660065' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/817302506159660065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/817302506159660065'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/09/long-time-no-blog.html' title='Long time no blog'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-1630989050073655898</id><published>2009-09-08T23:56:00.002+02:00</published><updated>2009-09-09T00:20:03.178+02:00</updated><title type='text'>Big minig bug hunt</title><content type='html'>I'm focused on chasing minig bugs. &lt;br /&gt;&lt;br /&gt;We clearly improved our testing flow. Releases are tested everyday by ff3 users, ff3.5 users and chromium users (Sylvain &amp; me dropped firefox now that 64bit builds are available). IE8 is often tested on our TSE server. I still need to find an easy way to do IE6 testing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;What's coming into minig :&lt;br /&gt;&lt;br /&gt; - real thread grouping. User testing shown that "subject+ignore numbers" is only manageable to technical people.&lt;br /&gt;&lt;br /&gt; - composer improvements (I'm fighting with GWT RichTextArea, and learning things I didn't want to know about browsers differences).&lt;br /&gt;&lt;br /&gt; - by email actions. Delete one, Star one, Print one. Add sender to contacts, etc.&lt;br /&gt;&lt;br /&gt; - next/previous buttons. I don't read my email like that, but a lots of people seems to think that when you read a conversation, next has a meaning.&lt;br /&gt;&lt;br /&gt; - folder management improvents. Rename &amp; move.&lt;br /&gt;&lt;br /&gt;And lots of needed bugfixes......&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-1630989050073655898?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/1630989050073655898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=1630989050073655898' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/1630989050073655898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/1630989050073655898'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/09/big-minig-bug-hunt.html' title='Big minig bug hunt'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-1190853061353816034</id><published>2009-08-05T17:53:00.005+02:00</published><updated>2009-08-05T18:48:48.139+02:00</updated><title type='text'>Something's broken in JNDI ?</title><content type='html'>Consider the following unit test :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package ldapcrap;&lt;br /&gt;&lt;br /&gt;import java.util.Hashtable;&lt;br /&gt;&lt;br /&gt;import javax.naming.NamingException;&lt;br /&gt;import javax.naming.directory.DirContext;&lt;br /&gt;import javax.naming.directory.InitialDirContext;&lt;br /&gt;&lt;br /&gt;import junit.framework.TestCase;&lt;br /&gt;&lt;br /&gt;@SuppressWarnings("unchecked")&lt;br /&gt;public class CrapTest extends TestCase {&lt;br /&gt;&lt;br /&gt; private Hashtable env;&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void setUp() throws Exception {&lt;br /&gt;  super.setUp();&lt;br /&gt;&lt;br /&gt;  env = new Hashtable();&lt;br /&gt;&lt;br /&gt;  env.put("java.naming.factory.initial",&lt;br /&gt;    "com.sun.jndi.ldap.LdapCtxFactory");&lt;br /&gt;  env.put("java.naming.provider.url", "ldap://10.0.0.5");&lt;br /&gt;  env.put(DirContext.SECURITY_AUTHENTICATION, "simple");&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void testJNDIisCrap() throws NamingException {&lt;br /&gt;  DirContext ctx = null;&lt;br /&gt;  try {&lt;br /&gt;   ctx = new InitialDirContext(env);&lt;br /&gt;  } catch (Throwable t) {&lt;br /&gt;   fail("test failed");&lt;br /&gt;  } finally {&lt;br /&gt;   ctx.close();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void testInALoop() throws NamingException {&lt;br /&gt;  long time;&lt;br /&gt;  int COUNT;&lt;br /&gt;   &lt;br /&gt;  COUNT = 1000;&lt;br /&gt;  time = System.currentTimeMillis();&lt;br /&gt;  for (int i = 0; i &lt; COUNT; i++) {&lt;br /&gt;   testJNDIisCrap();&lt;br /&gt;  }&lt;br /&gt;  time = System.currentTimeMillis() - time;&lt;br /&gt;  System.out.println("did "+COUNT+" in "+(time/1000)+"second(s).");&lt;br /&gt;&lt;br /&gt;  COUNT = 10000;&lt;br /&gt;  time = System.currentTimeMillis();&lt;br /&gt;  for (int i = 0; i &lt; COUNT; i++) {&lt;br /&gt;   testJNDIisCrap();&lt;br /&gt;  }&lt;br /&gt;  time = System.currentTimeMillis() - time;&lt;br /&gt;  System.out.println("did "+COUNT+" in "+(time/1000)+"second(s).");&lt;br /&gt;&lt;br /&gt;  COUNT = 100000;&lt;br /&gt;  time = System.currentTimeMillis();&lt;br /&gt;  for (int i = 0; i &lt; COUNT; i++) {&lt;br /&gt;   testJNDIisCrap();&lt;br /&gt;  }&lt;br /&gt;  time = System.currentTimeMillis() - time;&lt;br /&gt;  System.out.println("did "+COUNT+" in "+(time/1000)+"second(s).");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void tearDown() throws Exception {&lt;br /&gt;  super.tearDown();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here's what it shows when openldap is running on 32bit debian etch:&lt;br /&gt;did 1000 in 2second(s).&lt;br /&gt;did 10000 in 28second(s).&lt;br /&gt;did 100000 in 441second(s).&lt;br /&gt;&lt;br /&gt;Something sounds wrong with those results as the unit test is linear : open/close, open/close. As long as we do not get 2, 20, 200 or something approaching, either my test code is wrong, or some server configuration is wrong.&lt;br /&gt;&lt;br /&gt;The results on 64bit lenny are:&lt;br /&gt;did 1000 in 2second(s).&lt;br /&gt;did 10000 in 19second(s).&lt;br /&gt;&lt;br /&gt;No third result, it broke and the test failed with some useless null pointer. Let's "strace -f" the slapd process on lenny :&lt;br /&gt;did 1000 in 13second(s).&lt;br /&gt;did 10000 in 382second(s).&lt;br /&gt;&lt;br /&gt;Ok, will take too long and seems stalled. Will write strace output to a file "strace -f -o slapd.log".&lt;br /&gt;&lt;br /&gt;Starts good : &lt;br /&gt;did 1000 in 6second(s).&lt;br /&gt;did 10000 in 61second(s).&lt;br /&gt;&lt;br /&gt;But then...&lt;br /&gt;did 100000 in 1049second(s).&lt;br /&gt;&lt;br /&gt;I expected between 500 &amp; 620 seconds (I hoped the jvm JIT will do its job). I used my computer in the meantime, but not that much.&lt;br /&gt;&lt;br /&gt;Still analysing the strace output, but if someone knows what is wrong in my test...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-1190853061353816034?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/1190853061353816034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=1190853061353816034' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/1190853061353816034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/1190853061353816034'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/08/somethings-broken-in-jndi.html' title='Something&apos;s broken in JNDI ?'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-3555860718078179195</id><published>2009-07-30T02:25:00.004+02:00</published><updated>2009-07-30T03:57:23.175+02:00</updated><title type='text'>Deliver MiniG on cd-rom ?</title><content type='html'>&lt;b&gt;The problem&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;MiniG interface is built with GWT, that's common knowledge. GWT compiles java to javascript and generates &lt;em&gt;permutations&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;A permutation is a static javascript compilation unit for a given browser and a given locale. MiniG supports 2 locales (french &amp; english). GWT 1.7 supports six browser flavours, so the compiler generates 12 javascript files (all the ABCD123.cache.html in the gwt build). &lt;br /&gt;&lt;br /&gt;When a GWT application is loaded, a bootstrap file runs (the minig.nocache.js). This file runs checks on the user browser and determines which permutation should be used. The bootstrap javascript is only 6.2K and is similar for allmost all gwt applications. Once the correct permutation is determined, minig.nocache.js instructs the browser to load the abcd123.cache.html for your browser. &lt;br /&gt;&lt;br /&gt;Most of the time, this file is already cached by your browser, but when a new version is deployed... the complete minig interface is downloaded. &lt;br /&gt;&lt;br /&gt;With GWT compiler 1.7.0, the minig interface stands between 472K and 481K. Now you obviously begin to understand why this blog post is named "Deliver on cd-rom ?".&lt;br /&gt;&lt;br /&gt;Ok, 500K is... half a second on a low cost end-user internet connection. As a french provider commercial says : "il a free, il a tout compris". But sometime, users do not even have an 8MB dsl connection. That's the case for the MiniG install running on my work mailbox. The 500K are a pain in the (insert joke about the G in MiniG) to download, as our work connection often uploads at 10K/s during work hours. This means that you cannot log into MiniG in less than 50 seconds.&lt;br /&gt;&lt;br /&gt;Apart from getting correct network connectivity, I must have a look at what can be done on the MiniG side. &lt;br /&gt;&lt;br /&gt;If you got me correctly, the localized messages are copied into javascript permutations. So if I add a 20K piece of text for online help in MiniG, the download size will go from 500K to 520K.&lt;br /&gt;&lt;br /&gt;How can this be solved ?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Solution 1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Here is an easy one : a2enmod deflate&lt;br /&gt;&lt;br /&gt;Run this command on the reverse proxy serving minig files and restart apache : gzip compression on static data files.&lt;br /&gt;&lt;br /&gt;Before :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-rw-r--r-- 1 tom tom 479K 2009-07-30 00:41 DCEC18F66460AB2A6CB58F4EF8A75E70.cache.html&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;After :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-rw-r--r-- 1 tom tom 139K 2009-07-30 00:41 DCEC18F66460AB2A6CB58F4EF8A75E70.cache.html.gz&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Just adding an apache module turned a 479K download to a 139K download. If the previous one was a 50sec download with our crappy bandwidth, this one is now 14sec. Pretty nice ?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Other solutions&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;MiniG is a pretty big application, but imagine something like Google Wave. You can guess they had to solve the same problem. They talked about it and provided &lt;a href="http://code.google.com/events/io/sessions/GoogleWavePoweredByGWT.html"&gt;solutions&lt;/a&gt; at the last Google I/O conference.&lt;br /&gt;&lt;br /&gt;Let's summarize (or emphasize...) what the upcoming solutions are.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Compiler cut points&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Even if minig never loads a page, all screens are not visible at the same time. There's no need to load the composer code when the frontpage only shows a list of message.&lt;br /&gt;&lt;br /&gt;before :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    addTab(Webmail.COMPOSER, new MailComposer());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;after :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    GWT.runAsync(new RunAsyncCallback() {&lt;br /&gt;        public void onSuccess() {&lt;br /&gt;           addTab(Webmail.COMPOSER, new MailComposer());&lt;br /&gt;        }&lt;br /&gt;    });&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This tells the compiler that adding the composer to the UI is not "top priority". If this is the first usage of the MailComposer class (in MiniG case it is), all its code will be generated in a separate javascript file. The composer code will be loaded later, when the INBOX was already shown to the user.&lt;br /&gt;&lt;br /&gt;Same applies for the progress bar shown on minig loading. We show the progress bar and can "runAsync" the XmlHttpRequest that fetches user settings on startup. Using this gives us :&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Instant progress bar display&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The main download is done with the progress bar on screen&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The 500K become 50K and then 450K&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;With some runAsync added, I managed to display inbox with only a 170k download.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Class metadata&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;GWT obfuscates a lot of things (renames all your variables to a, b, c, z, a1, z26 instead of their original names). But it keeps the name of your java classes in the code. The &lt;em&gt;-XdisableClassMetadata&lt;/em&gt; forces obfuscation of that to. MiniG uses fr.aliasource.webmail.*. This compile option gives more than 5% improvement. Easy win :-)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;SOYC : Story Of Your Compile&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This is a reporting tool designed to tell you which parts of your code contributes to the final JS size. This is really helpful to understand where runAsync and code refactoring are most needed.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;All those improvements are available in GWT compiler trunk. I tried them all on MiniG code. It is pretty unstable right now, but the solutions are coming. Situation is not critical (500K for a complete application is nothing), but as MiniG will gain features, we had to investigate this. Other optimizations are coming in the compiler, &lt;a href="http://dl.google.com/io/2009/pres/T_0230_Google_Wave_Powered_by_GWT.pdf"&gt;Google I/O presentation&lt;/a&gt; is a very interesting read.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-3555860718078179195?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/3555860718078179195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=3555860718078179195' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3555860718078179195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3555860718078179195'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/07/deliver-minig-on-cd-rom.html' title='Deliver MiniG on cd-rom ?'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-6866266213884705720</id><published>2009-07-16T20:32:00.007+02:00</published><updated>2009-07-16T21:12:47.803+02:00</updated><title type='text'>Mobile device provisionning with o-push</title><content type='html'>I just commited mobile device provisionning to the &lt;a href="http://code.google.com/p/o-push/"&gt;o-push ActiveSync server&lt;/a&gt;. We tested it with an iPhone 3.0 and it allows pretty cool things.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;What is mobile device provisionning :&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;When a device starts its dialog with the ActiveSync server, it sends an header "X-MS-PolicyKey : 0". The server can either ignore it or choose to enforce a security/enterprise policy. It (the server) does so by refusing the sync request and sending back a 449 http error code.&lt;br /&gt;&lt;br /&gt;Of course you need a device that supports security policies, but the iPhone 3.0 does.&lt;br /&gt;&lt;br /&gt;The device, when receiving the 449 error, starts a provisionning dialog :&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;it asks for the server policy&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;the server returns one with a temporary policy id&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;the device acknowledges the id by sending it back to server&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;the server respond with a "final policy id" for the device&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;the device will now use the "X-MS-PolicyKey: &amp;lt;final policy id&amp;gt;" in all its future communications&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;normal sync dialog will occur, except if the server administrator changes the policy (the servers sends another 449 error if the "final policy id" is no longer valid)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;What can the administrator enforce in the policy :&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Well, pretty much everything, but as the policy document is pretty explicit, lets reproduce it here :&lt;br /&gt;&lt;br /&gt;&amp;lt;EASProvisionDoc&amp;gt;&lt;br /&gt;  &amp;lt;DevicePasswordEnabled&amp;gt;0&amp;lt;/DevicePasswordEnabled&amp;gt;&lt;br /&gt;  &amp;lt;AlphanumericDevicePasswordRequired&amp;gt;0&amp;lt;/AlphanumericDevicePasswordRequired&amp;gt;&lt;br /&gt;  &amp;lt;PasswordRecoveryEnabled&amp;gt;0&amp;lt;/PasswordRecoveryEnabled&amp;gt;&lt;br /&gt;  &amp;lt;DeviceEncryptionEnabled&amp;gt;0&amp;lt;/DeviceEncryptionEnabled&amp;gt;&lt;br /&gt;  &amp;lt;AttachmentsEnabled&amp;gt;1&amp;lt;/AttachmentsEnabled&amp;gt;&lt;br /&gt;  &amp;lt;MinDevicePasswordLength&amp;gt;4&amp;lt;/MinDevicePasswordLength&amp;gt;&lt;br /&gt;  &amp;lt;MaxInactivityTimeDeviceLock&amp;gt;900&amp;lt;/MaxInactivityTimeDeviceLock&amp;gt;&lt;br /&gt;  &amp;lt;MaxDevicePasswordFailedAttempts&amp;gt;8&amp;lt;/MaxDevicePasswordFailedAttempts&amp;gt;&lt;br /&gt;  &amp;lt;MaxAttachmentSize/&amp;gt;&lt;br /&gt;  &amp;lt;AllowSimpleDevicePassword&amp;gt;1&amp;lt;/AllowSimpleDevicePassword&amp;gt;&lt;br /&gt;  &amp;lt;DevicePasswordExpiration/&amp;gt;&lt;br /&gt;  &amp;lt;DevicePasswordHistory&amp;gt;0&amp;lt;/DevicePasswordHistory&amp;gt;&lt;br /&gt;  &amp;lt;AllowStorageCard&amp;gt;1&amp;lt;/AllowStorageCard&amp;gt;&lt;br /&gt;  &amp;lt;AllowCamera&amp;gt;1&amp;lt;/AllowCamera&amp;gt;&lt;br /&gt;  &amp;lt;RequireDeviceEncryption&amp;gt;0&amp;lt;/RequireDeviceEncryption&amp;gt;&lt;br /&gt;  &amp;lt;AllowUnsignedApplications&amp;gt;1&amp;lt;/AllowUnsignedApplications&amp;gt;&lt;br /&gt;  &amp;lt;AllowUnsignedInstallationPackages&amp;gt;1&amp;lt;/AllowUnsignedInstallationPackages&amp;gt;&lt;br /&gt;  &amp;lt;MinDevicePasswordComplexCharacters&amp;gt;3&amp;lt;/MinDevicePasswordComplexCharacters&amp;gt;&lt;br /&gt;  &amp;lt;AllowWiFi&amp;gt;1&amp;lt;/AllowWiFi&amp;gt;&lt;br /&gt;  &amp;lt;AllowTextMessaging&amp;gt;1&amp;lt;/AllowTextMessaging&amp;gt;&lt;br /&gt;  &amp;lt;AllowPOPIMAPEmail&amp;gt;1&amp;lt;/AllowPOPIMAPEmail&amp;gt;&lt;br /&gt;  &amp;lt;AllowBluetooth&amp;gt;2&amp;lt;/AllowBluetooth&amp;gt;&lt;br /&gt;  &amp;lt;AllowIrDA&amp;gt;1&amp;lt;/AllowIrDA&amp;gt;&lt;br /&gt;  &amp;lt;RequireManualSyncWhenRoaming&amp;gt;0&amp;lt;/RequireManualSyncWhenRoaming&amp;gt;&lt;br /&gt;  &amp;lt;AllowDesktopSync&amp;gt;1&amp;lt;/AllowDesktopSync&amp;gt;&lt;br /&gt;  &amp;lt;MaxCalendarAgeFilter&amp;gt;0&amp;lt;/MaxCalendarAgeFilter&amp;gt;&lt;br /&gt;  &amp;lt;AllowHTMLEmail&amp;gt;1&amp;lt;/AllowHTMLEmail&amp;gt;&lt;br /&gt;  &amp;lt;MaxEmailAgeFilter&amp;gt;0&amp;lt;/MaxEmailAgeFilter&amp;gt;&lt;br /&gt;  &amp;lt;MaxEmailBodyTruncationSize&amp;gt;-1&amp;lt;/MaxEmailBodyTruncationSize&amp;gt;&lt;br /&gt;  &amp;lt;MaxEmailHTMLBodyTruncationSize&amp;gt;-1&amp;lt;/MaxEmailHTMLBodyTruncationSize&amp;gt;&lt;br /&gt;  &amp;lt;RequireSignedSMIMEMessages&amp;gt;0&amp;lt;/RequireSignedSMIMEMessages&amp;gt;&lt;br /&gt;  &amp;lt;RequireEncryptedSMIMEMessages&amp;gt;0&amp;lt;/RequireEncryptedSMIMEMessages&amp;gt;&lt;br /&gt;  &amp;lt;RequireSignedSMIMEAlgorithm&amp;gt;0&amp;lt;/RequireSignedSMIMEAlgorithm&amp;gt;&lt;br /&gt;  &amp;lt;RequireEncryptionSMIMEAlgorithm&amp;gt;0&amp;lt;/RequireEncryptionSMIMEAlgorithm&amp;gt;&lt;br /&gt;  &amp;lt;AllowSMIMEEncryptionAlgorithmNegotiation&amp;gt;2&amp;lt;/AllowSMIMEEncryptionAlgorithmNegotiation&amp;gt;&lt;br /&gt;  &amp;lt;AllowSMIMESoftCerts&amp;gt;1&amp;lt;/AllowSMIMESoftCerts&amp;gt;&lt;br /&gt;  &amp;lt;AllowBrowser&amp;gt;1&amp;lt;/AllowBrowser&amp;gt;&lt;br /&gt;  &amp;lt;AllowConsumerEmail&amp;gt;1&amp;lt;/AllowConsumerEmail&amp;gt;&lt;br /&gt;  &amp;lt;AllowRemoteDesktop&amp;gt;1&amp;lt;/AllowRemoteDesktop&amp;gt;&lt;br /&gt;  &amp;lt;AllowInternetSharing&amp;gt;1&amp;lt;/AllowInternetSharing&amp;gt;&lt;br /&gt;  &amp;lt;UnapprovedInROMApplicationList/&amp;gt;&lt;br /&gt;  &amp;lt;ApprovedApplicationList/&amp;gt;&lt;br /&gt;&amp;lt;/EASProvisionDoc&amp;gt;&lt;br /&gt;&lt;br /&gt;As you see, you can completly "enterprise lock" the phone :&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;You can lock wifi, infrared or bluetooth usage&lt;/li&gt;&lt;br /&gt; &lt;li&gt;No photos (we tested this one, the iPhone supports it)&lt;/li&gt;&lt;br /&gt; &lt;li&gt;No text messaging&lt;/li&gt;&lt;br /&gt; &lt;li&gt;No phone unlock without password (we tested this one too on the iPhone), with a strict password policy&lt;/li&gt;&lt;br /&gt; &lt;li&gt;No mail/groupware account except the enterprise/ActiveSync one&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Only allow sending SMIME signed emails&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Force storage of email/groupware data in an encrypted storage&lt;/li&gt;&lt;br /&gt; &lt;li&gt;etc&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Right now, the policy sent to the phones is harcoded in the o-push server, but will probably develop an interface to manage those policies ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-6866266213884705720?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/6866266213884705720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=6866266213884705720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/6866266213884705720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/6866266213884705720'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/07/mobile-device-provisionning-with-o-push.html' title='Mobile device provisionning with o-push'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-7409873192935133939</id><published>2009-07-03T02:34:00.002+02:00</published><updated>2009-07-03T02:43:05.564+02:00</updated><title type='text'>We had it first ;-)</title><content type='html'>MiniG had drag &amp; drop of conversations into folder before GMail. But my implementation clearly sucked (which was not a problem as I find drag&amp;drop an inefficient way to move mail around).&lt;br /&gt;&lt;br /&gt;Gmail did it better, so I mimiced their user interface for dnd.&lt;br /&gt;&lt;br /&gt;No screenshot, but a small video ;-)&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/PdtCFrSEpOg&amp;hl=en&amp;fs=1&amp;rel=0"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/PdtCFrSEpOg&amp;hl=en&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-7409873192935133939?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/7409873192935133939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=7409873192935133939' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/7409873192935133939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/7409873192935133939'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/07/we-had-it-first.html' title='We had it first ;-)'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-7670175874143358549</id><published>2009-06-03T00:32:00.004+02:00</published><updated>2009-06-03T00:45:43.914+02:00</updated><title type='text'>Vacation in MiniG</title><content type='html'>Now that filters and sieve scripts can be managed from MiniG, vacation is the next step.&lt;br /&gt;&lt;br /&gt;Here's what the form looks like :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_FrEZyE0A1YA/SiWrhxCnikI/AAAAAAAACO8/9MpnINW8cz0/s1600-h/vacation.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 250px;" src="http://2.bp.blogspot.com/_FrEZyE0A1YA/SiWrhxCnikI/AAAAAAAACO8/9MpnINW8cz0/s320/vacation.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5342865129533311554" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-7670175874143358549?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/7670175874143358549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=7670175874143358549' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/7670175874143358549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/7670175874143358549'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/06/vacation-in-minig.html' title='Vacation in MiniG'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_FrEZyE0A1YA/SiWrhxCnikI/AAAAAAAACO8/9MpnINW8cz0/s72-c/vacation.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-8969419251910107973</id><published>2009-05-25T22:09:00.002+02:00</published><updated>2009-05-25T22:11:44.457+02:00</updated><title type='text'>You asked for it...</title><content type='html'>And here they come : filters in MiniG :-)&lt;br /&gt;&lt;br /&gt;Cyrus sieve client API is fully functionnal. The UI to define the filters is being implemented right now.&lt;br /&gt;&lt;br /&gt;Mandatory screenshot below.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FrEZyE0A1YA/Shr7aFDYYTI/AAAAAAAACOk/h36FpebCdiM/s1600-h/Screenshot-MiniG+Webmail+.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 277px; height: 320px;" src="http://1.bp.blogspot.com/_FrEZyE0A1YA/Shr7aFDYYTI/AAAAAAAACOk/h36FpebCdiM/s320/Screenshot-MiniG+Webmail+.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5339856733652672818" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-8969419251910107973?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/8969419251910107973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=8969419251910107973' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/8969419251910107973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/8969419251910107973'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/05/you-asked-for-it.html' title='You asked for it...'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_FrEZyE0A1YA/Shr7aFDYYTI/AAAAAAAACOk/h36FpebCdiM/s72-c/Screenshot-MiniG+Webmail+.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-8667906177688522237</id><published>2009-04-25T01:36:00.003+02:00</published><updated>2009-04-25T01:47:26.105+02:00</updated><title type='text'>o-push updates and minig status</title><content type='html'>Just did some updates on the o-push website to reflect its status. To sum it up, it's going pretty well.&lt;br /&gt;&lt;br /&gt;The bad thing about server side software is you cannot show a screenshot. Will try to make a screencast of a working synchronisation.&lt;br /&gt;&lt;br /&gt;Next o-push task is storage implementation : storing device ids, client and server mappings (obm database id to pda identifier). Right now this is stored in memory, but as we plan to integrate o-push in OBM 2.3, I'll use PostgreSQL tables for the persistent storage implementation.&lt;br /&gt;&lt;br /&gt;On the MiniG front, Adrien just committed lots of work on iCalendar invitations. When you receive an event invitation, you can accept it and the event will be created in OBM (or updated if it was already coming from obm). In my opinion, one the nicest minig feature with event invitations is the "has:invitation" search tip to find your pending event invitations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-8667906177688522237?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/8667906177688522237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=8667906177688522237' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/8667906177688522237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/8667906177688522237'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/04/o-push-updates.html' title='o-push updates and minig status'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-7466857629007846827</id><published>2009-03-27T14:21:00.002+01:00</published><updated>2009-03-27T14:36:37.120+01:00</updated><title type='text'>O-Push, ActiveSync protocol implementation</title><content type='html'>MiniG is doing fine, so I am working on something else : an ActiveSync protocol implementation to replace OBM PDAs synchronisation layer.&lt;br /&gt;&lt;br /&gt;The O-Push project is hosted on google code : &lt;a href="http://code.google.com/p/o-push/"&gt;http://code.google.com/p/o-push/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Some things allready works : read-only calendar sync from OBM to the iPhone. O-Push can also send mail folder and test emails to the mobile device.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-7466857629007846827?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/7466857629007846827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=7466857629007846827' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/7466857629007846827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/7466857629007846827'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/03/o-push-activesync-protocol.html' title='O-Push, ActiveSync protocol implementation'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-4033518339421751169</id><published>2009-01-21T11:54:00.002+01:00</published><updated>2009-01-21T11:54:59.602+01:00</updated><title type='text'>All your calendar are belong to us</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_FrEZyE0A1YA/SXb-_h3WInI/AAAAAAAACMM/i4YEwxOQqDU/s1600-h/Screenshot-MiniG+Webmail+-1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 278px;" src="http://1.bp.blogspot.com/_FrEZyE0A1YA/SXb-_h3WInI/AAAAAAAACMM/i4YEwxOQqDU/s320/Screenshot-MiniG+Webmail+-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5293698779396317810" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-4033518339421751169?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/4033518339421751169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=4033518339421751169' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/4033518339421751169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/4033518339421751169'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/01/all-your-calendar-are-belong-to-us.html' title='All your calendar are belong to us'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_FrEZyE0A1YA/SXb-_h3WInI/AAAAAAAACMM/i4YEwxOQqDU/s72-c/Screenshot-MiniG+Webmail+-1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-1169874329448031914</id><published>2009-01-20T21:57:00.004+01:00</published><updated>2009-01-20T21:59:16.037+01:00</updated><title type='text'>Screenshot day</title><content type='html'>This time with the separate grid, always correctly sized, for dates labels &amp; all day events ;-)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FrEZyE0A1YA/SXY680rUpyI/AAAAAAAACMA/0Gqp_W1NeUA/s1600-h/Screenshot-MiniG+Webmail+-+Iceweasel.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 231px;" src="http://4.bp.blogspot.com/_FrEZyE0A1YA/SXY680rUpyI/AAAAAAAACMA/0Gqp_W1NeUA/s320/Screenshot-MiniG+Webmail+-+Iceweasel.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5293483228627511074" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-1169874329448031914?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/1169874329448031914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=1169874329448031914' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/1169874329448031914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/1169874329448031914'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/01/screenshot-day.html' title='Screenshot day'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_FrEZyE0A1YA/SXY680rUpyI/AAAAAAAACMA/0Gqp_W1NeUA/s72-c/Screenshot-MiniG+Webmail+-+Iceweasel.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-829148327714286761</id><published>2009-01-20T18:23:00.002+01:00</published><updated>2009-01-20T18:31:23.891+01:00</updated><title type='text'>Better mockup with calendar view</title><content type='html'>It is not visible on the screenshot, but everything resizes correctly : not outer scrollbar, vertical space is occupied, the columns scale correctly.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FrEZyE0A1YA/SXYKWpHF8II/AAAAAAAACL4/J2E96t2fPoY/s1600-h/Screenshot-MiniG+-+Contacts+.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 242px;" src="http://4.bp.blogspot.com/_FrEZyE0A1YA/SXYKWpHF8II/AAAAAAAACL4/J2E96t2fPoY/s320/Screenshot-MiniG+-+Contacts+.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5293429796129599618" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-829148327714286761?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/829148327714286761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=829148327714286761' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/829148327714286761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/829148327714286761'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/01/better-mockup-with-calendar-view.html' title='Better mockup with calendar view'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_FrEZyE0A1YA/SXYKWpHF8II/AAAAAAAACL4/J2E96t2fPoY/s72-c/Screenshot-MiniG+-+Contacts+.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-1534695751438436300</id><published>2009-01-19T22:18:00.006+01:00</published><updated>2009-01-19T22:24:09.986+01:00</updated><title type='text'>Calendar mockup</title><content type='html'>As I'll probably never be OK with MiniG interface fitted into OBM, I'm experimenting on calendar integration into MiniG.&lt;br /&gt;&lt;br /&gt;I'm just gathering infos for now, taking screenshots of Google Calendar, OSX iCal and Outlook Web Access. But as you can see on the following screenshot, MiniG looks nice with its iCal like portlet :D&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FrEZyE0A1YA/SXTu-Y4w1ZI/AAAAAAAACDQ/5uvLP1YKBtI/s1600-h/Screenshot-MiniG+Webmail+.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 268px;" src="http://4.bp.blogspot.com/_FrEZyE0A1YA/SXTu-Y4w1ZI/AAAAAAAACDQ/5uvLP1YKBtI/s320/Screenshot-MiniG+Webmail+.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5293118217667007890" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can also see on the screenshot that french i18n is available in current svn ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-1534695751438436300?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/1534695751438436300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=1534695751438436300' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/1534695751438436300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/1534695751438436300'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2009/01/calendar-mockup.html' title='Calendar mockup'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_FrEZyE0A1YA/SXTu-Y4w1ZI/AAAAAAAACDQ/5uvLP1YKBtI/s72-c/Screenshot-MiniG+Webmail+.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-970507710390734233</id><published>2008-12-04T22:44:00.002+01:00</published><updated>2008-12-04T23:09:49.914+01:00</updated><title type='text'>MiniG slow down; OBM 2.2 deadline coming soon</title><content type='html'>As you may have noticed, MiniG development is stalling. Last commits were a major feature : reading emails forwarded as attachments.&lt;br /&gt;&lt;br /&gt;OBM 2.2 database model will be frozen on monday, we are working pretty hard on fixing most schema glitches.&lt;br /&gt;&lt;br /&gt;Lots of things are coming in OBM in 2.2 :&lt;br /&gt;&lt;br /&gt; - MySQL won't be the default database, PostgreSQL 8.3+ will be (if you wonder why, give us 64bit timestamps, jdbc compliant driver _by default_, predictable optimizer choices and we will reconsider. A fix for yesterday's mysql busy lockup on a simple query at one of our biggest production site would be a plus).&lt;br /&gt;&lt;br /&gt; - Unicode support (ok, as I'm working on the java parts of the solution, this one makes me laugh)&lt;br /&gt;&lt;br /&gt; - Improved contact model &amp; revamped sync servers to provide a "smartphones compliant" model&lt;br /&gt;&lt;br /&gt; - Usable mozilla lightning support, with asynchronous synchronisation and greatly improved response times !&lt;br /&gt;&lt;br /&gt;In my next post, I'll probably give information on how our sync servers went from 5/sync per sec (single threaded benchmark, mysql) on empty database to something like 30sync/sec (postgresql, single thread, no optimisation (full logs &amp; timing on pg)).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-970507710390734233?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/970507710390734233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=970507710390734233' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/970507710390734233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/970507710390734233'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/12/minig-slow-down-obm-22-deadline-coming.html' title='MiniG slow down; OBM 2.2 deadline coming soon'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-2472258046952996135</id><published>2008-11-19T00:11:00.004+01:00</published><updated>2008-11-19T00:24:17.586+01:00</updated><title type='text'>Chat in MiniG, Jabber in OBM</title><content type='html'>As jabber integration is important (think lotus sametime, online meetings, etc), I did some prototyping on jabber support in MiniG ala GTalk.&lt;br /&gt;&lt;br /&gt;I did a little &lt;a href="http://minig.googlecode.com/files/minig-xmpp.avi"&gt;screencast of what OBM+MiniG can do with an Openfire jabber server&lt;/a&gt; tonight. &lt;br /&gt;&lt;br /&gt;Of course jabber integration is OBM 2.3 stuff, I'm just investigating what would be possible.&lt;br /&gt;&lt;br /&gt;The MiniG / Jabber video is also available in poor quality on youtube: &lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt; &lt;param name="movie" value="http://www.youtube.com/v/7ATw9N0klP4"&gt; &lt;/param&gt; &lt;embed src="http://www.youtube.com/v/7ATw9N0klP4" type="application/x-shockwave-flash" width="425" height="350"&gt; &lt;/embed&gt; &lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-2472258046952996135?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/2472258046952996135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=2472258046952996135' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2472258046952996135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2472258046952996135'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/11/chat-in-minig-jabber-in-obm.html' title='Chat in MiniG, Jabber in OBM'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-5755766872407756163</id><published>2008-11-11T15:45:00.002+01:00</published><updated>2008-11-11T15:51:11.297+01:00</updated><title type='text'>Drag'n'drop support in MiniG</title><content type='html'>Well title says it all : you can move you conversations by drag'n'dropping them from the list to the folder tree. &lt;br /&gt;&lt;br /&gt;It works for one or multiple conversations. My preferred way to move conversations is still with the actions combo-box, as I find it less error-prone.&lt;br /&gt;&lt;br /&gt;As a screenshot does not really work for this kind of features, you can download an &lt;a href="http://minig.googlecode.com/files/minig-dnd-xvid.avi"&gt;xvid screencast&lt;/a&gt; or watch the youtube version :&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt; &lt;param name="movie" value="http://www.youtube.com/v/ql02JrgfVmg"&gt; &lt;/param&gt; &lt;embed src="http://www.youtube.com/v/ql02JrgfVmg" type="application/x-shockwave-flash" width="425" height="350"&gt; &lt;/embed&gt; &lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-5755766872407756163?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/5755766872407756163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=5755766872407756163' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/5755766872407756163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/5755766872407756163'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/11/dragndrop-support-in-minig.html' title='Drag&apos;n&apos;drop support in MiniG'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-4169284239844056200</id><published>2008-11-06T00:09:00.001+01:00</published><updated>2008-11-06T00:10:59.188+01:00</updated><title type='text'>Turned 11</title><content type='html'>Now linagora GSO, previously Aliasource and Aliacom, the company I worked with for 7 years turned 11, cheers !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-4169284239844056200?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/4169284239844056200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=4169284239844056200' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/4169284239844056200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/4169284239844056200'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/11/turned-11.html' title='Turned 11'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-5678906784632865148</id><published>2008-11-05T23:43:00.003+01:00</published><updated>2008-11-06T00:06:06.959+01:00</updated><title type='text'>planet.obm.org</title><content type='html'>Thanks to Sylvain, my blog is now federated on planet.obm.org. It's quite cool to have a central place to report OBM and MiniG progress.&lt;br /&gt;&lt;br /&gt;As I am working on MiniG (and bdf12) most of my time, let's report what happened in the last days :&lt;br /&gt; - we switched to gmail sorting of conversations&lt;br /&gt; - David fixed lots of ui bugs&lt;br /&gt; - search results are now ordered by date desc (David too)&lt;br /&gt; - email (un)starring is coming soon (the \Flagged imap tag)&lt;br /&gt;&lt;br /&gt;Another good news : debian packages of obm &amp; minig will be available soon. Installation nightmare is over. By the way, Obama got elected.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-5678906784632865148?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/5678906784632865148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=5678906784632865148' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/5678906784632865148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/5678906784632865148'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/11/planetobmorg.html' title='planet.obm.org'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-6956815386175005601</id><published>2008-11-04T11:07:00.003+01:00</published><updated>2008-11-04T11:12:21.735+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='obm'/><category scheme='http://www.blogger.com/atom/ns#' term='minig'/><title type='text'>OBM technical integration</title><content type='html'>While in Agde, at OBM developpers summit, I did the first steps of technical integration of MiniG with OBM :&lt;br /&gt;&lt;br /&gt;  * Private &amp; public contacts from OBM are visible as contact groups, used for email address autocompletion&lt;br /&gt;  * Email address gathering : recipients of emails sent through MiniG are automatically added as private contacts in OBM. They will be available for autocompletion next time the MiniG composer is used.&lt;br /&gt;  * OBM user settings are pushed to the MiniG ui, to avoid redundent preferences (language, timezone, etc)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-6956815386175005601?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/6956815386175005601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=6956815386175005601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/6956815386175005601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/6956815386175005601'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/11/obm-technical-integration.html' title='OBM technical integration'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-4765706976365735840</id><published>2008-10-31T19:45:00.003+01:00</published><updated>2008-10-31T19:52:34.157+01:00</updated><title type='text'>The game is over</title><content type='html'>OBM developper summit is now over. Week summary :&lt;br /&gt; - lots of commits&lt;br /&gt; - a lot of fun&lt;br /&gt; - some wine, some beers&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-4765706976365735840?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/4765706976365735840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=4765706976365735840' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/4765706976365735840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/4765706976365735840'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/10/game-is-over.html' title='The game is over'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-620572564642017412</id><published>2008-10-31T14:17:00.002+01:00</published><updated>2008-10-31T14:21:14.053+01:00</updated><title type='text'>Late night coding</title><content type='html'>6 laptops, some wine, 1 o'clock... and el paquito !&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/lxjjmoNgIMk&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/lxjjmoNgIMk&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-620572564642017412?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/620572564642017412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=620572564642017412' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/620572564642017412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/620572564642017412'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/10/late-night-coding.html' title='Late night coding'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-9213379772562933844</id><published>2008-10-28T22:54:00.003+01:00</published><updated>2008-10-28T23:00:07.845+01:00</updated><title type='text'>The double while pattern (episode two)</title><content type='html'>Well, I could write about the second loop around the first while pattern, used to compute statistics about how buggy "buggyProgram()" is, but... pictures are worth thousand words !&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_FrEZyE0A1YA/SQeLJTx9wbI/AAAAAAAAAYw/6dbKhdQ7BA4/s1600-h/dsc00972.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_FrEZyE0A1YA/SQeLJTx9wbI/AAAAAAAAAYw/6dbKhdQ7BA4/s320/dsc00972.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5262327681650639282" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-9213379772562933844?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/9213379772562933844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=9213379772562933844' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/9213379772562933844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/9213379772562933844'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/10/double-while-pattern-episode-two.html' title='The double while pattern (episode two)'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_FrEZyE0A1YA/SQeLJTx9wbI/AAAAAAAAAYw/6dbKhdQ7BA4/s72-c/dsc00972.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-3447454401126840596</id><published>2008-10-28T22:43:00.003+01:00</published><updated>2008-10-28T22:49:01.657+01:00</updated><title type='text'>The double-while pattern</title><content type='html'>Ok, this started with a mysql bug with foreign keys : the schema just crashes randomly with syntax errors, but "sometime" succeeds.&lt;br /&gt;&lt;br /&gt;No problem, here comes the "While Pattern". &lt;br /&gt;&lt;br /&gt;Problem to solve :&lt;br /&gt;A program crashes randomly but sometimes work&lt;br /&gt;&lt;br /&gt;Solution :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;boolean success;&lt;br /&gt;do {&lt;br /&gt;  try {&lt;br /&gt;    buggyProgram();&lt;br /&gt;    success = true;&lt;br /&gt;  } catch (... well anything) {&lt;br /&gt;  }&lt;br /&gt;} while (!success);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Bonus point : the low voltage version with a 1sec sleep after the buggy program call.&lt;br /&gt;&lt;br /&gt;Stay tuned for the double while pattern ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-3447454401126840596?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/3447454401126840596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=3447454401126840596' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3447454401126840596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3447454401126840596'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/10/double-while-pattern.html' title='The double-while pattern'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-2087265094522354563</id><published>2008-10-27T23:40:00.002+01:00</published><updated>2008-10-27T23:46:36.537+01:00</updated><title type='text'>OBM developper summit in Agde</title><content type='html'>The whole OBM team is spending one week in Agde to work on the major features of our 2.2 version, coming at the end of the year (hope so).&lt;br /&gt;&lt;br /&gt;The first two days were pretty productive, with time zone support nearly done, conversation previews in MiniG. Debian packaging of alpha version is in good shape now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-2087265094522354563?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/2087265094522354563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=2087265094522354563' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2087265094522354563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2087265094522354563'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/10/obm-developper-summit-in-agde.html' title='OBM developper summit in Agde'/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-2785476459219819336</id><published>2008-10-11T02:00:00.002+02:00</published><updated>2008-10-11T02:06:18.885+02:00</updated><title type='text'></title><content type='html'>Good coding week for MiniG. "from:tom filename:pdf" just works (all your mails from tom with a pdf attachment). All Gmail advanced search features are implemented and working :D&lt;br /&gt;&lt;br /&gt;Next week I'll be giving a Tomcat training, but the minig team will be focused on email forwarding, templates implementation and UI polishing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-2785476459219819336?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/2785476459219819336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=2785476459219819336' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2785476459219819336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2785476459219819336'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/10/good-coding-week-for-minig.html' title=''/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-126307712933268925</id><published>2008-09-28T15:26:00.002+02:00</published><updated>2008-09-28T15:31:00.454+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='minig'/><title type='text'></title><content type='html'>New minig release&lt;br /&gt;&lt;br /&gt;Just released new MiniG backend &amp; frontend binaries on &lt;a href="http://minig.org/"&gt;minig.org&lt;/a&gt;. Also made an announcement on freshmeat to grab new users/testers. &lt;br /&gt;&lt;br /&gt;This new release features folder tree, instant unread count updates, html email cleanups to strip images &amp; javascript and my new imap4r1 library.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-126307712933268925?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/126307712933268925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=126307712933268925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/126307712933268925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/126307712933268925'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/09/new-minig-release-just-released-new.html' title=''/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-2873230257279735726</id><published>2008-09-19T00:16:00.002+02:00</published><updated>2008-09-19T00:20:03.536+02:00</updated><title type='text'></title><content type='html'>Just commited my new Java IMAP client library to MiniG svn. My lib is based on apache mina and looks like ristrerro imap api, with speed added. Pretty happy with the results.&lt;br /&gt;&lt;br /&gt;Ristretto was fine, but switching to a mina based implementation cut the time for fetching an email from 170ms to 8ms :-) My new API still use a lot of Ristretto for header decoding &amp; mime parsing, they did a great job.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-2873230257279735726?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/2873230257279735726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=2873230257279735726' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2873230257279735726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2873230257279735726'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/09/just-commited-my-new-java-imap-client.html' title=''/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-2386268765939214154</id><published>2008-05-04T16:06:00.000+02:00</published><updated>2008-05-04T16:07:12.707+02:00</updated><title type='text'></title><content type='html'>MiniG can now send emails with attachments. Next step is attachments downloading.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-2386268765939214154?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/2386268765939214154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=2386268765939214154' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2386268765939214154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2386268765939214154'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/05/minig-can-now-send-emails-with.html' title=''/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-7851514660344583133</id><published>2008-04-27T20:17:00.001+02:00</published><updated>2008-04-27T20:17:42.751+02:00</updated><title type='text'></title><content type='html'>One day, one history, today it is :&lt;br /&gt;&lt;br /&gt;117 cd&lt;br /&gt;107 ls&lt;br /&gt;51 svn&lt;br /&gt;27 emacs&lt;br /&gt;18 cat&lt;br /&gt;12 rm&lt;br /&gt;11 scp&lt;br /&gt;10 ll&lt;br /&gt;9 zless&lt;br /&gt;8 start_vm.sh&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-7851514660344583133?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/7851514660344583133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=7851514660344583133' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/7851514660344583133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/7851514660344583133'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/04/one-day-one-history-today-it-is-117-cd.html' title=''/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-8426843947525302913</id><published>2008-04-27T20:13:00.000+02:00</published><updated>2008-04-27T20:14:22.117+02:00</updated><title type='text'></title><content type='html'>MiniG is getting attachments support. Pretty hard task, but somewhat fun.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-8426843947525302913?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/8426843947525302913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=8426843947525302913' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/8426843947525302913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/8426843947525302913'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/04/minig-is-getting-attachments-support.html' title=''/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-3648643303480213029</id><published>2008-04-18T01:19:00.004+02:00</published><updated>2008-04-18T01:28:12.651+02:00</updated><title type='text'></title><content type='html'>Olivier made my day&lt;br /&gt;&lt;br /&gt;Just got new &lt;a href="http://minig.org/"&gt;minig&lt;/a&gt; logo. From MiniGmail to MiniGoat :p&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_FrEZyE0A1YA/SAfbcuPOM1I/AAAAAAAAAJQ/ovYjH77-kTI/s1600-h/minig_logo.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_FrEZyE0A1YA/SAfbcuPOM1I/AAAAAAAAAJQ/ovYjH77-kTI/s320/minig_logo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5190358382062482258" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-3648643303480213029?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/3648643303480213029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=3648643303480213029' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3648643303480213029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3648643303480213029'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/04/olivier-made-my-day-just-got-new-minig.html' title=''/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_FrEZyE0A1YA/SAfbcuPOM1I/AAAAAAAAAJQ/ovYjH77-kTI/s72-c/minig_logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-3178302800097942398</id><published>2008-04-16T01:37:00.001+02:00</published><updated>2008-04-16T01:38:48.145+02:00</updated><title type='text'></title><content type='html'>History meme&lt;br /&gt;&lt;br /&gt;history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head&lt;br /&gt;&lt;br /&gt;124 cd&lt;br /&gt;94 ls&lt;br /&gt;59 svn&lt;br /&gt;15 ll&lt;br /&gt;15 emacs&lt;br /&gt;13 rm&lt;br /&gt;10 dpkg&lt;br /&gt;9 start_vm.sh&lt;br /&gt;9 cat&lt;br /&gt;8 sudo&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-3178302800097942398?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/3178302800097942398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=3178302800097942398' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3178302800097942398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3178302800097942398'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/04/history-meme-history-awk-a2endfori-in.html' title=''/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-2183098254600671636</id><published>2008-03-21T01:29:00.004+01:00</published><updated>2008-03-21T01:41:40.055+01:00</updated><title type='text'></title><content type='html'>Just came back from a training about enterprisedb, a flavour of PostgreSQL with complete Oracle compatibility. Never heard of them before, and had a good surprise : 3 of the 7 pgsql core team members are working for them. They are the guys that designed the WAL system which finally made PostgreSQL an enterprise class database (at least for me). Their implementation uses a pretty cool dynamic tuning system to get a correct PostgreSQL setup for your server with only one setting.&lt;br /&gt;&lt;br /&gt;Side note : London is a very expensive city, 63 pounds to go from heathrow to town center by cab, 4 pounds for an underground ticket :/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-2183098254600671636?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.enterprisedb.com/' title=''/><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/2183098254600671636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=2183098254600671636' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2183098254600671636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/2183098254600671636'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/03/just-came-back-from-training-about.html' title=''/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-1016647293521068636</id><published>2008-03-10T10:24:00.003+01:00</published><updated>2008-03-10T10:26:58.673+01:00</updated><title type='text'></title><content type='html'>Moved my webmail code from our internal svn to &lt;a href="http://code.google.com/p/minig"&gt;http://code.google.com/p/minig&lt;/a&gt; and registered &lt;a href="http://minig.org/"&gt;http://minig.org/&lt;/a&gt; as the domain was available. Registered MiniG on ohloh.net and freshmeat.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-1016647293521068636?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/1016647293521068636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=1016647293521068636' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/1016647293521068636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/1016647293521068636'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/03/moved-my-webmail-code-from-our-internal.html' title=''/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-3547530878042438325</id><published>2008-03-08T12:47:00.003+01:00</published><updated>2008-03-08T13:01:39.997+01:00</updated><title type='text'></title><content type='html'>Kubuntu saved my life. I was playing with the partitions on my laptop hd. I first used gparted, but as it didn't want to move to start of an extended partition to the right, I rebooted on a partition magic 8 cd. It asked me to convert the partition to extendedX, and I said no, as I didn't know what an extendedX partition was. &lt;br /&gt;&lt;br /&gt;It proposed me to convert my /dev/sda5 to a primary partition, so I did it... reboot... and BANG, grub error 17. Reminded me of lilo old times when you forgot to run lilo after compiling your fresh new kernel. My "/boot/grub" was on /dev/sda5 at this time, and I forgot about it. Starting to panic, I don't have any rescue cd around. Grabbed my keys, 10min car drive &amp; I had a kubuntu 7.10 cd rom, as one was available with "planete linux". &lt;br /&gt;&lt;br /&gt;Boot kubuntu, sudo -s, mkdir sda3, mount /dev/sda3 sda3, chroot sda3, cd /boot/grub, grub --device-map=device.map, root (hd0,2), setup (hd0). My system is now up &amp; running again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-3547530878042438325?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/3547530878042438325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=3547530878042438325' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3547530878042438325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3547530878042438325'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/03/kubuntu-saved-my-life.html' title=''/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-3124707813978751954</id><published>2008-01-13T17:08:00.000+01:00</published><updated>2008-01-13T17:12:04.863+01:00</updated><title type='text'></title><content type='html'>&lt;a href="http://googlewebtoolkit.blogspot.com/2008/01/google-web-toolkit-meetup-on-january.html"&gt;GWT meeting&lt;/a&gt; took place in atlanta last week. I'm eagerly waiting GWT 1.5 release with generics support.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-3124707813978751954?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/3124707813978751954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=3124707813978751954' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3124707813978751954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/3124707813978751954'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/01/gwt-meeting-took-place-in-atlanta-last.html' title=''/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-7620523454808243953</id><published>2008-01-03T23:59:00.000+01:00</published><updated>2008-01-04T00:07:30.793+01:00</updated><title type='text'></title><content type='html'>Tonight I spent 2 hours reading &amp;amp; commenting &lt;a href="http://steve-yegge.blogspot.com/2007/12/codes-worst-enemy.html"&gt;stevey's blog&lt;/a&gt; about code size. Here is my comment to his article :&lt;br /&gt;&lt;br /&gt;I Think you should try the "play" programming language. Its semantic is quite rich : the program "Play;" will run a game with all the features of your 500k game.&lt;br /&gt;&lt;br /&gt;Ok, I'm just kidding but you have some very valid points : trying to factor (I'm not saying refactor) your code, and reusing instead of duplicating is a mandatory thing.&lt;br /&gt;&lt;br /&gt;What I'm not buying is your focus on the "LoC" metric. &lt;span style="font-weight: bold;"&gt;Your 500k lines of code break eclipse, and this is good thing&lt;/span&gt;. For me it means that the way the code is architected, eclipse &lt;span style="font-weight: bold;"&gt;must&lt;/span&gt; load all the code to figure it out (I mean compile / index it) : exactly like if the code was a single 500k line script, where line 500.000 depends on line 1.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Divide to win&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Let's think about it for a few seconds, what do you have in a game : the AI, the graphics engine, the physics engine, the audio engine, lots of data file and a "scripting engine" to glue everything together.  It is pretty clear that your AI does not care about the colors of the textures on your polygons.&lt;br /&gt;&lt;br /&gt;Now, would you consider a technology like OSGi / Eclipse plugins ? You focus on writing the smallest possible piece of code. Everytime you're willing to add a new feature, you ask yourself : "Can I add an extension point here and program my new feature as an external plugin ?".&lt;br /&gt;&lt;br /&gt;Now my feature is a separate project Y in my IDE. I create a new project Ytests, that depends on Y, and unit test the code in Y. When Y performs correctly, I package it (right click / export / export as deployable plugin &amp;amp; fragment), push the code to git/svn/you name it, and close the project Y in eclipse.&lt;br /&gt;&lt;br /&gt;Another point is, when I start writing a program, do I use plugin / modular technologies from the start ? Can I know in advance that my little project will be successful, and will grow to X lines of codes ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-7620523454808243953?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://steve-yegge.blogspot.com/2007/12/codes-worst-enemy.html' title=''/><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/7620523454808243953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=7620523454808243953' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/7620523454808243953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/7620523454808243953'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/01/tonight-i-spent-2-hours-reading.html' title=''/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5811557.post-4097642535737623657</id><published>2008-01-03T21:17:00.001+01:00</published><updated>2008-01-03T21:23:37.961+01:00</updated><title type='text'></title><content type='html'>Finally reattached my blog to my google account. Will stop wondering what login / password I might have used while filling the registration form.&lt;br /&gt;&lt;br /&gt;New year promise : I will never ever do a birthday party because my last blog entry turned 2.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5811557-4097642535737623657?l=tcataldo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcataldo.blogspot.com/feeds/4097642535737623657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5811557&amp;postID=4097642535737623657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/4097642535737623657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5811557/posts/default/4097642535737623657'/><link rel='alternate' type='text/html' href='http://tcataldo.blogspot.com/2008/01/finally-reattached-my-blog-to-my-google.html' title=''/><author><name>Thomas Cataldo</name><uri>http://www.blogger.com/profile/12716859649874451007</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_FrEZyE0A1YA/R31JOuxJ2NI/AAAAAAAAAH4/Gsg10WagpPg/S220/tcataldo.jpeg'/></author><thr:total>0</thr:total></entry></feed>
