
https://giphy.com/gifs/a3zqvrH40Cdhu
♪ Commit ins Abenteuerland ♫

https://giphy.com/gifs/a3zqvrH40Cdhu
Man kann die Fritzbox konfigurieren, dass sie ihre DNS-Auflösung über den Pi-hole macht. Man kann die Fritzbox aber auch so konfigurieren, dass sie den Pi-hole mittels DHCP als DNS-Server im LAN bekannt macht – Danke, Johann. Dann (und nur dann) werden Clients korrekt aufgelöst, statt dass die Fritzbox der einzige Client ist.
Das wäre so einer der Fälle, in dem man evt. die Statistik des Pi-hole zurücksetzen möchte:
|
1 2 3 4 |
cd /etc/pihole sudo service pihole-FTL stop sudo mv pihole-FTL.db pihole-FTL.db.old sudo service pihole-FTL start |
Update: Oooder man geht in der Admin Console auf Settings › System › Flush logs 🙃
Long time no hear! Heute auch nur ganz schnell meine Lieblinge von Twitter:
Ich habe einen 3B hier, der vermehrt “Under-voltage detected” (Code 0x00050005) meldet – dabei aber (als einziges Gerät!) über einen wertigen USB-Hub direkt am Stromnetz hängt. Der Hub hat auch schon früher Raspberrys versorgt, darunter den eigentlich hungrigeren 3B+. Was also ist los?
Es kann natürlich ein Fehlalarm, bzw. ein defekter Pi sein. Vermutlich eher unwahrscheinlich 🙂 Es kann auch der Hub sein; tatsächlich sind minderwertige Netzteile oft ein Grund für (alle möglichen!) Probleme mit dem Pi. Ich hoffte allerdings auf das Kabel; ein Punkt, den man häufig vergisst. Nicht umsonst gibt es explizite “Quick Charging”-Kabel.
Also: Gegenprobe. Weitere Kabel, sowie das “originale” Netzteil (Danke, Nathan!) statt des Hub ausprobiert. Stellt sich raus:
In anderen Worten: Die Foundation bescheißt. So funktioniert natürlich kein standard USB Supply 🙄 Aber wie auch immer. Was das Ganze blogbar macht, ist ein kleines Skript, das ich hier gefunden und während der Tests genutzt habe:
|
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/bash // sudo apt-get install stress: $(stress --cpu 4 -t 310 -q) & COUNTER=0 while [ $COUNTER -lt 300 ]; do /opt/vc/bin/vcgencmd measure_temp >> CpuTemp.txt let COUNTER=COUNTER+1 sleep 1 done |
Es stresst den Pi so sehr, dass er mit einigen der Kabel nach ein paar Schleifendurchläufen hart abgestürzt ist! Mit dem originalen Netzteil hatte ich keine Probleme (wobei da das Kabel fester Bestandteil ist). Also: Das obige Skript ist ein guter Lasttest für einen Pi.
Im Grunde geht’s sogar um zwei Themen, die beide relativ unklar sind, wenn man sich die Einträge auf Stack Overflow ansieht:
Bspw. hier, hier, hier, hier. Es gibt dort einige Lösungsvorschläge, mehr oder weniger aufwändig, viele für Spring Boot 1.x – hier eine weitere (für Spring Boot 2), imho sehr elegante (mit viel Input von Nils!):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
@Component @WebEndpoint(id = "prettyhealth") public class PrettyHealthEndpoint { private final HealthEndpoint healthEndpoint; private final ObjectMapper objectMapper; @Autowired public PrettyHealthEndpoint(HealthEndpoint healthEndpoint, ObjectMapper objectMapper) { this.healthEndpoint = healthEndpoint; this.objectMapper = objectMapper; } @ReadOperation(produces = "application/json") public String getHealthJson() throws JsonProcessingException { Health health = healthEndpoint.health(); ObjectWriter writer = objectMapper.writerWithDefaultPrettyPrinter(); return writer.writeValueAsString(health); } @ReadOperation public String prettyHealth() throws JsonProcessingException { return "<html><body><pre>" + getHealthJson() + "</pre></body></html>"; } } |
Dann wird /health auf /internal/health (oder irgendwas) umgeleitet, und danach /prettyhealth auf /health:
|
1 2 3 4 |
# application.properties: management.endpoints.web.exposure.include=prettyhealth management.endpoints.web.path-mapping.health=internal/health management.endpoints.web.path-mapping.prettyhealth=/health |
et voilà.
Hatte ich doch gerade Schwierigkeiten, das Video wiederzufinden: Mal getwittert, nicht gebloggt, hiermit nachgeholt.
tl;dr: MajorUpgrade ab der initialen Version!
Folgendes Szenario: Ich baue mit WiX einen MSI-Installer für meine Software. Die Software hat die Version 1.0. Nun möchte ich meine Software auf v1.1 upgraden. Was tun?
WiX bietet mehrere Möglichkeiten, namentlich “Major Upgrades”, “Minor Upgrades”, sowie “Small Updates”, die sich ungefähr so definieren:
Liest sich, als würde man meistens ein Minor Upgrade wollen. Internet sagt allerdings das Gegenteil, die Literatur* sieht Major Upgrades als “easier to implement than any other option” an, und last but not least empfiehlt WiX selbst:
When creating an .msi-based installer, you are strongly encouraged to include logic that supports Windows Installer major upgrades.
Was dabei nie so richtig, richtig klar wird (teilweise wird implizit das Gegenteil angedeutet): Beinhaltet nicht bereits Version 1.0 MajorUpgrade (sondern bspw. erst das erste Upgrade), dann funktioniert quasi nichts:
MajorUpgrade enthielt, wird von Upgrade/Downgrade-Logik komplett ignoriert!Warum das dann nicht mandatorisch ist, wird wohl Microsofts Geheimnis bleiben.
*Nick Ramirez, “WiX 3.6: A Developer’s Guide to Windows Installer XML”, Seite 342
Per default deinstalliert ein MajorUpgrade die alte Version und installiert dann die neue. Das kann problematisch sein, denn ein Upgrade (engl. für “Verbesserung”, “Aufrüstung”!) sollte ja bspw. Konfigurationsdaten usw. behalten. Da hilft das Scheduling-Attribut:
|
1 |
<MajorUpgrade Schedule="afterInstallExecute" DowngradeErrorMessage="A newer version of [ProductName] is already installed."/> |
sorgt dafür, dass bestehende Dateien (und in diesem Fall auch Services) erhalten bleiben. Es wird quasi definiert, wann das bestehende Produkt entfernt werden soll, und afterInstallExecute sagt “nach der Installation des Upgrades” – natürlich wird dann nur noch entfernt, was in v1.1 nicht mehr benötigt wird.
Achtung: Das setzt offenbar die Erkennung außer Kraft, die eine Neuinstallation derselben Version verhindert 🙄
Bestimmte Schritte des Installers sollen nur bei Erstinstallation ausgeführt werden (etwa die Konfiguration durch den User, die Installation eines Services, …). Dafür gibt es Conditions, bzw. verschiedene States, auf die man prüfen kann – und das ist ziemlich unübersichtlich. Ich beschränke mich an dieser Stelle auf einen Stackoverflow-Post, der gute, sprechende Aliase definiert:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<SetProperty After="FindRelatedProducts" Id="FirstInstall" Value="true"> NOT Installed AND NOT WIX_UPGRADE_DETECTED AND NOT WIX_DOWNGRADE_DETECTED </SetProperty> <SetProperty After="SetFirstInstall" Id="Upgrading" Value="true"> WIX_UPGRADE_DETECTED AND NOT (REMOVE="ALL") </SetProperty> <SetProperty After="RemoveExistingProducts" Id="RemovingForUpgrade" Sequence="execute" Value="true"> (REMOVE="ALL") AND UPGRADINGPRODUCTCODE </SetProperty> <SetProperty After="SetUpgrading" Id="Uninstalling" Value="true"> Installed AND (REMOVE="ALL") AND NOT (WIX_UPGRADE_DETECTED OR UPGRADINGPRODUCTCODE) </SetProperty> <SetProperty After="SetUninstalling" Id="Maintenance" Value="true"> Installed AND NOT Upgrading AND NOT Uninstalling AND NOT UPGRADINGPRODUCTCODE </SetProperty> |
Ein Kind von Component sollte immer KeyPath="yes" gesetzt bekommen. Selbst, wenn es nur ein Kind gibt, aber insbesondere bei mehreren. Daran wird entscheiden, welches die maßgebliche Datei ist, die vorhanden (und aktuell) sein muss, um “muss (re-)installiert werden” zu entscheiden.
That’s all (via)
Watt, das habe ich noch nie gepostet??

🎶 Immer wenn ich traurig bin, lese ich diese Commit Message 🎵
(Und den Zusatz zur Autorin)
hatte ich von hier, auf Youtube fand ich dann
und wie großartig ist das bitte? Gut auch live:
Jetzt muss ich erst mal das Album hören: