I have, fortunately however, managed to piece together enough
information to be able to do so.
I'll walk through building a simple J2ME
app, using only free software that's still maintained (well,
mostly) so that this is documented somewhere.
For tooling, we'll be using
OpenJDK 8
Still maintained for the time being. It's the last version of
OpenJDK that supports code generation for the old versions of Java
we're targeting.[citation needed]
ProGuard
We're not interested in "protecting" our application, but J2ME
requires preverification
and ProGuard appears to be the best choice here somehow.
MicroEmulator
Okay this one's not actually maintained anymore.
But we're just using their stub libraries for the J2ME APIs.
$ mkdir -p ro/plesoianu lib out/ro/plesoianu out/META-INF$ cd ro/plesoianuro/plesoianu$ wcurl https://felix.plesoianu.ro/mobile/pocket-gopher/PocketGopher.java % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 22743 100 22743 0 0 28807 0 0ro/plesoianu$ cd ../../liblib$ wcurl https://repo1.maven.org/maven2/org/microemu/midpapi20/2.0.4/midpapi20-2.0.4.jar https://repo1.maven.org/maven2/org/microemu/cldcapi11/2.0.4/cldcapi11-2.0.4.jarDL% UL% Dled Uled Xfers Live Total Current Left Speed
100 -- 87390 0 2 0 449k lib$ cd ..$ /usr/local/openjdk8/bin/javac -source 1.2 -target 1.2 -d out -bootclasspath lib/midpapi20-2.0.4.jar:lib/cldcapi11-2.0.4.jar ro/plesoianu/PocketGopher.javawarning: [options] source value 1.2 is obsolete and will be removed in a future release
warning: [options] target value 1.2 is obsolete and will be removed in a future release
warning: [options] To suppress warnings about obsolete options, use -Xlint:-options.
3 warnings$ cd outout$ wcurl https://felix.plesoianu.ro/mobile/pocket-gopher/home.txt % Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1245 100 1245 0 0 3383 0 0out$ ffmpeg -loglevel error -f pbm_pipe -i - gdimp.png << EOT> P1> 32 32> 0000000000000000000000000000000000000000000000000000000000000000000000> 0000000000000000000000000000000000000000000000000000000000000001110000> 0000000000000000000000001100000000000000000000000000000110000000000000> 0000000010000000010000000000011000000001100000000100000000001010011000> 0100000000110010000001101001111001110000001001111000110010010010011100> 0000110001100010001001001001011000000111110000111010010110010010000000> 0000000000111011110000001000000000000000000000111000000010000000000000> 0000000011000000001000000000000000000000100000000000000000000000000000> 0000000000000000000000111100000000000000000000000000001001111100000000> 0000000000000000100000010000000000000000000000001000001100011110000000> 0000000000111011100001101100000000000000000011100000011001100000000000> 0000000011000001100000000000000000000000010000010000000000000000000000> 0000000001000000000000000000000000000000010000000000000000000000000000> 0001000000000000000000000000000000000000000000000000000000000000000000> 00000000000000000000000000000000000000000000> EOTout$ unix2dos > META-INF/MANIFEST.MF << EOT> Manifest-Version: 1.0> MicroEdition-Configuration: CLDC-1.1> MicroEdition-Profile: MIDP-2.0> MIDlet-1: Pocket Gopher rebuilt, /gdimp.png, ro.plesoianu.PocketGopher> MIDlet-Description: Rebuild of PocketGopher sources in 2026> MIDlet-Icon: /gdimp.png> MIDlet-Info-URL: http://microblog.ahti.space/nortti/2026-08-25-j2me-in-2026.html> MIDlet-Name: Pocket Gopher rebuilt> MIDlet-Vendor: Felix Pleșoianu, nortti> MIDlet-Version: 1.0> EOTout$ tar -cf ../not-preverified.jar --format zip *out$ cd ..$ proguard -injars not-preverified.jar -outjars pocketgopher-rebuilt.jar -libraryjars lib/midpapi20-2.0.4.jar -libraryjars lib/cldcapi11-2.0.4.jar -dontshrink -dontoptimize -dontobfuscate -microeditionProGuard, version 7.0.0
Reading program jar [not-preverified.jar] (filtered)
Reading library jar [lib/midpapi20-2.0.4.jar] (filtered)
Reading library jar [lib/cldcapi11-2.0.4.jar] (filtered)
Preparing output jar [pocketgopher-rebuilt.jar] (filtered)
Copying resources from program jar [not-preverified.jar] (filtered)
Inshallah I'll write a proper writeup that exaplains what every bit
here actually is for. For now, my sources were:
When workin on the terminal, I've ended up preferring to take advantage of the terminal scrollback where reasonable.
As such, I've moved to using cat(1) instead of less(1) for when I want to read a text file.
There are some downsides to using cat(1), though.
First of all, you're allowing the author of a file to send arbitrary instructions to your terminal.
This turns out to be suboptimal for security.
Secondly, there is no way to tell where one file ends and another starts.
This is what you want when you are using it to concatenate several files together, but it is annoying if you want to quickly look through a directory full of many small files.
Dietrich von Bern and Theoderic the Great were usually treated as the same figure throughout the Middle Ages.[1][2] However, the lives of Dietrich von Bern and Theodoric the Great have several important differences. Whereas Theodoric the Great conquered Italy as an invader, Dietrich von Bern is portrayed as exiled from his rightful kingdom in Italy. Also, Dietrich is portrayed as a contemporary of Etzel (Attila the Hun, died 453) and his uncle is the semi-legendary Gothic king Ermenrich (Ermanaric, died 370s).[3] Dietrich is associated with Verona (the Bern of his name) rather than the capital of the historical Theodoric, Ravenna; the connection to Verona is attested since at least the eleventh century in Latin chronicles, beginning with the Annals of Quedlinburg.[4]
Dietrich has a number of mythological features: In the early eleventh-century Waldere he is an enemy of giants,[5] and in later Middle High German texts he also fights against dwarfs and wild men.[6] Even more notable is the fact that multiple texts record Dietrich breathing fire.[7]
Ever since Cohost closed down I've been thinking on-off that I should maybe set up presence on the Fediverse.
Mostly off, though, as I can generally just follow the ppl I know feeds without having an account myself, and if need be send replies through other channels.
Recently, however, I've had a couple times where the only method of contact I'd have was fedi or something even worse.
So, partly for that reason, and partly just to get some more experience sysadmining OpenBSD, I've set up a snac2 instance at fedi.nortti.org
Feel free to send a follow and message me there.
I probably won't post much, but it is a way that I intend to be reachable.