Le blog perso de Sam

Parce-que je le vaux bien

Vendredi

11/04/2008

Ruby et opérateurs : qui a la priorité ?

Il y a un petit piège dans Ruby avec les opérateurs booléens utilisés conjointement avec une affectation. Le côté très intuitif du langage fini pas nous faire oublier quelques règles simples…

Dans une expression booléenne nil est considéré de la même manière que false. Ce qui amène quelquefois à utiliser une syntaxe du type :

machin or truc

Au lieu de (parmis d’autres solutions) :

if machin.nil?
# utiliser truc
else
# utiliser machin
end

Mais… il y a un piège. L’expression suivante ne se comporte absolument pas comme on pourrait le supposer :

toto = machin or truc # ca sent le bug ici

En fait l’opérateur d’affectation = a une priorité suppérieure à celle de l’opérateur or. Pour s’en convaincre il suffit de faire le test suivant avec l’interpréteur irb :

irb(main):001:0> toto = false or true
=> true
irb(main):002:0> toto
=> false

L’expression saisie est évaluée de la manière suivante : (toto = false) or true. Donc l’expression vaut bien true, mais la variable toto se voit affecté la valeur false.

Il y a deux solutions : soit utiliser des parenthèses, soit utiliser l’opérateur || qui a une priorité supérieure à celle de l’affectation :

# deux solutions correctes
toto = (machin or truc)
toto = machin || truc

Ca a l’air tout bête, une boulette de débutant allez-vous me dire… mais lorsque l’on ne connait pas correctement la priorité des opérateurs, ou que l’on est pas concentré, on fini par avoir quelques bugs par forcément évident à identifier.

Lundi

29/10/2007

Windows… dehors !

Cela faisait longtemps que ça me démangeait. J’avais envie de le faire, je m’y préparais, mais finalement ne sautait pas le pas. De quoi je parle ? Devenir prêtre ? Changer de sexe ? Nooon !!! Faire prendre la porte à la fenêtre : virer Windows ! Et mettre un manchot aux commandes du hardware.

Maintenant c’est fait. J’avais acquis un portable au printemps dernier, avec l’intention d’installer Ubuntu dessus. Mais difficile de trouver un PC qui convienne, portable, sans OS, au bon tarif… J’avais finalement du me résigner à acheter un PC avec Vista. C’est joli, mais qu’est ce que c’est lent. Un Dual Core T7300 , 2Go de RAM et on a … une brouette. OK le disque est lent comme sur la plupart des portables, mais globalement c’est comme avoir une grosse voiture qui peine à la première montée. Donc j’ai découvert Vista, j’ai râlé, pesté (et pas qu’après la vitesse…) et puis trop… c’est trop !

Logo Ubuntu

J’attendais Ubuntu 7.10 afin de garantir une bonne reconnaissance de mon matériel. A peine disponible, il est venu coller un grand coup de pied dans le c.. de Windows pour prendre sa place. Et les choses se sont même mieux passé que prévu ! Il faut dire que je connais Ubuntu l’utilisant en mode “texte” comme serveur dans mon activité professionnelle. Par ailleurs j’avais déjà testé la bête souvent sous VMWare. Le changement se faisait en connaissance de cause.

Mais dans le fond ce qui facilite le plus la migration, mis à part une connaissance préalable du système, c’est l’utilisation des logiciels libres. Cela fait bien longtemps qu’OpenOffice est mon outil de travail bureautique, Firefox mon navigateur, Thunderbird mon client de messagerie, GIMP mon logiciel de retouches, Grisbi fait très bien son travail pour compter les brouzoufs, …

Donc changer de système n’a absolument pas été synonyme de changement radical, puisque j’ai retrouvé une grande partie de mon univers familier. Il a fallu s’adapter un peu à Gnome pour pouvoir personnaliser son environnement et le rendre pratique (en 1280×800 on économise la place en hauteur !), mais cela a plus relevé du plaisir de la découverte que de la corvée.

Et puis que j’aime la console ! C’est vraiment un truc insupportable sous Windows (faites vraiment un effort là dessus les gars), mais là quel bonheur ! Oui je sais, je suis peut-être un peu malade, mais quand on peut installer un (ou plusieurs) logiciel(s) en tapant une seule commande, c’est productif. Et puis j’aime ça, c’est tout ;-)

Cela fait plus d’une semaine, et mon manchot et moi sommes toujours copain :-)

Si je devais donner trois conseil :

  • passer progressivement aux logiciels libres, déjà sous windows
  • préparer sérieusement l’installation : tester avec le livecd, prendre le temps de comprendre, lire et poser des questions sur ubuntu-fr.org
  • faire une sauvegarde sérieuse avant de tout réinstaller !
Vendredi

