lundi 8 novembre 2010

VIM : Affichage des caratères spéciaux

Dans vim il est possible de rechercher tous les caracteres non-imprimables comme ceci :
/[^[:print:]]
De meme il est possible d'afficher tous les caracteres (même non imprimable) avec :
:list

mercredi 2 juin 2010

Super-puissant pour les non-linuxiens !

$ cat ~/.inputrc
"\e[A": history-search-backward
"\e[B": history-search-forward
"\e[C": forward-char
"\e[D": backward-char

Permet d'utiliser :
  • les fleches haut/bas pour rechercher dans l'historique
  • les fleches gauche/droite pour deplacer le curseur sur la ligne
La productivité sera de retour... :)

jeudi 30 juillet 2009

Internal Field Separator

En bash il y a une variable speciale, super importante, pour qui developpe des scripts shell : IFS
Comme son nom l'indique c'est le separateur de champs. Il vaut <space><tab><newline> par defaut.

Chacun de ses caractères sont considérés comme des séparateurs de champs.
On peut donc faire des choses comme :
shell> IFS=";"
shell> set -- "premier;deuxieme;troisieme;quatrieme"
shell> echo $3
troisieme

Je pourrai detaillé, si l'envie m'en prend, plus à fond les enormes possibilités que nous offre cette variable spéciale. Mais l'objet de mon post n'est pas là. En effet je suis aussi un peu un malade de la structuration de mon code et quand pour mes besoin j'avais besoin que le separateur de champs soit uniquement je devais faire :
shell> IFS="
"
shell> for i in $(cat foo.txt);do echo -- $i --; done

Or je detestais voir cette commande sur deux lignes, et l'utilisation de IFS="\n" ne fonctionnait pas. Alors comment faire ? Et bien jusqu'à récemment rien. Jusqu'à ce que je découvre cette nouvelle possibilité :
shell> IFS=$'\n'
shell> for i in $(cat foo.txt);do echo -- $i --; done

Notez bien l'utilisation des simples quotes !

Et me voila heu-reux ! E-R-E !!!

Fucking Encodage !!!

Tout le monde (ou presque) a deja entendu parler du systeme d'encodage des caracteres...
Pour nous Francais nous jouons surtout entre iso-8859-15 (a.k.a. latin-9) et utf-8.
Je m'affranchirai ici de décrire les considérations techniques sous-jacentes, mais je vais vous expliquer comment, dans VIM, afficher correctement les caracteres. Oui, ras le bol des caracteres foireux, des superpositions de caracteres, des doubles backspace pour effacer un seul caractere !!!!

Prérequis :
connaitre le type d'encodage de vos fichiers (pour ceux deja existant)
connaitre le type d'encodage utilisé par votre terminal (exemple avec PuTTY : Dans Settings->Window->Translation)

Parametres VIM :
choisir l'encodage pour l'affichage des caracteres/du fichier
set encoding=iso-8859-15
choisir l'encodage pour l'encodage des caracteres/du fichier
set fileencoding=iso-8859-15

On remarquera alors que pour une chaîne d'encodage uniforme i.e. tous les elements que sont le fichier (fileencoding), la lecture du fichier (encoding) et l'affichage sur le terminal (translation dans putty) sont parametres sur le meme encodage de caracteres, on s'affranchi alors de bien des miseres...

mardi 28 juillet 2009

Fucking Carriage Return !!!

Ras le bol de chercher comment supprimer les "carriage return" dans un fichier... voici donc un topo !

Chaque OS a sa propre facon de revenir à la ligne :

  1. DOS/Windows => [CR][LF] ou \r\n
  2. Unix/Linux => [LF] ou \n
  3. Mac => [CR] ou \r



Le cas le plus courant pour moi est d'avoir un fichier sous Linux provenant de Windows. Ca pose pas mal de problemes et si vous lisez ces lignes c'est que vous les connaissez deja ;)
Il y a plusieurs moyen de passer du \r\n à \n :

  1. bash => sed -i 's/^M//g' monfichier.txt
  2. vim => :%s/^M//g


sachant que le ^M est UN SEUL caractere que l'on fait en tapant Ctrl-V Ctrl-M

mercredi 7 mai 2008

Equivalent du 'is_digit()' php en javascript

Petite fonction simple et astucieuse à ajouter à votre lib js perso :

function is_digit(num) { return RegExp('^[0-9]+$','g').test(num); }

lundi 17 mars 2008

BRE vs. ERE

Vous utilisez Unix/Linux.
Vous connaissez (un peu) les expressions rationnelles ("regular expression" en anglais).
Pourtant certains mystères persistent lors de l'utilisation... et là vous vous rendez compte qu'il existe plusieurs type d'expressions rationnelles !!! si si je vous jure !

les BRE (Basic Regular Expressions) :
Ici les meta-caractères doivent être précédé d'un anti-slash pour être "activé".
Ils sont considérés comme des caractères normaux sinon...
exemple : avec la commande "grep -e"

les ERE (Extended Regular Expressions) :
Ici les meta-caractères sont "activé" par défaut.
Il sont considérés comme des caractères normaux s'il sont précédé d'un anti-slash (on dira couramment que le caractère est échappé).
exemple : avec la commande "grep -E"

Je n'ai pas trop le temps pour faire un tutorial détaillé.
J'en resterais donc là... pour l'instant !

mercredi 30 janvier 2008

