1 2 3 4 5 6 7 8 9 10 11 12 13

Show me the information

21 Mar, 2026

Since I'm in an unhinged rant frame of mind I wanted to also rant about this tendency for 'minimalist' thinking in UX/UI. I'm going to blame Google and their Material UI for this, they should be blamed for most things, but the trend has become something of an accepted wisdom amongst UI designers.

The idea is you keep the UI nice and 'clean' and only show the user the fields you believe are relevant to them. For example you truncate a message because it would wrap and break the UI scaling. Or you show just the date part of a timestamp, or even worse show "a few hours ago" instead of the actual date. Maybe you show the full time on a mouse-over event, but how do I copy that?

Hiding information to make your site visually appealing breaks real-world tasks. You can't predict what the user is going to do, you are not an oracle, so just show them the information. Even if they decide to put the entire text of the Iliad in a description field. It'll look garbage but at least they can complete their task.

There is a lack of empathy for the user in these choices. What is your user trying to achieve? How can you make that task as easy as possible? What about users who fall outside the flows you predicted they would need?

First up there's this screenshot from the fundamentally cursed Gmail UI:

Gmail sent email showing only the first name of the recipient

...

Cheese sandwich

20 Mar, 2026

If you are the type of person with Very Strong Opinions about the (negative) health and moral implications of plant-based 'meat' you are signalling that you are fundamentally intellectually incurious. You have an opinion you haven't taken the time to inspect and have adopted certainty without rigor.

This is a picture of a cheese sandwich, I made it at home, it was ok:

cheese sandwich

And this is the ingredients list of that cheese sandwich:

...

So you want to parse a PDF?

03 Aug, 2025

Suppose you have an appetite for tilting at windmills. Let's say you love pain. Well then why not write a PDF parser today?

The ideal world: how the specification should work

Conceptually parsing a PDF is fairly simple:

  • First, locate the version header comment at the start of the file
  • Next you need to locate the pointer to the cross-reference
  • Then you can find all object offsets
  • Finally you locate and build the trailer dictionary which points to the catalog dicitionary

Introduction to PDF objects

A PDF object wraps some valid PDF content, numbers, strings, dictionaries, etc., in an object and generation number. The content is surrounded by the obj/endobj markers, for example a simple number may have its own PDF object:

16 0 obj
620
endobj

This declares that object 16 with generation 0 contains the number 620.

A PDF file is effectively a graph of objects that may reference each other. Objects reference other objects by use of indirect references. These have the format "16 0 R" which indicates that the content should be found in object 16 (generation number 0). In this case that would point to the object 16 containing the number 620. It is up to producer applications to split file content into objects as they wish, though the specification requires that certain object types be indirect.

Finding the cross-reference offset

To avoid the need to scan the entire file, PDFs declare a cross-reference table (xref). This is an index pointing to where each object in the file lives.

Each file ends with a pointer to the cross-reference file:

<< %trailer >>
startxref
116
%%EOF

This tells the parser to jump to byte offset 116 to find the xref table (or stream). In theory this pointer is right at the end of the file, according to the specification:

...

Laureles, Medellin swimming pools

23 Apr, 2025

Just a brief note to summarise the (non-hotel) swimming pool situation in the Laureles area of Medellin since it is not easy to find/understand all this information.

There are 3 primary organisation types that are relevant:

  • Inder. Run by the mayorality this sports department offers access to many different sports facilities for residents and visitors alike. Swimming can be accessed for free through Inder.
  • Liga de Natacion de Antioquia. The swimming league of the department of Antioquia they share access to many of the same facilities with Inder; however they provide paid access to these facilities.
  • Private organisations. A third category that runs some pools.

It's worth noting that for all pool types the required swimwear is a swimming cap (even for bald people) and lycra (not board) shorts. There are 2 shops at Estadio that sell these, one near the Inder entrance and the other behind the stairs at the Liga entrance. There may also be a shop at Belen.

Pools

The main pools of interest are the Estadio and Belen sites. Belen has a single Olympic pool (see the private swimming section for details on a second 25m pool in Belen) and Estadio has a range of pools including Olympic, sub-aquatic and many others.

  • Estadio, has an Inder gate with ticket office here and a Liga gate here.
  • Belen, the pool is here.

Swimming with Inder

To use Inder pools with a reservation you will need to register with Simon 2.0. Simon 2.0 is the booking platform for various sports facilities including the pools at Estadio and Belen. Once registered you can book access to a pool session for free, however as of Spring 2025 there is high demand and because many pools, including the Olympic pool, at Estadio are currently being refurbished the available reservation slots fill up quickly.

Another approach is to join the queue for entry at the pool in Estadio. Each hour (or outside the hour at the discretion of the ticket office) a certain number of people are let in from the queue for free, again depending on occupancy. I don't have first-hand experience with it but in the week it apparently doesn't take too long if you go early. The non-reservation entry queue may also exist at Belen but I haven't validated this.

You will need your original id, either passport or Cedula (no photocopies), to enter with Inder.

Swimming with the Liga

The Liga de Natacion de Antioquia also operates at the Estadio and Belen locations. They don't seem to be mentioned if you ask about swimming in general at Inder locations.

...

Writing Code for Fun and ... That's It

30 Jul, 2023

Supreme Commander: Forged Alliance is a real-time strategy (RTS) game released in 2007. It is also the last good RTS, and potentially game, ever.

Despite this most gamers — not realizing gaming reached a pinnacle in 2007 and has since descended into a mess of RPGification, Loot Boxes and bloom over-use — have moved on to other games and more importantly other genres1.

One need only look at the modern-game design horrors unleashed on the Dawn of War genre to see the decline of RTS and gaming generally more clearly. From the high-point of Dawn of War: Winter Assault in 2005 to the best-forgotten mess of Dawn of War III in 2017 everything has been ruined irrevocably. Nothing is good anymore, food doesn't taste the same, music isn't what it was2. I'm not getting old, things are getting worse. I'm still cool and relevant!

Few things in gaming quite match the state of stressed, overwhelmed, misery induced by Forged Alliance. Thankfully the Forged Alliance Forever (FAF) project has continued to develop Forged Alliance, providing graphical updates, balance changes, matchmaking, performance improvements, new maps and more.

Because gamers have departed from the True Path matchmaking generally takes a while. A small active user-base means that depending on the time of day and day of week you can be waiting anywhere from 10 minutes to over an hour for a lobby (the pre-game matchmaking bit) to fill.

It is generally necessary to be ready to balance and start the lobby within a few minutes of it filling. If there's too much of a delay everyone will leave again and the waiting time will have been wasted.

Which brings me to the justification for my project, FAF Lobby Sim. While the lobby is running on my desktop I don't want to have to sit checking it every few minutes. It would be good to be able to do other things elsewhere while having a way to check on the occupancy status.

...
1 2 3 4 5 6 7 8 9 10 11 12 13