<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Matutine</title>
    <description>logiciels libres et autodéfense intellectuelle</description>
    <link>http://matutine.cmoi.cc/</link>
    <atom:link href="http://matutine.cmoi.cc/zfeed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Mon, 04 Sep 2017 23:08:44 +0200</pubDate>
    <lastBuildDate>Mon, 04 Sep 2017 23:08:44 +0200</lastBuildDate>
    <generator>Jekyll v3.1.6</generator>
    
      <item>
        <title>Les promesses de Common Lisp (et les limitations de Python)</title>
        <description>&lt;div id=&quot;table-of-contents&quot;&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;div id=&quot;text-table-of-contents&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#org08e84f1&quot;&gt;1. Paradigme fonctionnel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#org9f28057&quot;&gt;2. Typage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#org2767412&quot;&gt;3. Performance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#org64f7590&quot;&gt;4. Environnement de développement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#org7353f12&quot;&gt;5. Fournir un exécutable ou une image&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#orgbd045c9&quot;&gt;6. Développement web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#org8cb8c7a&quot;&gt;7. Déploiement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#orgfcd8b3d&quot;&gt;8. En guise de conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Ces derniers temps  je me suis heurté aux limitations  de Python (le
language et  la &quot;plateforme&quot;)  et je  suis en  passe de  trouver les
solutions dans Common  Lisp. Vous allez voir,  les possibilités sont
accrues. Néanmoins, ce n&#39;est pas sans quelques frustrations et je ne
recommande rien  encore: je n&#39;ai  pas encore  pu tout tester,  et la
documentation doit s&#39;améliorer (heureusement, c&#39;est en cours).
&lt;/p&gt;

&lt;p&gt;
D&#39;abord quelques réponses aux  premières objections et quelques bons
liens:
&lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;vous  pouvez utiliser  Emacs,  Vim, Atom  (&lt;a href=&quot;https://atom.io/packages/atom-slime&quot;&gt;atom-slime&lt;/a&gt;) ou  &lt;a href=&quot;http://www.lispworks.com/downloads/index.html&quot;&gt;LispWorks&lt;/a&gt;
(éditeur propriétaire),&lt;/li&gt;
&lt;li&gt;qui fait aujourd&#39;hui  du CL ? (en effet,  pas grand monde ne  blogue à ce
propos):
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;déjà,   un  éventail   de   softs  à   succès  dans   l&#39;industrie:
&lt;a href=&quot;http://lisp-lang.org/success/&quot;&gt;http://lisp-lang.org/success/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;c&#39;est un language utilisé dans l&#39;IA,  à ce titre enseigné dans des
universités&lt;/li&gt;
&lt;li&gt;le métro londonien et d&#39;autres capitales (&lt;a href=&quot;http://www.siscog.eu/upload/GESTAO-DE-LISTAS/News/PDF/eclm-2013-siscog-a-story-written-in-lisp-20130602.pdf&quot;&gt;pdf&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tapoueh.org/blog/2014/05/14-pgloader-got-faster.html&quot;&gt;pgloader&lt;/a&gt; (ré-écrit de Python en CL  pour, entre autres, un gain de
performances d&#39;un facteur 30 -je répète, trente ;)),&lt;/li&gt;
&lt;li&gt;Framasoft pour  les Framanotes (&lt;a href=&quot;https://github.com/turtl&quot;&gt;Turtl&lt;/a&gt;,  backend en CL et  front en
JS),&lt;/li&gt;
&lt;li&gt;la recherche en bio-informatique (&lt;a href=&quot;https://www.youtube.com/watch?v=8X69_42Mj-g&quot;&gt;Clasp&lt;/a&gt;, LLVM et C++)&lt;/li&gt;
&lt;li&gt;les sponsors  de Quicklisp (le gestionnaire  de paquets): &lt;a href=&quot;http://rigetti.com/&quot;&gt;Rigetti&lt;/a&gt;,
&quot;on a mission to build the world&#39;s most powerful computer&quot;,&lt;/li&gt;
&lt;li&gt;les sponsors de la conférence &lt;a href=&quot;http://2017.programmingconference.org/home&quot;&gt;ELS&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;l&#39;entreprise &lt;a href=&quot;https://franz.com/&quot;&gt;FranzInc&lt;/a&gt; qui vend son implémentation AllegroCL et des
produits  en CL,  notamment  Allegrograph, sa  solution de  graphs
sémantiques,&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Les bons liens pour débuter:
&lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://lisp-lang.org/&quot;&gt;http://lisp-lang.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/CodyReichert/awesome-cl&quot;&gt;https://github.com/CodyReichert/awesome-cl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lispcookbook.github.io/cl-cookbook/&quot;&gt;https://lispcookbook.github.io/cl-cookbook/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://cl21.org/&quot;&gt;http://cl21.org/&lt;/a&gt; (on en reparlera à l&#39;occasion)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Ok, donc,  n&#39;êtes-vous pas  frustré-es comme moi,  en Python,  par les
choses suivantes:
&lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;manque de  paradigme fonctionnel (malgré  &lt;a href=&quot;https://github.com/evhub/coconut&quot;&gt;Coconut&lt;/a&gt; et autres,  qui ne
comblent pas les limitations suivantes),&lt;/li&gt;
&lt;li&gt;Python 2 VS Python 3,&lt;/li&gt;
&lt;li&gt;manque de typage, malgré my-py, encore une surcouche,&lt;/li&gt;
&lt;li&gt;Python  est lent,  on  s&#39;en rend  compte même  pour  des choses  peu
complexes,&lt;/li&gt;
&lt;li&gt;développement  pas  idéal pour  moi:
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;j&#39;en ai marre  qu&#39;au moindre changement de source  tout le serveur
de dév doive redémarrer,&lt;/li&gt;
&lt;li&gt;je peux difficilement  lancer &lt;i&gt;un&lt;/i&gt; test unitaire  précis (sauf par
un long chemin manuel sur la  ligne de commande ou une config très
personnelle d&#39;Emacs),&lt;/li&gt;
&lt;li&gt;j&#39;en ai marre de devoir redémarrer  toute mon appli pour lancer un
ou des tests,&lt;/li&gt;
&lt;li&gt;et ainsi de perdre mes essais dans ipython,&lt;/li&gt;
&lt;li&gt;de  même de  devoir tout  redémarrer  pour prendre  en compte  les
changements de code dans ipython,&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;quasi-impossibilité de  fournir un exécutable pour  une application,
sauf  peut  être pour  Windows,  et  encore  moins pour  des  applis
web. J&#39;ai essayé Nuitka, Pyinstaller, Electron pour Python… tous des
hacks  inaboutis  qui demandent  l&#39;inclusion  manuelle  de plein  de
  fichiers, et impossible de livrer des webapps (oh, peut être &lt;a href=&quot;https://briefcase.readthedocs.io/en/latest/tutorials/tutorial-1.html#use-the-same-code-but-for-the-web&quot;&gt;Briefcase&lt;/a&gt; ?).&lt;/li&gt;
&lt;li&gt;les applis webs  justement: j&#39;aimerais avoir un et  un seul language
pour toute mon appli…  et voir si ça marche bien  (sinon, back en CL
et front en JS (ou  ClojureScript) est évidemment possible, certains
font ça actuellement).  Aujourd&#39;hui on doit forcément  passer par un
framework JS, du  html (ou pugjs)  et un
language de template, ce qui fait de nouvelles choses à apprendre, à
configurer,  à  débugguer,  et  au  final donne  un  truc  moche  et
illisible: les templates jinja d&#39;une  vraie appli sont plein de tags
spéciaux, de factorisation du html avec les macros jinja, d&#39;héritage
pugjs,  de tags  pour  laisser  la place  à  Angularjs ou  Vue.js,…
&lt;a href=&quot;http://www.nagare.org/&quot;&gt;Nagare&lt;/a&gt; ?&lt;/li&gt;
&lt;li&gt;&lt;p&gt;
déploiement  de  projets  web:  encore  une  nouvelle  gageure  pour
laquelle il n&#39;existe pas de manière simple et &quot;built-in&quot;: on doit se
fabricoter des règles Fabric,  Ansible, configurer les superviseurs,
serveurs web,…
&lt;/p&gt;

&lt;p&gt;
Or oui, Common Lisp résoud (&lt;i&gt;apparemment&lt;/i&gt;) tout cela.
&lt;/p&gt;

&lt;p&gt;
Mais pas  sans contreparties:  documentation pourrie (sauf  dans les
livres, ce qui n&#39;est pas rien, et en amélioration sur quelques sites
rares),  une  entrée  en  matière  difficile  et  frustrante  (moins
maintenant avec  le Cookbook,  espérons) et certains  projets encore
trop confidentiels.
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div id=&quot;outline-container-org08e84f1&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;org08e84f1&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;1&lt;/span&gt; Paradigme fonctionnel&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-1&quot;&gt;
&lt;p&gt;
Common Lisp est  multi-paradigme, ce qui nous donne  des macros &lt;code&gt;loop&lt;/code&gt;
pas très  &quot;lispy&quot;, mais on peut  quand même faire du  fonctionnel avec
des  map, closures,  pattern  matching  (librairie), pipes  (threading
macro, librairie), …
&lt;/p&gt;

&lt;p&gt;
Ce qui était frustrant pour moi,  débutant impatient, est le manque de
généricité,  c&#39;est  à dire  le  nombre  de fonctions  différentes  qui
réalisent pourtant  la &quot;même&quot;  action mais sur  un type  différent: en
python  les  opérateurs marchent  sur  toute  sorte de  structures  de
données (&lt;code&gt;+&lt;/code&gt;, &lt;code&gt;len&lt;/code&gt;, l&#39;accès &lt;code&gt;[]&lt;/code&gt;,…), mais en CL ce
sera des fonctions  différentes… en effet, le système  objet (CLOS, CL
Object  System)  a  été  développé après  coup.  C&#39;est  donc  possible
(méthodes génériques) mais peu usité.   La librairie cl21, &quot;CL pour le
21e  siècle&quot;, redéfinit  pas mal  de fonctions  de manière  générique.
CL21 ne  fait pas l&#39;unanimité,  forcément, mais marche très  bien pour
moi :)
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-org9f28057&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;org9f28057&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;2&lt;/span&gt; Typage&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-2&quot;&gt;
&lt;p&gt;
CL  n&#39;est  ni  typé  statiquement  ni  totalement  dynamique  comme
Python. Il  calcule bien plus  d&#39;inférences de type et  nous décèle
plus  d&#39;erreurs et  de  warnings  à la  compilation  que Python  (…
forcément ?).
&lt;/p&gt;

&lt;p&gt;
Tous les détails sont dans  (eheh surprise): le papier de recherche
du compilateur  Python pour  Common Lisp, développé  à l&#39;Université
Carnegie Mellon en 1992:
&lt;a href=&quot;https://www.researchgate.net/publication/221252239_Python_compiler_for_CMU_common_Lisp&quot;&gt;https://www.researchgate.net/publication/221252239_Python_compiler_for_CMU_common_Lisp&lt;/a&gt;
où ici &quot;Python&quot;  n&#39;a rien à voir avec notre  language, c&#39;est le nom
de ce compilateur :)
&lt;/p&gt;

&lt;p&gt;
En pratique, on obtient ces erreurs et warnings à chaque fois qu&#39;on
compile une  fonction, c&#39;est à  dire souvent (dans Slime,  c&#39;est le
réflexe &lt;code&gt;C-c C-c&lt;/code&gt;).
&lt;/p&gt;

