<?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-26409911</id><updated>2011-04-21T17:03:19.513-07:00</updated><category term='ruby'/><category term='xml'/><category term='flash'/><category term='javascript'/><category term='mysql'/><category term='ajax'/><category term='nginx'/><category term='html'/><category term='mongrel'/><category term='rails'/><category term='Mac'/><category term='ror'/><category term='ria'/><category term='adobe'/><category term='apollo'/><category term='capistrano'/><category term='flex'/><title type='text'>Jurassic Geek Weblog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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>48</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-26409911.post-4713523173798258247</id><published>2007-10-16T11:55:00.000-07:00</published><updated>2007-10-16T11:58:35.543-07:00</updated><title type='text'>This blog has moved.</title><content type='html'>For all people coming regularly on this blog....this blog has moved to &lt;a href="http://www.laurentbois.com/"&gt;http://www.laurentbois.com/&lt;/a&gt; .&lt;br /&gt;Please update your bookmarks and your RSS aggregator.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-4713523173798258247?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/4713523173798258247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=4713523173798258247' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/4713523173798258247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/4713523173798258247'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/10/this-blog-has-moved.html' title='This blog has moved.'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-3578857043097436793</id><published>2007-09-15T23:00:00.000-07:00</published><updated>2007-09-15T23:02:32.998-07:00</updated><title type='text'>Top 10 little-known GMail features</title><content type='html'>Sur le blog de Google Mail , 2 articles rappelant quelques fonctionnalites bien utiles de GMail&lt;br /&gt;- Lire &lt;a href="http://gmailblog.blogspot.com/2007/08/top-10-little-known-gmail-features-part.html"&gt;ici&lt;/a&gt; la 1ere Partie&lt;br /&gt;- Lire &lt;a href="http://gmailblog.blogspot.com/2007/09/top-10-little-known-gmail-features-part.html"&gt;ici&lt;/a&gt; la seconde partie&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-3578857043097436793?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/3578857043097436793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=3578857043097436793' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/3578857043097436793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/3578857043097436793'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/09/top-10-little-known-gmail-features.html' title='Top 10 little-known GMail features'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-3541410957590252946</id><published>2007-09-15T22:53:00.000-07:00</published><updated>2007-09-15T22:55:04.990-07:00</updated><title type='text'>Hack The iPod Touch</title><content type='html'>Alors que les premiers iPod Touch arrivent aux Etats Unis, voila que les applications manquantes (et presentes sur l'iPhone) sont deja installables.&lt;br /&gt;&lt;br /&gt;Il s'agit de : Mail, Google Maps, Stocks &amp;amp; Weather..et tout ca grace au Jailbreak.&lt;br /&gt;&lt;br /&gt;Bien sur , la vitesse a laquelle cela est arrive est tout bonnement du a une bonne capitalisation du travail effectue depuis des semaines sur l'iPhone.&lt;br /&gt;&lt;br /&gt;Pour ceux qui hesitaient encore , parce que l'iPod Touch bien que ressemblant a l'iPhone, etait plutot un iPhone allege, desormais voila le probleme regle. Aujourd'hui le iPod Touch est un iPhone , sans le phone... chose qu'on avait encore entre nos mains jusqu'au desimlockage.&lt;br /&gt;&lt;br /&gt;D'ailleurs, un sondage pourrait etre lance &amp;gt;&lt;br /&gt;&lt;br /&gt;Preferez vous avoir un excellent telephone et un iPod Touch "hacke" ou un iPhone.&lt;br /&gt;&lt;br /&gt;Tout sur &lt;a href="http://www.hacktheipodtouch.com/"&gt;hacktheipodtouch.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-3541410957590252946?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/3541410957590252946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=3541410957590252946' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/3541410957590252946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/3541410957590252946'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/09/hack-ipod-touch.html' title='Hack The iPod Touch'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-3976105467548398711</id><published>2007-09-12T00:42:00.000-07:00</published><updated>2007-09-12T00:43:54.148-07:00</updated><title type='text'>Free Unlock iPhone software</title><content type='html'>&lt;img src="http://macapper.com/wp-content/uploads/2007/09/iphone-unlock-software.png" alt="Free iPhone Unlock software" height="140" width="300" /&gt;&lt;br /&gt;&lt;br /&gt;Ca y est, ils l'ont fait.&lt;br /&gt;&lt;br /&gt;Après l'annonce en fanfare de la fin de semaine dernière par l'équipe de IPhoneSIMFree sur la certification que leur logiciel (payant) permettant de désimlocker l'iPhone ( &lt;a href="http://gizmodo.com/gadgets/apple/iphone-software-unlock-confirmed-on-video-297651.php"&gt;vidéo Gizmodo&lt;/a&gt; et &lt;a href="http://mac.blogdig.net/archives/articles/September2007/10/Engadget__iPhoneSIMfree_Unlocking_Video.html#31862912614bc1b53a024fdb78ac2e4d"&gt;Engadget&lt;/a&gt;), l'équipe de &lt;a href="http://www.hackint0sh.org/forum/indexpage.php"&gt;Hackint0sh&lt;/a&gt; a mis à disposition cette nuit le "hack du hack".&lt;br /&gt;&lt;br /&gt;Pour la petite histoire, ce qui a motivé Hackint0sh est tout simplement de contrer &lt;a href="http://www.iphonesimfree.com/cgi-bin/iphonesimfree/engine.pl?page=home"&gt;IPhoneSIMFree&lt;/a&gt; dans son élan d'enrichissement : la méthode de IPhoneSIMFree pour vendre son logiciel étant de repasser par des revendeurs, en leur vendant des lots de licences. Ces revendeurs revendent ensuite à l'unité ces licences à l'utilisateur final de l'iPhone.  Ainsi tout problème juridique potentiel aurait lieu entre Apple/AT&amp;amp;T et ces revendeurs.&lt;br /&gt;&lt;br /&gt;De plus, il faut savoir qu'il fallait enregistrer son iPhone sur un serveur (IMEI code, Serial Number de l'iPhone, Transaction ID Paypal) au préalable. Ensuite, lors de la procédure de désimlockage , le logiciel iPhoneSIMFree se connecte à ce serveur : une vérification contre la base de données est faite (pour vérifier que l'utilisateur a payé) et un bout de code essentiel pour le désimlockage est téléchargé.&lt;br /&gt;&lt;br /&gt;Le hic dans tout ca est que :&lt;br /&gt;&lt;br /&gt;- iPhoneSIMFree n'est qu'un client graphique finalement puisque : le iPhone doit être activé, jailbreaké (cela n'est possible qu'avec les logiciels sous licence &lt;strong&gt;GPL&lt;/strong&gt; de Hackint0sh) et pire, d'après le wiki Hackint0sh et ce qu'il s'est dit sur l'IRC, le bout de code téléchargé serait tout simplement un code repris à &lt;a href="http://www.youtube.com/watch?v=tvJ1RGlxe8Q"&gt;George Hotz&lt;/a&gt;, le jeune Hacker du New Jersey qui avait désimlocké son iphone.  Le hack s'appuie également sur un bug de l'iPhone.&lt;br /&gt;&lt;br /&gt;Tous les logiciels nécessaires à cette opération sont disponibles...y a plus qu'à essayer.&lt;br /&gt;&lt;br /&gt;Bien sûr, la question se pose toujours sur la perennité de ce hack. L'alternative par la TurboSIM s'avèrerait plus résistante (bien qu'elle peut tout de même être contrée par Apple à terme).&lt;br /&gt;&lt;br /&gt;Tout le monde en parle sur :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://forum.frenchiphone.com/index.php?topic=528.0"&gt;FrenchIPhone&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://iphonejtag.blogspot.com/"&gt;Blog de George Hotz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://iphone.unlock.no/"&gt;Unlock.no&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://macapper.com/2007/09/11/download-iphone-unlock/"&gt;Macapper.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.macbidouille.com/news/2007-09-12/#14934"&gt;MacBidouille&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pour information (merci M-L), l'iPhone en import des US est disponible en Suisse chez &lt;a href="http://www.nextway.ch/product_info.php/products_id/6127"&gt;Nextway.ch&lt;/a&gt;, ainsi que la &lt;a href="http://www.nextway.ch/product_info.php/products_id/6187"&gt;TurboSIM&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-3976105467548398711?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/3976105467548398711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=3976105467548398711' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/3976105467548398711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/3976105467548398711'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/09/free-unlock-iphone-software.html' title='Free Unlock iPhone software'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-7308940040218234145</id><published>2007-09-09T02:20:00.000-07:00</published><updated>2007-09-09T02:24:39.909-07:00</updated><title type='text'>Pré commande Leopard sur Amazon</title><content type='html'>Juste une petite news pour signaler que Mac OS X Leopard ( dispo fin octobre) peut être pré commandé sur Amazon.&lt;br /&gt;La licence est au prix de 129 dollars, le Family Pack (pour ceux qui ont plusieurs Mac) est au prix de 199 dollars.&lt;br /&gt;&lt;br /&gt;Nota : une rebate de 20 dollars pour ceux qui achetent conjointement avec Leopard (Licence unique/family Pack) Parallels Desktop 3.0&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-7308940040218234145?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/7308940040218234145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=7308940040218234145' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/7308940040218234145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/7308940040218234145'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/09/pr-commande-leopard-sur-amazon.html' title='Pré commande Leopard sur Amazon'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-5058245971175535042</id><published>2007-09-08T23:56:00.001-07:00</published><updated>2007-09-09T00:00:13.568-07:00</updated><title type='text'>Apple Keynote on 5 sept.</title><content type='html'>Apple Keynote last wednesday has been rich in term of news.&lt;br /&gt;&lt;br /&gt;First concerning iTunes :&lt;br /&gt;People like create their ringtones. Now it will be possible through iTunes. Users could create ringtones for the iPhone from tracks bought on iTunes Music Store.&lt;br /&gt;&lt;br /&gt;iPod shuffle : no big changes. More colors available.&lt;br /&gt;&lt;br /&gt;iPod nano : &lt;br /&gt;&lt;br /&gt;- Nike compatible&lt;br /&gt;- storage x2 for the same price&lt;br /&gt;- 149$ for ipod nano 4GO&lt;br /&gt;- 199$ for ipod nano 8GO&lt;br /&gt;&lt;div&gt;- Videos&lt;br class="webkit-block-placeholder"&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;- slideshow of photos with music&lt;/div&gt;&lt;div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;- CoverFlow (a little bit slow, comparing to iPhone) but very impressive.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;iPod Classic :&lt;br /&gt;- Now there is 160 GB for the biggest model, and it's very impressive. 80GB for the first model&lt;br /&gt;- Coverflow&lt;br /&gt;- thin, all metal, black and grey&lt;br /&gt;&lt;br /&gt;NEW : iPod Touch&lt;br /&gt;- same size than iPhone, same screenplay, thin (8mm against 11mm for the iPhone)&lt;br /&gt;- same icons/widgets than iphone&lt;br /&gt;- same interface than iPhone for the music.&lt;br /&gt;- Coverflow&lt;br /&gt;- wifi&lt;br /&gt;- Flash memory&lt;br /&gt;- movement detector.&lt;br /&gt;- 299 USD for the 8gigs, 399 USD for the 16 gigs&lt;br /&gt;- Safari, YouTube, Calculator, Calendar, Contacts, Clock applications (where is Mail?)&lt;br /&gt;- Powered by Mac OS X.&lt;br /&gt;&lt;br /&gt;iTunes WiFi Music Store :&lt;br /&gt;It's a light version of iTunes for iPod Touch and iPhone . &lt;br /&gt;- you could access iTunes Music Store, buy and download songs directly on your mobile device.&lt;br /&gt;&lt;br /&gt;Finally , the big news is a drop price for the iPhone 8gigs : 599 USD to 399 USD. Bad day for iPhone early adopters :-( (i'm an early adopter)&lt;br /&gt;Apple does a price adjustment for an iPhone bought in the 14 days before the KeyNote (5 sept.).&lt;br /&gt;Apple gives a coupon of 100 USD for people having bought their iPhone between 29th of June and the 5th of september.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-5058245971175535042?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/5058245971175535042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=5058245971175535042' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/5058245971175535042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/5058245971175535042'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/09/apple-keybote-on-5-sept.html' title='Apple Keynote on 5 sept.'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-8291421476459701850</id><published>2007-08-27T07:28:00.000-07:00</published><updated>2007-08-29T06:16:07.112-07:00</updated><title type='text'>"Getting real" Part One</title><content type='html'>Do you really know how to make a project successful? &lt;br /&gt;&lt;br /&gt;Let's speak about an excellent book delivered by the RoR team (the same who successfully released Basecamp, Tada List, Backpack, Writeboard, Campfire and Highrise) : "&lt;a href="http://gettingreal.37signals.com/"&gt;Getting Real&lt;/a&gt;" by the 37signals Team.&lt;br /&gt;&lt;br /&gt;I'm really convinced today about the good practices related into this book.&lt;br /&gt;By experience, many projects i participated on, applied exactly the opposite of "Getting Real"...all these projects have never been released on time and on budget or worth, nothing has been released at all. Most of these projects had in common a management by contract, long-term specification phase, customers unhappy after the (long) period of specs + development (their needs has changed in the interval), release more than competitors and all the features in version 1.0, too much bureaucracy, too much meetings, too much politics, too many project managers.&lt;br /&gt;&lt;br /&gt;I will write 3 articles about the "Getting Real" book : i'll try to deliver a shrink  overview by extracting lines from chapters of the book, being to my eyes some essential points that can help you in order to make a project real : release a quality product satisfying your customers.&lt;br /&gt;The goal of these articles is also to give you the envy to read the original book (including many essays): it can be bought as a &lt;a href="https://gettingreal.37signals.com/purchases/new"&gt;PDF&lt;/a&gt; or &lt;a href="http://www.lulu.com/content/383343"&gt;paper Back&lt;/a&gt;, or read &lt;a href="http://gettingreal.37signals.com/toc.php"&gt;freely online&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;** The starting line **&lt;br /&gt;&lt;br /&gt;* Build less *&lt;br /&gt;&lt;br /&gt;One first key point is "underdo your competitors". Many think you beat your competitors if you one-up them. If they have 4 features, you should deliver 5, 15 or 25 more. But this kind of defensive, paranoid and expensive way to build products should be forget. By doing this, you can't think ahead, but behind...so you don't lead but follow.&lt;br /&gt;&lt;br /&gt;The answer is : do less.&lt;br /&gt;&lt;br /&gt;Less features, Less options/preferences, less  people and corporate structures, less meetings and abstractions, less promises&lt;br /&gt;&lt;br /&gt;* Build software for yourself *&lt;br /&gt;&lt;br /&gt;Solve your own problems. By doing this you're the target audience, and you'll know what's important and what's not.&lt;br /&gt;&lt;br /&gt;* Constraints drive innovation *&lt;br /&gt;&lt;br /&gt;Constraints force you to get your idea out in the wild sooner. After one month or two, you've a  pretty good idea if you're onto something or not. If your idea is lemon, it's time to go back (opposed to months or years down the road).&lt;br /&gt;Don't forget : build a quality tool that you &amp; your customers can live with for a long time.&lt;br /&gt;&lt;br /&gt;* Launch on time &amp; on budget *&lt;br /&gt;&lt;br /&gt;To launch on time and on budget : keep them fixed. Don't throw more time and money at a problem, just scale back the scope.&lt;br /&gt;&lt;br /&gt;The myth "Launch on time, on budget and on scope" never happens, and when it does, the quality often suffers.&lt;br /&gt;&lt;br /&gt;Lauching something great that's little smaller in scope than planned is better than launching something mediocre and full of holes.&lt;br /&gt;&lt;br /&gt;* Prioritization *&lt;br /&gt;&lt;br /&gt;You have to figure out what is really important, and what you're going to make for the initial release.&lt;br /&gt;&lt;br /&gt;* Your passion - or lack of - will shine through *&lt;br /&gt;&lt;br /&gt;If your product doesn't excite you, something's wrong. If you're only working on it to cash out, it will show. If you feel passionnately about your app, it will come through in the final product.&lt;br /&gt;&lt;br /&gt;** Stay lean **&lt;br /&gt;&lt;br /&gt;* Less mass *&lt;br /&gt;&lt;br /&gt;The more massive is an object, the more energy is required to change its direction. It's true in the business world as in the physical world.&lt;br /&gt;&lt;br /&gt;For web technology it's also true : changes must be easy and cheap. If you can't change on the fly, you'll lose ground to someone who can.&lt;br /&gt;&lt;br /&gt;Mass is increased by : Long terms contracts, excess staff, permanent decisions, meetings about other meetings, thick process, hard / soft / technologies lock-ins, proprietary data formats, The past ruling the future, Long-Terms roadmaps, office politics.&lt;br /&gt;&lt;br /&gt;Mass is reduced by : Just in time thinking, Multi Tasking team members, embracing constraints, less software &amp; less code, less features, small team size, simplicity, pared down interfaces, open source products, open data formats, open culture that makes it easy to admit mistakes.&lt;br /&gt;&lt;br /&gt;With  less mass, you change of direction quickly. You can react and evolve. You can focus on good ideas and drop the bad ones. You can listen and respond to your customers. You can integrate new technologies now instead of later.&lt;br /&gt;&lt;br /&gt;* Stay flexible *&lt;br /&gt;&lt;br /&gt;if your competitors can change faster than you, you're at huge disadvantage. If changes get too expensive, you're dead.&lt;br /&gt;The ability to change on a dime is one thing small teams have by default that big teams can never have.&lt;br /&gt;Cheap and fast changes are small's secret weapon.&lt;br /&gt;All the cash, all the marketing, all the people in the world can't buy the agility you get from being small.&lt;br /&gt;&lt;br /&gt;* Use a team of 3 for version 1.0 *&lt;br /&gt;&lt;br /&gt;For the first version of your app start with only three people. Start with a developer, a designer, a sweeper (someone who can roam between both worlds).&lt;br /&gt;If you can't build your version with three people, then you either need different people or need to slim down your initial version.&lt;br /&gt;Remember : keep your first version small and tight. You'll quickly get to see if your idea has wings, and, if it does, you'll have a clean, simple base to build on.&lt;br /&gt;&lt;br /&gt;* Differentiate yourself from bigger companies by being personal and friendly *&lt;br /&gt;&lt;br /&gt;A lot of small companies make the mistake of trying to act big. Being small can actually be a huge advantage, especially when it comes to communication.&lt;br /&gt;Small companies enjoy fewer formalities, less bureaucracy, and more freedom. Smaller companies are closer to the customer by default.&lt;br /&gt;&lt;br /&gt;** Priorities **&lt;br /&gt;&lt;br /&gt;* What's the big idea *&lt;br /&gt;&lt;br /&gt;Explicitly define the one-point vision for your app : What does your app stand for? What's it really all about?&lt;br /&gt;&lt;br /&gt;Your vision should be brief too. A sentence should be enough to get the idea across.&lt;br /&gt;&lt;br /&gt;* Ignore details early on *&lt;br /&gt;&lt;br /&gt;Work from large to small.&lt;br /&gt;Success is not the only thing you'll find  in the details.&lt;br /&gt;You'll also find stagnation, disagreement, meetings and delays. These things can kill morale and lower your chances of success.&lt;br /&gt;&lt;br /&gt;Just get the stuff on the page for now. Then use it. Make sure it works. Later on you can adjust and perfect it.&lt;br /&gt;&lt;br /&gt;* It's a problem when it's a problem *&lt;br /&gt;&lt;br /&gt;Don't waste your time on problems you don't have yet.&lt;br /&gt;&lt;br /&gt;Do you need to worry about scaling to 100 000 users today if it will take two years to get there.&lt;br /&gt;&lt;br /&gt;Do you need to hire 8 programmers if you only need 3 today.&lt;br /&gt;&lt;br /&gt;Do you really need 12 top-of-the-line servers now if you can run on two for a year?&lt;br /&gt;&lt;br /&gt;* Hire the right customers *&lt;br /&gt;&lt;br /&gt;Find the core market for your application and focus solely on them.&lt;br /&gt;&lt;br /&gt;The customer is not always right. The truth is that you have to sort out who's right and who's wrong for your app.&lt;br /&gt;&lt;br /&gt;If you try to please everyone, you won't please anyone.&lt;br /&gt;&lt;br /&gt;* Scale later *&lt;br /&gt;You don't have a scaling problem yet.&lt;br /&gt;&lt;br /&gt;In the beginning, make building a solid core product your priority instead of obsessing over scalability and server farms.&lt;br /&gt;&lt;br /&gt;Create a great app and then worry about what to do once it's wildly successful.&lt;br /&gt;&lt;br /&gt;* Make opiniated software *&lt;br /&gt;&lt;br /&gt;The best software has a vision. The best software takes sides.&lt;br /&gt;When someones uses software, they're not just looking for features, they're looking for an approach. They're looking for a vision. &lt;br /&gt;&lt;br /&gt;** Feature selection **&lt;br /&gt;&lt;br /&gt;* Half and not Half-ass *&lt;br /&gt; &lt;br /&gt;Stick to what's truly essential&lt;br /&gt;Take whatever you think your product should be and cut it in half.&lt;br /&gt;Pare features down until you're left with only the essential ones. Then do it again.&lt;br /&gt;&lt;br /&gt;Start off with a lean, smart app, and let it gain traction. Then you can start to add to the solid foundation you've built.&lt;br /&gt;&lt;br /&gt;* Start with No *&lt;br /&gt;The secret to building half a product instead of half-ass product is saying no.&lt;br /&gt;Don't be a yes man:&lt;br /&gt;Every new feature that comes to us meets a no. We listen but don't act. The initial response is « Not now »&lt;br /&gt;If a request feature keeps coming back, that's when we know it's time to take a deeper look. Then, and only then, do we start considering the feature for real.&lt;br /&gt;&lt;br /&gt;* Hidden costs *&lt;br /&gt;&lt;br /&gt;Expose the price of new features.&lt;br /&gt;&lt;br /&gt;For every new feature you need to...&lt;br /&gt;&lt;br /&gt;1.Say no&lt;br /&gt;2.Force the feature to prove its value&lt;br /&gt;3.If 'no' again end here...if yes continue&lt;br /&gt;4.Sketch the screen(s)/UI&lt;br /&gt;5.Design the screen(s)/UI&lt;br /&gt;6.Code it&lt;br /&gt;7.Test tweak test tweak test tweak...&lt;br /&gt;8.Check to see if help text needs to be modified.&lt;br /&gt;9.Update the product tour (if necessary)&lt;br /&gt;10.Update the marketing copy (if necessary)&lt;br /&gt;11.Update the terms of service (if necessary)&lt;br /&gt;12.Check to see if any promises were broken.&lt;br /&gt;13.Check to see if pricing structure is affected&lt;br /&gt;14.Launch&lt;br /&gt;&lt;br /&gt;* Can you handle it *&lt;br /&gt;&lt;br /&gt;Build products and offer services you can manage.&lt;br /&gt;It's easy to make promises. It's much harder to keep them.&lt;br /&gt;Make sure whatever it is that you're doing is something you can actually sustain – organizationally, strategically, financially.&lt;br /&gt;&lt;br /&gt;* Human solutions *&lt;br /&gt;&lt;br /&gt;Build software for general concepts and encourage people to create their own solutions.&lt;br /&gt;Don't force conventions on people. Instead make your software general so everyone can find their own solution.&lt;br /&gt;&lt;br /&gt;* Forget feature requests *&lt;br /&gt;&lt;br /&gt;Let your customers remind you what is important.&lt;br /&gt;Customers want everything under the sun. They'll avalanche you with feature requests. &lt;br /&gt;We'll hear about 'This little extra feature', or 'This can't be hard', or 'Wouldn't it be easy to add it' or 'It should just take a few seconds to put it in' or 'If you added this I'll pay twice as much' etc...&lt;br /&gt;As said before, your first response should be a NO.&lt;br /&gt;Where do you store theses request features? How do you manage them? You don't. Just read them then throw them away.&lt;br /&gt;Don't worry about tracking and saving each request that comes in. Let your customers be your memory. If it's really worth remembering, they'll remind you until you can't forget.&lt;br /&gt;&lt;br /&gt;* Hold the mayo *&lt;br /&gt;&lt;br /&gt;Ask people what they don't want.&lt;br /&gt;More isn't the answer. Sometimes, the biggest favor you can do for customers is to leave something out.&lt;br /&gt;&lt;br /&gt;Finally, about Just Say No (that certainly will shock some readers), listen what Steve Jobs (CEO, Apple) said about innovation.&lt;br /&gt;&lt;br /&gt;* Innovation comes from saying no *&lt;br /&gt;&lt;br /&gt;[Innovation] comes from saying no to 1,000 things to make sure we&lt;br /&gt;don’t get on the wrong track or try to do too much. We’re always&lt;br /&gt;thinking about new markets we could enter, but it’s only by saying no&lt;br /&gt;that you can concentrate on the things that are really important.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-8291421476459701850?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/8291421476459701850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=8291421476459701850' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/8291421476459701850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/8291421476459701850'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/08/getting-real-part-one.html' title='&quot;Getting real&quot; Part One'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-115554992383570796</id><published>2007-08-16T16:21:00.000-07:00</published><updated>2007-08-16T16:26:23.185-07:00</updated><title type='text'>iPhone Remote</title><content type='html'>To finish my evening with iPhone, i've installed iPhoneRemote on the Mac Mini (as Media Center at home).&lt;br /&gt;It's a webserver+ application that enables to control applications of the host machine remotely with the iPhone (connecting by wifi with Safari on https://&lt;Mac Mini IP&gt;:5010&lt;br /&gt;&lt;br /&gt;I launched VLC ..but couldn't then open files :-(&lt;br /&gt;&lt;br /&gt;Finally launched iTunes then used the Remote on the iPhone to play tracks...&lt;br /&gt;&lt;br /&gt;Fun&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm2.static.flickr.com/1123/1142594380_a21a71fe19_m.jpg"/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;img src="http://farm2.static.flickr.com/1214/1141752733_7333414ce1_m.jpg"/&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;img src="http://farm2.static.flickr.com/1309/1141756369_a1b6e2752d_m.jpg"/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-115554992383570796?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/115554992383570796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=115554992383570796' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/115554992383570796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/115554992383570796'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/08/iphone-remote.html' title='iPhone Remote'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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://farm2.static.flickr.com/1123/1142594380_a21a71fe19_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26409911.post-1074291042782770251</id><published>2007-08-16T15:55:00.001-07:00</published><updated>2007-08-16T16:00:31.253-07:00</updated><title type='text'></title><content type='html'>YouTube with WIFI activated for iPhone tonight&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm2.static.flickr.com/1315/1141575867_6242347d5b_m.jpg" /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;img src="http://farm2.static.flickr.com/1002/1142425498_166476b45a_m.jpg" /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;I played with Meebo(.com) for mobile too...works well...&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm2.static.flickr.com/1201/1140734030_fb7e9b1d54_m.jpg"/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-1074291042782770251?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/1074291042782770251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=1074291042782770251' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/1074291042782770251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/1074291042782770251'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/08/youtube-with-wifi-activated-for-iphone.html' title=''/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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://farm2.static.flickr.com/1315/1141575867_6242347d5b_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26409911.post-4861608352074991314</id><published>2007-08-16T13:48:00.001-07:00</published><updated>2007-08-16T13:58:31.859-07:00</updated><title type='text'>iphone binkit</title><content type='html'>Despite not all UNIX commands exist on the iPhone, as a first try it's really nice to be able to navigate into the iPhone filesystem.&lt;br /&gt;There is a mean to add additional commands by downloading the iphone-binkit.&lt;br /&gt;&lt;br /&gt;This kit includes port to iPhone of common UNIX commands:&lt;br /&gt;&lt;br /&gt;/bin:&lt;br /&gt;chroot,dcgen,env,groups,login,nl,ps,setuidgid,shuf,sync,&lt;br /&gt;uname,whoami,base64,cksum,dd,expand,head,logname,od,ptx,sh,&lt;br /&gt;sleep,tac,unexpand,yes,basename,comm,df,expr,hostid,ls,osh,&lt;br /&gt;pwd,sha1sum,sort,tail,uniq,bash,cp,dir,factor,hostname,md5sum,&lt;br /&gt;paste,readlink,sha224sum,split,tee,unlink,cat,csh,dircolors,false,&lt;br /&gt;join,mkdir,pathchk,rm,sha256sum,stat,test,uptime,chgrp,csplit,&lt;br /&gt;dirname,fmt,kill,mkfifo,pinky,rmdir,sha384sum,stty,tr,users,chmod,&lt;br /&gt;cut,ditto,fold,link,mknod,pr,sed,sha512sum,su,true,vdir,chown,date,&lt;br /&gt;echo,install,ln,mv,printf,seq,shred ,sum,tsort,who&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/sbin:&lt;br /&gt;ifconfig, kextstat, kextunload, ping,route&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/usr/bin:&lt;br /&gt;awk, banner, crontab, curl, dropbear, grep,gzip,id,mesg,minicom,nc,nice,nohup,pico,printenv, python.bin,renice,sar,scp,srelay,tar,top,touch,tty,uname,vim,wc&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/usr/sbin:&lt;br /&gt;arp, cron, fdisk, iostat, netstat, sysctl, tcpdump, vipw.&lt;br /&gt;&lt;br /&gt;You can then install what corresponds to your needs...&lt;br /&gt;&lt;br /&gt;SFTP server, SSH Daemon, Apache, SQLlite, Python &amp;amp; Ruby are also available for the iPhone&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-4861608352074991314?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/4861608352074991314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=4861608352074991314' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/4861608352074991314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/4861608352074991314'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/08/despite-not-all-unix-commands-exist-on.html' title='iphone binkit'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-4119256115157775343</id><published>2007-08-15T16:34:00.001-07:00</published><updated>2007-08-15T16:44:46.483-07:00</updated><title type='text'>Native apps on the iPhone</title><content type='html'>Late in the evening i installed some native apps on the iPhone .&lt;br /&gt;I began with the Terminal application.&lt;br /&gt;With SSH it's a piece of cake : just push the Terminal.app (for the iPhone) to the /Applications folder from the iPhone by scp, then give the execution right to the binary (Terminal.app/Terminal) by ssh (chmod +x) .&lt;br /&gt;&lt;br /&gt;Then i continued with the Voice recorder : This application records the voice as an .arm file (that can be read with QuickTime) in the /var/root/Media/Voicerecordings folder of the iPhone. Then get it by scp on your Mac/PC to read... Some says it can record the conversations during a call..cool.&lt;br /&gt;&lt;br /&gt;Finally i installed the Installer Application : this applications when launched, shows you applications (Doom, Launcher) as packages to install on your iPhone.&lt;br /&gt;With this Installer, i installed the Launcher Application ... as there is no scrolling on the SpringBoard of the iPhone, if you have a lot of applications installed, some are hidden.&lt;br /&gt;So open the Launcher and simply chosse an application to run.&lt;br /&gt;&lt;br /&gt;Here are some pictures :&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Terminal&lt;/h4&gt;&lt;br /&gt;&lt;img src="http://farm2.static.flickr.com/1094/1130296705_bd5640c1a6_m.jpg"/&gt;&lt;br/&gt;&lt;br /&gt;&lt;h4&gt;No more free space&lt;/h4&gt;&lt;br /&gt;&lt;img src="http://farm2.static.flickr.com/1024/1131596290_975771d8a6_m.jpg"/&gt;&lt;br/&gt;&lt;br /&gt;&lt;h4&gt;Installer application&lt;/h4&gt;&lt;br /&gt;&lt;img src="http://farm2.static.flickr.com/1105/1131608874_b994825bd4_m.jpg"/&gt;&lt;br/&gt;&lt;br /&gt;&lt;h4&gt;Launcher application&lt;/h4&gt;&lt;br /&gt;&lt;img src="http://farm2.static.flickr.com/1271/1130816293_04757cb37f_m.jpg"/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-4119256115157775343?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/4119256115157775343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=4119256115157775343' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/4119256115157775343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/4119256115157775343'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/08/late-in-evening-i-installed-some-native.html' title='Native apps on the iPhone'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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://farm2.static.flickr.com/1094/1130296705_bd5640c1a6_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26409911.post-3321568423110957412</id><published>2007-08-13T17:02:00.001-07:00</published><updated>2007-08-13T17:05:07.838-07:00</updated><title type='text'>SSH daemon on the iphone</title><content type='html'>A little post just to say tonight i have installed an SSH Daemon on the iPhone. During the procedure, scp and ls binaries have been installed too on the iPhone.&lt;br /&gt;&lt;br /&gt;My first connection in SSH was successful and i could explore the filesystem.&lt;br /&gt;&lt;br /&gt;Now it will be possible to install some native apps on the iPhone remotely, using SCP commands.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-3321568423110957412?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/3321568423110957412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=3321568423110957412' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/3321568423110957412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/3321568423110957412'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/08/little-post-just-to-say-tonight-i-could.html' title='SSH daemon on the iphone'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-6831149277796312280</id><published>2007-08-10T23:53:00.001-07:00</published><updated>2007-08-11T06:43:13.794-07:00</updated><title type='text'>Lockdown patch on the iPhone</title><content type='html'>Today i've "jailbreaked" the iPhone, then activated DEFINITIVELY the iPhone by the method "Lockdown Patch".&lt;br /&gt;Doing this avoid reactivating the iPhone each time we change the SIM card.&lt;br /&gt;Now the iPhone is in FactoryActivated mode.&lt;br /&gt;&lt;br /&gt;After doing this, a new menu appeared in my iPhone "Settings" : "Carrier" .&lt;br /&gt;&lt;br /&gt;&lt;image src="http://farm2.static.flickr.com/1396/1081612890_20cdfcdee9_m.jpg" border="0"&gt;&lt;br /&gt;&lt;br style="clear:both;"/&gt;&lt;br /&gt;&lt;br /&gt;I can see the 3 Networks : BYTEL / Orange &amp;amp; SFR.&lt;br /&gt;&lt;br /&gt;&lt;image src="http://farm2.static.flickr.com/1362/1079731359_52f3c4983a_m.jpg" border="0"/&gt;&lt;br /&gt;&lt;br style="clear:both;"/&gt;&lt;br /&gt;&lt;br /&gt;I will continue this week end to tweak the iPhone in order to be able :&lt;br /&gt;- to access the iPhone by SSH through wifi.&lt;br /&gt;- to Install the application mobileTerminal on the iPhone.&lt;br /&gt;- to install the Ruby programming language (yeah...) on the iPhone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-6831149277796312280?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/6831149277796312280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=6831149277796312280' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/6831149277796312280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/6831149277796312280'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/08/today-ive-jailbreaked-iphone-then.html' title='Lockdown patch on the iPhone'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-9186781866252114074</id><published>2007-08-09T03:19:00.000-07:00</published><updated>2007-08-09T03:20:02.836-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ror'/><title type='text'>[RoR] File Upload with file_column plugin</title><content type='html'>Several RoR plugins exist for File Uopload. The more celeb are:&lt;br/&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.kanthak.net/opensource/file_column/"&gt;File_Column&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://agilewebdevelopment.com/plugins/attachment_fu"&gt;Attachment Fu&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;These two plugins can be combined to ImageMagick , when you need to do some operations on an uploaded image (resize, crop).&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;In this article , i will first speak about file_column.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;h4&gt;Download&lt;/h4&gt;&lt;br /&gt;Install file_column plugin in your RoR application with this command:&lt;br/&gt;&lt;br /&gt;&lt;span style="font-family: Courier"&gt;&lt;br /&gt;./script/plugin install http://opensvn.csie.org/rails_file_column/plugins/file_column/trunk&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;h4&gt;Create a table, with a column "image" for the file information &lt;/h4&gt;&lt;br /&gt;Launch the following command to create model class and migration script&lt;br/&gt;&lt;br /&gt;&lt;span style="font-family: Courier"&gt;&lt;br /&gt;script/generate model TestUpload&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Modify the migration script:&lt;br/&gt;&lt;br /&gt;&lt;span style="font-family: Courier"&gt;&lt;br /&gt;class AddTable &lt; ActiveRecord::Migration&lt;br/&gt;&lt;br /&gt;  def self.up&lt;br/&gt;&lt;br /&gt;    create_table :test_uploads do |t|&lt;br/&gt;&lt;br /&gt;      t.column :title,       :string&lt;br/&gt;&lt;br /&gt;      t.column :description,          :string&lt;br/&gt;&lt;br /&gt;      t.column :image,        :string&lt;br/&gt;&lt;br /&gt;    end&lt;br/&gt;&lt;br /&gt;  end&lt;br/&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;h4&gt;Modify the model class&lt;/h4&gt;&lt;br /&gt;&lt;span style="font-family: Courier"&gt;&lt;br /&gt;class TestUpload &lt; ActiveRecord::Base&lt;br/&gt;&lt;br /&gt;        file_column :image&lt;br/&gt;&lt;br /&gt;    end&lt;br/&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;h4&gt;Modify the view (Upload)&lt;/h4&gt;&lt;br /&gt;&lt;span style="font-family: Courier"&gt;&lt;br /&gt;&lt;br/&gt;&amp;lt;% form_tag ({:action =&amp;gt; 'create' }, :multipart =&amp;gt; true) do %&amp;gt;&lt;br /&gt;  &lt;br/&gt;&amp;lt;fieldset&amp;gt;&lt;br /&gt;  &lt;br/&gt;&amp;lt;legend&amp;gt;Test upload&lt;br/&gt;&amp;lt;/legend&amp;gt;&lt;br /&gt;&lt;br/&gt;&amp;lt;%= error_messages_for 'test_upload' %&amp;gt;&lt;br/&gt;&amp;lt;br/&amp;gt;&lt;br /&gt;  &lt;br/&gt;&amp;lt;div id="test_upload" class="form"&amp;gt;&lt;br /&gt; &lt;br/&gt;&amp;lt;table border=0&amp;gt;&lt;br /&gt; &lt;br/&gt;&amp;lt;tr&amp;gt;&lt;br /&gt; &lt;br/&gt;&amp;lt;td align="right"&amp;gt;&lt;br /&gt; &lt;br/&gt;&amp;lt;label for="test_upload_titre"&amp;gt;Title:&lt;br/&gt;&amp;lt;/label&amp;gt;&lt;br/&gt;&amp;lt;br/&amp;gt;&lt;br /&gt; &lt;br/&gt;&amp;lt;/td&amp;gt;&lt;br /&gt; &lt;br/&gt;&amp;lt;td&amp;gt;&lt;br /&gt;   &lt;br/&gt;&amp;lt;%= text_field "test_upload", "title", :size =&amp;gt; 30 %&amp;gt;&lt;br /&gt;   &lt;br/&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;   &lt;br/&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt; &lt;br/&gt;&amp;lt;tr&amp;gt;&lt;br /&gt; &lt;br/&gt;&amp;lt;td align="right"&amp;gt;&lt;br /&gt; &lt;br/&gt;&amp;lt;label for="test_upload_description"&amp;gt;Description:&lt;br/&gt;&amp;lt;/label&amp;gt;&lt;br/&gt;&amp;lt;br/&amp;gt;&lt;br /&gt; &lt;br/&gt;&amp;lt;/td&amp;gt;&lt;br /&gt; &lt;br/&gt;&amp;lt;td&amp;gt;&lt;br /&gt;   &lt;br/&gt;&amp;lt;%= text_field "test_upload", "description", :size =&amp;gt; 30 %&amp;gt;&lt;br /&gt;   &lt;br/&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;   &lt;br/&gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;   &lt;br/&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;   &lt;br/&gt;&amp;lt;td align="right"&amp;gt;&lt;br /&gt;   &lt;br/&gt;&amp;lt;label for="test_upload_image"&amp;gt;Upload image:&lt;br/&gt;&amp;lt;/label&amp;gt;&lt;br/&gt;&amp;lt;br/&amp;gt;&lt;br /&gt;   &lt;br/&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;   &lt;br/&gt;&amp;lt;td&amp;gt;&lt;br /&gt;   &lt;br/&gt;&amp;lt;%= file_column_field "test_upload", "image" %&amp;gt;&lt;br /&gt;   &lt;br/&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;   &lt;br/&gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;   &lt;br/&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;   &lt;br/&gt;&amp;lt;td colspan=2&amp;gt;&lt;br /&gt;   &lt;br/&gt;&amp;lt;input type="submit" value="Send" /&amp;gt;&lt;br /&gt;   &lt;br/&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;   &lt;br/&gt;&amp;lt;/tr&amp;gt; &lt;br /&gt;   &lt;br/&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;   &lt;br/&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;   &lt;br/&gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;&lt;br/&gt;&amp;lt;% end %&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;h4&gt;Save the record&lt;/h4&gt;&lt;br /&gt;In your controller , add the following action:&lt;br/&gt;&lt;br /&gt;&lt;span style="font-family: Courier"&gt;&lt;br /&gt;  def create&lt;br/&gt;&lt;br /&gt;   #  &lt;br/&gt;&lt;br /&gt;   test = TestUpload.create(:titre =&gt; params[:test_upload][:title], :description =&gt; params[:test_upload][:description], :image =&gt; params[:test_upload][:image])&lt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;end&lt;br/&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;The uploaded file is saved in the folder :&lt;br/&gt;&lt;br /&gt;&lt;span style="font-family: Courier"&gt;&lt;br /&gt;public/:model/:column/:id/filename&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;Display the uploaded image&lt;/h4&gt;&lt;br /&gt;&lt;span style="font-family: Courier"&gt;&lt;br /&gt;&amp;lt;%= image_tag url_for_file_column("test_upload", "image"), :border =&gt; 0 %&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;h4&gt;Resize images with RMagick&lt;/h4&gt;&lt;br /&gt;Modify the model class: &lt;br/&gt;&lt;br /&gt;&lt;span style="font-family: Courier"&gt;&lt;br /&gt;class TestUpload &lt; ActiveRecord::Base&lt;br/&gt;&lt;br /&gt;        file_column :image, :magick =&gt; {&lt;br/&gt; &lt;br /&gt;          :versions =&gt; { "thumb" =&gt; &lt;br/&gt;"50x50", "medium" =&gt; "640x480&gt;" }&lt;br/&gt;&lt;br /&gt;        }&lt;br/&gt;&lt;br /&gt;    end&lt;br/&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;And diplay the thumb image as :&lt;br/&gt;&lt;br /&gt;&lt;span style="font-family: Courier"&gt;&lt;br /&gt;&amp;lt;%= image_tag url_for_file_column("test_upload", "image", "thumb"), :border =&gt; 0 %&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-9186781866252114074?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/9186781866252114074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=9186781866252114074' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/9186781866252114074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/9186781866252114074'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/08/ror-file-upload-with-filecolumn-plugin.html' title='[RoR] File Upload with file_column plugin'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-387132775510956807</id><published>2007-08-07T15:56:00.000-07:00</published><updated>2007-08-07T16:29:42.754-07:00</updated><title type='text'>I played with iPhone tonight</title><content type='html'>I first checked on some french forum, what happens with enabling telephone in Europe.&lt;br /&gt;It seems one of the problem in France is to find the old SIM v1 : since 2002, we're in 3G and SIM cards are in v2 or v3.&lt;br /&gt;&lt;br /&gt;So, tonight i played with Photo publishing to Flickr.&lt;br /&gt;&lt;br /&gt;To publish by email photos from the iPhone , get an email address for your photoset in Flickr.&lt;br /&gt;With the iPhone, i opened Safari and go to the URL : http://m.flickr.com&lt;br /&gt;After authentication, Flickr gave me an email address for the publication.&lt;br /&gt;&lt;br /&gt;I first sent to Flickr some shots i did with the iPhone:&lt;br /&gt;I opened the Photo application on my iPhone then chose some photos, and sent them to my Flickr address.&lt;br /&gt;&lt;br /&gt;Here they are :&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;img style="clear:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px;" src="http://farm2.static.flickr.com/1266/1043217293_bbc2da2d9d_m.jpg" border="0" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;img style="clear:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px;" src="http://farm2.static.flickr.com/1252/1044081718_5e00a1b473.jpg?v=0" border="0" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Then i uploaded to one of my hosting site, an example web application from Apple, Puzzler.&lt;br /&gt;It will be a good starting point for my next iPhonized web applications i will program.&lt;br /&gt;&lt;br /&gt;Here is a photo of Puzzler.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;img style="clear:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px;" src="http://farm2.static.flickr.com/1349/1043339085_1c20ca6157.jpg?v=0" border="0" alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Then other pictures of the iPhone here, i did with PhotoBooth. I sent them to Flickr from picnik.com :&lt;br /&gt;&lt;img style="clear:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px;" src="http://farm2.static.flickr.com/1232/1043329189_278882b487.jpg?v=0" border="0" alt="" /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;img style="clear:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px;" src="http://farm2.static.flickr.com/1089/1043323609_348450bf0a.jpg?v=0" border="0" alt="" /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;img style="clear:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px;" src="http://farm2.static.flickr.com/1397/1043307833_bed6ecd1b2.jpg?v=0" border="0" alt="" /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;img style="clear:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px;" src="http://farm2.static.flickr.com/1262/1044151736_15c277e9b1_m.jpg" border="0" alt="" /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;img style="clear:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px;" src="http://farm2.static.flickr.com/1332/1044350132_3781ce497e_m.jpg" border="0" alt="" /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;img style="clear:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px;" src="http://farm2.static.flickr.com/1142/1044354550_80bcd19d79.jpg?v=0" border="0" alt="" /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;FInally, i will continue to program a little redirection page , for people connecting to a website with a browser from their Mac/PC whereas it's done for the iPhone.&lt;br /&gt;Two methods :&lt;br /&gt;On client side with Javascript, on server side with Java, PHP or Ruby.&lt;br /&gt;&lt;br /&gt;I will post this later...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-387132775510956807?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/387132775510956807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=387132775510956807' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/387132775510956807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/387132775510956807'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/08/i-played-with-iphone-tonight.html' title='I played with iPhone tonight'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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://farm2.static.flickr.com/1266/1043217293_bbc2da2d9d_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26409911.post-1507687030504788575</id><published>2007-08-07T13:57:00.001-07:00</published><updated>2007-08-08T00:00:19.990-07:00</updated><title type='text'>Two days later...</title><content type='html'>What's new since last post.&lt;br /&gt;&lt;br /&gt;First i'd like to say that my first encoding (a divX to h.264) with Crunch was not really a success : i encountered problems when playing the movie on the iPhone because of a desynchro between audio and video..,&lt;br /&gt;So i did new encodings : and one worked. &lt;br /&gt;I could then watch my first movie on the iPhone .&lt;br /&gt;&lt;br /&gt;Yesterday, i updated the firmware of the iPhone to 1.0.1 . No problems. No reactivation needed. All works perfectly. The update should be minor, i haven't seen abything changed (some folks say you have the BCC field now when writing an email). There was a vulnerability with Safari (calling someone directly from Safari thanks to the tel:xxxxx...equivalent of mailto:....) : it should be fixed too.&lt;br /&gt;&lt;br /&gt;Before having the iphone, i watched videos from Apple to see how to optimize web applications for the iPhone. A &lt;a href="http://developer.apple.com/iphone/designingcontent.html"&gt;document&lt;/a&gt; has been published by Apple about this.&lt;br /&gt;There is a release of Aptana IDE for the iPhone too.&lt;br /&gt;To summarize : &lt;br /&gt;The Safari viewport size (minus status bar, navigation bar, form assistant height is 320 x 356)&lt;br /&gt;You can limit this by creating a special CSS style for iPhone (text font should be around 17pt) :&lt;br /&gt;&lt;br /&gt;&amp;lt;link media="screen and (min-device-width: 481px)"&lt;br /&gt; href="not-small-device.css" type="text/css" rel="stylesheet" /&amp;gt;&lt;br /&gt;&lt;br /&gt;Detect the iPhone User Agent (in Javascript or on the server side) : you should search for the string "iPhone"&lt;br /&gt;&lt;br /&gt;You can enable or disable the scaling (double tap or Pinch) by a meta tag in the header of your HTML page:&lt;br /&gt;&amp;lt;meta name="viewport" content="initial-scale=2.3, user-scalable=no" /&amp;gt;&lt;br /&gt;&lt;br /&gt;And many more good practices should be followed.. I will post a complete article about this after my first development of web application optimized for the iPhone.&lt;br /&gt; &lt;br /&gt;I surfed on the internet, looking for some web sites optimized for the iPhone :&lt;br /&gt;- First i tried http://iphone.dailymotion.com/ : the iPhone version works fine. Videos have been reencoded to h.264 (initially , DailyMotion and Youtube videos are in FLV for Flash player...but on Safari for the iPhone, there is no Flash, no Java)&lt;br /&gt;&lt;br /&gt;Then:&lt;br /&gt;- http://www.appmarks.com/ : you get a kind of Dahsboard , with new Widgets. For each widget an application.&lt;br /&gt;- I tried different RSS reader optimized for the iPhone : Digg.com and GoogleReader.&lt;br /&gt;- For instant Messenging, i could access the version of Yahoo, initially done for the WAP. It's very simple and light, but works fine. In fact, (Windows) mobile versions of websites just need relooking, to have an iPhone look and feel, and some resizing for the Safari viewport...the content (size of fonts particularly) seems already fine.&lt;br /&gt;&lt;br /&gt;Today, i went to my office with my Airport Express. I pluggued it to a router, and, could then access the Internet in Wifi ... it was a great experience for some of my colleagues.&lt;br /&gt;&lt;br /&gt;Since sunday evening, we know that someone in Croatia could unlock (crack is the exact term) the SIM to make work the iPhone in Europe. The procedure is quite long and requires some materials... and is completely illegal. Let's wait and see for the moment.&lt;br /&gt;&lt;br /&gt;Thanks to an unofficial developement kit for the iPhone, first applications appear :&lt;br /&gt;- MobileTerminal&lt;br /&gt;- Voice Recorder&lt;br /&gt;- NES emulator&lt;br /&gt;And tonight, i even saw Ruby could be installed on the iPhone.&lt;br /&gt;&lt;br /&gt;Nice perspectives for the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-1507687030504788575?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/1507687030504788575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=1507687030504788575' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/1507687030504788575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/1507687030504788575'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/08/whats-new-since-last-post.html' title='Two days later...'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-6809192893492345638</id><published>2007-08-05T13:38:00.001-07:00</published><updated>2007-08-05T13:46:39.989-07:00</updated><title type='text'>The latest technical joy</title><content type='html'>Nothing is more joyful than a new born in a family.. for me , it was about one month ago.&lt;br /&gt;But this week end, from a geek point of view, i was happy with an Apple product as never since i bought my G5.&lt;br /&gt;&lt;br /&gt;Before the week end i received an iphone bought in the U.S by a friend for me.&lt;br /&gt;First of all, what you must know : using an iPhone outside the U.S.A has some limitations.&lt;br /&gt;- The telephony could not be used : as iPhone is an exclusivity AT&amp;amp;T, and being in Europe, paying the fee for AT&amp;amp;T after activation with iTunes should be forget.&lt;br /&gt;- YouTube application could not be used : apparently connecting to YouTube with this application requires a GPRS connection...&lt;br /&gt;&lt;br /&gt;The first workaround to be able to use the iPhone (coming initially completely locked) at least as a super ipod 7G (Wifi, iPod, Video) is to unlock it.&lt;br /&gt;&lt;br /&gt;Having only Macs at home, i found the Activation Toolkit for Mac. After connecting the iphone to my MacBook, disabling iTunes, and launching the unlock program...the message 'Activate your iphone' disappears, and the home page appears, with all application widgets...cool.&lt;br /&gt;&lt;br /&gt;Then, enter an application that requires a wifi connection (Stock Quotes or Weather) &lt;br /&gt;The iphone has detected my WiFi private network without problems, and a dialog box appeared asking me for the key. &lt;br /&gt;I typed this key then launched Safari, and go to Google. All is fine , it works.&lt;br /&gt;&lt;br /&gt;I could then go to my gmail account (in web mode), and retrieve my emails.&lt;br /&gt;&lt;br /&gt;I began to use the keyboard to write an email : quite difficult with by big fingers..but after several lines of text, it is easier.&lt;br /&gt;&lt;br /&gt;Then i configured the Mail application :&lt;br /&gt;Choose first your email provider (Yahoo, AOL, Google).&lt;br /&gt;After configuring my account (login/password), i could retrieve my last emails.&lt;br /&gt;Using the mail app is more comfortable than accessing GMail by the Web UI.&lt;br /&gt;You could easily navigate through the list of messages, dropping the unnecessary messages (there is a little trash at the bottom of the screen, with animation), disappearing with a little effect.&lt;br /&gt;&lt;br /&gt;Then i returned to the Stock Quotes and Weather applications. &lt;br /&gt;These 2 apps look like their equivalent on Apple Dashboard.&lt;br /&gt;After adding a new town for the weather and new Quotes.&lt;br /&gt;For the weather i could easily navigate by sliding panels horizontally to see all registered towns in the application.&lt;br /&gt;&lt;br /&gt;For the Stock Quotes, you see the Quotes as a list, and a graphics at the bottom of the screen.&lt;br /&gt;&lt;br /&gt;Then i did some shots with the camera. And played then with rotations (portrait to landscape), Pinch (for zooming), double Tap.&lt;br /&gt;&lt;br /&gt;I did the same then in Safari to zoom over articles from Yahoo. I test the filling of forms with the keyboard...quite difficult.&lt;br /&gt;&lt;br /&gt;What misses in the iPhone is iChat . You have anapplication to send some SMS (but in my case i should forget it).&lt;br /&gt;An alternative is to use the web application at http://www.meebo.com/, a kind of Trillian or Adium in web mode, that could connects to your different Instant Messaging accounts (Google Talk, MSN, Yahoo, ICQ).&lt;br /&gt;I test my Google Talk connection , sending some messages to friends, then receiving their messages. It works.&lt;br /&gt;&lt;br /&gt;Now let's playing with iPod.&lt;br /&gt;First of all, after connecting the iPhone to the MacBook, iTunes starts. iTunes asks for activation...but my iphone is already unlocked, so Cancel.&lt;br /&gt;Then click on the tab Music, i checked the recent added music to iTunes, then synchronize the iPhone.&lt;br /&gt;86 tracks have been transfered to my iPhone, including : Good Shoes, The Subways, The Raconteurs, The Smashing Pumpkins, Nine Inch Nails, Tom Yorke, Incubus , The Red Hot Chili Peppers..good rock music.&lt;br /&gt;Launch iPod application, then rotate the iPhone, and..here comes the coverflow.&lt;br /&gt;Pick an album and play it...&lt;br /&gt;&lt;br /&gt;Then i continued , while listening my music, to play with Google Maps application. &lt;br /&gt;Enter to the keyboard my address..rapidly i get the map and could check my house when switching to the satellite view.&lt;br /&gt;&lt;br /&gt;Then i launched the Notes application : i could add an item to a todo list (ala GTD).&lt;br /&gt;&lt;br /&gt;From here the i switched to the calendar application..adding some events for the month.&lt;br /&gt;&lt;br /&gt;I then did some shots with the iPhone camera..then from the photo application i could launch a slideshow for all these photos.&lt;br /&gt;&lt;br /&gt;There is a World Clock too. I added the Time for Geneva (near to Cupertino ;-)) ... other possibilities like Timer and Alarm are available.&lt;br /&gt;&lt;br /&gt;Finally, the video. &lt;br /&gt;First of all , i saw that Roxio releases an application named Crunch, for encoding your videos to Apple TV, iPhone or iPod.&lt;br /&gt;I bought it (40 usd), then encoded for the iPhone one of my movies.&lt;br /&gt;Crunch copies then the encoded movies to iTunes.&lt;br /&gt;I connected again the iPhone to my Mac, launched iTunes, and synchronized this video...&lt;br /&gt;Now i'm watching it, another Rock movie (School of Rock), so i leave you.&lt;br /&gt;&lt;br /&gt;See you in a next article.&lt;br /&gt;&lt;br /&gt;Find some photos of my iPhone on http://flickr.com/photos/lbois&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-6809192893492345638?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/6809192893492345638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=6809192893492345638' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/6809192893492345638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/6809192893492345638'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/08/latest-joy.html' title='The latest technical joy'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-6427749464281386856</id><published>2007-07-01T06:28:00.001-07:00</published><updated>2007-07-01T06:28:51.274-07:00</updated><title type='text'>Welcome to Maxine</title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/lbois/680624692/" title="photo sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1420/680624692_11eebb539f_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;  &lt;a href="http://www.flickr.com/photos/lbois/680624692/"&gt;100_1896.JPG&lt;/a&gt;  &lt;br /&gt;  Originally uploaded by &lt;a href="http://www.flickr.com/people/lbois/"&gt;lbois&lt;/a&gt; &lt;/span&gt;&lt;/div&gt;Welcome to Maxine, my second daughter, born on 29th June 2007, 23:44 French Timezone.&lt;br clear="all" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-6427749464281386856?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/6427749464281386856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=6427749464281386856' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/6427749464281386856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/6427749464281386856'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/07/welcome-to-maxine.html' title='Welcome to Maxine'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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://farm2.static.flickr.com/1420/680624692_11eebb539f_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26409911.post-1760938704918568944</id><published>2007-05-29T04:20:00.000-07:00</published><updated>2007-06-02T05:44:31.721-07:00</updated><title type='text'>Ajax pagination of a data table with Rails</title><content type='html'>&lt;p style="font-family: arial;"&gt;Create a controller and an action list to display first the paginated list  and a protected method for the pagination:&lt;/p&gt; &lt;p style="font-family: courier new;"&gt;class MyController &amp;lt; ApplicationController&lt;br /&gt;def action list&lt;br /&gt;page=1&lt;br /&gt;per_page=12&lt;br /&gt;page_count = -1&lt;br /&gt;paginate_users(page, per_page, page_count)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;protected &lt;br /&gt;&lt;br /&gt;def paginate_users(page, per_page, count)&lt;br /&gt;if (count &lt; 0)&lt;br /&gt;@users_count = User.count(:all, :conditions =&gt; ['created_on &amp;gt; ?', Time.now - (30 * 24 * 60 * 60) ])&lt;br /&gt;else&lt;br /&gt;@users_count = count&lt;br /&gt;end&lt;br /&gt;@user_pages = Paginator.new(self, @users_count, per_page, page)&lt;br /&gt;@users = User.find(:all, :conditions =&amp;gt; ['created_on &amp;gt; ?', Time.now - (30 * 24 * 60 * 60) ], :order =&gt; 'created_on DESC', :offset =&amp;gt; @user_pages.current.to_sql[1], :limit =&amp;gt; per_page)&lt;br /&gt;end&lt;br /&gt;end&lt;/p&gt; &lt;p style="font-family: arial;"&gt;The corresponding view (list.rhtml) would display the scrollable data grid as is :&lt;/p&gt; &lt;p style="font-family: courier new;"&gt;&amp;lt;div style="width:820px;height:20px;background-color:#C1DDF3; border-color:#C1DDF3;color: #626262;border:1px solid;"&amp;gt;&lt;br /&gt;&amp;lt;table id="dg_header" border="0" cellspacing="0" cellpadding="0" style="width:100%"&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td style="width:273px"&amp;gt;First Name&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td style="width:273px"&amp;gt;Last Name&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td style="width:273px"&amp;gt;Email&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div style="overflow:auto;height:100px;width:837px"&amp;gt;&lt;br /&gt;&amp;lt;table id="dg_body" border="0" cellspacing="0" style="background-color:#ddd;width:822px;border-collapse:collapse"&amp;gt;&lt;br /&gt;&amp;lt;%= render :partial =&gt; 'row', :collection =&gt; @users %&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:arial;"&gt;The _row.rhtml partial would be :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;tr id="row_&amp;lt;%=user.id.to_i%&amp;gt;" class='tableRow' &amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;td style='width:273px'&amp;gt;&amp;lt;%= user.firstname %&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;td style='width:273px'&amp;gt;&amp;lt;%= user.lastname %&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;td style='width:273px'&amp;gt;&amp;lt;%= user.email %&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="font-family: arial;"&gt;Now, in the list.rhtml file, insert the navigation bar as a footer of the data grid :&lt;/p&gt; &lt;p style="font-family: courier new;"&gt;&amp;lt;div style="width:820px;height:20px;background-color:#C1DDF3; border-color:#C1DDF3;color: #626262;border:1px solid;"&amp;gt;&lt;br /&gt;&amp;lt;table id="dg_footer" border="0" cellspacing="0" style="WIDTH:100%"&amp;gt;&lt;br /&gt;&amp;lt;tr id="row_nav_links"&amp;gt;&lt;br /&gt;&amp;lt;%= render :partial =&amp;gt; 'nav_links' %&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/p&gt; &lt;p style="font-family: arial;"&gt;The _nav_links.rhtml partial would be :&lt;/p&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;td width="100%" align="center"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Pages &amp;lt;%= @user_pages.current.first_item %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;- &amp;lt;%= @user_pages.current.last_item %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;de &amp;lt;%= @user_pages.item_count %&amp;gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;%= if @user_pages.current.previous&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;link_to_remote("Previous page", :url =&amp;gt; { :action=&amp;gt; 'next_prev_users', :page =&amp;gt; @user_pages.current.previous, :count=&amp;gt; @user_pages.item_count} )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;%= if @user_pages.current.next&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;link_to_remote("Next page", :url =&amp;gt; { :action=&amp;gt; 'next_prev_users', :page =&amp;gt; @user_pages.current.next, :count=&amp;gt; @user_pages.item_count } )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&lt;p style="font-family: arial;"&gt;Finally, add the action next_prev_users to your controller :&lt;/p&gt;&lt;span style="font-family:courier new;"&gt;def next_prev_users&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;page=params[:page].to_i&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;page_count = params[:count].to_i&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;per_page=12&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;paginate_users(page, per_page, page_count)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;render :update do |page|&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# Repaint the data grid&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;page.replace_html "dg_body", :partial =&amp;gt; 'row', :collection =&amp;gt; @users&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# Repaint the Navigation bar&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;page.replace_html "row_nav_links", :partial =&amp;gt; 'nav_links'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;page.visual_effect :appear, "dg_body"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-1760938704918568944?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/1760938704918568944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=1760938704918568944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/1760938704918568944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/1760938704918568944'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/05/ajax-pagination-of-data-table-with.html' title='Ajax pagination of a data table with Rails'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-6155672490503997670</id><published>2007-05-20T01:20:00.000-07:00</published><updated>2007-05-20T08:05:18.808-07:00</updated><title type='text'>Continuous integration with CruiseControl.rb</title><content type='html'>What a nice tool &lt;a href="http://cruisecontrolrb.thoughtworks.com/"&gt;CruiseControl.rb&lt;/a&gt;&lt;br /&gt;Simply powerful.&lt;br /&gt;If you're developing a new Rails application in a team, here is a tool that will help you with the builds.&lt;br /&gt;The main goal of CruiseControl.rb is to alert developers of a project, committing their work into a source control during the day, when something break the build&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Installing CruiseControl.rb&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Download CruiseControl.rb tarball from RubyForge.&lt;br /&gt;Unzip the archive: a folder we'll call [cruise] is created.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Add your project&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;CruiseControl.rb is a Rails application, so Ruby 1.8.4+ , Rails, SVN client are required. In my case i should install the gem RedCloth (gem install RedCloth). ruby and svn commands should be in the PATH&lt;br /&gt;We suppose here you have imported already your project to a remote (or local) SVN repository&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;cd [cruise]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;./cruise add [project name] --url [url of your SVN project trunk] --username [your user] --password [your password]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;Example :&lt;/span&gt;&lt;br /&gt;In my case, no username/password required as i uploaded my RSA pub. key to my RubyForge account (i use the svn+ssh// URL for SVN)&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;cruise add [my project] --url svn+ssh//[username]@rubyforge.org/var/svn/[project]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Start and build your project&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once your project has been added, start CruiseControl.rb application&lt;br /&gt;[cruise]$ cruise start&lt;br /&gt;The default port is 3333. You can change it by launching CruiseControl.rb as : cruise start -p [port]&lt;br /&gt;Open a browser, go to URL http://localhost:3333/&lt;br /&gt;Press the "Build now" button.&lt;br /&gt;Then, let CruiseControl.rb web application up the time you develop (and your coworkers)&lt;br /&gt;Developers commit regularly to SVN in the day. Your CruiseControl.rb will poll the SVN every N minutes (by default 30 seconds, change this to the interval you want)&lt;br /&gt;You'll see on the Dashboard all the builds for the new revisions : you can check what breaks the build.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-6155672490503997670?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/6155672490503997670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=6155672490503997670' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/6155672490503997670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/6155672490503997670'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/05/continuous-integration-with.html' title='Continuous integration with CruiseControl.rb'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-2561404355961347737</id><published>2007-04-09T00:22:00.000-07:00</published><updated>2007-04-09T00:23:57.127-07:00</updated><title type='text'>Deploy your application using Capistrano</title><content type='html'>This procedure is the one i applied to deploy my Rails application to my ASO (ASmallOrange) account.&lt;br /&gt;&lt;br /&gt;First ensure you have a complete SVN setup (read my previous article), and put your code in the SVN repo.&lt;br /&gt;&lt;br /&gt;Install Capistrano on your local machine (http://manuals.rubyonrails.com/read/chapter/98)&lt;br /&gt;&lt;br /&gt;'Capistranize' your Rails app :&lt;br /&gt;$ cap --apply-to /path/to/my/app MyApplicationName&lt;br /&gt;&lt;br /&gt;Where path/to/my/app corresponds to your 'rails root'&lt;br /&gt;&lt;br /&gt;In your Rails app, you should have now the file config/deploy.rb . Edit this file :&lt;br /&gt;&lt;br /&gt;Under the first group of settings, modify the lines :&lt;br /&gt;$ set :application, "application_name"&lt;br /&gt;$ set :repository, "svn+ssh://username@domain.com/home/username/path/to/app/repo"&lt;br /&gt;&lt;br /&gt;Other informations can be changed as is :&lt;br /&gt;$ role :app, "yourdomain.com"&lt;br /&gt;$ role :web, "yourdomain.com"&lt;br /&gt;$ role :db,   "yourdomain.com"&lt;br /&gt;&lt;br /&gt;In Optional settings uncomment the lines :&lt;br /&gt;$ set :deploy_to, "/home/username/application_name"&lt;br /&gt;$ set :user, "username"&lt;br /&gt;&lt;br /&gt;Then run the command :&lt;br /&gt;$ rake remote:exec ACTION=setup&lt;br /&gt;&lt;br /&gt;At the bottom of your deploy.rb file, add the lines :&lt;br /&gt;&lt;br /&gt;desc "Link in the production database.yml and fix permissions"&lt;br /&gt;task :after_update_code do&lt;br /&gt;  run "find #{release_path}/public -type d -exec chmod 0755 {} \\;"&lt;br /&gt;  run "find #{release_path}/public -type f -exec chmod 0644 {} \\;"&lt;br /&gt;  run "chmod 0755 #{release_path}/public/dispatch.*"&lt;br /&gt;  run "mv #{release_path}/config/environment.rb #{release_path}/config/environment.rb~"&lt;br /&gt;  run "ruby -e 'readlines.each{ |l| if( l.include?(%q(RAILS_ENV)) ) then puts l[/[^# ]+.*/] else puts l end } ' #{release_path}/config/environment.rb~ &gt; #{release_path}/config/environment.rb "&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;This fix the permissions (without doing this, you could encounter error 500)&lt;br /&gt;&lt;br /&gt;Now deploy your application :&lt;br /&gt;$ rake deploy&lt;br /&gt;&lt;br /&gt;Connect now by SSH to your account :&lt;br /&gt;You should find a folder : /home/username/application_name/current&lt;br /&gt;&lt;br /&gt;Now link the public folder of your app to public_html :&lt;br /&gt;If you want to deploy several applications :&lt;br /&gt;$ cd ~&lt;br /&gt;$ ln -sf ~/application_name/current/public ~/public_html/application_name&lt;br /&gt;&lt;br /&gt;You'll then access your application by : http://www.yourdomain.com/application_name&lt;br /&gt;&lt;br /&gt;If you want your application to be linked to the main directory at www.yourdomain.com :&lt;br /&gt;$ cd ~&lt;br /&gt;$ rm -rf ~/public_html&lt;br /&gt;$ ln -sf ~/application_name/current/public ~/public_html&lt;br /&gt;&lt;br /&gt;To use the FastCGI servertype:&lt;br /&gt;$ cd ~/application_name/current/public&lt;br /&gt;$ nano .htaccess&lt;br /&gt;&lt;br /&gt;Find the following code :&lt;br /&gt;RewriteRule ^(.*)$ dispatch.cgi [QSA,L]&lt;br /&gt;&lt;br /&gt;Replace by :&lt;br /&gt;RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]&lt;br /&gt;&lt;br /&gt;Now configure your database mySql by accessing the cPanel :&lt;br /&gt;Create your production database, a user, and give the privileges to the user for working with your database.&lt;br /&gt;&lt;br /&gt;Now you have the new database name, and the credentials of your user , edit your config/database.yml file.&lt;br /&gt;Change the settings for the 'production' section&lt;br /&gt;&lt;br /&gt;Create the datamodel :&lt;br /&gt;$ cd ~/application_name/current&lt;br /&gt;$ rake db:migrate RAILS_ENV="production"&lt;br /&gt;&lt;br /&gt;Export/Import data :&lt;br /&gt;Dump insert statements of your local database and import to your ASO mySQL database using phpMyAdmin.&lt;br /&gt;A better way is to include setup in a migration script...to run once!&lt;br /&gt;&lt;br /&gt;Now you should be able to connect to your Rails application successfully deployed.&lt;br /&gt;&lt;br /&gt;Source : ASO Forum&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-2561404355961347737?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/2561404355961347737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=2561404355961347737' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/2561404355961347737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/2561404355961347737'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/04/deploy-your-application-using.html' title='Deploy your application using Capistrano'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-319824278055992051</id><published>2007-04-07T07:06:00.000-07:00</published><updated>2007-04-07T07:13:31.883-07:00</updated><title type='text'>Import your first Rails project by ASO</title><content type='html'>Create SVN Repo by asmallorange (ASO) + websvn and import your project&lt;br /&gt;&lt;br /&gt;Before to be able to connect to your SVN repo by svn+ssh protocol from your local machine:&lt;br /&gt;Generate locally a ssh key pair by &lt;br /&gt;$ ssh-keygen -t dsa (without passphrase to connect without password)&lt;br /&gt;&lt;br /&gt;Puts the public key to your ASO account :&lt;br /&gt;$ sftp {username}@{remote-host}:/home/{username}&lt;br /&gt;$ put /Users/{username}/.ssh/id*.pub&lt;br /&gt;$ bye&lt;br /&gt;&lt;br /&gt;Reconnect by ssh to your account :&lt;br /&gt;$ ssh {username}@{domain}&lt;br /&gt;$ mkdir .ssh&lt;br /&gt;$ cd .ssh&lt;br /&gt;$ cat ../id*.pub &gt;&gt; authorized_keys2&lt;br /&gt;$ chmod 700 authorized_keys2&lt;br /&gt;&lt;br /&gt;Disconnect , then reconnect via SSH: your password is not asked...that does it!&lt;br /&gt;&lt;br /&gt;Initial import of your current project, developed locally , to your SVN repo.&lt;br /&gt;&lt;br /&gt;For the first import, we'll zip the local project, then push it to the ASO account.&lt;br /&gt;$ tar cvfz {projectname}.tar.gz /path/to/project&lt;br /&gt;$ scp {projectname}.tar.gz {username}@{domain}:/home/{username}&lt;br /&gt;$ ssh {username}@{domain}&lt;br /&gt;&lt;br /&gt;Connect by ssh to your account (eg. ssh {username}@{domain})&lt;br /&gt;&lt;br /&gt;This installation is made for a single project in your repository : your Rails app root folder should be named {projectname}&lt;br /&gt;&lt;br /&gt;$ mkdir ~/svn&lt;br /&gt;$ svnadmin create --fs-type fsfs svn/{projectname}&lt;br /&gt;$ export REPOS=file:///home/{username}/svn/{projectname}&lt;br /&gt;$ svn mkdir --message="Initial project layout" $REPOS/trunk $REPOS/tags $REPOS/branches&lt;br /&gt;Committed revision 1.&lt;br /&gt;&lt;br /&gt;Move your project&lt;br /&gt;&lt;br /&gt;$ mkdir ~/tmpdir&lt;br /&gt;$ cd tmpdir&lt;br /&gt;$ mv ~/{projectname}.tar.gz .&lt;br /&gt;$ tar xzvf {projectname}.tar.gz&lt;br /&gt;$ rm *.tar.gz&lt;br /&gt;$ cd {projectname}&lt;br /&gt;$ svn co $REPOS/trunk .&lt;br /&gt;Checked out revision 1.&lt;br /&gt;&lt;br /&gt;$ svn add --force .&lt;br /&gt;&lt;br /&gt;This is called an 'In Place Import' . A whole import could have been done too.&lt;br /&gt;&lt;br /&gt;Before commit , we're going to do some operations. Thus to ignore log files first :&lt;br /&gt;$ svn revert log/*&lt;br /&gt;Reverted 'log/development.log'&lt;br /&gt;Reverted 'log/fastcgi.crash.log'&lt;br /&gt;Reverted 'log/lighttpd.access.log'&lt;br /&gt;Reverted 'log/lighttpd.error.log'&lt;br /&gt;Reverted 'log/production.log'&lt;br /&gt;Reverted 'log/server.log'&lt;br /&gt;Reverted 'log/test.log'&lt;br /&gt;&lt;br /&gt;$ svn propset svn:ignore "*.log" log&lt;br /&gt;property 'svn:ignore' set on 'log'&lt;br /&gt;&lt;br /&gt;$ svn revert config/database.yml&lt;br /&gt;Reverted 'config/database.yml'&lt;br /&gt;&lt;br /&gt;$ mv database.yml database.yml.template&lt;br /&gt;$ svn add database.yml.template&lt;br /&gt;$ svn propset svn:ignore "database.yml" config&lt;br /&gt;$ cp database.yml database.yml.template database.yml&lt;br /&gt;&lt;br /&gt;Ignore db/schema.rb, tmp/* , doc, script, public&lt;br /&gt;$ svn propset svn:ignore "schema.rb" config&lt;br /&gt;$ svn propset svn:ignore "*" tmp&lt;br /&gt;$ svn propset svn:ignore "*doc" doc&lt;br /&gt;&lt;br /&gt;Flag as executables script/* and public/dispatch.*&lt;br /&gt;$ svn propset svn:executable "*" `find script -type f | grep -v '.svn'` public/dispatch.*&lt;br /&gt;&lt;br /&gt;Finally, revert and remove index.html (we'll do a route for the application)&lt;br /&gt;$ svn revert public/index.html&lt;br /&gt;$ rm public/index.html&lt;br /&gt;&lt;br /&gt;Commit :&lt;br /&gt;$ svn commit --message="New {projectname} project"&lt;br /&gt;...&lt;br /&gt;Adding         vendor/plugins/&lt;br /&gt;Transmitting file data ..............................&lt;br /&gt;Committed revision 2.&lt;br /&gt;&lt;br /&gt;Install WebSVN to have remote access from an internet browser:&lt;br /&gt;&lt;br /&gt;$ svn co http://wedsvn.tigris.org/svn/websvn/trunk www/websvn --username guest&lt;br /&gt;Authentication realm: &lt;http://wedsvn.tigris.org:80&gt; CollabNet SCM Repository&lt;br /&gt;Password for 'guest': guest&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Modify the config file :&lt;br /&gt;&lt;br /&gt;$ cd www/websvn&lt;br /&gt;$ cp include/distconfig.inc include/config.inc&lt;br /&gt;$ vi include/config.inc&lt;br /&gt;&lt;br /&gt;// Uncomment the next line if you're running PHP 4&lt;br /&gt;//&lt;br /&gt;$config-&gt;setPHPCompatEnabled();&lt;br /&gt;&lt;br /&gt;// Uncomment and edit this line:&lt;br /&gt;$config-&gt;addRepository("My Projects", "file:///home/&lt;username&gt;/svn/&lt;projectname&gt;");&lt;br /&gt;&lt;br /&gt;That should do it. Test with FF (eg : http://&lt;domain&gt;/websvn)&lt;br /&gt;&lt;br /&gt;You should see your project&lt;br /&gt;&lt;br /&gt;On Mac you should install SVN first (http://subversion.tigris.org/project_packages.html) then svnX (http://www.lachoseinteractive.net/fr/communaute/subversion/svnx/telecharger/)&lt;br /&gt;&lt;br /&gt;Move your locally developped rails project :&lt;br /&gt;$ cd /path/to/my/rails/projects&lt;br /&gt;$ mv {projectname} {projectname}.orig&lt;br /&gt;&lt;br /&gt;From SVNX , configure your Repositories (no login/password will be required, thanks to your ssh public key copied into your account):&lt;br /&gt;Name : My ASO repo&lt;br /&gt;Path : svn+ssh://{username}@{domain or ip}/home/{username}/svn/{projectname}&lt;br /&gt;&lt;br /&gt;Click SVN Checkout&lt;br /&gt;Folder to your working copy is asked :&lt;br /&gt;/path/to/rails/projects/{projectname}&lt;br /&gt;&lt;br /&gt;That's it .&lt;br /&gt;&lt;br /&gt;Open /path/to/rails/projects/{projectname} in your IDE (TextMate, RadRails, Eclipse+RDT)&lt;br /&gt;In RadRails create a new repository Location with the following path:&lt;br /&gt;svn+ssh://{username}@{domain or ip}/home/{username}/svn/{projectname}&lt;br /&gt;&lt;br /&gt;Ressource: http://blog.teksol.info/articles/2006/03/09/subversion-primer-for-rails-projects&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-319824278055992051?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/319824278055992051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=319824278055992051' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/319824278055992051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/319824278055992051'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/04/import-your-first-rails-project-by-aso.html' title='Import your first Rails project by ASO'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-6600998178471433171</id><published>2007-03-28T10:16:00.000-07:00</published><updated>2007-03-28T10:20:59.467-07:00</updated><title type='text'>Environnement de developpement Rails sur Ubuntu</title><content type='html'>J’ai préparé récemment une image VMWare (a partir d’une appliance Ubuntu Edgy) pour en faire un environnement de développement relativement complet :&lt;br /&gt;&lt;br /&gt;- Ruby 1.8.5&lt;br /&gt;- Rails 1.2.3&lt;br /&gt;- mySQL 5 / Php5 / phpmyadmin&lt;br /&gt;- Mongrel/Lighty&lt;br /&gt;- Java 5&lt;br /&gt;- Eclipse Web Tools Platform + Plugin RDT (ruby)&lt;br /&gt;- Groovy&lt;br /&gt;- Grails&lt;br /&gt;- Maven&lt;br /&gt;- Subversion&lt;br /&gt;- Flex2 SDK&lt;br /&gt;&lt;br /&gt;J’ai rédigé en parallèle une documentation , pouvant être réutilisée pour créer un environnement similaire sur un environnement Linux Ubuntu/Debian natif.&lt;br /&gt;&lt;br /&gt;Telecharger &lt;a href="http://social.hortis.ch/wp-content/uploads/2007/03/Installer%20un%20environnement%20complet%20de%20d%C3%A9veloppement%20Rails%20sur%20Ubuntu.pdf"&gt;ici&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-6600998178471433171?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/6600998178471433171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=6600998178471433171' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/6600998178471433171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/6600998178471433171'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/03/environnement-de-developpement-rails.html' title='Environnement de developpement Rails sur Ubuntu'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-8027073842994626152</id><published>2007-03-19T11:07:00.000-07:00</published><updated>2007-03-19T11:08:28.596-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='ria'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='apollo'/><title type='text'>Apollo, decollage immediat</title><content type='html'>Suite à la soirée de lancement d'Apollo, l'Apollo Camp (http://apollocamp.eventbrite.com/)  vendredi 16 Mars au soir, Adobe rend disponible en version Alpha le runtime Apollo ainsi que le SDK et les extensions pour Flex (disponible sur Mac &amp; PC, a venir sur Linux) : http://labs.adobe.com/technologies/apollo/&lt;br /&gt;&lt;br /&gt;Déjà disponible depuis quelques mois pour les développeurs (comme en témoigne cet article de TechCrunch (http://www.techcrunch.com/2007/02/28/best-apollo-demos/), répertoriant quelques démos, impressionnantes), Apollo devient enfin disponible.&lt;br /&gt;&lt;br /&gt;Apollo est une plate-forme a part entière,  associant les technologies de l'internet (HTML, Javascript, Ajax, Flash et Flex) et le monde des applications bureautiques riches, et fonctionnant de facon identique sur differents systemes d'exploitation (Mac , Windows, et bientot Linux), en dehors du navigateur.&lt;br /&gt;Dans un premier temps l'ordinateur est le support cible, mais dans un futur proche Smartphone et Tablet PC (&amp; Mac) seront de la partie.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-8027073842994626152?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/8027073842994626152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=8027073842994626152' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/8027073842994626152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/8027073842994626152'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/03/apollo-decollage-immediat.html' title='Apollo, decollage immediat'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-6522290241319625400</id><published>2007-03-04T13:56:00.000-08:00</published><updated>2007-03-19T11:19:02.159-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='nginx'/><category scheme='http://www.blogger.com/atom/ns#' term='mongrel'/><category scheme='http://www.blogger.com/atom/ns#' term='capistrano'/><title type='text'>nettoyage de printemps</title><content type='html'>Depuis quelques temps, je laisse mon serveur up 24/24 pour un usage interne (et plutot ludique) sur mon reseau : diffusion de films, musique et backup.&lt;br /&gt;Aujourd'hui, je me suis dit que je devrais le remettre a disposition sur internet comme au bon vieux temps.&lt;br /&gt;Il s'agit d'un PowerMac G5 (ppc 64 bits), 1.5GB de RAM, 160+250GB HDD internes.&lt;br /&gt;&lt;br /&gt;Tout d'abord, il sera utilise pour heberger le site grailsfrance.org . Pour cela , un conteneur J2ee (OC4J 10.1.3.2.0) sera utilise pour faire tourner XWiki, qui servira de moteur du site.&lt;br /&gt;&lt;br /&gt;En parallele, ce serveur sera utilise comme plateforme de test pour mes applications Ruby on Rails, avant deploiement chez mon hebergeur.&lt;br /&gt;Taches prevues :&lt;br /&gt;- Upgrade de Ruby 1.8.2 vers 1.8.5+&lt;br /&gt;- Upgrade RubyGems vers 0.9.2&lt;br /&gt;- Upgrade de Rails 1.1 vers Rails 1.2&lt;br /&gt;- Installation Capistrano&lt;br /&gt;- Installation de Mongrel&lt;br /&gt;- Installation RMagick&lt;br /&gt;- Installation nginx, un Load Balancer, Reverse Proxy et Proxy IMAP/POP3 ecrit par Igor Sysoev.&lt;br /&gt;- Upgrade mySQL &lt;br /&gt;&lt;br /&gt;Avant de commencer, je voudrais juste preciser que sur un poste de developpement Mac, une solution beaucoup plus simple serait d'installer Locomotive, un bundle Ruby/Rails.&lt;br /&gt;&lt;br /&gt;Upgrade Ruby/RubyGems :&lt;br /&gt;Nota : Ruby 1.8.2 vient preinstalle avec Mac OS X Tiger, mais n'a jamais ete mis a jour jusqu'a la version 10.4.8 de Tiger. Il faudra attendre Leopard pour une version preinstallee et plus recente de Ruby (et de Rails!!).&lt;br /&gt;&lt;br /&gt;Pour l'installation de Ruby / RubyGems , j'ai privilegie l'utilisation de DarwinPorts / MacPorts. Un autre systeme sur Mac OS X existe, Fink (inspire des installs sur Debian) , mais je ne l'ai pas teste pour Ruby/Rails.&lt;br /&gt;&lt;br /&gt;Downloader l'installeur DarwinPorts depuis http://darwinports.opendarwin.org/getdp/ ou installer a partir des sources depuis http://svn.macports.org/repository/macports/downloads/&lt;br /&gt; &lt;br /&gt;DarwinPort , et tous les futurs programmes installes via DarwinPort seront localises sous /opt/local.&lt;br /&gt;&lt;br /&gt;Une fois DarwinPort installe, installer Ruby / RubyGems  ainsi :&lt;br /&gt;&lt;br /&gt;export PATH=/opt/local/bin:$PATH (ou l'ajouter dans le fichier .bash_profile)&lt;br /&gt;&lt;br /&gt;sudo port install rb-rubygems&lt;br /&gt;&lt;br /&gt;Ruby (1.8.5), RubyGems (0.9.1) et toutes les dependances vont s'installer (peut prendre quelque temps)&lt;br /&gt;&lt;br /&gt;Ensuite, il y a juste un petit probleme sur RubyGems :&lt;br /&gt;le test suivant :&lt;br /&gt;gem install blah&lt;br /&gt;provoque une erreur...&lt;br /&gt;        from /opt/local/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:27:in `require'&lt;br /&gt;        from /opt/local/lib/ruby/vendor_ruby/1.8/rubygems/source_info_cache.rb:6&lt;br /&gt;        from /opt/local/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require'&lt;br /&gt;        from /opt/local/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:27:in `require'&lt;br /&gt;        from /opt/local/lib/ruby/vendor_ruby/1.8/rubygems/remote_installer.rb:12&lt;br /&gt;        from /opt/local/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require'&lt;br /&gt;        from /opt/local/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:27:in `require'&lt;br /&gt;        from /opt/local/lib/ruby/vendor_ruby/1.8/rubygems.rb:112:in `manage_gems'&lt;br /&gt;        from /opt/local/bin/gem:10&lt;br /&gt;&lt;br /&gt;Reinstaller RubyGems ainsi :&lt;br /&gt;cd ~/Desktop&lt;br /&gt;curl http://rubyforge.org/frs/download.php/16452/rubygems-0.9.1.tgz&lt;br /&gt;gunzip rubygems-0.9.1.tgz&lt;br /&gt;tar xvf rubygems-0.9.1.tar&lt;br /&gt;rm rubygems-0.9.1.tar&lt;br /&gt;cd rubygems-0.9.1&lt;br /&gt;sudo ruby setup.rb&lt;br /&gt;&lt;br /&gt;Au 5 mars 2007, une version 0.9.2 de RubyGems est disponible, lancer la mise a jour suivante :&lt;br /&gt;sudo gem update --system&lt;br /&gt;&lt;br /&gt;Installation Rails 1.2.2:&lt;br /&gt;Une fois RubyGems installe, lancer la commande:&lt;br /&gt;sudo gem install rails --include-dependencies&lt;br /&gt;&lt;br /&gt;Il se peut que vous recuperiez l'erreur suivante :&lt;br /&gt;&lt;br /&gt;ERROR: While executing gem … &lt;br /&gt;(Gem::GemNotFoundException) Could not find rubygems-update (&gt; 0) in any repository&lt;br /&gt;&lt;br /&gt;lancer la commande : gem env&lt;br /&gt;&lt;br /&gt;RubyGems Environment:&lt;br /&gt;  - VERSION: 0.9.2 (0.9.2)&lt;br /&gt;  - INSTALLATION DIRECTORY: /opt/local/lib/ruby/gems/1.8&lt;br /&gt;  - GEM PATH:&lt;br /&gt;     - /opt/local/lib/ruby/gems/1.8&lt;br /&gt;  - REMOTE SOURCES:&lt;br /&gt;     - http://gems.rubyforge.org&lt;br /&gt;&lt;br /&gt;Aller dans le repertoire GEM_PATH, et supprimer le fichier source_cache&lt;br /&gt;&lt;br /&gt;J'ai du relancer une fois la commande d'update de RubyGems :&lt;br /&gt;sudo gem update --system&lt;br /&gt;&lt;br /&gt;Suivi de :&lt;br /&gt;sudo gem install rails --include-dependencies&lt;br /&gt;&lt;br /&gt;Installation Capistrano :&lt;br /&gt;Rien de plus simple :&lt;br /&gt;sudo gem install capistrano&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Installation Mongrel ;&lt;br /&gt;Idem, easy man:&lt;br /&gt;sudo gem install mongrel&lt;br /&gt;&lt;br /&gt;A la question suivante, choisir en fonction de votre plateforme :&lt;br /&gt;&lt;br /&gt;Select which gem to install for your platform (powerpc-darwin8.8.0)&lt;br /&gt; 1. mongrel 1.0.1 (ruby)&lt;br /&gt; 2. mongrel 1.0.1 (mswin32)&lt;br /&gt; 3. mongrel 1.0 (mswin32)&lt;br /&gt; 4. mongrel 1.0 (ruby)&lt;br /&gt; 5. Skip this gem&lt;br /&gt; 6. Cancel installation&lt;br /&gt;&gt; 1&lt;br /&gt;Install required dependency daemons? [Yn]  Y&lt;br /&gt;Install required dependency fastthread? [Yn]  Y&lt;br /&gt;Select which gem to install for your platform (powerpc-darwin8.8.0)&lt;br /&gt; 1. fastthread 0.6.4.1 (mswin32)&lt;br /&gt; 2. fastthread 0.6.4.1 (ruby)&lt;br /&gt; 3. fastthread 0.6.3 (mswin32)&lt;br /&gt; 4. fastthread 0.6.3 (ruby)&lt;br /&gt; 5. Skip this gem&lt;br /&gt; 6. Cancel installation&lt;br /&gt;&gt; 2&lt;br /&gt;Building native extensions.  This could take a while...&lt;br /&gt;Install required dependency gem_plugin? [Yn]  &lt;br /&gt;Install required dependency cgi_multipart_eof_fix? [Yn]  &lt;br /&gt;Building native extensions.  This could take a while...&lt;br /&gt;Successfully installed mongrel-1.0.1&lt;br /&gt;Successfully installed daemons-1.0.5&lt;br /&gt;Successfully installed fastthread-0.6.4.1&lt;br /&gt;Successfully installed gem_plugin-0.2.2&lt;br /&gt;Successfully installed cgi_multipart_eof_fix-2.1&lt;br /&gt;Installing ri documentation for mongrel-1.0.1...&lt;br /&gt;Installing ri documentation for daemons-1.0.5...&lt;br /&gt;Installing ri documentation for gem_plugin-0.2.2...&lt;br /&gt;Installing ri documentation for cgi_multipart_eof_fix-2.1...&lt;br /&gt;Installing RDoc documentation for mongrel-1.0.1...&lt;br /&gt;Installing RDoc documentation for daemons-1.0.5...&lt;br /&gt;Installing RDoc documentation for gem_plugin-0.2.2...&lt;br /&gt;Installing RDoc documentation for cgi_multipart_eof_fix-2.1...&lt;br /&gt;$&lt;br /&gt;&lt;br /&gt;Installation RMagick:&lt;br /&gt;On installe via DarwinPort. Lancer la commande :&lt;br /&gt;sudo port install rb-rmagick&lt;br /&gt;&lt;br /&gt;(peut s'averer long , car beaucoup de dependances &gt; libpng, bzip2, libxml(2), tiff, freetype, ImageMagick...)&lt;br /&gt;&lt;br /&gt;Installation nginx :&lt;br /&gt;On va installer nginx a partir des sources.&lt;br /&gt;&lt;br /&gt;Installer PCRE (librairie pour les regular expressions, utile au rewrite d'URLs) au prealable:&lt;br /&gt;cd ~/Desktop&lt;br /&gt;url -O ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-6.6.tar.gz&lt;br /&gt;tar xzvf pcre-6.6.tar.gz&lt;br /&gt;cd pcre-6.6&lt;br /&gt;./configure --prefix=/usr/local  /* ajouter CFLAGS=-O1 sur MacIntel */&lt;br /&gt;make&lt;br /&gt;sudo make install &lt;br /&gt;&lt;br /&gt;Downloader NGINX depuis http://sysoev.ru/nginx/download.html&lt;br /&gt;cd ~/Desktop&lt;br /&gt;gunzip nginx-0.5.14.tar.gz&lt;br /&gt;tar xvf nginx-0.5.14.tar&lt;br /&gt;cd nginx-0.5.14&lt;br /&gt;./configure \&lt;br /&gt;        --sbin-path=/usr/local/nginx/nginx \&lt;br /&gt;        --conf-path=/usr/local/nginx/nginx.conf \&lt;br /&gt;        --pid-path=/usr/local/nginx/nginx.pid \&lt;br /&gt;        --with-http_ssl_module \&lt;br /&gt;        --with-pcre=../pcre-6.6 \&lt;br /&gt;make&lt;br /&gt;make install&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Upgrade mySQL :&lt;br /&gt;Actuellement je suis en version mySQL 4.1.18 sur le ppc... petite envie d'aller vers mySQL 5.&lt;br /&gt;&lt;br /&gt;Allez a l'adresse : http://dev.mysql.com/downloads/mysql/5.0.html&lt;br /&gt;Downloader mySQL 5.0.27 (.dmg) pour votre plateforme (dans mon cas, je prends Mac OS X, PowerPC 64 bits)&lt;br /&gt;Monter l'image et installer le package mySQL.&lt;br /&gt;Installer le panneau de demarrage de mySQL dans System Preferences (double-click sur MySQL.prefPane)&lt;br /&gt;&lt;br /&gt;Dans une fenetre de terminal:&lt;br /&gt;cd /usr/local&lt;br /&gt;Vous devriez voir le repertoire mysql-standard-5.0.27-osx10.4-powerpc-64bit&lt;br /&gt;Si comme moi vous aviez un lien symbolique mysql sur une version anterieure: rm mysql&lt;br /&gt;puis : &lt;br /&gt;ln -s mysql-standard-5.0.27-osx10.4-powerpc-64bit/ mysql&lt;br /&gt;&lt;br /&gt;Redemarrer mysql depuis System Preferences&lt;br /&gt;&lt;br /&gt;Verifiez ensuite depuis phpMyAdmin par exemple que tout fonctionne.&lt;br /&gt;&lt;br /&gt;Maintenant que l'environnement de test pour mes applis Rails, yapluka .&lt;br /&gt;Dans un prochain article, j'expliquerai :&lt;br /&gt;Deployer une application (dont les sources sont heberges dans un repository Subversion) avec Capistrano&lt;br /&gt;Demarrer Mongrel en cluster et NGINX&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-6522290241319625400?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/6522290241319625400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=6522290241319625400' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/6522290241319625400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/6522290241319625400'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/03/nettoyage-de-printemps.html' title='nettoyage de printemps'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-117148932077945092</id><published>2007-02-14T13:41:00.000-08:00</published><updated>2007-02-14T13:46:38.806-08:00</updated><title type='text'>Streamer de la video sur votre LAN avec VLC</title><content type='html'>Vous connaissez certainement &lt;a href="http://www.videolan.org/"&gt;VLC&lt;/a&gt;, petit player video multi formats qu'on ne presente plus aujourd'hui. Mais saviez vous que depuis quelques versions deja, il inclut desormais un serveur de streaming (ce serveur s'appelait auparavant VLS et devait etre installe a part)&lt;br /&gt;&lt;br /&gt;Imaginons : vous avez plusieurs machines (Mac, Linux, Windows) sur votre reseau local (filaire ou wifi)&lt;br /&gt;Vous avez toute votre bibliotheque de videos divX sur une machine faisant office de serveur, et vous souhaiteriez la diffuser sur un portable ou un ordinateur media center branche a votre TV de votre reseau local.&lt;br /&gt;&lt;br /&gt;Tout d'abord prenez la main a distance sur votre 'serveur' .. dans mon cas, cette machine est un PowerMac situe a l'etage (donc prefere le controler a distance que faire des allez retours entre le RDC et le 1er etage).&lt;br /&gt;Lancer VLC, puis ouvrir un fichier Video  (File -&gt; Open File) . Lancer la lecture.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/264685/Image%202.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/847889/Image%202.png" alt="" border="0" /&gt;&lt;/a&gt;Sur le VLC 'serveur', ouvrir le menu Fichier -&gt; Streaming/Exporting Wizard&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/424458/Image%203.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/748483/Image%203.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Choisir 'Diffuser vers un reseau' puis 'Suivant'&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/183768/Image%204.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/804892/Image%204.png" alt="" border="0" /&gt;&lt;/a&gt;Choisir 'Element de la liste de lecture' puis 'Suivant'&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/35287/Image%205.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/742972/Image%205.png" alt="" border="0" /&gt;&lt;/a&gt;Choisir 'Unicast UDP' puis saisir l'adresse IP de la machine depuis laquelle vous visionner la video.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/791196/Image%206.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/255820/Image%206.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Transcodage de la video et de l'audio : ne touchez a rien car on ne souhaite pas transformer les formats intiaux.&lt;br /&gt;Cliquer sur 'Suivant'&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/723579/Image%207.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/352997/Image%207.png" alt="" border="0" /&gt;&lt;/a&gt;Methode d'encapsulation : laisser MPEG par defaut puis 'Suivant'&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/502910/Image%208.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/652053/Image%208.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Options de diffusion supplementaires : ne touchez a rien puis 'Suivant'&lt;br /&gt;&lt;br /&gt;Enfin on a un ecran de Resume : cliquer sur Termine.&lt;br /&gt;L'image disparait du serveur&lt;br /&gt;&lt;br /&gt;Maintenant il ne reste qu'a connecter le client.&lt;br /&gt;&lt;br /&gt;Ouvrir VLC sur le poste client.&lt;br /&gt;Menu Fichier -&gt; Ouvrir un flux reseau ...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/967099/Image%209.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/281822/Image%209.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;L'image (avec le son) doit desormais apparaitre a l'ecran.&lt;br /&gt;&lt;br /&gt;Mais on prend le film en cours , puisque entre le lancement du streaming et l'ouverture sur le client il s'est deroule quelques secondes.&lt;br /&gt;&lt;br /&gt;Pour cela, retourner sur le poste serveur.&lt;br /&gt;Dans VLC, Menu VLC -&gt; Ajouter une interface -&gt; Web Interface&lt;br /&gt;&lt;br /&gt;Sur le client , ouvrir un navigateur web, puis saisir l'adresse : http://&amp;lt;ip serveur&amp;gt;:8080&lt;br /&gt;&lt;br /&gt;Vous obtenez l'interface d'admin suivante , et pouvez donc piloter un rembobinage de la video .&lt;br /&gt;&lt;br /&gt;&lt;/ip&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/88204/Image%2010.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/162660/Image%2010.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ip serveur=""&gt;&lt;br /&gt;&lt;br /&gt;Bons visionnages&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/ip&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-117148932077945092?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/117148932077945092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=117148932077945092' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/117148932077945092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/117148932077945092'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/02/streamer-de-la-video-sur-votre-lan.html' title='Streamer de la video sur votre LAN avec VLC'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-117100192553162890</id><published>2007-02-08T22:18:00.000-08:00</published><updated>2007-02-10T06:57:35.323-08:00</updated><title type='text'>OpenId ou decentraliser l'identite numerique</title><content type='html'>OpenID est au devant de la scene cette semaine depuis l'annonce d'une collaboration entre JanRain (la societe derriere openID), Microsoft, VeriSign et SXIP pour travailler sur l'interoperabilite entre OpenID et Windows CardSpace.&lt;br /&gt;&lt;br /&gt;Microsoft reconnait le role majeur d'OpenID sur internet dans le domaine de l'identity management.&lt;br /&gt;&lt;br /&gt;JanRain reconnait que Information Card, present dans Windows CardSpace,  est un moyen d'anti phishing efficace. OpenID supportera Information Card dans son code.&lt;br /&gt;&lt;br /&gt;OpenID, Verisign et SXip s'engagent a supporter Information Card comme solution de gestion d'identite.&lt;br /&gt;&lt;br /&gt;Enfin, Microsoft va supporter OpenID au niveau des serveurs de gestion d'identites.&lt;br /&gt;&lt;br /&gt;Aujourd'hui, il existe sur le web quelques implementations d'OpenID , tel que :&lt;br /&gt;&lt;a href="http://pip.verisignlabs.com/"&gt;VeriSign Personal Identity Provider&lt;/a&gt;, &lt;a href="http://iwantmyopenid.org"&gt;iwantmyopenid.org&lt;/a&gt; et &lt;a href="http://getopenid.com"&gt;getopenid.com&lt;/a&gt;&lt;br /&gt;Verisign contiendrait deja des dizaines de milliers d'iNames.&lt;br /&gt;&lt;br /&gt;A peu pres 400 services en ligne implementant openID dont &lt;a href="http://technorati.com"&gt;Technorati&lt;/a&gt;, &lt;a href="http://wikipedia.org"&gt;Wikipedia&lt;/a&gt;,  &lt;a href="http://beta.zooomr.com"&gt;Zooomr&lt;/a&gt;, &lt;a href="http://www.openidenabled.com/"&gt;Openidenabled&lt;/a&gt;&lt;br /&gt;Quelques logiciels compatibles : Plone, Apache, MediaWiki&lt;br /&gt;&lt;br /&gt;Je me suis cree une identite sur VeriSign , et j'ai stocke sur le serveur :&lt;br /&gt;mes nom, prenom, date de naissance&lt;br /&gt;Emails et telephones personnels et professionnels&lt;br /&gt;Mes adresses professionnelles et personnelles&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/879543/Image%201.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/352273/Image%201.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;On peut ensuite de creer des profils de confiance :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Anonymous&lt;/span&gt; : aucune information n'est divulguee&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Blog&lt;/span&gt; : nom, prenom et blog&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;e-commerce&lt;/span&gt; : Nom, prenom, email, adresses de livraison et de facturation&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/572393/Image%202.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/290103/Image%202.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Cette identite est disponible en ligne a l'adresse : &lt;a href="http://lbois.pip.verisignlabs.com"&gt;&lt;span class="highlighted"&gt;lbois.pip.verisignlabs.com&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ensuite, pour tester, se connecter a Zooomr avec l'identite Verisign.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/39359/Image%203.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/708096/Image%203.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Zoomr redirige vers VeriSign pour :&lt;br /&gt;l'authentification puis choisir le profil de confiance&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/213401/Image%204.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/375381/Image%204.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Retour sur Zooomr pour completer l'enregistrement :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/391162/Image%205.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/573742/Image%205.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/792683/Image%206.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/202876/Image%206.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enfin, verifier l'activite sur VeriSign:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/890484/Image%207.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/704793/Image%207.png" alt="" border="0" /&gt;&lt;/a&gt;OpenID ne dit pas 'la personne connectee est le vrai Laurent Bois' mais plutot 'C'est la meme personne qui a utilise ce service la derniere fois'&lt;br /&gt;&lt;br /&gt;Des organismes (Twofina, Optinity) travaillent sur la verification.&lt;br /&gt;&lt;br /&gt;A noter que du cote des entreprises , il existe un consortium Liberty Alliance (IBM, Oracle, Sun, Novell) ayant deja implemente une solution WS-Federation, apparemment plus complete que OpenID.&lt;br /&gt;&lt;br /&gt;OpenID reste toujours tres interessant pour des applications webs hebergees.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Integrer OpenID dans son application web :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;PHP&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.openidenabled.com/resources/docs/openid/php/1.2.0-pre2/OpenID/tutorial_OpenID.pkg.html"&gt;PHP OpenID API&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Ruby&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.openidenabled.com/openid/libraries/ruby/about"&gt;Ruby OpenID Library&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Java&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.idprism.org/"&gt;IDPrism&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;.NET&lt;/span&gt;&lt;br /&gt;&lt;a href="http://openid.nterface.com/"&gt;nterface &lt;/a&gt;; .NET OpenID consumer library&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Python&lt;/span&gt;&lt;br /&gt;&lt;a href="http://openidenabled.com/openid/libraries/python"&gt;OpenID Server and Consumer&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Source:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.tendances.it/?post/2006/11/29/OpenID-%3A-la-federation-didentite-sur-le-Web"&gt;Tendances IT (Veille Techno SQLI)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-117100192553162890?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/117100192553162890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=117100192553162890' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/117100192553162890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/117100192553162890'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/02/openid-ou-decentraliser-lidentite.html' title='OpenId ou decentraliser l&apos;identite numerique'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-117060176649489628</id><published>2007-02-04T07:09:00.000-08:00</published><updated>2007-02-04T10:01:08.516-08:00</updated><title type='text'>Java n'est pas la solution a tous les problemes</title><content type='html'>Avant de commencer, et avant qu'on me le signale,  je souhaiterais juste ajouter que le titre de cet article peut s'adapter a d'autres langages ou frameworks :&lt;br /&gt;Ca marche aussi pour Rails (par exemple) , qui n'est pas la solution a tous les problemes.&lt;br /&gt;&lt;br /&gt;Aujourd'hui, il appartient a l'architecte et au developpeur, chacun s'appuyant sur son experience, de se faire un chemin sur les routes tortueuses des frameworks Web, et de s'adapter au besoin.&lt;br /&gt;Dans certains cas par exemple, des frameworks lightweight seront suffisants (les RIFE, Stripes, Grails, Rails), dans d'autres cas, toute la batterie de services fournie par JEE sera nécessaire, et des frameworks sachant en tirer partie , comme Spring, seront adaptes.&lt;br /&gt;&lt;br /&gt;Je suis tombe en cette fin de semaine sur un article de &lt;a href="http://www.bruceeckel.com"&gt;Bruce Eckel&lt;/a&gt; , "&lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=193593"&gt;Hybridizing Java&lt;/a&gt;" sur Artima, dans lequel Monsieur 'Thinking in X', et particulierement de &lt;span style="font-style: italic;"&gt;Thinking in Java&lt;/span&gt; (dont les différentes éditions ont été mon livre de chevet pendant quelques années), nous explique sa vision sur les RIAs , et pourquoi Java et Ajax ne font pas vraiment l'affaire.&lt;br /&gt;&lt;br /&gt;Globalement je suis assez d'accord avec lui, a quelques differences que je vais tacher de mettre en evidence dans cet article.&lt;br /&gt;&lt;br /&gt;Dans le meme esprit, Bruce Tate avait parle de J2EE (plus vulgairement, pourquoi J2EE est un beau bordel) dans son livre &lt;a href="http://www.oreilly.com/catalog/beyondjava/"&gt;Beyond Java&lt;/a&gt;, et expliquait pourquoi un language comme Ruby et un framework comme Rails pouvait faire l'affaire, dans 80% des cas dirons nous.&lt;br /&gt;&lt;br /&gt;Bruce Eckel commence son discours sur Java, et particulierement les Applets ainsi que les applications JavaWebStart:&lt;br /&gt;pourquoi ne sont elles jamais devenues des technologies privilégiées pour les RIAs.&lt;br /&gt;&lt;br /&gt;L'un des plus grands problemes etant :&lt;br /&gt;- la barrière de l'installation du JRE sur le poste client pour les applets comme pour les applications desktop: difficile pour la plupart des utilisateurs lambda du web.&lt;br /&gt;&lt;br /&gt;JavaWebStart quant a lui, a beaucoup ameliore les choses :&lt;br /&gt;evidemment , le poste client doit toujours etre dote d'un JRE; dans une entreprise, ce n'est pas reellement une barriere sachant que la plupart du temps, les applications sont installees et mises a jour regulierement via le reseau depuis des serveurs.&lt;br /&gt;Il souleve neanmoins les problemes de cohabitation de plusieurs Jdk (1.3, 1.4, 1.5, 6):  nous, developpeurs, sommes habitues a switcher de jdk depuis notre IDE et lors de nos tests, mais pour un utilisateur lambda...c'est toujours le meme probleme.&lt;br /&gt;JavaWebStart ameliore significativement le deploiement, mais fonctionne toujours dans le meme esprit qu'une applet, avec une "sandbox". Des policies de securite doivent etre configurees afin de donner des droits a l'application desktop (pour ecrire par exemple sur le disque dur du poste client). De meme , il faut signer les jars de l'application. Cependant , des solutions comme &lt;a href="http://jnlp.sourceforge.net/netx/"&gt;NetX&lt;/a&gt; facilitent les choses : permettent de profiter de la technologie JavaWebStart en faisant sauter quelques verrous (signatures des jars par exemple).&lt;br /&gt;&lt;br /&gt;Il souligne le manque de support Multimedia de Java. L'API &lt;a href="http://java.sun.com/products/java-media/jmf/"&gt;JMF&lt;/a&gt; (Java Media Framework) n'a jamais supporte le MP3 par exemple. Pour avoir travaille quelques temps avec JMF sur une application de visio-conference, je me suis bien rendu compte de de la difficulte a supporter les differents devices (WebCam, Audio).&lt;br /&gt;&lt;br /&gt;Il ne faut pas oublier egalement la complexite de Swing au depart qui peut arreter bon nombre de developpeurs. Des API sont apparues telles que &lt;a href="http://www.eclipse.org/swt/"&gt;SWT&lt;/a&gt; (du cote d'Eclipse), et toutes les familles des RCP (Rich Client Platform) de chez &lt;a href="http://www.eclipsezone.com/eps/10minute-rcp/"&gt;Eclipse&lt;/a&gt;, &lt;a href="http://platform.netbeans.org/"&gt;Netbeans&lt;/a&gt;, et recemment &lt;a href="http://www.springframework.org/spring-rcp"&gt;Spring&lt;/a&gt; , pour  tenter de remedier a ce probleme. Je ne serais pas aussi radical que Bruce Eckel, et je dirais que ces solutions devraient tout de meme etre etudiees sur tout projet , dans lequel une application desktop devrait etre implementee.&lt;br /&gt;&lt;br /&gt;Viennent ensuite quelques explications sur les problèmes liés à Ajax :&lt;br /&gt;- Coût : les applications ajaxifiées (HTML, CSS, Javascript) sont la plupart du temps difficiles et chères à développer.&lt;br /&gt;- Confrontation du developpeur aux différences entre les navigateurs (IE 5/6/7, Firefox, Safari, Opera), plus varies aujourd'hui qu'au debut des annees 2000 (IE 4, Netscape).&lt;br /&gt;Ormis les grosses différences pour XMLHttpRequest, on est toujours confronté a un moment ou a un autre à un problème quelconque lié aux navigateurs (Fonts, marges...). Bien qu'aujourd'hui certains frameworks 'cross browser' tels que &lt;a href="http://www.prototypejs.org/"&gt;Prototype&lt;/a&gt; ou &lt;a href="http://dojotoolkit.org/"&gt;Dojo&lt;/a&gt; (pour ne citer que les plus connus) resolvent ces problemes, dès qu'on veut coder soi-meme, pas d'autre choix que devenir un expert de chaque navigateur.&lt;br /&gt;&lt;br /&gt;Plusieurs frameworks ont pourtant radicalement change la facon de developper des applications Ajax:&lt;br /&gt;- je commencerai par &lt;a href="http://www.rubyonrails.org/"&gt;Rails&lt;/a&gt; (s'appuie sur Prototype et script.aculo.us), qui permet de se passer de coder en Javascript pour tout ce qui est Ajax. Dans Rails, des helpers permettent de developper des composants ajaxifies en Ruby.&lt;br /&gt;- Google a sorti son &lt;a href="http://code.google.com/webtoolkit/"&gt;GWT&lt;/a&gt; (Google Web Toolkit), un framework 'serveur' , qui permet de developper des applications Ajax en Java. Le code client etant retranscrit ensuite en Javascript. Surveiller ce framework, qui est annonce comme un des frameworks phares de 2007.&lt;br /&gt;&lt;br /&gt;Finalement , Bruce en arrive a la conclusion que Flash, et particulierement &lt;a href="http://www.adobe.com/fr/products/flex/"&gt;Flex&lt;/a&gt;, apparu en 2004 et aujourd'hui mature, serait la plateforme de choix des RIAs :&lt;br /&gt;La présence du plugin Flash sur 98% des ordinateurs (d'apres Adobe), son portage sur les 3 principaux OS (Windows, Mac OS X, Linux), le support du multimedia (MP3, divers formats vidéo, webcams), le Look &amp; Feel agreable des UIs, la capitalisation sur Javascript non perdue avec &lt;a href="http://labs.adobe.com/wiki/index.php/ActionScript_3:resources:apis:libraries"&gt;ActionScript&lt;/a&gt; (devenu OpenSource dans sa version 3.0 recemment), le paradigme 'write once run everywhere'.&lt;br /&gt;Des frameworks autour de Flex existent, tel que &lt;a href="http://labs.adobe.com/wiki/index.php/Cairngorm"&gt;Cairngorm&lt;/a&gt;, et surtout, l'annee 2007 va etre marquee par la sortie du tres attendu &lt;a href="http://labs.adobe.com/wiki/index.php/Apollo"&gt;Apollo&lt;/a&gt;, qui permettra aux applications Flex/Flash de 'sortir du browser'.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ce qu'il faut savoir au minimum sur Flex (2) : &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Flex offre un langage de description d'UI appelé MXML, un langage de scripting (ActionScript) pour toute la logique.&lt;br /&gt;Le Flex 2 SDK (compiler) est desormais gratuit (ce qui n'etait pas le cas avec la version 1.5), et ainsi, chaque developpeur est invité à consacrer un peu de temps pour tester le produit.&lt;br /&gt;Adobe a rendu payant l'IDE FlexBuilder, réécrit il y a 2 ans sur une base d'Eclipse ( l'IDE peut être utilisé un mois a l'essai).&lt;br /&gt;Certains composants, tels que &lt;a href="http://www.adobe.com/fr/products/flex/charting/"&gt;Flex Charting&lt;/a&gt;, sont restes quant a eux payants.&lt;br /&gt;Il existe aussi un &lt;a href="http://labs.adobe.com/wiki/index.php/Flex_Framework:FABridge"&gt;bridge entre Flex et Ajax&lt;/a&gt; desormais (depuis la version 2.0).&lt;br /&gt;&lt;br /&gt;L'UI Flex communique avec le serveur de plusieurs facons (plus ou moins performantes) :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;AMF (Action Message Format):&lt;/span&gt; passerelle d'objets distants (Java Beans, EJB, POJO). AMF est un protocole binaire de transferts de données (son utilisation  est conseillée par Adobe, car plus performant que SOAP).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;XML&lt;/span&gt; avec les HTTPServices (REST) ou SOAP Service.&lt;br /&gt;&lt;br /&gt;Il est egalement possible d'utiliser sur le serveur des services plus avancés :&lt;br /&gt;&lt;br /&gt;le serveur &lt;a href="http://www.adobe.com/products/flex/dataservices/"&gt;Flex Data Services&lt;/a&gt; (gratuit pour une CPU) : Flex Data Services permet developper des applications non seulement riches en terme d'interface, mais aussi en terme d'échange des données entre les tiers. Déployé en tant qu'application J2EE, Flex Data Services offre une connectivité améliorée entre le client et les composants coté serveur (données, business logic). Basé sur une architecture orientée message, il s'intègre avec les middlewares du marché et fournit des services améliorés tels que :&lt;br /&gt;Data push server (sans polling de la part du client), publish/subscribe messaging.&lt;br /&gt;Il facilite le développement d'applications de collaboration, et d'applications disconnectées.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.adobe.com/fr/products/flashmediaserver/"&gt;Flash Media Server&lt;/a&gt; (anciennement Flash Communication Server) : pour tout ce qui est diffusion (broadcast) de flux audio/video.&lt;br /&gt;&lt;br /&gt;De facon generale, la plateforme de choix cote serveur est J2EE, avec une preference pour &lt;a href="http://www.adobe.com/products/jrun/"&gt;JRun&lt;/a&gt; , rachete par Macromedia a Allaire il y a quelques annees (mais pour Flex, d'autres serveurs sont supportes tels que Oracle AS 10g, Tomcat, JBoss, BEA). Neanmoins, les Labs d'Adobe travaillent sur des solutions d'integration  avec d'autres technos; par exemple &lt;a href="http://labs.adobe.com/wiki/index.php/Flex_Framework:tutorials:flex2_and_php"&gt;PHP&lt;/a&gt; ou Rails (&lt;a href="http://blogs.adobe.com/mikepotter/2006/09/announcing_the_1.html"&gt;Rails RIA SDK&lt;/a&gt;).&lt;br /&gt;Un bresilien a recemment cree un &lt;a href="http://rubyforge.org/projects/flexscaffold/"&gt;Flex Scaffold&lt;/a&gt;, a l'image du scaffold dans Ruby on Rails.&lt;br /&gt;&lt;br /&gt;Quelques exemples interessants :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.adobe.com/devnet/flex/example_apps.html"&gt;Flex 1.5 Application Examples&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Un &lt;a href="ttp://www.renaun.com/flex2/BarcodeReader/BarcodeExample.html"&gt;BarCode Reader&lt;/a&gt; fait avec Flex. Fonctionnalite identique a la fonction de scan des barcodes dans &lt;a href="http://www.delicious-monster.com/"&gt;Delicious Library&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Une alternative open-source à Flex est OpenLaszlo :&lt;br /&gt;Comme pour Flex , l'UI est du Flash. Pour ce qui est scripting ce n'est plus ActionScript mais un dérivé de Javascript.&lt;br /&gt;Quelques applications 'impressionnantes' développées avec &lt;a href="http://www.openlaszlo.org/"&gt;OpenLaszlo&lt;/a&gt; :&lt;br /&gt;Une version Flash de l'outil Visio, &lt;a href="http://www.gliffy.com/"&gt;Gliffy&lt;/a&gt; .&lt;br /&gt;Le service de 'discovery music', &lt;a href="http://www.pandora.com/"&gt;Pandora&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt;Sinon d'autres alternatives Open Source a certains composants Flash existent :&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/openamf/"&gt;OpenAMF&lt;/a&gt; repond a Flash Remoting&lt;br /&gt;&lt;a href="http://www.gnu.org/software/gnash/"&gt;Gnash&lt;/a&gt; repond au Flash Player&lt;br /&gt;&lt;br /&gt;Il faut egalement savoir que des applications Flash peuvent etre declinees dans le monde de la mobilite (PDA, Smart Phone) grace a &lt;a href="http://www.adobe.com/products/flashlite/"&gt;FlashLite&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pour avoir travaille avec Flex quelques mois (etude de comparaison Flex, OpenLaszlo, Ajax - maquettage d'une RIA avec Flex 1.5 au dessus d'une BackEnd Java Struts deploye sur Oracle AS 10g)  voila  les conclusions dans les grandes lignes :&lt;br /&gt;-  FlexBuilder facilite grandement la tache pour la creation de l'UI (Layouter evitant d'ecrire le MXML a la main)... suffisant pour une application relativement simple.&lt;br /&gt;- Par contre, pour une application plus complexe, l'immersion dans le codage ActionScript est obligatoire, et l'utilisation d'un Framework (Cairngorm ou fait maison) est conseillee.&lt;br /&gt;- Ne pas sous-estimer la partie infographie : si vous en avez le talent , sinon faire appel a des infographistes, la composition de widgets graphiques sera necessaire dans le cas d'un Look &amp; Feel sortant des sentiers battus pour votre application.&lt;br /&gt;- Par contre le grand avantage (par rapport a Ajax) est que le paradigme 'Write Once Run EveryWhere' est respecte : on ne se soucie plus du type de navigateur, pourvu qu'on ait un Flash Player. En gros, connaitre Java, Php, .NET ou Rails pour la partie Serveur, et cote client, la connaissance du couple MXML/ActionScript suffit.&lt;br /&gt;&lt;br /&gt;Pour conclure, les defenseurs de Flash craignent cette annee l'arrivee de &lt;a href="mms://wm.microsoft.com/ms/msnse/0509/25408/sparkle_team_2005_mbr.wmv"&gt;Microsoft Sparkle&lt;/a&gt; / Interactive Designer, pour developper des applications basees sur WPF (Windows Presentation Foundation), ex-Avalon . A surveiller egalement de pres.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Lecture :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.oreilly.com/catalog/programadobe/"&gt;Programming Flex 2&lt;/a&gt; : Rough Cuts version&lt;br /&gt;&lt;br /&gt;&lt;a href="http://flexiblerails.com/"&gt;Flexible Rails&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-117060176649489628?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/117060176649489628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=117060176649489628' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/117060176649489628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/117060176649489628'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/02/java-nest-pas-la-solution-tous-les.html' title='Java n&apos;est pas la solution a tous les problemes'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-116963906783522231</id><published>2007-01-24T03:43:00.000-08:00</published><updated>2007-01-24T03:44:28.876-08:00</updated><title type='text'>Developper des Dahsboard Widgets avec Dashcode</title><content type='html'>&lt;p&gt;&lt;strong&gt;Dashcode&lt;/strong&gt; est une nouvelle application pour développer des Widgets Dashboard, qui viendra préinstallée avec Mac OS X 10.5 (Leopard)&lt;br /&gt;&lt;br /&gt;Néanmoins, il est deja possible de downloader une version beta pour Tiger (10.4) depuis le site Apple Developer Connection (inscription gratuite)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a name='more'&gt;&lt;/a&gt;Pour rappel, développer un Widget Dashboard est très proche d'une déclinaison Ajax d'un élément graphique dans une page Web :&lt;br /&gt;&lt;br /&gt;comme Ajax, c'est en effet un mélange de (D)HTML, CSS, Javascript (XMLHttpRequest).&lt;br /&gt;&lt;br /&gt;Installé depuis peu sur mon Mac : cet outil s'avère tres facile d'emploi, intuitif (fidèle à l'esprit Apple) et permet de développer de tres beaux Widgets (une panoplie de templates est fournie). A noter que le moteur de Dashboard est le &lt;a href="http://webkit.org/"&gt;WebKit&lt;/a&gt; (le moteur de Safari) et est embarqué dans l'IDE pour tester.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Dans un futur proche, il devrait être possible de déployer vos Widgets sur l'iPhone, embarquant lui-même &lt;a href="http://webkit.org/"&gt;WebKit &lt;/a&gt;(avec Safari et Dashboard).&lt;br /&gt;&lt;br /&gt;Plutot que recréer un article 'tutorial' , &lt;a href="http://social.hortis.ch/2006/03/26/apple-dashboard-developper-des-widgets/"&gt;chose &lt;/a&gt;que j'ai déja faite il y a un an au sujet des Widgets, voici l'&lt;a href="http://developer.apple.com/tools/dashcode/"&gt;URL &lt;/a&gt;de la page Dashcode chez Apple.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://developer.apple.com/documentation/AppleApplications/Conceptual/Dashboard_Tutorial/index.html"&gt;Tutorial Dashboard Widgets&lt;/a&gt; chez ADC.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Sur Windows, on peut egalement développer des Widgets grâce a :&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://widgets.yahoo.com/"&gt;Yahoo Widgets&lt;/a&gt; (ex-Konfabulator...apparu avant Dashboard Widgets)&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://desktop.google.com/plugins/?hl=fr"&gt;Google Desktop/Universal Gadgets&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://microsoftgadgets.com/"&gt;MicrosoftGadgets&lt;/a&gt; : une video est dispo &gt;&gt; &lt;a href="http://channel9.msdn.com/Showpost.aspx?postid=255735"&gt;ici&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-116963906783522231?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/116963906783522231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=116963906783522231' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116963906783522231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116963906783522231'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/01/developper-des-dahsboard-widgets-avec.html' title='Developper des Dahsboard Widgets avec Dashcode'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-116958072588356685</id><published>2007-01-23T11:31:00.000-08:00</published><updated>2007-01-23T11:32:07.126-08:00</updated><title type='text'>Belle initiative</title><content type='html'>On applaudissait deja des deux mains le projet &lt;a href="http://wikipedia.org/"&gt;Wikipedia&lt;/a&gt;, voila un autre projet, &lt;a href="http://www.moulinwiki.org/"&gt;Moulin&lt;/a&gt;, qui merite le detour.&lt;br /&gt;&lt;br /&gt;Il s'agit de la version offline de Wikipedia, completement interactive (mais sans les images).&lt;br /&gt;La premiere version , francaise, regroupe les 404 000 articles dans une image de 554 Mo prete a graver sur CD.&lt;br /&gt;&lt;br /&gt;Pourquoi? La plupart des gens dans les pays en voie de developpement vivent sans connexion internet. Pour le prix d'un simple CD-R, voici l'encyclopedie en ligne disponible offline, et prete au partage avec un plus grand nombre de personnes.&lt;br /&gt;&lt;br /&gt;La suite. Poursuivre le developpement de cette version, dans d'autres langues (Anglais, espagnol, portuguais, chinois et allemand), toujours pour un support CD ou DVD.&lt;br /&gt;&lt;br /&gt;L'equipe initiatrice du projet est &lt;a href="http://mali.geekcorps.org/"&gt;IESC Geekcorps Mali&lt;/a&gt; avec l'aide de &lt;a href="http://www.usaid.gov/"&gt;USAID&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pour la petite histoire technique (je ne peux pas m'en empecher) : Moulin est cross plateformes (Mac, Windows, Linux) car developpe avec une techno adaptee a cet effet, venant du groupe Mozilla: XUL(-Runner). &lt;a href="http://xulplanet.com/"&gt;XUL&lt;/a&gt; est utilise dans le developpement des extensions &lt;a href="http://www.mozilla.com/firefox/"&gt;Firefox&lt;/a&gt;, de &lt;a href="http://www.mozilla.com/thunderbird/"&gt;Thunderbird&lt;/a&gt;, et d'une autre belle application prometteuse, &lt;a href="http://www.vecosys.com/2007/01/19/joost-is-another-xulrunner-app/"&gt;Joost&lt;/a&gt; (ex-Venice Project..par les createurs de Kazaa et Skype)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-116958072588356685?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/116958072588356685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=116958072588356685' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116958072588356685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116958072588356685'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/01/belle-initiative.html' title='Belle initiative'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-116950534827295581</id><published>2007-01-22T14:21:00.000-08:00</published><updated>2007-01-22T14:35:48.670-08:00</updated><title type='text'>KDE (4) s'invite sur Mac</title><content type='html'>Le voici le voila sur Mac, &lt;a href="http://ranger.users.finkproject.org/kde/index.php/Home"&gt;KDE 4&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Et cela s'installe tres bien, grace a une serie d'images .dmg successives.&lt;br /&gt;&lt;br /&gt;1 - Downloader KDE 4 (Everything - 1.9 GB) par bitTorrent&lt;br /&gt;2 - Monter l'image DMG&lt;br /&gt;2- Installer dans l'ordre suivant les packages : Qt (GUI software toolkit/widget-kit), kdesupport, kdelibs, kdepimlibs, kdebase et koffice.&lt;br /&gt;3 - Modifier ~/.bash_profile pour ajouter les lignes suivantes :&lt;br /&gt;&lt;pre&gt;export PATH="/opt/kde4/bin:/opt/kde4-deps/bin:/opt/qt4/bin:$PATH"&lt;br /&gt;eval `dbus-launch --auto-syntax`&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;4 - Lancer une application (le navigateur Web Konqueror par exemple)&lt;br /&gt;cd /opt/kde4/bin/konqueror.app/Contents/MacOS/; ./konqueror&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/527447/Image%201.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/109396/Image%201.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tester de meme konsole, kwrite, kword ...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/938047/Image%203.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/650679/Image%203.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/304677/Image%202.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/919673/Image%202.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/3838/2764/1600/668928/Image%204.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/3838/2764/320/95579/Image%204.png" alt="" 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/26409911-116950534827295581?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/116950534827295581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=116950534827295581' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116950534827295581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116950534827295581'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/01/kde-4-sinvite-sur-mac.html' title='KDE (4) s&apos;invite sur Mac'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-116876776234822633</id><published>2007-01-14T00:44:00.000-08:00</published><updated>2007-01-15T12:21:35.783-08:00</updated><title type='text'>Creer sa distribution Linux online</title><content type='html'>De par mon experience dans l'installation de distributions Linux (RedHat, Fedora, Suse, Debian, Ubuntu), j'ai souvent constate que cela installait evidemment des softs qui m'interessaient mais egalement une multitude de softs inutiles , et que ca prenait trop d'espace sur le disque dur.&lt;br /&gt;&lt;br /&gt;Idealement, choisir une distribution Linux, et des softs/services au cas par cas, puis obtenir l'image ISO (allegee)  prete a graver sur un CD-R.&lt;br /&gt;&lt;br /&gt;Ce service existe sur Internet et s'appelle &lt;a href="http://www.instalinux.com/"&gt;instalinux&lt;/a&gt; .&lt;br /&gt;Sur leur site, on choisit tout d'abord une distribution Linux : CentOS (l'equivalent open-source de la RedHat 3, commerciale), Fedora (3, 4, 5, 6), Scientific, Debian (3.1), KUbuntu, Suse (9, 10, 10.1), Ubuntu (Dapper, Hoary, Breezy). Elles existent pour i386 et x386_64.&lt;br /&gt;&lt;br /&gt;Ensuite les parametrages classiques : TimeZone, primary language, Keyboard, Mouse.&lt;br /&gt;&lt;br /&gt;Et la ca devient interessant :&lt;br /&gt;Choisir les bundles (classique) de la distribution :&lt;br /&gt;Desktop environment (Gnome, KDE), Mail Server, News Server, DNS Server, Network Servers, Web Server, Database Server (mySQL, PostgreSQL), Windows FileServer, Administration Tools, Server Configuration, Development Tools, Eclipse (IDE Developpement Java, C , C++), Java, Ruby (eh oui il est propose dans la liste!!), Sound &amp; Video, Office &amp;amp; Productivity...&lt;br /&gt;&lt;br /&gt;Puis vient le type de partitioning pour le filesystem.&lt;br /&gt;&lt;br /&gt;Pour finir on choisit un mot de passe pour root, et on cree son user.&lt;br /&gt;&lt;br /&gt;Dernier step, l'ISO est disponible au download, prete a graver.&lt;br /&gt;&lt;br /&gt;On peut ainsi aboutir au finish a une image ISO (suivant les services choisis precedemment) minimaliste, de taille pouvant etre inferieure a 10 Mo.&lt;br /&gt;&lt;br /&gt;A decouvrir.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-116876776234822633?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/116876776234822633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=116876776234822633' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116876776234822633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116876776234822633'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/01/creer-sa-distribution-linux-online.html' title='Creer sa distribution Linux online'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-116808008043204651</id><published>2007-01-06T02:10:00.000-08:00</published><updated>2007-01-06T02:41:21.020-08:00</updated><title type='text'>Travail collaboratif avec Google Docs</title><content type='html'>Ce matin, j'etais en ligne avec un ami, sur Mac (comme moi) , et on cherchait un outil de partage d'application (e-meeting, Whiteboard)  afin de travailler en temps reel tous les deux sur un document.&lt;br /&gt;&lt;br /&gt;Quelques recherches sur Google nous ont mis sur la voie de &lt;a href="http://www.codingmonkeys.de/subethaedit/"&gt;SubEthaEdit&lt;/a&gt; et  &lt;a href="http://www.marratech.com/"&gt;Marratech&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ces deux applications s'averent difficiles a configurer pour un usage sur Internet : d'autant plus  si on est derriere un routeur avec firewall et NAT.&lt;br /&gt;&lt;br /&gt;Bref, on est alle voir sur &lt;a href="http://docs.google.com/"&gt;Google Docs &amp;amp; Spreadsheets&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On savait tous les deux qu'on peut mettre en partage un document (Word, OpenOffice, PowerPoint) entre differents utilisateurs Google , mais on ne savait pas si: en travaillant a deux en edition sur un document , on pouvait voir les modifications de l'autre en temps reel (au caractere pres).&lt;br /&gt;&lt;br /&gt;Surprise, Google a fait les choses bien (vive Ajax!) :&lt;br /&gt;&lt;br /&gt;Creer un nouveau document, ou uploader un document Word , OpenOffice, PowerPoint.&lt;br /&gt;Editer le document, puis suivre l'onglet 'Collaborate': Inviter des collaborateurs (ayant un compte GMail), qui auront le droit d'ecriture. Des 'Viewers' peuvent egalement etre invites.&lt;br /&gt;&lt;br /&gt;La personne invitee recoit une invitation par email, contenant le lien vers le document en partage.&lt;br /&gt;Une fois les deux personnes connectees sur le document : chacun voit la modification (quasiment au caractere pres) de l'autre. Si le refresh echoue, un lien en bas de document existe pour forcer le rafraichissement du WhiteBoard.&lt;br /&gt;&lt;br /&gt;Tres pratique, et surtout, aucune configuration particuliere requise sur son poste (juste un navigateur moderne supportant la techno Ajax).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codingmonkeys.de/subethaedit/"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-116808008043204651?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/116808008043204651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=116808008043204651' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116808008043204651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116808008043204651'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/01/travail-collaboratif-avec-google-docs.html' title='Travail collaboratif avec Google Docs'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-116807412657749574</id><published>2007-01-06T00:47:00.000-08:00</published><updated>2007-01-06T01:02:07.830-08:00</updated><title type='text'>bitTyrant</title><content type='html'>Voici un nouveau client BitTorrent, &lt;a href="http://bittyrant.cs.washington.edu/"&gt;bitTyrant&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Le client est multi plateforme : en effet, c'est une modification du client bien connu Azureus, disponible sur sourceforge.net et developpe en Java.&lt;br /&gt;&lt;br /&gt;bitTyrant est base sur un protocole compatible bitTorrent, sauf qu'il mise sur la performance : en effet, lors du download, il prend en priorite les sources ayant le meilleur debit montant: au finish les performances seraient ameliorees de 70% par rapport a Azureus.&lt;br /&gt;&lt;br /&gt;Aujourd'hui bitTorrent est le protocole privilegie pour le transfert de fichiers en mode p2p : bien que dans la majorite des cas (suivant la legislation du pays), les downloads sont illegaux, car concernent des fichiers musicaux, des films ou encore des logiciels commerciaux, des editeurs en ont tout de suite compris le gain (de temps) et l'utilisent pour permettre le download de logiciels volumineux : c'est le cas des distributions Linux Ubuntu, Sabayon, openSuse, Fedora par exemple.&lt;br /&gt;&lt;br /&gt;Faites en bon usage.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-116807412657749574?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/116807412657749574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=116807412657749574' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116807412657749574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116807412657749574'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2007/01/bittyrant.html' title='bitTyrant'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-116755293369398805</id><published>2006-12-31T00:00:00.000-08:00</published><updated>2006-12-31T00:36:34.876-08:00</updated><title type='text'>Mes premiers pas dans le jeu Second Life</title><content type='html'>Sur conseil d'un ami, tonton pour pas le nommer, je me suis inscrit a &lt;a href="http://www.secondlife.com"&gt;Second Life&lt;/a&gt; hier (mon avatar porte le nom Laurent Brynner si parmi vous, certains voulaient m'y retrouver). Il s'agit d'un jeu, connecte sur Internet, qui represente un monde parallele a notre monde reel, dans lequel nous avons un double virtuel (avatar) a piloter et faire vivre ( un peu a la Sims)&lt;br /&gt;&lt;br /&gt;Lors des premieres connexions, on arrive sur une ile d'entrainement (Orientation 17 dans mon cas), comportant un genre de parcours fleche : on apprend ainsi a se deplacer. Regulierement on croise des balises nous indiquant comment chatter avec ses congeneres virtuels, manipuler la camera , attraper des objets, remodeler son avatar...&lt;br /&gt;&lt;br /&gt;Je ne peux pas dire grand chose pour l'instant, vu que je suis encore sur le parcours d'entrainement , mais ce que je sais, c'est que je n'y passerais pas des heures. J'y suis alle par simple curiosite, histoire de m'en faire une idee avant cette fin d'annee 2006.&lt;br /&gt;&lt;br /&gt;On ne sait pas vraiment ce qu'on doit faire: on erre sur l'ile, on croise des inconnus, on discute un peu..c'est tout.&lt;br /&gt;&lt;br /&gt;Ensuite on devrait avoir acces au vrai monde (si on peut le nommer ainsi), aller dans les magasins, se teleporter sur des iles. Pour que ce soit vraiment interessant (avoir des Linden Dollars , monnaie du jeu), acheter des batiments, des iles, creer un business, il faut upgrader son compte (basic, gratuit) vers Premium (6 usd par mois)...ce que je ne compte pas faire. Je crains qu'en restant sur un compte gratuit, il n'y ait pas un grand interet a jouer.&lt;br /&gt;&lt;br /&gt;Aujourd'hui il semble y avoir un engouement autour de ce jeu : des societes comme IBM, Sun ou Dell y ont deja pignon sur rue. Effet de mode, ou nouvelle facon de naviguer dans un univers 3D ? (IBM y voit une future facon de naviguer sur le web) : l'avenir nous le dira...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-116755293369398805?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/116755293369398805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=116755293369398805' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116755293369398805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116755293369398805'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2006/12/mes-premiers-pas-dans-le-jeu-second.html' title='Mes premiers pas dans le jeu Second Life'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-116507247896078810</id><published>2006-12-02T06:51:00.000-08:00</published><updated>2006-12-02T07:28:10.326-08:00</updated><title type='text'>Installation LightTPD</title><content type='html'>Toujours sur le Mac Book Intel , installation du server LightTPD.&lt;br /&gt;La procedure d'install. a ete reprise avec succes sur &lt;a href="http://hivelogic.com/articles/2005/12/01/ruby_rails_lighttpd_mysql_tiger"&gt;Hivelogic&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Installation du module FastCGI : &lt;br /&gt;&lt;br /&gt;curl -O http://www.fastcgi.com/dist/fcgi-2.4.0.tar.gz&lt;br /&gt;tar xzvf fcgi-2.4.0.tar.gz&lt;br /&gt;cd fcgi-2.4.0&lt;br /&gt;./configure --prefix=/usr/local&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;br /&gt;Installation des Ruby bindings pour FastCGI:&lt;br /&gt;&lt;br /&gt;curl -O http://sugi.nemui.org/pub/ruby/fcgi/ruby-fcgi-0.8.6.tar.gz&lt;br /&gt;tar xzvf ruby-fcgi-0.8.6.tar.gz&lt;br /&gt;cd ruby-fcgi-0.8.6&lt;br /&gt;/usr/local/bin/ruby install.rb config --prefix=/usr/local&lt;br /&gt;/usr/local/bin/ruby install.rb setup&lt;br /&gt;sudo /usr/local/bin/ruby install.rb install&lt;br /&gt;cd ..&lt;br /&gt;&lt;br /&gt;Nous aurons besoin d'installer le GEM FastCGI:&lt;br /&gt;La commande est on ne peut plus simple:&lt;br /&gt;&lt;br /&gt;sudo gem install fcgi&lt;br /&gt;&lt;br /&gt;PCRE:&lt;br /&gt;Avant de pouvoir compiler LightTPD il faut installer PCRE (une librairie pour les regular expressions a la Perl)&lt;br /&gt;&lt;br /&gt;url -O ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-6.6.tar.gz&lt;br /&gt;tar xzvf pcre-6.6.tar.gz&lt;br /&gt;cd pcre-6.6&lt;br /&gt;./configure --prefix=/usr/local CFLAGS=-O1&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;br /&gt;Note : CFLAGS=-O1 est utilise pour les Mac Intel&lt;br /&gt;&lt;br /&gt;LightTPD:&lt;br /&gt;Enfin compiler et installer le webserver LightTPD.&lt;br /&gt;&lt;br /&gt;curl -O http://lighttpd.net/download/lighttpd-1.4.13.tar.gz&lt;br /&gt;tar xzvf lighttpd-1.4.13.tar.gz&lt;br /&gt;cd lighttpd-1.4.13&lt;br /&gt;./configure --prefix=/usr/local --with-pcre=/usr/local&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;br /&gt;Test LightTPD with a freshly new Rails application :&lt;br /&gt;&lt;br /&gt;$&amp;gt:cd railsprojects&lt;br /&gt;$&amp;gt:rails myapp&lt;br /&gt;$&amp;gt;cd myapp&lt;br /&gt;$&amp;gt:script/server&lt;br /&gt;=&gt; Booting lighttpd (use 'script/server webrick' to force WEBrick)&lt;br /&gt;=&gt; config/lighttpd.conf not found, copying from /usr/local/lib/ruby/gems/1.8/gems/rails-1.1.6/configs/lighttpd.conf&lt;br /&gt;=&gt; Rails application started on http://0.0.0.0:3000&lt;br /&gt;=&gt; Call with -d to detach&lt;br /&gt;=&gt; Ctrl-C to shutdown server (see config/lighttpd.conf for options)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-116507247896078810?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/116507247896078810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=116507247896078810' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116507247896078810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116507247896078810'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2006/12/installation-lighttpd.html' title='Installation LightTPD'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-116444554094425529</id><published>2006-11-25T00:24:00.000-08:00</published><updated>2006-11-26T10:00:33.456-08:00</updated><title type='text'>Securiser vos applications Rails avec un CAPTCHA</title><content type='html'>Depuis quelques annees on a vu apparaitre le CAPTCHA ("Completely Automatic Public Turing Test to Tell Computers and Humans Apart") sur tous les sites comportant une page d'enregistrement d'un nouvel utilisateur.&lt;br /&gt;&lt;br /&gt;Le CAPTCHA permet d'eviter de se faire spammer une page de registration d'un nouvel utilisateur par des robots (programmes). Pour resumer, une image cote serveur est generee dynamiquement, affichant un texte aleatoire sur un fond avec bruit (quadrillage, pixellisation, bruit). Cette image est affichee dans la page en bas de formulaire, associee a un champs texte, dans lequel l'utilisateur devra recopier ce qu'il voit a l'ecran. &lt;br /&gt;A la validation sont compares le texte saisi par l'utilisateur et celui ayant servi a generer l'image: si ils matchent, la sauvegarde du nouveau compte peut s'operer.&lt;br /&gt;&lt;br /&gt;Un module (plugin) CAPTCHA pour Rails est disponible sur &lt;a href="http://rubyforge.org/projects/captcha/"&gt;RubyForge&lt;/a&gt;. Il s'appuie egalement sur RMagick (gem), un binding Ruby de ImageMagick pour la generation dynamique de l'image.&lt;br /&gt;&lt;br /&gt;Installer ImageMagick :&lt;br /&gt;Sur Mac OS X Tiger, j'ai un peu galere. J'ai essaye plusieurs methodes : les binaires de ImageMagick, en passant par Fink. Sans succes.&lt;br /&gt;&lt;br /&gt;Finalement je suis revenu aux 'sources' : Installer tout manuellement depuis le source. Une bonne adresse de la manip est sur &lt;a href="http://hivelogic.com/articles/2006/06/10/rmagick_os_x"&gt;Hivelogic&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En gros installer freetype, libpng, jpeg, tiff ainsi:&lt;br /&gt;&lt;br /&gt;Creer un repertoire delete_later dans votre repertoire home (mkdir ~/delete_later) pour tous les sources et compilations&lt;br /&gt;&lt;br /&gt;cd ~/delete_later&lt;br /&gt;curl -O http://download.savannah.gnu.org/releases/freetype/freetype-2.1.10.tar.gz&lt;br /&gt;tar xzvf freetype-2.1.10.tar.gz&lt;br /&gt;cd freetype-2.1.10&lt;br /&gt;./configure --prefix=/usr/local&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;br /&gt;cd ~/delete_later&lt;br /&gt;curl -O http://superb-west.dl.sourceforge.net/sourceforge/libpng/libpng-1.2.10.tar.bz2&lt;br /&gt;bzip2 -dc libpng-1.2.10.tar.bz2 | tar xv&lt;br /&gt;cd libpng-1.2.10&lt;br /&gt;./configure --prefix=/usr/local&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;br /&gt;cd ~/delete_later&lt;br /&gt;curl -O ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz&lt;br /&gt;tar xzvf jpegsrc.v6b.tar.gz&lt;br /&gt;cd jpeg-6b&lt;br /&gt;ln -s `which glibtool` ./libtool&lt;br /&gt;export MACOSX_DEPLOYMENT_TARGET=10.4&lt;br /&gt;./configure --enable-shared --prefix=/usr/local&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;br /&gt;cd ~/delete_later&lt;br /&gt;curl -O ftp://ftp.remotesensing.org/libtiff/tiff-3.8.2.tar.gz&lt;br /&gt;tar xzvf tiff-3.8.2.tar.gz&lt;br /&gt;cd tiff-3.8.2&lt;br /&gt;./configure --prefix=/usr/local&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;br /&gt;Enfin ImageMagick 6.3.0:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;cd ~/delete_later&lt;br /&gt;curl -O http://easynews.dl.sourceforge.net/sourceforge/imagemagick/ImageMagick-6.3.0-6.tar.gz&lt;br /&gt;tar xzvf ImageMagick-6.3.0-6.tar.gz&lt;br /&gt;cd ImageMagick-6.3.0&lt;br /&gt;./configure --prefix=/usr/local&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;br /&gt;Sur Mac OS X, Ruby 1.8.2 est preinstalle. Apres moult soucis a l'install de RMagick, il m'a ete conseille (Thanks Tim Hunter), de rebasculer sur 1.8.5. Un excellente ressource a suivre sur &lt;a href="http://hivelogic.com/articles/2005/12/01/ruby_rails_lighttpd_mysql_tiger"&gt;HiveLogic&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pour Ruby:&lt;br /&gt;Modifier le .bash_profile et ajouter en debut de PATH : /usr/local/bin/src:/usr/local/bin:/usr/local/sbin&lt;br /&gt;&lt;br /&gt;Preinstaller readline (necessaire a Ruby)&lt;br /&gt;&lt;br /&gt;cd ~/delete_later&lt;br /&gt;curl -O ftp://ftp.gnu.org/gnu/readline/readline-5.1.tar.gz&lt;br /&gt;tar xzvf readline-5.1.tar.gz&lt;br /&gt;cd readline-5.1&lt;br /&gt;./configure --prefix=/usr/local&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;br /&gt;Installer Ruby 1.8.5&lt;br /&gt;&lt;br /&gt;cd ~/delete_later&lt;br /&gt;curl -O ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.5.tar.gz&lt;br /&gt;tar xzvf ruby-1.8.5.tar.gz &lt;br /&gt;cd ruby-1.8.5&lt;br /&gt;./configure --prefix=/usr/local --enable-pthread --with-readline-dir=/usr/local&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;sudo make install-doc&lt;br /&gt;&lt;br /&gt;Installer RubyGems 0.9&lt;br /&gt;cd ~/delete_later&lt;br /&gt;curl -O http://rubyforge.iasi.roedu.net/files/rubygems/rubygems-0.9.0.tgz&lt;br /&gt;tar xzvf rubygems-0.9.0.tgz&lt;br /&gt;cd rubygems-0.9.0&lt;br /&gt;sudo /usr/local/bin/ruby setup.rb&lt;br /&gt;&lt;br /&gt;Installer RMagick 1.14.1 : &lt;br /&gt;&lt;br /&gt;cd ~/delete_later&lt;br /&gt;curl -O http://rubyforge.rubyuser.de/rmagick/RMagick-1.14.1.tar.gz&lt;br /&gt;tar xvf RMagick-1.14.1.tar.gz&lt;br /&gt;cd RMagick-1.14.1&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;br /&gt;Reinstaller Rails 1.1.6 (pour Ruby 1.8.5 situe dans /usr/local):&lt;br /&gt;&lt;br /&gt;sudo gem install rails --include-dependencies&lt;br /&gt;&lt;br /&gt;Installer le plugin CAPTCHA:&lt;br /&gt;Dans votre application Rails, a la racine, executer la commande :&lt;br /&gt;&lt;br /&gt;script/plugin install http://svn.2750flesk.com/plugins/trunk/validates_captcha&lt;br /&gt;&lt;br /&gt;Preparer votre application pour CAPTCHA :&lt;br /&gt;&lt;br /&gt;Creer le repertoire (var/data) a la racine de votre application, dans lequel un fichier PStore (contenant le mot de l'image, ou CAPTCHA challenge) sera stocke. Executer la commande :&lt;br /&gt; &lt;br /&gt;script/generate captcha store_directory&lt;br /&gt;&lt;br /&gt;Creer le repertoire ou seront stockees les images (public/images/captcha) avec la commande:&lt;br /&gt;script/generate captcha image_directory&lt;br /&gt;&lt;br /&gt;Une fois l'application prete, ne vous reste plus qu'a inclure le CAPTCHA dans votre signup page.&lt;br /&gt;&lt;br /&gt;Supposons, comme moi, que vous avez un model User. Ajouter dans app/models/user.rb la ligne :&lt;br /&gt;&lt;br /&gt;class User &amp;gt; ActiveRecord::Base&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;validates_captcha&lt;/span&gt; &lt;br /&gt;...&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;Ajouter dans le formulaire de votre signup page :&lt;br /&gt;&lt;br /&gt;&amp;lt;% c = prepare_captcha :type =&gt; :image -%&amp;gt;&lt;br /&gt;&amp;lt;%= captcha_hidden_field c, 'user' %&amp;gt;&lt;br /&gt;&amp;lt;%= captcha_image_tag c %&amp;gt;&lt;br /&gt;&amp;lt;%= captcha_label 'user', 'Type in the text from the image above' %&amp;gt;&lt;br /&gt;&amp;lt;%= captcha_text_field 'user' %&amp;gt;&lt;br /&gt;&lt;br /&gt;A la racine de votre application, demarrer WebRICK:&lt;br /&gt;script/server&lt;br /&gt;&lt;br /&gt;Tester&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-116444554094425529?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/116444554094425529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=116444554094425529' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116444554094425529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116444554094425529'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2006/11/securiser-vos-applications-rails-avec.html' title='Securiser vos applications Rails avec un CAPTCHA'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-116270842540297511</id><published>2006-11-04T22:32:00.000-08:00</published><updated>2006-11-04T22:33:45.686-08:00</updated><title type='text'>Ubuntu:: deja 2 semaines</title><content type='html'>Pas de remarques particulieres de mon pere apres deux semaines passees sur Ubuntu. Tout se passe bien: il joue principalement avec la messagerie, l'internet et Skype.&lt;br /&gt;&lt;br /&gt;Il est tres etonne de trouver sa machine beaucoup plus veloce avec Ubuntu qu'avec Windows XP (la machine date de 2001 : Pentium 4 1.6GHz, 1GB Ram, 60GB HDD).&lt;br /&gt;&lt;br /&gt;Skype marche a merveilles : et il trouve meme la qualite de son meilleure encore que sur Windows.&lt;br /&gt;&lt;br /&gt;Pour le probleme d'imprimante, je lui ai conseille de remplacer le cable sur prise parallele par un cable USB : ce qu'il a fait.&lt;br /&gt;Apres avoir change le reglage imprimante sur Ubuntu, tout maeche a merveille....donc un probleme de resolu.&lt;br /&gt;&lt;br /&gt;Il faudra que je lui repasse sa version OpenOffice (actuellement en Anglais, et il est pas angliciste) par une version francaise.&lt;br /&gt;&lt;br /&gt;Enfin, il ne reste que le probleme de l'acquisition de photos de son appareil numerique HP: Picasa ne fonctionnant pas, je vais le remplacer par GPhoto 2.&lt;br /&gt;&lt;br /&gt;Enfin, pour l'instant il reste sur Ubuntu 6.0.6 Dapper Drake, et passera sur Efty Edge (6.10) ulterieurement.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-116270842540297511?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/116270842540297511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=116270842540297511' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116270842540297511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116270842540297511'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2006/11/ubuntu-deja-2-semaines.html' title='Ubuntu:: deja 2 semaines'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-116155150648810422</id><published>2006-10-22T13:28:00.000-07:00</published><updated>2006-10-22T14:11:46.806-07:00</updated><title type='text'>Retour d'experience Ubuntu</title><content type='html'>Je vais vous conter une petite histoire au sujet de Mac, Windows et Linux.&lt;br /&gt;Mon pere, utilisateur de Windows depuis 7 ans environ, a recemment eu un probleme tres genant avec ce systeme. Je ne peux pas dire que mon pere est un utilisateur tres avance: il fait comme la plupart des gens...il ne fait que de la bureautique avec Word, Excel, naviguer sur l'internet (Firefox, Internet Explorer), relever et envoyer des emails (Incredimail), faire de la messagerie instantanee (MSN Messenger, Yahoo Messenger, Google Talk), faire du telephone sur IP (Skype) importer des photos de son appareil numerique (Picasa), ecouter de la musique (iTunes), regarder des films (Video Lan Client, QuickTime)&lt;br /&gt;&lt;br /&gt;Du jour au lendemain Windows n'a plus marche: au demarrage, un ecran noir avec un message indiquant qu'un fichier System etait manquant. Une reparation etait necessaire.&lt;br /&gt;&lt;br /&gt;Je ne cacherai pas que ca m'embetais de reinstaller un Windows sur le PC de mon pere.&lt;br /&gt;&lt;br /&gt;Mon pere n'est certainement pas un cas unique, si je dis qu'il n'avait pas backupe ses donnees ( c'est a dire grave ses photos sur CD, ainsi que sa musique ou ses documents Word) Il fallait donc recuperer le contenu du disque dur. &lt;br /&gt;&lt;br /&gt;Suite a son probleme, je lui ai prete un Mac Mini achete recemment pour le depanner. Grace a lui, il a pu naviguer sur Internet, consulter ses emails pendant une semaine.&lt;br /&gt;&lt;br /&gt;Ce Mac Mini m'a bien servi dans l'operation de sauvetage des donnees du disque dur (Windows)&lt;br /&gt;J'ai sorti le disque dur du PC, pour le remettre dans un boitier IDE externe, que j'ai ensuite branche au Mac Mini. J'ai ainsi pu recuperer tous les fichiers persos et les rapatrier sur le disque dur du Mac.&lt;br /&gt;&lt;br /&gt;J'ai ensuite replace le disque dur dans le PC, avec la ferme intention d'installer une distribution Linux reputee pour sa facilite d'installation et son utilisation: Ubuntu Drapper Drake 6.06&lt;br /&gt;&lt;br /&gt;Le CD de Ubuntu est un Live CD. Ubuntu demarre depuis lle CD. Une fois sous Ubuntu, il y a un bouton 'Install' sur le bureau, et le processus d'installation d'Ubuntu sur le disque dur demarre.&lt;br /&gt;&lt;br /&gt;D'abord preparer le disque dur, c'est a dire partitionner pour Ubuntu. &lt;br /&gt;Une partition primaire raiserfs ext3 de 5GB environ pour accueillir le systeme&lt;br /&gt;Une partition etendue incluant la partition de swap (egale a 2 fois la RAM : dans mon cas, 2GB etaient necessaires pour cette partition), et la partition pour les donnees.&lt;br /&gt;&lt;br /&gt;Apres les multiples steps de l'installation passees, je demarre Ubuntu et me voila sur Linux.&lt;br /&gt;La version CD de Ubuntu arrive avec un lot d'applications bien pratiques, et correspondant tout a fait a l'usage que mon pere fait de son ordinateur .&lt;br /&gt;Firefox pour naviguer sur le Web&lt;br /&gt;Messagerie Ximian (Novell) pour les emails&lt;br /&gt;OpenOffice , la suite libre incluant les equivalents de Word, Excel et PowerPoint&lt;br /&gt;GAIM, messagerie instantanee pouvant se connecter a plusieurs reseaux dont MSN, Yahoo, AOL, ICQ&lt;br /&gt;Une application pour ripper les Cds audio au format MP3&lt;br /&gt;Une lecteur video&lt;br /&gt;Un lecteur audio pour les MP3&lt;br /&gt;Un graveur de CD&lt;br /&gt;Une application de scanner de photos.&lt;br /&gt;&lt;br /&gt;J'ai configure le reseau : le PC est branche avec cable reseau a la LiveBox Wanadoo (modem routeur ADSL). IP statique, gateway correspondant a l'IP du routeur (192.168.1.1)&lt;br /&gt;&lt;br /&gt;Test de l'internet avec Firefox : Ok, pas de soucis.&lt;br /&gt;&lt;br /&gt;Parametrage de sa messagerie Wanadoo sur Ximian: pas de soucis non plus.&lt;br /&gt;&lt;br /&gt;Je lui ai installe deux applications manquantes : Skype et Picasa&lt;br /&gt;&lt;br /&gt;La version Skype de Linux de supporte pas la video (premiere regression par rapport a Windows).&lt;br /&gt;Neanmoins, apres avoir brancher Haut Parleurs et Micro ligne, les tests de conversation ont ete concluants.&lt;br /&gt;&lt;br /&gt;Pour Picasa, ca s'est un peu complique. L'outil a commence a scanner le disque dur pour afficher toutes les images. Pas de problemes. Ensuite j'ai voulu tester l'import de photos depuis un appareil numerique : un HP Photosmart E317.&lt;br /&gt;L'appareil a ete detecte mais l'acquisition des photos ne s'est jamais faite.&lt;br /&gt;Je vais regarder si il y a une solution alternative a Picasa pour les appareils photos numeriques.&lt;br /&gt;&lt;br /&gt;Le scanner : un Agfa Snapscan e52. J'ai du importer le firmware du scanner depuis le CD au prealable, puis ai effectue un test avec le logiciel de scan. Pas de problemes.&lt;br /&gt;&lt;br /&gt;Enfin, l'imprimante, une Canon S400 branchee sur le port LPTR (parallele) : aucun cable USB n'avait ete livre avec l'imprimante.&lt;br /&gt;Je vais dans l'Administration d'Ubuntu, section imprimante et ajoute cette nouvelle imprimante. Le driver de la Canon m'est propose dans une liste, je selectionne et applique les parametres.&lt;br /&gt;Mais au test d'impression, le job a bien ete poste dans la file d'impression, mais le document n'a jamais ete imprime.&lt;br /&gt;Chose etrange, apres un redemarrage du systeme, j'ai constate que le document etait imprime. En reessayant de nouveau d'imprimer depuis OpenOffice, toujours pas moyen. A pres un second restart du systeme, le document a ete imprime...etrange.&lt;br /&gt;&lt;br /&gt;Donc au finish, les deux points noirs : acquisition des photos d'un appareil numerique, et impression avec la Canon.&lt;br /&gt;&lt;br /&gt;J'ai donc decide de lui laisser egalement le Mac pendant un certain temps. &lt;br /&gt;Je souhaite qu'il puisse tester Ubuntu et le Mac pendant une periode de 1 a 2 mois.&lt;br /&gt;Au finish , a l'issue de son utilisation, il me dira ce qu'il prefere, et je lui laisserai la machine choisie.&lt;br /&gt;&lt;br /&gt;Je posterai un article a l'issue de cette periode d'utilisation et de test. Car je rappelle, il etait habitue a Windows, il n'est pas un utilisateur avance. &lt;br /&gt;Il va devoir s'habituer a Ubuntu, qui n'est pas si loin d'utilisation de Windows, ainsi qu'a Mac OS X.&lt;br /&gt;&lt;br /&gt;Des copies d'ecrans d'Ubuntu pour les curieux a &lt;a href="http://www.ubuntu-fr.org/"&gt;cette adresse&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-116155150648810422?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/116155150648810422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=116155150648810422' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116155150648810422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116155150648810422'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2006/10/retour-dexperience-ubuntu.html' title='Retour d&apos;experience Ubuntu'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26409911.post-116144014897225020</id><published>2006-10-21T07:14:00.000-07:00</published><updated>2006-10-21T07:23:04.060-07:00</updated><title type='text'>Appeler un web service REST (Yahoo) avec Rails</title><content type='html'>REST est souvent considere comme l'architecture la plus simple des services web. La plupart du temps, attaquer un service REST revient a appeler une simple URL en Http GET ou POST.   Le serveur renvoie une reponse avec les resultats de la requete. La plupart du temps le document renvoye est au format XML. En fait si vous etes capable d'afficher du XML dans votre navigateur, vous pouvez simplement entrer l'URL  dans la barre d'adresse pour voir en retour le document genere par le service REST.&lt;br /&gt;&lt;br /&gt;Pour se connecter a un service REST avec un client Rails on doit:&lt;br /&gt;1) Se connecter au service REST avec une requete en GET ou POST avec la librairie NET&lt;br /&gt;2) Stocker le resultat en memoire dans un document REXML&lt;br /&gt;3) Parser le resultat avec la librairie REXML pour affichage dans l'application Rails&lt;br /&gt;&lt;br /&gt;Pour la demonstration nous allons nous connecter au service Search Yahoo (REST) et afficher le top 3 des resultats de recherche.  L'API Yahoo search Service est gratuite, mais le nombre de requete est limite a 5000 requetes par IP et par jour. Il faut simplement une clef Developer. Aller a l'URL:&lt;br /&gt;&lt;a href="http://api.search.yahoo.com/webservices/register_application"&gt;http://api.search.yahoo.com/webservices/register_application&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vous devez enregistrer un Application ID (par exemple: RailsApp) que vous passerez ensuite a chaque requete vers le service REST Yahoo!  au moyen du parametre appid&lt;br /&gt;&lt;br /&gt;Creer votre appli Rails: dans un terminal, taper $rails yahoorestapp&lt;br /&gt;Remonter le projet dans votre IDE (Radrails, TextMate)&lt;br /&gt;&lt;br /&gt;Creons un controller qui fera une recherche en mode GET sur le Web Service Yahoo!&lt;br /&gt;&lt;br /&gt;Dans le repertoire yahoorestapp taper $script/generate  controller  yahoosearch&lt;br /&gt;&lt;br /&gt;Ouvrir le fichier app/controllers/yahoosearch_controller.rb&lt;br /&gt;&lt;br /&gt;class YahoosearchController &lt; query =" CGI.escape(params[:search].to_s)" yahookey="RailsApp" url = "http://api.search.yahoo.com/WebSearchService/" appid="#{yahookey}&amp;query="#{query}" results="3&amp;start="1" result =" Net::HTTP.get(URI(url))" doc =" REXML::Document.new" action=""&gt;"do_yahoo_search"%&gt;&lt;br /&gt;&lt;%= render_partial "form" %&gt;&lt;br /&gt;&lt;%= submit_tag "Search" %&gt;&lt;br /&gt;&lt;%= end_form_tag %&gt;&lt;br /&gt;&lt;br /&gt;La view fait appel a un sub form (render_partial) _form.rhtml&lt;br /&gt;&lt;br /&gt;&amp;lt;p&amp;gt;&amp;lt;label for="search_query"&amp;gt;Keyword&amp;lt;/label&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;%= text_field 'search', 'query' %&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;Creons la vue qui correspond a la page de resultat: elle portera le nom de l'action appelee depuis la page de recherche : do_yahoo_search.rhtml&lt;br /&gt;&lt;br /&gt;&lt;% @doc.root.each_element do |res| %&gt;&lt;br /&gt;&amp;lt;b&amp;gt;Title: &amp;lt;/b&amp;gt;&lt;%=res[0].text.to_s%&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;b&amp;gt;Summary: &amp;lt;/b&amp;gt;&lt;%=res[1].text.to_s%&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;b&amp;gt;Link: &amp;lt;/b&amp;gt;&amp;lt;a href="&lt;%=res[2].text.to_s%&gt;"&amp;gt;&lt;%=res[2].text.to_s%&gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;% end %&gt;&lt;br /&gt;&lt;br /&gt;Et voila, c'est fini. En quelques lignes de code nous avons fait notre client Web Service REST&lt;br /&gt;&lt;br /&gt;Pour tester, il suffit de lancer WebRick et vous connecter a http://localhost:3000/yahoosearch&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-116144014897225020?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/116144014897225020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=116144014897225020' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116144014897225020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/116144014897225020'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2006/10/appeler-un-web-service-rest-yahoo-avec.html' title='Appeler un web service REST (Yahoo) avec Rails'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-114807418555859556</id><published>2006-05-19T14:29:00.001-07:00</published><updated>2006-05-19T14:31:24.743-07:00</updated><title type='text'>RoR::Day 4</title><content type='html'>Aujourd'hui, le client, c'est a dire  moi meme, propose de  repasser sur les fonctionnalités de l'application.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Description fonctionnelle&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;l'application est relativement simple : dans une premiere version , nous autoriserons seulement une personne, que nous appelerons administrateur , a diffuser sa liste de  fichiers musicaux. Donc cette personne, devra pouvoir accéder a l'application, avec un privilege administrateur, pour saisir et sauvegarder tous les artistes, albums et fichiers musicaux de sa mediatheque.&lt;br /&gt;&lt;br /&gt;Cette application sera ouverte a n'importe quel utilisateur en consultation simple.&lt;br /&gt;&lt;br /&gt;Neanmoins, nous permettrons a un utilisateur de pouvoir se composer une playlist a partir de la liste de fichiers musicaux de l'administrateur. L'utilisateur pourra se composer n playlists, chacune identifiée par un nom, unique. Pour sauvegarder sa playlist, l'utilisateur devra avoir un compte, et devra etre authentifié sur ce compte .&lt;br /&gt;&lt;br /&gt;Dans une version ulterieure, nous autoriserons chaque utilisateur,&lt;br /&gt;ayant au préalable créé son compte sur l'application, à saisir et&lt;br /&gt;sauvegarder l'intégralité de sa médiathèque.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Description conceptuelle&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Modélisation Database:&lt;/b&gt;&lt;br /&gt;- 1 entité 'Users' : attributs nom, prenom, email, identifiant, mot de passe, groupp&lt;br /&gt;- 1 entité 'Groups' :  Nom du groupe (ADMIN/MEMBER)&lt;br /&gt;&lt;br /&gt;- 1 entité 'Artists' : Nom, Origin&lt;br /&gt;- 1 entité 'Albums' : Nom, artists&lt;br /&gt;- 1 entité 'Tracks' : Nom, Album&lt;br /&gt;&lt;br /&gt;- 1 entité 'Playlist' : Nom, Owner&lt;br /&gt;- 1 entité 'PlaylistItems' : Nom du morceau,  Album, Artists, Playlist&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Modélisation applicative :&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;L'application aura donc 3 "zones" distinctes :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Une zone administration&lt;/b&gt;, ouvrant droit à :&lt;br /&gt;&lt;br /&gt;Création d'une mediatheque : saisie et sauvegarde de tous les fichiers&lt;br /&gt;musicaux, associés à des albums, eux mêmes associés à des artistes.&lt;br /&gt;&lt;br /&gt;Modération des comptes membres : l'administrateur se donne le droit d'accepter ou refuser la création d'un nouveau compte.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Une zone membre :&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;création/suppression de 1 à N playlists : une playlist&lt;br /&gt;etant un sous ensemble de la mediatheque de l'administrateur.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Une zone publique &lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;Consultation de la médiathèque de l'administrateur.&lt;br /&gt;&lt;br /&gt;Création d'un compte pour l'accès membre.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Description des écrans :&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;- 1 ecran de registration pour la création d'un compte membre :&lt;br /&gt;  formulaire =&amp;gt; Nom, prenom, email&lt;br /&gt;&lt;br /&gt;-1 ecran d'authentification :&lt;br /&gt;  formulaire =&amp;gt; Login , password&lt;br /&gt;&lt;br /&gt;- 1 ecran de saisie de mediatheque  :&lt;br /&gt;formulaire Artists =&amp;gt; Nom, origin&lt;br /&gt;formulaire album =&amp;gt; Nom, Artist&lt;br /&gt;formulaire Tracks (n entrées) =&amp;gt; Nom, Album&lt;br /&gt;&lt;br /&gt;- 1 ecran Liste de la mediatheque (consultation publique)&lt;br /&gt;=&amp;gt; formulaire de recherche sur le nom de l'artiste , ou le nom de l'album&lt;br /&gt;=&amp;gt; Liste des morceaux&lt;br /&gt;&lt;br /&gt;- 1 ecran Liste de la mediatheque (consultation) membre&lt;br /&gt;&lt;br /&gt;=&amp;gt; formulaire de recherche sur le nom de l'artiste , ou le nom de l'album&lt;br /&gt;&lt;br /&gt;=&amp;gt; Liste des morceaux avec choix autorisé sur chaque morceau pour ajout dans la playlist.&lt;br /&gt;&lt;br /&gt;- 1 ecran de sauvegarde  de la playlist courante :&lt;br /&gt;=&amp;gt; formulaire : Nom de la playlist&lt;br /&gt;&lt;br /&gt;- 1 ecran liste des playlists : possibilité de suppression d'une playlist&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Suite a cette nouvelle directive pour notre application, le  but de notre prochain article sera de modifier le datamodel de l'application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-114807418555859556?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/114807418555859556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=114807418555859556' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/114807418555859556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/114807418555859556'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2006/05/rorday-4_114807418555859556.html' title='RoR::Day 4'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-114750150302953536</id><published>2006-05-12T23:24:00.000-07:00</published><updated>2006-05-12T23:27:46.626-07:00</updated><title type='text'>RoR::Day 3</title><content type='html'>&lt;span style="font-family:times new roman;"&gt;Nous allons modifier la partie 'artists' afin que depuis l'ecran Show, on puisse entrer les albums associés.&lt;/span&gt;  &lt;span style="font-family:times new roman;"&gt;Nous avons deja relié les modèles artist et item dans l'article précédent.&lt;/span&gt;  &lt;span style="font-family:times new roman;"&gt;Nous allons modifier dans un premier temps la vue de l'ecran 'show' pour artist afin de :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;- Lister les albums associés&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;- Offrir la possibilité de saisir le nom d'un album&lt;/span&gt;  &lt;span style="font-family:times new roman;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;cd mediatheque/app/views/artists&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:times new roman;" &gt;vi show.rhtml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Affichage de la liste des albums :&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;%= link_to 'Edit', :action =&amp;gt; 'edit', :id =&amp;gt; @artist %&gt; |&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;%= link_to 'Back', :action =&amp;gt; 'list' %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;% if @artist.has_items? %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;h3&gt;Items&amp;lt;/h3&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;table&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;% for item in @artist.items %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;tbody&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  &amp;lt;td&amp;gt;&amp;lt;%= item.name %&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;% end %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;% end %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ajout d'une formulaire&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;%= start_form_tag :action =&amp;gt; 'record', :id =&amp;gt; @artist %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  &amp;lt;p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    Name &amp;lt;%= text_field 'item', 'name', :size =&gt; 25 %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  &amp;lt;/p&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  &amp;lt;%= submit_tag 'Record!' %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;%= end_form_tag %&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;Dans le formulaire, l'action appelée est 'record'&lt;/span&gt;  &lt;span style="font-family:times new roman;"&gt;&lt;br /&gt;Ouvrons le controller artists_controller.rb :&lt;/span&gt; &lt;span style="font-family:times new roman;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;vi mediatheque/app/controllers/artists_controller.rb&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:times new roman;"&gt;Et ajoutons la méthode 'record':&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;def record&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  Artist.find(params[:id]).items.create(params[:item])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  redirect_to :action =&gt; 'show', :id =&gt; params[:id]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  end&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;Ce qui donne a l'écran :&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3838/2764/1600/show.0.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3838/2764/320/show.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Décorer la page&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Les pages d'un site partagent en général le même layout - le designer crée en général un template standard qui est utilisé quand on insère le contenu.&lt;br /&gt;&lt;br /&gt;Heureusement, avec Rails on peut définir des layouts. Un layout est un template dans le quel on peut ajouter le contenu facilement. Il y a plusieurs moyens de spécifier et d'utiliser des layouts dans Rails. Nous allons passer par le moyen le plus simple.&lt;br /&gt;Créer un template dans le répertoire app/views/layouts portant le même nom que le controller : toutes les vues rendues depuis ce controleur utiliseront par défaut ce template.&lt;br /&gt;Notre controleur s'appelle artists, donc créons le layout artists.rhtml&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Artists: &amp;lt;%= controller.action_name %&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;%= stylesheet_link_tag 'mediatheque' %&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;div id="banner"&amp;gt;&lt;br /&gt;  &amp;lt;img src="/images/banner.png" /&amp;gt;&lt;br /&gt;&amp;lt;%= @page_title || "Mediatheque" %&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p style="color: green"&amp;gt;&amp;lt;%= flash[:notice] %&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;div id="columns"&amp;gt;&lt;br /&gt;&amp;lt;div id="side"&amp;gt;&lt;br /&gt;&amp;lt;a href="#"&amp;gt;Home&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;a href="#"&gt;News&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;a href="#"&gt;Contact&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;div id="main"&amp;gt;&lt;br /&gt;&amp;lt;%= @content_for_layout %&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;A part les tags HTML, il y a  3 points spécifiques a Rails.&lt;br /&gt;Le lien vers le fichier mediatheque.css avec stylesheet_link_tag&lt;br /&gt;On position le titre de la page avec @âge_title.&lt;br /&gt;Enfin, Rails insère automatiquement le contenu dans le template grace à @content_for_layout&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ajoutons le fichier CSS dans le répertoire : mediatheque/publique/stylesheets/&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;#banner {&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;background: #9c9;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;padding-top: 10px;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;padding-bottom: 10px;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;border-bottom: 2px solid;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;font: small-caps 40px/40px "Times New Roman", serif;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;color: #282;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;text-align: center;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;  &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;br /&gt;#banner img {&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;  float: left;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;  &lt;/span&gt; &lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;  &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;br /&gt;#columns {&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;background: #141;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;  &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;br /&gt;#main {&lt;/span&gt;  &lt;span style="font-family:courier new;"&gt;margin-left: 7em;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;padding-top: 4ex;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;padding-left: 2em;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;background: white;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;  &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;br /&gt;#side {&lt;/span&gt;  &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;float:left;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;padding-top: 1em;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;padding-left: 1em;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;padding-bottom: 1em;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;width: 6em;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;background:#141;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;Ajoutons l'image du logo banner.png dans mediatheque/public/images/&lt;br /&gt;&lt;br /&gt;Le résultat est le suivant :&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3838/2764/1600/homepage.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3838/2764/320/homepage.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Conclusion :&lt;br /&gt;&lt;br /&gt;Nous avons vu comment modifier une vue ( ajout d'une liste et d'un formulaire) et son contoleur (ajout d'une action)&lt;br /&gt;Nous avons également vu comment ajouter un template pour un controleur particulier.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-114750150302953536?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/114750150302953536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=114750150302953536' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/114750150302953536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/114750150302953536'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2006/05/rorday-3.html' title='RoR::Day 3'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-114699124295956326</id><published>2006-05-07T01:30:00.000-07:00</published><updated>2006-05-07T01:40:42.980-07:00</updated><title type='text'>Bibliothèque Rails et Ruby</title><content type='html'>Voici les quelques livres sur lesquels je m'appuie pour cette série d'articles.&lt;br /&gt;&lt;br /&gt;1) &lt;span style="font-weight: bold;"&gt;Agile Web Development with Ruby On Rails &lt;/span&gt;(D. Thomas, D. Hansson, ....)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://images.amazon.com/images/P/097669400X.01._AA240_SCLZZZZZZZ_.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px;" src="http://images.amazon.com/images/P/097669400X.01._AA240_SCLZZZZZZZ_.jpg" alt="" border="0" /&gt;&lt;/a&gt;Achat sur &lt;a href="http://www.amazon.com/gp/product/097669400X/103-4501403-8342268?v=glance&amp;n=283155"&gt;Amazon&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2) &lt;span style="font-weight: bold;"&gt;Rails recipes&lt;/span&gt; (Chad Fowler)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.pragmaticprogrammer.com/images/fr_rr_medium.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px;" src="http://www.pragmaticprogrammer.com/images/fr_rr_medium.jpg" alt="" border="0" /&gt;&lt;/a&gt;Achat sur &lt;a href="http://www.pragmaticprogrammer.com/titles/fr_rr/"&gt;Pragmatic Bookshelf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3) &lt;span style="font-weight: bold;"&gt;Enterprise integration with Ruby&lt;/span&gt; ( M. Schmidt )&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.pragmaticprogrammer.com/images/fr_eir_medium.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px;" src="http://www.pragmaticprogrammer.com/images/fr_eir_medium.jpg" alt="" border="0" /&gt;&lt;/a&gt;Achat sur &lt;a href="http://www.pragmaticprogrammer.com/titles/fr_eir/index.html"&gt;Pragmatic Bookshelf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4) &lt;span style="font-weight: bold;"&gt;Programming Ruby &lt;/span&gt;(D. Thomas, A. Hunt)&lt;br /&gt;&lt;br /&gt;Livre en ligne à l'&lt;a href="http://www.rubycentral.com/book/"&gt;adresse&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-114699124295956326?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/114699124295956326/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=114699124295956326' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/114699124295956326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/114699124295956326'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2006/05/bibliothque-rails-et-ruby.html' title='Bibliothèque Rails et Ruby'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-114687126527971510</id><published>2006-05-05T12:10:00.000-07:00</published><updated>2006-05-06T01:36:22.623-07:00</updated><title type='text'>RoR::Day 2</title><content type='html'>Nous allons revenir dans cette article au développement de notre application.&lt;br /&gt;&lt;br /&gt;Dans l'article 1, nous avons créé une table, artists, et généré le scaffold.&lt;br /&gt;Après avoir joué un peu avec l'écran d'édition, on s'aperçoit assez vite de sa simplicité. Notamment du coté de la validation: en effet, on peut laisser des valeurs vides et soumettre le formulaire.&lt;br /&gt;&lt;br /&gt;Mais où mettre la validation dans Rails? La couche modèle est le garant entre le monde du code ruby et la base de données. Cela rend le modèle une place idéale pour insérer la validation. Si le modèle fait le check avant la sauvegarde en base, alors la base sera protégée d'une mauvaise donnée en entrée.&lt;br /&gt;&lt;br /&gt;Ouvrons le fichier app/models/artist.rb&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;class Artist &amp;lt; ActiveRecord::Base&lt;br /&gt;validates_presence_of :name, :origin&lt;br /&gt;end&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3838/2764/1600/validate.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3838/2764/320/validate.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Le validates_presence_of() est un validator standard dans le monde Rails. Il checke qu'un ou plusieur champs sont presents et qu'ils ne sont pas vides.&lt;br /&gt;&lt;br /&gt;Mais maintenant nous saisissons un nom d'artiste, et nous ne voulons pas qu'il soit répété :&lt;br /&gt;ajoutons la ligne suivante dans le modèle :&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class Artist &amp;lt; ActiveRecord::Base&lt;br /&gt;validates_presence_of :name, :origin&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;validates_uniqueness_of :name&lt;/span&gt;&lt;br /&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3838/2764/1600/validate2.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3838/2764/320/validate2.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Modification du modèle&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nous allons rajouter 2 entités à notre modèle : items, qui contiendra la liste des albums associés à un artists, et tracks, la liste des pistes musicales associées à un album.&lt;br /&gt;&lt;br /&gt;Nous allons toujours procéder avec notre outil de migration :&lt;br /&gt;script/generate migration items&lt;br /&gt;&lt;br /&gt;Fichier db/migrate/002_items.rb&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class Items &amp;lt; ActiveRecord::Migration&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;def self.up&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        create_table :items do  |table|&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          table.column :id, :integer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          table.column :name, :string&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          table.column :type, :string&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          table.column :artist_id, :integer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  def self.down&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    drop_table :items&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On recommence pour la table tracks : Fichier db/migrate/003_tracks.rb&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class Tracks &amp;lt; ActiveRecord::Migration&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;def self.up&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    create_table :tracks do |table|&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      table.column :id, :integer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      table.column :order, :integer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      table.column :item_id, :integer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      table.column :name, :string&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      table.column :size, :float &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  def self.down&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    drop_table :tracks&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Créons la structure en base avec la commande : &lt;span style="font-family:courier new;"&gt;rake migrate&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Créons les modèles pour chacune des tables items et tracks&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ruby script/generate model Item&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ruby script/generate model Track&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On n'a pas créé de foreign key en base , mais on remarque qu'on relie 'items' à 'artists' par la colonne &lt;span style="font-family:courier new;"&gt;artist_id&lt;/span&gt;, et la table 'tracks' à 'items' par &lt;span style="font-family:courier new;"&gt;&amp;lt;nom de la table cible&amp;gt;_item_id&lt;/span&gt;....c'est une convention : &lt;span style="font-weight: bold;"&gt;&lt;nom&gt;_id&lt;/nom&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nous devons désormais dire à Rails, qu'un artiste a plusieurs albums et qu'un album appartient à un artiste. Ouvrons la classe modèle artist.rb , et faison un appel à has_many() :&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class Artist &amp;lt; ActiveRecord::Base validates_presence_of :name, :origin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;validates_uniqueness_of :name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;has_many :items, :order =&gt; "name"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Faisons le lien dans l'autre direction , depuis la classe item: appelons la methode belongs_to()&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class Item &amp;lt; ActiveRecord::Base validates_presence_of :name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;belongs_to :artist&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Réitérons entre items et tracks : ajoutons has_many() dans la classe item.rb&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class Item &amp;lt; ActiveRecord::Base validates_presence_of :name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;belongs_to :artist&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;has_many :tracks, :order =&gt; "order"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ajoutons le lien dans l'autre sens depuis la classe track.rb :&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class Track &amp;lt; ActiveRecord::Base   &lt;span style="font-weight: bold;font-family:courier new;" &gt;belongs_to :item&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion:&lt;/span&gt;&lt;br /&gt;Dans cet article nous avons vu comment ajouter de la validation à un formulaire.&lt;br /&gt;Comment ajouter plusieurs tables et créer des relations entre les classes du modèle.&lt;br /&gt;&lt;br /&gt;Dans le prochain article nous rajouterons de nouvelles méthodes dans notre controller pour afficher les listes d'items de nos artistes.&lt;br /&gt;Nous parlerons des layouts et templates (avec relooking de l'application)&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-114687126527971510?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/114687126527971510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=114687126527971510' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/114687126527971510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/114687126527971510'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2006/05/rorday-2.html' title='RoR::Day 2'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-114659731699406917</id><published>2006-05-02T11:59:00.000-07:00</published><updated>2006-05-02T15:33:08.343-07:00</updated><title type='text'>RoR::Day One</title><content type='html'>Le premier article a posé les bases de l'application mediatheque que je vais developper.&lt;br /&gt;Le but de cet article et de tous ceux à venir dans la meme categorie 'RoR::Day XX' sera de suivre quasiment au jour le jour (si j'arrive a poster chaque jour..ce sera plutot tous les 2/3 jours je pense) le développement du début jusqu'à la version"finale" de l'application.&lt;br /&gt;&lt;br /&gt;Avant de continuer les développements, j'ai jugé bon de présenter un outil indispensable, et intégré dans Rails :  l'utilitaire de test.&lt;br /&gt;&lt;br /&gt;Dans notre application, on est allé jusqu'à la génération du scaffold, pour une table : la table 'artists'.&lt;br /&gt;&lt;br /&gt;Cet article va montrer comment on peut tester unitairement les opérations CRUD sur le modèle.&lt;br /&gt;&lt;br /&gt;Si vous allez au niveau supérieur de l'application (&lt;span style="font-family:courier new;"&gt;cd mediatheque&lt;/span&gt;), vous remarquerez qu'il y a un répertoire nommé 'test'.&lt;br /&gt;Un simple &lt;span style="font-family:courier new;"&gt;ls&lt;/span&gt; du répertoire renvoie les dossiers suivants :&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;fixtures        functional      mocks           test_helper.rb  unit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Donc toute l'infrastructure pour accueillir nos tests est déjà présente; c'est la commande 'rails' qui a généré le répertoire 'test' et tous ses enfants. Donc a chaque fois que vous lancez la commande 'generate' pour créer un modème ou un controleur, Rails crée un fichier de test correspondant.&lt;br /&gt;&lt;br /&gt;Par convention, Rails appelle tous les test relatifs au modèle des tests unitaires, et tous les tests relatifs au controleur des tests fonctionnels.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; ls test/unit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;artist_test.rb &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt;ls test/functional&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;artists_controller_test.rb&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tous les fichiers sont déjà présents : Rails nous laisse ainsi nous focaliser sur l'écriture de bons scenarii de tests.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Testons le modèle&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Rappelez vous, en première partie on a Rails nous a créé 3 databases : une de développement, une de test et une de production. L'utilitaire de test travaille directement sur la base de test; sauf que pour l'instant il n'existe aucun objet dans notre base.&lt;br /&gt;&lt;br /&gt;On va commencer par créer notre base de test, puis charger notre schéma.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; mysqladmin -u root -p create mediatheque_test&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Rails fournit un outil pour cloner directement la base développement vers la base de test.&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; rake clone_structure_to_test&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Donc maintenant nous avons notre base et notre structure, mais pas encore de données. On pourrait entrer les données à la main, à partir d'un fichier .sql : le problème en faisant cela et que nous devrons recharger notre base avant chaque test.&lt;br /&gt;&lt;br /&gt;Rails a la réponse avec les "test fixtures".&lt;br /&gt;Le terme "test fixtures" signifie pour Rails une simple spécification du contenu initial pour le modèle. Si nous voulons être sur que la table des artistes contienne les bonnes données à chaque test unitaire, nous devons seulement spécifié ce contenu dans un "fixture" (garniture de test..traduction vue sur RailsFrance.org)...Rails s'occupe ensuite du reste.&lt;br /&gt;&lt;br /&gt;Ouvrir le fichier du nom du modèle avec l'extension .yml, situé dans le répertoire test/fixtures :&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;iggy_pop_artist:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  id: 1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  name: Iggy Pop&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  origin: Etats Unis&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;morrissey_artist:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  id: 2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  name: Morrissey&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  origin: Royaume Uni&lt;/span&gt;&lt;br /&gt;       &lt;br /&gt;&lt;br /&gt;Le nom de la fixture n'a guère d'importance. Suivant ce nom, nous retrouvons un couple clef/valeur représentant le nom de la colonne et la valeur correspondante.&lt;br /&gt;&lt;br /&gt;Rails lance la fixture au demarrage du test: ouvrir le fichier test/unit/artist_test.rb&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;require File.dirname(__FILE__) + '/../test_helper'&lt;br /&gt;&lt;br&gt;&lt;br /&gt;class ArtistTest &lt; Test::Unit::TestCase &lt;br /&gt;&lt;br&gt; fixtures :artists    &lt;br /&gt;&lt;br&gt;# Replace this with your real tests.  &lt;br /&gt;&lt;br&gt; def setup    &lt;br /&gt;&lt;br&gt;  @artist = Artist.find(1)  &lt;br /&gt;&lt;br&gt; end   &lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt; def test_truth    &lt;br /&gt;&lt;br&gt;   assert true  &lt;br /&gt;&lt;br&gt; end&lt;br /&gt;&lt;br&gt;end &lt;/span&gt;&lt;br /&gt;Avant de lancer ce test, écrivons un test case. Renommons test_truth() en test_create() . Ensuite, dans test_create() nous vérifions que @artist matche les données des "fixtures":&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  def test_create&lt;br /&gt;assert_kind_of Artist, @artist&lt;br /&gt;assert_equal 1, @artist.id&lt;br /&gt;assert_equal "Iggy Pop", @artist.name&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;    assert_equal "Etats Unis", @artist.origin&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Lancer le test grace à la commande :&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; ruby test/unit/artist_test.rb&lt;br /&gt;&lt;br /&gt;Loaded suite artist_test&lt;br /&gt;Started&lt;br /&gt;.&lt;br /&gt;Finished in 0.099296 seconds.&lt;br /&gt;&lt;br /&gt;1 tests, 4 assertions, 0 failures, 0 errors&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ecrivons desormais un test d'update :&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;  def test_update&lt;br /&gt;    assert_equal "Iggy Pop", @artist.name&lt;br /&gt;    @artist.name = "The Stooges" &lt;br /&gt;    assert @artist.save, @artist.errors.full_messages.join("; ")&lt;br /&gt;    @artist.reload&lt;br /&gt;    assert_equal "The Stooges", @artist.name&lt;br /&gt; end&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;La methode test_update() vérifie d'abord que le nom de l'artiste représenté par @artist matche la fixture de artists.yml. Puis on change le nom, on sauve , on recharge et on reteste.&lt;br /&gt;&lt;br /&gt;On relance le test :&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&gt; ruby test/unit/artist_test.rb&lt;br /&gt;Loaded suite artist_test&lt;br /&gt;Started&lt;br /&gt;..&lt;br /&gt;Finished in 0.09837 seconds.&lt;br /&gt;2 tests, 7 assertions, 0 failures, 0 errors&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Enfin pour terminer, on écrit un test qui va nous permettre de détruire la ligne de la table correspondant au modèle 'artist'. En testant un find sur notre enregistrement va provoquer une exception RecordNotFound lqncée pqr Active Record:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt; def test_destroy&lt;br /&gt;   @artist.destroy&lt;br /&gt;   assert_raise(ActiveRecord::RecordNotFound) { Artist.find(@artist.id) }&lt;br /&gt; end&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On exécute la commande :&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&gt; ruby test/unit/artist_test.rb&lt;br /&gt;Loaded suite artist_test&lt;br /&gt;Started&lt;br /&gt;...&lt;br /&gt;Finished in 0.09568 seconds.&lt;br /&gt;&lt;br /&gt;3 tests, 8 assertions, 0 failures, 0 errors&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br&gt;Conclusion :&lt;/br&gt; Dans cet article on a testé l'utilitaire de tests de Rails.&lt;br /&gt;On a vu qu'on pouvait cloner la structure de notre base de développement vers notre base de test a moindre effort.&lt;br /&gt;On a vu les "test fixtures"&lt;br /&gt;On a fait des tests unitaires sur le modèle.&lt;br /&gt;&lt;br /&gt;Dans un prochain article nous verrons comment tester la business logic ainsi que les controleurs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-114659731699406917?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/114659731699406917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=114659731699406917' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/114659731699406917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/114659731699406917'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2006/05/rorday-one.html' title='RoR::Day One'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-114579617366060420</id><published>2006-04-23T05:27:00.000-07:00</published><updated>2006-04-29T22:44:40.943-07:00</updated><title type='text'>Ruby On Rails..mes premiers pas</title><content type='html'>C'est avec une certaine effervescence que je me suis lancé cette fin de semaine sur &lt;a href="http://www.rubyonrails.org/"&gt;Ruby On Rails&lt;/a&gt; .&lt;br /&gt;Ce petit article va decrire l'installation de Ruby sur Mac, et ma première application en Rails.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Installation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Plusieurs moyens.&lt;br /&gt;Si vous etes sur Mac OS Tiger (10.4) vous n'avez pas besoin d'installer Ruby : la version 1.8.2 vient avec l'os. Si vous etes en version antérieure de Mac OS X, alors vous pouvez le downloader &lt;a href="http://www.ruby-lang.org/"&gt;ici&lt;/a&gt;, compiler et installer.&lt;br /&gt;&lt;br /&gt;Ensuite installer RubyGems. Aller a http://rubygems.rubyforge.org et suivez le lien 'download'.&lt;br /&gt;Une fois l'archive downloadée, ouvrir une fenêtre de Terminal, aller dans le répertoire ou l'archive a été downloadée puis :&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;tar xvf rubygems-0.x.y.tar.gz&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;cd rubygems-0.x.y&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sudo ruby setup.rb&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;&lt;span style="font-family:times new roman;"&gt;Installer Rails en utilisant RubyGems. Toujours dans la fenêtre de Terminal :&lt;span style="font-family:times new roman;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-family:times new roman;"&gt;&lt;span style="font-family:courier new;"&gt;sudo gem install rails --include-dependencies&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Et voila!&lt;br /&gt;&lt;br /&gt;Sur Mac, il existe aussi le package Locomotive, qui inclue grails, rubygem, le serveur LightTPD :&lt;br /&gt;Downloader &lt;a href="http://locomotive.raaum.org/home/show/HomePage"&gt;ici&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;J'avais installé Locomotive avant, et j'ai réappliqué les steps précédents (pour RubyGem et Rails)&lt;br /&gt;&lt;br /&gt;Enfin, sur Mac OS X il ya des petits soucis avec Ruby pour Rails, et  il faut passer un fix.&lt;br /&gt;&lt;br /&gt;Pour cela, suivez l'article de Lucas Carlson posté sur son &lt;a href="http://tech.rufy.com/articles/2005/05/01/complete-fix-for-ruby-on-mac-os-x-10-4-tiger"&gt;blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Maintenant vous etes pret pour commencer...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Introduction à Rails&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-family:times new roman;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;La première chose a connaitre de Rails est son architecture MVC (model/view/controller).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Le modèle&lt;/span&gt;&lt;br /&gt;La partie 'model' d'une application Rails est liée fortement à la base de données au dessous.&lt;br /&gt;En fait, cela permet à une application Rails de faire des opérations en direct sur des données stockées dans la SGBD.&lt;br /&gt;&lt;br /&gt;Un composant central de Rails est la classe &lt;span style="font-family:courier new;"&gt;ActiveRecord&lt;/span&gt;, qui permet de mapper des tables vers des objets Ruby, et donc les données manipulées depuis le controleur et affichées dans les vues.&lt;br /&gt;&lt;br /&gt;Vous pouvez ajouter du code supplémentaire à une classe héritant de &lt;span style="font-family:courier new;"&gt;ActiveRecord&lt;/span&gt; de manière à ajouter des controles de validation, des relations entre les tables ou de nouvelles actions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Le controleur&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Les scripts Ruby présents dans le répertoire app/controllers/ chargent les données du modèle dans des variables, les manipulent et les sauvegardent pour  une utilisation par la vue.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La vue&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Rails contient un vrai système de templates pour les fichiers .rhtml, qui combine HTML et code Ruby. L'apparence des pages dans les applications Rails est en général controlée par des feuilles de style CSS. un simple fichier HTML peut être un template RHTML valide pour une application Rails.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La génération de code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Les outils que Rails fournit sont principalement des générateurs de code. Rails ne fait pas tout pour vous, mais épargne au programmeur une bonne partie de programmation manuelle, et facilite la vie pour les parties qui nécessitent du codage en fournissant en première partie la possibilité de construire l'échaffaudage (scaffold)&lt;p&gt;Le concept d'échaffaudage (scaffold) est un point central dans Rails. Pour de très simples applications, Rails permet de générer les pages dynamiques HTML sans aucune ligne de code ajoutée par le programmeur. En première passe, le scaffold est généré; ensuite on peut ajouter des controleurs ou des classes model spécifiques, faire de la customization.&lt;br /&gt;&lt;/p&gt;Enfin, Rails impose une organisation des fichiers assez rigide : il est fortement déconseillé de jouer et de détourner cette organisation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Créer une simple application&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Cet article est le premier d'une série qui permettra de suivre pratiquement au jour le jour la construction d'une application Médiathèque.&lt;br /&gt;Cette application sera divisée en une partie administration, pour charger les listes des artistes, albums musicaux, pistes musicales, films ou jeux.&lt;br /&gt;Une deuxième partie concerne la consultation de la médiathèque par les utilisateurs.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;p&gt;Dans ce premier article nous irons jusqu'à la génération du scaffold, véritable point de départ de la construction de l'application , en suivant pas à pas les points suivants :&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Génération de l'application (génération de code et des différents fichiers de l'application).&lt;/li&gt;&lt;li&gt;Création de la base mySQL et d'une table.&lt;/li&gt;&lt;li&gt;faire marcher Rails (et configurer l'accès à la base).&lt;/li&gt;&lt;li&gt;Créer un peu de contenu (génération du scaffold, modèle et controleur, et indiquer à l'application d'utiliser le scaffold)&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Création de l'application&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La première chose à faire est de simplement lancer  &lt;code&gt;rails&lt;/code&gt; pour générer les répertoires de l'application et le starter code:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; rails mediatheque&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="section"&gt;&lt;span style="font-family:courier new;"&gt;create&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;create  app/apis&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;create  app/controllers&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;create  app/helpers&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;create  app/models&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;create  app/views/layouts&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;create  config/environments&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;create  components&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[...]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;create  public/images&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;create  public/javascripts&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;create  public/stylesheets&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;create  script&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[...]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;create  README&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;create  script/generate&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;create  script/server&lt;/span&gt;&lt;br /&gt;[...]&lt;/code&gt;&lt;/pre&gt;Nous irons dans les répertoires et fichiers un peu plus tard.&lt;br /&gt;Démarrons notre server web et testons.&lt;br /&gt;Se positionner dans le répertoire mediatheque et lancer la commande :&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; ~/mesDevs/RailsProjects/mediatheque lbois$ script/server=&gt; Booting WEBrick...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;=&gt; Rails application started on http://0.0.0.0:3000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;=&gt; Ctrl-C to shutdown server; call with --help for options&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[2006-04-29 17:08:42] INFO  WEBrick 1.3.1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[2006-04-29 17:08:42] INFO  ruby 1.8.2 (2004-12-25) [powerpc-darwin8.0]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[2006-04-29 17:08:42] INFO  WEBrick::HTTPServer#start: pid=1394 port=3000&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Par défaut c'est le serveur purement écrit en Ruby, WebRick qui démarre.&lt;br /&gt;Aller a l'URL http://localhost:3000/&lt;br /&gt;&lt;br /&gt;Vous devriez avoir une page de bienvenue sur Rails comme suit :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3838/2764/1600/welcomeaboard.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3838/2764/320/welcomeaboard.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-family:times new roman;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Maintenant que la structure des répertoires est créée nous pouvons commencer à travailler sur notre application.&lt;br /&gt;&lt;br /&gt;On va commencer a configurer la base de données.&lt;br /&gt;&gt; cd ./mediatheque/config&lt;br /&gt;&gt; vi database.yml&lt;br /&gt;&lt;br /&gt;Vous verrez que 3 environnements distincts sont préparés : development, test et production.&lt;br /&gt;Nous allons configurer l'environnement de développement pour mySQL:&lt;br /&gt;development:&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;&lt;br /&gt;adapter: mysql&lt;br /&gt;database: mediatheque_development&lt;br /&gt;username: root&lt;br /&gt;password:&lt;br /&gt;socket: /tmp/mysql.sock&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Créer la base de donnée:&lt;br /&gt;&gt; sqladmin -u root -p create mediatheque_development&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Créer le schéma :&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Maintenant que notre base est créée, nous n'avons pas encore de tables. On va commencer par créer une table artists pour stocker les chanteurs et les groupes de nos albums musicaux. Au lieu d'utiliser un fichier DDL ou un outil d'administration de base de données, nous allons utiliser l'outil de migration de Rails. En faisant ainsi, on est complètement indépendant de la base de données (pratique si notre serveur de production n'est pas le meme que celui de développement)&lt;br /&gt;Créer tout d'abord la migration avec l'outil de génération de migration de Rails :&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;pre class="sourcecodebox"&gt;script/generate migration artists&lt;/pre&gt;La commande crée un fichier db/migrate/001_artists.rb qui définit une migration vide. Mettre à jour la classe de la façon suivante , pour ajouter le nom et l'origine:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sourcecodebox"&gt;&lt;br /&gt;class Artists &lt; ActiveRecord::Migration&lt;br /&gt;&lt;br /&gt; def self.up&lt;br /&gt;&lt;br /&gt;       create_table :artists do |table|&lt;br /&gt;&lt;br /&gt;       table.column :id, :integer&lt;br /&gt;&lt;br /&gt;       table.column :name, :string&lt;br /&gt;&lt;br /&gt;       table.column :origin, :string&lt;br /&gt;&lt;br /&gt;       end&lt;br /&gt;&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; def self.down&lt;br /&gt;&lt;br /&gt;       drop_table :artists&lt;br /&gt;&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Maintenant appliquons la migration.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Utilisons Rake (l'equivalent Ruby de make), en tapant simplement la commande:&lt;/p&gt;&lt;p&gt;&gt; rake migrate&lt;/p&gt;&lt;p&gt;Notre base mediatheque_development contient desormais la table artists ('rake migrate' est également un moyen rapide de tester la connectivité avec la base).&lt;br /&gt;&lt;/p&gt;&lt;span style="font-weight: bold;"&gt;Scaffold&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Maintenant qu'on a la base et le schéma de prêts, on doit commencer à créer de nouveaux artistes.&lt;br /&gt;La méthode la plus rapide de remonter de la base vers l'interface Web est d'utiliser le scaffold (échaffaudage).&lt;br /&gt;Le Scaffold est le starter pour la création de l'application MVC, qui supporte CRUD (create/read/update/delete).&lt;br /&gt;Contrairement à la plupart des outils de génération qui ne sont pas destinés à permettre une modification manuelle ,&lt;br /&gt;le scaffold de Rails est fait pour que le développeur mette ses doigts ensuite dans le code généré.  Le scaffold est&lt;br /&gt;le point de départ pour créer ensuite graduellement l'application.&lt;br /&gt;&lt;br /&gt;On génère le scaffold en tapant la commande suivante:&lt;br /&gt;&gt; rails generate scaffold artist artists&lt;br /&gt;&lt;br /&gt;Le premier paramètre de la commande (artist) correspond au modèle. Le fichier généré est situé dans mediatheque/app/models/artist.rb . Le second paramètre (artists) correspond au controleur : le fichier fénéré est situé dans mediatheque/app/controllers/artists_controller.rb . Le générateur de scaffold génère également les fichiers template et les vues de notre application.&lt;br /&gt;&lt;br /&gt;Démarrer le serveur :&lt;br /&gt;&gt; script/server&lt;br /&gt;&lt;br /&gt;Ouvrir le navigateur a l'adresse : http://localhost:3000/artists&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3838/2764/1600/artists.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3838/2764/320/artists.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Comme vous le voyez, le design de la page n'est d'aucune prétention, mais c'est fonctionnel et ca nous donne un bon point de départ pour charger des données.Sans aucune configuration le modèle, les vues et le controleur sont la et nous donnent une application quick and dirty prête a l'emploi.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Navigation dans le code généré:&lt;/span&gt;&lt;br /&gt;Comment ca marche. Ce qu'il faut savoir est que Rails est basé sur des conventions pour éviter toute configuration. Suivez le lien 'Show' et vous verrez l'URL :&lt;br /&gt;&lt;br /&gt;http://localhost:3000/artists/show/1&lt;br /&gt;&lt;br /&gt;La première partie de l'URL (artists) correpond au controleur chargé de traiter les requêtes entrantes. La seconde partie, show, correspond à l'action du controleur (methode dans la classe controleur). Enfin, 1 correspond à l'id (primary key en base) de l'artiste à afficher.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3838/2764/1600/tree.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3838/2764/320/tree.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En utilisant ces parties de chemin d'url (appelée route), Rails va invoquer la méthode show de ArtistsController. Le code de ce controleur est situé dans app/controller/artists_controller.rb&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;br /&gt;class ArtistsController &lt; ApplicationController  ...  &lt;br /&gt;def show     @artist = Artist.find(params[:id])  &lt;br /&gt;end&lt;br /&gt;end  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La méthode show récupère l'id fourni par params[:id] pour retrouver et renseigner l'objet modèle Artist, contenant les valeurs de la ligne de la table artists correspondant à l'id en entrée. L'objet de retour Artist est référencé par la variable d'instance @artist . La classe modèle Artist est située dans app/models/artist.rb&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class Artist &lt; ActiveRecord::Base &lt;br /&gt;end &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A première vue cette classe parait vide, mais elle hérite en fait de la mécanique existant dans ActiveRecord::Base. Rails utilise la réflection et les conventions de nommage pour mapper de façon transparente les tables dans les objets modèle. Le modèle Artist encapsule tout l'accès à la base de données. Une instance de la classe Artist repésente une ligne en table, une colonne de table est représentée par un attribut de classe.&lt;br /&gt;&lt;br /&gt;Une fois le modèle renseigné, et assigné à la variable d'instant @artist, l'action show procède au rendu html en appelant le template situé dans app/views/artists/show.rhtml . Le rendu de ce template est encore une fois implicite : si la redirection n'est pas faite vers un template nommé, alors Rails prend le template portant le même nom que l'action.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;% for column in Artist.content_columns %&gt;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;  &lt;b&gt;&lt;%= column.human_name %&gt;:&lt;/b&gt; &lt;%=h @artist.send(column.name) %&gt;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;% end %&gt;&lt;/span&gt;  &lt;span style="font-family:courier new;"&gt;&lt;%= link_to 'Edit', :action =&gt; 'edit', :id =&gt; @artist %&gt; |&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;%= link_to 'Back', :action =&gt; 'list' %&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le template est un mélange de HTML et de code Ruby. Une expression entre &lt;%= et %&gt; est évaluée (code Ruby). et le résultat est remplacé pour cette expression. A noter, le template show a accès à la variable d'instance @artist , positionnée dans le controleur. Le template show affiche simplement les valeurs de chaque attribut de l'objet @artist. Les hyperliens Edit et List sont créés grace à la fonction link_to . Le résultat est le suivant :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3838/2764/1600/show.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/blogger/3838/2764/320/show.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cet article a montré le point de démarrage de la construction d'une application : de la creéation de la base et du schéma, en passant par la configuration de la base, jusqu'à la génération et du scaffold.&lt;br /&gt;&lt;br /&gt;D'autres articles sont à suivre : ils montreront de façon incrémentale le développement de mon application mediatheque.&lt;br /&gt;&lt;br /&gt;A suivre....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-114579617366060420?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/114579617366060420/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=114579617366060420' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/114579617366060420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/114579617366060420'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2006/04/ruby-on-railsmes-premiers-pas.html' title='Ruby On Rails..mes premiers pas'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26409911.post-114538898103234704</id><published>2006-04-18T12:34:00.000-07:00</published><updated>2006-04-18T12:37:58.330-07:00</updated><title type='text'>Renouveau</title><content type='html'>Après quelques semaines de silence, je me suis aperçu que mon blog chez Free n'était plus opérationnel. Après avoir compris qu'ils m'avaient supprimé toutes les tables de mon blog, je me suis tourné vers un service spécialisé , a savoir Blogger.&lt;br /&gt;&lt;br /&gt;Surveillez ce blog dans les prochaines semaines, car je vais reprendre les publications d'articles.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-114538898103234704?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/114538898103234704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=114538898103234704' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/114538898103234704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/114538898103234704'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2006/04/renouveau.html' title='Renouveau'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</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-26409911.post-114538044625641491</id><published>2006-04-18T10:13:00.000-07:00</published><updated>2006-04-18T10:14:06.266-07:00</updated><title type='text'>First news</title><content type='html'>This is a first news for testing purposes&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26409911-114538044625641491?l=jurassicgeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jurassicgeek.blogspot.com/feeds/114538044625641491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26409911&amp;postID=114538044625641491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/114538044625641491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26409911/posts/default/114538044625641491'/><link rel='alternate' type='text/html' href='http://jurassicgeek.blogspot.com/2006/04/first-news.html' title='First news'/><author><name>jurassicGeek</name><uri>http://www.blogger.com/profile/06712782766370638731</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
