Exploring Rails codebases: Writebook

To become a better developer, they say, read a lot of code. Although we, as a profession, often find more enjoyable to write a hundred lines of code rather than read ten, this advice stands more than ever. So let’s explore some codebases, starting with Rails applications.

Last june, 37signals released a new product, Writebook – free of charge, and full source code included1. An excellent occasion to see how the company that initiated Ruby on Rails writes code.

I’ve downloaded and run the app, explored the source code, and took some notes. Here are my takes on this code base.

What is Writebook

Writebook is a web app for publishing book-like content on the web. Books supports pages composed in Markdown, sections separators, and full-page pictures.

Writebook’s presentation on 37signals website will show you how the app looks like, and what it does. I recommend you to have a short look at this presentation, to know what we’re talking about – then come back to this article.

How to obtain the code

Writebook is free, but its code is not truly open-source. You are allowed to read the code, and to make modifications, but not to publish them, or to re-use part of the code in another product.

This means the code is not hosted in a public repository (for instance on GitHub). Instead, once you “purchase” the application (for free), you get access to a zip file containing the full source code2.

Exploring the code

The stack

Models

Controllers

Views

CSS

Javascript

Turbo

Design

Tests

Some global remarks

Conclusion

I’m amazed by the terseness and concision of the code base. Methods are short, and don’t leak complexity everywhere. That said, there’s a real business complexity in some parts: digging in the complexities of the Leafable model or the drag-dropping Javascript code can take a while. Short code isn’t always easy to read, but it feels simple, and not overwhelming.

The terseness of the code also comes from the use of Rails by Rails creators. They know the framework by heart, use it to the maximum, and push code to the framework when needed. After reading this code base, I think more of Rails as 37signal’s public web framework.

This codebase also embodies Rails as a one-person framework: a single developper, knowing the inside of the framework perfectly well, can write an ambitious web app using all the available resources Rails has to offer.

Next, I consider exploring other large Rails codebases: GitLab, Mastodon, maybe others. Let’s see where it goes.


  1. More precisely, Writebook’s source code is available – but not open source. As the FAQ states, “While you are free to review the code and make modifications to Writebook for your own use, you can not use or repurpose the code for your own purposes outside Writebook.” 

  2. The “source available” nature of Writebook means that this article cannot link to the actual code: it would have to be hosted publicly, which is not allowed under Writebook’s license. 

Véligo cargo : dimensions des caisses

En cherchant un siège-enfant qui rentre dans un Véligo cargo, je me suis rendu compte qu’il était difficile de trouver en ligne les dimensions précises de la caisse de chaque vélo (biporteur ou triporteur).

Voici donc les relevés des dimensions de chaque caisse.

Véligo biporteur

Vélo biporteur Véligo Dimensions de la caisse du vélo biporteur Véligo

Véligo triporteur

Vélo triporteur Véligo Dimensions de la caisse du vélo triporteur Véligo

Zelda: Link's Awakening progress reports moved to a new location

After two years of waiting, a new progress report for the Zelda: Link’s Awakening disassembly is finally published!

To celebrate this, I took the time to move this series of articles to its own dedicated website: the Link’s Awakening disassembly blog. Of course, the former URLs now redirect to these new pages.

This move makes subscribing to new disassembly-related articles easier, since only relevant Link’s Awakening content will be published.

And meanwhile my own blog will resume to more random and personal stuff.

Paris mon camarade – Bernard Dimey

Un poème de Bernard Dimey, que j’ai eu du mal à trouver facilement en ligne :

Paris, mon camarade, pour causer, faut connaître,
Faut s’y prom’ner la nuit, faut s’y fair’ des copains,
Faut s’offrir du bitume, en faire des kilomètres,
Y’aura toujours un pote pour t’offrir un bout de pain.
Paris, si tu connais c’est comme un’ cour d’école,
T’es tout partout chez toi si t’as l’coeur bien placé,
Si jamais t’as l’bourdon, va voir ceux qui rigolent
Et tu verras, l’soleil y en a toujours assez.

