Le Blog du Geek Joyeux

Plus moins vite tu codes, moins plus vite ça plante

Erreur SSL et Ruby sur Mac

| Commentaires

Pour gérer les différentes versions de Ruby sur mon mac, j’utilise chruby. En ce qui concerne l’installation de Ruby, je me repose sur ruby-install.

Du coup je me suis retrouvé confronté à un petit souci bien connu des rubyists, la fameuse erreur SSL :

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

Cette erreur est, semble-t-il réglée dans rvm et rbenv. Toujours est-il que de mon côté ça n’est pas le cas.

Il existe un certain nombre de solutions proposées sur StackOverflow. Celle qui me satisfait le mieux est la suivante.

Utiliser New Relic avec Octopress sur Heroku

| Commentaires

J’ai passé il y a peu mon blog sous Octopress. Il est hebergé sur Heroku qui propose un add-on pour New Relic.

New Relic est très facile à mettre en place sur une application Rails. Avec Octopress, je me suis posé quelques questions du fait qu’il génère un site statique.

En réalité, sur Heroku, Octopress utilise une petite application Sinatra pour servir les fichiers. Il est donc tout à fait possible d’utiliser la gem newrelic_rpm avec un blog Octopress.

Mettre en place une seedbox automatisée

| Commentaires

Il y a un moment déjà que j’utilise un système d’automatisation pour le téléchargement des séries TV. Voici ce que j’ai mis en place.

TL;DR

Utilisez TvShows2 pour surveiller les séries, automatisez l’envoi des fichiers .torrent vers la seedbox et gérez vos téléchargements avec Transmission.

Attention: l’utilisation de TVShows2 est spécifique à Mac OS X. Ted semble une bonne alternative sous Linux mais je n’ai pas testé.

Utilisation avancée de Draper

| Commentaires

Dans l’article précédent, je présentais Draper.

Dans cet articles j’ajouterai quelques trucs et astuces pour utiliser Draper de façon un peu plus avancée.

TL;DR

Utilisez decorate_association :comments dans ArticleDecorator pour décorer automatiquement les commentaires d’un article.

Incluez Draper::ModelSupport dans vos modèles pour les décorer en utilisant la syntaxe article.decorate.

size doesn’t COUNT

| Commentaires

Requêtes N+1

Lorsque vous développez avec Rails, vous devez bien sûr faire attention aux requêtes qui sont effectuées et surtout éviter les requêtes N+1.

Les requêtes N+1 sont celles qui sont lancées pour chaque élément d’une liste.

Versionner ses scripts de seeding avec versioned_seeds

| Commentaires

Si vous vous retrouvez dans le besoin de faire des imports de données ou des insertions scriptées dans une application Rails, de nos jours vous n’avez pas vraiment d’autre choix que de créer des tâches rake (ou consorts) pour le faire.

Dans cette idée, j’ai écrit la gem versioned_seeds qui permet de stocker ces scripts dans un dossier spécifique et de les utiliser à la manière des migrations.

Utiliser rvm avec cron

| Commentaires

Il y a quelques temps, j’avais besoin de lancer un script ruby avec cron. Le souci, c’est que sur mon serveur, tout est à base de rvm. De fait, cron ne sait pas trouver ruby puisque rvm est chargé par mon fichier .bashrc.

La petite astuce pour que ça marche, c’est de dire à cron de charger mon environnement pour ce script spécifiquement :

1
0 * * * * /bin/bash -l -c 'ruby mon_script.rb'

En clair, l’option -l permet de charger l’environnement bash et l’option -c indique la commande à exécuter.

Rendre git-diff plus précis

| Commentaires

Git permet d’afficher différentes informations en couleur. Cela se fait dans le fichier de configuration, ~/.gitconfig.

1
2
[color]
  ui = true

Une des commandes concernées est git-diff. Cette coloration est bien pratique mais peut avoir ses limites. En effet, lorsque la différence sur une ligne se joue à quelques caractères seulement, il peut être difficile de détecter les modifications.

1
2
3
4
5
6
  Lorem ipsum dolor sit amet, consectetur adipisicing elit
  tempor incididunt ut labore et dolore magna aliqua. quis nostrud exercitation ullamco labaris nisi
+ quis nostrud exercitation ullamco laboris nisi
  consequat. Duis aute irure dolor in reprehenderit
  cillum dolore eu fugiat nulla pariatur. Excepteur
  non proident, sunt in culpa qui officia deserunt

Une petite astuce pour les voir plus précisément est l’utilisation de l’option --word-diff :

$ git diff --word-diff=color

Voici le résultat obtenu :

  Lorem ipsum dolor sit amet, consectetur adipisicing elit
  tempor incididunt ut labore et dolore magna aliqua.
  quis nostrud exercitation ullamco labaoris nisi
  consequat. Duis aute irure dolor in reprehenderit
  cillum dolore eu fugiat nulla pariatur. Excepteur
  non proident, sunt in culpa qui officia deserunt