MySQL Password Recovery

Bon alors... je sais, je sais on peut trouver ca partout.
Mais j'en ai justement marre de chercher partout !

Donc voici comment redefinir le mot de passe root de mysql sous GNU/Linux :
$ /etc/init.d/mysql stop
$ mysqld --skip-grant-tables &
$ mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1Server version: 5.0.38-Ubuntu_0ubuntu1.1-log
Ubuntu 7.04 distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> UPDATE mysql.user SET Password=PASSWORD('mon_mot2passe')
WHERE User='root';
Query OK, 3 rows affected (0.05 sec)
Rows matched: 3 Changed: 3 Warnings: 0

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.03 sec)

mysql> exit
Bye

$ killall mysqld
$/etc/init.d/mysql start


Et voila... :)
Les messages et la façon de démarrer/arrêter mysql seront evidemment different selon votre serveur.
Vous devez bien entendu remplacer "mon_mot2passe" par le mot de passe que vous souhaitez attribuer à "root".

mercredi 19 décembre 2007

Erreur bash : "value too great for base"

J'ai rencontré le problème suivant qui a résisté à toutes mes recherches de solution via les classiques moteurs de recherche... mais pas à quelques bonne minutes devant un vrai bouquin (si si ca existe encore et c'est parfois mieux que Google ou Wikipedia...).

Bref, voici le problème initial :
Dans un script unix utilisant bash comme interpreteur, j'ai eu ce message d'erreur
-bash: 08: value too great for base (error token is "08")
Ici bash nous indique qu'il ne peut pas affecter la valeur "08" à une variable. En effet le '0' en premiere position indique au shell qu'on est en octal i.e. base 8. Les seuls chiffres autorisés seront donc entre 0 et 7 (d'où le message "valeur trop grande pour cette base")

La solution :
On précise explicitement la base utilisée grâce à la syntaxe BASE#NOMBRE

Exemple :
$ declare -i NUM
$ NUM=08
-bash: 08: value too great for base (error token is"08")
$ NUM=10#08
$ echo $NUM
8
$ NUM=16#AF5E
$ echo $NUM
44894

vendredi 14 décembre 2007

Utiliser tput et terminfo (2)

Un exemple d'utilisation avancée des fonctionnalités de tput et terminfo.

# save your prompt
PS1_SAVE=$PS1
# set the prompt to blank
PS1=''
# save the number of colums of the terminal
COLUMNS=$(tput cols)
# save the number of lines of the terminal
LINES=$(tput lines)
# set the message you want to display (here it's "hello I am at the center of the term")
message="coucou je suis au milieu du terminal"
# get the horizontal position to center your text
hpos=$(expr $LINES / 2)
# get the vertical position to center your text
vpos=$(expr \( $COLUMNS - $(echo "$message" | wc -c) \) / 2)
# move the cursor to that position
tput cup $hpos $vpos
# enter in reverse video mode
tput rev
# display the message
echo "$message"
# wait for 3 second to see the message
sleep 3
# recall your default prompt
PS1=$PS1_SAVE
# reset all terminal settings
tput sgr0
# clear the screen
tput clear

Changer l'encodage des caractères de l'invite de commande Windows

Vous utilisez la ligne de commande Windows (cmd.exe) et souhaitez que les caratères européens (accents...) soient correctement affichés. Dans ce cas, 2 paramètres sont à changer : le codepage et la police de caractère !

Le codepage :

Par défaut, windows utilise DOSLatin1 (codepage 850) dans son invite de commande (cmd.exe). Nous souhaitons passer à WinLatin1 (codepage 1252).

Pour ce faire vous pouvez utiliser la commande chcp <num> qui vous permettra de changer le codepage à la volée, ou bien modifier la valeur de la clé de registre HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\OEMCP (redémarrage nécessaire).


La police de caractère :
Dans les propriétés de l'invite de commande Windows, onglet "Police", choisissez
la police "Lucida Console" en lieu et place de "Polices Raster"

Utiliser tput et terminfo

Comment créer des scripts unix avec une UI avancée ?
Essayez de vous souvenir de quelques unes de ces commandes et de les approfondir grâce aux pages de manuel :

# save cursor position
tput sc
# move cursor to 10th line and 20th column
tput cup 10 20
# write some text from here in standout mode
tput smso
echo "j ecris a partir de la 10eme ligne et la 20eme colonne"
# restore cursor position
tput rc
# exit from standout mode
tput rmso



Pour approfondir :
  • man tput
  • man terminfo
  • man termcap

Caractères spéciaux non reconnus

Les touches speciales de votre clavier ne sont pas toujours reconnus lorsque vous vous connectez sur une machine en ssh ? Vous avez réussi à configurer PuTTY pour gérer correctement la touche "backspace", mais il vous manque toujours d'autres controles (Ctrl-C, Ctrl-Z...) ?

Bref vous n'avez pas accès à toutes les fonctions de votre clavier.

Utilisez la commande stty !
Par exemple, sur un de mes serveurs HP-UX 11.11 j'ai ajouté la ligne suivante dans mon .profile :
stty erase "^H" kill "^U" intr "^C" eof "^D" susp "^Z"
Pour une meilleure portabilité, il est possible d'interroger directement la base de donnée terminfo/termcap et d'attribuer le caractere associé à la fonction souhaitée. Par exemple pour l'effacement de caractère :
sttry erase $(tput kbs)