The horrors of PHP

Wenn herauskommt, dass ich tatsächlich noch PHP bei manchen Kunden einsetze, bin ich vermutlich bald arbeitslos. Aber ich kann alles erklären!!! Das hat.. historische Gründe. Und für manche Zwecke ist das Framework tatsächlich ziemlich brauchbar, vor allem aus dem Preis-Leistungswinkel heraus betrachtet.

Heute ein kleines Schmankerl, das mich einen halben Tag gekostet hat und mit einem Schlag gegen die Stirn endete, den ich heute noch spüre. Ausgangssituation ist die Befüllung eines Array mit weiteren Strukturen (auch assoziative Arrays). Dabei werden manchmal neue Einträge erzeugt, während in anderen Fällen ein bereits bestehender Eintrag ergänzt wird.

Consider this code:

$main = array();

$first = array(); // erster Eintrag
$first["bla"] = "blup";

$main[] = $first;

// wenn man diesen Eintrag noch ändern will
$change_it = end($main);
$change_it["bla"] = "blip";

// schaun wir mal
print_r($main);

Huch, immer noch "blup"! Ist klar, end() liefert nur eine Kopie. Man muss sich also eine Referenz holen. Dies gelingt mit dieser ziemlich "eingängigen" (höhö) Syntax:

end($main);
$change_it = &$main[key($main)];
$change_it["bla"] = "blip";

Jetzt ist es fein, in "$main" ist des nun korrekt mit "blip" überschrieben. Doch damit nicht genug. Jetzt kommen wir zum eigentlichen Spezialisteneinsatz.

// Ein weiteres Element hinzufügen
$change_it = array();
$change_it["bla"] = "blop";
$main[] = $change_it;
// schaun wir jetzt mal
print_r($main);

Ach du Sch****! Was ist denn hier passiert?


Array
(
    [0] => Array
        (
            [bla] => blop
        )

    [1] => Array
        (
            [bla] => blop
        )
)

Meine Erwartungshaltung wäre gewesen, dass durch die Zuweisung der Neuanlage des Arrays der Referenz-Bezug aufgehoben ist. Aber das ist nicht der Fall! Füge ich folgendes ein:

unset($change_it);

funktioniert es wie erwartet:

Array
(
    [0] => Array
        (
            [bla] => blip
        )

    [1] => Array
        (
            [bla] => blop
        )
)

Man darf also nie vergessen, dass die Normalität nur ein dünner Schleier vor der Anarchie und dem Chaos ist.. ne quatsch, ich meine natürlich PHP nur ein Wrapper über eine C-Libary ist, deren haarige Knochen immer mal wieder hier und dort herausgucken. Musch halt wissa! Meine Güte.

2-Faktor Brainwash

Google und andere Dienstleister möchten dieser Tage neue Regelungen umsetzen. Dem Benutzer soll die 2-Faktor-Authentifizierung vorgeschrieben werden. An sich eine gute Sache, die die Zugriffssicherheit erheblich erhöht. Vor allem für Leute, die ihre Passworte an gut sichtbaren Stellen hin-bäppern oder noch besser dümmlich kurze Worte verwenden, die am besten ein einzelnes Wort ist, garniert vielleicht mit einem Großbuchstaben oder einer Zahl. Das geht möglicherweise flink verloren oder wird gekonnt mitgelesen. Hier kommt die neue Technik ins Spiel: Auf einem anderen Weg wird eine zweite Prüfung verlangt, die die erste qualifiziert. Uns begegnet das schon an vielen Stellen, z.B. in Banking-Apps, die eine Push-TAN oder einen Schlüssel von einem USB-Stick nach dem Einloggen verlangen.

Aus technischer Sicht ist es unerheblich, _woher_ der zweite Faktor kommt. Es sollte im Idealfall auf einem zweiten Übertragungsweg erfolgen, z.B. über eine SMS aufs Handy, einen zweiten E-Mail Account oder einen Service, der Einmal-Passwörter generieren kann. Ist der Anbieter fair, bietet er seinen Nutzern verschiedene Möglichkeiten an, den zweiten Faktor zu liefern. Das sind nur leider nicht alle.

