Martin Lantzsch
Software Entwickler
23. Januar 2013

Die DLL „SQLite.Interop.dll“: Das angegebene Modul wurde nicht gefunden.

23. Januar 2013 - Geschrieben von Martin - Keine Kommentare

Ich habe eine C# Projekt Mappe mit einer WPF Anwendung und einer Konsolen Anwendung. Die WPF Anwendung besitzt alle Klassen, DLLs, etc. Der Konsolen Anwendung habe ich anschließend abhängig von der WPF Anwendung gemacht und die Build Reihenfolge so gestellt, dass die Konsolenanwendung bei erstellen der Projekt Mappe als zweites kompiliert wird.

Beim Debuggen trat dann immer folgender Fehler auf. Allerdings nur beim Debuggen, beim Ausführen der .exe aus dem /bin/Debug Ordner des Projektes gab es keine Probleme.
Die DLL "SQLite.Interop.dll": Das angegebene Modul wurde nicht gefunden.

Ich dachte erst an nicht aufgelöste Abhängigkeiten, also habe ich mir mit dem „Dependency Walker“ die DLL genauer angesehen:
Dependency Walker
Error: Modules with different CPU types were found.
CPU Type, das Problem kommt mir bekannt vor. Also habe ich mein Konsolen Projekt in den Projekteinstellungen von „Zielplattform“ – „Any CPU“ auf „x86“ gestellt und hey, nun startet es. Warum weiß ich leider nicht, ich kann es mir nur so erklären, das er beim kompilieren „Any CPU“ nicht auf die in x86 und x64 DLLs in dem GUI Projekt mappt. Denn das GUI Projekt startet mit „Any CPU“, den selben DLLs und der selben Klasse, die auf die DLLs zugreift.

10. Januar 2013

ResiOS lebt

10. Januar 2013 - Geschrieben von Martin - 2 Kommentare

ResiOS lebt
Eigenen x86 Kernel mit C und Assembler schreiben. Check.

8. Januar 2013

Umzug der resi:DATA Infrastruktur

8. Januar 2013 - Geschrieben von Martin - 4 Kommentare

Da seit dem letzten Post über die Infrastruktur einiges an Webspaces und Servern dazu gekommen ist, muss nun alles mal neu formiert werden.

Aktuell arbeite ich mit 2 Webspaces für Webseiten und Mail Hosting, einen Webspace für Backups, zwei Linux vServer für Webapplikationen, Webservices und Git Repositories und einen Windows vServer für ein C# Projekt, dass eine Serverapplikation und einen Team Foundation Server erfordert.

Das ganze soll im nächsten halben Jahr auf zwei vServer und einen Webspace zusammengezogen werden. Hierzu werden zwei Webspaces gekündigt und alle Domains auf einen großen Webspace Umgezogen, der auch gleichzeitig die Mail Struktur beherbergen soll (dann muss ich keine Mail Server mehr administrieren, was sehr entspannend ist :)). Die Linux vServer werden aus dem Momentanen Dienste Mix gelöst und einer wird für Lighttpd + PHP und der andere für MySQL, NodeJS und Git zuständig sein. Der Windows Server verschwindet ganz, da die Applikation mitsamt des Team Foundation Servers in ein Cloud Hosting migriert wird.

Im nächsten Schritt, der nicht so Zeitkritisch ist, werden alle Webseiten und Applikationen die derzeitig noch auf PHP Basis laufen auf NodeJS umgezogen. Ist dieser Schritt abgeschlossen wird vServer Nr 1. als dedizierter MySQL Server und vServer 2. als dedizierter NodeJS Server eingesetzt.

Soweit das vorhaben. Nun muss erst einmal eine Bestandsaufnahme bezüglich Domains, Apps, etc. gemacht werden. Anschließend heißt es Verträge kündigen, neue Server mieten, etc.

6. Januar 2013

NodeJS MySQL pool

6. Januar 2013 - Geschrieben von Martin - 2 Kommentare

Momentan arbeite ich daran Resigame 2.0 auf NodeJS Basis zu entwickeln. Da abzusehen ist, dass auf Resigame wieder sehr hoher Traffic entstehen wird, wird das ganze Performance optimiert entwickelt. Cluster, SQL Pooling, etc.

Gestern habe ich mir ein Modul für den MySQL Pool geschrieben, denn bei vielen NodeJS Applikationen wird entweder für jeden HTTP Request eine MySQL Verbindung verwendet oder eine für alle.

