Ruby vs Shell 2

Publié par Yannick Francois Wed, 05 Mar 2008 21:40:00 GMT

Que je n’aime pas ce genre de comparaison. Ou plutôt ce que je n’aime pas c’est de chercher un vainqueur. En fait je voulais vous raconter une petite histoire informatique.

Un jour, chez mon actuel client, je me suis retrouvé face a un cas d’école: faire un programme pour réaliser une purge de la base de donnée, mais pas entièrement, juste quelque table fonctiono-transactionnelle.

Une bonne chose pour moi, un programme existe déjà dans le foutoir^la boite à outil de l’équipe en place. Ce programme va me permettre d’extraire la liste des tables dépendantes de celle que je veut purger. J’appel ce programme (réalisé dans un langage propriétaire, comme l’application) en passant en paramètre la table que je souhaite supprimer, et lui va aller déclencher les divers trigger en interceptant les erreurs pour pouvoir faire la liste de toutes les tables dépendantes. Bien, je répète l’opération pour toutes les tables que j’ai à nettoyer

A la sorti je me retrouve avec un gros fichier texte, contenant plusieurs fois le même nom de table à divers endroit du fichier, pas très pratique. Il faut que je nettoie tout ça. Apparemment mes collègues font ça à la main habituellement… Moi c’est hors de question. L’informatique c’est justement fais pour faciliter le travail non ?

Alors je lance cygwin (heureusement qu’il est autorisé chez mon client celui là, sinon j’aurais pleuré !!) et je regarde quelque manpage pour vérifier les commandes à utiliser. Je trouve mon bonheur, et le dieu pipe va grandement m’aider sur le coup:

cat fichierlistedetables | tr A-Z a-z | sort | uniq > listedetableuniquetrier
  1. La commande cat permet de lire le contenu d’un fichier.
  2. Dieu pipe va ensuite transférer ce contenu à la commande tr qui elle va me mettre le contenu en minuscule (c’est plus pratique pour trier (c’est le A-Z a-z qui précise le type de transformation à appliquer au contenu).
  3. Dieu pipe intervient encore pour passer ce contenu minuscule à la commande sort qui va elle, comme sont nom l’indique, trier le contenu.
  4. Dieu pipe une dernière fois va passer le contenu minuscule trié à la commande uniq qui comme sont nom l’indique encore, va éliminer les doublons.
  5. Dieu pipe passe la main ici à la reine > qui va me permettre d’écrire le résultat de tout ça dans un fichier et non à l’écran.

Je me retrouve avec un fichier parfait pour faire ma purge.

C’est bien beau, mais une question trottais dans ma tête: Comment faire cela en Ruby ? Est-ce que j’y arriverais en une ligne aussi ?

Et bien comme d’hab, oui c’est faisable, et oui avec Ruby on peut le faire en une ligne.

Quel intérêt ? Dans le mien auccun, à part mon plaisir. Mais si ce script devais être re-utilisé, ou bien intégrer à un outil plus vaste, cela aurait tout de suite plus d’intérêt :)

Voilà ce que ça donne:

File.open("#{ARGV[0]}_usorted","a") {|content| 
content << ((IO.readlines(ARGV[0])).collect {|line| line.downcase}).uniq
}

Bon, en une ligne c’est un poil abusé et pas lisible c’est pour cela que je le présente sur plusieurs :), mais c’est faisable

Pour faire cela, une bonne lecture des objets Array, IO et File iront très bien :)

OpenBSD - USB Mount 2

Publié par Yannick Francois Fri, 01 Feb 2008 19:17:00 GMT

Voici deux petit script shell pour les utilisateurs d’OpenBSD et autres… Enfin uniquement ceux qui utilise ce genre de système sur leur(s) desktop(s).

Le montage/démontage (pas avec un tournevis hein, je dis ça pour Terckan surtout ;-)), en fait, c’est le fait de rendre disponible un périphérique externe sur son OS. Et de nos jour y’en a un paquet: Clef usb, baladeur numérique, apareil photo numérique, lecteur de carte, disque dur externe, imprimante, scanner…

OpenBSD et d’autres OS utilisent le démons hotplugd pour surveiller l’activité de branchement du matériel à connectique USB. Sous OpenBSD (utilisateurs d’autres *nix utilisant hotplug: attention, il y a peut-être des petites adaptations à faire) on modifie le /etc/rc.conf.local pour y ajouter l’activation du démon hotplug:

hotplugd_flags="" 

Voilà, avec ça, le démon nous remontera des infos sur la connexion de notre matériel. Dans le dmesg sous OpenBSD ça donne ça:

umass0 at uhub1 port 1 configuration 1 interface 0 "USB 2.0 Flash Disk" rev 2.00/1.00 addr 2
umass0: using SCSI over Bulk-Only
scsibus2 at umass0: 2 targets
sd1 at scsibus2 targ 1 lun 0: <USB 2.0, Flash Disk, 5.00> SCSI2 0/direct removable
sd1: 4052MB, 516 cyl, 255 head, 63 sec, 512 bytes/sec, 8300032 sec total

Et dans le log d’activité des démons (/var/log/daemon):

Feb  1 20:27:39 libellule hotplugd[18399]: sd1 attached, class 2
Feb  1 20:27:39 libellule hotplugd[18399]: scsibus2 attached, class 0
Feb  1 20:27:39 libellule hotplugd[18399]: umass0 attached, class 0

hotplug va donc appeler un script lors du branchement d’apareil, et un lors du débranchement: /etc/hotplug/attach pour le branchement et /etc/hotplug/detach pour le débranchement. Ces deux scripts ne sont en général pas fourni, à chacun de ce les concocter.

On en trouve plusieurs sur le net, moi je suis parti d’un trouvé sur undeadly que j’ai un peu modifier. Vous les trouverez dans ma zone: zone.typouype.org/attach et zone.typouype.org/detach.

Je risque très certainement de les retoucher encore (aahh le refactoring, quel plaisir ! :)), je tacherais de vous le signaler (si vous décidé de les utiliser, ça pourrais servir. D’ailleurs n’hésitez pas à me signaler les améliorations diverses que vous pourriez apporter dessus hein ! :)

En gros, ces scripts monte la ressources branché dans /mnt puis crée un lien dans le /home de l’utilisateur actuellement connecté au système (faudrais voir avec plusieurs personne loggué ce que ça donne :-/) dans un repertoire /home/${user}/mount.

J’aimerais bien changer certaines chose rapidement comme les droits des fichiers ainsi disponible, les points de montages, et bien d’autres chose que je n’ai pas en tête.

Amusez vous bien :)

edit: Correction des blockquote textile. Merci Zifro de m’avoir signalé les “bq.” qui trainait.