Lokaler Mailserver mit MailCatcher unter Windows

Wer unter Windows Anwendungen entwickelt, die E-Mails versenden sollten, sieht sich schnell vor die Herausforderungen gestellt einen lokalen Mailserver zu Testzwecken aufzusetzen. Der Aufwand dafür ist immens. Hier kommt MailCatcher ins Spiel! MailCatcher ist ein Ruby gem, das einen einfachen SMTP Server und ein Webinterface zur Verfügung stellt.

Screen shot 2011-06-23 at 11.39.03 PM

Eine lokale Ruby Installation inkl. DevKit vorausgesetzt, lässt sich Mailcatcher wie auf der Website beschrieben installieren.

gem install mailcatcher

Nach erfolgreicher Installation kann Mailcatcher durch den Befehl mailcatcher gestartet werden. Als mögliche Parameter können u.a IP-Adresse und Port für den SMTP-Server und das Webinterface angegeben werden. Eine genau Übersicht der Parameter liefert

mailcatcher --help

Ohne weitere Parameter gestartet kann das Webinterface über die URL http://localhost:1080/ erreicht werden.
Der SMTP-Server lauscht auf dem Port 1025, SSL/TLS-Verschlüsselung werden derzeit nicht unterstützt, ebenso ist die Angabe von Benutzernamen und Passwort nicht nötig.

Laravel Database Seeding mit Faker

Das Problem dürfte vielen Entwicklern bekannt sein: Woher bekomme ich Testdaten während der Entwicklung einer Anwendung. Die manuelle Eingabe ist mühsam und kostet viel Zeit und während die Datenbank sich im Entwicklungsprozess verändert, müssen diese Daten immer wieder angepasst oder ergänzt werden.
Laravel bietet mit dem Database Seeding eine einfache Möglichkeit, Datenbaktabellen mit Testdaten zu füllen. Allerdings müssen auch diese zunächst manuell als Array erfasst werden.

Um den Prozess der manuellen Dateneingabe zu automatisieren und auch umfangreichere Datenmengen im Entwicklungsprozess zu verwenden, hat sich im PHP-Umfeld die Bibliothek Faker etabliert. Mit Hilfe von Faker können zufällige Testdaten für einen großen Pool von Datenklassen wie z.B. Vorname, Nachname, Anschrift, E-Mailadressen, Blindtexte bis hin zu zufälligen Bildern generiert werden. Über die Provider steht sogar eine Schnittstelle zu Verfügung, um Faker um eigene Inhaltstypen zu erweitern. Ein herausragendes Merkmal ist zudem die Lokalisierung der Testdaten.

Um Faker in das Laravel-Projekt einzubinden, muss die composer.json um die Zeile "fzaninotto/faker": "1.5.*@dev" ergänzt werden, um die neue Abhängigkeit zu definieren.

"require": {
		"laravel/framework": "4.2.*",
		"fzaninotto/faker": "1.5.*@dev"
	}

Alternative ließe sich die composer.json auch über den Befehl composer require fzaninotto/faker um den Eintrag ergänzen.

Mit dem Kommando composer update wird Faker dann geladen.


<?php

class UserSeeder extends Seeder {

	public function run(){
		// Faker mit deutscher Lokalisierung über Factory initialisieren
		$faker = Faker\Factory::create('de:DE');
		$faker->seed(1234); // Zufallsgenerator initialisieren
		// Wir laden dynamisch einen Provide rhinzu, um Passwörter zu generieren 
		$faker->addProvider(new Faker\Provider\Internet($faker));
		$users = array();
		for ($i=0; $i < 10000; $i++) { // Wir generieren 10.000 Testdatensätze

			$firstname = $faker->firstName; //Vorname über Generator
			$surname = $faker->lastName; // Nachname über Generator
			$initials = $firstname[0] . $surname[0]; 
			// Einen Datensatz für die Tabelle User definieren wir als Array
			// und erzeugen dieses dynamisch über die Faker-Generatoren 
			$user = array(
			'email' => $faker->email,
			'initial'=> $initials,
			'firstname' => $firstname,
			'surname' => $surname,
			'username' => $faker->userName,
			'password' => Hash::make($faker->password()),
			'bio'=> $faker->text(255),
			'confirmation' => str_random(20),
			'confirmed'=> true,
			'registration_date'=> $faker->dateTimeThisDecade($max = 'now')

		);
		DB::table('user')->insert(array($user));
		}
	}
}

Mit dem Befehl php artisan db:seed wird der UserSeeder ausgeführt und erzeugt 10.000 sinvolle Testdatensätze.

Windows Server 2012 R2 Hyper-V Arbeitspeicher 100% belegt