In vielen Fällen ist es heutzutage nämlich nur möglich, den zweiten Faktor über eine Handy-Nummer bereitzustellen. Man hinterlegt seine Telefonnummer, installiert eine bestimmte App auf dem Telefon und wenn ein Request erfolgt, geht diese App auf und man bestätigt den zweiten Faktor. Warum ist das ein Problem? Das kommt daher, dass man damit dem Anbieter (z.B. Google) damit unfreiwillig mehr Informationen liefert, als man das vielleicht möchte:

  • Den Bezug zwischen Login/E-Mail und der Handynummer
  • Hat der Nutzer weitere Apps und Dienstleistungen des Anbieters auf dem Handy installiert, ist ebenfalls sofort der Bezug hergestellt
  • Werden über die Freigaben der 2-Faktor App möglicherweise viele Informationen des Handys im Hintergrund geteilt: Konten, Kontakte, Positionskoordinaten.. you name it

Das Gemeine daran ist, dass mit der Argumentation "zu ihrer eigenen Sicherheit", dem Mangel an Alternativen und dem fehlenden Bewußtsein der Konsequenzen der Nutzer sich nicht einmal genötigt fühlt, sondern wahrscheinlich einfach beruhigt zustimmt. Na dann: Gute Nacht, schlaft gut.

All in 100

Gerade habe ich gelesen, dass es in Österreich ein Jahresticket für 1095€ geben soll. Damit kann man in jeden Bus und jede Bahn einsteigen. Im ganzen Land. Im Fernverkehr oder im hintersten Dorf. Quasi die "ÖffiCard 100". Eine geniale Idee. Bei dem Preis muss man nicht mehr darüber nachdenken, man nimmt einfach den nächsten Bus. Kein kompliziertes "wie gehtn das mit dem Ticket hier.."

In Deutschland müsste das natürlich etwas teurer sein, aber es wäre der richtige Weg. Geltungsbereich in allen Verkehrsverbünden. Ja, es gibt die BahnCard 100 aber die ist viel zu teuer und gilt auch nur in begrenztem Umfang. Man kann damit auch nicht Bus fahren.

Dieser Schritt würde dann auch mal was zum Wackeln bringen und ein Umdenken auch in der breiteren Masse vorbereiten, die sich ein Leben ohne Pkw noch gar nicht vorstellen können. Mit Salami-Taktik wird es nicht gehen.

Thunderbird Kalender Termine

Ich habe endlich den Fix für ein jahrelanges Ärgernis gefunden. Ich verwende schon immer Mozilla Thunderbird und den darin eingebauten Kalender Lightning. Durch die vorhandenen Plugins kann man gleichzeitig lokales, Google- und Office365 Kalender hinzufügen, dann ist alles übersichtlich an einem Platz.

Eine Sache funktionierte allerdings bisher nicht vernünftig: Die Terminbestätigungen. Diese werden immer per Default von der *ersten* E-Mail Adresse in der Kontenliste versendet und nicht etwa von der E-Mail Adresse aus, an die die Einladung ging (wie man vermutet hätte). Lustigerweise merkt man das erst, wenn man vom Kunden auf einmal Termin-Updates und sonstige Mails an die private Mailadresse bekommt, obwohl man sie nie wissentlich bekannt gegeben hat.

Ich habe überall in Thunderbird nach einer Einstellungsmöglichkeit gesucht und endlich in den Kalendereinstellungen selbst gefunden: Dort gibt es einen E-Mail Eintrag:

wer hett au dees denkt

Dieser wird bei Anlage eines Kalenders ungefragt auf den ersten Listeneintrag gesetzt.

Unfug

Diese Zitate stammen aus einer vor einiger Zeit durchgeführten Umfrage auf Twitter (das ich nicht nutze), wie denn Vorgesetzte oder Kollegen in einer Besprechung spinnerte Ideen am besten in die Tonne hauen (können). Wenn man schon jemand beleidigt, sollte es doch möglichst elegant zugehen, oder nicht?

Aus Ihrer Perspektive ist das sicherlich eine mögliche Überlegung.

