Vous êtes étudiant en développement ? Découvrir un nouveau langage et un framework supra top mega cool vous intéresse ?
Ou bien vous êtes étudiant et vous êtes déjà un gourou de Ruby et de Rails ?
Ce message vous intéresse !
Sinon ? eh ben lisez quand même, au cas ou vous auriez un(e) ami(e) qui pourrait être intéressé(e) :)

Une super agence web que je ne nommerai pas a besoin de vous maintenant !
Il s’agit de participer au développement d’un projet interne en équipe (de deux).

Les conditions requires sont les suivantes :

  • Aimer les sushis
  • Avoir un FPH moyen supérieur à 400
  • Avoir une Wiimote et un Nunchuk à la place des mains
  • Être chez Canon

Et sinon si vous avez déjà des bonnes bases dans le développement web (php toussa. Java ne compte pas), que vous êtes intéressé par rails voir que vous avez déjà des bases, vous correspondez au profil.

Le stage est basé à Lyon.
Et du coup n’hésitez pas à lire et à répondre à l’annonce officielle sur le blog de la société qui cherche ce développeur.

Samedi dernier a eu lieu le premier RubyCamp Lyonnais. Premier mais pas dernier :)
Puisque lorsque j’ai commencé à dire « RubyCamp 2009″, on m’a dit « ah non mais il y en aura un autre cette année hein !! ». Donc j’te dis ok !

Petit compte rendu tout de même, puisque c’est le but de cet article.

Découverte de Ruby

J’ai tout d’abord fait une présentation du langage Ruby. J’avoue que j’ai fait du recyclage. J’ai utilisé les slides de mon cours Ruby en Picardie il y a un mois de cela. Mais en adaptant un peu. J’ai notamment été beaucoup moins attaché aux slides et j’ai codé (en ligne de commande avec IRB) devant eux afin de faire une vraie démonstration. Et ça fonctionne.
Du coup je pense que j’exploiterai ça encore plus la prochaine fois :)

Ruby GTK

Puis nous avons eu une présentation de RubyGTK, pour créer des interfaces graphiques d’applications clientes.
Super sympa, même si je n’en ai suivi que la moitié  parce que après il fallait récupérer les pizzas du repas. Quoi qu’il en soit, Ruby simplifie la chose à fond comparé à du C par exemple.

Test Driven Development : RSpec

Il est déjà très facile d’attirer mon attention en me parlant de développement dirigé par les test. Alors la j’étais aux anges !
Nous avons donc parlé de cette méthode de développement, en particulier avec RSpec.
Et vu qu’on arrivait pas à en finir pour passer à la session suivante, je me dis que un TestCamp pourrait intéresser du monde. Quelqu’un se lance ? :p

Test Acceptance : Cucumber

Et oui ! Comme on arrivait pas à s’arrêter avec les tests, on a continué avec Cucumber.
Et la encore j’aime beaucoup l’idée, adaptable également avec des clients : leur proposer divers scénarios, écrits de manière verbeuse; les exécuter et développer l’application en vérifiant que ceux-ci fonctionnent.

Nous avons également un petit peu parlé de Selenium. Qui est également très sympa, même si ça semble un chouilla lourd.

RubyGems et les distributions linux (Debian en particulier)

Parce que nous avions la chance d’avoir un développeur Debian avec nous. Et pas n’importe lequel puisque Lucas maintiens les packages Ruby dans la distribution, celui-ci nous a expliqué pourquoi les gem c’est le mal pour les utilisateurs finaux car cela les force à installer les dépendances d’une application d’une manière différente de celle qu’ils utilisent d’habitude pour gérer leurs paquets.
Et en gros la moralité était : utilisez setup.rb !

Au final, une journée qui est passé très très vite. Mais dont je ne regrette rien. Et je le dis : il y en aura d’autres !
D’ailleurs nous avons même parlé d’organiser des apéros Ruby de manière régulière. Nous parlions d’une fois tous les deux mois pour commencer. Et encore une fois, je dis : on va tout faire pour !

A voir également :

  • Les photos de Brice
  • Mes photos (prises, pour la plupart, par Philippe)
  • Les slides de Jean-Michel Garnier, sur Cucumber.
  • Le compte rendu de Romain (qui, suite à cela, parle de préparer un FlexCamp à Lyon. Elle est pas belle la vie ? ;) )

Je mettrai cette liste à jour au fur et à mesure que les compte rendus arriveront.

