gefrickel

Autosizing Textareas

Manchmal sollen Textareas genau so groß sein, wie der Inhalt es erfordert. Dafür gibt es leider noch kein html attribut. Aber es gibt ein paar Hacks.

Ich habe hier ein Codepen für eine autosizing textarea.

Die notwendige Höhe der Textarea gibt steht in der textarea.scrollHeight . Aber um diese zu bekommen muss die textarea.style.height auf inherit gestellt werden. Weil die Höhe jetzt aber klein ist, scrollt der Browser an eine andere Stelle, wenn ich die Höhe jetzt auf textarea.style.height = textarea.scrollHeight+"px" setze.

Um das zu verhindern, wrappe ich die Textarea in eine Flexbox und stelle einen leeren div daneben. Dem gebe ich auch die Höhe mit heightKeeper.style.height = textarea.scrollHeight+"px" . Die Flexbox ist so hoch wie das höchste Element und für den kurzen Moment der inherit Höhe bewahrt der HeightKeeper die bisherige Höhe.

Telegram @MhImpfBot sendet Benachrichtigungen bei neuen Terminen in sächsischen Impfzentren

Für Impftermine in sächsischen Impfzentren, gibt es das sächsische Portal zur Impfterminvergabe. Dieses bietet leider keine Benachrichtigungsfunktion bei neuen Impfterminen, aber auch keine öffentlich zugängliche API.

Impfee bei Countee bietet eine Übersicht über alle Termine in allen sächsischen Impfzentren, aber auch keine Benachrichtigung.

Damit müssen alle Impfwilligen permanent das Terminvergabeportal wegen neuen Terminen anfragen. Das Portal ist dann meist durch den großen Andrang überlastet.

Besser wäre es, wenn ich einfach eine Benachrichtigung bei neuen Terminen bekäme ohne ständig nachschauen zu müssen.

Deswegen habe ich mir einen Impfbot geschrieben.

Der Impfbot liest die API von Countee aus und merkt sich die Werte pro Impfzentrum. Wenn die Anzahl der Termine steigt, schickt ein Telegram Bot eine Nachricht an alle Subscriber.

Wer Telegram nutzt, kann dem Bot @MhImpfBot eine Nachricht schicken und bekommt dann ebenfalls Benachrichtigungen über neue Termine.

Den Code dazu gibt es bei github unter github.com/Matthias-Hermsdorf/impfbot

meine Erfahrungen mit Raspberry Pi's

Raspberry Pi's sind eigentlich interessante kleine Computer. Meine Erfahrungen damit sind aber eher durchwachsen.

In meinem Haushalt befinden sich ein Pi1, ein Pi2 und ein Pi4. Alle Jahre wieder versuche ich es mal.

Den Pi1 kaufte ich für ein Robotikprojekt. Ich brauchte einen Server, ein paar PWM Pins und Wlan. Heute würde ich hierfür ein ESP32 verwenden. Den gab es zu vor 8 Jahren aber noch nicht. Der Pi war aber gut geeignet. Ich konnte ein NodeJS installieren und machen was ich wollte. 1min nach dem Anschalten war alles bereit. Meine Tochter hatte so langsam wieder das Interesse verloren. Aber dann ging es los.
Ein paar Notizen und die Software liegt bei github.com/Matthias-Hermsdorf/robotik. Der Roboter hatte ein 12V Akkupack für die Motoren und eine kleine Powerbank für den Pi. Hohe Anfahrströme wenn der Pi gleichzeitig auch mehr Strom haben möchte, kann dazu führen, das der Pi Probleme bekommt und sich ausschaltet.

Das Ausschalten ist so eine Sache. Bis heute hat kein Pi einen Powerbutton. Es gibt Anleitungen im Netz, wie man sich einen baut. Und das sollte man auch. Mit einem einfachen Strom trennen, ist danach gern die SD Karte korrupt und der Pi lässt sich nicht mehr anschalten.

Pi2 kaufte ich wenig später. Es sollte ein lokaler Webserver und vielleicht ein NAS werden.

Das Standardbetriebssystem der Raspberry Pi's hieß früher Rasbian und heute Raspberry OS. Es ist ein modifiziertes Debian und funktioniert im großen und ganzen gut. Dieses Linux lebt im allgemeinen auf einer Micro SD Karte. Nur haben diese Karten im Vergleich zu SSDs eine sehr beschränkte Anzahl von möglichen Schreibvorgängen. Bei dem Webserver hoffte ich, dass das Rasbian darauf getrimmt ist vorrangig readonly zu arbeiten. Nach 9 Monaten war der Pi die Karte dann tot und der Server wieder Weg. Die alten Pi's hatten nur USB2 und ein 100Mbit LAN. Selbst mit einer Festplatte am USB war der Datentransfer zu langsam um als NAS sinnvoll zu sein. Als Webserver für kleine lokale Projekte aber war er gut.

