Marc's Public Blog


vvv Click on the categories below to see other topic specific pages vvv




More pages: December 2025 November 2025 October 2025 September 2025 August 2025 July 2025 June 2025 May 2025 April 2025 March 2025 February 2025 January 2025 December 2024 November 2024 October 2024 September 2024 August 2024 July 2024 June 2024 May 2024 April 2024 March 2024 February 2024 January 2024 December 2023 November 2023 October 2023 September 2023 August 2023 July 2023 June 2023 May 2023 April 2023 March 2023 February 2023 January 2023 December 2022 November 2022 October 2022 September 2022 August 2022 July 2022 June 2022 May 2022 April 2022 March 2022 February 2022 January 2022 December 2021 November 2021 October 2021 September 2021 August 2021 July 2021 June 2021 May 2021 April 2021 March 2021 February 2021 January 2021 December 2020 November 2020 October 2020 September 2020 August 2020 July 2020 June 2020 May 2020 April 2020 March 2020 February 2020 January 2020 December 2019 November 2019 October 2019 September 2019 August 2019 July 2019 June 2019 May 2019 April 2019 March 2019 February 2019 January 2019 December 2018 November 2018 October 2018 September 2018 August 2018 July 2018 June 2018 May 2018 April 2018 March 2018 February 2018 January 2018 December 2017 November 2017 October 2017 September 2017 August 2017 July 2017 June 2017 May 2017 April 2017 March 2017 February 2017 January 2017 December 2016 November 2016 October 2016 September 2016 August 2016 July 2016 June 2016 May 2016 April 2016 March 2016 February 2016 January 2016 December 2015 November 2015 October 2015 September 2015 August 2015 July 2015 June 2015 May 2015 April 2015 March 2015 February 2015 January 2015 December 2014 November 2014 October 2014 September 2014 August 2014 July 2014 June 2014 May 2014 April 2014 March 2014 February 2014 January 2014 December 2013 November 2013 October 2013 September 2013 August 2013 July 2013 June 2013 May 2013 April 2013 March 2013 February 2013 January 2013 December 2012 November 2012 October 2012 September 2012 August 2012 July 2012 June 2012 May 2012 April 2012 March 2012 February 2012 January 2012 December 2011 November 2011 October 2011 September 2011 August 2011 July 2011 June 2011 May 2011 April 2011 March 2011 February 2011 January 2011 December 2010 November 2010 October 2010 September 2010 August 2010 July 2010 June 2010 May 2010 April 2010 March 2010 February 2010 January 2010 December 2009 November 2009 October 2009 September 2009 August 2009 July 2009 June 2009 May 2009 April 2009 March 2009 February 2009 January 2009 December 2008 November 2008 October 2008 September 2008 August 2008 July 2008 June 2008 May 2008 April 2008 March 2008 February 2008 January 2008 December 2007 November 2007 October 2007 September 2007 August 2007 July 2007 June 2007 May 2007 April 2007 March 2007 February 2007 January 2007 December 2006 November 2006 October 2006 September 2006 August 2006 July 2006 June 2006 May 2006 April 2006 March 2006 February 2006 January 2006 December 2005 November 2005 October 2005 September 2005 August 2005 July 2005 June 2005 May 2005 April 2005 March 2005 February 2005 January 2005 December 2004 November 2004 October 2004 September 2004 August 2004 July 2004 June 2004 May 2004 April 2004 March 2004 February 2004 January 2004 October 2003 August 2003 July 2003 May 2003 April 2003 March 2003 January 2003 November 2002 October 2002 July 2002 May 2002 April 2002 March 2002 February 2002 November 2001 October 2001 September 2001 August 2001 July 2001 June 2001 May 2001 April 2001 March 2001 February 2001 January 2001 December 2000 November 2000 October 2000 September 2000 August 2000 July 2000 June 2000 April 1999 March 1999 September 1997 August 1997 July 1996 September 1993 July 1991 December 1988 December 1985 January 1980



