Blog: Latest Entries (15):


Die Zukunft aussitzen

Wenn man sich die Nachrichten und entsprechende Magazine im TV ansieht (ich sage nur das N in RTL steht für Niveau) hat man das Gefühl die Kinder und Jugendlichen wären gerade um deren Lebensinhalt betrogen worden. Alles was sie lieben und tun wollen ist gerade durch Corona nicht mehr möglich... weil.. die Schulen sind geschlossen. Es scheint kein höheres Ziel mehr zu geben als die Schulen wieder zu öffnen. War noch Ende letzten Jahres ein Inzidenzwert über 30 was schlimmes und über 50 schon eine Katastrophe ist heute ein Wert von 100 schon ideal um alles wieder zu öffnen. Das der Handel ächzt, der lokale Einzelhandel, weil sie sich das Tempo in dem alle Pleite machen etwas erhöht hat und der Online-Handel, weil die mit ihren neuen Projekten und den Arbeitspensum nach kommen, ist man gerade gewohnt. Aber nun springen die Schulen in die selbe Kerbe. Denk doch mal einer an die Kinder!
Ich weiß nicht was mit den Kindern geschehen ist. Früher war vor dem PC, der Konsole, etc sitzen jetzt nicht so schlimm. Man hat per ICQ und Email kommuniziert und hatte auch entsprechende Online-Plattformen. Niemand saß weinend zu hause, weil man nicht in die Schule konnte. Sich zu hause Dinge beizubringen, war auch nicht gerade selten. Das was einen interessierte hat man sowie so nie in der Schule gelernt. QBasic, Turbo Pascal, C und Delphi... das gab es nicht wirklich in der Schule und wenn man damit in der Schule zu tun hatte nicht weil man es dort gelernt hatte sondern weil man es schon konnte. Werden die Kinder vorgeschoben? Klar. Warum? Weil man seine Schwächen dann nicht offenbaren muss. Remote-Learning. Das ist ein Thema mit dem man sich zum Glück nicht mehr beschäftigen muss, weil es gibt ja Impfstoffe. Im Sommer war Corona ja auch schon vorbei und man musste sich deswegen nicht mehr damit beschäftigen. Falls einen jetzt der Impfstoff wieder das Argument kaputt macht, bleibt ja noch das Leiden der Kinder und da darf man ja nicht widersprechen.

Jetzt wird darüber gejammert, dass die Kinder zu viel mit dem Internet zu tun haben und das wäre ja gefährlich. Ganz moderne Ansichten... Niemand hat einen Plan und es wird damit reagiert, dass man in den Angriff geht und alles nieder macht, was zeigen könnte, das die Schule gerade total abgehängt ist. In der Arbeitswelt ist innerhalb von nicht mal einen Jahr Home-Office schon zu einem Standard geworden. Die meisten würden nie wieder einen Arbeitgeber nehmen, wo Homeoffice nicht, wenn auch nur 1-2 Tage pro Woche, nicht möglich ist bzw. abgelehnt wird. Also die Arbeitswelt macht gerade riesige Schritte nach vorne. Die Schule soll die Kinder auf die Arbeitswelt auch vorbereiten. Genu das passiert gerade nicht mehr. Die Arbeitswelt geht nach vorne und die Schule versucht jedes Stolpern nach vorne im Keim zu ersticken. Das hat nichts mit den Lehrern zu tun. Schon Anfang der 2000er hätten einige Leherer gerne umfassende Plattformen im Internet gehabt.
Die Plattformen kommen langsam. Aber mehr Kapazitäten und Rewrites des Codes scheinen wohl zu viel verlangt zu sein. Warum bezahlt man keine Entwickler die sich an den Projekten beteiligen und damit alle voran bringen? Eine brauchbare und skalierbare Lernplattform wäre etwas womit sich Deutschland hervor tun könnte. In der Schule könnte Oberstufen-Kurse Plugins dafür entwickeln und damit ein Ökosystem schaffen, dass sich selbst weiter entwickelt. Self-enablement der Schulen.