Et parce que sans eux cela n’aurait pas été possible, je tiens à remercier :

  • O2Sources pour nous avoir permis de manger le midi
  • Philippe, qui a fait énormément de choses. Que ce soit pour obtenir la salle ou préparer des affiches qu’il a placardées dans l’INSA.
  • Floriane, pour le(s) logo(s).
  • Guillaume Desrat et Jean-François Trân pour leurs conseils avisés

Si j’ai oublié quelqu’un, n’hésitez pas à crier :)

P.S. : s’il vous prends l’envie folle de participer à l’organisation du prochain RubyCamp Lyonnais, n’hésitez pas à vous inscrire à la liste de diffusion !

Et oui, la communauté Ruby francophone est particulièrement active en ce moment.
Deux évènements auxquels vous êtes particulièrement invités, que vous maitrisiez le langage ou non (venir pour découvrir est une très bonne raison).

Du coup vous n’aurez aucune excuse pour dire que vous ne connaissez pas Ruby ou Rails après ça.

Pour l’instant du moins.

Comme vous le savez peut-être déjà, Zend a publié hier la première beta publique de son Zend Server.
L’idée est en soi sympa. Le produit, qui a des versions Windows, Mac et Linux, inclut :

  • Apache (ou le support de IIS si vous êtes un grand fou sous windows)
  • PHP
  • Zend Framework
  • MySQL (optionnel)

Alors après un petit test rapide, le produit est sympa.
L’interface web d’administration du serveur est toute jolie, ergonomique toussa (même si sans licence on ne peut pas voir grand chose).
A savoir qu’elle a été développée avec le Zend Framework et Dojo.

Mais cette interface ne permet de gérer que PHP, les extensions installées et les logiciels Zend installés.
C’est bien maigre lorsque l’on sait que pour faire fonctionner PHP il faut aussi un Apache correctement configuré. Du coup pour configurer son Apache, il faut passer par le fichier de configuration normal.

Ainsi en « natif », pas de multi projets. Vous placez votre application développée avec Zend à la base du DocumentRoot et puis c’est tout.
Quand j’ai vu l’interface, j’ai tout de suite pensé à une génération automatique de virtualhosts moi (je me suis même pris à rêver de modification automatique du fichier hosts, c’est dire).

Pour finir le Apache utilisé est celui disponible chez apache.org, sans aucune implémentation native dans le Zend Server.
Du coup vous avez (sous windows) deux icônes, une pour le ZS et une pour Apache. Quand des logiciels comme WAMP sont capables de monitorer seuls le serveur http ainsi que le serveur mysql, c’est plutôt dommage.

Du coup je me tâte pour regarder si ce serveur est intégrable à wamp justement. Même si l’intérêt en est finalement assez faible puisque ce dernier permet de gérer les extensions php installées de manière parfaitement correcte.

Du coup je vire le Zend Server et je reste avec wamp pour l’instant. On verra d’ici un an ou deux si la version stable intègre une gestion plus avancée des serveurs http et mysql.

P.S. : Aujourd’hui, O2Sources vient de sortir son premier projet Open Source, développé avec Zend Framework justement.

Bon j’imite Romain et pour une fois, je fais un billet pas technique. Malgré le fait que moi, personne ne me l’ai demandé. Logique remarque vu qu’il y a que des informaticiens qui me lisent. J’ai dégouté tous les autres de le faire depuis longtemps ;)

Avec les gens du pool flickr Lyon et puis quelques personnes de Voisineo (qui sont bien gentils soi dit en passant, même si on ne les a pas vu beaucoup vu qu’ils ont fait un peu leur groupe tout seuls), nous avons organisé un safari photo ce dimanche.
Eh oui on se croyait déjà le printemps. Et on aurait pas du parce qu’on s’est gelé les miches.

Donc déjà, merci à Thanh et à Fetard (mais surtout à Thanh) pour le thème complètement inaccessible :
Inaccessible … ou pas

Je me suis donc retrouvé dans le groupe avec Goulven, Peter (dont je ne connais pas l’adresse du flux), Cyril (pareil) et Thanh.
On est allé shooter du côté de Perrache, avec moi disant durant tout le trajet qu’il serait super inaccessible de faire des photos sur les voies du TGV.
Mais c’était trop inaccessible. Alors on s’est contenté du tram.

Et pour le reste, je vous invite à voir mes photos ;)

P.S. : vous avez vu le nouveau design de Floriane ?


Bien qu’on ait pas fait de photos sur les voies du TGV, on s’en est approché.

Parce que quand je place ce code la :
<asp:DataList ID="documentsList" DataSourceID="docsList" runat="server">
<ItemTemplate>
<%#Eval("tx_titre")%>
</ItemTemplate>
</asp:DataList>

