<?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>kj187</title>
	<atom:link href="http://blog.kj187.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.kj187.de</link>
	<description>Blog von Julian Kleinhans</description>
	<lastBuildDate>Sun, 22 Jan 2012 11:28:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.3</generator>
		<item>
		<title>typo3-tutorials.org Update online</title>
		<link>http://blog.kj187.de/2012/01/21/typo3-tutorials-org-update-online/</link>
		<comments>http://blog.kj187.de/2012/01/21/typo3-tutorials-org-update-online/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 23:12:42 +0000</pubDate>
		<dc:creator>Julian Kleinhans</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[TYPO3]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://blog.kj187.de/?p=304</guid>
		<description><![CDATA[Vor wenigen Minuten ist ein größeres Update der typo3-tutorials.org Webseite online gegangen. Das meiste davon ist unter der Haube passiert, wie zB. ein Update auf die aktuellste FLOW3 Version und einige Refakturierungen am Code. Aber auch an der Oberfläche gibt es ein paar Neuigkeiten. So wurde zB. die Hauptnavigation komplett neugeschrieben und verbessert, eine TagCloud [...]]]></description>
			<content:encoded><![CDATA[
<p>Vor wenigen Minuten ist ein größeres Update der <a href="http://www.typo3-tutorials.org" onclick="pageTracker._trackPageview('/outgoing/www.typo3-tutorials.org?referer=');">typo3-tutorials.org</a> Webseite online gegangen. Das meiste davon ist unter der Haube passiert, wie zB. ein Update auf die aktuellste <a href="http://www.flow3.org" onclick="pageTracker._trackPageview('/outgoing/www.flow3.org?referer=');">FLOW3</a> Version und einige Refakturierungen am Code. Aber auch an der Oberfläche gibt es ein paar Neuigkeiten. So wurde zB. die Hauptnavigation komplett neugeschrieben und verbessert, eine TagCloud wurde hinzugefügt, alle Tutorials wurden optisch verbessert und fehlende Bilder wurden dank der Waybackmachine wieder hinzugefügt. Eine weitere Grunderneuerung findet man im Bereich &#8220;Tutorial hinzufügen&#8221;. So wurde von einem BBCode Editor auf einen WYSIWYG Editor gewechselt, was das Schreiben der Tutorials deutlich verbessern soll.</p>
<p>Für die nächste Version ist wieder einiges in Planung. So stehen zB folgende Dinge auf der Roadmap</p>
<ul>
<li><strong>Inhalte (neue Tutorials)</strong></li>
<li>Lokalisierung (deutsch/englisch)</li>
<li>Anbindung von Youtube Videos</li>
<li>Anbindung von externen Tutorials</li>
<li>Favoriten Box</li>
<li>Dashboard für eingeloggte User</li>
</ul>
<p>und vieles vieles mehr.</p>
<p>Wer übrigens mit an dem Projekt arbeiten möchte ist herzlichst eingeladen. Einfach bei mir melden.<br />
Ebenfalls suchen wir noch nach Sponsoren, hier gibt es mehrere Möglichkeiten, auch hier einfach bei mir melden wenn Interesse besteht</p>
<p><a href="http://www.typo3-tutorials.org/wunschzettel.html" onclick="pageTracker._trackPageview('/outgoing/www.typo3-tutorials.org/wunschzettel.html?referer=');">Tutorial Wünsche können hier aufgegeben werden</a> ;-)</p>
<p>Euer Julian (kj187)</p>

]]></content:encoded>
			<wfw:commentRss>http://blog.kj187.de/2012/01/21/typo3-tutorials-org-update-online/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>typo3-tutorials.org Relaunch auf Basis von FLOW3</title>
		<link>http://blog.kj187.de/2011/08/09/typo3-tutorials-org-relaunch-auf-basis-von-flow3/</link>
		<comments>http://blog.kj187.de/2011/08/09/typo3-tutorials-org-relaunch-auf-basis-von-flow3/#comments</comments>
		<pubDate>Tue, 09 Aug 2011 14:38:38 +0000</pubDate>
		<dc:creator>Julian Kleinhans</dc:creator>
				<category><![CDATA[TYPO3]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://blog.kj187.de/?p=298</guid>
		<description><![CDATA[Als eines der ersten FLOW3 [1] Piloten Projekte weltweit, ist nun unter dem Motto &#8220;the power is knowhow&#8221;, die TYPO3 Tutorials Plattform [2] mit einem neuen Gesicht und einer komplett neuen Infrastruktur online gegangen. Mit der Plattform will Gründer und Hauptentwickler Julian Kleinhans dafür sorgen, das Anfänger, Fortgeschrittene und auch Profis, Ihr Wissen teilen und [...]]]></description>
			<content:encoded><![CDATA[
<p>Als eines der ersten FLOW3 [1] Piloten Projekte weltweit, ist nun unter dem Motto &#8220;the power is knowhow&#8221;, die TYPO3 Tutorials Plattform [2] mit einem neuen Gesicht und einer komplett neuen Infrastruktur online gegangen. Mit der Plattform will Gründer und Hauptentwickler Julian Kleinhans dafür sorgen, das Anfänger, Fortgeschrittene und auch Profis, Ihr Wissen teilen und anderen zur Verfügung stellen.</p>
<p>Da es nach knapp 4 Jahren Stillstand Zeit wurde eine neue technische Basis zu schaffen, wurde Mitte 2009 damit begonnen über einen Relaunch nachzudenken. Statt wieder auf das Content Management System TYPO3 selbst zu setzen, hat sich Julian Kleinhans aus persönlicher Interesse, schon recht früh für das neue PHP Application Framework FLOW3 entschieden. Kurz vor dem ersten Beta Release von FLOW3, ist nun die erste Version des neuen Internetauftritts online.</p>
<p>Das schlichte Design wirkt nun mehr aufgeräumt, ein Slider auf der Startseite zeigt immer die letzten zehn Tutorials aus allen Kategorien an. Autoren haben die Möglichkeit durch Angabe Ihrer Paypal Adresse spenden für Ihre geschriebenen Tutorials zu empfangen. Andere Dienste wie Flattr sind in Planung. Erstes Ziel ist es reichlich Feedback, Kritik und Verbesserungsvorschläge zu sammeln. Für die nächsten Versionen stehen dann schon einige weitere Features an. Beispielsweise ein Dashboard für eingeloggte Benutzer mit einer Übersicht über die eigenen Tutorials, eine Favoriten Box in der man seine persönlichen Favoriten pflegen kann, ein vernünftiges Bewertungssystem und und und.</p>
<p>Bei Fragen, Kritik, Lob oder Verbesserungsvorschlägen wenden Sie sich an: info -at- typo3-tutorials -dot- org</p>
<p>[1] <a href="http://flow3.org" target="_blank" onclick="pageTracker._trackPageview('/outgoing/flow3.org?referer=');">http://flow3.org</a><br />
[2] <a href="http://www.typo3-tutorials.org" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.typo3-tutorials.org?referer=');">http://www.typo3-tutorials.org</a></p>

]]></content:encoded>
			<wfw:commentRss>http://blog.kj187.de/2011/08/09/typo3-tutorials-org-relaunch-auf-basis-von-flow3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TYPO3 Stellenangebot</title>
		<link>http://blog.kj187.de/2011/02/01/typo3-stellenangebot/</link>
		<comments>http://blog.kj187.de/2011/02/01/typo3-stellenangebot/#comments</comments>
		<pubDate>Tue, 01 Feb 2011 09:53:01 +0000</pubDate>
		<dc:creator>Julian Kleinhans</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Privat]]></category>
		<category><![CDATA[TYPO3]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://blog.kj187.de/?p=268</guid>
		<description><![CDATA[Born to Code ? Die Bergisch Media GmbH ist seit 2005 Online-Marketing-Spezialist für die technische Konzeption und Realisierung professioneller Internet-Anwendungen für mittelständische Unternehmen und bietet ganzheitliche Lösungen in den Bereichen E-Commerce, Content-Management-Systeme, Konzeption und Design. Wir expandieren weiter und suchen zum nächstmöglichen Zeitpunkt eine/n engagierte/n TYPO3 Entwickler (m/w) Deine Aufgaben Technische Konzeption von kleinen bis [...]]]></description>
			<content:encoded><![CDATA[
<p><em><strong>Born to Code ?</strong></em></p>
<p>Die Bergisch Media GmbH ist seit 2005 Online-Marketing-Spezialist für die technische Konzeption und Realisierung professioneller Internet-Anwendungen für mittelständische Unternehmen und bietet ganzheitliche Lösungen in den Bereichen E-Commerce, Content-Management-Systeme, Konzeption und Design.</p>
<p>Wir expandieren weiter und suchen zum nächstmöglichen Zeitpunkt eine/n engagierte/n</p>
<h2><strong>TYPO3 Entwickler (m/w)</strong></h2>
<p>Deine Aufgaben</p>
<ul>
<li>Technische Konzeption von kleinen bis großen TYPO3 Projekten</li>
<li>Entwicklung komplexer, individueller TYPO3 Projekte</li>
<li>Programmierung kundenspezifischer TYPO3 Extensions</li>
<li>Objektorientierte Programmierung (OOP) in PHP5 unter Verwendung von Design Patterns und Unit Tests</li>
</ul>
<p>Dein Profil</p>
<ul>
<li>2-3 Jahre Berufserfahrung in der Softwareentwicklung mit Internettechnologien</li>
<li>Außerordentlich hohe Internetaffinität</li>
<li>Umfangreiche TYPO3 Kenntnisse aus Entwicklersicht</li>
<li>Fundierte Kenntnisse in MySQL, HTML, CSS, PHP &amp; JavaScript</li>
<li>Sehr gute Kenntnisse in TypoScript</li>
<li>Sehr gute Kenntnisse in objektorientierter PHP Programmierung</li>
<li>Zuverlässigkeit</li>
<li>Pflichtbewusstsein</li>
</ul>
<p>Von Vorteil</p>
<ul>
<li>Erfahrung mit Extbase und Fluid</li>
<li>Erfahrung mit FLOW3</li>
<li>TYPO3 certified integrator</li>
</ul>
<p>Wir bieten dir</p>
<ul>
<li>Ein professionelles und modernes Arbeitsumfeld</li>
<li>Eine offene Unternehmenskultur mit flachen Hierarchien und schnellen Entscheidungswegen</li>
<li>Eine schnelle Verantwortungsübernahme und motiviertes Arbeiten in einem jungen, dynamischen Team</li>
</ul>
<p>Einsatzort: Heiligenhaus</p>
<p>Das brauchen wir von dir:<br />
Um einen ersten Eindruck von dir zu gewinnen, schicke uns bitte:</p>
<ul>
<li>Referenzen/Beispiele bereits durchgeführter TYPO3-Projekte</li>
<li>Aussagen über deine PHP-Kenntnisse (OO, PHP5 etc.)</li>
<li>Informationen zu deiner Person und deinem Werdegang (Lebenslauf)</li>
<li>Gehaltsvorstellungen</li>
<li>Informationen zum frühestmöglichen Eintrittstermins</li>
</ul>
<p>Ansprechpartner: Dennis van Almsick<br />
E-Mail: vanalmsick &#8211; at &#8211; bergisch-media &#8211; . &#8211; de<br />
URL: <a href="http://www.bergisch-media.de" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.bergisch-media.de?referer=');">http://www.bergisch-media.de</a></p>
<p>Impressionen &#8211; Verschaffe dir einen Überblick über unsere neuen Räumlichkeiten</p>

<a href='http://blog.kj187.de/2011/02/01/typo3-stellenangebot/165682_1877798423356_1193103733_32392656_71098_n/' title='Impression 1'><img width="150" height="150" src="http://blog.kj187.de/wp-content/uploads/2011/02/165682_1877798423356_1193103733_32392656_71098_n-150x150.jpg" class="attachment-thumbnail colorbox-268" alt="Impression 1" title="Impression 1" /></a>
<a href='http://blog.kj187.de/2011/02/01/typo3-stellenangebot/166839_1877794463257_1193103733_32392653_4550991_n/' title='Impression 2'><img width="150" height="150" src="http://blog.kj187.de/wp-content/uploads/2011/02/166839_1877794463257_1193103733_32392653_4550991_n-150x150.jpg" class="attachment-thumbnail colorbox-268" alt="Impression 2" title="Impression 2" /></a>
<a href='http://blog.kj187.de/2011/02/01/typo3-stellenangebot/167897_1877800103398_1193103733_32392658_6017522_n/' title='Impression 3'><img width="150" height="150" src="http://blog.kj187.de/wp-content/uploads/2011/02/167897_1877800103398_1193103733_32392658_6017522_n-150x150.jpg" class="attachment-thumbnail colorbox-268" alt="Impression 3" title="Impression 3" /></a>
<a href='http://blog.kj187.de/2011/02/01/typo3-stellenangebot/167979_1877808623611_1193103733_32392666_1789190_n/' title='Impression 4'><img width="150" height="150" src="http://blog.kj187.de/wp-content/uploads/2011/02/167979_1877808623611_1193103733_32392666_1789190_n-150x150.jpg" class="attachment-thumbnail colorbox-268" alt="Impression 4" title="Impression 4" /></a>
<a href='http://blog.kj187.de/2011/02/01/typo3-stellenangebot/168695_1877796663312_1193103733_32392655_4947876_n/' title='Impression 5'><img width="150" height="150" src="http://blog.kj187.de/wp-content/uploads/2011/02/168695_1877796663312_1193103733_32392655_4947876_n-150x150.jpg" class="attachment-thumbnail colorbox-268" alt="Impression 5" title="Impression 5" /></a>
<a href='http://blog.kj187.de/2011/02/01/typo3-stellenangebot/169002_1877815423781_1193103733_32392670_1934825_n/' title='Impression 6'><img width="150" height="150" src="http://blog.kj187.de/wp-content/uploads/2011/02/169002_1877815423781_1193103733_32392670_1934825_n-150x150.jpg" class="attachment-thumbnail colorbox-268" alt="Impression 6" title="Impression 6" /></a>


]]></content:encoded>
			<wfw:commentRss>http://blog.kj187.de/2011/02/01/typo3-stellenangebot/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The Newbie’s Guide to Test-Driven Development</title>
		<link>http://blog.kj187.de/2010/08/18/the-newbies-guide-to-test-driven-development/</link>
		<comments>http://blog.kj187.de/2010/08/18/the-newbies-guide-to-test-driven-development/#comments</comments>
		<pubDate>Wed, 18 Aug 2010 09:46:49 +0000</pubDate>
		<dc:creator>Julian Kleinhans</dc:creator>
				<category><![CDATA[Privat]]></category>

		<guid isPermaLink="false">http://blog.kj187.de/?p=259</guid>
		<description><![CDATA[Heute habe ich einen super Artikel gefunden zu Test Driven Development. 
Der Autor, Nikko Bautista schreibt dabei was genau Test Driven Development ist, wie es arbeitet, warum man es einsetzen sollte und wie man es am sinnvollsten nutzt. Eine Super Einführung für Neulinge! Ein Blick lohnt sich aufjedenfall.]]></description>
			<content:encoded><![CDATA[
<p><a href="http://blog.kj187.de/wp-content/uploads/2010/08/tdd.png"><img class="alignright size-full wp-image-260 colorbox-259" title="tdd" src="http://blog.kj187.de/wp-content/uploads/2010/08/tdd.png" alt="" width="200" height="200" /></a>Heute habe ich einen super Artikel gefunden zu <a href="http://net.tutsplus.com/tutorials/php/the-newbies-guide-to-test-driven-development/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/net.tutsplus.com/tutorials/php/the-newbies-guide-to-test-driven-development/?referer=');"><br />
Test Driven Development</a>.</p>
<p>Der Autor, <a href="http://net.tutsplus.com/author/nikko-bautista/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/net.tutsplus.com/author/nikko-bautista/?referer=');">Nikko Bautista</a> schreibt dabei was genau Test Driven Development ist, wie es arbeitet, warum man es einsetzen sollte und wie man es am sinnvollsten nutzt. Eine Super Einführung für Neulinge! Ein Blick lohnt sich aufjedenfall.</p>

]]></content:encoded>
			<wfw:commentRss>http://blog.kj187.de/2010/08/18/the-newbies-guide-to-test-driven-development/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>TYPO3 Agentur &#8211; Bergisch Media</title>
		<link>http://blog.kj187.de/2010/06/28/typo3-agentur-bergisch-media/</link>
		<comments>http://blog.kj187.de/2010/06/28/typo3-agentur-bergisch-media/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 09:40:41 +0000</pubDate>
		<dc:creator>Julian Kleinhans</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Privat]]></category>
		<category><![CDATA[TYPO3]]></category>

		<guid isPermaLink="false">http://blog.kj187.de/?p=251</guid>
		<description><![CDATA[Vor guten 2 Monaten hat es mich arbeitstechnisch zur TYPO3 Agentur Bergisch Media, die seit 2005 besteht und in Heiligenhaus ansässig ist, gezogen. Heute wird es Zeit mal einen ersten Eindruck dazu zu schreiben. In den 2 Monaten habe ich mich relativ schnell eingelebt und fühle mich hier rundum pudelwohl! Nicht nur die Kollegen sind [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://blog.kj187.de/wp-content/uploads/2010/06/bmMediaLogo.gif"><img class="size-full wp-image-252 alignright colorbox-251" title="bmMediaLogo" src="http://blog.kj187.de/wp-content/uploads/2010/06/bmMediaLogo.gif" alt="" width="238" height="68" /></a>Vor guten 2 Monaten hat es mich arbeitstechnisch zur <a title="TYPO3 Agentur" href="http://www.bergisch-media.de" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.bergisch-media.de?referer=');">TYPO3 Agentur Bergisch Media</a>, die seit 2005 besteht und in Heiligenhaus ansässig ist, gezogen. Heute wird es Zeit mal einen ersten Eindruck dazu zu schreiben.</p>
<p>In den 2 Monaten habe ich mich relativ schnell eingelebt und fühle mich hier rundum pudelwohl! Nicht nur die Kollegen sind der hammer, auch die Projekte die mir anvertraut wurden sind äußerst interessant und bieten jede menge Herausforderungen. Auf Qualität wird hier umheimlich geachtet was die starke Kundenzufriedenheit denke ich auch ausmacht. Ich selbst bin ja seit knapp einem halben Jahr auf einem Qualitätstrip, daher ist mir dieser Aspekt hier ziemlich schnell und positiv aufgefallen.</p>
<p>Als TYPO3 Association Silver Member ist die Bergisch Media dieses Jahr mit 3 Mitarbeitern auf den TYPO3 Developer Days vertreten. Ich freue mich dann dort das erste mal für Bergisch Media unterwegs zu sein!</p>

]]></content:encoded>
			<wfw:commentRss>http://blog.kj187.de/2010/06/28/typo3-agentur-bergisch-media/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>t3n Gewinnspiel</title>
		<link>http://blog.kj187.de/2010/06/06/t3n-gewinnspiel/</link>
		<comments>http://blog.kj187.de/2010/06/06/t3n-gewinnspiel/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 15:19:11 +0000</pubDate>
		<dc:creator>Julian Kleinhans</dc:creator>
				<category><![CDATA[Privat]]></category>

		<guid isPermaLink="false">http://blog.kj187.de/?p=239</guid>
		<description><![CDATA[Anlässlich des 20ten Jubiläums von t3n gibt es hier eine Verlosungsaktion! Kurz zu den Fakten: Zu gewinnen gibt es

1. Platz - Aktuelle Ausgabe des Magazins „Zukunft – leckere Webtrends“ + ein Open-Source T-Shirt. 2 + 3 Platz - Aktuelle Ausgabe des Magazins „Zukunft – leckere Webtrends“
]]></description>
			<content:encoded><![CDATA[
<p>Anlässlich des 20ten Jubiläums von <a href="http://t3n.de" target="_blank" onclick="pageTracker._trackPageview('/outgoing/t3n.de?referer=');">t3n</a> gibt es hier eine Verlosungsaktion!<a href="http://blog.kj187.de/wp-content/uploads/2010/06/t3n-Cover_Nr20.jpg"><img class="alignright size-full wp-image-240 colorbox-239" title="t3n-Cover_Nr20" src="http://blog.kj187.de/wp-content/uploads/2010/06/t3n-Cover_Nr20.jpg" alt="" width="176" height="249" /></a><br />
Kurz zu den Fakten: Zu gewinnen gibt es</p>
<p><strong>1. Platz</strong><br />
Aktuelle Ausgabe des Magazins „Zukunft – leckere Webtrends“ + ein Open-Source T-Shirt</p>
<p><strong>2 + 3 Platz</strong><br />
Aktuelle Ausgabe des Magazins „Zukunft – leckere Webtrends“</p>
<p>Einen Einblick in die aktuelle Ausgabe gibt es <a href="http://t3n.de/app/to/db2e8032d8" target="_blank" onclick="pageTracker._trackPageview('/outgoing/t3n.de/app/to/db2e8032d8?referer=');">hier</a>!</p>
<p>Ok, wie könnt Ihr teilnehmen ? Das ist relativ einfach, hinerlasst hier einen Kommentar oder ein Track-/Pingback auf dieses Seite. Ich werde dann nach dem Zufallsprinzip die jeweiligen Gewinner bestimmen.<br />
Die Gewinne werden dann direkt von t3n versendet. Damit ich Kontakt zu den Gewinnern aufnehmen kann ist es wichtig das Ihr eine gültige E-Mail Adresse hinterlasst!</p>
<p>Den Gewinner des Platz 1. wird am 11.06 bestimmt und kontaktiert.<br />
Die Gewinner von Platz 2 und 3 werden am 18.06 bestimmt und kontaktiert.</p>
<p>Viel spass und glück :-)</p>
<p>PS: Wenn Ihr das Magazin dann habt, schenkt den Seiten 122/123 besonders Aufmerksamkeit&#8230; der Artikel ist von mir :-) &#8220;<strong>TYPO3 und AJAX</strong>&#8221;</p>
<p><strong>EDIT: Alle Gewinner wurden informiert! Damit ist das Gewinnspiel offiziell vorbei :-) Aber schon bald wird es ein neues geben!</strong></p>

]]></content:encoded>
			<wfw:commentRss>http://blog.kj187.de/2010/06/06/t3n-gewinnspiel/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>TYPO3 Developer Days 2010</title>
		<link>http://blog.kj187.de/2010/04/06/typo3-developer-days-2010/</link>
		<comments>http://blog.kj187.de/2010/04/06/typo3-developer-days-2010/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 20:07:11 +0000</pubDate>
		<dc:creator>Julian Kleinhans</dc:creator>
				<category><![CDATA[TYPO3]]></category>
		<category><![CDATA[T3DD10]]></category>

		<guid isPermaLink="false">http://blog.kj187.de/?p=226</guid>
		<description><![CDATA[Vor knapp 6 Tagen wurde die offizielle Anmeldung zu den TYPO3 Developer Days 2010 &#8211; T3DD10 &#8211; unter dem Motto &#8220;Getting things done&#8221; eröffnet. Es stehen rund 200 Tickets zur Verfügung wovon nach 1.5 Tagen schon knapp 50% weg waren. Der Ansturm ist also auch in diesem Jahr wieder enorm. Wie auch im letzten Jahr [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://t3dd10.typo3.org" onclick="pageTracker._trackPageview('/outgoing/t3dd10.typo3.org?referer=');"><img class="alignleft size-full wp-image-227 colorbox-226" title="T3DD10_AD_T3O" src="http://blog.kj187.de/wp-content/uploads/2010/04/T3DD10_AD_T3O.gif" alt="" width="180" height="120" /></a>Vor knapp 6 Tagen wurde die offizielle Anmeldung zu den TYPO3 Developer Days 2010 &#8211; T3DD10 &#8211; unter dem Motto &#8220;<strong>Getting things done</strong>&#8221; eröffnet. Es stehen rund 200 Tickets zur Verfügung wovon <a href="http://twitter.com/t3dd/statuses/11438890669" target="_blank" onclick="pageTracker._trackPageview('/outgoing/twitter.com/t3dd/statuses/11438890669?referer=');">nach 1.5 Tagen schon knapp 50% weg waren</a>. Der Ansturm ist also auch in diesem Jahr wieder enorm. Wie auch im letzten Jahr findet das Event im kleinen und netten <a href="http://de.wikipedia.org/wiki/Elmshorn" target="_blank" onclick="pageTracker._trackPageview('/outgoing/de.wikipedia.org/wiki/Elmshorn?referer=');">Elmshorn</a> vom 01 &#8211; 04 Juli in der nähe von Hamburg statt. Wer teilnehmen möchte sollte nicht lange überlegen und sich ein Ticket besorgen. Das ganze könnt Ihr Online auf der <a href="http://t3dd10.typo3.org" target="_blank" onclick="pageTracker._trackPageview('/outgoing/t3dd10.typo3.org?referer=');">offiziellen Event Seite</a> machen. Zu beachten ist, das es einen early bird gibt, der nur zum Vorteil für Association Mitglieder und und Studenten ist. Dieser geht bis zum 30.4. Danach senkt sich der reguläre Preis um knapp 100 €. Wer kein Association Member und kein Student ist und bedenken hat er bekommt kein Ticket mehr, sollte die 100 € investieren oder noch besser, <a href="http://association.typo3.org/membership/membership-registration/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/association.typo3.org/membership/membership-registration/?referer=');">Association Mitglied werden</a> :-) Achtet darauf das Ihr euch zusätzlich noch um eine Bleibe kümmern müsst, auch dazu findet Ihr Informationen auf der <a href="http://t3dd10.typo3.org/travel-hotel/hotel/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/t3dd10.typo3.org/travel-hotel/hotel/?referer=');">Event Seite</a>.</p>
<p>In diesem Jahr läuft alles unter dem Motto &#8220;Getting things done&#8221; was bedeuten wird, das es keine gewohnten Vorträge mehr gibt, sondern  eher Workshops. Jeder Workshop soll dabei auf maximal 20 Teilnehmer begrenzt werden und knapp 4 Stunden gehen. Es soll jeweils 3 verschiedene Worksphops parallel ablaufen.</p>
<p>Ich werde da sein und bestimmt den ein und anderen Blog Eintrag live aus Elmshorn posten!</p>

]]></content:encoded>
			<wfw:commentRss>http://blog.kj187.de/2010/04/06/typo3-developer-days-2010/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Exception Handling</title>
		<link>http://blog.kj187.de/2010/03/22/exception-handling/</link>
		<comments>http://blog.kj187.de/2010/03/22/exception-handling/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 07:36:39 +0000</pubDate>
		<dc:creator>Julian Kleinhans</dc:creator>
				<category><![CDATA[OOP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ausnahmezustand]]></category>
		<category><![CDATA[Error]]></category>
		<category><![CDATA[Exception Handling]]></category>

		<guid isPermaLink="false">http://blog.kj187.de/?p=199</guid>
		<description><![CDATA[Exceptions sind Ausnahmezustände die eine Möglichkeit bieten auf verschiedene kritische Bedingungen bzw. Fehler während des Programmablaufs zu reagieren. Mit diesem Artikel möchte ich euch eine kleine Einführung in die Welt des Exception Handlings geben. Speziell gewidmet für meinen Arbeitskollegen David, der sich dieses Thema als Blogartikel von mir gewünscht hat.]]></description>
			<content:encoded><![CDATA[
<p>Diesen Artikel über Exception Handling widme ich meinem Arbeitskollegen David der sich dieses Thema von mir gewünscht hat :-)</p>
<p>Wollen wir auch sofort zum Thema kommen! Um es in einem Satz zu sagen: Exceptions sind Ausnahmezustände die eine Möglichkeit bieten auf verschiedene kritische Bedingungen bzw. Fehler während des Programmablaufs zu reagieren. BAM!</p>
<p>Geschnallt ? :-)  Wenn nicht, nicht schlimm! Der Artikel fängt ja jetzt erst richtig an!</p>
<p>Um bei meiner lieblings Sprache zu bleiben, das Exception Handling gibt es in PHP erst seit der Version 5. Dort ist Sie standardmäßig dabei! Es muss also nix installiert, konfiguriert oder aktiviert werden! Wenn Ihr also noch mit PHP 4 arbeitet, leuteee, geht mit der Zeit :-)</p>
<p>Ok, das Exception Handling bietet uns also eine Möglichkeit! Wie sieht diese Möglichkeit aus? In PHP und auch in andere Sprachen gibt es das try und catch Konstrukt. Mit throw werfen wir einen Fehler und mit catch fangen wir diesen Fehler und können entsprechend auf diesen reagieren! Um das Fangen von Exceptions zu ermöglichen, muss der jeweilige Code in dem wir einen Fehler vermuten würden in einem try Block umschlossen werden. Dabei muss jeder try Block mindestens einen catch Block besitzen! Mehrere catch Blöcke sind dabei natürlich zu genaueren Filterung von Fehlern möglich.</p>
<p>Damit wir uns das ein bischen besser vorstellen können gibts dazu auch direkt ein Beispiel</p>
<pre class="brush: php;">class TestClass {
    public function sayHello($name) {
        if (!$name) {
            throw new Exception('Der Name fehlt!');
        } else {
            echo 'Hello ' . $name;
        }
    }
}

