Showing posts with label internet. Show all posts
Showing posts with label internet. Show all posts

Monday, September 28, 2026

GetThread.pl

With Nitter.net receiving a cease-and-desist from the dark side, it's time I try harder to get something useful from the back-up I made before leaving twitter ... If we do just

sed -e "s/<h1/\n<h1/g" Alltweetsfromblogger.html | \
      grep 935254889919369216 | sed -e "s:</p>:</p>\n:g" | \
      cl xml

we end up with two "conversation" blocks, because the way I proceeded was

  1. paste the link
  2. paste the copied contents
  3. "Conversation" with `<h1>` tag is something that comes from the copy-paste

That was the starting point.  

  • Agreed, the command line is ugly, and its output isn't miuch better. 
  • Agreed, its scope is fairly limited: Alltweetsfromblogger is a thing I crafted on Google Documents with a manual routine from my list of threads this blog has links to.
  • There are still some problems after you extracted as one line the : both before-conversation and in-conversation links are undistinguishable, apart from the fact one points to a date, which is weak

* but * Google Docs also offers .md export, and looking at the .md conversion, I did spot blank lines while there are none in the conversation itself. So maybe adding a blank-line-to-newline converter before we look for the post ID will help ? 

sed -e "s/<h1/\n<h1/g;\
s:<p class=.c0 c3.><span class=.c2.></span></p>:<hr/>\n:g" Alltweetsfromblogger.html |\
grep "935254889919369216[^<]" | sed -e "s:</p>:</p>\n:g" | cl xml

That was the start, somewhere quite near after nitter.net disappeared. The idea since then is to extend the "blogpress" scripts, and have the "development stories" as well as chats with fellow developers aside the main blog text.  

I stuck to the html export: the .md file would have been easier to parse, but the embedded pictures in base64 encoding promised to be a pain to work with. It's not the best software in the world, but I managed to couple it with a few lines that scan the json files from my old twitter backup so that I can identify when pictures in the Google Document are actually thumbs of videos, and reinject the link to the videos.

I did some planning-on-calendar that truly helped nailing down some details, but the photo I shot is completely unreadable :-/ Fuzzy blogging for fuzzy coding ... 

It's been about 1 month now and finally I get the kind of output I want. It's time to let you know about it and see how I can actually get those "threads" embedded into the sample chapter. 

Monday, August 24, 2026

The Lost Tiled Tutorials

Many of the tutorials I had encountered between SEDS and LEDS are now out of the web. Too bad, they were key material I sent readers towards when I did not feel like translating some lengthy explanation about tiled games in general. Since I'm editing some part of the blog as if it was going to be the Chapter 1: Tiled Games of a book, I found myself digging through archive.org to find the original material, print it and review it as much as possible. 

The most influential of them all was certainly the MC Kids big post. Where we have Greggman discussing *really* how they made the game back on NES days. It details several clever tricks that help making a quite-sized game on limited resources, some of which make mostly sense if you're on #6502 CPU (like having a set of byte tables rather than structures), but also the key gamedev concept of a "hotspot", a single point that will be used to model the position of the character on slopes.

It is also the most official one, as the post was originally written in 1992 for the Journal of Computer Game Design while the game was from 1992 as well. And since there was an official body publishing it, I can't quite just bring in many pictures of it ... but I guess it's fair to study it, take notes and then post my own notes about what was being said.  

Entre la création de SEDS et celle de LEDS, il y a eu pas mal de posts qui faisaient référence à l'un ou l'autre tutoriel sur la conception de jeux à base de tiles. Evidemment, là-maintenant, un grand nombre de ces tutos ont disparu d'Internet ... juste au moment où je me dis que ce sujet serait bien comme premier chapitre.

Le plus gros d'entre eux, c'était sans doute la présentation du code de gestion des collisions perso/monde dans le jeu NES M.C. Kids, auquel je faisais référence pour les lecteurs Anglophones en 2007 ... Pas trop question d'en faire des captures d'écran dans tous les sens par contre: le truc avait quand-même été publié dans un journal officiel à l'époque. Mais un scan de mes notes, ça, ça me semble honnête. 

The paper goes into significant details of how the levels are encoded (1 byte per 16x16 block, that is used to lookup the 4 tiles composing the block and its type among 100 possible types), how collision with terrain are handled (with direction-conditional testpoints and 5 collision functions per tile type). The author relates the fight to get that extra memory and how you could map the whole level into memory and thus make it easily explorable and transformable thanks to this, but how 8x8 granularity would have explosed the RAM space budget.

It is also completed with retrospective thought of the author about how they'd have inserted "beginning of hill" and "end of hill" types (helpful to save lookups in the slope management) and how they'd have made the "how do I move left[tiletype, xpos]" array providing absolute position rather than relative (+1, 0, -1) positions in a revised version of the engine.

Bon, par contre, près de 20 ans plus tard, il faut bien avouer que pas grand-chose de tout ce qui est présenté là ne se sera retrouvé dans le moteur de jeu de SchoolRush. Entre les ruses propres au 6502 et les choix d'implémentation que l'auteur lui-même indique qu'il n'aurait pas refait pareil rien qu'un an plus tard, il reste juste le concept de "hot-spot" -- réduire le personnage à 1 point quand il faut décider où il se trouve dans une pente -- et le conseil général que "mettre des pentes dans un jeu, ça complique significativement le code". Mais c'était intéressant à relire malgré tout.  

Retrospectively, most of it did not end up in the GEDS engine. With a 66MHz CPU, if you realize that you need one extra memory lookup to get proper slope implementation, you go for that extra lookup. And if you may need more than one, you just write a loop. It's not about being lazy or not, it's about getting the most of what you have. And nowadays, you could "easily" add some "start-of-slope", "end-of-slope" meta tiles by means of auto-tiling rules.

