Orthogonality

When designing computer systems, keeping various orthogonal aspects separate is a very good idea: it keeps the design clean and the various parts of the code easier to understand and to test. When designing an UI, this orthogonality adds states that might not make sense and add clutter and noise.

One example of this I found in the UI displaying flight information on airplanes. They all follow the same pattern: various bits of data are rotated in various languages and units. As my flight was from Roma to Zürich, the languages where: Italian, German, French, and English, and the units where metric and imperial. I’m not really sure which type of miles where displayed (US or nautical), nautical would make more sense, but then should the speed not be expressed in knots and not MpH? Things would be simpler if we only used metrical units, but that is not the point here.

In any case, the system displayed temperatures in Fahrenheit degrees in French, Italian, and German, which makes absolutely no sense. Fahrenheit degrees are only used in the US (and two minor Islands that speak neither French or German, or Italian). While the unit system is orthogonal of the display language, there is in practice a strong coupling between the two. For me this is the typical case where orthogonality in the underlying system (which is good), transpired in the UI, producing noise (which is bad).

Street Parade and Bodensee

A pink church in a yellow field with a blue sky in the background.

This year, I did not go to the Street-parade. Péter had suggested we do a bike tour of the north part of the Bodensee, which, given the weather, I gladly accepted. The weather was gorgeous and it is a very beautiful region. While we though we would escape the bustle from the Street-Parade, we did not know there would also be the Seenachtfest in Konstanz. Compared to the 950’000 visitors of the street-parade, 60’000 does not seem like a lot, still Konstanz was pretty busy when we returned there to take the train.

One interesting thing about the street-parade is the amount of traffic it generates on my blog. I wrote a blog entry about it in 2007, and year after year it still gets a lot of traffic around the time of the party. See the graph below for this year’s spike:

Programming English

One of the annoying fictions of my work is that programming code is written in English. This is affirmation is technically correct (the best kind of correct), but in reality the language used in the code is a very restricted subset of english. When writing, and to a certain extent when reviewing code, I generally use the following principles, some of which are inherited from technical writing, others specific to coding:

  • Semi-colons are only used in code, nobody knows how to use them in English.
  • Eschew the usage of complex vocables, the demeanour of using convoluted words is jejune.
  • Avoid shortened expression with apostrophes, i.e write “This will not…” instead of “This won’t…”. The reason is that depending on the context, i.e. the type of file, of programming language, and within a single language the type of string or comments, the apostrophe needs to be escaped or not, so searching for a message in the code is needlessly complicated. At any rate, English works fine without apostrophes.
  • Avoid the use of the saxon genitive, first because its use involves apostrophes, secondly because its usage is less general than using of. One advantage of applying the two rules above is that it avoids the issue of mixing up its and it’s.
  • Avoid pronouns. Either repeat the word, or use variable names. Strangely enough, I find single letter variables in text much clear that longer ones; this is probably a leftover from mathematical writing, but I also think this because the context change highlights the variable.
  • Avoid synonyms, they add ambiguity, break the search tools, and increase the chances the reader does not know a given word. A cat is always a cat, never a feline. I don’t care what your english teacher said.
  • Avoid the Picard Technique. There are a lot of words of latin origin that are technically valid in English, but not widely used except by marketing people and spaceship captains. For instance to say “This commences the thread that utilises the laser interface” as opposed to “This starts the thread that uses the laser interface”. It is a trap! Easy to fall into when one is a native speaker of a latin language like french.
  • Function or method names are always followed by opening / closing parentheses, i.e. FireOrbitalCanon().
  • Avoid being smart. Names that are puns, allusions, are very dangerous because they are usually built one some cultural knowledge. While English is the shared language for the code, the various cultures used in English speaking countries are not. In other terms, you can assume the reader of your comments will understand English, but not the vocabulary for gold mining or references to the Simpsons.

Limmatschwimmen 2012

Matthias nageant dans la Limmat tenant en laisse un papillon en plastique gonflable

