Lizenzen einsammeln die man in seinen Projekten benutzt kann manchmal nötig sein. Gerade wenn man Software für andere
entwickelt, kann sich der Kunde dafür interessieren, weil den es ja einschränken könnte, wie er die Software verwendet.
Das geht mit diesen Libs relativ einfach.
PHP:
composer global require comcast/php-legal-licenses
~/.config/composer/vendor/bin/php-legal-licenses generate
Im Homeoffice bin ich faul. Ich will da entspannt arbeiten und so viel schaffen. Ich hab keine Lust mich da noch groß mit dem ganzen Drumherum zu kümmern. Da würde ich am Liebsten alles zu 100% automatisieren. Der erste Schritt ist nun die Heizung. Ich will nicht morgens hoch und abends runter regeln. Wenn ich lüfte will ich auch nicht ganz runter drehen müssen. Ein Grund dafür ist, dass der Heizkörper unter einer Dachschrägen ist und man immer sehr gebückt dahin gehen muss und er Thermostat in der Ausrichtung auch noch sehr schlecht zu lesen ist.
Ich hab mit für ein Thermostat mit DECT-Anbindung von AVM entschieden. Das Fritz!DECT 301. Einmal weil wir eine Fritzbox und DECT für die Telefone schon nutzen und weil man doch relativ einfach und genau die Zeiten über die Fritzbox steuern kann ohne noch eine extra App nutzen zu müssen. Das Home-Office ist für den Versuch ideal, da die Nutzungszeiten sehr genau definiert sind. Es soll etwas vorher warm werden und etwas nach Feierabend wieder kühler werden (falls dann doch mal eine Überstunde ansteht). Zur Mittagszeit in der Pause kann es auch ruhig kühler werden. Natürlich wird es nicht sofort kalt, also wird wohl zu Mittag nicht mehr geheizt aber die Temperatur nur minimal zu der Zeit sinken.
Die bis zu 30% Kostenersparnis sehe eher sehr skeptisch. Aber eine geringe Kostenersparnis erhoffe ich mir dann doch.
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.
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.
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?
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...).
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):
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.
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.
Deswegen habe ich die etwas verbessert und stabiler gemacht:
Mega Drive SNES
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.
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.
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.
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.
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.
Wir haben eine Ring Doorbell. Damit man auch im Urlaub weiß was an der Haustür so los ist.
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.
Auf Wunsch hier nochmal eine kleine Anleitung wie man Xdebug in einem Docker-Container zusammen mit PHPStorm verwendet. Ich hatte ja schon eine Anleitung für VSCode geschrieben und dort am Ende angemerkt, dass es mit PHPStorm sehr viel einfacher geht. Vorhin nochmal getestet und es geht sehr viel einfacher.
Aber von Anfang an. Wir müssen erstmal das Docker-Image um Xdebug erweitern:
RUN pecl install xdebug-2.8.0 && docker-php-ext-enable xdebug
RUN echo 'zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so"' >> /usr/local/etc/php/php.ini
RUN echo 'xdebug.remote_port=9000' >> /usr/local/etc/php/php.ini
RUN echo 'xdebug.remote_enable=1' >> /usr/local/etc/php/php.ini
RUN echo 'xdebug.remote_host=host.docker.internal' >> /usr/local/etc/php/php.ini
Dann installieren wir uns "Xdebug Helper" für den Chrome oder eben die Kombination aus Addon und Browser, die man gerne hätte.
Dann den Docker-Container starten. Die Seite im Chrome aufrufen und dort das Addon aktivieren. Einen Breakpoint in PHPStorm setzen und PHPStorm auf Debug Eingänge horchen lassen.
F5 im Webbrowser drücken und dann das Mapping bestätigen.
Das wars. Super einfach und schnell (abgesehen vom Docker-Container bauen) eingerichtet.
Ich nenne diese Struktur DDD-Cluster, da es ein Cluster aus mehreren Domains ist, die auch unter einander kommunizieren können und auch die Hexagonale-Architektur abbilden.
Jeder der schon mal in Java eine EJB3-Anwendung mit mehreren Modules gebaut hat, sollte das darin wieder erkennen können und weiß sicher das so ein Diagramm zwar schön sauber aussieht, aber die Realität schnell ganz anders ist. Abhängigkeiten wachsen schnell und schnell gibt es Module die fast alle anderen Module benötigen und schnell zyklische Abhängigkeiten entstehen. So eine Architektur entsteht, wenn man sauber und bewusst arbeitet. Die Anwendung wird nicht sauber und strukturiert, weil es die Theorie so einer Architektur gibt.
Also nichts neues aber mal nett anzugucken. Dann denkt man an die Realität und weiß wieder warum es Microservices gibt.
Man kennt Systeme wie Satis oder Toran die sich aus einem Git bei Änderungen den aktuellen Stand holen und ihn in Versionen für die Libs umwandeln. Man darf nicht vergessen die System zu triggern, um immer die aktuellen Version zu haben. Sonst ändert man was und wundert sich, dass sich nichts ändert.
Mit Gitlab kann man alles in einem haben und das in sehr einfach. Auto DevOps ist aber diesmal nicht die Lösung. Aber man braucht nur ca. 1 Minute um alles einzurichten.
1) Package Repository aktivieren (wenn noch nicht so)
2) Pipelines aktivieren (unwahrscheinlich dass es noch nicht ist)
3) auf der Startseite des Projekt "Setup CI" wählen
4) Bei den Templates "composer" auswählen und mergen
5) .. fertig
Schon findet man beim nächsten Push eines Branches oder Tags in der Package-Registry einen Eintrag für einem Composer-Package.
Wie sollen Commit-Messages aussehen? Es gibt viele gute und durchdachte Konzepte dazu.
* Einfache mit wenig Formalitäten
* Sehr umfassende, die zur automatischen Generierung von Changelogs taugen
Aber man sollte sich auch klar machen, dass diese Commit-Messages nur bei Merge Commits zum tragen kommen. Wenn man in einem Branch ist commitet man häufig (mindestens einmal am Tag) und oft auch WIP Stände. Vieles was man commited ist ungetestet und enthält noch Fehler. Am Ende macht man alles noch mal hübsch und schreibt die README.
Also hier braucht es weder "feat" noch "fix" Prefixes. Was ist insgesamt ist, sagt ja schon der Branch. Wie es innerhalb des Branches aussieht interessiert nur 1-2 Entwickler. Die Commit-Message des Merges ist interessant und da braucht man an sich keine Message aus der man ein Changelog-Eintrag erzeugen kann sondern direkt einen Changelog-Eintrag. Also macht es sich an sich mehr Sinn über das Changelog, Versionierung und Change-Dokumentierung Gedanken zu machen. Ein Template für Merge-Commits wird da schon von alleine mit abfallen.
"clean up code" und "fixes while testing" sind im Branch also voll OK.
Philips TVs mit Ambilight sind ja echt schön (auch abgesehen von der Fernbedienung) aber auch entsprechend teuer. Grundig hat TVs mit eingebauten Fire TV aber leider ohne Ambilight. Nach etwas suchen und der Entscheidung nicht mit einer Webcam und einem Raspberry Pi selbst was zu basteln habe ich mich ein Set von Govee entschieden.
Die Installation geht echt einfach, auch wenn man vielleicht die LED-Strips später noch mal kleben muss, weil die unter Spannung doch mal abgehen. Die Plastikhalterungen, die für so einen Fall beiliegen, waren leider zu breit für unseren TV. Das USB-Kabel könnte länger sein, aber eine einfach USB-A Verlängerung (30cm) sollte das Problem lösen. Die Kamera hält erstaunlich gut.
ganz viel 3M-Klebezeugs
Aufkleber zur einfachen Kalibrierung
Die Installation geht mit einer Mischung aus Bluetooth und WLAN sehr einfach. Wichtig ist wirklich den Vorgaben zu folgen. Licht an und TV aus. Wir haben Ikea Tradfri LED Leuchten und die sorgen schnell dafür, dass alles was die Kamera durch die Spiegelung im TV sieht blau ist. Mit Licht aus sind die Ergebnisse dann wieder stimmig. Aber für 60 Euro und eine externe Lösung (die keinen HMDI Input benötigt) funktioniert es ziemlich gut.
Mit Star Wars Episode 3
Die Govee Wasserdetektoren sehen auch lustig aus, sind aber wohl in Deutschland nicht zu bekommen.
Was ist der 31.1. + ein Monat? Den 31.2. gibt es nicht also ist es der 27.2./28.2. oder ein Tag im März?
Von der reinen menschlichen Logik wäre der Xte Tag des Monats der selbe oder der nächstgelegenste mögliche Tag. Aber nie der Tag des nächsten Monats. Wie beim ISO-Kalenderjahr geht man vom Gefühl nicht davon aus dass das neue (Kalender-)Jahr im alten (gefühlten) Jahr anfängt.
Da meine Blog-Posts über Komplexität und DDD irgendwie nicht voran kommen.. erstmal wieder ein wenig 3D Druck.
Wer noch alte Velux Dachfenster aus der Mitte der 80er Jahre hat, kann vielleicht hiermit etwas anfangen. Das Plastikding, wo man den Hebel so reinhakt.. ich glaube man nennt es Schließblech.
Ich gehöre noch zu den Leuten, die Optische Medien für Backups verwenden. 25GB pro Medium sind ausreichend und die Lagerung ist mit Blurays auch ganz einfach.
Jetzte wollte ich aber den Brenner der Optik wegen lieber extern haben und nicht ins Gehäuse einbauen.
Also druckt man sich schnell ein Gehäuse und dann sollte es ja passen... leider nicht. 5mm fehlten.
Der einfache USB 3.0 SATA3 Adapter passt perfekt, aber das Laufwerk war 5mm zu lang. Die Öffnung hinten im Gehäuse ragt zu weit rein. Also da einfach kürzen, damit es passt. Hier (TinkerCAD) habe ich eine passende Version gebaut.
Ich habe einmal versucht Docker mit der WSL 2 based engine laufen zu lassen. Es war alles extrem langsam und alles dauerte ewig. Vorher lief Docker selbst auf einem langsameren Notebook ganz gut. Das hier beschreibt das Problem sehr genau. Am Ende bin ich auch wieder auf die Hyper-V Engine zurück gewechselt. Meine Daten in das WSL Dateisystem zu kopieren gefiel mir nicht wirklich, weil ich von Windows aus mit PHPStorm darin entwickel. Hyper-V deinstallieren klingt zwar auch interessant und ich könnte Virtual Box wieder verwenden.. aber so ganz traue ich dem nicht.
Manchmal muss man auch heute noch prüfen ob der Benutzer JavaScript
auf der Seite erlaubt hat oder ob ein Framework wie JQuery korrekt geladen und nicht geblockt wurde.
Prinzip ist einfach. Man versucht die Meldung mit JavaScript nach dem Laden der Seite auszublenden. Wenn es nicht klappt, liegt ein Problem vor und die Meldung ist für den Benutzer sichtbar.
Hier wird erklärt wie man im Chrome bewußt JavaScript deaktiviert, damit man solche Fälle testen kann.
Nach dem ich durch meinen neuen PC von einer 2TB SAS auf eine 2TB SATA HDD umgestiegen war, störten mich doch die Laufgeräusche sehr. DAs ist durch aus beachtlich da ich früher auch kein Problem mit 9GB Baracuda SCSI Festplatten hatte.. die 3,5 mit doppelter Bauhöhe.
Aber man wird älter und stört sich daran, wenn man die Festplatte beim Anlaufen hört.
Die Crucial BX500 2TB ist ist relativ günstig. Aber man liest sehr viel negatives in den Kommentaren. Meine Benchmarks zeigen jetzt auch keine Werte wo man aus dem kleinen Haus wäre, aber als Ersatz für eine einfache Daten-Festplatte mehr als gut.
Das Kopieren der Daten von der HDD auf die SSD lief fast durchgehend konstant mit 200MB/s. Normales arbeiten mit PHPStorm läuft auch gut. Selbst das Project mit Shopware 5 und den paar wenigen Plugins lädt schnell genug. Am Ende fühlt sich einfach alles mehr "responsive" an.
Für das 20 Jahre alte Gehäuse erstmal ein Adapter drucken...
Ich habe meinen "neuen" PC von einem Xeon E5-2620 v3 auf ein Xeon E5-2658 v3 aufgerüstet. Nun habe ich wieder 12C/24T und das bei einem geringeren Stromverbrauch als mit 2x L5639. Auch nähere ich mich dem Leistungsniveau des Ryzen 7 1700X an. Mal sehen ob mir noch mal eine schnellere CPU der v3 oder v4 Serie irgendwann leiste.
QS deswegen als Genuine Intel CPU bezeichnet
Zusätzlich fiel mir auch auf, wie viel Stromsparender die CPU im Vergleich zu meinen beiden L5639 ist, ob diese ja schon als L gekennzeichnet sind. Während beide Xeon im Idle nur auf je 25W runtergehen, geht der E5 auf fast 10W runter und bleibt auch insgesamt viel kühler.
Wer mal mit den Tonie-Figuren zu tun hat, wird sich schnell fragen, ob die sich genau so gut kopieren lassen wie Nintendo Amiibos oder Amiibo-Karten. Antwort... es ist alles etwas anders und der Massenspeicher ist eine einfache SD-Karte.
Während man früher noch passende Abstandhalter suchen musste, druckt man sich die heute einfach selbst. Haben auch größere Krafteinwirkungen ohne Probleme überstanden.
Wer mal gesehen hat, wie viel Kraft der Einzugsmotor braucht, um etwas Filament von der Spule abzurollen, gerade wenn etwas Dreck sich abgelagert hat, wird sich gedacht haben: Warum nichts wo es einfach leicht geht.. also eine stink normale und passende Halterung, wie man sie sonst so kennt.
Hier gibt es eine, die ich mir dann auch ausgedruckt habe.
Nun rollt die Spule geschmeidig, ruhig und leise sich ab und der Motor muss nicht mehr groß dran ziehen. Außerdem verdreckt kaum noch etwas dabei.
Ich hab mal ein M12/S-Mount Fisheye-Objektiv ausprobiert. Nun kann ich in der gesamten Küche überwachen, ob der Hund Unsinn anstellt. Das Objektiv hat so 7 Euro gekostet und liefert eine ganz gute Qualität an der einfachen 720p IP-Kamera.
In den wenigsten Fällen, nutzt meine REST-API für einfache CRUD-Operationen. Oft muss man auf die Operationen auch reagieren. Z.B. will man, wenn eine neue Bestellung angelegt wird, auch eine Lager-Reservierung oder einen Export an das ERP anstoßen. Oder man hat Felder die übersetzt werden müssen. Auch will man bei bestimmten Resourcen wie Artikeln noch Metriken mitgeben, wie oft er verkauft wurde und ob er damit zu einem Top-Seller wird.
Für diese Anwendungsfälle stellt API Platform zwei verschiedene Konzepte zur Verfügung.
Data-Provider/Data-Persister Wenn man wirklich Daten an der Resource ändern möchte, ist das hier der richtige Weg. Man greift hier direkt in die Persistierung ein. Der Data-Provider ist für das Laden und der Data-Persister, wie der Name schon sagt, für das Speichern zuständig. Damit man nicht die gesamte Grundlogik jedes Mal neu schreiben muss, kann man hier die vorhandenen Services dekorieren und den Ursprünglichen Service als Parent per Injektion mit rein reichen. Also klassisches Symfony. Wenn nun also Custom-Fields oder eine Sprache in der übergebenen Resource (in transient Fields) definiert sind, kann man die im Persister sich heraus picken und selber sich um die Speicherung
kümmern. Im Provider eben das selbe nur anders herum.
Nun kann man sich denken: "Ich will den Artikel mit seinen Änderungen gerne in einem ElasticSearch-Index haben, damit die Suche auch gleich aktuell ist." Aber dafür ist das der falsche Weg.
Events Wie in Shopware sind hier Events der richtige Weg. Man greift dabei nicht in den Peristierungsvorgang ein und es kann weniger schief laufen. Jeder Subscriber arbeitet unabhängig und wenn einer fehlschlägt, sind die anderen Subscriber nicht eingeschränkt. Gerade bei den POST_WRITE-Events erhält man eine Kopie der Resource und sollte diese nicht ändern. Falls irgendwie der Entity-Manager in Zusammenhang mit der Resource verwendet wird.. sollte man zu den Persistern wechseln. Events nutzen nur die Daten und Ändern sie nicht. XML-Exports, Emails, Metriken... genau hier sind Events die ideale Lösung.
Ich hatte bei einer USB-Kamera mit M12-Objektiv ja den IR-Sperrfilter vom Objektiv entfernt, um ein scharfes Bild zu bekommen. Dadurch hatte ich zwar Falschfarben im Bild, aber erst so wurde die Kamera brauchbar.
Nun habe ich mal getestet wie sich die Kamera zusammen mit einem IR72 Filter verhält. Also so zusagen als reine IR-Kamera. Das Bild ist erstaunlich gut und sollte in voller 720p Auflösung nochmal sehr viel besser sein.
Man kann sich also relativ günstig eine IR-Kamera für verschiedene Zwecke bauen.
Wenn der Druck so aussieht, dann kommt zu wenig Filament aus der Nozzle. Zu wenig ist noch schlechter als zu viel, was man Over-Extrusion nennt.
Dazu kommt ein Klicken oder Klacken, wenn der Motor versucht mehr Filament nachzuschieben und es nicht geht. Der Motor springt wieder zurück und oft rutscht wieder ein bisschen Filament zurück aus dem Schlauch. Wenn jetzt nicht das Filament schlecht aufgewickelt ist auf der Spule oder sogar sich verhakt hat, dann liegt es vielleicht an einer verstopften Nozzle.
Bei mir war es jeden Falls so und die Ersatz-Nozzle hat geholfen, da solche Nozzles auch so gut wie nichts kosten, ist das säubern in härteren Fällen auch überflüssig. Jetzt läuft der Druck wieder normal und Oberflächen sind auch wieder geschlossen und nicht löchrig.
Nun geht es darum das Abrollen des Filaments zu verbessern. Dieses Plastik auf Plastik halte ich für zu schwer gängig... ist mein Gefühl. Wenn dann alles gut läufig, wäre eine Kamera (kleine IP-Kamera) zum Überwachen des Drucks noch sehr schön.
Ich hab cJSv2 jetzt soweit erweitert, dass man nun sich einfach in verschiedene Services in seine Controller injecten lassen kann (und ist dann unter seinem Namen oder einem Alias dort direkt aufrufbar). Jeder Service ist Singleton, so dass jeder Controller auf die selbe Instance des Services zugreift.
An sich wird damit die cjsGetController Methode, mit der sich Controller untereinander mit ihren Namen konnten, überflüssig und man kann einfach asynchrone/reactive Lösungen basteln.
Hier erst einmal ein kleines synchrones Event-System: