Christians Tagebuch: bigsuck

The latest posts in full-text for feed readers.


1blu IPv6 status 2025

Es ist das Jahr 2025, 27 Jahre nach der Standardisierung von IPv6. Die 1blu RootServer unterstützen kein IPv6, wie auch die meisten anderen Produkte bei 1blu. Traurig.

Der Support antwortet mit der gleichen Nachricht wie letztes Jahr:

Wir bedauern Ihnen mitteilen zu müssen, dass IPv6 bei Ihrem Produkt aktuell noch nicht unterstützt wird. Unsere Technik arbeitet bereits daran dies zu ermöglichen. Bitte haben Sie Verständnis, dass wir Ihnen jedoch noch keinen genauen Termin nennen können.

Wir werden zu einem anderen Hoster wechseln.

Siehe auch:

Published on 2025-03-20 in ,


Wordpress registration spam

Spammers are using Wordpress installations with open registration to send spam e-mails to uninvolved users.

The mails are sent via the "Register" function that is linked on the Wordpress login page wp-login.php. The registration form has two fields: "Username" and "Email".

The username allows spaces, and this is where the spammers input a domain name and a promotional text. The domain name gets auto-linked by e-mail clients, making it easy for users to go to the spammer's site.

Such a spammy Wordpress registration e-mail looks like this:

Subject: [Legit site] Login Details
Username: www.spammer.example.com - 1.2342 BTC

To set your password, visit the following address:

https://legitsite.example.net/wp-login.php?login=www.spammer.example.com%20-%201.2342%20BTC&key=oSxUtw01QIFHoxHvokfd&action=rp

https://legitsite.example.net/wp-login.php

Everything after the Username: in that line is provided by the spammer.

Two things should be fixed here by Wordpress:

  • Reject usernames with spaces
  • Reject usernames that have "www." in them, because that causes the e-mail clients to autolink the URL

Let's see what the Wordpress developers say to my ticket.

Others with this problem

2024-11: Reddit: Spammed with 100+ Fake WordPress Login Emails (Help!)

Published on 2025-03-11 in ,


Spam to Deepgram account mail

Years ago I registered at deepgram.com while trying to transcribe a podcast episode, with username+deepgram.com@example.org as my e-mail address. Today I received spam mails to that email address.

I contacted their security@ mailbox and asked if they have been hacked, but they denied that:

We apologize for the inconvenience you are experiencing. We can confirm that we did not experience a breach, but that data is shared in accordance with our privacy policy, and with the vendors specified in our subprocessors list https://deepgram.com/privacy/subprocessors.

So they know that their "subprocessors" are selling/losing/whatever user account data and are fully ok with it.

Published on 2024-11-25 in


BIC media advertisements bloat ebooks

Yesterday I purchased an ebook from buecher.de, Corvus by Neal Stephenson. Apart from the water mark file it contains advertisements that take half of the size of the ebook file.

The DRM-free .epub file is 3.8 MiB in size. It is a zip file, and the unzipped contents are 6 MiB.

There are a lot of files in the folder OEBPS/BICMediaMarketing/, and their size sums up to 2.98 MiB. The non-BIC files are 3.04 MiB. Nearly 50% of the ebook's size are advertisements :(

Similar to ads bloating websites and making them so unusable that we have to use ad blockers, advertisements in ebook files waste bytes on our hard disks and make downloads slower.

I know who get electronic books without adverts: Pirates.
Similar to pirates having a much better movie experience than people buying and playing DVDs.