Innerhalb einer mittels Hyper-V virtualisierten Maschine mit installierten Windows Server 2012 R2 kam es zu erheblichen Performanceeinbrüchen. Grund hierfür war ein aus dem Ruder gelaufenes Cachingverhalten bei I/O-Operationen. Mithilfe der Leistungsindikatoren ließ sich der Grund des Problems kaum ermitteln. Abhilfe schaffte hier RAMMap von Sysinternals. Neben den durch Prozesse und Kernel sowie Mappings allokierten Arbeitsspeicher zeigt RAMMap ebenfalls den durch Treiber reservierten Teil des Arbeitsspeichers (Driver locked) an. Der bei virtuellen Maschinen oft verwendete Arbeitsspeicher fällt unter die Kategorie.

rammap

Eine gute Zusammenfassung I/O-Caching und der Belegung des Arbeitsspeichers bei Hyper-V Virtaualisierung findet sich in diesem KB-Artikel.

Standard Look and Feel für DevExpress

DevExpress bietet fantastische Möglichkeiten, um Steuerelemente an einen bestimmten visuellen Stil (Skin) anzupassen, neben vordefinierten Skins besteht auch die Möglichkeit eigene Skins zu gestalten.
Um nicht jeden Steuerelemente einzelnen einen Stil zuweisen zu müssen, lässt sich auch ein Skin für die Applikation global als Standard definieren. Unter VB.Net geht das am einfachsten im Konstruktor der Form.

Public Class MainForm

    Sub New()

        DevExpress.LookAndFeel.UserLookAndFeel.Default.SkinName = "Office 2010 Silver" 
        ' This call is required by the Windows Form Designer.
        InitializeComponent()
    End Sub

Wenn Windows DVD-/CD-Laufwerke nicht mehr erkennt

Werden CD- oder DVD-Laufwerke unter Windows XP, Vista oder Windows 7 im Explorer nicht mehr angezeigt, hilft es sich über den Gerätemanager einen genaueren Überblick des Problems zu verschaffen. Erscheint das Laufwerk im Gerätemanager mit einem gelben Ausrufezeichen versehen und wird in den Eigenschaften des Geräts der Fehler Code 19 ausgewiesen, deutet das auf eine nicht vollständig bei der Deinstallation entfernte Brennsoftware wie z.B. Nero hin.

Dieses Hardwaregerät kann nicht gestartet werden, da dessen Konfigurationsinformationen (in der Registrierung) unvollständig oder beschädigt sind. (Code 19)

Damit die Laufwerke wieder im Explorer erscheinen, müssen die von der Software in der Registrierung gesetzten Werte manuelle entfernt werden.

  1. Öffne dazu das Programm regedit (Start-> Ausführen -> regedit).
  2. Expandiere den Schlüssel HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E965-E325-11CE-BFC1-08002BE10318}
  3. .

  4. Lösche die Parameter UpperFilter und – sofern vorhanden – LowerFilter
  5. Starte Windows neu.

Auf das DVD oder CD-Laufwerk sollte nun wieder zugegriffen werden können.

Wenn der Schreibtisch Desktop heißt

Wenn plötzlich der Schreibtisch unter Mac OS X Desktop oder Dokumente Documents heißen, liegt es wahrscheinlich daran, dass die versteckte Datei .localized in jeweiligen Ordner gelöscht wurden. Um das Problem zu lösen genügt es die Terminal.app zu starten, z.B. mit cd Desktop in den entsprechenden Ordner zu wechseln und mittels

touch .localized

die Datei wieder anzulegen. Im Finder sollte der Ordner nun wieder in der konfigurierten Landessprache angezeigt werden.

PHP-Fehlermeldungen mit .htaccess steuern

Grundsätzlich kann es zu einem Sicherheitsrisiko werden PHP-Fehlermeldungen auf der Website anzeigen zu lassen, da mit Rückschlüssen auf den Code, die Verzeichnisstruktur oder Datenbankstruktur der Fehler ausgenutzt werden könnte.
Mit folgenden Einträgen in der .htaccess lassen sich die PHP-Fehlermeldungen unterdrücken.

php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
php_value docref_root 0
php_value docref_ext 0

Sinnvoll ist es hingegen die Fehler in eine Logdatei zu schreiben:

php_flag  log_errors on
php_value error_log  /path/to/website/PHP_errors.log

Sinnvoll ist es zudem den Zugriff über den Browser auf die Logdatei zu verbieten:


 Order allow,deny
 Deny from all
 Satisfy All

Alle E-Mails in der Postfix Mailqueue löschen

Durch außerordentliche Ereignisse, wie überlaufende temporäre Verzeichnisse, falsche Konfigurationen oder Serverabstürze kann es geschehen, dass Postfix E-Mail nicht aus den Queues löscht. Mit dem Postfixtool postsuper kann man das Löschen der Warteschlangen erzwingen.

postsuper -d ALL

Ein Neustart oder Reload von Postfix ist danach nicht erforderlich.

Sollte postsuper den Dienst verweigern, lassen sich die Queues auch manuell löschen.

cd /var/spool/postfix && rm -r active/* deferred/* defer/*