Aktuell habe ich wieder ein Projekt, für dass sich ein Pi anbietet. Es muss ein NodeJS Server sein, der zuhause permanent angeschaltet ist. Der Pi braucht unter 2W und bietet sich hier als langfristig kostengünstiger Server an. Es wäre gut, wenn das Raspbian jetzt auf einer Festplatte liegen würde. Doch die alten Pi's können nicht von USB booten. Die Lösung hierfür fand ich im rasberrypi.org forum. Erst alles auf der Karte installieren, dann die wichtigen Teile auf die Festplatte kopieren, so dass nur noch von der Karte gebootet wird, aber alles weitere auf der SSD passiert. Ich kaufte eine SSD und einen SSD zu SATA Adapter und los geht es.

apt-get install nodejs

So einfach könnte es sein. Damit bekomme ich aber derzeit ein nodejs@10 und das wo derzeit 14 und 15 aktuelle sind. Spätestens npm meckert über die alte Version. In den Tutorials da draußen gibt es dann die krudesten Vorschläge vom selber bauen der Sourcen über alternative Paketmanager. Selten stieß ich auf den Hinweis die aktuellen Paketquellen hinzuzufügen

curl -sL https://deb.nodesource.com/setup_15.x | sudo -E bash -

Gut, damit habe ich ein aktuelles Node auf einem genügsamen Server. Anders als vorherige Projekte, in denen ich die Daten des Servers gern als JSON in ein Datenverzeichnis ablegte, würde das hier mehr Daten generieren, die ich auswerten möchte. Aus NodeJs heraus macht es wirklich keinen Spaß SQL zu benutzen. Ich hatte erst sqlite probiert und dann ein mysql. Schön war das nicht.

MongoDB wird häufig von den JS Hipstern eingesetzt und dann werden Terrabyteweise Daten im Internet freigegeben. Kann schon sein. Diese Instanz soll aber nur im LAN verfügbar sein. Dann ist es nicht so schlimm, wenn es Löcher gibt. Dafür ist die API schön.

await rates.findOne({ tradingPair: tradingPair }, {sort: {created: -1}})

So zum Beispiel. Auf meinem Laptop war alles gut. Auf dem Pi ließ es sich installieren. Aber bei genauem hinschauen, installierte es dort eine deutlich ältere Version. Das Netz sagt: Mongo will eine 64 Bit Umgebung. Der Raspi2 war der letzte 32 Bit Prozessor.

...

Ach eigentlich hatte ich besseres zu tun. Nunja, kaufe ich halt ein neuen Pi, ein 4er mit viel Ram. Und noch den HDMI Adapter dazu weil der Pi MicroHDMI Ports hat. Weiteres Doku lesen sagte das Raspberry OS zwar mit 64 Bit umgehen kann, Programme aber nur eine 32 Bit Umgebung bekommen. Aber man könne ja Ubuntu installieren und dort würde wirklich alles gehen.

Ubuntu ließ sich sofort auf der MicroSD Karte betreiben. Der Pi4 kann auch von USB booten. Zumindest in Rasberry OS. Ubuntu startete einfach nicht von der Karte. Es war frustrierend.

Gut, dann also kein Mongo. Was gibt es noch? CouchDB hatte ich in Erinnerung. Von der API her war auch RavenDB interessant. Es gibt eine kostenlose Community Edition. Aber eigentlich ist es doch ein Freemium Modell. In der Community Edition ist auch der RAM und die Anzahl der Cores beschränkt. Aber dafür steht explizit bei den Downloads, das es eine Variante für den Pi gibt. Aber kaum weitere Doku.

Mein Code hatte ich umgeändert, so dass jetzt statt Mongo RavenDB genutzt wird. Der Raspberry Pi Imager kann jetzt direkt USB Geräte als Ziel auswählen. Ich hatte alles auf dem Pi. Auf dem Schreibtisch, am Monitor hängend lief alles gut. Also fahre ich es runter, hänge es an seine Zielposition neben den Router, schalte ein und sehe... nichts. Er meldet sich nicht im LAN. Und er ist an und weit weg von Monitor und Tastatur. Einen Power Button habe ich nicht.

