Catégorie : linux

vim : expressions régulières rechercher remplacer (mémo)

Ci-suit une série d’expressions régulières qui fonctionnent sous vim, et dont j’ai fait la traduction en langue Française, afin que vous puissiez comprendre les subtilités :

  • /^ \+$ : rechercher toutes les lignes qui commencent et finissent par une suite de minimum un ou plus d’espaces (un antislash avant le « + »)
  • /^ *$ : rechercher toutes les lignes qui commencent et finissent par une suite de minimum zéro ou plus d’espaces (pas d’antislash avant le « * »)
  • /^ \*$ : rechercher toutes les lignes qui commencent par un espace et finissent par le caractère « * » (un antislash avant le « * »)
  • /^ \{1,1\}$ : rechercher toutes les lignes qui contiennent un et un seul espace (ne pas oublier l’antislash avant les « {} »)

Et maintenant une expression complexe qui m’a été très utile :
Si vous tapez exactement cela :

:%s/\($this->[a-z]\+\)\(_\)\(.\)/\1\u\3/g

Vous aurez tous les ordres du type :

$this->Sejour_deb

Qui seront transformés en :

$this->SejourDeb

Très très utile.
Explication :

:%s/\($this->[a-z]\+\)\(_\)\(.\)/\1\u\3/g
: = exécuter un ordre ;
% = appliquer sur la totalité du document ;
s = appliquer sur la chaine (ici ligne par ligne) ;
\($this->[a-z]\+\) = groupe qui a $this-> puis une série de lettres ;
\(_\) = groupe qui a un tiret bas ;
\(.\) = groupe qui contient un caractère quel qu’il soit ;
On voit qu’il y a trois groupes, ils sont accessibles via antislash puis le numéro du groupe, exemple : »\1« , et le cas concret :
/ = remplacer par… ;

  • \1 le groupe numéro 1 ;
  • \u mettre en majuscule ;
  • \3 le groupe numéro 3 ;

/g faire toutes les occurrences trouvées.

Shell et tilde avec 'home' ou 'end' : la solution

Le solution a été trouvée ici.
Je vous la traduis en Français :
Il vous faut créer un fichier nommé .inputrc dans votre répertoire personnel, puis y ajouter les lignes suivantes :
set meta-flag on
set input-meta on
set convert-meta off
set output-meta on


"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[3~": delete-char
"\e[2~": quoted-insert
"\e[5C": forward-word
"\e[5D": backward-word

Linux mount : erreur 12. Solution à appliquer.

C’est la traduction d’un article trouvé ici.

Ci-suit comment appliquer un patch sur l’erreur assez commune « mount error 12 = Cannot allocate memory ».

[snip]
La bonne chose c’est que je l’ai corrigé, d’un point de vue Linux.
Et on est dans un groupe de discussion Linux.
Je vais donc être un bon citoyen (euh… « Internetoyen ») et expliquer comment j’ai fait afin d’aider éventuellement d’autres personnes qui se retrouveraient face à ce problème.
Il y a vraiment très peu de chose sur Internet, concernant ce sujet.

[snip]

Je fais mon article ici pour tous les autres qui pourraient être déstabilisés par cette erreur mount  :

mount error 12 = Cannot allocate memory

Ok, c’est qu’il devait sûrement y avoir quelque chose de mauvais dans la ligne de commande ou avec le système mount.cifs. C’est une erreur classique qui s’affiche sous Linux, lorsque vous tentez de monter un partage Windows XP, 2000, ou NT share et que ça ne fonctionne pas :

mount error 12 = Cannot allocate memory

Ce n’est pas un problème Linux… on s’en doute (sourire). Le problème vient de la machine Windows : c’est elle qui cause ce problème et qui refuse d’autoriser le « mount ». J’ai trouvé ce problème en faisant sous un terminal, tourner tail sur la liste des messages système d’un côté, et sous un autre terminal, tenter le mount pour voir quelles étaient les erreurs générées par la ligne de commande.

La commande qui génère l’erreur est :

[root@ohmster ~]# mount -t cifs //missy/ohmster_music /mnt/test -o username=my_user,password=my_password,rw
mount error 12 = Cannot allocate memory
Refer to the mount.cifs(8) manual page (e.g.man mount.cifs)
[root@ohmster ~]#

Les résultats du tail qui m’ont montré l’erreur :

[root@ohmster samba]# tail -f /var/log/messages
Oct 23 21:15:40 ohmster kernel: CIFS VFS: cifs_mount failed w/returncode = -12
Oct 23 21:19:43 ohmster kernel: Status code returned 0xc0000205 NT_STATUS_INSUFF_SERVER_RESOURCES
Oct 23 21:19:43 ohmster kernel: CIFS VFS: cifs_mount failed w/return code = -12
[root@ohmster samba]#

Le message NT_STATUS est suffisamment explicite, c’est bel et bien la machine Windows qui est la cause du problème, pas la machine Linux.

Ci-suit comment appliquer un patch. Le patch Windows, bien sûr.

The Solution !

Regardez le log des Events sur la machine Windows machine qui pose problème. Cherchez une croix rouge, et le mot « Error » ou « Erreur ». La source est « Srv ». L’erreur ressemblera à :

The server's configuration parameter "irpstacksize" is too small for the server to use a local device. Please increase the value of this parameter.

Si vous avez cette erreur système sur la machine Windows, alors faites ce qui suit.

Modifiez (ou créez si nécessaire) la clé de registre :

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanServer\Parameters\IRPStackSize

Si la clé n’est pas présente, créez une clé de type DWORD, appelez la IRPStackSize. Validez.

Ensuite, qu’elle soit présente, ou que vous l’ayez crée, la procédure est la même :

  • Double-cliquez dessus pour l’éditer ;
  • Mettez le bouton radio sur Décimal afin d’être sur que c’est une valeur décimale (et non pas hexadécimale) ;
  • Entrez la valeur 15 ;
  • Redémarrez la machine.
  • Si cela ne fonctionne toujours pas :
    • Montez la valeur à 18 ;
    • Redémarrez la machine une nouvelle fois.

Le problème est résolu. Allez faire vos montages partagés Samba l’esprit tranquille.


~Ohmster

Si vous avez des commentaires / suggestions, n’hésitez pas à laisser un message !

Librairie gd et gdImageStringFT() : la libération à faire

Il n’est précisé nulle part, que lorsque vous utilisez des fonctions d’écriture telle que gdImageStringFT(), il faut toujours appeler gdFontCacheShutdown() à la fin du programme pour libérer les allocations faites. C’est valgrind qui m’a montré que ce n’était pas correctement libéré. Vive valgrind !

Linux : astuces bashrc

Lorsqu’on lance un nouveau shell sous Linux, il exécute un fichier ~/.bashrc.
Dans ce fichier, on peut y mettre des choses intéressantes, notamment :

export HISTCONTROL=erasedups
export HISTSIZE=10000
shopt -s histappend

Cela signifie :

  • effacer les lignes de commande en double ;
  • se souvenir au plus de 10000 lignes de commande (on n’en a jamais assez en fait) ;
  • dire au shell d’ajouter tout cela au fichier historique existant (et non pas ré-écrire par dessus (ce qui est fait par défaut)).

Programmer en C la librairie gd : le texte

J’ai décidé de faire un petit article qui explique rapidement comment écrire du texte « non crénelé », donc « antialiasé » du des images, en C, en utilisant la librairie gd.

Tout est très simple : vous trouverez déjà le manuel ici, pas mis à jour mais suffisant et les exemples fonctionnent, ce qui est le plus important.

Ce qui m’a posé le plus de problème, ce n’est pas de demander à écrire du texte. L’exemple ici fonctionne parfaitement, faites un copier coller, hop on y est.
Non, le problème c’est la « région » calculée dans laquelle sera dessiné le texte.
Pour résumer, on demande de pré-calculer la « boîte » dans laquelle sera dessiné le texte (toujours l’exemple ici).
Ce que j’ai mis beaucoup de temps à comprendre, c’est ce que je vais traduire dans « mon » langage : la boîte englobante qui est renvoyée, c’est l’espace qui sera utilisé en fonction du point de référence (x,y) que vous donnez pour dessiner.

Je m’explique. Vous demandez à calculer la boite pour dessiner le texte en passant la variable NULL :

err = gdImageStringFT(NULL,&brect[0],0,f,sz,0.,0,0,s);
if (err) {fprintf(stderr,err); return 1;}

Maintenant, dans brect il y aura ce genre d’informations :


     (   -1,  -57)     ( 1513,  -57)
           +-----------------+
           |                 |
           |                 |
           +-----------------+
     (   -1,   15)     ( 1513,   15)

Et en fait, c’est uniquement des informations pour vous, parce qu’après, lorsque vous lui demanderez de dessiner, il les ignorera : seules les informations x et y seront utilisées :

err = gdImageStringFT(im,&brect[0],black,f,sz,0.0,x,y,s);
if (err) {fprintf(stderr,err); return 1;}

Autrement dit, prenons un exemple : vous voulez dessiner votre texte en x=0. Seulement, le rectangle de retour est celui que j’ai affiché en haut : ça signifie que le dessin va « déborder » de (-1) pixel sur x. Autrement dit, si vous voulez le mettre en 0, il faut donner les coordonnées (x=1). Même chose pour y : les lettres vont « s’étaler » 57 pixels au dessus, et 15 pixels en dessous. Donc si vous voulez écrire le texte en (0,0), il vous faudra passer x=1, y=57.

En relisant ça parait facile, mais ça ne l’a pas été pour moi !
En espérant que cela serve à quelqu’un un jour…

Linux et Applications Windows : ça marche !

Je suis tout simplement impressionné.
En quelques clicks d’installation, j’ai installé « Wine ».
Tout a fonctionné du premier coup.
J’ai copié collé le répertoire dans lequel tournait notre application de téléphonie :
Et voilà le résultat :
Image petite du logiciel Windows sous Linux
Ça fonctionné du premier coup !
Je suis vraiment impressionné.
Donc, pour l’instant, tant que je n’ai pas besoin de fonctionnalités particulières, je reste sous Linux.
Je dois avouer que le seul programme qui me manque c’est Photoshop.
Pour tout le reste, je m’en passe allègrement !

Quand je clique sur arrêter pour arrêter le PC, c’est simple :

  • sous Windows, il met montre en main plus d’une minute, et encore… je ne suis même pas sûr qu’il s’arrête pour la simple et bonne raison qu’il y a des tonnes de programmes : un anti virus, un anti spam, le logiciel de téléphonie qui ne veut quitter sous aucun prétexte, le logiciel d’archivage, etc. et des fois ils se gênent tous entre eux ;
  • sous Linux, ça met 4 secondes montre en main, c’est véridique !

Uzbl : un browser Web entièrement en ligne de commande !

C’est ici que vous pourrez voir cet « ovni » du monde Internet : http://www.uzbl.org/.

Il est en plusieurs parties : le coeur même du système, et un programme qui interagit avec lui, lui envoie des messages, et affiche son résultat de retour. Comme le coeur semble extrêmement bien fait, on est censé pouvoir faire tout un tas de choses, automatiquement : un cas concret, c’est l’exemple du second programme qui interagit avec le coeur : en pratique on a un navigateur. Et puis il a rajouté une troisième couche, un troisième programme qui interagit avec le second, et qui donne la possibilité de tout gérer par onglets. Comme tout est open source, et apparemment très bien écrit, il est possible de faire plein de choses.

Le second programme, il a décidé de faire en sorte que son comportement soit du style « vi », à savoir : tout se fait au clavier, il y a un mode « navigation » où les touches se comportement d’une certaine façon, et il y a le mode édition (touche « i » comme sur vi, pour les connaisseurs), où on peut entrer des informations dans les formulaires.

Dans la vidéo, sur le site, on voit qu’il va déjà bien plus vite en tapant sur son clavier qu’en utilisant la souris. Je pense que lorsqu’on va toujours sur des sites qu’on connait bien, on doit au final gagner beaucoup de temps.

Linux : exemple php pratique pour grep, awk, sort, uniq et xargs

Ci-suivent quelques étapes qui expliquent l’utilisation des outils grep, awk, sort et uniq. C’est juste un exemple concret et pratique, n’imaginez pas un truc immense ! J’espère que cela vous donnera des idées, si un jour vous avez besoin de faire quelque chose dans le genre.

Objectif : lister tous les fichiers php du répertoire courant, qui font appel à l’ordre « date() ».