Ich bin sehr gespannt, ob wirklich bis zum bitteren Ende versucht wird nichts zu tun und wann endlich mal Konzepte für die Zukunft vorgelegt werden. Die 90er sind vorbei und die Zukunft kam jetzt ("leider") schneller als viele gedacht haben.

PHP: UTF-8 Check einfach

Um schnell zu prüfen, ob ein String schon UTF-8 encoded ist kann man die mb_string Erweiterung nutzen.


mb_detect_encoding($str, 'UTF-8', true) != 'UTF-8'


oder


!mb_detect_encoding($str, 'UTF-8', true)


Damit kann man dem Problem begegnen, dass ein doppeltes UTF-8 Encoding in PHP einfach den String kaputt macht und weil die Funktion selbst nicht prüft, ob ein Encoding überhaupt nötig ist.

Dinge der letzten Wochen in der Kurzform

Ich hatte für meinen Blog leider die letzten Monate wenig Zeit. Viel zu tun bei der Arbeit, daneben und auch noch ein Homeoffice einrichten inkl. Renovierung. Deswegen hier in einer sehr kurzen Form was ich so mal sagen wollte:

* API-Platform: mähhh... ein Springboot finde ich besser und flexibler
* Next.js: React für PHP-Developer... so mag ich React
* Shopware und Translations: s_article_tranlsations ist nur Caching und s_core_translations ist alt und nicht hübsch
* Bootstrap 5: endlich da und sieht aus wie Bootstrap 4 in noch besser (kein JQuery mehr!)
* Sunlu SPLA: totaler Schrott gefühlt... nicht stabil genug
* Webcams: 300%ige Preissteigerungen.. ich war/bin beeindruckt
* Confluence: Ich habe lange mit geweigert und überlegt, aber nun nutze ich auch Confluence für mich selbst
* Cyberpunk 2077: Gutes Spiel, aber gerade aus Entwicklersicht sehr interessant. wie der Release lief und wie die QK/QS doch grandios in einigen Fällen scheitern kann
* Angebot vor paar Wochen - 150 EUR 4K Samsung Monitor: Super für den Preis, zerkratzt leider leicht, ideal für das Homeoffice
* DECT Thermostate: lohnt sich sowas und würde es im Homeoffice(-Dachgeschoss) wirklich Kosten sparen? China Wifi Lösungen sind zwar günstiger aber die AVM-Lösung sieht für mich besser aus, weil es keine Cloud braucht. Integration mit Alexa?

PHPStorm: Die PHP Runtime aus WSL nutzen

Wenn man mit Windows arbeitet und dort PHPStorm nutzt hat man oft im Terminal die Bash offen, um die unter Windows geschriebenen PHP-Script unter WSL laufen zu lassen.
Aber Jetbrains war ja schlau und hat direkt in PHPStorm eingebaut die PHP-Runtime aus WSL als CLI-Rutime nutzen zu können. Genauso wie man eine Runtime nutzen kann die in einem Docker-Container läuft.

Diese einzurichten ist auch in einem Bild erklärt (wie man PHP unter Linux installiert wird ja an sich jedem PHP-Entwickler klar sein...).

bbcode-image

Shopware: 0 Euro Artikel

Manchmal möchte man Artikel für 0.00 Euro anbieten. Zum Beispiel irgendwelche Muster-Artikel.
Wenn man nun einfach einen Preis von 0.00 Euro eingibt, gibt es einige seltsame Nebeneffekte. Der Warenkorb funktioniert auch nicht mehr und man findet im Log den Fehler (sBasket::getPriceForAddProduct):


BASKET-INSERT #01 No price acquired


Die Lösung ist hier https://forum.shopware.com/discussion/7376/erledigt-null-euro-artikel-verwenden beschrieben. Es muss also immer ein Preis > 0 gegeben sein, denn man über die Gruppe wieder auf 0 zurück bekommt.


Composer Installation mit Version

Jeder der schon mal mit PHP zu tun hatte wird sicher die Installationsanleitung von getcomposer.org. Das Problem ist nur, dass seit einiger Zeit Composer 2.0 installiert wird und einige alte Projekte damit echt ihre Probleme haben. Aber wie installiert man sich eine bestimmte Version? So das nicht plötzlich der Docker-Container nach einem neuen Build eine andere Composer-Version hat und die Pipeline nicht mehr funktioniert.

