<?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>ITWS BLOG &#187; coding</title>
	<atom:link href="http://blog.itws.de/tag/coding/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.itws.de</link>
	<description>The cake is a lie!</description>
	<lastBuildDate>Tue, 31 Jan 2012 10:34:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>GitHub Account ausgepackt</title>
		<link>http://blog.itws.de/681/github-account-ausgepackt/</link>
		<comments>http://blog.itws.de/681/github-account-ausgepackt/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 11:25:25 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[itws]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[pms]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[yap]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=681</guid>
		<description><![CDATA[Und direkt mal 3 Repos erstellt. Eins für mein Backup-Script, eins für die ITWS PHP Tools und eins für YAP, mein Projektmanagement System. Mal sehen wann ich neben yaana.de Zeit für YAP finde Ähnliche ArtikelYAP: Framework-WahlBrauchbare Project Management Systeme sind Mangelware?Neues Layout]]></description>
			<content:encoded><![CDATA[<p>Und direkt mal 3 Repos erstellt. Eins für mein Backup-Script, eins für die ITWS PHP Tools und eins für YAP, mein Projektmanagement System.</p>
<p>Mal sehen wann ich neben yaana.de Zeit für YAP finde <img src='http://blog.itws.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/823/yap-framework-wahl/" title="YAP: Framework-Wahl">YAP: Framework-Wahl</a></li><li><a href="http://blog.itws.de/391/brauchbare-project-management-systeme-sind-mangelware/" title="Brauchbare Project Management Systeme sind Mangelware?">Brauchbare Project Management Systeme sind Mangelware?</a></li><li><a href="http://blog.itws.de/952/neues-layout-2/" title="Neues Layout">Neues Layout</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=681&amp;md5=4382498ca4dae02d4f6600f821846c39" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/681/github-account-ausgepackt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Schei? Encoding &#8230;</title>
		<link>http://blog.itws.de/672/schei-encoding/</link>
		<comments>http://blog.itws.de/672/schei-encoding/#comments</comments>
		<pubDate>Fri, 12 Aug 2011 09:53:03 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[charset]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[encoding]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=672</guid>
		<description><![CDATA[Es gab in meinem Leben bisher nichts, womit ich so viel Zeit verschwendet habe wie mit Encoding Problemen. Für mein aktuelles Projekt entwickle ich zur Zeit einen crawler, der Websites zieht und analysiert. Natürlich bin ich da direkt auf sämtliche Encoding-Problemchen gestoßen, die man sich nur vorstellen kann und hatte unglaublich viel Spaß damit &#8230; Ich verwende das Zend Framework und daher entsprechend die Klasse Zend_Http_Client um die HTTP-Requests abzusetzen. Danach suche ich den Inhalt [...]]]></description>
			<content:encoded><![CDATA[<p>Es gab in meinem Leben bisher nichts, womit ich so viel Zeit verschwendet habe wie mit Encoding Problemen.</p>
<p>Für mein aktuelles Projekt entwickle ich zur Zeit einen crawler, der Websites zieht und analysiert. Natürlich bin ich da direkt auf sämtliche Encoding-Problemchen gestoßen, die man sich nur vorstellen kann und hatte unglaublich viel Spaß damit &#8230;</p>
<p>Ich verwende das Zend Framework und daher entsprechend die Klasse Zend_Http_Client um die HTTP-Requests abzusetzen.<br />
Danach suche ich den Inhalt der Seite raus, sodass lediglich ein String ohne HTML-Tags und damit reinem Text übrig bleibt.<br />
Gebe ich mir diesen nun einfach auf die Shell aus, stimmt das Encoding manchmal und manchmal nicht. Das sieht man dann immer schön an den kaputten Umlauten.</p>
<p><span style="color: #ff0000;"> <div style="float: right; width: 200px; margin: 8px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-4129785061498511";
/* itws content image */
google_ad_slot = "4724159474";
google_ad_width = 200;
google_ad_height = 200;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></span>Also habe ich eine Funktion gebraucht, die das Encoding eines Strings konvertiert &#8230; Tja, wenn es denn so einfach wäre &#8230;<br />
Die letzten Tage habe ich rund 20 Stunden damit verbracht eine Funktion zu schreiben, welche dafür sorgt, dass der String, der am Ende rauskommt, sauber dargestellt wird &#8211; unabhängig davon, was rein kommt. Das Problem hier war in erster Linie, dass selbst Strings, die sich als UTF-8 ausgegeben haben und von denen sogar mb_check_encoding() behauptet hat, es sei alles in bester Ordnung, haben kaputte Umlaute mit sich getragen. Also darauf konnte man sich schonmal gar nicht verlassen.</p>
<p>Ich möchte hier das Ergebnis meiner Arbeit mit euch teilen. Nicht erschrecken, es ist keine saubere Lösung (die sauberen Implementierungen haben allesamt nicht funktioniert). Der Code deckt auch nicht alle denkbaren Fälle ab, aber ich konnte bisher jeden beliebigen kaputten String mit deutschem Text und explodierten Umlauten in einen lesbaren String mit intakten Umlauten konvertieren. Da das mehrere 100 Texte aus verschiedensten Quellen aus dem Netz waren, behaupte ich mal, dass der Code recht brauchbar ist. Im Zweifelsfall dient er als gute Basis für eine umfassendere Implementierung.</p>
<p>Der Methode magicFixStringEncoding() kann man also einen beliebigen  String übergeben unabhängig davon ob er völlig in Ordnung ist oder total verstümmelt. Die Rückgabe der Methode sollte immer einen sauberen String mit funktionierenden Umlauten entsprechen.</p>
<p>Für Verbesserungsvorschläge bin ich jeder Zeit offen. Annsonsten viel Spaß denen, die den Code gebrauchen können <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<pre class="php">class ITWS_Tool {
	public static function magicFixStringEncoding($strInput) {
		if (preg_match('/[üäöÄÖÜß]/i', $strInput) === 1) {
			$strInput = self::convertEncoding($strInput, 'UTF-8');

			if (strlen(utf8_decode($strInput)) !== strlen(utf8_decode(utf8_decode($strInput)))) {
				$strInput = utf8_decode($strInput);
			}
		} else {
			$strInput = self::convertEncoding($strInput, 'UTF-8', 'ISO-8859-15');
		}

        return $strInput;
    }

    public static function convertEncoding($strInput, $toEncoding, $fromEncoding = '') {
        if ($fromEncoding == '') {
            $fromEncoding = mb_detect_encoding($strInput, array('UTF-8', 'ASCII', 'ISO-8859-1', 'JIS', 'EUC-JP', 'SJIS'), true);
		}

        if ($fromEncoding == $toEncoding) {
            return $strInput;
		}

        return mb_convert_encoding($strInput, $toEncoding, $fromEncoding);
    }
}</pre>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/578/php-5-4-feautre-traits-horizontaler-code-reuse/" title="PHP 5.4 Feautre: Traits &#8211; Horizontaler Code Reuse">PHP 5.4 Feautre: Traits &#8211; Horizontaler Code Reuse</a></li><li><a href="http://blog.itws.de/387/den-horizont-erweitern-das-zend-framework/" title="Den Horizont erweitern: Das Zend Framework">Den Horizont erweitern: Das Zend Framework</a></li><li><a href="http://blog.itws.de/212/php-der-include-path/" title="[PHP] Der include path">[PHP] Der include path</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=672&amp;md5=c43b9f2824a457050498b8fd089b6856" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/672/schei-encoding/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP 5.4 Feautre: Traits &#8211; Horizontaler Code Reuse</title>
		<link>http://blog.itws.de/578/php-5-4-feautre-traits-horizontaler-code-reuse/</link>
		<comments>http://blog.itws.de/578/php-5-4-feautre-traits-horizontaler-code-reuse/#comments</comments>
		<pubDate>Fri, 03 Jun 2011 20:11:34 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php 5.4]]></category>
		<category><![CDATA[trait]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=578</guid>
		<description><![CDATA[Im nächsten PHP Release gibt es ein neues Feature für horizontalen Code Reuse: sog. Traits (engl. Merkmal, Charakterzug). Was das ist und wie es funktioniert, erfahrt ihr im folgenden Artikel. Vererbung: Vertikaler Code Reuse class A { public function foo() { ....} } class B extends A { } Bei der objektorientierten Vererbung werden alle nicht-privaten Methoden und Attribute einer Klasse auf die Kind-Klasse vererbt. Das ist toll, denn so braucht man viele Methoden nur [...]]]></description>
			<content:encoded><![CDATA[<p>Im nächsten PHP Release gibt es ein neues Feature für horizontalen Code Reuse: sog. Traits (engl. Merkmal, Charakterzug). Was das ist und wie es funktioniert, erfahrt ihr im folgenden Artikel.</p>
<h2>Vererbung: Vertikaler Code Reuse</h2>
<pre class="php">class A {
	public function foo() { ....}
}

class B extends A { }</pre>
<p>Bei der objektorientierten Vererbung werden alle nicht-privaten Methoden und Attribute einer Klasse auf die Kind-Klasse vererbt. Das ist toll, denn so braucht man viele Methoden nur einmal zu implementieren, kann sie aber in vielen verschiedenen Klassen wiederverwenden. Das ist vertikaler Code Reuse. Tolle Sache, kein Thema.</p>
<p><span style="color: #ff0000;"> <div style="float: right; width: 200px; margin: 8px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-4129785061498511";
/* itws content image */
google_ad_slot = "4724159474";
google_ad_width = 200;
google_ad_height = 200;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></span>Dennoch gab es ein paar Dinge, die sich mit einfacher Vererbung nicht umsetzen ließen. z.B. eine Basis-Klasse für das Singleton-Pattern. Gerade in PHP ist das Hauptproblem hier, dass keine Mehrfach-Vererbung möglich ist &#8211; also eine Klasse nicht von mehr als einer anderen Klasse abgeleitet werden kann. Das zwingt uns leider oft dazu, dass wir uns der unangehmen Entscheidung stellen müssen, ob wir nun konzeptionell sauberen Code oder aber möglichst gute Wiederverwendung von Code haben wollen. Um dennoch irgenwie horizontalen Code Reuse zu realisieren mussten Methoden kopiert werden (also praktisch kein Reuse) oder Methoden bis in die Wurzel der Klassen-Hierarchie geschoben werden, was alles andere als schön ist.</p>
<p><span id="more-578"></span></p>
<h2>Traits: Horizontaler Code Reuse</h2>
<p>Abhilfe schaffen hier in PHP 5.4 die sogenannten Traits, welche bereits in Perl 6 oder Scala zur Verfügung stehen. Sie erlauben es dem Entwickler Behaviors (also Verhalten) in Code zu gießen. Diese Traits funktionieren im Prinzip wie Klassen können jedoch &#8211; ähnlich wie Interfaces und abstrakte Klassen &#8211; nicht instanziiert werden.</p>
<p>Sie sind dazu gedacht, Funktionalitäten zu gruppieren. Einer der Vorteile ist, dass eine Klasse mehrere Traits verwenden kann. Traits beheben somit einige Probleme von <em>single inheritance</em> Sprachen wie PHP oder Java.</p>
<p>Um das eben angesprochene Singleton-Pattern-Problem zu lösen genügt nun ab PHP 5.4 folgene Klassen-Definition:</p>
<p>&nbsp;</p>
<pre class="php">trait Singleton {
    public static function getInstance() { ... }
}

class A {
    use Singleton;
    // ...
}

class B extends ArrayObject {
    use Singleton;
    // ...
}

// Beide Klassen verwenden nun das Singleton Trait und implementieren somit das Singleton-Pattern:
A::getInstance();
B::getInstance();</pre>
<p>&nbsp;</p>
<p>Es wird noch besser: Wie bereits erwähnt, kann eine Klasse kann beliebig viele Traits verwenden. Da stellt sich der aufgeweckte Coder natürlich die Frage:</p>
<p>&nbsp;</p>
<h1>Was passiert bei Konflikten?</h1>
<p>Sprich: Was passiert, wenn zwei Traits verwenden werden, die beide eine Methode mit der selben Signatur definieren?</p>
<pre class="php">trait A {
    public function foo() {
        echo 'a';
    }

    public function bar() {
        echo 'A';
    }
}

trait B {
    public function foo() {
        echo 'b';
    }

    public function bar() {
        echo 'B';
    }
}

class C {
    use A, B;
}</pre>
<p>Dazu ist folgeneds zu sagen: Traits werden bereits in einigen Sprachen verwendet und es hat sich gezeigt, dass Konflikte zwar auftreten aber das eher die Ausnahme darstellt. Dennoch muss es natürlich ein definiertes Verhalten geben, das vorschreibt, was passieren soll, wenn Konflikte auftreten.</p>
<p>Diese Konfliktlösung sieht hier wie folgt aus:</p>
<p>Erstmal wirft PHP eine Warning um dem Entwickler darauf aufmerksam zu machen, dass ein Konflikt aufgetreten ist. Und gibt dazu auch die Info, wo der Konflikt genau auftritt. In dem Fall würde es die beiden Methoden <em><strong>foo()</strong></em> und <em><strong>bar()</strong></em> melden.</p>
<p>Und das ist auch gut so, denn <strong>keine</strong> der beiden Methoden werden in Klasse C zur Verfügung stehen! Richtig, die Konfliktlösung sieht vor, dass alles, was einen Konflikt erzeugt, rausfliegt.</p>
<p>PHP zwingt uns damit, die Traits ordentlich zu verwenden und PHP zu sagen, was wir aus welchem Trait haben wollen:</p>
<pre class="php">class C {
    use A, B {
        B::foo instead A;
        A::bar instead B;
    }
}
?&gt;</pre>
<p>Dieser Code bewirkt folgendes Verhalten: Klasse <strong><em>C</em></strong> erhält aus Trait <strong><em>B</em></strong> die Methode <em><strong>foo()</strong></em> und aus Trait <em><strong>A</strong></em> die Methode <em><strong>bar()</strong></em>.<br />
Entsprechend würde ein Aufruf der beiden Methoden auf Klasse <strong><em>C</em></strong> &#8220;<em>b</em>&#8221; und &#8220;<em>A</em>&#8221; ausgeben.</p>
<p>Das ist zwar cool, aber dennoch nicht die sauberste Lösung. Es gibt Alternativen: So kann der Entwickler auch Aliase vergeben:</p>
<pre class="php">class C {
    use A, B {
        B::foo instead A;
        A::bar instead B;
        B::bar as bar2;
    }
}</pre>
<p>Ok, ich gebe zu, dass sich die Beispiele jetzt nicht gerade durch Kreativität auszeichen, aber solange man erkennen kann um was es geht, reicht das <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Klasse <em><strong>C</strong></em> würde nach diesem Beispiel nun zusätzlich eine Methode <em><strong>bar2()</strong></em> besitzen, welche der <em><strong>bar()</strong></em>-Methode von Trait <em><strong>B</strong></em> entspricht.</p>
<p>&nbsp;</p>
<h1>Fazit</h1>
<p>Kombiniert man die OOP und ihre Features (Vererbung, Interfaces, Namespaces, Kapselung) nun mit den Traits kann man problemlos PHP-Anwendungen implementieren, die streng dem DRY-Prinzip folgen und gleichzeitg eine konzeptionell saubere Klassen-Hierarchie besitzen.</p>
<p>&nbsp;</p>
<p>Es gibt hierzu noch ein wenig mehr zu sagen, aber das ist erstmal das Wichtigste. Alles Weitere kann ich gerne noch in einen zweiten Artikel erklären <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<p>over and out</p>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/672/schei-encoding/" title="Schei? Encoding &#8230;">Schei? Encoding &#8230;</a></li><li><a href="http://blog.itws.de/387/den-horizont-erweitern-das-zend-framework/" title="Den Horizont erweitern: Das Zend Framework">Den Horizont erweitern: Das Zend Framework</a></li><li><a href="http://blog.itws.de/212/php-der-include-path/" title="[PHP] Der include path">[PHP] Der include path</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=578&amp;md5=49586e9b9cebc5bfe7c824ef91112b54" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/578/php-5-4-feautre-traits-horizontaler-code-reuse/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Worüber man nicht mehr streiten sollte</title>
		<link>http://blog.itws.de/469/woruber-man-nicht-mehr-streiten-sollte/</link>
		<comments>http://blog.itws.de/469/woruber-man-nicht-mehr-streiten-sollte/#comments</comments>
		<pubDate>Wed, 04 May 2011 08:03:10 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[gedanken]]></category>
		<category><![CDATA[coding]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=469</guid>
		<description><![CDATA[Einen netten Artikel gab es heute von Nils. Und den fand ich direkt so gut, dass ich das &#8211; ähm reblogge? Wie nennt man denn einen retweet per Blog? Egal. Es geht um den Beitrag Worüber ich nicht mehr streiten werde! Ich möchte jetzt nicht nochmal genau das schreiben, was er geschrieben hat, das könnt ihr selbst lesen. Ich möchte nur die Kernaussage weitergeben: Hört auf euch über Betriebssysteme (Linux, Windows, OSX, &#8230;), Grafische Oberflächen [...]]]></description>
			<content:encoded><![CDATA[<p>Einen netten Artikel gab es heute von <strong><a href="http://www.phphatesme.com/" target="_blank">Nils</a></strong>. Und den fand ich direkt so gut, dass ich das &#8211; ähm reblogge? Wie nennt man denn einen retweet per Blog? Egal. Es geht um den Beitrag <strong><a href="http://www.phphatesme.com/blog/php/woruber-ich-nicht-mehr-diskutieren-werden/" target="_blank">Worüber ich nicht mehr streiten werde!</a></strong></p>
<p>Ich möchte jetzt nicht nochmal genau das schreiben, was er geschrieben hat, das könnt ihr selbst lesen. Ich möchte nur die Kernaussage weitergeben: Hört auf euch über Betriebssysteme (Linux, Windows, OSX, &#8230;), Grafische Oberflächen (Gnome, KDE, XFCE, &#8230;), Template-Engines (smarty, dwoo, &#8230;), IDEs (Eclipse, Netbeans, &#8230;), Coding Guidelines etc. zu streiten.</p>
<p><span id="more-469"></span></p>
<p><span style="color: #ff0000;"> <div style="float: right; width: 200px; margin: 8px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-4129785061498511";
/* itws content image */
google_ad_slot = "4724159474";
google_ad_width = 200;
google_ad_height = 200;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></span>Warum? Ganz einfach: Weil es extrem subjektiv ist und häufig auf die völlig falschen Faktoren geachtet wird. Ausschlagebend ob ein System gut ist oder ist, ist nicht die Sprache, in der es geschrieben wurde, oder ob es open source ist oder nicht. Hier spielen weitaus wichtigere Faktoren wie persönliche Erfahrung eine Rolle. Was bringt es mir, wenn Netbeans mehr Features bietet als Eclipse, ich mit Netbeans aber noch nie gearbeitet habe? Die Entscheidung fällt auf Eclipse weil ich hier die meiste Erfahrung habe und bei meiner Arbeit damit entsprechend micht der höchsten Effizienz vorangehen kann ohne mich erstmal damit befassen zu müssen, wie ich meine IDE bediene (auch wenn sie noch so toll ist). Unterm Strich ist es einfach egal. Jeder sollte mit den Tools und Systemen arbeiten, mit denen er am besten zurecht kommt. In einem Projekt macht Prototype mehr Sinn und im nächsten Projekt macht jQuery mehr Sinn. Wenn man beides beherrscht, ist das alles kein Thema.</p>
<p>Soll natürlich nicht heißen, dass ihr jetzt versucht einen OS-Kernel in JavaScript zu implementieren, nur weil ihr DIE JavaScript-Gurus seid. Alles im sinnvollen Rahmen natürlich <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Ergo: Wir sollten alle etwas gelassener werden (siehe diesen wundervollen Comic mit der Schildkröte in Nils Eintrag) und uns über deutlich wichtigeres den Kopf zerbrechen als unsere Zeit damit zu verschwenden auszudiskutieren, ob die Klammer nun in die selbe Zeile gehört oder in die nächste &#8230;</p>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/975/die-kunst-des-programmierens/" title="Die Kunst des Programmierens">Die Kunst des Programmierens</a></li><li><a href="http://blog.itws.de/921/inspiration-fur-software-entwickler/" title="Inspiration für Software-Entwickler">Inspiration für Software-Entwickler</a></li><li><a href="http://blog.itws.de/881/burokratie-und-erbsenzahlerei-in-projekten/" title="Bürokratie und Erbsenzählerei in Projekten">Bürokratie und Erbsenzählerei in Projekten</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=469&amp;md5=3d82022ba94abc5ac665ad09776aa0ce" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/469/woruber-man-nicht-mehr-streiten-sollte/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Den Horizont erweitern: Das Zend Framework</title>
		<link>http://blog.itws.de/387/den-horizont-erweitern-das-zend-framework/</link>
		<comments>http://blog.itws.de/387/den-horizont-erweitern-das-zend-framework/#comments</comments>
		<pubDate>Fri, 04 Feb 2011 08:51:20 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[projekte]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=387</guid>
		<description><![CDATA[Gestern war ich auf der Suche nach einem neuen geeigneten Framework für ein Projekt (bisher Codeigniter verwendet, aber das hat nie so ganz meinen Bedürfnissen entsprochen). Nach dem ich nochmal auf die Websites von codeigniter 2.0, cakePHP, akelos etc. gesurft bin und jeweils einen Blick reingeworfen habe, habe ich beschlossen mich mal von meinem Vorurteilen zu befreien und mir das Zend Framework anzusehen. Vor diesem Framework habe ich mich lange Zeit zurückschrecken lassen, da ich [...]]]></description>
			<content:encoded><![CDATA[<p>Gestern war ich auf der Suche nach einem neuen geeigneten Framework für ein Projekt (bisher Codeigniter verwendet, aber das hat nie so ganz meinen Bedürfnissen entsprochen). Nach dem ich nochmal auf die Websites von codeigniter 2.0, cakePHP, akelos etc. gesurft bin und jeweils einen Blick reingeworfen habe, habe ich beschlossen mich mal von meinem Vorurteilen zu befreien und mir das Zend Framework anzusehen.</p>
<p>Vor diesem Framework habe ich mich lange Zeit zurückschrecken lassen, da ich der Ansicht war, dass das nur ein Haufen sinnlos zusammengestückelter PHP Files ist und das praktische Arbeiten mit dem ZF nicht besser aussieht.</p>
<p><span style="color: #ff0000;"> <div style="float: right; width: 200px; margin: 8px;">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-4129785061498511";
/* itws content image */
google_ad_slot = "4724159474";
google_ad_width = 200;
google_ad_height = 200;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></span>Aber man muss auch mal über seinen Horizont hinausblicken, weswegen ich mir mal die Dokumentation des Frameworks angesehen habe. Erst auf deutsch. Dann auf englisch, weil die Übersetzung so schlecht ist, dass ich viele Sätze fünfmal lesen musste, bis ich sie verstanden habe <img src='http://blog.itws.de/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /><br />
Den Quickstart Guide fand ich bis zu einem gewissen Punkt sehr gut, dann wurd es aber sehr schwammig und viele wichtige Punkte haben gefehlt, weswegen ich den Guide an dieser Stelle verlassen habe und beschlossen habe die Dokumentation zu lesen. Auf englisch natürlich. Die Doku ist soweit also nicht ideal aber auch nicht ausgesprochen schlecht.</p>
<p>Das Framework an sich ist deutlisch komfortabler als ich dachte, das autoloading erspart viel Arbeit und die saubere objektorientierte Implementierung der Komponenten ist wirklich gut.</p>
<p>Bisher sieht es also ganz danach aus, als würde ich das anstehende Projekt mit dem Zend Framework umsetzen. Das hat verschiedene Konsequenzen. Zu erstmal bin ich froh, diesen Schritt getan zu haben und mich endlich mit dem Framework zu befassen. Zum Anderen wird mir das wohl auch einiges an Stoff liefern, über den ich hier im Blog schreiben kann und zum anderen kann ich endlich mal wieder ein Projekt starten und habe was zum coden. Wurde auch mal wieder Zeit.</p>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/823/yap-framework-wahl/" title="YAP: Framework-Wahl">YAP: Framework-Wahl</a></li><li><a href="http://blog.itws.de/815/zend-framework-resourcen/" title="Zend Framework Resourcen">Zend Framework Resourcen</a></li><li><a href="http://blog.itws.de/672/schei-encoding/" title="Schei? Encoding &#8230;">Schei? Encoding &#8230;</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=387&amp;md5=05ebcf0b623d50bb2eb6b72c225a1860" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/387/den-horizont-erweitern-das-zend-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clean Code: Das KISS-Prinzip</title>
		<link>http://blog.itws.de/362/clean-code-das-kiss-prinzip/</link>
		<comments>http://blog.itws.de/362/clean-code-das-kiss-prinzip/#comments</comments>
		<pubDate>Fri, 10 Dec 2010 19:53:14 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[clean code]]></category>
		<category><![CDATA[kiss]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=362</guid>
		<description><![CDATA[Diejenigen, die wissen um was es geht, wundert es nicht, dass der n&#228;chste Artikel meiner Clean Code-Reihe dem KISS-Prinzip gewidmet ist. Dem Rest sei gesagt: Dieser Artikel hat nichts mit &#160;der US-Amerikanten Hard-Rock-Band aus den 70er zu tun Es handelt sich dabei vielmehr um eine Disziplin beim Programmieren: KISS steht f&#252;r Keep It Simple, Stupid!&#160;im Sinne von &#34;Halt es einfach, Idiot!&#34;. Aber was hei&#223;t &#34;einfach&#34;?&#160;Einfach bedeutet in diesem Fall, dass man nicht unn&#246;tig mehr macht, [...]]]></description>
			<content:encoded><![CDATA[<p>Diejenigen, die wissen um was es geht, wundert es nicht, dass der n&auml;chste Artikel meiner Clean Code-Reihe dem KISS-Prinzip gewidmet ist.</p>
<p>Dem Rest sei gesagt: Dieser Artikel hat nichts mit &nbsp;der US-Amerikanten Hard-Rock-Band aus den 70er zu tun <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Es handelt sich dabei vielmehr um eine Disziplin beim Programmieren: <strong>KISS</strong> steht f&uuml;r <strong><u>K</u>eep <u>I</u>t <u>S</u>imple, <u>S</u>tupid!</strong>&nbsp;im Sinne von &quot;Halt es einfach, Idiot!&quot;.</p>
<p>Aber was hei&szlig;t &quot;einfach&quot;?&nbsp;Einfach bedeutet in diesem Fall, dass man nicht unn&ouml;tig mehr macht, als wirklich n&ouml;tig. Denn das kostet im Zweifelsfall nur unn&ouml;tig Zeit und macht den Code schwerer zu lesen und zu warten.</p>
<p>Leider lassen sich die Entwickler nur zu gern von der &quot;Feature-Geilheit&quot; erfassen und coden wahnsinnige Dinge, die zwar verdammt cool sind, aber niemand braucht und im schlimmsten fall auch sonst niemand versteht. Dies l&auml;sst sich wohl darauf zur&uuml;ckf&uuml;hren, dass das Coden an sich eine recht langweilige Sache ist. Selten entwickelt man wirklich innovative und einzigartige Systeme. Meistens implementiert man stattdessen stupide Datenbank-Abfragen, langweilige Business Logiken und unspektakul&auml;re Oberfl&auml;chen. Im &ouml;den Einheits-Code sucht man Herausforderungen und M&ouml;glichkeiten seine F&auml;higkeiten einzusetzen. KISS bedeutet genau diesem Drang zu widerstehen und brav und artig einfach exakt das zu implementieren, was ben&ouml;tigt wird. Nicht mehr, nicht weniger und m&ouml;glichst aus einer M&uuml;cke keinen Elefanten machen.</p>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/329/clean-code-das-dry-prinzip/" title="Clean Code: Das DRY-Prinzip">Clean Code: Das DRY-Prinzip</a></li><li><a href="http://blog.itws.de/681/github-account-ausgepackt/" title="GitHub Account ausgepackt">GitHub Account ausgepackt</a></li><li><a href="http://blog.itws.de/672/schei-encoding/" title="Schei? Encoding &#8230;">Schei? Encoding &#8230;</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=362&amp;md5=781d5c614a29e8e964dd68118085105a" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/362/clean-code-das-kiss-prinzip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clean Code: Das DRY-Prinzip</title>
		<link>http://blog.itws.de/329/clean-code-das-dry-prinzip/</link>
		<comments>http://blog.itws.de/329/clean-code-das-dry-prinzip/#comments</comments>
		<pubDate>Fri, 26 Nov 2010 09:33:07 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[clean code]]></category>
		<category><![CDATA[continous integration]]></category>
		<category><![CDATA[dry]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=329</guid>
		<description><![CDATA[Dies ist der erste Teil meiner Artikel-Reihe &#34;Clean Code&#34;, welchem noch einige Weitere folgen werden und welche sich haupts&#228;chlich damit befassen, wie man sauberen, wartbaren und stabilen Code schreibt. Ich versuche dabei m&#246;glichst von der Programmiersprache selbst zu abstrahieren und mich nur mit den prinzipiellen Mustern und Vorgehensweisen zu besch&#228;ftigen. Dennoch muss ich ab und an Code-Beispiele einbringen und da werde ich mir dann wohl mit PHP und Java helfen. in diesem Artikel geht es [...]]]></description>
			<content:encoded><![CDATA[<p>Dies ist der erste Teil meiner Artikel-Reihe &quot;Clean Code&quot;, welchem noch einige Weitere folgen werden und welche sich haupts&auml;chlich damit befassen, wie man sauberen, wartbaren und stabilen Code schreibt. Ich versuche dabei m&ouml;glichst von der Programmiersprache selbst zu abstrahieren und mich nur mit den prinzipiellen Mustern und Vorgehensweisen zu besch&auml;ftigen. Dennoch muss ich ab und an Code-Beispiele einbringen und da werde ich mir dann wohl mit PHP und Java helfen.</p>
<p>in diesem Artikel geht es also um das DRY-Prinzip, welches nicht nur die einfachste Regel darstellt, sondern zugleich auch die, die am meisten misachtet wird.</p>
<p><span id="more-329"></span></p>
<p>DRY steht f&uuml;r <strong><u>D</u>on&#39;t <u>R</u>epeat <u>Y</u>ourself</strong> und der Name ist Programm(code): Ein Code-Fragement sollte immer nur exakt einmal vorkommen und sollte man dieses Fragment nochmal ben&ouml;tigen, wird es in eine Funktion/Methode ausgelagert. Leider erfordert das klassiche Copy&#39;n&#39;Paste weitaus weniger Aufwand und Gehirn-Aktivit&auml;t, weshalb dies meist die bevorzugte Vorgehensweise ist. Gerade wenn es schnell gehen muss, spart man sich den &nbsp;Aufwand eine neue Methode zu implementieren gerne.</p>
<p>Dieses leichtsinnige Verhalten bl&auml;ht nicht nur den Code auf, wie man erst vermuten mag: Das eigentliche Problem sind die potentiellen Fehlerquellen, die man dadurch erschafft.<br />
	Stelen wir uns folgendes Szenario vor:<br />
	Wir haben ein Code-Fragment geschrieben, welches die Verbindung zu einem IMAP-Server aufbaut, eine Liste der ungelesenen E-Mails erstellt und die Verbindung wieder schlie&szlig;t.&nbsp;Diese Funktion ben&ouml;tigen wir an einer anderen Stelle in einer anderen Klasse nochmal, also wird das Code-Fragment einfach kopiert. Nach einiger Zeit f&auml;llt auf &quot;Ups, hab die Zeile, mit dem close-Aufruf vergessen zu kopieren &#8230;&quot;. Diese wir dann noch schnell hinterhergeworfen und direkt haben wir den ersten Fehler: Beim Kopieren wurde das Code-Fragment ver&auml;ndert weil ein Teil nicht mitkopiert wurde.</p>
<p>Zwei Monate sp&auml;ter, soll ein Kollege einen Bugfix an diesem Code-Fragment durchf&uuml;hren. Er wei&szlig; in welcher Datei und in welcher Zeile der Fehler aufgetreten ist, &ouml;ffnet diese Datei, korrigiert die Zeile, schlie&szlig;t die Datei, f&uuml;hrt ein commit durch und damit wars das. Und hier haben wir direkt das n&auml;chste Problem: Dieses Code-Fragment, welches gerade korrigiert wurde, kommt (mit genau dem gleichen Fehler) noch an mindestens einer weiteren Stelle im Code vor. Dieser redundante Code wurde nicht korrigiert, entsprechend unterscheiden sich diese beiden Code-Fragmente, welche exakt die gleiche Aufgabe haben, nun voneinander: es herrscht Inkonsistenz.<br />
	Der entsprechende Entwickler h&auml;tte nun also pr&uuml;fen m&uuml;ssen, ob dieses Snippet noch &ouml;fter vorkommt und entsprechend jede Instanz mit dem Bugfix versehen m&uuml;ssen. Oder das ganze einem Refactoring unterziehen m&uuml;ssen. Beides bedeutet zus&auml;tzlicher Aufwand und zwar mehr als es gekostet h&auml;tte es direkt ordentlich zu machen.</p>
<p>Ein Tool, das beim Finden von doppelten Code-Fragmenten hilft, ist die so genannte Copy&#39;n&#39;Paste-Detection. Dies ist in den meisten Continous Integration Systemen enthalten und hilft ungemein, den Code zu verbessern.</p>
<p><strong>Fazit:</strong> Doppelte Code-Fragmente, welche durch Copy&#39;n&#39;Paste quer im Projekt verteilt werden, erzeugen schnell Inkonsistenzen, erh&ouml;hen die Fehleranf&auml;lligkeit und sind Gift f&uuml;r die Wartbarkeit eines Projekts. Bei jedem Programmierer sollten also alle Alarmglocken l&auml;uten, wenn er die selbe Funktionalit&auml;t mehr als einmal ben&ouml;tigt. Hier sollte immer eine neue Methode/Funktion implementiert werden.</p>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/362/clean-code-das-kiss-prinzip/" title="Clean Code: Das KISS-Prinzip">Clean Code: Das KISS-Prinzip</a></li><li><a href="http://blog.itws.de/681/github-account-ausgepackt/" title="GitHub Account ausgepackt">GitHub Account ausgepackt</a></li><li><a href="http://blog.itws.de/672/schei-encoding/" title="Schei? Encoding &#8230;">Schei? Encoding &#8230;</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=329&amp;md5=a49f5e952ca34186de4569893da3a785" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/329/clean-code-das-dry-prinzip/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[PHP] Der include path</title>
		<link>http://blog.itws.de/212/php-der-include-path/</link>
		<comments>http://blog.itws.de/212/php-der-include-path/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 06:39:15 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=212</guid>
		<description><![CDATA[Oft liest man, dass man bestimmte Verzeichnisse in den sog. include path aufnehmen soll oder im include path irgendwelche scripts ablegen soll und das meist ohne weitere Erkl&#228;rung. Der Include Path und das Administrieren des Selbigen geh&#246;rt also mehr oder weniger zu den Grundkenntnissen. Dennoch ist es f&#252;r viele ein Mysterium. Da ich gestern ein wenig damit gearbeitet habe, dachte ich, ich blogge mal ein wenig dr&#252;ber. Warum? Weil ichs kann. Und weil ich eine [...]]]></description>
			<content:encoded><![CDATA[<p>Oft liest man, dass man bestimmte Verzeichnisse in den sog. <em><strong>include path</strong></em> aufnehmen soll oder im <em>include path</em> irgendwelche scripts ablegen soll und das meist ohne weitere Erkl&auml;rung. Der <em>Include Path</em> und das Administrieren des Selbigen geh&ouml;rt also mehr oder weniger zu den Grundkenntnissen. Dennoch ist es f&uuml;r viele ein Mysterium.<br />
	Da ich gestern ein wenig damit gearbeitet habe, dachte ich, ich blogge mal ein wenig dr&uuml;ber. Warum? Weil ichs kann. Und weil ich eine kleine Hilfestellung zum Thema <em>path</em> im Allgemeinen und dem <em>PHP include path</em> im Speziellen zur Verf&uuml;gung stellen m&ouml;chte.</p>
<p><span id="more-212"></span></p>
<p>&nbsp;</p>
<h3>Was ist ein (include) path?</h3>
<p>Das Wichtigste vorweg: was ist ein <em>path</em> eigentlich? Der <em>path</em> ist eine Variable, welche einem System eine Sammlung von Verzeichnis-Pfaden angibt. In diesen Verzeichnissen sucht das System Bibilotheken oder ausf&uuml;hrbare Dateien. Linux beispielsweise verwaltet den &nbsp;<em>path</em> in der <strong><em>PATH</em></strong>-Variable welche wie folgt aussieht:</p>
<pre class="php" name="code">[ghost@spacebox ~]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/var/lib/gems/1.8/bin</pre>
<p>Die Verzeichnisse werden durch einen Doppelpunkt &quot;:&quot; getrennt.</p>
<p>Gibt man in der BASH nun einen Befehl ein, durchsucht das System die Verzeichnisse, welche im PATH angegeben sind, ob eine ausf&uuml;hrbare Datei existiert, deren Namen dem eingegeben Befehl entspricht und f&uuml;hrt dieses script oder diese binary im Anschluss daran aus.</p>
<p>In PHP&nbsp;gibt es auch einen <em>path</em>: den <strong><em>include path</em></strong>. Diese Variable wird in der <em>php.ini</em> gesetzt und gibt die Verzeichnisse an, in denen include-Dateien zu finden sind.</p>
<p>&nbsp;</p>
<h3>Wie funktioniert der include path?</h3>
<p>Verwendet man in seinem script nun <em>require, require_once, include</em> oder <em>include</em><em>_once</em>, versucht PHP den Dateinamen in den, im <em>include path</em> angegebenen, Verzeichnissen zu finden. Da der erste Eintrag im <em>include path</em> &quot;<em><strong>.</strong></em>&quot; ist, welcher dem aktuellen Arbeitsverzeichnis des scripts entspricht, durchsucht PHP dabei zuerst das Verzeichnis, in dem das Script ausgef&uuml;hrt wird.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3>Wie trage ich ein Verzeichnis in den include path ein?</h3>
<p>Wir bereits erw&auml;hnt, wird der <em>include path</em> in der <em><strong>php.ini</strong></em> gesetzt. Die entsprechende Variable kann jederzeit um weitere Pfade erwetiert werden.</p>
<p><strong>Beispiel:</strong></p>
<pre class="php" name="code">include_path = &quot;.:/usr/share/php&quot;</pre>
<p>wird zu:</p>
<pre class="php" name="code">include_path = &quot;.:/usr/share/php:/usr/lib/php&quot;</pre>
<p>Des Weiteren gibt es die M&ouml;glichkeit, den <em>include path</em> f&uuml;r das aktuelle Script anzupassen. Dazu stehen die Funktionen <strong><em>set_include_path()</em></strong> und <em><strong>get_include_path()</strong></em> zur Verf&uuml;gung.</p>
<p><strong>Beispiel:</strong></p>
<pre class="php" name="code">&lt;?php
&nbsp; &nbsp;&nbsp;
&nbsp; &nbsp; set_include_path(get_include_path() . &#39;:/usr/lib/php&#39;);</pre>
<p>Mit der Funktion <strong><em>restore_include_path()</em></strong> kann der originale <em>include path</em> wiederhergestellt werden.</p>
<p>&nbsp;</p>
<h3>Zus&auml;tzliches know how</h3>
<p>Auch die Funktionen <em>fopen, file, file_get_contents</em> und <em>readfile</em> verwenden den <em>include path</em>!</p>
<p>&nbsp;</p>
<p>Ich hoffe, ich konnte euch das Thema <em>path</em> etwas n&auml;her bringen. Fragen d&uuml;rfen nat&uuml;rlich gerne als Kommentar verfasst werden <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/162/linux-apachemysqleclipse-pdt-unter-ubuntu-einrichten/" title="[Linux] Apache/MySQL/Eclipse PDT unter Ubuntu einrichten">[Linux] Apache/MySQL/Eclipse PDT unter Ubuntu einrichten</a></li><li><a href="http://blog.itws.de/763/debian-von-apache-zu-nginx-teil-3-php/" title="Debian: Von Apache zu Nginx &#8211; Teil 3: PHP">Debian: Von Apache zu Nginx &#8211; Teil 3: PHP</a></li><li><a href="http://blog.itws.de/747/debian-von-apache-zu-nginx-teil-1-vorwort/" title="Debian: Von Apache zu Nginx &#8211; Teil 1: Vorwort">Debian: Von Apache zu Nginx &#8211; Teil 1: Vorwort</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=212&amp;md5=0eac8f9660b29c89bc3e596f70af2e66" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/212/php-der-include-path/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Linux] Apache/MySQL/Eclipse PDT unter Ubuntu einrichten</title>
		<link>http://blog.itws.de/162/linux-apachemysqleclipse-pdt-unter-ubuntu-einrichten/</link>
		<comments>http://blog.itws.de/162/linux-apachemysqleclipse-pdt-unter-ubuntu-einrichten/#comments</comments>
		<pubDate>Mon, 03 May 2010 20:45:39 +0000</pubDate>
		<dc:creator>Benny</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.itws.de/?p=162</guid>
		<description><![CDATA[Hier eine kurze Anleitung wie man sich unter einem aktuellen Ubuntu eine Entwicklungsumgebung mit Apache, MySQL und PDT einrichtet. &#160; Schritt 1: Das Arbeitsverzeichnis Zuerst legen wir uns ein Arbeitsverzeichnis an, der Eclipse-Workspace. Hier werden sp&#228;ter die Projekte abgelegt. Au&#223;erdem dient das Verzeichnis als DocumentRoot f&#252;r den Apache: ghost@spacebox:~$ mkdir workspace Fertig. Langweilig, ich wei&#223; &#160; Schritt 2: Der Apache Installieren des Apachen mit mod_php5: ghost@spacebox:~$ sudo aptitude install apache2 libapache2-mod-php5 Einrichten der DocumentRoot: ghost@spacebox:~$ [...]]]></description>
			<content:encoded><![CDATA[<p>Hier eine kurze Anleitung wie man sich unter einem aktuellen Ubuntu eine Entwicklungsumgebung mit Apache, MySQL und PDT einrichtet.</p>
<p>&nbsp;</p>
<h2>Schritt 1: Das Arbeitsverzeichnis</h2>
<p>Zuerst legen wir uns ein Arbeitsverzeichnis an, der Eclipse-Workspace. Hier werden sp&auml;ter die Projekte abgelegt. Au&szlig;erdem dient das Verzeichnis als DocumentRoot f&uuml;r den Apache:</p>
<pre class="php" name="code">ghost@spacebox:~$ mkdir workspace</pre>
<p>Fertig. Langweilig, ich wei&szlig; <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<h2>Schritt 2: Der Apache</h2>
<p>Installieren des Apachen mit mod_php5:</p>
<pre class="php" name="code">ghost@spacebox:~$ sudo aptitude install apache2 libapache2-mod-php5
</pre>
<p>Einrichten der DocumentRoot:</p>
<pre class="php" name="code">ghost@spacebox:~$ sudo vim /etc/apache2/sites-avilable/default
</pre>
<p>Es &ouml;ffnet sich der vim mit der default site, welche wir wie folgt anpassen ([i] zum Bearbeiten):</p>
<pre class="php" name="code">&lt;VirtualHost *:80&gt;
    DocumentRoot /home/ghost/workspace

    &lt;Directory /&gt;
        Options FollowSymLinks
        AllowOverride None
    &lt;/Directory&gt;

    &lt;Directory /home/ghost/workspace&gt;
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    &lt;/Directory&gt;

    (...)
&lt;/VirtualHost&gt;
</pre>
<p>[esc], &quot;:wq&quot;, [enter] speichert und schlie&szlig;t die Datei.</p>
<p>Anschlie&szlig;end muss der Apache reloaded werden, das funktioniert wie folgt:</p>
<pre class="php" name="code">ghost@spacebox:~$ sudo /etc/init.d/apache reload
</pre>
<p>Zum Testen legen wir innerhalb des workspace-Verzeichnisses eine index.php an:</p>
<pre class="php" name="code">ghost@spacebox:~$ cd workspace
ghost@spacebox:~/workspace$ echo &#39;Hallo Welt!&#39;&nbsp; &gt; index.php
</pre>
<p>Im Anschluss dazu rufen wir im Browser die URL &quot;http://localhost/index.php&quot; auf.<br />
	Wir erhalten eine wei&szlig;e Seite und ein &quot;Hallo Welt!&quot;.</p>
<p>&nbsp;</p>
<h2>Schritt 3: Der MySQL-Server</h2>
<p>Zuerst den MySQL-Server und den Client installieren:</p>
<pre class="php" name="code">ghost@spacebox:~$sudo aptitude install mysql-client-5.1 mysql-server-5.1
</pre>
<p>W&auml;hrend der Installation wird man dazu aufgefordert ein root-Passwort f&uuml;r den MySQL-Server festzulegen, dort ein beliebiges Passwort eingeben und selbiges bitte merken <img src='http://blog.itws.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>anschlie&szlig;end ein Verbindungstest zum Server:</p>
<pre class="php" name="code">ghost@spacebox:~$ mysql -h localhost -u root -p
</pre>
<p>Nach der Eingabe des korrekten Passworts, welches wir eben bei der Installation festgelegt haben, startet die mysql-Shell:</p>
<pre class="php" name="code">Welcome to the MySQL monitor.&nbsp; Commands end with ; or \g.
Your MySQL connection id is 34
Server version: 5.1.41-3ubuntu12 (Ubuntu)

Type &#39;help;&#39; or &#39;\h&#39; for help. Type &#39;\c&#39; to clear the current input statement.

mysql&gt;
&nbsp;
</pre>
<p>&nbsp;</p>
<h2>Schritt 4: Die PDT</h2>
<p>Die PHP Development Tools ist eine auf Eclipse basierende Entwicklungsumgebung f&uuml;r PHP.</p>
<p>Zuerst laden wir uns das tar.gz-Archiv, welches wir auf der offiziellen Website finden und entpacken dieses anschlie&szlig;end nach /opt/eclpse:</p>
<pre class="php" name="code">ghost@spacebox:~/Desktop$ sudo tar xvzf eclipse.tar.gz -C /opt/
</pre>
<p>&Uuml;ber einen Rechtsklick auf das Gnome bzw KDE-Men&uuml; kann mit Hilfe des &quot;Men&uuml; bearbeiten&quot;-Tools ein Men&uuml;-Eintrag f&uuml;r Eclipse angelegt werden. Der Befehl zum starten von Eclipse lautet:</p>
<pre class="php" name="code">/opt/eclipse/eclipse
</pre>
<p>&nbsp;</p>
<p>Nun stehen&nbsp; Apache und MySQL zusammen mit PDT zur Verf&uuml;gung. Der Apache und der MySQL-Server starten bei jedem Booten des Systems automatisch und m&uuml;ssen daher nicht manuell gestartet werden.</p>
<h4  class="related_post_title">Ähnliche Artikel</h4><ul class="related_post"><li><a href="http://blog.itws.de/747/debian-von-apache-zu-nginx-teil-1-vorwort/" title="Debian: Von Apache zu Nginx &#8211; Teil 1: Vorwort">Debian: Von Apache zu Nginx &#8211; Teil 1: Vorwort</a></li><li><a href="http://blog.itws.de/212/php-der-include-path/" title="[PHP] Der include path">[PHP] Der include path</a></li><li><a href="http://blog.itws.de/767/debian-von-apache-zu-nginx-teil-4-einen-tomcat-anbinden/" title="Debian: Von Apache zu Nginx &#8211; Teil 4: Einen Tomcat anbinden">Debian: Von Apache zu Nginx &#8211; Teil 4: Einen Tomcat anbinden</a></li></ul> <p><a href="http://blog.itws.de/?flattrss_redirect&amp;id=162&amp;md5=5ed7bdac691f1aa62af601a9a0052c2e" title="Flattr" target="_blank"><img src="http://blog.itws.de/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.itws.de/162/linux-apachemysqleclipse-pdt-unter-ubuntu-einrichten/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

