From 1cad4c9044d47c6653d804d7fb58581d92f96cc8 Mon Sep 17 00:00:00 2001 From: Sébastien Dailly Date: Mon, 4 Jan 2021 13:40:21 +0100 Subject: Change organisation --- content/Informatique/2012-02-18-elinks.rst | 47 ------ content/Informatique/2012-11-09-fonctionnel.rst | 190 ---------------------- content/Informatique/2013-05-23-ocamlfind_en.rst_ | 63 ------- content/Informatique/2013-05-23-ocamlfind_fr.rst | 79 --------- content/Informatique/2013-09-13-ocaml_ppx.rst | 97 ----------- 5 files changed, 476 deletions(-) delete mode 100644 content/Informatique/2012-02-18-elinks.rst delete mode 100644 content/Informatique/2012-11-09-fonctionnel.rst delete mode 100644 content/Informatique/2013-05-23-ocamlfind_en.rst_ delete mode 100644 content/Informatique/2013-05-23-ocamlfind_fr.rst delete mode 100644 content/Informatique/2013-09-13-ocaml_ppx.rst (limited to 'content/Informatique') diff --git a/content/Informatique/2012-02-18-elinks.rst b/content/Informatique/2012-02-18-elinks.rst deleted file mode 100644 index bac91ba..0000000 --- a/content/Informatique/2012-02-18-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/2012-11-09-fonctionnel.rst b/content/Informatique/2012-11-09-fonctionnel.rst deleted file mode 100644 index 06d75d0..0000000 --- a/content/Informatique/2012-11-09-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/2013-05-23-ocamlfind_en.rst_ b/content/Informatique/2013-05-23-ocamlfind_en.rst_ deleted file mode 100644 index bebab10..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:: {static}/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 deleted file mode 100644 index 254d7fe..0000000 --- a/content/Informatique/2013-05-23-ocamlfind_fr.rst +++ /dev/null @@ -1,79 +0,0 @@ -.. -*- 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 - -.. default-role:: literal - -.. figure:: {static}/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-09-13-ocaml_ppx.rst b/content/Informatique/2013-09-13-ocaml_ppx.rst deleted file mode 100644 index ef0b9c2..0000000 --- a/content/Informatique/2013-09-13-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: /images/ocaml/recursion_75.jpg - -.. figure:: {static}/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:: {static}/images/icons/face-smile.png -- cgit v1.2.3