Mit dieser, doch sehr individuellen Auffassung habe ich mich im bisherigen Verlauf meiner beruflichen Laufbahn zuvor noch nicht befassen müssen.

Diesen Ansatz halte ich für so überarbeitungsbedütftig, dass es er aus Gründen der Effizienz nicht weiter verfolgt werden sollte.

Ein interessanter Ansatz, auch wenn er der Realität nur wenig zugewandt scheint.

„Sehr interessant“. Oder, schweizerisch: „Hm, spannend.“

Eine solch gedankliche Kühnheit ist mir bislang noch nicht begegnet.

Vielen Dank für deinen Beitrag, Christian.

Ihre Einlassung hat möglicherweise einen literarischen Wert. Ein Zusammenhang mit der hier erörterten Sachlage kann jedoch nicht hergestellt werden.

Unter Berücksichtigung der widerstreitenden Interessen, vermag die Gegenseite doch mehr zu überzeugen.

Ich möchte nicht sagen, dass dies sinnloser Mist ist – aber ich möchte Ihnen diese Betrachtung zumindest zur Reflektion angeboten haben.

Verteilungskampf

Das Gesundheitsministerium hat entschieden, wer wann den China sorry Corona-Impfstoff erhält. Bei so einer fundamentalen Überlegung die 100% der Bevölkerung angeht, hätte man vielleicht erwartet, dass hier der Bundestag mitredet und eine öffentliche Debatte führt. Aber nicht doch. Wie ich gelernt habe, gibt es verschiedene Impfstrategien. Zwei wesentliche dabei sind a) die Reduzierung der Sterblichkeit und b) die Hemmung der Ausbreitung. Man hat sich nun ohne weitere Diskussionen für a) entschieden. Beide Verfahren haben Vor- und Nachteile. Andere Länder wie z.B. Israel (ursprünglich mit viel schlimmeren Infektionszahlen, heute wesentlich "besser" als wir) fahren Programm b). Hier werden nach dem med. Personal als erstes die Menschen mit maximalen Kontakten geimpft. Junge, also Abiturienten und Studenten, dann Busfahrerinnen und Verkäufer, you get the idea. Das führt meiner Meinung nach über einen Umweg auch zum Ergebnis a) allerdings nachhaltiger und mit kürzerer Lähmung des öffentlichen Lebens. Es geht darum die "Verteiler" aus dem Verkehr zu ziehen statt Symptombekämpfung am Ende der Kette zu machen. Ihr merkt schon, welche Strategie ich fahren würde. Dazu kommt noch eine gewisse Unfähigkeit Behäbigkeit der Behörden, die das Ganze umsetzen müssen. Alle Aufmerksamkeit richtet sich auf die Unterschiede der Wirksamkeit von Impfstoffen, statt schnell ein skalierendes System zur Massenimpfung auf die Beine zu stellen. Damit zerschlagen sich in meiner Wahrnehmung alle Hoffnungen auf ein baldiges Ende des Status quo, der die Indikation als Maß für Einschränkungen des öffentlichen Lebens nimmt.

Kennt ihr die Marzipankartoffel von Loriot?

Warum kann die Produktion und Verteilung des Impfstoffs nicht an die erste Stelle gesetzt werden? Ein Ende mit Schrecken statt Schrecken ohne Ende? Derweil entstehen immer neue Mutationen und wir werden mit diesen zaghaften Ansätzen noch lange damit zu tun haben. Dass das Ganze in eine Superwahljahr stattfindet ist darüberhinaus noch ein Problem - das Versprechen von Entscheidungskompetenz und Lockerungen der Wählerfischer-Trick '21.

Der glückliche Prinz..

..besteht auch aus Noppen! Nicht ganz überraschend. Jedenfalls dieser. Wie nicht anders zu erwarten bin ich doch schwach geworden und habe als erfahrener Schnäppchenjäger bei letzte Breis zugeschlagen. Auch dieser Bluebrixx-Bausatz kommt in einer diskreten braunen Pappschachtel ohne verräterische Aufdrucke. Besucher erkennen also nicht, was da im Regal wartet.

