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 :