Tonerstress

Vor ein paar Jahren habe ich mir einen Farblaserdrucker von Samsung gekauft: CLP-315W. Ab und zu hat der sogar drahtlos funktioniert, was eines meiner Kriterien bei der Anschaffung war. Heute bin ich froh, wenn ich ihn austricksen kann, was anderes als weiße Blätter auszuspucken.

Das liegt auch daran, dass der Toner leer, „abgelaufen“ oder eingetrocknet ist. Ich könnte mir also neuen bestellen. Der kostet aber gut 150,- €! Und da stellt sich dann wieder die Frage, ob sich das überhaupt lohnt, oder ob man erst einmal einen günstigen neuen Drucker ersteht – ich will eigentlich nur ein paar Seiten mit Skizzen für einen Bauantrag ausdrucken.

Dass das zwar finanziell durchaus richtig sein könnte, aber ökologisch eine halbe Katastrophe, kreisen die Gedanken also doch wieder um diese 150,- € für den Toner. Oder doch nur in verbleichtem grau ausdrucken? Ich glaube, ich schaue mal, ob ich am Wochenende in Kalmar einen Copyshop finde. Das wäre eigentlich die vernünftigste Alternative: mit USB-Stick bewaffnet dort vorbei und ein PDF ausdrucken lassen.

Copyshops… Auch so etwas, bei dem ich nicht gedacht hätte, dass ich da nach dem Studium noch mal mit zu tun haben würde.

Technische Probleme bei der Webentwicklung- Heute: ImageMagick

Für ein neues Projekt stand ich vor der Aufgabe, verschiedene SVG und Beschriftungen in einer besonderen Schriftart zu kombinieren und am Ende als PNG/JPEG zur Verfügung zu stellen. Soweit, so gut, ImageMagick sollte all dieses können und mir auch in Form einer PHP-Bibliothek zur Verfügung stellen.

Da ich das neue MacBook Pro zum Anlass genommen hatte, alles komplett von Neuem zu installieren, war Homebrew zwar schon längst installiert, ImageMagick aber eben noch nicht. Ein paar wenige Befehle später meldete brew install php70-imagick den Vollzug. Blöderweise meckerte PHP trotzdem, dass es die Klasse Imagick nicht kennen würde. Ein Blick in die Ausgabe von phpinfo() ergab zwar, dass die INI-Datei der Extension verarbeitet wurde, ansonsten tauchte aber keine Information zu ImageMagick auf.

Nach ein paar hilflosen Neuinstallationen der Pakete, kam ich mal auf die Idee in die Error-Logs des Apache zu schauen. Und siehe da: PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/opt/php70-imagick/imagick.so' - dlopen(/usr/local/opt/php70-imagick/imagick.so, 9): Library not loaded: /usr/local/opt/imagemagick/lib/libMagickWand-6.Q16.3.dylib\n Referenced from: /usr/local/opt/php70-imagick/imagick.so\n Reason: image not found in Unknown on line 0

Wie üblichen in solchen Fällen, googlet man nach der Fehlermeldung und landet unweigerlich bei Stackoverflow. Die Lösung dort sah harmlos genug aus und nach kurzem Anpassen auf meine Zwecke liess ich brew reinstall php70-imagick --build-from-source ausführen. Natürlich mit positivem Ausgang, so dass ich danach endlich mit der eigentlichen Aufgabe fortfahren konnte.

Als dann irgendwann eine erste Version fertig war, sollte diese natürlich auch auf den Staging-Server. Die Skripte dafür waren recht schnell eingerichtet, ein erster Testlauf brachte aber kein Bild zum Vorschein. Auch hier in die Ausgabe von phpinfo() geschaut, wo aber alles danach aussah, als wenn ImageMagick vollständig installiert war.

Unter den unterstützen Formaten tauchte aber SVG nicht auf! Und das, obwohl die Version auf dem Server nur eine Minor-Release älter war, als die, die ich lokal verwendete. Hier war dann die Lösung, zusätzlich noch das Paket imagemagick zu installieren, da dabei wohl etwas mehr enthalten ist, als wenn nur php70-imagick installiert wurde.

