mercredi 10 décembre 2014

variables Bash : bye bye basename

édition rapide du contenu des variables sous bash et dash

Bash a un mécanisme d'édition de variables intégré permettant d'en supprimer le début ou la fin. En prime, ça peut aussi compter la longueur du contenu.

Pour supprimer le début c'est avec #. Si on prononce # « dièse », ça commence par un D comme « début ».

Pour supprimer la fin c'est avec %. Bon, on peut se dire qu'un pourcentage s'écrit avec % à la fin pour s'en souvenir.

Exemples d'utilisation

transformer un flac en ogg
sox $chanson ${chanson%.flac}.ogg
calculer la longueur d'un mot
echo $mot fait ${#mot} char. de long
afficher le début d'un texte
echo début du texte : ${texte:0:30}
évaluer le chemin du script exécuté
chemin=${0%/*}
évaluer le chemin du script exécuté, complété pour le cas des liens symboliques
this=$(readlink -e $0)
chemin=${this%/*}
afficher le seul nom du script exécuté
echo ${0##*/}
supprimer un éventuel / final à un nom de répertoire
repertoire=${repertoire%/}

Tout cela fonctionne aussi avec dash !

Une petite colle maintenant : si votre script est appelé par la commande point (.) alors $0 n'est pas le nom de votre script mais celui du shell appelant ou du script appelant. Comment récupérer le nom du script dans ce cas-là ? Je n'en sais rien !

un petit exemple concret

Le programme suivant permet d'éditer en mode comparaison tous les couples de fichiers de même nom dans deux répertoires différents, en se restreignant au seul cas où ils ont un contenu différent. C'est un script dash pour plus de radipité au lancement. L'éditeur utilisé est vim ou gvim (sous la forme vimdiff ou gvimdiff).

#!/bin/sh

# édite les fichiers de même nom dans deux répertoires mais différents

usage() {
  echo "usage: ${0##*/} [-g] dir01 dir02"
  echo "Edit same files in both directories with different contents only."
  echo "With -g use gvimdiff instead of vimdiff."
  exit 1
}

editor=vimdiff
if [ "$1" = '-g' ] ; then
  editor=gvimdiff
  shift
fi
[ $# -eq 2 ] || usage
dir01="${1%/}"
dir02="${2%/}"
ndiff=0
ntotal=0

compare() {
  if [ -f $2 ] ; then
    ntotal=$((ntotal+1))
    if ! cmp --quiet $1 $2 ; then
      #echo '!=' DIFF $1 $2
      $editor $1 $2
      ndiff=$((ndiff+1))
    fi
  fi
}

files=$(find "$dir01" -maxdepth 1 -type f)
for f01 in $files ; do
  f02=$dir02/${f01##*/}
  compare $f01 $f02
done
echo "$ndiff couples of files were different out of $ntotal."

jeudi 27 novembre 2014

Créer un sous-DBA sous mysql pour le dév

Il s'agit de créer un utilisateur dev qui a presque tous les droits sous mysql. On trouve de tels articles tout plein dans le web, mais celui-ci est taillé sur mesure pour mes besoins !

Avant de commencer, un petit truc pour phpmyadmin : on peut entièrement le reconfigurer, y compris si la base phpmyadmin a été abimée, avec :

sudo dpkg-reconfigure phpmyadmin

Il s'agit tout simplement de créer l'utilisateur dev et ensuite de lui donner ses pouvoirs. Rien de sorcier. 4 lignes de SQL suffisent :

flush privileges;
create user 'dev'@'localhost' identified by 'password';
grant create, drop, delete, insert, select, update, alter, index on *.* to 'dev'@'localhost';
flush privileges;
Le premier flush privileges; permet de recréer l'utilisateur dev si on vient de le supprimer. Le deuxième permet de s'en servir à coup sûr.

mercredi 26 novembre 2014

URL rewriting avec Apache pour Zend 1.x

J'ai eu beaucoup de mal à faire fonctionner le moindre exemple d'application avec Zend 1.x. Zend est un framework PHP qui ne marche qu'avec de l'URL rewriting et je n'en n'avais jamais fait. Mais j'avais déjà fait des configuration Apache avec VirtualHost aussi ai-je dès le départ mis en place un virtual host. Voir mon billet précédent sur la configuration d'Apache2 avec VirtualHost.

J'ai donc une URL applicative sur ma machine qui se nomme guestbook.machine.chez.moi et à cette URL correspond le contrôleur IndexController. Un synonyme de cet URL est guestbook.machine.chez.moi/index puisqui index est le désignateur de ce contrôleur dans une URL Zend. Oui mais voilà, chez moi cette deuxième ne marchait pas et j'avais une erreur 404 générée par Apache. Idem avec guestbook.machine.chez.moi/bidon.

Je finis par découvrir qu'en fait c'était parce que le fichier .htaccess que Zend avait créé pour assurer l'URL rewriting n'était pas pris en comptes parce que dans mon fichier de configuration Apache de l'application /etc/apache2/sites-available/guestbook j'avais d'actif un Options none alors qu'il fallait y mettre un FollowSymLinks. Mais je me suis contenté, bêtement, de recopier le bout de config donné là où j'ai trouvé cette information, à savoir Options Indexes MultiViews FollowSymLinks sans remarquer le MultiViews dont j'ignorais le rôle. Mais ça ne marchait toujours pas mieux…

Le log d'Apache m'informe de son refus de collaborer avec une ligne telle que :

[Wed Nov 26 15:31:52.624341 2014] [negotiation:error] [pid 10160] [client 127.0.0.1:43836] AH00687: Negotiation: discovered file(s) matching request: /home/geek/workspace/guestbook/public/index (None could be negotiated).

Mais je n'ai pas de fichier ou répertoire index, seulement un fichier index.php à la racine Apache du serveur. En gooolant le message d'erreur je trouve la cause et la solution : c'est ce foutu Multiviews qui fait coïncider index.php avec index et cela empêche l'URL rewriting conditionnel mis en place par Zend (pas d'URL rewriting si l'URL pointe sur un fichier existant). Il faut supprimer Multiviews et tout va pour le mieux. Voici donc ma configuration du VirtualHost avec les droits réduits au minimum :

<VirtualHost *:80>
  ServerName guestbook.machine.chez.moi
  DocumentRoot /home/geek/workspace/guestbook/public
  DirectoryIndex index.php
  <Directory />
    Options none
    AllowOverride None
    Require all denied
  </Directory>
  <Directory /home/geek/workspace/guestbook/public>
    Options FollowSymLinks SymLinksIfOwnerMatch
    AllowOverride None
    Require all granted
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [NC,L]
    RewriteRule ^.*$ index.php [NC,L]
  </Directory>
  ErrorLog /var/log/apache2/guestbook.log
  LogLevel warn
  CustomLog /var/log/apache2/guestbook.log combined
</VirtualHost>
La directive AcceptPathInfo est inutile, mais je l'ai mise pour me rappeler que c'est finalement le mécanisme induit qui est utilisé par défaut dans ce cas. Comme je n'ai pas mis FollowSymLinks je pourrais aussi enlever RewriteCond %{REQUEST_FILENAME} -l [OR] qui devient un test inutile.

Si on utilise un fichier .htaccess alors son contenu est celui généré par Zend :

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
et le contenu de /etc/apache2/sites-available/guestbook est :
<VirtualHost *:80>
  ServerName guestbook.machine.chez.moi
  DocumentRoot /home/geek/workspace/guestbook/public
  DirectoryIndex index.php
  <Directory />
    Options none
    AllowOverride None
    Require all denied
  </Directory>
  <Directory /home/geek/workspace/guestbook/public>
    Options FollowSymLinks SymLinksIfOwnerMatch
    AllowOverride All
    Require all granted
  </Directory>
  ErrorLog /var/log/apache2/guestbook.log
  LogLevel warn
  CustomLog /var/log/apache2/guestbook.log combined
</VirtualHost>

mardi 28 octobre 2014

première version alpha de Blood and Blades



Eh non, ce ne sera pas encore aujourd'hui je vais vous parler de Blood and Blades ! C'est une règle de jeu d'histoire avec figurines de mon invention. Je me dois d'avouer tout de suite qu'elle doit beaucoup à DBM, DBMM et Armati, tout en visant une bataille de la taille et de la durée d'une partie d'ADG. Elle est en anglais pour ne pas rester franco-française. Mais surtout elle est sous licence libre CC-BY-SA tout en utilisant les listes d'armée DBMM ou DBM.

Voici la règle Blood and Blades sous forme d'un wiki. Enregistrez la cible de ce lien comme un fichier html et ouvrez-le.  Il faut autoriser le javascript pour pouvoir lire la règle. Je sais devoir entreprendre la réalisation d'une version PDF.

Tout retour est le bienvenu, sur le fond comme sur la forme. N'hésitez pas ! Et merci d'avance pour toute aide qui me parviendra !

(crédit photo «cutter & blood» par gaelx http://www.flickr.com/photos/7574080@N08/3236415581 CC-BY-SA)

mise à jour du 10/04/2013 : j'ai mis une version avec quelques changements que j'avais oublié de faire hier : escape --> flee et cluster --> group notamment.

mise à jour du 28/10/2014 <: le lien sur la règle a été changé pour une version plus récente. Et voici les liens pour la version epub (avec graphismes vectoriels SVG) et la version pdf A4.

configuation Apache avec VirtualHost

Il va s'agir ici d'indiquer comment configurer Apache pour avoir plusieurs serveurs virtuels sur la même machine. C'est encore un exposé de plus, mais il expose ma façon de faire pour que je ne l'oublie plus et n'aie plus à potasser la doc de référence d'Apache pendant une demi-journée...

Cette configuration concerne Apache 2.4 ! Essayer une config Apache 2.0 ou 2.2 sur une Apache 2.4 mène le plus souvent à une erreur 403 (droits d'accès insuffiants -- parce que la syntaxe afférente a changé).

Le système hôte est une debian ou un dérivé comme Ubuntu ou Linux Mint.

Pour créer le serveur appli.chez.moi sur son serveur personnel il faut déjà permettre la résolution du nom appli.chez.moi et si on n'a pas de dns on va insérer dans /etc/hosts la ligne suivante (avec une tabulation avant l'adressi ip) :

appli.chez.moi 127.0.0.1

On peut mettre sa vraie adresse ip à la place de 127.0.0.1 si on veut mais ça ne change rien. Cela suffit pour être accessiblle à une machine externe à la condition qu'elle-même puisse modifier pareillement son fichier hosts, avec la vraie adresse ip de votre serveur toutefois (ce n'est pas possible sans avoir les droits administrateur sur la machine externe). Pour windows xp, il s'agit du fichier C:\WINDOWS\system32\drivers\etc\hosts qui a la même syntaxe que sous linux.

Il faut maintenant créer le fichier /etc/apache2/sites-available/appli (on peut aussi le nommer appli.chez.moi et on peut ajouter une extension .conf). Recopiez y le contenu ci-dessous.

<VirtualHost *:80>
  ServerName appli.chez.moi
  DocumentRoot /mnt/servers/appli
  DirectoryIndex index.php
  <Directory />
    Options none
    AllowOverride None
    Require all denied
  </Directory>
  <Directory /mnt/servers/appli>
    Require all granted
  </Directory>
  ErrorLog /var/log/apache2/appli_error.log
  LogLevel warn
  CustomLog /var/log/apache2/appli_access.log combined
</VirtualHost>

Cette config est pour un serveur php basique sans framework. Avec un framework, il faut pointer sur un sous répertoire et le fichier par défaut n'est en général toujours index.ph«/code>p aussi voyez ci-après ce que cela donnerait si, par exemple, appli.chez.moi était développée avec symphony 2.4.

<VirtualHost *:80>
  ServerName appli.chez.moi
  DocumentRoot /mnt/servers/appli/web
  DirectoryIndex app_dev.php
  <Directory />
    Options none
    AllowOverride None
    Require all denied
  </Directory>
  <Directory /mnt/servers/appli/web>
    Require all granted
  </Directory>
  ErrorLog /var/log/apache2/appli_error.log
  LogLevel warn
  CustomLog /var/log/apache2/appli_access.log combined
</VirtualHost>

Et voici le même exemple avec CodeIgniter mais en plus une gestion avec subversion (on veut lancer la version du trunk qui est dans /mnt/servers/appli/trunk).

<VirtualHost *:80>
  ServerName appli.chez.moi
  DocumentRoot /mnt/servers/appli/trunk/web
  DirectoryIndex index.php
  <Directory />
    Options none
    AllowOverride None
    Require all denied
  </Directory>
  <Directory /mnt/servers/appli/trunk/web>
    Require all granted
  </Directory>
  ErrorLog /var/log/apache2/appli_error.log
  LogLevel warn
  CustomLog /var/log/apache2/appli_access.log combined
</VirtualHost>

Bon, ces fichiers interdisent l'emploi de fichiers .htacess. On peut changer cela en ajoutant une ligne

AllowOverride all
dans <Directory /mnt/servers/appli/trunk/web> (ou quelque chose de moins ouvert que all).

Ces configurations interdisent l'emploi de liens symboliques. Je n'ai pas réussi à avoir une configuration comme il est recommandé d'en avoir avec des liens symboliques. Bon, en fait, je me suis rendu compte que je pouvais m'en passer, alors je m'en passe. Et d'autant mieux que c'est ce qu'Apache recommande.

Pour que le site soit disponible il faut maintenant lancer la commande

sudo a2ensite appli
(ou appli.chez.moi le cas échéant). Et enfin relancer apache :
sudo service apache2 restart
et alors on pourra voir sa page d'accueil en visitant la page http://appli.chez.moi avec son navigateur.

mardi 30 septembre 2014

une stratégie pour git

Comme je viens de créer mon projet TiddlyBook sur github, je me dois d'apprendre les bases de git et de ses bonnes pratiques. Vaste programme !

Je tombe heureusement sur un exposé en anglais qui indique clairement une manière efficace et simple, mais nullement simplifiée, d'utiliser git dans la vraie vie, aussi bien en entreprise qu'en projets personnels. Elle est là : a successfull git branching model.

L'intérêt de ce document, est aussi de donner clairement les commandes à exécuter. Il n'y a qu'un détail qui n'est pas donné, hélas, c'est où exécuter ces commandes dans l'arborescence. Sans doute car cela a paru trop trivial à l'auteur. Je mettrais à jour ce billet quand j'aurai élucidé ce point.

lundi 29 septembre 2014

création du projet TiddlyBook

Ça y est, je viens de créer le projet tiddlybook sur github.com. J'y ai mis une version utilisable de mon outil pour générer, à partir d'un wiki tiddlywikitiddlywiki, un docbook et de là un ebook ou un pdf. Ça va me servir pour la publication de ma règle Blood and Blades.

Il va falloir que je trouve un hébergeur et un nom de domaine pour cette dernière.