<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Anthony Dahanne's blog &#187; ruby</title>
	<atom:link href="http://blog.dahanne.net/category/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.dahanne.net</link>
	<description>Open Source Software, Java, Ruby, Agility</description>
	<lastBuildDate>Tue, 20 Jul 2010 13:11:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Scripting with Ruby : be careful with File.open</title>
		<link>http://blog.dahanne.net/2009/05/21/scripting-with-ruby-be-careful-with-file-open/</link>
		<comments>http://blog.dahanne.net/2009/05/21/scripting-with-ruby-be-careful-with-file-open/#comments</comments>
		<pubDate>Thu, 21 May 2009 21:34:51 +0000</pubDate>
		<dc:creator>anthony.dahanne</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.dahanne.net/?p=141</guid>
		<description><![CDATA[Once again, I spend a long time debugging something whi [...]]]></description>
			<content:encoded><![CDATA[<p>Once again, I spend a long time debugging something which was quite obvious (well, at least when I discovered the solution&#8230;)<br />
Trying to copy all the files from a .m3u playlist file (in each line there is a file path), I used ruby (well bash and zsh are not as funny as ruby), and especially the FileUtils.cp function.<br />
The code is as follow :</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'fileutils'</span>
count=<span style="color:#006666;">0</span>
<span style="color:#CC0066; font-weight:bold;">string</span> = <span style="color:#CC0066; font-weight:bold;">String</span>.<span style="color:#9900CC;">new</span>
<span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;/home/anthony/Documents/playlist_ok.m3u&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">each</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>line<span style="color:#006600; font-weight:bold;">|</span>
<span style="color:#9966CC; font-weight:bold;">if</span><span style="color:#006600; font-weight:bold;">&#40;</span>count!=<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">if</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#40;</span>!line.<span style="color:#9966CC; font-weight:bold;">include</span>?<span style="color:#996600;">&quot;#&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#CC0066; font-weight:bold;">string</span> = line.<span style="color:#CC0066; font-weight:bold;">chomp</span>
<span style="color:#CC00FF; font-weight:bold;">FileUtils</span>.<span style="color:#9900CC;">cp</span> <span style="color:#CC0066; font-weight:bold;">string</span>,<span style="color:#996600;">'./'</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
count =  count<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006666;">1</span>
<span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Nombre lignes traitées : &quot;</span> <span style="color:#006600; font-weight:bold;">+</span> count.<span style="color:#9900CC;">to_s</span></pre></td></tr></table></div>

<p>Well, my mistake was to forget to add the line :<br />
<code>string = line.chomp</code><br />
because when you don&#8217;t, Ruby add the extra &laquo;&nbsp;\n&nbsp;&raquo; at the end of every line, and then FileUtils returns to you this very explicit message :<br />
<code><br />
/usr/lib/ruby/1.8/fileutils.rb:1200:in `stat': No such file or directory -  (Errno::ENOENT)<br />
from /usr/lib/ruby/1.8/fileutils.rb:1200:in `lstat'<br />
from /usr/lib/ruby/1.8/fileutils.rb:1178:in `stat'<br />
from /usr/lib/ruby/1.8/fileutils.rb:1260:in `copy_file'<br />
from /usr/lib/ruby/1.8/fileutils.rb:463:in `copy_file'<br />
from /usr/lib/ruby/1.8/fileutils.rb:383:in `cp'<br />
from /usr/lib/ruby/1.8/fileutils.rb:1395:in `fu_each_src_dest'<br />
from /usr/lib/ruby/1.8/fileutils.rb:1409:in `fu_each_src_dest0'<br />
from /usr/lib/ruby/1.8/fileutils.rb:1393:in `fu_each_src_dest'<br />
from /usr/lib/ruby/1.8/fileutils.rb:382:in `cp'<br />
from /serveur/anthony/ruby/export_playlist_to_files.rb:12<br />
from /serveur/anthony/ruby/export_playlist_to_files.rb:5:in `each'<br />
from /serveur/anthony/ruby/export_playlist_to_files.rb:5<br />
</code><br />
And believe me, it takes a while to debug&#8230; (irb was helful to solve this bug by the way !)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dahanne.net/2009/05/21/scripting-with-ruby-be-careful-with-file-open/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RailsCampParis 2 : le rendez vous de la communauté Ruby et Rails</title>
		<link>http://blog.dahanne.net/2009/03/07/railscampparis-2-le-rendez-vous-de-la-communaute-ruby-et-rails/</link>
		<comments>http://blog.dahanne.net/2009/03/07/railscampparis-2-le-rendez-vous-de-la-communaute-ruby-et-rails/#comments</comments>
		<pubDate>Sat, 07 Mar 2009 19:56:51 +0000</pubDate>
		<dc:creator>anthony.dahanne</dc:creator>
				<category><![CDATA[meeting]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.dahanne.net/?p=110</guid>
		<description><![CDATA[Samedi 7 Mars avait lieu la 2ème édition du RailsCamp [...]]]></description>
			<content:encoded><![CDATA[<p>Samedi 7 Mars avait lieu la 2ème édition du RailsCampParis, cette fois ci dans les locaux de Sun, avenue de Iéna (souvenez l&#8217;an dernier c&#8217;était à <a href="http://lacantine.org">La Cantine</a>)<br />
Une bonne soixantaine de personnes était présente pour le démarrage de cette journée, à 10h30; l&#8217;accueil était très bien rodé, avec contrôle de l&#8217;identité des visiteurs, attribution d&#8217;un autocollant avec nom/prénom tags, pour faciliter les échanges entre participants, et café / petit déj copieux <img src='http://blog.dahanne.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Après une bref intro et la présentation des sponsors, les personnes présentes se sont présentées, avec 3 tags (j&#8217;avais choisi JRuby, Rails, TDD)<br />
Dispersé sur 8 salles, les sujets ont commencé à émerger : beaucoup de merb, un peu de TDD/BDD, de la perf, de la scalabilité, bref, la journée s&#8217;annonce bien !<br />
Je me suis rendu aux sessions : </p>
<h3>&laquo;&nbsp;plugins préférés dans Rails&nbsp;&raquo;</h3>
<p> , les participants ont alors évoqué leurs plugins rails préférés et leurs utilisations ; on retiendra <a href="http://github.com/technoweenie/attachment_fu/tree/master">attachment_fu : pour l&#8217;upload des fichiers</a> ou encore <a href="http://thoughtbot.com/projects/paperclip">PaperClip</a>, Restful Authentification pour l&#8217;authentification.<br />
Quand aux plugins de test, en remplacement on retrouve RSpec, utilisé conjointement avec factory girl et shoulda (autre syntaxe que celle de RSpec de base); TestUnit peut s&#8217;utiliser avec Machinist, shoulda et faker (?)<br />
Bien entendu, Cucumber a été évoqué, car RSpec reste finalement trop technique pour un fonctionnel.<br />
Un petit retour sur <a href="http://github.com/thoughtbot/factory_girl/tree/master">Factory Girl</a> a été fait : factory girl permet de remplacer intelligemment les fixtures en YAML par des bouts de code (en Ruby); on utilise factory girls pour créer les objets à tester; que l&#8217;on persiste ou non (du coup un mock) dans la base&#8230; très intéressant ! </p>
<h3>présentation de Merb (par <a href="http://blog.shingara.fr/railscampparis-2-jy-etais-et-cetait-sympa.html">Cyril Mougel</a>)</h3>
<ul>
<li>ORM agnostique (Active Record, Data Mapper, etc&#8230;),</li>
<li>Javascript agnostique (JQuery, MooTools, etc&#8230;)</li>
<li>Comme Rails 2.2, compatible Rack</li>
<li>3 briques : merb-core, merb-more (le reste d&#8217;ActionPack), merb-plugins (ne sort pas simultanément avec les 2 autres, paquets de communication avec d&#8217;autres briques comme ActiveRecord, etc..)</li>
<li>mot clef &laquo;&nbsp;provides&nbsp;&raquo; permet de stipuler les formats de rendu des vue (.xml, .html, .json, etc..à plutot que &laquo;&nbsp;format=&nbsp;&raquo; en Rails</li>
<li>merb slices : déploiement d&#8217;une unique fonctionnalité (route au final) de l&#8217;application</li>
<h3>présentation de rails 3.0</h3>
<p><a href="http://yeastymobs.com">Nicolas Mérouze</a> est d&#8217;abord revenu sur un historique des fonctionnalités apparues dans rails et merb au cours des versions, pour en arriver au futur Rails 3; puis a exposé la vision des &laquo;&nbsp;poupées russes&nbsp;&raquo;, qui rappelait beaucoup certains concepts SOA de réutilisation du métier, des modèles à travers des services de plus haut niveau&#8230;<br />
Après avoir introduit <ah ref="http://adva-cms.org/">adva-cms (devenu adva-community)</a>, il a présenté son projet : Russian Dolls (vieux de 1 jour!), un plugin de Merb</p>
<p>Enfin, je me suis rendu à la table ronde Rack, où les différents participants ont évoqué ce qu&#8217;est Rack : une application &laquo;&nbsp;middleware&nbsp;&raquo; entre le serveur web et le framework Ruby. Pourquoi utiliser Rack ? par exemple pour gérer les routes en Ruby plutôt que dans un virtual host Apache (ainsi que que les accès à la page 404 ou autres); et ainsi garder la même conf quelque soit le serveur web en frontal, pratique aussi si on a  pas les droits sur la conf Apache ! Aussi, Rack permet de faire du routing entre différentes applications web Ruby.</p>
<p>Après j&#8217;ai dû partir, dommage, une session devait aborder en plus approfondi le thème des tests en Ruby&#8230; En tout cas l&#8217;organisation était parfaite, le &laquo;&nbsp;timeboxing&nbsp;&raquo; de 1h pour chaque session se prêtait très bien à l&#8217;événement, les pizzas, les boissons, les croissants, le tee shirt, vraiment, une excellente organisation ! J&#8217;ai de plus le sentiment que la communauté Rails se préoccupe de plus en plus de la qualité, les débats (ou trolls!) entre TestUnit et RSpec prouvent que les développeurs Rubyistes en  sont soucieux  et c&#8217;est tant mieux !!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dahanne.net/2009/03/07/railscampparis-2-le-rendez-vous-de-la-communaute-ruby-et-rails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cours du soir JRuby</title>
		<link>http://blog.dahanne.net/2008/10/30/cours-du-soir-jruby/</link>
		<comments>http://blog.dahanne.net/2008/10/30/cours-du-soir-jruby/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 22:28:38 +0000</pubDate>
		<dc:creator>anthony.dahanne</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[meeting]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.dahanne.net/?p=60</guid>
		<description><![CDATA[Ce Mardi 28 Octobre, dans le cadre des cours du soir de [...]]]></description>
			<content:encoded><![CDATA[<p>Ce Mardi 28 Octobre, dans le cadre des cours du soir de <a href="http://planet.valtech.fr">Valtech</a>, j&#8217;ai présenté une démonstration de la librairie open source JRuby, implémentation 100% Java de Ruby.<br />
A l&#8217;aide de travaux pratiques, avec les 7 participants présents, nous avons pu :</p>
<ul>
<li>  faire un bref rappel du langage Ruby (pendant 1H20 : définition de classe, héritage, module, mixin)</li>
<li>découvrir Jirb, shell permettant de découvrir les classes Ruby et Java (dans un jar)</li>
<li>utiliser des classes Java avec du code Ruby</li>
<li>découvrir Netbeans 6.1, notamment ses facultés &laquo;&nbsp;Ruby&nbsp;&raquo;</li>
<li>en 30 minutes, créer un projet Ruby On Rails, avec 2 modèles, création en scaffold des triplets MVC</li>
<li>déployer cette application Ruby on Rails, (grâce aux taches rake de Netbeans qui permettent de créer un war à partir d&#8217;un projet RoR) sur un conteneur de servlets, Tomcat en l&#8217;occurence</li>
</ul>
<p>Vous pouvez télécharger, à condition de respecter la licence ci dessous, les tps zippés ainsi que la présentation, au format OpenDocument (à lire avec <a href="http://fr.openoffice.org">OpenOffice</a>), ou pdf; vous pouvez aussi choisir de juste consulter la présentation avec l&#8217;applet flash ci dessous.</p>
<p><OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" WIDTH="320" HEIGHT="240" id="CoursDuSoirJRuby" ALIGN=""><br />
<PARAM NAME=movie VALUE="http://blog.dahanne.net/wp-content/uploads/jruby.swf"> <PARAM NAME=quality VALUE=high> <PARAM NAME=bgcolor VALUE=#333399> <EMBED src="http://blog.dahanne.net/wp-content/uploads/jruby.swf" quality=high bgcolor=#333399 WIDTH="480" HEIGHT="360" NAME="CoursDuSoirJRuby" ALIGN="" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></EMBED> </OBJECT> </p>
<ul>
<li>
<a href='http://blog.dahanne.net/wp-content/uploads/tps.zip'>TPs JRuby à télécharger</a></li>
<li><a href='http://blog.dahanne.net/wp-content/uploads/jruby.odp'>Présentation cours du soir JRuby, au format OpenDocument</a></li>
<li><a href='http://blog.dahanne.net/wp-content/uploads/jruby.pdf'>Présentation du cours JRuby, au format pdf</a></li>
</ul>
<p><strong><br />
Prochain rendez vous Ruby/Rails à <a href="http://paris.onrails.info/">Paris On Rails</a> !<br />
</strong></p>
<p><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/2.0/fr/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/2.0/fr/88x31.png" /></a><br /><span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" property="dc:title" rel="dc:type">Cours du soir JRuby</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="http://blog.dahanne.net" property="cc:attributionName" rel="cc:attributionURL">Anthony Dahanne</a> est mis &#224; disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/2.0/fr/">licence Creative Commons Paternit&#233;-Pas d&#8217;Utilisation Commerciale-Partage des Conditions Initiales &#224; l&#8217;Identique 2.0 France</a>.<br />Bas&#233;(e) sur une oeuvre &#224;<br />Les autorisations au-del&#224; du champ de cette licence peuvent &#234;tre obtenues &#224; <a xmlns:cc="http://creativecommons.org/ns#" href="http://blog.dahanne.net" rel="cc:morePermissions">http://blog.dahanne.net</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dahanne.net/2008/10/30/cours-du-soir-jruby/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Récepteur Sony GPS CS1-KASP : présentation et utilisation sous Linux</title>
		<link>http://blog.dahanne.net/2008/07/24/sony_gps-cs1kasp/</link>
		<comments>http://blog.dahanne.net/2008/07/24/sony_gps-cs1kasp/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 06:39:19 +0000</pubDate>
		<dc:creator>anthony.dahanne</dc:creator>
				<category><![CDATA[gps]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.dahanne.net/?p=43</guid>
		<description><![CDATA[Cela faisait quelque temps que çà me démangeait, et  [...]]]></description>
			<content:encoded><![CDATA[<p>Cela faisait quelque temps que çà me démangeait, et finalement, j&#8217;ai craqué : j&#8217;ai acquis le récepteur GPS Sony CS1-KASP&#8230;</p>
<h3>Qu&#8217;est ce que c&#8217;est ?</h3>
<p>Toutes les 15 secondes ce petit module gros comme 3 piles AA (et qui fonctionne d&#8217;ailleurs avec 1 pile AA) va récupérer 1 trame GPS, au format NMEA (qui contient l&#8217;heure de capture et la latitude/longitude).<br />
Il coûte environ 90 euros aux USA, 150 en France ; j&#8217;ai eu  la chance d&#8217;avoir pu me le faire rapporter (il a été commandé du coup sur B&#038;H Photo Video) il y a 1 mois.<br />
L&#8217;appareil ne possède pas d&#8217;affichage numérique, aussi on en peut que le mettre en route et observer qu&#8217;il est en exploration de satellites (clignotements verts rapprochés) en saisie (clignotements verts non rapprochés) en manque de batterie (clignotements rouges rapprochés) ou encore que sa mémoire est pleine (clignotement orange je crois&#8230;, mais çà ne m&#8217;est jamais arrivé encore !)<br />
<a href="http://blog.dahanne.net/wp-content/uploads/sony_gps_tracker_device.jpg"><img src="http://blog.dahanne.net/wp-content/uploads/sony_gps_tracker_device-300x212.jpg" alt="" title="sony_gps_tracker_device" width="300" height="212" class="alignnone size-medium wp-image-51" /></a><br />
Ensuite, en le branchant sur votre ordinateur (en USB) vous pouvez récupérer des fichiers textes, au format NMEA donc, reprenant l&#8217;ensemble de votre parcours.(enfin, tous les points capturés à intervalle de 15 secondes pendant que l&#8217;appareil était en marche et avait de la réception GPS&#8230;)<br />
La mémoire interne est de 31mo (çà suffit très largement pour stocker des trames au format texte ! et l&#8217;autonomie sur une pile est d&#8217;à peu près 10h (un peu moins avec les piles rechargeables)</p>
<h3>A quoi çà sert ?</h3>
<p>Et bien Sony met en avant la possibilité de confronter ces trames GPS à vos photos (à condition bien sûr que votre appareil soit à l&#8217;heure !!!) : vous avez des points horodatés, des photos horodatés : le couple idéal pour géolocaliser vos photos !<br />
Mais on peut aller plus loin en convertissant les fichiers log en fichiers KML (format de traçage utilisé par Google Earth, permettant de situer votre parcours ainsi que vos photos sur la mappemonde de Google Earth)<br />
Ou alors, on peut même retirer plein d&#8217;infos sur son parcours comme : temps de parcours, vitesse moyenne, min, max (lors d&#8217;un jogging ou d&#8217;une balade en vélo, etc&#8230;), bref tout ce que l&#8217;on peut imaginer à partir d&#8217;un point horodaté !</p>
<h3>Qu&#8217;y a t il de fourni avec ?</h3>
<p>des accessoires pour l&#8217;accrocher sur un vélo, un sac à dos&#8230;<br />
un cd rom aussi, avec des logiciels propriétaires de Sony pour Windows, pour les avoir essayés une fois, ils fonctionnent plutôt bien (ils permettent de reconnaître le module branché en USB, de choisir les photos à lui associer et de modifier les tags EXIF des photos pour y incorporer longitude et latitude)</p>
<h3>Fonctionne &#8211; il sous Linux ?</h3>
<p>Oui, j&#8217;utilise Ubuntu 8.4 (Hardy Heron), et en branchant l&#8217;appareil en USB, Dolphin (explorateur de fichiers sous KDE) se lance tout seul et m&#8217;affiche le montage du module : on obtient une liste de fichiers logs; que l&#8217;on ouvre avec n&#8217;importe quel éditeur texte pour contempler (!) les trames NMEA; çà donne çà :<br />
<code><br />
@Sonygps/ver1.0/wgs-84<br />
$GPGGA,064509,4852.5872,N,00213.9426,E,1,04,02.8,00057.1,M,047.6,M,,*4E<br />
$GPGSA,A,3,02,04,13,27,,,,,,,,,04.9,02.8,03.9*0E<br />
$GPGSV,2,1,07,07,40,157,00,08,12,181,00,13,82,046,50,25,,,41*43<br />
$GPGSV,2,2,07,04,61,243,52,02,41,298,52,27,38,166,45,,,,*42<br />
$GPRMC,064509,A,4852.5872,N,00213.9426,E,000.0,000.0,230708,,,A*7A<br />
$GPVTG,000.0,T,,M,000.0,N,000.0,K,A*0D<br />
$GPGGA,064524,4852.5872,N,00213.9443,E,1,04,02.8,00045.2,M,047.6,M,,*42<br />
$GPGSA,A,3,02,04,13,27,,,,,,,,,04.9,02.8,04.0*00<br />
$GPGSV,3,1,11,02,41,298,53,04,61,243,52,07,40,157,00,08,12,181,00*7B<br />
$GPGSV,3,2,11,10,08,289,00,13,82,046,51,16,08,053,00,20,14,108,00*7B<br />
$GPGSV,3,3,11,27,38,166,42,29,00,347,00,25,,,41,,,,*79<br />
$GPRMC,064524,A,4852.5872,N,00213.9443,E,000.0,000.0,230708,,,A*76<br />
$GPVTG,000.0,T,,M,000.0,N,000.0,K,A*0D<br />
$GPGGA,064539,4852.5845,N,00213.9444,E,1,05,02.4,00039.1,M,047.6,M,,*48<br />
$GPGSA,A,3,02,04,13,25,27,,,,,,,,04.6,02.4,03.9*0A<br />
$GPGSV,3,1,12,02,41,298,53,04,61,243,51,07,40,157,00,08,12,181,00*7B<br />
$GPGSV,3,2,12,10,09,289,00,13,82,046,50,16,08,052,00,20,14,108,00*79<br />
$GPGSV,3,3,12,25,55,130,35,27,38,166,36,29,00,347,00,26,,,00*4C<br />
$GPRMC,064539,A,4852.5845,N,00213.9444,E,000.0,000.0,230708,,,A*79<br />
$GPVTG,000.0,T,,M,000.0,N,000.0,K,A*0D<br />
</code><br />
Je vois d&#8217;ici les mauvaises langues dire &laquo;&nbsp;ah oui mais ce format n&#8217;est pas le format le plus répandu, peu de logiciels (libres en l&#8217;occurrence) le comprenne&nbsp;&raquo;<br />
C&#8217;est sans compter sur <a href="http://www.gpsbabel.org/download.html">GPSBabel</a>, logiciel libre multi plateformes qui permet de transformer ces trames NMEA en <a href="http://fr.wikipedia.org/wiki/GPX_(format_de_fichier)">GPX</a> par exemple, format ouvert beaucoup plus répandu, en XML cette fois ci&#8230;(ou une des dizaines d&#8217;autres formats de géolocalisation que comprend GPSBabel).<br />
Pour l&#8217;installer sous Ubuntu (ou Debian) un simple  :<br />
<code>%>sudo apt-get install gpsbabel</code><br />
devrait suffir&#8230;<br />
une fois la ligne de commande suivante saisie :<br />
<code><br />
%>gpsbabel -i nmea -f WG20080723064509.log -o gpx -F test.gpx<br />
</code><br />
Vous aurez converti le fichier provenant de votre GPS CS1 au format NMEA en fichier au format GPX, ce qui donne çà :<br />
<code><br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;gpx<br />
 version="1.0"<br />
creator="GPSBabel - http://www.gpsbabel.org"<br />
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
xmlns="http://www.topografix.com/GPX/1/0"<br />
xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd"&gt;<br />
&lt;time&gt;2008-07-23T20:44:09Z&lt;/time&gt;<br />
&lt;bounds minlat="48.876360000" minlon="2.232348333" maxlat="48.891765000" maxlon="2.239443333"/&gt;<br />
&lt;trk&gt;<br />
&lt;trkseg&gt;<br />
&lt;trkpt lat="48.876453333" lon="2.232376667"&gt;<br />
  &lt;ele&gt;57.100000&lt;/ele&gt;<br />
&lt;time&gt;2008-07-23T06:45:09Z&lt;/time&gt;<br />
  &lt;course&gt;0.000000&lt;/course&gt;<br />
  &lt;speed&gt;0.000000&lt;/speed&gt;<br />
  &lt;fix&gt;3d&lt;/fix&gt;<br />
  &lt;sat&gt;4&lt;/sat&gt;<br />
  &lt;hdop&gt;2.800000&lt;/hdop&gt;<br />
  &lt;vdop&gt;3.900000&lt;/vdop&gt;<br />
  &lt;pdop&gt;4.900000&lt;/pdop&gt;<br />
&lt;/trkpt&gt;<br />
&lt;trkpt lat="48.876453333" lon="2.232405000"&gt;<br />
  &lt;ele&gt;45.200000&lt;/ele&gt;<br />
&lt;time&gt;2008-07-23T06:45:24Z&lt;/time&gt;<br />
  &lt;course&gt;0.000000&lt;/course&gt;<br />
  &lt;speed&gt;0.000000&lt;/speed&gt;<br />
  &lt;fix&gt;3d&lt;/fix&gt;<br />
  &lt;sat&gt;4&lt;/sat&gt;<br />
  &lt;hdop&gt;2.800000&lt;/hdop&gt;<br />
  &lt;vdop&gt;4.000000&lt;/vdop&gt;<br />
  &lt;pdop&gt;4.900000&lt;/pdop&gt;<br />
&lt;/trkpt&gt;<br />
&lt;trkpt lat="48.876408333" lon="2.232406667"&gt;<br />
  &lt;ele&gt;39.100000&lt;/ele&gt;<br />
&lt;time&gt;2008-07-23T06:45:39Z&lt;/time&gt;<br />
  &lt;course&gt;0.000000&lt;/course&gt;<br />
  &lt;speed&gt;0.000000&lt;/speed&gt;<br />
  &lt;fix&gt;3d&lt;/fix&gt;<br />
  &lt;sat&gt;5&lt;/sat&gt;<br />
  &lt;hdop&gt;2.400000&lt;/hdop&gt;<br />
  &lt;vdop&gt;3.900000&lt;/vdop&gt;<br />
  &lt;pdop&gt;4.600000&lt;/pdop&gt;<br />
&lt;/trkpt&gt;<br />
&lt;/trkseg&gt;<br />
&lt;/trk&gt;<br />
&lt;/gpx&gt;<br />
</code></p>
<h3>Quel est l&#8217;intérêt  de convertir en GPX ? Comment utiliser le GPS CS1KASP sous Linux ?</h3>
<p>et bien tout simplement de pouvoir associer les coordonnées de ce fichier à votre collection de photos sous Digikam (gestionnaire de photos sous KDE).<br />
Dans Digikam, sélectionnez vos photos, puis Image -> Géolocalisation ->Corrélation<br />
<a href="http://blog.dahanne.net/wp-content/uploads/digikam_correlation1.png"><img src="http://blog.dahanne.net/wp-content/uploads/digikam_correlation1-300x158.png" alt="" title="digikam_correlation1" width="300" height="158" class="alignnone size-medium wp-image-47" /></a><br />
Renseignez votre fichier au format GPX (et si besoin est, selon le fuseau horaire de votre appareil photo, modifier les paramètres de la corrélation de plusieurs heures avant ou après)<br />
<a href="http://blog.dahanne.net/wp-content/uploads/digikam_correlation2.png"><img src="http://blog.dahanne.net/wp-content/uploads/digikam_correlation2-300x158.png" alt="" title="digikam_correlation2" width="300" height="158" class="alignnone size-medium wp-image-48" /></a><br />
Vos photos sont désormais géo tagguées !<br />
Alors pour en voir le résultat, pourquoi ne pas exporter le tout en KML pour vois s&#8217;afficher vos photos sur Google Earth ?<br />
<a href="http://blog.dahanne.net/wp-content/uploads/digikam_googleearth1.png"><img src="http://blog.dahanne.net/wp-content/uploads/digikam_googleearth1-300x158.png" alt="" title="digikam_googleearth1" width="300" height="158" class="alignnone size-medium wp-image-49" /></a><br />
Ouvrez votre fichier KML avec GoogleEarth, et appréciez le résultat !<br />
<a href="http://blog.dahanne.net/wp-content/uploads/digikam_googleearth2.png"><img src="http://blog.dahanne.net/wp-content/uploads/digikam_googleearth2-226x300.png" alt="" title="digikam_googleearth2" width="226" height="300" class="alignnone size-medium wp-image-50" /></a><br />
Ainsi, nul besoin d&#8217;utiliser Windows pour associer les coordonnées obtenues par le GPS CS1 à vos photos !</p>
<h3>Conclusion</h3>
<p>Cela fait seulement 1 mois que je l&#8217;ai acheté, aussi j&#8217;ai quand même remarqué, au niveau des points faibles, une réception parfois difficile; et une autonomie un peu plus faible avec les piles rechargeables&#8230;<br />
Par contre, son montage sous Linux s&#8217;est révélé sans accro (ceci dit j&#8217;ai lu que sous Mac OSX c&#8217;était autre chose&#8230;) et les logiciels GPSBabel et Digikam sont très bien adaptés pour exploiter ses trames !<br />
Aujourd&#8217;hui j&#8217;écris un logiciel en Ruby pour pouvoir retirer des informations statistiques sur ces trames, le projet n&#8217;est pas encore avancé, mais vous pouvez quand même jeter un coup d&#8217;oeil aux sources de <a href="http://gpxtools.rubyforge.org/svn/trunk/">GPXTools</a>.<br />
En tout cas, rien que pour l&#8217;utilisation principale (géotagguer ses photos) je conseille l&#8217;achat de cet appareil (sans concurrent pour l&#8217;instant d&#8217;ailleurs) rien que pour avoir le plaisir dans quelques années de pouvoir retrouver facilement sur une carte l&#8217;exacte position (à 10 mètres près, GPS oblige) de vos prises de photos !</p>
<p>Liens :<br />
<a href="http://www.gpsbabel.org">GpxBabel</a><br />
<a href="http://www.digikam.org">Digikam</a><br />
<a href="http://rubyforge.org/projects/gpxtools/">GPXTools</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dahanne.net/2008/07/24/sony_gps-cs1kasp/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Retour sur le bar camp Rails du 17 Mai , à la Cantine (Paris)</title>
		<link>http://blog.dahanne.net/2008/05/21/retour-sur-le-bar-camp-rails-du-17-mai-a-la-cantine-paris/</link>
		<comments>http://blog.dahanne.net/2008/05/21/retour-sur-le-bar-camp-rails-du-17-mai-a-la-cantine-paris/#comments</comments>
		<pubDate>Wed, 21 May 2008 19:12:30 +0000</pubDate>
		<dc:creator>anthony.dahanne</dc:creator>
				<category><![CDATA[meeting]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.dahanne.net/2008/05/21/retour-sur-le-bar-camp-rails-du-17-mai-a-la-cantine-paris/</guid>
		<description><![CDATA[Intéressé depuis quelque temps par le monde de Ruby e [...]]]></description>
			<content:encoded><![CDATA[<p>Intéressé depuis quelque temps par le monde de Ruby et Ruby on Rails, j&#8217;ai décidé de m&#8217;inscrire au BarCamp Rails ce Samedi 17 Mai à Paris<br />
A partir de 10h, les organisateurs ont mettent en place un tableau où les pesonnes désirant exposer leur travail ou découverte s&#8217;inscrivent.<br />
(il y a 5 espaces disponibles à La Cantine, apparemment il faisait chaud à l&#8217;étage!; et les créneaux horaires durent de 1 à 2 heures)<br />
Ensuite, après avoir présenté brièvement Silicon Sentier et d&#8217;autres sponsors, les organisateurs ont passé le micro à chacun des participants (une centaine quand même !) afin qu&#8217;ils se présentent : prénom + tags (j&#8217;ai choisi les tags développeur Java J2EE, d&#8217;autres tags comme &laquo;&nbsp;fille&nbsp;&raquo; ou &laquo;&nbsp;windows&nbsp;&raquo; étaient plus originaux !)<br />
Les personnes s&#8217;étant inscrites sur le tableau démarrèrent dès 10h30.<br />
Il y en avait pour tout le monde : débutant comme expérimenté ! (présentation ruby on rails, ruby en entreprise, facebook on rails !, etc&#8230;)<br />
Voici mon choix pour la journée :</p>
<h3>10:30 : présentation de l&#8217;intégration google maps dans rails avec <a href="http://geokit.rubyforge.org">geokit</a>; par <a href="http://www.xilinus.com ">Sébastien Gruhier</a></h3>
<p>Apres une présentation du projet, nous avons procédé à la  <a href="http://code.google.com/apis/maps/signup.html">génération d&#8217;une api key chez google maps</a>, afin de pouvoir utiliser l&#8217;API (je crois que l&#8217;on a droit à 10000 requêtes par jour, à vérifier).<br />
Nous avons ensuite créé un site rails, en ayant pris soin auparavant d&#8217;installer les gems de geokit et d&#8217;un module d&#8217;authentification.<br />
Ensuite nous avons testé l&#8217;API par une console Rails, et enfin nous avons codé nos premiers fcihiers Rails avec des cartes.<br />
L&#8217;API geokit permet de faire des travaux de geolocalisation (par IP) et de récupération  de coordonnées, mais elle ne permet pas de générer des cartes gogole maps (en fait lors de la session nousa vons du coder du javascript pour cécupérer des cartes&#8230;)<br />
Pour ceux qui craignent le Javascript, passez votre chemin donc, et dirigez vous plutôt vers un wrapper (comme YM4R sur rubyforge wrapper javascript)</p>
<h3>14:30 : présentation jruby par <a href="http://yeastymobs.com/">Nicolas Mérouze</a></h3>
<p>nous avons installé jruby bin (.zip ou tar gz).<br />
A l&#8217;attaque, en lançant le script bat jruby.bat (ou jruby.sh)on peut d&#8217;ores et déjà installer des gems avec<br />
<code>jruby -S gem install un_gem_ruby</code><br />
Plus généralement,<br />
<code>jruby -S "commande ruby"</code><br />
Nicolas nous a montré beaucoup d&#8217;exemples sur Ruby qui utilise Java (normal il travaille sur un projet qui utilise des librairies java), peu dans l&#8217;inverse (dommage); sur le web, j&#8217;ai pu remarquer cet<a href=" http://java.sun.com/developer/technicalArticles/scripting/jruby/#ej"> article qui permet de découvrir Jruby pour intégrer du Ruby dans Java</a></p>
<h3>16:30 présentation faille sécurité ruby/ecommerce par <a href="http://www.webpulser.com">Webpulser</a></h3>
<p>Pendant cette session les participants ont pu échanger sur leurx expériences Ruby, ensuite l&#8217;équipe technique de Webpulser ont fait un petit tour des failles de sécurité en Ruby :<br />
*Injection SQL : en donnant un &#8216; à la fin d&#8217;une requete GET ,des attaquants pourraient terminer une clause SQL, ==> on utilise le ? à la printf de C pour échapper les caracteres spéciaux<br />
*XSS en donnant du javascript dans l&#8217;url; on évite çà avec <%h= %> qui échappe le html<br />
etc&#8230;</p>
<p>Sans parler de l&#8217;organisation qui était vraiment pro, un accueil chaleureux, bref, ce <a href="http://barcamp.org/RailsCampParis">BarCampRails  parisien</a> vallait vraiment le détour !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dahanne.net/2008/05/21/retour-sur-le-bar-camp-rails-du-17-mai-a-la-cantine-paris/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Port of an J2EE application (with Hibernate) to Ruby on Rails (1.2.3)</title>
		<link>http://blog.dahanne.net/2008/04/22/port-of-an-j2ee-application-with-hibernate-to-ruby-on-rails-123/</link>
		<comments>http://blog.dahanne.net/2008/04/22/port-of-an-j2ee-application-with-hibernate-to-ruby-on-rails-123/#comments</comments>
		<pubDate>Mon, 21 Apr 2008 22:18:13 +0000</pubDate>
		<dc:creator>anthony.dahanne</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.dahanne.net/2008/04/22/port-of-an-j2ee-application-with-hibernate-to-ruby-on-rails-123/</guid>
		<description><![CDATA[Last week, I ported a J2EE application, using Hibernate [...]]]></description>
			<content:encoded><![CDATA[<p>Last week, I ported a J2EE application, using Hibernate for persistence and Capestry for the MVC part of the application to Ruby.<br />
I logically choosed Ruby on Rails as it is the main Web framework for Ruby.<br />
In this post, I describe how I did to perform such a port&#8230;<br />
!Important! the application I first wrote this application in Franch, I tried to refactor the code in English, but&#8230; I haven(t finished at this time, &#8230; sorry folks !</p>
<h3>Introducing the bank on line application</h3>
<p>This application is composed of 3 models : Client, Compte (account) and Operation<br />
A client has n Comptes (through reference_client) and a Compte has n Operations (through compte_id) :<br />
<img src="http://blog.dahanne.net/kjkljkl" alt="Bank on line" /><br />
The application allow the user to :<br />
*login<br />
*see a list of his accounts (after being logged in)<br />
*see the details of one of his account (actually a list of the operations on an account)<br />
*order a transfer between 2 accounts provided that the balance is positive (and the accounts exist)<br />
Quite simple from a user point of view&#8230;</p>
<h3>Creating the application with Ruby on Rails 1.2.3</h3>
<p>The best way to port this new application to RoR, was to create a new RoR project<br />
<code>rails bankonline -d sqlite3</code><br />
(by the way, I was using the sqlite3 database, to allow an easy installation of the application, the J2EE application was using HSQLDB)<br />
<code>cd bankonline</code><br />
I was using for this <a href="http://www.aptana.com/rails/">Rad Rails visual editor</a> on a windows platform (no comment&#8230;)<br />
The first step to port this application was to create the 3 models.<br />
<code>ruby script/generate model Client</code><br />
<code>ruby script/generate model Compte</code><br />
<code>ruby script/generate model Operation</code><br />
Then I put the contraints on each of these models (the has_many and belongs_to relationships to stick to my diagram), editing their definition files in app/models and also the database definition files, in db/migrate<br />
Once this is done, I can run<br />
<code>rake db:migrate</code><br />
to load all my db/migrate scripts. (in case I want to revert the changes, I can use rake db:migrate VERSION=0, or VERSION=1 if only want to reverse the migration after the script)</p>
<p>To fill the database with data, I add another migration script :<br />
<code>ruby script/generate migration add_data</code><br />
I edit it to add some lines in the database and then I migrate :<br />
<code>rake db:migrate</code></p>
<p>Then the 3 corresponding controllers :<br />
<code>ruby script/generate controller login</code><br />
<code>ruby script/generate controller gestion</code></p>
<h3>Implementing the login system (session based)</h3>
<p>For this, I took example on the depot application login system, from the pragmatic programmers&#8217; book &laquo;&nbsp;Agile Web Development with Rails&nbsp;&raquo;, but I chose to use not encrypted passwords.<br />
I also chose to use database based sessions, so I edited the config/environment.rb file, line 31, to allow :<br />
config.action_controller.session_store = :active_record_store<br />
Then, I add to create a new table to hold the session data :<br />
<code>rake db:sessions:create</code></p>
<p>Of course, you need a little bit of code in your app/controllers/login_controller.rb, you have to implement the login and logout methods (or actions, to speak rails); you may also notice the apparition of a &laquo;&nbsp;before_filter&nbsp;&raquo; call.<br />
The authorize filter is defined in the app/controllers/application.rb file, it will be loaded for every controller, and will check tha t a valid client is in session, or else, it will redirect to the login action, in the login controller.<br />
Finally, you will have to define the views, both in app/views/login, they&#8217;re called login.rhtml and logout.rhtml<br />
One last thing : you also need to modify the layout, in app/views/layouts/login.rhtml to display the flash notice before the yield (which includes the display of the view)<br />
<code></p>
<p style="color: green"><%= flash[:notice] %></p>
<p></code></p>
<h3>Implementing the account listings and the transfer functionality</h3>
<p>We have to code the controller, GestionController, located in gestion_controller.rb<br />
You&#8217;ll notice that I&#8217;ve replaced the service class in Hibernate by methods inside the controller in Rails, I didn&#8217;t want to put it in the model, since the model can&#8217;t know how to transfer money.(I think we can discuss that point, but as long as the helpers are dedicated to the view&#8230;)<br />
I&#8217;ve also used exceptions to raise errors (if the origin account balance is smaller than the transfer amount)<br />
You also have to include the flash notice in the layout, app/views/layouts/gestion.rhtml</p>
<p>That&#8217;s it !<br />
launch your rails app<br />
<code>ruby script/server</code><br />
and try it out in your web browser at : http://localhost:3000/login/login</p>
<p>In a few days I&#8217;ll complete this article with the tests and fitnesse fixtures &#8230;<br />
To continue &#8230;</p>
<p><a href='http://blog.dahanne.net/2008/04/22/port-of-an-j2ee-application-with-hibernate-to-ruby-on-rails-123/first-version-of-bank-online-ror/' rel='attachment wp-att-31' title='First version of Bank online RoR'>First version of Bank online RoR to download </a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dahanne.net/2008/04/22/port-of-an-j2ee-application-with-hibernate-to-ruby-on-rails-123/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
