Default value for bash script parameter

Die Verbindung von How can I pass a command line argument into a shell script? und Assigning default values to shell variables with a single command in bash sieht wie folgt aus:

Aufzurufen dann wahlweise mit oder ohne Parameter:

– klar.

MicroPython vs. HTTP Response Headers

Der Raspberry Pi Pico W ist pure Magie. Ein Microcontroller, in Python zu steuern, mit WLAN on board 😍 Super einfach, damit irgendwas im Netz zu machen – essentiell für IoT, looking at you, Arduino.

(Aber man muss|Außerdem kann man) viel über MicroPython lernen. Zum Beispiel, wie urequests Response-Header parst: Als Key/Value. Das ist uncool, da es durchaus Header gibt, die doppelt kommen können und sollen:

The optional replace parameter indicates whether the header should replace a previous similar header, or add a second header of the same type. By default it will replace, but if you pass in false as the second argument you can force multiple headers of the same type. For example:

Sagt PHP (replace Parameter).

The Set-Cookie HTTP response header is used to send a cookie from the server to the user agent, so that the user agent can send it back to the server later. To send multiple cookies, multiple Set-Cookie headers should be sent in the same response.

Sagt Mozilla.

Imho nicht unbedingt unseriöse Quellen, aber für MicroPython ist das trotzdem kein schlagendes Argument; Header duplicates werden weiterhin nicht unterstützt werden. Siehe meine längliche Diskussion ab hier.

Es gibt aber einen Workaround, und der ist imho nicht offensichtlich: Man kann nämlich urequests.post() mit einem Parameter parse_headers aufrufen, der erstmal ein Boolean ist – aber auch eine Callback-Funktion sein kann:

Das Fragment (ich hoffe, ich habe auf die Schnelle nichts vergessen) printed alle Cookies. HTH.

Git Properties

gradle-git-properties, ne? Da ist war mir nicht ganz klar, wie man das in einem Task vor doLast{} verwendet; ich bekam immer

Cannot get property ‘gitProps’ on extra properties extension as it does not exist

. Dabei steht es eigentlich da 🙂 Also:

hth

CycloneDX Gradle Plugin

Die “Use Cases and Examples” von CycloneDX sind leider nur so mittel hilfreich für Gradle-Projekte, insbesondere solche ohne plugins DSL. Hier wie es trotzdem zu applyen ist:

Spock: Implizite Variablen in @Unroll

Neben den where:-Variablen gibt es auch implizite:

ergibt:

via, und.

Google Fonts selber hosten

Mein Theme (Ari von Elmastudio) nutzt von Haus aus die Fonts Droid Sans und Droid Serif von Google. Bis gestern waren die auch bei Google gehostet, was ich eh immer mal ändern wollte. Manchmal benötigt man halt etwas Druck 🙂 In diesem Fall durch dieses Gerichtsurteil (via).

Also: Besagte Fonts sind Open Source, ich habe sie hier und hier als ttf runtergeladen. Auf transfonter kann man sich ein entsprechendes Webfont-Package erzeugen lassen, in diesem Fall binde ich in der functions.php ein (statt bisher zwei) css ein:

Gradle: Delete stopped daemons

Maschine frisch gestartet, trotzdem “busy” Daemons?

Starting a Gradle Daemon, 17 busy and 2 incompatible and 2 stopped Daemons could not be reused, use –status for details

Dann alle mittels gradle --stop beenden. Jetzt zeigt gradle --status “STOPPED” Daemons, die auch nie verschwinden?

PID STATUS INFO
5295 STOPPED (stop command received)
19041 STOPPED (by user or operating system)
30937 STOPPED (by user or operating system)

Dann kann man folgende Dateien löschen (es sollte gerade kein Daemon laufen, klar):

  • ~/.gradle/daemon/<Versionsnummer>/registry.bin
  • ~/.gradle/daemon/<Versionsnummer>/registry.bin.lock
  • ~/.gradle/daemon/<Versionsnummer>/*.out.log

Java: FIPS mit Bouncy Castle

Disclaimer: Der Post ist 100 Jahre alt, aber wo ich ihn nun gerade in den Entwürfen finde…:

The Legion of the Bouncy Castle bietet mit bc-fips FIPS 140-2-zertifizierte Security Provider an, und zu der umfangreichen Dokumentation gibt es ein paar Good-to-knows:

  • der Provider muss per Security.addProvider(new BouncyCastleFipsProvider()); hinzugefügt werden; per Security.insertProviderAt(new BouncyCastleFipsProvider(), 1) (die Position ist 1-based) gibt es eine RuntimeException: “Could not merge Java truststore with system truststore”
  • im o.g. PDF liest man häufig EC.generateKeyPair(), die Methode gibt es so nicht. Stattdessen gibt es eine generateKeyPair() unter Beispiel 31 im selben PDF:

  • Speziell unter Linux kann das Hochfahren der App sehr lange dauern, der Grund scheint /dev/random zu sein; ein apt install haveged hilft
  • Die Beispiele basieren auf EC(DSA), es geht aber auch RSA. Dazu nehme man (ansonsten analog):

  • PS: Bei einem uninitialized KeyStore hilft vermutlich ein keyStore.load(null, null); (Danke, Nils!)

HTH

iOS: “Failed to load resource: cannot parse response”

Die Meldung

Failed to load resource: cannot parse response

bzw.

Parsen der Antwort nicht möglich

beim Aufruf von Webseiten kann darauf zurückzuführen sein, dass die verwendete iOS Version gzip nicht unterstützt. So gesehen in iOS 11, 12, 14 (ja: in 13 war es schon mal behoben).

Abhilfe für Spring:

Danke, Nils!