From 9b77ec15e5beeff3f57f845be883416d2a68b84d Mon Sep 17 00:00:00 2001 From: Sébastien Dailly Date: Mon, 30 Nov 2020 22:56:26 +0100 Subject: New article on rst & Latex. Changed theme --- content/Informatique/2009-03-11-wiimote.en.rst_ | 124 ++++++++++++ content/Informatique/2009-03-11-wiimote.fr.rst | 118 ++++++++++++ content/Informatique/2009-03-11-wiimote.rst | 123 ------------ content/Informatique/2009-03-11-wiimote_fr.rst | 118 ------------ content/Informatique/2009-10-18-backup.rst | 82 -------- content/Informatique/2010-06-11-vala.rst | 165 ---------------- content/Informatique/2013-04-20-gueule1.rst | 65 ------- content/Informatique/2013-05-08-fcron2cron_en.rst | 64 ------- content/Informatique/2013-05-09-fcron2cron.rst | 124 ------------ content/Informatique/2013-05-23-ocamlfind_en.rst | 63 ------ content/Informatique/2013-05-23-ocamlfind_en.rst_ | 63 ++++++ content/Informatique/2013-06-02-roi_con.rst | 128 ------------- content/Informatique/2013-07-24-projet_libre.rst | 83 -------- content/Informatique/2014-02-09-ocaml_gtk.rst | 206 -------------------- content/Informatique/2015-10-03-moderncv.rst | 9 + content/Informatique/2020-12-03-encore_des_cv.rst | 183 ++++++++++++++++++ content/Perso/poker.rst | 221 ---------------------- content/images/cv/model5.png | Bin 0 -> 222166 bytes content/images/poker/ac.jpeg | Bin 2970 -> 0 bytes content/images/poker/ad.jpeg | Bin 2541 -> 0 bytes content/images/poker/ah.jpeg | Bin 2611 -> 0 bytes content/images/poker/as.jpeg | Bin 2544 -> 0 bytes content/images/poker/kc.jpeg | Bin 5160 -> 0 bytes content/images/poker/kd.jpeg | Bin 5208 -> 0 bytes content/images/poker/kh.jpeg | Bin 5125 -> 0 bytes content/images/poker/ks.jpeg | Bin 5190 -> 0 bytes content/images/profile.png | Bin 0 -> 155795 bytes content/images/roi/roi_150.jpeg | Bin 8547 -> 0 bytes content/images/roi/roi_75.jpeg | Bin 5540 -> 0 bytes 29 files changed, 497 insertions(+), 1442 deletions(-) create mode 100644 content/Informatique/2009-03-11-wiimote.en.rst_ create mode 100644 content/Informatique/2009-03-11-wiimote.fr.rst delete mode 100644 content/Informatique/2009-03-11-wiimote.rst delete mode 100644 content/Informatique/2009-03-11-wiimote_fr.rst delete mode 100644 content/Informatique/2009-10-18-backup.rst delete mode 100644 content/Informatique/2010-06-11-vala.rst delete mode 100644 content/Informatique/2013-04-20-gueule1.rst delete mode 100644 content/Informatique/2013-05-08-fcron2cron_en.rst delete mode 100644 content/Informatique/2013-05-09-fcron2cron.rst delete mode 100644 content/Informatique/2013-05-23-ocamlfind_en.rst create mode 100644 content/Informatique/2013-05-23-ocamlfind_en.rst_ delete mode 100644 content/Informatique/2013-06-02-roi_con.rst delete mode 100644 content/Informatique/2013-07-24-projet_libre.rst delete mode 100644 content/Informatique/2014-02-09-ocaml_gtk.rst create mode 100755 content/Informatique/2020-12-03-encore_des_cv.rst delete mode 100644 content/Perso/poker.rst create mode 100755 content/images/cv/model5.png delete mode 100644 content/images/poker/ac.jpeg delete mode 100644 content/images/poker/ad.jpeg delete mode 100644 content/images/poker/ah.jpeg delete mode 100644 content/images/poker/as.jpeg delete mode 100644 content/images/poker/kc.jpeg delete mode 100644 content/images/poker/kd.jpeg delete mode 100644 content/images/poker/kh.jpeg delete mode 100644 content/images/poker/ks.jpeg create mode 100755 content/images/profile.png delete mode 100644 content/images/roi/roi_150.jpeg delete mode 100644 content/images/roi/roi_75.jpeg (limited to 'content') diff --git a/content/Informatique/2009-03-11-wiimote.en.rst_ b/content/Informatique/2009-03-11-wiimote.en.rst_ new file mode 100644 index 0000000..3604257 --- /dev/null +++ b/content/Informatique/2009-03-11-wiimote.en.rst_ @@ -0,0 +1,124 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +Controling the wiimote (I) +########################## + + +:date: 2009-03-11 +:tags: Programmation, Wiimote, Python +:slug: controling-the-wiimote-i +:lang: en +:translation: true + + +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+ ) + +.. _wm_control.py: {filename}/resources/ir_control_0.py + +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..2c80584 --- /dev/null +++ b/content/Informatique/2009-03-11-wiimote.fr.rst @@ -0,0 +1,118 @@ +.. -*- 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| + +.. default-role:: literal + + +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+) + +.. _wm_control.py: {filename}/resources/ir_control_0.py + + +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-03-11-wiimote.rst b/content/Informatique/2009-03-11-wiimote.rst deleted file mode 100644 index 325d4b7..0000000 --- a/content/Informatique/2009-03-11-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+ ) - -.. _wm_control.py: {filename}/resources/ir_control_0.py - -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 deleted file mode 100644 index 2c80584..0000000 --- a/content/Informatique/2009-03-11-wiimote_fr.rst +++ /dev/null @@ -1,118 +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: /images/wiican.png -:summary: |abstract| - -.. default-role:: literal - - -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+) - -.. _wm_control.py: {filename}/resources/ir_control_0.py - - -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 deleted file mode 100644 index 291f187..0000000 --- a/content/Informatique/2009-10-18-backup.rst +++ /dev/null @@ -1,82 +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_. - -.. _ici: {filename}/resources/backup.sh - -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-06-11-vala.rst b/content/Informatique/2010-06-11-vala.rst deleted file mode 100644 index 05aeeb7..0000000 --- a/content/Informatique/2010-06-11-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/2013-04-20-gueule1.rst b/content/Informatique/2013-04-20-gueule1.rst deleted file mode 100644 index 6fa3f04..0000000 --- a/content/Informatique/2013-04-20-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: /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-05-08-fcron2cron_en.rst b/content/Informatique/2013-05-08-fcron2cron_en.rst deleted file mode 100644 index 0e51388..0000000 --- a/content/Informatique/2013-05-08-fcron2cron_en.rst +++ /dev/null @@ -1,64 +0,0 @@ -.. -*- 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 - -.. default-role:: literal - - -.. 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 deleted file mode 100644 index f7652dc..0000000 --- a/content/Informatique/2013-05-09-fcron2cron.rst +++ /dev/null @@ -1,124 +0,0 @@ -.. -*- 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 - -.. default-role:: literal - - -.. 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. - -.. admonition:: 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 deleted file mode 100644 index a725a39..0000000 --- a/content/Informatique/2013-05-23-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: /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_en.rst_ b/content/Informatique/2013-05-23-ocamlfind_en.rst_ new file mode 100644 index 0000000..6b812f7 --- /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-06-02-roi_con.rst b/content/Informatique/2013-06-02-roi_con.rst deleted file mode 100644 index 3d2c3e5..0000000 --- a/content/Informatique/2013-06-02-roi_con.rst +++ /dev/null @@ -1,128 +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: /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-07-24-projet_libre.rst b/content/Informatique/2013-07-24-projet_libre.rst deleted file mode 100644 index 50d8f2a..0000000 --- a/content/Informatique/2013-07-24-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/2014-02-09-ocaml_gtk.rst b/content/Informatique/2014-02-09-ocaml_gtk.rst deleted file mode 100644 index 09f1aee..0000000 --- a/content/Informatique/2014-02-09-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: /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/2015-10-03-moderncv.rst b/content/Informatique/2015-10-03-moderncv.rst index 939d100..0e534d9 100644 --- a/content/Informatique/2015-10-03-moderncv.rst +++ b/content/Informatique/2015-10-03-moderncv.rst @@ -9,6 +9,14 @@ Se faire un CV en rst :tags: reStructuredText, Libre :summary: |summary| +.. admonition:: Article obsolète + :class: warning + + Je propose désormais une solution complète pour se faire son modèle de CV en + rst : `encore des cvs`_ ! + +.. _encore des cvs: {filename}2020-12-03-encore_des_cv.rst + |summary| .. |summary| replace:: @@ -17,6 +25,7 @@ Se faire un CV en rst fois-ci je vous propose d'écrire votre CV en rst, et donner le rendu à latex via moderncv pour obtenir un rendu qui sort du lot. + Moderncv ======== diff --git a/content/Informatique/2020-12-03-encore_des_cv.rst b/content/Informatique/2020-12-03-encore_des_cv.rst new file mode 100755 index 0000000..e950fee --- /dev/null +++ b/content/Informatique/2020-12-03-encore_des_cv.rst @@ -0,0 +1,183 @@ +.. -*- mode: rst -*- +.. -*- coding: utf-8 -*- + +===================== +Encore des cvs en rst +===================== + +:date: 2020-12-03 +:tags: latex, restructuredText +:summary: |summary| + + +.. default-role:: literal + +|summary| + +.. |summary| replace:: + + J'avais déjà présenté comment modifier_ le format rst pour produire un cv avec + la classe moderncv de latex. Cette fois je propose de se créer soi-même son + modèle tout en gardant le format RST. + +.. _modifier: {filename}2015-10-03-moderncv.rst + + +L'idée est de conserver le standard du format rst et de modifier les fichiers +latex pour les adapter en fonction du besoin. Cela signifie que le même fichier +source peut être utilisé avec les différents exemples sans changements (ou +presque). + +Le résultat +=========== + +Commençons directement par le final, voilà le résultat : + +.. image:: {static}../images/cv/model5.png + :width: 50% + :class: floatleft + +le code est disponible sur mon `dépôt git`_ si vous souhaitez le cloner et +récupérer les sources. + +.. _dépôt git: http://git.chimrod.com/latex_template.git/ + +Les directives RST +================== + +La sidebar +---------- + +.. code-block:: rst + + .. sidebar:: Titre + + Texte à renseigner dans le bandeau + +Permet de créer du texte dans la barre latérale. Le texte peut être une liste, +une image ou tout autre élément standard. Il faut juste faire attention à la +largeur qui oblige à rester concis… + + +.. admonition:: Sans titre ? + :class: hint + + rst oblige à déclarer un titre dans la directive, ce qui n'est pas forcément + ce que l'on souhaite. Par contre le titre peut être vide ! Il suffit + d'échapper une espace : + + + .. code-block:: rst + + .. sidebar:: \ + + .. image:: mon profil.jpg + :width: 100% + +Les listes +---------- + +Avec la directive `class`, il est possible d'appliquer un style qui sera +présent jusqu'à la fin du paragraphe. Ce style est associé à une commande Latex +qui permet l'appliquer le style en question. Ainsi, avec la classe `checklist`, +toutes les puces des listes sont remplacées par une coche : + +.. code-block:: rst + + .. class:: checklist + + * 1er élément + * Second élément + +La commande latex suivante est utilisée : + +.. code-block:: latex + + \newenvironment{DUCLASSchecklist}{\renewcommand{\labelitemi}{\faCheck}}{} + +Il est facile de modifier la commande pour charger d'autres types de marques, +voir le fichier `10_lists.tex`_ pour la liste complète. + +.. _10_lists.tex: http://git.chimrod.com/latex_template.git/tree/common/10_lists.tex + +Il est possible de modifier le style de liste en cours de route, mais il faut +faire attention à appeler la commande **avant** la ligne que l'on souhaite +modifier. C'est pourquoi l'on retrouve l'exemple suivant dans lequel on annonce +les icônes avant la ligne suivante : + +.. code-block:: rst + + .. sidebar:: Informations + + * 75001 Paris |phoneicon| + * 01 23 45 67 89 |mailicon| + * email@example |noicon| + +`|phoneicon|` est en fait une substitution de texte qui insère une commande +latex à la place (et donc ne substitue rien du tout :)) + +Les barres de niveau +==================== + +Autre point assez amusant, il est possible de faire des graphiques à partir de +données dans le fichier. Les niveaux représentés sous forme d'étoiles ou de +barres sont construits dans latex à partir des lignes suivantes : + +.. code-block:: rst + + .. role:: level + .. role:: levelbox + .. role:: star + + :star:`4.5` + :levelbox:`5` + :level:`3` + +Il s'agit de rôles personnalisés, qui sont interprétés comme des commandes +latex prenant un paramètre : la valeur du niveau. Celui-ci est ensuite +représenté sous forme d'étoile colorées, ou barre de niveau. On peut imaginer +toutes les fantaisies possibles… + +Autres éléments +=============== + +Il n'y en a pas d'autres. Tout le reste est ensuite standard et suit les +directives rst. (La directive `admonition`_ permet également des +personnalisations assez avancées, mais je ne l'ai pas appliqué ici). + +.. _admonition: https://docutils.sourceforge.io/docs/ref/rst/directives.html#admonitions + +L'organisation +============== + +Chaque répertoire contient un modèle différent, et tous les modèles suivent le +même schéma : + +:: + + | + |\ Makefile + |\ fichier.rst (le fichier source à traiter) + \ resources (le répertoire contenant les modèles latex) + | + |\ 00_colors.tex (la définition des couleurs) + |\ 00_length.tex (les longueurs pour les marges ou autres paramètres) + |\ 00_preamble.tex (le fichier contenant les paramètres principaux) + |\ 10_fonts.tex (les polices utilisées dans le document) + |\ 10_title_style.tex (la personnalisation des titres) + \ autres directives latex + +Tous les fichiers qui sont présents dans le répertoire `resources` sont +automatiquement chargés, et les modules présents dans le fichier `modules` sont +également chargés. + +Pour la simplification du dépôt, des fichiers communs à tous mes styles sont +présents dans le répertoire `common` + +Et voilà +======== + +J'espère que ces petits exemples vous donneront des idées, et qu'ils vous +permettront de construire vos propres modèles. L'idée est vraiment de laisser +toute la mécanique latex en arrière-plan, et se simplifier au maximum +l'écriture ! diff --git a/content/Perso/poker.rst b/content/Perso/poker.rst deleted file mode 100644 index 44a011b..0000000 --- a/content/Perso/poker.rst +++ /dev/null @@ -1,221 +0,0 @@ -.. -*- rst -*- -.. -*- coding: utf-8 -*- - -Évaluation des mains au poker -############################# - -:date: 2013-04-19 -:tags: ocaml, Programmation, Jeux - -J'ai entrepris il y a quelques temps de mettre en place un moteur d'évaluation -des mains de poker. Je n'ai pas trouvé beaucoup de codes ou librairies -permettant ça, à l'exception de pokersource_ qui est assez utilée dans des -projets libres. - -Cette librairie permet d'évaluer le pourcentage de chance pour chaque joueur de -gagner le pot, en fonction du type de jeu, du board, ou des cartes brulées. -Elle est fiable et assez rapide si l'on en croit les critiques_. - -Par contre, dès qu'il s'agit d'évaluer des groupes de mains, aucune -optimisation n'est réalisée, et c'est à la charge du développeur de s'en -occuper. J'ai donc commencé une petite librairie en Ocaml qui se charge de -faire les calculs, en réalisant les optimisations nécessaires pour accélerer le -calcul. - -Je ne vais pas présenter ici le code, mais plutôt comment sont réalisées les -différentes optimisations mises en places par la librairie. - -.. _pokersource: http://svn.gna.org/svn/pokersource/ -.. _critiques: http://www.codingthewheel.com/archives/a-pokersource-poker-eval-primer - -Couleurs de libertés -===================== - -Présentation ------------- - -Il s'agit de la première optimisation et s'inspire des degrés de libertés l'on -peut retrouver dans les équations. On part du principe que évaluer les -probabilité entre |Ah|\ |As| contre |Ks|\ |Kc| est équivalent a -|Ac|\ |Ad| contre |Kd|\ |Kh| c'est à dire que les couleurs -peuvent être substituées les unes aux autres sans changer les probabilités. - -Tant qu'une couleur n'a pas été « posée », elle peut être substituée par -n'importe quelle autre. Cela simplifier les calculs répétitifs, par exemple : - -|Ah|\ |As| contre |Ks|\ |Kc| - -|Ah|\ |As| contre |Ks|\ |Kh| - -|Ah|\ |As| contre |Ks|\ |Kd| - -|Ah|\ |As| contre |Kc|\ |Kh| - -|Ah|\ |As| contre |Kc|\ |Kd| - -|Ah|\ |As| contre |Kh|\ |Kd| - -va pouvoir être simplifié en - -1 * |Ah|\ |As| contre |Ks|\ |Kh| (les deux mains partagent les couleurs) - -4 * |Ah|\ |As| contre |Ks|\ |Kc| (les deux mains partagent une couleur) - -1 * |Ah|\ |As| contre |Kc|\ |Kd| (les deux mains ne partagent pas de couleur) - -Selon le nombre de joueurs disutant la confrontation, le nombre de calculs à -faire peut déjà être diminué par 2 ou plus : il est possible d'appliquer -récursivement cette opération pour chacun des joueurs, en fonction des couleurs -qui ont été utilisées précédemment. - -Implémentation --------------- - -Il « suffit » de tenir une table de correspondance entre les couleurs réelles, -et les couleurs utilisées dans le calcul. Puis, de regrouper les mains du -joueur : - -1) Au début, la table est vide : aucune couleur n'est fixée, donc deux mains - ayant des valeurs identiques (par exemple |Ah|\ |As| et |Ac|\ |Ad|\ ) vont se - retrouver regroupée sous la même main, qui sera comptabilisée deux fois. - -2) Ensuite, pour chaque main ainsi générée, on va regrouper les mains du joueur - suivant. Sauf que cette fois-ci la table de correspondance n'est plus vide : - elle a déjà été rempli lors de la phase 1; certaines mains ne pourront donc - pas être regroupées entre elles. - -3) On répète la phase 2 pour chaque joueur, à chaque fois le nombre de couleurs - libre est réduit. Quand on arrive au dernier joueur, on lance le calcul, - auquel on applique le facteur de multiplication, calculé en fonction du - nombre de mains qui ont étés regroupées pour l'ensemble des joueurs. - -Calcul combinatoires -==================== - -Cette première opération permet déjà de réduire les calculs, mais ça n'est pas -suffisant. Quand on essaie de calculer les probabilité, il arrive souvent que -les adversaires aient des mains en communs, parmi leur possibité de jeu. - -Imaginons les possibité suivantes : - -* joueur 1 : {AA, KK, AK} -* joueur 2 : {AA, KK} -* joueur 3 : {KK, AK} - -évaluer les probabilité de chaque joueur va conduire a des répétitions lors -évaluations : - -* (AA, **KK**, **AK**) et (AA, **AK**, **KK**) -* (**AK**, AA, **KK**) et (**KK**, AA, **AK**) -* … - -Quand on a calculé le premier arrangement, on peut déduire les résulats du -second sans faire les calculs, il suffit d'éffectuer une permutation pour -obtenir, mutatis mutandis, le résulat attendu. - -Partitions ----------- - -La première étape est de réaliser une partition des mains possibles du joueur. -Pour chaque joueur, il faut commencer par créer des groupes de mains tel que : - -* chaque groupe pris pair à pair ne contient aucune carte en commun -* il est possible de reconstituer l'ensemble des mains des joueurs par une - combinaison de ces groupes. - -On va se servir des `opérations de base`_ pour découper un ensemble_ pair à -pair, en prenant à chaque fois l'élément unique que l'on applique ensuite à -l'ensemble suivant. - -.. code-block:: ocaml - - let explode = - - let rec partition clean current = function - | [] -> current, clean - | hd::tl -> - if S.disjoint current hd || S.equal current hd then - partition (hd::clean) current tl - else - let s1::s2 = split current hd - in List.unique ~eq:S.equal (partition s2 s1 ((tl @ clean))) - - and process_list checked = function - | [] -> checked - | hd :: tl -> ( - match partition [] hd tl with - | cleaned, [] -> cleaned::checked - | cleaned, tl' -> process_list (cleaned::checked) tl' - ) - - in process_list [] - %> List.unique ~eq:S.equal - -.. _ensemble: https://fr.wikipedia.org/wiki/Ensemble -.. _`opérations de base`: https://fr.wikipedia.org/wiki/Alg%C3%A8bre_des_parties_d%27un_ensemble - -Énumérer --------- - -Ensuite, nous allons énumérer l'ensemble des combinaisons possible de ces -groupes. Il existe quelques algorithmes_ permettant de générer la liste des -combinaisons données pour un rang donné. - -Toutefois, nous travaillons ici sur des `combinaisons avec répétitions`_ (une -même partition peut êre présente plusieurs fois), ce qui change le nombre de -combinaisons disponibles. - -Pour chacune de ces combinaison, il faut maintenant tester toutes les -permutations possibles, et, pour chacune d'elle, vérifier si cette permutation -peut être présente ou non dans la confrontation. Si l'une d'entre elle est -possible, alors on peut lancer le calcul, et garder le résultat au cas où une -autre permutation de la même combinaison pourrait correspondre. - -.. _algorithmes: http://jean-paul.davalan.pagesperso-orange.fr/mots/comb/comb/combalgo.html -.. _combinaisons avec répétitions: http://fr.wikipedia.org/wiki/Combinaison_avec_r%C3%A9p%C3%A9tition - -Assembler ---------- - -Pour terminer, il faut pouvoir assembler les résulats. Il suffit de garder le -nombre de mains évaluées, et le nombre de mains gagnées pour chaque joueur, -cela peut se faire au fil de l'eau, en additionnant chaque nouveau résulat au -résultat final. La probabilité de gagner se fait en calculant le rapport. - -Le code -======= - -Il est disponible sur mon dépôt git_\ . Je ne vois pas d'autres optimisations -possibles pour l'instant (sauf à partir sur de la parallélisation de code, ce -qui est faisable, mais l'on n'est plus dans l'algorithme), mais suit preneur de -toute nouvelle idée ! - -.. _git: http://git.chimrod.com/?p=poker-evaluation.git;a=summary - - -.. |As| image:: {filename}../images/poker/as.jpeg - :width: 30 - -.. |Ad| image:: {filename}../images/poker/ad.jpeg - :width: 30 - -.. |Ac| image:: {filename}../images/poker/ac.jpeg - :width: 30 - -.. |Ah| image:: {filename}../images/poker/ah.jpeg - :width: 30 - -.. |Ks| image:: {filename}../images/poker/ks.jpeg - :width: 30 - -.. |Kc| image:: {filename}../images/poker/kc.jpeg - :width: 30 - -.. |Kd| image:: {filename}../images/poker/kd.jpeg - :width: 30 - -.. |Kh| image:: {filename}../images/poker/kh.jpeg - :width: 30 - -.. |nbsp| unicode:: 0xA0 - :trim: diff --git a/content/images/cv/model5.png b/content/images/cv/model5.png new file mode 100755 index 0000000..c80eb6f Binary files /dev/null and b/content/images/cv/model5.png differ diff --git a/content/images/poker/ac.jpeg b/content/images/poker/ac.jpeg deleted file mode 100644 index 0b26895..0000000 Binary files a/content/images/poker/ac.jpeg and /dev/null differ diff --git a/content/images/poker/ad.jpeg b/content/images/poker/ad.jpeg deleted file mode 100644 index 62efda2..0000000 Binary files a/content/images/poker/ad.jpeg and /dev/null differ diff --git a/content/images/poker/ah.jpeg b/content/images/poker/ah.jpeg deleted file mode 100644 index d158981..0000000 Binary files a/content/images/poker/ah.jpeg and /dev/null differ diff --git a/content/images/poker/as.jpeg b/content/images/poker/as.jpeg deleted file mode 100644 index 9a6765e..0000000 Binary files a/content/images/poker/as.jpeg and /dev/null differ diff --git a/content/images/poker/kc.jpeg b/content/images/poker/kc.jpeg deleted file mode 100644 index 6cc19a3..0000000 Binary files a/content/images/poker/kc.jpeg and /dev/null differ diff --git a/content/images/poker/kd.jpeg b/content/images/poker/kd.jpeg deleted file mode 100644 index b86fc41..0000000 Binary files a/content/images/poker/kd.jpeg and /dev/null differ diff --git a/content/images/poker/kh.jpeg b/content/images/poker/kh.jpeg deleted file mode 100644 index 58b95a4..0000000 Binary files a/content/images/poker/kh.jpeg and /dev/null differ diff --git a/content/images/poker/ks.jpeg b/content/images/poker/ks.jpeg deleted file mode 100644 index ca6e804..0000000 Binary files a/content/images/poker/ks.jpeg and /dev/null differ diff --git a/content/images/profile.png b/content/images/profile.png new file mode 100755 index 0000000..0353275 Binary files /dev/null and b/content/images/profile.png differ diff --git a/content/images/roi/roi_150.jpeg b/content/images/roi/roi_150.jpeg deleted file mode 100644 index 33b129a..0000000 Binary files a/content/images/roi/roi_150.jpeg and /dev/null differ diff --git a/content/images/roi/roi_75.jpeg b/content/images/roi/roi_75.jpeg deleted file mode 100644 index cd38cec..0000000 Binary files a/content/images/roi/roi_75.jpeg and /dev/null differ -- cgit v1.2.3