Archives de catégorie : Informatique et technologie

Samsung ne veut pas que vous lisiez sa licence (confortablement)

Les sales coup des diverses sociétés pour rendre la vie de leurs clients difficile me fatiguent. Un exemple récent: pour utiliser son téléphone Samsung, il faut accepter les termes du contrat de licence… affiché dans une petite boîte qui ne fait que 20% de la hauteur de l’écran (4cm sur 10 cm). Si vous faites basculer l’écran en paysage, le texte est à nouveau positionné au début. Bref, tout est fait pour que vous mentiez et cochiez «je comprends et j’accepte».

Samsung, pourquoi méprisez-vous ainsi vos clients?

Je cherchais un téléphone qui tiennent dans la main. Avec cette mode des écrans extra-larges, le choix est réduit. Moi choix c’était porté sur un Sony Xperia Z3 Compact qui avait tout pour plaire, sauf que:

  • Débloquer le bootloader, outre annuler la garantie dans la plupart des cas, supprime du téléphone des clés DRM, ce qui… supprime la réduction de bruit de l’appareil photo. Les photos en basse lumière font alors vraiment peine à voir.
  • Il n’y a sur les firmwares Lollipop officiels actuels pas de faille permettant de passer root. Ça aurait permis d’avoir l’avantage de la stabilité du firmware de base, et les fonctionnalités vraiment sympa des applications root (backup, filtrage des droits des applis…).

Dur dur. Je ne demande pas la lune pourtant: un téléphone simple et solide, qui tiennent dans la main et permettent d’être root et/ou d’installer des ROM alternatives. En passant du temps à écumer les forums et autre site de Cyanogenmod, je me suis rendu compte que:

  • être root est possible ou non selon les versions du firmware d’origine.
  • avec certaines ROM alternatives en cours de développement, certaines fonctionnalités de base ne fonctionne pas (comme le micro en réception d’appels, ouch!).

Bref, cette situation où les différents acteurs vendent les appareils bien verrouillés m’exaspère. Même les constructeurs qui le voudraient bien doivent respecter la volonté du tout puissant Google: pas de root sur les téléphones estampillés Android. Ou sinon pas d’applications Google, et notamment pas de Play Store, la plus indispensable à mon avis, étant donnés qu’un certain nombre d’applications (comme celle de la SNCF ou celle de votre banque), ne sont publiées que sur Google Play. Une belle position dominante. Monde de merde!

Compression of Wikipedia pages history

The Wikipedia foundation provides dumps for its projects. Among them, you have the full history of the pages: the dump is a compressed file containing the full text of each revision of each page. As you can guess, as new revisions of the pages are added, the overall space required exponentially grows. So I told myself that contributors should avoid adding tons of very small modifications (each of them adding the content of the full page in the history).

What about the compression of this history? It turns out than lzma (xz, 7zip) performs much better than bzip2. For example, for French Wikivoyage, the 7zip version is 5 times smaller than the bzip2 version. Here are some diagrams with:

  • in X: the size of the whole dump for a page after a given revision was added.
  • in Y: the size of the additional compressed data for this given revision.

For bzip2:

bzip2As you can see, the compression rate is decreasing.

For lzma:lzmaCompression rate over against the full data size for bzip2:

bzip2_rateCompression rate over against the full data size for lzma:

lzma_rateConclusion: lzma handles much better text that is the very repetitive and large.

I expect the bzip2 dumps to grow larger and larger. The French Wikipedia dump is currently 110Go in bz2 and only 15Go in 7z.

No porting Anki to Firefox OS

I thought about porting Anki/Ankidroid to Firefox OS, but I realized that I would be a daunting task (and not just a simple conversion from Python/Java to JavaScript). Why?

First reason: In Firefox OS, there is no native support for Sqlite, the library (and file format) used by Anki. There is a port of Sqlite done using emscripten (a C/C++ to Javascript converter), but it only operates on in-memory databases. So if you want to modify an existing Anki file, you need to load it completely in memory (mine is larger than 70Mo!), work on it, then save it completely in the end. So your modifications will not be saved after a transaction/card review, and working in memory may not fit with cheap phones.

Second reason: In Sqlite, there is an abstraction layer for I/O operations for each OS/family of OS. But it does not seem possible to create a implementation for Firefox OS… because the I/O in Firefox OS are asynchronous (when your read/write is done, it will call a callback function). And refactoring Sqlite in order to convert all the synchronous I/O calls to asynchronous calls seems an Herculean work.

What about IndexedDB? The data model of Anki is quite simple, but IndexedDB does not support joins, so it would have to be emulated with JavaScript code. Also, it will not help importing/exporting an existing Anki file…

Conclusion: From what I saw, I feel quite disappointed by the model adopted by Firefox OS, which only proposes a limited set of system API and seems quite limited for the port of existing libraries. Especially the asynchronous I/O aspect. It seems like this model is great for applications developed with Firefox OS in mind, but if you need to port an existing application… May it will get better (I hope there will be an official SQLite support)…

Postgresql, micro-benchmark: inserting or not a blob

