From b9e22325bb46e2611a73e54a3f0ade31800d1bd9 Mon Sep 17 00:00:00 2001 From: Sébastien Dailly Date: Fri, 9 May 2014 14:30:46 +0200 Subject: Moved to pelican 3.3 --- content/Informatique/2008-09-15-fail2ban.rst | 192 ++++++++++++++++++ content/Informatique/2008-11-07-chiffrage.rst | 77 +++++++ content/Informatique/2009-02-19-wiimote1.rst | 60 ++++++ content/Informatique/2009-03-11-wiimote.rst | 123 +++++++++++ content/Informatique/2009-03-11-wiimote_fr.rst | 115 +++++++++++ content/Informatique/2009-10-18-backup.rst | 81 ++++++++ content/Informatique/2010-02-17-invisible.rst | 103 ++++++++++ content/Informatique/2010-04-08-chroot.rst | 236 ++++++++++++++++++++++ content/Informatique/2010-06-06-awesome.rst | 105 ++++++++++ content/Informatique/2010-06-11-vala.rst | 165 +++++++++++++++ content/Informatique/2010-10-04-rst.rst | 186 +++++++++++++++++ content/Informatique/2011-06-07-sftp.rst | 138 +++++++++++++ content/Informatique/2012-02-18-elinks.rst | 47 +++++ content/Informatique/2012-03-26-navit.rst | 226 +++++++++++++++++++++ content/Informatique/2012-08-12-apache.rst | 46 +++++ content/Informatique/2012-08-18-rstodt.rst | 68 +++++++ content/Informatique/2012-11-09-fonctionnel.rst | 190 +++++++++++++++++ content/Informatique/2013-04-20-gueule1.rst | 65 ++++++ content/Informatique/2013-04-26-insecable.rst | 139 +++++++++++++ content/Informatique/2013-05-07-guiderstodt.rst | 164 +++++++++++++++ content/Informatique/2013-05-08-fcron2cron_en.rst | 62 ++++++ content/Informatique/2013-05-09-fcron2cron.rst | 123 +++++++++++ content/Informatique/2013-05-23-ocamlfind_en.rst | 63 ++++++ content/Informatique/2013-05-23-ocamlfind_fr.rst | 77 +++++++ content/Informatique/2013-06-02-roi_con.rst | 128 ++++++++++++ content/Informatique/2013-06-08-unplugged.rst | 72 +++++++ content/Informatique/2013-07-21-shifty.rst | 176 ++++++++++++++++ content/Informatique/2013-07-24-projet_libre.rst | 83 ++++++++ content/Informatique/2013-09-13-ocaml_ppx.rst | 97 +++++++++ content/Informatique/2013-10-12-rst_graphviz.rst | 136 +++++++++++++ content/Informatique/2013-12-19-ssl_proxy.rst | 128 ++++++++++++ content/Informatique/2014-02-09-ocaml_gtk.rst | 206 +++++++++++++++++++ content/Informatique/apache.rst | 46 ----- content/Informatique/awesome.rst | 105 ---------- content/Informatique/backup.rst | 81 -------- content/Informatique/chiffrage.rst | 77 ------- content/Informatique/chroot.rst | 236 ---------------------- content/Informatique/elinks.rst | 47 ----- content/Informatique/fail2ban.rst | 192 ------------------ content/Informatique/fcron2cron.rst | 123 ----------- content/Informatique/fcron2cron_en.rst | 62 ------ content/Informatique/fonctionnel.rst | 190 ----------------- content/Informatique/gueule1.rst | 65 ------ content/Informatique/guiderstodt.rst | 164 --------------- content/Informatique/insecable.rst | 139 ------------- content/Informatique/invisible.rst | 103 ---------- content/Informatique/navit.rst | 224 -------------------- content/Informatique/ocaml_gtk.rst | 206 ------------------- content/Informatique/ocaml_ppx.rst | 97 --------- content/Informatique/ocamlfind_en.rst | 63 ------ content/Informatique/ocamlfind_fr.rst | 77 ------- content/Informatique/projet_libre.rst | 83 -------- content/Informatique/roi_con.rst | 127 ------------ content/Informatique/rst.rst | 186 ----------------- content/Informatique/rst_graphviz.rst | 131 ------------ content/Informatique/rstodt.rst | 68 ------- content/Informatique/sftp.rst | 138 ------------- content/Informatique/shifty.rst | 176 ---------------- content/Informatique/ssl_proxy.rst | 128 ------------ content/Informatique/unplugged.rst | 72 ------- content/Informatique/vala.rst | 165 --------------- content/Informatique/wiimote.rst | 123 ----------- content/Informatique/wiimote1.rst | 60 ------ content/Informatique/wiimote_fr.rst | 115 ----------- 64 files changed, 3877 insertions(+), 3869 deletions(-) create mode 100644 content/Informatique/2008-09-15-fail2ban.rst create mode 100644 content/Informatique/2008-11-07-chiffrage.rst create mode 100644 content/Informatique/2009-02-19-wiimote1.rst create mode 100644 content/Informatique/2009-03-11-wiimote.rst create mode 100644 content/Informatique/2009-03-11-wiimote_fr.rst create mode 100644 content/Informatique/2009-10-18-backup.rst create mode 100644 content/Informatique/2010-02-17-invisible.rst create mode 100644 content/Informatique/2010-04-08-chroot.rst create mode 100644 content/Informatique/2010-06-06-awesome.rst create mode 100644 content/Informatique/2010-06-11-vala.rst create mode 100644 content/Informatique/2010-10-04-rst.rst create mode 100644 content/Informatique/2011-06-07-sftp.rst create mode 100644 content/Informatique/2012-02-18-elinks.rst create mode 100644 content/Informatique/2012-03-26-navit.rst create mode 100644 content/Informatique/2012-08-12-apache.rst create mode 100644 content/Informatique/2012-08-18-rstodt.rst create mode 100644 content/Informatique/2012-11-09-fonctionnel.rst create mode 100644 content/Informatique/2013-04-20-gueule1.rst create mode 100644 content/Informatique/2013-04-26-insecable.rst create mode 100644 content/Informatique/2013-05-07-guiderstodt.rst create mode 100644 content/Informatique/2013-05-08-fcron2cron_en.rst create mode 100644 content/Informatique/2013-05-09-fcron2cron.rst create mode 100644 content/Informatique/2013-05-23-ocamlfind_en.rst create mode 100644 content/Informatique/2013-05-23-ocamlfind_fr.rst create mode 100644 content/Informatique/2013-06-02-roi_con.rst create mode 100644 content/Informatique/2013-06-08-unplugged.rst create mode 100644 content/Informatique/2013-07-21-shifty.rst create mode 100644 content/Informatique/2013-07-24-projet_libre.rst create mode 100644 content/Informatique/2013-09-13-ocaml_ppx.rst create mode 100644 content/Informatique/2013-10-12-rst_graphviz.rst create mode 100644 content/Informatique/2013-12-19-ssl_proxy.rst create mode 100644 content/Informatique/2014-02-09-ocaml_gtk.rst delete mode 100644 content/Informatique/apache.rst delete mode 100644 content/Informatique/awesome.rst delete mode 100644 content/Informatique/backup.rst delete mode 100644 content/Informatique/chiffrage.rst delete mode 100644 content/Informatique/chroot.rst delete mode 100644 content/Informatique/elinks.rst delete mode 100644 content/Informatique/fail2ban.rst delete mode 100644 content/Informatique/fcron2cron.rst delete mode 100644 content/Informatique/fcron2cron_en.rst delete mode 100644 content/Informatique/fonctionnel.rst delete mode 100644 content/Informatique/gueule1.rst delete mode 100644 content/Informatique/guiderstodt.rst delete mode 100644 content/Informatique/insecable.rst delete mode 100644 content/Informatique/invisible.rst delete mode 100644 content/Informatique/navit.rst delete mode 100644 content/Informatique/ocaml_gtk.rst delete mode 100644 content/Informatique/ocaml_ppx.rst delete mode 100644 content/Informatique/ocamlfind_en.rst delete mode 100644 content/Informatique/ocamlfind_fr.rst delete mode 100644 content/Informatique/projet_libre.rst delete mode 100644 content/Informatique/roi_con.rst delete mode 100644 content/Informatique/rst.rst delete mode 100644 content/Informatique/rst_graphviz.rst delete mode 100644 content/Informatique/rstodt.rst delete mode 100644 content/Informatique/sftp.rst delete mode 100644 content/Informatique/shifty.rst delete mode 100644 content/Informatique/ssl_proxy.rst delete mode 100644 content/Informatique/unplugged.rst delete mode 100644 content/Informatique/vala.rst delete mode 100644 content/Informatique/wiimote.rst delete mode 100644 content/Informatique/wiimote1.rst delete mode 100644 content/Informatique/wiimote_fr.rst (limited to 'content/Informatique') diff --git a/content/Informatique/2008-09-15-fail2ban.rst b/content/Informatique/2008-09-15-fail2ban.rst new file mode 100644 index 0000000..cee3534 --- /dev/null +++ b/content/Informatique/2008-09-15-fail2ban.rst @@ -0,0 +1,192 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Une gestion avancée de fail2ban +------------------------------- + +:date: 2008/09/15 +:tags: Libre, Hébergement, Administration + +Beaucoup d'articles sont déjà parus sur l'utilisation de fail2ban pour +protéger son ordinateur. Je vais parler ici d'une utilisation avancée de +fail2ban, couplé avec le pare-feu iptables dans le but de faire plein de +joli de choses avec ceux qui tentent d'accéder à nos Pcs ! + +Pour rappel, fail2ban permet de bloquer certaines IPs en fonction de ce +que les logs renvoient comme messages. Il est possible de déterminer les +ports sur lesquels les IPs seront bloquées et la durée du blocage. En ce +qui concerne les filtres qui déclencheront ou non le blocage, cela se +base sur des regex, et on peut déterminer le nombre de tentatives avant +qu'un blocage ne soit appliqué. + +Dans l'esprit du projet, fail2ban empêche les attaques par force brute, +mais nous allons voir qu'il est tout à fait possible de l'utiliser dans +d'autres fins. + +Créer de nouvelles règles de filtrage +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Dans un premier temps, nous allons mettre en place une nouvelle règle de +blocage pour, par exemple, bloquer les IPs en fonction des codes +d'erreurs d'apache. + +Mettre en place une nouvelle règle se fait de manière très simple, il +suffit de créer un fichier contenant la regex à appliquer, et de mettre +une référence vers ce fichier dans la configuration de fail2ban. + +Dans notre cas, pour bloquer les IPs ayant générés une erreur 403 ou une +erreur 401 dans apache, notre regex se présentera ainsi : + +:: + + failregex = :80 .* ".*" 403 = :80 .* ".*" 401 + +(Celle-ci est bien sûr à adapter en fonction de la manière dont vous +affichez vos logs de connexions.) + +Dans le fichier de configuration de fail2ban (/etc/fail2ban/jail.conf), +nous allons demander la lecture de ce fichier en indiquant quelques +paramètres supplémentaires : + +:: + + [apache-block] + enabled = true #Oui on active + port = http #On ne bloque que le port 80 + filter = apache-block # le nom du fichier que l'on a créé juste avant + action = %(action_)s + logpath = /tmp/log/apache/access.log + maxretry = 1 #Nombre de tentatives + banaction = iptables-redirect # L'action à appliquer sur l'IP + bantime = 3600 # Le temps pendant lequel l'ip sera bannie. + + +Créer de nouvelles actions +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Une fois que fail2ban aura lancé une procédure de blocage sur une +connexion, il va lancer un script contenant les actions à réaliser sur +cette IP. D'habitude ce script contient une règle iptables qui bloque +l'adresse, et une autre règle qui supprime ce blocage. + +Nous allons maintenant jouer avec iptables pour réaliser quelques +effets intéressant avec nos IPs à bannir : + +Relancer la durée du blocage +++++++++++++++++++++++++++++ + +Par défaut, fail2ban retire le blocage sur l'IP une fois que la durée +spécifiée est écoulée. Je trouve ceci limité car cela n'empêche pas +l'attaquant de continuer ses attaques et se retrouver prêt à refaire une +attaque dès que cette durée est écoulée. De plus, cela peut donner une +information sur la durée pendant laquelle nous filtrons son adresse. + +Iptables propose un module, modrecent, permettant de bloquer une IP +pendant une durée déterminée, et de réinitialiser cette durée si jamais +une nouvelle connexion venait à être réalisée durant cette période. + +Pour ceci nous allons devoir une règle iptables, en dehors de fail2ban, +qui consistera à bloquer une IP pendant telle période : + +Dans fail2ban, nous allons créer un nouveau fichier action, qui se +présentera comme suit : + +.. code-block:: bash + + #On crée une nouvelle table + actionstart = iptables -N fail2ban- + iptables -A fail2ban- -j DROP + #On insère une nouvelle règle qui met à jour le compteur à chaques nouvelles tentatives tant que le délai n'est pas écoulé + iptables -I INPUT -p -m multiport --dports -m recent --update --seconds 360000 --name fail2ban-- -j fail2ban- + + actionstop = iptables -D INPUT -p -m multiport --dports -m recent --update --seconds 360000 --name fail2ban-- -j fail2ban- + iptables -F fail2ban- + iptables -X fail2ban- + + # Pour bannir une IP, il suffit de l'écrire dans le fichier de configuration de mod-recent + actionban = echo + > /proc/net/xt_recent/fail2ban- + + # On ne retire pas de l'unban, cela se fera tout seul une fois que l'attaquant aura terminé de se connecter + actionunban = + +Il nous suffit de l'enregister dans le fichier `/etc/fail2ban/action.d/iptables-recent.conf` + +Si l'on veut bloquer une ip manuellement, il suffit d'éxécuter la dernière +ligne, à savoir + +.. code-block:: console + + # echo +${IP} > /proc/net/xt_recent/fail2ban- + +Mettre un message d'alerte +++++++++++++++++++++++++++ + +On peut décider d'annoncer à notre utilisateur bloqué que nous avons +banni son IP. Cela peut être utile si nous avons mis en place des règles +de filtrage très strictes et qu'un utilisateur peut se retrouver bloqué +sans avoir tenté la moindre intrusion (mieux vaut être trop prudent que +pas assez) + +Pour cela, nous allons avoir besoin d'un service qui consistera à +afficher le texte sur demande. Hors de question de demander ça à apache +ou autre serveur web, nous allons mettre en place notre propre serveur +web, qui présentera une page statique, toujours identique. + +Socat et tout désigné pour cela. Dans notre exemple nous allons le +faire tourner en tant que serveur, sur un port ouvert, et avec des +droits limités. Notre règle iptables consistera juste à rediriger les +connexions entrantes sur le port 80 vers le port où l'on fait tourner +socat. + +.. code-block:: bash + + sudo -u nobody socat tcp4-listen:6666,reuseaddr,fork exec:"cat /etc/apache2/banned.html" & + +et la règle iptables à mettre en place : + +.. code-block:: bash + + #On crée la règle sur la table de préroutage : + actionstart = iptables -t nat -N fail2ban- + iptables -t nat -A fail2ban- -j RETURN + iptables -t nat -I PREROUTING -p -m multiport --dports -j fail2ban- + + iptables -N fail2ban- + iptables -A fail2ban- -j RETURN + iptables -I INPUT -p -m multiport --dports -j fail2ban- + +et pour lancer l'action, là encore, on simule une perte de paquet pour +ralentir le temps d'affichage de la page + +.. code-block:: bash + + actionban = iptables -t nat -I fail2ban- 1 -s -p tcp -m multiport --dports -m statistic --mode nth --every 3 -j REDIRECT --to-port 6666 + iptables -I fail2ban- 1 -s -j DROP + +Les règles d'unban et de stop se font en symetrique de ban et start, en +supprimant des règles crées. + + +Utiliser les nouvelles règles +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Cela se fait simplement en utilisant les nouveaux noms de fichier à la place +des anciens. Dans le fichier `/etc/fail2ban/jail.conf`, il suffit d'utiliser la +directive : + +.. code-block:: bash + + banaction = iptables-recent + +pour utiliser les nouvelles directives à la action de filtrage. + +Voilà, cela permet de mettre en place une sécurité personnalisée et +adaptée, qui sort déjà des outils et configuration standards (ce qui +est toujours une bonne chose en matière de sécurité). Les exemples que +j'ai donnés ne sont que des suggestions, et il est possible de faire beaucoup +d'autres choses avec un peu d'imaginations. Je vous renvoie au manuel +d'iptables qui présente la liste de tous les modules existants, et de +regarder un peu les paramètres disponibles parmi les fichiers de +configuration de fail2ban. Mon seul regret est qu'à ce jour, ce +programme ne gère pas encore les Ip en v6, mais ça n'est - pour +l'instant - pas encore critique.. diff --git a/content/Informatique/2008-11-07-chiffrage.rst b/content/Informatique/2008-11-07-chiffrage.rst new file mode 100644 index 0000000..1ee5866 --- /dev/null +++ b/content/Informatique/2008-11-07-chiffrage.rst @@ -0,0 +1,77 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Mettre en place une solution de chiffrage avec authentification forte +##################################################################### + +:date: 2008/11/07 +:tags: Libre, ViePrivée +:summary: |summary| + +.. |summary| replace:: + Voici une méthode que j'ai mise en place pour protéger l'accès à mon + répertoire /home via Cryptsetup. Il existe de nombreux tutoriels expliquant + comment créer une partition chiffrée, je ne vais pas détailler cela ici. + L'intérêt du script que je propose ici est qu'il se lance au moment du + login, et qu'il va chercher le mot de passe sur une clef USB. + +|summary| + +Charger le mot de passe contenu dans la clef USB +------------------------------------------------ + +Il suffit juste de l'insérer avant de se logguer, et de la retirer une +fois l'authentification réussie. + +Voici le script en question + +.. code-block:: bash + + #!/bin/sh + + #Si la clef n'est pas insérée, refuse le login + [ -b /dev/disk/by-uuid/chemin-de-la-clef ] || exit 1 + + if [ -b /dev/mapper/home ] + then + #Si la partition est deja montée, connecte + exit 0 + else + + # Monte la clef + mkdir /tmp/clef/ + mount /dev/disk/by-uuid/chemin-de-la-clef /tmp/clef/ 2>/tmp/out + + # Déchiffre la partition + /sbin/cryptsetup luksOpen -d /tmp/clef/clef /dev/disk/by-uuid/chemin-de-la-clef home 2>>/tmp/out + + # Démonte la clef, elle peut maintenant être retirée sans pb + umount /tmp/clef + rmdir /tmp/clef/ + + mount -o defaults -t ext2 /dev/mapper/home /home + exit 0 + + fi + +Bien sûr, il faut que la clef soit contenue dans le fichier clef sur le +périphérique USB. + +Mettre le script au login de l'utilisateur +------------------------------------------ + +Maintenant, 2e étape, il s'agit de lancer ce script au moment où +l'utilisateur vient de se logguer. Comme je passe par un login manager +sur mon portable (GDM), j'ai choisi d'utiliser ses ressources pour +lancer le script. En effet, GDM possède des scripts qui sont lancés aux +différents moments de la connexion. Ce qui nous intéresse ici se trouve +dans le fichier : /etc/gdm/PostLogin/Default + +Il suffit d'y coller notre script (ou d'y faire appel), et notre partition +sera activée automatiquement lors de la connexion (et seulement si le mot de +passe est valide). + +On peut obtenir des paramètres de la part de GDM dans ce script, nom de +l'utilisateur qui se loggue, répertoire de login etc, cela permet de +personnaliser notre script si on le souhaite. Un code de retour en erreur +refusera le login, que le mot de passe entré soit bon ou non… diff --git a/content/Informatique/2009-02-19-wiimote1.rst b/content/Informatique/2009-02-19-wiimote1.rst new file mode 100644 index 0000000..94577d4 --- /dev/null +++ b/content/Informatique/2009-02-19-wiimote1.rst @@ -0,0 +1,60 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Un pilote wiimote sous Linux en python +-------------------------------------- + +:date: 2009/02/19 +:tags: Programmation, Wiimote + +La wiimote est la manette de contrôle de la console wii de Nintendo, un +outil merveilleux dont voici un petit résumé de ses fonctionnalités : + +- Accéléromètres +- Caméra infrarouge +- Émetteur/Récepteur Bluetooth +- 11 boutons + +( voir le détail sur la page de +`wikipédia `_ ) + +En disposant d'un récepteur bluetooth, il est possible de se connecter à +la télécommande et de récupérer ses informations, mieux, avec le projet +`cwiid `_, on peut transformer la wiimote +en souris ! + +Ainsi selon le mode dans lequel se trouve la télécommande, on contrôle +notre curseur en inclinant la télécommande, ou en la pointant vers une +source infrarouge + +.. + + La source infrarouge pouvant être la sensor bar fournie avec la + console, ou une source externe, bougie lampe ou tout ce dont pouvez + disposer diffusant de la chaleur à partir d'un point unique + +Le pilote fourni avec cwiid fonctionne mais n'est pas optimisé. Il +arrive que la souris parte dans une direction incontrôlée, ou de ne pas +pouvoir accéder à certaines parties de l'écran. + +La faute est due au pilote intégré qui se contente juste de placer le +pointeur sur la source infrarouge, avec quelques petites optimisations. + +En effet, le capteur de la wiimote nous indique quelle est la position +de toutes les sources infrarouges perçues ( et nous fourni également des +informations sur leur intensité ), mais la conversion en pointeur est +laissée au pilote : + +- Quelle source choisir comme référence ? +- Comment gérer les cas où une source est sortie du champ de vision ? +- Comment réagir quand cette source revient dans le champ de vision ? + +Tout ceci doit être pris en compte pour pouvoir offrir une ergonomie au +curseur et faciliter le contrôle. + +Heureusement pour nous le pilote nous donne la possibilité de réécrire +nos propres moteurs, et donc de gérer nous même la manière dont on veut +que la souris réagisse. Nous avons même le choix dans le langage ! En +effet, nous pouvons choisir entre offrir un plugin compilé ( le pilote +est écrit en C ), ou l'écrire en python. C'est cette deuxième option que +je vais présenter dans les articles qui suivront. diff --git a/content/Informatique/2009-03-11-wiimote.rst b/content/Informatique/2009-03-11-wiimote.rst new file mode 100644 index 0000000..eb6641d --- /dev/null +++ b/content/Informatique/2009-03-11-wiimote.rst @@ -0,0 +1,123 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Controling the wiimote (I) +########################## + + +:date: 2009-03-11 +:tags: Programmation, Wiimote, Python +:slug: controling-the-wiimote-i +:lang: en + + +Creating the plugin for wminput +------------------------------- + +There are a lot of tutorials about how to configure cwiid. I let you follow +them for getting a functionnal system for your wiimote. You can read the links +at the end of this article. Be sure your system works well before continuing. + +This is a code that we'll use as template for the creation of our driver. Used +as main, it use pygame for displaying the infrared sources the wiimote can +detect, but it is also compatible as plugin for wminput ( even if it does +anything for now ). + +You can get it here : +`wm\_control.py `_ +( This code is licenced under GPL 3+ ) + +About the code : + +.. code-block:: python + + import wmplugin + +This import does not exist, but is created by wminput when executed. It provide +the connexion with the wminput core. Just put ( or link ) the script in the +wminput plugin path ( on my debian this is the /usr/lib/cwiid/plugins/ ) + +.. code-block:: python + + def wmplugin_init(id, wiimote_arg): + wmplugin.set_rpt_mode(id, cwiid.RPT_IR | cwiid.RPT_BTN) + return + + def wmplugin_info(): + return [], + [("X", wmplugin.REL | wmplugin.ABS, 1024, 0, 0, 0), + ("Y", wmplugin.REL | wmplugin.ABS, 768, 0, 0, 0)], + [] + +We instanciate the wiimote object here and configure it in the IR mode. The +name is choosen by wminput if we want to use it as plugin. We define that the +plugin return the coordonates X and Y in a relative system ( +you can get the signification of all the parameters here : `actions list +`_) + +If we want to define new butons, we just have to name them in the first list, +the'll be accessible in the configuration file as plugin.[buton\_name] = ACTION + +.. code-block:: python + + def wmplugin_exec(messages): + '''Wiimote callback managing method + Recieves a message list, each element is different, see the libcwiid docs''' + x = y = 0 + + for msg in messages: + if msg[0] == cwiid.MESG_IR: + x, y = ir_sensor.get_movement(msg) + return [], (x, y) + +Here is the core of our driver. The name is choosen by wminput too, as the +format value we return. We have in parameter the list of the messages the +wiimote has sent. + +If we have defined buton we need to return their state here. It is a boolean +saying if the buton is pressed ( True ) or not ( False ). + +This method doesn't send any others parameters, and this is a problem when we +need to store data between two calls ( ie for saving the cursor position ). One +way for passing throught is to use global variables. But it is unelegant and +can cause problems if we want to use our code in imports. So we'ill use a list +as default parameter and let python save it as you can see here : + +.. code-block:: python + + >>> def meth(a=[]): + ... a.append(1) + ... print a + ... + >>> meth() + [1] + >>> meth() + [1, 1] + >>> meth() + [1, 1, 1] + +So the ir\_sensor.get\_movement method is defined with each parameter we +want to save as an optional list + +.. code-block:: python + + def get_movement(msg, _old_points=[], _old_position = [0, 0]): + return 0, 0 + +The get\_movement method need to return the difference between the old position +of the cursor and the new one in tuple : (0, 0) mean that the cursor didn't +move, (-10, 0) mean a deplacement to the left. + +For now, the plugin doesn't move the cursor, and doesn't read what the wiimote +has sent. But you know everything for creating your own plugin for controlling +your wiimote. You can use all the cwiid method for setting the led, activating +the differents modes of your wiimote ( IR, Acc, rumble ... ), and define here +your own actions. + +I'll explain the core of the movement analysis in IR mode in the next article. + +Links : + `The cwiid project `_ + +`Install Cwiid ( Ubuntu Documentation +) `_ diff --git a/content/Informatique/2009-03-11-wiimote_fr.rst b/content/Informatique/2009-03-11-wiimote_fr.rst new file mode 100644 index 0000000..d61e6db --- /dev/null +++ b/content/Informatique/2009-03-11-wiimote_fr.rst @@ -0,0 +1,115 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Controller la wiimote +##################### + + +:date: 2009-03-11 +:tags: Programmation, Wiimote, Python +:slug: controling-the-wiimote-i +:lang: fr +:logo: /images/wiican.png +:summary: |abstract| + + +Création d'un plugin pour wminput +--------------------------------- + +Il existe de nombreux tutorials sur comment configurer cwiid, je voud laisse +les suivre pour obtenir un système fonctionnel pour la wiimote (vous pourrez +trouver des liens à la fin de cet article). Soyez sûr que la wiimote est +reconnue avant de continuer. + +|abstract| + +.. |abstract| replace:: + Voici un code que l'on peut utiliser comme base pour la création de notre + driver. Lancé en tant que main, il utilise pygame pour afficher les sources + infrarouges captées par la wiimote, mais il peut également être utilisé + comme plugin pour wminput (même s'il ne fait rien pour l'instant). + + +Vous pouvez le télécharger ici : +`wm\_control.py `_ +(Code disponible sous licence GPL 3+) + +Le code : + +.. code-block:: python + + import wmplugin + +Cet import n'existe pas, mais est créé par wminput lorsque celui-ci est lancé. +Il fourni la connexion avec le cœur wminput. Il vous suffit de placer le script +dans le répertoire de plugin de wminput (sur ma debian il se situe dans +`/usr/lib/cwiid/plugins/`) + +.. code-block:: python + + def wmplugin_init(id, wiimote_arg): + wmplugin.set_rpt_mode(id, cwiid.RPT_IR | cwiid.RPT_BTN) + return + + def wmplugin_info(): + return [], + [("X", wmplugin.REL | wmplugin.ABS, 1024, 0, 0, 0), + ("Y", wmplugin.REL | wmplugin.ABS, 768, 0, 0, 0)], + [] + +On instancie la wiimote ici et actions le mode InfraRouge. Le nom est choisi +par wminput si nous désirons pouvoir l'utiliser comme plugin. On déclare que le +plugin retourne les coordonées X et Y dans un système de coordonées relative +(l'ensemble des paramètres sont disponibles ici : `actions list +`_) + +Si nous voulons définir de nouvons boutons, nous avons juste à les nommer dans +la première list, ils seront accessibles dans le fichier de configuration sous +le nom `plugin.[buton\_name] = ACTION` + +.. code-block:: python + + def wmplugin_exec(messages): + '''Wiimote callback managing method + Recieves a message list, each element is different, see the libcwiid docs''' + x = y = 0 + + for msg in messages: + if msg[0] == cwiid.MESG_IR: + x, y = ir_sensor.get_movement(msg) + return [], (x, y) + +Voici le cœur de notre driver. Le nom de la méthode est également imposé par +wminput, de même que le format de retour. Nous recevons en paramètres la liste +des messages reçus par la wiimote. + +Si nous avons défini des boutons, il nous faut retourner leur état ici. Il +s'agit jute d'un booléen indiquant si le bouton est préssé (`True`) ou non +(`False`). + +Cette méthode ne retourne aucun autre parametres, et cela nous pose problème +car nous avons besoin de sauvegarder l'état du curseur entre deux appels. J'ai +contourné le problème en utilisant des arguments par défaut à la fonction +`get_movement` pour pouvoir stocker l'environnement d'un appel à un autre : + +.. code-block:: python + + def get_movement(msg, _old_points=[], _old_position = [0, 0]): + return 0, 0 + +Cette méthode retourne la difference entre la précédente position du curseur et +la nouvelle : `(0, 0)` signifie que le curseur n'a pas bougé, `(-10, 0)` +représente un déplacement vers la gauche. + +Pour l'instant, le plugin ne bouge pas le curseur, et ne lie pas les résultats +envoyés par la wiimote, mais vous avez assez d'information pour créer votre +propre plugin pour controller la wiimote. Vous pouvez accéder aux méthodes de +cwiid pour activer les leds, mettre en marche les differents modes (infrarouge, +accéléromètre, vibration, …) et définir vos propres actions. + +Links : + +`Le projet cwiid `_ + +`Installer Cwiid ( Ubuntu Documentation +) `_ diff --git a/content/Informatique/2009-10-18-backup.rst b/content/Informatique/2009-10-18-backup.rst new file mode 100644 index 0000000..957a42d --- /dev/null +++ b/content/Informatique/2009-10-18-backup.rst @@ -0,0 +1,81 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Un système de backup automatique +################################ + +:date: 2009-10-18 +:tags: Libre, Administration +:summary: |summary| + +.. |summary| replace:: + On le sait tous, il faut faire des sauvegardes de manière régulière. On le + sait également, pour que celles-ci se fassent sur le long terme, il faut + que celles-ci se fassent de manière automatique, et sur un autre support + que le PC que l'on souhaite sauvegarder. Le problème qui se pose est le + suivant : comment concilier ces deux conditions sur un PC de bureau (ne + disposant donc pas d'une série de serveur allumés en permanences et prêt à + recevoir nos sauvegardes en continu…) ? + +|summary| + +Pour répondre à tout cela, nous allons mettre en place un système de backup sur +disque dur externe, qui se lancera à chaque fois que notre disque sera monté. À +chaque fois que le disque dur sera allumé, la sauvegarde s'enclenchera. Cela ne +garantit pas, bien sûr que les sauvegardes se feront à un intervalle régulier, +mais cela garantit au moins que nous n'aurons pas à nous en soucier. Pour cela +nous allons utiliser les outils qui sont disponibles sous un environnement +Linux : rsync et hal. Cet article nous présente une base pour faire notre +sauvegarde `Une sauvegarde améliorée avec rsync +`_. +Nous allons juste devoir le modifier un petit peu pour répondre à un problème +qui arrive souvent avec les périphériques USB : selon que d'autres +périphériques sont déjà montés ou non, nous ne savons pas dans quel répertoire +nous allons nous trouve. Il va donc falloir mettre en place une ligne pour +récupérer le répertoire dans lequel nous sommes. Il ne nous reste plus qu'à +trouver le moyen de l'éxécuter automatiquement pour cela nous allons utiliser +halevt. Le script est disponible `ici +`_ + +Comme son nom l'indique, halevt est un gestionnaire d'évènements pour hal. Hal +est un gestionnaire d'évènement matériel sous Linux; il envoie des informations +à chaque fois que des informations sont envoyées depuis les composants. Cela +permet de détecter le branchement d'un périphérique USB et de le monter sur le +bureau (et qui nous simplifie grandement la vie aujourd'hui !!!). Halevt est +un démon à l'écoute des informations qui nous sont envoyées par hal, et +d'activer des actions en conséquence : par exemple pour lancer l'antivirus sur +la clef usb, reconfigurer le mappage du clavier en fonction de la marque que +l'on branche etc. Pour notre part, nous allons nous contenter de lancer un +script (celui du backup mentionné plus haut). + +Pour commencer nous allons devoir identifier le lecteur à mettre sous +surveillance : inutile de se baser sur les noms de montage habituels (/dev/sda +par exemple) en effet en fonction des périphériques déjà branchés nous +n'allons pas obtenir la même configuration. Nous allons utiliser les point de +montage défini dans /dev/disk/by-uuid qui permet d'obtenir l'identifiant +de notre disque (et qui sera repris par la suite dans la configuration de hal +). Une fois que nous avons relevé quel est le disque concerné, il faut mettre +en place une entrée pour notre évènement dans la configuration de halevt : + +:: + + + + + + + +Cela si halevt est exécuté avec les droits de l'utilisateur lançant le +backup. Si on le fait tourner en démon, il faut trouver une autre +solution (sur mon poste j'ai utilisé sudo, mais on peut très bien se +baser sur le sticky bit pour donner les droits au script). De même, +dans la configuration mise en place, le script se trouve sur le disque +de stockage (de manière à pouvoir le lancer à la main si le démon n'est +pas disponible), cela peut être adapté en fonction de chacun… + +Dans le cas d'une configuration multi-utilisateur, je pense qu'il est +nécessaire de passer par un script qui lance les différentes sauvegardes sous +le bon groupe de l'utilisateur à chaque fois. (Ce qui en plus permet d'éviter +le problème du sudo) mais je n'ai pas eu besoin d'aller jusque-là pour +l'instant ! À vous d'adapter ce que je vous propose en fonction de votre +configuration ! diff --git a/content/Informatique/2010-02-17-invisible.rst b/content/Informatique/2010-02-17-invisible.rst new file mode 100644 index 0000000..dcee14b --- /dev/null +++ b/content/Informatique/2010-02-17-invisible.rst @@ -0,0 +1,103 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Les utilisateurs invisibles de Linux +#################################### + +:date: 2010-02-17 +:tags: Libre, Humeur +:summary: |summary| + +Bonjour à tous, pour mon premier article sur le planet-libre, je voudrais faire +part d'une réflexion qui m'interpelle depuis un moment concernant l'univers +Linux : le fait que les utilisateurs non administrateurs soient exclus de toute +la documentation/prise en main que l'on peut trouver sur le système. Je ne +donne ici que quelques aspects de cette réflexion mais je pense qu'elle touche +l'ensemble des participants au monde du libre. + +.. |summary| replace:: + La plupart des articles que l'on peut voir sur le net qui concernent + l'utilisation du PC sous Linux restent limités à un point : souvent ils + oublient le fait que plusieurs utilisateurs puissent être enregistrés sur + le PC, et que tous ne soient pas forcément des administrateurs ( ceux qui + peuvent avoir des droits root sur la machine). Pourquoi donc ? Est-ce que + cela signifie que la plupart des linuxiens sont les seuls à utiliser le PC ? + C'est possible, mais là n'est pas mon sujet. Je pense que le problème est + que les utilisateurs sont pour l'instant invisible de la littérature sur + Linux que l'on peut trouver sur le net. À la fois invisible du côté des + distributions, et invisible du côté des communautés. + +|summary| + +Le problème se retrouve présent dans deux aspects : d'une part dans la +documentation s'adressant aux administrateurs, et d'autre part dans la +documentaiton s'adressant aux utilisateurs. + +Si l'on suit les manipulations que l'on peut trouver un peu partout sur le net, +on trouve souvent des modifications qui ont pour conséquences de modifier la +configuration générale du système, et l'on trouve plus souvent des +modifications dans /etc/ que dans ~/.config/ + +Suivre les besoins des utilisateurs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Tous les utilisateurs n'utilisent pas forcément l'ordinateur de la même manière +et il faut prévoir quels sont leurs besoins avant de se lancer dans une +opération générale. Par exemple, il n'y a pas longtemps était paru sur le +planet-libre un article sur privoxy qui se terminait par une manière élégante +d'utiliser privoxy sans configuration supplémentaire\ [1]_. Or privoxy est lent +pour traiter les sites puisant des ressources un peu partout — par exemple +google news ou planet-libre (!) et se transformer en inconfort pour +l'utilisateur. + +Les mises à jour +~~~~~~~~~~~~~~~~ + +Faire une mise à jour est toujours quelque chose de périlleux, et l'on ne sait +pas forcément comment le système va réagir; entre le logiciel qui ne fonctionne +plus car sa configuration a changé ou celui qui ne fonctionne plus car un bug a +été introduit dans la nouvelle version, les risques sont possibles (je n'ai par +exemple pu plus lire de dvd lors de la mise à jour du noyau 2.6.30\ [2]_…) + +Je ne veux pas relancer le débat sur le packaging des distributions ( rolling +release contre version fixes) mais le problème doit être posé : comment être +sûr en faisant une mise à jour que l'on ne va pas casser tel composant ? + +En plus des modifications générales sur la configuration que peuvent introduire +les modifications, on peut se retrouver dans la situation inverse : +l'utilisateur n'a pas le droit de visualiser les fichiers de logs, d'installer +un paquet ou de modifier un fichier de configuration et ne pourra donc pas +suivre la documentation qu'il peut trouver ici et là sur le net. + +Pouvoir utiliser ses propres applications ? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Les distributions n'ont pour l'instant pas de solutions pour gérer +l'installation de paquets par un utilisateur normal (qui irait s'installer dans +/opt/ par exemple), pouvant être installés sans droit root, et ne pouvant être +exécutés que par l'utilisateur ayant fait son installation. + +Utiliser des commandes non root +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +En fait, ce système que l'on nous décrit ouvert ne l'est réellement que si l'on +est admin dessus. Pour les autres, la manipulation se limite à bash, python… +Dans la documentation, on trouve même des exemples demandant à l'utilisateur +d'être root alors qu'une commande équivalente peut être lancée par un +utilisateur normal (par exemple $netstat -ie au lieu de #ifconfig) + +Ce problème de l'utilisateur non root est pour l'instant contourné (par exemple +en configurant sudo dès l'installation), mais il reste posé, et n'est jamais +attaqué de front. + +Le fait que cette situation ne soit jamais évoquée est pour moi significative +de l'utilisation faite de linux aujourd'hui : bien loin du grand public. Nous +sommes tous ici des utilisateurs bidouilleurs, et ne voyons pas forcément une +utilisation quotidienne d'un utilisateur standard. Je ne veux pas en faire une +généralisation sur l'avenir de Linux et une remise en cause nécessaire. Je pose +juste ici un constat sur une situation qui est pour moi, encore trop souvent +invisible. + + +.. [1] `Artisan Numérique » Se prémunir des "SpyWebs" avec Privoxy `_ +.. [2] `http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=557340 `_ diff --git a/content/Informatique/2010-04-08-chroot.rst b/content/Informatique/2010-04-08-chroot.rst new file mode 100644 index 0000000..edec0bc --- /dev/null +++ b/content/Informatique/2010-04-08-chroot.rst @@ -0,0 +1,236 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Mettre en place un environnement sftp chrooté +############################################# + +:date: 2010-04-08 +:tags: Libre, Hébergement, sftp + +*Note* : Je propose une autre approche pour mettre en place cette +solution : +`mettre-en-place-un-environnement-sftp-chroote-2/ <{filename}2011-06-07-sftp.rst>`_ + +La demande +~~~~~~~~~~ + +Ma copine m'a demandé de trouver une solution simple pour échanger des +fichiers avec sa sœur, msn posant des problèmes… J'ai pensé à mon serveur ssh +et mettre en place une connexion sftp pour ça. Sur le principe cela a été +adopté avec une petite présentation de filezilla (je ne sais pas s'il existe +des clients sftp intégrés sous windows ?), j'ai donc commencé à mettre en place +le système. De mon côté, la condition principale est de n'autoriser les +connexions que par clef publique (pas de mot de passe), ma copine a tenu à ce +que sa sœur ne puisse pas accéder aux documents présents dans son home, et du +mien à ce que l'on ne puisse pas pour autant se promener dans l'arborescence du +serveur : il va donc falloir chrooter l'environnement. Il existe pas mal de +documentation la dessus sur internet, mais je me suis souvent retrouvé face à +des exemples incorrects ou incompatible avec le fait de passer par une clef +publique, je vais donc détailler les problèmes rencontrés. + +Le compte + clef publique +~~~~~~~~~~~~~~~~~~~~~~~~~ + +La première étape est de créer le compte, cela se fait assez simplement +: + +:: + + # adduser ${user} + +|Création de la clef ssh avec puttygen| et en répondant aux questions +par défaut… Vient ensuite la clef publique : filezilla gère les clefs +privés au format ppk (putty) et je n'ai pas trouvé d'outil pour les +générer sous windows. Je suis donc passé par wine + puttygen pour créer +la clef. Une fois celle-ci crée, on enregistre la partie publique et la +partie privée de la clef. La clef publique va être enregistrée dans le +fichier ${user}/.ssh/know\_host sur le serveur pour autoriser le client +à s'y connecter. La clef privée sera enregistrée de son côté au format +ppk pour être utilisée par filezilla (il est possible à partir de ce +fichier de générer une clef privée de type openssh). + +|image1| + +Il faut ensuite intégrer la clef privée dans filezilla en passant par +les paramètres : elle sera automatiquement lue à la connexion (il faut +choisir «interactive» dans le type d'authentification). (Attention : +sous windows j'ai rencontré des problèmes avec un répertoire contenant +des accents, la clef semblait être lue, mais la connexion ne se faisait +pas pour autant.) + +Chrooter l'environnement +~~~~~~~~~~~~~~~~~~~~~~~~ + +Aujourd'hui il est possible de chrooter nativement un environnement sftp +avec openssh. Il faut pour cela mettre en place une condition sur +l'utilisateur (ou le groupe) pour faire le chroot : + +:: + + Match user ${user} + ChrootDirectory /var/chroot/ + X11Forwarding no + AllowTcpForwarding no + ForceCommand internal-sftp + +Dans cet exemple le chemin /var/chroot sera utilisé comme racine lors +des connexions sftp. Ce répertoire doit être détenu par root:root et +avoir les droits 755. Cela veut dire que si notre utilisateur à pour +répertoire home /home/${user}, il se retrouvera dans +/var/chroot/home/${user} lors des connexions sftp. Il est nécessaire de +conserver le répertoire home de l'utilisateur pour que ssh accepte une +connexion par clef. En effet, lorsque l'utilisateur va se connecter, ssh +va lire dans son répertoire personnel pour lire le fichier +.ssh/know\_host et autoriser ou non la clef qui se présente. Ce qui +signifie que si l'on modifie le répertoire personnel, il faut aussi +déplacer cette arborescence (hors de question dans ce cas de mettre / +comme racine de l'utilisateur). À noter : j'ai préféré faire le match +sur le nom de l'utilisateur plutôt que sur son groupe (le groupe sera +utilisé par ailleurs). Dans le cas où nous avons plusieurs +utilisateurs, il est possible de les mettre à la suite (séparés par des +virgules). J'ai vu de nombreux tutoriaux qui indiquent comme répertoire +de chroot « /home/%u » (le répertoire de l'utilisateur standard), et +qui demandent de changer le répertoire de login de l'utilisateur par « / +». Je pense que c'est une très mauvaise idée : d'une part parce que cela +oblige à déposer les clefs à la racine du serveur, mais aussi à cause de +la contrainte d'openssh demandant à ce que le répertoire root soit +détenu par root : cela veut dire que l'utilisateur n'a pas le droit de +déposer de fichiers ou de créer de répertoires dans son propre home ! Le +plus simple est donc de prendre un autre répertoire pour l'échange, et +laisser le home de l'utilisateur pour la configuration. (Cela permet +aussi d'être sûr que le répertoire .ssh ne sera pas effacé par erreur +par l'utilisateur…) J'ai donc mis un lien symbolique pour lier le /home +de l'utilisateur avec son répertoire d'échange : + +.. code-block:: console + + # mkdir /home/${user}/echanges + # ln -s /var/chroot/home/${user} /home/${user}/echanges + +On retrouvera ainsi la possibilité de voir les fichiers déposés en +passant par le /home de l'utilisateur (même si ce dernier ne pourra pas +y aller…) + +Isoler l'environnement +~~~~~~~~~~~~~~~~~~~~~~ + +Maintenant que nous avons empêché l'utilisateur de se balader sur +l'ordinateur, nous allons l'empêcher de se balader dans les autres +répertoires des utilisateurs : cela se fait en une ligne de commande +(pour chacun des répertoires que nous allons ouvrir en sftp :) + +.. code-block:: console + + # for fichier in /var/chroot/home/* ; do chmod o-r ${fichier}; done + +Et voilà ! Les utilisateurs peuvent voir qu'il existe d'autres comptes +que le leur, mais ne peuvent pas y accéder. + +Autoriser le partage +~~~~~~~~~~~~~~~~~~~~ + +Maintenant que nous avons fermé les droits de manière générale il nous +reste à autoriser le partage des fichiers (après tout c'était le but de +la demande !) de manière plus fine. Cela implique pour moi deux choses : + +#. permettre à un autre utilisateur d'accéder aux données présentes +#. permettre à un autre utilisateur de déposer (ou de supprimer des + données) + +Pour le premier point, c'est facile il suffit d'ajouter l'utilisateur A +au groupe de l'utilisateur B : + +.. code-block:: console + + # usermod -a -G ${user} ${un_autre_utilisateur} + +Et l'utilsateur un\_autre\_utilisateur pourra donc accéder à l'ensemble +des fichiers pour les lire (et éventuellement les rapatrier chez lui). +Pour le second point (possibilité d'écrire et modifier) c'est un peu +plus compliqué; en gros nous voulons que les fichiers déposés par sftp +dans le répertoire de l'utilisateur ait comme groupe d'appartenance +celui du propriétaire du répertoire (quel que soit l'utilisateur qui +dépose) et qu'ils soient modifiable par le groupe (g+w) du +propriétaire. Par exemple : l'utilisateur A dépose un fichier dans le +répertoire d'échange de l'utilisateur B. Il faut que les droits de ce +fichier se présentent ainsi une fois le transfert terminé : + +.. code-block:: console + + $ ls -l fichier + -rw-rw---- 1 utilisateurA utilisateurB + +(ainsi l'un et l'autre pourront supprimer le fichier). Pour cela nous +allons utiliser une « bidouille » de l'os : le sgid bit. Derrière ce nom +barbare se trouve un marqueur qui permet de fixer le droit de tous les +fichiers qui seront créés dans le répertoire (plus d'info +`ici `_). Pour le déterminer on +passe par chmod : + +.. code-block:: console + + # chmod g+s /var/chroot/${user} + +|image2| + +Cela détermine bien quel est le groupe qui sera propriétaire du fichier, +mais cela ne donne pas à ce groupe le droit de le modifier pour autant ! +Sous linux, c'est la commande umask qui permet de déterminer les droits +des fichiers. Le problème est qu'il s'agit d'une commande liés à +l'environnement de l'utilisateur, et non pas aux répertoires sur +lesquels nous travaillons (à moins de passer par les ACLs mais cela est +déjà assez compliqué comme ça…). Ici, nous sommes dans un environnement +sftp, sans shell de login, donc sans possibilité d'exécuter la commande +directement, il faut que ce soit le serveur sftp qui le configure. J'ai +trouvé énormément de documentations (la plupart des bidouillages) pour +contourner le problème, mais la solution la plus simple vient de la +dernière version d'OpenSSH (5.4) sortie le 8 mars dernier. + + +Une nouvelle option sur le serveur sftp permet d'indiquer quel est +l'umask qui sera appliqué (dans notre cas 002) : dans le +fichier/etc/ssh/sshd\_config nous allons configurer les paramètres par +défaut du serveur sftp : Remplacer : + +:: + + Subsystem sftp /usr/lib/openssh/sftp-server.sh + +par : + +:: + + Subsystem sftp /usr/lib/openssh/sftp-server -u 002 + +Pour définir les droits umask qui seront appliqués par défaut pour +toutes les connexions sftp par défaut. Ce paramétrage est à redéfinir +pour les paramétrages personnalisés (bloc Match) : + +:: + + ForceCommand internal-sftp -u 002 + +Conclusion +~~~~~~~~~~ + +Nous avons un environnement bien hermétique, pouvant gérer +l'augmentation du nombre de compte (il suffit de refaire les chmod dans +notre environnement chrooté à la création du compte), et hermétique. Le +paramétrage côté serveur est effectivement assez lourd au début, mais je +pense que la mise à jour ne demande pas trop de travail, et on gère les +droits de manière assez fine (en passant par les groupes ce qui me +semble être dans la mentalité unix). Pour le client, il n'y a pas grand +chose à paramétrer (récupérer la clef et l'intégrer), et il n'y a +aucun risque que celui-ci vienne casser son paramétrage. On peut même +sauvegarder sa clef privée dans son home (le vrai), au cas où il +perdrait le fichier. + +.. |Création de la clef ssh avec puttygen| image:: {filename}../images/puttygen-300x276.jpg + :class: floatleft + + +.. |image1| image:: {filename}../images/filezilla-300x140.jpg + :class: floatright + +.. |image2| image:: {filename}../images/conf-300x175.jpg + :class: floatleft diff --git a/content/Informatique/2010-06-06-awesome.rst b/content/Informatique/2010-06-06-awesome.rst new file mode 100644 index 0000000..e1f3860 --- /dev/null +++ b/content/Informatique/2010-06-06-awesome.rst @@ -0,0 +1,105 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Un menu pour awesome +#################### + +:date: 2010-06-06 +:tags: Libre, awesome +:summary: |summary| + +Awesome est un window manager (wm) en mode pavement (les fenêtres se +disposent de manière à ne jamais se chevaucher). Cela permet de ne pas +avoir à se soucier de la manière dont il faut gérer l'affichage des +applications. + +|Awesome| + +Une des particularités est que sa configuration se fait par un fichier de +script exécuté au lancement du bureau. Cela permet de paramétrer comme +on le souhaite le bureau sans être limité par le WM. La contrepartie est +que cela est plus difficile à prendre en main, et une erreur de code +entraîne un écran gris au lieu du bureau que l'on souhaite obtenir... Le +langage utilisé (Lua) est un langage connu pour sa légèreté. Pour +l'instant, le projet étant encore assez jeune, il n'existe pas encore +beaucoup de modules standardisés pour configurer le système, mais je +pense que ceux-ci ne tarderont pas à venir... + +Pour l'instant la configuration n'est pas encore stabilisée, certains +composants changent au cours d'une version à une autre, ce qui casse +parfois la mise à jour et oblige à retravailler les scripts de mise de +configuration. Je pense cependant que tout cela suit la bonne direction +et que ces soucis finiront par disparaître avec le temps et les versions +suivantes + +La plupart des actions peuvent être associées à un raccourci clavier, et +s'il est possible d'affiche une barre d'outil à chaque application (« +titlebar »), on prend vite l'habitude de s'en passer et de tout +contrôler au clavier. On est d'autant plus aidé par cela par +`shifty `_ une extension qui +permet de « programmer » la manière dont on veut que les fenêtres +s'affichent : sur quel écran, avec quels paramètres etc. Cela permet par +exemple d'avoir une configuration pour des applications utilisant +plusieurs fenêtres (je pense par exemple à Gimp) paramétrée comme on +le souhaite… + +On prend vite l'habitude également d'utiliser plusieurs « tags » (l'équivalent +de bureaux virtuels mais un peu plus étendus) : ceux-ci peuvent être paramétrés +pour afficher des applications sépicifiques (j'ai par exemple adapté ma +configuration pour que *web* affiche firefox, ou que *news* affiche le couple +elinks/newsbeuter pour lire mes flux RSS… + +Bien sûr le temps de paramétrage au début est un peu long, mais +maintenant que l'API est stable, il n'est plus nécessaire de tout +reprendre à chaque fois que l'on met à jour awesome. + +|summary| + +.. |summary| replace:: + Je trouvais qu'il manquait à Awesome un menu avec les actions + disponibles sur les fenêtres : la faire passer au premier plan, la + minimiser… Tout ceci est disponible avec des raccourcis claviers, mais + il n'y a pas d'option centralisée pour les retrouver. J'ai donc décidé + de me plonger un petit peu dans lua pour produire le menu que voilà : + +|Menu pour awesome| + +Le menu permet les actions suivantes : + +- On top : Pour mettre le client sélectionné au premier plan et le + rendre flottant +- Sticky : Faire apparaître le client sur tous les tags +- Minimize : Réduire le client +- Close : Fermer le client +- Move To : Déplacer le client vers un autre tag + +Le script fonctionne avec awesome 3.4.5, les versions antérieures ne +sont pas forcement compatibles suite à un changement dans l'ABI du menu. +J'essaierai également de le mettre à jour pour les versions suivantes ( +du moins tant que je m'en servirai…) + +Pour le faire fonctionner, il faut télécharger le script et le placer +dans son répertoire ${HOME}/.config/awesome . Ensuite, éditer le fichier +rc.lua et y ajouter la ligne suivante en en-tête : + +.. code-block:: lua + + require("mymenu") + +et dans la partie Key Binding : + +.. code-block:: lua + + clientkeys = awful.util.table.join( + […] + awful.key({ modkey, }, "Down", function(c) menu_instance = newAppMenu(c) end), + +Le menu apparaîtra sur le raccourci Mod4 + Flèche du bas + +Le fichier : `mymenu.lua `_ + +.. |Awesome| image:: http://awesome.naquadah.org/index/320x240-screen.png + :class: floatleft + +.. |Menu pour awesome| image:: {filename}../images/menu.png + :class: floatright diff --git a/content/Informatique/2010-06-11-vala.rst b/content/Informatique/2010-06-11-vala.rst new file mode 100644 index 0000000..05aeeb7 --- /dev/null +++ b/content/Informatique/2010-06-11-vala.rst @@ -0,0 +1,165 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Présentation de Vala +#################### + +:date: 2010-06-11 +:tags: Libre, Programmation + +.. default-role:: literal + +J'ai découvert une présentation du langage dans GLMF n°127 qui +l'utilisait pour se brancher sur le pare-feu. Cela ayant aiguisé ma +curiosité, j'ai cherché à en savoir davantage sur le langage. Le langage +C m'a toujours paru difficile à aborder. Non pas au niveau de sa +syntaxe, mais au sujet de l'accès à sa documentation et aux librairies +disponibles. Pour moi qui suis habitué à Java ou à Python, j'ai regardé +Vala comme un moyen de mettre un pied dans le C. Je vais essayer de +présenter ma manière de le voir, après avoir fait une petite plongée +dedans… + +Présentation +~~~~~~~~~~~~ + +Le langage Vala a été créé par les développeurs de Gnome pour qu'ils +puissent disposer d'un langage de haut niveau. Gnome ayant eu pendant +quelque temps un pied (dansant) dans mono, Vala en est très inspiré. +(Je ne connais pas mono et ne peux donc pas lancer de comparatif, je +vous renvoie donc à celui présenté par Gnome `par rapport à +C# `_, et +pour `Java `_). Le +langage est ensuite compilé en C, et GCC est utilisé pour la compilation +d'un exécutable. On est donc dans un langage intermédiaire, qui reste +très proche du C comme nous allons le voir par la suite. + +Analyse +~~~~~~~ + +Langage objet haut niveau +-------------------------- + +Vala est tout d'abord un langage haut niveau : +on y retrouve des *interface* (pour pouvoir moduler le code facilement), des +*delegate* (qui permettent de définir un type de fonction pour un callback), +une gestion *événementielle* (gérer le déclenchement de plusieurs méthodes dans +le code par un appel unique) … On dispose donc d'un langage objet assez riche +pour éviter d'avoir à passer du temps sur des détails et se concentrer sur le +programme et son déroulement. Il est pensé objet et l'on retrouve vite ses +marques, tout comme l'on sent qu'il est assez facile d'« abstraire » le code +pour faire une application qui n'en reste pas un simple script… Je n'ai pas +envie de détailler la syntaxe du langage et tout ce qu'il intègre car vous +pourrez trouver tout cela en ligne. Je vous renvoie au `tutoriel +`_ qui explique la structure du langage en +détail, qui présentent des exemples détaillés. + +La GLib +------- + +Le langage est basé sur +la GLib, la librairie standard utilisé dans les applications GTK. La plupart +des types primitifs (`int` …) sont donc en réalités des types issus de cette +librairie (`gint` …). On accède ainsi à l'ensemble des méthodes de la GLib, +diffusées sous formes de classes objets et bien documentées (la `valadoc +`_). Cela rejoint l'histoire de Vala puisque La +GLib est tout utilisée par les développeurs Gnome (on constate d'ailleurs que +la plupart des composants Gnome ont une entrée dans cette Valadoc). Il ne faut +cependant pas croire que l'on dispose avec cette bibliothèque standard d'un +ensemble de routines aussi riche que dans le package standard d'un Java ou d'un +Python : la GLib est avant tout destinée à des développeurs C, et beaucoup des +méthodes standard du C ne sont pas disponibles. Pour parer cela, Vala propose +une classe POSIX[LIEN] proposant les méthodes standard du C, mais celle-ci +n'est pas exhaustive et il nous arrive souvent de tomber sur une fonction qui +ne nous est pas accessible via le langage haut niveau qu'est Vala. + +Les Bindings +------------ + +Pour répondre à cela, propose la possibilité de mettre en place un binding vers +une libraire C de manière native. (Normal me direz-vous, le code en sortie de +Vala est du C !) On peut donc très facilement utiliser n'importe quelle +libraire existante. Vala étant un langage objet, il devient donc possible +d'utiliser les librairies standard au sein d'un code objet de haut niveau. Cela +ne demande que quelques lignes, demandant au minimum le fichier dans lequel se +trouve la définition de la méthode, et sa signature. Exemple du binding +définissant la méthode `execl` (issue du fichier +`/usr/share/vala/vapi/posix.vapi`) : + +:: + + [CCode (cheader_filename = "unistd.h")] + public int execl (string path, params string[] arg); + +et voici la signature de la méthode C correspondante : + +:: + + extern int execl (__const char *__path, __const char *__arg, ...) __THROW __nonnull ((1)); + +Les types primitifs de la GLib étant basés sur les types primitifs C +correspondants, il n'y a pas de problème de cast dans la plupart de cas. +Toutefois, Vala utilise des `char\*` pour définir ses string : il est parfois +nécessaire de mettre en place faire un cast quand une méthode nous un `char[]` : +même dans le code haut niveau, le C n'est jamais loin… C'est souvent +frustrant de devoir mettre en place un binding pour une fonction disponible en +standard dans la libc. Je pense qu'il manque la possibilité d'inclure +directement du code C dans le code vala, tout comme il est possible directement +de l'assembleur dans du C. Cela permettrait un confort dans l'utilisation qui +n'est pas disponible actuellement. À noter qu'un outil permet de mettre en +place ces bindings pour les composants basés sur `GObjet` (Gnome toujours…). De +plus de nombreux bindings sont disponibles pour les composants Gnome. +Attention, cela n'empêchera pas d'avoir à installer les headers C +correspondants ! + +Les profils +------------ + +Il est possible d'utiliser des profils de compilation. Cette option encore +expérimentale a été mise en place pour répondre à des réclamations de la part +des utilisateurs qui voulaient programmer en Vala sans avoir de dépendances +envers la GLib. Ainsi, il est possible d'appeler le compilateur avec la syntaxe +suivante : + +.. code-block:: console + + $ valac --profile posix + +ce qui a pour conséquence de réduire le jeu de bibliothèque par défaut à +celles disponibles dans la classe `POSIX`. Cela permet de limiter les +dépendances du programmes, mais beaucoup de types standard de Vala +deviennent de ce fait indisponible; on sent bien que le langage n'a pas +été pensé pour ça. + +Conclusion +~~~~~~~~~~ + +Pour résumer, je dirais que Vala correspond à ce qu'il annonce : un +langage haut niveau pour faciliter la création d'applications Gnome. Dès +que l'on cherche à sortir de ce cadre, on se retrouve confronté à des +limitations (qui ne sont bien sûr pas insurmontable) : + +- Pour ceux qui ne cherche pas à travailler sur du code Gnome, + embarquement de bibliothèques qui ne nous intéressent pas forcément. + (Bien que sur ce point, la GLib est plutôt standard sur les PCs + ayant X d'installés) +- Pour ceux qui cherchent un langage de haut niveau, le C est encore + trop présent entre les lignes pour pouvoir l'oublier complètement. + D'un autre côté, l'intégration du code C n'est pas toujours évidente + puisqu'elle oblige à déclarer des bindings pour des fonctions + standards. +- Mais surtout, le fait que l'ensemble des fonctions de la libc ne + soient pas encore disponibles oblige à mettre le doigt dans les + bindings régulièrement. + +Le langage est bien sûr encore amené à évoluer, et les points que je cite ici +ne sont pas pour autant rédhibitoires. D'un point de vue totalement subjectif +Je trouve le langage simple mais sans trop de saveur. Ça reste un langage objet +qui n'est bien sûr pas révolutionnaire; on sent qu'il ne fait que reprendre les +concepts des langages qui l'ont inspiré, mais le produit est cohérent, et +d'après les benchs génère un code plutôt optimisé (en rapport avec le temps que +l'on pourrait passer à produire le même code en C). Après, je ne prends pas le +même plaisir à programmer en Vala qu'en python (j'avais bien dit que j'étais +subjectif ^^). Cela dit, pour moi, qui ne suis pas un développeur Gnome, je +suis plus intéressé par la possibilité d'avoir un langage haut niveau qui reste +très proche du C, avec les performances qui vont avec; si le prix pour cela est +une dépendance vers la GLib, ça reste un coût sommes toutes assez faible. diff --git a/content/Informatique/2010-10-04-rst.rst b/content/Informatique/2010-10-04-rst.rst new file mode 100644 index 0000000..faa0280 --- /dev/null +++ b/content/Informatique/2010-10-04-rst.rst @@ -0,0 +1,186 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Blogguer en rst sous wordpress +############################## + +:date: 2010-10-04 +:tags: Libre, reStructuredText +:summary: |summary| + +.. default-role:: literal + +Le format reStructuredText_ est un langage de balise (un peu comme le HTML, ou +le laTex), issu du monde de la programmation. Son but est de répondre au +problème suivant : comment écrire du texte simplement et sans avoir besoin +d'apprendre une syntaxe spécifique (ou du moins un minimum), tout en +conservant des possibilités de formatage et d'export ? + +.. _reStructuredText : http://docutils.sourceforge.net/rst.html + +Présentation de RST +=================== + +.. |summary| replace:: + Quand on écrit un article (par exemple ici cet article de blog), il est + nécessaire d'indiquer des directives de mise en page : ceci est un + paragraphe, ceci est un lien, inclure une image, une citation… Pour cela on + ne passe pas par un logiciel de traitement de texte pour le faire + (openOffice) : c'est lourd et cela n'apporte rien, mais la plupart du temps + par un éditeur intégré au blog qui permet de formater notre texte. + +|summary| + +Cet éditeur se charge pour nous de formater le texte en quelques clics. Le +problème est que bien souvent ce texte ne pourra pas sortir du blog (par +exemple pour prendre un extrait de l'article et l'utiliser ailleurs, nous +sommes obligés de passer à nouveau par cette interface) + +Une autre solution est de rédiger notre texte directement dans le format de +sortie (par exemple HTML), mais cela nécessite de connaître la syntaxe, et ne +rend pas la lecture du fichier source très lisible (essayez de lire un article +de presse en HTML avec un éditeur de texte pour voir…) + +Le format reStructuredText se veut être une réponse à ces problèmes : un +fichier RST est lisible (le fichier source est compréhensible et peut être lu +directement), ne nécessite pas de connaissances particulières (du moins peu), et +à l'avantage de pouvoir être exporté dans de nombreux format de sortie (odt, +pdf, latex, html…) On dispose donc d'un format unique pouvant servir à écrire +des articles de blog, des documents de travail, ou encore de la documentation. + +La syntaxe est très simple, et ne charge pas le document à la lecture. Par +exemple pour voir le document ayant servi à générer cet article est disponible +ici_ : on laisse des lignes blanches pour indiquer que l'on passe d'un +paragraphe à un autre, ou « souligne » avec les caractères = _ ou - les titres +et les sous-titres, et le résultat donne un document très aéré et agréable à +travailler. + +.. _ici : http://chimrod.com/downloads/blog/article.rst + +Plugin wordpress +================ + +Il existe un plugin wordpress qui permet d'utiliser ce format pour l'écriture +de documents dans le blog. À chaque fois que l'on va publier un article, le +plugin va tester si le fichier est au format rst, et dans ce cas, va en faire +la conversion en html en passant par la commande `rst2html`. + +**Attention**, pour le mettre en place, il est +nécessaire d'avoir un accès à la machine pour y installer quelques +applications. + +Pré-requis +---------- + +Python doit être disponible sur la machine, ainsi que le script `rst2html` (je +ne pense pas que cela soit le cas pour les blogs hébergés et cela limite les +possibilités). + +.. code-block:: console + + $ sudo aptitude install python-docutils + +Installation +------------ + +Il s'agit juste d'un fichier à installer dans le répertoire des plugin de +wordpress. Celui-ci est disponible sur launchpad_ et ne pose aucun problème de +compatibilité. + +.. _launchpad : http://bazaar.launchpad.net/~gldnspud/rest-wordpress/trunk/files + +Le fichier README explique comment l'installer et le paramétrage à faire; les +options (comme le chemin vers `rst2pdf`) se font directement dans le fichier php. + +.. code-block:: php startinline=True + + // Set this to the prefix of your docutils installation. + $prefix = "/usr/local"; + + // Set this to the path of rst2html.py + $rst2html = "$prefix/bin/rst2html.py"; + +Un petit test devrait montrer le résultat tout de suite. Dans le cas où le +contenu est vide, regardez les logs d'erreur du serveur web, vous devriez y +trouver les causes de votre erreur. + +Coloration syntaxique +--------------------- + +Il est possible de disposer de la coloration syntaxique automatique du code : + +.. code-block:: python + + import os + # Standard hello world stuff + class Hello() + def do_it(self) + print "Hello world" + + if __name__ == '__main__': + Hello().do_it() + + def main() + print "Hello world" + +Pour intégrer la coloration syntaxique, il faut passer par pygment (un +programme python qui s'occupe de ça) : + +.. code-block:: console + + # aptitude install python-pygments + +Ensuite il va falloir modifier le script à lancer. En effet, par défaut, la +commande `rst2pdf` n'intègre pas la coloration de code. Nous allons donc devoir +modifier la commande à exécuter pour le faire (j'ai mis à disposition le script +à télécharger_). Assurez-vous que le script peut être exécuté par l'utilisateur +lancé par le service web. + +.. _télécharger : http://chimrod.com/downloads/scripts/rst2html-pygments.py + +La CSS n'est pas inclue dans le document et peut être définie à l'extérieur. Il +est possible de définir son style à partir de pygment avec la commande suivante +(pour appliquer le style tango) : + +.. code-block:: console + + $ pygmentize -S tango -f html > style.css + +Conclusion +========== + +Je cherchais depuis un petit moment une solution pour pouvoir écrire mes +articles sans me connecter au blog. Les applications clientes ne me convenant +pas tout à fait, le RST me permet d'utiliser une application totalement séparée +du blog (par exemple VIM) et un format pérenne. + +Je ne sais pas s'il existe une solution équivalente pour les autres moteurs de +blog, le RST étant encore un format assez jeune, et n'est pas encore très +répandu… + +Sans être aussi complet que le latex, il est bien plus souple et +beaucoup plus facile à utiliser. De plus il s'agit bien sûr d'un format +ouvert, pouvant générer des documents sous openOffice, en PDF, voire en latex +pour ceux qui veulent… + +Édit (29/05/11) +=============== + +Je reviens sur le plugin en constatant que par défaut, celui-ci met en cache le +contenu de l'article, même si celui-ci est déjà en html. Une petite +modification dans le code permet de ne sauvegarder le fichier que s'il s'agit +d'un fichier rst : + +Rechercher dans le script la chaîne suivante : + +.. code-block:: php + + if ($pos === false) { + // No modeline. + $rval = wpautop($text); + +Et rajouter la ligne suivante en dessous : + +.. code-block:: php + + return $rval; diff --git a/content/Informatique/2011-06-07-sftp.rst b/content/Informatique/2011-06-07-sftp.rst new file mode 100644 index 0000000..4207725 --- /dev/null +++ b/content/Informatique/2011-06-07-sftp.rst @@ -0,0 +1,138 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Mettre en place un environnement sftp chrooté (2) +################################################# + +:date: 2011-06-07 +:tags: Hébergement, sftp, Administration + +Il y a quelque temps, j'avais publié un billet indiquant comment mettre en +place un environnement sftp chrooté, dans lequel l'utilisateur ne peut pas +sortir du répertoire qui lui est assigné. + +La solution que j'avais proposée (modifier la configuration de sshd) était +compliquée et lourde à mettre en place. Parmi les commentaires, le logiciel +mysecureshell_ avait été évoqué. + +Présentation +============ + +Mysecureshell est une commande qui se lance au login de l'utilisateur sur la +machine. Il dispose de nombreuses possibilité de paramétrage (débit, droits), +tout en restant très simple à administrer. De plus, il empêche l'utilisateur +d'ouvrir une connexion sur la machine, il ne peut que se connecter en sftp. + +Nous allons voir ici comment le +mettre en place sur une machine Debian destinée à accueillir des +connexions sftp. + +La documentation en ligne est complète et accessible voici néanmoins une +description qui reprend les principes de l'installation. + +Installation +============ + +Mysecureshell n'est malheureusement pas disponible dans les dépôts debian. Il +est donc nécessaire d'ajouter un dépôt externe pour l'installer. Le site web +fournit des `paquets d'installation`_ pour la plupart des distributions (debian, +fedora…) + +Une fois que le dépôt est ajouté, il suffit de l'installer en lançant la +commande suivante (toujours sous debian) : + +.. code-block:: console + + # aptitude install mysecureshell + + +Configuration +============= + +Configuration de mysecureshell +------------------------------ + +La configuration se fait dans le fichier /etc/ssh/sftp-config + +Voici les champs importants à noter : + +=============== ============================================================== +Champs Signification +=============== ============================================================== +GlobalDownload Il s'agit du débit maximal qui sera utilisé quand le serveur + uploadera des fichiers vers les clients +GlobalUpload La même chose pour l'upload +StayAtHome Empêcher l'utilisateur de naviguer hors de son répertoire + personnel +VirtualChroot Met en place un faux home pour l'utilisateur +Home Défini le home que verra l'utilisateur lorsqu'il se connectera +=============== ============================================================== + +Je conseille de séparer le home « unix » de l'utilisateur de son home +« chrooté ». Cela permet de mettre en place des fichiers dans le fichier home +de l'utilisateur, sans que celui-ci ne puisse les consulter : + +Cela se fait tout simplement en mettant l'option VirtualChroot à True, et en +définissant le Home `mysecureshell` vers un sous-répertoire du home `unix` : + + +.. code-block:: bash + + StayAtHome true + VirtualChroot true + Home /home/$USER/sftp + + +Cela oblige à créer pour chaque utilisateur un répertoire sftp dans son home. +Lorsque l'utilisateur se connectera, il accedera uniquement à répertoire sftp, +mais ne pourra pas naviguer plus haut, ni consulter les autres répertoires des +autres utilisateurs. + + +Gestion des comptes +------------------- + +La configuration est assez simple : pour chaque utilisateur nous allons indiquer +que mysecureshell est la commande à exécuter lors du login de l'utilisateur. +Cela se fait en modifiant le fichier /etc/passwd. + +.. code-block:: console + + invite:x:1002:1002:,,,:/home/invite:/bin/bash + +et le remplacer le dernier champs ainsi : + + +.. code-block:: console + + invite:x:1002:1002:,,,:/home/invite:/bin/Mysecureshell + +Sauvegarder, et voilà, la configuration va s'appliquer lors de la prochaine +connexion de l'utilisateur. + +Mise à jour de la configuration +------------------------------- + +Lorsque les fichiers de configuration sont mis à jour, les connexions existantes +ne sont affectées. Elles ne le deviennent qu'à partir de la prochaine +reconnexion de l'utilisateur. + +Il est tout à fait possibile de forcer mysecureshell à appliquer les +modifications, mais cela oblige à `reconnecter les utilisateurs`_ + +Au final +======== + +Il n'y a pas grand chose à faire finalement, et c'est agréable de voir la +configuration se faire aussi rapidement ! Il est vrai que le site web de +l'application peut sembler amateur, mais cela ne reflète en rien la qualité de +l'application. + +J'abandonne donc avec plaisir la méthode que j'avais mis en place dans mon +précédent billet pour passer sur mysecureshell ! + +.. _mysecureshell : http://mysecureshell.sourceforge.net/fr/index.html +.. _paquets d'installation : http://mysecureshell.sourceforge.net/fr/installpak.html +.. _reconnecter les utilisateurs : http://mysecureshell.sourceforge.net/fr/confman.html#question9 + +.. vim: filetype=rst diff --git a/content/Informatique/2012-02-18-elinks.rst b/content/Informatique/2012-02-18-elinks.rst new file mode 100644 index 0000000..bac91ba --- /dev/null +++ b/content/Informatique/2012-02-18-elinks.rst @@ -0,0 +1,47 @@ +.. -*- rst -*- +.. -*- coding: utf-8 -*- + +Scripter elinks +############### + +:date: 2012-02-18 +:tags: Libre + +elinks_ est un navigateur web, destiné à être utilisé en console. Il s'agit +pour moi d'un très bon navigateur secondaire, en complément de firefox, qui à +l'avantage de permettre une navigation légère, sans effets de javascript, +publicités, idéale pour lire l'actualité, un peu moins pour faire une recherche +sur un sujet. + +La semaine dernière, j'ai envoyé un message_ sur la mailing list du projet pour +indiquer que je souhaitai entreprendre quelques modifications dans le code dans +le but de le rendre davantage modulaire. Il est nativement scriptable dans +différents langages (lua, python, perl...) mais les possbilités de scripts +restent très limitées et ne permettent pas de changer grand chose au +comportement du navigateur. Quand on a pri l'habitude de pouvoir configurer +ses applications comme on le souhaite, cela devient difficile de ne pas pouvoir +le faire. + +J'ai donc choisi de me pencher davantage sur le langage lua pour mettre en +place les modifications voulues. J'ai déjà une expérience du lua comme scripts +côté client, pour l'instant jamais du côté de l'API C. Après avoir lutté un +petit peu, j'ai fini par comprendre et suis aujourd'hui en train de mettre les +objets qui m'intéressent. + +Le but est de permettre de scripter complètement la navigation : aujourd'hui, +les seules interractions possibles permettent de modifier l'URL au moment où +celle-ci est entrée, mais aucun accès au document n'est donné : impossible de +récupérer les URLs, impossible de sélectionner un lien dans la page, ou de +naviguer dans celle-ci. C'est tout cela que je souhaite mettre en place, en +proposant une API orientée objet qui sera modulable et réutilisable par la +suite. + +Pour l'instant, les modifications ne sont pas encore visibles, je fais le +commit sur mon propre serveur git, mais je rendrai public mon projet dès que +j'aurai obtenu un résultat intéressant : je n'attendrai pas d'avoir fini pour +tout publier; soyez patient ! + +.. _elinks: http://elinks.or.cz/index.html +.. _message: http://linuxfromscratch.org/pipermail/elinks-dev/2012-February/002049.html + + diff --git a/content/Informatique/2012-03-26-navit.rst b/content/Informatique/2012-03-26-navit.rst new file mode 100644 index 0000000..c5d0d6d --- /dev/null +++ b/content/Informatique/2012-03-26-navit.rst @@ -0,0 +1,226 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Un gps libre avec Navit +####################### + +:date: 2012-03-26 +:tags: Libre, DIY +:summary: |summary1| |summary2| +:logo: /images/navit.png + +.. default-role:: literal + +Depuis un peu plus d'un an maintenant, j'ai choisi d'utiliser Navit comme +logiciel de navigation. Dans ce billet, je propose de faire un petit retour +d'expérience sur ce logiciel et la manière de l'utiliser pour calculer les +trajets à l'aide d'un GPS. + +Présentation +============ + +|summary1| + +.. |summary1| replace:: + Navit est un logiciel de navigation, ce que l'on appelle souvent un + « GPS ». Le logiciel fonctionne en mode déconnecté, c'est-à-dire qu'il a + besoin de lire les cartes en local, mais ne nécessite aucune connexion + réseau lors de la navigation. C'est un avantage qui lui permet de + fonctionner sur des netbook sans clef 3G. + +|summary2| + +.. |summary2| replace:: + Et c'est là tout l'avantage par rapport à une solution de navigation + intégrée : il permet de transformer n'importe quel netbook (voire + smartphone) en une solution de navigation GPS gratuitement ! Par rapport + aux GPS que l'on rencontre souvent en voiture, le coût est ridicule ! + +Fonctionnement +============== + +À partir d'une connexion GPS intégrée (comme sur les smartphones) ou externe +(par USB), Navit va mettre à jour en temps réel l'affichage de la carte et le +calcul du trajet. La connexion gps est réalisée avec gpsd, capable de +réceptionner les données depuis la plupart des récepteurs gps. Je n'ai eu aucun +problème pour réaliser la connexion entre navit et gpsd, la carte commençant à +se déplacer toute seule une fois les leds du GPS indiquant qu'il s'était +synchronisé. + +Navit n'intègre aucune carte : par contre l'application a la possibilité +d'utiliser les cartes dans les formats suivants : + +* garmin (pas testé) +* reiserplan +* openstreetmap_ (voir plus bas) + +Une caractéristique de navit est de ne pas présenter d'interface par défaut : +tout passe par des modules que l'on vient rajouter dans l'interface et qui +s'afficheront par-dessus la carte. Par exemple : + +* Le nom de la rue sur laquelle on se trouve +* L'heure d'arrivée +* La vitesse +* La distance avant le prochain changement de route +* Une alerte quand on dépasse la vitesse autorisée +* etc. + +Des configurations déjà prêtes sont disponibles sur le wiki et peuvent être +téléchargées. Cela permet d'adapter l'affichage en fonction du support sur +lequel l'application est lancée : sur un smartphone on privilégiera un +affichage en vertical avec moins de modules par rapport à un ordinateur. + +Configuration +============= + +Navit se base sur gpsd pour récupérer les données en provenance du récepteur. +Je ne rentre pas ici dans l'installation et la configuration de gpsd, et vous +renvoie vers la documentation de votre distribution pour le configurer. + +.. Note:: + + Il n'est pas nécessaire de disposer d'un récepteur GPS pour utiliser Navit. + C'est alors à l'utilisateur de déplacer la carte pour suivre son trajet, + mais en dehors de ce point, l'application se comportera de la même manière. + +Nous allons ensuite télécharger notre première carte, en passant par le `Navit +planet extractor`_, qui propose de télécharger son jeu de carte sur internet : + + +.. Note:: + + Notez l'url, nous allons la réutiliser plus tard ! + +La configuration de navit est disponible dans le répertoire /etc/navit/ . +Seulement, pour plus de commodité, nous allons la copier dans notre répertoire +utilisateur : + +.. code-block:: console + + $ cp -r /etc/navit/ ~/.navit/ + +Nous allons maintenant éditer le fichier XML est ajouté la carte dans la liste +des cartes disponibles : + +.. code-block:: xml + + + + + +Si l'on souhaite intégrer plusieurs cartes, il faut insérer plusieurs fois ce +nœud XML. + +Relançons maintenant navit, la carte devrait s'afficher ! (Il se peut que vous +ne voyiez rien car Navit n'est pas forcément positionné chez vous : on va donc +chercher dans les villes une proche de chez nous et choisir de l'afficher sur +la carte.) + +.. image:: {filename}../images/Capture-Navit-e1332787251467.png + :width: 400 + :class: center + :alt: menus de navit + +On peut déjà commencer à calculer les trajets et essayer différents habillages. +Sur le wiki vous pouvez télécharger des thèmes déjà préparés qu'il suffit +d'installer. + +Limitations +=========== + +Même si le logiciel est utilisable au quotidien, il n'est pas parfait. (Il +s'est cependant grandement amélioré dans ses dernières versions, je recommande +d'utiliser la version 0.5 qui corrige de nombreux soucis dans l'interface et la +consommation mémoire.) + +* Une fâcheuse tendance de navit et de ne pas prendre en compte les limites + géographiques des villes. En conséquence, la sélection de la destination + à partir de la ville et des noms de rues n'est pas fiable : certaines + rues n'apparaissent pas alors qu'elles sont enregistrées sur la carte, ou + (plus grave), peut se tromper de ville. Il m'est déjà arrivé de me rendre + à destination, dans la bonne rue, mais pas dans la bonne ville ! + + J'ai maintenant pris l'habitude de n'entrer les destinations qu'à partir + de la carte, et non pas à partir de l'index des rues. + +* Par rapport aux solutions commerciales, capables d'afficher l'état du + trafic, Navit est vraiment en retard. On peut résumer en disant qu'il + s'agit davantage d'une carte interactive qu'une solution de guidage, il + reste nécessaire de prévoir son trajet avant de partir. + +* Un autre regret est de ne pas pouvoir sélectionner des « points de + passage », pour affiner le trajet. La seule solution est de choisir + préparer à l'avance dan les favoris les destinations et les faire évoluer + au fur du trajet. + +* Enfin, contrairement aux gps embarqués, on est dépendant de la qualité du + support : si l'on dispose d'un portable avec écran brillant, on sera + forcément gêné lors du suivi de la navigation. + +.. image:: {filename}../images/Capture-Navit-1-e1332786990864.png + :width: 400 + :class: center + :alt: centre de Rennes + + +OpenstreetMap +============= + +Impossible de parler de navit sans aborder openstreetmap ! Pour faire une +analogie, openstreetmap est à la cartographie ce que wikipédia est à +l'encyclopédie : une plateforme donnant à chacun le moyen la possibilité de +contribuer. + +La navigation GPS est pour moi l'utilisation la plus pratique de ce service : +d'une part parce que les cartes sont libres, et d'autre part parce que cela +donne envie de contribuer à son tour : en rajoutant les feux aux carrefours, +les parkings, en fonction des différents trajets que l'on réalise; on voit à +l'utilisation les défauts sur les cartes, et une fois de retour chez soi, on +corrige la carte en fonction. + +OpenstreetMap change très vite, et les cartes sont mises à jour en continu. +C'est pourquoi je vous propose d'automatiser le téléchargement de vos cartes. +Rien de mieux pour ça qu'une tâche dans un cron ! + +Vous vous souvenez de l'url que je vous avais demandé de noter dans un coin +tout à l'heure ? C'est maintenant qu'elle va être réutilisée. + +.. code-block:: bash + + $ crontab -e + +Dans l'éditeur de texte qui s'ouvre, on va entrer notre tâche planifiée : + +.. code-block:: bash + + 25 3 * * 1 wget -O ~/sync/.navit/carte.bin ${url} > /dev/null 2>&1 + +Ainsi, la carte se mettra à jour automatiquement ! + +J'ai dit tout à l'heure qu'openstreetmap permettait à tout un chacun de +modifier les cartes, cela signifie que, comme wikipédia, la qualité des cartes +est inégale selon les endroits que vous visitez : il n'y a probablement pas de +problème dans une grande ville, mais cela risque d'être plus compliqué pour +retrouver le nom d'une rue dans un hameau ou un petit village. Dans ce cas, +n'hésitez pas à mettre à jour la carte ! (Ça n'est pas l'objet de l'article +ici, mais il existe de nombreux tutoriels pour vous expliquer comment faire.) + +Conclusion +========== + +J'ai parlé du coût de la solution au début de l'article : il s'agit du coût du +récepteur GPS. On peut en trouver par 30€ sur ebay, ce qui est investissement +suffisant pour se lancer (si l'on compare aux gps tactiles qui sont vendus en +supermarché). + +Pour ma part, j'utilise un récepteur `ND100` de globalsat_. + +Au final on dispose donc d'une aide à la navigation qui s'avère très pratique, +et assez amusante ! On a l'avantage de disposer de cartes gratuites et mises à +jour en permanence (même si la qualité laisse parfois à désirer), mais aussi de +ne pas dépendre d'un système fermé (il est possible de modifier les cartes à +l'aide de l'éditeur d'OpenstreetMap quand on rencontre des erreurs). + +.. _`Navit planet extractor`: http://maps3.navit-project.org/ +.. _openstreetmap: http://www.openstreetmap.org/ +.. _globalsat: http://www.ebay.com/sch/?_nkw=globalsat%20nd%20100&clk_rvr_id=327330038890 diff --git a/content/Informatique/2012-08-12-apache.rst b/content/Informatique/2012-08-12-apache.rst new file mode 100644 index 0000000..1101266 --- /dev/null +++ b/content/Informatique/2012-08-12-apache.rst @@ -0,0 +1,46 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Un code retour personalisé avec apache +###################################### + +:date: 2012-08-12 +:tags: Libre, Hébergement + +Petite astuce pour un problème que j'ai rencontré il y a quelques temps avec +apache. Je souhaitais modifier le code retour d'une requête (en l'occurrence +remplacer un code 403 par 404). + +J'ai été surpris de ne trouver aucun module pour le faire, sécurité, +redirection ou autre contrôle sur les requêtes. + +La solution trouvée fut d'utiliser un script cgi, qui se charge de faire la +réponse à la place d'apache, et est appelé en page d'erreur. Cela donne : + +.. code-block:: bash + + ScriptAlias /cgi-bin/ /home/www/cgi/ + ErrorDocument 403 /cgi-bin/404.cgi + +Le script en question est fait en bash pour simplifier les choses : + +.. code-block:: bash + + #!/bin/sh + echo Status: 404 Not Found + echo Content-type: text/html + echo + cat << EOM + + + 404 Not Found + +

Not Found

+

The requested URL ${REQUEST_URI} was not found on this server.

+
+
Apache/2.2.22 (Debian) Server at chimrod.com Port 80
+ + EOM + exit 0 + +et voilà ! diff --git a/content/Informatique/2012-08-18-rstodt.rst b/content/Informatique/2012-08-18-rstodt.rst new file mode 100644 index 0000000..f99b5bc --- /dev/null +++ b/content/Informatique/2012-08-18-rstodt.rst @@ -0,0 +1,68 @@ +.. -*- mode : rst -*- +.. -*- coding: utf-8 -*- + +Coloration syntaxique avec rst2odt +################################## + +:date: 2012-08-18 +:tags: Libre, reStructuredText +:logo: /images/kea.jpg +:summary: |summary| + +.. figure:: {filename}/images/kea.jpg + :figwidth: 75 + :figclass: floatleft + :alt: Arbre + + Image : Kea_ + + +|summary| + +.. |summary| replace:: + Le langage rst, déjà évoqué dans un `article précédent`_, possède plusieurs + formats sortie : pdf, odt, html, xml… Cependant, les outils pour générer la + sortie ne prennent pas tous les même paramètres, et il est difficile de + faire un fichier source qui soit compatible avec l'ensemble des + compilateurs. + +La coloration syntaxique +======================== + +La coloration syntaxique, par exemple, n'est pas traitée de la même manière +selon l'outil utilisé. Nous retrouvons deux directives : + +=========== =============================================== +Nom Outils +=========== =============================================== +code-block rst2pdf_, sphynx… +sourcecode rst2odt +=========== =============================================== + +La première est devenue un standard, la seconde n'est prise en compte que par +rst2odt (et est en plus un peu lourde à mettre en place). + +La modification +=============== + +Heureusement, c'est assez facile d'ajouter de nouvelles directives, et il est +possible de modifier le script à lancer pour prendre en compte la directive +code-block ! + +Vous pouvez télécharger le script modifié ici_. J'ai repris l'option +d'`inclusion de fichier`, mais je ne gère pas les limites (je n'en avais pas +besoin). + +Et voilà, ça s'utilise comme ça : + +.. code-block:: console + + $ python bin/rst2odt.py --strip-comments --stylesheet=resources/template.odt\ + --add-syntax-highlight source.rst source.odt + +.. _article précédent: {filename}2010-10-04-rst.rst +.. _rst2pdf: http://rst2pdf.ralsina.com.ar/ +.. _ici: http://chimrod.com/downloads/rst2odt.py +.. _inclusion de fichier: http://rst2pdf.ralsina.com.ar/handbook.html#file-inclusion +.. _Kea: http://www.flickr.com/photos/k_e_a/3325975129/ + diff --git a/content/Informatique/2012-11-09-fonctionnel.rst b/content/Informatique/2012-11-09-fonctionnel.rst new file mode 100644 index 0000000..06d75d0 --- /dev/null +++ b/content/Informatique/2012-11-09-fonctionnel.rst @@ -0,0 +1,190 @@ + +Programmation fonctionnelle +########################### + +:date: 2012-11-09 +:tags: Programmation + +Dans cet article, je vais essayer de présenter différents cas de programmation +fonctionnelle en essayant de partir d'un cas pratique pour présenter les +difficultés et solutions disponibles. + +Je vais présenter ici des exemples dans le langage python, par ce qu'il s'agit +d'un langage simple, pouvant être utilisé de manière fonctionnelle (dans une +certaine limite). Je me contente d'un python `basique` et ne vais pas chercher +entrer dans des syntaxes spécifiques, le but étant ici de servir de support, et +non pas de présenter le langage. + +Un besoin +========= + +Imaginons la situation suivante : une application reçoit des données d'un +client et doit les traiter. Ces données arrivent dans des fichiers textes, +chaque ligne du fichier correspond à une donnée à traiter. + +Un programme +============ + +Commençons le programme, pour lire le fichier commençons par le localiser : + +.. code-block:: python + + def get_file(nom): + chemin = os.path.join("repertoire", nom) + return open(chemin) + +Cette fonction est simple : elle prend en argument un nom de fichier, et +retourne le fichier correspondant. On peut également dire qu'elle effectue la +transformation suivante : + +.. code-block:: ocaml + + get_file: String -> File + +Cette notation indique que le type de la fonction est le suivant : elle prend +un string en entrée, et retourne un file en sortie. Nous l'utiliserons +régulièrement dans cet article. + +Dans notre cas, nous n'avons pas un fichier a traiter, mais une série de +fichiers. Nous allons donc devoir appeler la fonction sur tous nos nom de +fichiers. La première solution est la solution itérative, à travers une boucle +: + +.. code-block:: python + + def transforme(noms): + fichiers = [] + for nom in noms + fichiers.append(get_file(nom)) + return fichiers + +À la fin de l'exécution de la boucle, la liste `fichiers` contient la liste des +fichiers construits à partir de la liste `noms`. + +C'est une opération très fréquente et bien qu'elle soit très courte. Essayons +de réfléchir un peu à ce que nous venons de faire en terme de type : notre but +est de transformer une liste de String en liste de File de la manière suivante +: + +.. code-block:: ocaml + + transforme: List[String] -> List[File] + +Si l'on généralise, on peut essayer de créer une fonction qui aurait le schéma +suivant : + +.. code-block:: ocaml + + transforme: List[A] -> List[B] + +Cette fonction a par contre besoin d'une transformation à appliquer pour +transformer A en B, dans notre cas, cette transformation a déjà été créée plus +haut ! + +Notre schéma devient donc le suivant : + +.. code-block:: ocaml + + transforme: (A -> B) -> List[A] -> List[B] + +Récrivons donc notre fonction transforme de cette manière: + +.. code-block:: python + + def transforme(func, source): + results = [] + for nom in source + results.append(func(nom)) + return results + + fichiers = transforme(get_file, noms) + +Et voilà ! Nous avons maintenant notre fonction générique, destinée à changer +le contenu de notre liste. Qu'est ce que cela apporte par rapport à la version +impérative que nous avons écrit tout à l'heure ? En fait pas grand chose. Sauf +que la fonction `transforme` est présente nativement dans python. Elle +s'appelle en fait `map`, et effectue le même travail. + +Nous aurions donc tout aussi bien pu écrire : + +.. code-block:: python + + fichiers = map(get_file, noms) + +Une réflexion +============= + +Pourquoi avoir écrit tout ça ? Par ce que semblant de rien, nous avons changé +notre manière de concevoir le programme : au lieu d'écrire une suite +d'instructions qui s'exécutent séquentiellement, nous venons d'appliquer des +transformations dans un contexte : la liste des noms de fichiers est notre +contexte de base, sur lequel nous appliquons des transformations pour créer un +autre contexte. + +Ces transformations ne modifient pas notre contexte initial, et par la suite +les transformations que nous continueront d'appliquer ne modifieront rien non +plus de notre environnement. Dans cet esprit, l'ensemble du programme peut être +perçu comme un grande transformation qui s'applique sur un point d'entrée +initial. + +Une théorie +=========== + +La fonction `map` que nous venons de présenter ici, s'inscrit en fait dans un +cadre de fonctions plus vaste : les foncteurs_. Il s'agit d'une notion +mathématique que l'on retrouve appliquée en informatique. + +.. _foncteurs: http://fr.wikipedia.org/wiki/Foncteur + +Comme vu précédemment, un objet foncteur F est un objet ayant la signature +suivante : + +.. code-block:: ocaml + + map: (A -> B) -> F[A] -> F[B] + +Le foncteur a deux contraintes, qui sont plutôt intuitives: + +identité +-------- + +Soit la fonction `id` défini comme suit: + +.. code-block:: python + + def id(x): + return x + +alors on a l'égalité suivante : + +.. code-block:: python + + map(id, fichiers) == fichiers + +Autrement dit, le foncteur ne doit pas modifier la structure de la donnée. On +peut essayer de repenser la fonction `transforme` écrite plus haut pour briser +cette règle, je laisse au lecteur le soin de réfléchir à cette question. + +composition +----------- + +La deuxième contrainte est celle de la composition : + +.. code-block:: python + + map(f(g), source) = map(f, map(g, source)) + +C'est à dire qu'il est possible de composer les fonctions les entre elles : +c'est encore heureux, car cela permet de chaîner les traitements entre eux… + +Une conclusion +============== + +Notre contexte est ici une liste, mais nous allons voir par la suite qu'il en +existe beaucoup d'autres, ce qui va nous faciliter la vie… Cela va venir dans +les articles qui suivent. + +Une fois les deux contraintes validées, nous allons pouvoir construire de +nouveaux types basés sur ce foncteur. Et derrière la solution informatique mise +en place, je vais essayer de présenter les concepts mathématiques qui sont +derrière. diff --git a/content/Informatique/2013-04-20-gueule1.rst b/content/Informatique/2013-04-20-gueule1.rst new file mode 100644 index 0000000..6fa3f04 --- /dev/null +++ b/content/Informatique/2013-04-20-gueule1.rst @@ -0,0 +1,65 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Essai raté d'un plugin gedit +############################ + +:date: 20/04/2013 +:tags: Programmation, Libre, Humeur, gtk +:logo: /images/gedit.png + +.. default-role:: literal + +En relisant mes articles, j'ai décidé d'utiliser languageTool_ pour vérifier la +grammaire avant de les publier. Puis en regardant l'outil, j'ai voulu voir s'il +existait un plugin gedit permettant de l'intégrer dans l'édition d'un texte +(j'utilise vim, je sais que ma compagne utilise gedit pour écrire ses textes). + +Titivullus_ est disponible sur sourceforge, et est facile à installer (même si +l'auteur n'a pas compris comment fonctionnait SVN), par contre l'utilisation +n'est pas des plus pratiques : il faut charger la console d'erreur de gedit +(qui ne peut pas être réduite), et le plugin n'est pas configurable. + +.. _languageTool: http://www.languagetool.org/ +.. _Titivullus: http://sourceforge.net/projects/titivullus/ + +Heureusement, c'est du python ! +=============================== + +Le code n'est pas compliqué à comprendre (il n'est pas parfait, mais à au moins +le mérite d'être là), et j'ai commencé à le modifier : première étape, appeler +languagetool en ligne de commande plutôt que de lancer le serveur web. +Deuxième étape, surligner dans gedit la ligne en erreur pour éviter d'avoir à +passer par la console pour savoir ce qui ne va pas ; on se plonge dans +l'édition de `plugin sous gedit`_, et là, c'est le drame ! + +.. _`plugin sous gedit`: https://live.gnome.org/Gedit/PythonPluginHowTo + +Devant du code C +================ + +Le binding python est assez limité, il faut remonter dans l'API C pour trouver +ce que l'on cherche, et là : + +* erreur 404 dans l'API (par exemple les liens de l'« Object Hierarchy » de + GtkSourceView_) +* Des messages d'erreurs abscons dûs à l'introspection (par exemple en cas de + mauvais objet passé en paramètre) +* Des dépendances de plus en plus importantes à chaque nouvelle étape (`gedit`, + `gtk`, puis pango_\ …) + +Plus j'avance, et plus j'ai l'impression que le chemin qui reste à parcourir +est grand ! Qu'il est loin le temps où je m'étais penché sur Vala_ pour +découvrir ! J'ai finalement laissé tomber, en ayant l'impression d'avoir perdu +mon temps : mettre en place un plugin sous gedit est définitivement trop +compliqué pour pouvoir être réalisé facilement, sans se plonger dans le code +GTK et le connaître sur le bout des doigts. + +Dommage, pour une fois que j'avais envie de me plonger dans le code et +d'avancer… Je comprends que le greffon Titivullus soit resté à l'état de proff +of concept et que personne ne l'ai repris : cette petite aventure m'a fait +passer l'envie de me plonger dans du dev gnome ! + +.. _GtkSourceView: https://developer.gnome.org/gtksourceview/stable/GtkSourceView.html +.. _pango: https://developer.gnome.org/pango/stable/pango-Text-Attributes.html +.. _Vala: {filename}../Informatique/2010-06-11-vala.rst diff --git a/content/Informatique/2013-04-26-insecable.rst b/content/Informatique/2013-04-26-insecable.rst new file mode 100644 index 0000000..dd7734c --- /dev/null +++ b/content/Informatique/2013-04-26-insecable.rst @@ -0,0 +1,139 @@ +.. -*- rst -*- +.. -*- coding: utf-8 -*- + +L'espace fine insécable en HTML +=============================== + +:date: 2013-04-26 +:tags: Hébergement, Python, reStructuredText + +La typographie est bien souvent malmenée dès que l'on utilise le web comme +support. Pourtant, `les règles sont simples`_, et il est facile de les +appliquer quand on publie un document, à partir du moment ou cela ne se fait +pas à la main. Pour ma part, j'utilise le plugin typogriphy_ pour faire le +rendu des articles de ce blog. Ce plugin permet de convertir le texte écrit +dans un éditeur de texte brut en un texte destiné à être affiché dans une page +html : + +* Substitution des quotes et doubles quotes par des apostrophes et + guillemets +* Écriture en capitales des mots composés de majuscules +* Ajout d'espaces insécables pour éviter qu'un mot se retrouve seul sur une + ligne en fin de paragraphe. + +Un exemple de rendu est disponible sur le `site du projet`_. + +.. _les règles sont simples: http://edu.ca.edu/typo/ +.. _typogriphy: https://github.com/mintchaos/typogrify +.. _site du projet: http://static.mintchaos.com/projects/typogrify/ + +Ainsi, je n'ai pas à me soucier de la mise en page lors de la rédaction des +articles, la transformation se fait sur le texte html généré, cela permet de se +concentrer sur le contenu et non la mise en forme. + +On peut croire que ça n'est que du gadget et est complètement inutile, mais le +but de la typographie n'est pas de faire joli (même si l'esthétique à sa place, +bien sûr), le but est avant tout la lisibilité. + +Le problème +----------- + +Par contre, le plugin ne gère pas la langue française, dans le sens où il +n'insère pas d'`espace fine insécable`_ quand c'est nécessaire : + +* après les signe de ponctuation double (« |nbsp| ; |nbsp| : |nbsp| ? |nbsp| ! + |nbsp| ») +* entre les guillemets et le texte qu'ils contiennent +* séparateur de chiffre lors des numéros de téléphones… + +Quitte à disposer d'un plugin qui s'occupe de la mise en page, autant +l'utiliser jusq'au bout ; il est possible de modifier le plugin pour insérer ce +caractère quand il faut, mais beaucoup de polices n'intègrent pas ce caractère +dans leur table, utiliser le caractère unicode NNBSP_ peut donc causer des +problèmes si le navigateur ne gère pas le cas d'erreur. Ce défaut à d'ailleurs +poussé OpenOffice_ à ne pas l'utiliser dans les textes. + +Vous pouvez malgré tout utiliser le caractère NNBSP si vous êtes sûrs que la +police contient ce caractère dans sa table. Si ça n'est pas le cas, vous +risquez d'avoir des problèmes d'affichage. À noter que les versions d'IE8 et +les précedentes, qui ne gèrent pas correctement ce caractère, `sont encore +utilisées`_ par 6 % des utiliseurs, encore quelque temps et le problème ne +devrait plus se poser. + +.. _espace fine insécable: http://fr.wikipedia.org/wiki/Espace_fine_ins%C3%A9cable +.. _NNBSP: http://www.fileformat.info/info/unicode/char/202f/index.htm +.. _OpenOffice: http://wiki.openoffice.org/wiki/Non_Breaking_Spaces_Before_Punctuation_In_French_%28espaces_ins%C3%A9cables%29#Exclusion_of_the_NARROW_NO-BREAK_SPACE_.28U.2B202F.29 +.. _sont encore utilisées: http://www.w3schools.com/browsers/browsers_explorer.asp + +Les solutions +------------- + +S'il n'est pas possible d'utiliser un caractère unicode pour notre rendu, on +peut l'accompagner d'indication de mise en page pour obtenir ce que l'on +souhaite. Il y a même plusieurs solutions qui peuvent s'appliquer, elles sont +présentées sur stackoverflow_ — les problèmes sont généralement communs à +plusieurs personnes… + +.. _stackoverflow: http://stackoverflow.com/questions/595365/how-to-render-narrow-non-breaking-spaces-in-html-for-windows + +Espace insécable +~~~~~~~~~~~~~~~~ + +Cette espace là est reconnue et est utilisée partout ! Toutefois, si l'on a +pris l'habitude de lire du texte respectant la typographie française, on risque +d'être surpris par le texte généré (c'est pourtant la solution qui a été +retenue par OpenOffice), les signes de ponctuation donneront l'impression +d'être décolés du texte qu'ils accompagent. + +Il est possible de l'utiliser, mais en utilisant un attribut html pour en +réduire la taille. C'est possible avec l'attribut FONT-SIZE. Par contre, on +mélange le contenu et l'apparence : ne pas séparer le texte de la ponctuation +fait partie de la mise en page, pas du sens donné au texte. + +Espace fine +~~~~~~~~~~~ + +C'est l'autre solution : cette espace à la même largeur qu'une espace fine +insécable, mais risque de séparer le caractère du signe de ponctuation qui +l'accompage, pouvant laisser le texte sur une fin de ligne et le signe de +ponctuation en début de la ligne suivante… Par contre, on peut spécifier dans +les attributs que celle-ci ne doit pas être coupés. C'est faisable avec +l'attribut HTML NOWRAP_. Cela est pris en charge par la majorité des +navigateurs et permet d'obtenir le rendu voulu. Si l'on fait un copier-coller +du texte html dans un logiciel de traitement de texte, l'espacement sera +correctement préservé. + +.. _NOWRAP: http://www.w3schools.com/tags/att_td_nowrap.asp + +Le correctif +------------ + +J'ai retenu la seconde solution, et ai créé une branche github_ pour cette +version, que j'utilise actuellement pour le blog. + +Tout d'abord, le texte n'est substitué qu'à l'intérieur d'une balise HTML, les +attributs ne sont pas pris en compte, ça évite de casser l'affichage en allant +trop loin dans le traitement. + +Ensuite, étant donné qu'il s'agit de règle de typographie propre à la langue +française, cette substitution ne s'applique que dans le cas où la locale est +fixée à `fr_FR`, ce qui laisse le champ libre pour d'autres implémentations. + +Le remplacement (aucune espace n'est ajoutée, on ne fait que des substitutions) +se fait dans les conditions suivantes : + +* avant les signes de ponctuation double, +* entre les guillemets et le texte qu'ils contiennent, +* entre un chiffre et le symbole de pourcentage, +* entre deux chiffres. + +.. _github: https://github.com/Chimrod/typogrify + +Et voilà : on dispose ainsi d'un code html qui est déjà beaucoup plus soigné ! +On n'arrive pas à la cheville d'un pdf généré avec latex — il ne s'agit que +d'un blog — mais ça permet d'avoir déjà amélioré la présentation de son texte, +et de s'être un peu penché sur les problèmes de typographie… + +.. |nbsp| unicode:: 0xA0 + :trim: + diff --git a/content/Informatique/2013-05-07-guiderstodt.rst b/content/Informatique/2013-05-07-guiderstodt.rst new file mode 100644 index 0000000..f5181fc --- /dev/null +++ b/content/Informatique/2013-05-07-guiderstodt.rst @@ -0,0 +1,164 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Guide d'utilisation de rst2odt +============================== + +:date: 2013-05-07 +:tags: Libre, reStructuredText +:summary: |summary| +:logo: /images/rstodt/writing_75.jpg + + +.. figure:: {filename}/images/rstodt/writing.jpg + :figwidth: 150 + :figclass: floatright + :alt: Bureau + + Image : `AJ Cann`_ (creativecommons_) + +.. _creativecommons: http://creativecommons.org/licenses/by-nc-sa/2.0/deed.fr + + +|summary| + + +.. |summary| replace:: + J'ai déjà souvent abordé le langage reStructuredText_ dans mes articles, et + je l'utilise fréquement, que ce soit pour écrire sur ce blog ou publier + d'autres contenus. On présente souvent rst2pdf_ pour la publication, mais + il est également possible de générer une sortie vers libreoffice, + permettant de créer rapidement des documents avec une mise en page + maîtrisée. + +.. _reStructuredText: http://docutils.sourceforge.net/docs/ref/rst/introduction.html +.. _rst2pdf: http://rst2pdf.ralsina.com.ar/ + +Premiers pas +------------ + +On commence par installer les outils nécessaires : + +.. code-block:: console + + $ sudo aptitude install rst2odt + +et on lance la génération de la manière suivante : + +.. code-block:: console + + $ rst2odt document.rst document.odt + +On peut tout de suite consulter le fichier généré pour voir le résultat. Le +rendu est moins aguicheur que celui généré avec rst2pdf, mais il est possible +de changer ça. + +Environnement +------------- + +Plutôt que de lancer la commande à chaque fois, il est préférable de se créer +un environnement qui va nous servir chaque fois que nous aurons besoin de +publier un nouveau document. + +On va se créer un Makefile pour automatiser la génération du document : + +.. code-block:: makefile + + resources/template.odt: resources/template.rst + rst2odt resources/template.rst resources/template.odt + + %.odt: %.rst resources/template.odt + rst2odt --create-links --strip-comments --stylesheet=resources/template.odt --add-syntax-highlight $< $@ + cp $@ resources/templates.odt + +Ainsi, il suffira de lancer la commande `make document.odt` pour générer la +sortie à partir du fichier `document.rst` (`document` est bien sûr à adapter en +fonction du nom du fichier sur lequel vous travaillez). + +J'ai créé une archive_ qu'il vous suffit de décompresser pour pouvoir +commencer à travailler ; elle comprend le fichier `makeFile` présenté ci-dessus, +ainsi qu'un template contenant des éléments de base. + +.. _archive: {filename}/resources/rstodt/rst.zip + +Utiliser les templates +---------------------- + +L'avantage d'utiliser un format balisé est que vous n'avez pas vous soucier du +formattage. Le document généré est prêt à être mis en page, vous n'avez plus +qu'à travailler sur le modèle. + +La commande `make` a mis à jour le fichier modèle à partir de votre document de +travail. Vous pouvez donc maintenant modifier les styles à travers libreoffice, +ils seront automatiquement intégrés dans vos prochaines étapes de génération. + +rst2odt applique ses propres styles au document, ceux-ci héritant des styles +par défaut d'OpenOffice, vous pouvez donc utiliser vos template habituels pour +la mise en forme de votre document. La liste est présentée sur la +documentation_ de l'application. + +En séparant le contenu de l'application, on peut ainsi facilement réutiliser un +style d'un document à un autre, on se décharge de la mise en page pendant tout +le temps de la rédaction. + +.. _documentation: http://docutils.sourceforge.net/docs/user/odt.html + +Aller plus loin +--------------- + +Le langage reStructuredText utilise des directives_ pour mettre en forme le +texte. Toutes les applications ne les gèrent pas correctement, et certains +outils ont décidé de rajouter leurs propres directives ; bref c'est un peu le +bordel. + +La plupart des directives sont correctement prises en compte : + +* les tableaux +* les images +* les notes de bas de page (À l'exception près qu'il est impossible de référencer une note de bas de page dans une autre note.) +* la table des matières +* les rôles + +Cela devrait répondre à 90 % des usages courants. J'ai déjà présenté un +correctif pour `ajouter la coloration syntaxique`_ dans notre document, et +ainsi utiliser les mêmes directives que rst2pdf_ pour insérer du +code, voici la liste de quelques directives propres à rst2odt : + +:meta_: Permet de renseigner les méta-données dans le document. + +Et d'autres qui sont plus ou moins bien suportées : + +:container_: Permet d'appliquer un style particulier sur un bloc de texte. + +:raw_: Pour insérer du code xml au format openDocument. + + +Au final +-------- + +C'est bien pratique de pouvoir écrire son document dans un bloc note, sur une +machine plutôt poussive, et malgré ça bénéficier de la force de mise en page de +LibreOffice. On s'affranchit de la plate-forme sur laquelle on travaille (on +peut éditer son fichier sous gedit sur linux, puis sur le bloc-note de +windows, et le reprendre dans un terminal via vim), et lancer la transformation +une fois le texte écrit + +Vient alors la phase de mise en page, mais on est alors aidé par l'outil de +traitement de texte pour ça, et surtout, par le fait que le document généré +inclu des styles sur sa totalité, c'est donc tout de suite beaucoup plus +facile, et se fait très rapidement. + +Pour ma part, c'est une solution que j'utilise et recommande, et qui au final +donne de meilleurs résultats que rst2pdf. + + +.. _directives: http://docutils.sourceforge.net/docs/ref/rst/directives.html + +.. _meta: http://docutils.sourceforge.net/docs/user/odt.html#the-meta-directive +.. _table : http://docutils.sourceforge.net/docs/user/odt.html#the-table-directive +.. _container: http://docutils.sourceforge.net/docs/user/odt.html#the-container-directive +.. _raw: http://docutils.sourceforge.net/docs/user/odt.html#the-raw-directive + +.. _ajouter la coloration syntaxique: {filename}2012-08-18-rstodt.rst + +.. _AJ Cann: http://www.flickr.com/photos/ajc1/3531532114/in/photostream/ diff --git a/content/Informatique/2013-05-08-fcron2cron_en.rst b/content/Informatique/2013-05-08-fcron2cron_en.rst new file mode 100644 index 0000000..b39916e --- /dev/null +++ b/content/Informatique/2013-05-08-fcron2cron_en.rst @@ -0,0 +1,62 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +================== +From fcron to cron +================== + +:date: 2013-05-08 +:tags: Libre, Administration +:summary: |summary| +:logo: /images/time/time_75.jpg +:lang: en +:slug: fcron-to-cron +:translation: true +:status: draft + + +.. figure:: {filename}/images/time/time.jpg + :figwidth: 150 + :figclass: floatleft + :alt: Pavement + + Image : `Toni Verdú Carbó`_ (creativecommons_) + +.. _Toni Verdú Carbó: http://www.flickr.com/photos/tonivc/2283676770/in/photostream/ +.. _creativecommons: http://creativecommons.org/licenses/by-nc-nd/2.0/deed.fr + +|summary| + +.. |summary| replace:: + Debian Wheezy is now out, and this new realease removed some packages, + including fcron_. + Il s'agit du + gestionnaire de tâche planifiées que j'utilisais jusqu'alors. Ce petit + guide a pour vocation de vous expliquer comment migrer la configuration. + +.. _fcron: http://fcron.free.fr/ + +Fcron avait l'avantage de pouvoir gérer l'arrêt de la machine, et lancer les +tâches en attente lors du redémarrage. Quand on s'auto-héberge, cela permet de +prendre en charge les coupures inopinées, et se passer du couple cron/anacron. +Debian a fait le choix de préférer ce dernier couple plutôt que fcron, voici +donc un petit guide pour passer de l'un a l'autre. + +Migration ? +=========== + +Pour commencer, pas de panique, le paquet est supprimé des dépôts, mais reste +parfaitement fonctionnel sur votre machine. Vous n'avez donc pas besoin de vous +précipiter, tout va continuer de tourner tout seul comme auparavant. Vous +pouvez même choisir de ne pas migrer et continuer à l'utiliser. Toutefois, +si des failles de sécurités sont trouvées sur le programme, aucune mise à jour +ne sera effectuée : c'est à vous de vous tenir informé du développement de +l'application et de faire l'installation. + +Voici un programme python qui se charge de faire la migration d'un fcrontab +vers un crontab. Il ne fait que générer les fichiers de configuration, et +n'enregistre rien sur le système. Le script va lire les fcrontab enregistrées +dans le répertoire `/var/spool/fcron/` et génère en sortie les crontab +correspondantes pour chacun de ces utilisateurs. + +Les instructions spécifiques sont converties, dans la mesure du possible. diff --git a/content/Informatique/2013-05-09-fcron2cron.rst b/content/Informatique/2013-05-09-fcron2cron.rst new file mode 100644 index 0000000..f48821a --- /dev/null +++ b/content/Informatique/2013-05-09-fcron2cron.rst @@ -0,0 +1,123 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +=============== +De fcron à cron +=============== + +:date: 2013-05-09 +:tags: Libre, Python, Administration +:summary: |summary| +:logo: /images/time/time_75.jpg +:lang: fr +:slug: fcron-to-cron + + +.. figure:: {filename}/images/time/time.jpg + :figwidth: 150 + :figclass: floatleft + :alt: Pavement + + Image : `Toni Verdú Carbó`_ (creativecommons_) + +.. _Toni Verdú Carbó: http://www.flickr.com/photos/tonivc/2283676770/in/photostream/ +.. _creativecommons: http://creativecommons.org/licenses/by-nc-nd/2.0/deed.fr + +|summary| + +.. |summary| replace:: + Debian Wheezy est sortie, et cette nouvelle version a fait un peu de ménage + dans les paquets disponibles. Parmi ceux-ci, fcron_ a disparu. Il s'agit du + gestionnaire de tâche planifiées que j'utilisais jusqu'alors. Ce petit + guide a pour vocation de vous expliquer comment migrer la configuration. + +.. _fcron: http://fcron.free.fr/ + +Fcron avait l'avantage de pouvoir gérer l'arrêt de la machine, et lancer les +tâches en attente lors du redémarrage. Quand on s'auto-héberge, cela permet de +prendre en charge les coupures inopinées, et se passer du couple cron/anacron. +Debian a fait le choix de préférer ce dernier couple plutôt que fcron, voici +donc un petit guide pour passer de l'un a l'autre. + +Migration ? +=========== + +Pour commencer, pas de panique, le paquet est supprimé des dépôts, mais reste +parfaitement fonctionnel sur votre machine. Vous n'avez donc pas besoin de vous +précipiter, tout va continuer de tourner tout seul comme auparavant. Vous +pouvez même choisir de ne pas migrer et continuer à l'utiliser. Toutefois, +si des failles de sécurités sont trouvées sur le programme, aucune mise à jour +ne sera effectuée : c'est à vous de vous tenir informé du développement de +l'application et de faire l'installation. + +La transformation +================= + +Voici un `script python`_ qui se charge de faire la migration d'un fcrontab +vers un crontab. Il ne fait que générer les fichiers de configuration, et +n'enregistre rien sur le système. Le script va lire les fcrontab enregistrées +dans le répertoire `/var/spool/fcron/` et génère en sortie les crontab +correspondantes pour chacun de ces utilisateurs. + +.. _script python: {filename}/resources/fcron2cron.py + +Usage +~~~~~ + +Le programme doit être lancé en root pour pouvoir lire les fichiers présents +dans le répertoire `/var/spool/fcron/` ainsi que les fcrontabs des différents +utilisateurs du système: + +.. code-block:: console + + $ mkdir crontabs + $ cd crontabs + $ sudo python ~/fcron2cron.py + +Il y a beaucoup moins de paramètres chez cron que fcron, il est toutefois +possible de convertir quelques instructions : + +Les options +~~~~~~~~~~~ + +Les seules options possibles dans cron sont celles qui concernent le mail : + +`mail(bool)` devient `MAILTO=""` si bool est à false `mailto(string)` devient +`MAILTO="string"` + +Les autres options sont ignorées\ [#]_. + + +Les directives +~~~~~~~~~~~~~~ + +Les directives `hourly`, `daily`\ [#]_, `weekly`, `monthly` sont transformées +en leur équivalent dans cron, ainsi que leur équivalent `mid-*ly`. Les +directives `mins`, `hours`, `days`, `mons`, `dow` ne sont pas prises en compte +et sont ignorées dans la ligne générée. + +L'édition +========= + +Le programme ne fait pas l'insertion de la crontab dans le système, ainsi, dans +le cas ou une telle crontab existe déjà, elle ne sera pas écrasée. C'est à +l'adminstrateur de mettre le paramétrage à jour. Une fois le script lancé, des +fichiers `UTILISATEUR.crontab` vont être générés. + +Si l'utilisateur n'a pas de crontab correspondante, il est possible de le +charger directement avec la commande suivante : + +.. code-block:: console + + # crontab -u ${USER} ${USER}.crontab + +Si l'utilisateur possède déjà une crontab, il va falloir éditer le fichier pour +le faire correspondre. Maintenant qu'il ne reste plus que ça à faire, il est +temps de se remonter les manches et y aller à la main ! Une fois que les +modifications sont faites, vous pouvez désinstaller fcron de votre système. + +Notes +===== + +.. [#] Y compris les options en début de commande (ligne débutant par `&`) +.. [#] `nightly` est traité de la même manière diff --git a/content/Informatique/2013-05-23-ocamlfind_en.rst b/content/Informatique/2013-05-23-ocamlfind_en.rst new file mode 100644 index 0000000..a725a39 --- /dev/null +++ b/content/Informatique/2013-05-23-ocamlfind_en.rst @@ -0,0 +1,63 @@ +.. -*- rst -*- +.. -*- coding: utf-8 -*- + +============================ +A local repository for ocaml +============================ + +:date: 2013-05-23 +:tags: ocaml +:summary: |summary| +:logo: /images/ocaml/camel.jpg +:slug: un-depot-local-pour-ocaml +:lang: en + +.. figure:: {filename}/images/ocaml/camel_medium.jpg + :figwidth: 150 + :figclass: floatleft + :alt: Pavement + + Image : `@Doug88888`_ (creativecommons_) + +.. _@Doug88888: http://www.flickr.com/photos/doug88888/3458057235/ +.. _creativecommons: http://creativecommons.org/licenses/by-nc-sa/2.0/deed.fr + +|summary| + + +.. |summary| replace:: + Today, ocaml is obsolete in the debian packages : the most of the + librairies are still linked with Ocaml3 althought Ocaml4 is out since + almost a year. When we need to develop with Ocaml4, we have to recompile + all the dependencies, but this implies to install them for the whole + system. But we can use a local repository with some findlib configuration. + +Findlib is now a required tool for an Ocaml project compilation. Each +application uses now findlib for searching the dependencies, and the linking +phase. + +We first need to create a local configuration in wich we write where to find +the packages : + + +.. code-block:: bash + + destdir="/home/chimrod/ocaml/packages/" + path="/home/chimrod/ocaml/packages/:/usr/local/lib/ocaml/4.00.1:/usr/lib/ocaml:/usr/lib/ocaml/METAS" + +:destdir: is the path where we want to install the newly compiled packages. +:path: is the path list where to find the packages. + +Of course, you need to replace `/home/chimrod/` by your own installation path. +It must be an absolute path. + +The path to this file can be saved with the shell environnement ; we just need +to reference it in the `.bashrc` file : + +.. code-block:: bash + + export OCAMLFIND_CONF=/home/chimrod/ocaml/ocamlfind.conf + +That's now : each new package will now be installed in your packages directory, +and the compilation will also look for this path for the required +dependencies : you do not have to install the packages as root anymore. diff --git a/content/Informatique/2013-05-23-ocamlfind_fr.rst b/content/Informatique/2013-05-23-ocamlfind_fr.rst new file mode 100644 index 0000000..4cf81fd --- /dev/null +++ b/content/Informatique/2013-05-23-ocamlfind_fr.rst @@ -0,0 +1,77 @@ +.. -*- rst -*- +.. -*- coding: utf-8 -*- + +========================= +Un dépôt local pour ocaml +========================= + +:date: 2013-05-23 +:tags: ocaml +:summary: |summary| +:logo: /images/ocaml/camel.jpg +:slug: un-depot-local-pour-ocaml +:lang: fr + +.. figure:: {filename}/images/ocaml/camel_medium.jpg + :figwidth: 150 + :figclass: floatleft + :alt: Pavement + + Image : `@Doug88888`_ (creativecommons_) + +.. _@Doug88888: http://www.flickr.com/photos/doug88888/3458057235/ +.. _creativecommons: http://creativecommons.org/licenses/by-nc-sa/2.0/deed.fr + +|summary| + + +.. |summary| replace:: + Ocaml n'est pas à jour dans debian : l'ensemble des librairies sont encore + restées sur la version 3, alors qu'Ocaml4 est sorti depuis près d'un an. Il + peut être nécessaire de développer en utilisant ocaml4, mais on est alors + obligé de compiler soit même les dépendances, et les installer pour + l'ensemble du système, ce qui n'est pas souhaité, ni toujours possible + (problème de droits). Cette petite recette permet de se créer un dépôt + local en utilisant findlib. + +Findlib est devenu de facto une brique essentielle pour la gestion des +librairies et les dépendances d'un projet. Aujourd'hui toute compilation +utilise findlib pour rechercher les dépendances et faciliter la chaîne de +compilation. La documentation_ du projet est assez dense, mais heureusement, il +est très configurable. + +.. _documentation: http://projects.camlcity.org/projects/dl/findlib-1.3.3/doc/guide-html/index.html + +Nous allons commencer par nous créer un fichier de configuration local qui va +indiquer où stocker nos librairies : + +.. code-block:: bash + + destdir="/home/chimrod/ocaml/packages/" + path="/home/chimrod/ocaml/packages/:/usr/local/lib/ocaml/4.00.1:/usr/lib/ocaml:/usr/lib/ocaml/METAS" + +:destdir: correspond à l'emplacement d'installation des nouvelles librairies. +:path: est l'ensemble des répertoires où chercher les dépendances. Ici + nous déclarons tout d'abord notre dépôt local avant de référencer + les répertoires système. + +Il faut bien sûr remplacer `/home/chimrod/` par le chemin sur votre +installation : celui-ci doit être écrit en absolu pour le bon fonctionnement de +findlib. + +Le répertoire de configuration peut être exporté via une variable shell, ce qui +va nous faciliter la vie ; il ne nous reste plus qu'à référencer ce fichier de +configuration dans notre environnement : + +.. code-block:: bash + + export OCAMLFIND_CONF=/home/chimrod/ocaml/ocamlfind.conf + +Là encore, remplacer le chemin par celui qui est le votre sur votre système. + +On peut mettre cette chaîne dans le fichier `.bashrc` pour que le paramétrage +soit pris en compte dans chaque session ouverte dans le terminal. + +Et le tour est joué : toutes nos nouvelles dépendances vont s'installer +directement dans notre répertoire personnel, et nous n'avons plus besoin +d'aller poluer le système avec nos compilation. diff --git a/content/Informatique/2013-06-02-roi_con.rst b/content/Informatique/2013-06-02-roi_con.rst new file mode 100644 index 0000000..e1f4d36 --- /dev/null +++ b/content/Informatique/2013-06-02-roi_con.rst @@ -0,0 +1,128 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +===================================== +Internet, la guerre des médiacultures +===================================== + +:date: 2013-06-02 +:tags: Libre, Infowar +:summary: Les entreprises pourront toujours tenter de brider internet, la + créativité des internautes sera toujours plus forte, plus réactive. +:logo: /images/roi/roi_75.jpeg +:lang: fr + +.. figure:: {filename}/images/roi/roi_150.jpeg + :class: floatright + :alt: Un roi playmobil + +Une petite histoire +=================== + +Il était une fois, dans un royaume lointain, un roi qui n'était pas aimé de son +peuple. Ce dernier chantait une chanson dans tout le royaume dont le refrain +était le suivant : + + Longue vie au roi bouffon, le roi très con qu'est très très con ! + +Le roi lassé d'entendre cette chanson, convoqua ses ministres pour agir. Il +fut décidé que le plus sage était d'interdire tout simplement à ces sujets de +chanter cette chanson, et le texte fut mis à l'index. Toute personne surprise +en train de chanter cette chanson serait immédiatement envoyée aux galères. + +Les troubadours et chansonniers furent obligés de s'y plier. Mais dans les +tavernes, les champs et les chaumières, la population continuait de fredonner. + +Cela rendit le roi furieux, qui demanda aux gardes de patrouiller à la +recherches des chanteurs et de les mettre aux fers immédiatement, mais cela ne +changea rien, les gens continuaient, non plus à la chanter, mais à siffler la +chanson, sous le nez des gardes qui ne pouvaient rien faire puisque le texte +n'était pas prononcé ! Mais personne n'était dupe, et le roi continuait de +tourner en bourrique. + +Le roi, qui se faisait vieux, dépensa son énergie dans ce combat, les finances +de son royaume, et sa santé commença à se dégrader. + +Le business Internet +==================== + +Peut-on censurer ce qui circule sur internet ? Oui bien sûr, tout contenu qui y +est publié est sous la responsabilité d'une personne, morale ou physique. Après +longtemps s'être demandé qui devait être cette personne responsable +(l'hébergeur, le fournisseur d'accès), la LCEN a mis un peu d'ordre dans tout +ça. + +Aujourd'hui, il n'est pas possible de diffamer, calomnier, porter préjudice +parce que l'on utilise le web pour clamer son fiel, et les avocats se font un +plaisir d'envoyer des courriers de mise en demeure aux contrevenants — et c'est +très bien comme ça. + +Par contre, les entreprises savent que le droit à l'oubli n'existe pas sur le +web, et ont bien compris qu'une critique bien acerbe en première page de google +porte préjudice à l'image de marque. Des budgets sont dépensés pour que la +marque soit correctement représentée sur le net ; voyons par exemple `comment +nespresso transforme wikipédia en une brochure publicitaire`_ + +Que ce passe-t-il quand le business rencontre la loi ? Généralement rien de +très bon… Et c'est pareil ici : les lettres de mise en demeure servent de +menaces, et l'actualité nous en a fourni `un exemple très récemment`_. + +Stratégie et tactiques +====================== + +Heureusement, les internautes ne sont pas dupes, et face aux stratégies des +entreprises pour asseoir leur image, disposent via le web d'un incroyable outil +pour réponse. Non, internet ne sert pas qu'à regarder des chats qui jouent du +piano ! Michel de Certeau, dans `L'invention du quotidien`_, fait la différence +entre `stratégie` et `tactiques`. Là où la stratégie est planifiée, la tactique +`fait du coup par coup. Elle profite des « occasions » et en dépend. […] Il lui +faut utiliser, vigilante, les failles que les conjonctures particulières +ouvrent dans la surveillance du pouvoir propriétaire. Elle y braconne. Elle y +crée des surprises. Il lui est possible d'êre là où l'on ne l'attend pas. Elle +est ruse.` + +Les combats qui se jouent aujourd'hui sur internet donnent un sens très +actuels à ces mots. Les internautes ne pourront jamais faire face à l'armada +d'avocats prêts à dégainer au moindre signe d'ironie sur les forums. Mais ces +avocats sont démunis face à un `effet streisand`_, qu'ils ne peuvent pas +contrôler. Le jeu de pouvoir entre les internautes et les régulateurs du web +n'est pas fini, et les internautes savent mobiliser leurs ressources dès +qu'ils sentent que l'on porte atteinte à leur réseau. Cela m'impressionne à +chaque fois. + +La loi est respectée, par contre le combat est perdu pour celui qui cherchait à +faire plier un site, à donner à Internet la forme qu'il souhaitait : la réalité +ne se laisse pas contrôler si simplement… L'information restera libre ! + +.. _comment nespresso transforme wikipédia en une brochure publicitaire: http://thierry-klein.speechi.net/2009/12/01/comment-nespresso-transforme-wikipedia-en-brochure-publicitaire/ + +.. _un exemple très récemment: https://linuxfr.org/news/premiere-mise-en-demeure-pour-l-association-linuxfr +.. _L'invention du quotidien: https://fr.wikipedia.org/wiki/Michel_de_Certeau#L.27analyse_du_.C2.AB_braconnage_culturel_.C2.BB +.. _effet streisand: https://fr.wikipedia.org/wiki/Effet_Streisand + +La fin de l'histoire +==================== + +Après la mort du roi, le prince prit la couronne. Lors de la cérémonie, la +foule cria : + + Le roi est mort, vive le roi ! + +Et quelqu'un ajouta : + + Vive le roi bouffon, le roi très con qu'est très très con ! + +Refrain qui fut repris sur toute la place par la population. C'est alors que le +roi paru au balcon du palais, et il se mit à chanter : + + Longue vie au roi bouffon, le roi très con qu'est très très con ! + +La foule chanta avec le roi, mais rapidement le malaise s'installa, et bientôt +plus personne ne chantait. En chantant cette chanson, le roi venait de lui +retirer son aspect contestataire : comment peut-on chanter cette chanson contre +le roi, si le roi lui-même se met à la chanter ? Par cette action, il venait de +résoudre la crise qui se tramait dans le royaume. Les gens rentrèrent chez eux +et l'on n'entendit plus jamais ce refrain. + +Mais à part dans les contes de fées, existe-t-il des rois capable d'aller au +balcon pour chanter haut et fort les critiques de la foules ? diff --git a/content/Informatique/2013-06-08-unplugged.rst b/content/Informatique/2013-06-08-unplugged.rst new file mode 100644 index 0000000..4143ed0 --- /dev/null +++ b/content/Informatique/2013-06-08-unplugged.rst @@ -0,0 +1,72 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +CS Unplugged +============ + +:date: 2013-06-08 +:tags: Libre, Livre +:summary: |summary| +:logo: /images/unplugged/unplugged.jpg + +.. image:: {filename}/images/unplugged/together.gif + :width: 320 + :class: floatright + :alt: Together with computer + +Il y a quelques années, j'avais découvert le livre `Computer Science +Unplugged`. La semaine dernière, je suis retombé sur le pdf, et l'ai relu avec +le même intérêt. D'ou cet article pour faire partager cette (re)découverte. + +|summary| + +.. |summary| replace:: + `CS Unplugged`_ est un livre pour faire découvrir l'informatique, sans + ordinateur. Il s'agit d'un support pédagogique, qui explique de manière + très claire comment fonctionne l'informatique, le format des données que + traite l'ordinateur, et comment celui-ci fait pour traiter les + informations. + +.. _CS Unplugged: http://csunplugged.org/ + +Je n'ai pas de relations avec le monde enseignant, et ne me tiens pas au +courant de la manière dont l'informatique est traitée en classe. Pourtant je +trouve que ce support de cours est intéressant à plus d'un titre : + +* tout d'abord il est libre ! C'est suffisamment rare pour mériter d'être + souligné. Le livre est diffusé sous licence creativecommons et les sources + (au format .doc) sont `téléchargeable sur le site`_. + +* ensuite il est vraiment très pédagogique. Je ne me suis pas ennuyé en le + lisant, et les exemples sont vraiment bien introduits. + +.. _téléchargeable sur le site: http://csunplugged.org/open-source-edition-ms-word + +.. image:: {filename}/images/unplugged/parity.jpg + :class: floatleft + :alt: Together with computer + +L'exemple ci-contre est une explication des bits de parités et du contrôle des +erreurs. Comme l'ensemble des activités, cela se fait avec des cartes ou des +images, et le but derrière l'activité est de comprendre comment l'ordinateur +fonctionne. À la lecture de cette image, avez-vous compris comment la fille a +pu deviner quelle carte avait été retournée ? (Je vous ai donné un indice en +parlant de bits de parité ; imaginez que chaque carte représente un bit). Si +vous ne trouvez pas, allez-voir l'activité 4 à la page n°31 ! + +Chaque activité est accompagnée d'un peu de théorie, ainsi que d'exemples issus +de la vie courante (ici l'utilisation des sommes de contrôles dans le n°ISBN +des livres). + +Les activités vont à chaque fois un peu plus loin dans la complexité, mais tout +en restant facilement abordable ; à la fin du livre, vous serez même capable +d'expliquer le principe du `tri rapide`_ ! + +.. _tri rapide: https://fr.wikipedia.org/wiki/Tri_rapide + +Si vous avez besoin de faire découvrir l'informatique, où si vous êtes à la +recherche d'une pédagogie qui tourne autour de l'ordinateur, de la théorie de +l'information et des algorithmes, vous trouverez probablement votre bonheur +dans ce livre — la page de couverture parle d'activité d'éveil à partir de +l'école primaire, mais sans limitation d'âge, et ce serait dommage de passer à +côté de cette pépite… diff --git a/content/Informatique/2013-07-21-shifty.rst b/content/Informatique/2013-07-21-shifty.rst new file mode 100644 index 0000000..82d9206 --- /dev/null +++ b/content/Informatique/2013-07-21-shifty.rst @@ -0,0 +1,176 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +==================== +Astuces pour awesome +==================== + +:date: 2013-07-21 +:tags: Libre, awesome +:summary: |summary| +:logo: /images/awesome/tiling.jpg + +.. figure:: {filename}/images/awesome/tiling.jpg + :figwidth: 150 + :figclass: floatleft + :alt: Pavement + + Image : `Lauren Manning`_ (creativecommons_) + +.. _creativecommons: http://creativecommons.org/licenses/by/2.0/ +.. _Lauren Manning: http://www.flickr.com/photos/laurenmanning/2318922360/in/photostream/ + +|summary| + +.. |summary| replace:: + Le WM awesome est majoritairement utilisé par des utilisateurs qui passent + du temps à configurer leur bureau (ou qui n'ont pas peur de le faire) et + peut être paramétré de bien des manières ; les recettes ne manquent pas sur + le wiki. Voici ici quelques astuces issues de mon utilisation. + +Intégration avec gnome +====================== + +Awesome est un gestionnaire de fenêtre et ne remplace pas un gestionnaire de +bureau et tous ses avantages : monter automatiquement les clefs usb branchées, +conserver le mot de passe ssh pour la session, etc. + +Gnome permet de remplacer le gestionnaire par un autre, ce que nous allons +mettre à profit pour utiliser awesome à la place de celui proposé par défaut. +Vous pouvez donc échapper à l'affreux `Gnome Shell`_ et passer sous en +gestionnaire ergonomique… + +Un guide est disponible sur le wiki_ et une fois configuré, vous n'avez plus +qu'à choisir gnome comme session de démarrage : awesome sera automatiquement +lancé et utilisé comme gestionnaire de fenêtre ! + +Il s'agit de la principale astuce car elle permet de lancer un nombre important +de services qui ne sont pas pris en charge par un simple gestionnaire de +fenêtre. + +.. _Gnome Shell: https://fr.wikipedia.org/wiki/GNOME_Shell +.. _wiki: http://awesome.naquadah.org/wiki/Quickly_Setting_up_Awesome_with_Gnome/fr + +.. image:: {filename}/images/awesome/menu.jpg + :class: floatright + :alt: Session menu + +Gérer la session +================ + +Maintenant que awesome est lancé dans une session gnome, on peut lancer des +commandes DBUS sans difficultées : nous allons en profiter pour ajouter au menu +d'awesome la possiblité de gérer sa session. Le code suivant permet de +rajouter au menu sous menu « system » qui contiendra les actions « quit », +« restart » et « halt » permetant d'éxécuter les commandes de déconnexion +directement : + +.. code-block:: lua + + mysystemmemu = { + {"quit", "dbus-send --session --type=method_call --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.Logout uint32:1"}, + {"restart", 'dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Restart' }, + {"halt", 'dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop'}, + + } + + mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon }, + […] + { "system", mysystemmemu } + +Les commandes DBUS proviennent du `forum ubuntu`_ ; d'une manière générale, +DBUS permet de faire énormément de chose avec son système (note pour plus tard, +trouver un annuaire des commandes). + +.. _forum ubuntu: http://forum.ubuntu-fr.org/viewtopic.php?pid=7615111#p7615111 + +Afficher le calendrier +====================== + +Par défaut, awesome affiche l'heure et la date dans la bare de menu, mais aucun +calendrier n'est disponible. Pour ceux qui ont besoin d'un simple calendrier et +non d'un agenda, je recommande gsimplecal_ qui se contente d'afficher le mois +en cours. On peut facilement modifier la configuration pour lancer +l'application dès que l'on clic sur la date : il suffit de modifier le textbox +déjà existant pour lui ajouter un évènement sur le clic de la souris : + +.. code-block:: lua + + -- Create a textclock widget + mytextclock = awful.widget.textclock({ align = "right" }) + mytextclock:buttons(awful.util.table.join( + -- Launch on clic + awful.button({ }, 1, function() awful.util.spawn_with_shell("gsimplecal") end + )) + + +.. _gsimplecal: http://dmedvinsky.github.io/gsimplecal/ + +Utiliser les touches média +========================== + +.. image:: {filename}/images/awesome/medias.png + :class: floatleft + :alt: Media keys + +Vous avez peut-être des touches d'accès rapide sur votre clavier pour le mail, +lancer le navigateur web… Ce sont des touches médias, qui peuvent être +interceptées par le gestionnaire de fenêtre pour lancer les actions +appropriées. On va se servir de ces touches pour lancer les applications dont +nous avons besoin. + +Toutefois, j'ai rarement besoin d'avoir plus d'un client mail ou un navigateur +lancé. De même, je passe souvent d'une recherche sur le web à autre chose, +avant de retourner sur le navigateur. J'ai donc pris l'habitude de le garder +lancé et ouvert dans un onglet à part. Ce que je propose permet l'action +suivante : lorsque l'on appuie sur la touche « web » du clavier, on va demander +au gestionnaire de fenêtre d'afficher le `tag` dans lequel est tourne. Si ce +`tag` n'est pas présent sur le bureau : on va le créer, et lancer au passage le +navigateur, ainsi, on n'a pas besoin de savoir si l'application est lancée ou +non, c'est Awesome qui se charge de faire ça pour nous. + +Il existe une extension permetant de gérer les tags et les applications +facilement : shifty_, elle vient se substituer au gestionnaire de tag +implémenté par défaut, et permet de faire beaucoup de choses très +intéressante : + +* lancer une application au démarrage d'un tag +* … + +Dans la configuration de shifty, il faut déclarer ses tags ainsi : + +.. code-block:: lua + + shifty.config.tags = { + ["musique"] = { position = 100, icon = music_icon, spawn = "gmpc"}, + ["mail"] = { position = 101, icon = mail_icon, spawn = "icedove"}, + ["web"] = { position = 102, icon = web_icon, spawn = "iceweasel"}, + + +Cela permet de lancer l'application désirée lors de la création du tag (s'il +n'est pas déjà affiché), puis dans la configuration générale d'awesome : + +.. code-block:: lua + + globalkeys = awful.util.table.join( + awful.key({ }, "XF86Calculator", function() awful.tag.viewonly(shifty.getpos(100)) end ), + awful.key({ }, "XF86Mail", function() awful.tag.viewonly(shifty.getpos(101)) end ), + awful.key({ }, "XF86HomePage", function() awful.tag.viewonly(shifty.getpos(102)) end ), + +Maintenant on demande à afficher le tag voulu en fonction de la touche clavier +préssée : si le tag existe, il sera affiché, sinon il sera non seulement créé, +mais l'application sera lancée : un bon moyen pour avoir toujours ses +applications préférées au bout des doigts ! + +.. _shifty: http://awesome.naquadah.org/wiki/Shifty/fr + +Conclusion +========== + +Awesome reste pour moi toujours aussi agréable à utiliser. Cela fait plus de +trois ans maintenant que je l'utilise, et je continue d'être ravi d'avoir un +système qui se contrôle au doigt et à l'œuil (au doigt surtout !). Pouvoir +configurer ses applications à sa guise peut paraître couteux et compliqué de +prime abord, mais permet d'avoir un système qui correspond à notre besoin : ça +n'est pas à nous de nous adapter à un outil, c'est à l'outil de s'adapter à +notre usage ! diff --git a/content/Informatique/2013-07-24-projet_libre.rst b/content/Informatique/2013-07-24-projet_libre.rst new file mode 100644 index 0000000..50d8f2a --- /dev/null +++ b/content/Informatique/2013-07-24-projet_libre.rst @@ -0,0 +1,83 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +========================== +Les conflits dans le libre +========================== + +:date: 2013-07-24 +:tags: ocaml, Libre +:summary: |summary| + +|summary| + +.. |summary| replace:: + Mener un projet libre n'est pas simple ; cela demande du temps, beaucoup + d'investissement, et le retour est rarement suffisament encourageant pour + tenir sur cette motivation. Il y a en ce moment des tensions au sein des + développeurs Ocaml par rapport à deux projets concurents. + +Le langage Ocaml essaie de gagner un nouveau dynamisme depuis quelques années. +Parmi les moteurs de ce dynamisme, un nouveau gestionnaire de paquets, opam_, +est censé apporter une simplification dans la gestion des dépendances, et +l'installation des librairies nécessaires à un projet. Sauf qu'il existe déjà +un gestionnaire de paquets dans Ocaml : godi_, qui existe depuis quelques +années, et qui a réussi à créer une grande bibliothèque de librairies +installable. + +.. _opam: http://opam.ocamlpro.com/ +.. _godi: http://godi.camlcity.org/godi/index.html + +Le créateur Gerd Stolpmann a laissé un message sur la mailing-list récemment, +indiquant qu'il `arreterait de maintenir godi`_, en partie à cause de la +concurrence d'opam, et principalement à cause de la campagne de dénigrement de +godi de la part des mainteneurs d'opam. Cela est en train de déchaîner les +réponses et d'agiter les principaux acteurs d'Ocaml qui essaient de trouver une +solution pour sortir du conflit. + +.. _arreterait de maintenir godi: https://sympa.inria.fr/sympa/arc/caml-list/2013-07/msg00199.html + +Les reproches +============= + +Gerd Stolpmann reproche à ocamlpro (l'équipe de développement d'opam) de ne pas +l'avoir contacté avant de se lancer dans le développement d'une solution +concurrente, et d'`avoir été évincé`_ après avoir construit et maintenu un +écosystème viable. D'un autre côté, ocamlpro annonce que opam `répondait à une +demande`_ d'un nouveau produit par un client, et qu'il était plus simple de +repartir sur une nouvelle base. + +Par ailleurs, la communauté reprend Gerd Stolpmann en lui annonçant qu'il n'y a +pas eu de dénigrement. Il y a bien eu toute une campagne d'enthousiasme liée à +l'arrivée d'un nouveau produit, mais qui ne s'est pas accompagnée pour autant +d'un dénigrement de godi et de la solution existante. + +.. _avoir été évincé: https://sympa.inria.fr/sympa/arc/caml-list/2013-07/msg00245.html +.. _répondait à une demande: https://sympa.inria.fr/sympa/arc/caml-list/2013-07/msg00240.html + +Rien de nouveau sous le soleil +============================== + +Ce genre de débat n'est pas nouveau, les conflits le noyau linux sont souvent +remonté et dérivent parfois vers des mails cinglants s'échangeant sur les +mailing-list. Le conflit est même plutôt positif, voire nécessaire (la seule +manière de gérer un projet sans conflit est d'imposer un dictateur). D'une +manière plus générale, `Georg Simmel`_ nous explique que le conflit est +positif, car il correspond à une prise de conscience de l'existence de l'autre. + +.. _Georg Simmel: https://fr.wikipedia.org/wiki/Georg_Simmel + +Pour ma part, je trouve dommage que l'esprit de création puisse être gâché à +cause de querelles de ce genre. Bien sûr, tout le monde est libre de commencer +un nouveau projet sans se référer à ceux existants, bien sûr tout le monde peut +forker ou même repartir à zéro un nouveau projet sans demander la permission, +mais quand on a affaire à une communauté compétente (et les développeurs Ocaml +le sont), je trouve dommage de diviser les compétences d'une communauté et +pousser quelqu'un à l'aigreur pour des raisons aussi futile que ce qui se passe +en ce moment. + +C'est pourtant le revers de la médaille du `bazar, les construction de +cathédrales`_ n'ont pas autant de péripéties… D'aucuns diront que ça fait +partie de la vie des projets libre. + +.. _bazar, les construction de cathédrales: https://fr.wikipedia.org/wiki/La_cath%C3%A9drale_et_le_bazar diff --git a/content/Informatique/2013-09-13-ocaml_ppx.rst b/content/Informatique/2013-09-13-ocaml_ppx.rst new file mode 100644 index 0000000..b6a0c10 --- /dev/null +++ b/content/Informatique/2013-09-13-ocaml_ppx.rst @@ -0,0 +1,97 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +=========== +ocamlc -ppx +=========== + +:date: 2013-09-13 +:tags: ocaml, Programmation +:summary: |summary| +:logo: /images/ocaml/recursion_75.jpg + +.. figure:: {filename}/images/ocaml/recursion.jpg + :figwidth: 180 + :figclass: floatright + :alt: Recursivité + + Image : `Gadl`_ (creativecommons_) + +.. _Gadl: http://www.flickr.com/photos/gadl/279433682/ +.. _creativecommons: http://creativecommons.org/licenses/by-sa/2.0/deed.fr + +|summary| + +.. |summary| replace:: + Les langages homoïconiques ont quelque chose de fascinant : pouvoir + représenter le programme sous la forme d'une donnée capable d'être traitée + par le programme nous entraîne dans un jeu de mirroirs qui se réfléchissent + eux-même, et me donne un peu le vertige… La nouvelle version d'OCaml + présente une option de préprocessing qui s'en rapproche. + +Selon `wikipédia`_ un langage homoïconique à la particularité de pouvoir être +représenté comme une donnée du programme. Cela permet de transformer le langage +(lui donner de nouvelles fonctionalités) en utilisant un autre programme fait +dans le même langage. Un programme lisp peut ainsi se modifier durant son +exécution, de la même manière, un fichier xsl peut s'appliquer sur un autre +fichier xsl (puisque xslt_ est décrit sous la forme de fichiers xml)… + +.. _wikipédia: https://fr.wikipedia.org/wiki/Homoiconicit%C3%A9 +.. _xslt: https://fr.wikipedia.org/wiki/Extended_stylesheet_language_transformations + +OCaml 4.01 est sorti ! +====================== + +OCaml vient de sortir en version 4.01, et présente dans ses nouveautés, une +nouvelle option qui s'active à la compilation : + + + :-ppx command: After parsing, pipe the abstract syntax tree through the + preprocessor command. The format of the input and ouput + of the preprocessor are not yet documented. + +Qu'est-ce que cela signifie ? Qu'après avoir interprété le programme source et +construit l'arbre syntaxique du langage, le compilateur appelle un autre +programme en lui transmettant cette représentation en paramètre. À cette étape, +le compilateur a juste vérifié que la syntaxe était `valide`, mais il n'a pas +encore vérifié le programme. + +Le programme appellé peut alors modifier la représentation du code source, et +**doit** donner en retour un programme OCaml valide (si l'on veut que le code +compile…). Cela permet d'étendre la syntaxe du langage en se basant sur des +éléments de syntaxe valides pour mettre en place un `langage dédié`_ (par +exemple). Est-ce que cela fait d'OCaml un langage homoïconique ? Non, car cela +n'est prévu pour être le cœur d'OCaml, mais cela lui donne un aspect +homoïconique et de nouvelles perspectives dans l'évolution du langage. + +Le principal avantage vient du fait que le langage OCaml est TRÈS fortement +typé, et refusera de compiler si une erreur s'est glissée dans la cohérence du +programme. On peut donc modifier le programme sans crainte de provoquer une +erreur dans la structure de celui-ci. + +.. _langage dédié: https://fr.wikipedia.org/wiki/Domain-specific_programming_language + +Des exemples +============ + +OMonad_ est une extension qui donne ainsi à OCaml la possibilité de traiter les +monades selon la syntaxe issue d'Haskell. + +.. _OMonad: http://danmey.org/omonad.html + +`ppx tools`_ est une librairie qui permet de construire sa propre extension, +écrite par Alain Frish, l'auteur à qui l'on doit cette nouvelle option. Il +décrit son besoin et son usage sur son blog_. + +.. _ppx tools: https://github.com/alainfrisch/ppx_tools +.. _blog: http://www.lexifi.com/blog/syntax-extensions-without-camlp4-lets-do-it + +Certe, il était déjà possible de faire des choses `très amusantes`_ avant ça, +mais cela restait encore expérimental. Maintenant, cela devient beaucoup plus +accessible. Je ne connais pas beaucoup de langages qui poussent aussi loin la +possibilité de modifier le compilateur pour l'adapter à ses besoins, et rien +que pour ça, je trouve ça fun ! |:-)| + +.. _très amusantes: https://bitbucket.org/camlspotter/compiler-libs-hack + +.. |:-)| image:: {filename}/images/icons/face-smile.png diff --git a/content/Informatique/2013-10-12-rst_graphviz.rst b/content/Informatique/2013-10-12-rst_graphviz.rst new file mode 100644 index 0000000..82b9c7b --- /dev/null +++ b/content/Informatique/2013-10-12-rst_graphviz.rst @@ -0,0 +1,136 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Ajouter graphviz dans les documents restructuredText +#################################################### + +:date: 2013-10-12 +:tags: Libre, reStructuredText +:logo: /images/graphviz/graphe.png +:summary: |summary| + +.. default-role:: literal + +:2014-05-05: Je met l'article à jour avec la dernière version du script que + j'utilise. J'en profite pour donner un peu plus d'exemples. + +.. image:: {filename}/images/graphviz/graphe.png + :class: floatleft + :scale: 50 + :alt: Graphe + +|summary| + +.. |summary| replace:: + C'est en utilisant un produit tous les jours que nous vient l'envie de + l'améliorer. Dernièrement, j'ai eu besoin de générer un texte contenant des + graphes. Il y a quelques temps, j'aurais préparé mes graphes dans des + images à part, et inclus les images dans mon document, sauf que cette fois, + j'ai décidé d'inclure directement le code du graphe dans mon document. + +Graphviz_ est une merveilleuse librairie pour générer des représentations de +graphes comme celle qui se trouve à côté. À partir d'un fichier texte contenant +la description du graphe, l'application nous génère une image (avec différents +formats possibles) du graphe. Par exemple, l'image ci contre peut-être +représentée avec le code suivant : + +.. code-block:: dot + + digraph G { + + a -> a + a -> b + d -> b + b -> c + c -> b + } + +.. _Graphviz: http://graphviz.org/ + +Je ne rentre pas davantage dans la description de gv, l'application est très +complète, et un article ne suffirait pas à tout couvrir ! + +La question qui se pose est donc de pouvoir inclure directement graphviz lors +de la génération du document. Pour ça, j'ai créé une nouvelle directive_, +`graphviz` qui appele directement dot lors de la génération du document. + +.. _directive: http://docutils.sourceforge.net/docs/ref/rst/directives.html + +.. list-table:: + :header-rows: 1 + :stub-columns: 1 + :widths: 10 45 45 + + * - Exemple + - Code + - Résultat + * - Insérer un graphe orienté + - + .. code-block:: rst + + .. graphviz:: digraph + + a -> a + a -> b + d -> b + b -> c + c -> b + + .. + ceci est une légende + - + + .. figure:: {filename}/images/graphviz/graphe.png + :alt: graphe orienté avec légende + + ceci est une légende + + * - Insérer un graphe non-orienté + - + .. code-block:: rst + + .. graphviz:: graph + + a -- a + a -- b + d -- b + b -- c + c -- b + - + + .. figure:: {filename}/images/graphviz/no.png + :alt: graphe non orienté + + * - Utiliser des options + - + .. code-block:: rst + + .. graphviz:: digraph + + rankdir = LR; + + a -> a + a -> b + d -> b + b -> c + c -> b + - + + .. figure:: {filename}/images/graphviz/options.png + :alt: graphe horizontal + + +Pour ceux que ça intéresse, voici le script pour rst2html_ et rst2latex_. Le +code est similaire, cela ajoute une nouvelle directive qui génère le document à +l'aide de graphviz, et stocke l'image dans un fichier temporaire, créé dans un +répertoire *tmp* (qui doit exister avant de lancer la commande). On pourrait +très facilement l'ajouter à rst2odt en suivant le même principe. + +Le script rst2latex génère les images en pdf, il est prévu pour être utilisé +avec `pdflatex`. + +C'est tout, le langage est tellement simple que ça serait dommage de ne pas en +profiter ! + +.. _rst2html: {filename}/resources/rst_graphviz/rst2html.py +.. _rst2latex: {filename}/resources/rst_graphviz/rst2latex.py diff --git a/content/Informatique/2013-12-19-ssl_proxy.rst b/content/Informatique/2013-12-19-ssl_proxy.rst new file mode 100644 index 0000000..b72f1ab --- /dev/null +++ b/content/Informatique/2013-12-19-ssl_proxy.rst @@ -0,0 +1,128 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +======================================== +Vérifier un certificat SSL en entreprise +======================================== + +:date: 2013-12-19 +:tags: ViePrivée +:summary: |summary| +:logo: /images/chiffer/pgp_75.jpg + + +.. figure:: {filename}/images/chiffer/pgp_150.jpg + :figwidth: 150 + :figclass: floatright + :alt: Chiffrement + + Image : `Elsamuko`_ (creativecommons_) + +.. _Elsamuko: http://www.flickr.com/photos/28653536@N07/10595809575/ +.. _creativecommons: http://creativecommons.org/licenses/by-sa/2.0/deed.fr + +|summary| + +.. |summary| replace:: + openssl permet de vérifier un certificat SSL en ligne de commande. Ceci est + très utile si l'on souhaite vérifier son installation et s'assurer que le + certificat fourni est bien le bon. Toutefois, l'application ne fonctionne + pas si un proxy est nécessaire pour se connecter au site distant. + +C'est bien dommage, car en entreprise, le proxy est souvent obligatoire. Si +l'on souhaite s'assurer que le proxy ne va pas nous présenter un mauvais +certificat, il est nécessaire de passer par le navigateur web pour vérifier +l'authenticité du certificat, mais il n'est alors pas possible d'automatiser la +procédure. + +Pour mener à bien notre action, il va falloir ruser, et jouer avec les +connexions réseau, mais avant tout ça, reprenons un peu les bases, et voyons +comment récupérer un certificat ssl en ligne de commande. + +openssl +======= + +Openssl est une librairie utilisée pour la sécurité et le chiffrement, elle +permet de générer des certificats clients et serveur, de chiffrer selon +différents algorithmes, etc. + +Une application en ligne de commande existe, et permet de contrôler un +certificat de la manière suivante : + +.. code-block:: console + + $ echo -n | openssl s_client -connect site.test:443 | openssl x509 -noout -md5 -fingerprint + +Toutefois, il faut que le site soit accessible directement, sans proxy. Si +c'est le cas, il n'est plus possible de vérifier le certificat en question. + +C'est problématique si l'on souhaite justement s'assurer que le proxy ne fait +pas du mitm_. Pour vérifier le certificat dans ces conditions, il va falloir +nous faire entrer un autre outil qui va se charger de passer le proxy. + +.. _mitm: http://fr.wikipedia.org/wiki/Attaque_de_l%27homme_du_milieu + +Vous avez remarqué que l'on précise le serveur et le port sur lequel est +installé le certificat à vérifier. Il est donc possible de tester un certificat +sur `localhost:1234` si on le souhaite (à la condition d'avoir un serveur https +qui réponde sur ce port). + +socat +===== + +C'est là qu'intervient socat. Socat_ est un outil similaire à netcat (le +couteau suisse du web), sauf que socat à la possibilité de gérer les requêtes +bidirectionnelles. Nous allons nous en servir pour ouvrir une connexion à +travers le proxy sur le site que nous souhaitons tester. + +.. _socat: http://www.dest-unreach.org/socat/ + +En laissant la connexion ouverte, on permet à openssl de s'y connecter et +effectuer ses tests. C'est donc grâce aux deux outils que l'on va pouvoir faire +notre contrôle. + +On se crée la connexion avec la commande suivante : + +.. code-block:: console + + $ socat TCP4-LISTEN:2022 "PROXY:proxy.test:site.test:443,proxyport=8080" + +La connexion n'est pas persistante, elle sera fermée dès sa première +utilisation, cela permet de chaîner les deux commandes directement : + +.. code-block:: bash + + #!/bin/sh + + if [[ ! -z $https_proxy ]]; then + proxy=`echo ${https_proxy} | sed -e 's|http://||' -` + host=$(echo ${proxy} | cut -d: -f 1) + port=$(echo ${proxy} | cut -d: -f 2) + echo using proxy : ${host}:${port} + socat TCP4-LISTEN:2022 "PROXY:${host}:$1,proxyport=${port}" & echo -n | openssl s_client -connect localhost:2022 | openssl x509 -noout -sha1 -fingerprint + else + echo -n | openssl s_client -connect $1 | openssl x509 -noout -md5 -fingerprint + fi + +enregistrez ce script sous `check_ssl.sh` puis lancez cette commande ainsi : + +.. code-block:: console + + $ check.sh site.test:443 + depth=0 C = FR, ST = Some-State, O = Internet Widgits Pty Ltd, CN = site.test, emailAddress = contact@site.test + verify error:num=21:unable to verify the first certificate + verify return:1 + DONE + MD5 Fingerprint=73:4F:77:1D:2B:C1:4F:0E:3F:42:FA:14:A9:0F:BC:80 + +Si la variable d'environnement `HTTPS_PROXY` est renseignée le script +créera le tunnel via socat, sinon, openssl sera utilisé directement pour +vérifier le certificat. + +Vous pouvez le comparer avec ce que vous affiche le navigateur pour vous +assurer qu'il est cohérent : + +.. image:: {filename}/images/chiffer/certificat.jpg + :alt: Vue du certificat + +N'oubliez pas, on n'est jamais trop prudent ! diff --git a/content/Informatique/2014-02-09-ocaml_gtk.rst b/content/Informatique/2014-02-09-ocaml_gtk.rst new file mode 100644 index 0000000..09f1aee --- /dev/null +++ b/content/Informatique/2014-02-09-ocaml_gtk.rst @@ -0,0 +1,206 @@ +.. -*- rst -*- +.. -*- coding: utf-8 -*- + +======================================= +Trois manière d'utiliser Gtk avec OCaml +======================================= + +:date: 2014-02-09 +:tags: ocaml, gtk +:summary: |summary| +:logo: /images/ocaml/camel_75.jpg + +.. default-role:: literal + +.. figure:: {filename}/images/ocaml/camel_2.jpg + :figwidth: 150 + :figclass: floatleft + :alt: Pavement + + Image : `Kevin Botto`_ (creativecommons_) + +.. _Kevin Botto: http://www.flickr.com/photos/kevinbotto/3251157974/ +.. _creativecommons: http://creativecommons.org/licenses/by-nd/2.0/deed.fr + +|summary| + + +.. |summary| replace:: + Créer des interfaces Gtk pour OCaml peut se réveler compliquer. On trouve + beaucoup d'explications un peu confuses sur le net, et n'est pas facile de + trouver comment faire. + Je vous propose ici trois manières différentes en utilisants les différents + outils disponibles. + +Il est possible d'utiliser la bibliothèque Gtk à l'aide de la librairie +lablgtk_, qui fourni un binding pour l'ensemble de la bibliothèque. L'avantage +est de pouvoir fonctionner sur toutes les plateformes où gtk est disponible, et +de bénéficier d'une interface évoluée et agréable pour écrire son application. + +L'inconvénient réside dans la bibliothèque gtk : api très compliquée, +documentation confuse, bref on se retrouve rapidement face à des problèmes là +où l'on pensait pouvoir avancer sans difficulté. De plus, on est aujourd'hui +passé à gtk3 alors que `lablgtk` utilise toujours l'api de gtk2. Cela ne pose pas +de problème dans la compilation (la compatibilité est assurée), mais peut poser +problème lors de l'utilisation d'outils tels que `glade` (voir plus loin). + +.. _lablgtk: http://lablgtk.forge.ocamlcore.org/ + +Tout construire à la main +========================= + +C'est la première solution, qui demande de connaître Gtk : tous les objets sont +construits à la main, et le code décrit la manière de faire. L'avantage est que +le code ne dépend d'aucune ressource externes contrairement aux deux suivantes. +De plus on contrôle complètement la création de l'interface, on peut donc +choisir de paramétrer l'interface au lieu d'avoir une interface unique. Un +tutoriel complet est disponible sur le site d'`OCaml.org`_, je ne vais pas +le reprendre ici et vous encourage à le suivre. + +.. _ocaml.org: http://ocaml.org/learn/tutorials/introduction_to_gtk.html + +L'exemple est donné dans la console interactive. Si l'on souhaite le compiler +dans un module, il faut initialiser Gtk avant de lancer l'affichage : + +.. code-block:: ocaml + + GtkMain.Main.init (); + +Pour compiler un module, il est nécessaire de faire référence au package +`lablgtk2`. Voici un exemple pour compiler un fichier `hello.ml` : + +.. code-block:: console + + $ ocamlfind ocamlc -package lablgtk2 -I . -c hello.ml + +Maintenant il ne reste plus qu'à se plonger dans la documentation de gtk pour +construire son interface ! + +Utiliser Glade +============== + +Glade est une interface graphique permettant de construire son application en +plaçant les contrôles de manière visuelle. Elle génère un fichier XML qui +décrit l'interface et sera chargé par l'application pour construire +l'interface. Cela permet de gagner du temps et d'éviter d'écrire le code +nécessaire pour construire son interface, on se concentre sur les actions +à exécuter lorsque l'utilisateur interagit. + +.. image:: {filename}/images/glade.jpg + :class: center + :alt: Utilisation de glade. + + +Les XMLs générés par glade sont destinés à être utilisés avec gtk3. Or, +`lablgtk` utilise encore gtk2, il est donc nécessaire d'utiliser une conversion +pour pouvoir les charger par la suite. Voici une petite règle `make` qui se +charge de faire le travail : + +.. code-block:: make + + %.glade2: %.glade + cat $< | sed 's/interface/glade-interface/' | sed 's/object/widget/' | sed 's/GtkBox/GtkVBox/' > $@ + +Maintenant qu'on dispose d'un fichier au format glade2, on peut le charger dans +OCaml. + +Attention, lors de la compilation, il est nécessaire d'utiliser `libglade` pour +construire l'application, celle-ci est disponible dans la librairie +`lablgtk2.glade`. Voici donc un exemple de commande pour compiler un fichier +`hello.ml` : + +.. code-block:: console + + $ ocamlfind ocamlc -package lablgtk2.glade -I . -c hello.ml + +.. _gtkbuilder: https://developer.gnome.org/gtk3/3.4/GtkBuilder.html + +Charger le fichier xml +---------------------- + +Il s'agit de la solution la plus dynamique : on référence le fichier xml dans +le code, et l'interface se construit toute seule. Cette solution est présentée +sur le site de `developpez.com`_. L'exemple donné est toujours valide, il ne +faut pas oublier d'initialiser Gtk avec la commande suivante avant de lancer la +construction de l'interface : + +.. code-block:: ocaml + + GtkMain.Main.init (); + +L'inconvénient de cette méthode (du moins pour un développeur OCaml) est que +l'on est obligé de convertir de manière dynamique tous les objets présents dans +le XML. Il n'est pas possible de savoir au moment de la compilation si le code +que l'on va exécuter est bien valide. + +En effet, les objets chargés depuis le XML nous sont retournés sous la forme +widget gtk, qu'il faut convertir en Bouton, Menu via les méthodes appropriées +(`GtkWindow.Window.cast` par exemple). On n'est donc pas à l'abri d'avoir une +erreur lors du fonctionnement du programme, alors que celui-ci a pu compiler +sans problème. Je pense que lorsqu'on cherche à développer en OCaml, ce genre +de problème peut être rédhibitoire. + +.. _developpez.com: http://blog.developpez.com/damien-guichard/p7748/programmation-fonctionnelle/hello_developpez_avec_libglade_xml_1 + +De plus, rien ne garantie que le fichier XML ne va pas évoluer de manière +incompatible du code ; les deux étant distincts. + + +Utiliser lablgladecc2 +--------------------- + +Heureusement, la librairie `lablgtk2` nous fourni un petit utilitaire nommé +`lablgladecc2` qui va convertir un fichier xml glade2 en un fichier OCaml. On +dispose donc d'un chargement dynamique du fichier xml, mais en gardant un code +cohérent, qui détectera les erreurs dès la compilation. Il s'agit en quelque +sorte d'un moyen de combiner les deux solutions précédentes. + +On va ajouter une règle au makefile pour générer notre fichier OCaml : + +.. code-block:: make + + %.ml: %.glade2 + lablgladecc2 -embed $< > $@ + +Le fichier généré se compose d'une classe reprenant les différents composants +de notre interface, il ne nous reste plus qu'à réaliser les connexions, ainsi, +à partir d'un fichier glade nommé *gui* composé d'une fenêtre `window1`, d'un +bouton `button` et d'une entrée de menu, on peut créer le code suivant : + +.. code-block:: ocaml + + let gladecc () = + let window = new Gui.window1 () in + + window#button#connect#clicked (fun () -> prerr_endline "Ouch!"); + window#window1#connect#destroy GMain.quit; + window#imagemenuitem5#connect#activate GMain.quit; + + window#toplevel#show () + + let () = + GtkMain.Main.init (); + gladecc (); + GMain.Main.main () + + +l'objet `toplevel` est créé par `lablgladecc2` et correspond à la fenêtre +principale de notre objet. + +Dans cette chaîne de compilation, le fichier xml est écrit dans le programme +OCaml (il s'agit de la signification de l'option `-embed`), ainsi, le fichier +XML n'a pas besoin de figurer parmi les ressources de l'application. + +Conclusion +========== + +Trois manière de faire qui répondent à trois besoin différents, entre le tout +codé et le tout dynamique, il est possible de créer des interfaces graphiques +en utilisant les capacités du langage caml sur l'inférence de type et le +contrôle de l'ensemble de l'application. + +Pour ma part, je préfère la dernière solution, qui permet de conserver la +simplicité de `glade` combiné avec la force du langage OCaml. J'ai écrit cet +article suite à pas mal d'errance sur le net pour trouver les informations +nécessaires, j'espère que la documentation va évoluer par la suite et permettre +de faire ce genre de choses plus facilement… diff --git a/content/Informatique/apache.rst b/content/Informatique/apache.rst deleted file mode 100644 index 1101266..0000000 --- a/content/Informatique/apache.rst +++ /dev/null @@ -1,46 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -Un code retour personalisé avec apache -###################################### - -:date: 2012-08-12 -:tags: Libre, Hébergement - -Petite astuce pour un problème que j'ai rencontré il y a quelques temps avec -apache. Je souhaitais modifier le code retour d'une requête (en l'occurrence -remplacer un code 403 par 404). - -J'ai été surpris de ne trouver aucun module pour le faire, sécurité, -redirection ou autre contrôle sur les requêtes. - -La solution trouvée fut d'utiliser un script cgi, qui se charge de faire la -réponse à la place d'apache, et est appelé en page d'erreur. Cela donne : - -.. code-block:: bash - - ScriptAlias /cgi-bin/ /home/www/cgi/ - ErrorDocument 403 /cgi-bin/404.cgi - -Le script en question est fait en bash pour simplifier les choses : - -.. code-block:: bash - - #!/bin/sh - echo Status: 404 Not Found - echo Content-type: text/html - echo - cat << EOM - - - 404 Not Found - -

Not Found

-

The requested URL ${REQUEST_URI} was not found on this server.

-
-
Apache/2.2.22 (Debian) Server at chimrod.com Port 80
- - EOM - exit 0 - -et voilà ! diff --git a/content/Informatique/awesome.rst b/content/Informatique/awesome.rst deleted file mode 100644 index afbb33f..0000000 --- a/content/Informatique/awesome.rst +++ /dev/null @@ -1,105 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -Un menu pour awesome -#################### - -:date: 2010-06-06 -:tags: Libre, awesome -:summary: |summary| - -Awesome est un window manager (wm) en mode pavement (les fenêtres se -disposent de manière à ne jamais se chevaucher). Cela permet de ne pas -avoir à se soucier de la manière dont il faut gérer l'affichage des -applications. - -|Awesome| - -Une des particularités est que sa configuration se fait par un fichier de -script exécuté au lancement du bureau. Cela permet de paramétrer comme -on le souhaite le bureau sans être limité par le WM. La contrepartie est -que cela est plus difficile à prendre en main, et une erreur de code -entraîne un écran gris au lieu du bureau que l'on souhaite obtenir... Le -langage utilisé (Lua) est un langage connu pour sa légèreté. Pour -l'instant, le projet étant encore assez jeune, il n'existe pas encore -beaucoup de modules standardisés pour configurer le système, mais je -pense que ceux-ci ne tarderont pas à venir... - -Pour l'instant la configuration n'est pas encore stabilisée, certains -composants changent au cours d'une version à une autre, ce qui casse -parfois la mise à jour et oblige à retravailler les scripts de mise de -configuration. Je pense cependant que tout cela suit la bonne direction -et que ces soucis finiront par disparaître avec le temps et les versions -suivantes - -La plupart des actions peuvent être associées à un raccourci clavier, et -s'il est possible d'affiche une barre d'outil à chaque application (« -titlebar »), on prend vite l'habitude de s'en passer et de tout -contrôler au clavier. On est d'autant plus aidé par cela par -`shifty `_ une extension qui -permet de « programmer » la manière dont on veut que les fenêtres -s'affichent : sur quel écran, avec quels paramètres etc. Cela permet par -exemple d'avoir une configuration pour des applications utilisant -plusieurs fenêtres (je pense par exemple à Gimp) paramétrée comme on -le souhaite… - -On prend vite l'habitude également d'utiliser plusieurs « tags » (l'équivalent -de bureaux virtuels mais un peu plus étendus) : ceux-ci peuvent être paramétrés -pour afficher des applications sépicifiques (j'ai par exemple adapté ma -configuration pour que *web* affiche firefox, ou que *news* affiche le couple -elinks/newsbeuter pour lire mes flux RSS… - -Bien sûr le temps de paramétrage au début est un peu long, mais -maintenant que l'API est stable, il n'est plus nécessaire de tout -reprendre à chaque fois que l'on met à jour awesome. - -|summary| - -.. |summary| replace:: - Je trouvais qu'il manquait à Awesome un menu avec les actions - disponibles sur les fenêtres : la faire passer au premier plan, la - minimiser… Tout ceci est disponible avec des raccourcis claviers, mais - il n'y a pas d'option centralisée pour les retrouver. J'ai donc décidé - de me plonger un petit peu dans lua pour produire le menu que voilà : - -|Menu pour awesome| - -Le menu permet les actions suivantes : - -- On top : Pour mettre le client sélectionné au premier plan et le - rendre flottant -- Sticky : Faire apparaître le client sur tous les tags -- Minimize : Réduire le client -- Close : Fermer le client -- Move To : Déplacer le client vers un autre tag - -Le script fonctionne avec awesome 3.4.5, les versions antérieures ne -sont pas forcement compatibles suite à un changement dans l'ABI du menu. -J'essaierai également de le mettre à jour pour les versions suivantes ( -du moins tant que je m'en servirai…) - -Pour le faire fonctionner, il faut télécharger le script et le placer -dans son répertoire ${HOME}/.config/awesome . Ensuite, éditer le fichier -rc.lua et y ajouter la ligne suivante en en-tête : - -.. code-block:: lua - - require("mymenu") - -et dans la partie Key Binding : - -.. code-block:: lua - - clientkeys = awful.util.table.join( - […] - awful.key({ modkey, }, "Down", function(c) menu_instance = newAppMenu(c) end), - -Le menu apparaîtra sur le raccourci Mod4 + Flèche du bas - -Le fichier : `mymenu.lua `_ - -.. |Awesome| image:: http://awesome.naquadah.org/index/320x240-screen.png - :class: floatleft - -.. |Menu pour awesome| image:: |filename|../images/menu.png - :class: floatright diff --git a/content/Informatique/backup.rst b/content/Informatique/backup.rst deleted file mode 100644 index 957a42d..0000000 --- a/content/Informatique/backup.rst +++ /dev/null @@ -1,81 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -Un système de backup automatique -################################ - -:date: 2009-10-18 -:tags: Libre, Administration -:summary: |summary| - -.. |summary| replace:: - On le sait tous, il faut faire des sauvegardes de manière régulière. On le - sait également, pour que celles-ci se fassent sur le long terme, il faut - que celles-ci se fassent de manière automatique, et sur un autre support - que le PC que l'on souhaite sauvegarder. Le problème qui se pose est le - suivant : comment concilier ces deux conditions sur un PC de bureau (ne - disposant donc pas d'une série de serveur allumés en permanences et prêt à - recevoir nos sauvegardes en continu…) ? - -|summary| - -Pour répondre à tout cela, nous allons mettre en place un système de backup sur -disque dur externe, qui se lancera à chaque fois que notre disque sera monté. À -chaque fois que le disque dur sera allumé, la sauvegarde s'enclenchera. Cela ne -garantit pas, bien sûr que les sauvegardes se feront à un intervalle régulier, -mais cela garantit au moins que nous n'aurons pas à nous en soucier. Pour cela -nous allons utiliser les outils qui sont disponibles sous un environnement -Linux : rsync et hal. Cet article nous présente une base pour faire notre -sauvegarde `Une sauvegarde améliorée avec rsync -`_. -Nous allons juste devoir le modifier un petit peu pour répondre à un problème -qui arrive souvent avec les périphériques USB : selon que d'autres -périphériques sont déjà montés ou non, nous ne savons pas dans quel répertoire -nous allons nous trouve. Il va donc falloir mettre en place une ligne pour -récupérer le répertoire dans lequel nous sommes. Il ne nous reste plus qu'à -trouver le moyen de l'éxécuter automatiquement pour cela nous allons utiliser -halevt. Le script est disponible `ici -`_ - -Comme son nom l'indique, halevt est un gestionnaire d'évènements pour hal. Hal -est un gestionnaire d'évènement matériel sous Linux; il envoie des informations -à chaque fois que des informations sont envoyées depuis les composants. Cela -permet de détecter le branchement d'un périphérique USB et de le monter sur le -bureau (et qui nous simplifie grandement la vie aujourd'hui !!!). Halevt est -un démon à l'écoute des informations qui nous sont envoyées par hal, et -d'activer des actions en conséquence : par exemple pour lancer l'antivirus sur -la clef usb, reconfigurer le mappage du clavier en fonction de la marque que -l'on branche etc. Pour notre part, nous allons nous contenter de lancer un -script (celui du backup mentionné plus haut). - -Pour commencer nous allons devoir identifier le lecteur à mettre sous -surveillance : inutile de se baser sur les noms de montage habituels (/dev/sda -par exemple) en effet en fonction des périphériques déjà branchés nous -n'allons pas obtenir la même configuration. Nous allons utiliser les point de -montage défini dans /dev/disk/by-uuid qui permet d'obtenir l'identifiant -de notre disque (et qui sera repris par la suite dans la configuration de hal -). Une fois que nous avons relevé quel est le disque concerné, il faut mettre -en place une entrée pour notre évènement dans la configuration de halevt : - -:: - - - - - - - -Cela si halevt est exécuté avec les droits de l'utilisateur lançant le -backup. Si on le fait tourner en démon, il faut trouver une autre -solution (sur mon poste j'ai utilisé sudo, mais on peut très bien se -baser sur le sticky bit pour donner les droits au script). De même, -dans la configuration mise en place, le script se trouve sur le disque -de stockage (de manière à pouvoir le lancer à la main si le démon n'est -pas disponible), cela peut être adapté en fonction de chacun… - -Dans le cas d'une configuration multi-utilisateur, je pense qu'il est -nécessaire de passer par un script qui lance les différentes sauvegardes sous -le bon groupe de l'utilisateur à chaque fois. (Ce qui en plus permet d'éviter -le problème du sudo) mais je n'ai pas eu besoin d'aller jusque-là pour -l'instant ! À vous d'adapter ce que je vous propose en fonction de votre -configuration ! diff --git a/content/Informatique/chiffrage.rst b/content/Informatique/chiffrage.rst deleted file mode 100644 index 1ee5866..0000000 --- a/content/Informatique/chiffrage.rst +++ /dev/null @@ -1,77 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -Mettre en place une solution de chiffrage avec authentification forte -##################################################################### - -:date: 2008/11/07 -:tags: Libre, ViePrivée -:summary: |summary| - -.. |summary| replace:: - Voici une méthode que j'ai mise en place pour protéger l'accès à mon - répertoire /home via Cryptsetup. Il existe de nombreux tutoriels expliquant - comment créer une partition chiffrée, je ne vais pas détailler cela ici. - L'intérêt du script que je propose ici est qu'il se lance au moment du - login, et qu'il va chercher le mot de passe sur une clef USB. - -|summary| - -Charger le mot de passe contenu dans la clef USB ------------------------------------------------- - -Il suffit juste de l'insérer avant de se logguer, et de la retirer une -fois l'authentification réussie. - -Voici le script en question - -.. code-block:: bash - - #!/bin/sh - - #Si la clef n'est pas insérée, refuse le login - [ -b /dev/disk/by-uuid/chemin-de-la-clef ] || exit 1 - - if [ -b /dev/mapper/home ] - then - #Si la partition est deja montée, connecte - exit 0 - else - - # Monte la clef - mkdir /tmp/clef/ - mount /dev/disk/by-uuid/chemin-de-la-clef /tmp/clef/ 2>/tmp/out - - # Déchiffre la partition - /sbin/cryptsetup luksOpen -d /tmp/clef/clef /dev/disk/by-uuid/chemin-de-la-clef home 2>>/tmp/out - - # Démonte la clef, elle peut maintenant être retirée sans pb - umount /tmp/clef - rmdir /tmp/clef/ - - mount -o defaults -t ext2 /dev/mapper/home /home - exit 0 - - fi - -Bien sûr, il faut que la clef soit contenue dans le fichier clef sur le -périphérique USB. - -Mettre le script au login de l'utilisateur ------------------------------------------- - -Maintenant, 2e étape, il s'agit de lancer ce script au moment où -l'utilisateur vient de se logguer. Comme je passe par un login manager -sur mon portable (GDM), j'ai choisi d'utiliser ses ressources pour -lancer le script. En effet, GDM possède des scripts qui sont lancés aux -différents moments de la connexion. Ce qui nous intéresse ici se trouve -dans le fichier : /etc/gdm/PostLogin/Default - -Il suffit d'y coller notre script (ou d'y faire appel), et notre partition -sera activée automatiquement lors de la connexion (et seulement si le mot de -passe est valide). - -On peut obtenir des paramètres de la part de GDM dans ce script, nom de -l'utilisateur qui se loggue, répertoire de login etc, cela permet de -personnaliser notre script si on le souhaite. Un code de retour en erreur -refusera le login, que le mot de passe entré soit bon ou non… diff --git a/content/Informatique/chroot.rst b/content/Informatique/chroot.rst deleted file mode 100644 index d126d99..0000000 --- a/content/Informatique/chroot.rst +++ /dev/null @@ -1,236 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -Mettre en place un environnement sftp chrooté -############################################# - -:date: 2010-04-08 -:tags: Libre, Hébergement, sftp - -*Note* : Je propose une autre approche pour mettre en place cette -solution : -`mettre-en-place-un-environnement-sftp-chroote-2/ <|filename|sftp.rst>`_ - -La demande -~~~~~~~~~~ - -Ma copine m'a demandé de trouver une solution simple pour échanger des -fichiers avec sa sœur, msn posant des problèmes… J'ai pensé à mon serveur ssh -et mettre en place une connexion sftp pour ça. Sur le principe cela a été -adopté avec une petite présentation de filezilla (je ne sais pas s'il existe -des clients sftp intégrés sous windows ?), j'ai donc commencé à mettre en place -le système. De mon côté, la condition principale est de n'autoriser les -connexions que par clef publique (pas de mot de passe), ma copine a tenu à ce -que sa sœur ne puisse pas accéder aux documents présents dans son home, et du -mien à ce que l'on ne puisse pas pour autant se promener dans l'arborescence du -serveur : il va donc falloir chrooter l'environnement. Il existe pas mal de -documentation la dessus sur internet, mais je me suis souvent retrouvé face à -des exemples incorrects ou incompatible avec le fait de passer par une clef -publique, je vais donc détailler les problèmes rencontrés. - -Le compte + clef publique -~~~~~~~~~~~~~~~~~~~~~~~~~ - -La première étape est de créer le compte, cela se fait assez simplement -: - -:: - - # adduser ${user} - -|Création de la clef ssh avec puttygen| et en répondant aux questions -par défaut… Vient ensuite la clef publique : filezilla gère les clefs -privés au format ppk (putty) et je n'ai pas trouvé d'outil pour les -générer sous windows. Je suis donc passé par wine + puttygen pour créer -la clef. Une fois celle-ci crée, on enregistre la partie publique et la -partie privée de la clef. La clef publique va être enregistrée dans le -fichier ${user}/.ssh/know\_host sur le serveur pour autoriser le client -à s'y connecter. La clef privée sera enregistrée de son côté au format -ppk pour être utilisée par filezilla (il est possible à partir de ce -fichier de générer une clef privée de type openssh). - -|image1| - -Il faut ensuite intégrer la clef privée dans filezilla en passant par -les paramètres : elle sera automatiquement lue à la connexion (il faut -choisir «interactive» dans le type d'authentification). (Attention : -sous windows j'ai rencontré des problèmes avec un répertoire contenant -des accents, la clef semblait être lue, mais la connexion ne se faisait -pas pour autant.) - -Chrooter l'environnement -~~~~~~~~~~~~~~~~~~~~~~~~ - -Aujourd'hui il est possible de chrooter nativement un environnement sftp -avec openssh. Il faut pour cela mettre en place une condition sur -l'utilisateur (ou le groupe) pour faire le chroot : - -:: - - Match user ${user} - ChrootDirectory /var/chroot/ - X11Forwarding no - AllowTcpForwarding no - ForceCommand internal-sftp - -Dans cet exemple le chemin /var/chroot sera utilisé comme racine lors -des connexions sftp. Ce répertoire doit être détenu par root:root et -avoir les droits 755. Cela veut dire que si notre utilisateur à pour -répertoire home /home/${user}, il se retrouvera dans -/var/chroot/home/${user} lors des connexions sftp. Il est nécessaire de -conserver le répertoire home de l'utilisateur pour que ssh accepte une -connexion par clef. En effet, lorsque l'utilisateur va se connecter, ssh -va lire dans son répertoire personnel pour lire le fichier -.ssh/know\_host et autoriser ou non la clef qui se présente. Ce qui -signifie que si l'on modifie le répertoire personnel, il faut aussi -déplacer cette arborescence (hors de question dans ce cas de mettre / -comme racine de l'utilisateur). À noter : j'ai préféré faire le match -sur le nom de l'utilisateur plutôt que sur son groupe (le groupe sera -utilisé par ailleurs). Dans le cas où nous avons plusieurs -utilisateurs, il est possible de les mettre à la suite (séparés par des -virgules). J'ai vu de nombreux tutoriaux qui indiquent comme répertoire -de chroot « /home/%u » (le répertoire de l'utilisateur standard), et -qui demandent de changer le répertoire de login de l'utilisateur par « / -». Je pense que c'est une très mauvaise idée : d'une part parce que cela -oblige à déposer les clefs à la racine du serveur, mais aussi à cause de -la contrainte d'openssh demandant à ce que le répertoire root soit -détenu par root : cela veut dire que l'utilisateur n'a pas le droit de -déposer de fichiers ou de créer de répertoires dans son propre home ! Le -plus simple est donc de prendre un autre répertoire pour l'échange, et -laisser le home de l'utilisateur pour la configuration. (Cela permet -aussi d'être sûr que le répertoire .ssh ne sera pas effacé par erreur -par l'utilisateur…) J'ai donc mis un lien symbolique pour lier le /home -de l'utilisateur avec son répertoire d'échange : - -.. code-block:: console - - # mkdir /home/${user}/echanges - # ln -s /var/chroot/home/${user} /home/${user}/echanges - -On retrouvera ainsi la possibilité de voir les fichiers déposés en -passant par le /home de l'utilisateur (même si ce dernier ne pourra pas -y aller…) - -Isoler l'environnement -~~~~~~~~~~~~~~~~~~~~~~ - -Maintenant que nous avons empêché l'utilisateur de se balader sur -l'ordinateur, nous allons l'empêcher de se balader dans les autres -répertoires des utilisateurs : cela se fait en une ligne de commande -(pour chacun des répertoires que nous allons ouvrir en sftp :) - -.. code-block:: console - - # for fichier in /var/chroot/home/* ; do chmod o-r ${fichier}; done - -Et voilà ! Les utilisateurs peuvent voir qu'il existe d'autres comptes -que le leur, mais ne peuvent pas y accéder. - -Autoriser le partage -~~~~~~~~~~~~~~~~~~~~ - -Maintenant que nous avons fermé les droits de manière générale il nous -reste à autoriser le partage des fichiers (après tout c'était le but de -la demande !) de manière plus fine. Cela implique pour moi deux choses : - -#. permettre à un autre utilisateur d'accéder aux données présentes -#. permettre à un autre utilisateur de déposer (ou de supprimer des - données) - -Pour le premier point, c'est facile il suffit d'ajouter l'utilisateur A -au groupe de l'utilisateur B : - -.. code-block:: console - - # usermod -a -G ${user} ${un_autre_utilisateur} - -Et l'utilsateur un\_autre\_utilisateur pourra donc accéder à l'ensemble -des fichiers pour les lire (et éventuellement les rapatrier chez lui). -Pour le second point (possibilité d'écrire et modifier) c'est un peu -plus compliqué; en gros nous voulons que les fichiers déposés par sftp -dans le répertoire de l'utilisateur ait comme groupe d'appartenance -celui du propriétaire du répertoire (quel que soit l'utilisateur qui -dépose) et qu'ils soient modifiable par le groupe (g+w) du -propriétaire. Par exemple : l'utilisateur A dépose un fichier dans le -répertoire d'échange de l'utilisateur B. Il faut que les droits de ce -fichier se présentent ainsi une fois le transfert terminé : - -.. code-block:: console - - $ ls -l fichier - -rw-rw---- 1 utilisateurA utilisateurB - -(ainsi l'un et l'autre pourront supprimer le fichier). Pour cela nous -allons utiliser une « bidouille » de l'os : le sgid bit. Derrière ce nom -barbare se trouve un marqueur qui permet de fixer le droit de tous les -fichiers qui seront créés dans le répertoire (plus d'info -`ici `_). Pour le déterminer on -passe par chmod : - -.. code-block:: console - - # chmod g+s /var/chroot/${user} - -|image2| - -Cela détermine bien quel est le groupe qui sera propriétaire du fichier, -mais cela ne donne pas à ce groupe le droit de le modifier pour autant ! -Sous linux, c'est la commande umask qui permet de déterminer les droits -des fichiers. Le problème est qu'il s'agit d'une commande liés à -l'environnement de l'utilisateur, et non pas aux répertoires sur -lesquels nous travaillons (à moins de passer par les ACLs mais cela est -déjà assez compliqué comme ça…). Ici, nous sommes dans un environnement -sftp, sans shell de login, donc sans possibilité d'exécuter la commande -directement, il faut que ce soit le serveur sftp qui le configure. J'ai -trouvé énormément de documentations (la plupart des bidouillages) pour -contourner le problème, mais la solution la plus simple vient de la -dernière version d'OpenSSH (5.4) sortie le 8 mars dernier. - - -Une nouvelle option sur le serveur sftp permet d'indiquer quel est -l'umask qui sera appliqué (dans notre cas 002) : dans le -fichier/etc/ssh/sshd\_config nous allons configurer les paramètres par -défaut du serveur sftp : Remplacer : - -:: - - Subsystem sftp /usr/lib/openssh/sftp-server.sh - -par : - -:: - - Subsystem sftp /usr/lib/openssh/sftp-server -u 002 - -Pour définir les droits umask qui seront appliqués par défaut pour -toutes les connexions sftp par défaut. Ce paramétrage est à redéfinir -pour les paramétrages personnalisés (bloc Match) : - -:: - - ForceCommand internal-sftp -u 002 - -Conclusion -~~~~~~~~~~ - -Nous avons un environnement bien hermétique, pouvant gérer -l'augmentation du nombre de compte (il suffit de refaire les chmod dans -notre environnement chrooté à la création du compte), et hermétique. Le -paramétrage côté serveur est effectivement assez lourd au début, mais je -pense que la mise à jour ne demande pas trop de travail, et on gère les -droits de manière assez fine (en passant par les groupes ce qui me -semble être dans la mentalité unix). Pour le client, il n'y a pas grand -chose à paramétrer (récupérer la clef et l'intégrer), et il n'y a -aucun risque que celui-ci vienne casser son paramétrage. On peut même -sauvegarder sa clef privée dans son home (le vrai), au cas où il -perdrait le fichier. - -.. |Création de la clef ssh avec puttygen| image:: |filename|../images/puttygen-300x276.jpg - :class: floatleft - - -.. |image1| image:: |filename|../images/filezilla-300x140.jpg - :class: floatright - -.. |image2| image:: |filename|../images/conf-300x175.jpg - :class: floatleft diff --git a/content/Informatique/elinks.rst b/content/Informatique/elinks.rst deleted file mode 100644 index bac91ba..0000000 --- a/content/Informatique/elinks.rst +++ /dev/null @@ -1,47 +0,0 @@ -.. -*- rst -*- -.. -*- coding: utf-8 -*- - -Scripter elinks -############### - -:date: 2012-02-18 -:tags: Libre - -elinks_ est un navigateur web, destiné à être utilisé en console. Il s'agit -pour moi d'un très bon navigateur secondaire, en complément de firefox, qui à -l'avantage de permettre une navigation légère, sans effets de javascript, -publicités, idéale pour lire l'actualité, un peu moins pour faire une recherche -sur un sujet. - -La semaine dernière, j'ai envoyé un message_ sur la mailing list du projet pour -indiquer que je souhaitai entreprendre quelques modifications dans le code dans -le but de le rendre davantage modulaire. Il est nativement scriptable dans -différents langages (lua, python, perl...) mais les possbilités de scripts -restent très limitées et ne permettent pas de changer grand chose au -comportement du navigateur. Quand on a pri l'habitude de pouvoir configurer -ses applications comme on le souhaite, cela devient difficile de ne pas pouvoir -le faire. - -J'ai donc choisi de me pencher davantage sur le langage lua pour mettre en -place les modifications voulues. J'ai déjà une expérience du lua comme scripts -côté client, pour l'instant jamais du côté de l'API C. Après avoir lutté un -petit peu, j'ai fini par comprendre et suis aujourd'hui en train de mettre les -objets qui m'intéressent. - -Le but est de permettre de scripter complètement la navigation : aujourd'hui, -les seules interractions possibles permettent de modifier l'URL au moment où -celle-ci est entrée, mais aucun accès au document n'est donné : impossible de -récupérer les URLs, impossible de sélectionner un lien dans la page, ou de -naviguer dans celle-ci. C'est tout cela que je souhaite mettre en place, en -proposant une API orientée objet qui sera modulable et réutilisable par la -suite. - -Pour l'instant, les modifications ne sont pas encore visibles, je fais le -commit sur mon propre serveur git, mais je rendrai public mon projet dès que -j'aurai obtenu un résultat intéressant : je n'attendrai pas d'avoir fini pour -tout publier; soyez patient ! - -.. _elinks: http://elinks.or.cz/index.html -.. _message: http://linuxfromscratch.org/pipermail/elinks-dev/2012-February/002049.html - - diff --git a/content/Informatique/fail2ban.rst b/content/Informatique/fail2ban.rst deleted file mode 100644 index cee3534..0000000 --- a/content/Informatique/fail2ban.rst +++ /dev/null @@ -1,192 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -Une gestion avancée de fail2ban -------------------------------- - -:date: 2008/09/15 -:tags: Libre, Hébergement, Administration - -Beaucoup d'articles sont déjà parus sur l'utilisation de fail2ban pour -protéger son ordinateur. Je vais parler ici d'une utilisation avancée de -fail2ban, couplé avec le pare-feu iptables dans le but de faire plein de -joli de choses avec ceux qui tentent d'accéder à nos Pcs ! - -Pour rappel, fail2ban permet de bloquer certaines IPs en fonction de ce -que les logs renvoient comme messages. Il est possible de déterminer les -ports sur lesquels les IPs seront bloquées et la durée du blocage. En ce -qui concerne les filtres qui déclencheront ou non le blocage, cela se -base sur des regex, et on peut déterminer le nombre de tentatives avant -qu'un blocage ne soit appliqué. - -Dans l'esprit du projet, fail2ban empêche les attaques par force brute, -mais nous allons voir qu'il est tout à fait possible de l'utiliser dans -d'autres fins. - -Créer de nouvelles règles de filtrage -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Dans un premier temps, nous allons mettre en place une nouvelle règle de -blocage pour, par exemple, bloquer les IPs en fonction des codes -d'erreurs d'apache. - -Mettre en place une nouvelle règle se fait de manière très simple, il -suffit de créer un fichier contenant la regex à appliquer, et de mettre -une référence vers ce fichier dans la configuration de fail2ban. - -Dans notre cas, pour bloquer les IPs ayant générés une erreur 403 ou une -erreur 401 dans apache, notre regex se présentera ainsi : - -:: - - failregex = :80 .* ".*" 403 = :80 .* ".*" 401 - -(Celle-ci est bien sûr à adapter en fonction de la manière dont vous -affichez vos logs de connexions.) - -Dans le fichier de configuration de fail2ban (/etc/fail2ban/jail.conf), -nous allons demander la lecture de ce fichier en indiquant quelques -paramètres supplémentaires : - -:: - - [apache-block] - enabled = true #Oui on active - port = http #On ne bloque que le port 80 - filter = apache-block # le nom du fichier que l'on a créé juste avant - action = %(action_)s - logpath = /tmp/log/apache/access.log - maxretry = 1 #Nombre de tentatives - banaction = iptables-redirect # L'action à appliquer sur l'IP - bantime = 3600 # Le temps pendant lequel l'ip sera bannie. - - -Créer de nouvelles actions -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Une fois que fail2ban aura lancé une procédure de blocage sur une -connexion, il va lancer un script contenant les actions à réaliser sur -cette IP. D'habitude ce script contient une règle iptables qui bloque -l'adresse, et une autre règle qui supprime ce blocage. - -Nous allons maintenant jouer avec iptables pour réaliser quelques -effets intéressant avec nos IPs à bannir : - -Relancer la durée du blocage -++++++++++++++++++++++++++++ - -Par défaut, fail2ban retire le blocage sur l'IP une fois que la durée -spécifiée est écoulée. Je trouve ceci limité car cela n'empêche pas -l'attaquant de continuer ses attaques et se retrouver prêt à refaire une -attaque dès que cette durée est écoulée. De plus, cela peut donner une -information sur la durée pendant laquelle nous filtrons son adresse. - -Iptables propose un module, modrecent, permettant de bloquer une IP -pendant une durée déterminée, et de réinitialiser cette durée si jamais -une nouvelle connexion venait à être réalisée durant cette période. - -Pour ceci nous allons devoir une règle iptables, en dehors de fail2ban, -qui consistera à bloquer une IP pendant telle période : - -Dans fail2ban, nous allons créer un nouveau fichier action, qui se -présentera comme suit : - -.. code-block:: bash - - #On crée une nouvelle table - actionstart = iptables -N fail2ban- - iptables -A fail2ban- -j DROP - #On insère une nouvelle règle qui met à jour le compteur à chaques nouvelles tentatives tant que le délai n'est pas écoulé - iptables -I INPUT -p -m multiport --dports -m recent --update --seconds 360000 --name fail2ban-- -j fail2ban- - - actionstop = iptables -D INPUT -p -m multiport --dports -m recent --update --seconds 360000 --name fail2ban-- -j fail2ban- - iptables -F fail2ban- - iptables -X fail2ban- - - # Pour bannir une IP, il suffit de l'écrire dans le fichier de configuration de mod-recent - actionban = echo + > /proc/net/xt_recent/fail2ban- - - # On ne retire pas de l'unban, cela se fera tout seul une fois que l'attaquant aura terminé de se connecter - actionunban = - -Il nous suffit de l'enregister dans le fichier `/etc/fail2ban/action.d/iptables-recent.conf` - -Si l'on veut bloquer une ip manuellement, il suffit d'éxécuter la dernière -ligne, à savoir - -.. code-block:: console - - # echo +${IP} > /proc/net/xt_recent/fail2ban- - -Mettre un message d'alerte -++++++++++++++++++++++++++ - -On peut décider d'annoncer à notre utilisateur bloqué que nous avons -banni son IP. Cela peut être utile si nous avons mis en place des règles -de filtrage très strictes et qu'un utilisateur peut se retrouver bloqué -sans avoir tenté la moindre intrusion (mieux vaut être trop prudent que -pas assez) - -Pour cela, nous allons avoir besoin d'un service qui consistera à -afficher le texte sur demande. Hors de question de demander ça à apache -ou autre serveur web, nous allons mettre en place notre propre serveur -web, qui présentera une page statique, toujours identique. - -Socat et tout désigné pour cela. Dans notre exemple nous allons le -faire tourner en tant que serveur, sur un port ouvert, et avec des -droits limités. Notre règle iptables consistera juste à rediriger les -connexions entrantes sur le port 80 vers le port où l'on fait tourner -socat. - -.. code-block:: bash - - sudo -u nobody socat tcp4-listen:6666,reuseaddr,fork exec:"cat /etc/apache2/banned.html" & - -et la règle iptables à mettre en place : - -.. code-block:: bash - - #On crée la règle sur la table de préroutage : - actionstart = iptables -t nat -N fail2ban- - iptables -t nat -A fail2ban- -j RETURN - iptables -t nat -I PREROUTING -p -m multiport --dports -j fail2ban- - - iptables -N fail2ban- - iptables -A fail2ban- -j RETURN - iptables -I INPUT -p -m multiport --dports -j fail2ban- - -et pour lancer l'action, là encore, on simule une perte de paquet pour -ralentir le temps d'affichage de la page - -.. code-block:: bash - - actionban = iptables -t nat -I fail2ban- 1 -s -p tcp -m multiport --dports -m statistic --mode nth --every 3 -j REDIRECT --to-port 6666 - iptables -I fail2ban- 1 -s -j DROP - -Les règles d'unban et de stop se font en symetrique de ban et start, en -supprimant des règles crées. - - -Utiliser les nouvelles règles -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Cela se fait simplement en utilisant les nouveaux noms de fichier à la place -des anciens. Dans le fichier `/etc/fail2ban/jail.conf`, il suffit d'utiliser la -directive : - -.. code-block:: bash - - banaction = iptables-recent - -pour utiliser les nouvelles directives à la action de filtrage. - -Voilà, cela permet de mettre en place une sécurité personnalisée et -adaptée, qui sort déjà des outils et configuration standards (ce qui -est toujours une bonne chose en matière de sécurité). Les exemples que -j'ai donnés ne sont que des suggestions, et il est possible de faire beaucoup -d'autres choses avec un peu d'imaginations. Je vous renvoie au manuel -d'iptables qui présente la liste de tous les modules existants, et de -regarder un peu les paramètres disponibles parmi les fichiers de -configuration de fail2ban. Mon seul regret est qu'à ce jour, ce -programme ne gère pas encore les Ip en v6, mais ça n'est - pour -l'instant - pas encore critique.. diff --git a/content/Informatique/fcron2cron.rst b/content/Informatique/fcron2cron.rst deleted file mode 100644 index 031e28d..0000000 --- a/content/Informatique/fcron2cron.rst +++ /dev/null @@ -1,123 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -=============== -De fcron à cron -=============== - -:date: 2013-05-09 -:tags: Libre, Python, Administration -:summary: |summary| -:logo: static/images/time/time_75.jpg -:lang: fr -:slug: fcron-to-cron - - -.. figure:: |filename|/images/time/time.jpg - :figwidth: 150 - :figclass: floatleft - :alt: Pavement - - Image : `Toni Verdú Carbó`_ (creativecommons_) - -.. _Toni Verdú Carbó: http://www.flickr.com/photos/tonivc/2283676770/in/photostream/ -.. _creativecommons: http://creativecommons.org/licenses/by-nc-nd/2.0/deed.fr - -|summary| - -.. |summary| replace:: - Debian Wheezy est sortie, et cette nouvelle version a fait un peu de ménage - dans les paquets disponibles. Parmi ceux-ci, fcron_ a disparu. Il s'agit du - gestionnaire de tâche planifiées que j'utilisais jusqu'alors. Ce petit - guide a pour vocation de vous expliquer comment migrer la configuration. - -.. _fcron: http://fcron.free.fr/ - -Fcron avait l'avantage de pouvoir gérer l'arrêt de la machine, et lancer les -tâches en attente lors du redémarrage. Quand on s'auto-héberge, cela permet de -prendre en charge les coupures inopinées, et se passer du couple cron/anacron. -Debian a fait le choix de préférer ce dernier couple plutôt que fcron, voici -donc un petit guide pour passer de l'un a l'autre. - -Migration ? -=========== - -Pour commencer, pas de panique, le paquet est supprimé des dépôts, mais reste -parfaitement fonctionnel sur votre machine. Vous n'avez donc pas besoin de vous -précipiter, tout va continuer de tourner tout seul comme auparavant. Vous -pouvez même choisir de ne pas migrer et continuer à l'utiliser. Toutefois, -si des failles de sécurités sont trouvées sur le programme, aucune mise à jour -ne sera effectuée : c'est à vous de vous tenir informé du développement de -l'application et de faire l'installation. - -La transformation -================= - -Voici un `script python`_ qui se charge de faire la migration d'un fcrontab -vers un crontab. Il ne fait que générer les fichiers de configuration, et -n'enregistre rien sur le système. Le script va lire les fcrontab enregistrées -dans le répertoire `/var/spool/fcron/` et génère en sortie les crontab -correspondantes pour chacun de ces utilisateurs. - -.. _script python: |filename|/resources/fcron2cron.py - -Usage -~~~~~ - -Le programme doit être lancé en root pour pouvoir lire les fichiers présents -dans le répertoire `/var/spool/fcron/` ainsi que les fcrontabs des différents -utilisateurs du système: - -.. code-block:: console - - $ mkdir crontabs - $ cd crontabs - $ sudo python ~/fcron2cron.py - -Il y a beaucoup moins de paramètres chez cron que fcron, il est toutefois -possible de convertir quelques instructions : - -Les options -~~~~~~~~~~~ - -Les seules options possibles dans cron sont celles qui concernent le mail : - -`mail(bool)` devient `MAILTO=""` si bool est à false `mailto(string)` devient -`MAILTO="string"` - -Les autres options sont ignorées\ [#]_. - - -Les directives -~~~~~~~~~~~~~~ - -Les directives `hourly`, `daily`\ [#]_, `weekly`, `monthly` sont transformées -en leur équivalent dans cron, ainsi que leur équivalent `mid-*ly`. Les -directives `mins`, `hours`, `days`, `mons`, `dow` ne sont pas prises en compte -et sont ignorées dans la ligne générée. - -L'édition -========= - -Le programme ne fait pas l'insertion de la crontab dans le système, ainsi, dans -le cas ou une telle crontab existe déjà, elle ne sera pas écrasée. C'est à -l'adminstrateur de mettre le paramétrage à jour. Une fois le script lancé, des -fichiers `UTILISATEUR.crontab` vont être générés. - -Si l'utilisateur n'a pas de crontab correspondante, il est possible de le -charger directement avec la commande suivante : - -.. code-block:: console - - # crontab -u ${USER} ${USER}.crontab - -Si l'utilisateur possède déjà une crontab, il va falloir éditer le fichier pour -le faire correspondre. Maintenant qu'il ne reste plus que ça à faire, il est -temps de se remonter les manches et y aller à la main ! Une fois que les -modifications sont faites, vous pouvez désinstaller fcron de votre système. - -Notes -===== - -.. [#] Y compris les options en début de commande (ligne débutant par `&`) -.. [#] `nightly` est traité de la même manière diff --git a/content/Informatique/fcron2cron_en.rst b/content/Informatique/fcron2cron_en.rst deleted file mode 100644 index 1fe9e54..0000000 --- a/content/Informatique/fcron2cron_en.rst +++ /dev/null @@ -1,62 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -================== -From fcron to cron -================== - -:date: 2013-05-08 -:tags: Libre, Administration -:summary: |summary| -:logo: static/images/time/time_75.jpg -:lang: en -:slug: fcron-to-cron -:translation: true -:status: draft - - -.. figure:: |filename|/images/time/time.jpg - :figwidth: 150 - :figclass: floatleft - :alt: Pavement - - Image : `Toni Verdú Carbó`_ (creativecommons_) - -.. _Toni Verdú Carbó: http://www.flickr.com/photos/tonivc/2283676770/in/photostream/ -.. _creativecommons: http://creativecommons.org/licenses/by-nc-nd/2.0/deed.fr - -|summary| - -.. |summary| replace:: - Debian Wheezy is now out, and this new realease removed some packages, - including fcron_. - Il s'agit du - gestionnaire de tâche planifiées que j'utilisais jusqu'alors. Ce petit - guide a pour vocation de vous expliquer comment migrer la configuration. - -.. _fcron: http://fcron.free.fr/ - -Fcron avait l'avantage de pouvoir gérer l'arrêt de la machine, et lancer les -tâches en attente lors du redémarrage. Quand on s'auto-héberge, cela permet de -prendre en charge les coupures inopinées, et se passer du couple cron/anacron. -Debian a fait le choix de préférer ce dernier couple plutôt que fcron, voici -donc un petit guide pour passer de l'un a l'autre. - -Migration ? -=========== - -Pour commencer, pas de panique, le paquet est supprimé des dépôts, mais reste -parfaitement fonctionnel sur votre machine. Vous n'avez donc pas besoin de vous -précipiter, tout va continuer de tourner tout seul comme auparavant. Vous -pouvez même choisir de ne pas migrer et continuer à l'utiliser. Toutefois, -si des failles de sécurités sont trouvées sur le programme, aucune mise à jour -ne sera effectuée : c'est à vous de vous tenir informé du développement de -l'application et de faire l'installation. - -Voici un programme python qui se charge de faire la migration d'un fcrontab -vers un crontab. Il ne fait que générer les fichiers de configuration, et -n'enregistre rien sur le système. Le script va lire les fcrontab enregistrées -dans le répertoire `/var/spool/fcron/` et génère en sortie les crontab -correspondantes pour chacun de ces utilisateurs. - -Les instructions spécifiques sont converties, dans la mesure du possible. diff --git a/content/Informatique/fonctionnel.rst b/content/Informatique/fonctionnel.rst deleted file mode 100644 index 06d75d0..0000000 --- a/content/Informatique/fonctionnel.rst +++ /dev/null @@ -1,190 +0,0 @@ - -Programmation fonctionnelle -########################### - -:date: 2012-11-09 -:tags: Programmation - -Dans cet article, je vais essayer de présenter différents cas de programmation -fonctionnelle en essayant de partir d'un cas pratique pour présenter les -difficultés et solutions disponibles. - -Je vais présenter ici des exemples dans le langage python, par ce qu'il s'agit -d'un langage simple, pouvant être utilisé de manière fonctionnelle (dans une -certaine limite). Je me contente d'un python `basique` et ne vais pas chercher -entrer dans des syntaxes spécifiques, le but étant ici de servir de support, et -non pas de présenter le langage. - -Un besoin -========= - -Imaginons la situation suivante : une application reçoit des données d'un -client et doit les traiter. Ces données arrivent dans des fichiers textes, -chaque ligne du fichier correspond à une donnée à traiter. - -Un programme -============ - -Commençons le programme, pour lire le fichier commençons par le localiser : - -.. code-block:: python - - def get_file(nom): - chemin = os.path.join("repertoire", nom) - return open(chemin) - -Cette fonction est simple : elle prend en argument un nom de fichier, et -retourne le fichier correspondant. On peut également dire qu'elle effectue la -transformation suivante : - -.. code-block:: ocaml - - get_file: String -> File - -Cette notation indique que le type de la fonction est le suivant : elle prend -un string en entrée, et retourne un file en sortie. Nous l'utiliserons -régulièrement dans cet article. - -Dans notre cas, nous n'avons pas un fichier a traiter, mais une série de -fichiers. Nous allons donc devoir appeler la fonction sur tous nos nom de -fichiers. La première solution est la solution itérative, à travers une boucle -: - -.. code-block:: python - - def transforme(noms): - fichiers = [] - for nom in noms - fichiers.append(get_file(nom)) - return fichiers - -À la fin de l'exécution de la boucle, la liste `fichiers` contient la liste des -fichiers construits à partir de la liste `noms`. - -C'est une opération très fréquente et bien qu'elle soit très courte. Essayons -de réfléchir un peu à ce que nous venons de faire en terme de type : notre but -est de transformer une liste de String en liste de File de la manière suivante -: - -.. code-block:: ocaml - - transforme: List[String] -> List[File] - -Si l'on généralise, on peut essayer de créer une fonction qui aurait le schéma -suivant : - -.. code-block:: ocaml - - transforme: List[A] -> List[B] - -Cette fonction a par contre besoin d'une transformation à appliquer pour -transformer A en B, dans notre cas, cette transformation a déjà été créée plus -haut ! - -Notre schéma devient donc le suivant : - -.. code-block:: ocaml - - transforme: (A -> B) -> List[A] -> List[B] - -Récrivons donc notre fonction transforme de cette manière: - -.. code-block:: python - - def transforme(func, source): - results = [] - for nom in source - results.append(func(nom)) - return results - - fichiers = transforme(get_file, noms) - -Et voilà ! Nous avons maintenant notre fonction générique, destinée à changer -le contenu de notre liste. Qu'est ce que cela apporte par rapport à la version -impérative que nous avons écrit tout à l'heure ? En fait pas grand chose. Sauf -que la fonction `transforme` est présente nativement dans python. Elle -s'appelle en fait `map`, et effectue le même travail. - -Nous aurions donc tout aussi bien pu écrire : - -.. code-block:: python - - fichiers = map(get_file, noms) - -Une réflexion -============= - -Pourquoi avoir écrit tout ça ? Par ce que semblant de rien, nous avons changé -notre manière de concevoir le programme : au lieu d'écrire une suite -d'instructions qui s'exécutent séquentiellement, nous venons d'appliquer des -transformations dans un contexte : la liste des noms de fichiers est notre -contexte de base, sur lequel nous appliquons des transformations pour créer un -autre contexte. - -Ces transformations ne modifient pas notre contexte initial, et par la suite -les transformations que nous continueront d'appliquer ne modifieront rien non -plus de notre environnement. Dans cet esprit, l'ensemble du programme peut être -perçu comme un grande transformation qui s'applique sur un point d'entrée -initial. - -Une théorie -=========== - -La fonction `map` que nous venons de présenter ici, s'inscrit en fait dans un -cadre de fonctions plus vaste : les foncteurs_. Il s'agit d'une notion -mathématique que l'on retrouve appliquée en informatique. - -.. _foncteurs: http://fr.wikipedia.org/wiki/Foncteur - -Comme vu précédemment, un objet foncteur F est un objet ayant la signature -suivante : - -.. code-block:: ocaml - - map: (A -> B) -> F[A] -> F[B] - -Le foncteur a deux contraintes, qui sont plutôt intuitives: - -identité --------- - -Soit la fonction `id` défini comme suit: - -.. code-block:: python - - def id(x): - return x - -alors on a l'égalité suivante : - -.. code-block:: python - - map(id, fichiers) == fichiers - -Autrement dit, le foncteur ne doit pas modifier la structure de la donnée. On -peut essayer de repenser la fonction `transforme` écrite plus haut pour briser -cette règle, je laisse au lecteur le soin de réfléchir à cette question. - -composition ------------ - -La deuxième contrainte est celle de la composition : - -.. code-block:: python - - map(f(g), source) = map(f, map(g, source)) - -C'est à dire qu'il est possible de composer les fonctions les entre elles : -c'est encore heureux, car cela permet de chaîner les traitements entre eux… - -Une conclusion -============== - -Notre contexte est ici une liste, mais nous allons voir par la suite qu'il en -existe beaucoup d'autres, ce qui va nous faciliter la vie… Cela va venir dans -les articles qui suivent. - -Une fois les deux contraintes validées, nous allons pouvoir construire de -nouveaux types basés sur ce foncteur. Et derrière la solution informatique mise -en place, je vais essayer de présenter les concepts mathématiques qui sont -derrière. diff --git a/content/Informatique/gueule1.rst b/content/Informatique/gueule1.rst deleted file mode 100644 index b92a0d7..0000000 --- a/content/Informatique/gueule1.rst +++ /dev/null @@ -1,65 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -Essai raté d'un plugin gedit -############################ - -:date: 20/04/2013 -:tags: Programmation, Libre, Humeur, gtk -:logo: static/images/gedit.png - -.. default-role:: literal - -En relisant mes articles, j'ai décidé d'utiliser languageTool_ pour vérifier la -grammaire avant de les publier. Puis en regardant l'outil, j'ai voulu voir s'il -existait un plugin gedit permettant de l'intégrer dans l'édition d'un texte -(j'utilise vim, je sais que ma compagne utilise gedit pour écrire ses textes). - -Titivullus_ est disponible sur sourceforge, et est facile à installer (même si -l'auteur n'a pas compris comment fonctionnait SVN), par contre l'utilisation -n'est pas des plus pratiques : il faut charger la console d'erreur de gedit -(qui ne peut pas être réduite), et le plugin n'est pas configurable. - -.. _languageTool: http://www.languagetool.org/ -.. _Titivullus: http://sourceforge.net/projects/titivullus/ - -Heureusement, c'est du python ! -=============================== - -Le code n'est pas compliqué à comprendre (il n'est pas parfait, mais à au moins -le mérite d'être là), et j'ai commencé à le modifier : première étape, appeler -languagetool en ligne de commande plutôt que de lancer le serveur web. -Deuxième étape, surligner dans gedit la ligne en erreur pour éviter d'avoir à -passer par la console pour savoir ce qui ne va pas ; on se plonge dans -l'édition de `plugin sous gedit`_, et là, c'est le drame ! - -.. _`plugin sous gedit`: https://live.gnome.org/Gedit/PythonPluginHowTo - -Devant du code C -================ - -Le binding python est assez limité, il faut remonter dans l'API C pour trouver -ce que l'on cherche, et là : - -* erreur 404 dans l'API (par exemple les liens de l'« Object Hierarchy » de - GtkSourceView_) -* Des messages d'erreurs abscons dûs à l'introspection (par exemple en cas de - mauvais objet passé en paramètre) -* Des dépendances de plus en plus importantes à chaque nouvelle étape (`gedit`, - `gtk`, puis pango_\ …) - -Plus j'avance, et plus j'ai l'impression que le chemin qui reste à parcourir -est grand ! Qu'il est loin le temps où je m'étais penché sur Vala_ pour -découvrir ! J'ai finalement laissé tomber, en ayant l'impression d'avoir perdu -mon temps : mettre en place un plugin sous gedit est définitivement trop -compliqué pour pouvoir être réalisé facilement, sans se plonger dans le code -GTK et le connaître sur le bout des doigts. - -Dommage, pour une fois que j'avais envie de me plonger dans le code et -d'avancer… Je comprends que le greffon Titivullus soit resté à l'état de proff -of concept et que personne ne l'ai repris : cette petite aventure m'a fait -passer l'envie de me plonger dans du dev gnome ! - -.. _GtkSourceView: https://developer.gnome.org/gtksourceview/stable/GtkSourceView.html -.. _pango: https://developer.gnome.org/pango/stable/pango-Text-Attributes.html -.. _Vala: |filename|../Informatique/vala.rst diff --git a/content/Informatique/guiderstodt.rst b/content/Informatique/guiderstodt.rst deleted file mode 100644 index d4105a3..0000000 --- a/content/Informatique/guiderstodt.rst +++ /dev/null @@ -1,164 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -Guide d'utilisation de rst2odt -============================== - -:date: 2013-05-07 -:tags: Libre, reStructuredText -:summary: |summary| -:logo: static/images/rstodt/writing_75.jpg - - -.. figure:: |filename|/images/rstodt/writing.jpg - :figwidth: 150 - :figclass: floatright - :alt: Bureau - - Image : `AJ Cann`_ (creativecommons_) - -.. _creativecommons: http://creativecommons.org/licenses/by-nc-sa/2.0/deed.fr - - -|summary| - - -.. |summary| replace:: - J'ai déjà souvent abordé le langage reStructuredText_ dans mes articles, et - je l'utilise fréquement, que ce soit pour écrire sur ce blog ou publier - d'autres contenus. On présente souvent rst2pdf_ pour la publication, mais - il est également possible de générer une sortie vers libreoffice, - permettant de créer rapidement des documents avec une mise en page - maîtrisée. - -.. _reStructuredText: http://docutils.sourceforge.net/docs/ref/rst/introduction.html -.. _rst2pdf: http://rst2pdf.ralsina.com.ar/ - -Premiers pas ------------- - -On commence par installer les outils nécessaires : - -.. code-block:: console - - $ sudo aptitude install rst2odt - -et on lance la génération de la manière suivante : - -.. code-block:: console - - $ rst2odt document.rst document.odt - -On peut tout de suite consulter le fichier généré pour voir le résultat. Le -rendu est moins aguicheur que celui généré avec rst2pdf, mais il est possible -de changer ça. - -Environnement -------------- - -Plutôt que de lancer la commande à chaque fois, il est préférable de se créer -un environnement qui va nous servir chaque fois que nous aurons besoin de -publier un nouveau document. - -On va se créer un Makefile pour automatiser la génération du document : - -.. code-block:: makefile - - resources/template.odt: resources/template.rst - rst2odt resources/template.rst resources/template.odt - - %.odt: %.rst resources/template.odt - rst2odt --create-links --strip-comments --stylesheet=resources/template.odt --add-syntax-highlight $< $@ - cp $@ resources/templates.odt - -Ainsi, il suffira de lancer la commande `make document.odt` pour générer la -sortie à partir du fichier `document.rst` (`document` est bien sûr à adapter en -fonction du nom du fichier sur lequel vous travaillez). - -J'ai créé une archive_ qu'il vous suffit de décompresser pour pouvoir -commencer à travailler ; elle comprend le fichier `makeFile` présenté ci-dessus, -ainsi qu'un template contenant des éléments de base. - -.. _archive: |filename|/resources/rstodt/rst.zip - -Utiliser les templates ----------------------- - -L'avantage d'utiliser un format balisé est que vous n'avez pas vous soucier du -formattage. Le document généré est prêt à être mis en page, vous n'avez plus -qu'à travailler sur le modèle. - -La commande `make` a mis à jour le fichier modèle à partir de votre document de -travail. Vous pouvez donc maintenant modifier les styles à travers libreoffice, -ils seront automatiquement intégrés dans vos prochaines étapes de génération. - -rst2odt applique ses propres styles au document, ceux-ci héritant des styles -par défaut d'OpenOffice, vous pouvez donc utiliser vos template habituels pour -la mise en forme de votre document. La liste est présentée sur la -documentation_ de l'application. - -En séparant le contenu de l'application, on peut ainsi facilement réutiliser un -style d'un document à un autre, on se décharge de la mise en page pendant tout -le temps de la rédaction. - -.. _documentation: http://docutils.sourceforge.net/docs/user/odt.html - -Aller plus loin ---------------- - -Le langage reStructuredText utilise des directives_ pour mettre en forme le -texte. Toutes les applications ne les gèrent pas correctement, et certains -outils ont décidé de rajouter leurs propres directives ; bref c'est un peu le -bordel. - -La plupart des directives sont correctement prises en compte : - -* les tableaux -* les images -* les notes de bas de page (À l'exception près qu'il est impossible de référencer une note de bas de page dans une autre note.) -* la table des matières -* les rôles - -Cela devrait répondre à 90 % des usages courants. J'ai déjà présenté un -correctif pour `ajouter la coloration syntaxique`_ dans notre document, et -ainsi utiliser les mêmes directives que rst2pdf_ pour insérer du -code, voici la liste de quelques directives propres à rst2odt : - -:meta_: Permet de renseigner les méta-données dans le document. - -Et d'autres qui sont plus ou moins bien suportées : - -:container_: Permet d'appliquer un style particulier sur un bloc de texte. - -:raw_: Pour insérer du code xml au format openDocument. - - -Au final --------- - -C'est bien pratique de pouvoir écrire son document dans un bloc note, sur une -machine plutôt poussive, et malgré ça bénéficier de la force de mise en page de -LibreOffice. On s'affranchit de la plate-forme sur laquelle on travaille (on -peut éditer son fichier sous gedit sur linux, puis sur le bloc-note de -windows, et le reprendre dans un terminal via vim), et lancer la transformation -une fois le texte écrit - -Vient alors la phase de mise en page, mais on est alors aidé par l'outil de -traitement de texte pour ça, et surtout, par le fait que le document généré -inclu des styles sur sa totalité, c'est donc tout de suite beaucoup plus -facile, et se fait très rapidement. - -Pour ma part, c'est une solution que j'utilise et recommande, et qui au final -donne de meilleurs résultats que rst2pdf. - - -.. _directives: http://docutils.sourceforge.net/docs/ref/rst/directives.html - -.. _meta: http://docutils.sourceforge.net/docs/user/odt.html#the-meta-directive -.. _table : http://docutils.sourceforge.net/docs/user/odt.html#the-table-directive -.. _container: http://docutils.sourceforge.net/docs/user/odt.html#the-container-directive -.. _raw: http://docutils.sourceforge.net/docs/user/odt.html#the-raw-directive - -.. _ajouter la coloration syntaxique: |filename|rstodt.rst - -.. _AJ Cann: http://www.flickr.com/photos/ajc1/3531532114/in/photostream/ diff --git a/content/Informatique/insecable.rst b/content/Informatique/insecable.rst deleted file mode 100644 index dd7734c..0000000 --- a/content/Informatique/insecable.rst +++ /dev/null @@ -1,139 +0,0 @@ -.. -*- rst -*- -.. -*- coding: utf-8 -*- - -L'espace fine insécable en HTML -=============================== - -:date: 2013-04-26 -:tags: Hébergement, Python, reStructuredText - -La typographie est bien souvent malmenée dès que l'on utilise le web comme -support. Pourtant, `les règles sont simples`_, et il est facile de les -appliquer quand on publie un document, à partir du moment ou cela ne se fait -pas à la main. Pour ma part, j'utilise le plugin typogriphy_ pour faire le -rendu des articles de ce blog. Ce plugin permet de convertir le texte écrit -dans un éditeur de texte brut en un texte destiné à être affiché dans une page -html : - -* Substitution des quotes et doubles quotes par des apostrophes et - guillemets -* Écriture en capitales des mots composés de majuscules -* Ajout d'espaces insécables pour éviter qu'un mot se retrouve seul sur une - ligne en fin de paragraphe. - -Un exemple de rendu est disponible sur le `site du projet`_. - -.. _les règles sont simples: http://edu.ca.edu/typo/ -.. _typogriphy: https://github.com/mintchaos/typogrify -.. _site du projet: http://static.mintchaos.com/projects/typogrify/ - -Ainsi, je n'ai pas à me soucier de la mise en page lors de la rédaction des -articles, la transformation se fait sur le texte html généré, cela permet de se -concentrer sur le contenu et non la mise en forme. - -On peut croire que ça n'est que du gadget et est complètement inutile, mais le -but de la typographie n'est pas de faire joli (même si l'esthétique à sa place, -bien sûr), le but est avant tout la lisibilité. - -Le problème ------------ - -Par contre, le plugin ne gère pas la langue française, dans le sens où il -n'insère pas d'`espace fine insécable`_ quand c'est nécessaire : - -* après les signe de ponctuation double (« |nbsp| ; |nbsp| : |nbsp| ? |nbsp| ! - |nbsp| ») -* entre les guillemets et le texte qu'ils contiennent -* séparateur de chiffre lors des numéros de téléphones… - -Quitte à disposer d'un plugin qui s'occupe de la mise en page, autant -l'utiliser jusq'au bout ; il est possible de modifier le plugin pour insérer ce -caractère quand il faut, mais beaucoup de polices n'intègrent pas ce caractère -dans leur table, utiliser le caractère unicode NNBSP_ peut donc causer des -problèmes si le navigateur ne gère pas le cas d'erreur. Ce défaut à d'ailleurs -poussé OpenOffice_ à ne pas l'utiliser dans les textes. - -Vous pouvez malgré tout utiliser le caractère NNBSP si vous êtes sûrs que la -police contient ce caractère dans sa table. Si ça n'est pas le cas, vous -risquez d'avoir des problèmes d'affichage. À noter que les versions d'IE8 et -les précedentes, qui ne gèrent pas correctement ce caractère, `sont encore -utilisées`_ par 6 % des utiliseurs, encore quelque temps et le problème ne -devrait plus se poser. - -.. _espace fine insécable: http://fr.wikipedia.org/wiki/Espace_fine_ins%C3%A9cable -.. _NNBSP: http://www.fileformat.info/info/unicode/char/202f/index.htm -.. _OpenOffice: http://wiki.openoffice.org/wiki/Non_Breaking_Spaces_Before_Punctuation_In_French_%28espaces_ins%C3%A9cables%29#Exclusion_of_the_NARROW_NO-BREAK_SPACE_.28U.2B202F.29 -.. _sont encore utilisées: http://www.w3schools.com/browsers/browsers_explorer.asp - -Les solutions -------------- - -S'il n'est pas possible d'utiliser un caractère unicode pour notre rendu, on -peut l'accompagner d'indication de mise en page pour obtenir ce que l'on -souhaite. Il y a même plusieurs solutions qui peuvent s'appliquer, elles sont -présentées sur stackoverflow_ — les problèmes sont généralement communs à -plusieurs personnes… - -.. _stackoverflow: http://stackoverflow.com/questions/595365/how-to-render-narrow-non-breaking-spaces-in-html-for-windows - -Espace insécable -~~~~~~~~~~~~~~~~ - -Cette espace là est reconnue et est utilisée partout ! Toutefois, si l'on a -pris l'habitude de lire du texte respectant la typographie française, on risque -d'être surpris par le texte généré (c'est pourtant la solution qui a été -retenue par OpenOffice), les signes de ponctuation donneront l'impression -d'être décolés du texte qu'ils accompagent. - -Il est possible de l'utiliser, mais en utilisant un attribut html pour en -réduire la taille. C'est possible avec l'attribut FONT-SIZE. Par contre, on -mélange le contenu et l'apparence : ne pas séparer le texte de la ponctuation -fait partie de la mise en page, pas du sens donné au texte. - -Espace fine -~~~~~~~~~~~ - -C'est l'autre solution : cette espace à la même largeur qu'une espace fine -insécable, mais risque de séparer le caractère du signe de ponctuation qui -l'accompage, pouvant laisser le texte sur une fin de ligne et le signe de -ponctuation en début de la ligne suivante… Par contre, on peut spécifier dans -les attributs que celle-ci ne doit pas être coupés. C'est faisable avec -l'attribut HTML NOWRAP_. Cela est pris en charge par la majorité des -navigateurs et permet d'obtenir le rendu voulu. Si l'on fait un copier-coller -du texte html dans un logiciel de traitement de texte, l'espacement sera -correctement préservé. - -.. _NOWRAP: http://www.w3schools.com/tags/att_td_nowrap.asp - -Le correctif ------------- - -J'ai retenu la seconde solution, et ai créé une branche github_ pour cette -version, que j'utilise actuellement pour le blog. - -Tout d'abord, le texte n'est substitué qu'à l'intérieur d'une balise HTML, les -attributs ne sont pas pris en compte, ça évite de casser l'affichage en allant -trop loin dans le traitement. - -Ensuite, étant donné qu'il s'agit de règle de typographie propre à la langue -française, cette substitution ne s'applique que dans le cas où la locale est -fixée à `fr_FR`, ce qui laisse le champ libre pour d'autres implémentations. - -Le remplacement (aucune espace n'est ajoutée, on ne fait que des substitutions) -se fait dans les conditions suivantes : - -* avant les signes de ponctuation double, -* entre les guillemets et le texte qu'ils contiennent, -* entre un chiffre et le symbole de pourcentage, -* entre deux chiffres. - -.. _github: https://github.com/Chimrod/typogrify - -Et voilà : on dispose ainsi d'un code html qui est déjà beaucoup plus soigné ! -On n'arrive pas à la cheville d'un pdf généré avec latex — il ne s'agit que -d'un blog — mais ça permet d'avoir déjà amélioré la présentation de son texte, -et de s'être un peu penché sur les problèmes de typographie… - -.. |nbsp| unicode:: 0xA0 - :trim: - diff --git a/content/Informatique/invisible.rst b/content/Informatique/invisible.rst deleted file mode 100644 index dcee14b..0000000 --- a/content/Informatique/invisible.rst +++ /dev/null @@ -1,103 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -Les utilisateurs invisibles de Linux -#################################### - -:date: 2010-02-17 -:tags: Libre, Humeur -:summary: |summary| - -Bonjour à tous, pour mon premier article sur le planet-libre, je voudrais faire -part d'une réflexion qui m'interpelle depuis un moment concernant l'univers -Linux : le fait que les utilisateurs non administrateurs soient exclus de toute -la documentation/prise en main que l'on peut trouver sur le système. Je ne -donne ici que quelques aspects de cette réflexion mais je pense qu'elle touche -l'ensemble des participants au monde du libre. - -.. |summary| replace:: - La plupart des articles que l'on peut voir sur le net qui concernent - l'utilisation du PC sous Linux restent limités à un point : souvent ils - oublient le fait que plusieurs utilisateurs puissent être enregistrés sur - le PC, et que tous ne soient pas forcément des administrateurs ( ceux qui - peuvent avoir des droits root sur la machine). Pourquoi donc ? Est-ce que - cela signifie que la plupart des linuxiens sont les seuls à utiliser le PC ? - C'est possible, mais là n'est pas mon sujet. Je pense que le problème est - que les utilisateurs sont pour l'instant invisible de la littérature sur - Linux que l'on peut trouver sur le net. À la fois invisible du côté des - distributions, et invisible du côté des communautés. - -|summary| - -Le problème se retrouve présent dans deux aspects : d'une part dans la -documentation s'adressant aux administrateurs, et d'autre part dans la -documentaiton s'adressant aux utilisateurs. - -Si l'on suit les manipulations que l'on peut trouver un peu partout sur le net, -on trouve souvent des modifications qui ont pour conséquences de modifier la -configuration générale du système, et l'on trouve plus souvent des -modifications dans /etc/ que dans ~/.config/ - -Suivre les besoins des utilisateurs -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Tous les utilisateurs n'utilisent pas forcément l'ordinateur de la même manière -et il faut prévoir quels sont leurs besoins avant de se lancer dans une -opération générale. Par exemple, il n'y a pas longtemps était paru sur le -planet-libre un article sur privoxy qui se terminait par une manière élégante -d'utiliser privoxy sans configuration supplémentaire\ [1]_. Or privoxy est lent -pour traiter les sites puisant des ressources un peu partout — par exemple -google news ou planet-libre (!) et se transformer en inconfort pour -l'utilisateur. - -Les mises à jour -~~~~~~~~~~~~~~~~ - -Faire une mise à jour est toujours quelque chose de périlleux, et l'on ne sait -pas forcément comment le système va réagir; entre le logiciel qui ne fonctionne -plus car sa configuration a changé ou celui qui ne fonctionne plus car un bug a -été introduit dans la nouvelle version, les risques sont possibles (je n'ai par -exemple pu plus lire de dvd lors de la mise à jour du noyau 2.6.30\ [2]_…) - -Je ne veux pas relancer le débat sur le packaging des distributions ( rolling -release contre version fixes) mais le problème doit être posé : comment être -sûr en faisant une mise à jour que l'on ne va pas casser tel composant ? - -En plus des modifications générales sur la configuration que peuvent introduire -les modifications, on peut se retrouver dans la situation inverse : -l'utilisateur n'a pas le droit de visualiser les fichiers de logs, d'installer -un paquet ou de modifier un fichier de configuration et ne pourra donc pas -suivre la documentation qu'il peut trouver ici et là sur le net. - -Pouvoir utiliser ses propres applications ? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Les distributions n'ont pour l'instant pas de solutions pour gérer -l'installation de paquets par un utilisateur normal (qui irait s'installer dans -/opt/ par exemple), pouvant être installés sans droit root, et ne pouvant être -exécutés que par l'utilisateur ayant fait son installation. - -Utiliser des commandes non root -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -En fait, ce système que l'on nous décrit ouvert ne l'est réellement que si l'on -est admin dessus. Pour les autres, la manipulation se limite à bash, python… -Dans la documentation, on trouve même des exemples demandant à l'utilisateur -d'être root alors qu'une commande équivalente peut être lancée par un -utilisateur normal (par exemple $netstat -ie au lieu de #ifconfig) - -Ce problème de l'utilisateur non root est pour l'instant contourné (par exemple -en configurant sudo dès l'installation), mais il reste posé, et n'est jamais -attaqué de front. - -Le fait que cette situation ne soit jamais évoquée est pour moi significative -de l'utilisation faite de linux aujourd'hui : bien loin du grand public. Nous -sommes tous ici des utilisateurs bidouilleurs, et ne voyons pas forcément une -utilisation quotidienne d'un utilisateur standard. Je ne veux pas en faire une -généralisation sur l'avenir de Linux et une remise en cause nécessaire. Je pose -juste ici un constat sur une situation qui est pour moi, encore trop souvent -invisible. - - -.. [1] `Artisan Numérique » Se prémunir des "SpyWebs" avec Privoxy `_ -.. [2] `http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=557340 `_ diff --git a/content/Informatique/navit.rst b/content/Informatique/navit.rst deleted file mode 100644 index 7175524..0000000 --- a/content/Informatique/navit.rst +++ /dev/null @@ -1,224 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -Un gps libre avec Navit -####################### - -:date: 2012-03-26 -:tags: Libre, DIY -:summary: |summary1| |summary2| -:logo: static/images/navit.png - -.. default-role:: literal - -Depuis un peu plus d'un an maintenant, j'ai choisi d'utiliser Navit comme -logiciel de navigation. Dans ce billet, je propose de faire un petit retour -d'expérience sur ce logiciel et la manière de l'utiliser pour calculer les -trajets à l'aide d'un GPS. - -Présentation -============ - -|summary1| - -.. |summary1| replace:: - Navit est un logiciel de navigation, ce que l'on appelle souvent un - « GPS ». Le logiciel fonctionne en mode déconnecté, c'est-à-dire qu'il a - besoin de lire les cartes en local, mais ne nécessite aucune connexion - réseau lors de la navigation. C'est un avantage qui lui permet de - fonctionner sur des netbook sans clef 3G. - -|summary2| - -.. |summary2| replace:: - Et c'est là tout l'avantage par rapport à une solution de navigation - intégrée : il permet de transformer n'importe quel netbook (voire - smartphone) en une solution de navigation GPS gratuitement ! Par rapport - aux GPS que l'on rencontre souvent en voiture, le coût est ridicule ! - -Fonctionnement -============== - -À partir d'une connexion GPS intégrée (comme sur les smartphones) ou externe -(par USB), Navit va mettre à jour en temps réel l'affichage de la carte et le -calcul du trajet. La connexion gps est réalisée avec gpsd, capable de -réceptionner les données depuis la plupart des récepteurs gps. Je n'ai eu aucun -problème pour réaliser la connexion entre navit et gpsd, la carte commençant à -se déplacer toute seule une fois les leds du GPS indiquant qu'il s'était -synchronisé. - -Navit n'intègre aucune carte : par contre l'application a la possibilité -d'utiliser les cartes dans les formats suivants : - -* garmin (pas testé) -* reiserplan -* openstreetmap_ (voir plus bas) - -Une caractéristique de navit est de ne pas présenter d'interface par défaut : -tout passe par des modules que l'on vient rajouter dans l'interface et qui -s'afficheront par-dessus la carte. Par exemple : - -* Le nom de la rue sur laquelle on se trouve -* L'heure d'arrivée -* La vitesse -* La distance avant le prochain changement de route -* Une alerte quand on dépasse la vitesse autorisée -* etc. - -Des configurations déjà prêtes sont disponibles sur le wiki et peuvent être -téléchargées. Cela permet d'adapter l'affichage en fonction du support sur -lequel l'application est lancée : sur un smartphone on privilégiera un -affichage en vertical avec moins de modules par rapport à un ordinateur. - -Configuration -============= - -Navit se base sur gpsd pour récupérer les données en provenance du récepteur. -Je ne rentre pas ici dans l'installation et la configuration de gpsd, et vous -renvoie vers la documentation de votre distribution pour le configurer. - -.. Note:: - - Il n'est pas nécessaire de disposer d'un récepteur GPS pour utiliser Navit. - C'est alors à l'utilisateur de déplacer la carte pour suivre son trajet, - mais en dehors de ce point, l'application se comportera de la même manière. - -Nous allons ensuite télécharger notre première carte, en passant par le `Navit -planet extractor`_, qui propose de télécharger son jeu de carte sur internet : - - -.. Note:: - - Notez l'url, nous allons la réutiliser plus tard ! - -La configuration de navit est disponible dans le répertoire /etc/navit/ . -Seulement, pour plus de commodité, nous allons la copier dans notre répertoire -utilisateur : - -.. code-block:: console - - $ cp -r /etc/navit/ ~/.navit/ - -Nous allons maintenant éditer le fichier XML est ajouté la carte dans la liste -des cartes disponibles : - -.. code-block:: xml - - - - - -Si l'on souhaite intégrer plusieurs cartes, il faut insérer plusieurs fois ce -nœud XML. - -Relançons maintenant navit, la carte devrait s'afficher ! (Il se peut que vous -ne voyiez rien car Navit n'est pas forcément positionné chez vous : on va donc -chercher dans les villes une proche de chez nous et choisir de l'afficher sur -la carte.) - -.. image:: |filename|../images/Capture-Navit-e1332787251467.png - :width: 400 - :class: center - -On peut déjà commencer à calculer les trajets et essayer différents habillages. -Sur le wiki vous pouvez télécharger des thèmes déjà préparés qu'il suffit -d'installer. - -Limitations -=========== - -Même si le logiciel est utilisable au quotidien, il n'est pas parfait. (Il -s'est cependant grandement amélioré dans ses dernières versions, je recommande -d'utiliser la version 0.5 qui corrige de nombreux soucis dans l'interface et la -consommation mémoire.) - -* Une fâcheuse tendance de navit et de ne pas prendre en compte les limites - géographiques des villes. En conséquence, la sélection de la destination - à partir de la ville et des noms de rues n'est pas fiable : certaines - rues n'apparaissent pas alors qu'elles sont enregistrées sur la carte, ou - (plus grave), peut se tromper de ville. Il m'est déjà arrivé de me rendre - à destination, dans la bonne rue, mais pas dans la bonne ville ! - - J'ai maintenant pris l'habitude de n'entrer les destinations qu'à partir - de la carte, et non pas à partir de l'index des rues. - -* Par rapport aux solutions commerciales, capables d'afficher l'état du - trafic, Navit est vraiment en retard. On peut résumer en disant qu'il - s'agit davantage d'une carte interactive qu'une solution de guidage, il - reste nécessaire de prévoir son trajet avant de partir. - -* Un autre regret est de ne pas pouvoir sélectionner des « points de - passage », pour affiner le trajet. La seule solution est de choisir - préparer à l'avance dan les favoris les destinations et les faire évoluer - au fur du trajet. - -* Enfin, contrairement aux gps embarqués, on est dépendant de la qualité du - support : si l'on dispose d'un portable avec écran brillant, on sera - forcément gêné lors du suivi de la navigation. - -.. image:: |filename|../images/Capture-Navit-1-e1332786990864.png - :width: 400 - :class: center - - -OpenstreetMap -============= - -Impossible de parler de navit sans aborder openstreetmap ! Pour faire une -analogie, openstreetmap est à la cartographie ce que wikipédia est à -l'encyclopédie : une plateforme donnant à chacun le moyen la possibilité de -contribuer. - -La navigation GPS est pour moi l'utilisation la plus pratique de ce service : -d'une part parce que les cartes sont libres, et d'autre part parce que cela -donne envie de contribuer à son tour : en rajoutant les feux aux carrefours, -les parkings, en fonction des différents trajets que l'on réalise; on voit à -l'utilisation les défauts sur les cartes, et une fois de retour chez soi, on -corrige la carte en fonction. - -OpenstreetMap change très vite, et les cartes sont mises à jour en continu. -C'est pourquoi je vous propose d'automatiser le téléchargement de vos cartes. -Rien de mieux pour ça qu'une tâche dans un cron ! - -Vous vous souvenez de l'url que je vous avais demandé de noter dans un coin -tout à l'heure ? C'est maintenant qu'elle va être réutilisée. - -.. code-block:: bash - - $ crontab -e - -Dans l'éditeur de texte qui s'ouvre, on va entrer notre tâche planifiée : - -.. code-block:: bash - - 25 3 * * 1 wget -O ~/sync/.navit/carte.bin ${url} > /dev/null 2>&1 - -Ainsi, la carte se mettra à jour automatiquement ! - -J'ai dit tout à l'heure qu'openstreetmap permettait à tout un chacun de -modifier les cartes, cela signifie que, comme wikipédia, la qualité des cartes -est inégale selon les endroits que vous visitez : il n'y a probablement pas de -problème dans une grande ville, mais cela risque d'être plus compliqué pour -retrouver le nom d'une rue dans un hameau ou un petit village. Dans ce cas, -n'hésitez pas à mettre à jour la carte ! (Ça n'est pas l'objet de l'article -ici, mais il existe de nombreux tutoriels pour vous expliquer comment faire.) - -Conclusion -========== - -J'ai parlé du coût de la solution au début de l'article : il s'agit du coût du -récepteur GPS. On peut en trouver par 30€ sur ebay, ce qui est investissement -suffisant pour se lancer (si l'on compare aux gps tactiles qui sont vendus en -supermarché). - -Pour ma part, j'utilise un récepteur `ND100` de globalsat_. - -Au final on dispose donc d'une aide à la navigation qui s'avère très pratique, -et assez amusante ! On a l'avantage de disposer de cartes gratuites et mises à -jour en permanence (même si la qualité laisse parfois à désirer), mais aussi de -ne pas dépendre d'un système fermé (il est possible de modifier les cartes à -l'aide de l'éditeur d'OpenstreetMap quand on rencontre des erreurs). - -.. _`Navit planet extractor`: http://maps3.navit-project.org/ -.. _openstreetmap: http://www.openstreetmap.org/ -.. _globalsat: http://www.ebay.com/sch/?_nkw=globalsat%20nd%20100&clk_rvr_id=327330038890 diff --git a/content/Informatique/ocaml_gtk.rst b/content/Informatique/ocaml_gtk.rst deleted file mode 100644 index b124cb5..0000000 --- a/content/Informatique/ocaml_gtk.rst +++ /dev/null @@ -1,206 +0,0 @@ -.. -*- rst -*- -.. -*- coding: utf-8 -*- - -======================================= -Trois manière d'utiliser Gtk avec OCaml -======================================= - -:date: 2014-02-09 -:tags: ocaml, gtk -:summary: |summary| -:logo: static/images/ocaml/camel_75.jpg - -.. default-role:: literal - -.. figure:: |filename|/images/ocaml/camel_2.jpg - :figwidth: 150 - :figclass: floatleft - :alt: Pavement - - Image : `Kevin Botto`_ (creativecommons_) - -.. _Kevin Botto: http://www.flickr.com/photos/kevinbotto/3251157974/ -.. _creativecommons: http://creativecommons.org/licenses/by-nd/2.0/deed.fr - -|summary| - - -.. |summary| replace:: - Créer des interfaces Gtk pour OCaml peut se réveler compliquer. On trouve - beaucoup d'explications un peu confuses sur le net, et n'est pas facile de - trouver comment faire. - Je vous propose ici trois manières différentes en utilisants les différents - outils disponibles. - -Il est possible d'utiliser la bibliothèque Gtk à l'aide de la librairie -lablgtk_, qui fourni un binding pour l'ensemble de la bibliothèque. L'avantage -est de pouvoir fonctionner sur toutes les plateformes où gtk est disponible, et -de bénéficier d'une interface évoluée et agréable pour écrire son application. - -L'inconvénient réside dans la bibliothèque gtk : api très compliquée, -documentation confuse, bref on se retrouve rapidement face à des problèmes là -où l'on pensait pouvoir avancer sans difficulté. De plus, on est aujourd'hui -passé à gtk3 alors que `lablgtk` utilise toujours l'api de gtk2. Cela ne pose pas -de problème dans la compilation (la compatibilité est assurée), mais peut poser -problème lors de l'utilisation d'outils tels que `glade` (voir plus loin). - -.. _lablgtk: http://lablgtk.forge.ocamlcore.org/ - -Tout construire à la main -========================= - -C'est la première solution, qui demande de connaître Gtk : tous les objets sont -construits à la main, et le code décrit la manière de faire. L'avantage est que -le code ne dépend d'aucune ressource externes contrairement aux deux suivantes. -De plus on contrôle complètement la création de l'interface, on peut donc -choisir de paramétrer l'interface au lieu d'avoir une interface unique. Un -tutoriel complet est disponible sur le site d'`OCaml.org`_, je ne vais pas -le reprendre ici et vous encourage à le suivre. - -.. _ocaml.org: http://ocaml.org/learn/tutorials/introduction_to_gtk.html - -L'exemple est donné dans la console interactive. Si l'on souhaite le compiler -dans un module, il faut initialiser Gtk avant de lancer l'affichage : - -.. code-block:: ocaml - - GtkMain.Main.init (); - -Pour compiler un module, il est nécessaire de faire référence au package -`lablgtk2`. Voici un exemple pour compiler un fichier `hello.ml` : - -.. code-block:: console - - $ ocamlfind ocamlc -package lablgtk2 -I . -c hello.ml - -Maintenant il ne reste plus qu'à se plonger dans la documentation de gtk pour -construire son interface ! - -Utiliser Glade -============== - -Glade est une interface graphique permettant de construire son application en -plaçant les contrôles de manière visuelle. Elle génère un fichier XML qui -décrit l'interface et sera chargé par l'application pour construire -l'interface. Cela permet de gagner du temps et d'éviter d'écrire le code -nécessaire pour construire son interface, on se concentre sur les actions -à exécuter lorsque l'utilisateur interagit. - -.. image:: |filename|/images/glade.jpg - :class: center - :alt: Utilisation de glade. - - -Les XMLs générés par glade sont destinés à être utilisés avec gtk3. Or, -`lablgtk` utilise encore gtk2, il est donc nécessaire d'utiliser une conversion -pour pouvoir les charger par la suite. Voici une petite règle `make` qui se -charge de faire le travail : - -.. code-block:: make - - %.glade2: %.glade - cat $< | sed 's/interface/glade-interface/' | sed 's/object/widget/' | sed 's/GtkBox/GtkVBox/' > $@ - -Maintenant qu'on dispose d'un fichier au format glade2, on peut le charger dans -OCaml. - -Attention, lors de la compilation, il est nécessaire d'utiliser `libglade` pour -construire l'application, celle-ci est disponible dans la librairie -`lablgtk2.glade`. Voici donc un exemple de commande pour compiler un fichier -`hello.ml` : - -.. code-block:: console - - $ ocamlfind ocamlc -package lablgtk2.glade -I . -c hello.ml - -.. _gtkbuilder: https://developer.gnome.org/gtk3/3.4/GtkBuilder.html - -Charger le fichier xml ----------------------- - -Il s'agit de la solution la plus dynamique : on référence le fichier xml dans -le code, et l'interface se construit toute seule. Cette solution est présentée -sur le site de `developpez.com`_. L'exemple donné est toujours valide, il ne -faut pas oublier d'initialiser Gtk avec la commande suivante avant de lancer la -construction de l'interface : - -.. code-block:: ocaml - - GtkMain.Main.init (); - -L'inconvénient de cette méthode (du moins pour un développeur OCaml) est que -l'on est obligé de convertir de manière dynamique tous les objets présents dans -le XML. Il n'est pas possible de savoir au moment de la compilation si le code -que l'on va exécuter est bien valide. - -En effet, les objets chargés depuis le XML nous sont retournés sous la forme -widget gtk, qu'il faut convertir en Bouton, Menu via les méthodes appropriées -(`GtkWindow.Window.cast` par exemple). On n'est donc pas à l'abri d'avoir une -erreur lors du fonctionnement du programme, alors que celui-ci a pu compiler -sans problème. Je pense que lorsqu'on cherche à développer en OCaml, ce genre -de problème peut être rédhibitoire. - -.. _developpez.com: http://blog.developpez.com/damien-guichard/p7748/programmation-fonctionnelle/hello_developpez_avec_libglade_xml_1 - -De plus, rien ne garantie que le fichier XML ne va pas évoluer de manière -incompatible du code ; les deux étant distincts. - - -Utiliser lablgladecc2 ---------------------- - -Heureusement, la librairie `lablgtk2` nous fourni un petit utilitaire nommé -`lablgladecc2` qui va convertir un fichier xml glade2 en un fichier OCaml. On -dispose donc d'un chargement dynamique du fichier xml, mais en gardant un code -cohérent, qui détectera les erreurs dès la compilation. Il s'agit en quelque -sorte d'un moyen de combiner les deux solutions précédentes. - -On va ajouter une règle au makefile pour générer notre fichier OCaml : - -.. code-block:: make - - %.ml: %.glade2 - lablgladecc2 -embed $< > $@ - -Le fichier généré se compose d'une classe reprenant les différents composants -de notre interface, il ne nous reste plus qu'à réaliser les connexions, ainsi, -à partir d'un fichier glade nommé *gui* composé d'une fenêtre `window1`, d'un -bouton `button` et d'une entrée de menu, on peut créer le code suivant : - -.. code-block:: ocaml - - let gladecc () = - let window = new Gui.window1 () in - - window#button#connect#clicked (fun () -> prerr_endline "Ouch!"); - window#window1#connect#destroy GMain.quit; - window#imagemenuitem5#connect#activate GMain.quit; - - window#toplevel#show () - - let () = - GtkMain.Main.init (); - gladecc (); - GMain.Main.main () - - -l'objet `toplevel` est créé par `lablgladecc2` et correspond à la fenêtre -principale de notre objet. - -Dans cette chaîne de compilation, le fichier xml est écrit dans le programme -OCaml (il s'agit de la signification de l'option `-embed`), ainsi, le fichier -XML n'a pas besoin de figurer parmi les ressources de l'application. - -Conclusion -========== - -Trois manière de faire qui répondent à trois besoin différents, entre le tout -codé et le tout dynamique, il est possible de créer des interfaces graphiques -en utilisant les capacités du langage caml sur l'inférence de type et le -contrôle de l'ensemble de l'application. - -Pour ma part, je préfère la dernière solution, qui permet de conserver la -simplicité de `glade` combiné avec la force du langage OCaml. J'ai écrit cet -article suite à pas mal d'errance sur le net pour trouver les informations -nécessaires, j'espère que la documentation va évoluer par la suite et permettre -de faire ce genre de choses plus facilement… diff --git a/content/Informatique/ocaml_ppx.rst b/content/Informatique/ocaml_ppx.rst deleted file mode 100644 index 84e8a5d..0000000 --- a/content/Informatique/ocaml_ppx.rst +++ /dev/null @@ -1,97 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -=========== -ocamlc -ppx -=========== - -:date: 2013-09-13 -:tags: ocaml, Programmation -:summary: |summary| -:logo: static/images/ocaml/recursion_75.jpg - -.. figure:: |filename|/images/ocaml/recursion.jpg - :figwidth: 180 - :figclass: floatright - :alt: Recursivité - - Image : `Gadl`_ (creativecommons_) - -.. _Gadl: http://www.flickr.com/photos/gadl/279433682/ -.. _creativecommons: http://creativecommons.org/licenses/by-sa/2.0/deed.fr - -|summary| - -.. |summary| replace:: - Les langages homoïconiques ont quelque chose de fascinant : pouvoir - représenter le programme sous la forme d'une donnée capable d'être traitée - par le programme nous entraîne dans un jeu de mirroirs qui se réfléchissent - eux-même, et me donne un peu le vertige… La nouvelle version d'OCaml - présente une option de préprocessing qui s'en rapproche. - -Selon `wikipédia`_ un langage homoïconique à la particularité de pouvoir être -représenté comme une donnée du programme. Cela permet de transformer le langage -(lui donner de nouvelles fonctionalités) en utilisant un autre programme fait -dans le même langage. Un programme lisp peut ainsi se modifier durant son -exécution, de la même manière, un fichier xsl peut s'appliquer sur un autre -fichier xsl (puisque xslt_ est décrit sous la forme de fichiers xml)… - -.. _wikipédia: https://fr.wikipedia.org/wiki/Homoiconicit%C3%A9 -.. _xslt: https://fr.wikipedia.org/wiki/Extended_stylesheet_language_transformations - -OCaml 4.01 est sorti ! -====================== - -OCaml vient de sortir en version 4.01, et présente dans ses nouveautés, une -nouvelle option qui s'active à la compilation : - - - :-ppx command: After parsing, pipe the abstract syntax tree through the - preprocessor command. The format of the input and ouput - of the preprocessor are not yet documented. - -Qu'est-ce que cela signifie ? Qu'après avoir interprété le programme source et -construit l'arbre syntaxique du langage, le compilateur appelle un autre -programme en lui transmettant cette représentation en paramètre. À cette étape, -le compilateur a juste vérifié que la syntaxe était `valide`, mais il n'a pas -encore vérifié le programme. - -Le programme appellé peut alors modifier la représentation du code source, et -**doit** donner en retour un programme OCaml valide (si l'on veut que le code -compile…). Cela permet d'étendre la syntaxe du langage en se basant sur des -éléments de syntaxe valides pour mettre en place un `langage dédié`_ (par -exemple). Est-ce que cela fait d'OCaml un langage homoïconique ? Non, car cela -n'est prévu pour être le cœur d'OCaml, mais cela lui donne un aspect -homoïconique et de nouvelles perspectives dans l'évolution du langage. - -Le principal avantage vient du fait que le langage OCaml est TRÈS fortement -typé, et refusera de compiler si une erreur s'est glissée dans la cohérence du -programme. On peut donc modifier le programme sans crainte de provoquer une -erreur dans la structure de celui-ci. - -.. _langage dédié: https://fr.wikipedia.org/wiki/Domain-specific_programming_language - -Des exemples -============ - -OMonad_ est une extension qui donne ainsi à OCaml la possibilité de traiter les -monades selon la syntaxe issue d'Haskell. - -.. _OMonad: http://danmey.org/omonad.html - -`ppx tools`_ est une librairie qui permet de construire sa propre extension, -écrite par Alain Frish, l'auteur à qui l'on doit cette nouvelle option. Il -décrit son besoin et son usage sur son blog_. - -.. _ppx tools: https://github.com/alainfrisch/ppx_tools -.. _blog: http://www.lexifi.com/blog/syntax-extensions-without-camlp4-lets-do-it - -Certe, il était déjà possible de faire des choses `très amusantes`_ avant ça, -mais cela restait encore expérimental. Maintenant, cela devient beaucoup plus -accessible. Je ne connais pas beaucoup de langages qui poussent aussi loin la -possibilité de modifier le compilateur pour l'adapter à ses besoins, et rien -que pour ça, je trouve ça fun ! |:-)| - -.. _très amusantes: https://bitbucket.org/camlspotter/compiler-libs-hack - -.. |:-)| image:: |filename|/images/icons/face-smile.png diff --git a/content/Informatique/ocamlfind_en.rst b/content/Informatique/ocamlfind_en.rst deleted file mode 100644 index 292b19f..0000000 --- a/content/Informatique/ocamlfind_en.rst +++ /dev/null @@ -1,63 +0,0 @@ -.. -*- rst -*- -.. -*- coding: utf-8 -*- - -============================ -A local repository for ocaml -============================ - -:date: 2013-05-23 -:tags: ocaml -:summary: |summary| -:logo: static/images/ocaml/camel.jpg -:slug: un-depot-local-pour-ocaml -:lang: en - -.. figure:: |filename|/images/ocaml/camel_medium.jpg - :figwidth: 150 - :figclass: floatleft - :alt: Pavement - - Image : `@Doug88888`_ (creativecommons_) - -.. _@Doug88888: http://www.flickr.com/photos/doug88888/3458057235/ -.. _creativecommons: http://creativecommons.org/licenses/by-nc-sa/2.0/deed.fr - -|summary| - - -.. |summary| replace:: - Today, ocaml is obsolete in the debian packages : the most of the - librairies are still linked with Ocaml3 althought Ocaml4 is out since - almost a year. When we need to develop with Ocaml4, we have to recompile - all the dependencies, but this implies to install them for the whole - system. But we can use a local repository with some findlib configuration. - -Findlib is now a required tool for an Ocaml project compilation. Each -application uses now findlib for searching the dependencies, and the linking -phase. - -We first need to create a local configuration in wich we write where to find -the packages : - - -.. code-block:: bash - - destdir="/home/chimrod/ocaml/packages/" - path="/home/chimrod/ocaml/packages/:/usr/local/lib/ocaml/4.00.1:/usr/lib/ocaml:/usr/lib/ocaml/METAS" - -:destdir: is the path where we want to install the newly compiled packages. -:path: is the path list where to find the packages. - -Of course, you need to replace `/home/chimrod/` by your own installation path. -It must be an absolute path. - -The path to this file can be saved with the shell environnement ; we just need -to reference it in the `.bashrc` file : - -.. code-block:: bash - - export OCAMLFIND_CONF=/home/chimrod/ocaml/ocamlfind.conf - -That's now : each new package will now be installed in your packages directory, -and the compilation will also look for this path for the required -dependencies : you do not have to install the packages as root anymore. diff --git a/content/Informatique/ocamlfind_fr.rst b/content/Informatique/ocamlfind_fr.rst deleted file mode 100644 index 93edd40..0000000 --- a/content/Informatique/ocamlfind_fr.rst +++ /dev/null @@ -1,77 +0,0 @@ -.. -*- rst -*- -.. -*- coding: utf-8 -*- - -========================= -Un dépôt local pour ocaml -========================= - -:date: 2013-05-23 -:tags: ocaml -:summary: |summary| -:logo: static/images/ocaml/camel.jpg -:slug: un-depot-local-pour-ocaml -:lang: fr - -.. figure:: |filename|/images/ocaml/camel_medium.jpg - :figwidth: 150 - :figclass: floatleft - :alt: Pavement - - Image : `@Doug88888`_ (creativecommons_) - -.. _@Doug88888: http://www.flickr.com/photos/doug88888/3458057235/ -.. _creativecommons: http://creativecommons.org/licenses/by-nc-sa/2.0/deed.fr - -|summary| - - -.. |summary| replace:: - Ocaml n'est pas à jour dans debian : l'ensemble des librairies sont encore - restées sur la version 3, alors qu'Ocaml4 est sorti depuis près d'un an. Il - peut être nécessaire de développer en utilisant ocaml4, mais on est alors - obligé de compiler soit même les dépendances, et les installer pour - l'ensemble du système, ce qui n'est pas souhaité, ni toujours possible - (problème de droits). Cette petite recette permet de se créer un dépôt - local en utilisant findlib. - -Findlib est devenu de facto une brique essentielle pour la gestion des -librairies et les dépendances d'un projet. Aujourd'hui toute compilation -utilise findlib pour rechercher les dépendances et faciliter la chaîne de -compilation. La documentation_ du projet est assez dense, mais heureusement, il -est très configurable. - -.. _documentation: http://projects.camlcity.org/projects/dl/findlib-1.3.3/doc/guide-html/index.html - -Nous allons commencer par nous créer un fichier de configuration local qui va -indiquer où stocker nos librairies : - -.. code-block:: bash - - destdir="/home/chimrod/ocaml/packages/" - path="/home/chimrod/ocaml/packages/:/usr/local/lib/ocaml/4.00.1:/usr/lib/ocaml:/usr/lib/ocaml/METAS" - -:destdir: correspond à l'emplacement d'installation des nouvelles librairies. -:path: est l'ensemble des répertoires où chercher les dépendances. Ici - nous déclarons tout d'abord notre dépôt local avant de référencer - les répertoires système. - -Il faut bien sûr remplacer `/home/chimrod/` par le chemin sur votre -installation : celui-ci doit être écrit en absolu pour le bon fonctionnement de -findlib. - -Le répertoire de configuration peut être exporté via une variable shell, ce qui -va nous faciliter la vie ; il ne nous reste plus qu'à référencer ce fichier de -configuration dans notre environnement : - -.. code-block:: bash - - export OCAMLFIND_CONF=/home/chimrod/ocaml/ocamlfind.conf - -Là encore, remplacer le chemin par celui qui est le votre sur votre système. - -On peut mettre cette chaîne dans le fichier `.bashrc` pour que le paramétrage -soit pris en compte dans chaque session ouverte dans le terminal. - -Et le tour est joué : toutes nos nouvelles dépendances vont s'installer -directement dans notre répertoire personnel, et nous n'avons plus besoin -d'aller poluer le système avec nos compilation. diff --git a/content/Informatique/projet_libre.rst b/content/Informatique/projet_libre.rst deleted file mode 100644 index 50d8f2a..0000000 --- a/content/Informatique/projet_libre.rst +++ /dev/null @@ -1,83 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -========================== -Les conflits dans le libre -========================== - -:date: 2013-07-24 -:tags: ocaml, Libre -:summary: |summary| - -|summary| - -.. |summary| replace:: - Mener un projet libre n'est pas simple ; cela demande du temps, beaucoup - d'investissement, et le retour est rarement suffisament encourageant pour - tenir sur cette motivation. Il y a en ce moment des tensions au sein des - développeurs Ocaml par rapport à deux projets concurents. - -Le langage Ocaml essaie de gagner un nouveau dynamisme depuis quelques années. -Parmi les moteurs de ce dynamisme, un nouveau gestionnaire de paquets, opam_, -est censé apporter une simplification dans la gestion des dépendances, et -l'installation des librairies nécessaires à un projet. Sauf qu'il existe déjà -un gestionnaire de paquets dans Ocaml : godi_, qui existe depuis quelques -années, et qui a réussi à créer une grande bibliothèque de librairies -installable. - -.. _opam: http://opam.ocamlpro.com/ -.. _godi: http://godi.camlcity.org/godi/index.html - -Le créateur Gerd Stolpmann a laissé un message sur la mailing-list récemment, -indiquant qu'il `arreterait de maintenir godi`_, en partie à cause de la -concurrence d'opam, et principalement à cause de la campagne de dénigrement de -godi de la part des mainteneurs d'opam. Cela est en train de déchaîner les -réponses et d'agiter les principaux acteurs d'Ocaml qui essaient de trouver une -solution pour sortir du conflit. - -.. _arreterait de maintenir godi: https://sympa.inria.fr/sympa/arc/caml-list/2013-07/msg00199.html - -Les reproches -============= - -Gerd Stolpmann reproche à ocamlpro (l'équipe de développement d'opam) de ne pas -l'avoir contacté avant de se lancer dans le développement d'une solution -concurrente, et d'`avoir été évincé`_ après avoir construit et maintenu un -écosystème viable. D'un autre côté, ocamlpro annonce que opam `répondait à une -demande`_ d'un nouveau produit par un client, et qu'il était plus simple de -repartir sur une nouvelle base. - -Par ailleurs, la communauté reprend Gerd Stolpmann en lui annonçant qu'il n'y a -pas eu de dénigrement. Il y a bien eu toute une campagne d'enthousiasme liée à -l'arrivée d'un nouveau produit, mais qui ne s'est pas accompagnée pour autant -d'un dénigrement de godi et de la solution existante. - -.. _avoir été évincé: https://sympa.inria.fr/sympa/arc/caml-list/2013-07/msg00245.html -.. _répondait à une demande: https://sympa.inria.fr/sympa/arc/caml-list/2013-07/msg00240.html - -Rien de nouveau sous le soleil -============================== - -Ce genre de débat n'est pas nouveau, les conflits le noyau linux sont souvent -remonté et dérivent parfois vers des mails cinglants s'échangeant sur les -mailing-list. Le conflit est même plutôt positif, voire nécessaire (la seule -manière de gérer un projet sans conflit est d'imposer un dictateur). D'une -manière plus générale, `Georg Simmel`_ nous explique que le conflit est -positif, car il correspond à une prise de conscience de l'existence de l'autre. - -.. _Georg Simmel: https://fr.wikipedia.org/wiki/Georg_Simmel - -Pour ma part, je trouve dommage que l'esprit de création puisse être gâché à -cause de querelles de ce genre. Bien sûr, tout le monde est libre de commencer -un nouveau projet sans se référer à ceux existants, bien sûr tout le monde peut -forker ou même repartir à zéro un nouveau projet sans demander la permission, -mais quand on a affaire à une communauté compétente (et les développeurs Ocaml -le sont), je trouve dommage de diviser les compétences d'une communauté et -pousser quelqu'un à l'aigreur pour des raisons aussi futile que ce qui se passe -en ce moment. - -C'est pourtant le revers de la médaille du `bazar, les construction de -cathédrales`_ n'ont pas autant de péripéties… D'aucuns diront que ça fait -partie de la vie des projets libre. - -.. _bazar, les construction de cathédrales: https://fr.wikipedia.org/wiki/La_cath%C3%A9drale_et_le_bazar diff --git a/content/Informatique/roi_con.rst b/content/Informatique/roi_con.rst deleted file mode 100644 index 2d7af8a..0000000 --- a/content/Informatique/roi_con.rst +++ /dev/null @@ -1,127 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -===================================== -Internet, la guerre des médiacultures -===================================== - -:date: 2013-06-02 -:tags: Libre, Infowar -:summary: Les entreprises pourront toujours tenter de brider internet, la - créativité des internautes sera toujours plus forte, plus réactive. -:logo: static/images/roi/roi_75.jpeg -:lang: fr - -.. figure:: |filename|/images/roi/roi_150.jpeg - :class: floatright - -Une petite histoire -=================== - -Il était une fois, dans un royaume lointain, un roi qui n'était pas aimé de son -peuple. Ce dernier chantait une chanson dans tout le royaume dont le refrain -était le suivant : - - Longue vie au roi bouffon, le roi très con qu'est très très con ! - -Le roi lassé d'entendre cette chanson, convoqua ses ministres pour agir. Il -fut décidé que le plus sage était d'interdire tout simplement à ces sujets de -chanter cette chanson, et le texte fut mis à l'index. Toute personne surprise -en train de chanter cette chanson serait immédiatement envoyée aux galères. - -Les troubadours et chansonniers furent obligés de s'y plier. Mais dans les -tavernes, les champs et les chaumières, la population continuait de fredonner. - -Cela rendit le roi furieux, qui demanda aux gardes de patrouiller à la -recherches des chanteurs et de les mettre aux fers immédiatement, mais cela ne -changea rien, les gens continuaient, non plus à la chanter, mais à siffler la -chanson, sous le nez des gardes qui ne pouvaient rien faire puisque le texte -n'était pas prononcé ! Mais personne n'était dupe, et le roi continuait de -tourner en bourrique. - -Le roi, qui se faisait vieux, dépensa son énergie dans ce combat, les finances -de son royaume, et sa santé commença à se dégrader. - -Le business Internet -==================== - -Peut-on censurer ce qui circule sur internet ? Oui bien sûr, tout contenu qui y -est publié est sous la responsabilité d'une personne, morale ou physique. Après -longtemps s'être demandé qui devait être cette personne responsable -(l'hébergeur, le fournisseur d'accès), la LCEN a mis un peu d'ordre dans tout -ça. - -Aujourd'hui, il n'est pas possible de diffamer, calomnier, porter préjudice -parce que l'on utilise le web pour clamer son fiel, et les avocats se font un -plaisir d'envoyer des courriers de mise en demeure aux contrevenants — et c'est -très bien comme ça. - -Par contre, les entreprises savent que le droit à l'oubli n'existe pas sur le -web, et ont bien compris qu'une critique bien acerbe en première page de google -porte préjudice à l'image de marque. Des budgets sont dépensés pour que la -marque soit correctement représentée sur le net ; voyons par exemple `comment -nespresso transforme wikipédia en une brochure publicitaire`_ - -Que ce passe-t-il quand le business rencontre la loi ? Généralement rien de -très bon… Et c'est pareil ici : les lettres de mise en demeure servent de -menaces, et l'actualité nous en a fourni `un exemple très récemment`_. - -Stratégie et tactiques -====================== - -Heureusement, les internautes ne sont pas dupes, et face aux stratégies des -entreprises pour asseoir leur image, disposent via le web d'un incroyable outil -pour réponse. Non, internet ne sert pas qu'à regarder des chats qui jouent du -piano ! Michel de Certeau, dans `L'invention du quotidien`_, fait la différence -entre `stratégie` et `tactiques`. Là où la stratégie est planifiée, la tactique -`fait du coup par coup. Elle profite des « occasions » et en dépend. […] Il lui -faut utiliser, vigilante, les failles que les conjonctures particulières -ouvrent dans la surveillance du pouvoir propriétaire. Elle y braconne. Elle y -crée des surprises. Il lui est possible d'êre là où l'on ne l'attend pas. Elle -est ruse.` - -Les combats qui se jouent aujourd'hui sur internet donnent un sens très -actuels à ces mots. Les internautes ne pourront jamais faire face à l'armada -d'avocats prêts à dégainer au moindre signe d'ironie sur les forums. Mais ces -avocats sont démunis face à un `effet streisand`_, qu'ils ne peuvent pas -contrôler. Le jeu de pouvoir entre les internautes et les régulateurs du web -n'est pas fini, et les internautes savent mobiliser leurs ressources dès -qu'ils sentent que l'on porte atteinte à leur réseau. Cela m'impressionne à -chaque fois. - -La loi est respectée, par contre le combat est perdu pour celui qui cherchait à -faire plier un site, à donner à Internet la forme qu'il souhaitait : la réalité -ne se laisse pas contrôler si simplement… L'information restera libre ! - -.. _comment nespresso transforme wikipédia en une brochure publicitaire: http://thierry-klein.speechi.net/2009/12/01/comment-nespresso-transforme-wikipedia-en-brochure-publicitaire/ - -.. _un exemple très récemment: https://linuxfr.org/news/premiere-mise-en-demeure-pour-l-association-linuxfr -.. _L'invention du quotidien: https://fr.wikipedia.org/wiki/Michel_de_Certeau#L.27analyse_du_.C2.AB_braconnage_culturel_.C2.BB -.. _effet streisand: https://fr.wikipedia.org/wiki/Effet_Streisand - -La fin de l'histoire -==================== - -Après la mort du roi, le prince prit la couronne. Lors de la cérémonie, la -foule cria : - - Le roi est mort, vive le roi ! - -Et quelqu'un ajouta : - - Vive le roi bouffon, le roi très con qu'est très très con ! - -Refrain qui fut repris sur toute la place par la population. C'est alors que le -roi paru au balcon du palais, et il se mit à chanter : - - Longue vie au roi bouffon, le roi très con qu'est très très con ! - -La foule chanta avec le roi, mais rapidement le malaise s'installa, et bientôt -plus personne ne chantait. En chantant cette chanson, le roi venait de lui -retirer son aspect contestataire : comment peut-on chanter cette chanson contre -le roi, si le roi lui-même se met à la chanter ? Par cette action, il venait de -résoudre la crise qui se tramait dans le royaume. Les gens rentrèrent chez eux -et l'on n'entendit plus jamais ce refrain. - -Mais à part dans les contes de fées, existe-t-il des rois capable d'aller au -balcon pour chanter haut et fort les critiques de la foules ? diff --git a/content/Informatique/rst.rst b/content/Informatique/rst.rst deleted file mode 100644 index faa0280..0000000 --- a/content/Informatique/rst.rst +++ /dev/null @@ -1,186 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -Blogguer en rst sous wordpress -############################## - -:date: 2010-10-04 -:tags: Libre, reStructuredText -:summary: |summary| - -.. default-role:: literal - -Le format reStructuredText_ est un langage de balise (un peu comme le HTML, ou -le laTex), issu du monde de la programmation. Son but est de répondre au -problème suivant : comment écrire du texte simplement et sans avoir besoin -d'apprendre une syntaxe spécifique (ou du moins un minimum), tout en -conservant des possibilités de formatage et d'export ? - -.. _reStructuredText : http://docutils.sourceforge.net/rst.html - -Présentation de RST -=================== - -.. |summary| replace:: - Quand on écrit un article (par exemple ici cet article de blog), il est - nécessaire d'indiquer des directives de mise en page : ceci est un - paragraphe, ceci est un lien, inclure une image, une citation… Pour cela on - ne passe pas par un logiciel de traitement de texte pour le faire - (openOffice) : c'est lourd et cela n'apporte rien, mais la plupart du temps - par un éditeur intégré au blog qui permet de formater notre texte. - -|summary| - -Cet éditeur se charge pour nous de formater le texte en quelques clics. Le -problème est que bien souvent ce texte ne pourra pas sortir du blog (par -exemple pour prendre un extrait de l'article et l'utiliser ailleurs, nous -sommes obligés de passer à nouveau par cette interface) - -Une autre solution est de rédiger notre texte directement dans le format de -sortie (par exemple HTML), mais cela nécessite de connaître la syntaxe, et ne -rend pas la lecture du fichier source très lisible (essayez de lire un article -de presse en HTML avec un éditeur de texte pour voir…) - -Le format reStructuredText se veut être une réponse à ces problèmes : un -fichier RST est lisible (le fichier source est compréhensible et peut être lu -directement), ne nécessite pas de connaissances particulières (du moins peu), et -à l'avantage de pouvoir être exporté dans de nombreux format de sortie (odt, -pdf, latex, html…) On dispose donc d'un format unique pouvant servir à écrire -des articles de blog, des documents de travail, ou encore de la documentation. - -La syntaxe est très simple, et ne charge pas le document à la lecture. Par -exemple pour voir le document ayant servi à générer cet article est disponible -ici_ : on laisse des lignes blanches pour indiquer que l'on passe d'un -paragraphe à un autre, ou « souligne » avec les caractères = _ ou - les titres -et les sous-titres, et le résultat donne un document très aéré et agréable à -travailler. - -.. _ici : http://chimrod.com/downloads/blog/article.rst - -Plugin wordpress -================ - -Il existe un plugin wordpress qui permet d'utiliser ce format pour l'écriture -de documents dans le blog. À chaque fois que l'on va publier un article, le -plugin va tester si le fichier est au format rst, et dans ce cas, va en faire -la conversion en html en passant par la commande `rst2html`. - -**Attention**, pour le mettre en place, il est -nécessaire d'avoir un accès à la machine pour y installer quelques -applications. - -Pré-requis ----------- - -Python doit être disponible sur la machine, ainsi que le script `rst2html` (je -ne pense pas que cela soit le cas pour les blogs hébergés et cela limite les -possibilités). - -.. code-block:: console - - $ sudo aptitude install python-docutils - -Installation ------------- - -Il s'agit juste d'un fichier à installer dans le répertoire des plugin de -wordpress. Celui-ci est disponible sur launchpad_ et ne pose aucun problème de -compatibilité. - -.. _launchpad : http://bazaar.launchpad.net/~gldnspud/rest-wordpress/trunk/files - -Le fichier README explique comment l'installer et le paramétrage à faire; les -options (comme le chemin vers `rst2pdf`) se font directement dans le fichier php. - -.. code-block:: php startinline=True - - // Set this to the prefix of your docutils installation. - $prefix = "/usr/local"; - - // Set this to the path of rst2html.py - $rst2html = "$prefix/bin/rst2html.py"; - -Un petit test devrait montrer le résultat tout de suite. Dans le cas où le -contenu est vide, regardez les logs d'erreur du serveur web, vous devriez y -trouver les causes de votre erreur. - -Coloration syntaxique ---------------------- - -Il est possible de disposer de la coloration syntaxique automatique du code : - -.. code-block:: python - - import os - # Standard hello world stuff - class Hello() - def do_it(self) - print "Hello world" - - if __name__ == '__main__': - Hello().do_it() - - def main() - print "Hello world" - -Pour intégrer la coloration syntaxique, il faut passer par pygment (un -programme python qui s'occupe de ça) : - -.. code-block:: console - - # aptitude install python-pygments - -Ensuite il va falloir modifier le script à lancer. En effet, par défaut, la -commande `rst2pdf` n'intègre pas la coloration de code. Nous allons donc devoir -modifier la commande à exécuter pour le faire (j'ai mis à disposition le script -à télécharger_). Assurez-vous que le script peut être exécuté par l'utilisateur -lancé par le service web. - -.. _télécharger : http://chimrod.com/downloads/scripts/rst2html-pygments.py - -La CSS n'est pas inclue dans le document et peut être définie à l'extérieur. Il -est possible de définir son style à partir de pygment avec la commande suivante -(pour appliquer le style tango) : - -.. code-block:: console - - $ pygmentize -S tango -f html > style.css - -Conclusion -========== - -Je cherchais depuis un petit moment une solution pour pouvoir écrire mes -articles sans me connecter au blog. Les applications clientes ne me convenant -pas tout à fait, le RST me permet d'utiliser une application totalement séparée -du blog (par exemple VIM) et un format pérenne. - -Je ne sais pas s'il existe une solution équivalente pour les autres moteurs de -blog, le RST étant encore un format assez jeune, et n'est pas encore très -répandu… - -Sans être aussi complet que le latex, il est bien plus souple et -beaucoup plus facile à utiliser. De plus il s'agit bien sûr d'un format -ouvert, pouvant générer des documents sous openOffice, en PDF, voire en latex -pour ceux qui veulent… - -Édit (29/05/11) -=============== - -Je reviens sur le plugin en constatant que par défaut, celui-ci met en cache le -contenu de l'article, même si celui-ci est déjà en html. Une petite -modification dans le code permet de ne sauvegarder le fichier que s'il s'agit -d'un fichier rst : - -Rechercher dans le script la chaîne suivante : - -.. code-block:: php - - if ($pos === false) { - // No modeline. - $rval = wpautop($text); - -Et rajouter la ligne suivante en dessous : - -.. code-block:: php - - return $rval; diff --git a/content/Informatique/rst_graphviz.rst b/content/Informatique/rst_graphviz.rst deleted file mode 100644 index 692a86d..0000000 --- a/content/Informatique/rst_graphviz.rst +++ /dev/null @@ -1,131 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -Ajouter graphviz dans les documents restructuredText -#################################################### - -:date: 2013-10-12 -:tags: Libre, reStructuredText -:logo: static/images/graphviz/graphe.png -:summary: |summary| - -.. default-role:: literal - -:2014-05-05: Je met l'article à jour avec la dernière version du script que - j'utilise. J'en profite pour donner un peu plus d'exemples. - -.. image:: |filename|/images/graphviz/graphe.png - :class: floatleft - :scale: 50 - :alt: Graphe - -|summary| - -.. |summary| replace:: - C'est en utilisant un produit tous les jours que nous vient l'envie de - l'améliorer. Dernièrement, j'ai eu besoin de générer un texte contenant des - graphes. Il y a quelques temps, j'aurais préparé mes graphes dans des - images à part, et inclus les images dans mon document, sauf que cette fois, - j'ai décidé d'inclure directement le code du graphe dans mon document. - -Graphviz_ est une merveilleuse librairie pour générer des représentations de -graphes comme celle qui se trouve à côté. À partir d'un fichier texte contenant -la description du graphe, l'application nous génère une image (avec différents -formats possibles) du graphe. Par exemple, l'image ci contre peut-être -représentée avec le code suivant : - -.. code-block:: dot - - digraph G { - - a -> a - a -> b - d -> b - b -> c - c -> b - } - -.. _Graphviz: http://graphviz.org/ - -Je ne rentre pas davantage dans la description de gv, l'application est très -complète, et un article ne suffirait pas à tout couvrir ! - -La question qui se pose est donc de pouvoir inclure directement graphviz lors -de la génération du document. Pour ça, j'ai créé une nouvelle directive_, -`graphviz` qui appele directement dot lors de la génération du document. - -.. _directive: http://docutils.sourceforge.net/docs/ref/rst/directives.html - -.. list-table:: - :header-rows: 1 - :stub-columns: 1 - :widths: 10 45 45 - - * - Exemple - - Code - - Résultat - * - Insérer un graphe orienté - - - .. code-block:: rst - - .. graphviz:: digraph - - a -> a - a -> b - d -> b - b -> c - c -> b - - .. - ceci est une légende - - - - .. figure:: |filename|/images/graphviz/graphe.png - - ceci est une légende - - * - Insérer un graphe non-orienté - - - .. code-block:: rst - - .. graphviz:: graph - - a -- a - a -- b - d -- b - b -- c - c -- b - - - - .. figure:: |filename|/images/graphviz/no.png - * - Utiliser des options - - - .. code-block:: rst - - .. graphviz:: digraph - - rankdir = LR; - - a -> a - a -> b - d -> b - b -> c - c -> b - - - - .. figure:: |filename|/images/graphviz/options.png - -Pour ceux que ça intéresse, voici le script pour rst2html_ et rst2latex_. Le -code est similaire, cela ajoute une nouvelle directive qui génère le document à -l'aide de graphviz, et stocke l'image dans un fichier temporaire, créé dans un -répertoire *tmp* (qui doit exister avant de lancer la commande). On pourrait -très facilement l'ajouter à rst2odt en suivant le même principe. - -Le script rst2latex génère les images en pdf, il est prévu pour être utilisé -avec `pdflatex`. - -C'est tout, le langage est tellement simple que ça serait dommage de ne pas en -profiter ! - -.. _rst2html: |filename|/resources/rst_graphviz/rst2html.py -.. _rst2latex: |filename|/resources/rst_graphviz/rst2latex.py diff --git a/content/Informatique/rstodt.rst b/content/Informatique/rstodt.rst deleted file mode 100644 index 9e9e67d..0000000 --- a/content/Informatique/rstodt.rst +++ /dev/null @@ -1,68 +0,0 @@ -.. -*- mode : rst -*- -.. -*- coding: utf-8 -*- - -Coloration syntaxique avec rst2odt -################################## - -:date: 2012-08-18 -:tags: Libre, reStructuredText -:logo: static/images/kea.jpg -:summary: |summary| - -.. figure:: |filename|/images/kea.jpg - :figwidth: 75 - :figclass: floatleft - :alt: Arbre - - Image : Kea_ - - -|summary| - -.. |summary| replace:: - Le langage rst, déjà évoqué dans un `article précédent`_, possède plusieurs - formats sortie : pdf, odt, html, xml… Cependant, les outils pour générer la - sortie ne prennent pas tous les même paramètres, et il est difficile de - faire un fichier source qui soit compatible avec l'ensemble des - compilateurs. - -La coloration syntaxique -======================== - -La coloration syntaxique, par exemple, n'est pas traitée de la même manière -selon l'outil utilisé. Nous retrouvons deux directives : - -=========== =============================================== -Nom Outils -=========== =============================================== -code-block rst2pdf_, sphynx… -sourcecode rst2odt -=========== =============================================== - -La première est devenue un standard, la seconde n'est prise en compte que par -rst2odt (et est en plus un peu lourde à mettre en place). - -La modification -=============== - -Heureusement, c'est assez facile d'ajouter de nouvelles directives, et il est -possible de modifier le script à lancer pour prendre en compte la directive -code-block ! - -Vous pouvez télécharger le script modifié ici_. J'ai repris l'option -d'`inclusion de fichier`, mais je ne gère pas les limites (je n'en avais pas -besoin). - -Et voilà, ça s'utilise comme ça : - -.. code-block:: console - - $ python bin/rst2odt.py --strip-comments --stylesheet=resources/template.odt\ - --add-syntax-highlight source.rst source.odt - -.. _article précédent: |filename|rst.rst -.. _rst2pdf: http://rst2pdf.ralsina.com.ar/ -.. _ici: http://chimrod.com/downloads/rst2odt.py -.. _inclusion de fichier: http://rst2pdf.ralsina.com.ar/handbook.html#file-inclusion -.. _Kea: http://www.flickr.com/photos/k_e_a/3325975129/ - diff --git a/content/Informatique/sftp.rst b/content/Informatique/sftp.rst deleted file mode 100644 index 4207725..0000000 --- a/content/Informatique/sftp.rst +++ /dev/null @@ -1,138 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -Mettre en place un environnement sftp chrooté (2) -################################################# - -:date: 2011-06-07 -:tags: Hébergement, sftp, Administration - -Il y a quelque temps, j'avais publié un billet indiquant comment mettre en -place un environnement sftp chrooté, dans lequel l'utilisateur ne peut pas -sortir du répertoire qui lui est assigné. - -La solution que j'avais proposée (modifier la configuration de sshd) était -compliquée et lourde à mettre en place. Parmi les commentaires, le logiciel -mysecureshell_ avait été évoqué. - -Présentation -============ - -Mysecureshell est une commande qui se lance au login de l'utilisateur sur la -machine. Il dispose de nombreuses possibilité de paramétrage (débit, droits), -tout en restant très simple à administrer. De plus, il empêche l'utilisateur -d'ouvrir une connexion sur la machine, il ne peut que se connecter en sftp. - -Nous allons voir ici comment le -mettre en place sur une machine Debian destinée à accueillir des -connexions sftp. - -La documentation en ligne est complète et accessible voici néanmoins une -description qui reprend les principes de l'installation. - -Installation -============ - -Mysecureshell n'est malheureusement pas disponible dans les dépôts debian. Il -est donc nécessaire d'ajouter un dépôt externe pour l'installer. Le site web -fournit des `paquets d'installation`_ pour la plupart des distributions (debian, -fedora…) - -Une fois que le dépôt est ajouté, il suffit de l'installer en lançant la -commande suivante (toujours sous debian) : - -.. code-block:: console - - # aptitude install mysecureshell - - -Configuration -============= - -Configuration de mysecureshell ------------------------------- - -La configuration se fait dans le fichier /etc/ssh/sftp-config - -Voici les champs importants à noter : - -=============== ============================================================== -Champs Signification -=============== ============================================================== -GlobalDownload Il s'agit du débit maximal qui sera utilisé quand le serveur - uploadera des fichiers vers les clients -GlobalUpload La même chose pour l'upload -StayAtHome Empêcher l'utilisateur de naviguer hors de son répertoire - personnel -VirtualChroot Met en place un faux home pour l'utilisateur -Home Défini le home que verra l'utilisateur lorsqu'il se connectera -=============== ============================================================== - -Je conseille de séparer le home « unix » de l'utilisateur de son home -« chrooté ». Cela permet de mettre en place des fichiers dans le fichier home -de l'utilisateur, sans que celui-ci ne puisse les consulter : - -Cela se fait tout simplement en mettant l'option VirtualChroot à True, et en -définissant le Home `mysecureshell` vers un sous-répertoire du home `unix` : - - -.. code-block:: bash - - StayAtHome true - VirtualChroot true - Home /home/$USER/sftp - - -Cela oblige à créer pour chaque utilisateur un répertoire sftp dans son home. -Lorsque l'utilisateur se connectera, il accedera uniquement à répertoire sftp, -mais ne pourra pas naviguer plus haut, ni consulter les autres répertoires des -autres utilisateurs. - - -Gestion des comptes -------------------- - -La configuration est assez simple : pour chaque utilisateur nous allons indiquer -que mysecureshell est la commande à exécuter lors du login de l'utilisateur. -Cela se fait en modifiant le fichier /etc/passwd. - -.. code-block:: console - - invite:x:1002:1002:,,,:/home/invite:/bin/bash - -et le remplacer le dernier champs ainsi : - - -.. code-block:: console - - invite:x:1002:1002:,,,:/home/invite:/bin/Mysecureshell - -Sauvegarder, et voilà, la configuration va s'appliquer lors de la prochaine -connexion de l'utilisateur. - -Mise à jour de la configuration -------------------------------- - -Lorsque les fichiers de configuration sont mis à jour, les connexions existantes -ne sont affectées. Elles ne le deviennent qu'à partir de la prochaine -reconnexion de l'utilisateur. - -Il est tout à fait possibile de forcer mysecureshell à appliquer les -modifications, mais cela oblige à `reconnecter les utilisateurs`_ - -Au final -======== - -Il n'y a pas grand chose à faire finalement, et c'est agréable de voir la -configuration se faire aussi rapidement ! Il est vrai que le site web de -l'application peut sembler amateur, mais cela ne reflète en rien la qualité de -l'application. - -J'abandonne donc avec plaisir la méthode que j'avais mis en place dans mon -précédent billet pour passer sur mysecureshell ! - -.. _mysecureshell : http://mysecureshell.sourceforge.net/fr/index.html -.. _paquets d'installation : http://mysecureshell.sourceforge.net/fr/installpak.html -.. _reconnecter les utilisateurs : http://mysecureshell.sourceforge.net/fr/confman.html#question9 - -.. vim: filetype=rst diff --git a/content/Informatique/shifty.rst b/content/Informatique/shifty.rst deleted file mode 100644 index b542d46..0000000 --- a/content/Informatique/shifty.rst +++ /dev/null @@ -1,176 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -==================== -Astuces pour awesome -==================== - -:date: 2013-07-21 -:tags: Libre, awesome -:summary: |summary| -:logo: static/images/awesome/tiling.jpg - -.. figure:: |filename|/images/awesome/tiling.jpg - :figwidth: 150 - :figclass: floatleft - :alt: Pavement - - Image : `Lauren Manning`_ (creativecommons_) - -.. _creativecommons: http://creativecommons.org/licenses/by/2.0/ -.. _Lauren Manning: http://www.flickr.com/photos/laurenmanning/2318922360/in/photostream/ - -|summary| - -.. |summary| replace:: - Le WM awesome est majoritairement utilisé par des utilisateurs qui passent - du temps à configurer leur bureau (ou qui n'ont pas peur de le faire) et - peut être paramétré de bien des manières ; les recettes ne manquent pas sur - le wiki. Voici ici quelques astuces issues de mon utilisation. - -Intégration avec gnome -====================== - -Awesome est un gestionnaire de fenêtre et ne remplace pas un gestionnaire de -bureau et tous ses avantages : monter automatiquement les clefs usb branchées, -conserver le mot de passe ssh pour la session, etc. - -Gnome permet de remplacer le gestionnaire par un autre, ce que nous allons -mettre à profit pour utiliser awesome à la place de celui proposé par défaut. -Vous pouvez donc échapper à l'affreux `Gnome Shell`_ et passer sous en -gestionnaire ergonomique… - -Un guide est disponible sur le wiki_ et une fois configuré, vous n'avez plus -qu'à choisir gnome comme session de démarrage : awesome sera automatiquement -lancé et utilisé comme gestionnaire de fenêtre ! - -Il s'agit de la principale astuce car elle permet de lancer un nombre important -de services qui ne sont pas pris en charge par un simple gestionnaire de -fenêtre. - -.. _Gnome Shell: https://fr.wikipedia.org/wiki/GNOME_Shell -.. _wiki: http://awesome.naquadah.org/wiki/Quickly_Setting_up_Awesome_with_Gnome/fr - -.. image:: |filename|/images/awesome/menu.jpg - :class: floatright - :alt: Session menu - -Gérer la session -================ - -Maintenant que awesome est lancé dans une session gnome, on peut lancer des -commandes DBUS sans difficultées : nous allons en profiter pour ajouter au menu -d'awesome la possiblité de gérer sa session. Le code suivant permet de -rajouter au menu sous menu « system » qui contiendra les actions « quit », -« restart » et « halt » permetant d'éxécuter les commandes de déconnexion -directement : - -.. code-block:: lua - - mysystemmemu = { - {"quit", "dbus-send --session --type=method_call --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.Logout uint32:1"}, - {"restart", 'dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Restart' }, - {"halt", 'dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop'}, - - } - - mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon }, - […] - { "system", mysystemmemu } - -Les commandes DBUS proviennent du `forum ubuntu`_ ; d'une manière générale, -DBUS permet de faire énormément de chose avec son système (note pour plus tard, -trouver un annuaire des commandes). - -.. _forum ubuntu: http://forum.ubuntu-fr.org/viewtopic.php?pid=7615111#p7615111 - -Afficher le calendrier -====================== - -Par défaut, awesome affiche l'heure et la date dans la bare de menu, mais aucun -calendrier n'est disponible. Pour ceux qui ont besoin d'un simple calendrier et -non d'un agenda, je recommande gsimplecal_ qui se contente d'afficher le mois -en cours. On peut facilement modifier la configuration pour lancer -l'application dès que l'on clic sur la date : il suffit de modifier le textbox -déjà existant pour lui ajouter un évènement sur le clic de la souris : - -.. code-block:: lua - - -- Create a textclock widget - mytextclock = awful.widget.textclock({ align = "right" }) - mytextclock:buttons(awful.util.table.join( - -- Launch on clic - awful.button({ }, 1, function() awful.util.spawn_with_shell("gsimplecal") end - )) - - -.. _gsimplecal: http://dmedvinsky.github.io/gsimplecal/ - -Utiliser les touches média -========================== - -.. image:: |filename|/images/awesome/medias.png - :class: floatleft - :alt: Media keys - -Vous avez peut-être des touches d'accès rapide sur votre clavier pour le mail, -lancer le navigateur web… Ce sont des touches médias, qui peuvent être -interceptées par le gestionnaire de fenêtre pour lancer les actions -appropriées. On va se servir de ces touches pour lancer les applications dont -nous avons besoin. - -Toutefois, j'ai rarement besoin d'avoir plus d'un client mail ou un navigateur -lancé. De même, je passe souvent d'une recherche sur le web à autre chose, -avant de retourner sur le navigateur. J'ai donc pris l'habitude de le garder -lancé et ouvert dans un onglet à part. Ce que je propose permet l'action -suivante : lorsque l'on appuie sur la touche « web » du clavier, on va demander -au gestionnaire de fenêtre d'afficher le `tag` dans lequel est tourne. Si ce -`tag` n'est pas présent sur le bureau : on va le créer, et lancer au passage le -navigateur, ainsi, on n'a pas besoin de savoir si l'application est lancée ou -non, c'est Awesome qui se charge de faire ça pour nous. - -Il existe une extension permetant de gérer les tags et les applications -facilement : shifty_, elle vient se substituer au gestionnaire de tag -implémenté par défaut, et permet de faire beaucoup de choses très -intéressante : - -* lancer une application au démarrage d'un tag -* … - -Dans la configuration de shifty, il faut déclarer ses tags ainsi : - -.. code-block:: lua - - shifty.config.tags = { - ["musique"] = { position = 100, icon = music_icon, spawn = "gmpc"}, - ["mail"] = { position = 101, icon = mail_icon, spawn = "icedove"}, - ["web"] = { position = 102, icon = web_icon, spawn = "iceweasel"}, - - -Cela permet de lancer l'application désirée lors de la création du tag (s'il -n'est pas déjà affiché), puis dans la configuration générale d'awesome : - -.. code-block:: lua - - globalkeys = awful.util.table.join( - awful.key({ }, "XF86Calculator", function() awful.tag.viewonly(shifty.getpos(100)) end ), - awful.key({ }, "XF86Mail", function() awful.tag.viewonly(shifty.getpos(101)) end ), - awful.key({ }, "XF86HomePage", function() awful.tag.viewonly(shifty.getpos(102)) end ), - -Maintenant on demande à afficher le tag voulu en fonction de la touche clavier -préssée : si le tag existe, il sera affiché, sinon il sera non seulement créé, -mais l'application sera lancée : un bon moyen pour avoir toujours ses -applications préférées au bout des doigts ! - -.. _shifty: http://awesome.naquadah.org/wiki/Shifty/fr - -Conclusion -========== - -Awesome reste pour moi toujours aussi agréable à utiliser. Cela fait plus de -trois ans maintenant que je l'utilise, et je continue d'être ravi d'avoir un -système qui se contrôle au doigt et à l'œuil (au doigt surtout !). Pouvoir -configurer ses applications à sa guise peut paraître couteux et compliqué de -prime abord, mais permet d'avoir un système qui correspond à notre besoin : ça -n'est pas à nous de nous adapter à un outil, c'est à l'outil de s'adapter à -notre usage ! diff --git a/content/Informatique/ssl_proxy.rst b/content/Informatique/ssl_proxy.rst deleted file mode 100644 index c57f27e..0000000 --- a/content/Informatique/ssl_proxy.rst +++ /dev/null @@ -1,128 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -======================================== -Vérifier un certificat SSL en entreprise -======================================== - -:date: 2013-12-19 -:tags: ViePrivée -:summary: |summary| -:logo: static/images/chiffer/pgp_75.jpg - - -.. figure:: |filename|/images/chiffer/pgp_150.jpg - :figwidth: 150 - :figclass: floatright - :alt: Pavement - - Image : `Elsamuko`_ (creativecommons_) - -.. _Elsamuko: http://www.flickr.com/photos/28653536@N07/10595809575/ -.. _creativecommons: http://creativecommons.org/licenses/by-sa/2.0/deed.fr - -|summary| - -.. |summary| replace:: - openssl permet de vérifier un certificat SSL en ligne de commande. Ceci est - très utile si l'on souhaite vérifier son installation et s'assurer que le - certificat fourni est bien le bon. Toutefois, l'application ne fonctionne - pas si un proxy est nécessaire pour se connecter au site distant. - -C'est bien dommage, car en entreprise, le proxy est souvent obligatoire. Si -l'on souhaite s'assurer que le proxy ne va pas nous présenter un mauvais -certificat, il est nécessaire de passer par le navigateur web pour vérifier -l'authenticité du certificat, mais il n'est alors pas possible d'automatiser la -procédure. - -Pour mener à bien notre action, il va falloir ruser, et jouer avec les -connexions réseau, mais avant tout ça, reprenons un peu les bases, et voyons -comment récupérer un certificat ssl en ligne de commande. - -openssl -======= - -Openssl est une librairie utilisée pour la sécurité et le chiffrement, elle -permet de générer des certificats clients et serveur, de chiffrer selon -différents algorithmes, etc. - -Une application en ligne de commande existe, et permet de contrôler un -certificat de la manière suivante : - -.. code-block:: console - - $ echo -n | openssl s_client -connect site.test:443 | openssl x509 -noout -md5 -fingerprint - -Toutefois, il faut que le site soit accessible directement, sans proxy. Si -c'est le cas, il n'est plus possible de vérifier le certificat en question. - -C'est problématique si l'on souhaite justement s'assurer que le proxy ne fait -pas du mitm_. Pour vérifier le certificat dans ces conditions, il va falloir -nous faire entrer un autre outil qui va se charger de passer le proxy. - -.. _mitm: http://fr.wikipedia.org/wiki/Attaque_de_l%27homme_du_milieu - -Vous avez remarqué que l'on précise le serveur et le port sur lequel est -installé le certificat à vérifier. Il est donc possible de tester un certificat -sur `localhost:1234` si on le souhaite (à la condition d'avoir un serveur https -qui réponde sur ce port). - -socat -===== - -C'est là qu'intervient socat. Socat_ est un outil similaire à netcat (le -couteau suisse du web), sauf que socat à la possibilité de gérer les requêtes -bidirectionnelles. Nous allons nous en servir pour ouvrir une connexion à -travers le proxy sur le site que nous souhaitons tester. - -.. _socat: http://www.dest-unreach.org/socat/ - -En laissant la connexion ouverte, on permet à openssl de s'y connecter et -effectuer ses tests. C'est donc grâce aux deux outils que l'on va pouvoir faire -notre contrôle. - -On se crée la connexion avec la commande suivante : - -.. code-block:: console - - $ socat TCP4-LISTEN:2022 "PROXY:site.test:443 | TCP:proxy.test:8080" - -La connexion n'est pas persistante, elle sera fermée dès sa première -utilisation, cela permet de chaîner les deux commandes directement : - -.. code-block:: bash - - #!/bin/sh - - if [[ ! -z $https_proxy ]]; then - proxy=`echo ${https_proxy} | sed -e 's|http://||' -` - socat TCP4-LISTEN:2022 "PROXY:$1 | TCP:${proxy}" & - echo -n | openssl s_client -connect localhost:2022 | openssl x509 -noout -md5 -fingerprint - else - echo -n | openssl s_client -connect $1 | openssl x509 -noout -md5 -fingerprint - fi - -enregistrez ce script sous `check_ssl.sh` puis lancez cette commande ainsi : - -.. code-block:: console - - $ check.sh site.test:443 - depth=0 C = FR, ST = Some-State, O = Internet Widgits Pty Ltd, CN = site.test, emailAddress = contact@site.test - verify error:num=20:unable to get local issuer certificate - verify return:1 - depth=0 C = FR, ST = Some-State, O = Internet Widgits Pty Ltd, CN = site.test, emailAddress = contact@site.test - verify error:num=21:unable to verify the first certificate - verify return:1 - DONE - MD5 Fingerprint=73:4F:77:1D:2B:C1:4F:0E:3F:42:FA:14:A9:0F:BC:80 - -Si la variable d'environnement `HTTPS_PROXY` est renseignée le script -créera le tunnel via socat, sinon, openssl sera utilisé directement pour -vérifier le certificat. - -Vous pouvez le comparer avec ce que vous affiche le navigateur pour vous -assurer qu'il est cohérent : - -.. image:: |filename|/images/chiffer/certificat.jpg - -N'oubliez pas, on n'est jamais trop prudent ! diff --git a/content/Informatique/unplugged.rst b/content/Informatique/unplugged.rst deleted file mode 100644 index c54f8c6..0000000 --- a/content/Informatique/unplugged.rst +++ /dev/null @@ -1,72 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -CS Unplugged -============ - -:date: 2013-06-08 -:tags: Libre, Livre -:summary: |summary| -:logo: static/images/unplugged/unplugged.jpg - -.. image:: |filename|/images/unplugged/together.gif - :width: 320 - :class: floatright - :alt: Together with computer - -Il y a quelques années, j'avais découvert le livre `Computer Science -Unplugged`. La semaine dernière, je suis retombé sur le pdf, et l'ai relu avec -le même intérêt. D'ou cet article pour faire partager cette (re)découverte. - -|summary| - -.. |summary| replace:: - `CS Unplugged`_ est un livre pour faire découvrir l'informatique, sans - ordinateur. Il s'agit d'un support pédagogique, qui explique de manière - très claire comment fonctionne l'informatique, le format des données que - traite l'ordinateur, et comment celui-ci fait pour traiter les - informations. - -.. _CS Unplugged: http://csunplugged.org/ - -Je n'ai pas de relations avec le monde enseignant, et ne me tiens pas au -courant de la manière dont l'informatique est traitée en classe. Pourtant je -trouve que ce support de cours est intéressant à plus d'un titre : - -* tout d'abord il est libre ! C'est suffisamment rare pour mériter d'être - souligné. Le livre est diffusé sous licence creativecommons et les sources - (au format .doc) sont `téléchargeable sur le site`_. - -* ensuite il est vraiment très pédagogique. Je ne me suis pas ennuyé en le - lisant, et les exemples sont vraiment bien introduits. - -.. _téléchargeable sur le site: http://csunplugged.org/open-source-edition-ms-word - -.. image:: |filename|/images/unplugged/parity.jpg - :class: floatleft - :alt: Together with computer - -L'exemple ci-contre est une explication des bits de parités et du contrôle des -erreurs. Comme l'ensemble des activités, cela se fait avec des cartes ou des -images, et le but derrière l'activité est de comprendre comment l'ordinateur -fonctionne. À la lecture de cette image, avez-vous compris comment la fille a -pu deviner quelle carte avait été retournée ? (Je vous ai donné un indice en -parlant de bits de parité ; imaginez que chaque carte représente un bit). Si -vous ne trouvez pas, allez-voir l'activité 4 à la page n°31 ! - -Chaque activité est accompagnée d'un peu de théorie, ainsi que d'exemples issus -de la vie courante (ici l'utilisation des sommes de contrôles dans le n°ISBN -des livres). - -Les activités vont à chaque fois un peu plus loin dans la complexité, mais tout -en restant facilement abordable ; à la fin du livre, vous serez même capable -d'expliquer le principe du `tri rapide`_ ! - -.. _tri rapide: https://fr.wikipedia.org/wiki/Tri_rapide - -Si vous avez besoin de faire découvrir l'informatique, où si vous êtes à la -recherche d'une pédagogie qui tourne autour de l'ordinateur, de la théorie de -l'information et des algorithmes, vous trouverez probablement votre bonheur -dans ce livre — la page de couverture parle d'activité d'éveil à partir de -l'école primaire, mais sans limitation d'âge, et ce serait dommage de passer à -côté de cette pépite… diff --git a/content/Informatique/vala.rst b/content/Informatique/vala.rst deleted file mode 100644 index 05aeeb7..0000000 --- a/content/Informatique/vala.rst +++ /dev/null @@ -1,165 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -Présentation de Vala -#################### - -:date: 2010-06-11 -:tags: Libre, Programmation - -.. default-role:: literal - -J'ai découvert une présentation du langage dans GLMF n°127 qui -l'utilisait pour se brancher sur le pare-feu. Cela ayant aiguisé ma -curiosité, j'ai cherché à en savoir davantage sur le langage. Le langage -C m'a toujours paru difficile à aborder. Non pas au niveau de sa -syntaxe, mais au sujet de l'accès à sa documentation et aux librairies -disponibles. Pour moi qui suis habitué à Java ou à Python, j'ai regardé -Vala comme un moyen de mettre un pied dans le C. Je vais essayer de -présenter ma manière de le voir, après avoir fait une petite plongée -dedans… - -Présentation -~~~~~~~~~~~~ - -Le langage Vala a été créé par les développeurs de Gnome pour qu'ils -puissent disposer d'un langage de haut niveau. Gnome ayant eu pendant -quelque temps un pied (dansant) dans mono, Vala en est très inspiré. -(Je ne connais pas mono et ne peux donc pas lancer de comparatif, je -vous renvoie donc à celui présenté par Gnome `par rapport à -C# `_, et -pour `Java `_). Le -langage est ensuite compilé en C, et GCC est utilisé pour la compilation -d'un exécutable. On est donc dans un langage intermédiaire, qui reste -très proche du C comme nous allons le voir par la suite. - -Analyse -~~~~~~~ - -Langage objet haut niveau --------------------------- - -Vala est tout d'abord un langage haut niveau : -on y retrouve des *interface* (pour pouvoir moduler le code facilement), des -*delegate* (qui permettent de définir un type de fonction pour un callback), -une gestion *événementielle* (gérer le déclenchement de plusieurs méthodes dans -le code par un appel unique) … On dispose donc d'un langage objet assez riche -pour éviter d'avoir à passer du temps sur des détails et se concentrer sur le -programme et son déroulement. Il est pensé objet et l'on retrouve vite ses -marques, tout comme l'on sent qu'il est assez facile d'« abstraire » le code -pour faire une application qui n'en reste pas un simple script… Je n'ai pas -envie de détailler la syntaxe du langage et tout ce qu'il intègre car vous -pourrez trouver tout cela en ligne. Je vous renvoie au `tutoriel -`_ qui explique la structure du langage en -détail, qui présentent des exemples détaillés. - -La GLib -------- - -Le langage est basé sur -la GLib, la librairie standard utilisé dans les applications GTK. La plupart -des types primitifs (`int` …) sont donc en réalités des types issus de cette -librairie (`gint` …). On accède ainsi à l'ensemble des méthodes de la GLib, -diffusées sous formes de classes objets et bien documentées (la `valadoc -`_). Cela rejoint l'histoire de Vala puisque La -GLib est tout utilisée par les développeurs Gnome (on constate d'ailleurs que -la plupart des composants Gnome ont une entrée dans cette Valadoc). Il ne faut -cependant pas croire que l'on dispose avec cette bibliothèque standard d'un -ensemble de routines aussi riche que dans le package standard d'un Java ou d'un -Python : la GLib est avant tout destinée à des développeurs C, et beaucoup des -méthodes standard du C ne sont pas disponibles. Pour parer cela, Vala propose -une classe POSIX[LIEN] proposant les méthodes standard du C, mais celle-ci -n'est pas exhaustive et il nous arrive souvent de tomber sur une fonction qui -ne nous est pas accessible via le langage haut niveau qu'est Vala. - -Les Bindings ------------- - -Pour répondre à cela, propose la possibilité de mettre en place un binding vers -une libraire C de manière native. (Normal me direz-vous, le code en sortie de -Vala est du C !) On peut donc très facilement utiliser n'importe quelle -libraire existante. Vala étant un langage objet, il devient donc possible -d'utiliser les librairies standard au sein d'un code objet de haut niveau. Cela -ne demande que quelques lignes, demandant au minimum le fichier dans lequel se -trouve la définition de la méthode, et sa signature. Exemple du binding -définissant la méthode `execl` (issue du fichier -`/usr/share/vala/vapi/posix.vapi`) : - -:: - - [CCode (cheader_filename = "unistd.h")] - public int execl (string path, params string[] arg); - -et voici la signature de la méthode C correspondante : - -:: - - extern int execl (__const char *__path, __const char *__arg, ...) __THROW __nonnull ((1)); - -Les types primitifs de la GLib étant basés sur les types primitifs C -correspondants, il n'y a pas de problème de cast dans la plupart de cas. -Toutefois, Vala utilise des `char\*` pour définir ses string : il est parfois -nécessaire de mettre en place faire un cast quand une méthode nous un `char[]` : -même dans le code haut niveau, le C n'est jamais loin… C'est souvent -frustrant de devoir mettre en place un binding pour une fonction disponible en -standard dans la libc. Je pense qu'il manque la possibilité d'inclure -directement du code C dans le code vala, tout comme il est possible directement -de l'assembleur dans du C. Cela permettrait un confort dans l'utilisation qui -n'est pas disponible actuellement. À noter qu'un outil permet de mettre en -place ces bindings pour les composants basés sur `GObjet` (Gnome toujours…). De -plus de nombreux bindings sont disponibles pour les composants Gnome. -Attention, cela n'empêchera pas d'avoir à installer les headers C -correspondants ! - -Les profils ------------- - -Il est possible d'utiliser des profils de compilation. Cette option encore -expérimentale a été mise en place pour répondre à des réclamations de la part -des utilisateurs qui voulaient programmer en Vala sans avoir de dépendances -envers la GLib. Ainsi, il est possible d'appeler le compilateur avec la syntaxe -suivante : - -.. code-block:: console - - $ valac --profile posix - -ce qui a pour conséquence de réduire le jeu de bibliothèque par défaut à -celles disponibles dans la classe `POSIX`. Cela permet de limiter les -dépendances du programmes, mais beaucoup de types standard de Vala -deviennent de ce fait indisponible; on sent bien que le langage n'a pas -été pensé pour ça. - -Conclusion -~~~~~~~~~~ - -Pour résumer, je dirais que Vala correspond à ce qu'il annonce : un -langage haut niveau pour faciliter la création d'applications Gnome. Dès -que l'on cherche à sortir de ce cadre, on se retrouve confronté à des -limitations (qui ne sont bien sûr pas insurmontable) : - -- Pour ceux qui ne cherche pas à travailler sur du code Gnome, - embarquement de bibliothèques qui ne nous intéressent pas forcément. - (Bien que sur ce point, la GLib est plutôt standard sur les PCs - ayant X d'installés) -- Pour ceux qui cherchent un langage de haut niveau, le C est encore - trop présent entre les lignes pour pouvoir l'oublier complètement. - D'un autre côté, l'intégration du code C n'est pas toujours évidente - puisqu'elle oblige à déclarer des bindings pour des fonctions - standards. -- Mais surtout, le fait que l'ensemble des fonctions de la libc ne - soient pas encore disponibles oblige à mettre le doigt dans les - bindings régulièrement. - -Le langage est bien sûr encore amené à évoluer, et les points que je cite ici -ne sont pas pour autant rédhibitoires. D'un point de vue totalement subjectif -Je trouve le langage simple mais sans trop de saveur. Ça reste un langage objet -qui n'est bien sûr pas révolutionnaire; on sent qu'il ne fait que reprendre les -concepts des langages qui l'ont inspiré, mais le produit est cohérent, et -d'après les benchs génère un code plutôt optimisé (en rapport avec le temps que -l'on pourrait passer à produire le même code en C). Après, je ne prends pas le -même plaisir à programmer en Vala qu'en python (j'avais bien dit que j'étais -subjectif ^^). Cela dit, pour moi, qui ne suis pas un développeur Gnome, je -suis plus intéressé par la possibilité d'avoir un langage haut niveau qui reste -très proche du C, avec les performances qui vont avec; si le prix pour cela est -une dépendance vers la GLib, ça reste un coût sommes toutes assez faible. diff --git a/content/Informatique/wiimote.rst b/content/Informatique/wiimote.rst deleted file mode 100644 index eb6641d..0000000 --- a/content/Informatique/wiimote.rst +++ /dev/null @@ -1,123 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -Controling the wiimote (I) -########################## - - -:date: 2009-03-11 -:tags: Programmation, Wiimote, Python -:slug: controling-the-wiimote-i -:lang: en - - -Creating the plugin for wminput -------------------------------- - -There are a lot of tutorials about how to configure cwiid. I let you follow -them for getting a functionnal system for your wiimote. You can read the links -at the end of this article. Be sure your system works well before continuing. - -This is a code that we'll use as template for the creation of our driver. Used -as main, it use pygame for displaying the infrared sources the wiimote can -detect, but it is also compatible as plugin for wminput ( even if it does -anything for now ). - -You can get it here : -`wm\_control.py `_ -( This code is licenced under GPL 3+ ) - -About the code : - -.. code-block:: python - - import wmplugin - -This import does not exist, but is created by wminput when executed. It provide -the connexion with the wminput core. Just put ( or link ) the script in the -wminput plugin path ( on my debian this is the /usr/lib/cwiid/plugins/ ) - -.. code-block:: python - - def wmplugin_init(id, wiimote_arg): - wmplugin.set_rpt_mode(id, cwiid.RPT_IR | cwiid.RPT_BTN) - return - - def wmplugin_info(): - return [], - [("X", wmplugin.REL | wmplugin.ABS, 1024, 0, 0, 0), - ("Y", wmplugin.REL | wmplugin.ABS, 768, 0, 0, 0)], - [] - -We instanciate the wiimote object here and configure it in the IR mode. The -name is choosen by wminput if we want to use it as plugin. We define that the -plugin return the coordonates X and Y in a relative system ( -you can get the signification of all the parameters here : `actions list -`_) - -If we want to define new butons, we just have to name them in the first list, -the'll be accessible in the configuration file as plugin.[buton\_name] = ACTION - -.. code-block:: python - - def wmplugin_exec(messages): - '''Wiimote callback managing method - Recieves a message list, each element is different, see the libcwiid docs''' - x = y = 0 - - for msg in messages: - if msg[0] == cwiid.MESG_IR: - x, y = ir_sensor.get_movement(msg) - return [], (x, y) - -Here is the core of our driver. The name is choosen by wminput too, as the -format value we return. We have in parameter the list of the messages the -wiimote has sent. - -If we have defined buton we need to return their state here. It is a boolean -saying if the buton is pressed ( True ) or not ( False ). - -This method doesn't send any others parameters, and this is a problem when we -need to store data between two calls ( ie for saving the cursor position ). One -way for passing throught is to use global variables. But it is unelegant and -can cause problems if we want to use our code in imports. So we'ill use a list -as default parameter and let python save it as you can see here : - -.. code-block:: python - - >>> def meth(a=[]): - ... a.append(1) - ... print a - ... - >>> meth() - [1] - >>> meth() - [1, 1] - >>> meth() - [1, 1, 1] - -So the ir\_sensor.get\_movement method is defined with each parameter we -want to save as an optional list - -.. code-block:: python - - def get_movement(msg, _old_points=[], _old_position = [0, 0]): - return 0, 0 - -The get\_movement method need to return the difference between the old position -of the cursor and the new one in tuple : (0, 0) mean that the cursor didn't -move, (-10, 0) mean a deplacement to the left. - -For now, the plugin doesn't move the cursor, and doesn't read what the wiimote -has sent. But you know everything for creating your own plugin for controlling -your wiimote. You can use all the cwiid method for setting the led, activating -the differents modes of your wiimote ( IR, Acc, rumble ... ), and define here -your own actions. - -I'll explain the core of the movement analysis in IR mode in the next article. - -Links : - `The cwiid project `_ - -`Install Cwiid ( Ubuntu Documentation -) `_ diff --git a/content/Informatique/wiimote1.rst b/content/Informatique/wiimote1.rst deleted file mode 100644 index 94577d4..0000000 --- a/content/Informatique/wiimote1.rst +++ /dev/null @@ -1,60 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -Un pilote wiimote sous Linux en python --------------------------------------- - -:date: 2009/02/19 -:tags: Programmation, Wiimote - -La wiimote est la manette de contrôle de la console wii de Nintendo, un -outil merveilleux dont voici un petit résumé de ses fonctionnalités : - -- Accéléromètres -- Caméra infrarouge -- Émetteur/Récepteur Bluetooth -- 11 boutons - -( voir le détail sur la page de -`wikipédia `_ ) - -En disposant d'un récepteur bluetooth, il est possible de se connecter à -la télécommande et de récupérer ses informations, mieux, avec le projet -`cwiid `_, on peut transformer la wiimote -en souris ! - -Ainsi selon le mode dans lequel se trouve la télécommande, on contrôle -notre curseur en inclinant la télécommande, ou en la pointant vers une -source infrarouge - -.. - - La source infrarouge pouvant être la sensor bar fournie avec la - console, ou une source externe, bougie lampe ou tout ce dont pouvez - disposer diffusant de la chaleur à partir d'un point unique - -Le pilote fourni avec cwiid fonctionne mais n'est pas optimisé. Il -arrive que la souris parte dans une direction incontrôlée, ou de ne pas -pouvoir accéder à certaines parties de l'écran. - -La faute est due au pilote intégré qui se contente juste de placer le -pointeur sur la source infrarouge, avec quelques petites optimisations. - -En effet, le capteur de la wiimote nous indique quelle est la position -de toutes les sources infrarouges perçues ( et nous fourni également des -informations sur leur intensité ), mais la conversion en pointeur est -laissée au pilote : - -- Quelle source choisir comme référence ? -- Comment gérer les cas où une source est sortie du champ de vision ? -- Comment réagir quand cette source revient dans le champ de vision ? - -Tout ceci doit être pris en compte pour pouvoir offrir une ergonomie au -curseur et faciliter le contrôle. - -Heureusement pour nous le pilote nous donne la possibilité de réécrire -nos propres moteurs, et donc de gérer nous même la manière dont on veut -que la souris réagisse. Nous avons même le choix dans le langage ! En -effet, nous pouvons choisir entre offrir un plugin compilé ( le pilote -est écrit en C ), ou l'écrire en python. C'est cette deuxième option que -je vais présenter dans les articles qui suivront. diff --git a/content/Informatique/wiimote_fr.rst b/content/Informatique/wiimote_fr.rst deleted file mode 100644 index ca6ca65..0000000 --- a/content/Informatique/wiimote_fr.rst +++ /dev/null @@ -1,115 +0,0 @@ -.. -*- mode: rst -*- -.. -*- coding: utf-8 -*- - -Controller la wiimote -##################### - - -:date: 2009-03-11 -:tags: Programmation, Wiimote, Python -:slug: controling-the-wiimote-i -:lang: fr -:logo: static/images/wiican.png -:summary: |abstract| - - -Création d'un plugin pour wminput ---------------------------------- - -Il existe de nombreux tutorials sur comment configurer cwiid, je voud laisse -les suivre pour obtenir un système fonctionnel pour la wiimote (vous pourrez -trouver des liens à la fin de cet article). Soyez sûr que la wiimote est -reconnue avant de continuer. - -|abstract| - -.. |abstract| replace:: - Voici un code que l'on peut utiliser comme base pour la création de notre - driver. Lancé en tant que main, il utilise pygame pour afficher les sources - infrarouges captées par la wiimote, mais il peut également être utilisé - comme plugin pour wminput (même s'il ne fait rien pour l'instant). - - -Vous pouvez le télécharger ici : -`wm\_control.py `_ -(Code disponible sous licence GPL 3+) - -Le code : - -.. code-block:: python - - import wmplugin - -Cet import n'existe pas, mais est créé par wminput lorsque celui-ci est lancé. -Il fourni la connexion avec le cœur wminput. Il vous suffit de placer le script -dans le répertoire de plugin de wminput (sur ma debian il se situe dans -`/usr/lib/cwiid/plugins/`) - -.. code-block:: python - - def wmplugin_init(id, wiimote_arg): - wmplugin.set_rpt_mode(id, cwiid.RPT_IR | cwiid.RPT_BTN) - return - - def wmplugin_info(): - return [], - [("X", wmplugin.REL | wmplugin.ABS, 1024, 0, 0, 0), - ("Y", wmplugin.REL | wmplugin.ABS, 768, 0, 0, 0)], - [] - -On instancie la wiimote ici et actions le mode InfraRouge. Le nom est choisi -par wminput si nous désirons pouvoir l'utiliser comme plugin. On déclare que le -plugin retourne les coordonées X et Y dans un système de coordonées relative -(l'ensemble des paramètres sont disponibles ici : `actions list -`_) - -Si nous voulons définir de nouvons boutons, nous avons juste à les nommer dans -la première list, ils seront accessibles dans le fichier de configuration sous -le nom `plugin.[buton\_name] = ACTION` - -.. code-block:: python - - def wmplugin_exec(messages): - '''Wiimote callback managing method - Recieves a message list, each element is different, see the libcwiid docs''' - x = y = 0 - - for msg in messages: - if msg[0] == cwiid.MESG_IR: - x, y = ir_sensor.get_movement(msg) - return [], (x, y) - -Voici le cœur de notre driver. Le nom de la méthode est également imposé par -wminput, de même que le format de retour. Nous recevons en paramètres la liste -des messages reçus par la wiimote. - -Si nous avons défini des boutons, il nous faut retourner leur état ici. Il -s'agit jute d'un booléen indiquant si le bouton est préssé (`True`) ou non -(`False`). - -Cette méthode ne retourne aucun autre parametres, et cela nous pose problème -car nous avons besoin de sauvegarder l'état du curseur entre deux appels. J'ai -contourné le problème en utilisant des arguments par défaut à la fonction -`get_movement` pour pouvoir stocker l'environnement d'un appel à un autre : - -.. code-block:: python - - def get_movement(msg, _old_points=[], _old_position = [0, 0]): - return 0, 0 - -Cette méthode retourne la difference entre la précédente position du curseur et -la nouvelle : `(0, 0)` signifie que le curseur n'a pas bougé, `(-10, 0)` -représente un déplacement vers la gauche. - -Pour l'instant, le plugin ne bouge pas le curseur, et ne lie pas les résultats -envoyés par la wiimote, mais vous avez assez d'information pour créer votre -propre plugin pour controller la wiimote. Vous pouvez accéder aux méthodes de -cwiid pour activer les leds, mettre en marche les differents modes (infrarouge, -accéléromètre, vibration, …) et définir vos propres actions. - -Links : - -`Le projet cwiid `_ - -`Installer Cwiid ( Ubuntu Documentation -) `_ -- cgit v1.2.3