Martin Lantzsch
Software Entwickler
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;
}

26. Oktober 2013

C# WPF AbstractWindow

26. Oktober 2013 - Geschrieben von Martin - Keine Kommentare

Normalerweise erbt die Klasse eines neu erzeugten Fensters (in diesem Fall MainWindow) direkt von System.Windows.Window. Bei meiner Anwendung wollte ich allerdings, dass das Hauptfenster von meiner Klasse ResiWriter.UI.AbstractWindow erbt.

namespace ResiWriter.UI
{
    public abstract class AbstractWindow : System.Windows.Window
    {
 
    }
}

In der MainWindow.xaml.cs Klasse habe ich dann wie gewohnt von der AbstractWindow geerbt:

namespace ResiWriter
{
    public partial class MainWindow : UI.AbstractWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

Durch den Umstand, dass MainWindow eine partial Klasse ist, muss nun auch der zweite zugehörige Klassenteil vom AbstractWindow erben. Problematisch an der Sache ist jedoch, dass der zweite Teil der Klasse beim kompilieren aus dem XAML erzeugt wird. Dementsprechend muss dieses XAML angepasst werden um dem Compiler mitzuteilen von welcher Klasse geerbt werden soll.

<src:AbstractWindow x:Class="ResiWriter.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:src="clr-namespace:ResiWriter.UI"
        Title="ResiWriter" Height="480" Width="800">
        <Grid></Grid>
</src:AbstractWindow>

Wichtig ist hier, dass der Knoten Window durch src:AbstractWindow getauscht wird. Damit der Compiler auch weiß aus welchem Namespace AbstractWindow stammt wird zusätzlich das Attribut src eingefügt: xmlns:src=“clr-namespace:ResiWriter.UI“