<?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>CWD - Customized Web Development &#187; Tutorials</title>
	<atom:link href="http://www.cwd.at/category/blog/php/tutorials/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cwd.at</link>
	<description></description>
	<lastBuildDate>Fri, 30 Oct 2009 00:27:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Aufruf an die PHP Experten: ErrorHandling HowTo</title>
		<link>http://www.cwd.at/2009/05/25/aufruf-an-die-php-experten-errorhandling-howto/</link>
		<comments>http://www.cwd.at/2009/05/25/aufruf-an-die-php-experten-errorhandling-howto/#comments</comments>
		<pubDate>Mon, 25 May 2009 21:36:32 +0000</pubDate>
		<dc:creator>LudwigR</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://www.cwd.at/?p=121</guid>
		<description><![CDATA[Normalerweise, wenn ich ein Problem habe, mache ich was tausende Leute auch machen. Googeln. Leider habe ich diesmal nicht wirklich etwas gefunden. Problemstellung: Ich bin gerade dabei eine ziemlich große mehrteilige API zu schreiben. Diese API wird von anderen Programmieren verwendet. Mein Problem ist nun, wie handle ich das ErrorReporting. Klar, ich kann für jede [...]]]></description>
			<content:encoded><![CDATA[<p>Normalerweise, wenn ich ein Problem habe, mache ich was tausende Leute auch machen. Googeln. Leider habe ich diesmal nicht wirklich etwas gefunden.</p>
<p><span id="more-121"></span></p>
<p>Problemstellung:</p>
<p>Ich bin gerade dabei eine ziemlich große mehrteilige API zu schreiben. Diese API wird von anderen Programmieren verwendet. Mein Problem ist nun, wie handle ich das ErrorReporting.</p>
<p>Klar, ich kann für jede meiner Hauptklassen eigene Exception Klassen schreiben, die müssten aber wiederum eigene Exception Codes ausgeben damit die Programmierer welche die API verwenden wissen wie sie darauf reagieren sollen. Eigentlich wollte ich es vermeiden eine Liste mit Fehlercodes zu erstellen. (ob nun mit oder ohne Exceptions)</p>
<p>Ich wollte Exceptions eigentlich nur verwenden wenn &#8220;Unerwartetes&#8221; passiert. ZB. keine Datenbankconnection, File konnte nicht ins Filesystem geschrieben werden&#8230; solche Dinge. Darüber hat auch <a href="http://www.phphatesme.com/blog/softwaretechnik/wann-verwende-ich-exceptions/" target="_blank">Nils Langner in seinem Blog schon geschrieben.</a></p>
<p>Also liebe PHP-Bloggemeinde. Was ist die best Practice in so einem Fall ?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cwd.at/2009/05/25/aufruf-an-die-php-experten-errorhandling-howto/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Six Degrees of Separation (Friend of a Friend)</title>
		<link>http://www.cwd.at/2009/05/13/six-degrees-of-seperation-friend-of-a-friend/</link>
		<comments>http://www.cwd.at/2009/05/13/six-degrees-of-seperation-friend-of-a-friend/#comments</comments>
		<pubDate>Wed, 13 May 2009 20:28:11 +0000</pubDate>
		<dc:creator>LudwigR</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://cwd/?p=50</guid>
		<description><![CDATA[Nein, hier geht&#8217;s nicht um den Film-Remake mit Will Smith (Six Degrees of Separation) sondern um eine Funktion die man öfters auf Social-Web 2.0 Seiten sieht. Ich kenne diese Person über &#8230;. Kleine Geschichtsstunde. Ich bin so frei und übernehme den Text des Wikipedia Artikels: 1967 startete der Psychologe/Soziologe Stanley Milgram (übrigends der selbe welcher [...]]]></description>
			<content:encoded><![CDATA[<p>Nein, hier geht&#8217;s nicht um den Film-Remake mit Will Smith (<a href="http://www.imdb.com/title/tt0108149/" target="_blank">Six Degrees of Separation</a>) sondern um eine Funktion die man öfters auf Social-Web 2.0 Seiten sieht. Ich kenne diese Person über &#8230;. <span id="more-50"></span> Kleine Geschichtsstunde. Ich bin so frei und übernehme den Text des <a href="http://de.wikipedia.org/wiki/Kleine_Welt#Experiment" target="_blank">Wikipedia Artikels</a>:</p>
<blockquote><p>1967 startete der Psychologe/Soziologe Stanley Milgram (übrigends der selbe welcher das &#8220;<a href="http://de.wikipedia.org/wiki/Milgram-Experiment" target="_blank">Milgram Experiment</a>&#8221; durchführte) das &#8220;Small World&#8221; Experiment. Milgram erstellte eine Art Informationspaket, das 60 zufällig ausgewählte Teilnehmer an jeweils eine vorher festgelegte Person in Boston zu senden hatten. Als Startpunkte wählte er Personen aus den sozial und geografisch weit von der Zielstadt entfernten Städten Omaha und Wichita. Die Aufgabe der Teilnehmer bestand darin, das Paket nicht direkt an die Zielperson zu senden, sofern sie diese nicht persönlich kannten (bei ihrem Vornamen ansprachen), sondern an eine Person, die sie persönlich kannten und bei der die Wahrscheinlichkeit höher war, dass sie die Zielperson kannte. Gleichzeitig waren die Teilnehmer angehalten, grundlegende Daten über sich selbst in einer Tabelle zu vermerken und eine Postkarte an die Wissenschaftler zu senden, um die Kette nachvollziehbar zu machen. Insgesamt erreichten drei Pakete die Zielpersonen mit einer durchschnittlichen Pfadlänge von 5,5 oder aufgerundet sechs. Die Wissenschaftler schlossen daraus, dass jede Person der US-amerikanischen Bevölkerung von jeder anderen Person der USA durchschnittlich durch sechs Personen getrennt ist oder, andersherum formuliert, durch durchschnittlich sechs Personen erreicht werden kann. In einem zwei Jahre später durchgeführten Experiment mit 296 möglichen Ketten wurden 217 Pakete gestartet und 64 erreichten ihr Ziel.<sup class="reference">[1]</sup> Im Jahre 1970 folgte ein weiterer Versuch, der, neben der Entfernung der Menschen untereinander, auch mögliche Grenzen zwischen ethnisch unterschiedlichen Gruppen untersuchen sollte. Von 270 mit afroamerikanischen Personen als Ziel gestarteten Paketen erreichten 13 % diese Person, während 33 % von wiederum 270 an „weiße“ Personen adressierte Pakete ihr Ziel erreichten.</p></blockquote>
<p>Möchte man jetzt die Verbindung von Person A zu Person B darstellen, läuft man schnell in das &#8220;<a href="http://de.wikipedia.org/wiki/K%C3%BCrzester_Pfad" target="_blank">shortest path problem</a>&#8220;. Um dies zu lösen eignet sich der sogenannte &#8220;<a href="http://de.wikipedia.org/wiki/Algorithmus_von_Dijkstra" target="_blank">Dijkstra-Algorithmus</a>&#8220;. Wie sieht jetzt die Implementierung in PHP aus ? Wir nehmen an wir haben eine Tabelle mit unseren Usern, und eine zweite welche die Verbindungen der User untereinander darstellt (fromid =&gt; toid).</p>
<pre><code class="SQL">CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL auto_increment,
`firstnames` varchar(200) NOT NULL,
`lastname` varchar(200) NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=22 ;

CREATE TABLE IF NOT EXISTS `links` (
`link_id` int(11) NOT NULL auto_increment,
`fromid` int(11) NOT NULL,
`toid` int(11) NOT NULL,
PRIMARY KEY  (`link_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;

</code></pre>
<p>Als erstes brauchen wir den theoretisch längsten Pfad: Dies wäre die Anzahl der User +1. Nächster Schritt - das Basis array, welches die Schritte von Person x zu Person y festlegt, da wir dies aber noch nicht wissen inintialisieren wir das array mit -1 (unbekannter Pfad). Einen Pfad kennen wir jedoch, nämlich den Pfad von $fromid zu $fromid. Dieser hat die Distanz 0.</p>
<pre><code class="php">
	private function _fetchUser(){
		$m_user = new UserModel();
		$this-&gt;_users = $m_user-&gt;fetchAll();
		$this-&gt;_longestPath = $this-&gt;_users-&gt;count()+1;
	}

	private function _buildSkel($fromid){
		if(!$this-&gt;_users){
			$this-&gt;_fetchUser();
		}

		foreach($this-&gt;_users as $user){
			$this-&gt;_nodes[]=$user-&gt;id;
			$this-&gt;_dist[$user-&gt;id]=$this-&gt;_longestPath;
			$this-&gt;_previous[$user-&gt;id]=-1;
		}

		if($fromid&gt;0)
			$this-&gt;_dist[$fromid]=0;
	}
</code></pre>
<p>Jetzt beginnt der Spass, das Suchen des kürzesten Pfades von User A zu User B:</p>
<pre><code class="php">
	private function _findPath($toid){
		$Q = $this-&gt;_nodes;
		while(count($Q)&gt;0){
			$qsize=count($Q);
			$unode = $this-&gt;_findMin($Q);

			if($unode == $toid){
				break; // We have found ToId
			}

			$u = array_search($unode, $Q);
			$Q[$u]=false;

			$Q = array_filter($Q);

			if($qsize == count($Q)){
				throw new Exception("Qsize doesnt shrink!");
			}

			$m_link = new LinksModel();

			$invitees = $m_link-&gt;fetchAll("fromid='$unode'");
			$inviters = $m_link-&gt;fetchAll("toid='$unode'");

			if($invitees-&gt;count()&gt;0)
				$this-&gt;_relaxNeighbors($unode,$invitees,'toid');

			if($inviters-&gt;count()&gt;0)
				$this-&gt;_relaxNeighbors($unode,$inviters,'fromid');

		}
	}

	private function _relaxNeighbors($unode,$neighbors,$col){
		foreach($neighbors as $neighbor){
			$this-&gt;_relax($unode,$neighbor-&gt;$col);
		}
	}

	private function _relax($u,$v){
		if($this-&gt;_dist[$v] &gt; $this-&gt;_dist[$u]+1){
			$this-&gt;_dist[$v]=$this-&gt;_dist[$u]+1;
			$this-&gt;_previous[$v] = $u;
		}
	}

	private function _findMin($nodes){
		$keys = array_keys($nodes);
		$minid = $nodes[$keys[0]];
		$mindist = $this-&gt;_dist[$minid];

		foreach ($keys as $key){
			$tnode = $nodes[$key];
			if($this-&gt;_dist[$tnode] &lt; $mindist){
				$mindist = $this-&gt;_dist[$tnode];
				$minid=$tnode;
			}
		}

		return $minid;

	}
</code></pre>
<p>Wir laufen also unsere Knoten durch und berechnen die Kantenlängen für jeden Knoten. Dabei wird ein bereits bekannter kürzester Weg benutzt und um eine Kante (zu dem jeweils nächsten) Nachfolgeknoten ergänzt. Dadurch entsteht letztendlich eine Baumstruktur, welche die kürzesten Wege von einem Startknoten repräsentiert. Die gesamte Klasse findet sich auf <a title="http://www.cwd.at/shortestpath.phps" href="http://www.cwd.at/shortestpath.phps" target="_blank">http://www.cwd.at/shortestpath.phps</a> Raum für Optimierung gibt es genug. ZB. das Errechnen der Kantenlängen jedes Users zueinander und Speichern in einer Tabelle. Oder aber auch den gesamten <a title="Dijkstra’s shortest path algorithm" href="http://www.artfulsoftware.com/infotree/queries.php?&amp;bw=1680#766" target="_blank">Algorithmus in die Datenbank auszulagern</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cwd.at/2009/05/13/six-degrees-of-seperation-friend-of-a-friend/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