Advertisement files

     2048  2023-10-12 19:11   OEBPS/BICMediaMarketing/marketing.css
     2907  2023-10-12 19:11   OEBPS/BICMediaMarketing/mp1.xhtml
      763  2023-10-12 19:11   OEBPS/BICMediaMarketing/lastpage.xhtml
   162174  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/253EF476A2ED49549DED6D5B26C0EA1A.xhtml
      859  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/336E6DD3E68F4990B1D19F3CA30C4990.xhtml
      623  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/6FE2556344D849B281E012E50151547D.xhtml
     1112  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/9B8E49F3338942609923919A284CB82E.xhtml
     1009  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/BAED857E61C049ECB974C479521A9207.xhtml
  1025293  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/cover.jpg
      748  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/cover.xhtml
     2958  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/DA9C6990BEF64CE68BF0407505CF793F.xhtml
      484  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/E8719B7E1C4B4C418F61C704A8FD8134.xhtml
      721  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/toc.ncx
    10054  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/70653622D0534CC6B6C67CBE13E33104.xhtml
     1548  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/BICMediaMarketing/Amazon.gif
     1191  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/BICMediaMarketing/Apple.gif
     1397  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/BICMediaMarketing/Google.gif
    10740  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/BICMediaMarketing/Kobo.JPG
     2517  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/BICMediaMarketing/tolino.gif
    20577  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/BICMediaMarketing/Kostenlos_reinlesen.gif
    45514  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/BICMediaMarketing/Kostenlos_reinlesen.PNG
    60808  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/BICMediaMarketing/Kostenlos_reinlesen_klein.png
     8724  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/BICMediaMarketing/button--reinlesen--color.png
     5155  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/BICMediaMarketing/button--zumshop--color.png
    46701  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/BICMediaMarketing/Zur_Bestellung_mit_einem_Klick_50.png
     6050  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/BICMediaMarketing/button--one-click--color.png
     9294  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/BICMediaMarketing/Kostenlos_reinlesen2.png
     1712  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/BICMediaMarketing/marketing.css
     3582  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/image/153C113ED16D44E4B456D68D5AC45E41.jpg
     3914  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/image/372C80CDB20A44AE86BA05250A1FB430.jpg
     3175  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/image/4451B938ADFD4EA89F1F71CEC775730C.jpg
     3172  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/image/5C5B46C79F5C45128F4142D96EA0DAEA.jpg
     9272  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/image/F6C0DD5F607649E282DA83BCBB0D67DA.jpg
    77824  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/font/AGaramondPro-Bold.otf
    94208  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/font/AGaramondPro-Italic.otf
   126976  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/font/AGaramondPro-Regular.otf
    73728  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/font/FuturaLTPro-Book.otf
   106496  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/font/HelveticaLTPro-Oblique.ttf
   106496  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/font/HelveticaLTPro-Roman.ttf
    16357  2023-10-12 19:11   OEBPS/BICMediaMarketing/9783641300852_shortened/OEBPS/css/idGeneratedStyles.css
    37278  2023-10-12 19:11   OEBPS/BICMediaMarketing/BICMediaMarketing/9783641300852_front.jpg
   757076  2023-10-12 19:11   OEBPS/BICMediaMarketing/BICMediaMarketing/DejaVuSans.ttf
     1548  2023-10-12 19:11   OEBPS/BICMediaMarketing/BICMediaMarketing/Amazon.gif
     1191  2023-10-12 19:11   OEBPS/BICMediaMarketing/BICMediaMarketing/Apple.gif
     1397  2023-10-12 19:11   OEBPS/BICMediaMarketing/BICMediaMarketing/Google.gif
    10740  2023-10-12 19:11   OEBPS/BICMediaMarketing/BICMediaMarketing/Kobo.JPG
     2517  2023-10-12 19:11   OEBPS/BICMediaMarketing/BICMediaMarketing/tolino.gif
    20577  2023-10-12 19:11   OEBPS/BICMediaMarketing/BICMediaMarketing/Kostenlos_reinlesen.gif
    45514  2023-10-12 19:11   OEBPS/BICMediaMarketing/BICMediaMarketing/Kostenlos_reinlesen.PNG
    24354  2023-10-12 19:11   OEBPS/BICMediaMarketing/BICMediaMarketing/mehr_zum_buch.png
     8724  2023-10-12 19:11   OEBPS/BICMediaMarketing/BICMediaMarketing/button--reinlesen--color.png
     5155  2023-10-12 19:11   OEBPS/BICMediaMarketing/BICMediaMarketing/button--zumshop--color.png
     9294  2023-10-12 19:11   OEBPS/BICMediaMarketing/BICMediaMarketing/Kostenlos_reinlesen2.png
   145531  2023-10-12 19:11   OEBPS/BICMediaMarketing/BICMediaMarketing/rh_bg640_6.jpg
  

Size counting

I chained together some command line tools to get the size.

Advertisement size
$ unzip -l Stephenson_Corvus_9783641249878.epub\
  | head -n-2 | tail -n +4\
  | grep BICMedia\
  | sed 's/^ *//' | cut -d' ' -f1\
  | xargs | sed 's/ /+/g' | bc
