mercredi 5 décembre 2012

Levée de la travée centrale du pont Bacalan-Bastide

Prise ce jour, Mercredi 5 Décembre 2012


vendredi 30 novembre 2012

bash, afficher en gras

On peut utiliser la commande tput de la manière suivante :



gras, bold, tput, echo

jeudi 22 novembre 2012

mysql, regexp

Pour comptabiliser avec une regexp les numéros appelant valides (non masqués)



select count distinct REGEXP

jeudi 15 novembre 2012

java, initialiser une liste en une ligne



List, Arrays, asList, Collection, Collections

lundi 12 novembre 2012

rxvt-unicode, problème de compilation

Il suffit simplement d'un



et hop finit l'erreur : checking for /usr/bin/perl suitability... configure error no unable to link !

vendredi 9 novembre 2012

awk, utiliser les intervalles {x,y}

Pour utiliser les intervalles avec awk, il suffit de rajouter l'option --re-interval



awk re regex intervalle { }

SVN, ajouter la propriété exécutable



svn propset exec executable

jeudi 8 novembre 2012

Tar, détarrer un bz2

Il suffit simplement de remplacer le z par j dans la ligne de commande :

mercredi 7 novembre 2012

Vi, rechercher une regexp

Par exemple pour rechercher les occurences say ou play lorsque l'on édite un fchier :

C, compiler un projet avec autoconf, automake & consors

Si le projet met à disposition un fichier autogen.sh, utilisez-le.

Sinon, exécutez les commandes suivantes pour reconfigurer et recompiler le projet :

  • autoreconf --force --install
  • - lance aclocal, autoconf, autoheader et automake dans le bon ordre pour créer config.h.in, Makefile.in, configure et un certain nombre de fichiers auxiliaires
  • ./configure
  • - crée le fichier Makefile à partir du fichier Makefile.in et config.h à partir du fichier config.h.in
  • make



lundi 5 novembre 2012

bash et les tableaux...

Voici comment faire des tableaux et les utiliser en bash.



Je suis tombé dessus en regardant les PKGBUILD de dwm comme (celui-ci)

lundi 29 octobre 2012

mac, disque ntfs en écriture

Grrr, apple bloque tout. Le disque Western Digital que je viens d'acheter se monte directement mais n'est visible du finder qu'en lecture seulement !

C'est rageant.

Il y a des solutions tierces telles que paragon-software.com et tuxera.com mais c'est payant :(

J'ai quand même fait quelques explorations et il s'avère qu'on peut bien monter le disque en lecture/écriture sans passer par la caisse :



J'ai lancé une copie de 200Go de données, je verai bien si tout passe.

Note: ça passe sur mon mac mini avec Mac OS 10.6.8 :)

sudo, mount, ntfs, rw

jeudi 18 octobre 2012

python, print sur stderr



print, sys, stderr

mercredi 17 octobre 2012

bash, récupérer la n-ième ligne ou les lignes x à y d'un fichier

On peut utiliser awk avec NR (numéro de ligne tout fichier confondus) ou FNR (numéro de ligne du fichier) :



Ou bien avec sed :



En bonus, 10 astuces awk :
http://www.catonmat.net/blog/ten-awk-tips-tricks-and-pitfalls/

bash, supprimer les lignes vides d'un fichier





où NF indique le nombre de champs. Si ce n'est pas une ligne vide, le nombre de champs est positif et la commande par défaut de awk est d'afficher.
Ce qui équivaut à :







sed, awk, remove empty lines

mardi 16 octobre 2012

bash, lire ligne par ligne

Pour un fichier :



Et encore mieux, sur la sortie d'une commande :)



read, line

lundi 15 octobre 2012

awk, un exemple pour bien débuter et comprendre...





awk n'est pas si compliqué que ça lorsque l'on comprend la philosophie...

La commande se décompose de la manière suivante :

BEGIN { CODE_DEBUT } MATCHAGE { CODE } END { CODE_FIN }

  • CODE_DEBUT est exécuté au début du traitement du fichier ou flux
  • CODE_FIN est exécuté à la fin du traitement du fichier ou flux
  • CODE est exécuté sur les lignes du fichier ou flux matchées par les règles de MATCHAGE

Dans l'exemple ci-dessus,
  • -F ';' indique que le séparateur de champs est le ;
  • les -v permettent de déclarer une variable awk à partir d'une variable bash (pour transmettre les informations)
  • NR correspond au numéro de la ligne traitée (on ignore l'entête du fichier avec le test supérieur ou égal à 2)
  • /;/ correspond aux lignes qui contiennent un ;
  • !/^#/ correspond aux lignes qui ne débutent pas par un dièse

Le programme ci-dessus crée les requêtes à exécuter sur chacune des bases de données pour chacun des enregistrements du fichier file.txt

Comme quoi, on peut démystifier awk ;)

awk, base, for

python, lire et écrire des fichiers xls

Si l'on a des fichiers Excel que l'on souhaite lire ou écrire, on peut utiliser les paquets xlrd (reader) et xlwt (writer).

Voici un petit exemple de ce que l'on peut faire :



La page suivante propose des exemples clairs et rapides pour bien commencer :
http://www.dev-explorer.com/articles/excel-spreadsheets-and-python

vendredi 12 octobre 2012

bash, savoir si stdout fait référence à un terminal

Pour savoir si la sortie standard pointe sur un terminal, on peut utiliser l'opérateur "-t" en bash.



Dans le cas présenté, on utilisera colordiff pour le rendu sinon diff.

