Martin Lantzsch
Software Entwickler
22. Juli 2015

Festplatte durch Jenkins vollgelaufen

22. Juli 2015 - Geschrieben von Martin - Keine Kommentare

Heute ist die Festplatte meines Build-Servers vollgelaufen. Ich vermutete erst ich hätte die Build Artifakte meines Nightly Builds dauerhaft auf das NFS Share geworfen, allerdings stellte sich nach einem schnellen du -h heraus, dass die Log Datei von Jenkins unter /var/log/jenkins/jenkins.log 9,1 GB groß ist. Immer mit dem folgenden Eintrag:

question:      [DNSQuestion@1546425449 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN index 0, name: ]

Damit das erst mal abgestellt ist, kann man laut Jenkins Issue Tracker in der /etc/default/jenkins einen weiteren „versteckten“ Parameter an den Start von Jenkins übergeben:

JAVA_ARGS="-Dhudson.DNSMultiCast.disabled=true"

dieser wird anschließend vom init.d Script bei einem Neustart des Dienstes aufgegriffen und die Platte läuft nicht weiter voll. Spannend ist auch, dass die Log Datei ab der extremen „Wachtumsphase“ nicht mehr rotatet werden konnte.

Ich muss wohl künftig in meinem Paessler Monitoring noch das rasante Schrumpfen von freiem Festplattenplatz überwachen. Bei einem Build Server ist das allerdings nicht so geil, denn CPU, RAM, Netzwerk und Festplatte sind eigentlich ständig durch Unit- und Integrationstests unter Dauerlast und so meldet sich jede Nacht ein Sensor wenn mal wieder viele Abhängige Builds durchgeführt werden…

14. Juni 2015

Mono auf Ubuntu kompilieren

14. Juni 2015 - Geschrieben von Martin - Keine Kommentare

Wenn man Mono aus dem Git Repository kompilieren möchte – um zum Beispiel wie ich einen Bug in der MCS zu fixen -, benötigt man libtool, ansonsten kann man das tolle „autogen.sh“ Script nicht ausführen, welches das Makefile voll automatisch erzeugt.

Das Paket „libtool“ aus dem Ubuntu Repo ist allerdings nicht das richtige, da kein Binary zur PATH Variable hinzugefügt wird. Das Shellscript bricht also mit folgender Fehlermeldung ab:

Error: You must have `libtool' installed to compile Mono.
Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz
(or a newer version if it is available)

Mit dem Paket „libtool-bin“ steht ein Paket bereit, das die Binaries mitbringt und sie in der PATH Variable registriert. Danach laufen sowohl autogen.sh als auch make ohne Fehler durch :)

13. März 2015

zweitausendfünfzehn

13. März 2015 - Geschrieben von Martin - Keine Kommentare

Hallo zusammen,

wir schreiben das Jahr 2015 und der Blog, der hier vor einem guten Jahr offline gegangen ist, kann nun wieder ohne Zugangsdaten gelesen werden. Was den Content angeht, hat sich nichts geändert, alles ist beim Alten. Lediglich das Design habe ich aktualisiert. “linuxdoku-2014″ heißt das Theme – ein Design, das ich, kurz bevor der Blog offline gegangen ist, noch begonnen, doch nie fertiggestellt habe. Da ich das alte, hellblaue nicht mehr machen konnte, ziert nun dies meine Worte.

Der Grund, dass der Blog wieder auflebt, ist einfach der Hang zum Schreiben; es macht Spaß meine Gedanken niederzuschreiben und an einem Ort zu sammeln, an den ich später wiederkommen kann, um etwas zu stöbern. Auch haben sich einige Leser bei mir gemeldet und sich gewünscht, dass der Blog wieder online geht. Scheinbar ist es dann wohl auch gar nicht so doof, was ich hier schreibe, auch wenn ich mir selbst manchmal etwas komisch dabei vorkomme.

Deswegen werde ich erneut beginnen, hier Dinge aus meinem alltäglichen Technik- und Internet-Leben zu posten. Es gibt viel zu erzählen, denn 2014 war – auch wenn es hier, wie gesagt, etwas still war – ein ereignisreiches Jahr. Die erste Story wird definitiv etwas über das Verschwinden meiner Internetpräsenzen aus dem Web sein, denn es gab ein paar rechtliche Gründe, warum der Blog und meine anderen Webseiten einst so plötzlich aus dem World-Wide-Web verschwunden sind …

Viele Grüße, Martin

27. Februar 2014

Old School

27. Februar 2014 - Geschrieben von Martin - Keine Kommentare

TFS 2010
Was man nicht alles installiert um Neuentwicklungen auch für alte Programme kompatibel zu machen…

19. Februar 2014

Getter und Setter mit Netbeans generieren

19. Februar 2014 - Geschrieben von Martin - Keine Kommentare

Netbeans Getter und Setter generieren

Da ich eine Apple Tastatur an meinem Windows Rechner nutze konnte ich bisher nie die Tastenkombination ALT + EINFÜGEN nutzen um bei PHP Klassen Getter und Setter in Netbeans automatisch generieren zu lassen. Da mich das ziemlich störte habe ich nun einfach mal das Menü abgegrast und tatsächlich einen Punkt gefunden, der auf genau diese Funktion verweist:

Source -> Insert Code… anschließend Getter and Setter wählen, ein paar Properties markieren, ggf. noch ein Häkchen beim Chaining und zack sind die Methoden generiert. Nice Code!

Achja, die Stelle an der sich der Cursor befindet entscheidet wo die Methoden eingefügt werden ;-)

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.

25. Dezember 2013

Große git commits mit HTTP übertragen

25. Dezember 2013 - Geschrieben von Martin - Keine Kommentare

Counting objects: 1753, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (1605/1605), done.
efatal: The remote end hung up unexpectedly
rror: RPC failed; result=22, HTTP code = 411
Writing objects: 100% (1656/1656), 1.21 MiB | 1.12 MiB/s, done.
Total 1656 (delta 667), reused 0 (delta 0)
fatal: The remote end hung up unexpectedly
Everything up-to-date

Jeder der mit HTTP auf seinen git Server pusht kennt dieses Problem, bei großen Commits „hängt sich schnell einmal der Remote Server auf“. Um große git commits über HTTP zu übertragen muss beim Client die HTTP Post Buffer size erhöht werden. Standardmäßig liegt diese bei unter einem Megabyte, was beim commiten von Bibliotheken oder Mediendaten schnell einmal zu wenig wird:

git config http.postBuffer 524288000

Der Wert wird in bytes angegeben, hier also 500MB.

Schlägt das pushen nun wieder fehl, sollte auf Serverseite nocheinmal kontrolliert werden ob der Server überhaupt auf solche Datenmengen ausgelegt ist. Bei nginx beispielsweise fügt man hierzu in der Konfigurationsdatei des jeweiligen Servers einen Abschnitt hinzu:

http {
    client_max_body_size 500m;
}