The second note-worthy series are Tony PA tutorials about tiled games development. These were for flash games, with full-running examples at each step and detailed ActionScript code. Smartly enough, Tony starts his tutorials with top-down playfield in which the character can move freely, and then step by step introduces gravity, moving platforms, ladders and finally slopes. 

I was enjoyed to start reading it as it featured a picture of Charlie the Duck (which may explain why I was researching about it in 2007 and certainly why I just posted about it, btw :P) and saying "Sure if our hero is a jumper-type of hreo, he could still [proceed forward in a stair-like, slopeless ground], but normal heroes are very happy if they can avoid jumping. It could have been a good resource, but I knew from the time I've spotted a drawing with "impossible slopes" that I couldn't derive from what was presented there.

Un autre tuto qui sortait du lot, c'était la page sur les pentes de TonyPA. On lui doit la phrase sur les héros qui sont content de faire des bonds (hmmm ... Jill of the Jungle ?) et ceux qui trouvent que les pentes, c'est bien. J'avais laissé tombé assez vite à l'époque constatant que plusieurs interdits allaient sans doute me pourrir la vie ... Il faut noter que Tony faisait ses tuto pour de l'ActionScript, ce qui lui permettait d'avoir une petite démo interactive dès sa page web, mais ce qui donnait aussi du code plutôt étrangeoïdal pour qui a fait un minimum de C/Pascal/Basic dans sa vie.

A côté de ça, il faut reconnaître à Tony que sa petite démo s'inscrivait dans la continuation d'autres tutos qui démarrent dès le niveau "sokoban" pour ajouter petit à petit la gravité, les échelles, etc. Par contre, les "combinaisons interdites" qui proviennent du fait qu'on désactive tout test de collision horizontal dès qu'on est sur une pente ? Le personnage qui logiquement grimpe des escaliers tandis que son image se déplace le long d'une droite continue ? Non. Je me félicite de ne pas avoir insisté. Mais il aura le mérite de m'avoir aidé à déterminer pourquoi je veux des pentes dans Bilou. Je n'ai pas la physique de Sonic, mais depuis Keen 4, les niveaux à pentes semblent plus intéressants que leurs équivalents tout à angle droit. Et une pente, ça permet aussi de faire prendre de la hauteur à un projectile du type carapace de tortue, en plus de rendre le niveau plus organique.

During this 2026 retro-review, I noted that most of the slope logic seems to imply that only the display of the character is aligned with the slope. The logic entity made of testpoints and hitboxes simply moves along a stair. The two locations are only re-aligned if we jump from a slope. It also bypass the problem of solid-ground-tiles-and-slopes by disabling all horizontal checks while you're on a slope. That explains some of the "forbidden tile combinations", and implies that if you make a slope in a path that is high enough for certain characters in your game but not all, the engine will completely ignore the fact that the monster you're fleeing through that narrow passage should get hit in the face and not be able to follow you. And that has been a critical thing to address for my games even before I started working with the Nintendo DS.

So why would you put slopes in a Mario game ? so that your koopa shell keeps flowing forward and not bounce back in your face. Here's why. (Or simply to make your organic level feel organic and not just look organic). 

A last one ? Hopefully, the video from Vblank Entertainment about the conversion of Retro City Rampage into ROM City Rampage is still online. It goes into details about what tiles are and how it allows a large world to run on a sub-MegaByte cartridge, what palettes are, why you need to care about not putting too many sprites per line and so on. If you ever need a primer to the "Retro Game Mechanics Explained" series and feel like sitting idle for 10 minutes, this is the best I can think of at the moment.

(The author ended up writing his own NES emulator full with debugging features and his own high-level assembly -- NESHLA hosted on sourceforge -- in the process)



Sunday, November 16, 2025

Signets et attach

J'ai pour la SchoolZone l'intention d'introduire des signets/marque-pages qui pendouillent... on pourrait s'y accrocher (indispensable), grimper, descendre (sympa) et ils réagiraient comme des cordes plutôt que comme des barres.

J'ai appris dernièrement qu'il fallait que je prototype ce genre de choses dans l'environnement des "three rooms" sous peine d'être démoralisé par le côté "nu et inintéressant" d'un niveau à peine commencé. Et coup de bol, il y a un coin de la salle "école" qui conviendrait bien : le haut. On pourrait atteindre les signets en utilisant la gomme et s'en servir pour rejoindre l'éponge, un peu compliquée à utiliser pour l'instant.

Hanging to a rope-like bookmark, using it to swing around and hop to the next ... that's clearly something I'd like to bring into the school zone and I may have just found the right way to introduce it first in the "three rooms" demo. Yes, I could use one of the levels in which they are featured, but recent development on the green zone shown that a rushed large level doesn't motivate me as much as a small polished screen can. They would be there, in the top corner and providing an alternate way to reach the swinging Spongebop.

Avant de permettre de s'y accrocher et de se balancer, je voulais voir comment m'y prendre pour une interaction plus simple: juste laisser Bilou bousculer le signet et qu'il ondule un peu en reprenant sa place. J'ai le comportement "circular" qui pourrait être pas mal pour ça.

Before I'll let Bilou grab them and swing, I'll have to start with something easier, like just having Bilou disturb them and make them swing stronger when passing nearby. It should be a mere matter of attaching segments to one another with the "circular" controller... except that once Bilou pushes the bottom part of the "rope", segments now need to lookup two objects instead of just one. And that's a bit more tricky to handle for my engine that only allow one object pointer per object.  

