Expo by Night × Gogbot
This evening, I went to Expo by Night × Gogbot. There were some projections from
PLANETART, who also organizes the
GOGBOT Festival, I saw the exhibition Paviljoen: Cross Media Design with works by students from the AKI. It was not clear who made which works. I did not attend the
opening presentation. (They are often rather boring.) I took a photograph of
the 23 names on the window outside. I can hardly believe that all those
students are in the exhibition. The following, I figured out:
Authum crocus
On our walk, we sae the flowers shown below. Pl@ntNet gives it a 44% chance for being a Colchicum lusitanum, however that species is not known to grow in the
Netherlands. This makes it more likely that it is a Colchicum autumnale, which is still rather rare in the Netherlands. On
some map of observations
I do see a red circle near where we live.
Niño 3.4
Niño 3.4 stands for the are around the equator in the Pacific Ocean from 120 to 170° West and 5° South and North of the
equator, which is an area of about 6 million square kilometer. The average
surface temperature is taken as an indicator for how strong the
El Nño is. In last week it is showing temperatures higher than
ever on the Daily Sea Surface Temperature of the Climate Reanalyzer website. The
temperature is getting close to 30° Celsius, which is 1.2° higher than
the last record temperature in 2015 and 3.3° higher than the average in
the years 1991 to 2020. The current El Nñno event is expected to peak around November or
December. The Daily Sea Surface Temperature, World (the whole world between 60°
South and North) is not at a record high but still higher since measurements
started in 1981. Surprisingly, the Subpolar North Atlantic area is cooler than average, while being a bit
higher during the past summer.
Some testing with dividing the page in three panels that can be resized.
Started with some ideas from Google AI and then figured out a simpler method.
I have not yet figured out how to get it working on touch devices.
The HTML source for the above is:
<style>
.window-container { display: flex; height: 100pt; overflow: hidden; }
.scroll-window { background: white; padding: 10px; overflow-y: auto; box-sizing: border-box; }
#left-window { width: 33%; min-width: 100px; }
#mid-window { width: 33%; min-width: 100px; }
#right-window { flex: 1; min-width: 100px; }
.resizer { width: 4px; margin-left: 9px; margin-right: 9px; background: #999; cursor: col-resize; transition: background 0.2s; }
.resizer:hover { background: #444; }
</style>
<script>
function initResize1(e) {
window.addEventListener('mousemove', StartResize1);
window.addEventListener('mouseup', StopResize1);
}
function StartResize1(e) {
const leftWindow = document.getElementById('left-window')
const midWindow = document.getElementById('mid-window')
leftWindow.style.width = (leftWindow.clientWidth + e.movementX) + "px"
midWindow.style.width = (midWindow.clientWidth - e.movementX) + "px"
}
function StopResize1() {
window.removeEventListener('mousemove', StartResize1);
window.removeEventListener('mouseup', StopResize1);
}
function initResize2(e) {
window.addEventListener('mousemove', StartResize2);
window.addEventListener('mouseup', StopResize2);
}
function StartResize2(e) {
const midWindow = document.getElementById('mid-window')
midWindow.style.width = (midWindow.clientWidth + e.movementX) + "px"
}
function StopResize2() {
window.removeEventListener('mousemove', StartResize2);
window.removeEventListener('mouseup', StopResize2);
}
</script>
<div class="window-container">
<div id="left-window" class="scroll-window">
<b>Left Panel</b>
<p>Drag the grey bar to the right to see me grow and the middle window shrink smoothly.</p>
</div>
<div id="dragBar1" class="resizer" onmousedown="initResize1()"></div>
<div id="mid-window" class="scroll-window">
<b>Middle Panel</b>
<p>Drag the grey bar to the left to see me grow and the left window shrink smoothly.</p>
<p>Drag the grey bar to the right to see me grow and the right window shrink smoothly.</p>
</div>
<div id="dragBar2" class="resizer" onmousedown="initResize2()"></div>
<div id="right-window" class="scroll-window">
<b>Right Panel</b>
<p>I will scale dynamically based on whatever room is left over over here.</p>
</div>
</div>
FÆES-›!T at Black Brick
At end of the afternoon, I went in to the city. The sun was shining and it was
warm authem weather, just over 20° Celsius, I guess. I bought a soft-serve
ice cream and walked to Black Brick to
see the exhibition that is part of the
FÆES-›!T, the yearly Sustainable Fashop Art Event. The
exhibition consisted of:
- Hoeveel kun jij dragen (Dutch for How much can you carry?)
by Emma Wijnsma
- Between Delicate and Violent by Şirin Bahar Demirel
- HIDE by
Adele Zavagno. It
consist of:
- A garment archetype by Adele Zavagno.
- Plastic Nostalgia by Patrick
- Heritage Canvas by Thuy
- Keepsake by Xoen Boerk
- Forgotten Canvas by Debbie
Building live-bootstrap
This Saturday, I am going to give a talk with the title Fast Linux bootstrapping at Hackfest. For that I
needed to know how long it takes to run live-bootstrap up to and including TCC-0.9.27. The README is not
completely clear how to do it with chroot on Linux. I started with
the following commands:
git clone https://github.com/fosslinux/live-bootstrap
cd live-bootstrap
git submodule update --init --recursive
I editted the file steps/manifest and removed everything after the
line build: tcc-0.9.27. The reason to do it at this point is to
reduce the number of files being downloaded. I continued with the commands:
./download-distfiles.sh
cp -r -t rootfs seed/stage0-posix/*
cp -r -t rootfs seed/*
cp -r steps rootfs
mkdir rootfs/external
cp -r distfiles rootfs/external
(The README does not mention that distfiles should be copied into
the directory external.) I created the file
rootfs/steps/bootstrap.cfg with the content:
ARCH=amd64
ARCH_DIR=/AMD64
FORCE_TIMESTAMPS=False
CHROOT=True
UPDATE_CHECKSUMS=False
JOBS=1
SWAP_SIZE=0
FINAL_JOBS=1
INTERNAL_CI=False
INTERACTIVE=False
BARE_METAL=False
DISK=sda1
KERNEL_BOOTSTRAP=False
BUILD_KERNELS=False
CONFIGURATOR=False
MIRRORS=file://
MIRRORS_LEN=1
Then issue the command:
time sudo chroot --userspec=${USER}:${USER} rootfs /bootstrap-seeds/POSIX/AMD64/kaem-optional-seed
After 13 minutes and 37 seconds, this terminated with the error:
+> tcc-mes -c -D HAVE_CONFIG_H=1 -I include -I include/linux/x86_64 -o unified-libc.o unified-libc.c
assert fail: 0
/usr/bin/tcc-mes abnormal termination, signal number = 11
Then I remembered that the 64 bits Intel x86 target (AMD64) is not supported. I
decided to try to build the 32 bits target. For this I changed the first two
lines of the file rootfs/steps/bootstrap.cfg into:
ARCH=x86
ARCH_DIR=/x86
and executed the commands:
rm -r rootfs/steps/mes-0.27.1/build
rm -r rootfs/steps/tcc-0.9.26/build
rm -r rootfs/usr
rm -r rootfs/tmp
rm configurator
rm script-generator
rm seed-full.kaem
time sudo chroot --userspec=${USER}:${USER} rootfs /bootstrap-seeds/POSIX/x86/kaem-optional-seed
This finished succesful in 11 minutes and 38 seconds, which is a bit faster
than building for the AMD64 target.
Duplicating code
In software engineering there is a rule to avoid
duplicated code. An important reason is that if you duplicate some code and
something has to be changed about it, it can happen that the change is made to
just one of the copies. But there are cases where duplicating code is an option
to consider. Sometimes when I am faced with such a situation, it can take me
several hours to consider the option to duplicate the code. If you have
written some function to interact with a global object and you are now faced
with the situation that you also have to interact with another similar global
object. To avoid code duplication you can extend all functions with an
additional argument to specify with which of the two objects it should interact
with. But in the situation that one part of the software always interacts with
one of the objects and that another part always interacts with the other
object, duplicating the code might be an option to consider, because the
value of the additional parameter is always constant from the location where
the functions are called. Especially in an environment that is time critical,
passing an additional parameter could have a some impact on the performance
that could potentially be significant. In some cases, adding a new parameter
to a function may also imply you have to add code to check if the parameter
has a valid value.
October 7: When developing in C, the C-preprocessor can be used to
produce duplicate functions by including a file after some macro symbols have
been defined.
23.7° Celsius
The temperature at Twente Airport has gone up to
23.7° Celsius, which breaks the previous record of 22.4°C on this date
in 1977.
Hackfest 2026
I went to Hackfest 2026 in
Enschede. It was held at a different location then last year. It was at Sickhouse. I
attended all the talks and in the breaks I looked around the various stands.
At 12:15, I listened to the talk Introduction MsshCore by FrankkieNL.
He showed how he uses a WisMesh Tag to connecto to the MeshCore through an
app on his smart phone using Bluetooth. At 13:15, I listened to the talk
BadgeTalk by Anne Jan Brouwer about
all the badges that he was involved with in and about Badge.Team. At 14:15, I gave the talk Fast
Linux bootstrapping. Afterwards, some people remarked that I maybe
should have explained bootstrapping a bit earlier in the talk. At 15:15, I listened to the talk
Printing in Seconds: Volumetric 3D Printing by Annalise Anspach. Quite interesting and many questions ans suggestions
were made. At 16:15, I listened to the talks Parametric antenna design and Building with OpenSCAD by
Andries Lohmeijer.
In between the talks and afterwards, I looked around the stands. Some of these
were:
- PILED from England.
- Everyone can learn to solder like a pro! by
Mitch Altman
from Berlin.
- I played a bit with a MIDI controller and a modular synth by
SoundForce
- Relions3D with 3D printed marble runner and B-lamp.
- Isetta Computer
- KITT Engineering with
The Smart Pavement Tile.
- Space Clock
- Is a 1973 Pinball Machine a Computer? showing a Bally 'Monte Carlo' pinball machine. The owner showed the inside and the
workings of machine. He was also in possession of the original schematics.
It reminded me at the pinball machine we had in our dorm when I studied
computer science.
- Nerds With Acid showing a modified drum machine besides some other things.
I also talked with various people and some old colleagues.
I walked to Creative Broedplaats
Enschede, who recently moved into a new building, to see the two
exhibitions with photographs: A Ballroom of
Eros by Anca Axinte and
Image of Imagination by Boel Nordenstam.
Bring Your Own Beamer
From 19:00 till 23:00, I showed my animation at
the Bring Your Own Beamer event at
TETEM art space. This is the fourth time I
joined this type of event. The previous time was in March 10 earlier this year. This time, I decided The China Labyrinth as a homage to Christian Freeling. I did bring two physical copies of the puzzle with me.
One made from wood and one made from perspex. The other artist and/or instalations at this event
(if I did not miss one) were
Carte Blanche
I went to see the exhibition
Carte
Blanche at B93. It was a double exhibition. Upstairs, was the work
Fragments Unknown by Désiré De Lacy with photographs, projections on sheer
curtains she had found on the street, and some audio playback. Quite
interesting how she blends images in such a way that you at first do not
notice it that they are blended. Downstairs was the exhibition of
Guusje Slagter (Instagram). I took one of the cards that were offered with a still from
the short film Het menselijk apparaat (The human apparatus).
Free form solution for The China Labyrinth
It turns out it is not so hard to find a solution for The China Labyrithn puzzle if you do not put restrictions on the border.
The solution below was found by two people in about half an hour. The puzzle is made from pieces that I made with a laser cutter on September 22.
Neocities: Coding Night
I went to the Neocities: Coding Night - Build your own digital garden event at
Sickhouse. A presentation was given by the
owner of theAlien Head Shit
Kid site on neocities.org. I found
a tutorial
explaining how to deploy to neocities throught github workflow.
I found the link to The Annotated
VT100 Firmware interesting because one of the first terminals I worked on
was a VT100 compatible terminal. I owned a Teco VA120 terminal, which is now stil at TkkrLab. I also wrote some PASCAL modules for visualizing parsing on a
VT100 compatible terminal: The screen management
module and the Primitive terminal interface
module.
Link: Spare room by Denis Iaquinta
Denis Iaquinta posted a link to the Guassian splat Spare room on
Reddit to demonstrate his pipe line he has developerd. My first impression was
that of a squatted home with aspecially due to the matras laying in the middle
of the room. There are a number of interesting object in the room. A painting
on the wall, a half finished puzzle on a table, four chair against the wall, a
spiral object, a cloth on the wall, a foosball table, eight chairs placed in
a cicle (are we going to have session), a cupboard with books inside, just to
mention a few. You can look out of the windows on one side of the room, but
not on the other side.
Harvest
Even though it is already the end of October, we are still receiving a generous
harvest every Saturday from the Herenboeren Usseler
Es cooperative. Today, we were could pick out one pumpkin per 'mouth' from
the selection laid out in the polytunnel. took two, because we have a
subscription for two mouths.. I also collected two kilo of potatoes, some
carrots (at least a kilo), two bunch of green beans (you have to cut of the
beans yourself), and two heads of lettuce or endive. I was a bit late and got
one of the last heads of head of romaine (if I'm not mistaken) and a large head
of endive, of which there were still plenty of left. (Last week I also brought
two large heads of endive home of which we gave away the largest.) We ended up
having an endive salad tonight using part of one head, simply because it
wouldnot fit properly in the fridge otherwise. At the "giveaway table," I also
picked up four of the very last tomatoes, three of which are still completely
green. We will see if they ripen. If not, we will have to come up with
something else to do with them. We also still have a white cabbage and a red
cabbage from last weeks harvest. We probably will made sauerkraut from one
of them. We already did that this year with four other cabbages.
I went into the city this afternoon. I first visited the exhibition Ontmoetingen en Observaties (which could be transalted
to Encounters and Observation) with photographs by Rob ten Tusscher at photo gallery Objektief. Next, I went to Concordia,
where I had a second look at the exhibition Paviljoen: Cross Media Design. (There is still no information about
who made what.) I did notice some things, I had not seen before.
The quality of code
Five days ago, I made the bold statement that the Tiny C Compiler is not an examply of quality code. That got some
critical replies. The Tiny C Compiler is written by Fabrice Bellard who wrote some great programs that are widely used. First
of all it is important to note that quality is subjective to some degree.
In the book Zen and the Art of Motorcycle Maintenance it is argued that 'Quality' is
neither subjective nor objective. The Reddit user LordRybec in one of his comments said: 'If the code looks horrible but works
extremely well, odds are it's just higher quality than you understand how to
understand'. I had said that more people had complained about the quality of
the code. In another reply, he said: 'It may be bad (I haven't looked it at it
personally), but it may be so ingenious that you just think it is bad when it
is actually totally awesome'. A bit further in the discussion, I pointed at
the function tal_realloc_impl, which is in the file tcc.c. I
had some problem understanding this function when I encountered it during some
debug session. If I remember correctly, it was because it seems to be
harded-coded for 32-bits architectures with the expression
(size + 3) & -4, which rounds the value of
size up to the nearest value that is a multiple of four. (The use of
-4 presumes two's complement representation of integers, which is the most common used
method. To remove that dependency, one could use ~3, but their might
be C compilers that are not good at constant folding and would use an additional machine instruction instead.)
There is a goto-statement in the body of the function
tal_realloc_impl that implements a loop that could have been
implemented with a for-statement or while-statement and some restructuring of
the code. The code of the Tiny C Compiler contains many goto-statements and I
must agree that it often makes faster code. But in some places, such as the
function preprocess_skip, I really wonder what is the speed
improvement of having a goto-statement to the label _default. Yes, it
probably reduces the number of machine instructions in the function, makes the
code length a bit shorter, but it probably introduces and additional jump
instruction. I too uses goto-statement when implementing iterators as a
co-routine. I have noticed that in the code when a comparison is made with a
constant, the constant is often placed first, which is not how people usually
write code, but it does defend against the common mistake of accidently
changing the comparision into an assignment when one types = instead
of ==. Most compilers now give a warning when one makes such a
mistake. The user LordRybec made some two more additional comments
(this and this) about different views of quality. I agree with him that one could
also view quality as an external property of the software, how well it works,
and not consider the quality of the code itself, especially if it is going to
be a finished project. Although I do agree that you should not write code with
the view that it will be modified in the future, knowing that one of the most
counter product things it to take future features in mind, but there is always
a possibility that your project will need modification or extension in the
future or will be used for something that you had not participated, especially
if you do publish the code. Of course, there could have been a good reason to
use a goto in a certain function, but if there is no documentation of the why,
it is likely that it is not possible to figure out what the reasoning was
behind the choice. This can lead to confusion or result in adapting bad
practices by less experienced software developers. I think as an engineer you
have some responsibility to encourage good engineering practices among less
experieced engineers and that responsibility increased by the number of people
who may exposed to the code.
OpenAI announced three new
results with the blog Working with academic communities to build scientific understanding. One
of them is in the field of theoretical computer science and is about the The Exponential Time Hypothesis being false as shown in the pre-print:
The Exponential Time Hypothesis Is False and a Lean proof given in A 2o(n) Time Algorithm for 3-SAT. See discussions on
Hacker News and
Reddit (one of several). The exponential time hypothesis implies
P ≠ NP, which means that is now one less route to settle the
P versus NP problem one of the greatest
unsolved problems in theoretical computer science.
Link: The Classification of Finite Simple Groups
Through Hacker News, I found a link to The Classification of Finite Simple Groups, formalized in Lean which is
about Classification of finite simple groups. I have been fascinated by group
theory from when I first encountered it in high school. I remember seeing an
article in the Scientific American about the Monster Group. On my birthday eleven years
ago, I got a printed (and outdated) copy of the Atlas of Finite Groups:
Maximal Subgroups and Ordinary Characters for Simple Groups. I read the
blog about the achievement. They used AI for the formalization. Maybe the
people working on Second-generation classification will now also resort to AI and/or
formalize their proofs in Lean.
urly kale hotchpotch
Curly kale hotchpotch
We got a little over one kilo of curly kale in the harvest from the Herenboeren Usseler Es cooperative. We used about half of it to have curly kale hotchpotch for dinner. This is the first time this winter and
definitely not the last, because we have to finish the other half also.
This months interesting links
Home
| September 2026
| November 2026
| Random memories