Cela faisait trois ans que je n’avais pas participé au Limmatschwimmen, une course dans l’une des deux rivières qui traverse la ville de Zürich. Le principe est assez simple : chaque participant se jette à l’eau au bain des dames Frauenbad, armé d’une animal en plastique gonflable (cette année c’était un papillon) et nage jusqu’au bain du Letten inférieur (Unterer Letten), le trajet est d’à peu près deux kilomètres. En pratique, le jeu consiste à se laisser porter par le courant qui est assez fort, dans de l’eau à 23°.

Vue de la zone de départ. De gauche à droite: Münsterbrücke, les clochers du Grossmünster, la Wasserkirche

Comparé à il y a trois ans où l’organisation avait été complètement débordée par les milliers de participants, tout s’est admirablement bien passé cette année. La seule partie où j’ai du attendre était pour l’attribution des numéros de départ – j’avais acheté mon billet en ligne – pour laquelle j’avais du attendre 40 bonnes minutes vendredi à midi. Le samedi, par contre, je suis arrivé à l’heure indiquée, je me suis changé et j’ai sauté dans l’eau ; un thé chaud et mes vêtements m’attendaient à l’arrivée, ainsi que le traditionnel verre commémoratif.

Cette baignade était d’abord l’occasion de profiter du paysage : un ciel bleu, une très belle vue sur les alpes et une perspective imprenable sur la vieille ville ; vu depuis la rivière, le passé marchand de la cité devient évident : les maisons des guildes et les églises y dévoilent leur plus beaux atours. J’ai pu examiner de près la façade ouest de l’église de l’eau (Wasserkirche), et les décorations zodiacales sous l’hôtel de ville (Rathaus).

Outre le papillon sus-mentionné, certains viennent armés de radeau avec bières, pistolet à eau, et autre accessoires, le trajet est surveillé par beaucoup d’organisateur qui prennent le soleil sur des barges en bois de l’armée : ils donnent aussi du thé aux personnes fatiguées. La police était aussi présente, casquette blanches et chemises bien repassées. Tout le monde était détendu, souriant, même les goth assises à l’ombre des arbres du parc de la place Spitz avaient l’air heureuses de vivre.

Bref, ce fut une très belle journée. Je tiens au passage à remercier Balise qui a pris des photos de l’évènement avec moi dedans.

Zombulateurs et post-apocalypse Fantasy

Où l’on découvre que Matthias écrit réellement n’importe quoi dans ses titres

Un thème que je vois surgir régulièrement sur les réseaux sociaux est l’idée que la société humaine est vulnérable comme jamais auparavant. Elle est certainement plus interconnectée, mais l’imposante population humaine est aussi en un sens sa garantie.

La population de l’Europe actuelle est de 740 millions, même en imaginant un épidémie qui tuerait 90% de la population, il resterait plus de personnes qu’après la guerre de 100 ans et la peste noire (qui ont tué la moitié de la population).

Ce genre de catastrophes terribles est souvent la base d’univers post-apocalyptiques, très souvent la société à régressé à un niveau technologique moyen-âgeux, ce qui permet à l’auteur d’écrire de la fantasy qui surprise, se révèle être de la science-fiction. Invariablement tout ce qui reste de l’ère précédente sont des zombulateurs (armes, vaisseaux, ordinateurs) hyper-puissants aux mains d’une élite et souvent liée à une prophétie.

Le fait que les dits zombulateurs fonctionnent encore après quelques siècle et sont de surcroit capables de suivre des prophéties ambiguës prouve surtout que les auteurs de fantasy on pris un peu littéralement la phrase d’Asimov selon laquelle toute technologie assez avancée est impossible à distinguer de la magie. À mon avis les pactes avec les démons sont triviaux comparés aux conditions d’utilisation d’un programme actuel.

Si on considère la catastrophe évoquée plus haut, que resterait-il disons un siècle après la catastrophe ? En imaginant que la société s’écroule, et que les connaissances techniques se perdent, il est clair qu’aucun appareil électronique ne survivrait bien longtemps, ces objets ont des durées de vie bien trop courtes et demandent beaucoup de soins et d’entretien.

À mon avis il resterait les choses suivantes :

Les plantes