Ich freue mich jetzt schon darauf, wenn dieses eigentlich keine Modul irgendwann auch mal beim Kunden installiert werden muss. Aber immerhin kenne ich jetzt schon ein paar Fallstricke und bin so eigentlich gut vorbereitet.

Zeit für Gemütlichkeit (Stromausfall)

Draußen stürmt und schneit es und seit gut anderthalb Stunden ist der Strom schon weg und wird laut Störungsseite des Stromanbieters auch noch mindestens für zwei Stunden weg sein. Also geht es mit Kerzen und batteriebetriebener Lichterkette weiter.

Der Internetzugang ist dank iPhone-Tethering und 4G-Netz sichergestellt. Das neue MacBook Pro zeigt auch noch 84% Restkapazität (6:43 verbleibende Stunden) an, insofern gibt es auch keinen Grund zur Panik!

Im Moment gibt es wieder häufiger Stromausfälle, nachdem ich jetzt fast ein Jahr komplett davon verschont geblieben war. Aber hier in der Gegend werden die Stromkabel gerade von oberirdischem Verlauf in die Böden verbuddelt. Da kommen Störungen vielleicht etwas häufiger vor.

Beim letzten langen Stromausfall, der wohl drei Tage dauerte, gab es hinterher eine üppige Erstattung auf dem Kundenkonto, so dass ich ein paar Monate gar nichts zahlen musste. Ich habe aber nicht mitbekommen, was der Auslöser dafür war. Ich nehme aber mal an, dass ein Ausfall von vier bis fünf Stunden nicht zu einer erneuten Entschädigungszahlung führen wird.

Also Abwarten und Tee trinken. Ach ne. Kein Strom, kein Wasserkocher. Und so arg ist es auch noch nicht, dass ich den Gaskocher (angeschafft nach dem letzten miterlebten mehrtägigem Stromausfall) in Betrieb nehmen muss.

Abwarten.

Wenn der Rauchmelder drei Uhr nachts klingelt

Es gibt Rauchmelder, die piepsen dezent einmal pro Minute, wenn ihnen der Strom ausgeht. Das ist nervig, aber unter Umständen trifft man so auf nächtliche Besucher. Diese Nacht musste ich aber feststellen, dass er deutlich nerviger geht: einfach mal um drei Uhr nachts in voller Lautstärke Alarm schlagen. Im Schlafzimmer. Direkt über meinem Bett.

Dieser Rauchmelder blinkt einmal pro Minute um mitzuteilen, dass er noch da ist. Und ja, dann macht es tatsächlich Sinn, wenn man nicht nur irgendwann aufhört zu blinken, sondern sich akustisch meldet. Aber so? Ich weiß nun immerhin, dass ich bei Rauch im Zimmer sofort wach werde. Heute morgen bin ich aber erst einmal durch das ganze Haus getapst um zu prüfen, ob nicht doch irgendwo Rauch zu riechen wäre.

Und um ganz auf Nummer sicher zu gehen, habe ich den Kohlenmonixid-Warner aus dem Wohnzimmer geholt um zu sehen, ob der oben anschlägt – vielleicht ist der einfache Rauchmelder im Schlafzimmer ja eigentlich ein Kombigerät gewesen. Aber wie es aussieht, ist einfach nur die Batterie leer.

So kann ich aber eine weitere Batterie gegen einen Akku tauschen – irgendwas positives muss ich der ganzen Sache ja abgewinnen.

Kann man Programmieren lernen?

Als Titel wollte ich erst Wie lernt man Programmieren? nehmen, wollte dann aber auch niemanden enttäuschen, der sich anhand des Titels eine konstruktive Antwort erwartet. Andererseits ist ja eh klar, dass jede Frage, die in einem Titel gestellt wird, mit Nein beantwortet werden kann. Entsprechend könnte ich den Beitrag an dieser Stelle auch beenden.

Tatsächlich bewegen mich diese Frage immer mal wieder, im Moment wieder mehr. Auslöser war ein Artikel, den ich irgendwo aufgeschnappt habe, oder besser nur die Überschrift, die auch als Frage formuliert war und ich mir deshalb das Lesen des Artikels sparen konnte: Programmieren als Schulfach?