Ich habe den Pi dann vom Strom getrennt, zurück zum Schreibtisch gebracht und wieder angeschaltet. Dort bekam ich verschiedene Fehlermeldungen. Alles deutet auf ein korruptes Filessystem hin. Es startet nicht mehr.

Vielleicht stelle ich doch den alten zotac ci passiv gekühlten MiniPC hin. Der hat einen Power Button und einen Sata Steckplatz. Die 7 Watt mehr sind ok, wenn es dafür einfach mal funktioniert.

Die Pi's sind klein, billig, genügsam und frustrierend. Kurzfristig zum Entdecken ist das wohl ok. Aber diese Kombination vom fehlenden Power Button und korruptionsanfälligem kurzlebigem Speicher sind ein echtes Hindernis für längerfristige Benutzung.

Divid - ein Experiment

 

 

Jede Fläche wird mit der Zeit dunkler. Wenn eine Fläche schwarz ist, wird sie über die längere Seite halbiert und Subflächen werden angelegt. Diese starten mit einer neuen Farbe und einer neuen Geschwindigkeit.

Nach 2000 Teilungen geht es von vorn los.

Ich hatte erst vor, das in einer eqivalenten Geschwindigkeit Teile wieder verschmolzen werden, wenn 2 Narbarflächen die gleiche Farbe haben. Aber mit dem permanten Teilen haben sind die Kanten benachbarter Flächen fast nie identisch lang. Nächstes Mal gibt es was anderes.

Aqualight ist jetzt bei GitHub
Basteltisch einem Arduino zur Steuerung von LED Streifen im Aquariumdeckel

Die Aquariumbeleuchtung funktionierte eine Weile gut. Dann schaltete sich das Licht nicht mehr aus.

Nach einer langen Suche fand ich den Fehler. Der interne Timer, der bei millis() die Zeit seit dem Anschalten zurück geben, lieferte immer nur die gleiche Zeit zurück und stieg nicht mehr an. Aber das passierte nur, wenn der Arduino am Netzteilstrom hing. Am USB funktionierte alles wie gewünscht. Also habe ich einen anderen Arduino eingebaut. Da lief die Zeit. Aber wenn er ein PWM Signal ausgeben sollte, flackerte es ein paar Mal und dann blieb er stehen.

Das Netzteil ist zwar mit 12V angegeben. Das Multimeter spricht aber von 14,8V. Und das war dem Arduino, entgegen des Datenblatts, wohl zu viel. Ich habe ein Spannungssteuerungsmodul dazwischen gehängt. Es sollte 5V ausgeben, aber es kommen 6,2V heraus. Damit kann der Arduino umgehen und jetzt läuft es.

Das Arduino Sketch gibt es jetzt bei GitHub. Das Projekt heißt https://github.com/Matthias-Hermsdorf/aqualight. Die Unterstützung für NeoPixel habe ich entfernt. Sonst nimmt das noch jemand und bereut es danach.

Das Projekt Aquariumbeleuchtung ist jetzt fertig
Das Projekt Aquariumbeleuchtung ist jetzt fertig

Ich hatte in der 2. Version der Aquariumbeleuchtung ein LED neupixel RGB Streifen an den Aquariumdeckel geklebt. Es war doppelseitigen Klebeband mitgeliefert und es hielt leidlich. An den Enden habe ich mit Gewebeklebeband nachgeholfen. Aber es ist RGB Licht und das hat ein für diesen Zweck ganz schlimmes Spektrum. Ich könnte den roten Stein leuchten lassen oder das ganze Aquarium in ein blaues Licht tauchen. Aber die Pflanzen sahen immer blass aus. Es war einfach nicht schön anzusehen. Und ich musste die alte Lampe immer noch zusätzlich leuchten lassen damit es akzeptabel hell war. 25W statt 6W und immer noch nicht schön.

In Version 3 der Beleuchtung habe ich einen 12V IP68 Led Schlauch abgeklebt. Er verspricht 1800lm bei 15W und einen >90 Farbechtigkeitsindex. Ich habe 1,8m in 4 Streifen mit dem mitgelieferten Klebeband in den Deckel geklebt. Gewebeklebeband hat nicht geholfen und ich habe es zusätzlich mit Heißkleber fixiert. Nach einer halben Stunde leuchten war der Schlauch dann heiß genug geworden und Teile der Konstruktion fielen uns Aquarium. IP68 heißt dass der Schlauch wasserdicht ist. Die Fische hat es nicht weiter gestört. Mich schon.

