WiX: Escape echo

CustomAction führt ein Kommando aus, und das ist bspw. ein Shell-Befehl. In diesem Fall ein echo in eine Datei:

Will man als Teil von “foobar” jetzt Sonderzeichen mit ausgeben, muss man XML-, WiX-/MSI-, und CMD-Escaping kombinieren – oder man hält sich einfach eine Waffe an den Kopf, das geht schneller:

  • " gibt " aus, & ein & – so weit, so klar. Wenn man davon absieht, dass & eigentlich auch ein CMD-Steuerzeichen ist 🤷🏼‍♂️
  • ^< gibt ein > aus, ^> ein > (man beachte die ^, via)
  • [\[] gibt [ aus, [\]] ein ] (via)

Tribute to Keith Flint – The Prodigy Orchestra Medley

Aus Gründen bin ich heute Abend bei Alex Christensen & The Berlin Orchestra, “Classical 90s Dance”. Und um mich wenigstens irgendwie vorzubereiten, habe ich das gerade gegoogelt, und bin bei obigem Video gelandet. Das hat mit Alex Christensen überhaupt nichts zu tun, sondern ist vom Kaleidoscope Orchestra, aber der Punkt sollen die Kommentare darunter sein – ich zitiere:

  • When you realize all the complexity of the “Prodigy” music
  • The moment when classical pianist, hardcore prodigy fan who was 11 years old when attending first gig in Helsinki 1994, is smiling and crying at the same time.
  • The Prodigy is the most powerful shit to ever hit the music scene..
  • Ps: i‘m not crying! You are!

😍

Windows: “Autoconfiguration IPv4 Address”

Wenn ich (hier in Windows Server 2016) manuell eine statische IP konfiguriere, würde ich davon ausgehen, dass die dann auch verwendet wird. Spoiler: Wird sie nicht. Sie erscheint zwar in ipconfig /all, aber eine weitere “Autoconfiguration IPv4 Address” wird als “(Preferred)” markiert. Das “W” in WTF steht für Windows 🙄

Nun habe ich keine Ahnung, was der Grund (oder der Sinn) davon ist, und es ist mir auch egal. So deaktiviert man es:

mit <id> gleich der Nummer des gewünschten Adapters, wie sie der erste Befehl ausgibt. Eventuell deaktiviere man danach den DHCP Client Service, es sollte aber auch so gehen – und letzteres brachte bei mir andere Probleme mit sich; auf diesen Service verlassen sich doch einige weitere.

Quelle

Uhrzeit auf dem Arduino

Wer auf einem Arduino die aktuelle Uhrzeit haben möchte, hat im Wesentlichen drei Optionen. Im Folgenden ein Überblick der Vor- und Nachteile, ohne Anspruch auf Vollständigkeit.

PS: Dieser Post ist eine Karteileiche, insofern kann ich (inzwischen) fast nichts mehr dazu sagen, aber vielleicht helfen die Links ja der einen oder anderen.

DS3231

Ein DS3231-Modul ist quasi eine klassische Uhr: Quarzbasiert, batteriebetrieben, ohne Funk. Beim 3231 wacht ein Temperatursensor darüber, dass eventuelle Abweichungen kompensiert werden (im Gegensatz zum DS1302, DS1307, …). Das Buzzword zu den genannten Modulen lautet “Real Time Clock” (RTC), und es gibt sie bsplw. von Adafruit oder auf Ebay aus China.

Der Vorteil ist offensichtlich: Alles in einem. Anschließen, auslesen, fertig. Allerdings wird die Zeit nur ein mal “gestellt”, und zwar beim Kompilieren. Ist die Batterie leer, oder die Gangabweichung über die Monate (Jahre?) zu groß, oder die Zeitumstellung wird nicht berücksichtigt, oder oder oder, heißt es neu zu kompilieren. Diese Lösung scheint mir die am wenigsten autarke zu sein, deshalb habe ich mich da nicht weiter mit beschäftigt.

NTP

Die für einen Softwareentwickler naheliegende Lösung ist das Auslesen eines Zeitservers. Dazu benötigt man eine Verbindung zu so einem Server, also vermutlich LAN oder WLAN. Die kostengünstigste Version (die praktischerweise auch sehr klein ist) für den Arduino lautet ESP8266, auf Ebay bekommt man welche für << 2€ inklusive Versand aus China 😄.

ABER: Die sind schon deutlich unübersichtlicher zu verwenden! Es gibt aktuell fast zwanzig verschiedene Versionen (plus Abversionen), und sie erfordern 3,3V, während die meisten (gängigen) Arduinos auf 5V basieren. Sie sind nicht mal originär für den Arduino, sondern standalone Bausteine! Es gibt Adapter, Anleitungen, etc.; man muss sich halt dieser Komplexität bewusst sein. Außerdem vermeidet man zwar das (erneute) Stellen der Uhrzeit, ist aber abhängig von genau diesem einen WLAN mit genau diesem Passwort.

DCF77

DCF77 ist das kluge Wort für eine Funkuhr. Es gibt entsprechende Module bei Pollin, Reichelt, Conrad, ELV, … (hier ein Vergleich), leider nicht aus China 🙃. Ich habe von früher noch den hier, der kann auch 5V. Das Auslesen ist nicht trivial, dafür ist man nur so wirklich autark.

Was heißt also “nicht trivial”? Nun,

  • das Signal an sich wird sekundenweise binär übertragen, aber für die Dekodierung gibt es Libraries (aktuell drei offizielle). Man benötigt mindestens eine volle Minute, bis man ein mal alle nötigen Bits empfangen hat – und das unter Idealbedingungen!
  • die verschiedenen Module unterstützen unterschiedliche Spannungen, was man bei der Planung berücksichtigen muss.
  • um ein sekundenbasiertes Signal zuverlässig zu verarbeiten, muss man zuverlässig eine Sekunde erkennen. Dazu benötigt man einen Arduino mit Quarz (halt wie in einer Uhr), die meisten haben aber keinen. Den Pro Mini gab es in einer 5V-Version (damit fällt das Modul von Pollin schon mal raus) mit Quarz, aber den Pro Mini gibt es offiziell nicht mehr… auf Ebay gibt es aber noch welche für ebenfalls deutlich unter 2€ aus China.
  • die Module sind grundsätzlich störanfällig; die Antenne sollte waagerecht ausgerichtet sein, die Leitungen kurz, Röhrenbildschirme weit weg, Z-Dioden helfen. Das macht das Auslesen des Signals nicht schneller, und das Debugging entsprechend langwierig. Im o.g. Vergleich wurden bis zu 20 Minuten gemessen, bis das Signal erkannt war!

PS: Die Library von Udo Klein rühmt sich, besonders widerstandsfähig gegen Störsignale zu sein.

hf!

WiX: Install features options

Das Feature-Element hat einige UI-relevante Attribute, die nicht selbsterklärend sind:

  • Absent='disallow' schaltet “The feature will not be installed” aus – wie man für mandatorische Features das Dropdown insgesamt deaktiviert, weiß ich nicht. Ja, man kann das ganze Feature verstecken (Display='hidden'), aber nicht nur das Dropdown 🤷🏻‍♂️
  • AllowAdvertise='no' schaltet “The feature will be installed when needed” aus
  • “The feature and all of its subfeatures will be installed locally” (in früheren Versionen auch “Entire feature will be installed on local hard drive”) kann laut Internet nicht entfernt werden… andere Quellen legen nahe, dass man das über die Subfeatures und Komponenten steuert, aber ich hatte damit keinen Erfolg.

Gradle: Replace in Copy task

Eine Ersetzung:

Mehrere Ersetzungen:

via