En effet, un pipe avec less (sans l'option -R ou la variable LESS définie à -R) afficherait les caractères d’échappement servant à la colorisation des lignes

Cf une page intéressante : ici

sql, gérer les conflits lors des inserts

Lors d'un insert, si la clé primaire existe déjà, il est possible de faire un traitement comme dans l'exemple ci-dessous.



Ici, on tente de peupler la table enveloppesTTS avec des valeurs.

Si l'entrée n'existe pas, on la crée.

Sinon on met à jour un champ de cette table uniquement si sa valeur n'est pas déjà renseigné.

mysql, on duplicate key, insert into, values, select, if, tts

bash, voir autour des occurences avec grep...



Avec l'option :
  • A : affiche les lignes après l'occurence trouvée (after)
  • B : affiche les lignes avant l'occurence trouvée (before)
  • C : affiche les lignes avant et après l'occurence trouvée

grep

jeudi 11 octobre 2012

awk, créer des requêtes SQL depuis un fichier csv

Par exemple :



awk, fs, insert into table

mercredi 10 octobre 2012

bash, récupérer le nombre de colonnes du terminal

Pour centrer :



Ou afficher un séparateur :



tput, printf

python, faire en sorte que stdin/stdout lisent et écrivent en binaire

J'ai écrit un petit programme qui s'inspire de cut en python.

La lecture et l'écriture pouvant se faire sur l'entrée/sortie standard (sources ucut), j'avais des problèmes de "'ascii' codec can't decode byte"...

Pour y remédier, j'ai "transformé" les flux standard (mode texte) en flux binaires de la manière suivante :



python, binary, os, fileno

bash, vérifier si une variable matche une regexp

On peut facilement vérifier si une donnée contenue dans une variable est au bon format.

Dans l'exemple ci-dessous, on vérifie si le numéro de version fourni est correct.



Dans celui-ci si la valeur contient localhost ou itg



Attention, la regexp n'est pas entre quote ni double-quote.

=~, regexp, re

jeudi 27 septembre 2012

vi et les macros

Via un petit exemple...


ggqqdwj@qq@q

Permet de supprimer le premier mot de chaque ligne du buffer.

  • gg permet d'aller en début de fichier
  • qq démarre l'enregistrement de la macro de nom q (la 2e lettre)
  • dwj supprime le premier mot et descend de ligne
  • @q appelle la macro q
  • pour revenir au mode de vi "normal"
  • q pour terminer l'enregistrement de la macro
  • @q pour appeler la macro

mardi 25 septembre 2012

bash, swap de 2 fichiers

Le code suivant à ajouter au bashrc permet de swapper ou plutôt échanger 2 fichiers rapidement.



Et son exemple :



mv, tempfile

bash, mv en masse

Il y a quelques années, j'avais écris un petit programme qui permettait de changer l'extension de fichiers.

A cette époque, je ne connaissais pas la commande mmv (comprendre "mass"mv) :



A noter : cette commande permet aussi de supprimer l'extension des fichiers...

vi

Depuis ma formation "coder au front end", je me mets à vi...

Voici une liste de ressources bien utiles pour s'y mettre :

Un aide-mémoire textuel : http://www.lagmonster.org/docs/vi2.html


Un aide mémoire graphique complet : http://michael.peopleofhonoronly.com/vim/vim_cheat_sheet_for_programmers_screen.png


Un tutoriel par aides-mémoire graphiques progressifs : http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html



Un petit jeu online pour apprendre de manière ludique : http://vim-adventures.com/



La chose que je n'avais pas saisi c'est que l'on peut opèrer par "commande" "mouvement".

Ainsi, c2f> supprime le texte jusqu'au 2e > inclus et met l'utilisateur en mode édition.

On peut aussi couper un texte dans des cases mémoires différentes et réutiliser cette case par la suite.

Ainsi "ac2f> coupe le texte jusqu'au 2e > inclus et met l'utilisateur en mode édition. Le texte coupé est dans la case a. Par la suite pour réutiliser le contenu de la case a, on fait "ap pour coller par exemple.

C'est le petit truc qui me manquait pour mieux comprendre vi je pense...

java, déboires d'encoding...

Il y a quelques temps, j'ai eu de petits problèmes d'affichage d'accents sur une IHM d'un fichier qui était fourni par une autre appplication.

Le charset n'était pas le bon.

Il a fallu que je force l'écriture du charset et sa lecture.

Pour l'écriture :



Pour la lecture :




java, encoding, charset, utf-8, iso-8859

dimanche 23 septembre 2012

Linux, niveau de la baterie

Une petite commande pour connaitre le niveau de la baterie...



Cela peut être utile lorsque l'on est en mode console sur son portable...

acpi

vendredi 21 septembre 2012

bash, tester si un programme est installé

Pour tester si un programme est installé, on peut utiliser la commande which
de différentes manières.

La première en comptabilisant le nombre de lignes retournées.



La seconde en utilisant le code de retour de la commande.



which, apt-get install, sudo

La seconde est plus lisible, pas besoin de décrypter.

C'est seulement dommage qu'on ne puisse pas ajouter un paramètre à la commande pour ne pas écrire sur la sortie standard et que l'on soit obligé de rediriger dans /dev/null.

A chacun sa préférence.

jeudi 20 septembre 2012

Linux Mint Cinamon, touchpad et défilement à 2 doigts

Le défilement à 2 doigts sur le touchpad ne fonctionnait pas.

J'ai cherché dans les menus et je n'ai rien vu.

Sur internet, des pages parlent de synclient.

Effectivement, la ligne suivante
$ synclient VertTwoFingerScroll=1

permet de faire fonctionner le défilement à 2 doigts. Mais malheureusement, la modification n'est pas persistente après un redémarrage...

Pour la rendre persistente j'ai vu plein de docs ainsi que la page

http://mixeduperic.com/ubuntu/ubuntu-1004-how-to-setup-two-finger-scroll-on-laptop-touch-pad.html

Cette page peut donner des idées si des choses sont à effectuer lors de l'ouverture de la session X.

Je n'en ai pas eu besoin car j'ai trouvé bizarre de faire tout cela.

Alors en recherchant encore dans les menus, j'ai vu :


Sauvé, tout marche de manière simple :)

Petit logiciel pour copier puis modifier une partie de l'écran

Le logiciel shutter permet de sélectionner une partie de l'écran pour créer une image. On peut alors l'éditer afin de rajouter du texte, des flèches, flouter...

Le logiciel est simple et efficace.

Que demande le peuple !

26 oct 2016 : Sous Mint-17.3, j'ai dû installer les packets libgoo-canvas-perl et gnome-web-photo pour pouvoir bénéficier de l'outil interne d'édition des images capturées.

mardi 18 septembre 2012

fitnesse, Testing was interupted and results are incomplete

Sur un de mes projets, la suite fitnesse s'interrompt en plein milieu et affiche un encart "Testing was interupted and results are incomplete".



Auparavant, je n'avais pas ce problème. Je ne sais pas si c'est une restauration système suite à un crash disque qui en est la cause mais quoi qu'il en soit, la seule manière de contourner le problème a été de renommer les suites ou/et les pages pour que la taille du chemin soit moins importante.

Et là, miracle : ça fonctionne !!!

Mystères et boules de gomme...

