Friday, March 27, 2020

covid

Hello there. If you're not an alien archeologist hunting for what happened to humanity over what they called the 21st century, chances are that this post can be skipped. If you are, and if all but the archive of this blog has been damaged beyond recognition, here is what you need to know.

We used to be fighting against microscopic entities we call 'virus' that lack the proper material to 'live', but can self-replicate if they break through the defense of larger CHON entities like use, humans. Most of those virus either don't understand how to break through our defense (or use our biological factories) or are well-known adversaries against which our bodies and medical staff have well-established weaponry. But from time to time, one such virus usually targetting another mammal species encounters a random mutation that suddenly makes us a potential target. It had happened over the '80s with AIDS, and it happened again this year with COVID19.

I've spent much more time than usual checking the broadcast news for updates: this virus can propagate from human to human through dropplets we expel while breathing, but it may also survive for up to one work period (well call that 8 hours) on solid surfaces like those we use to manipulate daily objects. We have no cure for it so far (almost 3 months elapsed since it shown up) but we have supplies that may sustain live to give our immunity system time to find a cure of its own and get rid of the virus before we die, exhausted. But we have limited supply for them.

Of course, you could believe that we had reached a level of civilization where we could easily focus our efforts on making more of such devices .. enough to reduce the losses to a marginal amount. I truly hope you'll be right in a few weeks. But so far, this crisis is shedding raw light on all the flaws and failures of our civilisation. All those stupid tussles to remain in position of economical supremacy. All those fake news and who-gets-most-buzz. Some have concentrated industrial facilities in a fairly small area of the planet to maximize their profits, taking advantage of weaker social rules they have there, and we have failed to force to keep significant industrial activity near us.

Meanwhile, our best hope is to slow down the exponential progression of the virus by avoiding to meet too many other humans. We call that a quarantine when it applies to a ship that must wait before releasing passengers, except this time, we're all aboard the ship and we must stay confined within our houses. Some manage to work for their employer under those conditions (including me), others can't. In some country, this puts them in serious trouble. In others (including mine), they can get money from collaborative efforts managed by the government.

We used to take care of our kids for about 1/3rd of a daily light/shadow cycle of our planet (we call "day"), let them sleep for another 3rd and have them taught shared knowledge by professionals in so-called "schools" for the 3rd third. We know have them 24/7. It has been said they wouldn't receive more knowledge to learn meanwhile, but it isn't quite true. We need to supervise that in addition to our daily work. And for most of us, we haven't got robotic assistance to house management. At best some of the tasks are mechanized. It's manageable, but sufficienly disturbing so that I have only made a single ammendment to my hobby-project over the last month.

I know I used to make a special release on March 24th for my birthday. I'm afraid I couldn't arrange such a thing this time.

I believe we can sort it out, I don't know whether we'll collectively be smart enough to make it be the very last time we're shocked by such a little thing.

Friday, March 20, 2020

Coder pour Onyx Boox