Das Problem bei einer Verbindung pro HTTP Request ist, dass die Verbindungen bei hohen Nutzerzahlen sehr schnell ausgehen (MySQL max connections) und man ggf. ein paar Sekunden auf die nächste freie Verbindung warten muss.

Bei der Methode mit einer Verbindung, die für alle Nutzer verwendet wird, ist natürlich die Performance sehr bescheiden. Aufwändige Querys können die ganze Applikation stark ausbremsen.

Also habe ich einen MySQL Pool entwickelt, dieser wird beim starten der Anwendung erzeugt. Man übergibt die „poolsize“ – also die Anzahl der Verbindungen die hergestellt werden sollen (diese muss natürlich unter der maximalen Anzahl an Verbindungen, die der MySQL Server zulässt liegen) und die Zugangsdaten zum Datenbankserver. z.B.

var pool = new require('/helpers/pool')({
	poolsize: 50,
	mysql: {
		host: 'localhost',
		user: 'root',
		password: 'root',
		database: 'resigame'
	}
});

Querys können nun direkt an den Pool gesendet werden:

pool.query('SELECT * FROM users WHERE userID = ?', [userID], function(err, results) {
	// whatever
});

Der Aufruf fügt den Query zur Warteschlange hinzu und sieht nach ob gerade eine Verbindung frei ist. Wenn ja wird diese gleich verwendet, ansonsten dauert es bis wieder eine Verbindung frei wird. (Ergo, je mehr Benutzer die gleichzeitig auf die Datenbank zugreifen, desto höher die poolsize –> mehr Performance).

Hier der Quellcode, ich werde ihn die Tage noch ein wenig erweitern und dann auf GitHub stellen.

/** 
 * MySQL pool to hold multiple connections to the database server
 *
 * @author	Martin Lantzsch <martin@linux-doku.de>
 */
 
var mysql = require('mysql');
module.exports = function(config) {
	this.freeConnections = [];
	this.queryQueue = [];
 
	this.createConnection = function(details) {
		var connection = mysql.createConnection(details);
		connection.connect();
		connection.number = this.freeConnections.length;
		this.freeConnections.push(connection);
	};
 
	this.query = function(command, params, callback) {
		if(typeof(params) == 'function') {
			callback = params;
			params = [];
		}
 
		this.queryQueue.push({
			command: command,
			params: params,
			callback: callback
		});
		this.work();
	};
 
	this.work = function() {
		var self = this;
		if(self.queryQueue.length > 0) {
			if(self.freeConnections.length > 0) {
				var query = self.queryQueue.shift();
				var connection = self.freeConnections.shift();
				connection.query(query.command, query.params, function(err, results) {
					if(err) throw err;
					query.callback(err, results);
					self.freeConnections.push(connection);
					if(self.queryQueue.length > 0)
						self.work();
				});
			}
		}
	};
 
	for(i = 0; i < config.poolsize; i++) {
		this.createConnection(config.mysql);
	}
 
	return this;
}

29. Dezember 2012

Skoda Fabia Lautsprecher fixen

29. Dezember 2012 - Geschrieben von Martin - Ein Kommentar

Der Lautsprecher in der rechten Tür meines Skoda Fabias hat die ganze letzte Zeit so komisch gescheppert, dass ich gestern mal die Türverkleidung abmontiert und ihn mir mal angesehen habe.

Im Vorfeld habe ich viel davon gehört, dass die Tür des Fabia nicht so gut gedämmt sein soll, doch ich stellte fest, dass die Verkleidung eigentlich relativ gut sitzt.

Also habe ich mit einer Dubstep CD halt mal einen kleinen Test gemacht und relativ schnell festgestellt, dass die Membran des Lautsprechers besonders bei tiefen Tönen zu flattern beginnt.

Habe ich mit meinem Finger oben auf die Membran gedrückt, stoppte das Flattern. Grund war, dass sie oben einem kleinen Riss hatte, scheinbar ist sie angeklebt.

image

Also habe ich mit Panzertape die Membran vorerst geklebt. Mit kleinen Stückchen außenrum. Nun scheppert und flattert nichts mehr. Sollte es wieder losgehen, gibts einen neuen Lautsprecher.

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.

10. Dezember 2012

Winter auf dem Lande

10. Dezember 2012 - Geschrieben von Martin - Keine Kommentare

image

So sieht mein täglicher Weg zur Arbeit aus – eine winterliche Schneelandschaft.