<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Simlau.net Blog</title>
	<atom:link href="http://blog.simlau.net/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.simlau.net</link>
	<description>Mein Blog über Linux, Coding und Web Development.</description>
	<lastBuildDate>Mon, 09 Aug 2010 21:29:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Zend Server Community Edition</title>
		<link>http://blog.simlau.net/zend-server-ce.html</link>
		<comments>http://blog.simlau.net/zend-server-ce.html#comments</comments>
		<pubDate>Wed, 19 May 2010 08:00:02 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Server]]></category>

		<guid isPermaLink="false">http://blog.simlau.net/?p=2028</guid>
		<description><![CDATA[Der Zend Server CE ist komplettes Webserver Paket mit PHP 5.3.2, etwa vergleichbar mit dem Projekt XAMPP. Der Vorteil liegt hier daran, dass bereits fast alle Komponenten von Zend mitgeliefert werden. So ist Out of the Box bereits Zend Data Cache, der Zend Debugger und Zend Optimizer+ installiert. Netterweise ist sogar das Zend Framework schon [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.simlau.net/wp-files/zendserver1-300x193.png" alt="" title="Zend Server" width="300" height="193" class="alignright size-medium wp-image-2264" />Der <a href="http://www.zend.com/de/products/server-ce/">Zend Server CE</a> ist komplettes Webserver Paket mit PHP 5.3.2, etwa vergleichbar mit dem Projekt <a href="http://www.apachefriends.org/de/xampp.html">XAMPP</a>.</p>
<p>Der Vorteil liegt hier daran, dass bereits fast alle Komponenten von Zend mitgeliefert werden. So ist Out of the Box bereits Zend Data Cache, der Zend Debugger und Zend Optimizer+ installiert. Netterweise ist sogar das Zend Framework schon mit an Board.</p>
<p>Der Zend Server ist vorallem in Zusammenarbeit mit Zend Studio ein ziemlich mächtiges Entwicklerwerkzeug. Aber auch sonst bekommt man eine deutlich schönere Vorkonfiguration als bei XAMPP.</p>
<p>Der Zend Server arbeitet dabei mit dem Apache2 zusammen &#8211; unter Windows besteht auch die Möglichkeit ihn mit einem IIS laufen zu lassen.</p>
<p>Neben diesen Features liefert der Zend Server noch ein webbasiertes Konfigurationsinterface an. Dort lassen sich etwa PHP Erweiterungen per Klick aktivieren/deaktivieren, Direktiven in der php.ini setzen und die Zend Komponenten laden oder entladen.</p>
<p>Sehr schön ist dort auch der Logging Bereich, in dem man seine PHP Applikationen auf Errors und Warnings überwachen kann. Hier sind die Funktionen in der Community Edition gegenüber dem großen (kostenpflichtigen) Bruder recht beschränkt. Als Entwicklungsumgebung und für kleinere Projekte reicht die Community Edition aber durchaus aus.</p>
<p><strong>Installation des Zend Servers CE</strong><br />
Für Debian werden bereits fertige Pakete von der Firma Zend selbst angeboten. Zur Installation führt man folgende hier Befehle aus:</p>
<pre class="brush: plain;">wget http://repos.zend.com/deb/zend.key -O- | apt-key add -
deb http://repos.zend.com/zend-server/deb server non-free &gt;&gt; /etc/apt/sources.list
apt-get update
apt-get install zend-server-ce-php-5.3</pre>
<p>Für Windows, Mac und andere Linux Distributionen kann man den Server <a href="http://www.zend.com/de/products/server-ce/downloads">hier</a> herunterladen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simlau.net/zend-server-ce.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DHL-Tracking API mit PHP abrufen</title>
		<link>http://blog.simlau.net/dhl-tracking-api-php.html</link>
		<comments>http://blog.simlau.net/dhl-tracking-api-php.html#comments</comments>
		<pubDate>Sat, 15 May 2010 17:00:30 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://blog.simlau.net/?p=1977</guid>
		<description><![CDATA[Lange habe ich schon danach gesucht und endlich bin ich doch mal fündig geworden &#8211; die Tracking-API von DHL. Tatsächlich gibt es im Netz nahezu keine offizielle Dokumentation dieser mysteriösen API. Die public API dient zum Abrufen des Status eines Pakets, mit der privaten API können Firmen sich z. B. Paketaufkleber etc. ausdrucken lassen. Die [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.simlau.net/wp-files/package.png"><img src="http://blog.simlau.net/wp-files/package.png" alt="" title="DHL Tracking API" width="120" height="120" class="alignright size-full wp-image-2130" /></a>Lange habe ich schon danach gesucht und endlich bin ich doch mal fündig geworden &#8211; die Tracking-API von DHL. Tatsächlich gibt es im Netz nahezu keine offizielle Dokumentation dieser mysteriösen API. Die public API dient zum Abrufen des Status eines Pakets, mit der privaten API können Firmen sich z. B. Paketaufkleber etc. ausdrucken lassen.</p>
<p>Die Public API reicht allerdings für die meisten Zwecke vollkommen, mit ihr kann man z. B. per Script die Sendung eines Pakets überwachen. Hier meine kleine, beispielhafte-Funktion:</p>
<pre class="brush: php;">function dhl_tracking($trackingnumber)
{
	$data  = '&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot; ?&gt;';
	$data .= '&lt;data appname=&quot;nol-public&quot; password=&quot;anfang&quot; request=&quot;get-status-for-public-user&quot; language-code=&quot;de&quot;&gt;';
	$data .= '  &lt;data piece-code=&quot;'.$trackingnumber.'&quot;&gt;&lt;/data&gt;';
	$data .= '&lt;/data&gt;';

	// URL bauen und File hohlen
	$xml = simplexml_load_file(sprintf(
		'http://nolp.dhl.de/nextt-online-public/direct/nexttjlibpublicservlet?xml=%s', $data
	));

	// FALSE, wenn Syntax oder HTTP Error
	if ($xml === false) return false;

	// Wandelt das SimpleXML Objekt in ein Array um
	foreach ($xml-&gt;data-&gt;data-&gt;attributes() as $key =&gt; $value) {
		$return[$key] = (string) $value;
	}
	return $return;
}

// Aufruf der Funktion
print_r(dhl_tracking($tracking_number));
</pre>
<p>Sollte die Funktion false zurück liefern gab es einen Problem mit dem Tomcat Server und der Anfrage (etwa falscher Syntax, fehlerhaftes XML). Wenn piece-status einen anderen Wert als 0 enthält liegt ein Problem mit dem Datensatz selbst vor (z. B. keine Daten vorhanden).</p>
<p><span id="more-1977"></span><br />
Als Ergebnis erhält man dann ein Array, etwa mit folgenden Werten (hier etwas gekürzt, tatsächlich sind es einiges mehr an Infos):</p>
<pre class="brush: plain;">Array
(
    [status] =&gt; Die Sendung wurde erfolgreich zugestellt.
    [recipient-id-text] =&gt; Nachbar
    [product-name] =&gt; DHL PAKET
    [pan-recipient-name] =&gt; SIMON LAUGER
)</pre>
<p>Insbesondere für Shop-Betreiber, die ihren Kunden die Möglichkeit geben wollen in ihrem Shop den Status der Lieferung anzusehen sollte das recht interessant sein. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simlau.net/dhl-tracking-api-php.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ZendFramework: Basic/Digest-Auth über Zend_Db</title>
		<link>http://blog.simlau.net/zendframework-http-auth.html</link>
		<comments>http://blog.simlau.net/zendframework-http-auth.html#comments</comments>
		<pubDate>Sat, 01 May 2010 12:30:36 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.simlau.net/?p=1983</guid>
		<description><![CDATA[Möchte mit dem ZendFramework eine HTTP Basic oder Diggest Authentifaktion erstellen bietet das Framework und die Klasse Zend_Auth_Adapter_Http derzeit nur die Möglichkeit die Userdaten mit Textdateien abzugleichen. Doch gerade Basic und Diggest Authentifikation über Datenbanken ist so ein Fall, denn ich derzeit viel zu oft brauche. Um es kurz für andere festzuhalten, die eventuell auch [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.simlau.net/wp-files/zendframework.png"><img src="http://blog.simlau.net/wp-files/zendframework.png" alt="Zend Framework" title="Zend Framework" width="181" height="93" class="alignright size-full wp-image-1986" /></a>Möchte mit dem ZendFramework eine HTTP Basic oder Diggest Authentifaktion erstellen bietet das Framework und die Klasse Zend_Auth_Adapter_Http derzeit nur die Möglichkeit die Userdaten mit Textdateien abzugleichen.</p>
<p>Doch gerade Basic und Diggest Authentifikation über Datenbanken ist so ein Fall, denn ich derzeit viel zu oft brauche. Um es kurz für andere festzuhalten, die eventuell auch mal in die Situation kommen: Das ganze zu implementieren sind effektiv ~5 Zeilen Code:</p>
<pre class="brush: php;">class Zend_Auth_Adapter_Http_Resolver_DbTable implements Zend_Auth_Adapter_Http_Resolver_Interface
{
	protected $_dbh = null;

	public function __construct(Zend_Db $dbh)
	{
		$this-&gt;_dbh = $dbh;
	}

	public function resolve($username, $realm)
	{
		$stmt = $this-&gt;_dbh-&gt;prepare(
			'SELECT password FROM users WHERE username = :username LIMIT 1'
		);
		$stmt-&gt;bindParam(':username', $username);
		$stmt-&gt;execute();

		// Gibt das Passwort des Users zurueck
		return $stmt-&gt;fetch(PDO::FETCH_OBJ)-&gt;password;
	}
}</pre>
<p>Benutzt wird das ganze dann wie folgt:</p>
<pre class="brush: php;">$auth = new Zend_Auth_Adapter_Http(array(
	'accept_schemes'	=&gt; 'basic',
	'realm'				=&gt; 'area51'
));

// Unsere Helferklasse als Resolver für das Passwort einbinden.
// Als Parameter für __construct wird eine Zend_Db Instanz mit übergeben
$auth-&gt;setBasicResolver(
  new Zend_Auth_Adapter_Http_Resolver_DbTable(Zend_Db::factory($config))
);

// Benötigte Response und Request Klassen starten
$auth-&gt;setRequest($request = new Zend_Controller_Request_Http());
$auth-&gt;setResponse($response = new Zend_Controller_Response_Http());

// Die eigentliche Authentifikation
$result = $auth-&gt;authenticate();

// Erscheint beim klick auf &quot;abbrechen&quot;
if (!$result-&gt;isValid()) die(&quot;Try again!&quot;);

$response-&gt;sendResponse();</pre>
<p>Das ganze funktioniert natürlich auch mit HTTP Digest. Da hier das Passwort aber verschlüsselt übertragen wird, muss eine Kleinigkeit angepasst werden:</p>
<pre class="brush: php;">
public function resolve($username, $realm) {
	...
	// MD5 Hash von &quot;benutzername:realm:passwort&quot;
	return md5($username.':'.$realm.':'.$stmt-&gt;fetch(PDO::FETCH_OBJ)-&gt;password);
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.simlau.net/zendframework-http-auth.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress: Performance verbessern</title>
		<link>http://blog.simlau.net/wordpress-performance-verbessern.html</link>
		<comments>http://blog.simlau.net/wordpress-performance-verbessern.html#comments</comments>
		<pubDate>Sun, 07 Mar 2010 18:00:31 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://blog.simlau.net/?p=1816</guid>
		<description><![CDATA[Mit steigenden Features und steigender Anzahl an Addons und Plugins sinkt leider die Performance eines jeden Scripts. Auch die bekannte Bloggingsoftware WordPress enzieht sich dessen nicht. Auch in Zeiten von Glasfaserleitungen und Breitbandinternet ist es weiterhin wichtig, einen schnellen Seitenaufbau an den Tag zu legen, da mittlerweile auch Google im PageRank darauf wert legt. In [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.simlau.net/wp-files/wordpress1.png"><img src="http://blog.simlau.net/wp-files/wordpress1.png" alt="Wordpress auf einfache weiße schneller machen" title="Wordpress Performance verbessern" width="80" height="80" class="alignright size-full wp-image-666" /></a>Mit steigenden Features und steigender Anzahl an Addons und Plugins sinkt leider die Performance eines jeden Scripts.</p>
<p>Auch die bekannte Bloggingsoftware WordPress enzieht sich dessen nicht. Auch in Zeiten von Glasfaserleitungen und Breitbandinternet ist es weiterhin wichtig, einen schnellen Seitenaufbau an den Tag zu legen, da mittlerweile auch Google im PageRank darauf wert legt. </p>
<p>In diesem Beitrag möchte ich euch einige einfache Tipps zur Verbesserung der Performance eures WordPress Blogs zeigen.</p>
<p><span id="more-1816"></span><br />
<strong>WordPress Template aufräumen</strong><br />
Eine Sache, die sich bei WordPress immer anbietet ist die header.php in den Templates soweit es geht statisch zu machen. Standardmäßig sieht der Code des Default Kubrick-Themes beispielsweiße so aus:</p>
<pre class="brush: xml;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; &lt;?php language_attributes(); ?&gt;&gt;
&lt;head profile=&quot;http://gmpg.org/xfn/11&quot;&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;&lt;?php bloginfo('html_type'); ?&gt;; charset=&lt;?php bloginfo('charset'); ?&gt;&quot; /&gt;</pre>
<p>Für die Usability ist das auch durchaus eine tolle Sache &#8211; man kann alles toll via GUI im Adminpanel anpassen. Allerdings kann man sich diese ganzen SQL-Queries auf die Datenbank auch sparen, denn eigentlich sollten sich Dinge wie der Seitentitel oder die Feed-URLs eh nicht ändern.</p>
<pre class="brush: xml;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; dir=&quot;ltr&quot;&gt;
&lt;head profile=&quot;http://gmpg.org/xfn/11&quot;&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;</pre>
<p>Das ganze macht man nun mit Seitentitel, RSS-URLs, Stylesheets und der Pingback URL.</p>
<p>Wenn man alles angepasst hat, sollte man pro Seitenarufruf mindestens 3 SQL-Queries weniger haben. Im Footer des Templates (footer.php) lässt sich das natürlich gleichermaßen anwenden. Auch dort wird der Titel des Blogs und die Feed URLs aus der Datenbank gehohlt.</p>
<p><strong>WordPress wp_head() entschlacken</strong><br />
Nun kann man noch einige unnötige Sachen aus dem head-Bereich entfernen, welche durch WordPress automatisch hinzugefügt werden. Dazu fügt man diesen Code in der Datei functions.php in seinem Template (wp-content/themes/default/) ein. </p>
<pre class="brush: php;">remove_action('wp_head', 'wp_generator'); // WordPress Version nicht anzeigen
remove_action('wp_head', 'index_rel_link'); // Index Link deaktivieren
remove_action('wp_head', 'parent_post_rel_link', 10, 0); // Prev Link deaktivieren
remove_action('wp_head', 'start_post_rel_link', 10, 0); // Start Link deaktivieren
remove_action('wp_head', 'adjacent_posts_rel_link', 10, 0); // Und noch mehr davon...
remove_action( 'wp_head', 'wlwmanifest_link'); // Windows Live Writer Link deaktivieren
remove_action( 'wp_head', 'rsd_link'); // &quot;Really Simple Discovery&quot;-Service Link deaktivieren
remove_action('wp_head', 'post_comments_feed_link'); // Keinen Extra Feed für einzelne Artikel/deren Kommentare anzeigen</pre>
<p>Die entsprechenden Hooks haben dabei folgende Aufgaben:</p>
<ul>
<li><strong>wp_generator</strong>: Broadcasten der benutzen WordPress Verison</li>
<li><strong>post_rel_link</strong>: Hinzufügen unnötiger Links in den Head-Bereich</li>
<li><strong>wlwmanifest_link</strong>: Wird nur für den Windows Live Writer benötigt</li>
<li><strong>rsd_link</strong>: <a href="http://en.wikipedia.org/wiki/Really_Simple_Discovery">Really Simple Discovery</a> Link</li>
<li><strong>post_comments_feed_link</strong>: Zusätzliche Feeds für die Kommentare zu einzelnen Posts</li>
</ul>
<p><strong>Caching Plugin installieren</strong><br />
Da man mit einem &#8220;normalen&#8221; Blog zu 95% statischen Content ausliefert, kann man sich nun noch ein Caching Plugin installieren. Das heißt die Seiten werden beim Aufruf nicht Live generiert, sondern es wurde vorher bereits eine statische Version von Ihnen abgespeichert.</p>
<p>Als Beispiele sind hier <a href="http://wordpress.org/extend/plugins/wp-cache/">WP Cache</a> oder <a href="http://wordpress.org/extend/plugins/wp-super-cache/">WP Super Cache</a> zu nennen (ich verwende letzteres).</p>
<p>Nachteil hier ist natürlich, dass beispielsweiße kann PHP-Code mehr in den Sidebars verwendet werden kann oder bestimmte Statistik-Plugins nicht mehr funktionieren. Dafür ist der Vorteil durch die gewonnene Geschwindigkeit deutlich größer. <img src='http://blog.simlau.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simlau.net/wordpress-performance-verbessern.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP Anwendungen lokalisieren mit Gettext</title>
		<link>http://blog.simlau.net/php-anwendungen-lokalisieren.html</link>
		<comments>http://blog.simlau.net/php-anwendungen-lokalisieren.html#comments</comments>
		<pubDate>Tue, 23 Feb 2010 08:00:21 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Lokalisierung]]></category>

		<guid isPermaLink="false">http://blog.simlau.net/?p=1724</guid>
		<description><![CDATA[Viele standen mit Sicherheit schon einmal vor dem Problem: eine Web-Anwendung muss in mehreren Sprachen bereitgestellt werden. Dabei möchte man es denn Übersetzern natürlich möglichst einfach gestalten und das Script so schreiben, dass eine weitere Sprache im Nachhinein im System einzupflegen einen möglichst geringen Aufwand bereitet. Ansätze gibt es mehrere. Eine Möglichkeit ist die Sprachvariablen [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.simlau.net/wp-files/PHP_Logo.png"><img src="http://blog.simlau.net/wp-files/PHP_Logo.png" alt="Anwendungen lokalisieren mit gettext" title="Anwendungen lokalisieren mit gettext" width="145" height="77" class="alignright size-full wp-image-1604" /></a>Viele standen mit Sicherheit schon einmal vor dem Problem: eine Web-Anwendung muss in mehreren Sprachen bereitgestellt werden. </p>
<p>Dabei möchte man es denn Übersetzern natürlich möglichst einfach gestalten und das Script so schreiben, dass eine weitere Sprache im Nachhinein im System einzupflegen einen möglichst geringen Aufwand bereitet.</p>
<p>Ansätze gibt es mehrere. Eine Möglichkeit ist die Sprachvariablen in ein Array auszulagern&#8230;</p>
<p><span id="more-1724"></span></p>
<pre class="brush: php;">&lt;?php

if (!is_array($lang) || empty($lang)) {
  $lang = array();
}

$lang = array_merge(
  'post_geloescht' =&gt; 'Dieser Eintrag wurde leider geloescht',
  'post_hinzufuegen' =&gt; 'Einen neuen Eintrag hinzufuegen',
);

?&gt;</pre>
<p>Und im Maincode dann beispielsweise&#8230;</p>
<pre class="brush: php;">&lt;?php
// Natürlich ist dieser Code in echten Projekten tödlich für die Sicherheit
// Nur als Beispiel, es fehlen diverse Checks gegen Remote Inclusions

$user_lang = (isset($_SESSION['user_language']) &amp;&amp; !empty($_SESSION['user_language'])) ? $_SESSION['user_language'] : '';

$user_lang = (!empty($user_lang) &amp;&amp; is_file(dirname(__FILE__) . '/language/main_' . $user_lang . '.php')) ? $user_lang : 'de';

include_once dirname(__FILE__) . '/language/main_' . $user_lang . '.php';

echo $lang['post_geloescht']);

?&gt;</pre>
<p>Jeder Entwickler muss, sofern er eine neue Sprachvariable braucht, diese in zwei verschiedenen Teilen des Codes einfügen. Dann natürlich noch jeweils eine zusätzliche Änderung pro weiteres Sprachpaket &#8211; nicht allzu komfortabel. Zudem ist dieses Konzept auch noch recht fehleranfällig, insbesondere weil wir Programmierer ja meistens eher Schreibfaul sind. <img src='http://blog.simlau.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Zusätzlich muss man den Fall absichern, dass ein Übersetzer ein Feld im Array komplett aus seiner Übersetzung vergessen hat.</p>
<p>Bei kleinen Projekten ist das alles durchaus akzeptabel. Problematisch wird es eher, wenn man mehrere hundert Variablen speichern muss.</p>
<p><strong>Lokalisierung mit setlocale</strong></p>
<p>Diese Methode wird bei diversen größeren quell offenen Scripten wie auch Beispielsweise WordPress verwandt.</p>
<p>Mit den gettext Tools kann automatisch ein Übersetzungstemplate generiert werden. Dieses kann man dem Übersetzungsteam bei jedem neuen Release einfach zusenden und fertig. </p>
<p>Eine schöne Sache ist dabei, dass man sich auch nicht mehr um einen Fallback kümmern muss. Falls ein Feld in der Sprachdatei nicht existiert oder im worst case das Sprachfile nicht gelesen werden kann wird der &#8220;Standard&#8221; (nicht übersetzte) Text ausgegeben.</p>
<p>Der größte Vorteil liegt jedoch darin, dass man, sofern man gettext von Anfang an in seine Scripte einpflegt, mit niedrigsten Aufwand eine Anwendung auch noch später lokalisieren kann &#8211; vielleicht ohne das dies Anfangs überhaupt geplant war.</p>
<pre class="brush: php;">&lt;?php

setlocale(LC_ALL, 'de_DE'); // Sprache auf Deutsch stellen
bindtextdomain('messages', './locale'); // Pfad der Uebersetzungstabellen
textdomain('messages'); // Domain auswaehlen

echo _('Hello World'); // Beispiel Ausgabe (_() ist der Alias zu gettext())

?&gt;</pre>
<p>Aus diesem Code kann man sich nun mittels des folgenden Befehls ein Übersetzungstemplate generieren lassen:</p>
<pre class="brush: bash;">root@localhost: xgettext index.php</pre>
<p>Dieses File kann man nun seinen Übersetzern zukommen lassen. Wichtig ist hier vor allem, dass der der Zeichensatz angepasst wird. Fertig sieht das ganze etwa so aus:</p>
<pre class="brush: plain;"># German Translation for MyProject
# Copyright (C) 2010 MyProject Translation Team
# This file is distributed under the same license as the MyProject package.
# Tom Riddle &amp;gtn;foobar@example.com&amp;ltn;, 2010.
#
#, fuzzy
msgid &quot;&quot;
msgstr &quot;&quot;
&quot;Project-Id-Version: 1.0\n&quot;
&quot;Report-Msgid-Bugs-To: bugs@example.com\n&quot;
&quot;POT-Creation-Date: 2010-02-22 22:42+0100\n&quot;
&quot;PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n&quot;
&quot;Last-Translator: Tom Riddle foobar@example.com\n&quot;
&quot;Language-Team: de_DE foo@li.org\n&quot;
&quot;MIME-Version: 1.0\n&quot;
&quot;Content-Type: text/plain; charset=utf-8\n&quot;
&quot;Content-Transfer-Encoding: 8bit\n&quot;

#: index.php:14
msgid &quot;Hello World&quot;
msgstr &quot;Hallo Welt&quot;</pre>
<p>Ist das geschafft muss das Template &#8220;kompiliert&#8221; werden, sprich in Maschinensprache übersetzt werden. Das geschieht mit diesem Befehl:</p>
<pre class="brush: bash;">root@localhost: msgfmt -o messages.mo messages.po</pre>
<p>Man erhält nun eine Datei messages.mo. Diese verschiebt man nach locale/de_DE/LC_MESSAGES/messages.mo.</p>
<p>Wenn man nun die Anwendung startet sollte &#8220;Hallo Welt&#8221; auf dem Schirm erscheinen. Gibt es irgendeinen Fehler, oder wurde das File nicht gefunden erscheint &#8220;Hello World.&#8221;</p>
<p><strong>Alternative Tools für das bearbeiten der Sprachfiles</strong></p>
<ul>
<li><a href="http://www.poedit.net/">PoEdit</a> &#8211; Windows, Mac OS X and UNIX/Linux</li>
<li><a href="http://kbabel.kde.org/">KBabel</a> &#8211; Linux (KDE)</li>
</ul>
<p>Weitere Infos gibt es in der PHP Doku auf den Seiten zu <a href="http://de3.php.net/manual/de/ref.gettext.php">Gettext</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simlau.net/php-anwendungen-lokalisieren.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 5.3 und PHP 6.0 auf Debian Lenny 5.0</title>
		<link>http://blog.simlau.net/php-5-3-und-php-6-0-auf-debian-lenny-5-0.html</link>
		<comments>http://blog.simlau.net/php-5-3-und-php-6-0-auf-debian-lenny-5-0.html#comments</comments>
		<pubDate>Thu, 24 Sep 2009 08:00:36 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Debian]]></category>

		<guid isPermaLink="false">http://blog.simlau.net/?p=1599</guid>
		<description><![CDATA[PHP 5.3 und PHP 6.0 enthalten viele Neuerungen, die vorallem im Bereich der Objektorientierung teilweise recht praktisch sind. So wurden mit PHP 5.3 Beispielweise Namespaces und Late Static Bindings integriert. In PHP 6.0 werden überflüssige Funktionen wie register_globals, magic_quotes, register_long_arrays und der safe_mode abgeschafft, dafür gibt es einen vollständigen Unicode Support. Leider kommt man bei [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://php.net/"><img src="http://blog.simlau.net/wp-files/PHP_Logo.png" alt="PHP Logo" title="PHP Logo" width="145" height="77" class="alignright size-full wp-image-1604" style="float: right;" /></a>PHP 5.3 und PHP 6.0 enthalten viele Neuerungen, die vorallem im Bereich der Objektorientierung teilweise recht praktisch sind.</p>
<p>So wurden mit PHP 5.3 Beispielweise Namespaces und Late Static Bindings integriert. In PHP 6.0 werden überflüssige Funktionen wie register_globals, magic_quotes, register_long_arrays und der safe_mode abgeschafft, dafür gibt es einen vollständigen Unicode Support.</p>
<p>Leider kommt man bei diversen Linux Distributionen als PHP Entwickler immer nur mit recht viel Geduld zum Genuss der teilweise recht praktischen Neuerungen.<br />
Deshalb gibt es die Möglichkeit PHP manuell aus dem Quellcode heraus zu installieren, bzw. sich selbst ein kleines .deb-Paket zu basteln.</p>
<p>Das ganze wurde auf einem Debian Lenny getestet, sollte sich aber mit kleineren Änderungen (ggf. andere Paketnamen bei den Abhängigkeiten) auch auf ähnliche Systeme wie Ubuntu übertragen lassen.</p>
<p><span id="more-1599"></span></p>
<p><strong>Vorarbeiten</strong><br />
Vor einer manuellen Installation sollten alle Pakete von PHP komplett entfernt werden.</p>
<blockquote><p><code>apt-get --purge remove php5 php5-* libapache2-mod-php5</code></p></blockquote>
<p>Der folgende Prozess erstellt ein &#8220;All-in-One&#8221; Paket, welches bereits alle zusätzlichen Erweiterungen (wie php5-curl, php5-mysql usw.) enthält.</p>
<p>Aufgrund dessen kann es eventuell zu mehren Abhänigkeitsproblemen bei Applikationen wie phpMyAdmin und anderen aus den Repositorys installieren Paketen kommen. Als Workaround kann man diese Pakete mit mittels &#8211;force Parameter installieren, oder aber sie einfach nur mehr komplett per Hand pflegen.</p>
<p><strong>Bau des Paketes</strong><br />
Um PHP kompilieren zu können, werden für die Abhängigkeiten zunächst einige Pakete benötigt. </p>
<blockquote><p><code>apt-get install gcc automake make checkinstall libjpeg62-dev libpng12-dev apache2-prefork-dev libbz2-dev libcurl4-openssl-dev libjpeg-dev libpng-dev libxpm-dev libxft-dev libt1-dev libgd2-xpm-dev libgmp3-dev libsasl2-dev freetds-dev libmysqlclient15-dev unixodbc-dev libpspell-dev librecode-dev libsnmp-dev libsqlite0-dev libtidy-dev libxslt1-dev x11proto-core-dev libxau-dev libpthread-stubs0 libpthread-stubs0-dev libxdmcp-dev libxcb1-dev libxcb-xlib0-dev x11proto-input-dev x11proto-kb-dev xtrans-dev libx11-dev libxpm-dev libexpat1-dev libfreetype6-dev pkg-config libfontconfig1-dev apache2-mpm-prefork apache2-utils apache2.2-common comerr-dev libapr1 libapr1-dev libaprutil1 libaprutil1-dev libaspell-dev freetds-common libdb4.6-dev libgmpxx4ldbl libice-dev libidn11-dev libkadm55 libkrb5-dev libldap2-dev libodbcinstq1c2 libpcre3-dev libpq-dev libsensors-dev libsm-dev libsnmp-perl libsqlite3-dev libssl-dev libsybdb5 libt1-5 libtidy-0.99-0 libwrap0-dev libxaw7-dev libxaw7-dev libxext-dev libxmu-dev libxmu-headers libxrender-dev libxt-dev uuid-dev x11proto-render-dev x11proto-xext-dev libmcrypt4 libmcrypt-dev libmhash-dev</code></p></blockquote>
<p>Zusätzlich, wenn PHP6 installiert wird ist noch das folgende Paket von nöten:</p>
<blockquote><p><code>apt-get install libicu-dev</code></p></blockquote>
<p>Nun kann man den Sourcecode von PHP 5.3 herunterladen und entpacken.</p>
<blockquote><p><code>cd /usr/src &#038;&#038; wget http://de3.php.net/get/php-5.3.0.tar.gz/from/de.php.net/mirror<br />
tar xf php-5.3.0.tar.gz &#038;&#038; cd php-5.3.0</code></p></blockquote>
<p>Bzw. wenn man PHP 6.0 aus den täglichen Snapshots installieren möchte:</p>
<blockquote><p><code>cd /usr/src &#038;&#038; wget http://snaps.php.net/php6.0-latest.tar.gz<br />
tar xf php6.0-latest.tar.gz &#038;&#038; cd php6.0-*/</code></p></blockquote>
<p>Nun ist es Zeit für das configure Script. Für PHP 5.3 führt man hier folgendes aus:</p>
<blockquote><p><code>./configure --prefix=/usr --with-apxs2=/usr/bin/apxs2 --with-config-file-path=/etc/php5/apache2 --with-config-file-scan-dir=/etc/php5/apache2/conf.d --mandir=/usr/share/man --disable-debug --with-regex=php --disable-rpath --disable-static --with-pic --with-layout=GNU --with-pear=/usr/share/php --enable-calendar --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-bcmath --with-bz2 --enable-ctype --with-db4 --without-gdbm --with-iconv --enable-exif --enable-ftp --with-gettext --enable-mbstring --with-pcre-regex=/usr --enable-shmop --enable-sockets --enable-wddx --with-libxml-dir=/usr --with-zlib --with-kerberos=/usr --with-openssl=/usr --enable-soap --enable-zip --with-exec-dir=/usr/lib/php5/libexec --without-mm --with-curl=shared,/usr --with-zlib-dir=/usr --with-gd=shared,/usr --enable-gd-native-ttf --with-gmp=shared,/usr --with-jpeg-dir=shared,/usr --with-xpm-dir=shared,/usr/X11R6 --with-png-dir=shared,/usr --with-freetype-dir=shared,/usr --with-t1lib=shared,/usr --with-ldap=shared,/usr --with-ldap-sasl=/usr --with-mhash=shared,/usr --with-mysql=shared,/usr --with-mysqli=shared,/usr/bin/mysql_config --with-pspell=shared,/usr --with-unixODBC=shared,/usr --with-xsl=shared,/usr --with-snmp=shared,/usr --with-sqlite=shared,/usr --with-mssql=shared,/usr --with-tidy=shared,/usr --with-xmlrpc=shared --with-pgsql=shared,/usr --enable-gd-native-ttf --enable-dba=shared --with-openssl-dir=shared,/usr --enable-gd-jis-conv --enable-json --with-mcrypt=shared,/usr --enable-pcntl --with-pdo-mysql --with-pdo-odbc=unixODBC,/usr --with-pdo-pgsql=shared,/usr --with-pdo-sqlite --enable-xmlreader --with-tsrm-pthreads</code></p></blockquote>
<p>Für PHP 6.0, mit minimalen Änderungen:</p>
<blockquote><p><code>./configure --prefix=/usr --with-apxs2=/usr/bin/apxs2 --with-config-file-path=/etc/php6/apache2 --with-config-file-scan-dir=/etc/php6/apache2/conf.d --mandir=/usr/share/man --disable-debug --with-regex=php --disable-rpath --disable-static --with-pic --with-layout=GNU --enable-calendar --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-bcmath --with-bz2 --enable-ctype --with-db4 --without-gdbm --with-iconv --enable-exif --enable-ftp --with-gettext --enable-mbstring --with-pcre-regex=/usr --enable-shmop --enable-sockets --enable-wddx --with-libxml-dir=/usr --with-zlib --with-kerberos=/usr --with-openssl=/usr --enable-soap --enable-zip --libexecdir=/usr/lib/php6/libexec --without-mm --with-curl=shared,/usr --with-zlib-dir=/usr --with-gd --enable-gd-native-ttf --with-gmp=shared,/usr --with-jpeg-dir=shared,/usr --with-xpm-dir=shared,/usr/X11R6 --with-png-dir=shared,/usr --with-freetype-dir=shared,/usr --with-t1lib=shared,/usr --with-ldap=shared,/usr --with-ldap-sasl=/usr --with-mhash=shared,/usr --with-mysql=shared,/usr --with-mysqli=shared,/usr/bin/mysql_config --with-pspell=shared,/usr --with-unixODBC=shared,/usr --with-xsl=shared,/usr --with-snmp=shared,/usr --with-sqlite=shared,/usr --enable-sqlite-utf8 --with-mssql=shared,/usr --with-tidy=shared,/usr --with-xmlrpc=shared --with-pgsql=shared,/usr --enable-gd-native-ttf --with-icu-dir=/usr --enable-dba=shared --with-openssl-dir=shared,/usr --enable-gd-jis-conv --enable-json --with-mcrypt=shared,/usr --enable-pcntl --with-pdo-mysql --with-pdo-odbc=unixODBC,/usr --with-pdo-pgsql=shared,/usr --with-pdo-sqlite --enable-xmlreader --with-tsrm-pthreads</code></p></blockquote>
<p>Jetzt kann man den make Befehl ausführen. Hat man einen Dualcore/Quadcore Prozessor, kann man den Prozess mittels dem Parameter -jX (X für die Anzahl an Kernen) beschleunigen.</p>
<blockquote><p><code>make -j2</code></p></blockquote>
<p>Um im letzten Schritt das Debian Paket zu erstellen, gibt man für PHP 5.3 den folgenden Befehl ein:</p>
<blockquote><p><code>checkinstall -D --install=no --fstrans=no --maintainer=root@example.org --reset-uids=yes --nodoc --pkgname=php5 --pkgversion=5.3.0 --pkgrelease=`date +%Y%m%d%H%M` --arch=amd64</code></p></blockquote>
<p>Oder für Version 6.0:</p>
<blockquote><p><code>sudo checkinstall -D --install=no --fstrans=no --maintainer=root@example.org --reset-uids=yes --nodoc --pkgname=php6 --pkgversion=6.0.0-dev --pkgrelease=`date +%Y%m%d%H%M` --arch=amd64</code></p></blockquote>
<p>Sollte man kein 64 Bit Debian/Ubuntu betreiben, so muss man &#8211;arch=amd64 entsprechend anpassen (auf i386, i486 oder i586 usw.). Der Switch &#8211;maintainer sollte auch noch an die eigene E-Mail Adresse angepasst werden.</p>
<p>checkinstall frägt auch noch nach einer Beschreibung des Paketes und zusätzlichen Infos. Dies kann man aber alles getrost ignorieren und mit Enter bestätigen. </p>
<p><strong>Fehler bei checkinstall</strong><br />
Bricht checkinstall mit einem Fehler ala &#8220;Error: At least one `LoadModule&#8217; directive already has to exist&#8230;&#8221;, liegt das daran, dass die httpd.conf des Apache2 Webservers leer ist. Hier gibt es einen kleinen Workaround:</p>
<blockquote><p><code>echo "#LoadModule directive to aid module installations" >> /etc/apache2/httpd.conf<br />
echo "#LoadModule dummy_module /usr/lib/apache2/modules/mod_dummy.so" >> /etc/apache2/httpd.conf</code></p></blockquote>
<p>Anschließend checkinstall erneut ausführen.</p>
<p><strong>Installation und Test</strong><br />
Ist der Prozess abgeschlossen befindet sich im aktuellen Verzeichnis ein Paket, welches man wie folgt installieren kann:</p>
<blockquote><p><code>dpkg -i *.deb</code></p></blockquote>
<p>Um zu testen ob PHP korrekt installiert wurde kann man in der Shell den Befehl &#8220;php -v&#8221; ausführen. Angezeigt werden sollte die entsprechende Version und das Build Datum, z. B. &#8220;PHP 5.3.0 (cli) (built: Sep 23 2009 00:00:00)&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simlau.net/php-5-3-und-php-6-0-auf-debian-lenny-5-0.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Kon-Boot &#8211; Windows/Linux Login umgehen</title>
		<link>http://blog.simlau.net/kon-boot-windowslinux-login-umgehen.html</link>
		<comments>http://blog.simlau.net/kon-boot-windowslinux-login-umgehen.html#comments</comments>
		<pubDate>Thu, 30 Jul 2009 20:32:32 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.simlau.net/?p=1548</guid>
		<description><![CDATA[Kon-Boot ist eine gerade mal 8 Kilobyte große Live Disc mit der man Passwortabfragen bei Windows und Linux Systemen komplett umgehen kann. Das besondere: das Passwort wird nicht zurückgesetzt, es wird Live per Speichermodifzierung umgangen. Hier ein Video von der Website des Entwicklers, das die Funktionalität von Kon-Boot auf einem Debian Linux demonstriert (vermutlich ein [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.simlau.net/wp-files/debiansmall.png"><img src="http://blog.simlau.net/wp-files/debiansmall.png" alt="Debian" title="Debian" width="70" height="86" class="alignright size-full wp-image-1109" /></a><a href="http://www.piotrbania.com/all/kon-boot/">Kon-Boot</a> ist eine gerade mal 8 Kilobyte große Live Disc mit der man Passwortabfragen bei Windows und Linux Systemen komplett umgehen kann. Das besondere: das Passwort wird nicht zurückgesetzt, es wird Live per Speichermodifzierung umgangen.</p>
<p>Hier ein Video von der Website des Entwicklers, das die Funktionalität von Kon-Boot auf einem Debian Linux demonstriert (vermutlich ein Etch):</p>
<div style="text-align: center; margin: auto"><object type="application/x-shockwave-flash" style="width:425px; height:344px;" data="http://www.youtube.com/v/jTZX_ldU1MQ"><param name="movie" value="http://www.youtube.com/v/jTZX_ldU1MQ" /></object></div>
<p>Das System wird mittels der KonBoot Live Disc gestartet und normal gebootet. Beim Login Prompt gibt man einfach den Usernamen &#8220;kon-usr&#8221; ein und hat direkt Root-Zugriff. Hilfreich wenn beispielsweise ein Passwort für den GRUB Bootloader vergeben wurde und so ein init=/bin/bash nicht direkt klappt.</p>
<p>Bei einem <a href="http://www.youtube.com/watch?v=NTimALz5kRA">Windows System</a> entfällt das Login Prompt komplett und man landet ohne weiteres mucksen direkt auf dem Desktop, natürlich als Administrator.</p>
<p>Kon-Boot unterstützt, wie schon angesprochen viele Systeme von Windows Server 2008 über Windows XP bis hin zu Windows 7 und nahezu alle verfügbaren Linux Distributionen. Leider ausschließlich 32 Bit Systeme.</p>
<p>Was mich absolut an diesem Programm fasziniert ist die Einfachheit. CD einlegen und fertig. Mehr ist nicht zu tun. Schützen kann man sich dagegen nicht wirklich. Der einzige wirksame Schutz, und das gilt sowieso generell: Die wichtigen und privaten Daten verschlüsseln (z. B. mittels DM-Crypt oder TrueCrypt).</p>
<p>Herunterladen kann man das ganze auf <a href="http://www.piotrbania.com/all/kon-boot/">piotrbania.com</a>, wahlweiße als Disketten-Image oder CD.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simlau.net/kon-boot-windowslinux-login-umgehen.html/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Anonymes surfen mit dem Firefox</title>
		<link>http://blog.simlau.net/anonymes-surfen-mit-dem-firefox.html</link>
		<comments>http://blog.simlau.net/anonymes-surfen-mit-dem-firefox.html#comments</comments>
		<pubDate>Mon, 29 Jun 2009 08:00:06 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Anonymisierung]]></category>
		<category><![CDATA[firefox]]></category>

		<guid isPermaLink="false">http://blog.simlau.net/?p=1286</guid>
		<description><![CDATA[Im Firefox mit einem SOCKS-Proxy bzw. über einen SSH-Tunnel surfen heißt nicht unbedingt immer, dass man auch wirklich anonym surft. Firefox hat ein seltsames Phänomen: Bei einem eingestellten SOCKS5-Proxy löst Firefox die IP-Adressen nicht standardmäßig über die DNS-Server des Remote-Hosts auf, sondern benutzt zuerst einmal die DNS-Server des Providers. In meinem Fall wären das die [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.simlau.net/wp-files/FirefoxLogo.png" alt="Firefox Logo" style="float: right;" />Im Firefox mit einem SOCKS-Proxy bzw. über einen SSH-Tunnel surfen heißt nicht unbedingt immer, dass man auch wirklich anonym surft. </p>
<p>Firefox hat ein seltsames Phänomen: Bei einem eingestellten SOCKS5-Proxy löst Firefox die IP-Adressen nicht standardmäßig über die DNS-Server des Remote-Hosts auf, sondern benutzt zuerst einmal die DNS-Server des Providers. </p>
<p>In meinem Fall wären das die T-Online DNS-Server &#8211; aber wer will heute denn noch die DNS-Server von <a href="http://www.zensurprovider.de/">Zensurprovidern</a> benutzen? <img src='http://blog.simlau.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Dies ganze lässt sich glücklicherweiße sehr einfach fixen. In der about:config des Firefox stellt man die Konfigurationsvariable proxy.socks_remote_dns auf true.</p>
<blockquote><p><code>network.proxy.socks_remote_dns = true<br />
network.http.sendRefererHeader = 0</code></p></blockquote>
<p>sendRefererHeader auf 0 zu stellen empfiehlt sich zusätzlich für diejenigen, die den Webmastern nicht preisgeben wollen, wonach sie soeben bei Google gesucht haben, oder über welchen Link sie auf eine Webseite gelangt sind.</p>
<p>Ein weiteres Problem ist das Prefetching im Firefox. Link-Prefetching ist eine Technologie, mit der verlinkte Webseiten schon im Voraus geladen werden. Diese wird zum Beispiel schon bei Google verwandt, um gesuchte Seiten im Hintergrund schon einmal vorzuladen. </p>
<p>Das Problem dabei ist: so erscheint man in den Logs diverser Webserver, obwohl man die Seiten eigentlich niemals selbst angesurft hat. Auch das lässt sich mit dem Umstellen der Konfigurationsvariable beheben.</p>
<blockquote><p><code>network.prefetch-next = false</code></p></blockquote>
<p>Und schon sollte das Problem gelöst sein. <img src='http://blog.simlau.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simlau.net/anonymes-surfen-mit-dem-firefox.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>CopSSH als SSH Server unter Windows</title>
		<link>http://blog.simlau.net/copssh-als-ssh-server-unter-windows.html</link>
		<comments>http://blog.simlau.net/copssh-als-ssh-server-unter-windows.html#comments</comments>
		<pubDate>Sat, 20 Jun 2009 13:49:24 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[copssh]]></category>
		<category><![CDATA[sshd]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.simlau.net/?p=1313</guid>
		<description><![CDATA[CopSSH ist ein kleiner portabler SSH-Server und Client für cygwin. Die Installation gestaltet sich als extrem einfach, da dank der Installationsroutine (ein NSIS Installer) bereits alle Abhängigkeiten mit dabei sind (cygwin, libarys etc). Auf der Enwicklerseite wird CopSSH folgendermaßen beschrieben: Copssh is an ssh server and client implementation for windows systems. It is a yet [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.simlau.net/wp-files/openssh.png" alt="Copssh" style="float: right;" />CopSSH ist ein kleiner portabler SSH-Server und Client für cygwin. Die Installation gestaltet sich als extrem einfach, da dank der Installationsroutine (ein NSIS Installer) bereits alle Abhängigkeiten mit dabei sind (cygwin, libarys etc). </p>
<p>Auf der Enwicklerseite wird CopSSH folgendermaßen beschrieben:</p>
<blockquote><p>Copssh is an ssh server and client implementation for windows systems. It is a yet another packaging of portable openssh, cygwin, some popular utilites, plus implementation of some best practices regarding security. You can use copssh for remote administration of your systems or gathering remote information in a secure way.</p></blockquote>
<p>Damit CopSSH ist quasi die &#8220;One-Click&#8221;-Variante um einen SSH Server unter Windows bereitzustellen. Dabei hat man dann alle Vorteile von einer Linuxartigen Umgebung.<br />
<span id="more-1313"></span></p>
<p><strong>Download</strong><br />
CopSSH kann man sich von <a href="http://www.itefix.no/i2/download">dieser Seite</a> herunterladen. Das ganze Paket ist dabei circa 5 MB groß.</p>
<p><strong>Konfiguration</strong><br />
Die Konfiguration des SSHDs geschieht durch eine grafische Oberfläche und ist so recht selbsterklärend. Im Startmenü unter CopSSH ruft man dazu den Menüpunkt &#8220;Activate a user&#8221; auf.</p>
<p>Auf der linken Seite des Konfigurationsassistenten legt man einen lokalen Systembenutzer fest, auf der rechten weißt man diesen einen speziellen SSH-Zugang zu.</p>
<p>Dabei kann man entscheiden, ob der User eine normale Shell auf dem System erhalten soll, oder ledeglich ein Login via SCP/SFTP möglich ist.</p>
<p><center><a href="http://blog.simlau.net/wp-files/copsssh1.png" rel="lightbox"><img src="http://blog.simlau.net/wp-files/copsssh1-300x230.png" alt="CopSSH" title="CopSSH" width="300" height="230" class="aligncenter size-medium wp-image-1334" /></a></center></p>
<p>Selektiert man die Option &#8220;Create keys for public key authentification&#8221; wird man auf der nächsten Seite nach einer Passphrase für den Key gefragt. Ein erneutes weiter meldet, dass der User nun aktiviert ist.</p>
<p><strong>Verbindung lokal testen</strong><br />
Nun kann man testen ob die Verbindung mit dem angelegten Benutzer funktioniert. Im Startmenü unter CopSSH findet man den Menüpunkt &#8220;Start a Unix BASH Shell&#8221;. Diese öffnet man nun und gibt diesen Befehl ein:</p>
<blockquote><p><code>ssh "Mein Benutzername"@127.0.0.1</code></p></blockquote>
<p>Wobei &#8220;Mein Benutzername&#8221; natürlich für den lokalen Windows User steht.</p>
<p><strong>Fazit</strong><br />
CopSSH ist eine wirklich geniale, einfache und vorallem schnelle Möglichkeit einen SSHD unter Windows aufzusetzen und per Remote sein Windows-System zu administrieren. Ich bin auf jedenfall absolut davon begeistert.</p>
<p>Außerdem bin ich mittlerweile ein echter Fan des CopSSH SSH-Clients geworden, man kann damit einfach schneller arbeiten als mit PuTTY etc. Sowas hatte ich unter Windows lange Zeit vermisst. <img src='http://blog.simlau.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Weitere Infos gibt es auf der Seite des Entwicklers.</p>
<p><a href="http://www.itefix.no/i2/copssh">http://www.itefix.no/i2/copssh</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simlau.net/copssh-als-ssh-server-unter-windows.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upgrade auf WordPress 2.8</title>
		<link>http://blog.simlau.net/upgrade-auf-wordpress-2-8.html</link>
		<comments>http://blog.simlau.net/upgrade-auf-wordpress-2-8.html#comments</comments>
		<pubDate>Sun, 14 Jun 2009 13:37:55 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://blog.simlau.net/?p=1287</guid>
		<description><![CDATA[WordPress 2.8 ist erschienen und ich auch ich eben die Zeit gefunden meinen Blog upzugraden. Das Upgrade verlief WordPresstypisch unproblematisch &#8211; besser gehts nicht! Der Bug mit open_basedir und den Plugininstallationen von dem ich vor kurzem geschrieben hatte besteht leider auch in WordPress 2.8 weiter. Ich habe dieses mal einen kleinen Plugin Patch geschrieben. Einziges [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.simlau.net/wp-files/wordpress1.png" alt="Wordpress 2.8" style="float: right;" /><a href="http://blog.wordpress-deutschland.org/2009/06/11/wordpress-28-veroeffentlicht.html">WordPress 2.8 ist erschienen</a> und ich auch ich eben die Zeit gefunden meinen Blog upzugraden. Das Upgrade verlief WordPresstypisch unproblematisch &#8211; besser gehts nicht! <img src='http://blog.simlau.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Der <a href="http://blog.simlau.net/2009/04/20/wordpress-patch-plugin-installation-mit-open_basedir/">Bug mit open_basedir</a> und den Plugininstallationen von dem ich vor kurzem geschrieben hatte besteht leider auch in WordPress 2.8 weiter.</p>
<p>Ich habe dieses mal einen kleinen Plugin Patch geschrieben. Einziges Problem: Für den Plugin Patch wird die Zend Extension APD (Advanced PHP Debugger) benötigt, denn PHP unterstützt standardmäßig kein Überladen von Funktionen.</p>
<p>Infos über APD erhält man unter den folgenden Links:</p>
<ul>
<li><a href="http://pecl.php.net/package/apd">http://pecl.php.net/package/apd</a></li>
<li><a href="http://de.php.net/manual/de/ref.apd.php">http://de.php.net/manual/de/ref.apd.php</a></li>
</ul>
<p><span id="more-1287"></span></p>
<p><strong>Installation</strong><br />
Zur Installation des Plugins muss dieses ledeglich ins Plugin Verzeichnis verschoben werden und dann ganz normal via Admininterface aktiviert werden.</p>
<p>Meldet das Interface &#8220;Das Plugin kann nicht aktiviert werden, da es einen fatalen Fehler erzeugt. Fatal error: Call to undefined function rename_function()&#8221;, so ist die Extension APD nicht vorhanden und es muss auf den manuellen Patch zurückgegriffen werden.</p>
<p><strong>Download</strong><br />
Plugin für WordPress 2.7 und höher<br />
<a href="http://blog.simlau.net/wp-files/wp-2.8-open_basedir.txt.gz">wp-2.8-open_basedir.txt.gz</a> (8 kb)</p>
<p>Gepatchte Datei für WordPress 2.8<br />
<a href="http://blog.simlau.net/wp-files/wp-2.8-file.txt.gz">wp-2.8-file.txt.gz</a> (1 kb)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simlau.net/upgrade-auf-wordpress-2-8.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.588 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2010-09-04 07:32:16 -->
<!-- Compression = gzip -->