L’option prend différentes valeurs qui peuvent être utiles selon les circonstances.

Gestion du PATH sous OS X

| Commentaires

Une fonctionnalité bien pratique de OS_X est la gestion du PATH. En effet un mécanisme permet de ne pas surcharger son .bashrc chaque fois que l’on doit rajouter une entrée dans le PATH.

Créer ses propres sélecteurs avec jQuery

| Commentaires

Il y a peu, au boulot, on s’est demandé si, avec jQuery, il était possible de sélectionner les éléments dont une classe correspond à modèle donné.

Par exemple, sélectionner tous ceux donc la classe commence par menu_item_.

La réponse est oui, avec jQuery, c’est possible. Voici comment.

Installation de markItUp avec preview dans une application Rails3

| Commentaires

Il est fréquent d’avoir besoin d’un éditeur dit WYSIWYG dans un site web. Il en existe de deux types. Les éditeurs pur WYSIWYG où vous éditez directement du HTML en mode rendu final et les éditeurs de syntaxe qui se basent par exemple sur le format Wiki, Textile ou Markdown.

markItUp est de la deuxième catégorie. Dans le cas d’un éditeur de syntaxe, il est toujours plus confortable de disposer d’une preview avant de valider ce qu’on a écrit.

Voici un petit tutoriel sur comment installer markItUp dans une appli Rails3 en utilisant Sinatra pour générer la preview.

La méthode inject en Ruby

| Commentaires

En Ruby, il existe une méthode bien pratique nommée inject.

Elle s’utilise de la manière suivante :

1
2
3
4
puts (0..10).inject(0) do |somme, x|
  somme += x
end
# => 55

Dans l’exemple précédent, on part d’une valeur de 0 que l’on modifie à chaque tour. Le code suivant est équivalent :

1
2
3
4
5
6
somme = 0
(0..10).each do |x|
  somme += x
end
puts somme
# => 55

De manière classique, on peut s’en servire pour générer un tableau ou une table de hash de la manière suivante :

1
2
3
4
@articles.inject({}) do |hash, article|
  hash[article.title] = article.body
  hash
end

EDIT: Dans ce cas précis, il est préférable d’utiliser la méthode each_with_object comme ceci :

1
2
3
@articles.each_with_object({}) do |article, hash|
  hash[article.title] = article.body
end

Une autre utilisation interessante, est avec les booléens :

1
2
3
@plugins.inject(true) do |keep_going, plugin|
  keep_going &= plugin.some_method
end

On obtient donc en fin de parcours, true si tous les appels ont retourné true ou false si au moins un appel a retourné false.

Dans le cas où on veut stoper l’appel à inject dés qu’un appel retourne false, on peut utiliser l’instruction break :

1
2
3
@plugins.inject(true) do |keep_going, plugin|
  keep_going &= plugin.some_method or break(keep_going)
end

Cela permet de ne pas faire les appels suivants dés le premier retour négatif.

Éviter la création des fichiers ._ (point underscore) sous Mac OS X

| Commentaires

Un comportement plutôt gênant sous OS X est la création des fichiers ._ (point underscore). C’est souvent un problème quand on veut créer une archive .tar.gz ou avec certains SCM.

Voici une solution pour empêcher leur création.

Dans votre .profile, ajoutez la ligne suivante :

$ export COPYFILE_DISABLE=true

Utiliser un shell non standard sous mac

| Commentaires

Chaque fois que j’installe un shell sous Mac OS X et que je le règle par défaut gràce à chsh, l’application Terminal refuse de se lancer et me dit :

Vous n’êtes pas autorisé à lancer cette application.
L’administrateur a donné à votre shell une valeur illégale.

Pour régler ce petit souci, il suffit d’ajouter le chemin vers votre shell dans le fichier /etc/shells :

1
2
3
4
5
6
7
8
9
10
11
12
13
# /etc/shells

# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/usr/local/bin/bash # bash installe avec homebrew
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

C’est une erreur que l’on ne rencontre pas lorsque l’on utilise un terminal comme iTerm 2

Utiliser la sortie d’une commande comme un fichier en shell

| Commentaires

Il arrive qu’on ait besoin d’utiliser la sortie d’une commande comme si c’était un fichier. Voici une petite astuce pour ne pas passer par un fichier temporaire.

$ diff <(ls /un/dossier/au/pif) <(ls /un/autre/dossier/au/pif)

Et voilà avec cette syntaxe on a la différence entre deux dossiers sans utiliser de fichiers temporaires.

Installer la gem mysql sous Snow Leopard

| Commentaires

Sous Snow Leopard, l’installation de la gem mysql n’est pas toujours simple. Voici ce que j’utilise, sachant que mon MySQL est installé via le DMG fourni sur le site officiel.

1
2
3
4
export ARCHFLAGS="-arch i386 -arch x86_64";
sudo gem install mysql -v2.7 --no-rdoc --no-ri --         \
   --with-mysql-dir=/usr/local/mysql                      \
   --with-mysql-config=/usr/local/mysql/bin/mysql_config