AlpineLab blog technique

Utiliser RedCarpet et Rouge avec Middleman pour poster du code

Pour pouvoir poster du code beau et lisible sur un blog Middleman, on va utiliser RedCarpet pour transformer notre Markdown en HTML puis Rouge pour découper ce HTML en tokens en fonction du langage utilisé. On saupoudrera le tout d'un peu de CSS pour obtenir une vrai belle coloration syntaxique.

RedCarpet

C'est assez simple, en fait : il faut générer son HTML à partir de fichiers Markdown en utilisant RedCarpet.

On l'ajoute donc simplement au fichier Gemfile :

gem 'redcarpet'

Puis on va dire à Middleman de l'utiliser (avec quelques options pour reconnaitre automatiquement les blocs de code ou les liens HTTP, par exemple) :

set :markdown_engine, :redcarpet
set :markdown, fenced_code_blocks: true, autolink: true, smartypants: true, gh_blockcode: true, lax_spacing: true

C'est tout, RedCarpet va maintenant transformer tous les blocs de codes (entourés de simples ou triple backquotes) en balises <code> (elles-mêmes imbriquées dans des balises <pre> si la version triple-backquotes est utilisée).

Le code Markdown que j'utilise ressemble à ça (qui parlera aux habitués du Markdown de GitHub) :

On l'ajoute donc simplement au fichier `Gemfile` :
```ruby
gem 'redcarpet'
```

Et il est compilé par RedCarpet en ce code HTML :

<p>On l'ajoute donc simplement au fichier <code>Gemfile</code> :</p>
<pre>
  <code class="ruby">
    gem 'redcarpet'
  </code>
</pre>