Lösung:

php composer-setup.php --version=1.10.17


anstelle von


php composer-setup.php

Mega Drive und SNES Trays

Jeder der ein paar mehr Spiele für den Mega Drive oder SNES hat, hat auch eine gewissen Anzahl loser Module rumliegen.
Die Trays die ich bei Thingiverse gefunden hatte, hatten alle das Problem, dass der Boden wirklich nur eine oder max zwei Schichten dick war und entsprechend beim Ablösen auch mal einfach kaputt ging.

bbcode-image


Deswegen habe ich die etwas verbessert und stabiler gemacht:
Mega Drive
SNES

CSV und nach Datum sortieren in Libre Office

Ich hatte das Problem, dass egal was ich versucht habe den Daten einer CSV sich nicht nach der Spalte mit dem Datum sortieren lassen wollten. Ich hab versucht die Spalte als Datum zu formatieren, aber das hat nicht geholfen. Am Ende war die Lösung:

Die Datum-Daten markieren. Suchen und Ersetzen aufrufen.

Suchen nach:

^.*$


Ersetzen durch:

$


und noch auswählen, dass nur im markierten Bereich gesucht werden soll und natürlich dass das ein RegEx-Ausdruck ist.

Die Lösung habe ich hier https://www.libreoffice-forum.de/viewtopic.php?t=9488 gefunden.

'bash' Befehl in Powershell fixen

Ich hatte das Problem, dass der Befehl 'bash' nicht mehr mir die Bash meines WSL Ubuntu geöffnet hat sondern irgendwas machte und dann wieder in die Powershell zurück wechselte ohne was anzuzeigen. Das Problem kam wohl daher, dass ich Docker mit WSL vor Ubuntu installiert hatte. Also kein Hyper-V und kein Ubuntu. Daher war der 'bash' Befehl auf Docker gemappt und nicht auf das Ubuntu.

Prüfen:

wslconfig /L


Ändern:

wslconfig /setdefault Ubuntu-20.04

Gameboy Module aufbewahren

Nachdem ich mit den Mega Drive und SNES Sachen von Thingiverse nicht wirklich zufrieden war, habe ich jetzt die Lösung für den Gameboy komplett selbst entworfen. Mit dem billigen PLA von eBay gedruckt.. mich über das PLA geärgert.. das biegt sich manchmal an der linken vorderen Ecke nach oben.. egal wo diese Ecke sich auf dem Bett befindet.

bbcode-image


Hier der Tinkercad-Link.

bbcode-image

EDC-Wholesale Trackingcode-Mails parsen

Man kann einen Update-Endpoint für Bestellungen definieren, der angesprochen, wenn sich der Status einer Bestellung bei EDC-Wholesale ändert. Problem ist, dass das nicht immer funktioniert und Hilfe auch nicht immer kommt. Aber man hat Mail die man parsen kann. Die wichtigsten Regex dafür sind:

Betreff:

/Auslieferung Ihrer Bestellung/


Body-Trackingcode:

/>(\d+)<\/b>/


Body-Ordernumber:

/Kontrollnummer:<\/b>\s*(\d+)<br/


Damit kann man alle Daten bekommen und seine Bestellungen updaten. Mit einer Shopware 5 Lösung kann ich gerne auf Anfrage helfen.

Ports und Adapter - Meine Definition und Erklärung

Ich hatte eine sehr genaue und von Java geprägte Vorstellung von Ports und Adaptern. Im Tomcat z.B. der HTTP-Port und dann als Adapter HTTP-NIO als Implementierung des Ports. Dann wurde diskutiert und irgendwie hatten alle andere Ansichten was ein Port und ein Adapter sind. Nachdem dann Ports da waren, aber keine Adapter mehr und Ports irgendwie nur noch deren wegen da waren, haben ich mich diesen Sonntag mal hingesetzt und angefangen im Netz zu lesen.