Paris, mon camarade, c’est pas tout c’qu’on raconte,
C’est pas les bulldozers, c’est pas la Tour Machin,
C’est un coeur qui s’allume au hasard des rencontres,
C’est le petit bistrot où vont tous les copains ;
Paris, si tu connais, c’est le vent dans les voiles,
Romeo et Juliette en blue-jeans à midi,
C’est le clodo Marcel qui dort sous les étoiles ;
Y a de l’Enfer, c’est sûr, mais il y du Paradis.

Paris, mon camarade, si tu connais, c’est chouette,
C’est toujours aussi bon, quand j’fous l’camp, quand j’reviens,
C’est le sourire en coin quand le cafard me guette,
C’est l’Opéra d’quat’ sous qu’est pas fait pour les chiens,
C’est le seul cinéma où y a jamais d’entracte,
Où j’ai tous mes amours et j’espère vraiment
M’offrir un soir la joie d’y jouer mon dernier acte
Et d’être parisien jusqu’au dernier moment.

Bernard Dimey, récité par Bernard Beaufrère

Zelda: Link’s Awakening Turbo-Français

La traduction française de Zelda: Link’s Awakening a un charme particulier. Le texte de Véronique Chantel est plein de rimes, raccourcis, bizarreries et étrangetés, qui collent parfaitement à l’esprit « Twin Peaks » du jeu. Tout cela en respectant les contraintes techniques de la Game Boy, qui obligeait par exemple le texte français à être à peu près de la même longueur que le texte anglais ou japonais – d’où la nécessité de faire passer les informations essentielles en peu de mots.

Une capture d’écran du jeu, avec un pêcheur expliquant à Link « Sois un peu plus motivé ! »
« Vis ta vie ! Sois un peu plus motivé ! » Ce pêcheur m’a longtemps fasciné.

Mais le texte français comporte malgré tout une imperfection : les lettres majuscules n’ont pas d’accent. C’est dommage, car au delà de la lisibilité, le sens de certains mots change parfois en fonction des accents : « OEUF SACRE » n’est pas la même chose que « OEUF SACRÉ », ni « NAUFRAGE » que « NAUFRAGÉ ».

Une capture d’écran du jeu, avec un texte « VAS VOIR L’OEUF SACRE », sans accent sur le E de sacré.
Un Œuf Sacre, c’est quand même pas la même chose.

Cette omission est dûe à un compromis technique.

Pour chaque traduction, les programmeurs du jeu ont ajusté le code du jeu aux nécessités typographiques de chaque langue. Par exemple, la version japonaise permet d’afficher des diacritiques sur certains caractères ; et la version allemande gère les lettres comportant des trémas. Et le code utilisé pour afficher les diacritiques sur les lettres majuscules peut utiliser au maximum deux signes différents (par exemple un tréma et un accent).

Mais le script français aurait besoin de trois accents : aigu, grave et circonflexe. Plutôt que de passer un temps précieux à supprimer cette limitation, l’équipe de traduction a donc préféré désactiver la gestion des accents sur les majuscules. Vu les contraintes de temps de développement, on les comprend.

Restaurer la gestion des accents

Toutefois, en explorant le script français, il s’avère qu’une unique ligne de texte comporte une majuscule sur un accent : il est écrit « NAUFRAGÉ ». Et de fait, dans les graphismes stockés en mémoire, on trouve bien deux accents : ◌́ et ◌̀.

Comme la gestion des diacritiques est désactivée pour le français, dans le jeu cette lettre est simplement affichée comme un « E » majuscule, sans accent. Mais cette lettre est un vestige des tentatives d’intégrer la gestion des diacritiques à la version française, avant que soit finalement entérinée l’absence d’accents sur les majuscules.

Heureusement, en utilisant le code-source restauré de Zelda: Link’s Awakening, il est possible de compiler une version française qui ré-active la gestion des diacritiques. Cela permet à cet accent de s’afficher dans le jeu.

Une capture d’écran du jeu, avec un dialogue « NAUFRAGÉ » avec un accent sur le E de naufragé.
Cet accent, désactivé dans le jeu original, n’avait pas été vu depuis 29 ans.

En modifiant le reste du texte, pour ajouter des accents aux autres majuscules, il devient alors possible d’afficher des accents sur toutes les majuscules du jeu !

Une capture d’écran du jeu, avec un dialogue « TOUT SUR L’ÉPÉE TOURNOYANTE » avec deux accent sur les E de épée.

Accents circonflexes

Toutes ? Presque. La limitation technique originale, qui empêche de gérer plus de deux types d’accents, est toujours présente. Comme les accents aigus et graves sont déjà présents, il manque l’accent circonflexe – ce qui empêche d’écrire un mot comme « POISSON-RÊVE ». Fâcheux.

La solution serait de trouver un espace inutilisé dans la mémoire graphique où stocker les pixels de l’accent circonflexe. Ce n’est pas simple : sur la Game Boy, la mémoire graphique est très limitée – et les accents doivent occuper le précieux espace des graphismes qui sont chargés en permanence en mémoire.

Comment faire ? Après quelques recherches, il s’avère qu’un emplacement n’est utilisé par le jeu que lorsque l’inventaire est ouvert. Il serait donc théoriquement possible, quand le jeu ouvre l’inventaire, de remplacer l’accent circonflexe par le graphisme dont l’inventaire a besoin – puis de restaurer l’accent circonflexe à la fermeture de l’inventaire.

Et ça marche ! Grâce à cette astuce, il est maintenant possible d’afficher les trois types d’accents dans le jeu.

Une animation du jeu, montrant l'accent circonflexe être remplacé en mémoire graphique lorsque l'inventaire s'ouvre.
Avec de bon yeux, on peut voir dans la mémoire graphique l’accent circonflexe être remplaçé par un autre symbole lorsque l’inventaire s’ouvre.

Il est donc enfin possible d’afficher correctement le texte ci-dessous :

Une capture d’écran du jeu, avec un dialogue « POISSON-RÊVE » avec un accent sur le E de poisson-rêve.
Hourra !

Gérer les ligatures

Un autre souci de la version originale est que les e-dans-l’o est affiché comme deux lettres séparées. Le jeu affiche donc par exemple « Coeur » et « Oeuf », sans faire la ligature.

Techniquement, il est relativement facile d’ajouter un caractère supplémentaire à la fonte du jeu. Reste à dessiner le nouveau caractère dans une police similaire à celle du jeu – ce qu’a fait avec brio merwok sur Discord.

Une fois ce nouveau caractère intégré, on peut facilement afficher le mot « cœur » correctement.

Une capture d’écran du jeu, avec un dialogue « cœur » avec le e-dans-l’o affiché comme une ligature.
Haut les cœurs !

Le cas du « Œ » majuscule est un peu plus délicat : chaque lettre doit s’inscrire dans une case de 8x8 pixels – et le Œ majuscule est un peu trop large pour ça.

Heureusement il est possible d’ajouter à la fonte non pas un, mais deux caractères supplémentaires – ce qui rend donc 8x16 pixels disponibles pour dessiner la majuscule correctement.

Une capture d’écran du jeu, avec un dialogue « ŒUF » avec le e-dans-l’o affiché comme une ligature.
Ce « Œ » utilise deux tuiles de 8x8 pixels.

Le résultat, c’est le mod le plus futile de tous les internets.

Zelda: Link’s Awakening Turbo-Français ajuste le script français de Zelda DX, pour ajouter des accents et des ligatures partout où cela est nécessaire. Parfaitement in-dis-pen-sable pour les fans français du jeu.

Vous pouvez télécharger :

Pour celleux que ça intéresse, le code-source de ces modifications est également disponible.

Bon jeu !

Une capture d’écran du jeu, avec un dialogue « Bon baisers de Kyoto! VÉRO ❤️ » avec un accent sur le E de Véro.