Bon, j'avoue que autant installer un devkit android sur mon NUC était un objectif quasi-prioritaire en 2019, autant il ne s'est quasiment rien passé de ce côté-là, en fin de compte. Au mieux j'ai refait le week-end dernier un tour des repositories open-source et Androïd-Demo ... et je trouve assez curieux que l'un des deux soit entièrement avec du code C++ pour Qt. Mais tournerait-il vraiment sur le boox ? Les derniers commits sont de Nokia et on plusieurs années (je dirais qu'ils datent de 2012 ou 2013...) est-ce du code qui était prévu pour un ancien modèle (pré-android) ? Fort possible puisque les boox Androïd arrivent fin 2013.

Moi j'ai un modèle N96, qui est une évolution du M96. Le package "booxsdk" propose des versions de gcc pour les modèles M90, M91 et M92, qui sont tous pré-androïd selon wikipédia.

On ne peut pas vraiment dire qu'Internet croule sous les projets et pourtant, il y aurait moyen de faire tellement mieux qu'un browser classique ou qu'une adaptation poussive de Tomboy ou de l'application Wordpress ... Je devrais peut-être essayer de commencer par termux ? Mais moi, ce que j'aimerais c'est plutôt un stylux :-/

C'est là que j'aurais bien aimé avoir sous la main un pote qui fait de temps en temps du développement Androïd pour me guider un peu dans ce nouveau monde.

Friday, March 13, 2020

Dans le code de Celeste ...

Je m'étais fait une conversion epub du code de Celeste, peu après avoir reçu mon boox, pour étudier un peu tout ça pendant que *deline était à son cours de sport. Il faut bien dire que ce n'était pas simple à suivre, entre les hyper-jump et compagnie. Mais ici, un des développeurs vient de tweeter une série de mini-vidéos pour montrer toutes les ruses de gameplay qui ont été mises en place pour que le gameplay soit satisfaisant.

Oh, j'ai une partie en cours sur Switch, aussi ... mais M. Oshiro en furie me mène la vie dure.

  • De 1 à 4: on a des techniques équivalentes dans Bilou
  • 5 - contourner les coins au lieu de se cogner la tête dessus. Pas encore.
  • 6 - s'aligner sur une plate-forme à sens unique quand on passe à travers
  • De 7 à 10: différentes manières d'étendre les zones de collisions avec les murs / plate-formes pour compenser des pressions de touches un peu tardives de la part du joueur (un peu comme le vile-coyote-time, mais dans d'autres circonstances - notamment pendant un wall-jump).
edit: ça y est! j'ai passé M. Oshiro!

Tiens, pour la comparaison, on atteint quand-même les 5000 lignes de code pour Player.cs (qui pourrait contenir plus que le code de Madeline, hein)

En stand-by ?

L'élocution de *deline sur Hergé m'aura déjà bien occupé sur ce début de mois de mars. Ce coup-ci, s'il n'y a pas grand-chose de bloggé, c'est parce que j'étais plongé dans tout autre chose la plupart du temps.

Et avec la quarantaine nationale qui vient d'être décrétée, ça ne risque pas de changer beaucoup dans les prochains jours >_<

Oh, au fait, vous saviez que les albums pré-casterman avaient été imprimés avec un procédé cliché/stéréotype qui ressemble étrangement au système utilisé pour la gravure des piste de cuivre sur un PCB ?

Friday, March 06, 2020

Détection automatique des pentes ?

Bon, j'ai réglé les problèmes de corruption de niveau dans la nouvelle mouture de l'éditeur (grâce à FakeMetaWindow) et on va pouvoir passer à la suite. Par exemple commencer à ajuster les "méta-boutons" pour qu'ils permettent d'utiliser directement les nouveaux types de tiles.

Parmi tous ceux-là, il y aura les nouveaux types de pentes, et si on doit commencer à jongler avec 64 types à la main, on ne risque pas de tenter beaucoup de fantaisie là-dedans. Du coup, je me disais: comme j'envisage déjà de juste copier-coller des tiles dans une 'sprite page' spéciale pour définir les types de pentes, est-ce qu'on essaierait pas de faire un système qui reconnaisse automatiquement la pente la plus proche quand on passe le stylet sur un tile ?

Une répétition pour le scribble widget, en somme.

edit: si l'idée est sympa pour un peu cogiter le soir, en revanche il est clair qu'un système de ce type ne pourra pas atteindre 100% d'exactitude, et qu'il me faudra de toutes façon un widget pour corriger les p'tits défauts de l'auto-slopeur... donc l'approche pragmatique sera de commencer par ce widget et d'ajouter l'auto-slopeur uniquement par après.

Sunday, March 01, 2020

Top 100 Video Game Music

Last December, my brother finally released his top-100 chart of video game music. It took me a few days to understand his process: although he names one track per game he lists, we shouldn't consider it is a video game tracks chart. He's really trying to compare full OSTs to one another.