Une grande partie partie des plantes dans nos champs et nos jardins ne sont pas originaires d’Europe. En cas de cataclysme, elles ne reprendront pas le bateau pour les Amériques. Qui plus est, l’humanité a extrait du sol en grande quantité des substances dont les plantes raffolent : de l’oxyde de carbone, et des engrais (phosphates et nitrates). À climat égal, la végétation risque d’être beaucoup plus luxuriante, ce qui, dans une perspective médiévale, n’est pas obligatoirement une bonne chose.

Les métaux

Au moyen-âge, les métaux étaient quelque chose de précieux, les mines rares et peu profondes. Aujourd’hui, il y a du fer en quantité énormes dans les ouvrages d’art, les voies de chemin de fer. La tour Eifel à elle seule représente 7300 tonnes de fer. Les lignes électriques et les caténaires sont en cuivre, et il y aussi beaucoup d’or et d’argent dans les objets électroniques. De même on trouve partout de l’aluminium, un métal qui n’existait tout simplement pas au moyen-âge sous sa forme raffinée.

Le verre

Si le verre est connu depuis très longtemps, il devait être raffiné. Vu la quantité de verre que l’on trouve aujourd’hui dans les différents bâtiments mais aussi les contenants, et le fait qu’il se recycle assez facilement, c’est un matériau qui restera disponible en abondance.

Les constructions

Un des rares aspects positifs d’une telle apocalypse, c’est qu’une grande partie des abominations en béton qui nous entourent seront recouvertes de végétation. Même s’il ne fait aucun doute que de nombreux bâtiments, surtout des tours s’écrouleront, il en restera quand même beaucoup. Certains bâtiments resteront utilisables, et les autres des sources de matériaux de construction, de la même manière que les pierre de l’empire romains furent ré-utilisés. Poutres métalliques, blocs de béton ou de pierre, vitres, autant d’éléments qui donnera une architecture bien différente du moyen-âge.

Les outils

Si on visite un marché aux puces, on trouve une abondance d’outils qui ont entre 50 et 100 ans : couteaux, rabots, marteaux, scies, etc. Même s’ils sont souvent plus légers, une fraction des outils d’aujourd’hui, qui sont généralement en acier, survivront probablement quelques siècles. Des clous en métal étaient quelque chose d’onéreux au moyen âge, et ne valaient pas comme aujourd’hui, des clous…

Je n’ai discuté dans ce billet que des choses matérielles qui survivraient raisonnablement un siècle ou deux. Clairement après un laps de temps plus long, les choses construites (constructions et outils) disparaitraient, par contre, sans technologie avancée, je ne vois pas réellement comment les plantes et les matériaux bruts (métaux, verre) reviendraient à un niveau pré-industriel. De fait, une partie des problèmes de pollution dont nous souffrons est surtout sur-abondance de matériaux qui auraient été un trésor plus tôt dans l’histoire : en 1855, des couverts en aluminium étaient considérés plus précieux et plus nobles que des couverts en or.

Concevoir un univers médiéval bâti sur ces prémisses serait intéressant, à condition d’éviter les zombulateurs…

À une échelle plus géologique, la BBC a un articles intéressant sur ce thème (en anglais) : Partie 1, partie 2.

Old Java Stuff

Oracle has finally released the version 7 of the Java Runtime Environment for OS X in the same way than the other platforms. This marks the end of a long story: Sun never properly supported Java on the Macintosh – I remember using the version bundled by Metrowerks to work on my Diploma. With OS X, Apple took over the maintenance and integration, and it has recently decided to step down and pass over that responsibility to Oracle.

I don’t think this change will have any serious impact, Java on client machines was dying, and Oracle’s antics have certainly not improved the situation. As far as I know, I only have only run two Java application in the last six months, a configuration utility for my printer, and the software for my tax declaration. I have run more tcl-tk applications in the same period.

I really like the Applet idea, and Java is certainly a way better language than Javascript, alas Sun never really understood client software or UIs, and this showed in the GUI apis, none of them were really nice or efficient. Even on my current laptop, Java feels sluggish.

During my PhD I wrote some applets (besides the Java Quickdraw library), like the one in the side of this text. I’ll add them to this blog when I have time.

Technology Cycle

Technology Cycle for Devices

