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.

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.

SVN to GIT (Part I)

Late to the party, ich weiß. Aber wenigstens bin ich irgendwann doch noch angekommen. Beflügelt durch eine wirklich gute Schulung die ich bei einem Kunden genießen durfte habe ich beschlossen, mein ziemlich umfangreiches SVN Repository nach git zu migrieren. Dabei kann man gleich aufräumen und “sinnvolle” Repositories erzeugen von Dingen, die zusammengehören. Ich habe mein SVN allein verwendet und auch fast keine Branches erzeugt, so dass die Migration ziemlich leicht ist. Für jeden SVN Benutzer legt man ein Eintrag in einer Mapping-Datei an, damit die in git übliche Benutzername / Email Konstruktion zugeordnet werden kann. Beispiel:
hmueller = Hans Müller <hans@mueller.de>
Dann erzeugt man z.B. in einem Verzeichnis git_svn ein SVN Repo mit folgendem Kommando
git svn clone svn://lager/project --no-metadata -A author.txt git_svn/
Auf den Parameter --stdlayout habe ich verzichtet, da mein SVN Repo keine trunk/branches Struktur hat. Wenn “git svn” nicht funktioniert ist es wahrscheinlich nicht installiert. Auf einem Raspberry Pi ist das per default so. Man kann dann das Paket mit sudo apt-get install git-svn nachinstallieren.
Nicht verzagen, das dauert (auf dem Raspberry Pi) je nach Repository-Größe ewig. Das Ergebnis ist ein Git-Repo, in der die komplette Versionshistorie enthalten ist. Und das Beste: Die Verknüpfung zu SVN ist nach wir vor erhalten. Kommen noch Änderungen in SVN an, können diese mit einem
git svn fetch nachgezogen werden, ohne das man das Repository erneut klonen muss. Sehr praktisch! Jetzt gibt es die Situation, dass ggf. der HEAD Pointer irgendwo hinzeigt bzw. die Git Revisions zu den SVN Revisions gemappt werden. Das passiert immer nach einem fetch. Mit
git update-ref refs/heads/master refs/remotes/git-svn
kann man eine Aktualisierung durchführen.

Schneebälle

Ich habe vor einiger Zeit einmal an einem “Lass uns ein cooles Blockchain-Projekt starten” Meeting teilgenommen. Das Ganze ist aufgrund der Inaktivität des Organisators gleich wieder im Sande verlaufen. Die Technologie dazu habe ich mir aber angeschaut, vor allem die Libraries, auf der das aktuelle Bitcoin Mining basiert. Mein Fazit damals: Komplizierte Sache. Also nicht die Technologie an sich, sondern der Aufbau eines greifbaren Geschäftsmodells auf Basis dessen. Nachdem heute die Sau wieder einmal durch das Dorf galoppierte, bin ich über einen kurzen Umweg an diesen sehr schönen Vortrag geraten, der euch in kürzester Zeit die Problematik näher bringt. Hervorragende Präsentation, schaut’s euch mal an.