Donc :

  • Ordre « find » de Linux qui liste tous les fichiers d’un répertoire et de ses sous-répertoires :
    >find .
    ./robots.txt
    ./tarification2.php
    ./partenaire_demande.php
    ./img
    ./img/menu-gb_02-Carte-image_02_o.gif
    ./img/fleche_blc_fond_bleu.gif
    ./img/old_get_adobe_reader.gif
    ./img/menu-gb_02-Carte-image_05_o.gif
    ./img/ste_gestion_over.gif
    ./img/cbp_attest_ass_over.gif
    ./img/index_06.jpg
    [etc. etc.]
  • Ordre « grep » de Linux qui ne prend que les fichiers « qui se terminent par php » :
    >find . | grep php$
    ./img/index.php
    ./aore/verlogin.php
    ./aore/tarication2.php
    ./aore/img/iex.php
    ./aore/corats.php
    ./aore/ind.php
    ./aore/ccts.php
    [etc. etc.]
  • Ordre « xargs » de Linux qui dit « je vais te donner un programme (ici « grep »), et tu lui fais suivre ligne par ligne les résultats. Pour la note, « grep 'date(' [nom_de_fichier] » vérifie si dans le fichier [nom_de_fichier], il y a ‘date(‘ :
    >find . | grep php$ | xargs grep 'date('
    ./pe.php: $date=date("Y-m-d H:i:s");
    ./partde.php: $date_french=date("d-m-Y H:i:s");
    ./as/vergin.php:$date=date("Y-m-d H:i:s");
    ./as/cs.php:$date=date("Y-m-d H:i:s");
    ./as/cs.php:$date=date("Y-m-d H:i:s");
    ./as/cs.php: $date=date("d-m-Y H:i:s");
    ./as/sis.php:$date=date("Y-m-d H:i:s");
    ./ae/sis.php:$date=date("Y-m-d H:i:s");
    ./ae/stre_cle.php:$date_heure = date("Y-m-d H:i:s");
    ./ae/stre_cle.php:$date = date("Y-m-d");
    [etc. etc.]
  • Ordre « awk » qui prend la ligne en cours, considère que les « : » sont les séparateurs (-F:), et n’affiche en sortie que le premier enregistrement ('{print $1}') pour chaque ligne :
    >find . | grep php$ | xargs grep 'date(' | awk -F: '{print $1}'
    ./re/vein.php
    ./re/ctrs.php
    ./re/ctrs.php
    ./re/ctts.php
    ./re/sises.php
    ./re/sires.php
    ./re/sire_cle.php
    ./re/sire_cle.php
    ./re/sire_cle.php
    ./re/sire_cle.php
    ./ae/mu.php
    ./ae/mu.php
    [etc. etc.]
  • Ordre « uniq » qui prend la totalité de ce qu’on lui passe, et supprime les doublons :
    >find . | grep php$ | xargs grep 'date(' | awk -F: '{print $1}' | uniq
    ./re/vein.php
    ./re/ctrs.php
    ./re/ctts.php
    ./re/sises.php
    ./re/sires.php
    ./re/sire_cle.php
    ./ae/mu.php
    [etc. etc.]
  • Ordre « sort » qui trie par ordre alphabétique :
    >find . | grep php$ | xargs grep 'date(' | awk -F: '{print $1}' | uniq | sort
    ./ae/mu.php
    ./re/ctrs.php
    ./re/ctts.php
    ./re/sises.php
    ./re/sires.php
    ./re/sire_cle.php
    ./re/vein.php
    [etc. etc.]

Et voilà ! Une minute pour taper cette commande, et on a la liste de tous les fichiers à vérifier pour être certain qu’il n’y aura plus de warnings() lors de l’utilisation de date() dans ces fichiers php.
Pour la note, j’ai eu besoin de faire ça parce que ces fichiers devaient avoir en tête l’initialisation préalable date_default_timezone_set(). Ces fichiers sont les fichiers d’un très vieux site qu’il faut faire fonctionner en mettant au minimum les mains dedans, c’est ce que j’ai tenté de faire (pour préserver aussi ma santé mentale).

(Update 6 février 2011)
Sur ce site ici qui me cite, il y a une réponse très intéressante : lorsqu’on connait bien l’ordre « find« , on peut résumer tout mon article en une seule ligne et un seul ordre :

find -iname "*.php" -exec grep "\Wdate(" "{}" \; -print

Bon, le résultat ne renvoie pas que les fichiers, mais il est bien formaté, c’est aussi très pratique. Voici un exemple de sortie de cet ordre :

  $debloc_jj = (int) date('d');
  $debloc_mm = (int) date('m');
  $debloc_aa = (int) date('Y');
  echo '<li>Lancement des calculs à '.date("H:i:s").'.</li>';
  echo '<li>Terminé à '.date("H:i:s").'.</li>';
./_tests_unitaires/tarifs_generali/tarifs_2010.php
  $debloc_jj = (int) date('d');
  $debloc_mm = (int) date('m');
  $debloc_aa = (int) date('Y');
./_tests_unitaires/verifs.php
  $debloc_jj = (int) date('d');
  $debloc_mm = (int) date('m');
  $debloc_aa = (int) date('Y');
./_tests_unitaires/verifs_multi.php

Vim : aide et exemples excellents

Voici un site qui, si vous parlez Anglais, va vous faire gagner un temps fou :
http://vimcasts.org/
Ce sont des vidéos explicatives sur le fonctionnement de vim, avec toutes les options et surtout, pourquoi vim vous fait gagner du temps.

Ici aussi, si vous parlez Anglais, ce document explique pour les développeurs, comment gagner un temps fou avec vim.