3129777
Non-advertisement size
$ unzip -l Stephenson_Corvus_9783641249878.epub\
  | head -n-2 | tail -n +4\
  | grep -v BICMedia\
  | sed 's/^ *//' | cut -d' ' -f1\
  | xargs | sed 's/ /+/g' | bc
3193311

Problem: Page count

While reading the book, I looked at the page number and saw

901 / 978

After turning to the next page, noticed that it was the last one of the actual story. The next 70 pages were the "Leseprobe" advertisement for another book.

Imagine my disappointment that the book was finished at 90% of the pages, while shortly before my mind was in the good feeling of having another 70 pages to read before the end.

Would you think this is the next to last page?

Published on 2024-04-24 in ,


Signing a PDF with an image on Linux in 2024

It's 2024 and I want to send a sign a contract and send it via e-mail to a company.

The company does not accept electronically signed PDF files (most don't), and even when they did - I don't have an electronic signature I can use with PDF files, nor do I know how to create one.

The only option I have is to sign the contract by hand: Print it out, write my signature with a pen, scan the signed paper and send the scan via e-mail to the company.

A variation of this option that takes less time and paper is to add an image of my signature to the PDF. But how can I do that? Let's look at the software on my Debian 12 laptop:

Atril

The PDF viewer shipped with the Mate Desktop environment tells me that it can't open PDF files.

Atril cannot open PDF files

Evince

The default Gnome PDF viewer can't add images to PDFs, since 9 years (new ticket)

Okular

The feature request is open since 2013, 11 years.

There seems to be a trick with stamps, but I failed because the KDE QT interface looks totally broken in Mate:

Okular's stamp dialog is unusable

Master PDF editor

Inserts water marks because I have no license. Buying the license would mean giving money to a Russian company, which is something I won't do with the Russia's war against the Ukraine happening.

PDF4QT

Adding a .png or .jpg image crashes the application.

Inkscape

I could import the multi-page PDF, but then I failed to find out how to switch to the second page :(

LibreOffice Draw

The text in the imported PDF does not look as it should.

LibreOffice Draw fails to import the text correctly

Solution: Firefox

In the end I opened the PDF in Firefox, which contains an PDF editor.

It's sad that I have to use a browser for something that a native PDF tool should be able to do.

Published on 2024-06-03 in ,


Screen time passcode reset without Apple ID

I've got a Macbook Pro running MacOS 12.7.4 Monterey with two local accounts: user and admin, both without an Apple ID.

The user account has a "screen time" passcode set that I forgot:

10 failed login attempts

The official instructions say:

  • Click Change Passcode, then click Forgot Passcode.
  • Enter the Apple ID and password you used to set up the Screen Time passcode.

The window does not have a "forgot passcode" button, and I suspect this is because the account does not have an Apple ID.


After searching for hours for a solution, I spent 50 internet points to get an answer but nobody could help.

The only options left are:

  1. Delete the user account and create a new one.
    Lose all settings like wallpaper, keychain and dock preferences.

  2. Install Linux that allows me to reset such things in config files.

For me this one of the shady things Apple does to nudge people into their pay-per-month online system, just as they do with the system preferences advertisements.

Published on 2024-05-03 in , ,


LVB: Haltestellendurchsagewerbung #2

Die Leipziger Verkehrsbetriebe verkaufen weiterhin Werbeplätze in den Haltestellendurchsagen der Straßenbahnen, und diese sind viel schlimmer - störender - geworden.

Während es 2021 auf der Linie 10 und 11 vom Hauptbahnhof in Richtung Markkleeberg nur einzelne Werbeplätze waren, ist jetzt bis zum Connewitzer Kreuz fast jede Haltestelle mit Werbung zugepflastert:

Augustusplatz
Zugang zur Innenstadt
Opernhaus
Gewandhaus zu Leipzig
Universität Leipzig
Zentralapotheke
Wilhelm-Leuschner-Platz
Platz der friedlichen Revolution
Zugang zur S-Bahn
Krystallpalast Varieté Leipzig
Rewe Herschel im Neo
Münzgasse
Leipziger Volkszeitung
Smile Eyes Augenmedizin und Augenlaserzentrum
Xanox deine Traumküche
Hohe Straße
MäcGeiz dein Discounter
Südplatz
keine Werbung
Kurt-Eisner-Straße / Karl-Liebknecht-Straße
Genusspunkte Eisbrennerei Café Puschkin
Richard-Lehmann-Straße
Optikstudio Müller Kontaktlinsen- Brillenspezialist
Wohnungsgenossenschaft Unitas
Connewitzer Kreuz
keine Werbung
Stockartstr
McMedi Apotheke hilft sparen

Das ganze ist ziemlich nervig und stört sehr beim Lesen.

Published on 2024-04-24 in ,


1blu IPv6 status 2024

Es ist das Jahr 2024, 26 Jahre nach der Standardisierung von IPv6. Die 1blu RootServer unterstützen kein IPv6, wie auch die meisten anderen Produkte bei 1blu. Traurig.

Der Support meint:

Wir bedauern Ihnen mitteilen zu müssen, dass IPv6 bei Ihrem Produkt aktuell noch nicht unterstützt wird. Unsere Technik arbeitet bereits daran dies zu ermöglichen. Bitte haben Sie Verständnis, dass wir Ihnen jedoch noch keinen genauen Termin nennen können.

Siehe auch:

Published on 2024-03-05 in ,


Windows 8.1 in VirtualBox: Automatic Repair failed

I tried to get a Windows 8.1 system running inside VirtualBox 7.0.12, but it fails as soon as I install the Guest Additions.

All Windows updates have been installed. When installing the Guest Additions, there are 4 errors about Windows preventing the installation of unsigned drivers.

After rebooting, Windows sees something is broken and will do an automatic repair, which yields no results. Rebooting does not help, the system is broken beyond repair :(

Bug report: #21979: Installing Guest Additions in Windows 8.1 leads to non-bootable system

[German] Automatische Reparatur wird vorbereitet [German] Automatische Reparatur

Published on 2024-02-05 in


GameStick: Black screen after OOBE

Work on my own server for the abandoned PlayJam GameStick micro console continued, and two weeks ago I deemed it good enough to make it public for others to test.

To make sure everything works fine I removed the GameStick host name entries from my local DNS server, factory reset the GameStick and started the initial setup. It all worked fine as expected, but after completing setup the screen went black and stayed that way. Only notifications that a Gamepad was connected/disconnected or the internet connection was established were shown in the bottom right corner. The GameStick did not react to gamepad nor keyboard input.

Black screen with a notification

Since had reinstalled the 2071 firmware as part of my test, I had no access to adb - for that I had to install and start the TOFU media player, install and run my "start adb" plugin. None of this was an option since the main UI ("Console") did not load.

Git backups

Flashing firmware 2058 gave the same black screen that 2071 showed.

I suspected something to be off with my API and changed the connect API responses to known-to-work versions from git history of the playjam gamestick API code, but that did not help. Minimizing them did not help either.

Next I tried to replace the profile API with a version that I used when I got it working for the first time, but that did also not help.

I also suspected the session IDs to have invalid characters, but changing them did not yield any results. The black screen stayed.

Another thing that the official connect API responses had were UI translation strings, so I integrated them - but no avail.

The first three days of poking in the dark were over.

Cache files

During development I had collected a number of server responses that were cached on different GameSticks (Toast, Cataphoresis, Ryo, Kazdan, Lee Chapman). I let my server return those files, but the screen still stayed black.

Since I knew that the UI did not show the latest data when they were downloaded from the server, I had to boot the GameStick once to the black screen, wait for it to download all API data, and rebooted again to see if the new data made any difference.

Nothing.

I also replaced the small .jpg profile images with original large .png files.

From previous experiments I knew that OOBE in firmware 2071 did not show the profile image, while 2058 does. So I tried to find out what changed between those two firmware versions: 2058 used the custom JSON handler, while 2071 had completely switched to a Gson to parse and hydrate the API responses.

There were no differences to find in the parsed properties. Day 4 over.

Android emulator

My main problem was that I did not have error logs because the PlayJam developers had disabled adbd on the GameStick. My next idea was to install all the GameStick .apk files inside the Android emulator and see the error in its logs.

Fortunately I could configure a 4.1 Android system for the emulator, start it and install all com.playjam.* apk files that were part of the 2071 firmware. I could start OOBE, but it would hang in the 5th step, the activation. Logs said that it could not obtain the hardware ID which is needed in requests to the API server.

I dived deep into the decompiled code, found out how the GameStick loads its hardware ID, built an Android app that provides a system service that starts on boot and sends out the com.playjam.SYSTEM_INFO intent with a fake hardware ID and firmware version information.

I learned the hard way that building an app with only a service and without any user interface will never be marked as "activated", and thus its services will never be started by the Android system. So I had to build a dummy UI activity that started the service once.

In the end, my service worked and the GameStick apks could fetch the correct API from the server, and OOBE finished.

The Console UI had some errors because certain files and folders were missing in the /data user partition. I copied them over from the firmware image, and the GameStick intro video played!

GameStick boot/intro video

Unfortunately the UI crashed while the spinner was rotating, because playing a sound did not work in the emulator:

W/AudioPolicyManagerBase(  654): getOutput() could not find output for stream 3, samplingRate 0,format 0, channels 3, flags 0
E/AudioTrack-Java( 2246): [ android.media.AudioTrack ] getMinBufferSize(): error querying hardware
W/dalvikvm( 2246): JNI WARNING: JNI method called with exception pending
W/dalvikvm( 2246):              in Lcom/ideaworks3d/marmalade/LoaderThread;.runOnOSTickNative:()V (GetObjectClass)
W/dalvikvm( 2246): Pending exception is:
I/dalvikvm( 2246): java.lang.NullPointerException:
I/dalvikvm( 2246): 	at com.ideaworks3d.marmalade.SoundPlayer.start(SoundPlayer.java:75)
I/dalvikvm( 2246): 	at com.ideaworks3d.marmalade.LoaderThread.soundStart(LoaderThread.java:856)

But this was a kind of success: The intro video was not visible on my real factory-reset GameStick.

Day 6 over.

Gamestick Console loading inside Android emulator

GameStick CFW

So my GameStick stays completely black but the emulator shows the intro video: I needed to get back to real hardware. One thing I had not yet tried was CFW 1.4, the Custom FirmWare by shanti (GameStickers.net: [ROM] CFW v1.3 - Updated 1.4 is out :D, archived version). It hopefully has adbd enabled, which would give me logs.

I flashed it onto the GameStick, and it booted into a standard Android user interface (the whole point of the firmware was to get an usable Android without any restrictions). Then I installed all the com.playjam.*.apk files and populated /data as I had when using the emulator.

The results were good: OOBE worked, intro video plays, the spinner is visible and then the normal UI starts and is usable - only game images did not load.

But while it was nice that I got the official UI working on custom firmware, I did not find out why the official firmware stayed black.

Day 7 was gone.

Custom firmware

When inspecting the CFW 1.4 files I noticed /system/build.prop which contained three additional lines:

persist.service.adb.enable=1
persist.service.debuggable=1
persist.sys.usb.config=mass_storage,adb

If the official firmware had this, I'd get proper error logs and could see the error messages.

I learned that the GameStick firmware .img files are standard Android OTA .zip files and not some custom format.

I also learned that firmware files need to be signed, so I used the standard java method for signing:

$ signapk -a 4 --min-sdk-version 16 --disable-v2 certs/certificate.pem certs/key.pk8 image.tmp.zip image.signed.img

.. but when trying to flash that image I got:

Verifying update package...
Installation aborted.

I tried different parameter combinations (align/noalign, v1/v2) but all failed.

Android system recovery: Firmware installation fail

Then I read all 28 pages of the archived CFW thread on gamestickers.net and found someone who asked how the image was signed. shanti had answered:

here is the program I used: "Sign-em! 2.0"
http://forum.xda-developers.com/showthread.php?t=1966007

I got the linux version and found it used signapk.jar. After finding that I saw that it used some internal old Sun Java class sun.misc.BASE64Encoder that was not available anymore in any recent OpenJDK :(

Android system recovery normally only installs firmware images that have been signed by one of a number of white-listed keys. The GameStick's recovery seems to allow all properly signed images, regardless which signing key was used.
This is the reason the CFW was possible at all - on OUYA, custom firmwares could only be installed when using a custom bootloader, but not with the stock recovery that requires firmwares to be signed by a key that only OUYA possessed.

Then I found the next XDA thread post that linked to HemanthJabalpuri/signapk which contained MinSignApk 1.0 that ran on current Java versions!

I signed my firmware image with MinSignApk, and could flash it!

Android system recovery: Firmware installation success

Update 2023-06: An adbd-enabling firmware image is available at codeberg.org/gamestick-fans/firmware-adb-enabler/

Errors

Now that I had flashed my custom firmware 2071+adb I finally saw the errors:

Download directory

I/ActivityManager( 3509): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 pkg=com.playjam.gamestick.console cmp=com.playjam.gamestick.console/.Main u=0} from pid 3754
D/GameStick( 4262): ****************************************
D/GameStick( 4262): Failed to create download directory

The directory existed, so I removed it:

$ adb shell rmdir /data/data/com.playjam.consoledev/files/Downloads

Next boot, the GameStick would create the directory, and the following it would complain again. So this was not the problem.

readAsciiLine

I/ActivityManager( 4479): Displayed com.playjam.gamestick.console/.Main: +313ms (total +1s416ms)
W/System.err( 4628): java.io.EOFException
W/System.err( 4628): 	at libcore.io.Streams.readAsciiLine(Streams.java:203)

The firmware update check needs to return its JSON on a single line, otherwise parsing would fail. I modified the server.

OpenTextureFile

D/PlayjamKeyboard( 3685): Starting for type : 0/0
I/marmalade( 4262): PJException error has occurred : 62 c:/_work/dev/marmalade_main/menu_head/src/PNGFile.cpp OpenTextureFile open png Error : empty file name

This finally looked like the real problem. I removed all game information from the API in case the game images were the culprit, as well as the profile images. Still the same error.

Day 8 was over.

The next day I tried more image related changes:

  • Use .png profile images
  • Provide a lastAchievementImageUrl as .png
  • Remove profile images again

A race condition

While booting the GameStick I came across a very special error:

W/DatabaseService:ConnectDownloader( 3794): Failed to duplicate connect data for console : /data/GameStick/ConsoleResources/315f7b66-fae7-4ab3-9d46-bf41942694b6.json => /data/GameStickCache/reg_server_response.json

Reading through the source code led to me understanding that process:

  1. GameStick user interface requests the game data in mode cache_then_fresh. This means that cached data should be returned immediately, but a background request to get fresh data would be started afterwards.
  2. The cached response data is returned gets parsed by ConnectDownloader
  3. In the background, the new data are fetched from the server.
  4. New data download finishes and the old cached data file gets deleted.
  5. ConnectDownloader finishes parsing the old file and wants to copy it to a different place, so that the "console" UI process can use it.

The last step failed because downloading fresh data (500 kiB!) was faster than parsing cached data.

This could only happen on my local setup: GameStick's WiFi reception is so bad that I could not use my normal access points. Instead I enable an access point on my laptop whenever I do GameStick development, and the GameStick only needs to transmit data some 30cm to my laptop. Since the API server is running on the same machine, data transmission is much faster than usual, leading to that race condition.

This problem was fixed with a sleep(2) call to slow down the API.

/data

The GameStick still gave the OpenTextureFile error with no hint about the file it tried to read.

I tried my luck, built a 2058 firmware with adbd and did get a more verbose error:

I/marmalade( 5452): PJException error has occurred : 97 c:/_work/dev/marmalade_main/menu_head/src/PNGFile.cpp OpenTextureFile open png Error : Cannot open file raw:///data/GameStickCache/Assets/textures/placeholder3.png

That was very strange. I knew that the firmware image contains nearly 1000 files in the /data folder, and confirmed that this particular file also exists in both 2058 and 2071 firmware files.

It turned out that /data/GameStickCache/Assets/ was completely missing on my device, as well as /data/GameStickCache/Resources/. What the heck?

Now I remembered that when flashing firmware via system recovery, I always do two steps to get a nice clean system:

  1. Apply update(*.img)
  2. Wipe data/factory reset

But the GameStick firmware installation process already populates the user data partition /data/! Wiping user data after installation removes all the asset files that are needed by the console user interface, leaving a broken system.

Now it also made sense that I did not see this problems on the emulator and the CFW setup: I knew those files were missing and had manually copied them from the firmware update into /data.

Day 9 had finally brought relief.

Fin

The key takaway is that the PlayJam developers did not follow standard Android conventions and put necessary system data onto the user partition.

When flashing a GameStick, always wipe user data first, and then flash the firmware .img file. Never the other way round.

Published on 2023-06-19 in ,