SSL root certificates & curl

10 décembre 2011

Afin de mettre à jour la liste des certificats racine de curl, il suffit de :

  1. sauvegarder l'ancienne liste : mv $(curl-config --ca){,.old}
  2. télécharger la nouvelle liste : curl -o $(curl-config --ca) http://curl.haxx.se/ca/cacert.pem

Apache, Mercurial, hgweb.cgi unique pour plusieurs dépôts de version

20 février 2010

Afin de pouvoir héberger plusieurs dépôts de version sur mon serveur, j'ai tendance à dupliquer la configuration Apache suivante :

<Directory "/path/to/repository">
    AuthType Basic
    AuthName "repository login"
    AuthGroupFile /dev/null
    AuthUserFile /path/to/repository/.htpasswd
    <LimitExcept GET>
        require valid-user
    </LimitExcept>
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

ScriptAliasMatch ^/repository(.*) /path/to/repository/hgweb.cgi$1

Seulement, cette configuration oblige à copier le script CGI hgweb.cgi dans tous les dépôts, ce qui n'est évidemment pas très propre. Une solution plus acceptable serait de placer ce script dans le dossier CGI standard d'Apache (/usr/local/www/apache22/cgi-bin sous FreeBSD), et d'utiliser toujours le même.

J'ai donc regardé le contenu de ce script (ici sans les commentaires) :

#!/usr/bin/env python
from mercurial import demandimport; demandimport.enable()
from mercurial.hgweb.hgweb_mod import hgweb
import mercurial.hgweb.wsgicgi as wsgicgi
import os

repo_path = os.getcwd()
application = hgweb(repo_path, os.path.basename(repo_path))
wsgicgi.launch(application)

Très rapidement, on voit que les modules de mercurial sont importés, puis le script récupère le chemin du répertoire courant et lance l'application hgweb à partir de ce paramètre.

Dans l'état actuel des choses, si on place ce script dans le dossier cgi-bin d'Apache, repo_path contiendra toujours le chemin de ce dossier. L'idée du hack est donc de transmettre l'information du chemin du dépôt au script CGI.

La première solution qui vient à l'esprit est d'utiliser une variable d'environnement. Seulement, dans le cas où plusieurs dépôts doivent être gérés dans le même VirtualHost (ou pour le serveur global), une seule variable d'environnement est utilisable.

Mon idée est de le passer en paramètre du script CGI à l'aide de la ligne suivante :

ScriptAliasMatch ^/repository(.*) /path/to/repository/hgweb.cgi$1

En effet, le script peut récupérer la chaîne $1, située après le chemin du script. En ajoutant les séparateurs /_/ permettant d'isoler le chemin du dépôt, on obtient par exemple :

ScriptAliasMatch ^/repository(.*) /path/to/repository/hgweb.cgi/_/path/to/repository/_/$1

