Prise ce jour, Mercredi 5 Décembre 2012
J'entrepose ici mes découvertes linux, bash, python et java que je souhaite partager et mettre de côté...
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
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 !
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 { }
jeudi 8 novembre 2012
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 :
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)
Je suis tombé dessus en regardant les PKGBUILD de dwm comme (celui-ci)
vendredi 2 novembre 2012
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 :)
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
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/
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 :)
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
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
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é.
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
mercredi 10 octobre 2012
bash, récupérer le nombre de colonnes du terminal
Pour centrer :
Ou afficher un séparateur :
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 :
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.
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...
Permet de supprimer le premier mot de chaque ligne du buffer.
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
- q pour terminer l'enregistrement de 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 :
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...
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...
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 :
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...
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.
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.
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
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 :)
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.
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...
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.
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.
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.
Le moteur de recherche les verra et remontera l'article :)
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
vendredi 7 septembre 2012
Linux Mint Cinnamon, positionner la luminosité en ligne de commande
Il est possible d'utiliser les fichiers
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...
- /sys/class/backlight/acpi_video0/max_brightness
- /sys/class/backlight/acpi_video0/brightness
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...
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.
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
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 !
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.
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...
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 :
On réinstalle l'imprimante et fini les
EDIT : 7 Septembre 2016 les paquets samsungmfp-* ont été remplacés par suld-*
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-1860Au 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.
?(<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.
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 :
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 :
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.
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 :
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) :
Finalement, je repasse aux PC...
... et j'attends avec impatience mon Sony VAIO
bye apple...
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...)
$ 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.
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 :
${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.
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 :
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...
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.
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
jeudi 28 juin 2012
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
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 :
A la tr :
A la paste :
Moi je choisis la troisième solution. Elle est plus courte, simple et efficace !!
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
La commande xclip un peu similaire permet la même chose...
xselExemple :
$ 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
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()]
(.//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 + "']/..
Si XXX est vide :
//table/tr/td[3][not(text())]/..
Sinon
//table/tr/td[3][text() = '" + XXX + "']/..
mercredi 21 mars 2012
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
$ 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
Inscription à :
Articles (Atom)