Webprojekt: Freiraum – Nächste Kalendertermine anzeigen

Screenshot von Freiraum: Zeigt die nächsten Termine eines Kalenders an

Um die spontane Nutzung der Gemeinschaftsräume unserer Siedlung zu erleichtern, haben wir in der IT-Gruppe ein minimalistisches Tool entwickelt: Freiraum.

Es zeigt den aktuellen Status (Besetzt/Demnächst besetzt/Frei) eines Raumes an, indem es den öffentlichen iCal-Feed des privaten Reservationssystemes ausliest und die nächsten Termine anzeigt.

Den Quellcode gibt es auf GitHub: github.com/oberfeld/freiraum

Aus Datensparsamkeit ist absichtlich kein Link zum effektiven Reservationssystem oder zu einzelnen Räumen vorhanden.

MIT-lizenziert. Simples PHP 8. Keine Authentifizierung, keine Datenbank, keine Benutzerverwaltung, kein Errorhandling. Erster Versuch mit Tailwind CSS.

PHP-Package: temporal-shelf

Das dritte Packet aus dem aktuellen Refactoring von api.existenz.ch ist temporal-shelf.

Die kleine Utility-Klasse erlaubt es Dateien in ein Archiv zu kopieren, in einer Jahr/Monat/Tag-Struktur abgelegt und versehen mit einem Zeitstempel.

Beispiel: daten.txt wird kopiert nach /archiv/2020/11/09/1604953664_daten.txt.

Spannendes Detail: Mit dem Package vfsStream kann ein virtuelles Dateisystem im Speicher erstellt werden, in welchem bequem und ohne Seiteneffekt die Unittests ablaufen.

PHP-Package: parse-swissmetnet

Im Rahmen eines Code-Refactoring (auch Refaktorisierung, Refaktorierung oder Restrukturierung) habe ich nach Jahrzehnten von PHP-Coden mein erstes Composer-Package geschrieben und publiziert: cstuder/parse-swissmetnet.

Es dekodiert Daten und Metadaten aus dem automatischen Wettermessenetz der MeteoSchweiz, welche auf dem Opendata.swiss-Portal publiziert sind.

Besonders Freude habe ich an den neuen GitHub-Actions welche die beiliegenden Unittests bei jedem Push automatisch durchführen.

PHP-Buildsystem mit Fehlererkennung für Sublime Text 2 und 3

Im Texteditor Sublime Text können PHP-Dateien folgendermassen direkt ausgeführt werden: Über das Menu Tools – Build System – New Build System… den folgenden Inhalt in eine Datei names PHP.sublime-build speichern.

Unter Linux/Mac OS X:

{
    "cmd": ["php", "$file"],
    "file_regex": ".* in (.*\\.php) on line ([0-9]*)",
    "selector": "source.php",
}

Unter Windows (Den Pfad zum PHP-Interpreter anpasssen):

{
    "cmd": ["c:\\wamp\\bin\\php\\php5.4.12\\PHP.exe", "$file"],
    "file_regex": ".* in (.*\\.php) on line ([0-9]*)",
    "selector": "source.php",
}

Danach führt Sublime Text mit CTRL-B eine PHP-Datei aus und springt mit F4 gegebenenfalls von Fehler zu Fehler.

Debugging

Zum Debuggen gibt es das SublimeTextXDebug-Package. Allerdings habe ich es noch nicht geschafft, dieses erfolgreich zu konfigurieren. Bis es soweit ist, bleibt Eclipse PDT die Entwicklungsumgebung meiner Wahl.

Campus Bern: Symfony 2

CampusAm kommenden Dienstag (23. Oktober 2012, 1900) findet der Campus zum Thema Symfony 2 bei Liip am Kornhausplatz 14 statt.

Wir nehmen das PHP-Framework Symfony2 und Symfony2 Content Management (CMF) unter die Lupe – etwas Theorie und viel Praxis. Vortrag von Tobias Kluge und David Buchmann

Die Veranstaltung ist für alle Interessierte offen und gratis. Anfahrtsinformationen und weiteres wie immer im Campus Wiki.

Freiwillige Anmeldung auf techup.ch.

.NET-Bibliotheken aus PHP aufrufen