Il reste ensuite à modifier le script CGI de manière à ce qu'il récupère le chemin en question, le retire des variables d'environnement concernées (afin que l'application hgweb ne soit pas perturbée), et lance l'application comme avant :

#!/usr/bin/env python
from mercurial import demandimport; demandimport.enable()
from mercurial.hgweb.hgweb_mod import hgweb
import mercurial.hgweb.wsgicgi as wsgicgi
import os

repo_path = os.getcwd()

path_info = os.getenv('PATH_INFO', '')
if path_info.startswith('/_/'):
    repo_path, new_path_info = path_info[2:].split('/_', 1)
    os.environ['PATH_INFO'] = new_path_info
    os.environ['PATH_TRANSLATED'] = os.environ['DOCUMENT_ROOT'] + new_path_info

application = hgweb(repo_path, os.path.basename(repo_path))
wsgicgi.launch(application)

Quelques explications s'imposent. Comme avant, on récupère le chemin du répertoire où se situe le script CGI. Puis, on récupère la variable d'environnement PATH_INFO. Si elle commence par notre séparateur, alors on isole le chemin du dépôt des paramètres de hgweb. On met à jour les variables d'environnement PATH_INFO et PATH_TRANSLATED (même si je pense que seule la première est utilisée par hgweb). Enfin, on lance l'application en utilisant, soit le chemin où se situe le script CGI, soit le chemin passé en paramètre.

Une fois ce script installé, la configuration d'Apache est légèrement différente :

<Location "/repository">
    AuthType Basic
    AuthName "repository login"
    AuthGroupFile /dev/null
    AuthUserFile /path/to/repository/.htpasswd
    <LimitExcept GET>
        require valid-user
    </LimitExcept>
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Location>

ScriptAliasMatch ^/repository(.*) /usr/local/www/apache22/cgi-bin/hgweb.cgi/_/path/to/repository/_/$1

L'autorisation ne s'effectue plus sur le répertoire du dépôt /path/to/repository/, mais sur l'emplacement /repository.

Ce hack est certainement faisable d'une manière plus propre, mais comme je n'ai rien trouvé de mieux pour l'instant, je le propose. Si quelqu'un connaît une autre manière de faire, je lui serai gré de m'en faire part dans les commentaire parce qu'elle m'intéresse !

Bigos

24 novembre 2009

Ingrédients :

  • 1kg de choucroute crue ;
  • 1kg (ou plus) de chou blanc (en fait une «boule») ;
  • 250g de poitrine fumée de bonne qualité ;
  • 1kg de saucisson à l'ail fumé ou 2 saucisses de Morteau ;
  • 1kg de palette ou d'échine de porc rôti au four avec des oignons ;
  • quelques cèpes séchés trempés dans un bol d'eau la veille ;
  • une toute petite boîte de concentré de tomate (ou tomates séchées)
  • 1 feuille de laurier, poivre, sel : ± 2 cuillères à café, baies de genièvre ;
  • 1 verre de vin blanc.

Préparation :

  1. dans une grande marmite couvrir la choucroute d’eau, ajouter la poitrine fumée en cubes, le laurier et le genièvre et cuire une heure à feu moyen ;
  2. couper le chou blanc en fines lamelles, le saler puis le faire bouillir 10 minutes dans l’eau de trempage des cèpes en remuant ;
  3. réunir les deux choux, ajouter les cèpes, le poivre en grains, la viande, la saucisse, le vin, les tomates ; on peut ajouter une cuillère à soupe rase de sucre ;
  4. faire braiser : les choux doivent être fondants ; on peut diviser la cuisson en plusieurs jours, réchauffer, ce n’est que meilleur !

Merci à ma mère pour cette recette que j'espère pouvoir réaliser bientôt !

Ragoût de pommes de terre et de courgettes (pour deux personnes)

23 novembre 2009
  1. épluchez quatre pommes de terre ;
  2. mettez les pommes de terre dans une casserole avec de l'eau, et mettez le tout à cuire ;
  3. émincez un oignon que vous ferez revenir dans une poêle avec de l'huile d'olive à feu doux ;
  4. découpez deux courgettes en tranches ;
  5. une fois que les oignons ont commencé à fondre légèrement, recouvrez-les des courgettes, et remuez de temps en temps afin que les oignons ne brûlent pas et que les courgettes cuisent bien, salez et poivrez ;
  6. quand les pommes de terre sont cuites, sortez-les de l'eau et découpez-les en morceaux ;
  7. mélangez les pommes de terre, les oignons et les courgettes dans une casserole (si possible la casserole qui a servi à cuire les pommes de terre : ça fera moins de vaisselle) ;
  8. ajoutez un grand verre d'eau dans la casserole et touillez en continuant à faire cuire, jusqu'à ce que les morceaux soient mêlés d'une purée de pommes de terre et de courgettes ;
  9. ajoutez une gousse d'ail découpée en morceaux et continuez à touiller jusqu'à ce que ça vous paraisse bon ;
  10. bon appétit !

Quart de cercle à base de courbes de Bézier

15 mars 2009

La librairie Swing de Java permet de dessiner directement sur un JComponent à l'aide des méthodes de Graphics2D.

Il est même possible d'avoir quelque chose de joliment anti-aliasé ! Seulement, pour ça, il faut dessiner à l'aide de Shapes. Il y a des formes prédéfinies (arcs, ellipses, rectangles droits et arrondis, polygones, …), mais si on veut créer des formes personnalisées, il faut passer par un GeneralPath construit à partir de courbes de Bézier.

Et en construisant une forme personnalisée contenant un quart de cercle, j'ai cherché comment placer les points de façon optimale pour que la courbe s'approche le plus possible d'un quart de cercle. Pour ça, j'ai fait un peu de mathématiques… Lire le reste de cet article »