Sauf que on tombe dans le cas de figure compliqué où les mouvements d'un segment dépendent à la fois de la position du segment au-dessus et en-dessous de lui, ce qui pose trois questions:

  • Est-ce qu'il faut que j'ajoute une zone "solide" à Bilou ?
  • Quels flags (pour les collisions) sont disponibles pour ajuster les comportements (j'ai oublié ^^") ?
  • de quelles infos est-ce que je dispose après une collision entre deux segments ? Est-ce suffisant ? 

J'avais pensé relire le tag "attach" pour me rafraîchir la mémoire, et j'ai eu la désagréable surprise de le trouver confus, avec quelque malheureuses infos pratiques perdues au milieu du "gamedev story". Il est devenu mon "tag de la semaine", mais j'ai dû reconnaître que ça ne suffisait pas. Je me suis retrouvé à essayer de l'extraire avec les outils "blogpress" et lui appliquer une feuille de style avant de l'utiliser pour tester les "pages web codeberg".

So, that was the idea back on 11/11 when I sat down with my notebook and collected the questions that needed answers before I could get to the coding stage. I thought unrolling the "attach" tag of the thread would give me answers, but it turned out the useful information was somehow lost into trivias, screenshots and other progress reports. And the code documentation wasn't much better, so I ended up restoring a setup for blogpress and tutogit at the same time, uploading them all on codeberg and see whether I could apply simple.css etc.

ça m'a donné le déclic pour reprendre le travail sur le repository "tutogit", en plan depuis 7 ans, vu que maintenant le nouveau système de gestion des propriétés du niveau est arrivé à maturité. Je pense que ce serait là le bon emplacement pour des pages thématiques présentant chaque élément du moteur de jeu ... qui puisse au final s'intégrer à la documentation doxygen. Voilà déjà celle pour attach.

Wednesday, November 05, 2025

simple.css

That's the stylesheet colleagues use when they make some internal website. This is what my HiFi remote control over HTTP is lacking... https://simplecss.org/

Although, I may like it better with a few CSS transitions, especially for the navigation header:


header > nav a,
header > nav a:visited {
  margin: 0 0.5rem 1rem 0.5rem;
  border: 1px solid var(--border);
  border-radius: var(--standard-border-radius);
  color: var(--text);
  display: inline-block;
  padding: 0.1rem 1rem;
  text-decoration: none;
  transition-duration: 0.2s; // added
  
}

header > nav a.current,
header > nav a[aria-current="page"],
header > nav a[aria-current="true"] {
  border-color: var(--accent);
  color: var(--accent);
  cursor: pointer;
}

header > nav a:hover { // forked out of block above
  border-color: var(--accent);
  color: var(--accent);
  cursor: pointer;
  transform: scale(1.1); // added
  transition-duration: 0s; // added
}

It acts on <a> tags that sit withing the <nav> in <header> section, making them more ... playful and engaging ? It's been sitting here for a while, but now that I'm toying a bit with codeberg pages, It's time to publish my original (Nov '24) notes as well ^^"

The basis of  simple.css is to create a grid at page level, and to indicate on which cells of the grid each item should fit. Lines are created automatically by titles, paragraphs and things alike, while columns are templated once for all.

The core layout of the document is defined by grid-template-columns: 1fr min(45rem, 90%) 1fr;, which is where the 3 columns come from.

  • column 2 is 720px (45*16) if that fits, 90% of the page width otherwise.
  • columns 1 and 3 are as large as allowed, the fr unit being "how much space is left". Apparently, balancing available space between the two is automatic although you could have used .5fr 45rem 1.5fr to get one margin bigger than the other.

45em is more or less the size you need for a 60-75 characters amount in English (the target of most LaTeX documents). There will be another rule stating grid-column: 2; within body > *, meaning that anything within any tag within <body> goes into column 2. That's why my blogger-to-simple script ends up with some text weirdly on column 3 when it isn't in any tag, but just sitting directly within <body>

Saturday, April 12, 2025

Gamebrew / platformers

Somebody on gbatemp surprised me back in 2016 claiming (about School Rush)

HOLY CRAP! I'm surprised to see an actual game here, because usually most DS Homebrew is just shitty abandoned tech demos. Nice job on this! I'll check it out soon.

I dug that one again not so lately after School Rush finally got its Gamebrew Wiki entry and it felt hard to believe given the 1394 other entries the wiki has just for NDS games. There had been some unfinished titles for sure that had just enough contents to rank fairly in seasonly "coding" competitions, but there had also been brilliant titles. It was just after I ran into some "7 best DS games" that would only mention a few FPS and then non-game homebrews... I can't review all 1394 games, but I sure could give the "platformers" category a spin

"Sonic, the game" defines quite well the first category: graphics ripped from various 2D titles in Mario and Sonic series, unfinished physics and uninspired level design and no sound whatsoever. At least it demonstrates scrolling in large levels with parallax effect for the background layer.

Monky. One-screen collect-and-progress game. You'll have to backtrack if you missed some letters on the way. You'll lose all the collected bananas if you get hit. 1 monster type, 4 levels (as far as I can tell). (Unrelated) background music featuring a mod player and a few sound effects.
A nice tech demo using PaLib and graphics ripped from DK Jungle climb GBA game, but not very inspired as far as game and level design goes.

I did not pass level 1 on first play. I missed a key gamedesign element: as you keep moving forward, you'll enter a sort of "run state" where you jump higher. There seems to be 4 worlds of 5 levels each ... that would be worth playing more before rating the quality of level design. You've got sound and music, but if you've played some pinball titles on the Amiga, you'll immediately recognize the style and honestly, it doesn't quite fit the coconut plains of the first levels. 

Temple Topple could have been featured in our "Biloutris" project, I guess. Block falls, they disappear if they line up, but you can't move them (at least, I don't think so). You do have to avoid getting crushed, though. Don't expect much variety as you play. None of the little things that can make such a "climbing" game really funny.