$object = new TestClass;

try {
    $object-&gt;sayHello('Julian');
    $object-&gt;sayHello('');
    $object-&gt;sayHello('David');
} catch (Exception $error) {
    echo 'Exception abgefangen: ' . $error-&gt;getMessage();
}

echo 'Schönen Tag wünsche ich!';</pre>
<p>Wir haben also eine Klasse TestClass. Diese besitzt eine Methode sayHello die uns freundlicherweise begrüßt wenn wir Ihr als Parameter einen Namen mit übergeben. Nette Methode oder ? Doch wenn wir Ihr unseren Namen nicht veraten ist das recht unfreundlich, daher wird Sie uns auch nicht Hallo sagen sondern wird mit einem Fehler schmeißen und uns darauf aufmerksam machen wollen!</p>
<p>Wir instanzieren also ein Objekt der Klasse TestClass. Dann kommt der try Block in dem wir unseren Code schreiben in dem wir evtl einen Fehler vermuten würden. Wir rufen die Methode sayHello auf und übergeben Ihr einen Namen &#8220;Julian&#8221;. &#8220;Julian&#8221;, in dem Fall ich, wird begrüßt! Dann rufen wir die Methode auf vergessen Ihr aber unseren Namen zu sagen! Oh Oh&#8230; Was macht die Methode, Sie wirft per throw eine Exception! Unser try catch Block bekommt davon sofort Wind und fängt diesen Fehler per catch ab!</p>
<p>Wie sieht unsere Ausgabe eigentlich aus ?</p>
<p>Hello Julian<br />
Exception abgefangen: Der Name fehlt!<br />
Schönen Tag wünsche ich!</p>
<p>Aber hey, ich habe nachdem ich bemerkt habe das ich meinen Namen vergessen hab doch direkt einen weiteren Aufruf hingeknallt! Warum wird David also nicht begrüßt ? Das ist ganz einfach! Nachdem in einem try Block eine Exception geworfen wurde wird innerherhalb des try Blocks nichts mehr ausgeführt! Der try Block wird also sofort verlassen und der rest des Scripts wird ausgeführt, daher wird uns also noch ein schöner Tag gewünscht!</p>
<p>Gut das Beispiel ist etwas blöd um den Sinn hinter dem Exception Handling zu demonstieren weil in diesem Beispiel hätten wir ja auch alles einfach über eine if else Bedingung steuern können. Exception Handling ist eigentlich auch nichts anderes wenn man es man grob betrachtet. Aber es bringt doch etliche Vorteile mit! Man braucht sich nicht mehr um Rückgabewerte kümmern, man schmeisst per throw einfach den Fehler! In etwas komplexeren Szenen kommt dort der Sinn und Zweck schon deutlich zum Vorschein! Würdet Ihr mit dem if Konstrukt arbeiten würdet Ihr sehr schnell in einem tiefen verschachtelten Dschungel landen :-)</p>
<p>Wollt Ihr verschiedene Arten von Fehlern behandeln, empfiehlt es sich, mit unterschiedlichen Fehlerklassen zu arbeiten. Höö?<br />
Ja Ihr werdet staunen, aber wir können sehr einfach eigene Exception Klassen erstellen. Beispiel:</p>
<pre class="brush: php;">class unfreundlicherUser extends Exception {
    public function __construct($message) {
        parent::__construct($message);
    }
}</pre>
<p>Wichtig dabei ist das a) unsere Klasse von der Basisklasse Exception erbt und b) das wir einen Konstruktor definieren damit die Fehlermeldung aufgenommen werden kann!<br />
Unseren obigen Code könnten wir also wie folgt ändern, Ausgangsbasis ist, das uns der User verarschen will und einfach ein &#8220;x&#8221; eingibt weil er weiss das er was übergeben muss! Aber unser Programm soll auf eine Eingabe von einem &#8220;x&#8221; mit einem Fehler um sich schmeißen :-)</p>
<pre class="brush: php;">class TestClass {

    public function sayHello($name) {
        if (!$name) {
            throw new Exception('Der Name fehlt!');
        } elseif ('x' === $name) {
            throw new unfreundlicherUser('Ah Mr. X will uns seinen Namen nicht veraten!');
        } else {
            echo 'Hello ' . $name;
        }
    }

}

