<?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-408361410820097976</id><updated>2012-02-02T18:47:30.116+08:00</updated><category term='graphic'/><category term='flash'/><category term='cs4u'/><category term='vacances'/><category term='HK'/><category term='mysql'/><category term='php'/><category term='Macau'/><category term='apple'/><category term='tutorial'/><category term='im'/><category term='piracy'/><category term='doctrine'/><category term='open source'/><category term='game'/><category term='censorship'/><category term='pdf'/><category term='Timor'/><category term='firefox'/><category term='billing'/><category term='geospatial'/><category term='photo'/><category term='iPhone'/><category term='cms'/><category term='plugin'/><category term='software'/><category term='study'/><category term='web dev'/><category term='orm'/><category term='innovation'/><category term='invoicr'/><category term='voice'/><category term='video'/><category term='fun'/><category term='symfony'/><category term='china'/><category term='lab'/><category term='zend'/><category term='usability'/><category term='gmail'/><category term='barcode'/><category term='google'/><title type='text'>A little something</title><subtitle type='html'>My 2 cents about technology, open source and web development.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>41</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-8819454756241733694</id><published>2010-06-18T09:44:00.001+08:00</published><updated>2010-06-18T10:33:41.453+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='web dev'/><category scheme='http://www.blogger.com/atom/ns#' term='lab'/><title type='text'>Symfony Form widgets for many-to-many relationship: a new widget implementation - part II</title><content type='html'>&lt;p&gt;Following &lt;a href="http://gestadieu.blogspot.com/2010/03/symfony-form-widget-for-many-to-many.html"&gt;part I&lt;/a&gt;, here is the final step to code a new symfony form widget in order to improve a many-to-many relationship. After discussing the best UI possible for a many-to-many relationship, we are now going to look how to code it as a symfony widget. I would not pretend it is the best solution, but I believe it is clean enough to be used and it definitively works!&lt;/p&gt;&lt;p&gt;One of the comment point me to the following approach: &lt;a href="http://www.ryancramer.com/journal/entries/select_multiple/"&gt;http://www.ryancramer.com/journal/entries/select_multiple/&lt;/a&gt;. It is also an elegant way to do it, unfortunately it does not work for me since my list of available object is extremely long, therefore a select is again not a good approach. Don't get me wrong, my approach is not necessarily the best but it fits a specific user case.&lt;/p&gt;&lt;p&gt;Before starting you can have a look at a demo of what we will get at the end. Here is a video to show the different interactions.&lt;/p&gt;&lt;p&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/1iCr6t04-bk&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed type="application/x-shockwave-flash" width="640" height="385" src="http://www.youtube.com/v/1iCr6t04-bk&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;&lt;p&gt;Pre-requisite:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;symfony 1.3/1.4&lt;/li&gt;&lt;li&gt;jQuery 1.4+ and jQuery UI 1.8+. This might seems overkilling for a simple widget but most of the time you are using these 2 libraries in your project already. In jQuery UI you specifically need for this widget the new autocomplete widget.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ok, no more talk, let's go to the code! You can find it as a gist at &lt;a href="http://gist.github.com/443124"&gt;http://gist.github.com/443124﻿&lt;/a&gt;. Feel free to clone, improve and share! This code need some refactoring for sure but I did not have time yet and many people where asking for it. Feel free to improve it and share it ;-)&lt;/p&gt;&lt;p&gt;Stay tuned, we will publish some new widgets in the coming months...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-8819454756241733694?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/8819454756241733694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2010/06/symfony-form-widgets-for-many-to-many.html#comment-form' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/8819454756241733694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/8819454756241733694'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2010/06/symfony-form-widgets-for-many-to-many.html' title='Symfony Form widgets for many-to-many relationship: a new widget implementation - part II'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-6124910051901339051</id><published>2010-03-18T11:07:00.001+08:00</published><updated>2010-03-18T21:11:03.132+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='lab'/><title type='text'>Symfony Form widget for many-to-many relationship: UI considerations - part I</title><content type='html'>&lt;p&gt;This 2 parts tutorial will show you how we came up with a new symfony sfForm widget to handle many-to-many relationships. In our specific case, existing widgets for such relationships were found extremely unuser-friendly to say the least, we had to think about a new widget to help our users in their daily operation.&lt;br/&gt;We do not pretend that our solution is the best in all user-cases but it is definitively a better approach when you have a lot of potential items to associate with your current object and a short list of associated items; the relationship between a classroom and students for example: you have a class of students (the class is less than 40 students usually) within a University of thousands of students. &lt;/p&gt;&lt;h2&gt;The default widget&lt;/h2&gt;I have always been very skeptical with the default widget in symfony form framework for many-to-many relationship. In a UI perspective it was really bad: &lt;ul&gt;&lt;li&gt;You have to "shift-click" in a multiple select box the item you want to add to your relation,&lt;/li&gt;&lt;li&gt;if you have a long list, it is very inconvenient to find the one you want,&lt;/li&gt;&lt;li&gt;if by mistake you click without the shift button pressed, you are good to start over your multiple selection&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I guess you can see the picture ;-) Talking about the picture, here is one to show you what I am talking about.&lt;/p&gt; &lt;p style="align:center"&gt;&lt;img src="http://lh3.ggpht.com/_HlYBk55Czxc/S6B4uKKKBlI/AAAAAAAAA7s/nx6mWhfkvII/Screen%20shot%202010-03-17%20at%202.28.27%20PM.png?imgmax=800" alt="Screen shot 2010-03-17 at 2.28.27 PM.png" border="0" width="297" height="332" /&gt;&lt;/p&gt;&lt;h2&gt;The double list widget&lt;/h2&gt;&lt;p&gt;When you start to look around for a better replacement, you obviously find the plugin sfFormExtraPlugin which includes the widget called sfWidgetFormSelectDoubleList and you get something like this:&lt;/p&gt;&lt;p&gt;&lt;img src="http://lh5.ggpht.com/_HlYBk55Czxc/S6B42d9vNiI/AAAAAAAAA7w/Sqwbq9CVyjA/Screen%20shot%202010-03-17%20at%202.23.40%20PM.png?imgmax=800" alt="Screen shot 2010-03-17 at 2.23.40 PM.png" border="0" width="415" height="201" /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;This is already a big improvement but still has some huge limitation when you are dealing with big lists (I am thinking here stuff like list of students in a University). You do not want to have a select box with thousands of options: 1) it is going to slow down your page and 2) it is not easy to search inside.&lt;/p&gt;&lt;h2&gt;A double list enhancement&lt;/h2&gt;&lt;p&gt;The first "natural" step could be to improve an existing widget. In our case, the best is so far the double list widget mentioned earlier. An easy way to improve it could be to add a search box on top of the unassociated select in order to easily narrow down the list and find what we are looking for. We could even imagine a similar search box on top of the associated list to add a little bit more flexibility too. Anyway, here is a mockup that explains all this: &lt;/p&gt;&lt;img src="http://lh6.ggpht.com/_HlYBk55Czxc/S6GPlgBS3uI/AAAAAAAAA8I/sy6FA_myO7E/Screen%20shot%202010-03-18%20at%2010.26.47%20AM.png?imgmax=800" alt="Screen shot 2010-03-18 at 10.26.47 AM.png" border="0" width="690" height="252" /&gt;&lt;p&gt;This could be already a huge improvement, although I can see still some limitations, namely: 1) you still load a huge list of unassociated items, 2) when you start filtering with your search, you need to select the desired item and then click on the left arrow, this is a bit too much interaction.&lt;/p&gt;&lt;p&gt;Anyway such a widget would be a huge improvement already and could be used in many cases, but let's not stop here...&lt;/p&gt;&lt;h2&gt;Thinking forward&lt;/h2&gt;&lt;p&gt;We came up with a mockup that suits our needs. I acknowledge that it cannot fit all needs, it is good to list a short list of relations -usually list of student in a class is under 40 and add new students among a huge list.&lt;/p&gt;&lt;p&gt;&lt;img src="http://lh3.ggpht.com/_HlYBk55Czxc/S6GXM1zqPCI/AAAAAAAAA8Q/ZCizM6ABql0/Screen%20shot%202010-03-18%20at%2010.58.23%20AM.png?imgmax=800" alt="many to many relationship widget on steroid" border="0" width="529" height="359" /&gt;&lt;/p&gt;&lt;p&gt;You basically search in an autocomplete box (ajaxified) to find the item you want to add, click the right one in the list and it is added to your checked list below. The all list is saved once you save the current form object. If you uncheck one item it will be removed from the list (with some delay to allow you to change your mind in case of a mistake). Finally we could add a local undo/redo function in case of mistake.&lt;/p&gt;&lt;p&gt;In terms of interaction, you type in your searched word, select from the list (click or enter) and you are ready to add another. I believe it can help a lot end users.&lt;br/&gt;This symfony widget does not exist as far as I know therefore next part of this tutorial will focus on the code to make it a reality.&lt;/p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;The first thing I'd like to claim: "multiple select" is BAD! At least I could not find a user-case where it could be a good solution, therefore avoid it as much as you can.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-6124910051901339051?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/6124910051901339051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2010/03/symfony-form-widget-for-many-to-many.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/6124910051901339051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/6124910051901339051'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2010/03/symfony-form-widget-for-many-to-many.html' title='Symfony Form widget for many-to-many relationship: UI considerations - part I'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_HlYBk55Czxc/S6B4uKKKBlI/AAAAAAAAA7s/nx6mWhfkvII/s72-c/Screen%20shot%202010-03-17%20at%202.28.27%20PM.png?imgmax=800' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-5001054385177879677</id><published>2010-01-21T10:38:00.001+08:00</published><updated>2010-01-21T10:54:25.366+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='web dev'/><title type='text'>a new version for sfAdminThemejRollerPlugin 0.2</title><content type='html'>Finally! We finally managed to catch up and prepare a new version of our Symfony plugin to generate nice admin generator based on jQuery UI Themes.&lt;br /&gt;&lt;br /&gt;We tagged this version as 0.2.0 since we still consider this plugin as beta version (but usable on production) but the big news is the support of symfony 1.4! For this specific support I must thank you 2 people that submited 2 patches to make this compatibility possible. Thanks to (&lt;a href="http://trac.symfony-project.org/ticket/7936"&gt; jtexier &lt;/a&gt;, "merci Jerome ;-)") and &lt;a href="http://trac.symfony-project.org/ticket/7463"&gt;dalexandre&lt;/a&gt; and of course I must named &lt;a href="http://github.com/jeremyb/sfAdminThemejRollerPlugin"&gt;jeremyb&lt;/a&gt; for his dedication to the project, he did most of the latest development.&lt;br /&gt;&lt;br /&gt;I also setup a &lt;a href="http://symfony-planet/user"&gt;live demo&lt;/a&gt; to allow you to play a little bit with the plugin. It is currently basic but we will add more stuff step by step.&lt;br /&gt;&lt;br /&gt;What's new:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Theme switcher integrated&lt;/li&gt;&lt;li&gt;user interface fixes and enhancements&lt;/li&gt;&lt;li&gt;Symfony 1.4 compatibility&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;You can have some more details on my &lt;a href="http://gestadieu.blogspot.com/2009/11/what-up-on-sfadminthemejrollerplugin.html"&gt;previous post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The plugin is available as usual on &lt;a href="http://github.com/gestadieu/sfAdminThemejRollerPlugin"&gt;github&lt;/a&gt;, I published as well the &lt;a href="http://www.symfony-project.com/plugins/sfAdminThemejRollerPlugin"&gt;packaged plugin on symfony website&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://lh5.ggpht.com/_HlYBk55Czxc/S1chcjbDuyI/AAAAAAAAA5E/SKG07o2hG1s/jroller-v0.2-list.png?imgmax=800" alt="jroller-v0.2-list.png" border="0" width="640"  /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://lh4.ggpht.com/_HlYBk55Czxc/S1chUnKe6iI/AAAAAAAAA5A/GVyDhrrQSWM/jroller-v0.2-filter.png?imgmax=800" alt="jroller-v0.2-filter.png" border="0" width="640"  /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://lh3.ggpht.com/_HlYBk55Czxc/S1chgUaasnI/AAAAAAAAA5I/TMMoHTcgKKY/jroller-v0.2-listbottom.png?imgmax=800" alt="jroller-v0.2-listbottom.png" border="0" width="640"  /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://lh4.ggpht.com/_HlYBk55Czxc/S1fAwm06cMI/AAAAAAAAA5o/Z9EZWJnO17w/Screen%20shot%202010-01-21%20at%2010.48.44%20AM.png?imgmax=800" alt="Screen shot 2010-01-21 at 10.48.44 AM.png" border="0" width="640" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-5001054385177879677?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/5001054385177879677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2010/01/new-version-for-sfadminthemejrollerplug.html#comment-form' title='27 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/5001054385177879677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/5001054385177879677'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2010/01/new-version-for-sfadminthemejrollerplug.html' title='a new version for sfAdminThemejRollerPlugin 0.2'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_HlYBk55Czxc/S1chcjbDuyI/AAAAAAAAA5E/SKG07o2hG1s/s72-c/jroller-v0.2-list.png?imgmax=800' height='72' width='72'/><thr:total>27</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-6112344940703372471</id><published>2009-12-12T11:10:00.001+08:00</published><updated>2009-12-12T11:10:43.839+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Multitask in iPhone</title><content type='html'>Please Mr. Apple, stop looking at us like dummies. Why multi-tasking is allowed for Apple products but not for others? &lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://lh6.ggpht.com/_HlYBk55Czxc/Sx3M_NEYuVI/AAAAAAAAA1Y/gH0RUplyRJs/IMG_0560.PNG?imgmax=800" alt="IMG_0560.PNG" border="0" width="320" height="480" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-6112344940703372471?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/6112344940703372471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2009/12/multitask-in-iphone.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/6112344940703372471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/6112344940703372471'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2009/12/multitask-in-iphone.html' title='Multitask in iPhone'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_HlYBk55Czxc/Sx3M_NEYuVI/AAAAAAAAA1Y/gH0RUplyRJs/s72-c/IMG_0560.PNG?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-3530254954342307909</id><published>2009-12-08T11:52:00.001+08:00</published><updated>2009-12-08T11:53:51.699+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photo'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>Soccer training in Toilet?</title><content type='html'>What kind of training are we talking about here?&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://lh4.ggpht.com/_HlYBk55Czxc/Sx3NMyg3KQI/AAAAAAAAA1k/porSaUZT12Y/IMG_0556.jpg?imgmax=800" alt="IMG_0556.jpg" border="0"  /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-3530254954342307909?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/3530254954342307909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2009/12/soccer-training-in-toilet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/3530254954342307909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/3530254954342307909'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2009/12/soccer-training-in-toilet.html' title='Soccer training in Toilet?'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_HlYBk55Czxc/Sx3NMyg3KQI/AAAAAAAAA1k/porSaUZT12Y/s72-c/IMG_0556.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-7980312453695008992</id><published>2009-11-11T12:36:00.001+08:00</published><updated>2009-11-11T12:41:01.662+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='gmail'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='doctrine'/><category scheme='http://www.blogger.com/atom/ns#' term='lab'/><title type='text'>SfGuardUser sync with Google Apps</title><content type='html'>As I am working for a university, we have recently migrate all our staff to use Google Apps for Education and we plan to move all our students and alumni too later this year. Google Apps for Education is really a great tool (and free for us ;-), most of our users are really happy of the switch: it is reliable, fast and have so many collaborative features. Bye bye Outlook :-(, welcome to the Cloud :-)&lt;br /&gt;The Education package is the same as the Business package, including API and a lot of good stuff. The online Google Apps tools to manage users and groups is easy and simple but quickly become too simple to use when you are dealing with thousands of users, you then need to develop your own tool to maximize your daily operation. The "official" PHP5 Google Apps library is GData from the Zend Framework, which make it a breeze to integrate it with Symfony.&lt;br /&gt;&lt;br /&gt;a view of an admin generator with Google Apps account management (using &lt;a href="http://www.symfony-project.org/plugins/sfAdminThemejRollerPlugin"&gt;sfAdminThemejRollerPlugin&lt;/a&gt;):&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://lh6.ggpht.com/_HlYBk55Czxc/Svo-sfY66oI/AAAAAAAAA0M/hzFlFMLJ2Lw/googleapps-symfonyadmingen-integration.png?imgmax=800" alt="googleapps-symfonyadmingen-integration.png" border="0" width="585" height="144" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;We are currently redeveloping our University Management System based on Symfony 1.2 and we plan to integrate most of our applications with symfony too, including a research project on a new social learning platform. &lt;br /&gt;&lt;br /&gt;I developed a Symfony task (sf1.2+Doctrine) that take a csv file and create your local sfGuardUser as well as the corresponding Google apps accounts. The Google accounts creation is optional so the task can be used for a normal batch user creation with Symfony alone. A simple:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: bash;"&gt;./symfony guard:batch-create-user your.csv --googleapps=yourdomain.com&lt;/pre&gt;&lt;br /&gt;...will do the trick for you! I am not sure whether publishing the source code might be interesting for others (the Google API is only available for Premier and Education customers)...let me know. We will eventually publish our University management system as an open source project later for sure.&lt;br /&gt;&lt;br /&gt;Here is a list of issues and recommendations while dealing with Google Apps Provisioning API:&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Google Apps API error reporting&lt;/strong&gt;: when you have an error while dealing with Google Apps API, errors messages are useless, you always get a 'server errors' message without more details, it is then very difficult to debug your code to find the issue.&lt;/li&gt;&lt;li&gt;Don't forget some of the &lt;strong&gt;basic Google Apps rules&lt;/strong&gt; for account creation such as a password with minimum 6 characters otherwise you get back one of those unmeaning-full error message.&lt;/li&gt;&lt;li&gt;sfGuard is using sha1 as the default encryption method but it adds a grain of 'salt' on it therefore you cannot send to Google Apps the correct sha1 password. I had to overwrite the default setPassword() and checkPassword() to simply remove the use of the salt and make sure my password synchronization with Google Apps can work. I am not sure if it is a huge security concern though, any idea? Beside this you can also use md5 for your password but you will not be able to use another algorithm since Google Apps is only accepting sha1 and md5.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-7980312453695008992?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/7980312453695008992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2009/11/sfguarduser-sync-with-google-apps.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/7980312453695008992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/7980312453695008992'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2009/11/sfguarduser-sync-with-google-apps.html' title='SfGuardUser sync with Google Apps'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_HlYBk55Czxc/Svo-sfY66oI/AAAAAAAAA0M/hzFlFMLJ2Lw/s72-c/googleapps-symfonyadmingen-integration.png?imgmax=800' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-7412987230614698318</id><published>2009-11-09T23:04:00.001+08:00</published><updated>2009-11-11T12:47:45.973+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='web dev'/><title type='text'>what's up on sfAdminThemejRollerPlugin?</title><content type='html'>I finally found some time to add new stuff on the unpronounceable  plugin, and thanks to some new contributors more are to come (thanks JeremyB ;-). Here is the list of change:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;As I mentioned in my previous post, I add a new config field named '&lt;strong&gt;show&lt;/strong&gt;' for the admin generator. I guess the meaning of this new option is quite obvious, isn't it? It adds the possibility to simply view one object details without editing it. It currently shows the list of fields like it is for the 'edit' view, meaning with a tab interface. &lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://lh5.ggpht.com/_HlYBk55Czxc/SqIFc583yFI/AAAAAAAAAzc/99AyJoqKbt0/jroller-list-showbutton.png?imgmax=800" alt="jroller-list-showbutton.png" border="0" width="292" height="92" /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;UI improvements&lt;/strong&gt; (done by &lt;a href="http://github.com/jeremyb/sfAdminThemejRollerPlugin"&gt;jeremyb&lt;/a&gt;): as you can see in the 2 screenshots below there are many improvements such as the new 'reset' button next to the filter button, the sort arrows, new css styles for object actions, new pager view and finally the batch action select box is now also supporting the theme roller&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;The top part looks like this:&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://lh5.ggpht.com/_HlYBk55Czxc/SvgmY4QFc8I/AAAAAAAAAz4/qhBZvYnegmE/sfAdminThemejRoller-20091109-1.png?imgmax=800" alt="sfAdminThemejRoller-20091109-1.png" border="0" width="680" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;notice the new 'reset' button next to 'filters'&lt;/li&gt;&lt;br /&gt;&lt;li&gt;the up and down arrow on the table column names&lt;/li&gt;&lt;br /&gt;&lt;li&gt;the new css style for the object actions&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;...and the bottom part (new paginator and the select box is also styled according to your roller theme):&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://lh3.ggpht.com/_HlYBk55Czxc/Svgmu6E7KaI/AAAAAAAAAz8/CRzj-V1olz0/sfAdminThemejRoller-20091109-2.png?imgmax=800" alt="sfAdminThemejRoller-20091109-2.png" border="0" width="680" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;the edit view (buttons are accessible both on top and button of the form, tabs are now vertical):&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://lh4.ggpht.com/_HlYBk55Czxc/SvgvRg4lz4I/AAAAAAAAA0E/k4lYlnXoVOY/sfAdminThemejRoller-20091109-3.png?imgmax=800" alt="sfAdminThemejRoller-20091109-3.png" border="0" width="680" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The current code is available in github only. It is not yet ready for a new plugin release, we are still missing some key elements.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-7412987230614698318?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/7412987230614698318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2009/11/what-up-on-sfadminthemejrollerplugin.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/7412987230614698318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/7412987230614698318'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2009/11/what-up-on-sfadminthemejrollerplugin.html' title='what&amp;#39;s up on sfAdminThemejRollerPlugin?'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_HlYBk55Czxc/SqIFc583yFI/AAAAAAAAAzc/99AyJoqKbt0/s72-c/jroller-list-showbutton.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-169821025589658927</id><published>2009-09-05T23:36:00.001+08:00</published><updated>2009-09-05T23:36:56.203+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='web dev'/><title type='text'>new version of sfAdminThemejRollerPlugin (v 0.1.4)</title><content type='html'>I have finally released a new version of this plugin with an unpronounceable name ;-) Here is the list of change:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I add a new field named 'show' for the admin generator. I guess the meaning of this new option is quite obvious, isn't it? It add the possibility to simply view one object details without editing it. It currently shows the list of fields like it is for the 'edit' view, meaning with a tab interface.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I also create a new class jRollerDoctrineGenerator to replace sfDoctrineGenerator if you want the default link (the one you create with the = sign before the field name in the generator.yml) to link to the 'show' view rather than by default going to the 'edit' view. So far this is the only added value of this class. Of course if you prefer to keep the link to the 'edit' view simply keep the default class sfDoctrineGenerator. To use it, you simply need to modify your generator.yml as followed:&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: plain;"&gt;generator:&lt;br /&gt;  class:     jRollerDoctrineGenerator&lt;br /&gt;  params:&lt;br /&gt;    theme:   jroller&lt;br /&gt;....&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The source code is available on github for the moment, I want to finalize a few things before packaging a new plugin version. I also need to put the source code on svn.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://lh5.ggpht.com/_HlYBk55Czxc/SqIFc583yFI/AAAAAAAAAzc/99AyJoqKbt0/jroller-list-showbutton.png?imgmax=800" alt="jroller-list-showbutton.png" border="0" width="292" height="92" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-169821025589658927?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/169821025589658927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2009/09/new-version-of-sfadminthemejrollerplugi.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/169821025589658927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/169821025589658927'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2009/09/new-version-of-sfadminthemejrollerplugi.html' title='new version of sfAdminThemejRollerPlugin (v 0.1.4)'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_HlYBk55Czxc/SqIFc583yFI/AAAAAAAAAzc/99AyJoqKbt0/s72-c/jroller-list-showbutton.png?imgmax=800' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-511147278320700456</id><published>2009-08-28T09:43:00.003+08:00</published><updated>2009-08-28T09:46:28.591+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='doctrine'/><title type='text'>Propel ORM is dying?</title><content type='html'>as we used to say in French: "&lt;span style="font-style: italic;"&gt;Propel is dead, long live Doctrine&lt;/span&gt;!". Indeed it seems that Propel development as slow down to a point where the lead developer quit the project (&lt;a href="http://groups.google.com/group/propel-development/msg/829895b081ec7873"&gt;see his post&lt;/a&gt;). Guys, there are no more excuse to not look at Doctrine for all your Symfony project (and more).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-511147278320700456?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/511147278320700456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2009/08/propel-orm-is-dying.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/511147278320700456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/511147278320700456'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2009/08/propel-orm-is-dying.html' title='Propel ORM is dying?'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-3563974686736887470</id><published>2009-08-28T00:01:00.001+08:00</published><updated>2009-08-28T00:01:57.249+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><title type='text'>New version for the symfony jRoller admin theme</title><content type='html'>I have just released the version 0.1.3 of the symfony plugin named (take a deep breath ;-) "sfAdminThemejRollerPlugin". I fixed a few inconsistency and allow to change to your own theme without the need to install your own version of jQuery and jQuery UI. Within the plugin there is only one theme named "redmond" (what a bad idea to name a theme like this :-( but you can download one from &lt;a href="http://jqueryui.com"&gt;jqueryui.com&lt;/a&gt; and install it on your own web directory (see README file).&lt;br /&gt;I have also uploaded it to github.com and to the official symfony svn repository.&lt;br /&gt;Taste it and enjoy it!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://lh4.ggpht.com/_HlYBk55Czxc/SpatY0-i9qI/AAAAAAAAAzU/8GmSNuLn-Fk/jroller-flickr-menu.png?imgmax=800" alt="jroller-flickr-menu.png" border="0" width="450" height="135" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-3563974686736887470?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/3563974686736887470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2009/08/new-version-for-symfony-jroller-admin.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/3563974686736887470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/3563974686736887470'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2009/08/new-version-for-symfony-jroller-admin.html' title='New version for the symfony jRoller admin theme'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_HlYBk55Czxc/SpatY0-i9qI/AAAAAAAAAzU/8GmSNuLn-Fk/s72-c/jroller-flickr-menu.png?imgmax=800' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-626566823586416130</id><published>2009-08-24T13:30:00.001+08:00</published><updated>2009-08-24T13:31:29.530+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>sfAdminThemejRollerPlugin: Symfony admin generator on steroid</title><content type='html'>It's been a while since I wanted to work on my own admin generator theme. In symfony 1.0 the default admin generator was not really nice, it became a little bit better in 1.2 but still not to my taste (purely subjective I must admit ;-). For example, one thing get me mad is the css for the table list and the filter, I believe that the table list should be maximized and filters available only when we need them.&lt;br /&gt;I spent quite some time to modify some admin generator in some projects but you always end up doing the same thing over and over (see this &lt;a href="http://4.bp.blogspot.com/_HlYBk55Czxc/SWMbMZMt3DI/AAAAAAAAAqw/VbVk4Lz08oo/s1600-h/invoicr1.png"&gt;screenshot&lt;/a&gt; of what I have done with the list view based on a standard admin generator)...it was time to make things more to my taste. I now have a pretty clear idea of things that I would like out of the box from my new admin generator. Let me be more specific with the complete list of things I would like:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Change css style to a more modern style (again purely subjective ;-) that can be changed easily. For this I am using jQuery UI with their new theme roller system. The plugin is packaged with only one theme but it is extremely (too?) easy to change to your favorite theme (long term will be to use the upcoming html5 grid). &lt;/li&gt;&lt;br /&gt;&lt;li&gt;The filter box is hidden by default with a button to show/hide a modal window with the list of available filters. This allows to have a larger space for the table list.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In the new/edit views fieldsets are replaced by tabs (again jQuery UI).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Add a show only view, it makes sense for some application to allow read-only access.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;filters ala iTunes&lt;/strong&gt; smart playlist, meaning you select fields you want to filter and add them (nice to have but not so important, although useful if you have a lot of filter options)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Print preview&lt;/strong&gt; (configuration in generator.yml): simply a non paginated table easy to print with sortable column (javascript grid style)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;live search&lt;/strong&gt; (configuration in generator.yml): be able to quickly filter the table list while typing a few characters, ajax style. I did that before for one specific module, I now have to make it part of the admin generator.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;export to CSV format&lt;/strong&gt;: we could have a modal window to select the fields we would like to get and export them or simply a list defined in the generator.yml (which can include getters that are not database fields).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;export to PDF&lt;/strong&gt;: does it make sense at all, I am not yet sure!&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Import CSV to database&lt;/strong&gt;: to be able to simply upload a csv file of data to import through the admin generator.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;The first 3 items are easy to do just by modifying existing admin generator templates and are indeed already packaged in the plugin. The rest need more work (still learning how admin generator are working deeply).&lt;br/&gt;&lt;br /&gt;I am also trying as much as possible to keep all actions accessible without javascript and make sure that I do not break any default admin generator css classes and ids in case you need them. &lt;br /&gt;&lt;br /&gt;"&lt;em&gt;Stop talking and show us the code&lt;/em&gt;"...here you go! It is published as a symfony plugin at &lt;a href="http://www.symfony-project.com/plugins/sfAdminThemejRollerPlugin"&gt;http://www.symfony-project.com/plugins/sfAdminThemejRollerPlugin&lt;/a&gt;, meanwhile here are some screenshots:&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://lh5.ggpht.com/_HlYBk55Czxc/SovPBjZPmsI/AAAAAAAAAyw/sp28Wi_hFCw/jroller-list-themes.png?imgmax=800" alt="jroller-list-themes.png" border="0" width="680" height="292" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://lh6.ggpht.com/_HlYBk55Czxc/SpIBG_3Mw4I/AAAAAAAAAy8/6YlRs4ciikM/jroller-list-filters.png?imgmax=800" alt="jroller-list-filters.png" border="0" width="650" height="275" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://lh4.ggpht.com/_HlYBk55Czxc/SpICgt-bCwI/AAAAAAAAAzI/m107vadkdJg/jroller-form.png?imgmax=800" alt="jroller-form.png" border="0" width="640" height="263" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;How to install?&lt;/h2&gt;&lt;br /&gt;&lt;pre class="brush: bash;"&gt;./symfony plugin:install sfAdminThemejRollerPlugin --stability=beta&lt;/pre&gt;&lt;br /&gt;When I say beta, it is beta ;-) I am not fully satisfied with the code and still thinking about the best approach for some features (not mentioning it's my first play with admin generator). Feel free to give me feedback.&lt;br /&gt;I will publish the code on github later to ease collaboration if any of you are interested. Anyway, it's php right? so you can play with the code right now!&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;How to use it?&lt;/h2&gt;&lt;br /&gt;&lt;pre class="brush: bash;"&gt;./symfony --theme=jroller doctrine:generate-admin&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;or if you have an existing admin generator, simply modify your generator.yml file with &lt;pre class="brush: plain"&gt;theme: jroller&lt;/pre&gt; instead of theme: admin.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Configuration&lt;/h2&gt;&lt;br /&gt;I currently package jQuery 1.3.2 and jQuery UI 1.7.2 to make sure it can work out-of-the-box, but it is also easy to specify in your app.yml file that you do not want to use those versions (or because you already include those libraries in your project) and include your own jquery and UI.&lt;br /&gt;jQuery UI is using at the minimum: Tabs, Dialog (Drag and drop and resizable recommended).&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: plain;"&gt;&lt;br /&gt;# inside your app.yml file&lt;br /&gt;  sf_admin_theme_jroller_plugin:&lt;br /&gt;    web_dir:      /sfAdminThemejRollerPlugin # specify specific folder where to pick your jquery stuff, ui and themes.&lt;br /&gt;    use_jquery:   true # default. use the packaged jquery/UI&lt;br /&gt;    theme:        redmond # default. &lt;br /&gt;    css_reset:    true # default. reset default css (from Blueprint CSS)&lt;br /&gt;&lt;/pre&gt;  &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;What's next?&lt;/h2&gt;&lt;br /&gt;I will try to implement the rest in the coming months (I just found out that sfDoctrineAdminGeneratorWithShowPlugin start to implement some of my ideas), again feel free to contribute to speed up the process.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Bugs? no way!&lt;/h2&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;I still have a pixel problem with the caption and tfoot of my table, if anyone knows how to solve it?&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You will probably find bugs, please report them.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-626566823586416130?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/626566823586416130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2009/08/sfadminthemejrollerplugin-symfony-admin.html#comment-form' title='35 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/626566823586416130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/626566823586416130'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2009/08/sfadminthemejrollerplugin-symfony-admin.html' title='sfAdminThemejRollerPlugin: Symfony admin generator on steroid'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_HlYBk55Czxc/SovPBjZPmsI/AAAAAAAAAyw/sp28Wi_hFCw/s72-c/jroller-list-themes.png?imgmax=800' height='72' width='72'/><thr:total>35</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-7248370109848649310</id><published>2009-08-14T01:06:00.004+08:00</published><updated>2009-08-20T12:45:00.450+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='cs4u'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='pdf'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='web dev'/><category scheme='http://www.blogger.com/atom/ns#' term='billing'/><category scheme='http://www.blogger.com/atom/ns#' term='invoicr'/><title type='text'>Symfony batch and i18n + pdf generation</title><content type='html'>A few months ago, I wrote a post about &lt;a href="http://gestadieu.blogspot.com/2008/12/symfony-batch-in-my-i18n-nightmares.html"&gt;i18n in batch and pdf generation&lt;/a&gt;. At that time I could not find a way to manage translation in symfony batch (for example when you need to send email to customers, etc...). In Symfony 1.2, batches are depreciated in favor of tasks but my project is still in symfony 1.0 (and I guess the same can be applicable in 1.2). Anyway, I finally found a way to do it:&lt;br /&gt;&lt;pre name="code" class="brush: php;"&gt;sfLoader::loadHelpers('I18N');&lt;br /&gt;$I18N = sfContext::getInstance()-&gt;getI18N();&lt;br /&gt;$I18N-&gt;setMessageSourceDir(SF_ROOT_DIR.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'i18n', $culture);&lt;br /&gt;echo __('text to translate');&lt;/pre&gt;&lt;br /&gt;I am not sure if it is the best solution, but it definitively works.&lt;br /&gt;&lt;br /&gt;On the pdf side, I was mentioning that in order to generate invoices in pdf, I created some pdf invoice templates with Open Office Draw. Following this step, I was able with Zend_Pdf to generate PDF files on the fly based on my templates. The big problem with this solution is that you have to positionned all your text at the pixel and cannot manage things like multiple lines text and so on. You end up writing a lot of stupid code and anything you want to modify you have to try again and make sure it works (and when you manage several languages it can even be more complex). Anyway I managed to do it like this for the billing system used in East-Timor but I always wanted another solution. I did find some promising project but nothing yet reach a usable state to my knowledge. However, I found to interesting projects:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.odtphp.com/"&gt;odtPHP&lt;/a&gt;: it is not as such a pdf generator but it looks fantastic to generate open documents easily with a templating system. It is great and I am sure I will use it soon. Once you have an open document, it is a piece of cake for anybody to save it as pdf...even my grandma could do this ;-)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/projects/podr/"&gt;Podr&lt;/a&gt;: it's a kind of open office server to generate document on the server, including pdf. However it seems only working on windows and quite heavy installation, I am not sure if it is a good solution. Anyone using it? &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;odtPHP looks like a clean and nice php class and it should be easy to integrate in symfony. On the client side, if you do not have open office (or any odt compatible solution) you can simply install a plugin for Microsoft Office to support open document formats (it seems it is even native support in Office 2007 service pack 2): &lt;a href="http://www.sun.com/software/star/odf_plugin/"&gt;http://www.sun.com/software/star/odf_plugin/&lt;/a&gt; or &lt;a href="http://sourceforge.net/projects/odf-converter/"&gt;http://sourceforge.net/projects/odf-converter/&lt;/a&gt;. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-7248370109848649310?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/7248370109848649310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2009/08/symfony-batch-and-i18n-pdf-generation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/7248370109848649310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/7248370109848649310'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2009/08/symfony-batch-and-i18n-pdf-generation.html' title='Symfony batch and i18n + pdf generation'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-5245466118187375235</id><published>2009-08-12T22:37:00.001+08:00</published><updated>2009-08-13T00:40:40.385+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>A Mac tool for MySQL: Sequel Pro 0.9.6</title><content type='html'>In the past month or so I have been using SequelPro (http://sequelpro.com/) for my local MySQL usage. At that time it was version 0.9.5 and it was quite interesting for local usage, however it was still missing quite a bit of information compare to a tool like phpMyAdmin and one big limitation (at least for me) was the connection type used: only on the MySQL port. There was no way yet to establish a SSH connection to connect to remote databases. Most of the time a goog MySQL server should not accept external connection, therefore a ssh tunnel is the only solution for such cases when you want to use desktop app.&lt;br /&gt;&lt;br /&gt;Fear not anymore! Version 0.9.6 has been released and I must admit it is a huge improvement regardless of the limited increment on the version number. It has ssh support and much much more. I can now connect to all my databases servers around the world easily through only one interface. On top of the ssh connection they add support for foreign key, add new view such as 'Relations' and 'Table info' and history of your actions. This is certainly now the tool I am going to use, even more than phpMyAdmin. &lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://lh6.ggpht.com/_HlYBk55Czxc/SoLQi5VofwI/AAAAAAAAAx8/ZBWDkT13uGQ/sequelpro096.png?imgmax=800" alt="sequelpro096.png" border="0" width="400" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-5245466118187375235?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/5245466118187375235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2009/08/mac-tool-for-mysql-sequel-pro-096.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/5245466118187375235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/5245466118187375235'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2009/08/mac-tool-for-mysql-sequel-pro-096.html' title='A Mac tool for MySQL: Sequel Pro 0.9.6'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_HlYBk55Czxc/SoLQi5VofwI/AAAAAAAAAx8/ZBWDkT13uGQ/s72-c/sequelpro096.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-8436446915890812941</id><published>2009-06-18T16:05:00.000+08:00</published><updated>2009-06-18T16:19:20.031+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Are you tethering?</title><content type='html'>Connecting my laptop through the iPhone is extremely simple (go in Settings -&gt; General -&gt; Network) and a clear message is always available on top of the screen. Well done and very useful sometime.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href='http://picasaweb.google.com/gestadieu/TechBlog#5348579243714866162'&gt;&lt;img src='http://lh3.ggpht.com/_HlYBk55Czxc/Sjn4e_Km6_I/AAAAAAAAAvM/awJlsFhxmJ0/s288/iphone_photo.jpg' border='0' width='187' height='281' style='margin:5px'&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href='http://picasaweb.google.com/gestadieu/TechBlog#5348579254368153954'&gt;&lt;img src='http://lh3.ggpht.com/_HlYBk55Czxc/Sjn4fm2jMWI/AAAAAAAAAvQ/AxMEvwH60KA/s288/iphone_photo.jpg' border='0' width='187' height='281' style='margin:5px'&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href='http://picasaweb.google.com/gestadieu/TechBlog#5348579269959379250'&gt;&lt;img src='http://lh6.ggpht.com/_HlYBk55Czxc/Sjn4gg7yaTI/AAAAAAAAAvU/4h7wucOjCKE/s288/iphone_photo.jpg' border='0' width='187' height='281' style='margin:5px'&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;What I found really useful is the landscape mode, when you need the keyboard is a big difference and a huge improvement for emails, blogging...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href='http://picasaweb.google.com/gestadieu/TechBlog#5348579285238330322'&gt;&lt;img src='http://lh3.ggpht.com/_HlYBk55Czxc/Sjn4hZ2ks9I/AAAAAAAAAvY/uy2DmfB__Ts/s288/iphone_photo.jpg' border='0' width='187' height='281' style='margin:5px'&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;The last thing I tested so far is the copy/paste, this is a so basic feature but you end up using it a lot.&lt;br /&gt;I'll come back as soon as I found new useful features...&lt;br /&gt;&lt;br /&gt;-- Post From My iPhone&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-8436446915890812941?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/8436446915890812941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2009/06/are-you-tethering.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/8436446915890812941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/8436446915890812941'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2009/06/are-you-tethering.html' title='Are you tethering?'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_HlYBk55Czxc/Sjn4e_Km6_I/AAAAAAAAAvM/awJlsFhxmJ0/s72-c/iphone_photo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-7236513902475256169</id><published>2009-04-01T22:35:00.004+08:00</published><updated>2009-04-01T22:47:16.708+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='graphic'/><category scheme='http://www.blogger.com/atom/ns#' term='lab'/><title type='text'>Charting Experiments</title><content type='html'>Data visualization on the web has been for a while an area without much innovation. You basically had 2 solutions:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Generating a static image on the server side&lt;/li&gt;&lt;li&gt;Using flash as a way to make more dynamic graphs&lt;/li&gt;&lt;/ol&gt;Unfortunately both solutions have their own limitations. For the server-side image generation it is obvious: the result is static. For flash: flash itself can be a limitation since it is not an open standard.&lt;br /&gt;Since a year or so, we did see some simple solution based on canvas (html5) but now some groups are experimenting more advanced solutions based on web standard. 2 solutions that I really find interesting are &lt;a href="http://vis.stanford.edu/protovis/"&gt;Protovis &lt;/a&gt;from a Stanford University group and &lt;a href="http://ejohn.org/blog/processingjs/"&gt;Processing.js&lt;/a&gt; from John Resig (Mr jQuery himself). They are still experimentation but they show a new approach with a real touch of innovation. Let's now wait to see if they will become more than lab research tools, I do believe!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-7236513902475256169?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/7236513902475256169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2009/04/charting-experiments.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/7236513902475256169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/7236513902475256169'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2009/04/charting-experiments.html' title='Charting Experiments'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-8846358761320651006</id><published>2009-03-06T10:45:00.003+08:00</published><updated>2009-03-06T11:49:47.626+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HK'/><category scheme='http://www.blogger.com/atom/ns#' term='Macau'/><category scheme='http://www.blogger.com/atom/ns#' term='censorship'/><category scheme='http://www.blogger.com/atom/ns#' term='china'/><title type='text'>(not) welcome to Macau</title><content type='html'>A drawing from &lt;a href="http://www.scmp.com/"&gt;South China Morning Post&lt;/a&gt; after a couple of HK residents have been rejected to enter in Macau (journalists, politicians...). Even China is accepting them...&lt;br /&gt;Things are not really going well here related to human rights. There are more and more "VIP" people from HK rejected and nobody knows why. The local government did not explain anything...spring is going to be hot between Macau and HK ;-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://picasaweb.google.com/gestadieu/TechBlog#5309914476436540562"&gt;&lt;img src="http://lh6.ggpht.com/_HlYBk55Czxc/SbCbFUu0TJI/AAAAAAAAAuE/4YvnAIE_3Bg/iphone_photo.jpg" style="margin: 5px;" border="0" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;-- Post From My iPhone&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-8846358761320651006?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/8846358761320651006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2009/03/not-welcome-to-macau.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/8846358761320651006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/8846358761320651006'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2009/03/not-welcome-to-macau.html' title='(not) welcome to Macau'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_HlYBk55Czxc/SbCbFUu0TJI/AAAAAAAAAuE/4YvnAIE_3Bg/s72-c/iphone_photo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-1305466230681752163</id><published>2009-03-02T12:53:00.007+08:00</published><updated>2009-03-06T12:08:41.116+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='innovation'/><category scheme='http://www.blogger.com/atom/ns#' term='gmail'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Gmail on steroid</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HlYBk55Czxc/SbCfVLo4WGI/AAAAAAAAAuM/khSEAMDnvOo/s1600-h/google-gmail-task.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 186px; height: 320px;" src="http://3.bp.blogspot.com/_HlYBk55Czxc/SbCfVLo4WGI/AAAAAAAAAuM/khSEAMDnvOo/s320/google-gmail-task.jpg" alt="" id="BLOGGER_PHOTO_ID_5309919146920138850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;&lt;/span&gt;The guys in Google working on Gmail are not stopping their innovation while the crisis is around...and this is good for us! They have launched (in beta only, within the "labs") a couple of very useful features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Tasks. You can simply add email to a todolist, it is simple but extremely useful. From there you manage your task (due date, completed, related email,notes...).  I started to use it and did not stop.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Offline mode. This is a killer feature for sure! With Google Gears installed (while HTML5 is on the way) you can use Gmail even without any Internet connection. This is a big step forward to make Gmail a powerful tool. This offline is also available for Google Reader and Documents (Calendar is also coming). With those enhancements (plus a couple of smaller one), I gave up to use Apple Mail for my main pro email account, Gmail is really convenient.&lt;/li&gt;&lt;li&gt;&lt;a href="http://mail.google.com/videochat?hl=en"&gt;Gtalk plugin&lt;/a&gt;. A few month ago Google release a browser plugin to add audio and video to your Gmail chat. Basically you got a skype replacement inside Gmail, this is great too.&lt;/li&gt;&lt;/ul&gt;There are many more new "Labs" features that could be useful for anyone, don't miss them!&lt;br /&gt;&lt;br /&gt;Since I know that all those good guys in Google are reading my blog everyday ;-) I would like to request a few more things:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;please help us to easily manage multiple gmail accounts.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If Google Gears was able to install in Mozilla Prism we could have a kind of desktop client for GMail...and first point would be already solved!&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Don't forget that all those new features are provided in "Labs" and are still experimental.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-1305466230681752163?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/1305466230681752163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2009/03/gmail-on-steroid.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/1305466230681752163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/1305466230681752163'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2009/03/gmail-on-steroid.html' title='Gmail on steroid'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_HlYBk55Czxc/SbCfVLo4WGI/AAAAAAAAAuM/khSEAMDnvOo/s72-c/google-gmail-task.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-8889562346957659618</id><published>2009-01-15T22:06:00.003+08:00</published><updated>2009-01-15T22:06:00.252+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='cms'/><title type='text'>My view on CMS - the backend, part 1</title><content type='html'>CMS is a complex topic, everybody is talking about this and everybody has a different approach. I don't want to give my own concept here (should I have one ;-) but simply have a practical approach based on a project we have to do for one of our customer (largest casino in the world...). We did the first version of its CMS based on a typical Symfony 1.0/Propel/MySQL5.&lt;br /&gt;&lt;br /&gt;We are now in the process to re-write the all application to make it useful for further projects and customers and optimize things based on our small experience. We decided to make the "&lt;span style="font-style: italic;"&gt;big sf jump&lt;/span&gt;": symfony 1.2/Doctrine! It is not an easy choice since we did not have yet any experience neither with symfony 1.2 nor doctrine but we believed it was worth to make the jump specially due to the new admin generator and the form framework, not mentioning all the goodies from doctrine itself.&lt;br /&gt;&lt;br /&gt;When you build a CMS, it is quite common to think first about the backend that will allow your customer to manage its content in an more-or-less easy to use interface. This interface is a key for a CMS success (along with its flexibility and extensibility). On my course to draw the backend interface I've tried to pick the best patterns (at least to me) from &lt;a href="http://www.spip.net/"&gt;SPIP&lt;/a&gt; (a french CMS), Joomla and Wordpress. Thanks to &lt;a href="http://www.balsamic.com/"&gt;Balsamic&lt;/a&gt;, I quickly draw what would be our CMS backend, at least for page management (the central part of the cms). See below for mockups.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;List of pages&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HlYBk55Czxc/SWLaBY2LjvI/AAAAAAAAAqg/0bkt9UloH68/s1600-h/cms-page-list.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 284px;" src="http://1.bp.blogspot.com/_HlYBk55Czxc/SWLaBY2LjvI/AAAAAAAAAqg/0bkt9UloH68/s400/cms-page-list.JPG" alt="" id="BLOGGER_PHOTO_ID_5288028629870808818" border="0" /&gt;&lt;/a&gt;The list of pages should use symfony admin generator to keep its flexibility, therefore there is a lot of work on css and javascript fronts. A few things will become ajax (I will publish later my 2 cents jquery plugin to ajaxified a symfony admin generator list): pagination and the new live search.&lt;br /&gt;&lt;br /&gt;For the list of filters, I wanted to make them less obstrusive, with some ideas from Google Docs search options (show and hide them) as well as Apple iTunes smartlist configuration. The latest will be a little bit more tricky to do...probably not for version 1!&lt;br /&gt;&lt;br /&gt;For the need of a CMS we add the following elements to the default admin generator:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Live search will "ajaxly" filter the list according to a search on title and content of the page.&lt;/li&gt;&lt;li&gt;New batch actions such as "copy" and "move" pages.&lt;/li&gt;&lt;li&gt;A left sidebar to navigate in a tree way (based on nested set). This navigation will filter the table in the same way as live search (ajax as well).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;As we use Doctrine, we will use of lot of out-of-the-box behaviors: Nested set, versioning, i18n and of course Timestampable.&lt;br /&gt;&lt;br /&gt;Next step we will look at the page edition view...see you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-8889562346957659618?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/8889562346957659618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2009/01/my-view-on-cms-backend.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/8889562346957659618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/8889562346957659618'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2009/01/my-view-on-cms-backend.html' title='My view on CMS - the backend, part 1'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HlYBk55Czxc/SWLaBY2LjvI/AAAAAAAAAqg/0bkt9UloH68/s72-c/cms-page-list.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-3486109750757779900</id><published>2009-01-13T16:39:00.003+08:00</published><updated>2009-01-13T16:47:46.812+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>Finally, bats can use Firefox ;-)</title><content type='html'>Mozilla Labs is a team of guys building the future of the web. They are doing a lot of amazing work (most of it only alpha or beta for time being) and open doors for radically new ways for our future interactions with the web. They have been working on &lt;a href="http://labs.mozilla.com/projects/weave/"&gt;Weave&lt;/a&gt;, &lt;a href="http://labs.mozilla.com/projects/ubiquity/"&gt;Ubiquity&lt;/a&gt; or &lt;a href="http://labs.mozilla.com/projects/prism/"&gt;Prism&lt;/a&gt;. I really like those projects and want to use them in the future.&lt;br /&gt;&lt;br /&gt;Here is a video to show how to make Firefox accessible for bats. &lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="250"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2493398&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=2493398&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="250"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/2493398"&gt;Ubiquity Tutorial: Turn a page upside-down&lt;/a&gt; from &lt;a href="http://vimeo.com/user532161"&gt;Aza Raskin&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Of course, it is useless for humans (except...Batman ;-) but it shows the power of this kind of technology.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-3486109750757779900?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/3486109750757779900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2009/01/finally-bats-can-use-firefox.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/3486109750757779900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/3486109750757779900'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2009/01/finally-bats-can-use-firefox.html' title='Finally, bats can use Firefox ;-)'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-8292241804625329340</id><published>2009-01-12T12:17:00.002+08:00</published><updated>2009-01-12T12:19:09.591+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>New Apple product: I don't want it!</title><content type='html'>It's really fun and well done. Enjoy!&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/9BnLbv6QYcA&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/9BnLbv6QYcA&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/408361410820097976-8292241804625329340?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/8292241804625329340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2009/01/new-apple-product-i-dont-want-it.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/8292241804625329340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/8292241804625329340'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2009/01/new-apple-product-i-dont-want-it.html' title='New Apple product: I don&apos;t want it!'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-1207457145299056457</id><published>2009-01-06T07:45:00.001+08:00</published><updated>2009-08-13T11:22:10.867+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><category scheme='http://www.blogger.com/atom/ns#' term='cs4u'/><category scheme='http://www.blogger.com/atom/ns#' term='barcode'/><category scheme='http://www.blogger.com/atom/ns#' term='zend'/><category scheme='http://www.blogger.com/atom/ns#' term='pdf'/><category scheme='http://www.blogger.com/atom/ns#' term='billing'/><category scheme='http://www.blogger.com/atom/ns#' term='invoicr'/><title type='text'>Invoicr (former CS-4U), what's new?</title><content type='html'>Long time I have not talk about my project that I used to name "&lt;a href="http://www.estadieu.com/blog/cs-4u/"&gt;CS-4U&lt;/a&gt;". As you might know, this web-based billing system for utilities, developed with my favorite PHP5 framework (should I mentioned it..&lt;a href="http://www.symfony-project.org/"&gt;symfony&lt;/a&gt; 1.0 at that time), is actually in use for about 3 years already in East-Timor for the electricity company.&lt;br /&gt;I recently went back there to make an upgrade and add a lot of new features, this is what I want to share in this post.&lt;br /&gt;This application was my very first project with symfony and when I dived again in the code for all those new features I realized how much I learned in the past years... There are lot of things that I would do differently today (and I am not even considering here the use of symfony 1.2)!&lt;br /&gt;&lt;br /&gt;Here is a quick list of what has been added in version 1.1:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;PDF support with Zend_Pdf&lt;/span&gt;. This allow to generate invoices and reports in PDF (mainly using templates). Zend_Pdf is stable and easy to integrate in symfony, the drawback of these kind of solution is their limitation and the cost of maintenance: you must draw everything per line and position each line on the page. I created some simple methods to right align or draw a simple table over several pages but it is really a pain! It seems &lt;a href="http://www.nabble.com/Upcoming-Zend_Pdf-Enhancements-td16509067.html"&gt;some guys are working on improving Zend_Pdf&lt;/a&gt; (they actually released an &lt;a href="http://www.refw.org/"&gt;alpha framework RE&lt;/a&gt;) to add to it some more advanced functions such as multiline content, table and so on. I hope it can come out soon...&lt;/li&gt;&lt;li&gt;A &lt;span style="font-weight: bold;"&gt;new receipt system&lt;/span&gt;. Basically the new receipt system will split a payment into sub-receipts over several invoices if necessary and still keep track of the "physical" payment main receipt. With this we clearly identify where is the money, there are no more "floating" money in the contract balance. All supplementary payments are made against the oldest debt of the contract and the system cannot accept payment over the total balance.&lt;/li&gt;&lt;li&gt;Some &lt;span style="font-weight: bold;"&gt;new modules&lt;/span&gt;: Fines &amp;amp; Products module to add one-shot cost in upcoming invoice for a customer. Some admin generated modules to easily modify some of the data (status, districts, categories...)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Barcode support&lt;/span&gt;. You can now add a barcode in the invoice pdf file to ease payment and avoid human errors. This is not yet use in Timor because they do not have yet barcode reader but they seems very interested by this solution.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Javascript &lt;/span&gt;switch: from Prototype to jQuery. To ease some development I simply switch to jQuery library instead of Prototype and we use a little bit more ajax call in the app when it make sens. I still want to add more in the future...probably when I start to migrate to sf1.2...not for tomorrow though...&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;New UI design&lt;/span&gt;. Not big changes but still an improvement compare to before. It is still very "light web style" since I am not yet convince to go to a more rich UI. I am kind of fan of "Google style".&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;More actions&lt;/span&gt; to give more flexibility to users to correct mistakes mainly: change tariffs, modify meter-contract relation information, re-calculate invoice... &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Bugs&lt;/span&gt;, bugs, bugs.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;What will come next (no particular order):&lt;br /&gt;Business side:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;new tariff system to allow more complex tariff calculation.&lt;/li&gt;&lt;li&gt;Dashboard. At login, user will see its own dashboard according to its authorization level. It will show some KPI and latest info/actions.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Reporting. Change the reporting into a more user-controlled solution where the user can define the report she/he wants and get it in pdf (no idea yet on this ;-) or OpenDocument format.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Technology side:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;use of admin generator instead of manual dev for most of "master data" modules with a lot of ajax (more on this later as I am working on a new admin generator theme for this).&lt;/li&gt;&lt;li&gt;Messaging Service. To ease communication between users or from system to users with memo, task assignment or system message. This is a symfony plugin I want to do for quite sometime already (including an event/calendar system too).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Reporting. I want to make the reporting much easier and flexible for user to get the report he wants (not only pre-coded report). I also want to switch from the existing flash graph library to canvas based charts and/or &lt;a href="http://teethgrinder.co.uk/open-flash-chart/"&gt;open flash chart&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Migrate to sf1.2 and write unit and functional test.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HlYBk55Czxc/SWMbMwhFkAI/AAAAAAAAArI/eXO2Mb7XCIU/s1600-h/invoicr4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 207px;" src="http://2.bp.blogspot.com/_HlYBk55Czxc/SWMbMwhFkAI/AAAAAAAAArI/eXO2Mb7XCIU/s400/invoicr4.png" alt="" id="BLOGGER_PHOTO_ID_5288100293459152898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HlYBk55Czxc/SWMbMrZVJgI/AAAAAAAAArA/j6cF_hInCEY/s1600-h/invoicr3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 211px;" src="http://1.bp.blogspot.com/_HlYBk55Czxc/SWMbMrZVJgI/AAAAAAAAArA/j6cF_hInCEY/s400/invoicr3.png" alt="" id="BLOGGER_PHOTO_ID_5288100292084442626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HlYBk55Czxc/SWMbMmxL92I/AAAAAAAAAq4/DBWMjkEhEtc/s1600-h/invoicr2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 270px;" src="http://3.bp.blogspot.com/_HlYBk55Czxc/SWMbMmxL92I/AAAAAAAAAq4/DBWMjkEhEtc/s400/invoicr2.png" alt="" id="BLOGGER_PHOTO_ID_5288100290842326882" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HlYBk55Czxc/SWMbMZMt3DI/AAAAAAAAAqw/VbVk4Lz08oo/s1600-h/invoicr1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 252px;" src="http://4.bp.blogspot.com/_HlYBk55Czxc/SWMbMZMt3DI/AAAAAAAAAqw/VbVk4Lz08oo/s400/invoicr1.png" alt="" id="BLOGGER_PHOTO_ID_5288100287199697970" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-1207457145299056457?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/1207457145299056457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/10/invoicrwhat-next.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/1207457145299056457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/1207457145299056457'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/10/invoicrwhat-next.html' title='Invoicr (former CS-4U), what&amp;#39;s new?'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HlYBk55Czxc/SWMbMwhFkAI/AAAAAAAAArI/eXO2Mb7XCIU/s72-c/invoicr4.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-1910261742356509984</id><published>2008-12-22T16:44:00.001+08:00</published><updated>2008-12-22T16:44:00.817+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><category scheme='http://www.blogger.com/atom/ns#' term='pdf'/><category scheme='http://www.blogger.com/atom/ns#' term='web dev'/><title type='text'>Symfony batch in my i18n nightmares</title><content type='html'>I was working on a new version of the billing system for utilities (used by the national electricity company in East-Timor), adding a bunch of new features including PDF generation for invoice and some reports. I decided to use Zend_Pdf and I believe it is a good choice.&lt;br /&gt;&lt;br /&gt;Generating PDF is not something really fun. I used a template pdf and feed it with all the customer information I want. For each single piece of data you want to add, you must provide the position in the page, the style (if you want to change it)...a real pain! I wish we can have a more powerful templating system. It seems some guys have some plans (and codes) but nothing yet release (see &lt;a href="http://www.nabble.com/Upcoming-Zend_Pdf-Enhancements-td16509067.html"&gt;mailing list here&lt;/a&gt;)...hey! (almost) good news: while I was looking for the link I found that they did release their PDF library (not yet in Zend, nor compatible with Zend_Pdf) named "RE Framework". I need to have a look one of this day...&lt;br /&gt;&lt;br /&gt;Anyway, I was thinking to generate all invoices (in DB + PDF version) through a batch in symfony. I started working on it when I faced a "simple" problem: I need to use i18n for each invoices (invoice in the language of the customer), but from a batch I am always getting an error message since it does not have a user and culture define. I tried to initalize a fake one...but no luck. I need to try harder... ;-)&lt;br /&gt;&lt;br /&gt;Any ideas?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-1910261742356509984?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/1910261742356509984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/12/symfony-batch-in-my-i18n-nightmares.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/1910261742356509984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/1910261742356509984'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/12/symfony-batch-in-my-i18n-nightmares.html' title='Symfony batch in my i18n nightmares'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-3240507926277218849</id><published>2008-12-22T12:46:00.000+08:00</published><updated>2008-12-22T12:47:13.618+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photo'/><category scheme='http://www.blogger.com/atom/ns#' term='vacances'/><title type='text'>Legs in the sky</title><content type='html'>Enjoy a rest 300m from the ground!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href='http://picasaweb.google.com/lh/photo/EHcGIzPNoO-NsQ6f2u_bRg'&gt;&lt;img src='http://lh5.ggpht.com/_HlYBk55Czxc/SU8bzsTDmNI/AAAAAAAAAos/mPSFMfCzTjQ/s288/iphone_photo.jpg' border='0' width='187' height='281' style='margin:5px'&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt; &lt;br /&gt;Photo taken from the Macau Tower restaurant.&lt;br /&gt;&lt;br /&gt;  -- Post From My iPhone&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-3240507926277218849?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/3240507926277218849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/12/legs-in-sky.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/3240507926277218849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/3240507926277218849'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/12/legs-in-sky.html' title='Legs in the sky'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_HlYBk55Czxc/SU8bzsTDmNI/AAAAAAAAAos/mPSFMfCzTjQ/s72-c/iphone_photo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-3862750860829044319</id><published>2008-12-10T12:35:00.002+08:00</published><updated>2008-12-30T11:21:07.680+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geospatial'/><category scheme='http://www.blogger.com/atom/ns#' term='web dev'/><title type='text'>Thematic Mapping Engine</title><content type='html'>A very interesting web app (open source of course ;-): &lt;a href="http://thematicmapping.org/engine/"&gt;Thematic Mapping Engine&lt;/a&gt;.&lt;br /&gt;You can play with it online, it is really well done. I hope I will have new opportunity to work on the geospatial arena later next year, I would love to do things like this...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HlYBk55Czxc/SVmS311bl5I/AAAAAAAAAp8/2KnoWkGsxk8/s1600-h/thematicmapengine.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 233px; height: 320px;" src="http://2.bp.blogspot.com/_HlYBk55Czxc/SVmS311bl5I/AAAAAAAAAp8/2KnoWkGsxk8/s320/thematicmapengine.JPG" alt="" id="BLOGGER_PHOTO_ID_5285417125737633682" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-3862750860829044319?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/3862750860829044319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/12/thematic-mapping-engine.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/3862750860829044319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/3862750860829044319'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/12/thematic-mapping-engine.html' title='Thematic Mapping Engine'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HlYBk55Czxc/SVmS311bl5I/AAAAAAAAAp8/2KnoWkGsxk8/s72-c/thematicmapengine.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-6068547887431242408</id><published>2008-12-09T16:38:00.001+08:00</published><updated>2009-01-02T11:14:40.625+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='piracy'/><category scheme='http://www.blogger.com/atom/ns#' term='china'/><title type='text'>Scoop: the upcoming iPhone TV ;-)</title><content type='html'>Yesterday I was in HK for a few hours and what did I find in a shop on the middle of Causeway Bay? The new (obviously fake) upcoming iPhone TV, here is a shot:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://picasaweb.google.com/lh/photo/293ATaFMPGszoRSwDlFSPw"&gt;&lt;img src="http://lh6.ggpht.com/_HlYBk55Czxc/ST5f6wNA-FI/AAAAAAAAAoo/fhnA6j7yaYM/s288/iphone_photo.jpg" style="margin: 5px;" border="0" width="210" height="281" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;Photo taken with my iPhone-not-yet-TV! &lt;br /&gt;-- Post From My iPhone&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-6068547887431242408?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/6068547887431242408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/12/scoop-upcoming-iphone-tv.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/6068547887431242408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/6068547887431242408'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/12/scoop-upcoming-iphone-tv.html' title='Scoop: the upcoming iPhone TV ;-)'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_HlYBk55Czxc/ST5f6wNA-FI/AAAAAAAAAoo/fhnA6j7yaYM/s72-c/iphone_photo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-4443778329823103808</id><published>2008-12-08T17:57:00.002+08:00</published><updated>2008-12-08T20:54:48.722+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photo'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>Pano for iphone</title><content type='html'>I played with "&lt;a href="http://debaclesoftware.com/"&gt;Pano&lt;/a&gt;", a panorama app for iPhone...and I must said I am quite impressed. Since a picture is better than words, here it is!&lt;br /&gt;&lt;center&gt;&lt;a href="http://picasaweb.google.com/lh/photo/sxs-p4_CzhZvRw0ZkJf2bQ"&gt;&lt;img src="http://lh4.ggpht.com/_HlYBk55Czxc/STzvb5WAF4I/AAAAAAAAAok/qnmBOW1QDNw/s288/iphone_photo.jpg" style="margin: 5px;" border="0" height="74" width="281" /&gt;&lt;/a&gt;&lt;/center&gt;This is Macau center (Leal Senado Square)&lt;br /&gt; -- Post From My iPhone&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-4443778329823103808?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/4443778329823103808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/12/pano-for-iphone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/4443778329823103808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/4443778329823103808'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/12/pano-for-iphone.html' title='Pano for iphone'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_HlYBk55Czxc/STzvb5WAF4I/AAAAAAAAAok/qnmBOW1QDNw/s72-c/iphone_photo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-5188271486813286996</id><published>2008-12-03T12:58:00.001+08:00</published><updated>2008-12-03T13:04:39.560+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><title type='text'>Symfony 1.2, now available in shops!</title><content type='html'>Symfony 1.2 is finally officially out! As usual, it comes with a lot of very good documentation available.&lt;br /&gt;After almost 3 years using Symfony 1.0,  I've started to read some documentation for the new version and what I can say is simple: WOW!&lt;br /&gt;I've really enjoyed to work with SF in the past years but I am now sure I will enjoy even more working with the 1.2 release...provided that I take the time to learn all the new "powers". Because this is the drawback of this version: coming from 1.0 you have to learn a lot of new stuff to master symfony. But don't get me wrong, I don't complain, I perfectly understand the need to learn more and all the new powers you get in hands after...like when Peter Parker discovered his spider powers ;-)&lt;br /&gt;Coming from Symfony 1.0, here is the list of what impress me the most so far:&lt;br /&gt;- the form framework&lt;br /&gt;- the new admin generator based on the form framework&lt;br /&gt;- the new routing system...still need to read more about it.&lt;br /&gt;- doctrine integration. Doctrine is not new as such but I used propel before and want now to switch. Doctrine is amazing (see my previous post) and now fully integrated in SF.&lt;br /&gt;&lt;br /&gt;Enough for today! I go back to my reading:-)&lt;br /&gt;Meanwhile, SF team is doing again it's famous advent calendar based on 1.2... go job guys!&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.symfony-project.org/jobeet/1_2/en/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 125px; height: 125px;" src="http://www.symfony-project.org/images/jobeet/flyer_2_125_125.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;-- Post From My iPhone&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-5188271486813286996?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/5188271486813286996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/12/symfony-12-now-available-in-shops.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/5188271486813286996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/5188271486813286996'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/12/symfony-12-now-available-in-shops.html' title='Symfony 1.2, now available in shops!'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-8160233371625753908</id><published>2008-12-02T16:13:00.000+08:00</published><updated>2008-12-03T09:06:51.499+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Auditorium: a game for sound engineer</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HlYBk55Czxc/STTuRbAX-tI/AAAAAAAAAoY/R5DTc_v1_kI/s1600-h/autitorium.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 146px;" src="http://3.bp.blogspot.com/_HlYBk55Czxc/STTuRbAX-tI/AAAAAAAAAoY/R5DTc_v1_kI/s200/autitorium.jpg" alt="" id="BLOGGER_PHOTO_ID_5275103046632209106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.playauditorium.com/"&gt;Auditorium&lt;/a&gt; is a simple but quite unique online game. You have to guide the sound to reach the right part of the auditorium.&lt;br /&gt;I am not a gamer at all, but this game is quite interesting to me. Give it a try.&lt;br /&gt;&lt;a href="http://www.playauditorium.com/"&gt;http://www.playauditorium.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-8160233371625753908?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/8160233371625753908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/12/auditorium-game-for-sound-engineer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/8160233371625753908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/8160233371625753908'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/12/auditorium-game-for-sound-engineer.html' title='Auditorium: a game for sound engineer'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_HlYBk55Czxc/STTuRbAX-tI/AAAAAAAAAoY/R5DTc_v1_kI/s72-c/autitorium.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-6097325264143339380</id><published>2008-11-25T11:18:00.000+08:00</published><updated>2008-11-25T11:47:59.070+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>No limit for Firefox</title><content type='html'>This is simple but brilliant!  Alex made what he called "FoxGlove", it is a portable Firefox 3.0 based, fully customized to better integrate with all Google Apps such as Gmail, GCal, Docs, GTalk, Notebook and so on. It is very easy to take on a USB key everywhere. It also integrate a Google Chrome-like theme and you can have several versions with different Google Accounts open at the same time. Indeed it is very very usefull...at least for me ;-)&lt;br /&gt;&lt;br /&gt;Why Google did not think about this before?&lt;br /&gt;Defenitively there is no limit to Firefox customization power!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cache.gawker.com/assets/images/lifehacker/2008/11/foxglove.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 390px; height: 241px;" src="http://cache.gawker.com/assets/images/lifehacker/2008/11/foxglove.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lifehacker.com/5097728/foxglove-standalone-google-apps-portal"&gt;http://lifehacker.com/5097728/foxglove-standalone-google-apps-portal&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-6097325264143339380?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/6097325264143339380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/11/no-limit-for-firefox.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/6097325264143339380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/6097325264143339380'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/11/no-limit-for-firefox.html' title='No limit for Firefox'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-9161732953830153682</id><published>2008-11-24T13:01:00.000+08:00</published><updated>2008-11-24T13:09:21.247+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>iPhone 2.2, my view</title><content type='html'>As everybody I upgraded to iPhone OS 2.2 during the week-end. No big stuff for me, only minor changes. Yes I am aware we now have Google Maps Streetview, we can download podcast directly (although you can not subscribe to podcast but only download one episode), have some changes in Safari UI and so on.&lt;br /&gt;BUT, what I noticed, and this is a big fix for me: caller ID is now working fine for me...Mr iPhone should have read my blog ;-)  The problem before was for all phone number that I input with the country code in a format +Countrycode ... It could not regognize them when the person call me. Now it seems working fine, this is a really usefull fix.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-9161732953830153682?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/9161732953830153682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/11/iphone-22-my-view.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/9161732953830153682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/9161732953830153682'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/11/iphone-22-my-view.html' title='iPhone 2.2, my view'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-5296699005063692029</id><published>2008-11-19T22:30:00.001+08:00</published><updated>2008-11-24T13:11:23.715+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>iPhone compare to the Stone Age</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos-h.ll.facebook.com/photos-ll-snc1/v345/40/97/504040060/n504040060_4353879_6370.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 407px; height: 361px;" src="http://photos-h.ll.facebook.com/photos-ll-snc1/v345/40/97/504040060/n504040060_4353879_6370.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Don't make me regret my purchase :-(&lt;br /&gt;Actually I never used MMS or videocall and I really don't care. It is true that I would like to see video recording (I am sure this will come soon or later) and changeable memory cards (this one will probably never come).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-5296699005063692029?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/5296699005063692029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/11/iphone-compare-to-stone-age.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/5296699005063692029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/5296699005063692029'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/11/iphone-compare-to-stone-age.html' title='iPhone compare to the Stone Age'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-8719321804088406808</id><published>2008-11-15T09:45:00.000+08:00</published><updated>2008-11-14T12:55:32.102+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Firefox 3 rocks</title><content type='html'>No, it's not new! But I realized not long ago that I do not use anymore Safari on my Mac. The integration with MacOS is now really good, not petfect though: I am still missing integration with Keychain (Mac password manager). I wish also a simple way to sync bookmarks between Safari and Firefox since we will not get Firefox on iphone any time soon.&lt;br /&gt;The 2 most useful new features for me as a user are:&lt;br /&gt;- The new "awesome bar", it changes the way I search my bookmarks and history&lt;br /&gt;- Tags on bookmarks: I don't organize my bookmarks into folders, I just mark them with relevant tags, it's much more convenient.&lt;br /&gt;And more is to come on the upcoming 3.1...&lt;br /&gt;&lt;br /&gt;-- Post From My iPhone&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-8719321804088406808?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/8719321804088406808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/11/firefox-3-rocks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/8719321804088406808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/8719321804088406808'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/11/firefox-3-rocks.html' title='Firefox 3 rocks'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-8785505453912168278</id><published>2008-11-13T11:41:00.000+08:00</published><updated>2008-11-14T12:59:06.897+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><category scheme='http://www.blogger.com/atom/ns#' term='orm'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Starting with Doctrine ORM</title><content type='html'>Preparing myself to switch from Symfony 1.0 to Symfony 1.2 as my default framework, I started to read the &lt;a href="http://www.doctrine-project.org/documentation/manual/1_0"&gt;Doctrine documentation&lt;/a&gt; to get familiar with it - I used Propel as default ORM in Symfony before. I bet I am not the only one in the community...&lt;br /&gt;&lt;br /&gt;I have not yet reached the end but I cannot resist to share my feeling about this amazing piece of code. As a symfony developer I do not need to read all Doctrine documentation since a lot of things are automatically generated thanks to the tied integration between the 2 frameworks.&lt;br /&gt;&lt;br /&gt;Since I was used to Propel behaviors and installed in most of my projects some pretty standard plugins to create behaviors such as: Slug, Versionning, Nested set, Tags... I came to realize that most of those plugins are actually part of Doctrine out-0f-the-box! Just an example from the documentation to create a simple wiki with i18n (internationalization), slug, search and versionning (it could be apply as well to a CMS or whatever you wants):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;WikiTest:&lt;br /&gt;actAs:&lt;br /&gt; I18n:&lt;br /&gt;   fields: [title, content]&lt;br /&gt;   actAs:&lt;br /&gt;     Versionable:&lt;br /&gt;       fields: [title, content]&lt;br /&gt;     Searchable:&lt;br /&gt;       fields: [title, content]&lt;br /&gt;     Sluggable:&lt;br /&gt;       fields: [title]&lt;br /&gt;columns:&lt;br /&gt; title: string(255)&lt;br /&gt; content: string&lt;/code&gt;&lt;/pre&gt;Even thought I will propably prefered to use Lucene for the search part, all the rest is amazing: just a few lines in your schema.yml files and "hop!" you got everything ready (I don't even mentioned that you actually nest those behaviors here...). They even have a "Geographical" behavior that I definitively want to test later.&lt;br /&gt;It is also more readable and make more sens - to me at least- to define behaviors in the schema.yml file rather than in each class of the model.&lt;br /&gt;&lt;br /&gt;There is no doubt, Doctrine is a good move! And remember: I am just talking about behaviors here, there are much more things in the documentation...I still need to go to read them...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-8785505453912168278?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/8785505453912168278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/11/starting-with-doctrine-orm.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/8785505453912168278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/8785505453912168278'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/11/starting-with-doctrine-orm.html' title='Starting with Doctrine ORM'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-2728492151043867987</id><published>2008-11-12T15:50:00.000+08:00</published><updated>2008-11-19T22:29:58.639+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><title type='text'>Ocarina</title><content type='html'>This is really what I call creativity on iPhone ;-)&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/kfrONZjakRY&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;embed src="http://www.youtube.com/v/kfrONZjakRY&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" height="344" width="425"&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/408361410820097976-2728492151043867987?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/2728492151043867987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/11/ocarina.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/2728492151043867987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/2728492151043867987'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/11/ocarina.html' title='Ocarina'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-6243861691088802879</id><published>2008-11-12T15:30:00.001+08:00</published><updated>2008-11-12T15:31:38.075+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='study'/><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>iPhone usage study</title><content type='html'>A very interesting study on how people use their iPhone and how to improve application based on this study.&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_717805"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/createwithcontext/how-people-really-use-the-iphone-presentation?type=powerpoint" title="How people really use the iPhone"&gt;How people really use the iPhone&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=cwchowpeopleuseiphone-1225738539763858-9&amp;stripped_title=how-people-really-use-the-iphone-presentation" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=cwchowpeopleuseiphone-1225738539763858-9&amp;stripped_title=how-people-really-use-the-iphone-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View SlideShare &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/createwithcontext/how-people-really-use-the-iphone-presentation?type=powerpoint" title="View How people really use the iPhone on SlideShare"&gt;presentation&lt;/a&gt; or &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/upload?type=powerpoint"&gt;Upload&lt;/a&gt; your own. (tags: &lt;a style="text-decoration:underline;" href="http://slideshare.net/tag/development"&gt;development&lt;/a&gt; &lt;a style="text-decoration:underline;" href="http://slideshare.net/tag/interaction"&gt;interaction&lt;/a&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/408361410820097976-6243861691088802879?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/6243861691088802879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/11/how-people-really-use-iphone-view.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/6243861691088802879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/6243861691088802879'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/11/how-people-really-use-iphone-view.html' title='iPhone usage study'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-2288751912570495224</id><published>2008-11-12T11:24:00.000+08:00</published><updated>2008-11-24T13:12:43.508+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='voice'/><category scheme='http://www.blogger.com/atom/ns#' term='im'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Gmail got voice and video</title><content type='html'>They never sleep in Googleplex! They launched yesterday video and voice chat within gmail. I am eager to test this live. It will for sure shake the all IM market that was not very innovative lately. I like that, we are going to see innovation again in this area hopefully ;-)&lt;br /&gt;Don't forget, you need to install a plugin first.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/mail/help/videochat/learnmore.html"&gt;http://www.google.com/mail/help/videochat/learnmore.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-2288751912570495224?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/2288751912570495224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/11/gmail-got-voice-and-video.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/2288751912570495224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/2288751912570495224'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/11/gmail-got-voice-and-video.html' title='Gmail got voice and video'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-7742962051742390205</id><published>2008-11-10T11:32:00.000+08:00</published><updated>2008-11-10T15:36:38.291+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photo'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Timor'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>What kind of camera is this?</title><content type='html'>I had the surprise to get these photos with my iphone camera:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://picasaweb.google.com/lh/photo/tUHuxC3Qszv_9J-afz-BUA"&gt;&lt;img src="http://lh4.ggpht.com/_HlYBk55Czxc/SRfAk6GxEvI/AAAAAAAAAm4/TEBdr189-90/s288/iphone_photo.jpg" border="0" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;is my iphone kind of schizophrenic?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://picasaweb.google.com/lh/photo/gEpIzfTXAcHiYedn4gji8g"&gt;&lt;img src="http://lh6.ggpht.com/_HlYBk55Czxc/SRfAmvt0a9I/AAAAAAAAAm8/e_jK3Pm1Grg/s288/iphone_photo.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Yes indeed, I found a new "features" in my iPhone: "adding wind" to your photo!&lt;br /&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;What kind of strange distortion!&lt;br /&gt;Anyone got that effect before?&lt;br /&gt;&lt;br /&gt; -- Post From My iPhone&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-7742962051742390205?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/7742962051742390205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/11/what-kind-of-camera-is-this.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/7742962051742390205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/7742962051742390205'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/11/what-kind-of-camera-is-this.html' title='What kind of camera is this?'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_HlYBk55Czxc/SRfAk6GxEvI/AAAAAAAAAm4/TEBdr189-90/s72-c/iphone_photo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-205841296574402249</id><published>2008-10-29T10:41:00.000+08:00</published><updated>2008-10-29T10:50:52.530+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photo'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>CAIR and Seam  Carving GUI</title><content type='html'>I discovered this app "&lt;a href="http://www.gabeiscodingstatic.com/contentawareimageresizing-seamcarving"&gt;Seam Carving GUI&lt;/a&gt;" - what a name! This is an open source, all platforms software to manipulate your photos based on the CAIR library (CAIR stands for Content Aware Image Resizing). This is simply amazing stuff! You can resize images (stretched,...) and remove elements of your photo (you know, the guy in the background of your beautiful photo).&lt;br /&gt;&lt;br /&gt;From this:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.gabeiscodingstatic.com/original.jpg/original-large.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 420px; height: 253px;" src="http://www.gabeiscodingstatic.com/original.jpg/original-large.jpg" alt="" border="0" /&gt;&lt;/a&gt;To this (remove small fish and stretched):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.gabeiscodingstatic.com/stretched.jpg/stretched-large.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 420px; height: 162px;" src="http://www.gabeiscodingstatic.com/stretched.jpg/stretched-large.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This is the kind of app that can really change a photo from good to best.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-205841296574402249?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/205841296574402249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/10/cair-and-seam-carving-gui.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/205841296574402249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/205841296574402249'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/10/cair-and-seam-carving-gui.html' title='CAIR and Seam  Carving GUI'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-9042766729806067157</id><published>2008-10-28T22:58:00.000+08:00</published><updated>2008-10-28T22:51:11.808+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Iphone ...after 2 months</title><content type='html'>After 2 months, I believe it is time to share my "2 cents" on my days with Mr iPhone. I can say that the iPhone change the way I use the Internet...not the way I use a phone! So when Steve Jobs mentioned that their netbook is actually the iphone, I kind of agree with him (although the keyboard is still a huge difference).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What I don't like.&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;On the phone side, the Caller ID system is not working. I usually input all phone numbers with a + sign and the country code before because I do not like to edit a number when I am overseas. But my iPhone is not capable to identify local numbers against their complete number (including +country-code)...this is so annoying, I cannot believe they haven't fix this yet, come on Apple!&lt;/li&gt;&lt;li&gt;On the music side, the sound quality. If you are using only your iphone/ipod to listen your music, this is ok but as soon as you start to test or use another mp3 player such as the chinese Meizu, there you will find the difference and it is going to be very difficult to go back to your iphone. &lt;/li&gt;&lt;li&gt;Of course the battery life is too short, but everybody knows this, and I realise that I do not use only a phone but an mp3/mp4 player, a GPS and a computer, therefore my usage increase a lot compare to my previous phones.&lt;/li&gt;&lt;li&gt;Sometimes -I noticed this specially when I lost the signal- the iphone can hang for at least one minute before I can do anything.&lt;/li&gt;&lt;li&gt;I hate Apple restriction to publish or reject applications...Long life to Cydia &amp;amp; Co.&lt;/li&gt;&lt;/ol&gt;On the bright side:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I was also very surprise by the pretty good quality of the small 2Mb camera.&lt;/li&gt;&lt;li&gt;Apps, apps, apps. Amazing apps available from the Store.&lt;/li&gt;&lt;li&gt;Apps that I enjoyed currently (this kind of list tend to change over time):&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;YouNote&lt;/li&gt;&lt;li&gt;BlogPress&lt;/li&gt;&lt;li&gt;Byline&lt;/li&gt;&lt;li&gt;Google Earth&lt;/li&gt;&lt;li&gt;Facebook&lt;/li&gt;&lt;li&gt;Twitterific&lt;/li&gt;&lt;li&gt;LinkedIn&lt;/li&gt;&lt;li&gt;Fring&lt;/li&gt;&lt;li&gt;Measures&lt;/li&gt;&lt;li&gt;Shazam&lt;/li&gt;&lt;li&gt;NYTimes&lt;/li&gt;&lt;li&gt;Runkeeper, Fitnio and Trailguru (I am not sure which one is the best for me yet on this section)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;1. BlogPress&lt;br /&gt;&lt;br /&gt;An iphone app to write/manage your blogs (I actually use it to write this post). Very powerful and simple to use, it can integrated with a lot of different popular blog systems. I found that it is easier for me to blog with this app rather than on my computer. Not that it is easier to use the very small iPhone keyboard but you can blog when you have time, without a computer, and for this BlogPress is worth the money (yes, it is not free. I paid 2.99$ during their discount period but I believe the normal price is 9.99$).&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://picasaweb.google.com/lh/photo/Hn0FdfUTd75rG8SkDWLUvQ"&gt;&lt;img src="http://lh5.ggpht.com/gestadieu/SQcfb_q6sQI/AAAAAAAAAmI/Lpqra7xPG-M/s288/iphone_photo.jpg" border="0" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;2. Byline&lt;br /&gt;Probably the application I use the most. This is a RSS Reader for your Google Reader account, it synchronizes perfectly, allows offline reading and even have your "starred" post. It is 3.99$ but definitively worth the money for me. I used before NetNewsWire from Newsgator, a free app, and it was good too but I really prefer to have an app integrated with Google Reader.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://picasaweb.google.com/lh/photo/6eHBQsgvsKuufV1pMqr6Og"&gt;&lt;img src="http://lh3.ggpht.com/gestadieu/SQcfdPj3M9I/AAAAAAAAAmM/uaOp6P1PUeM/s288/iphone_photo.jpg" border="0" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;3. Google Earth - yes it is free!&lt;br /&gt;Just arrived a few days ago and simply well done, as everybody said "the earth in your hand". When you do a search, it also conveniently list your matched contact from your iPhone address book, nice Mr Google ;-)&lt;br /&gt;No need to mention GPS integration and gestures to zoom, move around,etc... too obvious!&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;/center&gt;&lt;div style="text-align: center;"&gt;&lt;center&gt;&lt;center&gt;&lt;a href="http://picasaweb.google.com/lh/photo/nDtLg3XnT3klTdCYBDn_1g"&gt;&lt;img src="http://lh4.ggpht.com/gestadieu/SQcfeLm0FVI/AAAAAAAAAmQ/1v3tyIwM7j4/s288/iphone_photo.jpg" border="0" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;a href="http://picasaweb.google.com/lh/photo/-LrNvuB25nA_FW26rWObDw"&gt;&lt;img src="http://lh3.ggpht.com/gestadieu/SQcffhmdGCI/AAAAAAAAAmU/u7plOH0kI9Y/s288/iphone_photo.jpg" border="0" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;4. Measures&lt;br /&gt;A new comer for me. It is a beautiful app for converting anything into something else! It even includes a currency converter with Macau Patacas (not common indeed)!&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://picasaweb.google.com/lh/photo/4_8evzDTV_uk7B0SH0fpOg"&gt;&lt;img src="http://lh3.ggpht.com/gestadieu/SQcfi4W0-SI/AAAAAAAAAmY/UHF-qBdQI74/s288/iphone_photo.jpg" border="0" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;-- Post From My iPhone (and finalize online...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-9042766729806067157?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/9042766729806067157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/10/iphone-after-2-months.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/9042766729806067157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/9042766729806067157'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/10/iphone-after-2-months.html' title='Iphone ...after 2 months'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/gestadieu/SQcfb_q6sQI/AAAAAAAAAmI/Lpqra7xPG-M/s72-c/iphone_photo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-7030728950148070955</id><published>2008-10-28T16:03:00.000+08:00</published><updated>2008-10-28T16:11:08.238+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='censorship'/><category scheme='http://www.blogger.com/atom/ns#' term='china'/><title type='text'>Free virtual trip to China</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://chinachannel.hk/pix/chinese_ff_logo.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 114px; height: 109px;" src="http://chinachannel.hk/pix/chinese_ff_logo.jpg" alt="" border="0" /&gt;&lt;/a&gt;Some guys got strange ideas sometimes... They have developed a Firefox add-0n to allow you to surf the web like if you were behind the "Great Firewall of China". Yes, you read it well! You can now experience the amazing feeling to see how is the Internet from a chinese point-of-view ;-)&lt;br /&gt;Enjoy the experience being block for any kind of pretty common websites! Welcome to &lt;a href="http://chinachannel.hk/"&gt;China Channel Firefox Addon&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Seriously, this can show you how bad the censorship is in China, and for webmaster a good way to test if their websites are censored by our best friend.&lt;br /&gt;Talking about this, I presume my blog is going to be banned as well...&lt;br /&gt;&lt;br /&gt;Enjoy your FREEDOM.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-7030728950148070955?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/7030728950148070955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/10/free-virtual-trip-to-china.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/7030728950148070955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/7030728950148070955'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/10/free-virtual-trip-to-china.html' title='Free virtual trip to China'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-408361410820097976.post-2061158116438435859</id><published>2008-10-24T12:43:00.001+08:00</published><updated>2008-10-28T22:50:51.380+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>My iPhone very own record!</title><content type='html'>The iPhone is well known to have a pretty short battery life. This is BAD! But, don't forget that usually you use an iPhone almost like an EeePC rather than like a standard mobile phone.&lt;br /&gt;I could run my iPhone for more than 3 days without recharging, not bad at all as I was using the 3G for web browsing, rss feeds. Wifi and Location off.&lt;br /&gt;&lt;br /&gt;What about you?&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/gestadieu/SQFSaySnioI/AAAAAAAAAkc/rTSRl0J20L0/2-6.png" /&gt;&lt;br /&gt;&lt;br /&gt;Posted with &lt;a href="http://lifecast.sleepydog.net/"&gt;LifeCast&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/408361410820097976-2061158116438435859?l=gestadieu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gestadieu.blogspot.com/feeds/2061158116438435859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gestadieu.blogspot.com/2008/10/posted-with-lifecast.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/2061158116438435859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/408361410820097976/posts/default/2061158116438435859'/><link rel='alternate' type='text/html' href='http://gestadieu.blogspot.com/2008/10/posted-with-lifecast.html' title='My iPhone very own record!'/><author><name>estadieu</name><uri>http://www.blogger.com/profile/01733729200659602893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/gestadieu/SQFSaySnioI/AAAAAAAAAkc/rTSRl0J20L0/s72-c/2-6.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
