Martin Lantzsch
Software Entwickler
20. Januar 2014

Domain Driven Design mit PHP umsetzen

20. Januar 2014 - Geschrieben von Martin - Keine Kommentare

In der Planungsphase meiner Anwendungsplattform für Geschäftsprozesse habe ich festgestellt, dass es relativ wenig Leute gibt, die sauberes DDD mit PHP umsetzen. Wobei wir gar nicht mal zu solch „ausgefallenen“ Sprachen greifen müssen. Selbst die Paradebeispiele in Java aus Lehrbüchern sind oftmals unsauber umgesetzt.

Beim DDD sollte man eigentlich auf jegliche Abhängigkeiten zwischen Framework + Bibliotheken und der eigentlichen Domain Logik (Entities, Value Objects, Repository Interfaces, etc.) verzichten. Es sollte in keiner Domain Klasse eine Referenz beispielsweise zu einem Validator aus einem Framework enthalten sein. Zumindest meiner Auffassung nach halte ich das für unschön, da der Code so nicht mehr sauber portierbar und wiederverwendbar ist.

Was nun PHP auch im Speziellen angeht wollte ich anmerken – Doctrine Entities sind keine Domain Entities. Schließlich haben diese einen Verweis auf das ORM und obendrein sind die Entities direkt mit Implementierungsdetails verbunden. Dementsprechend gehören Doctrine Entities in die Infrastruktur.

Bei Residata handhaben wir es so, dass Doctrine unsere Domain Entities über ein vordefiniertes, auf jeden Entiy übertragbares Schema in der Infrastruktur Schicht mappt. Die Domain Entities wiederrum sind einfache PHP Klassen ohne Referenzen, lediglich mit einem PHPDoc Kommentar versehen um die Datentypen kenntlich zu machen.

Das Repostiory wird als Interface definiert und ebenso von Doctrine oder jeder anderen gegen die Schnittstellen der Plattform implementierten Persistenzschicht automatisch „befüllt“. Ausgefallene Abfragen die nicht automatisch bereitgestellt werden kann man in einem AbstractRepository oder einem Service über einen extra Builder bauen, der auch von der Persistenzschicht in eine Abfragesprache übersetzt wird.

Wie genau das alles nun in Code ausseht, das werde ich in den kommenden Tagen hier veröffentlichen. Ob die ganze Plattform unter einer Open Source Lizenz veröffentlich wird weiß ich allerdings noch nicht.

21. Oktober 2013

/bin/false und vsftpd

21. Oktober 2013 - Geschrieben von Martin - Keine Kommentare

Wenn ein User Account die Shell /bin/false zugewiesen bekommt hat er keinen Zugriff mehr auf die Shell, was sich zum Beispiel bei einem File Server anbietet, auf dem User selbst quasi keine Rechte haben.

chsh -s /bin/false USER

Nutzt man nun diesen User Account zur Authentifizierung am vsftpd so schlägt jeder Login fehl, da vsftp eine gültige Shell verlangt.

Um dies zu umgehen kann man in der Konfiguration von pam.d die Überprüfung auf eine gültige Shell exklusiv für vsftpd abschalten:

nano /etc/pam.d/vsftpd

# Standard behaviour for ftpd(8).
auth    required        pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
 
# Note: vsftpd handles anonymous logins on its own. Do not enable pam_ftp.so.
 
# Standard pam includes
@include common-account
@include common-session
@include common-auth
#auth   required        pam_shells.so

Die letzte Zeile wie hier auskommentieren und schon kann man sich mit dem Benutzer am FTP Server anmelden.

21. Juli 2013

Unscharfe Schrift im Firefox fixen

21. Juli 2013 - Geschrieben von Martin - Keine Kommentare

Da ich nun anstatt dem Datensaugenden Google Chrome wieder Firefox installiert habe hatte ich auf meiner Windows 8 Maschine das Problem, dass die Schriften allsamt unscharf waren und Bild Fragmente aufwiesen, dies konnte ich über folgenden Workaround fixen:

  1. Zu about:config navigieren
  2. Den Key gfx.content.azure.enabled suchen
  3. Den Wert von true auf false stellen

das war es schon, nun sollten die Schriften wieder stimmig sein.

15. Februar 2013

XFCE Dual Head Konfiguration

15. Februar 2013 - Geschrieben von Martin - Keine Kommentare

Da XFCE von Haus aus kein Dual Head unterstützt muss man das wohl von Hand per xrandr einrichten. Ich habe mir hierzu folgendes Script aus Ask Ubuntu geschnappt und angepasst:

!/bin/bash
 
# RESOLUTION SETTINGS
# This sets your VGA2 monitor to its best resolution.
xrandr --output VGA2 --mode 1920x1080 --rate 60
# This sets your laptop monitor to its best resolution.
xrandr --output LVDS2 --mode 1440x900--rate 60
 
# MONITOR ORDER
# Put the Laptop right, VGA2 monitor left
# xrandr --output VGA2 --left-of LVDS2
# Put the Laptop left, VGA2 monitor right
xrandr --output LVDS2 --left-of VGA2
 
# PRIMARY MONITOR
# This sets your laptop monitor as your primary monitor.
xrandr --output VGA2 --primary
# This sets your VGA2 monitor as your primary monitor.
# xrandr --output VGA2 --primary

Die Namen der Angeschlossenen Monitore kann man sich per xrandr auf der Konsole anzeigen lassen.

Mit einem Rechtsklick auf die Leiste oben am Bildschirm, dann auf „Leiste“ und auf „Leisteneinstellungen…“ kann man die Leiste auf einen anderen Monitor verschieben. Hierzu gibt es im Tab Anzeige die Option „Ausgabe“.

Leisteneinstellungen

12. Februar 2013

Python pip – Modul im Home Verzeichnis installieren

12. Februar 2013 - Geschrieben von Martin - Keine Kommentare

Bei älteren pip Versionen wird ein Python Modul wie hier z.B. „uptime“ mit folgendem Kommando in das Home Verzeichnis des aktuellen Benutzers installiert (z.B. /home/foo/.local/lib/pythonX.X/)

pip install --install-option="--user" uptime

bei neueren Versionen gibt es auch folgendes Shortcut

pip install --user uptime

11. Februar 2013

Telnet Client Session beenden

11. Februar 2013 - Geschrieben von Martin - Keine Kommentare

Zum beenden einer Telnet Session einfach STRG + * drücken.

telnet> open 127.0.0.1 1234
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
^]
telnet> q
Connection closed.

15. Dezember 2012

Windows 8 Tipps für zwei Bildschirme

15. Dezember 2012 - Geschrieben von Martin - Keine Kommentare

Da sich diese Woche meine 320GB Western Digital Festplatte in meinem ThinkPad verabschiedet hat (ok, eig schon seit ca. einem Jahr… aber die langsamen Zugriffszeiten haben mich nie gestört :D) habe ich mir nun eine SSD zugelegt. Im MediaMarkt um die Ecke gabs die Crucial M4 mit 256GB für 129€. Da konnte ich nicht nein sagen.

Nach dem Einbau der SSD habe ich dann direkt Windows 8 aus meinem Microsoft DreamSpark Portfolio installiert. Warum auch mit dem veralteten Windows 7 rumgurken? ;-)

Die Performance ist ganz akzeptabel, die Gesten Steuerung auch ganz in Ordnung. Man gewöhnt sich einfach dran. Ich will auch gar nicht über die Modern UI schimpfen, nach einem Tag Eingewöhnung finde ich es echt eine Klasse Sache. Deshalb wird sie bei mir auch dauerhaft verwendet. Mail App, Nachrichten App und Desktop sind dauerhaft am Start.

Anfangs hatte ich allerdings Probleme mit meinem Dual Head Setup, denn das Handling war irgendwie komisch. Die Apps verschwanden beim Wechsel von Programmen auf dem Desktop, etc.

Mittlerweile habe ich den Dreh raus. Und zwar habe ich ein 14″ Notebook Display zu meiner linken und rechts entweder meinen 22″ oder 19″ Monitor.

Ich gehe dann auf das Notebook Display, öffne die Modern UI über einen klick auf das Feld in der linken unteren Ecke. nun wähle ich die Mail App, verschiebe die durch klicken und ziehen am oberen Bildschirmrand nach links, bis sie angeheftet ist. Anschließend öffne ich über einen Druck auf die Windows Taste wieder die Modern UI und starte die Nachrichten App. Diese wird dann automatisch an die rechte Seite auf meinem Notebook Display angeheftet. Soweit noch kein Problem.

Klicke ich nun aber auf dem Großen Bildschirm (welcher Automatisch den Desktop anzeigt) auf das Wallpaper so verschwindet Metro auf dem anderen Bildschirm. Strange. Öffne ich Programme verschwindet Metro manchmal, ein anderes mal bleibt es da.

Nach einer Stunde herumspielen bin ich nun dahinter gekommen woran das lag. Und zwar öffnet sich bei mir der Explorer auf dem Notebook Schirm wenn ich ihn aus der Taskleiste starte. Verschiebe ich den Explorer dann auf den Großen Bildschirm und öffne wieder Modern UI, so bleibt es wenn ich wieder den Explorer starte. Denn ist auf dem Notebook Desktop keine Aktion, so verschwindet die Modern UI nicht.

Darum verschwindet auch die Modern UI wenn ich auf das Wallpaper klicke, denn über dem Wallpaper befindet sich quasi ein transparentes Explorer Fenster, und da der Explorer auf dem Notebook Bildschirm starten würde verschwindet die Modern UI. Muss man erst mal draufkommen ;-)

Ergo. Alle Fenster auf die Bildschirme schieben, auf denen der Explorer später verwendet werden soll, der unbenutzte Monitor kann dann dauerhaft Apps im Metro Stil beherbergen.