lundi 17 septembre 2012

bash, stdin et stdout

Un petit rappel sur les redirections.

Le document http://tldp.org/LDP/abs/html/io-redirection.html#IOREDIRREF est très bien aussi.



bash, stdout, stderr, write, io, redirections

vendredi 14 septembre 2012

web, changer le style css du code pastebin affiché dans votre blog

Si vous affichez du code déposé sur pastebin et que les couleurs ne conviennent pas car elles ne sont pas en accord avec les couleurs de votre blog, il est possible de les personnaliser...

Dans mon cas, j'ai ajouté le code suivant



dans un gadget du blog que vous consultez actuellement (cf Conception>Mise en page).

Cela a pour effet de changer le css des éléments trouvés au chargement de la page.

jeudi 13 septembre 2012

bash, mv bluffant...

Lors d'une formation, j'ai vu cela... Ca m'a bluffé :)



bash, mv, remove version

mercredi 12 septembre 2012

web, utiliser pastebin et permettre une recherche sur son blog

Inclure du code déposé sur pastebin c'est bien... Malheureusement, le moteur de recherche du blog ne recherche pas dans le contenu déposé sur pastebin.

Pour permettre une recherche, on peut positionner des mots clés "invisibles" dans sa page.

pastebin, mot clé, search engine, moteur de recherche

Le moteur de recherche les verra et remontera l'article :)

mardi 11 septembre 2012

bash, séquences

Pour obtenir une suite de nombre qui font partie d'une séquence, il y a la commande seq. Il existe aussi une manière de le faire directement en bash en utilisant une expression du genre {x..y[..inc]}.
$ for i in {1..30..2}; do echo $i; done
1
3
5
7
9
11
13
15
17
19
21
23
25
27
29
$ seq 1 2 30
1
3
5
7
9
11
13
15
17
19
21
23
25
27
29
Attention toutefois, si les bornes sont définies dans des variables, il faudra un petit coup d'évaluation :
$ for i in $(eval echo "{$a..$b}"); do echo $i; done
1
2
3
4
5
6
7
8
9
10

bash, écrire sur stderr



redirection

vendredi 7 septembre 2012

Linux Mint Cinnamon, positionner la luminosité en ligne de commande

Il est possible d'utiliser les fichiers
  • /sys/class/backlight/acpi_video0/max_brightness
  • /sys/class/backlight/acpi_video0/brightness
afin de modifier la luminosité. Le script suivant prend un numérique (pourcentage entre 0 et 100) et modifie le fichier /sys/class/backlight/acpi_video0/brightness en conséquent.