&lt;p&gt;
On peut également désassemble le  code d&#39;une fonction pour vérifier
qu&#39;on l&#39;a optimisée et de la bonne manière.
&lt;/p&gt;

&lt;p&gt;
Je                 vous                renvoie                 vers
&lt;a href=&quot;http://blog.30dor.com/2014/03/21/performance-and-types-in-lisp/&quot;&gt;http://blog.30dor.com/2014/03/21/performance-and-types-in-lisp/&lt;/a&gt;  et
au livre  &quot;&lt;a href=&quot;http://weitz.de/cl-recipes/&quot;&gt;Common Lisp Recipes&lt;/a&gt;&quot;  (paru en 2015, étonnant  mais vrai
;) &lt;a href=&quot;http://www.allitebooks.com/common-lisp-recipes/&quot;&gt;Jetez un œil ici&lt;/a&gt; puis achetez-le !).
&lt;/p&gt;

&lt;p&gt;
Petit exemple. Si on a:
&lt;/p&gt;

&lt;div class=&quot;org-src-container&quot;&gt;
&lt;pre class=&quot;src src-lisp&quot;&gt;(&lt;span style=&quot;color: #a020f0;&quot;&gt;defun&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;foo&lt;/span&gt; (x y)
  (&lt;span style=&quot;color: #a020f0;&quot;&gt;declare&lt;/span&gt; (type integer x y))
  (logxor x y))
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
&lt;code&gt;foo&lt;/code&gt;  est  reconnu  comme  une  fonction qui  prend  2  integers  en
argument:
&lt;/p&gt;

&lt;div class=&quot;org-src-container&quot;&gt;
&lt;pre class=&quot;src src-lisp&quot;&gt;(describe &#39;foo) &amp;#8942; Derived type: (FUNCTION (INTEGER INTEGER) (VALUES INTEGER &lt;span style=&quot;color: #228b22;&quot;&gt;&amp;amp;OPTIONAL&lt;/span&gt;))
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Mais un  integer c&#39;est  assez général: (&#39;scusez  je vous  commente pas
l&#39;assembleur, c&#39;est acquis)
&lt;/p&gt;

&lt;div class=&quot;org-src-container&quot;&gt;
&lt;pre class=&quot;src src-text&quot;&gt;(disassemble &#39;foo)
; disassembly for FOO
; 02B8BC8F: 4883EC18 SUB RSP, 24
; no-arg-parsing entry point
; 93: 48896C2408 MOV [RSP+8], RBP
; 98: 488D6C2408 LEA RBP, [RSP+8]
; 9D: B904000000 MOV ECX, 4
; A2: 488B0425980B1020 MOV RAX, [#x20100B98]
; AA: FFD0 CALL RAX
; AC: 488BE5 MOV RSP, RBP
; AF: F8 CLC
; B0: 5D POP RBP
; B1: C3 RET
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
On déclare un integer non signé de 32 bits:
&lt;/p&gt;

&lt;div class=&quot;org-src-container&quot;&gt;
&lt;pre class=&quot;src src-lisp&quot;&gt;(&lt;span style=&quot;color: #a020f0;&quot;&gt;defun&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;foo&lt;/span&gt; (x y)
  (&lt;span style=&quot;color: #a020f0;&quot;&gt;declare&lt;/span&gt; (type (unsigned-byte 32) x y))
  (logxor x y)) FOO

(describe &#39;foo)
[&amp;#8230;]
&lt;span style=&quot;color: #b22222;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;Derived type: (FUNCTION ((UNSIGNED-BYTE 32) (UNSIGNED-BYTE 32))&lt;/span&gt;
&lt;span style=&quot;color: #b22222;&quot;&gt;;                &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;(VALUES (UNSIGNED-BYTE 32) &amp;amp;OPTIONAL))&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
et l&#39;assembleur:
&lt;/p&gt;

&lt;div class=&quot;org-src-container&quot;&gt;
&lt;pre class=&quot;src src-text&quot;&gt;(disassemble &#39;foo)
; disassembly for FOO
; 02C9EB0F:     4831FA           XOR RDX, RDI ; no-arg-parsing entry point
;       12:     488BE5           MOV RSP, RBP
;       15:     F8               CLC
;       16:     5D               POP RBP
;       17:     C3               RET
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Ce qui va s&#39;exécuter bien plus vite.
&lt;/p&gt;


&lt;p&gt;
Bonus:
&lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;doc officielle: &lt;a href=&quot;https://common-lisp.net/project/cmucl/doc/cmu-user/compiler-hint.html&quot;&gt;https://common-lisp.net/project/cmucl/doc/cmu-user/compiler-hint.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&quot;Strong   static  type   checking  for   Functional  Common   Lisp&quot;:
&lt;a href=&quot;http://www.cs.utexas.edu/users/boyer/ftp/diss/akers.pdf&quot;&gt;http://www.cs.utexas.edu/users/boyer/ftp/diss/akers.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;


&lt;div id=&quot;outline-container-org2767412&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;org2767412&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;3&lt;/span&gt; Performance&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-3&quot;&gt;
&lt;p&gt;
Le CL compile  en code machine. Avec quelques  déclarations de type
on peut obtenir du code aussi ou plus performant que du code C.
&lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://www.iaeng.org/IJCS/issues_v32/issue_4/IJCS_32_4_19.pdf&quot;&gt;http://www.iaeng.org/IJCS/issues_v32/issue_4/IJCS_32_4_19.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;


&lt;div id=&quot;outline-container-org64f7590&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;org64f7590&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;4&lt;/span&gt; Environnement de développement&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-4&quot;&gt;
&lt;p&gt;
J&#39;utilise Emacs et Slime (il existe  Sly et des plugins pour Vim et
Atom) et le développement est très interactif. Dans le code source,
on peut recompiler une fonction à  la fois, lancer un test unitaire
à  la  fois, travailler  dans  le  REPL, recompiler  une  fonction,
l&#39;utiliser de suite, sans perdre  les variables et données du REPL,
enregistrer l&#39;état courant  de l&#39;image (afin par  exemple de garder
des  variables qui  auraient pris  du temps  à être  calculées), on
tombe dans un  débuggueur interactif lors d&#39;une  exception, on peut
(il  paraît) y  modifier des  variables ou  fonctions et  reprendre
l&#39;exécution  d&#39;où  elle s&#39;est  arrêtée  (système  de conditions  et
restarts),  on peut  inspecter la  structure de  n&#39;importe quoi  au
clavier  ou à  la souris,  on débuggue  un programme  avec &lt;code&gt;trace&lt;/code&gt;,
&lt;code&gt;step&lt;/code&gt; et cie, on débuggue une instance à
distance, &lt;a href=&quot;http://www.gigamonkeys.com/book/lather-rinse-repeat-a-tour-of-the-repl.html&quot;&gt;y
compris si elle est dans l&#39;espace&lt;/a&gt;,…
&lt;/p&gt;

&lt;p&gt;
Inspecter la source d&#39;un symbole n&#39;a jamais été aussi facile (&lt;code&gt;M-.&lt;/code&gt;
sous Slime),  sachant que  je ne  me suis  jamais installé  ça sous
Emacs,  à la  fois  par  manque de  volonté,  d&#39;informations et  de
facilité, alors que je développe  des extensions en Elisp… De même,
inclure dans  son environnement  la version en  développement d&#39;une
librairie est super facile, et donc  de contribuer à des trucs dont
on n&#39;aurait  pas eu l&#39;idée  en Python, car  il suffit de  la mettre
dans &lt;code&gt;~/quicklisp/local-projects/&lt;/code&gt; et elle  est chargée en priorité
par  Quicklisp  (mais  on  peut  aussi  utiliser  l&#39;équivalent  des
virtualenvs avec &lt;a href=&quot;https://github.com/fukamachi/qlot&quot;&gt;Qlot&lt;/a&gt;). D&#39;ailleurs,  ce gestionnaire de paquets est
encore différent de ce qu&#39;on connaît par ailleurs, notamment par le
fait  qu&#39;il  se   charge  de  tester  que   toutes  les  librairies
disponibles ne rentrent pas en conflit entre elles.
&lt;/p&gt;

&lt;p&gt;
C&#39;est  un environnement différent,  qu&#39;il faut se  laisser le
temps d&#39;apprivoiser.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-org7353f12&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;org7353f12&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;5&lt;/span&gt; Fournir un exécutable ou une image&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-5&quot;&gt;
&lt;p&gt;
C&#39;est une fonctionnalité de base  des implémentations CL. J&#39;ai très
facilement essayé  ça, c&#39;est une  commande à lancer, même  pour des
applis web (qui contiennent leur serveur web).
&lt;/p&gt;

&lt;p&gt;
Un  exécutable  standalone  pèsera  quelques  Mo.   On  peut  aussi
partager des scripts avec &lt;a href=&quot;https://github.com/roswell/roswell&quot;&gt;Roswell&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
De plus, &lt;a href=&quot;https://common-lisp.net/project/ecl/&quot;&gt;ECL&lt;/a&gt; (Embeddable Common Lisp)  compile en C et peut fournir
un   simple  exécutable,   pour  toutes   plateformes,  y   compris
Android. &lt;a href=&quot;http://common-lisp.net/project/armedbear/&quot;&gt;ABCL&lt;/a&gt; est pour la JVM, et il y en a d&#39;autres.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;


&lt;div id=&quot;outline-container-orgbd045c9&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgbd045c9&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;6&lt;/span&gt; Développement web&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-6&quot;&gt;
&lt;p&gt;
Le serveur  par défaut  est Hunchentoot  (un mix  de serveur  et de
framework),  Clack  est une  abstraction  (WSGI  chez Python)  pour
pouvoir changer  de serveur (Hunchentoot,  &lt;a href=&quot;https://github.com/fukamachi/woo&quot;&gt;Woo&lt;/a&gt; (basé sur  libev, de
Nodejs), &lt;a href=&quot;https://github.com/orthecreedence/wookie&quot;&gt;Wookie&lt;/a&gt; (asynchrone),…).
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://quickdocs.org/caveman/&quot;&gt;Caveman&lt;/a&gt;  et   &lt;a href=&quot;https://github.com/eudoxia0/lucerne&quot;&gt;Lucerne&lt;/a&gt;  sont   des  frameworks  avec   une  approche
traditionnelle.
&lt;/p&gt;

&lt;p&gt;
On peut  utiliser des templates à  la Django avec Djula  ou du lisp
avec &lt;a href=&quot;https://github.com/ruricolist/spinneret&quot;&gt;Spinneret&lt;/a&gt;, cl-who ou d&#39;autres.
&lt;/p&gt;

&lt;p&gt;
Parenscript est LE compilateur de CL vers Javascript.
&lt;/p&gt;

&lt;p&gt;
Ansi, on peut très bien développer un  backend en CL et le front en
ce qu&#39;on  veut. C&#39;est l&#39;approche  de Turtl, de &lt;a href=&quot;https://github.com/cicakhq/potato&quot;&gt;Potato&lt;/a&gt;  (similaire à
Slack, front en ClojureScript), de &lt;a href=&quot;https://github.com/dimitri/pgcharts&quot;&gt;pgchart&lt;/a&gt; (oh, c&#39;est une appli web
&quot;standalone&quot;),…
&lt;/p&gt;

&lt;p&gt;
Est-ce que tout  ce monde marche ensemble ? En  partie oui, dans le
vénérable  Weblocks. Son  site actuel  est  une honte,  mais je  le
mentionne car il  est toujours maintenu et un gars  est en train de
le revitaliser  dans sa  branche de développement.   Il a  créé une
nouvelle doc  sur un nouveau site  (&lt;a href=&quot;http://40ants.com/weblocks/&quot;&gt;http://40ants.com/weblocks/&lt;/a&gt;) et
s&#39;est  lancé depuis  quelques mois  dans une  refonte du  code. Son
tutoriel (le fameux todomvc) marche,  et est facile et parfaitement
lisible.
&lt;/p&gt;

&lt;p&gt;
Enfin, avec un déploiement facile, ce pourrait être la panacée.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-org8cb8c7a&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;org8cb8c7a&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;7&lt;/span&gt; Déploiement&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-7&quot;&gt;
&lt;p&gt;
On a déjà la création d&#39;exécutables &quot;standalones&quot; et d&#39;images.
&lt;/p&gt;

&lt;p&gt;
On  a  des outils  pour  faciliter  encore le  processus  (&lt;a href=&quot;https://github.com/Shinmera/deploy&quot;&gt;deploy&lt;/a&gt;).
Certains frameworks permettent d&#39;héberger  plusieurs sites web dans
une  image (Weblocks,  &lt;a href=&quot;https://github.com/Shirakumo/radiance&quot;&gt;Radiance&lt;/a&gt;,  Hunchentoot ?).  Weblocks ou  des
librairies gèrent les dépendances JS pour nous.
&lt;/p&gt;

&lt;p&gt;
     On peut se connecter à une image qui tourne à distance.
&lt;/p&gt;

&lt;p&gt;
Le site  de Caveman donne  un moyen  pour du déploiement  &quot;à chaud&quot;
(hot swaping,  déploiement sans  interruption de  service).
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;https://ceramic.github.io/&quot;&gt;Ceramic&lt;/a&gt; nous permet de mettre des web apps sur Electron.
&lt;/p&gt;

&lt;p&gt;
J&#39;ai déjà eu besoin de pouvoir faire ça en Python. Ça existe en CL,
et je me demande bien s&#39;il existe une plateforme aussi complète.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgfcd8b3d&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgfcd8b3d&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;8&lt;/span&gt; En guise de conclusion&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-8&quot;&gt;
&lt;p&gt;
Je  soutiens que  la plaie  de l&#39;écosystème  CL est  son manque  de
documentation, de documentation &lt;i&gt;attractive&lt;/i&gt; et plus globalement de
communication.     Heureusement,   ça    bouge   de    ce   côté-là
(lisp-lang.org, le Cookbook, refonte de la doc de référence,…).
&lt;/p&gt;

&lt;p&gt;
Le language en lui-même contient des inconsistances et trucs un peu
vieillots, mais ce peut être corrigé par des librairies (cl21 ou de
plus spécialisées moins intrusives) (et… on s&#39;habitue).  Mais étant
donné toutes les  fonctionnalités du language et  de la plateforme,
il nous paraît carrément valoir le  coup de ne pas se précipiter et
de nous familiariser avec ce monde, un peu alien.
&lt;/p&gt;

&lt;p&gt;
On  reviendra, peut  être,  pour comparer  plus spécifiquement  les
écosystèmes CL et Python. En attendant:
&lt;/p&gt;

&lt;div class=&quot;org-src-container&quot;&gt;
&lt;pre class=&quot;src src-text&quot;&gt;sudo apt-get install sbcl
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
ou  voyez   &lt;a href=&quot;https://shinmera.github.io/portacle/&quot;&gt;Portacle&lt;/a&gt;,  environnement  de  développement   portable  et
multiplateforme (Emacs + SBCL + Quicklisp + Slime + Git).
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
        <pubDate>Mon, 04 Sep 2017 00:00:00 +0200</pubDate>
        <link>http://matutine.cmoi.cc/2017/09/04/les-promesses-de-common-lisp.html</link>
        <guid isPermaLink="true">http://matutine.cmoi.cc/2017/09/04/les-promesses-de-common-lisp.html</guid>
        
        <category>dev</category>
        
        
      </item>
    
      <item>
        <title>Navigation dans un grand fichier yaml, indentation de code par blocs d&#39;indentation: indent-tools pour Emacs</title>
        <description>&lt;p&gt;
&lt;a href=&quot;https://gitlab.com/emacs-stuff/indent-tools&quot;&gt;Indent-tools&lt;/a&gt; est  un nouveau paquet  Emacs qui fonctionne  par niveaux
d&#39;indentation, ce qui est parfait pour du yaml, python, jade ou autre:
&lt;/p&gt;
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;navigation par blocs: prochain bloc du même niveau, niveau parent, etc&lt;/li&gt;
&lt;li&gt;indentation&lt;/li&gt;
&lt;li&gt;commenter, effacer, plier le bloc courant, le paragraphe, etc&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
On peut utiliser un mode  &quot;mineur&quot;, des raccourcis clavier pour chaque
action,  ou  bien  invoquer  &lt;a href=&quot;https://matutine.gitlab.io/2015/03/11/les-hydres-vont-enchanter-votre-exp-C3-A9rience-avec-emacs.html&quot;&gt;une  hydre à  plusieurs  têtes&lt;/a&gt;,  qui  non
seulement  affiche un  petit  menu des  actions  possibles mais  aussi
permet d&#39;appliquer plusieurs actions d&#39;affilée avec une seule touche.
&lt;/p&gt;


     &lt;p&gt;
       Navigation:
       &lt;/p&gt;
&lt;img src=&quot;https://gitlab.com/emacs-stuff/indent-tools/raw/master/demo.gif&quot; &lt;/img&gt;

     &lt;p&gt;
       Indentation:
       &lt;/p&gt;

&lt;img src=&quot;https://gitlab.com/emacs-stuff/indent-tools/raw/master/demo-indent.gif&quot; &lt;/img&gt;

&lt;p&gt;
Pour l&#39;installer, il  faut avoir configuré le dépôt  &lt;a href=&quot;http://melpa.org/&quot;&gt;Melpa&lt;/a&gt; et utiliser
le gestionnaire de paquets d&#39;Emacs, &lt;a href=&quot;http://wikemacs.org/wiki/Package.el&quot;&gt;package.el&lt;/a&gt;:
&lt;/p&gt;

&lt;pre class=&quot;example&quot;&gt;
Alt-x package-install RET indent-tools RET
&lt;/pre&gt;

&lt;p&gt;
(un  rafraichissement avec  &lt;code&gt;M-x  package-refresh-contents&lt;/code&gt; peut  être
utile).
&lt;/p&gt;

&lt;p&gt;
C&#39;est la  première version, il  y aura des limitations  voire quelques
bugs, n&#39;hésitez pas les remonter sur le dépôt Gitlab.
&lt;/p&gt;
</description>
        <pubDate>Tue, 20 Dec 2016 00:00:00 +0100</pubDate>
        <link>http://matutine.cmoi.cc/2016/12/20/navigation-dans-un-grand-fichier-yaml-indentation-de-code-par-blocs-d-indentation-indent-tools-pour-emacs.html</link>
        <guid isPermaLink="true">http://matutine.cmoi.cc/2016/12/20/navigation-dans-un-grand-fichier-yaml-indentation-de-code-par-blocs-d-indentation-indent-tools-pour-emacs.html</guid>
        
        <category>emacs</category>
        
        
      </item>
    
      <item>
        <title>Installer lxc et lxd sur Debian Jessie</title>
        <description>&lt;p&gt;
LXC,  pour  &quot;linux  containers&quot;,  est  un  système  de  virtualisation
similaire à  Docker (Docker était  initialement basé sur LXC),  et lxd
est  une sorte  de  superviseur, un  outil de  plus  haut niveau  pour
LXC. Je vous laisse lire la  doc, mais c&#39;est génial. Comparé à Docker,
lxc/lxd:
&lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;est plus  orienté &quot;tout dans une  VM&quot;. LXD fait tourner  une distro,
tout ce qu&#39;on fait  dans une VM ou sur une vrai  machine, on peut le
faire  dans une  image LXD.   À  l&#39;inverset les  images Docker  sont
censées   être  plus   petites,  dédiées   à  une   tâche  et   sont
éphémères. Voir &lt;a href=&quot;https://www.stgraber.org/2016/03/11/lxd-2-0-introduction-to-lxd-112/&quot;&gt;Why LXD ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;peut  se souvenir  de l&#39;état  de la  machine virtuelle,  des données
enregistrées&lt;/li&gt;
&lt;li&gt;possède une api go et python&lt;/li&gt;
&lt;li&gt;permet de migrer des images, en live, d&#39;un server à un autre&lt;/li&gt;
&lt;li&gt;possède bien moins de doc et les retours, positifs ou négatifs, sont
rares.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Étant &lt;a href=&quot;https://www.reddit.com/r/programming/comments/5bf32b/docker_in_production_a_history_of_failure/&quot;&gt;plus  que prudent sur Docker&lt;/a&gt;,  je m&#39;intéresse de près  à lxd (je
n&#39;ai encore rien mis en prod, pas d&#39;avis sur ça).
&lt;/p&gt;

&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://linuxcontainers.org/lxc/introduction/&quot;&gt;https://linuxcontainers.org/lxc/introduction/&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href=&quot;https://linuxcontainers.org/lxd/&quot;&gt;https://linuxcontainers.org/lxd/&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href=&quot;https://www.stgraber.org/2016/03/11/lxd-2-0-blog-post-series-012/&quot;&gt;blog du mainteneur&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;
  &lt;strong&gt;Update:&lt;/strong&gt; on peut maintenant &lt;a href=&quot;https://www.stgraber.org/2017/01/18/lxd-on-debian/&quot;&gt;installer LXD dans Debian avec un Snap&lt;/a&gt;. Un paquet Debian est aussi &lt;a href=&quot;https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=768073&quot;&gt;en cours&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
LXD est  développé par  Canonical. La dernière  version est  dispo sur
Ubuntu 16.04. Sur  Debian, on a la v1  de LXC, il n&#39;y a  pas encore de
paquet pour  LXD, lequel  nécessite lxc  v2 qui  est présent  dans les
backports de Jessie.  On va compiler LXD, ce qui  est rapide.
&lt;/p&gt;

&lt;p&gt;
On commence par installer les dépôts backport:
&lt;/p&gt;
&lt;pre class=&quot;example&quot;&gt;
echo &quot;deb http://ftp2.fr.debian.org/debian/ jessie-backports main&quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/additional-repositories.list
&lt;/pre&gt;

&lt;p&gt;
On installe les dépendances:
&lt;/p&gt;
&lt;pre class=&quot;example&quot;&gt;
sudo apt-get -t jessie-backports install lxc-dev lxc golang-go squashfs-tools xz-utils
&lt;/pre&gt;

&lt;p&gt;
On clone le projet lxd:
&lt;/p&gt;
&lt;pre class=&quot;example&quot;&gt;
git clone git://github.com/lxc/lxd
cd lxd
&lt;/pre&gt;

&lt;p&gt;
À partir  de là  il suffit  de suivre  le README.  Pour info,  il nous
suffit de :
&lt;/p&gt;

&lt;pre class=&quot;example&quot;&gt;
mkdir -p ~/go
export GOPATH=~/go
go get github.com/lxc/lxd
cd $GOPATH/src/github.com/lxc/lxd
make
&lt;/pre&gt;

&lt;p&gt;
et voilà.
&lt;/p&gt;

&lt;p&gt;
Maintenant, amusons-nous: &lt;a href=&quot;https://linuxcontainers.org/lxd/getting-started-cli/&quot;&gt;https://linuxcontainers.org/lxd/getting-started-cli/&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Nous  pouvons  télécharger  ou  créer des  &lt;b&gt;images&lt;/b&gt;,  en  prendre  des
&lt;b&gt;snapshots&lt;/b&gt;,  avoir la  main sur  un  shell, inclure  des fichiers  du
système hôte, accéder au réseau, configurer des &lt;b&gt;profils&lt;/b&gt;, choisir son
système  de  fichiers,  interagir  avec un  &lt;b&gt;démon  LXD&lt;/b&gt;  à  distance,
utiliser son  &lt;b&gt;API rest&lt;/b&gt;, …  Facile. Mais qui  a des retours  pour une
mise en prod, un déploiement d&#39;application Python/Django ?
&lt;/p&gt;
</description>
        <pubDate>Thu, 08 Dec 2016 00:00:00 +0100</pubDate>
        <link>http://matutine.cmoi.cc/2016/12/08/installer-lxc-et-lxd-sur-debian-jessie.html</link>
        <guid isPermaLink="true">http://matutine.cmoi.cc/2016/12/08/installer-lxc-et-lxd-sur-debian-jessie.html</guid>
        
        <category>dev</category>
        
        
      </item>
    
      <item>
        <title>GNU Guix dans un environnement de supercalculateurs</title>
        <description>&lt;div id=&quot;table-of-contents&quot;&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;div id=&quot;text-table-of-contents&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#orgheadline1&quot;&gt;1. Comment perdre du temps à compiler et à déployer des logiciels&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#orgheadline2&quot;&gt;2. La compilation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#orgheadline3&quot;&gt;3. Les dépendances système&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#orgheadline4&quot;&gt;4. Les conflits de versions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#orgheadline5&quot;&gt;5. Interopérabilité&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#orgheadline6&quot;&gt;6. La gestion de paquets fonctionnelle avec GNU Guix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#orgheadline7&quot;&gt;7. Isolé, mais partagé&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#orgheadline8&quot;&gt;8. Liberté de l&#39;utilisateur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#orgheadline9&quot;&gt;9. Partager le store entre stations de travail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#orgheadline10&quot;&gt;10. Guix en tant que plateforme pour logiciels scientifiques&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
(Ce  billet est  la  traduction  (à 90%  complète  et francisée)  d&#39;&lt;a href=&quot;http://elephly.net/posts/2015-04-17-gnu-guix.html&quot;&gt;un
article de Rekado paru en avril 2015&lt;/a&gt;.)
&lt;/p&gt;

&lt;p&gt;
Je travaille  en tant  qu&#39;administrateur système  dans un  institut de
recherche dans  un environnement  informatique très  diversifié.  Nous
avons deux supercalculateurs en clusters (un sur CentOS et l&#39;autre sur
Ubuntu) avec environs 100 nœuds chacuns  et des douzaines de postes de
travail sous  GNU/Linux. Une de  mes tâches  est de m&#39;assurer  que les
utilisateurs    peuvent   faire    tourner    leurs   programmes    de
bio-informatique, à  la fois sur  leurs postes  de travail et  sur les
clusters. Seuls quelques outils et librairies de cette discipline sont
assez populaires pour  avoir été packagés pour CentOS  ou Ubuntu, donc
généralement on  doit construire  les applications (avec  toutes leurs
dépendances) sur les plateformes cibles.
&lt;/p&gt;

&lt;div id=&quot;outline-container-orgheadline1&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgheadline1&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;1&lt;/span&gt; Comment perdre du temps à compiler et à déployer des logiciels&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-1&quot;&gt;
&lt;p&gt;
En théorie, compiler  un logiciel n&#39;est pas très  difficile.  Une fois
que les fichiers  d&#39;en-tête ont été installés sur la  machine hôte, la
compilation ne consiste  plus qu&#39;à configurer le build  avec un script
de  configuration et  de lancer  GNU  make avec  les flags  appropriés
(c&#39;est  une  hypothèse  régulièrement  violée par  les  programmes  de
bio-informatique, mais laissons ça de côté pour le moment).
&lt;/p&gt;

&lt;p&gt;
Néanmoins, il  y a des  problèmes pratiques qui  deviennent clairement
embêtants  dans   un  environnement  partagé  avec   un  grand  nombre
d&#39;utilisateurs.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgheadline2&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgheadline2&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;2&lt;/span&gt; La compilation&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-2&quot;&gt;
&lt;p&gt;
Compiler directement  sur la machine  cible n&#39;est une option  que dans
les cas les plus simples. Quand le système de build ou les dépendances
sont plus  compliqués, les administrateurs  système sont tentés  de ne
lancer les grosses  opérations qu&#39;une seule fois. La  plupart du monde
s&#39;accorderait à dire que les  gestionnaires de paquets sont une grande
avancée  par  rapport à  la  compilation:  les  étapes de  build  sont
formalisées dans des sortes de recettes qui peuvent être exécutées par
des outils  de build  de façon  reproductible. Pour  mettre à  jour un
paquet on modifie  seulement sa recette. Les  gestionnaires de paquets
sont une bonne chose.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgheadline3&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgheadline3&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;3&lt;/span&gt; Les dépendances système&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-3&quot;&gt;
&lt;p&gt;
Les programmes non triviaux qui  ont été buildés et liés dynamiquement
sur  une  machine  avec  un  ensemble de  librairies  et  de  fichiers
d&#39;en-tête à une version donnée ne  peuvent vraiment marcher que sur un
système  qui aura  les mêmes  libraires dans  les mêmes  versions. Nos
gestionnaires  de  paquets  habituels permettent  aux  mainteneurs  de
spécifier des  plages de versions,  mais les binaires produits  sur la
machine de build ne vont marcher  que sous les contraintes imposées au
moment  du build.   Pour  faire  tourner un  paquet  à  la fois  sous,
mettons, CentOS  6.5 et CentOS 7.1,  il doit avoir été  construit dans
les deux  environnements et on  doit récupérer un binaire  pour chaque
plateforme.
&lt;/p&gt;

&lt;p&gt;
Il y a des moyens pour émuler un environnement de build différent (par
exemple &lt;code&gt;mockbuild&lt;/code&gt; sous Fedora), mais on  ne peut ignorer le fait que
des programmes liés dynamiquement construits pour une sorte de système
ne vont  marcher que sur  cette sorte de  système. On peut  changer au
runtime  les librairies  qui  vont être  dynamiquement chargées,  mais
c&#39;est   un  hack   qui   remet  un   problème   des  mainteneurs   aux
utilisateurs.  Les  programmes avec &lt;code&gt;LD_LIBRARY_PATH&lt;/code&gt; ne  sont pas une
solution, tout comme ne le  sont pas les liens statiques, l&#39;équivalent
de copier des bouts de librairies au moment du build.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgheadline4&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgheadline4&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;4&lt;/span&gt; Les conflits de versions&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-4&quot;&gt;
&lt;p&gt;
Les   bibliothèques  logicielles   ou   les   applications  qui   sont
pré-installées ou pré-packagées  dans un système ne le  sont peut être
pas dans la  version dont l&#39;utilisateur dit avoir  besoin.  Prenons un
utilisateur qui souhaite  la dernière version de GCC  pour compiler du
code qui utilise des fonctionnalités arrivées dans C++11 (par exemple,
les fonctions anonymes).  Le support  complet de C++11 est arrivé dans
GCC  4.8.1,  pourtant sur  CentOS  6.5  seule  la version  4.4.7  était
disponible dans les dépôts. Peut  être que l&#39;administrateur système ne
peut pas  mettre à  jour GCC  globalement. Ou  peut être  que d&#39;autres
utilisateurs  sur le  même système  partagé ont  besoin de  la version
4.4.7 (pour  la compatibilité de  bugs par exemple).  Il n&#39;y a  pas de
moyen facile pour satisfaire tout le monde, donc un admin sys pourrait
abandonner  et  laisser  les  utilisateurs  construire  leurs  propres
paquets  dans  leur  répertoire  personnel, au  lieu  de  résoudre  le
problème.
&lt;/p&gt;

&lt;p&gt;
Par contre, compiler GCC est une tâche énorme pour un utilisateur, ils
ne devraient  vraiment pas  avoir à le  faire. On a  déjà dit  que les
gestionnaires de paquets sont une bonne chose. Pourquoi leur interdire
ces bénéfices ?  Les techniques  de gestion de paquets traditionnelles
ne  sont  pas faites  pour  installer  plusieurs versions  d&#39;une  même
application. RPM, par exemple, permet d&#39;utiliser une base de donnée de
paquets locale, mais &lt;code&gt;yum&lt;/code&gt; ne marche pas avec plusieurs sources. […]
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgheadline5&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgheadline5&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;5&lt;/span&gt; Interopérabilité&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-5&quot;&gt;
&lt;p&gt;
Un admin sys qui  décide de packager une application en  RPM […] et de
maintenir un  dépôt logiciel se  retrouve le  bec dans l&#39;eau  quand un
utilisateur  lui demande  d&#39;installer cette  application sur  un poste
Ubuntu. Il  y a bien quelques  moyens pour transformen un  RPM en DEB,
avec des  degrés divers de réussite,  mais ça paraît dingue  de devoir
tout  constamment convertir  ou  reconstruire quand  le logiciel,  ses
dépendances et son mode de déploiement n&#39;ont pas changés.
&lt;/p&gt;

&lt;p&gt;
Et que  se passe-t-il lorsqu&#39;un  nouveau venu de Slackware  pointe son
nez ? Ou quelqu&#39;un d&#39;Arch Linux ?  Bien sûr, en tant qu&#39;admin sys vous
pourriez refuser de  prendre en charge autre chose que  CentOS 7.1, au
diable ces utilisateurs. On dirait  bien que c&#39;est cette politique qui
prévaut  chez  les admin  sys,  pour  des  raisons de  facilité  et/ou
pratiques, mais  je considère que ça  n&#39;aide pas et que  c&#39;est même en
quelque sorte oppressant.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgheadline6&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgheadline6&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;6&lt;/span&gt; La gestion de paquets fonctionnelle avec GNU Guix&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-6&quot;&gt;
&lt;p&gt;
Heureusement,  je ne  suis  pas le  seul à  considérer  la gestion  de
paquets traditionnelle inapte à  un certain nombre d&#39;usages. Plusieurs
projets ont pour but d&#39;améliorer et de simplifier le déploiement et la
gestion de logiciels, notamment un sur  lequel je vais me pencher à la
suite   de  cet   article.   En   tant  qu&#39;amateur   de  programmation
fonctionnelle, du language Scheme et  de logiciel libre, j&#39;ai été très
intrigué par ma découverte de &lt;a href=&quot;https://www.gnu.org/software/guix/&quot;&gt;GNU  Guix&lt;/a&gt;, un gestionnaire de paquets au
paradigme fonctionnel, écrit en  &lt;a href=&quot;https://www.gnu.org/software/guile/&quot;&gt;Guile Scheme&lt;/a&gt;, le language d&#39;extension
du &lt;a href=&quot;https://www.gnu.org/&quot;&gt;système GNU&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
En programmation fonctionnelle pure,  une fonction produit toujours la
même  sortie lorsqu&#39;elle  est  appellée avec  les  mêmes variables  en
entrée.  Ça  permet des  optimisations intéressantes, mais  surtout ça
rend  &lt;i&gt;possible&lt;/i&gt;  et  dans  certains  cas  &lt;i&gt;facile&lt;/i&gt;  de  réfléchir  au
comportement d&#39;une fonction. Elle ne dépend pas de variables globales,
elle n&#39;a pas d&#39;effets  de bord, et sa valeur de  sortie peut être mise
en cache étant donné qu&#39;il est  certain qu&#39;elle ne change pas (avec la
même entrée).
&lt;/p&gt;

&lt;p&gt;
La gestion  de paquets  &quot;fonctionnelle&quot; introduit  ce concept  dans la
construction et  le déploiement de  logiciels.  L&#39;état global  dans un
système  équivaut  à  une  installation  système  d&#39;un  paquet,  d&#39;une
bibliothèque ou d&#39;un  fichier d&#39;en-tête.  Les effets de  bord sont les
changements  dans   l&#39;environnement  du   système  ou   dans  certains
répertoires tels  que &lt;code&gt;/usr/bin&lt;/code&gt;.   Refuser un  état global  revient à
rejeter  la  hiérarchie habituelle  du  système  de fichiers  pour  le
déploiement  et  d&#39;utiliser un  &lt;code&gt;chroot&lt;/code&gt;  minimal  pour construire  le
logiciel. L&#39;introduction du manuel de  Guix décrit leur approche comme
suit:
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;
Le terme &quot;fontionnel&quot; renvoie à un concept spécifique de management de
paquets.  Dans Guix,  le build  et l&#39;installation  du paquet  sont vus
comme  une fonction,  au sens  mathématique du  terme. Cette  fonction
prend  des  arguments  en  entrée,  comme des  scripts  de  build,  un
compilateur,  des bibliothèques,  et retourne  un paquet  installé. En
tant que  fonction pure, son résultat  de sortie ne dépend  que de ses
entrées. Par exemple, elle ne peut  pas se référer à des programmes ou
à des   scripts   qui   n&#39;aient   pas  été   explicitement   donnés   en
paramètres. Une  fonction de build  produit toujours le  même résultat
avec un  même ensemble d&#39;entrées.  Elle ne  peut en aucun  cas altérer
l&#39;environnement  du  système, par  exemple  elle  ne peut  pas  créer,
modifier  ou  supprimer  des  fichiers en  dehors  de  son  répertoire
d&#39;installation. Ceci est possible en  faisant tourner les processus de
build dans  des environnement isolés (ou  &quot;conteneurs&quot;), dans lesquels
seuls leurs entrées explicites sont visibles.
&lt;/p&gt;

&lt;p&gt;
Le  résultat de  ces fonctions  est mis  en cache  dans le  système de
fichiers,  dans  un  répertoire   spécial  appelé  &quot;le  magasin&quot;  (the
store). Chaque paquet est installé dans son propre répertoire, dans le
store (par défaut &quot;/gnu/store&quot;). Le nom du répertoire contient un hash
de toutes  les entrées du  paquet, donc changer un  paramètre d&#39;entrée
crée un autre répertoire.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgheadline7&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgheadline7&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;7&lt;/span&gt; Isolé, mais partagé&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-7&quot;&gt;
&lt;p&gt;
Remarquez   que  les   sorties   des  paquets   sont  toujours   liées
dynamiquement. Les  bibliothèques sont  référencées dans  les binaires
avec leur chemin de &lt;i&gt;store&lt;/i&gt;  en entier (avec &lt;i&gt;runpath&lt;/i&gt;). Ces résultats
de fonctions, les  paquets, ne sont pas  des répertoires monolithiques
et auto-contenants comme on peut en trouver sous MacOS.
&lt;/p&gt;

&lt;p&gt;
Chaque paquet  construit est mis  en cache  dans le store,  lequel est
partagé par tous les utilisateurs du système. Par contre, ce qu&#39;il y a
dans le store  n&#39;a par défaut pas d&#39;influence  sur l&#39;environnement des
utilisateurs,   aucun  fichier   ne   vient   polluer  &lt;code&gt;/usr/bin&lt;/code&gt;   ou
&lt;code&gt;/usr/lib/&lt;/code&gt;. Chaque changement est restreint à &lt;code&gt;/gnu/store&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;
Guix  propose par  conséquent des  profils d&#39;utilisateur  pour mapper
l&#39;environnement d&#39;un utilisateur à ce qu&#39;il  y a dans le store, lequel
servant  de cache  empêche de  compiler deux  fois la  même chose.  Un
profil n&#39;est  rien de plus  qu&#39;une &quot;forêt&quot; de liens  symboliques vers
des  éléments  du  store.   En  ajoutant une  autre  couche  de  liens
symboliques, Guix  permet aux utilisateurs de  passer simplement d&#39;une
version de leur  profil à une précédente, permettant  de remonter dans
le temps.
&lt;/p&gt;

&lt;p&gt;
Chaque configuration d&#39;utilisateur est complètement isolée des autres,
ce  qui permet  donc  à différents  utilisateurs  d&#39;avoir une  version
différente  de  GCC.   Mieux,  un simple  utilisateur  pourrait  avoir
plusieurs profils avec  chacun une version de GCC et  passer de l&#39;un à
l&#39;autre.
&lt;/p&gt;

&lt;p&gt;
Guix prend  le management  de paquets fonctionnel  au sérieux,  donc à
part le noyau et le hardware de la machine il n&#39;y a pas de dépendances
à  des   &quot;variables  globales&quot;   (des  bibliothèques  ou   headers  du
système). Ça veut aussi dire que le Guix store est rempli avec l&#39;arbre
entier   des  dépendances,   jusqu&#39;aux  headers   du  kernel   et  aux
bibliothèques  C.   Par conséquent,  les  programmes  d&#39;un Guix  store
peuvent tourner  sur des distributions GNU/Linux  différentes; un Guix
store partagé me permet d&#39;utiliser les mêmes logiciels sur un poste de
travail sous Fedora et sur des clusters Ubuntu et CentOS 6.5.
&lt;/p&gt;

&lt;p&gt;
Cela veut  dire que &lt;b&gt;le  programme ne  doit être packagé  qu&#39;une seule
fois&lt;/b&gt;.   Et puisque  les recettes  de packaging  sont écrites  dans un
langage  très  déclaratif  construit  sur  Scheme,  le  packaging  est
étonnament simple  (et dans ce cas  c&#39;est une joie de  travailler avec
Scheme).
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgheadline8&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgheadline8&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;8&lt;/span&gt; Liberté de l&#39;utilisateur&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-8&quot;&gt;
&lt;p&gt;
Guix libère  les utilisateurs  des décisions  de déploiement  de leurs
admin sys  en leur  donnant le pouvoir  de construire  leurs logiciels
dans le store,  un répertoire isolé du reste du  système, en utilisant
des  recettes simples.   Les administrateurs  ont seulement  besoin de
configurer et de  lancer le démon Guix, la pièce  centrale tournant en
root. Ce démon écoute les requêtes émanant de l&#39;outil Guix en ligne de
commande, qui  n&#39;a pas besoin  de permissions root. Ce  dernier permet
aux utilisateurs de  gérer leurs profils, de passer  d&#39;un génération à
l&#39;autre,   de   construire  et   d&#39;installer   des   paquets  via   le
démon. Celui-là gère le store, évalue  les expressions de build et met
les résultats en cache, puis met  à jour la forêt de liens symboliques
pour mettre à jour le profil utilisateur.
&lt;/p&gt;

&lt;p&gt;
Les utilisateurs sont enfin libres  de gérer leurs logiciels comme ils
le souhaitent, avec un degré de précison qu&#39;ils ne pouvaient atteindre
qu&#39;avec des compilations manuelles.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgheadline9&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgheadline9&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;9&lt;/span&gt; Partager le store entre stations de travail&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-9&quot;&gt;
&lt;p&gt;
Guix n&#39;est  pas voué à être  utilisé de manière centralisée.  Le démon
est censé tourner  sur chaque système en root et  écouter les requêtes
RPC de ses  utilisateurs locaux. Dans un environnement  de clusters et
postes de travail  cette approche demande un certain  effort pour être
efficace et sécurisée.
&lt;/p&gt;

&lt;img src=&#39;http://elephly.net/images/posts/2015/guix-shared.svg&#39;, title=&#39;&#39; &lt;/img&gt;

&lt;p&gt;
À l&#39;inverse nous avons choisi de faire tourner le démon dans un unique
serveur dédié, qui écrit les profils  utilisateurs et le store sur une
partition en  NFS. Les nœuds  du cluster et  les postes de  travail la
montent en lecture seule. Du  coup les utilisateurs perdent le confort
de modifier  leurs profils directement  sur leur poste de  travail ou
sur les nœuls du cluster (parce qu&#39;ils n&#39;ont pas d&#39;installation locale
ni du  client Guix  ni du démon,  et parce qu&#39;ils  n&#39;ont pas  accès en
écriture),  mais en  contrepartie  leur profils  sont accessibles  de
n&#39;importe où.  Ils n&#39;ont  qu&#39;à se  connecter au  serveur Guix,  où ils
peuvent installer ce qu&#39;ils veulent ou revenir à un point antérieur de
leur  configuration. (donc  je trouve  que Guix  gagnerait à  ce qu&#39;on
puisse lancer des commandes RPC en ssh,  de manière à ce qu&#39;on ne soit
plus obligés de se connecter au serveur explicitement).
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgheadline10&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgheadline10&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;10&lt;/span&gt; Guix en tant que plateforme pour logiciels scientifiques&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-10&quot;&gt;
&lt;p&gt;
Depuis l&#39;hiver  2014 j&#39;ai commencé  à packager des logiciels  pour GNU
Guix, qui a donc pendant ce temps accumulé une bonne part de logiciels
classique  ou  obscures  &lt;a href=&quot;http://git.savannah.gnu.org/cgit/guix.git/tree/gnu/packages/bioinformatics.scm&quot;&gt;de  bioinformatique&lt;/a&gt;.  Une  liste  de  paquets
disponibles avec Guix, mise à jour tous les jours, est &lt;a href=&quot;https://www.gnu.org/software/guix/package-list.html&quot;&gt;disponible ici&lt;/a&gt;.
Nous avons aussi des  modules Python pour l&#39;informatique scientifique,
ainsi que des languages de programmation tels que R et Julia.
&lt;/p&gt;

&lt;p&gt;
Je trouve  que Guix  est une très  bonne plateforme  pour informatique
scientifique  dans un  environnement  hétérogène. Le  projet suit  les
lignes  directrices d&#39;un  système  d&#39;exploitation  libre (&lt;a href=&quot;https://gnu.org/distros/free-system-distribution-guidelines.html&quot;&gt;Free  System
Distribution Guidelines&lt;/a&gt;) […]. Pour les  logiciels qui imposent plus de
restrictions d&#39;usage ou  de distribution (comme quand  est utilisée la
licence Artistic  licence au  lieu de  la nouvelle  Clarified Artistic
licence, ou quand l&#39;usage commercial est prohibé par la licence), Guix
permet d&#39;utiliser des  modules en-dehors de l&#39;installation  de base en
utilisant la  variable &lt;code&gt;GUIX_PACKAGE_PATH&lt;/code&gt;. Et comme  les paquets sont
de simples variables Scheme dans des modules Scheme, il est trivial de
rajouter des paquets à la distribution en utilisant cette variable.
&lt;/p&gt;

&lt;p&gt;
Si vous souhaitez en apprendre plus sur GNU Guix je vous recommande de
regarder l&#39;excellente &lt;a href=&quot;https://www.gnu.org/software/guix/&quot;&gt;page du projet&lt;/a&gt;.  N&#39;hésitez pas à me contacter si
vous  souhaitez  en apprendre  plus  sur  l&#39;empaquètement de  logiciel
scientifique  pour  Guix.  Ce  n&#39;est  pas  dur  et nous  pouvons  tous
bénéficier  à  joindre  nos   forces  pour  adopter  cette  plateforme
utilisable,  fiable, hackable  et libératrice  pour de  l&#39;informatique
scientifique faite de logiciels libres.
&lt;/p&gt;

&lt;p&gt;
La communauté  Guix est très  sympathique, aidante et  réactive. Venez
donc visiter  &lt;a href=&quot;https://webchat.freenode.net/?channels=#guix&quot;&gt;le canal IRC  #guix sur  Freenode&lt;/a&gt;, où vous  me trouverez
sous le pseudo &quot;rekado&quot;.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
        <pubDate>Mon, 26 Sep 2016 00:00:00 +0200</pubDate>
        <link>http://matutine.cmoi.cc/2016/09/26/gnu-guix-dans-un-environnement-de-supercalculateurs.html</link>
        <guid isPermaLink="true">http://matutine.cmoi.cc/2016/09/26/gnu-guix-dans-un-environnement-de-supercalculateurs.html</guid>
        
        <category>technologie</category>
        
        
      </item>
    
      <item>
        <title>Témoignage: passer de Vim et SublimeText à Emacs, avec la configuration Spacemacs</title>
        <description>&lt;p&gt;
&lt;i&gt;Un témoignage &lt;a href=&quot;https://www.reddit.com/r/emacs/comments/509aov/my_experience_of_using_spacemacs_for_just_under_a/&quot;&gt;paru sur reddit&lt;/a&gt;…&lt;/i&gt;
&lt;/p&gt;

&lt;p&gt;
En tant qu&#39;utilisateur de vim et  sublime dans le monde académique (je
fais  un peu  de statistiques,  un peu  de développement,  beaucoup de
latex),  j&#39;ai toujours  voulu quelque  chose de  mieux. Vim  permet la
modification rapide de  fichiers distants, ce qui  permet d&#39;abattre du
travail d&#39;admin  sys. Mais récemment  je me suis mis  au développement
web et  à Python  pour le traitement  de données,  donc inévitablement
j&#39;ai  senti la  douleur d&#39;utiliser  vim  comme un  IDE incomplet  pour
travailler efficacement. Sublime m&#39;a plutôt bien servi, il est rapide,
intuitif, a un très bon support  de latex avec le plugin latextools et
il a  des fonctionnalités d&#39;IDE  pour le html,  css, js et  python (on
peut être productif  dès son installation). En plus  il est extensible
en Python !  La configuration est très facile avec le fichiers json.
&lt;/p&gt;

&lt;p&gt;
Néanmoins,  j&#39;ai envie  de quelque  chose  de mieux,  qui combine  les
avantages  indéniables  de vim  avec  un  éditeur plus  moderne  comme
Sublime.
&lt;/p&gt;

&lt;p&gt;
Donc  j&#39;ai essayé  emacs, trois  fois.  La  première fois,  j&#39;ai juste
essayé la version de base du système. Trop à apprendre, j&#39;ai arrêté au
bout  de deux  jours. Les  raccourcis  claviers ne  sont vraiment  pas
intuitifs !
&lt;/p&gt;

&lt;p&gt;
La seconde fois, je suis tombé sur un starter kit destiné aux sciences
sociales, mais  il était frustrant car  il y avait des  problèmes avec
certains paquets. J&#39;ai quand même bien appris. Je l&#39;ai utilisé environ
une semaine et je suis revenu à vim + sublime.
&lt;/p&gt;

&lt;p&gt;
Et pour cette fois-ci, un  collègue m&#39;a recommandé spacemacs. Méfiant,
j&#39;ai enquêté  autour de moi. La  plupart des gens disaient  genre nan,
commence avec l&#39;emacs de base, pas avec un starter kit. D&#39;autres m&#39;ont
encouragé à essayer  puisque ça marchait bien pour  eux (certains sont
des développeurs  de plus  de 20  ans d&#39;expérience  donc ça  me paraît
assez crédible).
&lt;/p&gt;

&lt;p&gt;
J&#39;ai essayé la  version standard de spacemacs. Et bim  ! Tout roulait,
parfait. Mais je  voulais quelques chose de plus simple,  donc je suis
passé à la version de base.
&lt;/p&gt;

&lt;p&gt;
Après  quelques   jours  de  tests,   encouragé  et  informé   par  la
documentation et  la communauté,  j&#39;ai eu plus  de 500  lignes d&#39;emacs
lisp dans mon fichier de config, lignes que je comprends.
&lt;/p&gt;

&lt;p&gt;
Ces trois jours ont été incroyablement éclairants pour moi: maintenant
un  ancien utilisateur  de  vim  et sublime.  J&#39;ai  déjà configuré  un
environnement de développement bien mieux  que ce que j&#39;avais sous vim
ou sublime. Et  je continue à explorer, en espérant  donner un jour en
retour à la communauté emacs.
&lt;/p&gt;

&lt;p&gt;
Liens:
&lt;/p&gt;
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://spacemacs.org/&quot;&gt;http://spacemacs.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;des  startes kits:  &lt;a href=&quot;http://wikemacs.org/wiki/Starter_Kits&quot;&gt;http://wikemacs.org/wiki/Starter_Kits&lt;/a&gt; (spacemacs
est axé  sur l&#39;édition modale.   Si vous  voulez un bon  starter kit
&quot;normal&quot;, essayez Prelude)&lt;/li&gt;
&lt;li&gt;dev python: &lt;a href=&quot;http://wikemacs.org/wiki/Python&quot;&gt;wiki&lt;/a&gt;, &lt;a href=&quot;https://elpy.readthedocs.io/en/latest/&quot;&gt;elpy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Wed, 31 Aug 2016 00:00:00 +0200</pubDate>
        <link>http://matutine.cmoi.cc/2016/08/31/temoignage-passer-de-vim-et-sublimetext-a-emacs-avec-la-configuration-spacemacs.html</link>
        <guid isPermaLink="true">http://matutine.cmoi.cc/2016/08/31/temoignage-passer-de-vim-et-sublimetext-a-emacs-avec-la-configuration-spacemacs.html</guid>
        
        <category>emacs</category>
        
        
      </item>
    
      <item>
        <title>Nouveau quotidien national sans pub Le Progres Social</title>
        <description>&lt;p&gt;
Un  truc  de ouf:  un  nouveau  journal,  un quotidien,  à  couverture
nationale (normalement à la rentrée), sans publicité, qui n&#39;appartient
pas à un  millionnaire, et de gauche.  Ça nous  arrive, aujourd&#39;hui en
2016 à l&#39;aire d&#39;internet.
&lt;/p&gt;

&lt;img src=&#39;http://leprogressocial.fr/squelettes/images/banner.jpg&#39;, title=&#39;Le Progrès social, nouveau quotidien&#39; &lt;/img&gt;

&lt;blockquote&gt;
&lt;p&gt;
Militants associatifs, syndicaux (Solidaires, CGT, FSU…) ou politiques
engagés dans  la construction  du progrès  social et  dans l’éducation
populaire, nous avons  constaté qu’il manquait un  quotidien qui porte
réellement nos  points de vue  et rende  compte de nos  actions. C’est
pourquoi nous avons  décidé d’associer nos compétences  avec celles de
journalistes proches de nos idées pour vivre cette aventure.
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
Il a été créé en mars 2016,  en plein mouvement social. Il paraîtra en
4 pages la semaine, 8 le samedi, et en couleur.
&lt;/p&gt;

&lt;p&gt;
On peut découvrir les premiers numéros en pdf: &lt;a href=&quot;http://leprogressocial.fr/IMG/pdf/pdf_nume_ro_ze_ro_a.0.pdf&quot;&gt;numéro 0A&lt;/a&gt; et &lt;a href=&quot;http://leprogressocial.fr/IMG/pdf/nume_ro_ze_ro_b.pdf&quot;&gt;numéro 0B&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Et           on          peut           évidemment          s&#39;abonner:
&lt;a href=&quot;http://leprogressocial.fr/squelettes/abonnement.html&quot;&gt;http://leprogressocial.fr/squelettes/abonnement.html&lt;/a&gt;  20€   par  mois,
essayons !
&lt;/p&gt;

&lt;p&gt;
À soutenir !
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://leprogressocial.fr/&quot;&gt;http://leprogressocial.fr/&lt;/a&gt;
&lt;/p&gt;
</description>
        <pubDate>Wed, 24 Aug 2016 00:00:00 +0200</pubDate>
        <link>http://matutine.cmoi.cc/2016/08/24/nouveau-quotidien-national-sans-pub-le-progres-social.html</link>
        <guid isPermaLink="true">http://matutine.cmoi.cc/2016/08/24/nouveau-quotidien-national-sans-pub-le-progres-social.html</guid>
        
        <category>journaux</category>
        
        
      </item>
    
      <item>
        <title>Une commande locate interactive dans Emacs avec counsel et ivy-mode</title>
        <description>&lt;p&gt;
Sur notre système GNU/Linux on a  la commande &lt;code&gt;locate&lt;/code&gt; qui nous permet
de chercher  des fichiers sur tout  le système. Emacs a  une interface
simple à locate: &lt;code&gt;M-x locate&lt;/code&gt;  qui demande une expression régulière
puis on obtient les résultats dans un nouveau buffer.
&lt;/p&gt;

&lt;p&gt;
Avec &lt;code&gt;counsel-locate&lt;/code&gt; on  peut voir les résultats  dans le mini-buffer
de manière interactive, appliquer des actions sur un ou des résultats,
et quelques trucs en plus.
&lt;/p&gt;

&lt;p&gt;
Quand  on tape  &lt;code&gt;counsel-locate&lt;/code&gt; on  obtient un  mini-buffer de  cette
sorte:
&lt;/p&gt;

&lt;img src=&#39;http://oremacs.com/download/counsel-locate-1.png&#39;/&gt;&lt;/a&gt;

&lt;p&gt;
On retrouve des indications explicites qui ressemblent fortement à une
&lt;a href=&quot;https://matutine.gitlab.io/2015/03/11/les-hydres-vont-enchanter-votre-exp-C3-A9rience-avec-emacs.html&quot;&gt;hydra&lt;/a&gt;. C&#39;est &lt;code&gt;C-o&lt;/code&gt; qui fait apparaître  le menu hydra. On peut choisir
et  définir  le type  d&#39;action  à  effectuer  pour ouvrir  le  fichier
(touches &lt;code&gt;wsa&lt;/code&gt;,  ouvrir avec emacs,  avec xdg-open, avec  une commande
personnalisée), et d&#39;autres. Je vous laisse découvrir et vous reporter
à l&#39;article de l&#39;auteur:
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://oremacs.com/2015/07/02/counsel-locate/&quot;&gt;http://oremacs.com/2015/07/02/counsel-locate/&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Pour  installer ça,  si vous  avez déjà  ajouté la  source de  paquets
&lt;a href=&quot;https://melpa.org/#/getting-started&quot;&gt;MELPA&lt;/a&gt;, y&#39;a plus qu&#39;à
&lt;/p&gt;

&lt;pre class=&quot;example&quot;&gt;
M-x package-install RET counsel RET
&lt;/pre&gt;

&lt;p&gt;
&lt;code&gt;counsel&lt;/code&gt; est  une collection  de commandes  Emacs qui  utilisent Ivy,
lequel est  un système de  complétion interactif (comme &lt;code&gt;ido&lt;/code&gt;  mais un
peut plus complet maintenant).
&lt;/p&gt;

&lt;p&gt;
Comme alternative  j&#39;utilisais aussi &lt;a href=&quot;https://github.com/emacs-helm/helm/wiki/Locate&quot;&gt;helm-locate&lt;/a&gt; qui  marche très bien
(fournie avec helm), avec une différence sur la regexp (on doit écrire
une  vraie regexp  alors  qu&#39;avec counsel  on  peut écrire  différents
termes séparés  par un  espace, par  exemple &quot;python.*pdf&quot;  ou &quot;python
pdf&quot;)  et helm-locate  propose  moins d&#39;actions  possibles (aucune  en
fait, juste d&#39;ouvrir un fichier  en gardant la session).  Pour définir
quel programme utiliser pour chaque extension, j&#39;utilise &lt;a href=&quot;https://melpa.org/#/openwith&quot;&gt;openwith&lt;/a&gt; (sur
melpa).
&lt;/p&gt;

&lt;p&gt;
Et voilà, encore une chose plus sympa  à faire dans Emacs que dans son
shell !
&lt;/p&gt;
</description>
        <pubDate>Tue, 23 Aug 2016 00:00:00 +0200</pubDate>
        <link>http://matutine.cmoi.cc/2016/08/23/une-commande-locate-interactive-dans-emacs-avec-counsel-et-ivy-mode.html</link>
        <guid isPermaLink="true">http://matutine.cmoi.cc/2016/08/23/une-commande-locate-interactive-dans-emacs-avec-counsel-et-ivy-mode.html</guid>
        
        <category>emacs</category>
        
        
      </item>
    
      <item>
        <title>L&#39;appli Somebody: faire lire ses textos par quelqu&#39;un d&#39;autre</title>
        <description>&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/iz13HMsvb6o&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;
C&#39;est trop drôle. Et pertinent.
&lt;/p&gt;

&lt;p&gt;
Le lien de l&#39;&quot;appli&quot; (&lt;a href=&quot;http://somebodyapp.com/&quot;&gt;http://somebodyapp.com/&lt;/a&gt;) explique que «malgré les
objectifs  ridicules,  un  message  sur quatre  a  été  transmis,  des
dizaines de  milliers de personnes l&#39;ont  utilisée quotidiennement. La
prochaine étape aurait  logiquement été de créer une startup  et de se
développer (&quot;on our user&#39;s dedication&quot;).  Ou bien… de choisir une date
de  sortie et  de  finir cette  appli  de la  même  manière qu&#39;elle  a
commencée: une expérience à grande échelle d&#39;art publique, marquant un
moment particulier dans le temps.
&lt;/p&gt;

&lt;p&gt;
Quelqu&#39;un  a  disparu (l&#39;appli  s&#39;appelle  &quot;Somebody&quot;)  du monde  pour
toujours. Mais vous  êtes toujours là. Vos  amis aussi. Et il  y a des
étrangers partout.»
&lt;/p&gt;

&lt;p&gt;
signé: Miranda July
&lt;/p&gt;
</description>
        <pubDate>Thu, 18 Feb 2016 00:00:00 +0100</pubDate>
        <link>http://matutine.cmoi.cc/2016/02/18/l-appli-somebody-faire-lire-ses-textos-par-quelqu-un-d-autre.html</link>
        <guid isPermaLink="true">http://matutine.cmoi.cc/2016/02/18/l-appli-somebody-faire-lire-ses-textos-par-quelqu-un-d-autre.html</guid>
        
        <category>technologie</category>
        
        
      </item>
    
      <item>
        <title>Stakhanov chez Volkswagen</title>
        <description>&lt;p&gt;
&lt;i&gt;Ce texte, que je trouve particulièrement pertinent et drôle, est paru dans le Monde  Diplomatique de décembre 2015 et  est également lisible &lt;a href=&quot;http://www.monde-diplomatique.fr/2015/12/RIMBERT/54374&quot;&gt;sur leur site&lt;/a&gt;. Il est signé Pierre Rimbert&lt;/i&gt;.
&lt;/p&gt;

&lt;p&gt;
Joseph Staline était méchant. Cette  affirmation intrépide, que nul ou
presque n’a osé formuler ces quarante dernières années, est au cœur du
documentaire  Apocalypse :  Staline,  réalisé par  Isabelle Clarke  et
Daniel Costelle  (France 2,  3 novembre  2015). Les  images colorisées
s’accompagnent d’un commentaire étincelant de finesse sur le dirigeant
soviétique : &lt;i&gt;« Chacun peut  redouter ses méthodes derrière ses petits
yeux qui se plissent quand il esquisse un sourire. »&lt;/i&gt;
&lt;/p&gt;

&lt;p&gt;
Au  nombre des  méfaits du  dictateur figure  la mise  en place  d’une
économie fictive où des statistiques truquées surpassent les objectifs
inatteignables.  &lt;i&gt;«  Staline fait marcher  sa machine de  propagande à plein  régime pour  fabriquer des  héros du  travail, comme  le mineur
Alexis Stakhanov »&lt;/i&gt;, explique le  narrateur, mais &lt;i&gt;« tous ces exploits
stakhanovistes  sont de  pures inventions  »&lt;/i&gt;.  Et  le commentaire  de
détailler les  rouages du  système :  &lt;i&gt;« L’industrie  soviétique entre dans  l’ère  du  mensonge.   Affolés   par  la  terreur,  ouvriers  et directeurs  d’usine,  menacés s’ils  ne  remplissent  pas les  quotas, mentent  sur tout.  Sur  la  qualité, la  quantité,  la fiabilité,  le rendement.   »&lt;/i&gt;  Le  spectateur comprend  qu’une  telle  organisation,
fondée sur  la falsification  et l’effroi,  ne saurait  prospérer sous
d’autres  cieux ;  en  tout cas  pas  «  chez nous  »,  où la  science
économique plutôt que le méchant Staline guide la production.
&lt;/p&gt;

&lt;p&gt;
Du moins jusqu’à ce que le  hasard du calendrier produise, une semaine
plus tard, un  étonnant télescopage.  &lt;i&gt;« Volkswagen, la  culture de la
peur au  cœur du scandale  »&lt;/i&gt;, titre Le  Monde (10 novembre  2015). La
marque allemande a truqué ses  moteurs diesel afin qu’ils passent avec
succès les tests  de pollution. &lt;i&gt;« Au sein du  groupe, les témoignages se multiplient  ; face à  des objectifs irréalisables,  les ingénieurs
préféraient  tricher qu’affronter  la colère  du patron  »&lt;/i&gt;, écrit  le
quotidien.
&lt;/p&gt;

&lt;p&gt;
Si  l’on  ne  peut  comparer  les affres  subies  par  le  travailleur
soviétique à  celles du technicien  allemand, les récits  recueillis à
Wolfsburg,   siège   du   constructeur   automobile,   suggèrent   que
l’irrationalité  managériale  peut  exister  dans  d’autres  pays  que
l’URSS. &lt;i&gt;« Volkswagen était dirigé  comme une monarchie absolue, où ce qui  n’est pas  autorisé  ne  peut pas  arriver,  confie  au Monde  un familier du  groupe. On donne  des instructions sur des  objectifs, et personne n’ose  dire que  ce n’est tout  simplement pas  possible, pas
faisable techniquement.  »&lt;/i&gt; Dans  cette entreprise, complète  un grand
patron  allemand,   &lt;i&gt;«  les  porteurs  de   mauvaises  nouvelles  sont
guillotinés, même s’ils ne sont pas responsables »&lt;/i&gt;.
&lt;/p&gt;

&lt;p&gt;
L’Europe n’échappe pas à la  manie du déni bureaucratique consistant à
supprimer  les  problèmes  qu’on  ne souhaite  pas  résoudre.  L’Union
européenne devait  imposer en 2017  des tests de  pollution automobile
sur route plutôt qu’en laboratoire.  Problème : aucun moteur diesel ne
les aurait  passés. Assiégés par  les lobbyistes, les  régulateurs des
pays membres et  la Commission ont décidé fin octobre,  au beau milieu
du  scandale Volkswagen,  de relever  le seuil  d’émission des  oxydes
d’azote de&amp;#x2026; 110  %. Comme le rappelle  Wolfgang Münchau, chroniqueur
au  Financial Times  (9 novembre  2015),  &lt;i&gt;« ces  polluants tuent.  Le nombre  de décès  imputés  aux émissions  des  moteurs diesel  dépasse largement celui des tués sur la route. On peut ainsi interpréter cette réglementation  technique  de  l’Union   comme  la  décision  de  tuer
plusieurs milliers de personnes »&lt;/i&gt;.
&lt;/p&gt;

&lt;p&gt;
Bientôt dans « Apocalypse : Bruxelles » ?
&lt;/p&gt;
</description>
        <pubDate>Tue, 22 Dec 2015 00:00:00 +0100</pubDate>
        <link>http://matutine.cmoi.cc/2015/12/22/stakhanov-chez-volkswagen.html</link>
        <guid isPermaLink="true">http://matutine.cmoi.cc/2015/12/22/stakhanov-chez-volkswagen.html</guid>
        
        <category>journaux</category>
        
        
      </item>
    
      <item>
        <title>Emacs aussi a un gestionnaire de paquets !</title>
        <description>&lt;div id=&quot;table-of-contents&quot;&gt;
&lt;h2&gt;Table of Contents&lt;/h2&gt;
&lt;div id=&quot;text-table-of-contents&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#orgheadline1&quot;&gt;1. Utilisation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#orgheadline2&quot;&gt;2. Lister les paquets et les synchroniser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#orgheadline3&quot;&gt;3. Cask et Pallet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#orgheadline4&quot;&gt;4. Use-package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#orgheadline5&quot;&gt;5. Limitations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#orgheadline6&quot;&gt;6. Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
Si vous ne saviez pas qu&#39;Emacs possède un système d&#39;extensions, il est
temps de vous mettre à la page  et de vous créer une config aux petits
oignons !
&lt;/p&gt;

&lt;div id=&quot;outline-container-orgheadline1&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgheadline1&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;1&lt;/span&gt; Utilisation&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-1&quot;&gt;
&lt;p&gt;
Si vous avez  Emacs 24.1 ou supérieur, vous avez  déjà &lt;b&gt;package.el&lt;/b&gt; et
vous pouvez de suite essayer les quelques commandes suivantes (et pour
toutes les versions, nous avons &lt;a href=&quot;http://wikemacs.org/wiki/El-get&quot;&gt;&lt;b&gt;el-get&lt;/b&gt;&lt;/a&gt;):
&lt;/p&gt;
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;code&gt;M-x package-refresh-content&lt;/code&gt; pour le &quot;apt-get update&quot;,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;M-x package-list-packages&lt;/code&gt;  pour tout lister:  paquets disponibles,
installés ou pas,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;M-x package-install RET  nom-d&#39;un-paquet RET&lt;/code&gt; pour faire  ce que de
doit, avec TAB-completion (par exemple, &lt;b&gt;magit&lt;/b&gt; ou &lt;b&gt;evil&lt;/b&gt;),&lt;/li&gt;
&lt;li&gt;&lt;code&gt;M-x  list-packages&lt;/code&gt; (un  petit raccourci)  pour tout  lister, &lt;code&gt;C-s&lt;/code&gt;
(comme  d&#39;hab)  pour chercher  un  paquet,  &lt;code&gt;d&lt;/code&gt;  pour le  marquer  à
désinstaller, &lt;code&gt;i&lt;/code&gt; pour le marquer à installer, &lt;code&gt;U&lt;/code&gt; pour tout marquer
à  mettre à  jour, &lt;code&gt;u&lt;/code&gt;  pour &quot;unmark&quot;  le paquet,  et &lt;code&gt;x&lt;/code&gt;  pour tout
exécuter.&lt;/li&gt;
&lt;li&gt;il est conseillé de tout initialiser au démarrage avec la ligne
&lt;code&gt;(package-initialize)&lt;/code&gt; dans votre &lt;a href=&quot;http://wikemacs.org/wiki/User&#39;s_Initialization_File&quot;&gt;fichier de démarrage&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Maintenant, comme avec  apt, il faut prendre en compte  les sources de
paquets. Par  défaut on  a accès  à la  base de  GNU ELPA  (Emacs Lisp
Package Archive)  mais il y  en a bien  plus dans MELPA  et Marmalade,
qu&#39;on va donc ajouter:
&lt;/p&gt;
&lt;div class=&quot;org-src-container&quot;&gt;

&lt;pre class=&quot;src src-lisp&quot;&gt;(&lt;span style=&quot;color: #a020f0;&quot;&gt;require&lt;/span&gt; &#39;&lt;span style=&quot;color: #008b8b;&quot;&gt;package&lt;/span&gt;)
(add-to-list &#39;package-archives
             &#39;(&lt;span style=&quot;color: #8b2252;&quot;&gt;&quot;melpa&quot;&lt;/span&gt; . &lt;span style=&quot;color: #8b2252;&quot;&gt;&quot;https://melpa.org/packages/&quot;&lt;/span&gt;) t)
(add-to-list &#39;package-archives &#39;(&lt;span style=&quot;color: #8b2252;&quot;&gt;&quot;marmalade&quot;&lt;/span&gt; . &lt;span style=&quot;color: #8b2252;&quot;&gt;&quot;http://marmalade-repo.org/packages/&quot;&lt;/span&gt;))
(package-initialize)
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Notez  qu&#39;on  les   a  ajoutées  après  &quot;require   package&quot;  et  avant
l&#39;initialisation.
&lt;/p&gt;

&lt;p&gt;
C&#39;est tout ce que vous avez besoin de savoir.
&lt;/p&gt;

&lt;p&gt;
Liens:
&lt;/p&gt;
&lt;ul class=&quot;org-ul&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_node/emacs/Package-Installation.html#Package-Installation&quot;&gt;documentation officielle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;pour chercher des paquets: &lt;a href=&quot;http://melpa.org/#/&quot;&gt;http://melpa.org/#/&lt;/a&gt; (et &lt;a href=&quot;http://slugelisp.ahungry.com/&quot;&gt;slugelisp&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgheadline2&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgheadline2&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;2&lt;/span&gt; Lister les paquets et les synchroniser&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-2&quot;&gt;
&lt;p&gt;
Maintenant  voyons  comment sauvegarder  la  liste  des paquets  qu&#39;on
installe.  Ça nous  servira d&#39;abord à garder une trace,  et à partager
facilement  sa configuration  entre plusieurs  PCs, par  exemple entre
maison  et bureau,  dès lors  qu&#39;on a  placé son  fichier d&#39;init  sous
gestion de version  (et créé un dépôt public où  vous voulez, ou privé
sur &lt;a href=&quot;https://gitlab.com/&quot;&gt;gitlab&lt;/a&gt;).
&lt;/p&gt;

&lt;p&gt;
Certains   ne  font   pas   la  fine   bouche   mais  s&#39;assurent   une
reproductibilité  à  100%  en commitant  intégralement  le  répertoire
&lt;code&gt;~/.emacs.d/elpa/&lt;/code&gt;, où sont installés les paquets.
&lt;/p&gt;

&lt;p&gt;
Sinon, on écrit un petit peu d&#39;elisp:
&lt;/p&gt;
&lt;div class=&quot;org-src-container&quot;&gt;

&lt;pre class=&quot;src src-lisp&quot;&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;;; &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;Rafraichir la liste&lt;/span&gt;
(&lt;span style=&quot;color: #a020f0;&quot;&gt;when&lt;/span&gt; (not package-archive-contents)
  (package-refresh-contents))

&lt;span style=&quot;color: #b22222;&quot;&gt;;; &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;Ma liste de paquets&lt;/span&gt;
(&lt;span style=&quot;color: #a020f0;&quot;&gt;defvar&lt;/span&gt; &lt;span style=&quot;color: #a0522d;&quot;&gt;my-packages&lt;/span&gt; &#39;(
   org
   evil
   un-autre-paquet
  )
  &lt;span style=&quot;color: #8b2252;&quot;&gt;&quot;A list of packages to ensure are installed at launch.&quot;&lt;/span&gt;)

&lt;span style=&quot;color: #b22222;&quot;&gt;;; &lt;/span&gt;&lt;span style=&quot;color: #b22222;&quot;&gt;Tout installer&lt;/span&gt;
(&lt;span style=&quot;color: #a020f0;&quot;&gt;dolist&lt;/span&gt; (p my-packages)
  (&lt;span style=&quot;color: #a020f0;&quot;&gt;when&lt;/span&gt; (not (package-installed-p p))
    (package-install p)))
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Petites notes de lisp: l&#39;apostrophe =&#39;(un deux)= est un raccourci pour
créer une  liste: &lt;code&gt;(list un deux)&lt;/code&gt;.   Le reste se comprend  non ? Dans
&lt;code&gt;package-installed-p&lt;/code&gt;, le &lt;code&gt;-p&lt;/code&gt; final veut dire &quot;predicate&quot;, donc cette
fonction va retourner true ou false (&lt;code&gt;t&lt;/code&gt; ou &lt;code&gt;nil&lt;/code&gt;).
&lt;code&gt;dolist&lt;/code&gt; est pour boucler sur la liste… ce n&#39;est pas trop fonctionnel,
on aurait pu utiliser map, ok.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgheadline3&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgheadline3&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;3&lt;/span&gt; Cask et Pallet&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-3&quot;&gt;
&lt;p&gt;
Une autre  possibilité est d&#39;utiliser  &lt;a href=&quot;http://mx.kelsin.net/2014/03/06/install-cask-and-pallet-to-manage-emacs-packages/&quot;&gt;Cask et Pallet&lt;/a&gt;  (équivalents de
bundler pour  Ruby?) pour écrire la  liste &lt;a href=&quot;https://emacs.stackexchange.com/questions/10252/how-do-cask-package-el-and-projectile-work-together&quot;&gt;dans un fichier&lt;/a&gt;  à part, et
pour &lt;b&gt;mettre  à jour automatiquement  ce fichier&lt;/b&gt; quand on  manipule des
paquets dans Emacs.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgheadline4&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgheadline4&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;4&lt;/span&gt; Use-package&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-4&quot;&gt;
&lt;p&gt;
Le but  de &lt;a href=&quot;https://github.com/jwiegley/use-package&quot;&gt;use-package&lt;/a&gt; est  de regrouper la configuration  d&#39;un paquet
dans  une  seule  déclaration,  et   de  gagner  en  performances  (le
chargement et la config du paquet se fera en asynchrone).
&lt;/p&gt;

&lt;p&gt;
Cette fonction est  de John Wiegley, l&#39;auteur également  de &lt;a href=&quot;http://wikemacs.org/wiki/Eshell&quot;&gt;eshell&lt;/a&gt;, le
système de compta  ledger et plein d&#39;autres choses.  Il est le &lt;b&gt;nouveau
maintainer d&#39;Emacs&lt;/b&gt; depuis quelques semaines.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgheadline5&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgheadline5&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;5&lt;/span&gt; Limitations&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-5&quot;&gt;
&lt;p&gt;
Malgré  toutes les  bonnes choses,  &lt;code&gt;package.el&lt;/code&gt; n&#39;est  pas encore  un
apt-get pour Emacs. Melpa contient  les dernières versions des paquets
(melpa utilise leur  branche master), ce qui peut  créer des problèmes
d&#39;incompatibilité. Pour remédier  à ce problème on  peut maintenant se
baser sur melpa-stable, qui utilise les tags des paquets:
&lt;/p&gt;

&lt;div class=&quot;org-src-container&quot;&gt;

&lt;pre class=&quot;src src-lisp&quot;&gt;(add-to-list &#39;package-archives
             &#39;(&lt;span style=&quot;color: #8b2252;&quot;&gt;&quot;melpa-stable&quot;&lt;/span&gt; . &lt;span style=&quot;color: #8b2252;&quot;&gt;&quot;https://stable.melpa.org/packages/&quot;&lt;/span&gt;))
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;
Mais tous les paquets  ne sont pas dans le dépôt  stable, et il arrive
que certains dépendent  sur des versions récentes qu&#39;on  ne trouve pas
dans melpa-stable… Ceci dit, au quotidien,  ça va, mais… on peut avoir
un peu de config à faire quand on n&#39;en a pas envie. Personnellement je
mets peu souvent  mes extensions à jour,  et quand je le  fais je dois
renommer   un  ou   deux  paquets   et   en  installer   un  ou   deux
manuellement. Ça va.
&lt;/p&gt;

&lt;p&gt;
Certains &lt;a href=&quot;https://www.reddit.com/r/emacs/comments/3uen2w/shell_script_to_manage_emacs_packages_as_git/&quot;&gt;font autrement&lt;/a&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div id=&quot;outline-container-orgheadline6&quot; class=&quot;outline-2&quot;&gt;
&lt;h2 id=&quot;orgheadline6&quot;&gt;&lt;span class=&quot;section-number-2&quot;&gt;6&lt;/span&gt; Conclusion&lt;/h2&gt;
&lt;div class=&quot;outline-text-2&quot; id=&quot;text-6&quot;&gt;
&lt;p&gt;
En conclusion: utilisez &lt;code&gt;package.el&lt;/code&gt; :)
&lt;/p&gt;

&lt;p&gt;
Et si vous  ne savez pas  quoi installer (à  part &lt;a href=&quot;http://orgmode.org/&quot;&gt;org&lt;/a&gt;, &lt;a href=&quot;http://magit.vc/&quot;&gt;magit&lt;/a&gt;,  &lt;a href=&quot;http://wikemacs.org/index.php/Evil&quot;&gt;evil&lt;/a&gt;, &lt;a href=&quot;http://wikemacs.org/wiki/Ido&quot;&gt;ido&lt;/a&gt;,
&lt;a href=&quot;http://wikemacs.org/wiki/Smex&quot;&gt;smex&lt;/a&gt;,  &lt;a href=&quot;https://github.com/bbatsov/projectile&quot;&gt;projectile&lt;/a&gt;,   &lt;a href=&quot;http://wikemacs.org/wiki/Helm&quot;&gt;helm&lt;/a&gt;,  helm-projectile,  move-text   et  &lt;a href=&quot;http://wikemacs.org/wiki/Elscreen&quot;&gt;elscreen&lt;/a&gt;
n&#39;est-ce pas ?), restez dans le  coin on en discute une prochaine fois
!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
        <pubDate>Tue, 08 Dec 2015 00:00:00 +0100</pubDate>
        <link>http://matutine.cmoi.cc/2015/12/08/emacs-aussi-a-un-gestionnaire-de-paquets.html</link>
        <guid isPermaLink="true">http://matutine.cmoi.cc/2015/12/08/emacs-aussi-a-un-gestionnaire-de-paquets.html</guid>
        
        <category>emacs</category>
        
        
      </item>
    
  </channel>
</rss>