That was a lot of things to check at once, especially since there are games in this chart I had never played, and was aware of their music only through overclocked remixes. So I started a twitter thread, commenting one track a day, bottom up. And there are many points where we apparently disagree. (of course, the fact that we start with the soundtrack for Fury of the Furries out of the top 100 didn't help).


En décembre dernier, mon frangin nous a sorti son top-100 des musiques de jeu vidéo. Projet ambitieux et longtemps maturé puisqu'il ne s'agit d'un classement piste-par-piste, mais bien jeu par jeu. Comprenez par là que quand il met "Introduction de Dune" en 30ème position, c'est tout l'OST de Dune qui est repris: Chani's Eyes, Morning, etc. mais qu'on nous propose un 'aperçu' de l'OST à travers la musique d'introduction. Et moi, pour me rendre compte si j'étais ou non d'accord avec son tri, j'ai repris une musique par jour sur twitter. Du bas vers le sommet. Demain, on attaque le top 10.

Mais plus j'avançais, plus je me rendais compte que j'avais un problème avec la façon de faire "intuitive" de mon frère. D'une certaine façon, un top-100, c'est pour moi le résultat d'un tri à l'aide d'une fonction d'évaluation entre les objets. Si Super Mario World se retrouve devant new Super Mario Bros, il doit y avoir moyen de dire pourquoi. Un certain nombre de "qualités" de la musique doivent pouvoir être dégagées (qualité des instruments utilisés, richesse des accompagnements, "personnalité"  de la mélodie) et une musique ne pourra être proclamée meilleure qu'une autre que si elle se montre meilleure sur un nombre suffisant de ces qualités. Ensuite, un jeu ne pourra être proclamé meilleur qu'un autre que si un nombre suffisant de ses musiques sont jugée meilleures que les musiques de l'autre.

Au final, ça nous permettrait de test un challenger (disons Céleste ?) par rapport à la collection actuelle avec un nombre raisonnable de "matchs" entre les jeux.

As I progressed towards #50, one thing turned obvious: my brother and I do not approach making charts the same way. Not to say that his way is bad. And neither of us do that through statistics. I figured out I see charts as the result of a sorting process. Being a "computer scientist", I know that sorting implies we have a comparison function that is capable of telling which of two items is the greatest. If items have multiple dimensions, it relies on simpler functions applied to their constitutents (e.g. comparing their catchiness and the quality of their instruments separatedly), then combining those things together - either through priorities or through weights - to get a final comparison result.

I also know that if I have a pre-sorted list and a new challenger, I should be able to find its rank with a fairly small amount of comparisons (log2 N, to be precise) to existing items (that number would be about 7 per challenger in a top-100). That in turn implies that such comparison should work for items we pretend to be sorted.


Les jeux retenus par mon frère sont assez variés, aussi bien en styles (RPG, shoot'em'up, sandbox, plate-forme, horror shooter, point-n-click) qu'en plate-formes (on va du C64 à la Switch). Le premier problème du coup, c'est qu'au fil des années, la taille des OSTs n'a cessé de croître. Comment comparer Warhawk et son excellent thème (mais unique piste) avec les 10 pistes de Lotus II ou les 52 pistes de Skyrim ? C'est d'autant plus délicat que dans les jeux modernes, on a souvent beaucoup de remplissage dans la bande son. Des pistes avec un solo instrumental pour présenter un NPC ou une ambiance de fond pour les landes perdues qui auraient vite fait de 'plomber' le jeu.

Pour pouvoir faire un match entre 2 jeux sur la durée d'une pause café au plus, je pense que chaque jeu devrait être représenté par un petit nombre de "championnes" disons 3 pistes (5 au grand maximum et on évitera les nombres pairs). L'idée est que si un jeu A parvient à avoir une meilleure piste pour chacune des championnes du jeu B, alors le jeu A est déclaré vaincqueur, et on accepte par principe le fait qu'aucune autre piste du jeu B n'aurait pu le sauver -- sinon, elle aurait dû faire partie des championnes. On peut très bien imaginer qu'une des championnes de A explose toutes les championnes de B ou que chacune des championnes de B a trouvé une championne de A qui la déclasse spécifiquement.

Se ramener à une poignée de musiques plutôt qu'à une seule évite d'avoir ratatiné tous les shoot-em-up avec un titre péchu (la jungle de DK) pour se faire étaler par le premier JRPG venu et son thème-requiem-du-NPC-perdu si poignant. Un jeu à la BO variée (à mon avis c'est un plus) pourrait donc avoir plus de chance de grimper vers les sommets qu'un titre très mono-thématique.

The first thing that doesn't quite work with my brother's top-100 is that we do not know what to compare. He names only one track per game, but considers many other should be taken into account. He has games with only one track (let's say warhawk), some with a few dozen (say a regular SNES platformer), and some with so many hours of soundtrack that you cannot decently hear them all (yes, you JRPG). Moreover, the longest the soundtrack, the more likely you are to see it filled with uninteresting 'NPC solo themes' or ambiant tracks of 10 minutes that hardly feature 30 seconds of true "music" (yes, you, Rayman II).

I would suggest instead that for every game, we pick at most 3 tunes that will be the 'champion' for that game. If none of those tunes manage to beat the tunes of a challenger game, we could pretty much assume that none of the OST would be on par. The selection should be made carefully, but I believe it can accomodate for more sophisticated stories with different kind of emotions, where we need a beautiful-and-quite tune to face JRPGs, a dynamic tune to face Megaman and an epic tune to face hack-and-slash, if any. In Link to the past, that trio would likely be (Overworld, Darkworld, fairy fountain). When comparing two games, we would make at most 3 matches, track-vs-track. The game that won most matches is claimed better than the game who lost them.


La deuxième règle serait de se limiter aux musiques de jeu vidéo, pas à l'OST tout entière. On ne prendrait donc pas en compte les effets sonores ou le doublage des personnages quand on compare deux titres. Je pense aussi qu'on devrait mettre de côté les ambiances sonores non-musicales. Il nous faut quelque-chose à base de notes qui peuvent être jouées sur des instruments. Sans aller jusqu'à dire qu'on devrait faire comme si les sons de vents et de gouttes qui tombent dans les grottes doivent être filtrées avant le match, mais quelque chose qui est constitué presqu'exclusivement de sifflement de vent, de craquements, de chuchotements avec à l'occasion quelques notes de violon dissonnantes qui durent si longtemps qu'on arriverait pas à les chanter ... bin, laissons ça de côté. Que le jeu se choisisse des championnes qui sont de vraies musiques, et s'il en est incapable, qu'il reste en-dehors du concours.

Troisièment, la musique doit faire partie du jeu. Peu importe qu'elle soit sur l'écran titre, dans un niveau, un menu ou les crédits de fin, mais elle ne peut pas être sur un CD vendu à côté du jeu avec des versions remasterisées ou une vidéo de bande-annonce. S'il y a eu plusieurs éditions du jeu, on devrait choisir une seule édition qui semble la meilleure pour y pêcher les championnes, et toutes les autres éditions sont hors-concours.

Je pense aussi qu'on devrait déclarer hors-concours toutes les musiques qui ont été reprises dans un jeu mais qui viennent en réalité d'ailleurs. Que ce soit un titre de JMJ dans loco 64, un groupe pop dans Xenon Megablast, JS Bach revisité dans Gyruss ou la bande son du film Star Wars: tout ça n'a rien à faire dans le top 100 des musiques de jeu: ils ont déjà leur propre championnat. Que les jeux concernés se choisissent d'autres championnes ou qu'ils se taisent à jamais.

Second thing, I'd like it to be a video game music chart, not a sound track chart. That means the quality of the sound effects, the voice acting is not taken into account when comparing two games. That also means that ambient moods in the OST are automatically dismissed. It has to be music, that is, instruments playing notes. Some ambiant, non-instrument sounds are accepted, but they cannot be the main part of the track. That mean it would be very tricky to find three "tracks" for games such as HoB, despite it has a very long soundtrack. It means if you want to convey fear of anxiety, you have to do it through notes, not through whispers, cracks and windblows with occasional dissonant violin notes that last for so long that you couldn't even sing a note that long.

Third thing, although it's the most obvious, tunes that are considered must be part of the game. They may be title songs, in-game music, staff roll, soundtracks for cinematics, but they cannot be tracks on a promotional audio CD, remasters or clips from video teasers. At least, my brother and I seem to agree on that. If there have been re-editions of the game (or multiple editions with different soundtracks), we are free to pick either edition we believe the best (is it SMB or SMB-as-in-all-stars, or SMB-tune-as-in-melee), but it can only enter once. And we should use the same edition for all the matches the game does. It should be original composition, too. Covers of Jean-Michel Jarre in Loco 64, of Sky playing J.S. Bach in Gyruss and the pop band sampled for Xenon Megablast are ruled out. If a game features a mix of original composition and imports from non-video-games (e.g. a Star Wars game), only original compositions may be champions for the game.


Enfin, je crois que l'on doit faire abstraction de tout ce qui n'est pas musique et expérience d'entendre la musique pendant le jeu. Que le jeu ait un gameplay pourri et qu'on ne l'ait utilisé que comme un juke box ? pas d'importance. Qui a contribué à la musique ? pas d'importance. Il a fait un bide au niveau des ventes pour Dieu-sait-quelles-raisons? aucune espèce d'importance. Il n'a jamais été disponible qu'en téléchargment gratuit et jamais dans un catalogue commercial ? pas d'importance. Par contre, le jeu doit être un vrai jeu. Pas de démo jouable qui n'a pas d'objectif. Pas de vaporware dont la bande son existe mais le jeu n'a jamais été disponible.

Finally, we should abstract from everything that is not the music, and the experience of enjoying the music while playing the game. A game with terrible gameplay but great music should be able to enter the top 100, even if we say "yeah, I never played further than level 1 in XXX, but I loved to launch the game, just to listen to musics in the secret juke box screen". Who did them ? Was the game a commercial success or an obscure title released while official support for the console had been dropped ? Was it a free-to-download game that never received a commercial release ? That doesn't matter. That must not matter. But it may not be a cancelled game that nobody could complete because it isn't finished. It may not be a demo. (Sorry, basket island: that means you cannot enter).

Thursday, February 27, 2020

fgets

J'ai apparemment laissé dans un commentaire de revue "fgets doesn't guarantee you have a terminating \0 on oversized lines". Il faut bien reconnaître que c'est le genre de farce auxquelles il faut s'attendre de la part de la bibliothèque C standard. Mais là, à y regarder une 2eme fois, j'avais tout faux.

fgets(ptr, size, stream)  reads in at most one less than size characters from stream and stores them into the buffer pointed to by ptr.  Reading stops after an EOF or a newline.  If a newline is read, it is stored into the buffer. A terminating null byte ('\0') is stored after the last character in the buffer.
C'est presque le mieux qu'on puisse espérer, non ? on lui passe un buffer alloué avec data[N] comme (data, N) et il se garde un dernier p'tit caractère pour la route le \0 de fin-de-chaîne. Que demander de mieux ? Non, en vérité, c'est de strncpy qu'il faut se méfier.

Mais de ma phase de déni/doute, je me suis quand-même refait un p'tit programme pour tirer ça au clair. Bin rien à redire. On a bien un \0 de terminaison à chaque coup (le programme ne lit que 16 caractères à la fois). Soit juste après le retour à la ligne (\n), soit en dernière position.

Seul cas où il peut être manquant: si il n'y avait rien à lire du tout. (auquel cas fgets nous renvoie un pointeur nul plutôt qu'un pointeur vers notre buffer, ce bon vieux data). Même une fin de flux sans fin de ligne ne le met pas en défaut.

Brave petit.

Toujours à vous demander ce que c'est que cette histoire de \0 ? vous pensiez qu'un ordinateur auquel on répond "Piet Burner" quand il vous demande "Entrez votre nom >" savait où se trouvait le début et la fin du nom en mémoire ? Bin pas franchement. Dans la majorité des cas, il a besoin d'un caractère spécial, en fin de chaîne, pour savoir qu'il a tout lu / copié / analysé / imprimé ... C'est le caractère de valeur 0 (pas le caractère ASCII en forme de 0 que vous rajoutez à la fin de votre fiche de paie) qui s'y colle. Enfin. Presque toujours. Il existe un obscur système d'exploitation dans lequel ce rôle était dédié au caractère '$'. Si, si...

Faites en sorte que le \0 soit manquant (en mangeant trop de pommes, en écrabouillant la tête de Yoshi ou en tapant le Konami Code pendant le chargement du jeu), et le CPU continuera "sagement" à manipuler "des choses" comme si c'était votre nom ... avec potentiellement la possibilité d'aller écraser l'emplacement de votre personnage sur la map, des bouts d'inventaires au le nom du prochain pokemon que vous allez rencontrer :P