I didn't know I had a Carbon Monoxide detector until it started chirping (loudly). It was tucked inside the cupboard with the boiler and I took a while to locate it. The beep was so loud that pin pointing its location was great fun.
No big problem. These things are designed to be changed every ten years.
So I went and bought a new one, that in itself is long story, but it is not particularly interesting.
Went to hang it on the screws the last one was on and ... it does not fit!
The screw are slightly further apart and the screws are a different size and would not fit even if they were the same distance apart.
Now, a normal person might have
but
Instead I turned to Blender and designed and printed a 3D bracket.
The first one (using up the last of my orange filament) showed the holes 2mm too close. As the holes were procedural, I could easily shift them and print again. This time with the pegs for the new detector.
The result was just off. The screw holes were still 1mm off (I could bend it to fit but I needed another print anyway) and the pegs were the exact size of the new holes which was too tight.
The final result worked beautifully. The new detector snapped onto the pegs and the whole assembly then hung on the old screws!
As no one has this exact problem (detector models) and would never look for a solution, I am not going to post the files. But this does show the value of owning a 3D printer if you are so inclined to do things the difficult/fun way.
I have a bit of a problem with games, in that I need 100% completion.
Well I got it on Tentacular on the Quest 2.
A strange experience for sure, but it was on offer and I am a sucker for a bargain.
You are a two tentacaled creature that needs to complete a number of diverse tasks. Somewhat hampered by the floppy and cumbersome arms.
There is a main story arc and there are side missions. From saving a town from a volcano to stacking boxes, to completing a complex 007 mission with a team of helpers.
The diversity keeps you coming back and some of the side missions could be complete games in their own right. One has you posting signs to get people to an exit in a kind of Lemmings approach. Another, you build a complex road system and send trucks with caravans attached around the branching circuit. That last one allows you too much freedom. In that, I created a complex ramp system that mostly worked to launch the vehicles over another road. Problem was that the correct solution was to send them through the targets in the other direction. Oops.
It is not perfect and the main obstacle is yourself controlling flailing arms. But I did come across a bug where it wanted you to pick up a sign post and there were none. Only when I went Kraken on the map and destroyed a number of buildings did it turn up. This was not a normal way to approach the missions.
There is something about a sandbox game that allows you to pick up sharks and chuck them about that seals the deal. And I do not think the developers wanted that. The sharks are a non grabable material, but you can still scoop them, if you are so inclined.
Gemma4 is new (as of this week) LLM that is open source and freely downloadable.
We have been using AI at work (Cursor) and on the whole it is a net positive. Though I could tell you a number of stories where it went off the rails and caused unexpected problems.
As employees we have a monthly budget of tokens and I keep hitting mine. I decided to try and run a local LLM and found Ollama and Gemma4.
The work laptop has 32G of RAM, but conversely only has a discrete GPU (no NVIDIA or AMD graphics processor).
It was fairly painless. Download and install Ollama
curl -fsSL https://ollama.com/install.sh | sh
then download the model
ollama pull gemma4:e4b
That model was a 9.6G download and has 4 billion parameters
then run it
ollama run gemma4:e4b
takes a while to start up and then it takes 5-6 minutes to respond to anything. This is not going to replace my Cursor work subscription.
But, it is a full LLM and in my probing, very capable. Returning long detailed thinking statements followed by valuable responses.
So, not practical, but interesting.
My main desktop machine that I have had since 2019 has only got 16G RAM but crucially it has a NVIDIA 1660Ti with 6G GDDR6 RAM. Would it run any better on that?
And I fell down a rabbit hole.
As I had used Ubuntu at work I opted for Ubuntu server and a 64G USB drive. I did not want to pollute my current setup.
This was a lot harder than expected. To make the USB drive available to VirtualBox I had to create a raw VMDK file that mapped to it for low level access. Then Boot from an Ubuntu Server ISO. (and telling it to not boot any hard drives it found)
It should have been easy, but it was so slow. Turns out the default CD ROM settings in VirtualBox use IDE and moving it to SATA creates a HUGE speed up. Writing to the USB in the VM was also slow, but that was expected.
First time around (had to wipe the drive and try again). The Ubuntu Server defaults wanted to create a Logical Volume on the USB, but that only allocates half the space. This on top of installing the boot partition as non UEFI. Neither were things I noticed.
Install completed and rebooted the VM.After 20 minutes of waiting realised it was just plain stuck. A quick Alt + F4 did show a login and I was able to install Ollama and Gemma4. Very slowly.
Reboot to physical hardware.
I wasn't expecting to run the LLM in the VM. Though I did try and that produced lots of other headaches. Mainly due to VirtualBox disconnecting the virtual networking cable (I am not kidding) when setting up SSH port forwarding.
My motherboard did not see the drive and no amount of tinkering in the BIOS settings would get it to show.
I found the the drive was not set with UEFI support and the cure was worse than the disease. Spent hours and hours trying to get the boot partition resized and set up. Eventually gave up and wiped the drive and this time set the VM to use UEFI mode (that is detected by the Ubuntu Server installer) and selected NO to creating a logical volume.
Finally got the machine to boot and immediately hit strange and very confusing networking issues. Not going to detail here, but somehow it was hung up on the networking setup the VM had and was having a hissy fit at my real hardware.
Run
curl -fsSL https://ollama.com/install.sh | sh
sudo ubuntu-drivers install
ollama pull gemma4:e4b
ollama pull gemma4:e2b
sudo apt install nvidia-cuda-toolkit
reboot
nvidia-smi
You might think that a 2 billion parameter model would be half the size of a 4 billion, but no, it was still 7.2G. The ubuntu-drivers and nvidia-cuda-toolkit was also huge, with not clear indication just how big they were or how long they would take. The both took ages!
But I now had the models installed and GPU accelerated!
When first starting or switching models the response time was
but running the same model afterwards was much quicker
that was multiple tests with the prompt "I am an llm", which garnered a much more thoughtful response from Gemma4:e4b
and one final note. I disabled Swap and set to FSTAB to use
noatime
but the drive was still quite slow, When removing the drive it was also Hot, well, warm to the touch, and unexpected.
The Ollama instance exposes an API server, so I might try and run this during the work day and connect to it remotely. Another rabbit hole.
The further I get with the Godot Minesweeper VR game the more I find I need to create proper solutions.
You can get surprisingly far with scrappy it works code, but at some point you realise that you don't just need clean reusable code you crave it.
This was a quick attempt at a VR Button helper class to manage the three states or, Hover , Un-Hover and Hit .
You pass it the Mesh and the three materials that correspond to the different states. Very easy and straightforward, but I needed to complicate it :D
I wanted the user to see the button have a cool down state after hitting it. This had to allow the user to re-interact with the button before the cool down ended.
copy_colour_from_material_override(mesh_target.material_override, mat_tweening)
mesh_target.material_override = mat_tweening
if _tween && _tween.is_running():
_tween.kill()
var trans = Tween.TRANS_QUART
var easing = Tween.EASE_IN
_tween = mesh_target.create_tween()
_tween.set_trans(trans).set_ease(easing).tween_property(
mat_tweening,
"albedo_color",
mat_selected.albedo_color,
duration
)
_tween.finished.connect(func(): is_active = false)
Everything updates the
material_override
which was where I hit a number of problems. First was that the
Tween
has to be added to the scene tree. The fix was easy, run the
create_tween()
on the passed Mesh. Then I had multiple instances where the animation would play and update the colour but would never work again, or would affect all the instances where the material was used in the game world.
The result was creating a special mat_tweening material and copying the colour information. Then externalising the Tween instance so it could be killed and restarted.
So I have a nice VrButton and VrRaycast to handle the interactions and visual state of buttons. Not sure I am going to have any more, just need to set the difficulty.
There are not many personal entries in this Flog, but this felt log worthy.
For reasons I was getting my blood taken on 1st April. It did not go well and I ended up talking an ambulance to Accident and Emergency. Was there for four hours hooked up to a drip.
The reasons are surprisingly long and twisty and include failing to draw blood on my own and having to pay someone else to do it for me.
This is number three. 1st was getting my Tattoo redone last year, then there was the aforementioned blood drawing attempt and now there is loss of consciousness. All three relate to my right arm, but that might be coincidence.


email
root
flog archives
Disclaimer:
This page is by me for me, if you are not me then please be aware of the following
I am not responsible for anything that works or does not work including files and pages made available at www.jumpstation.co.uk
I am also not responsible for any information(or what you or others do with it) available at www.jumpstation.co.uk
In fact I'm not responsible for anything ever, so there!