Mit der Beantwortung bin ich mir wirklich unsicher: einerseits hatte ich Informatik in der Schule und dort wurden in den drei Jahren zwei Programmiersprachen gelehrt: Pascal und Logo. Andererseits habe ich beide Sprachen jeweils in der ersten Woche nach dem Schulstart durch Lesen der Bücher gelernt. Danach konnten mir die Lehrer in Sachen Programmieren nicht wirklich was beibringen.

Das war aber auch noch die Zeit, in der ein Mathematik und ein Chemie-/Erdkundelehrer den Informatikunterricht gemacht haben. Es war äußerst toll, damals schon mit Logo-Technik und selbstgebastelten Ampel-Steuerung herumzuprogrammieren. Man muss auch bedenken, dass das die Zeit von Apple IIgs in den Klassenzimmern war.

Ich wollte damit auch gar nicht die Schule kritisieren, als vielmehr hervorheben, dass nicht die Schule mich zum Programmieren gebracht hat, sondern meine eigene Neugierde. Ich weiß nicht, was aus mir geworden wäre, wenn ich den C-64 zu Weihnachten bekommen hätte, statt mir ein Vierteljahr später vom Kommuniongeld einen C-16 mit BASIC-Lernkurs zu kaufen. Beim C-16 war ich angewiesen, aus Zeitschriften Listings abzutippen, oder eben mit dem BASIC-Lernkurs selbst was auf die Beine zu stellen.

Das war alles sehr erbärmlich, ich hatte aber in den Jahren darauf noch sehr viel Zeit, mich weiter mit der Materie zu beschäftigen. Das Programmieren hat mich dabei nie losgelassen, auch wenn ich irgendwie nie wirklich etwas sinnvolles programmieren konnte/durfte/sollte. Das änderte sich erst, als ich für die Firma, in der meine Mutter arbeitete, in meiner Freizeit neben der Schule eine Verwaltung für Kundendaten programmiert habe. Ich glaube, das war damals in Turbo-Pascal auf meinem ersten PC, einem 286er.

Während des Studiums und den Nebenjobs dort wurde das ganze Wissen extrem vertieft. In den Vorlesungen in der Theorie und während der Nebenjobs und Uni-Praktika in der Praxis. Aber erst bei meinem ersten Job bei einer AdServer-Firma habe ich überhaupt mit der Webentwicklung angefangen. Damals noch ausschließlich im Backend und in C/C++.

Irgendwann wurde es dann PHP und nach vielen Jahren richtiges PHP mit Frameworks wie CakePHP und schließlich Symfony. Wenn wir nun vor der Aufgabe stehen, Junior-Webentwickler einzustellen, bin ich mir sehr unsicher, was ich erwarten soll und darf.

Es gibt viele, die schon mal irgendwas mit PHP gemacht haben, oder eben mit WordPress irgendwelche Sachen gebastelt haben. Mit Programmieren hat das aber selten was zu tun. Trotzdem sind die Ergebnisse weiter als alles, was ich zu Beginn meiner Programmiererkarriere auf die Beine gestellt habe. Irgendwie sind die Voraussetzungen ganz anders. Ich habe verschiedene Sortieralgorithmen implementiert und ihre Komplexität abgeschätzt. Datenstrukturen wie einfach- und doppelt-verkettete Listen implementiert und die Komplexität von Aktionen wie Löschen und Einfügen abgeschätzt. Und das alles möchte ich nicht missen!

In den Aufgaben eines Webentwicklers wird aber wohl niemand mehr in die Verlegenheit kommen, einen Sortieralgorithmus selbst zu implementieren, oder sich Gedanken darüber machen zu müssen, wie denn nun genau das Array in der Sprache implementiert wurde, die man gerade nutzt.

Andererseits stelle ich auch bei Leuten, die sich schon mehrere Jahre mit Webentwicklung herumschlagen, fest, dass einige grundlegende Funktionalitäten gar nicht richtig verstanden wurden. Wobei nicht verstanden wahrscheinlich zu harsch ist – sie mussten sich einfach bislang noch nicht damit beschäftigen, da die Werkzeuge, die sie benutzen, die Thematik so weit abstrahieren, dass die Grundlagen komplett versteckt werden.

