<?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>Andreas Demmer &#187; Fachartikel</title>
	<atom:link href="http://www.andreas-demmer.de/category/fachartikel/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.andreas-demmer.de</link>
	<description>Linux-Evangelist, Software-Enthusiast &#38; Software-Developer</description>
	<lastBuildDate>Mon, 26 Jul 2010 18:35:50 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Ist Google Wave tot?</title>
		<link>http://www.andreas-demmer.de/2010/02/09/ist-google-wave-tot/</link>
		<comments>http://www.andreas-demmer.de/2010/02/09/ist-google-wave-tot/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 10:28:43 +0000</pubDate>
		<dc:creator>Andreas Demmer</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Fachartikel]]></category>

		<guid isPermaLink="false">http://www.andreas-demmer.de/?p=791</guid>
		<description><![CDATA[So sehr Google Wave anfangs gehypt wurde, so still ist es mittlerweile um den "E-Mail Killer" geworden. Trotz des vielversprechenden Konzepts kommt die Plattform nicht in Schwung. Mit diesem Artikel wage ich den Versuch einer Erklärung.]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-794" title="Google Wave" src="http://www.andreas-demmer.de/wp-content/uploads/2010/02/google_wave_logo.jpg" alt="" width="256" height="256" /> Vor mehreren Monaten hat sich <a href="http://wave.google.com" target="_blank">Google Wave</a> noch wie ein Lauffeuer verbreitet: Alle Nerd-Medien berichteten ausführlich über den &#8220;E-Mail Killer&#8221; von <a href="http://www.google.com" target="_blank">Google</a> und jeder vernünftige Geek (darunter auch ich) war scharf auf einen der sehr begehrten Accounts. Diese wurden nur per Einladung verteilt, waren limitiert und damit äußerst spärlich gesät; Ein effektiver Weg, einen Hype zu erzeugen.<br />
<span id="more-791"></span><br />
Irgendwann erhielt ich endlich meine Einladung, konnte Google Wave aber nicht richtig testen weil eben kaum einer meiner Bekannten einen Account hatte. Wenige Wochen später erhielt ich die Möglichkeit, Einladungen zu verschicken (genau 6 (!) Stück), die ich an gute Freunde verteilte. Die ersten Tests waren dann auch sehr spaßig: Die Usability und Möglichkeiten beeindruckten durchaus: Statt nackter Mails konnte man nun &#8220;Mashups&#8221; gestalten, also Fremdelemente einbetten. Im Gegensatz zu E-Mails, die nur auf Anhänge und ein wenig HTML beschränkt sind, konnte man hier direkt interaktive Landkarten, Umfragen und noch viel mehr einbetten. Ich war begeistert und hatte sofort den Nutzen erkannt.</p>
<p>Mittlerweile habe ich etwa 30 Einladungen verschickt und auch wirklich jeder, der an einem Konto interessiert war, sollte mittlerweile ein Konto sein Eigen nennen. Allerdings ist bei mir die Euphorie abgeflaut. Keiner meiner bekannten nutzt mehr Google Wave. Wie konnte es dazu kommen?</p>
<p>Die Tatsache, dass viele Bekannte anfangs keinen Nutzeraccout hatten, minderte den &#8220;Entdeckungsfaktor&#8221;, wie ihn etwa <a href="http://www.facebook.com" target="_blank">Facebook</a> mit sich bringt. Zudem ist Google Wave deutlich zu komplex. Nicht im Sinne von schlechter Usability o.ä., aber die Möglichkeiten überfordern normale Benutzer einfach. Z.b. würde ich meiner Mutter nie beibringen können, eine Wave zu verfassen; Zu Komplex ist das Konzept der Applets in Waves  für Nicht-Entwickler.</p>
<p>Tja, und so kam mir heute nach ewigen Tagen Abstinenz zur Plattform mal wieder in den Sinn, einen Blick hinein zu werfen. Mit dem erwarteten Ergebnis: Seit Monaten tut sich NICHTs. Keine neuen Waves, keine neuen Kontakte, kein neuer Spaß.</p>
<p>Google Wave ist für mich das beste Beispiel, wie man ein Produkt durch Overhyping töten kann.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-demmer.de/2010/02/09/ist-google-wave-tot/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Video meines &#8220;Conceptual Design&#8221; Talks online</title>
		<link>http://www.andreas-demmer.de/2009/10/28/video-meines-conceptual-design-talks-online/</link>
		<comments>http://www.andreas-demmer.de/2009/10/28/video-meines-conceptual-design-talks-online/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 15:29:50 +0000</pubDate>
		<dc:creator>Andreas Demmer</dc:creator>
				<category><![CDATA[Fachartikel]]></category>
		<category><![CDATA[Screencasts]]></category>
		<category><![CDATA[Veranstaltungen]]></category>

		<guid isPermaLink="false">http://www.andreas-demmer.de/?p=720</guid>
		<description><![CDATA[Dank Michaela Hachemer kann ich Euch heute den Videomitschnitt meines Vortrags auf dem letzten Frankfurter Web Montag zur Verfügung stellen. Hierfür habe ich meine Vorträge-Seite erweitert und das Video Wireframes &#38; Co.: Conceptual Design als Projektbaustein ergänzt.]]></description>
			<content:encoded><![CDATA[<p>Dank <a href="http://scribble2screen.com/profil/michaela-hachemer.html" target="_blank">Michaela Hachemer</a> kann ich Euch heute den Videomitschnitt meines Vortrags auf dem <a href="http://www.andreas-demmer.de/2009/10/13/gestern-war-web-montag-in-frankfurt/">letzten Frankfurter Web Montag</a> zur Verfügung stellen. Hierfür habe ich meine <a href="http://www.andreas-demmer.de/artikel_und_vortraege/vortraege/">Vorträge-Seite</a> erweitert und das Video <a href="http://www.andreas-demmer.de/artikel_und_vortraege/vortraege/vortrag-uber-conceptual-design/"><em>Wireframes &amp; Co.: Conceptual Design als Projektbaustein</em></a> ergänzt.</p>
<p>Wie üblich verhindert es das knappe viertelstündige Zeitkorsett des Web Montags allzusehr in die Tiefe zu gehen. Dennoch ist der Vortrag sicher ein interessanter Überblick und ein schneller Einstieg in die Materie. Ich wünsche Euch viel Spaß beim Ansehen und freue mich auf Kritik!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-demmer.de/2009/10/28/video-meines-conceptual-design-talks-online/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neuer Kurzbeitrag: &#8222;Positionierungseffekte&#8220;</title>
		<link>http://www.andreas-demmer.de/2008/07/17/neuer_kurzbeitrag_-_positionierungseffekte/</link>
		<comments>http://www.andreas-demmer.de/2008/07/17/neuer_kurzbeitrag_-_positionierungseffekte/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 15:12:05 +0000</pubDate>
		<dc:creator>Andreas Demmer</dc:creator>
				<category><![CDATA[Fachartikel]]></category>

		<guid isPermaLink="false">http://www.andreas-demmer.de/2008/07/17/neuer_kurzbeitrag_-_positionierungseffekte</guid>
		<description><![CDATA[Heute ist bei den Webkrauts mein Kurzbeitrag Positionierungseffekte im Rahmen der Sonnenseiten Aktion erschienen: Am Beispiel von Silverbackapp zeige ich auf, wie man durch CSS-Positionierungsangaben von HTML-Elementen eine r&#228;umliche Tiefenwirkung beim Scrollen erzeugen kann. Bei der Sonnenseiten Aktion loben die Webkrauts &#8211; h&#246;chst subjektiv &#8211; einzelne Details von Webseiten. Entgegen unserer Gewohnheit steht dabei nicht [...]]]></description>
			<content:encoded><![CDATA[<p>Heute ist bei den <a href="http://www.webkrauts.de" target="_blank">Webkrauts</a> mein Kurzbeitrag <a href="http://www.webkrauts.de/2008/07/17/sonnenseiten-positionierungseffekte/trackback/" target="_blank">Positionierungseffekte</a> im Rahmen der <em>Sonnenseiten </em>Aktion erschienen: Am Beispiel von <em>Silverbackapp </em>zeige ich auf, wie man durch CSS-Positionierungsangaben von HTML-Elementen eine r&auml;umliche Tiefenwirkung beim Scrollen erzeugen kann.<br />
Bei der Sonnenseiten Aktion loben die Webkrauts &ndash; h&ouml;chst subjektiv &ndash; einzelne Details von Webseiten. Entgegen unserer Gewohnheit steht dabei nicht der Quelltext, sondern die Idee im Mittelpunkt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-demmer.de/2008/07/17/neuer_kurzbeitrag_-_positionierungseffekte/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Neuer Fachartikel über SEO online</title>
		<link>http://www.andreas-demmer.de/2008/01/18/neuer_fachartikel_ueber_seo_online/</link>
		<comments>http://www.andreas-demmer.de/2008/01/18/neuer_fachartikel_ueber_seo_online/#comments</comments>
		<pubDate>Fri, 18 Jan 2008 13:10:00 +0000</pubDate>
		<dc:creator>Andreas Demmer</dc:creator>
				<category><![CDATA[Fachartikel]]></category>

		<guid isPermaLink="false">http://www.andreas-demmer.de/2008/01/18/neuer_fachartikel_ueber_seo_online</guid>
		<description><![CDATA[Der von mir verfasste und zuvor im PHP-Magazin erschienene Artikel &#8222;Google hier bin ich&#8220; bietet einen guten &#220;berblick &#252;ber Suchmaschinenoptimierung und zeigt einige technische Ans&#228;tze auf. Interessierte finden den Artikel ab sofort online im Fachartikel-Bereich dieser Website.]]></description>
			<content:encoded><![CDATA[<p>Der von mir verfasste und zuvor im <a href="http://www.phpmag.de" target="_blank">PHP-Magazin</a> erschienene Artikel &bdquo;Google hier bin ich&ldquo; bietet einen guten &Uuml;berblick &uuml;ber Suchmaschinenoptimierung und zeigt einige technische Ans&auml;tze auf. <br />
Interessierte finden den Artikel ab sofort online im <a href="/projekte/fachartikel">Fachartikel-Bereich</a> dieser Website.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-demmer.de/2008/01/18/neuer_fachartikel_ueber_seo_online/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google hier bin ich!</title>
		<link>http://www.andreas-demmer.de/2008/01/18/google_hier_bin_ich/</link>
		<comments>http://www.andreas-demmer.de/2008/01/18/google_hier_bin_ich/#comments</comments>
		<pubDate>Fri, 18 Jan 2008 13:00:00 +0000</pubDate>
		<dc:creator>Andreas Demmer</dc:creator>
				<category><![CDATA[Fachartikel]]></category>

		<guid isPermaLink="false">http://www.andreas-demmer.de/2008/01/18/google_hier_bin_ich</guid>
		<description><![CDATA[Gro&#223;e Grafiken auf der Startseite illustrieren die Gesch&#228;ftsfelder, hippe Flash-Animationen kommunizieren die Kernkompetenzen und die Meta-Tags der Seite sind akribisch mit Stichworten verschiedenster Themengebiete gef&#252;ttert. Ein Blick in die Suchergebnisse von Google bringt schnell Ern&#252;chterung: Selbst Monate nach dem Launch wird die Website nicht gelistet, oder wenn &#252;berhaupt auf einer den hinteren Seiten. So wird [...]]]></description>
			<content:encoded><![CDATA[<p>Gro&szlig;e Grafiken auf der Startseite illustrieren die Gesch&auml;ftsfelder, hippe Flash-Animationen kommunizieren die Kernkompetenzen und die Meta-Tags der Seite sind akribisch mit Stichworten verschiedenster Themengebiete gef&uuml;ttert. Ein Blick in die Suchergebnisse von Google bringt schnell Ern&uuml;chterung: Selbst Monate nach dem Launch wird die Website nicht gelistet, oder wenn &uuml;berhaupt auf einer den hinteren Seiten. So wird das nat&uuml;rlich nichts mit dem Return Of Investment. Was ist schief gelaufen?<span id="more-329"></span>Die sch&ouml;nste Seite im Netz nutzt nichts, wenn diese nicht gefunden wird! Diese Aussage, so plakativ sie auch sein mag, bringt das Problem auf den Punkt. Soll die Website nicht nur von Kunden besucht werden, welche die Internetadresse kennen, sondern auch von potenziellen Neukunden oder Interessenten durch Recherchieren gefunden werden, ist eine Optimierung f&uuml;r Suchmaschinen (SEO = search engine optimization) unerl&auml;sslich. Denn meist beginnt der Besuch von Websites mit mehreren Suchanfragen in einer der gro&szlig;en Suchmaschinen (Google, Yahoo, MSN und Konsorten).<br />
Eine gute Nachricht vorab: Der beste Weg f&uuml;r ein gutes Ranking ist und bleibt ein guter Content. Je einzigartiger und qualitativ hochwertiger, desto besser. Keine technische Spielerei kann es Ihnen abnehmen, gute Inhalte zu liefern. Gerne vergessen gerade wir Programmierer, dass mehr zu einem guten Ranking geh&ouml;rt als clevere PHP Hacks.</p>
<p><strong>Die richtigen Keywords sind das A und O</strong><br />
Am Anfang aller Optimierungen steht die Entscheidung, f&uuml;r welche Schl&uuml;sselbegriffe (Keywords) man seine Seite optimieren m&ouml;chte. Hier bieten sich nat&uuml;rlich die T&auml;tigkeitsfelder des Unternehmens an, jedoch sollte man auch nach Wortfamilien recherchieren! Begriffe wie &quot;Performance-Marketing&quot; oder &quot;Mobile-Marketing&quot; k&ouml;nnen treffende Fachbegriffe sein, aber sucht ein potenzieller Interessent auch danach? Sind Begrifflichkeiten wie &quot;Erfolgskontrolle&quot; und &quot;Handy-Marketing&quot; als Suchbegriffe nicht ebenso wahrscheinlich? Die richtige Mischung aus Fachbegriffen und umgangssprachlichen Begrifflichkeiten spricht ein breiteres Zielpublikum an.<br />
Die ausgew&auml;hlten Begriffe gilt es nun m&ouml;glichst geschickt in die Texte der Website zu integrieren. Hierbei stellt es sich als weitaus erfolgreicher heraus, einzelne Seiten auf bestimmte Themengebiete hin zu optimieren, als alle Themen auf eine Seite packen zu wollen. Die Spezialisierung bringt wertvolle Punkte in den Bewertungskriterien der Suchmaschinen.<br />
Die Positionierung der Keywords in den Meta-Tags der Seite galt fr&uuml;her als sicherer Garant daf&uuml;r, dass diese Begriffe von den Suchmaschinen verst&auml;rkt wahrgenommen werden. Der Missbrauch der Meta-Tags in der Vergangenheit, vor allem durch die Pornoindustrie (kennen Sie noch die Zeiten, in denen zwielichtige Angebote stets zu den ersten Suchergebnissen geh&ouml;rten, unabh&auml;ngig davon wonach Sie gesucht haben?) hat dazu gef&uuml;hrt, dass der Einfluss der Meta-Tags auf die Bewertung stark abgenommen hat.</p>
<p><strong>Bewertungskriterien im Wandel</strong><br />
Und hierbei sind die Meta-Tags nur die Spitze des Eisbergs. Der st&auml;ndige Wettlauf zwischen Bewertungskriterien und deren Missbrauch hat dazu gef&uuml;hrt, dass die gro&szlig;en Suchmaschinen ihre Bewertungskriterien st&auml;ndig &uuml;berarbeiten und anpassen. Insofern ist Suchmaschinenoptimierung ein st&auml;ndiger Vorgang, der nie abgeschlossen ist. In gewissen Intervallen sind die Kriterien, welche man an die Seite angelegt hat, kritisch zu beleuchten, und die daraus gewonnenen Erkenntnisse in eventuelle Optimierungen einflie&szlig;en zu lassen.</p>
<p><strong>Techniken zur Optimierung</strong><br />
Nat&uuml;rlich gibt es eine gro&szlig;e Anzahl technischer Ans&auml;tze, um eine Seite f&uuml;r Suchmaschinen attraktiv zu gestalten. Hierbei unterscheidet man zwischen den so genannten On-Page- und Off-Page-Faktoren. Als On-Page bezeichnet man die Faktoren, welche auf einer Seite die Platzierung in Suchmaschinen bestimmen, etwa Content und Quelltext. Die Off-Page-Faktoren hingegen beziehen sich auf Wertungskriterien au&szlig;erhalb der eigenen Website, etwa Verlinkungen von anderen Websites und deren qualitative Bewertung.<br />
Allen Kriterien voran stehen XHTML/CSS-konforme Layouts. Der Grund hierf&uuml;r ist recht einfach: Google kann nur das gut bewerten, was es auch versteht. Komplizierte Tabellenlayouts lassen korrespondierende Inhalte vielleicht optisch beieinander stehen, im Quellcode liegen sie meist mehrere hundert Zeilen Code auseinander. Nun betrachtet Google allerdings nicht das Erscheinungsbild, sondern liest den Quellcode. Und da sorgen knappgehaltene XHTML-Auszeichnungen daf&uuml;r, dass im Quellcode zusammensteht, was zusammengeh&ouml;rt. Zus&auml;tzlich kann man es so einrichten, dass oben in der Datei die relavanten Inhalte auftauchen und nicht zwingend das, was optisch oben auf der Seite angezeigt wird. Zwingend muss darauf geachtet werden, dass das produzierte XHTML wirklich valide ist. Im schlimmsten Fall kann der Seitenparser der Suchmaschine die Seite nicht korrekt auswerten oder greift sich belanglose Inhalte.<br />
&Uuml;berhaupt kann man mit ein wenig Wissen relativ gut steuern, welche Inhalte die Suchmaschine als relevant erachtet, um diese in die Gewichtung mit einzubeziehen oder in ihren Ergebnislisten als Textausschnitt anzuzeigen. Der Schl&uuml;ssel daf&uuml;r liegt in den altehrw&uuml;rdigen Title- und Headline-Tags. Wichtig ist vor allem der Title-Tag: Dieser beschreibt, worum es auf der Seite geht. Ist dieser leer oder auf jeder Seite gleich, kann dies nicht optimal sein. Besser ist es, die relevante Seiten&uuml;berschrift auch in den Title-Tag zu packen.<br />
Wenn wir schon bei den Title-Tags sind: Nat&uuml;rlich sollten auch die Title- und Alternative-Tags von Bildern stets gef&uuml;llt werden, um Suchmaschinen das zu beschreiben, was sie nicht mit eigenen Augen auf den Bildern sehen k&ouml;nnen.<br />
Neben dem Title-Tag sollte die Seiten&uuml;berschrift nat&uuml;rlich im Headline-Tag (h1, h2, &#8230;) stecken. Schon vom W3 Consortium ersonnen, um &Uuml;berschriften unterschiedlicher Gewichtung abzubilden, sollten die Tags auch genau hierzu eingesetzt werden. Die Haupt&uuml;berschrift sollte immer h1 sein, danach folgen die unwichtigeren &Uuml;berschriften mit aufsteigenden hs. Eine richtige Schachtelung erreicht man dadurch, dass nach einer <em>h1 </em>eine <em>h2 </em>und danach eine <em>h3 </em>folgt. Nach der <em>h3 </em>kann wieder eine <em>h2 </em>und dann wieder eine <em>h3 </em>folgen, womit festgelegt w&auml;re: Die erste <em>h3 </em>ist eine Untergliederung von <em>h2</em>, die zweite <em>h3 </em>eine Untergliederung von der zweiten <em>h2</em>, die textlich nicht mit der ersten <em>h2 </em>korreliert. M&ouml;chte man nun wichtige Keywords kombinieren, packt man optimalerweise das erste Keyword in eine &Uuml;berschrift und das zweite Keyword in die erste Zeile des Flie&szlig;texts unterhalb der &Uuml;berschrift.<br />
Ebenfalls hat es sich als effektiv erwiesen, die Keywords auf einer Seite zu verlinken: Bietet eine Webagentur SEO an, so sollte dies nicht nur im Men&uuml; als &quot;Suchmaschinenoptimierung&quot; aufgef&uuml;hrt werden, sondern auch den Begriff &quot;SEO&quot; &uuml;berall auf der Website mit der Detailseite zu SEO zu verlinken.<br />
Aber auch au&szlig;erhalb des Content-Bereichs kann man zahlreiche Optimierungen vornehmen. Ein Ansatz ist die so genannten &quot;sprechenden URLs&quot; (URL-Rewriting), um Keywords m&ouml;glichst prominent in der URL zu platzieren. Hierbei erzeugt man aussagekr&auml;ftige URLs, die allerdings keine Aussage &uuml;ber die tats&auml;chliche Platzierung der Dateien auf dem Webserver t&auml;tigen (etwa: <em>www.shop.com/books/coding/php/</em>). Der Webserver oder die Applikationslogik parsen die virtuellen URLs und liefern die assoziierten Inhalte aus.<br />
&Uuml;berhaupt sind ewig lange URLs den Suchmaschinen ein Graus. Denn meist machen URLs (wenn es sich nicht gerade um h&auml;ssliche Parameter wie Session-ID handelt) eine Aussage &uuml;ber die Strukturtiefe der Website. Hier sind ganz klar flache Hierarchien anzuraten. M&ouml;glichst viele Inhalte sollten &ndash; nat&uuml;rlich nur, sofern dies wirklich sinnvoll ist &ndash; direkt von der Startseite aus erreichbar sein. Je k&uuml;rzer der Klickpfad von der Startseite zur Unterseite ist, desto relevanter empfindet Google den Inhalt der Unterseite.<br />
M&ouml;chte man ganz sicher gehen, dass Google auch ja keine der sorgsam erstellten Unterseiten &uuml;bersieht, kann man spezielle XML-Sitemaps anlegen. Diese sind, ebenso wie robots.txt-Dateien, lediglich f&uuml;r die Crawler der Suchmaschinen gedacht und &uuml;bergeben diesen eine komplette Liste aller vorhandenen Unterseiten. Somit werden auch Pop-ups indiziert, welche sich eventuell nur durch JavaScript &ouml;ffnen lassen.<br />
Generell wird ein Verzicht auf JavaScript und Flash von Suchmaschinen gern gesehen, falls nicht aufw&auml;ndig f&uuml;r barrierefreie Ersatzinhalte gesorgt wurde. Es sei auch erw&auml;hnt, dass die Verlinkung von anderen Websites aus eine wichtige Rolle spielt. Nat&uuml;rlich gibt es auch hier zahlreiche Fallstricke bzw. Anforderungen, welche an die Partner-Website gestellt werden. Etwa die Themen-Verwandtschaft, Authority-Gewichtung (manche Websites sind bei bestimmten Stichworten kompetenter als andere), PageRank (Kombination verschiedenster Kriterien) und andere Besonderheiten. Ein gut gemeinter Ratschlag: Lassen Sie sich von einem Fachmann Ihres Vertrauens beraten, denn mit unkundigen Anpassungen kann man viel zerst&ouml;ren. Im schlimmsten Fall fliegen Sie f&uuml;r alle Zeiten aus den Suchergebnissen der Suchmaschinen.</p>
<p><strong>Schwarze Schafe</strong><br />
&quot;Fachmann Ihres Vertrauens&quot; ist sch&ouml;n gesagt! Denn tats&auml;chlich tummeln sich am Markt der Suchmaschinenoptimierer auch zahlreiche schwarze Schafe. Diese versprechen Ihnen bestimmte Platzierungen bei bestimmten Stichworten. Hier gilt: Niemand kann Ihnen eine konkrete Platzierung versprechen! Diese kann, wenn &uuml;berhaupt, nur mit unseri&ouml;sen und gef&auml;hrlichen Tricks erreicht werden, womit wir wieder bei den sich st&auml;ndig &auml;ndernden Kriterien w&auml;ren. Denn sollte eine Suchmaschine pl&ouml;tzlich entscheiden, dass die bei Ihnen eingesetzten Tricks als &quot;Suchmaschinen-Spam&quot; oder &quot;Suchmaschinen-Spoofing&quot; zu verstehen sind, so k&ouml;nnen Sie von einem auf den anderen Tag aus dem Suchindex geworfen werden. Und dies ohne Benachrichtigung!<br />
Solche &quot;unseri&ouml;sen Tricks&quot; gibt es viele. So kann man Seiten bei dem Besuch eines Suchroboters f&uuml;r diesen anders darstellen als ein Besucher die Seite zu sehen bek&auml;me. Auch sieht man oft versteckte Links auf Keyword-Seiten oder Texte, die f&uuml;r Besucher unsichtbar sind. Wei&szlig;er Text auf wei&szlig;em Hintergrund mag zwar f&uuml;r das Auge unsichtbar sein, nicht aber f&uuml;r die Suchmaschinen. Diese jedoch pr&uuml;fen mittlerweile auch den HTML-Code dahingehend, ob der Text sichtbar w&auml;re. Trickserien k&ouml;nnen an dieser Stelle f&uuml;r Sie schnell unangenehme Folgen haben.<br />
Seri&ouml;se Anbieter erkennen Sie daran, dass diese Ihnen keine konkreten Platzierungen versprechen und mit Ihnen offen auf die Vor- und Nachteile der einzelnen Optimierungsma&szlig;nahmen eingehen.<br />
<strong><br />
Schatz, wie war ich? Die Erfolgskontrolle</strong><br />
Ob Ihre Optimierungsma&szlig;nahmen nun greifen, ist nat&uuml;rlich von entscheidender Bedeutung. Die Kontrolle des Besucherstroms &uuml;ber Webstatistk-Software wie Webalizer bringt Ihnen nur wenig Erkenntnis. Zwar k&ouml;nnen Sie ersehen, ob die Besuchsfrequenz zu- oder abnimmt, aber der Grund daf&uuml;r bleibt Ihnen meist verborgen.<br />
Moderne WebAnalytics-Tools sind m&auml;chtige Werkzeuge, die das Thema Erfolgskontrolle in seiner G&auml;nze abbilden. Sie beginnen bei der Bewertung der Keywords (Suchh&auml;ufigkeit und Tefferanzahl), gehen &uuml;ber Suchbegriffe, unter welchen Ihre Seite gefunden wurde, hin zu den damit angelockten Besuchern und deren Surfverhalten und h&ouml;rt bei der Messung eventueller Conversions noch lange nicht auf.<br />
Der Markt dieser Werkzeuge ist in den letzten Jahren signifikant gewachsen. So findet sich f&uuml;r jedes Portemonnaie mittlerweile die passende L&ouml;sung. Doch zumindest f&uuml;r essenzielle Auswertungen muss man kein Geld ausgeben: Mit GoogleAnalytics hat Google ein Produkt auf den Markt gebracht, welches f&uuml;r Seiten mit mittlerem Besuchsaufkommen kostenlos ist.<br />
<strong><br />
Fazit</strong><br />
Suchmaschinen-Optimierung ist ein komplexes Thema. Trotz der Erkenntnis, die Sie nach der Lekt&uuml;re des Artikels sicher mit mir teilen, gibt es viele Ans&auml;tze, welche Sie mit geringem Aufwand oder ohne gro&szlig;es Budget verwirklichen k&ouml;nnen. Dennoch ist die Optimierung nie abgeschlossen und sollte immer wieder aufs Neue &uuml;berdacht und &uuml;berpr&uuml;ft werden. Aber mit dieser Einsicht sind Sie bereits auf einem guten Weg, Ihre Seite f&uuml;r Suchmaschinen freundlicher zu gestalten.</p>
<p><strong>Ausblick: Das semantische Web</strong><br />
Derzeit ist das semantische Web (gerne auch als Web 3.0 bezeichnet) in aller Munde. Hinter der Bezeichnung verbirgt sich, &auml;hnlich wie schon beim Web 2.0, nicht eine konkrete Entwicklung, sondern in diesem Falle das Zusammenspiel mehrerer Technologien (XML, XML Schema, RDF, OWL, SPARQL). Im semantischen Web wird durch bessere Auszeichnung der Inhalte deren Verstehen f&uuml;r die Wiedergabe-Programme (Browser, Newsreader, Web Services etc.) erm&ouml;glicht. Die Programme haben somit die M&ouml;glichkeit, die Inhalte entsprechend ihrer Bedeutung aufzubereiten, thematisch zu ordnen oder nach bestimmten Kriterien zu gliedern.<br />
Dies hat gro&szlig;e Relevanz f&uuml;r die Suchmaschinenoptimierung, da &uuml;ber entsprechend gekennzeichnete Inhalte den Suchmaschinen sehr gezielt der enthaltene Sinn vermittelt werden kann. Bieten Sie zum Beispiel in einem Webshop das Buch &quot;Die Wolke&quot; an, f&ouml;rdern Suchanfragen nach &quot;Wolke&quot; in einer Suchmaschine das Produkt nur dann zu Tage, wenn dort auch explizit nach Produkten gesucht wurde.<br />
<strong><br />
SEO !== SEM</strong><br />
H&auml;ufig werden die Begriffe SEO (search engine optimization) und SEM (search engine marketing) durcheinander geworfen. SEO bezeichnet die in diesem Artikel beschriebene Suchmaschinenoptimierung, w&auml;hrend man unter SEM bezahlte Werbeeinblendungen in Suchmaschinen versteht. Bisweilen wird SEO auch als eine Untermenge von SEM verstanden. Dieser Interpretation kann ich mich aber nicht anschlie&szlig;en.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-demmer.de/2008/01/18/google_hier_bin_ich/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>neue Case Study im PHP Magazin erschienen</title>
		<link>http://www.andreas-demmer.de/2007/05/14/neue_case_study_im_php_magazin_erschienen/</link>
		<comments>http://www.andreas-demmer.de/2007/05/14/neue_case_study_im_php_magazin_erschienen/#comments</comments>
		<pubDate>Sun, 13 May 2007 22:00:00 +0000</pubDate>
		<dc:creator>Andreas Demmer</dc:creator>
				<category><![CDATA[Fachartikel]]></category>

		<guid isPermaLink="false">http://www.andreas-demmer.de/2007/05/14/neue_case_study_im_php_magazin_erschienen</guid>
		<description><![CDATA[Die Ausgabe 4.07 des PHP-Magazins, welche diese Woche an den Kiosken erscheint, bringt eine Case Study, welche ich gemeinsam mit Herrn Kremer, dem CIO von Mitsubishi-Motors Deutschland, verfasst habe: MITSU &#8211; Fahrzeugbestellsystem mit PHP Die Mitsubishi-Motors Deutschland GmbH ist mit einem PHP-Pilotprojekt neue Wege gegangen. Mit innovativen Ans&#228;tzen und modernen Entwicklungsmethoden wurde in kurzer Zeit [...]]]></description>
			<content:encoded><![CDATA[<p>Die Ausgabe 4.07 des <a target="_blank" href="http://www.phpmag.de">PHP-Magazins</a>, welche diese Woche an den Kiosken erscheint, bringt eine Case Study, welche ich gemeinsam mit Herrn Kremer, dem CIO von <a target="_blank" href="http://www.mitsubishi-motors.de">Mitsubishi-Motors Deutschland</a>, verfasst habe:<br />
<strong>MITSU &#8211; Fahrzeugbestellsystem mit PHP</strong><br />
<em>Die Mitsubishi-Motors Deutschland GmbH ist mit einem PHP-Pilotprojekt neue Wege gegangen. Mit innovativen Ans&auml;tzen und modernen Entwicklungsmethoden wurde in kurzer Zeit kosteng&uuml;nstig ein anspruchsvolles Fahrzeugbestellsystem realisiert, das die Bed&uuml;rfnisse der User auf den Punkt traf.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-demmer.de/2007/05/14/neue_case_study_im_php_magazin_erschienen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neuer SEO-Artikel im PHP-Magazin</title>
		<link>http://www.andreas-demmer.de/2007/03/13/neuer_seo-artikel_im_php-magazin/</link>
		<comments>http://www.andreas-demmer.de/2007/03/13/neuer_seo-artikel_im_php-magazin/#comments</comments>
		<pubDate>Mon, 12 Mar 2007 22:00:00 +0000</pubDate>
		<dc:creator>Andreas Demmer</dc:creator>
				<category><![CDATA[Fachartikel]]></category>

		<guid isPermaLink="false">http://www.andreas-demmer.de/2007/03/13/neuer_seo-artikel_im_php-magazin</guid>
		<description><![CDATA[Ab morgen ist die April/Mai-Ausgabe des PHP-Magazins am Kiosk erh&#228;ltlich. Diese enth&#228;lt u.a. einen von mir verfassten Artikel &#252;ber Suchmaschinenoptimierung (SEO) mit PHP: Google, hier bin ich! Der Artikel bietet einen guten &#220;berblick &#252;ber die Grundlagen der SEO und zeigt einige technische Ans&#228;tze auf. Interessierte finden den Artikel nicht nur in der Printversion des Hefts, [...]]]></description>
			<content:encoded><![CDATA[<p><img width="99" height="141" align="left" src="/images/weblog/Image/phpmag_03-2007.gif" alt="" /><strong>Ab morgen ist die April/Mai-Ausgabe des <a href="http://www.phpmagazin.de" target="_blank">PHP-Magazins</a> am Kiosk erh&auml;ltlich. Diese enth&auml;lt u.a. einen von mir verfassten Artikel &uuml;ber Suchmaschinenoptimierung (SEO) mit PHP:<em> Google, hier bin ich!<br />
</em></strong>Der Artikel bietet einen guten &Uuml;berblick &uuml;ber die Grundlagen der SEO und zeigt einige technische Ans&auml;tze auf. Interessierte finden den Artikel nicht nur in der Printversion des Hefts, sondern auch als <a href="http://phpmag.de/itr/online_artikel/psecom,id,888,nodeid,62,_language,de.html" target="_blank">Online-Artikel</a> auf der Website des Magazins. Nach Sperrfrist ver&ouml;ffentliche ich den Artikel in voller L&auml;nge wie gewohnt hier im Weblog in der <a href="http://www.andreas-demmer.de/weblog/kategorie_Fachartikel/">Kategorie Fachartikel</a>.<br />
In der n&auml;chsten Ausgabe des Magazins folgt eine gro&szlig;e Case-Study &uuml;ber <em>MITSU</em>, das neue Fahrzeug-Bestellwesen der Mitsubishi Motors GmbH. Diese gesch&auml;ftskritische Applikation wurde von meinem Arbeitgeber <a href="http://www.netz98.de" target="_blank">netz98</a> entwickelt, wobei mir das komplette Projektmanagement des Gro&szlig;projekts oblag.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-demmer.de/2007/03/13/neuer_seo-artikel_im_php-magazin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS Tipps und Tricks</title>
		<link>http://www.andreas-demmer.de/2007/01/08/css_tipps_und_tricks/</link>
		<comments>http://www.andreas-demmer.de/2007/01/08/css_tipps_und_tricks/#comments</comments>
		<pubDate>Sun, 07 Jan 2007 22:00:00 +0000</pubDate>
		<dc:creator>Andreas Demmer</dc:creator>
				<category><![CDATA[Fachartikel]]></category>

		<guid isPermaLink="false">http://www.andreas-demmer.de/2007/01/08/css_tipps_und_tricks</guid>
		<description><![CDATA[Der CSS Guy beantwortet inseinem Weblog Ask the CSS Guy nicht nur allerei fragen rund um Cascading Stylesheets, sondern ver&#246;ffentlicht auch wirklich abefahrene Tutorials, bspw. diesen spannenden Artikel, wie man automatisiert alle externen Links durch die Favicons der verlinkten Seiten erg&#228;nzt. Echt lesenswert und wieder ein Newsfeed mehr zum abonnieren&#8230;]]></description>
			<content:encoded><![CDATA[<p>Der <strong>CSS Guy</strong> beantwortet inseinem Weblog <a target="_blank" href="http://www.askthecssguy.com">Ask the CSS Guy</a> nicht nur allerei fragen rund um Cascading Stylesheets, sondern ver&ouml;ffentlicht auch wirklich abefahrene Tutorials, <a target="_blank" href="http://www.askthecssguy.com/2006/12/hyperlink_cues_with_favicons.html">bspw. diesen spannenden Artikel</a>, wie man automatisiert alle externen Links durch die Favicons der verlinkten Seiten erg&auml;nzt. Echt lesenswert und wieder ein Newsfeed mehr zum abonnieren&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-demmer.de/2007/01/08/css_tipps_und_tricks/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>E-Mail-Marketing 2.0</title>
		<link>http://www.andreas-demmer.de/2006/12/08/e-mail-marketing_20/</link>
		<comments>http://www.andreas-demmer.de/2006/12/08/e-mail-marketing_20/#comments</comments>
		<pubDate>Thu, 07 Dec 2006 22:00:00 +0000</pubDate>
		<dc:creator>Andreas Demmer</dc:creator>
				<category><![CDATA[Fachartikel]]></category>

		<guid isPermaLink="false">http://www.andreas-demmer.de/2006/12/08/e-mail-marketing_20</guid>
		<description><![CDATA[Was kommt dabei heraus wenn man beruflich mit E-Mail-Marketing zu tun hat, Web 2.0 Projekte plant und seine Gedanken auf Wanderschaft schickt? Ganz einfach: E-Mail-Marketing 2.0!]]></description>
			<content:encoded><![CDATA[<p>Was kommt dabei heraus wenn man beruflich mit E-Mail-Marketing zu tun hat, Web 2.0 Projekte plant und seine Gedanken auf Wanderschaft schickt? Ganz einfach: <a target="_blank" href="http://www.marketing-meile.de/?p=177">E-Mail-Marketing 2.0</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-demmer.de/2006/12/08/e-mail-marketing_20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Don`t call us – we call you!</title>
		<link>http://www.andreas-demmer.de/2006/10/18/dont_call_us_-_we_call_you/</link>
		<comments>http://www.andreas-demmer.de/2006/10/18/dont_call_us_-_we_call_you/#comments</comments>
		<pubDate>Tue, 17 Oct 2006 22:00:00 +0000</pubDate>
		<dc:creator>Andreas Demmer</dc:creator>
				<category><![CDATA[Fachartikel]]></category>

		<guid isPermaLink="false">http://www.andreas-demmer.de/2006/10/18/dont_call_us_-_we_call_you</guid>
		<description><![CDATA[Das Beobachter-Entwurfsmuster in PHP &#34;Welchen Objekten muss ich noch mal mitteilen, dass der Benutzer jetzt Administrator ist? Blo&#223; keines vergessen&#8230;&#34;. Abh&#228;ngigkeiten k&#246;nnen eine l&#228;stige Sache sein wenn man diese stets im Kopf behalten muss. Wie sch&#246;n es doch w&#228;re, wenn man sich dieser l&#228;stigen Pflicht entledigen k&#246;nnte! Bittesch&#246;n, das Beobachter-Entwurfsmuster nimmt Ihnen diese Arbeit gerne [...]]]></description>
			<content:encoded><![CDATA[<p><em>Das Beobachter-Entwurfsmuster in PHP</em><br />
&quot;Welchen Objekten muss ich noch mal mitteilen, dass der Benutzer jetzt Administrator ist? Blo&szlig; keines vergessen&#8230;&quot;. Abh&auml;ngigkeiten k&ouml;nnen eine l&auml;stige Sache sein wenn man diese stets im Kopf behalten muss. Wie sch&ouml;n es doch w&auml;re, wenn man sich dieser l&auml;stigen Pflicht entledigen k&ouml;nnte!<br />
Bittesch&ouml;n, das Beobachter-Entwurfsmuster nimmt Ihnen diese Arbeit gerne ab.<span id="more-232"></span><strong>Problembeschreibung</strong><br />
Bisweilen sind Objekte von einander abh&auml;ngig: Teilt man dem Benutzerobjekt mit, dass der Benutzer jetzt Administrator ist, muss man dies auch dem Rechteobjekt mitteilen. Schlie&szlig;lich will die neue Benutzerrolle auch mit den passenden Privilegien versehen werden. Diese simple Abh&auml;ngigkeit ist noch einfach zu merken und es f&auml;llt dem Programmierer sicherlich nicht schwer, sie bei jeder &Auml;nderung der Benutzerrolle zu ber&uuml;cksichtigen. Was aber, wenn die Abh&auml;ngigkeiten sehr viel umfangreicher und komplexer werden? Nach dem Erteilen des Administratorstatus soll das Sicherungsobjekt vielleicht die neue Benutzerrolle in der Datenbank speichern, was wiederum bedeuten w&uuml;rde, dass das Wiederherstellungsobjekt seine Liste der verf&uuml;gbaren Sicherungsst&auml;nde aktualisieren m&uuml;sste. Ganz zu schweigen von der Notwendigkeit, dass das f&uuml;r die Bildschirmdarstellung zust&auml;ndige Objekt die neuen Sachverh&auml;ltnisse auch anzeigen muss.<br />
Dieses Beispiel verdeutlicht vielleicht, dass eine vermeintlich kleine &Auml;nderung des Zustands eines Objektes einen Rattenschwanz an bedingten &Auml;nderungen an anderen Objekten nach sich ziehen kann. Wohl dem Programmierer, der sich vor der Implementierung der Applikation einen Bauplan in Form von Strukturdiagrammen angelegt hat. Diese k&ouml;nnen ihm helfen, wenigstens halbwegs den &Uuml;berblick zu behalten, wo welche &Auml;nderung weitere &Auml;nderungen bed&uuml;rfen. Allerdings sch&uuml;tzen auch Strukturdiagramme nicht davor, diese falsch zu interpretieren oder die eine oder andere &Auml;nderung zu vergessen. Die Konsequenz: Auf einen Schlag ist die Konsistenz der gesamten Applikation zunichte gemacht. Ein vermeintlich kleiner Fehler, eine Diskrepanz zwischen Benutzerrolle im Userobjekt und den Rechten im Rechteobjekt etwa, durch die schlichte Tatsache zustande gekommen, dass zwar das Userobjekt, nicht aber das Rechteobjekt aktualisiert wurden, kann fatale Folgen haben. Ein solcher Fehler ist schwer zu finden und stellt einen erheblichen Zeitaufwand beim Debugging dar. Sp&auml;testens hier w&auml;chst der Wunsch nach einer L&ouml;sung, die bedingte &Auml;nderungen selbst&auml;ndig durchf&uuml;hrt und somit hilft, Inkonsistenzen zwischen den Objekten zu vermeiden.</p>
<p><strong>Probleml&ouml;sung</strong><br />
Der Ansatz, den das Beobachter-Entwurfsmuster (eng.: observer pattern) beschreibt, definiert Abh&auml;ngigkeiten zwischen Objekten in einem publisher/subscriber genannten Verfahren: Objekte, welche von bestimmten Objekten abh&auml;ngig sind, &bdquo;abonnieren&ldquo; diese und werden von ihnen fortan &uuml;ber &Auml;nderungen des abonnierten Objektes unterrichtet.<br />
Damit z&auml;hlt das Beobachter-Muster zu der Klasse der objektorientierten Verhaltensmustern indem es Abh&auml;ngigkeiten zwischen Objekten abbilden kann.<br />
Dies geschieht wie folgt: Zu einem bestimmten Zeitpunkt erbittet der subscriber ein Abonnement beim publisher. Dies geschieht am sinnvollsten bereits im Konstruktor des subscribers. Hierzu muss der subscriber dem publisher eine callback Schnittstelle anbieten, &uuml;ber die der publisher ihn erreichen kann. Der publisher wiederum f&uuml;hrt alle seine Abonnenten in einer Abonnentenliste. &Auml;ndert sich nun der Zustand des publishers so, dass sich dies auf seine &auml;u&szlig;ere Repr&auml;sentation niederschl&auml;gt, so informiert er alle in der Liste enthaltenen Abonnenten &uuml;ber deren einheitliche Schnittstelle.<br />
Das Schlagwort der &auml;u&szlig;eren Repr&auml;sentation ist schnell erkl&auml;rt: Zustands&auml;nderungen k&ouml;nnen entweder private Attribute betreffen, die nach au&szlig;en hin nicht sichtbar sind und auch keine R&uuml;ckgabewerte von &ouml;ffentlichen Methoden ver&auml;ndern, oder sie k&ouml;nnen &ouml;ffentliche Attribute und R&uuml;ckgabewerte von &ouml;ffentlichen Methoden &auml;ndern. Zustands&auml;nderungen der zweiten Art ver&auml;ndern somit die &auml;u&szlig;ere Repr&auml;sentation der Objekte; In der Regel sind nur sie interessant f&uuml;r Abonnenten.<br />
Es obliegt nun dem subscriber auf die vom publisher mitgeteilte &Auml;nderung zu bearbeiten. Hierzu muss der subscriber ermitteln, ob die &Auml;nderungen des publishers f&uuml;r ihn relevant sind und entsprechend reagieren: Entweder die &Auml;nderung ist relevant und der subscriber fragt ben&ouml;tigte Attribute des publishers ab, oder er ignoriert die Mitteilung. In einer anderen Variante dieses Enturfsmusters sendet der publisher Informationen &uuml;ber die erfolgten &Auml;nderungen gleich mit (siehe hierzu Box &bdquo;Push or pull?&ldquo;).<br />
Ein so bestehendes publisher/subscriber Verh&auml;ltnis l&auml;sst sich nat&uuml;rlich jederzeit (auch ohne Beachtung von Fristen und Vertragslaufzeiten) k&uuml;ndigen; Der publisher streicht den subscriber auf dessen Anfrage hin einfach aus seiner Abonnentenliste. Der subscriber erh&auml;lt darauf hin keine Mitteilungen mehr vom publisher.<br />
Das ganze Verfahren ist so bildlich, dass es quasi selbsterkl&auml;rend ist. Aus diesem Grunde wird dieses Mal auf ein Beispiel aus dem wirklichen Leben verzichtet.</p>
<p><strong>Implementierung</strong><br />
Nachdem im Juli der final release von PHP5 ver&ouml;ffentlicht wurde, macht dieses Beispiel Gebrauch von dessen neuen objektorientierten Features und Sprachkonstrukten. Gerade die Einf&uuml;hrung von Interfaces erweist sich als hilfreich: Da das Beobachter-Muster unabh&auml;ngig von den Klassentypen der involvierten Objekte funktionieren sollte, unterst&uuml;tzen Interfaces den Gedanken der losen Kopplung von Objekten: Die Objekte sind konsequent austauschbar solange deren (teilweise) durch Interfaces definierte API gleich bleibt. Aber auch an Leser, die aus unterschiedlichsten Gr&uuml;nden auf PHP4 festgelegt sind, wurde gedacht: Die Box &bdquo;Das Beobachter-Muster in PHP4&ldquo; gibt einige Anregungen zur Portierung des vorliegenden Quellcodes nach PHP4.<br />
Die Vor&uuml;berlegung &uuml;ber die Gestaltung der API schl&auml;gt sich in der Implementierung von Interfaces nieder: Diese bestimmen alle Methoden und deren Signaturen, &uuml;ber welche die Kommunikation zwischen den am subscriber/publisher Verfahren beteiligten Objekten sp&auml;ter abl&auml;uft (Listing 1).<br />
Das publisher Interface definiert die API zum Abonnieren bzw. zum K&uuml;ndigen von &Auml;nderungsmitteilungen. Class-type hints erlauben hierbei gleich die Voraussetzung zu definieren, dass der im Funktionskopf &uuml;bergebene subscriber das subscriber Interface implementiert haben muss. Auch wenn der Name &bdquo;class-type hint&ldquo; etwas anderes suggeriert: Es k&ouml;nnen nicht nur Klassentypen sondern auch implementierte Interfaces verlangt werden.&nbsp; Das subscriber Interface wiederum definiert die callback Methode, an die der publisher seine Mitteilungen senden kann. Da hier das Pull-Verfahren Anwendung findet, existiert kein Parameter, der erweiterte Angaben &uuml;ber die am publisher gemachten &Auml;nderungen machen k&ouml;nnte.<br />
Das dritte Interface, provideRole, ist vom Prinzip her nicht unbedingt erforderlich f&uuml;r dieses Beispiel, demonstriert aber erneut den Grundgedanken der losen Kopplung zwischen subscriber und publisher: es verhindert, dass der subscriber den Klassentyp des publishers kennen muss. Solange die Bezeichnung und Signatur der zust&auml;ndigen Methode gleich bleibt, ist der Klassentyp austauschbar.<br />
Als publisher zeigt das Listing 2&nbsp; mit der Klasse user eine stark vereinfachte Klasse zur Verwaltung eines Users. Diese implementiert die Interfaces publisher und getRole. Mit Hilfe der Methoden user::setRole() und user::getRole() bietet sie lediglich die M&ouml;glichkeit, eine Benutzerrolle in Form einer Integer-Zahl zu setzen und auch wieder abzufragen. Alle dar&uuml;ber hinausgehenden Methoden dienen dem Beobachter-Muster.<br />
Listing 3 zeigt die Klasse rights. Sie fungiert als subscriber und implementiert das gleichnamige Interface. Ihre Aufgabe ist die Verkn&uuml;pfung von Benutzerrollen mit Benutzerrechten. Auch sie bietet nach au&szlig;en hin neben den Methoden, die dem Beobachter-Muster vorbehalten sind, lediglich die M&ouml;glichkeit mit rights::get() eine Auflistung der aktuellen Benutzerrechte abzufragen.<br />
Den Beweis der Funktionalit&auml;t und Praktikabilit&auml;t tritt schlussendlich das Listing 4 an. Dort werden Exemplare (Objekte) der Userklasse und Rechteklasse erzeugt. Dabei wird dem Rechteobjekt eine Referenz auf die Userklasse &uuml;bergeben. Das Rechteobjekt fragt bei dessen Erzeugung im Konstruktor die Benutzerrolle beim per Referenz &uuml;bergebenen Userobjekt ab und abonniert dessen &Auml;nderungsmitteilungen. Das Userobjekt legt daraufhin einen Verweis auf das Rechteobjekt in seiner Abonnentenliste user::subscribers ab.<br />
Nun werden die Rechte der momentanen Benutzerrolle (Rolle 0) beim Rechteobjekt abgefragt (rights::get()) und das zur&uuml;ckgegebene Array zur Kontrolle ausgegeben: Die enthaltenen Benutzerrechte beschr&auml;nken sich auf Leserechte (read). Anschlie&szlig;end wird dem Userobjekt eine neue Benutzerrolle (Rolle 1) zugewiesen und das Rechteobjekt erneut abgefragt, das zur&uuml;ckgelieferte Array enth&auml;lt diesmal Lese- und &Auml;nderungsrechte (read, change). Ein letztes Mal wird die Benutzerrolle ge&auml;ndert (Rolle 2) und die Benutzerrechte beim Rechteobjekt abgefragt, welches dieses Mal Lese-, &Auml;nderungs- und Erstellungsrechte (read, change, create) zur&uuml;ckliefert.<br />
Die Funktionst&uuml;chtigkeit des Entwurfs ist damit zweifelsfrei nachgewiesen: Da Rechteobjekt bei einer Anfrage nach den Rechten keine Abfrage an das Benutzerobjekt stellt, aber dennoch alle Rechte der jeweils aktuellen Benutzerrolle zur&uuml;ckliefert, muss das Benutzerobjekt &Auml;nderungen der Benutzerrolle zwischenzeitlich dem Rechteobjekt mitgeteilt haben.<br />
Betrachten wir die Abl&auml;ufe beim &Auml;ndern der Benutzerrolle genauer: Nach Aufruf der Methode user::setRole() benachrichtigt das Benutzerobjekt per user::notifySubscribers() alle im Array user::subscribers als Referenz abgelegten Abonnenten und ruft jeweils deren notfiy() Methode auf. So benachrichtigt, fragt das Rechteobjekt die aktuelle Benutzerrolle des Userobjektes ab (rights::loadUserRights()) und speichert die assoziierten Benutzerrechte im Array rights::rights. Eine Abfrage der Benutzerrechte am Benutzerobjekt mit rights::get() liefert dieses Array zur&uuml;ck ohne eine erneute Anfrage an das Benutzerobjekt zu stellen.<br />
Der in den Listings abgedruckte Quellcode ist aus layouttechnischen Gr&uuml;nden gek&uuml;rzt, aber lauff&auml;hig. Die vollst&auml;ndige Fassung findet sich mit ausf&uuml;hrlichen phpDoc Kommentaren versehen auf der CD, die diesem Heft beiliegt.</p>
<p><strong>Push or Pull?</strong><br />
Das Beobachter-Entwurfsmuster kann als Push- oder als Pull-Verfahren implementiert werden. Im in diesem Artikel vorgestellten Pull-Verfahren werden die Abonnenten lediglich dar&uuml;ber in Kenntnis gesetzt, dass eine &Auml;nderung am Zustand des publishers stattgefunden hat, nicht aber welche &Auml;nderung das war. Dies m&uuml;ssen die Abonnenten selbst in Erfahrung bringen. Das Push-Verfahren hingegen schickt zus&auml;tzlich Informationen &uuml;ber die gemachten &Auml;nderungen an alle Abonnenten, welche die Relevanz der Informationen evaluieren k&ouml;nnen.<br />
Beide Verfahren haben Ihre Vor- und Nachteile: Zwar muss beim Pull-Verfahren der Abonnent bei jeder Benachrichtigung pr&uuml;fen, ob die &Auml;nderungen am Zustand publishers f&uuml;r ihn relevant sind, doch bleibt daf&uuml;r die Menge der vom Verteiler gesendeten Daten klein. Beim Push-Verfahren hingegen kann der Abonnent anhand der ihm gelieferten Daten selbst entscheiden, ob eine Aktion notwendig ist und muss nicht erst zus&auml;tzliche Anfragen an den publisher stellen, daf&uuml;r erreichen alle vom publisher gesendeten Daten alle Abonnenten, auch wenn die Daten f&uuml;r einige Abonnenten irrelevant sind. Auch die hierf&uuml;r ben&ouml;tigte API und Auswertungslogik jedes Abonnenten ist weit komplexer als es beim Pull-Verfahren der Fall ist.<br />
<strong><br />
Das Beobachter-Muster in PHP4</strong><br />
Das im Rahmen dieses Artikels vorgestellte Beispiel macht intensiven Gebrauch der neuen PHP5 Sprachkonstrukte. Dennoch ist es ohne gr&ouml;&szlig;eren Aufwand m&ouml;glich, den Code nach PHP4 zu portieren. Der Verzicht auf Interfaces, sowie auf die public/private/protected Deklarationen, fordert vom Programmierer allerdings etwas Disziplin beim Einhalten von Objekt-Integrit&auml;ten um die lose Kopplung von Objekten (und damit deren Austauschbarkeit) nicht zu gef&auml;hrden. Auch ist bei allen &Uuml;bergaben von Objekten darauf zu achten, dass PHP4 (anders als PHP5) kein standardm&auml;&szlig;iges pass-by-reference macht, sondern Kopien der &uuml;bergebenen Objekte anlegt. Abhilfe schafft hier die Verwendung des &amp;$objekt Konstrukts oder die des &amp;= Operators f&uuml;r explizite Referenzen. </p>
<p><strong>Bewertung</strong><br />
Das Beobachter-Muster ist in seiner Anwendung nicht an Spezialf&auml;lle gebunden und kann &uuml;berall zum Einsatz kommen, wo Objektabh&auml;ngigkeiten bestehen. Dies macht es zu einem der bekanntesten und am meisten verwendeten Entwurfsmuster. Eine Transferleistung ist fast nicht n&ouml;tig, die hier vorgestellte API d&uuml;rfte nahezu unver&auml;ndert auf 90% der F&auml;lle, wo ein Pull-Verfahren zur Anwendung kommen soll, zutreffen. Aber auch das Beispiel in ein Push-Verfahren zu &auml;ndern geht ohne gr&ouml;&szlig;eren Anwand.<br />
Eine Besonderheit hat das Beobachter-Muster zu bieten: Im Gegensatz zu den im Verlauf dieser Artikelserie bereits vorgestellten Entwurfsmustern f&uuml;hrt dieses Muster nicht zu signifikanten Performanceeinbussen. Das Prinzip vieler anderer Entwurfsmuster ist die Einf&uuml;hrung einer Interdirektionsebene (siehe Ausgabe 01/2004, Artikel &bdquo;Strickwerk&ldquo;, Box &bdquo;Flexibilit&auml;t vs. Performance&ldquo;). Auf einen solchen Overhead an Codezeilen, die bei jeder Aktion anfallen, kann das Beobachter-Muster verzichten: Alle automatisch und zus&auml;tzlich zur Skriptanweisung ausgef&uuml;hrte Befehle m&uuml;ssten bei Nichtanwendung des Musters auch manuell ausgef&uuml;hrt werden (bis auch Abonnieren/K&uuml;ndigen).<br />
In der Gesamtheit betrachtet dient das Beobachter-Muster vornehmlich der Bequemlichkeit des Programmierers, der sich das Ber&uuml;cksichtigen von Abh&auml;ngigkeiten sparen kann, sobald er diese einmal per Abonnement definiert hat. Einmal mehr findet sich die Weisheit best&auml;tigt, dass &bdquo;Programmierer von Natur aus faul sind&ldquo;. Aber auch eine passende Ausrede steht schon parat: Als Nebeneffekt der Anwendung des Musters wird die Konsistenz der Anwendung sichergestellt. Dies geschieht, da, nachdem eine Abh&auml;ngigkeit per Abonnement definiert wurde, diese fortan bei keiner Aktion mehr vergessen wird.<br />
Der n&auml;chste Teil der Serie behandelt den Dekorierer und stellt damit eine M&ouml;glichkeit vor, Objekte dynamisch um Methoden zu erweitern. Mit Hilfe des Dekorierers kann der Funktionsumfang eines Objektes flexibel ge&auml;ndert werden ohne dass Methoden statisch von einer Elternklasse geerbt werden m&uuml;ssten; Ein ad&auml;quater Ersatz f&uuml;r die in PHP fehlende Mehrfachvererbung.<br />
&nbsp;<code>interface publisher {<br />
&nbsp;&nbsp;&nbsp; public function subscribe(subscriber $subscriber);<br />
&nbsp;&nbsp;&nbsp; public function unsubscribe(subscriber $subscriber);<br />
}</p>
<p>interface subscriber {<br />
&nbsp;&nbsp;&nbsp; public function notify();<br />
}</p>
<p>interface provideRole {<br />
&nbsp;&nbsp;&nbsp; public function getRole();<br />
}</p>
<p>
class user implements publisher, provideRole {<br />
&nbsp;&nbsp;&nbsp; private $subscribers = array();<br />
&nbsp;&nbsp;&nbsp; private $role;<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; public function __construct() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;role = 0;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; public function subscribe(subscriber $subscriber) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;subscribers[] = $subscriber;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; public function unsubscribe(subscriber $subscriber) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unset($this-&gt;subscribers[$subscriber]);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; private function notifySubscribers() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach($this-&gt;subscribers as $subscriber) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $subscriber-&gt;notify();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; public function setRole($role) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;role = intval($role);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;notifySubscribers();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; public function getRole() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $this-&gt;role;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>
class rights implements subscriber {<br />
&nbsp;&nbsp;&nbsp; private $user;<br />
&nbsp;&nbsp;&nbsp; private $rights;<br />
&nbsp;&nbsp;&nbsp; private $roles = array(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 =&gt; array('read'),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 =&gt; array('read', 'change'),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 =&gt; array('read', 'change', 'create')<br />
&nbsp;&nbsp;&nbsp; );<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; public function __construct($user) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;user = $user;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;user-&gt;subscribe($this);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;loadUserRights();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; private function __destruct() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;user-&gt;unsubscribe($this);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; public function notify() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;loadUserRights();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; private function loadUserRights() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;rights = $this-&gt;roles[$this-&gt;user-&gt;getRole()];<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public function get() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $this-&gt;rights;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>
$user = new user();<br />
$rights = new rights($user);</p>
<p>print_r($rights-&gt;get());</p>
<p>$user-&gt;setRole(1);<br />
print_r($rights-&gt;get());</p>
<p>$user-&gt;setRole(2);<br />
print_r($rights-&gt;get());</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.andreas-demmer.de/2006/10/18/dont_call_us_-_we_call_you/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