Ce con me donne ceci :
<table id="ctl00_ContentPlaceHolder_documentsList" cellspacing="0" border="0" style="border-collapse:collapse;">
<tr>
<td>
Plouf
</td>
</tr>
</table>

Et que, jusqu’à preuve du contraire, je ne suis pas suffisamment con pour oublier les balises autour d’une liste de données.
Et que je ne veux pas forcément que mon appli me rajoute automatiquement des tags autour de celles-ci. Surtout si c’est pour rajouter un tableau.
On se croirait revenu en 1998.

Oui, le titre est fortement racolleur. Mais pour une fois, c’est pas fait pour attirer des commentaires. C’est vraiment ce que je pense.
Et oui je poste ce billet un vendredi soir en étant bien content de partir en week-end et en ayant absolument pas hâte de revenir lundi.

Edit
Lorsque je demande conseil à un ami que je ne nommerai pas par respect pour lui mais qui fait partie de la douzaine de personnes avec qui je vais manger une raclette ce soir même, il me réponds :

essaie de rajouter RepeatLayout= »Flow » dans la définition du DataList

Ce qui a pour effet de me renvoyer :
<span id="ctl00_ContentPlaceHolder_documentsList">
<span>Plouf</span>
</span>

Sa réaction :

c’est moins pire

Oui. Mais c’est toujours pas ce que je veux. Je n’ai jamais demandé à avoir un quelconque tag entre chacun des éléments de ma liste.
Ca, c’est moi qui m’en charge en les rajoutant moi même bordel.

Lorsque j’étais en Picardie la semaine dernière, en discutant avec Joris, nous en venons à parler de nos plateformes de développement personnelles.
Du coup forcément je lui explique l’architecture contraignante que je m’impose (développement local -> commit svn -> test sur serveur de préproduction -> push en production).

Et la il me dit « je n’ai jamais compris l’utilité de SVN ». Honte sur lui que je dis. Et je m’engage à lui expliquer cela.
Comme après on est arrivés au bar, je n’ai pas eu le temps de le faire. Mais c’est tous bénéfices pour vous puisque je le fais donc maintenant :)

Commençons par un peu d’histoire. Il y a trois générations de grands systèmes de gestion de version.

Il en existe d’autres évidemment. Mais je les épargne. Ce billet n’est pas là pour faire une liste de tous les systèmes de gestion de versions.

Alors comment ça fonctionne ? C’est au final assez simple.
Lorsque vous développez votre application seul et toujours sur la même machine, il est assez aisé de s’y retrouver. Vous avez toujours les dernières modifications de disponibles en local.

Le jour ou vous commencez à développer à deux ou à passer d’une machine à l’autre par contre, c’est plus embêtant.
Si vous êtes toujours seul, il vous suffirait d’une clé usb pour avoir toujours tous vos documents. Quand vous êtes à deux en revanche, cela n’est pas faisable.

Et c’est la qu’intervient le contrôle de versions.
Supposons trois fichiers : A, B, C

Vous modifiez le contenu du fichier A. Pendant ce temps un second développeur modifie le contenu du fichier B.
Ici on a que trois documents. Du coup il n’est pas difficile de s’y retrouver et de merger les modifications. Mais sur des gros projets ?

En faisant un commit sur votre contrôleur de versions, vous ne mettrez donc que le fichier A à jour. Le second développeur ne perdra pas ses modifications.
Et lorsqu’il mettra à jour sa version locale avec la version distante, il récupèrera le contenu du fichier A tel que vous l’avez modifié.

Poussons maintenant le vice plus loin :)
Le document A est particulièrement long et vous modifiez le début de celui-ci, les lignes 50 et 75 par exemple.
Le second développeur modifie les lignes 60 et 160.

Eh bien vos modifications pourront toujours être prises en compte par le contrôleur de versions, qui verra les lignes que vous avez ajouté dans le document et celles que vous avez modifié et sera capable de ne modifier que cela :)

On ira pas plus loin que cela. Il ne faut pas bousser le bouchon trop loin et il n’est pas capable de merger des modifications sur la même ligne.
En revanche, vous pouvez lui demander un café et voir ce qu’il répondra.

Ensuite, ous constaterez rapidement, en faisant quelques commits sur le contrôleur de version que vous pouvez placer un commentaire sur chacune d’elle.
Ainsi vous avez un historique de toutes les modifications apportées à chacun des fichiers de votre projet (et par qui).