Starting a game has a significant chance of being unfair. Once you're one or 2 screens away from the bottom, there's little chance of getting crushed, and in between, there's a good chance you'll have to wait for the next jump option to show up. I gave up around 1300 pixels high, out of boredom. I would bet on looped WAV/MP3 sample for the background music. It might have been the author's hands-on title for DS Game Maker...

I tried Epic Caveman, too, and understood why the wiki entry only lists the title screen. The title is an endless runner, somehow akin to the "running zilla" game offered when a chrome browser cannot connect to the internet. But here obstacle are quite large, right form the start, requiring very precise timing to clear the jump over them. You can't jump "on" them either, which doesn't seem to make sense in this context. An there will be sudden speed up, requiring you to adjust the tediously learnt timing on the fly. Not even between series of blocks but *within* a series.

There's some sound but nothing really impressive. I'd put it in the category "mini-game of an afternoon, to check you've understood how to use assert import and can structure your project with different screens around the main game screen. Good for a programming tutorial if you had the source, but hardly interesting as a game, although - unlike "sonic the game" - there is coherency and care to detail here.

edit: okay, this is what "sonic the game looks like. and you don't see the fact that if you nearly land on a "platform", it will push you backwards so you can safely fall down instead of remaining balancing on a few pixels. That reminds me why the real sonic has *two* vertical sensors, and not just one. 

(yeah, I hesitated to dedicate 280KiB of blog storage to show that, and I certainly didn't want it to become the post's thumb picture)
 

Sunday, November 24, 2024

Leaving twitter

I've spent most of my spare time posting farewells to the people I was following on twitter. I have now more following on mastodon than there, despite starting not far from 400 followed people. The place has become aggressive to creative people with the TOS update of November 15th.

I created myself a bluesky account too, because it's clear most of the gamedev and pixelart people will / have migrated there. And a ko-fi supporter account for those who haven't migrated and possibly won't.

I'm glad I had decided to reduce my implication on twitter. I'm glad I had captured most of the key interactions already in 2022 when twitter became unreadable for non-subscribers, although I still have many posts linking to items trapped in twitter.

Because the harshest discovery of the week was that twitter archive does not feature any of the replies, likes and everything you *received* from others. Only what *you* did. That means any conversation is lost and any thing I could have said in reaction to someone else's post is missing key context. With over 14000 tweets in the archive and no more public access to the platform's content, automating recovery is not an option. With bluesky, everybody's repository can be downloaded without authentication.

So I'll do my best to recover what I can manually, with the help of blogger archive. I'll post recovered things under the fromTwitter. I'll have some more key replies cross-posted as blogger comments (apologies to comments authors if they feel offended that I took that freedom. You have the right to make me remove them if you want to, of course). When possible, I'll augment the link to twitter threads with an abbr of what was said in the post. The process of that recovery is threaded on mastodon.