$object = new TestClass;

try {
    $object-&gt;sayHello('Julian');
    $object-&gt;sayHello('x');
} catch (Exception $error) {
    echo 'Exception abgefangen: ' . $error-&gt;getMessage();
} catch (unfreundlicherUser $error) {
    echo 'Exception abgefangen: ' . $error-&gt;getMessage();
}

$object-&gt;sayHello('David');</pre>
<p>Wie wir sehen hat sich der Code erweitert. In der Methode sayHello wurde die Abfrage eingebaut wo der Name mit dem &#8220;x&#8221; verglichen wird. Hat der User also nur ein &#8220;x&#8221; eingegeben wird eine Exception vom Typ unfreundlichenUser geschmissen die wir vorher selbst definiert haben. An unseren ersten catch Block haben wir einen weiteren gehangen in dem die Fehler vom Typ unfreundlichenUser gefangen werden.</p>
<p>Ist doch super! Wir können also auf alle verschiedenen Fehler verschiedenen reagieren!</p>
<p>In unserem catch Block haben wir nebem getMessage noch mehrere Methoden die uns zur Verfügung stehen.<br />
Darunter zählen</p>
<p>- getCode() zur Ausgabe eines Fehlercodes<br />
- getFile() zur Ausgabe des Dateinamens in dem der Fehler geschmissen wurde<br />
- getLine() die Zeile in dem der Fehler geschmissen wurde<br />
- getTrace() liefert ein Array mit dem Stacktrace<br />
- getTraceAsString() liefert den Stacktrace nicht als Array sondern als String</p>
<p>Wir sehen, es stehen uns reichlich Mittel zur Verfügung um auf jeden Fehler zu reagieren!</p>
<p>Ich hoffe mein Kollege David konnte sich mit dem Thema Exceptions jetzt ein wenig anfreunden und wird es in Zukunft in allen Projekten einsetzen :-)<br />
Ich bin gespannt hehe&#8230; und euch hat es hoffentlich auch gefallen! Ein Kommentar und eine Bewertung hier unten würde mich wie immer freuen!</p>

]]></content:encoded>
			<wfw:commentRss>http://blog.kj187.de/2010/03/22/exception-handling/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>MySQL Optimierung</title>
		<link>http://blog.kj187.de/2010/03/16/mysql-optimierung/</link>
		<comments>http://blog.kj187.de/2010/03/16/mysql-optimierung/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 20:30:49 +0000</pubDate>
		<dc:creator>Julian Kleinhans</dc:creator>
				<category><![CDATA[Best practices]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[MySQL Optimierung]]></category>

		<guid isPermaLink="false">http://blog.kj187.de/?p=167</guid>
		<description><![CDATA[MySQL, es gehört zum Alltag eines jeden Webprogrammierers!
 Doch viele wissen nicht, bzw. achten nicht darauf, das man mit falschen Querys starke Perfomanceeinbußen fahren kann.
 Daher will ich euch ein paar Best Practices mit auf den Weg geben, die grundsätzlich für eine bessere Performance sorgen!]]></description>
			<content:encoded><![CDATA[
<p><strong>MySQL</strong>, es gehört zum Alltag eines jeden Webprogrammierers!<br />
Doch viele wissen nicht, bzw. achten nicht darauf, das man mit falschen Querys starke Perfomanceeinbußen fahren kann.<br />
Daher will ich euch ein paar Best Practices mit auf den Weg geben, die grundsätzlich für eine bessere Performance sorgen!</p>
<p><strong>1) Vermeide SELECT * (sternchen)</strong></p>
<p>Über SELECT * werden <em>ALLE</em> Spalten einer Tabelle eingelesen! Aber nicht immer benötigt man wirklich alle Spalten aus einer Tabelle! Meißt benötigt man nur 2-3 Spalten wie den &#8220;title&#8221; oder die &#8220;id&#8221; und trotzem ist man zu faul die Spaltennamen auszuschreiben. Also knallen wir einfach mal das * (sternchen) hin, ist ja einfacher nicht wahr?! Jaha&#8230; nur bei einem * (sternchen) werden wie gesagt <em>ALLE</em> Spalten einer Tabelle eingelesen und das kostet Performance.<span id="more-167"></span></p>
<p>Benötigen wir also zum Beispiel aus einer Tabelle nur die Spalte &#8220;id&#8221; und &#8220;title&#8221; sollten wir unbedingt darauf achten auch nur diese beiden Spalten einzulesen:</p>
<pre class="brush: php;">// Nicht empfehlenswert
$result = mysql_query('SELECT * FROM tabelle WHERE id = 1');</pre>
<pre class="brush: php;">// Empfehlenswert
$result = mysql_query('SELECT id, title FROM tabelle WHERE id = 1');</pre>
<p><strong>2) Vermeide ORDER BY RAND()</strong></p>
<p>Ein sehr beliebtes Feature! Sie möchten auf Ihrer Webseite per Zufall &#8220;einen&#8221; Artikel aus Ihrer Tabelle darstellen!<br />
Was schreiben wir also, ganz easy:</p>
<pre class="brush: php;">$result = mysql_query('SELECT title FROM tabelle ORDER BY RAND() LIMIT 1');</pre>
<p>Sehr cool! Wir bekommen also per Zufall immer nur einen Artikel (eine Row), ganz wie wir es uns vorgestellt haben!<br />
Jedoch muss ich euch sagen, ORDER BY RANDOM() ernährt sich unheimlich gerne von unserer köstlichen und wertvollen Zutat namens Performance.  Wie also können wir unsere Abfrage so optimieren dass wir das gleiche Ergebnis bekommen ?</p>
<p>Ganz einfach, wir besorgen uns erstmal die Anzahl aller verfügbaren Zeilen, generieren uns dann eine Zufallszahl zwischen 0 und der Gesamtanzahl und nutzen LIMIT :-)</p>
<p>Moment, *taschenrechner.. klick klick*&#8230; hum, das sind ja jetzt mehr Zeilen als mein schöner Einzeiler da! Ja richtig, aber er frist garantiert nicht so viel Performance! Also, hier der Code:</p>
<pre class="brush: php;">$result = mysql_query('SELECT COUNT(*) FROM tabelle);
$row = mysql_fetch_row($result);
$randomizeNumber = mt_rand(0, $row[0]-1);
$result = mysql_query('SELECT title FROM tabelle LIMIT ' . $randomizeNumber . ', 1');</pre>
<p>Diese 4 Zeilen führen zum gleichen Ergebnis und sind nicht so Performancelastig.<br />
Hier wird gezielt per LIMIT nur eine Row gelesen. Bei ORDER BY RAND() werden erst ALLE Rows gelesen und dann erst per LIMIT begrenzt.</p>
<p><strong>3) Benutze LIMIT 1 bei eindeutigen Abfragen</strong></p>
<p>Es kommt sehr oft vor das wir genau wissen welche Zeile wir brauchen. Also schreibt man folgende Query</p>
<pre class="brush: php;">$result = mysql_query('SELECT title FROM tabelle WHERE title = &quot;Hello World&quot;');</pre>
<p>1 row in set (0.36 sec)</p>
<p>Wir wissen also daß wir nur eine Zeile zurückbekommen!<br />
Auch hier können wir ein minimale Performacesteigerung erzwingen, und wie ? Naja, wir wissen das es nur eine Zeile gibt, lasst uns also ein LIMIT 1 dran hängen:</p>
<pre class="brush: php;">$result = mysql_query('SELECT id, title, crdate FROM tabelle WHERE title = &quot;Hello World&quot; LIMIT 1');</pre>
<p>1 row in set (0.17 sec)</p>
<p>Auch wenn nicht wirklich spürbar, aber der Query ist schneller!<br />
Wenn wir nach einer Spalte suchen die einen Index hat, wie zB die Spalte id, diese ist ja unique, macht es keinen Sinn da über den Index das Ergebnis schon rasend schnell geliefert wird.</p>
<p><strong>4) Query Cache nutzen</strong></p>
<p>Seit MySQL Version 4 steht uns der MySQL Query Cache zur Verfügung der in den meisten Fällen unsere Abfragen beschleunigt. Vorausgesetzt ist natürlich das dieser aktiviert und konfiguriert ist! Die Betonung im ersten Satz liegt übrigens auf &#8220;in den meisten Fällen&#8221; ;-)</p>
<p>Was macht dieser Query Cache genau ?<br />
Hier werden Querys und deren Ergebnismengen abgespeichert. Wenn die gleiche Abfrage mehrmals benutzt wird und sich die betroffenen Datensätze nicht geändert haben, wird das Ergebnis aus diesem Cache geliefert anstatt eine neue Abfrage zu generieren.</p>
<p>Jetzt ist es so das wir als Programmierer eigentlich nichts spezielles beachten müssen. Unsere Querys landen eigentlich automatisch im Cache. Stop! Nicht immer! Nutzen wir in unserer Abfrage eine nichtdeterministische Funktion wird der Cache nicht benutzt!</p>
<p>Ok, halten wir mal kurz an! Ihr fragt euch jetzt bestimmt: &#8220;Was für eine Funktion ? nichtdeterwas ?&#8221; :-) hehe! Hier ein kleines Zitat aus der MySQL Doku:</p>
<blockquote><p>Eine Prozedur oder Funktion gilt als &#8220;deterministisch&#8221;, wenn sie für gleiche Eingabeparameter immer gleiche Resultate erzeugt; ansonsten ist sie &#8220;nichtdeterministisch&#8221;. Wenn in der Definition der Routine weder DETERMINISTIC noch NOT DETERMINISTIC steht, ist die Voreinstellung NOT DETERMINISTIC.</p></blockquote>
<p>Soweit klar ? Super&#8230; dann können wir ja weiter machen.<br />
Also, sobald wir eine solche Funktion in unserer Abfrage nutzen wird nicht mehr mit dem Cache gearbeitet! Soweit klar, hier ein Beispiel:</p>
<pre class="brush: php;">$result = mysql_query('SELECT title FROM tabelle WHERE myDate &lt;= CURDATE()');</pre>
<p>Mit diesem Query holen wir uns alle Zeilen wo die Spalte &#8220;myDate&#8221; kleiner gleich dem aktuellen Datum ist! CURDATE ist in diesem Fall eine nichtdeterministische Funktion! NOW() oder RAND() wären andere Beispiele!</p>
<p>Diesen Query können wir natürlich optimieren. Und zwar so das auch der Cache benutzt wird. Wir verzichten einfach auf diese komische nichtdeterministische Funktion und nutzen ein wenig PHP</p>
<pre class="brush: php;">$curdate = date('Y-m-d');
$result = mysql_query('SELECT title FROM tabelle WHERE date &lt;= ' . $curdate);</pre>
<p><strong>5) Nutze das Werkzeug EXPLAIN</strong></p>
<blockquote><p>Wenn man einer SELECT Anweisung das Schlüsselwort EXPLAIN voranstellt, zeigt MySQL Informationen des Optimierers zum Ausführungsplan der Abfrage an. MySQL erläutert also, wie es die SELECT-Anweisung verarbeiten würde, und gibt zudem an, wie und in welcher Reihenfolge Tabellen miteinander verknüpft werden.</p></blockquote>
<p>Zitat aus der MySQL Doku : <a href="http://dev.mysql.com/doc/refman/5.1/de/explain.html" onclick="pageTracker._trackPageview('/outgoing/dev.mysql.com/doc/refman/5.1/de/explain.html?referer=');">http://dev.mysql.com/doc/refman/5.1/de/explain.html</a></p>
<p>Super, bedeutet wir haben ein Werkzeug mit dessen Hilfe wir Step by Step einen SELECT Query optimieren können!</p>
<p>Wir können jetzt also beim entwickeln unserer Applikation jedes mal wenn wir einen SELECT bauen direkt schauen ob dieser performant ist! Da wir die Applikation ja gerade erst bauen, die Datenbank nur ein paar Testeinträge besitzt, geht alles in allem recht flot und wir stempeln unseren Query als Performant ab!</p>
<p>1 Jahr später, die Applikation ist gut besucht, die Datenbank ist fett mit wunderbaren Informationen gefüllt, fragen wir uns, warum ist meine Webseite so langsam. Als ich die gebaut hab war doch alles so schnell. Mit der Zeit hat sich viel verändert, als wir beim entwickeln getestet haben hatten wir auch noch keinen Bezug auf die Realität, keine volle Datenbank, keine X-hundert Hits am Tag!</p>
<p>Wir wollen also versuchen unsere Webseite im MySQL Bereich zu optimieren. Um jetzt nicht jede einzelne Query wieder zu suchen und von Hand zu testen nutzen wir ein wunderbares Feature! Wir können MySQL sagen ab welcher Ausführungszeit eine Abfrage als &#8220;zu langsam&#8221; gilt. Und diese lassen wir dann mitloggen! Extrem cool nicht war.. wir haben also jetzt eine Möglichkeit Querys ausfindig zu machen die langsam sind. Diese nehmen wir uns jetzt genauer unter die Lupe und zwar mit unserem Werkzeug EXPLAIN!</p>
<p>EXPLAIN analysiert unsere Abfrage und stellt dar was die Datenbank mit der Abfrage genau macht.<br />
Beispiel:</p>
<pre class="brush: php;">$result = mysql_query('EXPLAIN SELECT title FROM tabelle');</pre>
<p>Was uns das Ergebnis genau sagt können wir auf der MySQL Seite nachlesen: <a href="http://dev.mysql.com/doc/refman/5.1/de/explain.html" onclick="pageTracker._trackPageview('/outgoing/dev.mysql.com/doc/refman/5.1/de/explain.html?referer=');">http://dev.mysql.com/doc/refman/5.1/de/explain.html</a> eine ausführliche Antwort um dieses zu verstehen würde sonst diesen Beitrag sprengen :-)</p>
<p><strong>6) Suchfelder indizieren</strong></p>
<p>Oft müssen wir per MySQL nach irgendwelchen Sachen suchen. Nehmen wir an, wir haben einen selbstprogrammierten Blog. Der User möchte nach einem Artikel suchen wo er sich nur schwach an den Titel erinnern kann. Irgendwas mit &#8220;Hello&#8221; war das&#8230;.</p>
<p>Statisch umgesetzt könnte das so aussehen:</p>
<pre class="brush: php;">$result = mysql_query('SELECT COUNT(*) FROM tabelle WHERE title LIKE &quot;Hello%&quot;');</pre>
<p>Wenn wir uns die Zeit dazu mal anschauen sehen wir das das schon ziemlich lange dauert: 1 row in set (0.31 sec)</p>
<p>Also, legen wir einen INDEX auf die Spalte &#8220;title&#8221; in der gesucht werden soll:</p>
<p>[mysql]ALTER TABLE tabelle ADD INDEX (&#8220;title&#8221;);[/mysql]</p>
<p>Führen wir unseren Query erneut aus:</p>
<pre class="brush: php;">$result = mysql_query('SELECT COUNT(*) FROM tabelle WHERE title LIKE &quot;Hello%&quot;');</pre>
<p>sieht unser Ergebnis schon ganz anders aus: 1 row in set (0.07 sec)</p>
<p>Mit einem INDEX kann man also extreme Performancesteigerungen erreichen!</p>
<p>Kleiner Tip: Wo welcher Index verwendet wird können wir ganz einfach mit der Abfrage</p>
<pre class="brush: sql;">SHOW INDEX FROM tabelle;</pre>
<p>rausbekommen!</p>
<p>Es gibt bestimmt noch dutzende weitere Möglichkeiten seine Scripte zu optimieren! Ich möchte hier aber erst mal einen Cut machen. Wenn Ihr noch gute Optimierungsmöglichkeiten kennt die ich hier mit aufnehmen sollte, benutzt bitte die Kommentarfunktion!</p>
<p>Jedenfalls hoffe ich das euch der Artikel gefallen und vor allem geholfen hat! Ihr könnt diesen Artikel auch unten Bewerten oder per Twitter ein wenig pushen :-)</p>
<p>Lieben Gruß<br />
Julian</p>

]]></content:encoded>
			<wfw:commentRss>http://blog.kj187.de/2010/03/16/mysql-optimierung/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Polymorphie</title>
		<link>http://blog.kj187.de/2010/03/12/polymorphie/</link>
		<comments>http://blog.kj187.de/2010/03/12/polymorphie/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 20:23:26 +0000</pubDate>
		<dc:creator>Julian Kleinhans</dc:creator>
				<category><![CDATA[OOP]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Polymorphie]]></category>

		<guid isPermaLink="false">http://blog.kj187.de/?p=154</guid>
		<description><![CDATA[Nein, es handelt sich hier nicht um irgendeine seltene Krankheit. Unter Polymorhie versteht man in der Programmierung eine Art von Vielgestaltigkeit, bei der das dynamische Verhalten von Methoden verfolgt wird, welche von der Anzahl und des Typs der übergebenen Parameter abhängt. Verständlich oder ? Etwa nicht ? Keine Angst ich werde gleich ein Beispiel zeigen [...]]]></description>
			<content:encoded><![CDATA[
<p>Nein, es handelt sich hier nicht um irgendeine seltene Krankheit. Unter Polymorhie versteht man in der Programmierung eine Art von Vielgestaltigkeit, bei der das dynamische Verhalten von Methoden verfolgt wird, welche von der Anzahl und des Typs der übergebenen Parameter abhängt.</p>
<p>Verständlich oder ? Etwa nicht ? Keine Angst ich werde gleich ein Beispiel zeigen in dem das ganze dann deutlich wird!<span id="more-154"></span></p>
<p>Die Polymorphie gibt es in PHP nicht wirklich, warum? Weil PHP eine dynamisch getypte Programmiersprache ist, viele sagen eine typenlose Programmiersprache. Was so viel bedeutet wie, wir müssen den Variablen nicht fest vorgeben was in Ihnen gespeichert wird, ob ein String, ein Integer oder Double oder oder oder. Wir können jederzeit von einem Typ zum anderen wechseln.</p>
<p>In anderen Programmiersprachen wie Java zum Beispiel muss man jeder Variable sagen welcher Typ in Ihr gespeichert wird und diesen kann man dann nicht mal eben ändern bzw man kann keinen String in einer als Integer definierten Variable speichern. Das nennt man dann eine statisch getypte Programmiersprache.</p>
<p>Daher gibt es in PHP keine direkte Polymorphie. Um das ganze jetzt etwas deutlicher zu machen möchte ich euch ein Beispiel aus der Java Welt zeigen.</p>
<pre class="brush: java;">class MyClassName {

 public void methodName (int variableName) {
 // Es wurde ein Integer übergeben
 }

 public void methodName (String variableName) {
 // Es wurde ein String übergeben
 }

}</pre>
<p>Würden wir die Methode &#8220;methodName&#8221; jetzt aufrufen und Ihr als Parameter einen Integer mit übergeben, würde die erste Methode auufgerufen werden. Rufen wir die gleiche Methode auf aber übergeben Ihr einen String als Parameter, wird die zweite Methode aufgerufen. Es wird also überprüft welcher Typ übergeben wurde und entsprechend mit den Typen der Methodensignatur verglichen.</p>
<p>Das gleiche können wir aber auch mit der Anzahl der Parameter machen</p>
<pre class="brush: java;">class MyClassName {

 public void methodName (int variableName, String variableName) {
 // Es wurde ein Integer und ein String übergeben
 }

 public void methodName (int variableName) {
 // Es wurde ein Integer übergeben
 }

}</pre>
<p>Rufen wir die Methode &#8220;methodName&#8221; mit nur einem Parameter, einen Integer Parameter auf, wird die zweite Methode aufgerufen. Rufen wir aber die Methode mit einem Integer UND einem String Parameter auf, ja richtig, dann wird die zweite Methode aufgerufen.</p>
<p>Das bedeutet Vielgestaltigkeit!</p>
<p>Soviel dazu, jetzt habe ich aber gesagt das PHP eine typenlose Sprache ist. Daher dann die Deklaration von mehreren Methoden des gleichen Namens nicht verwendet werden. Wie klappt das dann in PHP ?</p>
<p>Es bieten sich folgende Möglichkeiten an:<br />
Eine Methode kann einen Parameter akzeptieren der unterschiedliche Typen enthält. Über eine if Bedingungen überprüfen wir den Typen und agieren entsprechend</p>
<pre class="brush: php;">class MyClassName {

 public function methodName ($variableName) {
 if (is_string($variableName)) {
 // Die Variable ist ein String
 } elseif (is_integer($variableName)) {
 // Die Variable ist ein Integer
 } elseif (is_array($variableName)) {
 // Die Variable ist ein Array
 }
 // usw.
 }

}</pre>
<p>Wenn noch fragen offen sind könnt Ihr gerne die Kommentarfunktion benutzen!</p>

]]></content:encoded>
			<wfw:commentRss>http://blog.kj187.de/2010/03/12/polymorphie/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