C’est notamment fortement pratique dans un projet libre.  Vous pouvez par exemple suivre toutes les modifications apportées à votre projet préféré.
Voici un exemple. Il s’agit du dernier commit fait sur Ruby on Rails, durant la nuit (heure française).

Pour finir, quel contrôleur de version choisir ?
J’en utilise pour ma part, deux. SVN, sur ma machine de développement pour tous mes projets privés.
Et GIT sur github.com pour mes projets publics.

Entre les deux, je préfère git. Principalement car celui-ci implémente le contrôle de version complet en local. Vous pouvez donc faire votre commit en local puis le « pusher » et il sera en ligne. Ainsi, lors d’un voyage en train, je développe en découpant en commits lisibles et fait un push en arrivant. C’est comme si j’avais eu un accès internet durant mon voyage :)
Alors que les commits SVN font directement la mise à jour sur le serveur. C’est un peu moins propre.

Mais je fais face à quelques problèmes pour installer un serveur git sur ma machine. Pour l’instant, je dois donc encore me contenter d’un svn. Mais cela ne saurait tarder à changer.

Comme déjà dit dans le billet précédent, j’ai donné, aujourd’hui, une journée de cours dans mon ancienne licence sur Ruby et Rails.

Impressions (presque) à chaud :

  • La prochaine fois, faudra que je sois calé à mort sur l’installation de Aptana & RadRails sous Windows et Linux (surtout Windows. Quelle merde ce truc). Ca évitera de perdre du temps.
    Ou alors choisir un autre IDE
  • Prévoir de permettre l’installation de l’IDE & de Rails même sans connexion internet. Car évidemment c’est juste le jour ou je viens que le proxy de l’établissement choisit pour lacher et être indispo toute la matinée.
  • Complètement supprimer la partie slides et cours « magistral ». J’aime pas et c’est pas intéressant.
  • Amener une bouteille de coca (ou au pire d’eau) pour pouvoir tenir toute la journée.

Et je crois que c’est tout. Ah non. Je rempile l’an prochain (sauf empêchement divers) pour non plus 8h de cours mais 36h (une semaine).

Et pour finir, vous pouvez voir mes slides.
Et l’application que j’ai développé avec eux.

Edit : contrairement à ce que ce billet laisse penser, le bilan est tout de même fortement positif hein. Et j’ai hâte d’être à l’an prochain pour remettre ça :)

A l’heure de la publication de cet article, je débute mon cours Ruby et Rails dans mon ancienne licence, à Saint-Quentin (Picardie).
Alors pour ne pas vous rendre jaloux, je vous propose un article qui traite d’un sujet dont je ne parlerai pas dans ce cours (sauf si la question est posée) car c’est relatif à Rails 2.3.

Comme je le disais déjà lundi, Rails 2.3 supporte une nouvelle méthode, permettant de gérer une identification HTTP. Vous savez, lorsque votre navigateur vous affiche une popup vous demandant login et mot de passe. Cela peut notamment être assez pratique afin de ne pas s’embêter à intégrer d’interface d’identification autre que celle-ci.

Mais comment ça fonctionne ?
Une nouvelle méthode est à notre disposition : authenticate_or_request_with_http_digest.

Celle-ci prends un argument, le « realm » (message affiché dans la fenêtre de connexion. Et transmet, en yield, le nom d’utilisateur ayant été transmis.
Il vous suffit alors de récupérer le mot de passe de cet utilisateur et de le renvoyer pour que, si les deux correspondent, l’identification soit acceptée. Dans le cas contraire, on vous jette.

Exemple :
users = {"damien" => "monpass"}
authenticate_or_request_with_http_digest("Identification requise") do |name|
users[name] || false
end

Nous appellons la méthode avec le message de connexion. Celle-ci nous renvoie le pseudonyme et nous n’avons plus qu’à renvoyer le mot de passe approprié à celui-ci pour que la méthode fasse la comparaison et qu’elle nous renvoie true si c’est ok. Ou bien qu’elle refuse l’identification si cela ne l’est pas :)

Après si vous ne comprenez pas comment fonctionne le « do » et la pseudo-boucle, il fallait venir à mon cours parce que yield par contre, j’en parle ;)
Quant à mes slides, je les publierai peut-être plus tard.

Je n’ai pas pour habitude de faire ce genre de billets. Mais la, je trouve cette vidéo tout simplement énorme.
Et puis elle fait pas (encore) de buzz. Alors pourquoi se priver :)

Merci à TOMHTML de l’avoir partagée sur Google Reader :)

 
Fork me on GitHub