Über 1700 Teile in unzähligen Tüten. Ich dachte bin schlau und sortiere die ein bisschen farblich vor. Ob das viel geholfen hat oder ob die Teile schon nach den Bauschritten sortiert waren kann ich jetzt nicht mehr beurteilen. Die Anleitung wie immer nur als PDF.

Das ganze ist so ein Mittelding aus Basteln und Puzzeln. Nebenher kann man Podcast hören und sich ganz entspannen. Am Bausatz gibt es nichts auszusetzen, die Konstruktion ist stabil und die Bauschritte unmißverständlich. Und so hat es auch nur ein paar Abende gedauert, bis er fertig war.

Nett oder?

Die Bilder im Hintergrund sind übrigens von meiner Tochter und nein, ich geb die nicht her. Auftragsarbeiten dürfen aber angefragt werden. Der Alien auf dem Achterdeck hat da irgendwie unbemerkt Platz genommen, keine Ahnung woher der kommt.

Was war das nun für ein Schiff überhaupt? Ich hatte das Fahrzeug schon einmal hier besprochen. Glücklich übrigens deshalb, weil es zumindest im Einsatz nicht unterging. Schon mal eine Leistung ;-) Es ist jedenfalls ein Vertreter eines bereits obsoleten Schiffstyps, der in einer Flotte eingereiht war, die nicht besonders gute Erfolgschancen besaß..
Bluebrixx hat übrigens derzeit auch die japanische Nagato im Angebot. Das Ding ist nochmal etwas größer und ..nein, nein! Kommt überhaupt nicht in Frage!? Wie? Ich überlege mir das gerade? Quatsch! Niemals!! Wie dem auch sei, beide Schiffe haben sich nach dem Krieg als Zielobjekte der amerikanischen Atombombenversuche getroffen. Man könnte sich also eine "Bikini-Flotte" ins Regal stellen. Das ist allein schon wegen dem Namen eine absolut großartige Idee.

Alternative Noppen

Ein Kollege von mir war vor kurzem bei einem Lagerverkauf in der Nähe von Frankfurt. Dort hat er größere Mengen von Bluebrixx Bausätzen erstanden. Mir sagte das alles gar nichts. Anscheinend ist das ein Lego-Klon, die Steine werden aber im Gegensatz zu anderen Klonen nicht in China sondern in Polen produziert. Und besonders interessant neben den hervorragenden Preisen sind die Bausätze. Die halten sich auch nicht an die Lego-Bausatz Regeln.

Bei Bluebrixx gibt es nämlich viel (echte) Eisenbahn, Military (u.a. Schiffe) und bekannte SF Modelle, die auch mal nicht aus dem Star Wars Universum kommen. Das Nette an den Bausätzen ist außerdem, dass im wesentlichen auf durchgängigen Maßstab geachtet wurde. So sieht man z.B. bei den Schiffen schön die Größenverhältnisse. Ich weiß das, weil ich die passenden Youtube Filme angeschaut habe, nicht weil ich hier schon Regalmeter davon stehen habe. Nicht dass wir uns falsch verstehen. Wäre aber.. nett :-)

Nachdem ich mir das Ganze ein Weile lang virtuell angeschaut habe bin ich doch schwach geworden und habe mir ein Fahrzeug bestellt, den Marder III. Und so saß ich dann einen Abend lang schmunzelnd da und habe anhand der (leider nur im Download als PDF vorliegenden) Anleitung gebaut. Ein paar "Spezialsteine" gibt es natürlich, aber im wesentlichen sind es alle Standard "lego-size" bricks. Die Qualität ist vielleicht nicht ganz das, was man vom Original erwarten würde, aber dafür ist der Preis ganz heiß und das Modell hinterher sehr nett anzusehen.

Die Schiffe sollen angeblich auch ganz hervorragend sein. Ich bin aber (bislang) standhaft...

SVN to Git (Part III)