Bei meiner Arbeit standen wir kürzlich vor der Aufgabe, eine Windows-.NET-DLL-Funktion aus PHP anzusprechen. Interessanterweise ist die COM-Unterstützung bei allen geläufigen PHP-Versionen für Windows seit Version 4 bereits eingebaut. Auch eine .NET-Unterstützung ist vorgesehen, jedoch schlecht dokumentiert. Dieser Beitrag soll den aktuellen Stand unserer Bemühungen dokumentieren.

Voraussetzung
Nur der Zend Server Community Edition bringt im Moment ein PHP 5.3.5 mit aktivierter .NET-Unterstüzung mit: Die Extension com_dotnet ist enabled.
Weder XAMPP noch WAMP haben diese von sich aus einkompiliert.

Anforderungen an die DLL
Um eine .NET-DLL mit dieser Extension ansprechen zu können, muss sie folgende Anforderungen erfüllen:

  • Die .NET-Frameworkversion darf maximal 3.5 sein. .NET 4.0 funktioniert aktuell nicht.
  • Die DLL muss streng benannt und signiert sein (strongly named & signed)
  • Die Funktionen der DLL müssen COM accessible sein (Kann in den Assembly informations aktiviert werden.)
  • Die DLL muss sich im Global Assembly Cache/GAC befinden. Mit dem Kommandozeilenbefehl gacutil /i NAME.dll wird sie dort hin befördert.

Der letzte Punkt ist wahrscheinlich auch der Grund, warum PHP keine 4.0-DLLs schluckt: Im Gegensatz zum alten GAC unter c:/Windows/assembly befindet sich der neue GAC unter c:/Windows/Microsoft.NET/assembly. Je nach Frameworkversion landet die DLL automatisch im richtigen GAC, wird aber von PHP nur im ersteren gesucht.

Verwendung
Um eine .NET-Klasse aus einer DLL zu instanzieren, benötigt man den vollen Namen der Assembly und den kompletten Klassennamen. Ein Tool wie ILSpy hilft dabei, diesen herauszufinden und wie folgt zu verwenden:

$obj = new DOTNET('Voller.Assembly.Name, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a8425bc35256e463', 'Voller.Assembly.Name.Klassenname');
 
echo $obj->MeineMethode();

Da mit dieser Extension immer eine Klasse instanziert wird, sind dementsprechend nur Klassenmethoden aufrufbar. Statische Klassen und Methoden funktionieren nicht und erzeugen nur kryptische Fehlermeldungen.

Ich hoffe, mit diesem Artikel anderen Benutzern dieser exotischen Kombination von Systemen etwas weitergeholfen zu haben. Kommentare und Anmerkungen sind herzlich willkommen.

Xdebug unter OS X Lion installieren

Ich brachte unter dem neuen Mac OS X Lion das Programm phpize nicht zum laufen und konnte deshalb meine Lieblings-PHP-Extension Xdebug nach dem Update auf Lion nicht frisch installieren. Glücklicherweise fand ich im Verzeichnis /usr/lib/php/extensions/no-debug-non-zts-20090626 noch die Datei xdebug.so von Snow Leopard.

Um diese Extension zu aktivieren, erstellt man mit Rootrechten im Verzeichnis /etc eine neue Datei php.ini und schreibt folgendes hinein:


zend_extension = /usr/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so
xdebug.remote_enable = On

; Und wenn wir schon mal hier sind...
error_reporting = E_ALL | E_STRICT
date.timezone = Europe/Zurich

Nicht vergessen, den Webserver danach neu zu starten.

Wochenendprojekt eskaliert

Es regnet. Die Wohnung sieht akzeptabel aus. Und ich habe eine neue Idee für eine Webseite. Und das eskaliert dann folgendermassen:

  • Idee!
  • Hmm, wenn ich alles so machen will, dann könnte ich gleich mal Backbone.js ausprobieren.
  • Hmm, ist kompliziert. Egal, ich fange einfach mal an.
  • Hmm, eine neue Version von Eclipse PDT ist erschienen, ich installier erst mal.
  • Hmm, eine neue Version vom Framework ist erschienen, ich aktualisiere mal.
  • Hmm, ich habe noch nicht genug Erfahrung damit, um mein NoSQL-Modul für MySQL zu bauen, vielleicht fange ich mal mit einem einfacheren Projekt an.
  • Hmm, dafür könnte ich meine HTML-Tabellenbibliothek benutzen, wenn sie fertig wäre.
  • Hmm, zuerst mal eine Git-Einführung lesen, ich erinnere mich an gar nichts mehr.
  • Was denn, der Tag ist schon vorbei?