Ich habe die LEDs dann mit Sekundenkleber festgeklebt. Es wird dann wohl die letzte Variante sein.

Die Steuerung auf dem Arduino habe ich in verschieden modifiziert. Statt der Neopixel Steuerung wird die Helligkeit jetzt per PWM gesteuert. Das funktioniert jetzt auch mit 1024 Stufen statt nur 256. Damit sind die Übergänge weicher. Zum anderen nutze ich für die Helligkeitsberechnung nicht mehr Sinuskurven sondern ein Array mit 24 Stundeneinträge und lineare Übergänge dazwischen. Damit kann ich die Dämmerungsphasen besser definieren. Vielleicht kommt das Sketch dann zu GitHub.

Aquariumbeleuchtung.
unser Aquarium

Unsere ist dunkel und nur in der Mitte. An den Seiten wachsen die Pflanzen kaum. Es gibt eine analoge Zeitschaltuhr die es an und aus knipst.

Das geht so nicht. Ich habe gelesen was es für vielfältige Optionen gibt. Je mehr das Produkt ein fertig kaufbares ist, desto weniger macht es das was ich will. Und so kommt in den nächsten Tagen wasserdichtes Neopixel Lichterband mit 60Leds. Ich kann mit einem Arduino Microcontroller die Beleuchtung programmieren. Prinzipiell jede LED einzeln und in allen Farben. Aber Discolicht muss es nicht sein.

Binär ist auch nicht so schön. Es eine Morgen- und Abenddämmerung wäre nett. Die könnte einen linearen Helligkeitsverlauf haben. Schöner ist aber ein halbes Sinus am zur Dämmerung.

Es gibt auch B-Splines, das sind abgerundete Kurven durch definiere Punkte. Manche machen Mittag etwas weniger Licht damit es am Abend länger scheinen kann, aber die Algen nicht übermäßig wachsen.

Oder naturnah könnte ich den Sinus über den ganzen Tag ziehen. Die Erde macht es ja auch so.

Wie lang mache ich die Dämmung... Gott zu sein zieht einige notwendige Entscheidungen nach sich.

Mit der jetzigen 3D Druck Technologie bleiben die Drucker ein Nieschenprodukt
Druckerzeugnisse des Tages

Heute morgen spielte mein Kind mit der Holzeisenbahn. Sie benötigte ein weiteres Brückenteil. Meine Frau meinte, dass das doch was für den 3D Drucker wäre.

Recht hat sie und damit hatte ich einen Auftrag für den Tag. Jetzt ist es später Abend und die Ausbeute ist gering.

Als erstes schaute ich zu Thingiverse und fand das hier. Mein Drucker hat einen kleinen Bauraum von 10x10x10cm. Für die meisten Sachen reicht es und für Größere gibt es den Makerspace an der SLUB. Die Teile für die Anfangssteigung waren zu zweit in einem Modell enthalten. Der Druck dauerte 2,5 Stunden und zum Mittagessen hatte ich die ersten Teile. Das Ende der Steigung sah so voluminös aus. Ich habe Blender geöffnet und eine Weile herumgestümpert und es nach halben Stunde ratlos geschlossen. Dieses Programm ist vielleicht mächtig in seinen Funktionen. Aber die Benutzbarkeit ist unterirdisch schlecht. Ich hatte ein Loch in das Modell bekommen, musste Polygone reparieren und hatte am Ende ein scharfkantiges Gebilde, das ich so nicht haben wollte.

Den ersten Druck hatte ich mit 0,2mm gedruckt. Das ist der Standardwert des Druckers. Es sieht grob aus und er schafft auch 0,1mm. Die bessere Qualität bezahlt man mit der doppelten Druckzeit. Für den anderen Baustein, den ich auch in 2 Konfigurationen brauchen würde, prognostizierte der Repetierhost mehr als 5 Stunden Druckzeit. Das fand ich dann doch sehr lang. Mit 0,3mm würde es nur 2,5h dauern. Also probierte ich das. Ich hatte ja Zeit. Mein Kind war schon lange zum nächsten Spielzeug übergegangen und bis zur nächsten Eisenbahnfahrt würde es eine Weile dauern.

Das Ergebnis des 0,3mm Druck war schlecht. Die Ebenen lagen nicht immer übereinander. An detailreicheren Stellen hing Stroh heraus. Wahrscheinlich ließe sich das mit ein paar Änderungen in den hundert Parametern optimieren. So war es nicht kinderzimmergeeignet. Aber das ist ein Thermoplast und so habe ich mit einem Feuerzeug die Oberfläche gleichmäßig erhitzt und die Bahnen weich verstrichen. An den meisten Stellen hat die Prozedur geholfen. Zu voluminös war der Baustein real erst recht. Den 2. davon würde ich nicht drucken.