18/05/2007

Gestion de projet : redMine

Cela faisait quelques temps que je cherchais une solution de gestion de projet. Quelque chose de simple à mettre en oeuvre et à utiliser, qui soit capable de gérer des tickets, contienne de quoi faire un petite doc interne, avec une gestion de droits, et si possible pouvant s’interfacer avec Subversion. Et je ne trouvais pas…

Il y a bien entendu Trac, mais ça ne s’installe pas en deux coups de cuillères à pot, et je n’avais pas envie de m’investir dans Python, investissant beaucoup d’énergie dans Ruby et Rails. C’est d’ailleurs dans cet univers que je cherchais mon bonheur… et que je l’ai (finalement) trouvé : redMine.

Il est possible de faire un test en ligne du logiciel pour se faire une première idée. Une installation locale pour faire un tour plus complet du logiciel est simple et rapide (pour qui a déjà Ruby on Rails d’installé). Le logiciel s’avère être assez complet et très paramétrable sans pour autant être une usine à gaz. Bien au contraire, il se prend en main facilement tant pour l’administration des projets (il est multi-projets) que pour l’utilisation au quotidien. Pour ne rien gâcher, l’apparence est soignée.

Mercredi

28/03/2007

Installer de multiples versions de Ruby

Comment installer plusieurs versions de Ruby sur un même système ? On se lève quelquefois le matin avec des questions existentielles auquel il est impératif de répondre, ce sera celle du jour. Evidemment, on installe pas plusieurs versions de Ruby tout les jours. Toutefois sur un serveur devant héberger plusieurs sites, avec des versions différentes de Rails, il peut-être utile de mettre à jour chaque site l’un après l’autre pour minimiser les surprises en cas d’incompatibilité. Concrètement installer plusieurs versions de Ruby n’a rien de bien méchant, mais encore faut-il que chaque installation ai ses propres gems, que les chemins soient bons, etc…

Le processus d’installation est un remake de ce post qui contient les informations de bases pour compiler Ruby sur Ubuntu. Mais Ubuntu n’est pas indispensable, ce qui est décrit ici peut se transposer sur une autre distribution ;)

Read the rest of this entry »

Jeudi

18/01/2007

Blog et pubs : bof bof…

Dès ma première tentative de création de blog, je me suis dit qu’il ne fallait pas y coller des pubs. Cela ne risquait pas de me faire gagner grand chose, et sur le principe j’étais contre. Un blog personnel est un espace de liberté personnel. C’est à soi. Ce n’est pas un panneau publicitaire.

Mais… car il y a un mais, j’ai tenté le coup. Je suis inscrit au programme Google Adsense dans le cadre d’un site animalier, et ça rapporte. Pas une fortune, mais les chèques arrivent, et le jour où je devrais payer pour un hébergement de qualité les frais seront couverts. Or avec quelques articles techniques la fréquentation du blog a bien augmenté, et j’ai voulu tenter l’expérience. Il y a bien eu des clics rémunérateurs, mais en moyenne moins de un par jour (beaucoup moins). Les gains ne furent pas proportionnels à ceux générés par mon autre site.

L’opération est-elle un échec ? Pas tant que ça. J’aurais pu prolonger et me dire que quelques clics sont toujours bons à prendre en complément de mon autre site. Mais non, j’ai obtenu ce que je voulais. J’ai fait une expérience, j’ai eu un résultat, et il est plutôt conforme à ce à quoi je m’attendais.

Au final je suis plutôt content. Je n’avais pas envie de voir ces pubs. L’absence de tout bénéfice sérieux m’évite un cas de conscience.

Mercredi

27/12/2006

wp-phpmyvisites en italien

J’ai eu dans ma boîte aux lettres un petit cadeau de Noël bien original. Un utilisateur du plugin wp-phpmyvisites qui permet de facilement coupler son blog WordPress avec l’outils de statistiques phpMyVisites l’a traduit en italien. J’ai intégré cette langue dans le packaging de la version 1.0 .

Merci à Alberto

Samedi

16/12/2006

Mise en production de Rails sous Ubuntu 6.06

Ce document a pour objectif de préparer une mise en production d’un ou plusieurs sites développé(s) avec Ruby On Rails sous Ubuntu 6.06. Pour configurer un environnement de développement, se référer au document Installer Ruby et RoR sur Ubuntu 6.06 (Dapper) .

Le choix technique est ici d’utiliser Mongrel pour faire fonctionner des instances de Rails, et d’utiliser Apache 2.2 pour réceptionner les requêtes et les distribuer aux différentes instances. Apache servira également le contenu statique. Tout ceci est très bien explique ici : Scaling Rails with Apache 2.2, mod_proxy_balancer and Mongrel.

Certains choix ne sont en rien obligatoires : il n’y a pas une seule et unique manière de procéder. Par ailleurs l’installation décrite est une base pour une mise en production, mais n’est pas en soit totalement sécurisée. Il faut encore penser firewall, sauvegardes, rotation de logs, …

Ce qui suit est long (mais détaillé), inspirez profondément avant de continuer ;)

Read the rest of this entry »

Mercredi

22/11/2006

Mongrel et les droits des fichiers

Je souhaite mettre en place un hébergement d’applications basés sur Ruby On Rails en utilisant Mongrel. L’objectif n’est pas de faire un hébergement mutualisé, mais de m’en imposer certaines contraintes afin de séparer ce que fait l’administrateur et le développeur.

Or par défaut Mongrel Cluster utilise un fichier de paramètres présent dans le répertoire config de l’application. De même que le fichier pid (permettant d’arrêter les processus) est présent dans le répertoire log. En cas de fausses manipulations du développeur c’est fâcheux. En cas de mauvaises intentions c’est pire (possibilité d’avoir les droits root en se débrouillant bien). Non pas que je soit suspicieux, mais j’aime bien cloisonner les choses lorsque cela les rends soit plus claires, soit plus sures.

Je propose ici la mise en place d’un script qui permette de gérer les clusters de Mongrel en utilisant des fichiers de configurations stockés totalement indépendamment de l’application d’une part (protégé contre toute modification), et d’autre part qui n’exécute jamais les script directement avec les droits de root afin de palier à toute manipulation frauduleuse des fichiers pid (il y aurait moyen de tuer n’importe quel processus).

Je pars ici du principe que Mongrel et Mongrel Cluster sont installés sur le système. Pour l’occasion le système sera un Ubuntu 6.06, mais rien n’interdit de le faire sur une autre distribution (ou un autre *nix) en adaptant un poil.

Avant tout chose, créons le répertoire qui contiendra tout les fichiers de configuration (seul root aura les droit d’y écrire !) :

sudo mkdir /etc/mongrel_cluster

Ensuite placez dans le répertoire /etc/mongrel_cluster les fichiers de configuration des applications en utilisant les options requises. Par exemple pour une application gérée par l’utilisateur test (avec toutes les options indispensables) :

sudo mongrel_rails cluster::configure -e production
-p 8000 -N 3 -c /home/test/mon_appli
--user test --group test
--config /etc/mongrel_cluster/test_mon_appli.yml

Entrons dans le vif du sujet : le script de démarrage (et d’arrêt). Consultez le script suivant et faites un copier/coller dans un nouveau fichier mongrel_all_cluster.rb dans /etc/init.d . Reste à permettre son utilisation au démarrage et à l’arrêt de la machine :

sudo chmod +x /etc/init.d/mongrel_all_cluster.rb
sudo /usr/sbin/update-rc.d mongrel_all_cluster.rb defaults

Et voilà, c’est fini, il ne reste plus qu’à tester.

Pour ajouter une application il suffit d’utiliser la commande de création d’un fichier de configuration comme illustré ci-dessus. Pour neutraliser une application il suffit de déplacer le fichier de configuration (ou l’effacer), ou plus simplement de le renommer temporairement car seuls les fichier finissant par .yml sont pris en compte.

Comme indiqué en introduction, ce n’est pas suffisant pour prétendre faire une hébergement mutualisé. Mais cela permet déjà de mettre le paramétrage à l’abri et d’éviter des élévations de privilèges ou des morts violentes de processus. Il y aurait encore pas mal de chose à faire pour sécuriser le système et les applications elles-même.

Ce script et ce post sont le fruits d’une étude de ma part, ce n’est pas en production. N’hésitez pas à vous en inspirez, et si vous avez mieux à proposer (ou des remarques à apporter), la porte est grande ouverte ;)

Samedi

11/11/2006

Compatibilité de wp-phpmyvisites

Je viens de mettre à jour ce blog vers WordPress 2.0.5 ainsi que l’outil de statistiques phpMyVisites vers la version 2.2, ce qui m’a permis de vérifier la compatibilité de mon plugin wp-phpmyvisites avec ces versions. Et bien… c’est ok ;)

Pour le téléchargement et les explications, se rendre sur cette page.

Vendredi

10/11/2006

Compiler Ruby et RubyGems sur Ubuntu 6.06

Bien qu’il soit possible d’installer Ruby sur Ubuntu 6.06 avec le gestionnaire de paquets, j’ai souhaité voir comment le faire en partant des sources. Si compiler Ruby en soit n’est pas un problème, il y a un petit piège au moment de compiler RubyGems. Mais comme je suis bon et généreux (qui a rigolé ?), je publie la procédure complète.

Read the rest of this entry »