When people talk about technological progress, they often seem to have the vision of a unstoppable army going forward, knowing where it goes. For me it looks a lot like a large river, unstoppable, but meandering around in unpredictable ways. One by one, objects around me are crossing the barrier that separates analog from digital. This evolution seems to follow some recurring path, where usability first degrades to improve afterwards. Here are the steps I observed.

  1. Analog device. The object has one purpose and just works for that purpose.
  2. Digital device with a clock. The first thing that you notice when a device becomes digital is that it gets a clock. The objet has a limited amount of buttons, and the clock is difficult to program, so often the device stays at the blinking 12:00 state.
    My kitchen and bathroom scales are at this level.
  3. Digital device with battery. A battery has been added to the device, so it can keep it state in case of power-cut, lots of feature have been added, but the device is way to complicated to configure properly, so the majority of its feature are unused. It displays winter or summer daylight saving time all year around.
    My old stereo is at this level.
  4. Digital device with serial port. A serial port (or a hacked usb-port) has been added to the device. Hackers can now use the device for many purposes, for the available population there is no noticeable changes. The device has now more unused features.
    My Casio electronic dictionary is at this level (no serial port, but proprietary USB).
  5. Digital device with USB port. The device has an USB port with some working protocol. It can now be used with computers relatively easily. The digital device is now much more useful than the analog equivalent. Digital cameras and MP3 players are typically at this level.
  6. Digital device with network connection. The device now has a network connection (Wifi or wired ethernet). The device can now be used in conjunction with other devices. Hardware is not the limiting factor, but software.
    My phone, my TV, my amplifier and my gaming console have reached that level.

Note that I’m not convinced there is a strict causation between certain feature and usability, more of a correlation.

Scrivener

Scrivener vue des notes sur le panneau de liège

Je suis entouré de gens qui écrivent, qui participent à des des concours et des ateliers d’écriture, et qui en général, font les choses de manière sérieuse™. Si ma période d’écriture sérieuse est clairement dans le passé, j’écris encore, dans ce blog évidemment, mais aussi des scénarios de jeu de rôle que je mets parfois en ligne.

Jusqu’à présent, je me suis intéressé aux outils d’écriture que de manière marginale : je n’ai pas de workflow à optimiser, et je n’ai jamais réellement vu l’intérêt d’éditeurs de texte qui évitent les distractions. Je suis suffisamment distrait par moi même pour que ne pas pouvoir blâmer le reste de l’interface de l’ordinateur, mon processus d’écriture étant plutôt champêtre, je n’ai pas de raison de me bloquer sur la page blanche. Bref, je suivais les discussions des amis sur les outils d’écriture, mais les outils généralement mentionnés semblait résoudre des problèmes que je n’ai pas.

Capture d'écran de la vue texte de Srivener avec la hiérarchie de fichiers

Les discussions sur Scrivener m’ont suffisamment intrigué pour que je télécharge la version 2.3.1 et essaye la bestiole. Après 24 heures d’essai, je l’ai acheté sans hésiter : à environ 50 francs, ce n’est pas un gros investissement. J’ai utilisé Scrivener pour écrire un nouveau scénario Rêve de Dragon, et si je n’ai pas encore fini l’écriture, j’en suis déjà à 6500 mots. On est loin des 50K mots des concours d’écriture ou de ma thèse, mais j’ai écrit tout cela en moins d’un mois, durant mon temps libre. Ce qui est certain c’est que Scrivener a rendu l’écriture plus agréable pour moi.

Mais qu’est ce qui rend Scrivener particulier ? Pour moi c’est principalement le mode de travail, qui est un compromis entre le brainstorming graphique, l’écriture dans différent fichiers et les macros à la manière de Laτeχ et un IDE pour programmer. Cela permet de passer d’une phase où l’on pose les idées à plat sur un panneau en liège vers un éditeur de texte qui permet de « remplir » les cartons qui correspondent aux idées développées durant la phase précédente. Les textes sont organisés dans une hiérarchie, où chaque texte peut être un répertoire avec des enfants. L’ensemble peut naturellement être visualisé comme un document linéaire.

Le système reconnaît quelques macros, ce qui m’a permis par exemple de définir une citation pour chaque fiche et de simplement référence le titre et la citation de la fiche dans son texte. Au moment de la composition finale, elles sont substituées. J’ai aussi ajouté les substitutions typographiques françaises à la phase d’exportation, je peux ainsi écrire avec des espacements anglais (pas d’espace avec les doubles ponctuations) et le texte généré est adapté. Le fait qu’il s’agisse d’une vraie application Cocoa fait que toutes la puissance d’OS X est à disposition : services, substitution de texte du système, raccourcis clavier emacs, tout fonctionne. L’application contient enfin quelques outils spécialisés pour l’écriture : un générateur de noms que j’ai trouvé plutôt pratique, notamment.

Scrivener n’est certainement pas parfait : l’application a des airs de créature de Frankenstein, avec ses différents modes, le format de fichier n’est pas très propriétaire, c’est une collection de fichiers XML, RTF et texte qui semble être différente selon les plateformes, et en cas de collaboration, j’imagine que la gestion des conflits. Cela dit, j’ai essayé la synchronisation avec Simplenote, et cela a l’air de fonctionner. Malgré ces défauts, cela reste une très bonne application pour l’écriture, et je vous conseille de l’essayer, surtout si vous travaillez sous Mac OS X.

A script to change network location automatically

Python Logo

As I mentioned earlier in this blog, I run a squid proxy in my home network. I’m using Mac OS X’s location feature to have two settings, a default on without proxy, and my home network with some customisations, including the proxy setting. Of course, when I move around I always forget to switch. As I always have a shell terminal open, I wanted a command that just fixes the issue by looking at the current wifi setting. There are numerous apps trying to solve the same problem on the web, they are usually way to complicated for my taste: adding icons to the menu bar, running on a permanent basis and generally making a nuisance of themselves. I was kind of surprised this feature was not added to Mac OS, as iOS solves the problem more elegantly: proxy settings are associated with the SSID.

The good news is that there are two command-line tools that provide the needed information. The first is
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport which can be used to return information about the current 802.11 network. The second is
/usr/sbin/scselect which can be used to select the current location. So I wrote a small Python script that uses the information from the first to configure the latter. The configuration is simply the map in the beginning of the file, which contains the relationship between Network name and location name. You can download it here

The Fish Shell

A Fish drawn in Ascii Art

There are things you drag around with you for ages, because they just work. In the last ten years, I have moved between three countries, but I have kept using the same shell, with the same configuration that kept getting more and more elaborate. Sun microcomputers has died years ago, but my bashrc is still theoretically capable of configuring itself on SunOS.

A few days ago, Angel showed my a new shell: fish, aptly titled Finally, a command line shell for the 90s, the was rebooted Ridiculous Fish who already wrote a very good hex-editor for Mac OS X, HexFiend. Basically, fish is a shell that does the right thing out of the box and uses features that appeared in computer since the eighties: colour, unicode, thread. Fish is also very good a completion, it parses man pages to build its completion lists and seems to have custom files for many other Unix tools. This convinced me to try it as a replacement to bash. I’m pretty happy with fish and I really recommend you try it out.

wiesmann@wagamama~/Downloads> google_chrome_app  google_chrome_app  (Google Chrome)  google_earth_app  (Google Earth) google_drive_app    (Google Drive)

One nice feature I had on bash was a script that build a list of aliases out of all the Mac OS X applications, launching them with the open command. The script was something I had gotten off Mac OS X hints and transformed a bit. The script was not very smart, as it looked for Applications in a static set of directories. I wanted to see if I could rewrite the same feature for fish using mdfind to find all the Applications. The result is a small Python script which generates a list of fish functions, including a short description built using mdls.

To use the script, just download it from here, then run

./applications_to_fish_functions.py > ~/.config/fish/app_functions

And finally add the following lines to your config.fish file:

if test -f ~/.config/fish/app_functions
  . ~/.config/fish/app_functions
end

All your Mac OS X applications will be available as commands, if arguments are passed to them, they will be opened by said application (assuming the application can handle said file), in tab-completion, the name of the application (with spaces and casing) is displayed. I will try to add further information.