Ein von mir beliebtes Beispiel sind dabei Cookies: wie werden sie gesetzt und gelesen. Was genau passiert da? Da wird bei vielen schnell klar, dass selbst das Konzept von Request und Response noch gar nicht wirklich verinnerlicht wurde. In den meisten Fällen ist das auch tatsächlich gar nicht notwendig, aber wenn plötzlich „seltsame“ Dinge passieren, oder ein Feature Teste, ob ein User Cookies erlaubt nach mehreren Iterationen des Codes einfach nicht einwandfrei funktionieren will, dann sind die Grundlagen gefragt.

Wie aber bringt man so etwas bei? Ich habe schon häufig mit dem Gedanken gespielt, einen „Programmierkurs“ zu veröffentlichen. Es scheitert in erster Linie daran, dass ich nicht weiß, wie man einerseits genügend Wissen vermittelt und andererseits schnell Fortschritte aufweisen kann, damit es für die Schüler nicht zu langweilig wird.

Fängt man erst einmal nur mit PHP an und begnügt sich wochenlang mit einer Ausgabe in der Konsole? (Und nein, ich will jetzt keine Diskussion anfangen, welche Sprache für Anfänger die geeignetste ist.) Oder fängt man mit einem Framework wie Symfony an und zeigt parallel wie man mit Datenbanken arbeitet und zeigt die ersten Schritte in HTML, sowie HTTP, weil man ja direkt Ergebnisse im Browser sehen möchte?

Beides hat irgendwie seine Berechtigung: ich hätte Bauchschmerzen, jemanden nur Symfony beizubringen, ohne ihm/ihr beizubringen, was da genau in der Datenbank passiert und was der ganze Code bewirkt, der dort benutzt wird.

Allerdings hat es heutzutage ein PHP-Profi schwer, wenn er nicht auch weiß, wie Frameworks funktionieren und wie man damit recht schnell Webanwendungen erstellt. Ein reiner PHP-Profi wird wahrscheinlich erst einmal sein eigenes Framework implementieren – was aber wahrscheinlich genau der richtige Ansatz ist!

Genauso, wie man auf der Kunstakademie auch erst einmal lernen muss, wie man perspektivisch zeichnet und wie man Licht und Schatten richtig einsetzt, bevor man sich dann irgendwann mit abstrakter Kunst beschäftigt, genauso kann man die Vorteile eines PHP-Frameworks erst zu schätzen lernen, wenn man selbst an eigenen HTML-Seiten mit PHP-Code dazwischen verzweifelt ist.

Programmieren ist unglaublich komplex und auch wenn ich in den letzten 31 Jahren nicht jeden Tag oder jede Woche etwas dazu gelernt habe, dann aber doch mindestens jedes Jahr. Und diese Erfahrung können angehende Entwickler von heute gar nicht so schnell aufholen. Bei all den neuen Anforderungen müssen einfach irgendwelche Sachen auf der Strecke bleiben.

Deshalb sind die besten Programmierer solche, die die Demut mitbringen, dass sie nur an der Oberfläche kratzen. Ich kratze an vielen Stellen auch nur an der Oberfläche und lerne auch jetzt immer noch neue Sachen kennen, mit denen ich mich vorher noch nie beschäftigt hatte. Neben der Demut ist also auf jeden Fall auch noch Neugierde eine wichtige Eigenschaft. Den Rest kann man sich dann aneignen.

Alles in allem bin ich immer noch unsicher, ob man die Frage, ob man Programmieren lernen kann, mit Ja beantworten kann. Und ob es Sinn macht, das Fach in der Schule anzubieten. Vielleicht, um die wirklich demütigen und neugierigen potentiellen jungen Programmierer überhaupt mit der Materie vertraut zu machen. Ich glaube aber nicht, dass Programmieren so wichtig ist wie Mathematik, Lesen und Schreiben, oder Geschichte.