π 2025-10-27 01:01 in Computers, Linux
This is part #2 of
  • Finishing Upgrade of Year 2000 Linux System From i386 to amd64 to arm64 for Raspberry Pi5 with mailman 2.1.7 for Python 2 (the last 5% that took 70% of the time)
  • as an upgrade for
  • Magic v5: From Dell Poweredge 2950 to Raspberry Pi 5 (skipping Dell DSS1510)
  • After upgrading my main server from amd64 to arm64 (rPi), I was forced to re-install all of linux, first time in 25+ years for that server, which included upgrading every single linux package I had t o Debian/Trixie (13). Those upgrades are always "interesting" when you have a lot of history and state, but turns out it went pretty well, except for exim4.

    As much as I'm thankful for exim4 and its developers, and all the work they do, I respecfully think the way they implemented tainting on $local_part, the name of the recipient, was poor and with no regard to the cost of countless admins whose configs got broken. Namely:

  • Debian literally had to write allow_insecure_tainted to avoid breaking their users overnight. They knew how bad the upgrade and breakage were going to be (sadly it was removed later and exim4 didn't use the hint to lessen the pain of upgrades)
  • Exim never provided a clear guide on the most common ways to fix this, including clear fixes for common configurations, using mailman with exim being one of them. Exim has an excellent documentation that is very extensive, but takes days to read and understand (it was over a week my first time 25 years ago). Expecting users to dig back into such a complex system many years later and figure out very non trivial config steps, is not fair in my book.
  • why is there no detailled message in exim panic_log to tell the admin what happened and what to do, along with a bounce message saying the answer is in local exim logs?
  • add a untaint() with fixed safe regex that will work for most everyone
  • the local_part_data is deep black magic and not a reasonable sole solution (it's empty and unusable by default). There should be a local_part_safe that is automatically populated via a safe regex
  • the debian answer of "turn off tainting" should honestly be a real option. Forcing admins to be broken if they have certified they are safe, or in an environment where it's really fine, is NOT an appropriate answer and honestly unfair to admins who deal with lots of things and, cannot be experts on deep internals of dozens or hundreds of daemons. Yes, that means allowing an admin who may already have been running an unsafe setup for 20 years, to potentially continue to do so if they deem it's actually ok/safe in in their setup. The admin must be trusted and not treated like a clueless person that must be blocked from running the software (breaking delivery to mailman is blocking me from using exim altogether).
  • For people who disagree with that last point, please understand that it is still there no matter what. If admins cannot untaint a safe config, they will downgrade exim, and it looks like I did exactly that in the past. This is literally the worst case scenario users are forced into if they can't figure out a very non trivial solution with very few clues
  • Exim posts:

  • https://lists.exim.org/lurker/message/20251027.164803.8ab41844.en.html
  • https://lists.exim.org/lurker/message/20251027.162524.1f7d6cf1.en.html
  • https://lists.exim.org/lurker/message/20251027.181509.83258145.en.html
  • So here is what I figured out in the end, after way too many hours (probably more than 10h at this point, which is totally not cool, uprades should not cause downtimes of 10h plus that amount of lost admin time in debugging, research, and fixing): Exim seems to have totally over-reacted to the local_part untrusted data problem, given literally no way to the admin to clean up the variable on their own with a safe regex, maybe provided by exim itself, and seems to force the admin to compare local_part against trusted data on the server only, or it will simply remain tainted and unusable. This is way over the top, especially when you can run a command in pipe without suffering from shell quoting issues.

    The solution I found after help from others, is:

    mm21_director:
      debug_print = "R: mm21_director for $local_part@$domain"
      driver = accept
      # black magic to populate local_part_data, the untainted version of local_part
      local_parts = dsearch,filter=dir;MAILMAN_HOME/lists
      require_files = MAILMAN_HOME/lists/${lc::$local_part_data}/config.pck
      local_part_suffix = "-bounces:-bounces+*:-confirm+*:-join:-leave:-owner:-request:-admin"
      transport = mm21_transport
    .endif
    

    mm21_transport: debug_print = "T: mm21_transport for $local_part@$domain" driver = pipe # In case you wonder, substr_2 removes the leading '-' # and the regex removes optional +foo=hostname that can be after -bounce # (if you use VERP) -- Marc command = MAILMAN_WRAP "${if def:local_part_suffix{${substr_2:{${sg{${lc:$local_part_suffix}}{\\\\\+.*}{}}}}{post}}" ${lc:$local_part_data} current_directory = MAILMAN_HOME home_directory = MAILMAN_HOME user = MAILMAN_UID group = MAILMAN_GID

    What I had to fix is add "local_parts = dsearch,filter=dir;MAILMAN_HOME/lists" which was 100% required for local_part_data to be populated. Without that, local_part_data is and remains NULL.
    It's disappointing how non trivial and over complicated this is, and most importantly how there was no "MUST READ THIS TAINTED UPGRADE" document with proper detailled info around this in one place (not scattered around a very big manual), along with the most common solutions to the very extreme new tainted restrictions.

    Useful links I saved along the way:

  • https://postmaster.google.com/u/5/dashboards#do=merlins.org&st=inboundDeliveryErrorRate&dr=7
  • https://mxtoolbox.com/SuperTool.aspx?action=dkim%3amerlins.org%3a20251023&run=toolpage
  • https://www.exim.org/exim-html-current/doc/html/spec_html/ch-dkim_spf_srs_and_dmarc.html
  • π 2025-10-26 01:01 in Computers, Linux
    Part #2 was unfortunately much more painful in an unnecessary way due to a poorly made forced API change in exim4

    It's been a while since I've been in XKCD 349 land :) Actually it's a good thing because honestly, it's really not fun and I enjoy other hobbies in my life, too :)


    The power of linux is I never really had to re-install my linux system I built in 2000 or so because Debian is just that good. I did do an upgrade from i386 to amd64, but that was possible thanks to biarch in debian and a fancy and impressive in place binary upgrade from ia32/i386 to amd64.

    Now, because of this little problem where my amd64 capable server from 2019 was taking way too much power (400W or so), I decided to replace it with an rPi5 which is almost 3 times faster for 20 times less power.


    Despite the different binary arch, migrating was not a huge deal, although I still had ancient stuff running python2 that took a while to upgrade, but I figured it was time to get rid of python2 which has been gone from debian for a while (I went to trixie, v13, and it was removed after bulleye, 3 versions ago).
    I was almost done with my upgrade and everything being back up, and then came the subject of mailman. Oh, no, mailman!
    I used to be a mailman expert in 1999-2000 (yes, really, haha), knew the code well, but it's been 25 years and I've kept using it to run a few lists, but otherwise haven't touched in 25 years.

    Of course, by now there is mailman3 that uses python3, but installing that on debian installed dozens of python packages, a new database system and god knows what I just didn't want or didn't need. Worse, I remembered that I have a fancy exim4 config that detects the mailman .pck files and auto provisions lists and aliases. Also, I changed the web interface a bit.

    As much as its is yucky, I'm already 3 days into this full server upgrade and not wanting to spend a day or more to learn this new mailman3 and migrate to it, simply because it's not worth my time and I'm just happy to keep my few lists running as is.

    So here is what I had to do:

    Installing python2 was not too hard, I just had to bring back an old installation for bullseye:
    

    magic:/usr/bin# cat /etc/apt/sources.list.d/debian_bullseye_python2.sources Types: deb URIs: http://deb.debian.org/debian
    Suites: bullseye Components: main contrib non-free non-free-firmware Signed-By: /usr/share/keyrings/debian-archive-keyring.pgp

    apt-get install python2.7-minimal magic:/usr/bin# ln -s python2.7 python2

    Amazingly the packages were built well enough that they installed without fuss on trixie, including some dependencies:

    moremagic:/etc/apt# apt-get install python2.7-minimal
    Reading package lists... Done
    Building dependency tree... Done
    Reading state information... Done
    The following additional packages will be installed:
      libpython2.7-minimal
    Suggested packages:
      binfmt-support
    Recommended packages:
      libpython2.7-stdlib python2.7
    The following NEW packages will be installed:
      libpython2.7-minimal python2.7-minimal
    0 upgraded, 2 newly installed, 0 to remove and 45 not upgraded.
    Need to get 1,593 kB of archives.
    After this operation, 6,393 kB of additional disk space will be used.
    Do you want to continue? [Y/n] y
    moremagic:/etc/apt#

    Now, mailman2 is python, so we're good, right? Well, not quite. There were some cgi binaries that hardcoded stuff for safety, and were obviously i386 on my system (~mailman/mail/mailman and ~mailman/cgi-bin/*).
    I did have server backups going back to 2002 (not bad, haha, and yes they really still work), so I found the source I used back then, but then I realized that trying to rebuild the whole thing might take a while since it's all ancient configure, ancient python, and so forth. Just yesterday I had to rebuild ancient C, and its bundled configure crashed because its "is gcc there" test was not compliant anymore and told me my gcc could not build binaries when in fact the configure gcc test was so old that it was broken, and I just removed it (the rest actually built).

    configure:1004: gcc -o conftest    conftest.c  1>&5
    configure:1001:1: error: return type defaults to 'int' [-Wimplicit-int]
     1001 | main(){return(0);}
          | ^~~~
    configure: failed program was:

    After the source failing to build right away due to missing ancient python stuff, I asked myself "eh, can I maybe just get those i386 binaries work on arm64 as is?". And the answer is, yes:

    magic:/var/local/mailman/mail# ./mailman 
    bash: ./mailman: cannot execute binary file: Exec format error
    

    # install binary emulator, not fast but more than good enough for my needs: magic:/lib# apt-get install qemu-user-static The following additional packages will be installed: qemu-user qemu-user-binfmt The following NEW packages will be installed: qemu-user qemu-user-binfmt qemu-user-static Do you want to continue? [Y/n] y Get:1 http://deb.debian.org/debian trixie/main arm64 qemu-user arm64 1:10.0.3+ds-0+deb13u1 [64.1 MB] Get:2 http://deb.debian.org/debian trixie/main arm64 qemu-user-binfmt arm64 1:10.0.3+ds-0+deb13u1 [2,068 B] Get:3 http://deb.debian.org/debian trixie/main arm64 qemu-user-static arm64 1:10.0.3+ds-0+deb13u1 [55.1 kB]

    magic:/var/local/mailman/mail# ./mailman i386-binfmt-P: Could not open '/lib/ld-linux.so.2': No such file or directory

    # copied over libraries from an old system: magic:/lib/i686# l -rwxr-xr-x 1 root root 171404 Oct 26 16:38 ld-linux.so.2* -rwxr-xr-x 1 root root 1993968 Oct 26 16:39 libc.so.6*

    magic:/lib# ln -s i686/ld-linux.so.2 . magic:/var/local/mailman/mail# ./mailman Usage: ./mailman program [args...]

    Success!

    Well, now when I connect, I see:

    The Mailman CGI wrapper encountered a fatal error. This entry is being stored in your syslog:
    Failure to find group name for GID 33.  Mailman
    expected the CGI wrapper to be executed as group
    "www-data", but the system's web server executed the
    wrapper as GID 33 for which the name could not be
    found.  Try adding GID 33 to your system as "www-data",
    or tweak your web server to run the wrapper as group
    "www-data".

    Now, this is actually already good: it means the CGI (i386 code) is running on arm64, but indeed there is a library issue because /etc/groups does have "www-data:x:33:". Strace showed it was looking for libnss_files.so.2, which makes sense.

    Copied over the lib magic:/lib# l /lib/i686/libnss_files.so.2

    -rw-r--r-- 1 root root 50812 Oct 26 17:45 /lib/i686/libnss_files.so.2 magic:/var/local/mailman/cgi-bin# su www-data magic:/var/local/mailman/cgi-bin$ ./listinfo File "/var/local/mailman/scripts/driver", line 107 print 'Status: 405 Method not allowed' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?

    Progress! (now the wrapper is running the wrong python). The easy fix is of course to make /usr/bin/python point to python2, but I was trying to resist doing so. however at this point I decided to stop being a purist, and honestly this python2/python3 stuff has cost me so much time in the past already that I'm fine with python being python2. All python3 code calls /usr/bin/python3 anyway.

    By now, things are looking better and https://lists.merlins.org/lists/listinfo is returning

    Bug in Mailman version 2.1.14
    We're sorry, we hit a bug!
    Please inform the webmaster for this site of this problem. Printing of traceback and other system information has been explicitly inhibited, but the webmaster can find this information in the Mailman error logs.

    From there, I had to debug some non trivial permission issues which I think were due to qemu not respecting the setgid bit when running i386 code.

    magic:~$ /var/local/mailman/mail/mailman post testlist
    Group mismatch error.  Mailman expected the mail
    wrapper script to be executed as group "mail", but
    the system's mail server executed the mail script as
    group "www-data".  Try tweaking the mail server to run the
    script as group "mail", or re-run configure, 
    providing the command line option `--with-mail-gid=www-data'.

    This was all because the CGIs had to be SGID mailman and therefore had to be C binaries because python suid/sgid was considered not safe at the time. This has been fixed many ways in the last 25 years, but I wanted to keep things as is without getting into new rabbiholes :)

    Sadly, it went downhill from there and the 2h rabbithole I was trying to avoid, caused me another one I fell into. But it was cool to see I could run intel binaries on rpi5/arm64 when needed
    It did how break sgid which is essential for mailman and it turned out the reasonable path of rebuilding since I did have source and even a source tree from 2002 with the right build options still baked in:

    magic:/var/local/src/mailman-2.1.7/src# make clean; make; make install
    (...)
    for f in admindb admin confirm create edithtml listinfo options private rmlist roster subscribe; do     exe=/var/local/mailman/cgi-bin/$f;     /usr/bin/install -c -m 755 $f $exe;     chmod g+s $exe; done
    for f in mailman; do     /usr/bin/install -c -m 755 $f /var/local/mailman/mail;     chmod g+s /var/local/mailman/mail/$f; done

    Yeah, that took fewer than 5mn and made native binaries. With that the web pages worked right away, but the Email gateway script was still being difficult and exim4 debugging didn't show the output from it, making it hard to debug. This does not even make it clear what the full command line was (need to go in +dall to see it, barely) ro that the command failed.

    Works from command line: magic:~$ id uid=8(mail) gid=8(mail) groups=8(mail) magic:~$ ~mailman/mail/mailman post testlist From: marc@merlins.org To: testlist@lists.merlins.org subject: test 7

    test

    But when sending through exim: >>>>>>>>>>>>>>>> Exim pid=1720374 (delivery-local) terminating with rc=0 >>>>>>>>>>>>>>>> mm21_transport transport returned FAIL for testlist@lists.merlins.org post-process testlist@lists.merlins.org (2) LOG: MAIN ** testlist@lists.merlins.org F=<root@merlins.org> R=mm21_main_director T=mm21_transport: Tainted arg 2 for mm21_transport transport command: 'testlist'

    I guess this said what was wrong, but it wasn't clear to me that tainted was an error and not a warning and that it caused the issue. Now this did become another rabbithole I need to solve with exim4 having made tainting a real pain to deal with, especially for the way I'm using exim4's local_part_data, that is still perfectly safe in my use case, but exim4 sadly decided that I cannot be trusted and is forcing an over strict and quite frankly very over bearing tainting system on me that is just breaking me without providing any easy opt out.
    I'm honestly not happy with exim4 on that one, especially the complete lack of useful errors in exim logs and poor documentation that gives easy and actionable steps to get out of this hole.

    So now, I'm many hours in trying to figure out how to fix exim4 and I'm really really not impressed at how they forced that overbearing tainting mechanism with very little info on how to easily fix things that it broke and that were working safely.

    So, exim4 took much longer to fix than it should have, here's a new page on it: Part #2 was unfortunately much more painful in an unnecessary way due to a poorly made forced API change in exim4

    π 2025-10-23 01:01 in Computers, Linux, Public
    After 25 years of running on donated hardware, magic.merlins.org aka marc.merlins.org aka ledtranceguy.org finally migrated to a server I built from scratch, for cheap, and was about 60 times more power efficient than the previous server (Dell Poweredge 2950). The Dell was almost 3 times slower since the hardware dated from 2006, and took more than 20 times more power (including the spinning rust drives).

    The more Raspberry Pi specific posts are here:

  • Using Raspberry Pi5 as a Server With Raid1, Btrfs, and Multiple NVME M2 or Sata Drives
  • Using a Raspberry Pi 5 (Rpi5) as a Server With Btrfs, Raid1, Serial Console and Dual NVME/SD Card Recovery Boot
  • Before you see the non professional looking mess of wires I built with 2 rPi5 and reclaimed/recycled drives (I only bought 2 new boot 2TB NVME for boot as I want those flash drives to work a long time), I considered another Dell server I had laying at home, not even sure where from or why. Looking it up, it was a Dell DSS1510 which seems to be a cheaper version of the R430. It's a very professional looking server with redundant power and all, and I did consider it, especially since Dell seems to use capacitors that don't just die years later and take the motherboard down with it.


    room for 8 2.5 Sata flash drives plugged into an unknow raid card
    room for 8 2.5 Sata flash drives plugged into an unknow raid card

    this shows the MB similar to R430 but with lots of stuff missing to save money
    this shows the MB similar to R430 but with lots of stuff missing to save money

    Research showed it was a system from 2016, an upgrade from my existing 2006 server :) but at the same time, do I really want to "upgrade" again to a server that is almost 10 years old? The colo I'm in (via.net, now nextlevel), nicely asked me if I could use less power for the monthly rate they are giving me, and this server can still peak at 200W. Even if it only takes a bit more than 100w, my double rPi5 solution takes less than 30W, probably between 10 and 20W when idle, and that's for 2 computers, giving better high availability and failover


    Good search said:

  • Single-Core Performance: The Raspberry Pi 5 and the Xeon E5-2620 v3 are remarkably close in single-core speed. The Pi 5's modern ARM architecture allows it to match the much older, higher-power Xeon core for single-threaded tasks. Both significantly outperform the ancient Xeon 5140 cores.
  • Multi-Core Performance: The Xeon E5-2620 v3 remains the leader due to its 12 threads. The Raspberry Pi 5 is second, still much faster than the dual Xeon 5140 setup.
  • Power Efficiency: The Raspberry Pi 5 maintains its huge advantage in efficiency, delivering similar single-core performance to the Xeon E5-2620 v3 while using vastly less power.
  • With 2 rPi5 I'm actually faster than the DSS 1510 for maybe 1/10th of the power, so not a bad deal :)

    So here is the end result I built:

  • 2 rPi5 with 32GB pro sdcard that will never be used except for recovery (I don't trust sdcards for long term use)
  • each system is setup to boot from 2TB NVME, top of the line Samsung 990 Pro. This is the one place where I spent money since drives are almost always the weak link long term
  • magic, server #1, has a leftover 2TB Sata M2 plugged via a USB3 adapter which gives very high performance, although it's really just a backup device I can failover and boot from if the NVME were to die (and I can do all this remotely)
  • moremagic, server #2 has 2 1TB Sata drives I had laying around plugged into an M2 Sata controller, allowing 6 drives total (middle of picture below)

  • The 2 things I had to engineer is using each server as a serial console server for the other one, as explained on my Using a Raspberry Pi 5 (Rpi5) as a Server With Btrfs, Raid1, Serial Console and Dual NVME/SD Card Recovery Boot blog.
    The next thing was how to get 5V power for those sata drives. My first solution was just to steal it from the GPIO port:


    But I found a dual sata power cable I had laying around and a 3 pin female plug with the right plastic bits to make it almost impossible to plug backwards (which would likely destroy the drives):

    this
    this

    to replace that
    to replace that


    The last relevant bit is to find those hard to find USB-C power supplies that give 5A on 5V (normally it's 3A max), although you could also get a real 5V power supply and feed the rPi through the GPIO pins, but that would bypass some protections. In the end, my very professional setup that did take many days to build and test, looked like this:


    oops, forgot to protect the back so it doesn't short when touching metal, duct tape to the rescue
    oops, forgot to protect the back so it doesn't short when touching metal, duct tape to the rescue

    the new setup on top fo the existing poweredge server running for a while as recovery/emergency
    the new setup on top fo the existing poweredge server running for a while as recovery/emergency

    And for shits and giggles, still found an original VA Linux server going strong, as a rack spacer :)



    Power Cycling

    Since the rPi5 sadly doesn't have full firmware support over serial (output only, no input to select the boot menu or do anything, really), expecting any kind of BMC functionality like power cycles is of course over optimistic. Due to this lack, I ended up adding a 3.3V controllable relay activatd power outlet that moremagic can toggle via GPIO (so basically moremagic can power cycle magic if it's truly hosed):


    Moremagic is back!

    I had magic and moremagic for many years (if you know the significance of those names, you are an ubergeek and you can Email me to brag, it's well deserved). Moremagic however died in Sept 2024, so I was running with no backup server for over a year, which was not good given that I'm not always home and could have suffered serious downtime if magic had died.

    Now I'm back with 2 servers, on the same network which is not ideal, but they are both redundant filesystem-wise and capable of taking over one another's duties if one were to die (likely the power supply I assume).

    Further reading

  • rescuing/rebuilding magic, and magic back online and live
  • Moremagic v1 died after 18 years of service
  • Magic v3 died, upgrade to V4, Dell Poweredge 2950 and 64bit linux!
  • Magic v5: From Dell Poweredge 2950 to Raspberry Pi 5 (skipping Dell DSS1510)
  • Finishing Upgrade of Year 2000 Linux System From i386 to amd64 to arm64 for Raspberry Pi5 with mailman 2.1.7 for Python 2 (the last 5% that took 70% of the time)
  • ]
  • Exim4 Mailman2 allow insecure tainted data local parts and local part data (what sadly made this migration a lot less fun around the end)
  • π 2025-10-20 01:01 in Hiking
    It had been a little while since I had been to Castle Rock, went on a weekday where it was empty, and got to see the fancy visitor center I had missed all these years:



















    Xmas trees
    Xmas trees

    On the way back, I hadn't gone to Hakone Gardens in several years, so it was a good time to go back:








    See more images for Castle Rock and HAkone Gardens
    π 2025-10-10 01:01 in Electronics

    eyes are drawn with math, they aren't sprites or animated gifs
    eyes are drawn with math, they aren't sprites or animated gifs

    So, I already built a 64x64 Matrix the hard way in 2018, including early uses of the ESP32 FastLED parallel output code that was still being written in 2018 when I built it. Building the matrix from scratch with 64 strips laid out one by one, was a pain, it took close to a week just to build. Code-wise, it took a little while, but I had a sweet running 110fps 16 parallel channel output setup, it was lovely.

    professional wiring work, haha
    professional wiring work, haha

    yeah, that's why I wanted to use a nice expander board this time around
    yeah, that's why I wanted to use a nice expander board this time around

    not counting that I had to add level shifters to get full 110fps speed from 3.3V output to 5V pixels
    not counting that I had to add level shifters to get full 110fps speed from 3.3V output to 5V pixels

    but eh, it did work and it survived 2 burning mans until the playa ate the pixels from the inside
    but eh, it did work and it survived 2 burning mans until the playa ate the pixels from the inside

    I was honestly quite sad about my 4096 pixel array that took so much effort having been eaten by the corrosive playa, so when I saw pieces of pre-made matrices at a more reasonable price, I I kind of impulse bought 6 bunches 10x60 pre-made strips of much better quality just before the Trump tariffs came in. It was still $500 just in LEDs tough, but that's actually a good price for that many high quality pixels. I however figured I'd try using pixxelblaze with it because progress and not writing my own code for everything (although it was already written, haha). I also hoped to use the PB expander board to help with wiring.
    I also was curious to try out the library of 2D patterns available with pixelblaze. In the end I found around 40 2D patterns that looked decent enough. Is 40 a lot? It's not bad, but when using my own Framebuffer::GFX in C++, I've easily gathered over 200 demos that are overall better due to more speed and obviously a lot faster (almost unlimited speed limited by the LEDs themselves).

    I figured I'd live with the limitations of Pixelblaze and the limited amount of demos compared to C++ framebuffers, But things didn't really work out as planned. Namely:

  • I found out the hard way how slow the interpreted code actually was when scaled to 3600 pixels (most demos ran at 2 to 10fps tops, the 2fps ones are painful to watch)
  • I thought the port expander would allow me to drive 3600 LEDs at high speed, but due to the 2Mbit/s bus limitation, it's actually only about 2x faster than asingle neopixel bus, or barely 20fps raw speed. I still thought about using it until realized that most demos didn't really go faster than 10fps anyway, so why bother (for comparison, my 4096 array did 110fps with 16 channel parallel output on the same ESP32 chip).
  • Wizard recommended I use multiple PBs to spread the compute load, sure I could use 2, or 3, or 6 to run the 6 strings of 600 pixels, but after many hours of even trying to figure out how to use master/slave output as it was not officially documented, and pulling my hair on how on earth the coordinate mapping works across devices, I did eventually got it working just to realize that the devices weren't time synced, so the demos ran at slightly different speeds and the display was now out of sync, so it wasted a day of my time trying just to give up in the end.
  • Here are pictures of the build

    all 6 sub matrices connected, turns out single power was good enough even if the matrix power wire was a bit thin and ran a bit hot
    all 6 sub matrices connected, turns out single power was good enough even if the matrix power wire was a bit thin and ran a bit hot

    my 300W 12V power supply was definitely overkill, note the small step down converter to power the 5V PB from 12V
    my 300W 12V power supply was definitely overkill, note the small step down converter to power the 5V PB from 12V

    power was good
    power was good

    I tried to split the output in two by using a spare PB pico I had laying around
    I tried to split the output in two by using a spare PB pico I had laying around

    coordinate mapping was a huge pain due to lack of docs
    coordinate mapping was a huge pain due to lack of docs

    with 2 devices, without magic in the code, a single PB would not know to display the left or right half
    with 2 devices, without magic in the code, a single PB would not know to display the left or right half


    sadly the lack of sync was a showstopper


    more 'this is not working' :-/

    In the end, I gave up and went with a single 3600 pixel output, and make peace with patterns that ran as slow as 3 to 5fps:

    I used a 110V power cord to re-inject 12V power in the middle, not fully required but nicer on wires
    I used a 110V power cord to re-inject 12V power in the middle, not fully required but nicer on wires

    sadly my setup didn't come with the right plug to connect to the output and backfeed power from the other side, so I made my own from spare connectors
    sadly my setup didn't come with the right plug to connect to the output and backfeed power from the other side, so I made my own from spare connectors

    it worked without the power backfeed, but it was better with it
    it worked without the power backfeed, but it was better with it

    now came the job of connecting 60*5=300 knots between the sub-sections with twisty ties
    now came the job of connecting 60*5=300 knots between the sub-sections with twisty ties

    didn't take too long, time for install
    didn't take too long, time for install

    wee!
    wee!

    for a display that doesn't have a framebuffer and things are drawn with math, not bad
    for a display that doesn't have a framebuffer and things are drawn with math, not bad




    and it looks cool from inside the house too :)
    and it looks cool from inside the house too :)

    Do you want the same demos without spending all the time it took me to download them one by one? Marc's Favorite Pixelblaze 2D demos pbb config you can directly install

    The magic file above will install everything you need all at once, you'll just have to re-set Wifi, change the name and resolution.

    If anyone is interested, here are the demos I settled on, the ones prefixed with '_' were downloaded from https://electromage.com/patterns :

  • _2D Bouncing Additive Primaries
  • _2D Clock
  • _Animated Asterisks 2D
  • _Blinky Eyes 2D
  • _Blue Holiday Candle 2D
  • _Blue Holiday Star 2D
  • _Coronal Mass Ejection 2D sliders
  • _distance function kaleidoscope 2
  • _Doom Fire (v2.0) 2D
  • _Eye of Sauron with movement
  • _fractal flower 2D
  • _Geometry Morphing Demo 2D
  • _Halloween Wavy Bands 2D
  • _Heart 2D
  • _honeycomb 3D
  • _Ice Floes 2D
  • _Infinity Flower 2D
  • _Line Dancer 2D
  • _Matrix Green Waterfall 2D
  • _perlin fire wind tunnel
  • _Perlin Kaleidoscope 2D
  • _Plasma 3D
  • _Scary Pumpkin
  • _Shimmer Crossfade 2D
  • _Sierpinski Rainbow 2D
  • _Spinwheel 2D
  • _Scrolling text marquee 2D
  • _Traffic 2D
  • _Tunnel of Squares 2D
  • _Wavy Bands 2D
  • blink fade
  • color bands
  • color twinkles
  • fireflies
  • firework dust
  • slow color shift
  • sparks
  • sparks center
  • spiral twirls 2D
  • xorcery 2D/3D
  • π 2025-10-10 01:01 in Hiking, Ntrips, Trips
    AFter driving away from Page, Zion was next, first from the east side and its observation point, and then inside Zion which thankfully was still open despite the shutdown. Parking offsite and using the shuttles, which were running normally, was still required:

    TThe east side is accessed through Zion Ponderosa Ranch Resort, where you can also stay:


    nice property
    nice property

    climbing wall
    climbing wall

    Tturns out using their shuttles ended up being required as the road to the trailhead was very muddy and not passable without something like a rubicon (regular 4WD and anything without a locking differential would not do it)

    jeeps they use to drop people off at the trailhead
    jeeps they use to drop people off at the trailhead

    Because it was not possible to drive to the trailhead and that it was late in the day (just enough to finish by sunset), I changed the plans to stay at the ranch overnight to go the next morning:

    someoen was over optimistic in driving there
    someoen was over optimistic in driving there

    this was the way to go, I did mention it was muddy on the trail
    this was the way to go, I did mention it was muddy on the trail

    but even the jeep dropoff was not able to go to the end
    but even the jeep dropoff was not able to go to the end

    finally at the trail, which was reasonably dry
    finally at the trail, which was reasonably dry



    lovely leaf colors
    lovely leaf colors






    chipmunks waiting for our food :)
    chipmunks waiting for our food :)


    they were hungry, as usual :)
    they were hungry, as usual :)

    fearless :)
    fearless :)

    great view on the Zion valley
    great view on the Zion valley

    Angel's landing, just across, that was for the next day
    Angel's landing, just across, that was for the next day


    there was a trail from observation point to the park, but it was closed
    there was a trail from observation point to the park, but it was closed


    After some nice views, it was time to go back:





    is it thanksgiving yet? :)
    is it thanksgiving yet? :)

    the car trail back was still muddy, had to walk it back
    the car trail back was still muddy, had to walk it back


    had to wait for the jeep pickup
    had to wait for the jeep pickup

    Then it was time to head over to the main park entrance:





    I had already done the quick hike by the tunnel, and it was fun to do again:







    the few windows in the tunnel
    the few windows in the tunnel

    It was a bit late in the day, just enogh time to do the river walk again:





    obviously the narrows were kind of wet :)
    obviously the narrows were kind of wet :)


    don't miss the last shuttle, it's a long walk
    don't miss the last shuttle, it's a long walk

    Still a bit of time to do the lower emerald pool







    One new thing for Zion is that you could avoid the shuttles and parking by using Ebikes


    The next morning, back for Angel's landing:







    it was somewhat steep at the end
    it was somewhat steep at the end


    After the hike, it was late enough in the day that it made sense to head back to Las Vegas for my flight home



    See more images for Hiking Around Zion
    π 2025-10-09 01:01 in Hiking, Ntrips, Trips
    After Sedona, on the way to Zion, page was of course an obvious stop. Things were a bit weird due to a governement shutdown, which included the dam visitor center being closed (apparently the dam tours themselves have been closed for longer than that, which is a shame).

    After leaving Sedona/Flagstaff, quick stop at the Bonito Lava Flow. Didn't have enough time to stay due to a reservation at Lower Antelope Canyon and a 2h drive to get there:



    Pretty route on the way, no time to stop, though:



    Eventually arrived at Lower Antelope Canyon just in time for the tour with just minutes to spare:

    first went to the wrong one
    first went to the wrong one

    then found the correct one
    then found the correct one



    it's a fair ways down
    it's a fair ways down









    Then rain happened:




    small rivers started to form :)
    small rivers started to form :)

    then it started raining for real ;)
    then it started raining for real ;)

    Got exciting in very little time:

    Getting tours last minute was hard, so I got one for wind canyon, but it also got flooded, so we went to secret canyon instead:


    wider but nice
    wider but nice










    The nice bonus is the tour company had its own private access to Antelope Canyon:







    While in the area, I tried to sign up for real "the wave" without success, but there was this very cool "the new wave" a few minutes outside Page, well worth the visit:










    A few more pictures the next day before driving out:






    Not far outside Page are Toadstools part of Grand Staircase Escalante NP. Cool walk:










    And further up the road, there was Moqui Cave, fun weird quirky place:








    this is very random :)
    this is very random :)

    but just next door Sand Caves was a cool visit:









    And that was it for the Page Area, next was Zion...

    See more images for Back around Page, AZ
    π 2025-10-05 01:01 in Clubbing
    Above and Beyond finished their US tour at Shoreline, in the CA Bay Area, 10mn from my house, woot!


    all our local crew was here
    all our local crew was here






    I used the opportunity to bring a slightly new outfit version:



    The location ended up being pretty full:



    It was nice to see Hana again, I do enjoy her ethereal music and singing:


    Dave Dresden took over next for some nice classics:



    And then was time for Above and Beyood:





    nice new graphics
    nice new graphics










    π 2025-10-05 01:01 in Hiking, Ntrips, Trips
    I had been meaning to visit Mark for a while, and Sedona is of course a beautiful place that I only ever drove through a bit too quickly in the past (at least I got to visit the cool church in the hills :) ).


    After landing, was greeted by Waymo cars taking people around, unfortunately they didn't go far enough for where I was going. Taking an uber all the way to Sedona, ended up being difficult and expensive, but eventually got there:


    The next morning, went to visit parks/hikes with Mark:









    Even the local mall, great views even then:


    Then went to Bell Rock:






    In the afternoon/evenings, we worked on LEDs :)


    wiring a new array
    wiring a new array

    part of the work was to reduce the amount of long ribbon cables
    part of the work was to reduce the amount of long ribbon cables

    yes!
    yes!

    More lovely trails, this one to seven sacred pools:



    sinkhole
    sinkhole




    The seven sacred pools were actually quite small :)




    not quite enough to bathe, in :)
    not quite enough to bathe, in :)


    There was a very cool cave off the trail:


















    Mark had a great time looking around with me:




    Later, went to Cathedral Rock just around sunset. Also beautiful:











    Also lots of nice cute stores in Sedona:







    See more images for Hiking Around Sedona with Mark

    More pages: December 2025 November 2025 October 2025 September 2025 August 2025 July 2025 June 2025 May 2025 April 2025 March 2025 February 2025 January 2025 December 2024 November 2024 October 2024 September 2024 August 2024 July 2024 June 2024 May 2024 April 2024 March 2024 February 2024 January 2024 December 2023 November 2023 October 2023 September 2023 August 2023 July 2023 June 2023 May 2023 April 2023 March 2023 February 2023 January 2023 December 2022 November 2022 October 2022 September 2022 August 2022 July 2022 June 2022 May 2022 April 2022 March 2022 February 2022 January 2022 December 2021 November 2021 October 2021 September 2021 August 2021 July 2021 June 2021 May 2021 April 2021 March 2021 February 2021 January 2021 December 2020 November 2020 October 2020 September 2020 August 2020 July 2020 June 2020 May 2020 April 2020 March 2020 February 2020 January 2020 December 2019 November 2019 October 2019 September 2019 August 2019 July 2019 June 2019 May 2019 April 2019 March 2019 February 2019 January 2019 December 2018 November 2018 October 2018 September 2018 August 2018 July 2018 June 2018 May 2018 April 2018 March 2018 February 2018 January 2018 December 2017 November 2017 October 2017 September 2017 August 2017 July 2017 June 2017 May 2017 April 2017 March 2017 February 2017 January 2017 December 2016 November 2016 October 2016 September 2016 August 2016 July 2016 June 2016 May 2016 April 2016 March 2016 February 2016 January 2016 December 2015 November 2015 October 2015 September 2015 August 2015 July 2015 June 2015 May 2015 April 2015 March 2015 February 2015 January 2015 December 2014 November 2014 October 2014 September 2014 August 2014 July 2014 June 2014 May 2014 April 2014 March 2014 February 2014 January 2014 December 2013 November 2013 October 2013 September 2013 August 2013 July 2013 June 2013 May 2013 April 2013 March 2013 February 2013 January 2013 December 2012 November 2012 October 2012 September 2012 August 2012 July 2012 June 2012 May 2012 April 2012 March 2012 February 2012 January 2012 December 2011 November 2011 October 2011 September 2011 August 2011 July 2011 June 2011 May 2011 April 2011 March 2011 February 2011 January 2011 December 2010 November 2010 October 2010 September 2010 August 2010 July 2010 June 2010 May 2010 April 2010 March 2010 February 2010 January 2010 December 2009 November 2009 October 2009 September 2009 August 2009 July 2009 June 2009 May 2009 April 2009 March 2009 February 2009 January 2009 December 2008 November 2008 October 2008 September 2008 August 2008 July 2008 June 2008 May 2008 April 2008 March 2008 February 2008 January 2008 December 2007 November 2007 October 2007 September 2007 August 2007 July 2007 June 2007 May 2007 April 2007 March 2007 February 2007 January 2007 December 2006 November 2006 October 2006 September 2006 August 2006 July 2006 June 2006 May 2006 April 2006 March 2006 February 2006 January 2006 December 2005 November 2005 October 2005 September 2005 August 2005 July 2005 June 2005 May 2005 April 2005 March 2005 February 2005 January 2005 December 2004 November 2004 October 2004 September 2004 August 2004 July 2004 June 2004 May 2004 April 2004 March 2004 February 2004 January 2004 October 2003 August 2003 July 2003 May 2003 April 2003 March 2003 January 2003 November 2002 October 2002 July 2002 May 2002 April 2002 March 2002 February 2002 November 2001 October 2001 September 2001 August 2001 July 2001 June 2001 May 2001 April 2001 March 2001 February 2001 January 2001 December 2000 November 2000 October 2000 September 2000 August 2000 July 2000 June 2000 April 1999 March 1999 September 1997 August 1997 July 1996 September 1993 July 1991 December 1988 December 1985 January 1980

    Contact Email