Keine weiteren Details, nur ein kleines Addendum. Eine Info, die ich immer wieder vergesse und hier (auch für euch) aufbewahre. Hin und wieder kommt es vor, dass man ein neues Repository anlegen möchte. Ja, sogar bei mir gibt es gelegentlich neue Projekte ;-) Diese entstehen nun normalerweise nicht auf dem Server sondern auf der Arbeitsstation oder dem Laptop, den man unterwegs dabei hat. Um so ein Projekt remote zu tracken (und vor allem zu sichern) legt man ein remote repository auf dem Server an. Ich habe dazu ein Wurzelverzeichnis für alle serverseitigen Git-Repositories. Das ist praktisch, weil man diese so einer einfachen Datensicherung zuführen kann. Man kann dann folgendermaßen vorgehen:

cd /usr/local/git_root
mkdir git_newProject
git init git_newProject
cd git_newProject
git config --bool core.bare true

Nach "git init" muss man ggf noch (rekursiv) die Berechtigungen des Folders anpassen. Wenn man (wie ich) git mit ssh verwendet, sollten alle Anwender die auf das Verzeichnis zugreifen Schreibberechtigungen haben.

Jetzt kann man das lokale Repository in das eben angelegte leere Repository pushen:

git push --set-upstream origin master

Da noch keine Tracking-Informationen vorhanden sind müssen diese per upstream Option gesetzt werden. Jetzt sind beide Repositories in Sync und man kann mit dem bekannten push/pull Verfahren Änderungen übertragen.

SVN to Git (Part II)

Das SVN Repository nach Git zu überführen ist schon nicht schlecht, nur reicht das in vielen Fällen nicht ganz aus. In "klassischen" VCS Systemen sind häufig mehrere Projekte enthalten, wie auch in meinem SVN Repository. In Git empfiehlt es sich jedoch, für jedes Projekt ein eigenes Repository anzulegen. Der Hintergrund ist, dass es nicht möglich ist, Branches und Merges nur auf einem Teil des Repositories auszuführen. Wenn z.B. in einer Struktur "Projekte" Unterverzeichnisse mit den Projekten "A", "B" und "C" existieren, kann in git nicht z.B. "C" master nach "C" v. 1.0 gebrancht werden. Durch die "leichte" Bauart der Repositories ist es aber kein Problem, für die Unterprojekte jeweils eigene Repositories anzulegen. Ein weiterer Vorteil ist, dass damit auch Abhängigkeiten offensichtlicher werden, was zu sauberem Arbeiten verleitet.

Was kann man also machen? Die Vorgehensweise ist grob die: Das von SVN im ersten Teil erzeugte "große" Repository wird zunächst noch einmal geklont. Dann werden die unerwünschten Teilprojekte herausgetrennt, so dass nur noch das relevante Projekt übrig bleibt. Dieses Repository wird dann noch einmal sauber in ein neues, endgültiges Repository geklont.
Zu meinem Beispiel soll ein Repo erzeugt werden, dass nur das Projekt "C" enthält.

Das von SVN erzeugte Repository in ein temporäres Repository klonen und in das Verzeichnis wechseln

 git clone git_svn/ git_svn.tmp/
 cd git_svm.tmp

Abtrennen der Projekte A und B

git filter-branch --prune-empty --index-filter 'git rm --cached --ignore-unmatch A/* B/*' HEAD

Der jetzt entstandene "Rest" wird zu einem neuen Repository. Das Zwischen-Repository kann danach gelöscht werden. Bitte beachten: Ab jetzt ist ein Update per git svn fetch nicht mehr möglich, da die remote Beziehung nicht mehr besteht.

cd ..
git clone git_svn.tmp/ new/path/to/C
rm -rf git_svn.tmp/

In diesem Zusammenhang möchte ich auf das neue schöne Syntax-Highlighting ab diesem Post aufmerksam machen, das durch das Plugin Syntax Highlighter Evolved erzeugt wird. Das klappte erst durch die Umstellung auf den neuen WordPress-Editor, mit dem ich bis heute nicht zurecht kam. Grund war, dass der Schalter für das Hinzufügen von Blocks immer ausgegraut war. Ärger! Die Lösung ist einfach wie idiotisch: In den User Einstellungen " Disable the visual editor when writing " erst deaktivieren, speichern und dann wieder anhaken und speichern. Dann funktioniert es. Das liegt vermutlich an einem etwas defekten zurückliegenden WordPress-Update.