Avec un peu de CSS (c'est du Sass, en fait), histoire que ça ait un peu de gueule : fond gris, bordure grise, angles arrondis et du padding plus ou moins grand selon qu'on est dans un bloc inline (simple backquote) ou pleine-ligne (triple backquote).

code
  margin: 0 0.1em
  padding: 0.1em 0.2em
  border: 1px solid #d5d6d7
  background-color: #fcfcfc
  border-radius: 0.2em

pre
  margin: 0 0.2em
  padding: 0.5em 1em
  border: 1px solid #d5d6d7
  background-color: #fcfcfc
  border-radius: 0.4em

  code
    margin: 0
    padding: 0
    border: none
    background: none

On doit donc obtenir un truc comme ça :

RedCarpet avec Middleman

Coloration syntaxique avec Rouge

Rouge est un analyseur lexical qui permet de découper le code (précédemment détecté par RedCarpet) en tout un tas de balises <span> qui peuvent ensuite être stylées (donc colorées). Rouge est compatible avec Pygments (un analyseur lexical en Python très populaire, notamment utilisé par GitHub, entre autres), ce qui signifie que les styles CSS disponibles pour Pygments (comme tous ceux de IgniteFlow, par exemple) vont fonctionner.

Passons aux choses sérieuse : comment on fait ? En premier lieu, il faut installer la gem qui va bien (développée par Linus Pettersson, merci à lui) :

gem 'middleman-rouge'

Ensuite on pense à l'installer :

$ bundle install

Il suffit ensuite de dire à Middleman de l'utiliser, en ajoutant au fichier config.rb :

activate :rouge_syntax

À ce point là, votre code est découpé en plein de petits <span>, ce qui donne, pour le même bout de Markdown que celui utilisé plus haut :

<p>On l'ajoute donc simplement au fichier <code>Gemfile</code> :</p>
<pre class="highlight ruby">
  <span class="n">gem</span>
  <span class="s1">'redcarpet'</span>
</pre>

Vous remarquez que Rouge supprime la balise <code> que RedCarpet avait générée. Je n'ai aucune idée de pourquoi il fait ça, mais c'est utile de le savoir quand on veut appliquer des CSS dessus.

En parlant de CSS, maintenant que notre structure HTML est créée, il reste à lui appliquer des couleurs à l'aide d'une feuille de styles. Comme je suis un peu fainéant, j'ai choisi un thème tout fait, Monokai, parce que c'est celui que j'utilise dans mon éditeur de code, Sublime Text 2.

Bref, j'ai donc récupéré le code CSS du thème de Monokai du projet pygments-css, que j'ai mis dans un fichier source/css/syntax-monokai.css. Pour que ça fonctionne, il faut quand même le modifier un poil : il faut remplacer tous les .codehilite par des .highlite et supprimer le .hll de la première ligne. Ce qui donne ça (je ne vous met que les premières lignes, après c'est pareil) :

/* Monokai theme from https://github.com/richleland/pygments-css */
.highlight      { background-color: #49483e; color: white; }
.highlight .c   { color: #75715e } /* Comment */
.highlight .err { color: #960050; background-color: #1e0010 } /* Error */
.highlight .k   { color: #66d9ef } /* Keyword */
.highlight .l   { color: #ae81ff } /* Literal */
.highlight .n   { color: #f8f8f2 } /* Name */
.highlight .o   { color: #f92672 } /* Operator */
.highlight .p   { color: #f8f8f2 } /* Punctuation */
...

Comme vous l'avez peut-être remarqué, j'ai ajouté un color: white; à la première règle. Pure question de goût. Il faut juste savoir que pour le texte non-coloré par Rouge, c'est la couleur du texte de la page web qui est utilisé. Pour moi, c'était gris. Sur le fond gris, ça n'allait pas terrible. C'est pourquoi je le force en blanc.

Pensez quand même à importer ce nouveau fichier, en ajoutant la ligne suivante à votre fichier source/css/default.css.sass :

@import 'syntax-monokai'

Voilà, en relançant éventuellement votre serveur Middleman et en rechargeant votre page de navigateur, vous devez obtenir à peu près ça :

RedCarpet et Rouge avec Middleman

Sources

Activer le SSL sur Heroku

Le but de cet article est de montrer comment héberger un site HTTPS sur Heroku.

Il suffit de 3 étapes : générer son certificat, installer l'addon Heroku qui va bien, configurer ses DNS.

Générer son certificat

Pour le certificat, on a fait le choix d'en acheter un avec validation étendue (EV, pour Extended Validation) chez Thawte.

Il faut tout d'abord créer une clé privée avec password (dans un répertoire qui n'est pas public : cette clef est hautement confidentielle) :

$ openssl genrsa -des3 -out server.orig.key 2048

Cette commande demandera quelques renseignements relatives à l'émetteur de la clef (vous !). Attention, pour l'EV toutes les infos doivent être exactes.

Il faut ensuite virer le password de cette clef (sinon Heroku ne pourra pas l'utiliser puisque le password sera demandé à chaque démarrage du serveur) :

$ openssl rsa -in server.orig.key -out server.key

Ensuite on va créer le CSR correspondant (Certificate Signing Request, qui permet de demander à Thawte de nous générer un certificat) :

$ openssl req -new -key server.key -out server.csr

Il suffit ensuite d’envoyer le CSR à Thawte (en précisant “Autre” comme plate-forme pour le serveur), puis d’attendre son certificat qu'on reçoit par mail (ça peut prendre plusieurs jours : pour l'EV, Thawte va vérifier qu'on est une société déposée et qu'on a un numéro de téléphone dans les Pages Jaunes ou Kompass ou 118712) qu'on colle alors dans un fichier thawte_SkiWallet.pem (dans le même répertoire que les clefs et certificats créés précédemment).

Installer le plugin Heroku SSL-Endpoint (et le configurer)

Pour ça rien, de plus simple, si vous êtes déja familier avec la Toolbelt Heroku. Éxecutez simplement à la racine de votre projet hébergé :

$ heroku addons:add ssl

Depuis le répertoire dans lequel vous avez mis toutes les clefs et autres certificats générés précédemment, vérifier que la chaîne de confiance des certificats d'autorité intermédiaires est complète (la commande doit vous afficher une succession de certificats SSL si tout s'est bien passé, sinon, un message d'erreur) :

$ heroku certs:chain thawte_SkiWallet.pem

Vérifier ensuite que la clef privée correspond au certificat Thawte (la commande vous affichera la clef SSL en cas de succès, un message d'erreur sinon) :

$ heroku certs:key thawte_SkiWallet.pem server.key

Ajouter finalement tout ce tintouin à votre appli Heroku (suffixez avec --app nom-de-votre-app-heroku si votre toolbelt est configurée pour gérer plusieurs applications Heroku) :

$ heroku certs:add *

Configurer son serveur DNS

OK, on a donc installé notre certificat (ouf !), il faut maintenant configurer son serveur DNS. On va commencer par récupérer l'adresse du endpoint SSL qui nous a été assigné par Heroku. Elle s'affiche dans la colonne “Endpoint” de la commande suivant) :

$ heroku certs

Chez moi, c'est toyama-1696.herokussl.com, dans ce qui suit, je vous laisse donc remplacer intelligemment par ce que vous aura répondu la commande ci-dessus.

On va juste faire une ou deux petites vérifications :

OK, on a donc l'URL du endpoint et ça semble fonctionner. Récupérons maintenant son adresse IP :

$ host toyama-1696.herokussl.com

L'adresse IP de mon endpoint, c'est “54.243.198.116”, je vous laisse remplacer par la votre dans les exemple ci-dessous.

Avant de configurer son serveur DNS, testez déjà en surchargeant ladite adresse IP pour pointer vers votre domaine (moi : www.skiwallet.com) sur votre machine (ça évite de casser votre config DNS existante). Ajoutez donc la ligne suivante à votre fichier /etc/hosts (il faut avoir les droits root donc utilisez su ou sudo, selon votre distrib) :

54.243.198.116  www.skiwallet.com

Testez en visitant https://www.skiwallet.com avec votre navigateur (éventuellement, videz le cache avant). Votre site doit s'afficher et la fameuse “barre verte” doit s'afficher :-)

Pensez à enlever la ligne de votre fichier hosts, ça serait bête de se galérer pour ça.

On va donc pouvoir faire la vraie config, sur le vrai serveur DNS : changez vos DNS pour faire pointer www.skiwallet.com vers toyama-1696.herokussl.com avec un CNAME et le tour est joué.

Bonus : Forcer Rails à utiliser HTTPS

Si votre site est fait en Rails (comme le mien), il est super simple de lui dire de rediriger toutes les requêtes vers HTTPS, afin de forcer les utilisateurs en HTTPS.

Il suffit donc de décommenter (ou ajouter) la ligne suivante dans le fichier config/environments/production.rb de votre projet :

config.force_ssl = true

Sources

Mise à jour de Ruby dans RVM

Pour mettre jour une version de Ruby avec RVM (par exemple passer de l 1.9.3-p374 à la 1.9.3-p392), c'est pas très compliqué.

  • Récupérer la liste des dernières versions stables de Ruby :
$ rvm get stable
  • Désinstaller l'ancienne version et installer la nouvelle :
$ rvm uninstall 1.9.3
$ rvm install 1.9.3
  • Ou si vous êtes des chauds, directement :
$ rvm reinstall 1.9.3

Et allez, comme la 2.0 vient de sortir, profitons-en, installons-la :

$ rvm install 2.0.0

C'est tout ! Merci RVM :-)

Alpine Lab