Toutefois, pour exécuter ce fichier, il faudra être root (sudo ou SUID bit positionné sur l'exécutable une fois compilé).

Note: après rédaction de ce post, j'ai découvert que le paquet xbacklight met à disposition un utilitaire du même genre.
Il permet la même chose sauf en mode console...

jeudi 6 septembre 2012

bash, cas conditionel suivant la présence ou non d'un texte dans un fichier

Cela se fait simplement avec un grep...



if, grep, exit, status, bash

Bien que le test semble inversé, il est correct car la sortie du grep avec un status à 0 est un succès.

Le paragraphe "Conditional Shell Control Structures" de la page http://teaching.idallen.com/dat2330/04f/notes/exit_status.txt l'explique très bien.

bash, supprimer les espaces en début de ligne

Pour supprimer les espaces en début de ligne...



ou alors avec awk



awk, space, espace, trim, strip

bash, supprimer les tags html avec sed...

Dans certains scripts bash, on peut souhaiter supprimer les tags html d'un flux ou d'un fichier. Pour cela on peut utiliser la commande sed.



sed, tag, html

mercredi 5 septembre 2012

bash, récupérer le code de retour d'une commande au travers d'un pipe

L'exemple se passe de commentaires !
$ ls toto | head -n 1
ls: impossible d'accéder à toto: Aucun fichier ou dossier de ce type
$ echo $?
0
$ set -o pipefail 1
$ ls toto | head -n 1
ls: impossible d'accéder à toto: Aucun fichier ou dossier de ce type
$ echo $?
2
Pratique dans le cas d'un "curl $url | sed ... > $output" pour savoir si une erreur est remontée.

SUID bit

L'utilisation du bit SUID permet d'exécuter des scripts en se faisant passer pour un autre utilisateur. Cela peut être pratique sur sa machine personnelle pour appeler un script qui modifie la luminosité de l'écran... Mais aussi dangereux si la machine est utilisée par d'autres utilisateurs...

Attention, après recherche le bit suid ne fonctionne pas sur linux pour les scripts bash... Cela explique bien des choses que je ne comprenais pas !
$ cat hello.c
#include
#include

int main(int argc, char **argv[]) {
  printf("hello getuid=%d geteuid=%d\n", getuid(), geteuid());
}
$ gcc hello.c -o hello && sudo chown root:root hello && sudo chmod u+s hello && ls -l hello
-rwsr-xr-x 1 root root 8484 2012-09-05 13:43 hello
$ ./hello 
hello getuid=1000 geteuid=0
$ sudo chmod u-s hello
$ ./hello 
hello getuid=1000 geteuid=1000

mardi 4 septembre 2012

Linux Mint Cinnamon & Samsung ML-1865 (2)

En installant l'imprimante, le daemon smfpd se met en place et démarre automatiquement à chaque allumage.

Ce daemon n'est utile que dans le cas où l'imprimante Samsung est connectée à un port parallèle... Ce qui n'est pas le cas de ma ML-1865 !

Or ce daemon est gourmand en ressources et donc la batterie du portable diminue plus vite :(

Pour l'économiser, editer le fichier /etc/inid.d/smfpd et décommenter la ligne "exit 0". Le programme se terminera aussitôt lancé. Cette modification sera prise en compte au prochain démarrage.

mardi 28 août 2012

Linux Mint Cinnamon & wifi

Hier soir j'ai désactivé le Wifi dans la widget près de l'heure. Impossible de le réactiver, même un redémarrage ne fonctionne pas ! La fenêtre "Réseau" dans les préférences montrait un bouton où le mode avion était activé et rien n'y faisait, impossible de rétablir le wifi !! En attendant la réparation du bug...
$ rfkill list
0: hci0: Bluetooth
 Soft blocked: no
 Hard blocked: no
1: sony-wifi: Wireless LAN
 Soft blocked: yes
 Hard blocked: no
2: sony-bluetooth: Bluetooth
 Soft blocked: no
 Hard blocked: no
3: phy0: Wireless LAN
 Soft blocked: yes
 Hard blocked: yes
$ rfkill unblock 1
$ rfkill unblock 3

lundi 27 août 2012

Linux Mint Cinnamon & Samsung ML-1865

Impossible de faire fonctionner mon imprimante (une Samsung ML-1865) sur mon Sony SVS-1311 où j'ai installé un Linux Mint 13 Cinnamon.

L'imprimante était détectée  sur le réseau mais le modèle indiqué dans le panneau Imprimantes était Samsung ML-1750

Les impressions partaient mais les feuilles sortaient...
INTERNAL ERROR - Please use the proper driver
POSITION : 0x0 (0)
SYSTEM : h6fw_5.49/xl_op
LINE : 180
VERSION : SPL 5.49 10-20-2010 
Je suis allé sur le site de samsung pour télécharger le driver et l'ai installé... Même problème bien que le modèle indiqué dans le panneau soit mieux : Samsung ML-1860

Au final, après recherche sur google, je suis tombé sur la page suivante : http://forums.linuxmint.com/viewtopic.php?f=51&t=107026

J'ai ajouté deb http://www.bchemnet.com/suldr/ debian extra dans la liste des dépôts (menu configuration du gestionnaire de paquets Synaptic) et hop !

Un coup de :

$ su
$ wget -O - http://www.bchemnet.com/suldr/suldr.gpg | apt-key add -- - 
$ apt-get install samsungmfp-data samsungmfp-configurator-qt4 
  samsungmfp-configurator-data samsungmfp-driver 
  printer-driver-splix


On réinstalle l'imprimante et fini les
INTERNAL ERROR - Please use the proper driver
POSITION : 0x0 (0)
SYSTEM : h6fw_5.49/xl_op
LINE : 180
VERSION : SPL 5.49 10-20-2010 
Ouf!


EDIT : 7 Septembre 2016 les paquets samsungmfp-* ont été remplacés par suld-*

mercredi 8 août 2012

Bash, pattern substitution

Le manuel bash présente les syntaxes suivantes (voir)
  • ${parameter#word} et ${parameter##word} pour supprimer le plus court et le plus long préfix
  • ${parameter%word} et ${parameter%%word} pour supprimer le plus court et le plus long suffixe
  • ${parameter/pattern/string} pour substituer une chaîne à un pattern.
Il faut savoir que word peut être une regexp dans les 2 premiers cas. Mais il faut surtout savoir que la syntaxe du pattern diffère de celles que l'on connaît généralement... Sur wiki.bash-hackers.org :
?(<PATTERN-LIST>) Matches zero or one occurrence of the given patterns
*(<PATTERN-LIST>) Matches zero or more occurrences of the given patterns
+(<PATTERN-LIST>) Matches one or more occurrences of the given patterns
@(<PATTERN-LIST>) Matches one of the given patterns
!(<PATTERN-LIST>) Matches anything except one of the given patterns
D'où des choses zarbies du genre :
$ shopt -s extglob
$ v="LE temps PASSE vite"
$ echo ${v//+([[:upper:]])} 
temps vite
$ echo ${v%%+([[:lower:]])} 
LE temps PASSE
pattern

Bash, templating...

Pour faire un système de templating en bash (par exemple pour du mailing) on peut faire ainsi si l'on souhaite que le modèle soit dans un fichier à part :
$ cat template.txt 
<b>Hello '"${firstname}"'</b>
Bye '"${firstname}"'

$ for firstname in luc jeff gwen
> do 
>   while read line 
>   do 
>      eval echo "'$line'"
>   done <template.txt
> done
<b>Hello luc</b>
Bye luc
<b>Hello jeff</b>
Bye jeff
<b>Hello gwen</b>
Bye gwen
Avec les Here Documents, cela aurait été plus simple...

bash, affichage en mode intéractif

Dans un script bash, j'ai souhaité afficher un numéro de version lorsque celui-ci est lancé interactivement (ne reçoit pas de données depuis un pipe ou bien une redirection <).

Cela peut-être fait en utilisant l'option -t de la commande test.
if [ -t 0 ]; then
    echo "Version: $VERSION"
fi

mardi 7 août 2012

bash, lecture ligne à ligne et initialisation variables...

Dans la lignée du post précédent, il est possible de lire ligne à ligne et d'initialiser des variables directement pour des fichiers bien structurés.

Dans le cas d' /etc/password :
$ while IFS=: read user pass uid gid full home shell        
> do        
>   printf "$full -- Pseudo : $user UID : $uid GID : $gid Home : $home Shell : $shell\n"        
> done < /etc/passwd
root -- Pseudo : root UID : 0 GID : 0 Home : /root Shell : /bin/bash
daemon -- Pseudo : daemon UID : 1 GID : 1 Home : /usr/sbin Shell : /bin/sh
bin -- Pseudo : bin UID : 2 GID : 2 Home : /bin Shell : /bin/sh
sys -- Pseudo : sys UID : 3 GID : 3 Home : /dev Shell : /bin/sh

bash, boucles for

En bash, on aurait tendance à penser que "for line in $(cat fichier)" renvoie les lignes mais c'est faux car les séparateurs par défaut sont les espaces, tabulations... On itère donc sur la liste des mots...

Pour palier à ce soucis, on peut jouer en modifiant la variable IFS et en la restaurant ensuite.

Cela donne :
old_IFS=$IFS     
IFS=$'\n'      
for line in $(cat fichier)        
do        
   echo "La ligne est : $line"
done        
IFS=$old_IFS    
Une méthode plus subtile mais tout aussi jolie est d'utiliser read et while... Cela donne maintenant :
cat fichier | while read line || [[ $line ]]
do        
   echo "La ligne est : $line"
done        


C'est quand même moins tordu ;)

A noter, le [[ $line ]] permet de prendre en compte la dernière ligne s'il n'y a pas de retour chariot.

mysql, n'afficher que les vraies tables

Lorsque l'on utilise plusieurs bases de données, il arrive que l'on crée des vues d'une base vers une autre base...

La commande "show tables" n'est pas suffisante pour distinguer les tables des vues...
Mais voilà, on peut associer l'option full et compléter d'un where pour récupérer ce que l'on souhaite :

mysql> show full tables where Table_type='BASE TABLE';
où Table_type peut être :
  • BASE TABLE
  • VIEW

lundi 6 août 2012

changer d'ordinateur, calculer son amortissement...

Dernièrement, je voulais acheter un ordinateur portable mais je n'arrivais pas à passer le cap...

J'ai eu un macbook blanc que j'ai donné à ma mère...

Le matériel était excellent...

Depuis, il y a eu le passage aux macbook pro au prix de 1250€ (250€ de plus que le macbook que j'avais acheté à l'époque).

Et là, je me dis que c'est trop cher...

Normalement, plus le temps passe plus le prix du matériel technologique baisse (TV, ordis...).

Chez Apple, c'est l'inverse :(

J'ai hésité, hésité... Envie d'un mac mais le cerveau qui dit non...

Et puis... un petit tour sur la page wiki de l'amortissement et la lecture de la méthode softy.

Dans mon cas, si je garde l'ordi (sans pépin 4 ans) :
$ python
>>> prix=1250
>>> nb_annees=4
>>> [prix*x/365 for x in [a * 2.0 / (nb_annees * (nb_annees + 1)) for a in range(nb_annees, 0, -1)]]
[1.36986301369863, 1.0273972602739727, 0.684931506849315, 0.3424657534246575]
>>> prix=850
>>> [prix*x/365 for x in [a * 2.0 / (nb_annees * (nb_annees + 1)) for a in range(nb_annees, 0, -1)]]
[0.9315068493150684, 0.6986301369863014, 0.4657534246575342, 0.2328767123287671]
Soit .44€ de moins par jour pour un PC la première année... Ce qui équivaut tout de même à 160€ la première année. C'est énorme.

Finalement, je repasse aux PC...

... et j'attends avec impatience mon Sony VAIO

bye apple...

vendredi 3 août 2012

bash, lister les commandes disponibles

Pour lister les commandes disponibles, on peut utiliser la commande bash intégrée compgen:

  • compgen -c liste la liste de toutes les commandes que l'on peut exécuter
  • compgen -a liste la liste de tous les alias que l'on peut exécuter
  • compgen -b liste la liste de toutes les commandes intégrées (built-in) que l'on peut exécuter
  • compgen -k liste la liste de tous les mots clés que l'on peut exécuter (if/then...)
Sur ma machine, la répartition des commandes en fonction de la première lettre...

$ compgen -c | cut -c 1 | sort | uniq -c | sort -nr | column
    392 p     122 f      61 h      12 k       1 N
    359 _     118 r      37 w       8 V       1 M
    222 m     115 i       3 7       6 y       1 G
    222 g     114 u      33 j       6 q       1 C
    207 s     114 a      30 v       3 [       1 }
    154 x      96 t      25 z       2 X       1 {
    143 c      95 b      22 o       2 H       1 ]
    131 d      78 n       2 2       2 .       1 !
    130 l      77 e       1 4       1 P       1 :

mardi 31 juillet 2012

bash, timeout

L'astuce du jour !

Si un script appelle une commande qui peut ou non rendre la main (chemin réseau) et que l'on souhaite toujours la récupérer, on peut faire appel à la commande timeout.
$ timeout 3 ssh user@host.example.com:~/ ls
Cela est très pratique lorsque la commande utilisée n'a pas prévu de rendre la main suite à un timeout spécifié en paramètre.

bash, récupérer le code de sortie d'un sous-shell

Ci-dessous on récupère le code de sortie d'un sous-shell afin d'effectuer un traitement particulier qui fait des pipes.

lundi 30 juillet 2012

bash, sort

Bien souvent, on recherche des fichiers avec la commande find dans une arborescence. L'option "-printf format" permet d'afficher une ligne pour chaque entrée trouvée. Le format permet d'afficher les dates/heures, le basename de l'entrée...

$ find src/main/webapp/changes.log -printf '%f\n'
changes.log
$ find src/main/webapp/changes.log -printf '%h\n'
src/main/webapp
Ca peut être bien utile de connaître cette option ;)

vendredi 27 juillet 2012

bash, initialisation des variables

Use a default value

${PARAMETER:-WORD}
${PARAMETER-WORD}

If the parameter PARAMETER is unset (never was defined) or null (empty), this one expands to WORD, otherwise it expands to the value of PARAMETER, as if it just was ${PARAMETER}. If you omit the : (colon), like shown in the second form, the default value is only used when the parameter was unset, not when it was empty.


Assign a default value

${PARAMETER:=WORD}
${PARAMETER=WORD}

This one works like the using default values, but the default text you give is not only expanded, but also assigned to the parameter, if it was unset or null. Equivalent to using a default value, when you omit the : (colon), as shown in the second form, the default value will only be assigned when the parameter was unset.


Pour résumer :
  • Le ":" indique que l'on remplace par l'expansion de WORD même si PARAMETER est vide (positionné mais vide)
  • Le "=" à la différence de ":" indique qu'en plus PARAMETER sera affecté par l'expansion de WORD si celle-ci est utilisée.

jeudi 26 juillet 2012

bash, génerer des mots de passe

Vous n'avez pas envie de réfléchir pour générer un mot de passe ? Voici une petite méthode à mettre dans votre bashrc qui vous facilitera le choix ;)
function genpass() {
    LENGTH=${1:-10}
    if [ "$2" == "0" ]; then
      CHAR="[:alnum:]"
    elif [ "$2" == "1" ]; then
      CHAR="[:graph:]"
    elif [ "${2:0:1}" != "+" ]; then
      echo "Erreur: vous devez spécifier les caractères acceptés"
      echo "Exemple: $ genpass 32 '+[:alnum:]_'"
      echo "2na2lku4FBqM7eNPC_aooahXV0c8GxI7"
      return
    else
      CHAR="${2:1}"
    fi
    cat /dev/urandom | tr -cd "$CHAR" | head -c $LENGTH
    echo
}

$ # génère un mot de passe de 10 caractères avec lettres et chiffres
$ genpass 10 0
toSGXjycaa
$ # génère un mot de passe de 10 caractères avec lettres, chiffres et symboles
$ genpass 10 1
^:5-LONhtn
$ # génère un mot de passe de 10 caractères avec ce que vous spécifiez après le +
$ genpass 10 "+abc[:digit:]"
b5836a29a2

mercredi 25 juillet 2012

bash, convertir la casse d'un flux

Pour faire des recherches de noms de fichiers correspondant à un certain pattern, j'ai eu besoin de changer la casse des noms...

Ici je recherche les fichiers qui contiennent "erreur" dans leur noms.
$ ls | tr '[:upper:]' '[:lower:]' | grep erreur

lundi 23 juillet 2012

python, obtenir la liste des fichiers .java

Pour récupérer la liste des .java dans une arborescence et sa sous-arborescence, on peut utiliser le code suivant :
import fnmatch
import os

matches = []
for root, dirnames, filenames in os.walk('/path/to/the/directory'):
  for filename in fnmatch.filter(filenames, '*.java'):
      matches.append(os.path.join(root, filename))

vendredi 20 juillet 2012

python, ouvrir un fichier en utf8

Pour ouvrir un fichier en utilisant un encodage particulier, il est possible de passer par le module codecs...
with codecs.open('the_file.csv', 'r', 'utf8') as f:
    l = f.readline()
    ...

bash, nombres en hexadécimal

Si pour une raison ou une autre, vous devez jouer à afficher des nombres héxadécimal en base 10 ou vice-versa, vous pouvez passer par la commande printf
$ printf "%x" 174
ae
$ printf "%d" 0xae
174
$ printf "%d\n" \'A
65

bash, tri par longueur de ligne

La commande sort ne permet pas de trier en fonction de la longueur des lignes. C'est dommage mais on peut utiliser awk, combiné avec sort pour avoir le même résultat.
$ cat /usr/share/dict/words 
   | awk '{ print length(), $0 | "sort -n" }' 
   | cut -d ' ' -f 2-

mardi 17 juillet 2012

Jetty 8 et paramètres d'initialisation

La documentation sur le net est obscure quant à la manière d'initialiser les paramètres de contexte avec jetty (hors du web.xml dans le webdefault.xml (équivalent du host.xml de tomcat)).

J'ai cherché, cherché et cherché...

Et puis j'ai trouvé :) Le nouveau code est le suivant :

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" 
"http://www.eclipse.org/jetty/configure.dtd">

<Configure class="org.eclipse.jetty.webapp.WebAppContext">

  <Set name="sessionHandler">
    <New class="org.eclipse.jetty.server.session.SessionHandler">
      <Arg>
        <New class="org.eclipse.jetty.server.session.HashSessionManager">
          <Set name="storeDirectory">jetty/sessions</Set>
        </New>
      </Arg>
    </New>
  </Set>
  <Get name="ServletContext">
    <Call name="setInitParameter">
      <Arg>driverSQL</Arg>
      <Arg>com.mysql.jdbc.Driver</Arg>
    </Call>
  </Get>
</Configure>
L'ancien code était le suivant :

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" 
"http://www.eclipse.org/jetty/configure.dtd">

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
  <Set name="sessionHandler">
    <New class="org.eclipse.jetty.server.session.SessionHandler">
      <Arg>
 <New class="org.eclipse.jetty.server.session.HashSessionManager">
   <Set name="storeDirectory">jetty-sessions</Set>
 </New>
      </Arg>
    </New>
  </Set>
  <Set name="initParams">
    <Map>

      <Entry>
 <Item>driverSQL</Item>
 <Item>com.mysql.jdbc.Driver</Item>
      </Entry>
</Map>
  </Set>
</Configure>
Ce n'est pas très différent mais il fallait trouver, la documentation en ligne n'en parlant pas ! En espérant que ça vous fasse économiser de précieuses heures... A vos servletContext.getInitParameter !!!

Servlets et encoding...

J'ai eu des petit soucis avec le charset...

Un svi envoyait bien "text/csv; charset=utf-8" (curl) mais pour une raison x ou y, mon ihm qui l'appelait voyait "text/plain;charset=ISO-8859-1" ce qui faisait que le fichier était mal affiché.

Dans le code ci-dessous, j'ouvre une connection et récupère le charset afin d'initialiser l'InputStreamReader et commencer les lectures...
        URL url = new URL(sviUrl);
        URLConnection conn = url.openConnection();  
        conn.connect();
        InputStream in = null;
        try {
            String charset = "ISO-8859-1";
            String contentType = conn.getContentType(); 
            if (contentType != null && contentType.indexOf(";charset=") >= 0) {
                contentType = contentType.substring(contentType.indexOf(";charset=")+9);
                charset = contentType.trim();
            }
            in = conn.getInputStream();
            InputStreamReader inr = new InputStreamReader(url.openStream(), charset);
            Writer out = resp.getWriter();
            try {
                IOUtils.copy(inr, out);
            } finally {
                inr.close();
            }
        } finally {
            if (in != null) {
                in.close();
            }
        }

lundi 16 juillet 2012

mysql, importer un fichier csv

Pour charger un fichier csv dans une table on peut utiliser la commande suivante :

mysql> load data infile '/path/to/file.csv' into table mytable character 
set 'utf8' fields terminated by ';' IGNORE 1 lines;
Query OK, 786 rows affected (0.13 sec)
Records: 786  Deleted: 0  Skipped: 0  Warnings: 0
Ici, le charset est spécifié et la première ligne du fichier CSV est ignorée (titre des colonnes).

bash, récupérer les noms de fichiers renvoyés par diff -rb --brief

La commande "diff -rb --brief" génère des lignes user-friendly qui sont malheureusement localisées.
Pour récupérer le nom des fichiers qui diffèrent, il est possible d'utiliser la commande lsdiff du package patchutils.
$ sudo apt-get install patchutils
$ files_to_transfer=$(diff -x '*.zip' -x '.svn' -rb -U 1 
      fitnesse-install/FitNesseRoot/FrontPage/Project 
      $dist_install/FrontPage/Project | lsdiff)

python, unicode...

>>> unicodedata.name(u"é")
'LATIN SMALL LETTER E WITH ACUTE'
>>> print u"e accent aigu : \N{LATIN SMALL LETTER E WITH ACUTE}"
e accent aigu : é

python, bash et encoding...

En python, lorsque la sortie n'est pas de type tty, l'encoding est "ascii" ce qui provoque des erreurs sur les caractères accentués. La solution est d'exporter la variable PYTHONIOENCODING qui définit l'encoding à utiliser.
$ python a.py 
é
$ python a.py | cat
Traceback (most recent call last):
  File "a.py", line 3, in 
    print u"\xe9";
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 0: 
ordinal not in range(128)
$ export PYTHONIOENCODING=utf-8 
$ python a.py | cat
é
$
Une autre solution est de changer l'encoding de stdout...
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import codecs
import locale

sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)

print u"é"

vendredi 13 juillet 2012

bash, moreutils

Je viens de découvrir un paquet mettant à disposition des outils bien sympathiques pour faciliter l'écriture de scripts bash. Il s'agit du paquet moreutils
$ sudo apt-get install moreutils
Exemples d'utilisation :
Pour envoyer un mail si des données sont lues sur l'entrée standard...
$ find . -name core | ifne mail -s "Core files found" root

Pour réécrire dans un même fichier sans avoir à créer un fichier temporaire...
$ sed '...' file | grep '...' | sponge file

mardi 3 juillet 2012

url et mot de passe

Pour réduire mes logs, je viens d'utiliser la syntaxe suivante :
http://user:password@host:port...
Ici, le mot de passe doit être encodé lorsque des caractères non alphanumériques sont utilisés (comprenez 0-9a-zA-Z). Chaque caractère non alphanumérique doit être encodé avec le format "%xx" où xx sera remplacé par le code hexadécimal du caractère.
Exemple: 

def conv(pw):
    r = ''
    for c in pw:
 if not c.isalpha():
     r += '%' + '%X' % ord(c)
 else:
     r += c
    return r 

>>> conv(u'tuéàtu')
u'tu\xe9\xe0tu'

lundi 2 juillet 2012

bash, fautes sur commande cd...

Si l'option cdspell est positionnée, les fautes de frappe dans la commande cd seront corrigées. Les erreurs prises en compte seront les caractères transposés, les caractères manquants et les caractères trop nombreux. Si un correctif est trouvé, le chemin utilisé pour le cd sera affiché et la commande exécutée. L'option n'est utilisée que dans le cas des shells intéractifs.
$ shopt -s cdspell

$ cd /ec
/etc

$ shopt -u cdspell

mardi 26 juin 2012

mysql, export d'une table au format csv

Il est possible d'exporter le contenu d'une table dans un fichier via une requête mysql. Voici la syntaxe :
SELECT champ1,champ2 FROM matable INTO OUTFILE 'lefichier.csv' 
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"';

vendredi 22 juin 2012

bash, appel callback à la sortie...

Il est possible en bash d'appeler des méthodes lorsque de la fin du script est atteinte et ce même s'il y a une erreur. Ci-dessous, le script appellera cleanup_err puis cleanup_ok lorsque false sera atteint.
#!/bin/bash
set -e

function cleanup_err {
  echo cleanup_err
}

function cleanup_ok {
  echo cleanup_ok
}
  
trap cleanup_ok EXIT
trap cleanup_err ERR
  
false
C'est bien pratique pour nettoyer les fichiers et répertoires temporaires :)

vendredi 15 juin 2012

emacs, afficher le nom de fichier complet dans la modeline


; show the full path and filename in the message area

(defun path ()
  (interactive "*")
  (message "%s" buffer-file-name)
  )

; set filename only in the Modeline display
(defun short-file-name ()
  "Display the full file path and name in the modeline"
  (interactive "*")
  (setq-default mode-line-buffer-identification '("%12b"))
  )

; set the full path and filename only in the Modeline display
(defun long-file-name ()
  "Display the full file path and name in the modeline"
  (interactive "*")
  (setq-default mode-line-buffer-identification
    '("%S:"(buffer-file-name "%f")))
  )

(long-file-name)

mercredi 6 juin 2012

Graphiques en ligne

Pour tracer des droites, voir leur intersections... http://fooplot.com/

jeudi 24 mai 2012

bash, sommer une colonne....

Comment sommer des valeurs provenant d'un fichier ou de la sortie standard. Voici plusieurs solutions...


A la awk :
printf "1\n2\n3\n" | awk '{s+=$1} END {print s}'

A la tr :
printf "1\n2\n3\n"| tr '\n' '+' | sed -e 's/+$/\n/' | bc

A la paste :
printf "1\n2\n3\n" | paste -sd+ | bc

Moi je choisis la troisième solution. Elle est plus courte, simple et efficace !!

bash, presse-papier

Il est possible de copier un fichier ou la sortie standard dans le presse papier... Il suffit d'utiliser la commande
xsel
Exemple :

$ cat /etc/fstab | xsel -b

La commande xclip un peu similaire permet la même chose...

$ sudo apt-get install xclip# Downloads and installs xclip
$ xclip -sel clip < ~/.ssh/id_rsa.pub

python, marre des accents en java : remplacez les par de l'unicode !


$ cat tounicode.py
#!/usr/bin/python

import re
import sys

s = sys.argv[1].decode('utf8')

print re.sub('\\\\x', '\\u00', re.sub('\'$', '', re.sub('^u\'', '', repr(s))))

$ python tounicode.py "salut beauté"
salut beaut\u00e9

mardi 15 mai 2012

svn, revert d'un commit

Un mauvais commit sur un fichier ? Pas de problème, il peut être inversé :)
svn merge -c -[bad_revision] [repository_url]
Attention au - devant la mauvaise révision... Ne restera plus qu'à commiter l'inversion

vendredi 4 mai 2012

mysqlimport

Le fichier doit porter le nom de la table à l'extension près. Ici les options utilisées sont :
  • --delete pour vider la table avant l'import
  • --fields-terminated-by pour le séparateur entre les champs
  • --lines-terminated-by pour le caractère de fin de ligne (ici DOS/WINDOWS)

mysqlimport 
--fields-terminated-by=\; 
--lines-terminated-by="\\r\\n" 
-v 
--delete 
-utest -ptest -hlocalhost BASE TABLE.csv

python, conversion d'un fichier d'iso8859 en utf8

#!/bin/python

import sys

if len(sys.argv) != 3:
    print 'usage: python iso8859toutf8.py [infile] [outfile]'
    sys.exit(0)

with open(sys.argv[2], 'w') as fout:
    with open(sys.argv[1], 'r') as fin:
        data = fin.read().decode('iso8859')
        while data:
            fout.write(data.encode('utf8'))
            data = fin.read().decode('iso8859')

mardi 24 avril 2012

python, envoi d'un mail avec un fichier en attachement


import smtplib
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart
from email import Encoders

msg = MIMEText('le texte du message')
msg['From']='crontab-do-not-reply@example.com'
msg['To']='destinataire1@example.com,destinataire2@example.com'
msg['Subject']='le titre du message'

texte = MIMEText(u'Le \xe9but du message', 'plain', 'utf-8')
msg.attach(texte)

content = MIMEBase('text', 'csv')
content.set_payload(csvbuffer)
Encoders.encode_base64(content)
content.add_header('Content-Disposition', 'attachment', filename='fichier.csv')
msg.attach(content)

smtp = smtplib.SMTP(mailhost)
smtp.sendmail('crontab-do-not-reply@example.com', ['destinataire1@example.com', 
                'destinataire2@example.com'], msg.as_string())
smtp.quit()

python, envoi d'un mail texte


import smtplib
from email.MIMEText import MIMEText

msg = MIMEText('le texte du message')
msg['From']='crontab-do-not-reply@example.com'
msg['To']='destinataire1@example.com,destinataire2@example.com'
msg['Subject']='le titre du message'

smtp = smtplib.SMTP(mailhost)
smtp.sendmail('crontab-do-not-reply@example.com', ['destinataire1@example.com', 
                'destinataire2@example.com'], msg.as_string())
smtp.quit()

mardi 10 avril 2012

Quelle est la plus longue...

... ligne ! Elle peut être donnée via l'option méconnue -L de la commande wc...
$ find . -name '*.java' | sed -e 's/.*\///' | wc -L
73

mardi 3 avril 2012

Python, parseur XML

BeautifulSoup est une petite bibliothèque fort sympathique que j'ai utilisée pour parser et publier du contenu dans des pages Wiki... Le tout en python :)

Elle fait sa "soupe" pour parser et faire économiser des heures aux pauvres développeurs que nous sommes !
Site de BeautifulSoup

jeudi 29 mars 2012

Xpath et dernier élément d'une liste...

Pour ne récupérer que le dernier élément d'une liste (attention aux parenthèses) :

(.//td[@name='ID']/..)[last()]

XPath et recherche vide...

Recherche des lignes d'un tableau ayant dans la 3e colonne une valeur à XXX :

Si XXX est vide :

//table/tr/td[3][not(text())]/..

Sinon

//table/tr/td[3][text() = '" + XXX + "']/..

mercredi 21 mars 2012

Listes de mots...

http://www.3zsoftware.com/fr/wordmagic/listes.php

jeudi 15 mars 2012

Mysqldump : un insert par tuple...

mysqldump --skip-extended-insert ...


génère un INSERT par ligne de la table.

lundi 27 février 2012

ascii


$ figlet
ascii
                _ _ 
  __ _ ___  ___(_|_)
 / _` / __|/ __| | |
| (_| \__ \ (__| | |
 \__,_|___/\___|_|_|

vendredi 17 février 2012

Barême

$ export LC_NUMERIC=C; for S in $(seq 0 0.25 25); 
do F=$(echo scale=2\; $S*20.0/25.0|bc); echo $S $F; done | column 
0.00 0  5.25 4.20 10.50 8.40 15.75 12.60 21.00 16.80
0.25 .20 5.50 4.40 10.75 8.60 16.00 12.80 21.25 17.00
0.50 .40 5.75 4.60 11.00 8.80 16.25 13.00 21.50 17.20
0.75 .60 6.00 4.80 11.25 9.00 16.50 13.20 21.75 17.40
1.00 .80 6.25 5.00 11.50 9.20 16.75 13.40 22.00 17.60
1.25 1.00 6.50 5.20 11.75 9.40 17.00 13.60 22.25 17.80
1.50 1.20 6.75 5.40 12.00 9.60 17.25 13.80 22.50 18.00
1.75 1.40 7.00 5.60 12.25 9.80 17.50 14.00 22.75 18.20
2.00 1.60 7.25 5.80 12.50 10.00 17.75 14.20 23.00 18.40
2.25 1.80 7.50 6.00 12.75 10.20 18.00 14.40 23.25 18.60
2.50 2.00 7.75 6.20 13.00 10.40 18.25 14.60 23.50 18.80
2.75 2.20 8.00 6.40 13.25 10.60 18.50 14.80 23.75 19.00
3.00 2.40 8.25 6.60 13.50 10.80 18.75 15.00 24.00 19.20
3.25 2.60 8.50 6.80 13.75 11.00 19.00 15.20 24.25 19.40
3.50 2.80 8.75 7.00 14.00 11.20 19.25 15.40 24.50 19.60
3.75 3.00 9.00 7.20 14.25 11.40 19.50 15.60 24.75 19.80
4.00 3.20 9.25 7.40 14.50 11.60 19.75 15.80 25.00 20.00
4.25 3.40 9.50 7.60 14.75 11.80 20.00 16.00
4.50 3.60 9.75 7.80 15.00 12.00 20.25 16.20
4.75 3.80 10.00 8.00 15.25 12.20 20.50 16.40
5.00 4.00 10.25 8.20 15.50 12.40 20.75 16.60

Placements

Tu as de l'argent et tu comptes le placer à un meilleur taux... Combien de temps faudra-t-il bloquer cet argent à ce meilleur taux pour qu'il rapporte à nouveau (c'est à dire que la quinzaine perdue soit amortie...)


>>> Tde=2.25
>>> Tvers=2.8
>>> import math
>>> rattrappeEn=int(math.ceil(Tde/(Tvers-Tde)))
>>> rattrappeEn
5
>>> Tde*(rattrappeEn+2)>Tvers*rattrappeEn
True
>>> Tde*(rattrappeEn+1)>Tvers*rattrappeEn
False
La somme doit rester pendant 5 quinzaines pleines (sans compter la quinzaine de reception de la somme) pour qu'elle commence à rapporter à nouveau.

mercredi 18 janvier 2012

Script python qui affiche les couleurs dans un terminal

class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'

    def disable(self):
        self.HEADER = ''
        self.OKBLUE = ''
        self.OKGREEN = ''
        self.WARNING = ''
        self.FAIL = ''
        self.ENDC = ''

print '===> ' +  bcolors.OKGREEN + where + bcolors.ENDC + " " + href

lundi 16 janvier 2012

Copie de fichier en concervant l'arborescence

$ mkdir toto/tutu/titi/
$ touch toto/tutu/titi/grosminet.txt
$ mkdir tata
$ cp --parents toto/tutu/titi/grosminet.txt tata
$ tree
.
├── tata
│   └── toto
│       └── tutu
│           └── titi
│               └── grosminet.txt
└── toto
    └── tutu
        └── titi
            └── grosminet.txt