Erst landete ich bei eine Artikel über Ports und Adapter mit Symfony und ich fühlte mich verstanden. Dann kam der die Interpretation nutze und sogar das Repository als Adapter und sein Interface als Port sieht (was an sich ja genau richtig ist). Also mein Verständnis entspricht dem auf Baeldung.com beschriebenen Grundgedanken einer Logic die zwischen nicht kompatiblen Interfaces vermitteln. Zumeist ist eines der Interfaces, das der eigenen Anwendung und das andere das einer 3rd Party Lib.

Also wäre an sich auch JPA ein Port. Es beschreibt ein allgemein gültiges Interface zur Persitierung und die verschiedenen Frameworks wie Hibernate oder EclipseLink liefern Adapter die JPA auf die nativen Interfaces adaptiert.

Dadurch definieren sich schon mal ein paar Dinge:
- es kann keinen Port ohne Adapter geben
- Ein Adapter ist nötig, wenn das Interface nicht mit der eigenen Anwendung kompatible ist

Im Grunde sind wir hier wieder beim klassischen Factory-Patten. Ein allgemeines Interface, viele Implementierung und eine Instanz die entscheidet welche Implementierung gerade die passende ist. Nebenbei in Unit-Tests sehr praktisch.

Wann brauche ich keinen Port:
- Wenn eine Lib schon ein allgemeines Interface bereit stellt
- z.B. was bei den meisten Email-Libs so ist... weil die Änderung der Implementierung oft nur Konfiguration ist
- etwas allgemeines noch mal zu Kapsel macht wenig Sinn
- Ein Adapter für nur eine mögliche Implementierung macht genau so wenig Sinn

Ein sehr fachliches Beispiel wäre das Pushen einer Bestellung an verschiedene Drop-Shipper. Jeder hat ein anderes WWS, ERP oder Shop-System. Man definiert für die Clients ein einheitliches Interfac, was mit den eigenen Klassen (bzw. deren Interfaces) arbeitet. Für jedes System wird ein eigener Client geschrieben und Abhängig vom Drop-Shipper und seinen Systemdaten wird eine Factory die passende Implementierung wählen und konfigurieren.

Also... Ports und Adapter ist kein Konzept, dass man groß erzwingen muss, es ergibt sich zwangsmäßig und von alleine (wenn man nur minimal strukturiert entwickelt).


PS:
Wenn man mehr als eine Domain hat, definiert natürlich nur eine Domain das Interface und stellt die Verwendung den anderen Domainen per UseCase zur Verfügung.

Von der Ring Doorbell zum Fitbit Charge 4

Wir haben eine Ring Doorbell. Damit man auch im Urlaub weiß was an der Haustür so los ist.

bbcode-image


Das Problem ist nur die niedrige Lautstärke und die sehr generische Meldung über Alexa. Nach der Idee ein Outdoor-Alexa zu basteln oder einfach ein Ring Chime zu kaufen, kam die Idee doch eine haptische Meldung über die Fitbit Charge 4 zu versuchen. Mehr Smartes Spielzeug und so.. was soll schon schief gehen. Abert wie bekommt man eine Benachrichtigung auf die Fitbit? DAs geht über Alexa und die
generischen Android Benachrichtigungen. Man erstellt sich dazu eine einfache Routine.

* "Wenn folgendes passiert"
* "Smarthome" + "Haustür" (oder wie die Ring eben genannt wurde)
* dann das Klingeln auswählen
* Als Aktion und Nachrichten den Punkt "Benachrichtigung" auswählen
* hier etwas wie "Ring!Ring!" eintragen
* alles Speichern

Wenn nun die Klingelt gedrückt wird kommt auf dem Smartphone eine Benachrichtigung an und diese landet auch auf dem Fitbit. Wenn man nun das über mehrere Smartphones laufen lässt mit Profilen und eines nicht will: Ausloggen und wieder einloggen kann das Problem lösen.

Nun bleibt am Ende nur das Problem mit der Reichweite von Bluetooth.. aber das werden wir auch noch lösen.

Older posts:

Möchtest Du AdSense-Werbung erlauben und mir damit helfen die laufenden Kosten des Blogs tragen zu können?