Let say that I have a table with 20 non-null text columns (32 characters long), 20 non-null integers and a blob (bytea, nullable). When inserting records, what is the overhead of setting the blob? Answer: about no difference up to 80ko. From that it get slower.

Testing details: 2000 records (on 2000 transactions), inserted on 16 threads, each of them having a persistent connection. The DB server is on the same machine (Ubuntu amd64), no particular configuration.

Firefox en japonais

Mise à jour: à partir de Firefox 59, cela se passe comme ça. La procédure ci-dessous concerne les versions antérieures à Firefox 59.

Pour avoir l’interface de Firefox en japonais, on peut bien sûr télécharger la version japonaise. Ou bien on peut installer un «pack de langue». Comme ceci:

  • Installer le pack de langue japonais, qui est une extension du navigateur.
  • Dans la barre d’adresse tapez « about:config » (la page des réglages avancés). Si vous avez une page de mise en garde, cliquez sur le bouton pour accepter les risques.
  • Recherchez le réglage « general.useragent.locale » et mettez la valeur «ja» (double-cliquez sur la ligne). C’est lui qui définit la langue de l’interface de Firefox.
  • Recherchez le réglage « intl.locale.matchOS » et mettez « false » (si elle est à « true » vous pouvez double-cliquer dessous pour la basculer à « false »). Sans ce réglage, Firefox va utiliser la langue de votre système d’exploitation / utilisateur (probablement le français), et pas celle définie ci-dessus.

Redémarrez votre navigateur. Préparez-vous à être un peu perdu.

Résolution de dysfonctionnement avec Anthy, Anki et Firefox

Voila deux problèmes que j’ai rencontrés (et contournés) avec Anthy (permet de saisir du japonais) sous Kubuntu.

Tout d’abord, la saisie de texte japonais avec Anthy ne fonctionnait des fois tout simplement pas dans Anki lors de la création/modification d’une carte. Rageant, non?! Un contournement simple: sélectionner temporairement le champ «marqueur», puis revenir dans un des champ de la carte. Et voila, Anthy fonctionnera à nouveau!

Un autre: des fois, la barre d’URL de Firefox (un petit moteur de recherche à elle-même) ne complétait plus les caractères saisis. C’était dû à un conflit avec Anthy. Quand cela arrive, je passe en mode Anthy, puis repasse en clavier français (bépo dans mon cas). Et hop, le complètement automatique revient.

MyKanji 0.3

J’ai écrit une petite extension pour Firefox permettant de voir dans une page les kanjis que je n’ai pas encore appris. On peut l’installer depuis cette page (pas encore vérifié par Mozilla), et les sources se trouvent sur GitHub.

Comment cela fonctionne-t-il?

  • Phase 1: installation et configuration
    • installez le module
    • mettez dans le presse-papier un texte contenant les kanjis que vous connaissez. Par exemple en faisant un export texte d’un paquet Anki, et en copiant le contenu de ce fichier texte.
    • cliquez sur le bouton «文» dans la barre d’outils.
    • dans la zone de texte, coller le texte que vous avez préparé
  • Phase 2: utilisation
    • dans une page web, sélectionnez du texte ou toute la page (control-a)
    • ouvrez le menu contextuel (clic droit) et sélectionnez «Mes Kanjis»
    • vous obtiendrez la liste des kanjis inconnus, avec leur niveau

Cassé et réparé mon clavier Typematrix

En attrapant mal mon clavier, deux touches de celui-ci ont jouées les filles de l’air, et l’articulation (entre la touche et le boîtier) d’une d’entre elle s’est malencontreusement cassée… Heureusement, j’avais conservé mon ancien clavier (tombé en panne et gracieusement remplacé par Typematrix). La procédure pour démonter et remonter les touches s’est avérée assez simple. Il a juste fallu être délicat pour que les pièces se déclipsent (et qu’elles ne se brisent pas en deux). Une pince à épiler m’a été utile.

Microbenchmark: Expat outperforms Java and libxml2 in SAX parsing

I needed an XML parser for my tests with Rust (parsing a gigantic 2Go Wikivoyage XML dump) and there is no native one. So I would need a wrapper around a C implementation. At first, I used libxml2, because it has a very appealing name it has a very convenient XmlTextReader API where you are controlling the parsing loop (no callback like in SAX).

I wondered how it compared to the StAX API of Java, and made a simplistic test printing (to /dev/null) the names of all the nodes. And surprise, StAX was way faster:

  • the StAX (openjdk-7, Ubuntu 14.04, amd64)
    • 35 seconds
    • Memory usage: 30 Mo
  • XmlTextReader API of libxml2 (2.9.1), g++ 4.8.2
    • 50 seconds
    • 3.5 Mo

Then I made tests with SAX, comparing the default Java implementation with libxml2 and finally also libexpat 2.1:

  • Java: 30s (39Mo)
  • libxml2: 34s (2Mo)
  • libexpat: 21s (180ko)

Conclusions:

  • the Java implementation seems quite good (at least in this particular scenario)
  • libexpat is quite fast, but it’s SAX and not pull-parsing (which is very convenient)
  • if you are processing huge XML files, forget about libxml2