My previous post about setting up SLIME explained how to get it to start an implementaiton balzingly fast, basically by creating a custom image for each implementation, where SLIME’s backend, swank, is already properly loaded. I didn’t bother to create those images in a special place, but made them the default image for starting each implementation, because having swank at hand at any time is just very valuable.
Still, my setup was a bit quick & dirty, so I tried to understand just enough about Elisp to be able to make it clean. There’s no change in how you generate the Lisp images, so consult the previous post about that.
First, you load SLIME:
(load "slime")
Then, you define the various implementations (this is where it’s way cleaner than before…):
(defun swank-start (port-file encoding)
(format "(swank:start-server %S :coding-system \"%S\")\n" port-file encoding))
(setq slime-lisp-implementations
`((sbcl ("sbcl") :init swank-start)
(cmucl ("lisp") :init swank-start :coding-system iso-latin-1-unix)
(clisp ("clisp") :init swank-start)
(ecl ("ecl") :coding-system iso-latin-1-unix)
,@slime-lisp-implementations))
Our swank-start function just starts the backend server, assuming swank is already properly loaded.
Then we setup SLIME:
(slime-setup '(inferior-slime slime-autodoc slime-banner slime-xref-browser
slime-references slime-presentations
slime-presentation-streams slime-fancy-inspector))
And that’s it! You have a clean and fast startup. There’s still plenty of room for improvement, maybe I’ll post another iteration soon.
Tags: English · Informatique · Planet Lisp
I recently followed instructions in the SLIME manual to get the inferior Lisp to load faster. The idea is simple: you dump a core for your implementation with swank already laoded, and you start SLIME with an adapted initialization (or it would force the loading of swank, which would redefine everything in it, which would in fact make it load slower than before…).
The problem was that with another encoding than the default one in SLIME/swank, the instructions in the SLIME manual are not enough. Also, by using common-lisp-controller from Debian, you can have the special core built for you and rebuilt everytime it’s needed (like when the implementation or swank are upgraded) automatically. I could make this work for SBCL, CMUCL and CLISP (currently ECL won’t load swank successfully, I suspect that when it does, this is usable with it as well).
Here’s what you need.
First, configure c-l-c: for each implementation, create a file with the name of the implementation in lowercase in “/etc/common-lisp/images”. So for SBCL, it would be “/etc/common-lisp/images/sbcl”. Add a line to the (possibly empty or non-existent) file with “swank”. You could the names of any other ASDF systems you want to see loaded everytime, one per line. I also add “iterate”, for example. To force the regeneration of the cores, just dpkg-reconfigure each implementation package. For SBCL, you would do “dpkg-reconfigure sbcl” as root.
Second, add an adapted initialization in SLIME’s configuration. The missing bit in SLIME’s manual is that you need to specify the encoding or the default one will be used by swank (IS-8859-1). If Emacs use another one like, say, UTF-8, sending any character with a code point above 128 will make you lose the connection to the inferior Lisp. Here’s my configuration:
(setq slime-lisp-implementations
`((sbcl ("sbcl")
:init (lambda (port-file _)
(format "(swank:start-server %S :coding-system \"utf-8-unix\")n" port-file)))
(cmucl ("lisp")
:init (lambda (port-file _)
(format "(swank:start-server %S :coding-system \"iso-latin-1-unix\")n" port-file)))
(clisp ("clisp")
:init (lambda (port-file _)
(format "(swank:start-server %S :coding-system \"utf-8-unix\")n" port-file)))
(ecl ("ecl") :coding-system iso-latin-1-unix)
(s48 ("scheme48") :init slime48-init-command)
,@slime-lisp-implementations)
With this setup, SBCL, CMUCL and CLISP are loaded blazingly fast, and I have nothing to worry about, everything is taken care of for me.
Tags: English · Informatique · Planet Lisp
C’est confirmé, j’ai bien un job, j’ai bien commencé jeudi, signé un contrat, tout ça. Le boulot en lui-même va être divers et intéressant, et les collègues sont tous très sympas. En fait, les collègues aussi sont divers et intéressants (dans mon bureau, un mélange de développeurs, d’admins et d’hybrides des deux).
Aujourd’hui, dans le cadre de ce boulot, j’ai fait deux choses qui devraient avoir un léger impact positif sur l’environnement.
Primo, j’ai ramené une tasse et une cuillère au boulot. Je pourrai ainsi boire du thé ou, horreur, du café, tout en y mettant du sucre (un peu, je me surveille et je mets un demi-sucre par tasse), sans pour autant consommer un gobelet en plastique et une touillette. C’est le genre de geste écologique facile : c’est quand même plus confortable d’avoir sa tasse.
Ça aura aussi un impact positif sur ma santé, je pense, puisque bosser en buvant du thé est sûrement meilleur pour moi que bosser en buvant du coca. Ce sera beaucoup moins de sucre.
Deuxio, je suis allé voir ma banquière. Non, je ne suis pas allé tuer ma banquière parce qu’elle pollue. En fait, mes rentrées vont me permettre d’à nouveau amortir mes divers équipements. Le principe, c’est que si un bidule coûte 240 euros et est garanti 2 ans, je mets 120 euros de côté chaque année, soit 10 euros par mois. Ainsi, s’il meurt le jour après la fin de la garantie, je peux aller en racheter un autre directement, cash, sans m’endetter. Emprunter pour consommer, surtout pour faire un achat prévisible, c’est idiot. Accessoirement, on pourrait aussi amortir non pas sur la durée de garantie (c’est la solution de sécurité) mais sur le durée de vie probable. Ainsi, si l’objet à 240 euros garanti 2 ans tient en fait en général larguement 4 ans, on ne mettra que 5 euros de côté chaque mois. Si l’ont amortit plusieurs objets, on pourra quand même disposer de l’argent pour en racheter une partie d’entre eux dès la fin de la garantie, mais pas tous. Si la probabilité qu’ils cassent tous peu après la garantie est effectivement faible (c’est-à-dire que l’écart type de la durée de vie est faible), c’est un risque tout à fait acceptable, et c’est moins contraignant financièrement.
Et donc, pour mes amortissements, je vais prendre un compte épargne, mais je ne veux pas que mon argent serve à financer la guerre au Libéria ou des entreprises peu recommandables. J’ai donc pris un Codévair de la Banque Populaire, un livret dont les fonds collectés sont essentiellement, voire peut-être intégralement, utilisés pour financer des prêts bonifiés pour des projets de particuliers ou d’entreprises respectant certains critères écologiques. Je serai moins rémunéré sur l’argent épargné qu’avec un compte classique, mais plus en paix avec moi-même.
Tags: Français · Éthique
La nouvelle est tombée ce matin, par téléphone : l’ULP Multimédia m’embauche ! J’avais eu un entretien jeudi, qui s’était bien passé et où je m’étais trouvé sur la même longueur d’onde que les deux responsables que j’avais en face de moi. Ils m’avaient par exemple demandé quel était mon Linux de choix, et mes raisons, et quand je leur ai expliqué pourquoi je préfère systématiquement Debian, ils m’ont dit que c’était pour les mêmes raisons qu’ils l’avaient choisie pour leurs propres serveurs. Ça met tout de suite à l’aise.
J’ai reçu un courriel vendredi me demandant si j’étais toujours intéressé (tu parles, Charles). Et c’est avec un peu d’appréhension que j’attendais donc de leurs nouvelles. Ce matin, je m’attendais à ce qu’on me demande de revenir pour un second entretien, puisque cela avait été envisagé à mon premier, et en fait, on me demande si je peux commencer demain !
Demain, je suis donc censé débarquer à l’ULPMM à 9h, signer mon contrat et commencer. Je suis impatient et curieux.
J’y serai administrateur système, en charge notamment de la métrologie. Ce devrait donc être un boulot très intéressant, avec une composante sécurité. Je me demande si j’y aurai l’occasion d’y mettre en pratique mes connaissances sur la sécurité par capacités. Le rêve, ce serait que j’ai l’occasion d’y tester mes idées sur la gestion des utilisateurs dans un système à capacités objet et de réaliser des publications sur des études de cas de ces déploiements…
Tags: Français · Informatique
Une amie me demandait aujourd’hui pourquoi je hais YouTube. Puisque je me suis donné la peine d’écrire mes raisons, je me suis dit qu’il valait autant les faire partager à tout le monde.
Parce que c’est un retour en arrière de 30 ans. Voyez-vous, les premiers réseaux informatiques étaient tous comme celui du Minitel : au centre se trouvait une machine très grosse et très chère sur laquelle se trouvait tout le contenu et où les programmes s’exécutaient. Tout autour, en étoile, se trouvaient des « terminaux » qui ne faisaient qu’afficher ce
que la grosse machine leur disait d’afficher.
Par exemple, quand on tapait « a » sur un Minitel, ce n’est pas le Minitel qui décidait d’afficher ou non le caractère, mais le serveur à l’autre bout du téléphone, dans les locaux de France Telecom…
Du coup, celui qui possède la grosse machine au centre contrôle tout. Il décide qui accède à quoi, quels programmes sont disponibles, tout. C’est le maître absolu.
Internet, là-dedans, c’est une vraie révolution. Non seulement ce n’est plus une étoile avec au centre ce qui est important, c’est un maillage avec pleins de routes différentes entre les machines, mais chaque machine qui participe au maillage peut héberger des services, sans rien avoir à demander à personne.
Pour héberger un site Web, des vidéos, recevoir des emails ou faire de la vidéoconférence, je n’ai besoin de demander à personne. Tout ce dont j’ai besoin, c’est que ma machine soit connectée à Internet, et de donner mon adresse à ceux qui veulent profiter des services que je rends disponibles.
C’est une formidable liberté pour tout le monde, carrément un pas en avant pour la démocratie. Aujourd’hui, si quelqu’un veut s’exprimer, tout ce dont il a besoin, c’est d’un ordinateur et d’une connection à Internet.
Et YouTube, c’est l’inverse. Au lieu d’héberger nos vidéos sur notre machine, il y a une grosse machine très chère au milieu, avec les vidéos de tout le monde. Ça vous rappelle quelque chose ? C’est juste du Minitel 2.0.
Et si quelqu’un souhaite que sa vidéo soit affichée différemment, ou qu’on puisse la télécharger, dans tel ou tel format, et bien c’est moche pour sa gueule, parce que YouTube en a décidé autrement.
Ou alors, s’il est aveugle, il ne pourra carrément pas du tout s’en servir, parce que le site fonctionne avec Flash, et les navigateurs pour aveugles ne peuvent pas rendre le contenu Flash. Donc si un aveugle voulait entendre la vidéo du récital de piano de sa nièce qui vit à l’autre bout du monde, et bien c’est encore moche pour sa gueule, il n’avais qu’à pas être aveugle et installer Flash sur sa machine.
Donc j’abhorre YouTube et tous ces services sur Internet que je ne pourrais utiliser que chez un seul fournisseur, et dont le fond de commerce est de rendre captif leurs utilisateurs. YahooGroupes, YouTube, DailyMotion, Facebook ou encore MSN ne sont que de formidables et dangereux retours en arrière et ce sont des libertés qu’on abandonne quand on s’en sert.
Je tiens à mes libertés et je me battrai pour les conserver. J’utilise un système d’exploitation libre, je n’y installe que des logiciels libres, je choisis avec quel logiciel je surfe sur le Web et où j’héberge mes pages Web (dans mon cas, sur ma machine), avec quel logiciel je lis mes mails et où ils sont réceptionnés (dans mon cas, sur ma machine), avec quel logiciel je discute par messagerie instantanée et quel est mon serveur de messagerie instantanée (dans mon cas, celui d’un hébergerur associatif, l’APINC).
Tags: Français · Informatique · Éthique
For a long time I’ve wanted to contribute more actively in Debian, and as a coder I’m more inclined to do packaging than, say, translations (although now that I’ve got an interest in technical translation, things have changed a bit).
Back in March, I finally got to constructively use my accumulated knwoledge about Debian packaging to actually package some Lisp stuff. I even actually got one package in the archive, for ZPB-TTF. I had also uploaded a package for CL-Vectors, but it was rejected by ftp-masters because license informations was insufficient. My package for MT19937 was never sponsored, and I never packaged the not-really-released 0.0.2 version of Bordeaux Threads that includes my copyright and license clarifications (the joy of distributed version control…).
Things were a bit hard with my work in the meantime, and there was no new upstream versions, so I left packaging aside for a while.
But now Xach just released a new awesome package, Vecto, that happens to be a high-level interface on CL-Vectors, so I figured that I should do some packaging work again. Now all dependencies of Vecto are properly package, and I also packaged Bordeaux Threads, all with online revision control for my packaging work and shiny ITP bugs. I just hope I’ll be sponsored, and I pretty much would like to be DM to be able to continue working on these packages autonomously.
I was happy to see that the infrastructure I set up with Mercurial to deal with Debian packaging is wonderfilly efficient. Happy enough that I will probably describe it later…
Tags: Informatique · Planet Lisp
Editor’s note: this is an answer I wrote to Stevey’s Lisp is Not an Acceptable Lisp in early December 2006, when I discovered his post. I didn’t want to register to blogspot to be able to comment, and I didn’t want to post on my blog in English at that time…
What is strange, or totally logic, in fact, in your post, is that nearly each flaw of Lisp according to you is a virtue according to me. And guess what? I’m a programmer that earns a living almost solely with Common Lisp now!
You have a bunch of Lisps. Well, freedom gives you power, but not everybody is able to exercice freedom. Too bad.
The spec: probably lenghty and verbose, but surely more understandable than the one of a more mainstream language such as C++. Go figure how C++ template parsing and dispatch goes (and see how many features of C++ are not implemented at all or without conforming to the spec). All concepts of Common Lisp are pretty clear. Same goes for Scheme, and its revised^n reports are utterly short.
CLOS: well, it’s just the finest way to implement an object system! You’re not happy with it, you can write your own if you like (there’s Cells, for example), or write metaobjects to adapt it slightly (e.g. with persistence). In comparison, those who rant about flaws in C++ object system just have to deal with it. Period.
Macros: in some Lisps, they may have problems. But they probably solve far more problems than they add. Just take a look at the insanity that C/C++ macros are, at the black magic that complex macros or template systems can become in C++ (see Wave and the MPL in Boost). Then compare to macro implementations of the same features in a Lisp and the clean API they provide. It took me 30 minutes to design a “while” loop for Common Lips in my head while walking in the cold. Try implementing “while” in any other language that don’t support it natively! Do you know that you can implement CLOS as a portable Common Lisp Library, without using an existing CLOS in it, thanks to macros?
Type system and performance: well, read Lisp’s history. It’s full of work on optimizing compilers. Some could even beat Fortran at numerical tasks, where now there’s still a debate on wether C++ could do that with usable and maintainable code.
Tags: Planet Lisp
Au moins, là c’est clair. Vendredi soir, j’ai subi un plantage assez majeur de ma machine de bureau, où même les touches spéciales qui permettent sous Linux de redémarrer proprement n’avaient plus d’effet.
Au redémarrage… et bien en fait la machine ne démarrait plus. Seconde erreur majeure, le système de démarrage indiquait qu’il n’avait rien à démarrer. Une fois la machine démarrée sur un Live CD, je constatai que mes noyaux avaient disparus ! Essayez voir de démarrer une voiture où le démarreur fait un drôle de buit, ouvrez le capot pour découvrir que vous n’avez plus de moteur, et vous aurez une idée de ce que ça fait…
J’ai bien essayé de réinstaller les noyaux depuis le Live CD, et j’y suis même arrivé, mais alors, impossible de remettre en place le gestionnaire de démarrage. Genre, allez-y, liguez-vous contre moi, ça ne dérange pas du tout.
J’ai donc du me résoudre à réinstaller.
Oui. Réinstaller. Et pour moi, ça sonne comme une hérésie…
Là-dessus, une fois la machine plus ou moins réinstallée, je mets de côté mon dossier personnel (22 Go de données) et je recrée mon utilisateur. Cela fait, je remplace le nouveau dossier créé par le mien, le vrai. Je vais dans mon dossier, heureux de pouvoir presque déjà retrouver mon environnement de travail, et il est… vide !
OK, je venais de faire une fausse manip, et j’avais en fait balancé toutes mes données personnelles. Et la dernière sauvegarde date d’au moins deux semaines, peut-être trois. Il était 8h du mat’, je venais de passer une nuit blanche particulièrement stressante et inquiétante, et elle se soldait par une catastrophe.
J’ai failli me mettre à chialer.
Heureusement pour moi, à ce moment, sous l’emprise de la peur et de la panique, mon réflexe de survie le plus profond a pris le relais : l’analyse froide et méticuleuse des faits (oui, je concède joyeusement être particulièrement inadapté à la survie en milieu hostile, je suis le fruit d’une lente et délicate symbiose entre l’homme et les systèmes formels…).
J’ai donc répété la courte séquence de manipulations qui m’avaient fait perdre toutes mes données. J’avais besoin de comprendre. Je me rends compte alors que j’avais en fait déplacé mon ancien dossier dans le nouveau… Et je ne l’y avais juste pas remarqué.
Il n’y a pas de mots pour expliquer le mélange de soulagement encore mêlé de peur de ce genre d’instants, je crois.
Finalement, absent tout le dimanche, je reprends la réinstallation ce matin, pour remettre en route l’essentiel et installer la myriade de logiciels dont je me sers. Première priorité : le blog de Marie, que j’héberge sur ma machine
Je réinstalle donc le serveur Web, le configure pour qu’il serve les pages des utilisateurs et vais à l’adresse du blog pour m’assurer qu’il n’y a rien d’autre à reconfigurer. La page d’erreur me dit que le système ne peut pas accéder à la base de données.
La base de données… je suis alors parcouru d’un horrible frisson : toutes mes bases de données sont gérées dans un coin à part de la machine par le serveur de bases de données. Dans un coin à part des dossiers utilisateurs. Les dossiers utilisateurs qui sont la seule partie, avec la configuration centrale, que je sauvegarde régulièrement…
Et voilà. J’aurais pu mettre les bases de données de côté pendant la réinstallation du système, mais je n’y ai pas pensé, et elles n’étaient pas pas sauvegardées. Elles sont donc irrémédiablement perdues. Le blog de Marie, mon blog… et même les pages Web qu’une amie rédigeait pour essayer sur ma machine un système de publication pour le Web.
Meeeeeerde.
Histoire d’enfoncer le couteau dans la plaie, Marie est découragée par la perte de son blog et ne va pas le reprendre. Au moment de lui annoncer la perte du blog, j’espérais un peu me faire insulter. C’eût été plus facile à encaisser (et j’aurais globalement été d’accord avec les insultes).
Tags: Informatique