And Mastodon ? Well, it will be about the same: the exported data has an 'outbox.json' and a 'media_attachments' folder, but that's it (apart for likes, avatar and bookmarks). inReplyTo entries will list some other's status entries (actually an URL with https://instance.domain/users/userid/statuses/tootid), but that URL is nowhere to be found in the .json file. We *can* get some stuff out of it though, like calling /api/v1/statuses/tootid/context, which gives json arrays ancestors and descendants, the second having all the replies. They have the initiator type xhr in firefox network inspector. And the thing I replied to is in /api/v1/statuses/tootid. That should be scriptable enough.

Friday, November 10, 2023

Neocities

Pendant des années, j'ai eu un site présentant mon projet d'OS et mon activité sur la démoscène... et quelques-uns des jeux qu'on avait réalisés avec des amis. Le point commun entre eux, c'était le nom de l'équipe: "PPP Team (Software)". Il a migré de mon compte étudiant à mon compte de chercheur, puis il a fini par disparaître corps <body> z'et bien quand j'ai quitté l'unif.

Dommage parce qu'il n'y a plus rien pour parler de notre passage sur la Inscene ou des concepts originels du Clicker32 sans lui.

Mais entre deux tweet, j'entends parler d'un nouveau service d'hébergement orienté "bon vieil HTML", sans lourderie en php: neocities. Vu que mon premier hébergeur était geocities, ça fait mouche, bien sûr.

Je transfère donc mes derniers backups sur  https://pppteam.neocities.org/ pour voir ce que ça donne ...

Somebody on twitter mentioned neocities ... Since I have old (pre-php) web contents that has turned unavailable lately, I decided to re-upload it on brand new https://pppteam.neocities.org/ ... So you can visit my old demoscene archives and operating system development manifesto and I don't have to wonder how I could convert that into wordpress

bin ça donne plutôt sympa ^_^

Sunday, November 20, 2022

#RIPTwitter ?

C'était un drôle de vendredi, ou tout Internet semblait convaincu qu'on vivait les dernières heures de twitter.

Cette année-ci, j'ai une bonne raison de ne pas me laisser affecter par ce genre de nouvelle, mais ça ne m'a pas empêché de voir que j'étais loin d'être indépendant de ce réseau social, même si j'ai pris pas mal de distance (plus de #screenshotsaturday ou de #OneTagPerWeek, par exemple)

Il faut dire que twitter a pris la place des forums quand j'ai migré hors de l'environnement universitaire (enfin, ceux qui étaient encore existants). Il a aussi bouché tant bien que mal le trou laissé par la disparition de Google Reader et des flux RSS. Et il me sert de va-et-vient pour les images et vidéos provenant de ma switch comme de ma 'liseuse' avant d'en faire quelque-chose de précis pour mon blog. Au point qu'en août 2021, j'écrivais "typing 'twitter' is like opening the fridge. You don't remember why you did it. Your body just believed it would solve the problem your mind hasn't identified yet."

Mais plus gênant, j'ai pris l'habitude de faire des liens vers des conversations twitter quand il y a eu des discussions préalables, ou quand une image full HD d'un jeu switch est en ligne mais qu'une version réduite suffit pour les besoins d'illustration du blog. Et tout ça, ça veut dire que mon blog lui-même perd un membre si twitter disparaît.

J'ai donc demandé une archive de mes données twitter. Mais le 'takeout' est loin d'être automatique, et quelques heures plus tard, ne voyant toujours rien venir, je prend une archive de mon blog (instantanée) et je greppe tout ça un bon coup pour trouver tous les liens du blog vers twitter (enfin, je pense).

Mauvaise nouvelle, les pages correspondantes ne sont que des coquilles vides, dans lesquelles du code javascript ira écrire le contenu des tweets. Le seul outil capable de faire ça, c'est un navigateur complet (je pense). C'est donc au clavier-souris que j'ai passé presque la totalité de mon samedi à copier-coller les tweets identifiés dans un gros .odt sous google-document (365+ pages au final) avec les URLs par-devant pour pouvoir retrouver et reconstruire le contenu-satellite au cas où ...

edit: il aura fallu finalement près d'une semaine pour recevoir l'archive de 1Go avec entre autres toutes les images et toutes les vidéos postées dans mes tweets.

Bref, ça m'a permis de fortifier un peu mon compte Mastodon.

[done] Et il faudra que je vous parle de ce https://goodboygalaxy.com/

edit++: le week-end du 1/7/2023, twitter a été scellé derrière un mur. Plus d'accès possible aux tweets si on est pas identifié sur la plate-forme. ça signifie qu'il faut définitivement que je procède à la migration vers Mastodon.

edit+++: novembre 2023. Les notifications twitter sont pourries depuis 1 ou 2 mois par des spammeur.se.s qui veulent qu'on viennent voir leur profil payant ailleurs.

edit: essayer twitter archive parser

edit++++: juillet 2024. L'option "poster sur twitter" vient de disparaître de la galerie NintendoSwitch :-/

edit----:novembre 2024, twitter s'arroge le droit d'exploiter nos données pour alimenter ses modèles d'IA. Il est temps que je déménage pour de bon.

Tuesday, June 22, 2021

Je suis un n00b

J'ai découvert la guilde  NOOB de Fabien Fournier via twitter lors de l'appel à participer à leur levée de fonds pour créer un jeu vidéo. En soi un évènement assez banal, sauf que cette fois, les personnages du jeu étaient déjà connus depuis 6 saisons par les spectateurs de la Websérie - un concept qui, lui aussi, m'était inconnu. Intrigué, je lance l'intégrale de la saison 1, je regarde le présentation de Gaea qui crée son perso  avant de me souvenir que j'ai Une intervention prévue en salle des machines.

Quand je remonte, ma fée m'a chipé ma chaise de bureau et est en train de rigoler devant le Jack Céparou. c'est la période où on vient de changer de box, et le nouveau modèle permet de regarder des vidéos Youtube sur la télé. La guilde va donc se faire sa petite place au chaud dans nos soirées entre les Dr. Who et les épisodes de Castle. L'humour, la parodie et le second degré vont permettre de proposer un divertissement très réussi malgré un budget d'amateurs et les personnages bien croustillants, au juste équilibre entre réalisme et caricature nous auront définitivement convaincus.

Soyons clair: le jeu d'acteur de Gaëa, Omega Zell, Arthéon et Sparadrap est excellent. Le truc, c'est qu'ils n'ont pas à être crédible en tant qu'invocatrice ou assassin. Ils sont crédibles en tant que geeks qui incarnent des personnages. Et ça, ils le font superbement bien. Pareil pour les inévitables combats. Quand un JDG nous sort un épisode dans lequel il est supposé être CanardMan mais qu'il se bat plutôt comme léguman ... bin ... c'est mignon puis c'est tout.

Ici, plutôt que d'essayer de faire des combats de dingues à la Seigneur des Anneaux, la série joue sur le fait que c'est un combat dans un jeu vidéo. Oui, les coups sont ridiculement mous par moment et on tape dans le vide à d'autre, ce qui compte ce n'est pas le réalisme avec lequel l'acteur combat mais le petit '-200PV' (ou parfois '-2PV') qui accompagne pour nous envoyer un 'bin oui, on est dans un jeu! t'avais oublié?'

Quand ma fée est revenue de la bibliothèque avec le roman "La pierre des Âges (saison 1.5)", je savais déjà bien qu'il y avaient des 'produits-dérivés' de l'univers de Noob. Mais j'avoue qu'entre le graphisme pas franchement à mon goût de la BD, l'idée euh-ouais? de Néogicia et le fait que je ne suis pas un joueur de mmeuporgs, je ne m'étais pas précipité pour acheter les romans. Bin j'aurais peut-être bien dû. Parce que non, on ne verra pas Sparadrap faire l'andouille ni Omega Zell prendre la pose dans le roman, mais c'est toujours bien la même écriture et les même personnages. Fabien Fournier a réussi à choisir un style équilibré entre la narration classique, les dialogues comme-dans-la-série et les chapitres dans-la-tête-du-perso. Quand je lis les répliques, j'entends les voix de Sparadrap ou d'Arthéon dans ma tête. Je vois les grimaces de Gaëa qui cogite. J'aimerais entendre la voix de Zell, mais n'ayant pas l'acceng, c'est plus difficile.

En plus de ça, le "1.5" un peu troublant au départ prend tout son sens une fois la lecture entamée: chaque saison de la web-série démarre par une introduction en vitesse d'un nouveau contenu dans le jeu-qui-n'existe-pas Horizon. Au risque de voir le spectateur décontenancé par les références au sans-âmes, à la Pierre des âges, un nouveau continent, une nouvelle faction ou que sais-je encore. Les romans, eux, traitent justement du passage entre ces saisons, sur fond de quêtes-d'investigations, de rumeurs de forums et tutti quanti. Bien trouvé. Bref, j'ai accroché et ma fille a laissé de côté ses re-lectures de Harry Potter pour se plonger dedans (le "bin non les louloups, je ne vais pas vous mettre la saison 3 tant que *deline est occupée à lire le tome 2.5" n'y étant peut-être pas tout à fait étranger)
 


Thursday, March 25, 2021

c:\sink.pl

 Bon, vu qu'on est re-confinés j'ai toujours une machine Windows à la maison. Elle a reçu un mingw (non sans une grosse dose de Rongtudjus). Et si en plus elle avait PERL, (pacman -Sy, mon ami), serait-elle capable de faire des échanges de fichiers avec une DS ?

Bin ça n'a pas l'air d'être le cas. Même après avoir autorisé PERL sur tous les réseaux dans le firewall ... tout au plus, le Windows parvient-il à envoyer les invitations à transmettre (en UDP sortant). Mais j'ai systématiquement une erreur 0xcafe au moment d'essayer d'établir la connexion.

Eh ? ... pas si vite. C'est quoi cette cochette à gauche du nom 'perl' ? et pourquoi est-elle restée décochée ?


Ah bin oui. Là, tout de suite, ça va beaucoup mieux!

Comme ça je peux récupérer le 'xmasdad' découpé pour faire de l'animation modulaire. C'est la branche tuto qui va être contente...

edit: et pour scripter ça, ce serait avec netsh (dont la partie utile de la doc est ici.

Tuesday, March 17, 2020

Bye bye, doctorat.be

Le site que je n'ai jamais consulté de l'ASBL qui faisait des affiches improbables montrant un jeune docteur sur une île déserte cerné par les requins. Il n'existe plus que dans l'Archive.org... leur compte twitter a disparu. Leur groupe linked in probablement aussi. On va devoir se débrouiller sans eux T_T

Il cherchait à offrir des débouchés aux gens impliqués dans une thèse en Belgique. Il pointait vers des services d'échanges de CV spécialisés (dont il reste https://www.abg.asso.fr/fr/candidatOffres )

Thursday, January 30, 2020

There's no places.sqlite home...

Evidemment, qui dit nouvelle machine dit "ach bin non, on va fous faire une noufelle profil pour fotre firefox!" (prononcez 'fawerfogz'). J'avais repompé le répertoire 'profiles' pour le mettre sur un linux bidon histoire d'aller à la pêche aux mots de passe sauvegardés, mais on va pas pousser si loin pour retrouver les fichiers dans l'historique des téléchargements histoire de donner des infos pertinentes pour 388156*.mpeg, si ?

Eh bien, ça se passe dans places.sqlite. Avec deux ou trois autres choses, d'ailleurs.

Friday, September 28, 2018

/r/NDSHacks

During my HTML Quest to find people interested in NDS development nowadays, I stumbled upon a discord channel named /r/NDSHacks. I'm not much into Discord, but since I made an account this summer to follow the gosh-sad-panda-put-Nectarine-offline discussions, I did my best to enter #homebrew_development ...

With some luck it might make my tutorial more meaningful and get some beta-testers more easily. We'll see.

Monday, October 07, 2013

IPv4 deprecated [options]

Some of the Internet Protocol bits have turned History in last November, without making much noise, afaik. Long ago when I started working in the RUN team, I was impressed by the amount of options described in the IP and ICMP protocols. There was so much a loose source-routing combined with route-record options could do.
I was quite puzzled then to see how many active/programmable networks papers would claim “we propose the following shim layer header between TCP and IP because using an IP option …”. Yes, the protocol claims ‘options’ are available, and yet, packet carrying such options were already second-class citizen in 2001, receiving only slow-path forwarding. Nowadays, they’d likely be dropped altogether by some security/performance middlebox at some point before they could reach their destination.
Well… so is the Internet. At some point, bright ideas converted into RFCs need to be turned into transistors or line of code. At some point, someone will say “no way: we can’t afford the chip that will support any memory alignment for the TCP header. If it’s not appearing 20 bytes away from the start of Ethernet payload, we’ll dispatch the packet in a queue for software processing. Period.” And the person responsible for chip design will know that he might have to find another job if the future customers think the forwarding rate is lame.
So between things that couldn’t be made efficient, those that were supplanted by wider protocols (DHCP vs. ICMP Information Reply (Type 16)) and those that never actually made it to the Internet (IPv6 Where-Are-You (Type 33)), possibly due to potential security issues (Domain Name Reply (Type 38)), https://tools.ietf.org/html/rfc6918 does not really surprise me, although it’s a bit disappointing to see hours of agreement process turned into “not widely deployed” with no apparent effort to explain why features didn’t took up.
The companion “deprecated IPv4 options” RFC mostly mentions things that were introduced to support experimental side-kick protocols, related to multicast, quality of service, etc.

Sunday, January 06, 2013

Blog vs Epub, round 1

My fairy suggested a very nice Christmas gift for my (not so lil' anymore) nephews: she owns a thermal books binder and went "oh, but you could print some story of yours and bind it in a book with my machine... My audio processors catalyzed that into "how about stripping some meaningful text out of your blog and print that on 8x8" pages?" and immediately thanked her for that marvelous idea.

Of course, that required first a major upgrade of my "blogpressing" tools. The "images scanner" got complemented with list-post.pl which extracts posts having a certain tag and formats them into an HTML document. From there, I could use Open Office to import the document, export it into ODT format and start adjusting image sizes and other formatting annoyance to fit the documents into two ~50 pages illustrated text. The fight to get that printed out of my fairy's HP all-in-one printer is for another post.

Suffice to say that I decided that I'd avoid printing for my own reading needs and try to take advantage of my cybook instead.

I had no luck with the graphical front-end of Calibre this time, so I dug a bit the web and figured out that I could use the command line approach:

ebook-convert tagtionary.html test.epub --breadth-first --max-levels=8 --margin-left=2 --margin-right=2 --verbose

Even then, calibre gave me a hard time. I guess running Lucid Lynx in 2013 is the root of all my problems, so I'll have to upgrade sooner than wished. Btw:

non-ASCII characters in URLs abort the HTML-to-epub conversion -- leading with mysterious "ascii codec can't decode" exception (and no offending URL/file mentioned), and so did %-escaping in filenames. I had to manually interrupt the conversion after it took about half an hour in conversion attempts, with 3GB resident set and taking up to 7GB of virtual address space.

 It got to the "Creating EPUB Output" stage, and most pages said "No large tree found", then "splitting on page-break". All fine. A few pages have "large tree #0", with a split point defined. (I have no idea why "Split point: {http://www.w3.org/1999/xhtml}h3 /*/*[2]/*[663]" is mentionned there). Even the largest file "english.html" got happily split into 6 parts. Then for some curious reason, "mybrew.html" enters an endless series of "splitting... split tree still too large: 464KB."
From there on, it consumed more and more memory, obviously leaking all the prior attempts.
(edit: after dropping the offending mybrew.html, I managed to get the 54MB epub file. Checking on Odyssey ASAP).
(edit++: Calibre distributed in latest LTS handled mybrew.html out of the (virutal)box =:)

Friday, November 30, 2012

où est mon crayon ?

I guess I should have kept Google+ and blogger accounts separated, but for some reasons, I wanted to open the circles of "readers" for this blog, and I thought enabling g+ would have been the good way.

But all of sudden the little "pencils" and "wrenches" icons that let me edit the content easily got lost.

Hopefully enough, I'm not tool-less to investigate such annoyances. First, Firefox 10 comes with the ability to inspect elements: with just a right-click, I can open the inspector mode (Q) and explore the content of the web page much more efficiently than source exploration would have offered. it's a span.item-control.blog-admin ... neat. It has display:none because of an obscure rule in 1937454905-widget_css_bundle.css ...

I guess I shouldn't have tried to enable "share post" buttons on a layout as custom as mine, but I did. Since the problem only occurs on one machine (and since it's not affecting anyone than myself), I can take local action: somewhere in $HOME/.mozilla/firefox/*/chrome/, there's a file dubbed userContent.css that allows overriding of CSS properties at will. I can then say that

.item-control { display: inline !important; }

And that will show the icons back. Well, it's a bit extreme: it shows icons on any blogs, including thoses where I have no edition rights. And it might do other things on other webpages as well. I could have used a @document domain(sylvainhb.blogspot.com) to work that around, but unfortunately, G has also decided not so long ago that the webpage I'd visit would depend on the country I'm in. When visiting torino, I'd end up on sylvainhb.blogspot.it in no time, with my rules (potentially) not applying anymore.

So I hope I can come back with a real explanation and a fix soon ... I'll have to live with that hack running in-between.

'nuf said. Back to dumblador throwing. I need to ensure we don't grab some when we're carrying some.

edit: all of sudden, I need to swap a bool in about:config to be able to use my userContent.css file ... oh well ...

Sunday, November 06, 2011

The google, the Bad, and the Ugly



So even Google can fall into "we're too big to be wrong", obviously. Empty space everywhere, reduced reading area, "share" features lost and most ugly-and-depressive user interface I've ever seen. Yes, I even prefer the plain black-and-white of early Apple computers. Do you think that's how you'll convert me to G+ ? How can you hire so many people and just miss the good sense to avoid such horror ? when I happen to click on a "reader" tab now, I just want to close it as soon as possible.

You failed. Insert coin to try again.

Friday, June 10, 2011

Microsoft cannot read!

Quand on se mêle d'écrire un serveur Web, le moins qu'on puisse espérer, c'est que les développeurs se soient correctement renseignés sur "ce que c'est, le Web" (donc au moins le RFC du protocole HTTP). Document dans lequel on trouve par exemple à la section 4.4

The transfer-length of a message is the length of the message-body as
it appears in the message; (...) 

If a Content-Length header field (section 14.13) is present, its
decimal value in OCTETs represents both the entity-length and the
transfer-length. The Content-Length header field MUST NOT be sent
if these two lengths are different


Seriously, dudes. When one dares to write books where chapters are entitled "users can't read" where you explain how to design GUIs, the same one should prove that *he* does read. And more obviously, when one pretend to ship a web server, the same one should ensure that it actually serves _the_ web and not _what you'd prefer the web to be_. Read the specification snippet above. Read the reply trace below. Any sound heard in your brain ?

En d'autre termes, si la taille du fichier (sur le serveur) et la taille des données envoyées (dans la réponse HTTP) diffèrent, l'en-tête Content-Length est interdit. C'est ce qu'il peut y avoir de plus fort dans un RFC qui se contente généralement de "SHOULD" et autres "MAY". Pensiez-vous que ça suffise aux guignols de Redmond ? Eh bien non.
13720 recv(12, "
HTTP/1.1 206 Partial Content\r\n
Content-Type: application/x-zip-compressed\r\n
Last-Modified: Mon, 16 May 2011 04:21:42 GMT\r\n
Accept-Ranges: bytes\r\n
ETag: \"6fe34bc28013cc1:0\"\r\n
Server: Microsoft-IIS/7.5\r\n
X-Powered-By: ASP.NET\r\n
Date: Thu, 09 Jun 2011 17:12:04 GMT\r\n
Content-Length: 4000000\r\n
Content-Range: bytes 0-3999999/38651711\r\n
\r\n
PK\3\4\24\0\0\0\10\0n\212;>\204\10\231\20\265\253\25\0
\222\202\26\0\25\0\0\0secret_garden_lrg.jpg\354|y8\324
"..., 8192, 0) = 1368

Voici donc une réponse qui dit à la fois "le fichier fait 4,000,000 bytes" (Content-Length == Entity-Length) et "le fichier fait 38,651,711 bytes" (Content-Range).

So the file is both 4,000,000 and 38,651,711 bytes long, right ?
No wonder why you dodged the IPv6 day, eh ?

Monday, November 12, 2007

Jouons avec netcat ...

Les blogs sont nos amis, mais pour la plupart d'entre nous (même les programmeurs), la simple question "y a-t-il du neuf sur mon blog préféré" paraît trop complexe pour qu'on se donne la peine de la programmer. Pourtant, j'aimerais bien lancer mes étudiants sur un TP basé sur les flux RSS. Alors ?

Alors, bin souvenez-vous du post sur netcat, cet outil unix capable d'ouvrir et de manipuler des sockets en ligne de commande (je simplifie, mais bion). Avec quelques connaissances de HTTP 1.1 on va pouvoir s'amuser un peu. Tout d'abord, il nous faut l'URI d'un flux RSS, en l'occurence, le mien: http://sylvainhb.blogspot.com/feeds/posts/default

Nous avons déjà l'outil wget qui nous permet de récupérer une ressource sans passer par un navigateur, mais netcat va nous permettre de bidouiller un peu notre requête HTTP et de récupérer "en live" la réponse du serveur.

Voyons donc. La manière la plus simple pour récupérer la page avec notre flux RSS en HTTP correspond à

GET http://sylvainhb.blogspot.com/feeds/posts/default HTTP/1.1
Host: sylvainhb.blogspot.com


Auquel le serveur répondra quelque-chose comme
HTTP/1.1 200 OK
Content-Type: application/atom+xml; charset=UTF-8
Last-Modified: Mon, 12 Nov 2007 11:00:00 GMT
Cache-Control: max-age=0 private
ETag: "8ec946e4-7f26-4280-8dad-30c1e7f20e51"
Transfer-Encoding: chunked
Date: Mon, 12 Nov 2007 11:15:53 GMT
Server: GFE/1.3
Connection: Close

c04
<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?>
<feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'>
<id>tag:blogger.com,1999:blog-34057821</id>
<updated>2007-11-12T12:07:24.724+01:00</updated>
<title type='text'>Bilou HomeBrew's Blog</title>
...


La réponse est divisée en deux parties: des en-têtes, qui nous indiquent ce que l'on va recevoir, de quand celà date et comment gérer la suite du transfer et le contenu qui nous intéresse (le flux RSS proprement dit). Ceux qui ont fait un peu de programmation WEB auront tout de suite reconnu le "look HTML" de notre contenu. Il s'agit en fait d'un document XML, qui adopte les conventions d'HTML pour présenter n'importe quel type d'information (ici, un "flux" () qui possède ses paramètres propres (titre, dernière mise à jour ...) et une série d'entrées (), qui correspondent aux articles du blog.

Grâce à la balise , il serait possible de suivre l'évolution du blog en redemandant régulièrement le flux par HTTP et en comparant avec la dernière version reçue. Mais bon, là, mon flux pèse dans les 128K et ce serait ridicule de tout retransférer à chaque fois. Il y a évidemment moyen de faire mieux -- et à mon avis, c'est un des principaux avantages de HTTP/1.1 par rapport à sa version 1.0.

Vous avez remarqué la ligne "Last-Modified" dans les en-tête de la réponse ? Il s'agit de la dernière date de mise à jour (enfin, ce qu'en pense le serveur). Et nous pouvons demander au serveur de ne nous retransmettre le document que s'il a changé depuis cette date avec une petite variante de notre requête:

GET http://sylvainhb.blogspot.com/feeds/posts/default HTTP/1.1
Host: sylvainhb.blogspot.com
If-Modified-Since: Mon, 12 Nov 2007 11:00:00 GMT


Le serveur ne répondra maintenant par un "200 OK" que si la page a changé. Dans le cas contraire, on aura droit à un petit "304", sans contenu. Nettement plus léger, non ^_^ et plus simple que d'extraire à nouveau la balise <updated> pour comparer avec la précédente. Et tout ça avec une seule ligne de commande (à mon avis, bien plus sympa pour les tests que de lancer un "telnet" et d'essayer de taper toute sa requète avant que le serveur WEB n'estime que vous êtes trop lent):

echo "GET http://sylvainhb.blogspot.com/feeds/posts/default HTTP/1.1\nHost: sylvainhb.blogspot.com\nIf-Modified-Since: Mon, 12 Nov 2007 09:51:53 GMT\nConnection: close\n\n" | nc sylvainhb.blogspot.com 80


Petit raffinement: sous Unix, on dispose aussi d'un outil "watch" qui appelle la même commande, encore et encore. On pourra donc se faire un "surveilleur de blog ultra-geek" avec
watch 'echo "GET http://sylvainhb.blogspot.com/feeds/posts/default HTTP/1.1\nHost: sylvainhb.blogspot.com\nIf-Modified-Since: Mon, 12 Nov 2007 09:51:53 GMT\nConnection: close\n\n" | nc sylvainhb.blogspot.com 80'


Bon, okay, la date de référence pour laquelle on teste les mises à jour est toujours la même ici, ce qui rend l'exercice assez inutile. C'est que le début, d'accord, d'accord ?

(edit: amusant: non seulement cette méthode m'indique quand il y a un nouveau post, mais aussi si un post a été remanié ou s'il y a un commentaire en attente de modération ;)