Nach dem Abendessen fand ich das hier. Ein Brückenadapter von Lego Duplo auf die Brio Holzschienen. Das war klein, modular und würde überaus praktisch sein, denn die Holzbrücken sind immer so kippelig. Aber mit Brückenpfeilern aus Lego würde es halten.

Wagemutig positionierte ich gleich 4 verschiedene Modelle im Bauraum. Bei 0,2mm würde das, ... 5h dauern. Bis zum zu Bett gehen wäre das zu viel. Und bisher gab es genug Probleme um den Drucker nicht unbeaufsichtigt zu lassen. Ich wählte die notwendigen 2 und speicherte sie auf der Micro-SD Karte.

Der Drucker kann per Repetierhost über WLAN betrieben werden. Dabei hatte ich immer wieder Verbindungsabbrüche. Über USB war es besser. Aber dann wäre ich an den Schreibtisch gekettet. Etwas Abstand ist schon gut. Das Drucken per Micro-SD Karte war dann doch das zuverlässigste. Über WLAN bekomme ich eine rudimentäre Steueroberfläche, bei der ich Temperaturen und Position regeln kann. Das ist schon praktisch, um später den Druck anhalten und den Druckkopf wegfahren zu können.

Ich wollte nicht zu lange wach bleiben, also schaltete ich schnell den Drucker an und startete den Auftrag.

Eine halbe Stunde später, sah ich das der Boden des einen Teils etwas verbogen war. Ich hatte in Nutzerberichten gelesen, dass sich das Druckbett beim einschalten verzieht, aber nach 5min wäre alles wieder gerade. Hätte ich mal darauf gehört.

Nach 1,5h löste sich das Teil mit dem verbogenen Fuß vom Druckbett und der blinde Druckkopf pumpt das Plaste in die Luft.

Ich habe dann den Druck gestopt und den Schaden weggeräumt. Wenigstens musste ich mir keine Gedanken mehr über den fehlerhaft gedruckten Überhang mehr machen.

---

Es ist Rapid Prototyping. Mit viel Übung mit 3D Druck und Kenntnis über das Filament und den Drucker kann man in kurzer Zeit gegenüber klassischen Verfahren Prototypen herstellen. Aber für den hausgebrauch ist das nichts. Mit der Einfarbigkeit könnte ich leben. Selbst mit der Tatsäche, dass ich meine Wohnung mit Plastik anreichere, könnte ich leben. Immerhin will ich nur das Drucken, was ich auch brauche. Und das ist deutlich weniger, als der übliche tägliche Abfall. Aber die Ausschussrate ist zu hoch. Manche Teile funktionieren vom Modell her nicht. Andere sind mies gedruckt.

Ich habe am gesamten heutigen Tag Gleise gedruckt, die ich bei Amazon für 10€ kaufen könnte. So macht das keinen Spaß.

Ich kann mir Vorstellen, das es neben industriellen Anwendungen auch Druckshops geben wird, die bessere Drucker, eine große Auswahl an Filament und viel Erfahrung haben. Dort kann ich mein Modell bestellen und nach 1-2 Tagen abholen. Für die Stadt ist das die beste Lösung. Der Drucker auf dem eigenen Schreibtisch lohnt sich nur, wenn es keinen Profi im Ort gibt.

https auch hier

Seit gestern sind meine Seiten auch https verschlüsselt.

Vor ein paar Jahren war für mich https zwar sinnvoll, aber sehr kompliziert einzurichten und teuer noch dazu. Let's encrypt hat das deutlich vereinfacht. Und im letzten halben Jahr ist https://www.npmjs.com/package/redbird um ein paar features sinnvoller geworden. Jetzt geht es. Einfach so.

Stehen wir auf den Schultern von Riesen oder auf einem Berg aus Schrott?

In einem aktuellen Projekt habe ich 8mb/1500 Dateien von unseren Programmierern geschriebenen Code (inklusive ein paar Bilder). Mit allen Symfony, Typo3, Bower, node-modules, .git Verzeichnissen sind es 250mb/37000 Dateien.

Da stellt sich wirklich die Frage wieviel toten Code und wie viele Lücken man sich mit den ganzen importen erkauft.

Inhalt abgleichen