Catégorie : Ruby
RubyCamp à Lyon le 21 février prochain
Un BarCamp autour de Ruby aura lieu le 21 février à Lyon, probablement dans les locaux de l’INSA, organisé par l’association Ruby France (dont je suis membre depuis peu ;-)). J’espère pouvoir m’y rendre bien que je doivent encore confirmer mes disponibilité, je vous invite à faire de même si vous êtes disponibles, plus d’informations sur ce site ou sur la liste de diffusion francophone.
Un BarCamp c’est quoi ? (wikipédia)
Un BarCamp est une rencontre, une non-conférence ouverte qui prend la forme d’ateliers-événements participatifs où le contenu est fourni par les participants qui doivent tous, à un titre ou à un autre, apporter quelque chose au Barcamp. C’est le principe pas de spectateur, tous participants.
TServer 0.2.0
TServer est une librairie en Ruby permettant d’implémenter un serveur multi-thread, c’est une alternative à GServer de la librairie standard.
J’ai sorti la version 0.2.0 aujourd’hui, voici les nouveautés :
- Utilisation de la class ‘Logger’ pour le système de log (la sortie standard est utilisé par défaut, mais lors des tests un fichier de log est utilisé).
- Ajout de callbacks lors des événements.
- Ajout d’une tâche ’server’ au Rakefile afin de lancer le serveur d’exemple.
- Plurialisation du nom des méthodes ‘Tserver.listeners’ et ‘TServer.waiting_listeners’.
- Une méthode ‘reload’ a été ajouté afin de permettre de redémarrer le serveur sans coupure du service.
- ‘TServer.process’ ne prend plus d’argument et les méthodes suivantes sont maintenant disponibles : ‘TServer.connection’, ‘TServer.connection_addr’ et ‘TServer.terminate_listener?’.
- Un certain nombre de corrections ont étés faites et les tests améliorés.
Les sources et un gem sont disponibles depuis le trac du projet, j’espère pouvoir ajouter le gem à rubyforge bientôt.
Le serveur fonctionne bien, bien que je ne l’ai pas encore testé dans des conditions réels. Je pense que je devrais faire une class pour les Listener, ceci permettrais d’être plus facilement “thread safe” en plus d’un certain nombre davantage pour l’implémentation je pense. Par contre, j’ai de la peine à évaluer les incidences sur les performances. Ce changement serais important, je vais y réfléchir et décider si je prends cette option dans le but de sortir une version 1.0.
Naturellement tout commentaire est le bienvenu.
Créer un serveur TCP multithread en Ruby
Suite à une discussion avec un ami, qui voulait une estimation du coût de développement d’une petite application permettant de recevoir des données par une simple connections TCP ne demandant pas d’implémenter un protocole “complexe” dans le client, j’ai effectué quelques recherches sur l’implémentation d’un serveur TCP en Ruby.
Bien sur créer un serveur TCP acceptant des connections tient en 2 lignes :
Mais un serveur comme celui-ci est un peu limité (surtout quand il doit accepter 2000 connections toutes les deux minutes), la suite est logiquement de trouver une solution multithread permettant de recevoir plusieurs connections simultanément. On trouve GServer dans la libraire standard de Ruby qui permet d’implémenter ceci très facilement (exemple tiré de la documentation) :
Si cette solution fonctionne mais j’ai tout de même rencontré quelques problèmes, pour commencer la méthode “shutdown” ne fonctionne pas correctement et ce serveur crée un nouveau Thread à chaque connexion et le détruit une fois les traitements de celle-ci terminé. Et vu que j’étais intéressé par faire quelques expériences avec les Thread de Ruby j’ai décidé de créer mon propre serveur multithread avec les spécifications suivantes :
- Thread persistants en attente de connexions.
- Gracefull shutdown.
Ce petit teste à finalement donnée naissance à une librairie complète, la classe TServer permet maintenant de créer un serveur multithread pouvant être arrêté en douceur et dont les listener (Thread traitant les connections) sont persistants. Lors de l’initialisation il est possible de configuré le nombre maximum de connections que le serveur peut traiter en même temps et le nombre de listener qui doivent toujours être à l’écoute (il est possible de configurer cette variable à 0 pour avoir un comportement identique à GServer).
L’utilisation des Thread est intéressant, mais demande de faire attention à ce qu’on fait (le contenu des variables n’est pas toujours celui auquel on s’attend) et à bien utiliser les outils de synchronisation à notre disposition (Monitor, Mutex, ConditionVariable, Queue). Faire des testes unitaires n’est pas évident puisqu’il est difficile de tester un serveur dont on ne connait pas l’état actuel. J’ai pu m’en sortir en contrôlant l’évolution du serveur avant de faire certains testes et en utilisant la classe Timeout pour m’assurer que son état change dans un temps raisonnable. Je ne suis pas complètement satisfait du résultat et j’ai probablement encore des choses à découvrir pour le faire correctement (pour l’instant je n’arrive pas a faire passer les testes sous Windows, apparemment ils attendent sur quelque chose lors d’un test et je doit tuer le process).
Mon prochain objectif est de remplacer le système de log (utilisation de la librairie logger et utilisations de diverses méthodes afin de permettre la collecte de stats plus complète comme dans GServer), mais également de permettre un reload du serveur sans interruption du service. En attendant, voici un exemple d’implémentation de TServer (tiré de la documentation) dont j’ai mis les sources et un gem à disposition ici :
Jobalize.com, les acteurs du web 2.0
Je vous invite à découvrir Jobalize qui vient d’ouvrir ces portes, ce service a pour but de répertorier les acteurs du web dans le monde (site en français et anglais). L’accent a été mis sur la proximité, en effet pour trouver une personne avec les compétences dont vous avez besoin, vous allez simplement zoomer sur une carte (ou en recherchant directement une adresse : Lausanne, Paris, …). Chaque personne, en plus de son adresse, est caractérisé par des mots clefs (tag) qui vous permettent de limiter votre recherche (ajax, ruby, rails, …). La fiche de chaque personne comporte les informations qui précèdent ainsi que sa fonction, le nom de sa société ou s’il est freelance ainsi qu’une adresse web, une photo et un commentaire. Il est possible de le contacter via un formulaire, mais son email n’est pas directement disponible.
Alors, si votre place est dans cet annuaire, inscrivez-vous dès aujourd’hui, c’est gratuit et les initiateurs sont des personnes qui feront de ce service quelque chose de bien, j’en suis certain.
Préparation de Paris on Rails 2007
Richard Piacentinia débuté l’organisation de l’édition 2007 de Paris on Rails qui est, comme son nom l’indique, une conférence sur Ruby on Rails.
Je n’avais pas peu me rendre à la première édition en novembre dernier mais j’ai eu l’occasion de rencontrer Richard quelques semaines avant lors d’un séminaire sur le web 2.0 et je me réjoui de pouvoir être présent cette année. On se dirige vers une organisation sur 2 jours et chose importante à un prix toujours abordable (en particulier pour les privés), si vous voulez suivre l’évolution de l’organisation ou avez des suggestions, n’hésitez pas à vous rendre sur le forum dédié.
Mais pas d’inquiétude je vous en reparle bientôt.
En passant j’en profite pour rappeler la prochaine réunion de romandie.rb qui se tiendra ce jeudi et qui aura pour thème une introduction à RoR (non ce n’est pas moi qui m’y colle).
Site officiel de Ruby en français
Le site officiel de Ruby, ruby-lang.org, est maintenant disponible en français. Je trouve que c’est une bonne nouvelle pour sa visibilité puisque même si la documentation n’est pas encore disponible dans notre langue, la présentation de la philosophie du langage et du message pour “vendre” celui-ci est un point positif.
Ruby User Group pour la Suisse Romande
C’est en novembre dernier que la création d’un RUG (Ruby User Group) pour la Suisse Romande a été lancé à l’initiative de Guillaume Cottenceau et c’est hier soir, mardi 13 janvier, que la première réunion a eu lieu dans les locaux de MNC à Lausanne. Nous étions 14 pour à cette occasion et j’ai pu ouvrir les feux avec une présentation de Ruby avant un souper auquel je n’ai malheureusement pas pu participer.
Je reviendrai sur ma présentation plus loin mais pour commencer je peux dire que je suis content d’avoir participé à cette soirée qui a réuni déjà un grand nombre de personne ; l’ambiance était bonne et nous avons pu prendre un premier contact intéressant (je regrette d’ailleurs de ne pas avoir eu l’occasion de prolonger mes discussions lors du souper). Je renouvellerai cette expérience avec plaisir.
Pour en revenir à ma présentation, je devais faire un tour d’horizon de Ruby afin d’en montrer les particularités. J’avais prévus quelques slides d’introduction puis l’utilisation de la console interactive pour parler du langage lui-même. Cette approche était intéressante mais pose quelques problèmes ; je n’ai pas pu tenir le timing car je suis souvent allez beaucoup trop loin dans le détail et je n’ai donc pas fait la présentation jusqu’au bout, ce dernier constat est bien dommage car la partie manquante montrait des choses importantes et spécifiques à Ruby. De plus le temps passé à taper du code n’est tout de même pas négligeable. Il faudra donc que je révise ma copie pour une prochaine fois et réserver la console pour répondre aux questions. Enfin, cet exercice est nouveau pour moi mais j’espère pouvoir le renouveler car même si je ne suis pas tout à fait satisfait du résultat j’ai apprécié pouvoir le faire et la prochaine sera assurément meilleur. A se sujet, je vais essayer de trouver le temps pour retravailler cette présentation afin d’être mieux préparé et avoir un modèle si je doit en faire une autre (Ruby On Rails, Globalize, … ?).
Si vous habitez en Suisse Romande ou en France voisine et que Ruby vous intéresse je vous invite à nous rejoindre sur la liste de diffusion.
Rails 1.2, quoi de neuf ?
Avec l’arrivée de cette nouvelle version de Ruby on Rails nous avons droit à notre lot de nouveautés, je ne vais pas reproduire le changelog ici mais voici les innovations majeurs de cette mouture, pour le détail, direction le site de développement.
ActiveRecord
- Ajout de la possibilité de passer un Hash en paramètre à la méthode find pour l’option conditions. Chaque clef du Hash correspond à un attribut et ils sont joint par des AND.
- Ajout de la méthode find_or_initialize_by_X qui complète find_or_create_by_X en retournant un nouvelle objet si la recherche ne donne pas de résultat mais sans le sauver.
- Passé un record ou une liste de record à une conditions extrait directement les id.
- Autorise niq => true avec une association has_many :through.
- Il est maintenant possible d’ajouter un record à une association has_many :through avec les méthodes <<, push et concat en créant le record de jointure.
- Ajout du support de delete à l’association has_many :through.
- L’association has_one support le paramètre dependent avec les options destroy, delete, et nullify.
- Il est possible d’obtenir un lock exclusif sur un enregistrement en utilisant le paramètre lock des méthodes de recherche ou avec la méthode lock! d’un record.
ActionPack
- Il est maintenant possible d’accéder aux attributs avec RJS.
- Les formulaires fonctionnement comme des blocks (et non plus avec end_form_tag).
- Ajout des mois et années à la méthode distance_of_time_in_words.
- En cas d’erreur le fichier 500.html est rendu par défaut.
- Il est possible d’exclure certaine extensions du rendu avec layout.
- RESTful tient compte automatiquement de la valeur de params[:format] si il est spécifié.
- Il est possible d’enregistrer de nouveaux MIME types pour une extension.
- Ajout du filtrage de certains paramètres et attributs dans les logs avec filter_parameter_logging (password par exemple, ).
- Le système de routage a été réécrit.
- Dépréciation de certains méthodes, il faut maintenant utiliser les méthodes et non pas les variable de classe tel que @session ou @request.
ActiveSupport
- Il est possible de faire en sorte qu’une constante soit réinitialisé après chaque requête avec Module#unloadable.
- Avec Module#alias_attribute il est possible de créer des alias pour les attributs.
- Enumerable#sum calcule une somme depuis un Array.
- Array#to_s(:db) produit une liste séparé par des virgules.
- Il est maintenant possible d’utiliser Module#alias_method_chain au lieu de deux fois Module#alias_method.
- Division dûn Array avec split.
- Création d’un Hash avec from_xml.
Globalize Rails Core team
Nous utilisons Ruby On Rails depuis maintenant quelques temps le cadre de mon entrepise pour de développement de Pulp. Nous avons très vite eu besoin de contenu multilingue et avons donc choisi d’utiliser l’extension Globalize que nos besoins nous on poussé à quelques peut modifier et améliorer. Changements que nous avons naturellement publiés.
Il y a quelques semaines un utilisateur nous a contacté (mon associé olivier et moi-même) afin de nous demander si nous serions intéraissé par rejoindre l’équipe de developpement de Globalize, il n’en fait lui-même pas parti et n’estime pas avoir les connaissances qu’il faut pour le faire, mais puisque Josh (créateur de l’extension) à demandé de l’aide il s’est permi de nous contacter.
Et il à bien fait. Nous n’y avions pas vraiment penssé, mais maintenant que quelqu’un nous en parlais il nous a semblé intéraissant d’intégrer nos modifications et d’aider à sa mise à niveau d’une extension qui était primordiale pour nous. La dernière version de rails à en effet apporté beaucoup de nouveautés avec lesquels le multi-linguisme ne fonctionne pas. Nous avons donc contacté Josh et l’affaire s’est très vite conclue. Aujourd’hui nous avons mis en place un nouvelle hébergement (par nos soins) pour les sources et un Trac (http://trac.globalize-rails.org), un nouveau wiki hébergé chez stikipad est en phase de remplissage et devrait remplacer l’ancien d’ici quelques jours. Nous également avons mis en place des tests continues et enfin fait passer les tests au complet.
L’équipe de développement de Globalize se compose aujourd’hui de quarte personne : Josh Harvey, Jeremy Voorhis, Olivier Amblet et Yann Lugrin. Nous allons travailler à l’intégration des nouvelles fonctionnalités de Rails et de nos modifications ainsi que naturellement à la correction des problèmes existant.
Rails, version 1.1.2
Les versions 1.1.1 et 1.1.2 de Rails sont sorties rapidement afin de corriger quelques bug et améliorer la compatibilité des applications tournant sur 1.1.0.
La version 1.2.0 est lancé dans le trunk de subversion, une branche stable a été créé afin de pouvoir corriger d’éventuelle problèmes sur la version actuelle mais plus aucune nouvelle fonctionnalité ne sera ajouté.
