<?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"
	>

<channel>
	<title>Technik, Gothic und Anderes</title>
	<atom:link href="http://blog.oncode.info/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.oncode.info</link>
	<description>Technik ist Spiel, Gothic ist ernst und Zeit hat man zuviel</description>
	<pubDate>Thu, 07 Aug 2008 18:23:01 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>de</language>
			<item>
		<title>Automatisches und mehrfaches submitten von Formularen</title>
		<link>http://blog.oncode.info/2008/07/30/automatisches-und-mehrfaches-submitten-von-formularen/</link>
		<comments>http://blog.oncode.info/2008/07/30/automatisches-und-mehrfaches-submitten-von-formularen/#comments</comments>
		<pubDate>Wed, 30 Jul 2008 19:31:54 +0000</pubDate>
		<dc:creator>skaldrom</dc:creator>
		
		<category><![CDATA[Theorie und Schnipsel]]></category>

		<category><![CDATA[Debian]]></category>

		<category><![CDATA[Formular]]></category>

		<category><![CDATA[html]]></category>

		<category><![CDATA[http]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[PEAR]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Programmieren]]></category>

		<category><![CDATA[Selenium]]></category>

		<category><![CDATA[SimpleTest]]></category>

		<category><![CDATA[Submit]]></category>

		<category><![CDATA[Symfony]]></category>

		<category><![CDATA[UnitTests]]></category>

		<category><![CDATA[Wettbewerb]]></category>

		<guid isPermaLink="false">http://blog.oncode.info/?p=445</guid>
		<description><![CDATA[Effizientes, vollautomatisch Ausf&#252;llen und Absenden von HTML-Formularen.]]></description>
			<content:encoded><![CDATA[<h3>Wirre Gedanken</h3>
<p><img src="http://blog.oncode.info/wp-content/uploads/2008/07/form.png" alt="Formular" title="Formular" width="216" height="166" class="lead" align="left" />Dieser Beitrag ist dem Titz gewidmet. Dem Titz, der sich aufgeregt hat <img src='http://blog.oncode.info/wp-includes/images/smilies/icon_pirate2_motz.gif' alt=':pirate-grumble:' class='wp-smiley' /> , obwohl es gar nicht n&#246;tig gewesen w&#228;re und der sich nun mit einer gewissen Teilnehmerredundanz anfreunden muss. Hauptsache ist doch, das PHP fliesst und die Variablen bleiben sauber&#8230; Und ein Bierchen w&#252;rde ich auch noch springen lassen <img src='http://blog.oncode.info/wp-includes/images/smilies/icon_bier.gif' alt=':bier:' class='wp-smiley' /> &#8230;</p>
<p>Eine wichtige Frage zu Beginn: Wieso sollten wir denn automatisch und mehrfach Formulare submitten wollen? Hmm, um den Titz zu &#228;rgern? Weil wir es k&#246;nnen? Weil man manchmal tun muss, was man tun muss? Weil man seine 84 Kinder an einem elektronischen Fussballturnier anmelden will <img src='http://blog.oncode.info/wp-includes/images/smilies/icon_laola.gif' alt=':laola:' class='wp-smiley' /> (hat eigentlich schon jemand bemerkt, dass ich neue Smilies und unglaublich Freude daran habe?)? Oder weil man &#252;ber einen Wettbewerb gestolpert ist, der ebendies nicht verbietet (also das Mehrfachsubmitten, nicht das Kinderanmelden oder die neuen Smilies) und der kein <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2RlLndpa2lwZWRpYS5vcmcvd2lraS9DYXB0Y2hh">Captcha</a> hat (<del datetime="2008-07-31T07:18:40+00:00">vielleicht, weil es der Titz vergessen hat</del>)?</p>
<p><strong>Nachtrag 31.07.2008:</strong> Schenken mir doch so unglaublich nette Mitarbeiter einer Versicherung heute morgen am Bahnhof einen M&#252;sliriegel. Und auf diesem eher gesunden Teil hat es, ja rate, oh wissbegieriges Volk, einen <em>Wettbewerb</em>. Ob der Titz wohl am Abend f&#252;r eine andere Firma weitercoded? Ich werde mich auf jeden Fall w&#228;hrend der Zugfahrt mal damit befassen <img src='http://blog.oncode.info/wp-includes/images/smilies/icon_computer.gif' alt=':computer:' class='wp-smiley' /> .</p>
<h3>Vorgehen</h3>
<h4>Erster Schritt: Selenium IDE</h4>
<p>Man k&#246;nnte nun wie wild losprogrammieren, oder aber einen einfacheren Weg w&#228;hlen. Ein guter Startpunkt f&#252;r automatisiertes Browsen generell ist die <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3NlbGVuaXVtLWlkZS5vcGVucWEub3JnLw==">Selenium IDE</a>. Dieses geniale Teil f&#252;r den Firefox zeichnet wie ein Macrorecorder alles auf, was im Browser gemacht wird. Hat man die Teilnahme beim Wettbewerb einmal so aufgezeichnet, so m&#252;ssen nur noch die <tt>click</tt>&#8217;s, die das Form absenden, durch <tt>clickAndWait</tt>&#8217;s ersetzt werden, damit vor dem Weiterausf&#252;llen (bei mehrseitigen Formularen) auf die neue Seite gewartet wird. Es empfiehlt sich, eine Abschluss&#252;berpr&#252;fung als letzten Schritt hinzuzuf&#252;gen, um um kontrollieren zu k&#246;nnen, ob die Kinder erfolgreich angemeldet wurden (markieren des &#8220;Dankeblabla&#8221;, dann rechte Maustaste und <tt>assertTextPresent</tt>).</p>
<div id="attachment_454" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cub25jb2RlLmluZm8vd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDcvc2VsZW5pdW0taWRlLnBuZw=="><img src="http://blog.oncode.info/wp-content/uploads/2008/07/selenium-ide-300x219.png" alt="Ein Wettbewerb &#252;ber 2 Seiten. Aufgezeichnet und bearbeitet mit der Selenium IDE." title="selenium-ide" width="300" height="219" class="size-medium wp-image-454" /></a><p class="wp-caption-text">Ein Wettbewerb &#252;ber 2 Seiten. Aufgezeichnet und bearbeitet mit der Selenium IDE.</p></div>
<p>Diesen Testcase kann man nun abspeichern und eigentlich immer wieder ausf&#252;hren. Ein Klick reicht und Firefox rasselt alles sch&#246;n durch. Den Namen leicht ver&#228;ndern kann man durch Editieren des Skripts&#8230;</p>
<p>F&#252;r den zweiten Schritt sollte man das Testscript als PHP exportieren.</p>
<h4>Zweiter Schritt: Selenium RC</h4>
<p>Die <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3NlbGVuaXVtLXJjLm9wZW5xYS5vcmcv">Selenium RC</a> Komponente kann den Browser fernsteuern und so ferngesteuert am Wettbewerb teilnehmen. Um sie unter Linux Debian zum Laufen zu kriegen, war ein Bisschen Gemurkse notwendig.</p>
<p>Als Erstes braucht es die originale, genuine JRE von Sun. Ob man die drauf hat, sieht man an der Ausgabe des Kommandos <tt>java -version</tt>. Ich hatte unter meinem Debjan irgendetwas gcj-m&#228;ssiges am Laufen. Umschalten kann man mittels <tt>update-alternatives &#8211;config java</tt> und dann die Sun JRE ausw&#228;hlen.</p>
<p>Notitz an mich selber: Nachdem ich wieder die originale Java-Variante aktiviert habe, l&#228;uft auch Eclipse wieder ohne zu murren. Wahrscheindlich stellt <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2RlLndpa2lwZWRpYS5vcmcvd2lraS9SaWNoYXJkX1N0YWxsbWFu">RMS</a> das jeweils in der Nacht auf allen Compies dieser Erde um <img src='http://blog.oncode.info/wp-includes/images/smilies/icon_confused.gif' alt=':gruebel:' class='wp-smiley' /> &#8230;</p>
<p>Damit alles sch&#246;n zum Laufen kam, brauchte ich die <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3JlbGVhc2Uub3BlbnFhLm9yZy9jZ2ktYmluL3NlbGVuaXVtLXJlbW90ZS1jb250cm9sLXJlZGlyZWN0LnppcA==">latest nightly build</a> Version des Selenium RC Servers. Bei den Anderen ist der Ablauf entweder nach <tt>&#8220;Preparing Firefox profile&#8230;&#8221;</tt> ins Stocken geraten oder es hat Fehlermeldungen gehagelt.</p>
<p>Nun w&#252;rde es darum gehen, als Erstes das <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3NlbGVuaXVtLXJjLm9wZW5xYS5vcmcvdHV0b3JpYWwuaHRtbA==">Selenium RC Tutorial</a> durchspielen zu k&#246;nnen. Dazu startet man den RC-Server und gibt manuell Kommandos ein. Das ist bei mir folgendermassen gelaufen (obwohl Firefox hier Iceweasel heisst).</p>
<p><tt>$ java -jar selenium-server.jar -interactive</tt></p>
<pre>
14:15:51.254 INFO - Java: Sun Microsystems Inc. 10.0-b23
14:15:51.255 INFO - OS: Linux 2.6.25-2-686 i386
14:15:51.258 INFO - v1.0-SNAPSHOT [1123], with Core v1.0-SNAPSHOT [2101]
14:15:51.436 INFO - Version Jetty/5.1.x
14:15:51.437 INFO - Started HttpContext[/selenium-server/driver,/selenium-server/driver]
14:15:51.438 INFO - Started HttpContext[/selenium-server,/selenium-server]
14:15:51.438 INFO - Started HttpContext[/,/]
14:15:51.444 INFO - Started SocketListener on 0.0.0.0:4444
14:15:51.444 INFO - Started org.mortbay.jetty.Server@109a4c
Entering interactive mode... type Selenium commands here (e.g: cmd=open&#038;1=http://www.yahoo.com)
</pre>
<p><tt>cmd=getNewBrowserSession&#038;1=*firefox&#038;2=http://www.google.com</tt><br />
<div id="attachment_463" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cub25jb2RlLmluZm8vd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDcvc2VsZW5pdW0ucG5n"><img src="http://blog.oncode.info/wp-content/uploads/2008/07/selenium-300x225.png" alt="Selenium RC, 1. Schritt" title="Selenium-1" width="300" height="225" class="size-medium wp-image-463" /></a><p class="wp-caption-text">Selenium RC, 1. Schritt</p></div></p>
<pre>
14:16:15.103 INFO - ---> Requesting http://localhost:4444/selenium-server/driver?cmd=getNewBrowserSession&#038;1=*firefox&#038;2=http://www.google.com
14:16:15.273 INFO - Checking Resource aliases
14:16:15.275 INFO - Command request: getNewBrowserSession[*firefox, http://www.google.com] on session null
14:16:15.276 INFO - creating new remote session
14:16:15.470 INFO - Allocated session 27fbf232285044afa404cb9a2b64d861 for http://www.google.com, launching...
14:16:15.651 INFO - Preparing Firefox profile...
14:16:18.488 INFO - Launching Firefox...
14:16:21.615 INFO - Got result: OK,27fbf232285044afa404cb9a2b64d861 on session 27fbf232285044afa404cb9a2b64d861
14:16:24.537 INFO - Started SocketListener on 0.0.0.0:32842
</pre>
<p><tt>cmd=open&#038;1=http://www.google.com/webhp&#038;sessionId=27fbf232285044afa404cb9a2b64d861</tt><br />
<div id="attachment_464" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cub25jb2RlLmluZm8vd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDcvc2VsZW5pdW0xLnBuZw=="><img src="http://blog.oncode.info/wp-content/uploads/2008/07/selenium1-300x225.png" alt="Selenium RC, 2. Schritt" title="Selenium-2" width="300" height="225" class="size-medium wp-image-464" /></a><p class="wp-caption-text">Selenium RC, 2. Schritt</p></div></p>
<pre>
14:17:45.249 INFO - ---> Requesting http://localhost:4444/selenium-server/driver?cmd=open&#038;1=http://www.google.com/webhp&#038;sessionId=27fbf232285044afa404cb9a2b64d861
14:17:45.256 INFO - Command request: open[http://www.google.com/webhp, ] on session 27fbf232285044afa404cb9a2b64d861
14:17:46.296 INFO - Got result: OK on session 27fbf232285044afa404cb9a2b64d861
</pre>
<p><tt>cmd=type&#038;1=q&#038;2=hello world&#038;sessionId=27fbf232285044afa404cb9a2b64d861</tt><br />
<div id="attachment_465" class="wp-caption alignnone" style="width: 310px"><a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cub25jb2RlLmluZm8vd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDcvc2VsZW5pdW0yLnBuZw=="><img src="http://blog.oncode.info/wp-content/uploads/2008/07/selenium2-300x225.png" alt="Selenium RC, 3. Schritt" title="Selenium-3" width="300" height="225" class="size-medium wp-image-465" /></a><p class="wp-caption-text">Selenium RC, 3. Schritt</p></div></p>
<pre>
14:18:24.183 INFO - ---> Requesting http://localhost:4444/selenium-server/driver?cmd=type&#038;1=q&#038;2=hello world&#038;sessionId=27fbf232285044afa404cb9a2b64d861
14:18:24.191 INFO - Command request: type[q, hello world] on session 27fbf232285044afa404cb9a2b64d861
14:18:24.267 INFO - Got result: OK on session 27fbf232285044afa404cb9a2b64d861
</pre>
<p><tt>quit</tt></p>
<pre>
Stopping...
14:18:48.760 INFO - Stopping Acceptor ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=4444]
14:18:48.862 INFO - Stopped SocketListener on 0.0.0.0:4444
14:18:48.862 INFO - Stopping Acceptor [SSL: ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=32842]]
14:18:48.963 INFO - Stopped SocketListener on 0.0.0.0:32842
14:18:49.249 INFO - Stopped HttpContext[/selenium-server/driver,/selenium-server/driver]
14:18:49.421 INFO - Stopped HttpContext[/selenium-server,/selenium-server]
14:18:49.594 INFO - Stopped HttpContext[/,/]
14:18:49.595 INFO - Stopped org.mortbay.jetty.Server@109a4c
14:18:49.596 INFO - Killing Firefox...
</pre>
<p>Vorsicht, Selenium RC verstellt die Proxyeinstellungen. Manchmal muss man sie von Hand wieder zur&#252;ckstellen, insbesondere beim Konqueror.</p>
<p>Nun w&#252;rde es darum gehen, das Ganze in PHP zum Laufen zu kriegen. Daf&#252;r muss <tt>Testing_Selenium</tt> aus dem PEAR Archiv installiert werden. <tt>pear install Testing_Selenium</tt> Verweist einem dann auf <tt>pear install channel://pear.php.net/Testing_Selenium-0.4.3</tt> (oder &#228;hnlich) das dann den Job erledigt.</p>
<p>Den PHP-Code aus der IDE kann man nun direkt in eine Datei mit demselben Namen wie die Klasse (<tt>Example.php</tt>) speichern und an Hand des <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5waHB1bml0LmRlL3BvY2tldF9ndWlkZS8zLjMvZW4vc2VsZW5pdW0uaHRtbA==">PHPUnit Manuals</a> ausf&#252;hren:</p>
<pre>
$ phpunit Example.php
PHPUnit 3.2.21 by Sebastian Bergmann.
.
Time: 15 seconds

OK (1 test)
</pre>
<p>Den wahnsinnigen Genies unter den Lesern sei es nun selbst &#252;berlassen, ein <tt>for(ever)</tt> Loop zu bauen. 15 Sekunden braucht ein Submit, das w&#252;rde bedeuten, dass pro Tag 5&#8242;760 Kinder an das Turnier angemeldet oder aber auch 5&#8242;760 Wettbewerbsteilnahmen gemacht werden k&#246;nnten.</p>
<p>Das k&#246;nnte man auch direkt parallelisieren, wir gehen aber noch einen Schritt weiter.</p>
<h4>Letzter Schritt: PHP-Browser von Simpletest</h4>
<p><a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5sYXN0Y3JhZnQuY29tL2Jyb3dzZXJfZG9jdW1lbnRhdGlvbi5waHA=">SimpleTest</a> bietet einen <tt>Scriptable Browser</tt> an. Schreiben wir doch unser Skript f&#252;r ihn um.<br />
[cc lang="php"]<br />
<?php<br />
  require_once('simpletest/browser.php');<br />
  require_once('janus.php');</p>
<p>  $browser = &#038;new SimpleBrowser();<br />
  $browser->useCookies();<br />
  $browser->setMaximumRedirects(10);</p>
<p>  $browser->addHeader(&#8217;User-Agent: &#8216;.getRandomUseragentString());</p>
<p>  $browser->get(&#8221;http://wettbewerb.irgendwo.ch/index.php?pid=3100&#038;gl=formstep_1_from_wettbewerb_de&#8221;);</p>
<p>  $browser->setField(&#8221;anrede&#8221;, &#8220;herr&#8221;);<br />
  $browser->setField(&#8221;vorname&#8221;, modify(array(&#8221;Skaldrom&#8221;, &#8220;Skaldrom Y.&#8221;)));<br />
  $browser->setField(&#8221;name&#8221;, modify(&#8221;Sarg&#8221;));<br />
  $browser->setField(&#8221;strasse&#8221;, modify(array(&#8221;Oncodestrasse&#8221;, &#8220;Oncodestr.&#8221;, &#8220;Oncodestr&#8221;)));<br />
  $browser->setField(&#8221;nr&#8221;, modify(&#8221;666&#8243;));<br />
  $browser->setField(&#8221;plz&#8221;, modify(&#8221;9900&#8243;));<br />
  $browser->setField(&#8221;ort&#8221;, modify(&#8221;Internetingen&#8221;));<br />
  $browser->setField(&#8221;geburtsdatum&#8221;, rand(18,30).&#8221;.0&#8243;.rand(4,9).&#8221;.19&#8243;.rand(10,17));<br />
  $browser->submitFormById(&#8221;form1&#8243;);</p>
<p>  echo &#8220;1&#8243;;</p>
<p>  $browser->get(&#8221;http://wettbewerb.irgendwo.ch/index.php?pid=3200&amp;gl=formstep_2_from_formstep_1_de&#8221;);<br />
  $browser->setField(&#8221;wohnen&#8221;, &#8220;mieter&#8221;);<br />
  $browser->setField(&#8221;teilnahmebe&#8221;,&#8221;1&#8243;);<br />
  $browser->submitFormById(&#8221;form1&#8243;);</p>
<p>  echo &#8220;2&#8243;;</p>
<p>  $browser->get(&#8221;http://wettbewerb.irgendwo.ch/index.php?pid=3300&amp;gl=wettbewerb_best_from_formstep_2_de&#8221;);</p>
<p>  if(strpos($browser->getContentAsText(),&#8221;Wir freuen uns &#252;ber Ihre Teilnahme. Viel Gl&#252;ck beim Wettbewerb!&#8221;)===false) {<br />
    echo &#8220;Something went wrong\n\n&#8221;;<br />
    echo $browser->getContentAsText();<br />
  } else {<br />
    echo &#8220;OK\n&#8221;;<br />
  }<br />
?><br />
[/cc]</p>
<p>F&#252;r 1337: Was bedeutet <tt>modify</tt>? Diese Funktion ist wie <tt>getRandomUseragentString()</tt> in <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cub25jb2RlLmluZm8vd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDcvamFudXNwaHAuemlw">janus.php</a> definiert. Damit unsere Kinder nicht aus Versehen gel&#246;scht werden, werden die Eintr&#228;ge hier bei jeder Anmeldung leicht modifiziert: Spaces, Ersetzen von Buchstaben, &#8230; Genau darum werden auch verschiedene User-Agens &#252;bertragen. Hoffen wir mal, der Titz loggt keine IP, sonst m&#252;ssten wir halt zus&#228;tzlich noch Proxies bem&#252;hen&#8230;</p>
<p>Der Simpletest-Browser kann leider kein JavaScript, und so muss man unter Umst&#228;nden etwas experimentieren. Im Unterschied zu Selenium, wird <tt>click</tt> wirklich nur f&#252;r Links verwendet und er wartet selber darauf, bis die neue Seite komplett geladen wurde. </p>
<p>Mit den gemessenen 5 Sekunden pro Submit k&#246;nnte ich 17&#8242;280 Kinder pro Tag anmelden, und das auch relativ einfach parallelisieren. Ein Rechner muss nur einen PHP Interpreter installiert haben und schon kann er beim Submitten helfen <img src='http://blog.oncode.info/wp-includes/images/smilies/icon_owned.gif' alt=':owned:' class='wp-smiley' /> .</p>
<h3>Weitere, scriptable Browser</h3>
<p>Einen weiteren Browser f&#252;r &#228;hnliche Experimente gibt es bei <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5zeW1mb255LXByb2plY3Qub3JnL2FwaS8xXzIvc2ZCcm93c2Vy">Symfony</a>. F&#252;r Anspruchsvolle gibt es einen &#8220;Browser&#8221; in Java, der sogar JavaScript unterst&#252;tzt bei <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2h0bWx1bml0LnNvdXJjZWZvcmdlLm5ldC8=">HtmlUnit</a>.</p>
<h3>Frache&#8230;?</h3>
<p>Wenn jemand was gewinnt oder die Kinder das Fussballturnier ownen, w&#252;rdet Ihr dann einen Kommentar hierhin schreiben?
<p>© 2008 bei Skaldrom Y. Sarg von oncode.info<br />
&#220;bers ein Produkt bloggen lassen oder mit Bloggen Geld verdienen? Mache ich mit <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy50cmlnYW1pLmNvbS8/cmVmPVNrYWxkcm9tK1kuK1Nhcmc=" rel='nofollow'>Trigami</a>.</p>
 <img src="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?view=1&post_id=445" width="1" height="1" style="display: none;" /><h3>Ähnliche Artikel</h3><ul class="related_post"><li><a href="http://blog.oncode.info/2007/10/25/eine-eigene-programmiersprache-erschaffen-lexer-und-parser-in-php/" title="Eine eigene Programmiersprache erschaffen? Lexer und Parser in PHP!">Eine eigene Programmiersprache erschaffen? Lexer und Parser in PHP!</a></li><li><a href="http://blog.oncode.info/2008/07/28/dynamische-signatur-e-schrecking-fuer-foren-myspace/" title="Dynamische Signatur - e-Schrecking für Foren, MySpace, &#8230;">Dynamische Signatur - e-Schrecking für Foren, MySpace, &#8230;</a></li><li><a href="http://blog.oncode.info/2008/05/07/php_self-ist-boese-potentielles-cross-site-scripting-xss/" title="PHP_SELF ist böse! Potentielles Cross Site Scripting (XSS)!">PHP_SELF ist böse! Potentielles Cross Site Scripting (XSS)!</a></li><li><a href="http://blog.oncode.info/2007/11/26/php-uwa-widget-library/" title="PHP-UWA Widget Library">PHP-UWA Widget Library</a></li><li><a href="http://blog.oncode.info/2007/11/07/einfache-animationen-auf-der-konsole-mit-php-1-dimensional/" title="Einfache Animationen auf der Konsole mit PHP (1-Dimensional)">Einfache Animationen auf der Konsole mit PHP (1-Dimensional)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.oncode.info/2008/07/30/automatisches-und-mehrfaches-submitten-von-formularen/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Dynamische Signatur - e-Schrecking f&#252;r Foren, MySpace, &#8230;</title>
		<link>http://blog.oncode.info/2008/07/28/dynamische-signatur-e-schrecking-fuer-foren-myspace/</link>
		<comments>http://blog.oncode.info/2008/07/28/dynamische-signatur-e-schrecking-fuer-foren-myspace/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 20:02:03 +0000</pubDate>
		<dc:creator>skaldrom</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[dynamisch]]></category>

		<category><![CDATA[Forum]]></category>

		<category><![CDATA[IP]]></category>

		<category><![CDATA[Location]]></category>

		<category><![CDATA[MySpace]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Programmieren]]></category>

		<category><![CDATA[Signaturen]]></category>

		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://blog.oncode.info/2008/07/28/dynamische-signatur-e-schrecking-fuer-foren-myspace/</guid>
		<description><![CDATA[Eine Signatur (oder Widget) er&#246;ffnet viele M&#246;glichkeiten die ahnungslosen User zu erschrecken. Dies ist ein Tutorial wie man alle zusammen mit PHP benutzt.]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.danasoft.com/sig/SkaldromsSigns.jpg" border="0" align='left' class='lead' alt='Dynamische Signatur von Danasoft' /> Ich mag es sehr, Leute zu &#228;ngstigen. Fr&#252;her, zu den Gothenzeiten, habe ich daf&#252;r ein ganzes Arsenal von Dingen gebraucht: Schminke, Linsen, k&#252;nstliche Fingern&#228;gel, &#8230; Heute reicht meine Anwesenheit und mein Gesicht <img src='http://blog.oncode.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Wenn ich mich unter besonders verst&#228;ndnisvollen Menschen befinde, breche ich in spontane, apokalyptische Prophezeiungen oder aber auch abwechselnd in ebenso apokalyptisch anmutende Zuckungen aus.</p>
<p>Als besonders &#228;ngstigend hat sich auch folgendes Vorgehen herausgestellt: Man fixiert eine Person, l&#228;chelt wissend, nickt ebenso wissend und macht wissende Bemerkungen wie &#8220;ja, es ist schon schwer&#8221; oder aber auch &#8220;ich denke Du machst bald einen Fehler&#8221;.</p>
<p>Online kommt mein Gesicht nicht so zur Geltung und Zuckungen fahren &#252;ber die Webcam auch nicht so apokalyptisch durch Mark und Bein, also haben acht von neun Stimmen in meinem Kopf gesagt, ich soll den letzten Trick elektronifizieren (eine Stimme summte die Melodie von Tetris).</p>
<p><a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5kYW5hc29mdC5jb20=">Danasoft</a> hat schon was sehr Nettes, wie man am Lead-Image erkennen kann. Ich will aber nichts Nettes, sondern was B&#246;ses, darum habe ich die P&#246;hse Horror Pranke (PHP) hervorgeholt und was gecoded.</p>
<h2>Grundidee</h2>
<p>(Reload f&#252;r weitere Weisheiten).<br />
<img src="http://apps.oncode.info/signature/signature.php" alt="Dynamische Signatur"/></p>
<p>Es soll eine Signatur (oder Batch, Widget, Papperl, &#8230;) werden, die man in Foren (MyFace, SpaceBook, prollVZ, &#8230;) und Blogs verwenden kann, und das vorgibt mehr zu wissen als es tats&#228;chlich tut.</p>
<p>Noch etwas Geschichtliches: Ich weiss noch, als die ersten Besucherz&#228;hler mit Bildern gemacht wurden, weil es noch keine richtige M&#246;glichkeit gab, Texte zu ver&#228;ndern! Jaja, so war das damals!</p>
<h2>Informationsquellen</h2>
<p>Grunds&#228;tzlich gibt es drei Informationsquellen wenn man in einem Forum einen Link zu einem eigenen Bild posten darf:</p>
<ul>
<li>Die IP Adresse (Ort, Land, ISP, &#8230;)</li>
<li>HTTP-Header (Browser, OS, Bildschirmaufl&#246;sung, Referer, &#8230;)</li>
<li>Cookies (Anzahl Besuche, Zeit der Besuche, Ver&#228;nderungen, &#8230;)</li>
</ul>
<h3>Ort aus IP</h3>
<p>Grunds&#228;tzlich k&#246;nnte man aus IP-Adressen eine Datenbank anlegen und jeweils dazu schreiben, wo die entsprechende IP-Nummerzu Hause ist. Zum Gl&#252;ck hat das schon jemand gemacht und es gibt freie wie auch kommerzielle Angebote. Um den richtigen Gruselfaktor zu kriegen, h&#228;tte ich schon gerne eine Aufl&#246;sung bis zur Stadt gehabt. Freie Projekte gehen leider oft nur bis Land. Kommerzielle L&#246;sungen sind entweder auf eine bestimmte Anzahl Abfragen beschr&#228;nkt, bieten ohne Kohle nur das Land als Info oder sind ausserhalb Amerikas eher schlecht. Man k&#246;nnte da mit Proxies herumfummeln, Geld ausgeben oder halt einen Kompromiss eingehen.</p>
<p><a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5tYXhtaW5kLmNvbS8=">MaxMind</a> bietet eine Lite-Version ihrer Datenbanken gratis an (Binary und CSV), inklusive quelloffener, PEAR-verwalteter <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3BlYXIucGhwLm5ldC9tYW51YWwvZW4vcGFja2FnZS5uZXR3b3JraW5nLm5ldC1nZW9pcC5waHA=">PHP Ansteuerung</a>. Die Lite-Version ist nicht so genau wie die kostenpflichtige, aber ganz ok.</p>
<p>Die Ansteuerung ist schmerzfrei:<br />
[cc lang="PHP"]<br />
  $geoip = Net_GeoIP::getInstance(&#8221;path/to/GeoLiteCity.dat&#8221;);<br />
  if(isset($geoip)) {<br />
    try {<br />
      $location = $geoip->lookupLocation($ip);<br />
      $city=$location->city;<br />
      $country=getCountryName($location->countryCode);<br />
    } catch (Exception $e) {<br />
      // Handle exception<br />
    }<br />
  }<br />
[/cc]</p>
<p><tt>getCountryName</tt> ist eine eigene Funktion, die die L&#228;ndernamen in Deutsch zur&#252;ck gibt. Mehr Infos brauche ich nicht.</p>
<p>Das HTML Blog hat ein <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2h0bWxibG9nLm5ldC9nZW9sb2NhdGUteW91ci12aXNpdG9ycy13aXRoLXBocC1wYXJ0LTEv">sehr gutes Tutorial zu diese Methode und PHP</a>.</p>
<h3>ISP aus IP</h3>
<p>Hier k&#246;nnte man auch die obige Datenbank verwenden, aber mit der Lite-Version funzt das nicht so richtig. Also fragen wir die Quelle (<a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5kYi5yaXBlLm5ldC93aG9pcw==">RIPE</a>) direkt an. Daf&#252;r wird <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5waHBjbGFzc2VzLm9yZy9icm93c2UvcGFja2FnZS8zODgxLmh0bWw=">ipology</a> (von phpclasses.org) verwendet, allerdings in einer modifizierten Version.</p>
<h3>OS und Browser aus dem User-Agent</h3>
<p>Hier gibt es verschiedene Klassen und Funkti&#246;nchen, die alle nicht so befriedigend waren. Das einzige was wirklich funzt ist die Funktion <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5waHAubmV0L2Z1bmN0aW9uLmdldC1icm93c2Vy">get_browser()</a>, die allerdings eine Spezielle Datei (<tt>browscap.ini</tt>) ben&#246;tigt, die in <tt>php.ini</tt> eingetragen sein muss.</p>
<h3>Cookies</h3>
<p>Mit der Sessionverwaltung von PHP bin ich nie so rchtig warm geworden. Es verh&#228;lt sich &#228;usserst doof. Da wurde ein Layer &#252;ber die Technik gelegt, der das Ganze nicht wirklich vereinfacht. Eine Session ist normalerweise nur solange g&#252;ltig wie der Browser des Signierten offen bleibt. Hat man die Cookielebenszeit erh&#246;ht, dann kommt leider manchmal ein Garbage Collector und r&#228;umt die Daten weg. Ich glaube, mit folgenden Zeilen (Reihenfolge ist wichtig!) liegt man nahe an pesistenten Sessions:<br />
[cc lang="PHP"]<br />
// Session<br />
$lifetime=24*3600*300;<br />
ini_set(&#8217;session.gc_maxlifetime&#8217;,$lifetime);<br />
setcookie(session_name(), $_COOKIE[session_name()], time()+$lifetime, &#8220;/&#8221;);<br />
session_start();<br />
[/cc]</p>
<p>Im Cookie speichere ich zum Einen die Dinge wie IP, ISP, Land, &#8230; um ein zweites Nachsehen zu beschleunigen und Unterschiede sichtbar zu machen, zum Anderen zus&#228;tzlich noch die Anzahl und Zeit der Zugriffe, &#8230;</p>
<h2>Technisches </h2>
<h3>Ausgabe als Bild</h3>
<p>Die Ausgabe als Bild ist relativ einfach. Man schickt einen entsprechenden Header:<br />
[cc lang="PHP"]<br />
Header(&#8221;Cache-Control: no-cache&#8221;);<br />
Header(&#8221;Content-type: image/png&#8221;);<br />
[/cc]</p>
<p>Dann l&#228;dt man ein Hintergrundbild und manipuliert mit den PHP-Funktionen. Kleine Leckereien im folgenden Code:</p>
<ul>
<li>Zeilenumbr&#252;che werden nicht automatisch ber&#252;cksichtigt. Der folgende Code &#252;bernimmt dies.</li>
<li>Zeichen m&#252;ssen ISO 8859-1 Codiert sein *gnarrrrrrrgh*, sonst sieht man komische Symbole.</li>
</ul>
<p>[cc lang="PHP"]<br />
$img_handle= imagecreatefromjpeg(BG_IMAGE);<br />
$colorblood= ImageColorAllocate($img_handle, 186, 159, 140);<br />
$font=5;</p>
<p>// Write creepy things<br />
$fontheight = ImageFontHeight($font);<br />
$lines = explode(&#8221;\n&#8221;, $sigtext);<br />
$y=100;<br />
foreach($lines as $line) {<br />
        ImageString($img_handle, $font, 200, $y, $line, $colorblood);<br />
        $y += $fontheight;<br />
}</p>
<p>// Output Image<br />
imagepng($img_handle);<br />
imagedestroy($img_handle);<br />
[/cc]</p>
<p>Wenn Warnungen ausgegeben werden, haben die Browser verst&#228;ndlicherweise M&#252;he, dies als Bild zu interpretieren. Darum, liebe Coder, <strong>schreibt sauberen Code der keine Warnungen ausspuckt</strong>! Testen mit <tt>error_reporting(E_ALL)</tt>!</p>
<h3>Texte</h3>
<p>Je nach den technischen Gegebenheiten lege ich m&#246;gliche S&#228;tze in ein Array von denen dann einer per Zufall ausgew&#228;hlt wird&#8230; Eher simpel&#8230;</p>
<h3>Zeitangaben</h3>
<p>Der letzte Zugriff wird gespeichert, und ich m&#246;chte gerne so richtig &#8220;We watch you!&#8221;-m&#228;ssig damit angeben, dass ich das weiss. Dazu soll der letzte Zugriff mit &#8220;Heute&#8221;, &#8220;Gestern&#8221;, &#8220;Vorgestern&#8221;, etc angegeben werden. Das funktioniert mit der absolut genialen <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5waHAubmV0L3N0cnRvdGltZQ==">strtotime</a>-Funktion, die einen String automagisch in eine Epoch-Zeit (Sekunden seit 1970) umwandelt.</p>
<p>[cc lang="php"]<br />
if($tstamp &#038;&#038; (time()-$tstamp)>3600) { // More than 1 hour no posting view<br />
  if(strtotime(&#8221;today 00:00&#8243;)<=$tstamp) {<br />
    $creepytext[]= "Du hast heute um ".strftime("%H:%M:%S",$tstamp)."\ndas letze mal ein Posting von mir gelesen.";<br />
  }<br />
  elseif(strtotime("-1 day 00:00")<=$tstamp) {<br />
    $creepytext[]= "Du hast gestern um ".strftime("%H:%M:%S",$tstamp)."\ndas letze mal ein Posting von mir gelesen.";<br />
  }<br />
  elseif(strtotime("-2 days 00:00")<=$tstamp) {<br />
    $creepytext[]= "Du hast vorgestern um ".strftime("%H:%M:%S",$tstamp)."\ndas letze mal ein Posting von mir gelesen.";<br />
  }<br />
  elseif(strtotime("-7 days 00:00")<=$tstamp) {<br />
    $creepytext[]= "Du hast diesen ".strftime("%A", $tstamp)." um ".strftime("%H:%M:%S",$tstamp)."\ndas letze mal ein Posting von mir gelesen.";<br />
  }<br />
  elseif(strtotime("-14 days 00:00")<=$tstamp) {<br />
    $creepytext[]= "Du hast letzte Woche am ".strftime("%A", $tstamp)." um ".strftime("%H:%M:%S",$tstamp)."\ndas letze mal ein Posting von mir gelesen.";<br />
  }<br />
  else {<br />
    $creepytext[]= "Du hast am ".strftime("%d.%m.%Y",$tstamp)."(vor ".ceil((time()-$tstamp)/(24*3600))." Tagen)\nein Posting von mir gelesen.";<br />
  }<br />
}<br />
[/cc]</p>
<h2>Weitere Literatur</h2>
<p>Sehr sch&#246;ne Turorials zum Thema dynamische Signaturen gibt es bei <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5kaWdpdGFsLWlubi5kZS92YnVsbGV0aW4tY29kZS1oYWNraW5nLzI1OTc1LXNpZ25hdHVyLWJhbm5lci1oYWNrLmh0bWw=">Digital-Inn</a>, <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy52YmdvcmUuY29tL0R5bmFtaWNfc2lnbmF0dXJl">VBGore</a> und <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy50dXRvcmlhbHMuZGUvZm9ydW0vcGhwLXR1dG9yaWFscy83NjQyMy1keW5hbWlzY2hlLXNpZ25hdHVyZW4uaHRtbA==">Tutorials.de</a>.</p>
<h2>Gimme Code</h2>
<p>Biddesch&#246;hn: <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cub25jb2RlLmluZm8vd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDcvZHluYW1pc2NoZS1zaWduYXR1ci56aXA=" title='Dynamische Signatur PHP Skript'>Dynamische Signatur PHP Skript</a></p>
<h2>Weitere Signaturgeneratoren</h2>
<ul>
<li>Oben schon erw&#228;hnt und als Lead: <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=d3d3LmRhbmFzb2Z0LmNvbS8=" rel=\"nofollow\">Danasoft</a>.</li>
<li>Etwas anders aber auch witzig: <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5zbG9nYW5pemVyLm5ldA==">Sloganizer.net</a>. Im Moment funzt das Hintergrundbild nicht. Tip: Englisch w&#228;hlen und das <tt>en/</tt> aus der URL entfernen. <img src="http://www.sloganizer.net/style1,oncode-dot-info.png"/></li>
<p>&copy; 2008 bei Skaldrom Y. Sarg von oncode.info<br />
&#220;bers ein Produkt bloggen lassen oder mit Bloggen Geld verdienen? Mache ich mit <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy50cmlnYW1pLmNvbS8/cmVmPVNrYWxkcm9tK1kuK1Nhcmc=" rel=\"nofollow\">Trigami</a>.</p>
 <img src="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?view=1&post_id=435" width="1" height="1" style="display: none;" /><h3>Ähnliche Artikel</h3><ul class="related_post"><li><a href="http://blog.oncode.info/2008/07/30/automatisches-und-mehrfaches-submitten-von-formularen/" title="Automatisches und mehrfaches submitten von Formularen">Automatisches und mehrfaches submitten von Formularen</a></li><li><a href="http://blog.oncode.info/2008/06/28/mit-php-einen-monat-mit-verlinkbaren-daten-anzeigen/" title="Mit PHP einen Monat mit verlinkbaren Daten anzeigen">Mit PHP einen Monat mit verlinkbaren Daten anzeigen</a></li><li><a href="http://blog.oncode.info/2008/05/07/php_self-ist-boese-potentielles-cross-site-scripting-xss/" title="PHP_SELF ist böse! Potentielles Cross Site Scripting (XSS)!">PHP_SELF ist böse! Potentielles Cross Site Scripting (XSS)!</a></li><li><a href="http://blog.oncode.info/2007/11/26/php-uwa-widget-library/" title="PHP-UWA Widget Library">PHP-UWA Widget Library</a></li><li><a href="http://blog.oncode.info/2007/11/07/einfache-animationen-auf-der-konsole-mit-php-1-dimensional/" title="Einfache Animationen auf der Konsole mit PHP (1-Dimensional)">Einfache Animationen auf der Konsole mit PHP (1-Dimensional)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.oncode.info/2008/07/28/dynamische-signatur-e-schrecking-fuer-foren-myspace/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Asus eee: Welch schnucklig, widerspenstig Teil!</title>
		<link>http://blog.oncode.info/2008/07/07/asus-eee-welch-schnucklig-widerspenstig-teil/</link>
		<comments>http://blog.oncode.info/2008/07/07/asus-eee-welch-schnucklig-widerspenstig-teil/#comments</comments>
		<pubDate>Mon, 07 Jul 2008 13:08:34 +0000</pubDate>
		<dc:creator>skaldrom</dc:creator>
		
		<category><![CDATA[Hardware]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[802.1X]]></category>

		<category><![CDATA[Asus]]></category>

		<category><![CDATA[eee]]></category>

		<category><![CDATA[eeeXubuntu]]></category>

		<category><![CDATA[Grub]]></category>

		<category><![CDATA[keys]]></category>

		<category><![CDATA[menu.lst]]></category>

		<category><![CDATA[sondertasten]]></category>

		<category><![CDATA[Ubuntu]]></category>

		<category><![CDATA[Ubuntu-eee]]></category>

		<guid isPermaLink="false">http://blog.oncode.info/2008/07/07/asus-eee-welch-schnucklig-widerspenstig-teil/</guid>
		<description><![CDATA[Asus eee mit richtigem Linux. Man pendelt zwischen Entz&#252;cken und grossem Leiden...]]></description>
			<content:encoded><![CDATA[<p><img src='http://blog.oncode.info/wp-content/uploads/2008/07/asuseee.jpg' alt='Asus eee' align='left' class='lead'/>Schon l&#228;nger bin ich nun in Besitz eines <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2RlLndpa2lwZWRpYS5vcmcvd2lraS9Bc3VzX0VlZV9QQw==">Asus eee</a> (4g). Ein wahrlich schnuckliges Teil, das mir viel Freude bereitet. Es hat die korrekte Gr&#246;sse - die gerade noch an den meisten Sitzungstischen toleriert wird -, ist gen&#252;gend schnell und ist gerade noch bedienbar. Als Erstes habe ich <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy53aWtpaG93LmNvbS9VcGdyYWRlLU1lbW9yeS1pbi1hbi1Bc3VzLUVlZS1QQw==">mehr RAM spendiert</a>, mich mit <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=LzIwMDgvMDQvMjEva3Vyei11bmQtc2NobWVyemxvcy1zZC1rYXJ0ZW4tdW50ZXItbGludXgtYW0tbGFwdG9wLw==">SD-Karten rumgeschlagen</a> und das <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=LzIwMDgvMDQvMjUvaW50ZXJuZXQtYXVmLWRlbS1zdGljay1tYzk1MGQtdW5kLXRrZS1hd2F5LXZvbi1zdW5yaXNlLXVudGVyLWxpbnV4Lw==">Internet auf einem Stick</a> besorgt. Nun kann ich unterwegs entwickeln, surfen, Filmchen kucken und auch <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=LzIwMDgvMDUvMjMvemF0dG9vcGFydHktZnVuZHJpc2luZy1hdWYtbmV1ZW0tbml2ZWF1Lw==">live bloggen</a>.</p>
<h3>Das Betriebssystem</h3>
<p>Das modifizierte Xandros auf dem eee ist erste Sahne, wirklich! Die reduzierte Komplexit&#228;t hat den Nachteil, dass die Komplexit&#228;t reduziert ist <img src='http://blog.oncode.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> , darum wollte ich ein &#8220;richtiges&#8221; Linux.</p>
<p>Ubuntu sollte es sein! Nun hat man die Wahl zwischen <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3dpa2kuZWVldXNlci5jb20vdWJ1bnR1OmVlZXh1YnVudHU6aG9tZQ==">eeeXubuntu</a>, <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy51YnVudHUtZWVlLmNvbS8=">Ubuntu-eee</a> oder dem <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy51YnVudHUuY29tLw==">standard Ubuntu</a>. Ich habe mich f&#252;r eeeXubuntu entschieden und das lief auch gut bis zum Update auf Ubuntu 8.04. Aber mit etwas Suchen habe ich dann eine <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3dpa2kuZWVldXNlci5jb20vZ2V0dGluZ191YnVudHVfOC4wNF90b193b3JrX3BlcmZlY3RseQ==">gute Reparaturanleitung</a> gefunden. Um das Ethernet wieder zum Laufen zu bringen, musste ich den Akku entfernen und wieder reinschieben (ohne Witz).</p>
<p>Grunds&#228;tzlich scheint es immer gleich zu laufen: Betriebssystem installieren und dann tweaken, um die Spezialfunktionen des eee zum Laufen zu kriegen. Gl&#252;cklicherweise gibt es fertige Tweak-Skripts:</p>
<ul>
<li>Die Zusammenstellung von <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3dpa2kuZWVldXNlci5jb20vdWJ1bnR1OmVlZXh1YnVudHU6Y3VzdG9taXphdGlvbiA=">eeeXubuntu</a>.</li>
<li>Die <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5kaTIubnUvc29mdHdhcmUvZWVldHdlYWtzLmh0bQ==">eee Tweaks</a>.</li>
<li>Das &#220;berscript: <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2VlZS5yaWNleS5jby51ay8=">Riceeey Tweaks</a>.</li>
</ul>
<p>Diese Scripts m&#252;ssen immer mal wieder gestartet werden&#8230; Beim Update und auch mal so, zur Erinnerung wahrscheinlich.</p>
<h3>Sammlung von Kleinigkeiten</h3>
<p>Hier werde ich die kleinen Dinge hinschreiben, die eventuell von Interesse und/oder wiederverwendbar sind.</p>
<h4>Die Widerherstellungs-DVD</h4>
<p>Die Widerherstellungs-DVD ist mehr als w&#228;hlerisch was das Betriebssystem angeht. Will man einen recovery-USB-Strick herstellen, geht das nicht unter Linux und nicht unter Vista (auch wenn man die XP-Kompatibilit&#228;t einschaltet). Unter XP hats dann wunderbar gefunzt und die Widerherstellung lief wie durch warme Butter.</p>
<h4>&#196;ndern des Standard-Bootmen&#252;s</h4>
<p>Die l&#252;gt die Kleine, und das gerade aus! Will man das Standardbootmen&#252; ver&#228;ndern, so kann man die Vorhandene <tt>/boot/grub/menu.lst</tt> anpassen bis zum letzten Tage und <tt>grub-update</tt>en oder <tt>grub-install</tt>en bis der Gothe noch schw&#228;rzer wird. Diese Datei dient nur als Lockvogel f&#252;r Frickler, die richtig-richtige Datei ist wo ganz anders! Ausf&#252;hrlich beschrieben ist es bei <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3dpa2kuZWVldXNlci5jb20vaG93dG86aW5zdGFsbHJlc2N1ZW1vZGU=">eeeuser.com</a> und <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy53aWtpaG93LmNvbS9DcmVhdGUtYS1SZXNjdWUtTW9kZS1mb3ItYW4tQXN1cy1FZWUtUEM=">WikiHow</a>. Aber nat&#252;rlich habe ich auch erst gesucht, nachdem ich ernsthaft (noch mehr) an meiner geistigen Gesundheit zu zweifeln begonnen habe&#8230; Kurz zusammengefasst:</p>
<ol>
<li>EEE rebooten und <tt>esc</tt> und/oder <tt>F9</tt> widerholt und bestimmt dr&#252;cken. Sporadisches Fluchen scheint auch zu helfen. Es sollte ein Bootmen&#252; aufgehen, das ungef&#228;hr so aussieht:<br />
<a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cub25jb2RlLmluZm8vd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDcvZWVlYm9vdC5qcGc=" title='eee Boot Men&#252;'><img src='http://blog.oncode.info/wp-content/uploads/2008/07/eeeboot.thumbnail.jpg' alt='eee Boot Men&#252;' /></a></li>
<li>Beim ersten Eintrag <tt>e</tt> dr&#252;cken und den Kerneleintrag um <tt>XANDROSBOOTDEBUG=y</tt> erg&#228;nzen.</li>
<li>Mit <tt>b</tt> booten.</li>
<li>sda1 und sda2 mounten:
<pre>
mount /dev/sda1 /mnt-system
mount /dev/sda2 /mnt-user
</pre>
</li>
<li>Nun kann <tt>/mnt-system/boot/grub/menu.lst</tt> (die Richtige!) editiert oder mit einer vorbereiteten auf dem Userdateisystem &#252;berschrieben werden.</li>
</ol>
<p>Zum Gl&#252;ck haben die Kriedewagens die <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5rcnVlZGV3YWdlbi5kZS93aWtpL2luZGV4LnBocC9FZWVQQw==">original menu.lst</a> gepostet&#8230;</p>
<h4>802.1X auf dem Original Xandros</h4>
<p>Muss man sich authentifizieren, so hat eeeuser eine <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3dpa2kuZWVldXNlci5jb20vd3BhX2RlZmF1bHRfeGFuZHJvcz9zPXN1cHBsaWNhbnQ=">gute Anleitung</a> wie man 802.1X zum Laufen kriegt.
<p>© 2008 bei Skaldrom Y. Sarg von oncode.info<br />
<a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uZGUvZ3AvcmVkaXJlY3QuaHRtbD9pZT1VVEY4JiMwMzg7bG9jYXRpb249aHR0cCUzQSUyRiUyRnd3dy5hbWF6b24uZGUlMkYmIzAzODtzaXRlLXJlZGlyZWN0PWRlJiMwMzg7dGFnPXRlY2dvdHVuZGFuZC0yMSYjMDM4O2xpbmtDb2RlPXVyMiYjMDM4O2NhbXA9MTYzOCYjMDM4O2NyZWF0aXZlPTY3NDI=" rel='nofollow'>Amazon</a>,<br />
f&#252;r B&#252;cher, Sounds, Film, und den ganzen Rest&#8230;</p>
 <img src="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?view=1&post_id=392" width="1" height="1" style="display: none;" /><h3>Ähnliche Artikel</h3><ul class="related_post"><li><a href="http://blog.oncode.info/2008/04/25/internet-auf-dem-stick-mc950d-und-tke-away-von-sunrise-unter-linux/" title="Internet auf dem Stick: MC950D und T@ke Away von Sunrise unter Linux">Internet auf dem Stick: MC950D und T@ke Away von Sunrise unter Linux</a></li><li><a href="http://blog.oncode.info/2007/09/19/grub-mit-bild-beim-booten/" title="Grub mit Bild beim Booten">Grub mit Bild beim Booten</a></li><li><a href="http://blog.oncode.info/2008/03/25/asus-eee-bei-digitecch-online-bestellen/" title="Asus EEE bei Digitec.ch online bestellen?">Asus EEE bei Digitec.ch online bestellen?</a></li><li><a href="http://blog.oncode.info/2007/08/05/peap-8021x-unter-linux/" title="PEAP - 802.1X unter Linux">PEAP - 802.1X unter Linux</a></li><li><a href="http://blog.oncode.info/2008/05/03/sony-ericsson-p910i-ueber-bluetooth-zu-linux-mit-dem-internet-verbinden/" title="Sony Ericsson P910i über Bluetooth zu Linux mit dem Internet verbinden">Sony Ericsson P910i über Bluetooth zu Linux mit dem Internet verbinden</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.oncode.info/2008/07/07/asus-eee-welch-schnucklig-widerspenstig-teil/feed/</wfw:commentRss>
		</item>
		<item>
		<title>AntMe, Spass mit programmierbaren Ameisen</title>
		<link>http://blog.oncode.info/2008/07/02/antme-spass-mit-programmierbaren-ameisen/</link>
		<comments>http://blog.oncode.info/2008/07/02/antme-spass-mit-programmierbaren-ameisen/#comments</comments>
		<pubDate>Wed, 02 Jul 2008 09:37:18 +0000</pubDate>
		<dc:creator>skaldrom</dc:creator>
		
		<category><![CDATA[Coding]]></category>

		<category><![CDATA[Desktop]]></category>

		<category><![CDATA[Ameise]]></category>

		<category><![CDATA[AntMe]]></category>

		<category><![CDATA[CSharp]]></category>

		<category><![CDATA[eLearning]]></category>

		<category><![CDATA[Games]]></category>

		<category><![CDATA[microsoft]]></category>

		<category><![CDATA[Programmieren]]></category>

		<category><![CDATA[Programmierspiele]]></category>

		<category><![CDATA[Software]]></category>

		<category><![CDATA[Spass]]></category>

		<category><![CDATA[Spiel]]></category>

		<category><![CDATA[vb.net]]></category>

		<category><![CDATA[Zeitvertreib]]></category>

		<guid isPermaLink="false">http://blog.oncode.info/2008/07/02/antme-spass-mit-programmierbaren-ameisen/</guid>
		<description><![CDATA[Spielen hilft auf verscheidenen Ebenen Spass und Wissen mit und &#252;ber den Computer zu f&#246;rdern. AntMe ist ein raffiniertes Programmierspiel f&#252;r .net das viel Freude bereitet.]]></description>
			<content:encoded><![CDATA[<p><img src='http://blog.oncode.info/wp-content/uploads/2008/07/ant.png' alt='AntMe!' align='left' class='lead'/>Nachdem ich die Ameisen in meiner Wohnung mit ganz perfidem tragts-es-zu-euch-nach-Hause-und-vergiftet-eure-Nachkommen-Gift losgeworden bin, habe ich sehr viel sympathischere Zeitgenossen dieser Spezies getroffen: AntMe ist ein Programmierspiel, dass aus <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2dlcm1hbnkvbXNkbi9jb2Rpbmc0ZnVuL2RlZmF1bHQubXNweA==">Microsofts Coding4Fun Initiative</a> (nicht zu verwechseln mit dem Galileo <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uZGUvZ3AvcHJvZHVjdC8zODM2MjExMTY1P2llPVVURjgmIzAzODt0YWc9dGVjZ290dW5kYW5kLTIxJiMwMzg7bGlua0NvZGU9YXMyJiMwMzg7Y2FtcD0xNjM4JiMwMzg7Y3JlYXRpdmU9Njc0MiYjMDM4O2NyZWF0aXZlQVNJTj0zODM2MjExMTY1" rel=\"nofollow\">Coding for Fun</a> Buch. Das ist auch spassig, behandelt auch AntMe, aber zus&#228;tzlich noch viele Andere Dinge) hervorgegangen ist. Es hat einen <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2RlLndpa2lwZWRpYS5vcmcvd2lraS9BbnRtZQ==">eigenen Wikipedia Artikel</a> und vorallem eine geniale <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2FudG1lLm5ldC8=">Homepage</a>.</p>
<p>Grunds&#228;tzlich geht es darum Ameisen zu implementieren die &#252;berleben, &#196;pfel und Zucker sammeln und unter Umst&#228;nden auf K&#228;fer und fremde Ameisen losgehen. Ein Markierungsmechanismus sorgt daf&#252;r, dass die Ameisen untereinander kommunizieren k&#246;nnen. Fortgeschrittene Ameisenpapis und -mamis k&#246;nnen spezialisierte Ameisen erstellen und <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2RlLndpa2lwZWRpYS5vcmcvd2lraS9Sb2xsZW5zcGllbF8lMjhTcGllbCUyOSNOYWNoX1NwaWVsd2Vpc2U=">RPG</a> m&#228;ssig Eigenschaften verbessern, wenn sie daf&#252;r andere verschlechtern.</p>
<p><img src='http://blog.oncode.info/wp-content/uploads/2008/07/dieameiseninaktion.gif' alt='Die Ameisen in Aktion' /></p>
<p>Die Ameisen k&#246;nnen in C# oder in Visual Basic .net mit der notwendigen Intelligenz versehen werden. Bestimmte Methoden werden zu bestimmten Ereignissen aufgerufen; beispielsweise <tt>WirdM&#252;de()</tt> (ja, mit &#8220;&#252;&#8221; und deutsch) oder <tt>SiehtFeind(ByVal k&#228;fer As K&#228;fer)</tt>. Zur Steuerung steht fast der ganze .net Sprachumfang zur Verf&#252;gung, sowie Ameisenspezifische Hilfsmethoden wie etwa <tt>GeheZuBau()</tt> oder <tt>GreifeAn(k&#228;fer)</tt>.</p>
<h3>Quickstart</h3>
<p>Auf der <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2FudG1lLm5ldC8=">AntMe Homepage</a> findet man verschiedene Versionen. Wir spielen hier mit der 1.5 Beta 2 (VB.net oder C#, je nach Gusto). Die Profiversion beinhaltet den gesamten Quellcode der Spielengine (!). Das ist so genial, dass es nochmals erw&#228;hnt werden darf: Die Profiversion beinhaltet den gesamten Quellcode der Spielengine. Will man sich nur mit den Ameisen besch&#228;ftigen, reicht die Einsteigerversion. Im Download enthalten ist ein gut dokumentiertes Ameisenskelett, bei dem sofort losgottgespielt werden kann.<br />
Eine gute Doku &#252;ber die Klassen und deren Methoden sowie ein Tutorial wird mitgeliefert. Zum Teil beziehen sich die Unterlagen noch auf Version 1.1, aber der Transfer zu 1.5 ist eigentlich kein Problem. F&#252;r Leute, die lieber kuckn statt lesen, gibt es gut gemachte Screencasts, die ebenfalls in die Thematik einf&#252;hren.</p>
<p>F&#252;r eher haptisch veranlagte Menschen gibt es auch ein Buch: <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uZGUvZ3AvcHJvZHVjdC8zODY2NDUyMDU1P2llPVVURjgmIzAzODt0YWc9dGVjZ290dW5kYW5kLTIxJiMwMzg7bGlua0NvZGU9YXMyJiMwMzg7Y2FtcD0xNjM4JiMwMzg7Y3JlYXRpdmU9Njc0MiYjMDM4O2NyZWF0aXZlQVNJTj0zODY2NDUyMDU1" rel=\"nofollow\">AntMe! - Programmieren und Spielen mit den Ameisen und Visual C#</a>. Das kenne und besitze ich allerdings (noch) nicht.</p>
<p>Verf&#252;gt man noch &#252;ber keine Programmierumgebung, so k&#246;nn bei Microsoft gratis die <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2dlcm1hbnkvZXhwcmVzcy8=">Express Versionen</a> verschiedener Sprachen downgeloaded werden. F&#252;r die 3D Visualisierung braucht man<br />
noch <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2Rvd25sb2Fkcy9kZXRhaWxzLmFzcHg/ZGlzcGxheWxhbmc9ZGUmIzAzODtGYW1pbHlJRD0yREE0M0QzOC1EQjcxLTRDMUItQkM2QS05QjY2NTJDRDkyQTM=">DirectX</a>. Mit der neusten Version (nicht mit der im Forum angegebenen) hat es wunderbar gefunzt.</p>
<h3>Turniere</h3>
<p>Ein Bisschen lebt das Ganze auch vom kompetitiven Element (um ehrlich zu sein, vielleicht ist ein Bisschen etwas untertrieben: ICH FRESS EUCH ALLE AUF!). In der Version 1.5 funktioniert das Importieren von anderen Ameisen leider nicht und es wird eine unbehandelte Ausnahme ausgespuckt:<br />
<em>Der Typ f&#252;r Member AntMe.SpielKonfiguration.AntMe.Simulation, Version=1.5.0.0, Culture=neutral, PublicKeyToken=37d8e32ef3294969 wurde nicht aufgel&#246;st.</em></p>
<p>Workaround f&#252;r die VB-Version (C# ungetestet):</p>
<ol>
<li>Abgabe der Ameisen im Quellcode (ist eh besser, da man so Betr&#252;germeisen (Siehe unten) erkennt).</li>
<li>Drag and Drop des Quellcodes in das Projekt.</li>
<li>Compilieren und das <del>Massaker</del> Messen der intellektuellen Kapazit&#228;ten kann starten.</li>
</ol>
<p>Wenn einzelne Ameisen in C# gecoded sind, kann der <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2xhYnMuZGV2ZWxvcGVyZnVzaW9uLmNvLnVrL2NvbnZlcnQvY3NoYXJwLXRvLXZiLmFzcHg=">Online-Konverter</a> den Code in VB umwandeln (mit gemischtem Erfolg). Ist denn C# und VB dasselbe (*frech_grins*)?</p>
<h3>Fragen und Antworten/Tipps und Tricks</h3>
<p>Q: Warum verhungern meine Ameisen? Ich habe doch die folgenden Zeilen eingef&#252;gt:<br />
[cc lang="vbnet"]<br />
Public Overrides Sub WirdM&#252;de()<br />
  Me.GeheZuBau()<br />
End Sub<br />
[/cc]</p>
<p>A: Wahrscheinlich wird die arme Ameise auf ihrem nach Hauseweg f&#252;r andere Jobs eingespannt! Wird sie vielleicht auf K&#228;fer oder feindliche Ameisen losgejagt wenn sie solche sieht? Oder muss das arme Insekt beim Apfeltragen helfen wenn sie an einer solchen Gruppe vorbeikommt? Man sollte sie jeweils in Ruhe lassen wenn sie in Richtung Bau dackelt und rund um Aktionen folgendes schreiben:<br />
[cc lang="vbnet"]<br />
if Not TypeOf Me.Ziel Is Bau then<br />
  &#8216; Hier was stressiges machen<br />
end if<br />
[/cc]</p>
<hr width="33%"/>
<p>Q: Wie finde ich die Koordinaten meines Baus?</p>
<p>A: Am besten eine shared/Static Variable vom typ <tt>Bau</tt> definieren. Die erste Ameise zum Bau schicken, dann werden die Koordinaten des Baus zu ihrem <tt>Ziel</tt>, von wo sie dann ausgelesen werden k&#246;nnen:<br />
[cc lang="vbnet"]<br />
[...]<br />
Private Shared bau As IKoordinate<br />
[...]<br />
If bau Is Nothing Then<br />
  Me.GeheZuBau()<br />
  bau = Me.Ziel<br />
End If<br />
[/cc]</p>
<hr width="33%"/>
<p>Q: Wie komme ich an die X und Y Koordinaten eines Objekts?</p>
<p>A: Gar nicht. Aber gewitzte Ameisenk&#246;nige k&#246;nnen <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2RlLndpa2lwZWRpYS5vcmcvd2lraS9Qb2xhcmtvb3JkaW5hdGVu">Polarkoordinaten</a> verwenden. Man weiss ja wo der Bau ist, die Winkel sind absolut, &#8230;</p>
<hr width="33%"/>
<p>Q: Meine Ameisen verhalten sich in der zweiten Runde ziemlich irr, woran kann das liegen?</p>
<p>A: Vielleicht sind sie irr? Es k&#246;nnte aber auch am Umstand liegen, dass anscheinend statische Variablen zwischen den Durchg&#228;ngen nicht neu initialisiert werden. Von Hand k&#246;nnte man beispielsweise folgendes tun:<br />
[cc lang="vbnet"]<br />
Public Overrides Function BestimmeTyp(ByVal anzahl As Dictionary(Of String, Integer)) As String<br />
  &#8216; Init for rounds > 1<br />
  If anzahl(&#8221;Kundschafterin&#8221;) + anzahl(&#8221;Kriegerin&#8221;) < 2 Then<br />
    ' Reset all static members<br />
    lastphase = False<br />
    bau = Nothing<br />
    ObstSpeicher.Clear()<br />
    ZuckerSpeicher.Clear()<br />
    [...]<br />
  End If<br />
  [...]<br />
[/cc]</p>
<hr width="33%"/>
<p>Q: Ich bekomme eine Fehlermeldung, wenn ich auf den Freund in <tt>SiehtFreund(ByVal ameise As Ameise)</tt> zugreifen will, was geht da ab?</p>
<p>A: Das scheint ein Bug zu sein. Freunde scheinen halt ab und zu zu verschwinden <img src='http://blog.oncode.info/wp-includes/images/smilies/icon_frown.gif' alt=':-(' class='wp-smiley' /> . Um das Turnier nicht gewaltsam zu beenden, sollte man checken, ob es sich um einen wahren Freund handelt:<br />
[cc lang="vbnet"]<br />
if not ameise is nothing then<br />
  &#8216; Hier was funkyges tun mit dem Freund<br />
end if<br />
[/cc]</p>
<hr width="33%"/>
<p>Q: Wenn ich in Visual Basic die Funktionen der <tt>Koordinaten</tt> Klasse benutzen m&#246;chte, wird es unterstrichen und folgendes gemeldet: <em>Zugriff des freigegebenen Members, konstanten Members, Enumerationsmembers oder geschachtelten Typs &#252;ber eine Instanz; Der qualifizierende Ausdruck wird nicht ausgewertet.</em>. In was f&#252;r einer Sprache ist diese Fehlermeldung?</p>
<p>A: In MS-Deutsch(tm) <img src='http://blog.oncode.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Um <tt>Koordinate</tt> ohne gemotze zu verwenden sollte man sie folgendermassen qualifizieren: <tt>Global.AntMe.Koordinate</tt>.</p>
<hr width="33%"/>
<p>Q: Ich m&#246;chte mit der Markierung einen Punkt und nicht einen Winkel &#252;bergeben.</p>
<p>A: Entweder Polarkoordinaten verwenden oder ganz einfach: <tt>Me.GeheZuZiel(markierung)</tt> verwenden.</p>
<hr width="33%"/>
<p>Q: &#196;pfel werden in einem Multiplayerspiel irgendwohin getragen, sind die Ameisen besoffen?</p>
<p>A: Nein, aber das kann passieren wenn Ameisen von verschiedenen Gruppen den Apfel in verschiedene Richtungen zerren.</p>
<hr width="33%"/>
<p>Q: Psst! *fl&#252;ster* Ich habe geh&#246;rt man kann bescheissen?</p>
<p>A: Ja, kann man. Es ist m&#246;glich Ameisen zu beamen, fremde Ameisen &#8220;Zu &#252;bernehmen&#8221;, etc. Das ist Bugusing und nicht nett. Beim <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2p1ZHQtc29mdHdhcmV0ZWNobm9sb2d5LmNvbS9BbnRNZUZvcnVtL3RhYmlkLzU4L2ZvcnVtaWQvNS9zY29wZS90aHJlYWRzL0RlZmF1bHQuYXNweA==">Judt AntMe Forum</a> gibt es diese Entdeckungen nachzulesen.</p>
<hr width="33%"/>
<p>Q: Was ist ein <em>Globales Ged&#228;chtnis</em>?</p>
<p>A: In der objektorientierten Programmierung kennt man eine bestimmte Art von Variablen, die <em>statisch</em> (<em>shared</em> in vb.net) sind. Diese werden dann nicht in den Objekten, sondern in den Klassen gespeichert. Das heisst, alle Objekte greifen auf dieselbe Variable zu. Wenn eine Ameise in einer Solchen etwas speichert, steht es allen Anderen auch zur Verf&#252;gung. Nicht gerade naturnah, aber sehr effizient :).</p>
<hr width="33%"/>
<p>Q: Ich m&#246;chte eine Ameise mit verschiedenen Phasen. Wie finde ich heraus, bei welchem Tick wir sind?</p>
<p>A: Eigentlich gar nicht. Man kann in der Funktion <tt>Tick()</tt> z&#228;hlen, aber das ist risikoreich, weil die Anzahl Ticks pro Spiel ver&#228;ndert werden kann, die Funktion unter Umst&#228;nden mehrfach aufgerufen wird und eine neu erzeugte Ameise dann mitten im Spiel bei 0 beginnt. Eine Kr&#252;cke ist folgender Code im Tick(), der darauf hofft, dass mindestens eine Ameise von Beginn weg &#252;berlebt und im globalen Ged&#228;chtnis eine Variable setzt sobald die Anzahl Ticks erreicht wird. Darauf sollten dann alle Ameisen reagieren. F&#252;r Verbesserungsvorschl&#228;ge w&#228;re ich sehr offen, aber bitte nur getestete und validierte.<br />
[cc lang="vbnet"]<br />
Public Overrides Sub Tick()<br />
  Me.ticks = Me.ticks + 1<br />
  If Me.ticks >= lastphaseticks Then<br />
    lastphase = True<br />
  End If<br />
  [...]<br />
[/cc]</p>
<h3>Beispiele</h3>
<p>Die <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cub25jb2RlLmluZm8vd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDcvYWdncm9zdmIuemlw">Aggros</a> sind Ameisen mit globalem Ged&#228;chtnis. Kundschafterinnen finden Mapf und Feinde, Sammlerinnen wenden sich dem n&#228;chstgelegenen Mapf zu und Kriegerinnen nehmen sich den Feinden an. L&#228;uft ganz ok.</p>
<p>Die <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cub25jb2RlLmluZm8vd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDcvYXBwbGVrb3JudmIuemlw">Applekorns</a> sind noch in Entwicklung. Die Idee war, alle &#196;pfel in die N&#228;he des eigenen Baus zu bringen um fremde Ameisen anzulocken, Zuckerhaufen zu besetzen und kurz vor Schluss alles einzuheimsen. Sie bieten noch sehr viel Optimierungspotential.</p>
<p>Ganz genial sind die <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2p1ZHQtc29mdHdhcmV0ZWNobm9sb2d5LmNvbS9BbnRNZUZvcnVtL3RhYmlkLzU4L2ZvcnVtaWQvNC90aHJlYWRpZC8yMS9zY29wZS9wb3N0cy9EZWZhdWx0LmFzcHg=">Polarameisen</a>. Sie kommen ohne globales Ged&#228;chtnis aus und spr&#252;hen kodierte Polarkoordinaten &#252;ber das Spielfeld. Das f&#252;hrt dazu, dass die Ameisen wirklich wie am Schn&#252;rchen zur Futterquelle gehen. Ebenfalls integriert ist eine Berechnung der Zeit, die eine Ameise braucht, bis sie bei einem Ziel ankommt und noch viele weitere Schmankerl. Ein sch&#246;nes St&#252;ck Software.</p>
<h3>Fazit und Ausblick</h3>
<p>Mit diesen Programmierspielen kann sehr viel gelehrt und gelernt werden: Sprachpraxis, Programmierroutine, Problemdekomposition und Konzepte wie statische Variablen und &#220;berladungen. Es ist sch&#246;n die Lichtlein zu sehen die aufgehen, wenn man sp&#228;ter im Unterricht auf die Ameisen verweisen kann und sofort ein tieferes Verst&#228;ndnis da ist.</p>
<p>Es w&#252;rde mich extrem reizen, diese Ameisen mit einem <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Nkcm5ldC5uZXQvcHJvamVjdHMvbmV1cm8v">neuronalen Netz</a> zu versehen oder sie mittels <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2RlLndpa2lwZWRpYS5vcmcvd2lraS9HZW5ldGlzY2hlX0FsZ29yaXRobWVu">genetischen Algorithmen</a> zu z&#252;chten. H&#228;tte ich doch mal einfach etwas Zeit <img src='http://blog.oncode.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .
<p>&copy; 2008 bei Skaldrom Y. Sarg von oncode.info<br />
&#220;bers ein Produkt bloggen lassen oder mit Bloggen Geld verdienen? Mache ich mit <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy50cmlnYW1pLmNvbS8/cmVmPVNrYWxkcm9tK1kuK1Nhcmc=" rel=\"nofollow\">Trigami</a>.</p>
 <img src="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?view=1&post_id=428" width="1" height="1" style="display: none;" /><h3>Ähnliche Artikel</h3><ul class="related_post"><li><a href="http://blog.oncode.info/2007/08/08/5-wege-fuer-programmiererinnen-die-zeit-intelligent-zu-verdoedeln/" title="5 Wege für ProgrammiererInnen die Zeit intelligent zu verdödeln">5 Wege für ProgrammiererInnen die Zeit intelligent zu verdödeln</a></li><li><a href="http://blog.oncode.info/2007/09/26/elearning-etwas-anders/" title="eLearning etwas anders&#8230;">eLearning etwas anders&#8230;</a></li><li><a href="http://blog.oncode.info/2008/03/24/soviel-phun/" title="Soviel Phun!!!">Soviel Phun!!!</a></li><li><a href="http://blog.oncode.info/2008/01/15/selbst-einen-flickr-screensaver-in-vbnet-programmieren/" title="Selbst einen Flickr Screensaver in VB.net programmieren">Selbst einen Flickr Screensaver in VB.net programmieren</a></li><li><a href="http://blog.oncode.info/2007/10/18/office-2007-wordateien-docx-unter-debian-linux-mit-openoffice-oeffnen/" title="Office 2007 Wordateien (docx) unter (Debian) Linux mit OpenOffice öffnen">Office 2007 Wordateien (docx) unter (Debian) Linux mit OpenOffice öffnen</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.oncode.info/2008/07/02/antme-spass-mit-programmierbaren-ameisen/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Mit PHP einen Monat mit verlinkbaren Daten anzeigen</title>
		<link>http://blog.oncode.info/2008/06/28/mit-php-einen-monat-mit-verlinkbaren-daten-anzeigen/</link>
		<comments>http://blog.oncode.info/2008/06/28/mit-php-einen-monat-mit-verlinkbaren-daten-anzeigen/#comments</comments>
		<pubDate>Sat, 28 Jun 2008 10:02:41 +0000</pubDate>
		<dc:creator>skaldrom</dc:creator>
		
		<category><![CDATA[Theorie und Schnipsel]]></category>

		<category><![CDATA[date]]></category>

		<category><![CDATA[Daten]]></category>

		<category><![CDATA[Datumsfunktionen]]></category>

		<category><![CDATA[Howto]]></category>

		<category><![CDATA[Kalender]]></category>

		<category><![CDATA[Kalenderblatt]]></category>

		<category><![CDATA[Monat]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Tutorial]]></category>

		<category><![CDATA[Wochentag]]></category>

		<guid isPermaLink="false">http://blog.oncode.info/2008/06/28/mit-php-einen-monat-mit-verlinkbaren-daten-anzeigen/</guid>
		<description><![CDATA[Kleine Anleitung f&#252;r die Darstellung eines verlinkbaren Kalenderblattes (Monats&#252;bersicht) in PHP.]]></description>
			<content:encoded><![CDATA[<p><img src='http://blog.oncode.info/wp-content/uploads/2008/06/calendar.png' alt='Calendar' class='lead' align='left'/>F&#252;r eine Applikation, in der man Ressourcen reservieren kann, wollte ich ein Kalender mit verlinkbaren Tagen anzeigen (grad wie im <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL21yYnMuc291cmNlZm9yZ2UubmV0L3ZpZXdfaW1hZ2UucGhwP2ZpbGU9aW1hZ2VzL21yYnNfbWFpbi5wbmc=">Meeting Room Booking System</a>). Da ich aus dem Alter raus bin, in dem man alles selber machen muss und ausserdem eine PHP-Datumsfunktionsphobie (<a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Bob2JpYWxpc3QuY29tLw==">PHPYpiresiaChronophobia</a>) entwickelt habe, wollte ich eigentlich etwas Fertiges verwenden. Es gibt vorallem Kalender in JavaScript, ein Tutorial das den Kommentaren nach nicht funktioniert (und das mittlerweile vom Web verschwunden ist), <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3NjcmlwdHMuZnJhbmNpc2NvY2hhcnJ1YS5jb20vcGhwLWNhbGVuZGFyLnBocA==">Scripts ohne Ausgabebeispiele</a>, Riesenmonster (deren Anwendungsbeispiele mehr Code haben als eine Eigenimplementation) oder <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2tlaXRoZGV2ZW5zLmNvbS9zb2Z0d2FyZS9waHBfY2FsZW5kYXI=">Kalender, die zwar gut sind, aber irgendwie nicht gepasst haben</a> (<a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2RlLndpa2lwZWRpYS5vcmcvd2lraS9JMThu">I18n</a>, &#8230;). Ich m&#246;chte auch nix mit Ajax, Sigolin und Meister Propper, denn es soll eine Enterprise-Applikation geben, und da ist JavaScript halt nicht so opportun (und erspart mir wieder ein paar graue Haare mehr). Aber vor allem (aber das verschweige ich hier) hat das wie eine spannende Aufgabe ausgesehen, und als Kontrollfreak will ich es eben doch selber gemacht haben <img src='http://blog.oncode.info/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> .</p>
<h3>Ziel</h3>
<p>Das Ziel ist es einen Kalender zu erhalten, der die Wochen anzeigt, bei dem ein Tag (Event) markiert werden kann und das heutige Datum speziell ausgezeichnet ist. Er sollte also in etwa so aussehen (die Monatsnamen und Namen der Wochentage sollten sich auch noch der Sprache anpassen):</p>
<p><img src='http://blog.oncode.info/wp-content/uploads/2008/06/kalender.png' alt='PHP-Kalender' /></p>
<p>Man sollte entweder ein Monat und ein Jahr &#252;bergeben k&#246;nnen oder einfach nichts, wobei dann der aktuelle Monat und das aktuelle Jahr verwendet werden.</p>
<h3>Vorgehen und Implementation</h3>
<p>Ich habe mich entschlossen, dem Enterprisefassadefrontsidedecontrollerkurtmitgurtgimmeabreak-Pattern zu folgen&#8230; Quatsch, meine Gewohnheit und die Stimmen in meinem Kopf haben mich dazu gezwungen, den Kalender in zwei verschiedenen Funktionen zu implementieren. PHP hat ein absolut geniales Array-Handling, und wenn ich an solchen datenmanipulierenden Aufgaben arbeite habe ich mir angew&#246;hnt, zuerst die reinen Daten in einem (mehrdimensionalen, ev. assoziativen) Array abzubilden. Dies hat den grossen Vorteil, dass ich die aufbereiteten Daten nicht nur f&#252;r die HTML-Ausgabe, sondern auch von anderen Funktionen aus benutzen kann. Das Ziel w&#228;re ein Array, dass auf der einen Dimension die Wochen und auf der Anderen die Wochentage hat. Man nehme den ASCIIstift hervor und zeichne ein Beispiel f&#252;r Juni 2008:</p>
<pre>
[22] => {   '',   '',   '',   '',   '',   '',  '1'}
[23] => {  '2',  '3',  '4',  '5',  '6',  '7',  '8'}
[24] => {  '8',  '9', '10', '11', '12', '13', '14'}
...
[27] => { '31',   '',   '',   '',   '',   '',   ''}
</pre>
<p>Die Benamsung ist wie folgt:<br />
<img src='http://blog.oncode.info/wp-content/uploads/2008/06/kalenderbenamst.png' alt='PHP-Kalender benamst' /></p>
<h4>Den Monat in ein Array quetschen</h4>
<p>Die Funktionsdeklaration und das Defaulthandling sollten eigentlich einleuchtend sein:<br />
[cc lang="php"]<br />
	public function getMonthArray($month=null, $year=null) {<br />
		// Take today if no month or year is given<br />
		$now=time();<br />
		if($month==null || $year==null) {<br />
			$month=date(&#8221;n&#8221;, $now);<br />
			$year=date(&#8221;Y&#8221;, $now);<br />
		}<br />
[/cc]</p>
<p><a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5waHAubmV0L2RhdGU=">date</a> ist eine wichtige Funktion. Ohne Argument gibt sie verschiedene Dinge des aktuellen Datums zur&#252;ck, warum denn dieses komische <tt>$now</tt>? Es k&#246;nnte ja sein, dass mitten in der Skriptausf&#252;hrung der Monat oder das Jahr wechselt. Dann wollen wir wenigstens konsequent den letzten Monat anzeigen und nicht ein Chaos.</p>
<p>Leider fangen die Monate nicht mit Montagen an und die Wochen h&#246;ren nach 7 Tagen spontan auf. Nicht mal auf eine gemeinsame Anzahl Tagen konnten sich die Monate einigen. Um diesem Chaos zu umgehen, arbeite ich mit <tt>time()</tt>, das die Anzahl Sekunden seit 1.1.1970 zur&#252;ck gibt. Die sind zum Gl&#252;ck dem Gesetz des Dezimalsystems unterworfen und ver&#228;ndern sich nicht nach 7, 12 oder 42 Tagen.</p>
<p>Jetzt suchen wir die erste und die letzte Woche. Das w&#228;re nicht so schwierig, w&#228;re die erste Woche nicht nach <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2RlLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMQ==">ISO-8601</a> definiert: </p>
<blockquote><p>
Als erste Woche im Jahr wird die Woche mit dem ersten Januar-Donnerstag definiert. Dadurch f&#228;llt der 4. Januar immer in die erste Woche.
</p></blockquote>
<p>Was haben denn die geraucht? Dem <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2RlLndpa2lwZWRpYS5vcmcvd2lraS9HcmVnb3JpYW5pc2NoZXJfS2FsZW5kZXI=">Gregor sein Bart</a>? Also der 1. Januar kann in der 53. Woche liegen. Gut, gell?</p>
<p>Ausserdem berechnen wir noch, wieviele Leertage es zu Beginn gibt (Padding). Ist der erste Tag ein Mittwoch, m&#252;ssen 2 Tage (Mo, Di) leer gelassen werden. Ebenso am Schluss, einfach andersherum verkehrt <img src='http://blog.oncode.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .<br />
[cc lang="php"]<br />
		// Get timestamps for the first and the last day of the month<br />
		$firstdayunixstamp=mktime(0,0,0,$month,1,$year);<br />
		$lastdayunixstamp=mktime(0,0,0,$month,cal_days_in_month(CAL_GREGORIAN,$month,$year),$year);</p>
<p>		// Get the weeks numbers<br />
		$firstweek=intval(date(&#8221;W&#8221;,$firstdayunixstamp));<br />
		$lastweek=intval(date(&#8221;W&#8221;,$lastdayunixstamp));</p>
<p>		// We want to have a rectangular display. This is the padding at the beginning and the end<br />
		$firstweekday=intval(date(&#8221;N&#8221;,$firstdayunixstamp));<br />
		$lastweekday=intval(date(&#8221;N&#8221;,$lastdayunixstamp));<br />
[/cc]</p>
<p>Da wir leider nicht &#252;ber die Wochen loopen k&#246;nnen berechnen wir die Anzahl Tage (Anzahl Tage pro Monat + Leerstellen zu Beginn + Leerstellen am Schluss) und die Anzahl Wochen.</p>
<p>[cc lang="php"]<br />
		// Numweeks is not linear at the start or end of a year!<br />
		// Calculate days in month plus paddings<br />
		$daystoshow=cal_days_in_month(CAL_GREGORIAN,$month,$year)+($firstweekday-1)+(7-$lastweekday);</p>
<p>		// Calculate how much weeks we display<br />
		$numweeks=$daystoshow/7;<br />
[/cc]</p>
<p>Jetzt geht es los! Wir loopen durch die Wochen und schauen jeweils, ob wir ein Padding zu Beginn, ein Monatstag oder ein Schlusspadding einf&#252;gen m&#252;ssen:</p>
<p>[cc lang="php"]<br />
		$montharray=array();<br />
		$dayofmonth=1;<br />
		// Now loop through every week<br />
		for($iweek=0;$iweek<$numweeks;$iweek++) {<br />
			$week=intval(date("W",mktime(0,0,0,$month,$dayofmonth,$year)));<br />
			for($dayofweek=0; $dayofweek<7; $dayofweek++) {<br />
				// First week and month has not yet started or last week and month has ended?<br />
				if(($week==$firstweek &#038;&#038; $dayofweek<$firstweekday-1)<br />
				      || ($week==$lastweek &#038;&#038; $dayofweek>$lastweekday-1)) {<br />
					$day=&#8221;";<br />
				} else {<br />
					$day=$dayofmonth++;<br />
				}<br />
				$montharray[$week][$dayofweek]=$day;<br />
			}<br />
		}<br />
		return $montharray;<br />
	}<br />
[/cc]</p>
<h4>Das Array mit HTML verziehren</h4>
<p>An sich m&#252;ssen wir nun nur noch durch dieses Array hindurch foreachen und jedes Datum mit der vom Entwickler gew&#252;nschten URL plus eventuellen Parametern versehen. Klar machen wir auch noch Titelchen und so&#8230;</p>
<p>Zuerst die obligatorische initialisierung:<br />
[cc lang="php"]<br />
	public function getMonthHTML($month=null, $year=null, $day=null, $url=&#8221;", $parameters=&#8221;", $marktoday=true) {<br />
		// Take today if no month or year is given<br />
		$now=time();<br />
		if($month==null || $year==null) {<br />
			$month=date(&#8221;n&#8221;, $now);<br />
			$year=date(&#8221;Y&#8221;, $now);<br />
			$day=date(&#8221;j&#8221;, $now);<br />
		}</p>
<p>		if($marktoday) {<br />
			$thismonth=date(&#8221;n&#8221;, $now);<br />
			$thisyear=date(&#8221;Y&#8221;, $now);<br />
			$thisday=date(&#8221;j&#8221;, $now);<br />
		}</p>
<p>		// Get the dates in an array<br />
		$montharray=$this->getMonthArray($month, $year);<br />
		$htmlarray=array();<br />
[/cc]</p>
<p>Und nun der Hauptloop der jedes Datum mit Link versieht:<br />
[cc lang="php"]<br />
		// Spice up the array with links and marks for today/event<br />
		// Loop through weeks<br />
		foreach($montharray as $week=>$days) {<br />
			// Loop through days<br />
			for($dayofweek=0; $dayofweek<7; $dayofweek++) {<br />
				// Just<br />
				if($montharray[$week][$dayofweek]) {<br />
					// Mark today<br />
					$currentday=$montharray[$week][$dayofweek];<br />
					if($year==$thisyear&#038;&#038;$month==$thismonth&#038;&#038;$montharray[$week][$dayofweek]==$thisday&#038;&#038;$marktoday) {<br />
						$currentday='<span class="today">&#8216;.$currentday.&#8221;</span>&#8220;;<br />
					}<br />
					// The event<br />
					if($day &#038;&#038; $montharray[$week][$dayofweek]==$day) {<br />
						$currentday=&#8217;<span class="marked">&#8216;.$currentday.&#8221;</span>&#8220;;<br />
					} 					</p>
<p>					// Create the link<br />
					if($url) {<br />
						$showurl = $url.&#8221;?&#8221;.($parameters?$parameters.&#8221;&amp;&#8221;:&#8221;").&#8221;day=&#8221;.urlencode($montharray[$week][$dayofweek]).&#8221;&amp;month=&#8221;.urlencode($month).&#8221;&amp;year=&#8221;.urlencode($year);<br />
						$currentday=&#8217;<a href="'.$showurl.'">&#8216;.$currentday.&#8217;</a>&#8216;;<br />
					}<br />
					$htmlarray[$week][$dayofweek]=$currentday;<br />
				} else {<br />
					$htmlarray[$week][$dayofweek]=&#8221;;<br />
				}<br />
			}<br />
		}<br />
[/cc]</p>
<p>In einem zweiten Loop passen wir dann alles in eine sch&#246;ne Tabelle. Das <tt>join</tt> Kommando ist echt Zucker! Elegant kann man damit zwischen Array-Inhalten etwas einf&#252;llen, sei es ein Komma oder eben die Zellentrenner. Ein kleiner Hack erm&#246;glicht uns die Beschriftung der Wochentage.</p>
<p>Die entsprechenden Klassen werden vorgegeben und mit CSS kann der heutige Tag/das markierte Event noch sch&#246;n gestaltet werden&#8230;.</p>
<p>Wieso gebe ich HTML zur&#252;ck und nicht direkt aus? Weil Gott jedesmal ein kleines Hundebaby t&#246;tet wenn man HTML in einer Unterfunktion ausgibt!</p>
<p>[cc lang="php"]<br />
		//Create HTML table<br />
		$firstdayunixstamp=mktime(0,0,0,$month,1,$year);<br />
		$html = &#8216;<br />
<table class="month">&#8216;.&#8221;\n&#8221;;<br />
		// Header<br />
		$html .= &#8216;<br />
<tr>
<th colspan="8">&#8216;.date(&#8221;F&#8221;,$firstdayunixstamp).&#8217; &#8216;.$year.&#8217;</th>
</tr>
<p>&#8216;.&#8221;\n&#8221;;<br />
		$html .= &#8216;<br />
<tr>
<th></th>
<p>&#8216;;<br />
		// Names of the weekdays<br />
		for($i=0;$i<7;$i++) {<br />
			//Ugly Hack, September 2008 starts with a monday.<br />
			$html.='
<th class="weekday">&#8216;.date(&#8221;D&#8221;, mktime(0,0,0,9,$i+1,2008)).&#8221;</th>
<p>&#8220;;<br />
		}<br />
		$html .= &#8221;  </tr>
<p>\n&#8221;;</p>
<p>		// Loop through weeks<br />
		foreach($htmlarray as $week=>$days) {<br />
		  $html .= &#8216;<br />
<tr>
<th class="monthweek">&#8216;.$week.&#8217;</th>
<td class="monthday">&#8216;.join(&#8217;</td>
<td class="monthday">&#8216;,$days).&#8217;</td>
<p>&#8216;.&#8221;\n&#8221;;<br />
		}<br />
		// We are done<br />
		$html .= &#8220;</table>
<p>\n&#8221;;<br />
		return $html;<br />
	}</p>
<p>[/cc]</p>
<p>Gibt es Verbesserungsvorschl&#228;ge?</p>
<p>Hier der komplette Code zum Download: <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cub25jb2RlLmluZm8vd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDYvbW9udGhkaXNwbGF5cGhwLnppcA==" title='MonthDisplay in PHP'>MonthDisplay in PHP</a>
<p>&copy; 2008 bei Skaldrom Y. Sarg von oncode.info<br />
&#220;bers ein Produkt bloggen lassen oder mit Bloggen Geld verdienen? Mache ich mit <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy50cmlnYW1pLmNvbS8/cmVmPVNrYWxkcm9tK1kuK1Nhcmc=" rel=\"nofollow\">Trigami</a>.</p>
 <img src="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?view=1&post_id=423" width="1" height="1" style="display: none;" /><h3>Ähnliche Artikel</h3><ul class="related_post"><li><a href="http://blog.oncode.info/2008/07/28/dynamische-signatur-e-schrecking-fuer-foren-myspace/" title="Dynamische Signatur - e-Schrecking für Foren, MySpace, &#8230;">Dynamische Signatur - e-Schrecking für Foren, MySpace, &#8230;</a></li><li><a href="http://blog.oncode.info/2008/07/30/automatisches-und-mehrfaches-submitten-von-formularen/" title="Automatisches und mehrfaches submitten von Formularen">Automatisches und mehrfaches submitten von Formularen</a></li><li><a href="http://blog.oncode.info/2008/06/10/aiml-intelligenz-im-xml/" title="AIML: Intelligenz im XML">AIML: Intelligenz im XML</a></li><li><a href="http://blog.oncode.info/2008/05/07/php_self-ist-boese-potentielles-cross-site-scripting-xss/" title="PHP_SELF ist böse! Potentielles Cross Site Scripting (XSS)!">PHP_SELF ist böse! Potentielles Cross Site Scripting (XSS)!</a></li><li><a href="http://blog.oncode.info/2008/03/20/kleine-seo-tools-mit-quelltext-in-php/" title="Kleine SEO-Tools mit Quelltext in PHP">Kleine SEO-Tools mit Quelltext in PHP</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.oncode.info/2008/06/28/mit-php-einen-monat-mit-verlinkbaren-daten-anzeigen/feed/</wfw:commentRss>
		</item>
		<item>
		<title>AIML: Intelligenz im XML</title>
		<link>http://blog.oncode.info/2008/06/10/aiml-intelligenz-im-xml/</link>
		<comments>http://blog.oncode.info/2008/06/10/aiml-intelligenz-im-xml/#comments</comments>
		<pubDate>Tue, 10 Jun 2008 20:09:09 +0000</pubDate>
		<dc:creator>skaldrom</dc:creator>
		
		<category><![CDATA[Theorie und Schnipsel]]></category>

		<category><![CDATA[AI]]></category>

		<category><![CDATA[AIML]]></category>

		<category><![CDATA[ALICE]]></category>

		<category><![CDATA[Aritificial]]></category>

		<category><![CDATA[Bot]]></category>

		<category><![CDATA[Chat]]></category>

		<category><![CDATA[Chatbot]]></category>

		<category><![CDATA[german]]></category>

		<category><![CDATA[Intelligence]]></category>

		<category><![CDATA[Intelligenz]]></category>

		<category><![CDATA[Interpreter]]></category>

		<category><![CDATA[Pandorabots]]></category>

		<category><![CDATA[pattern]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://blog.oncode.info/2008/06/10/aiml-intelligenz-im-xml/</guid>
		<description><![CDATA[AIML ist eine Beschreibungssprache f&#252;r Chatbots. Interpreter k&#246;nnen diesen XML-Dialekt interpretieren und Eliza spielen.]]></description>
			<content:encoded><![CDATA[<p><img src='http://blog.oncode.info/wp-content/uploads/2008/06/brain.png' alt='Brain' class="lead" align="left"/>Wenn man schon keine eigene Intelligenz besitzt, ist man froh, dass es sie auch in k&#252;nstlicher Form gibt. Bis vor einiger Zeit wurde ziemlich propriet&#228;r rumgewurstelt, aber nun gibt es <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2RlLndpa2lwZWRpYS5vcmcvd2lraS9BSU1M">AIML</a>, die <em>Artificial Intelligence Markup Language</em> die mit XML und Standardisierung das Verwenden unter verschiedenen Plattformen m&#246;glich macht. XML und Intelligenz ist also doch nicht per se ein Widerspruch.</p>
<p>Interessant ist das Ziel dieser Bem&#252;hungen (wie auf <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5wYW5kb3JhYm90cy5jb20vYm90bWFzdGVyL2VuL3R1dG9yaWFsP2NoPTE=">Pandorabots</a> beschrieben):</p>
<blockquote><p>Inhalte zu erstellen, die den Besucher dazu veranlassen so lange wie m&#246;glich mit dem Bot zu reden.</p></blockquote>
<p>Auf der Basis von AIML wurden verschiedene Interpreter f&#252;r verschiedene Programmiersprache geschaffen, Inhaltsdateien erstellt, die alle von der <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2FsaWNlYm90LmJsb2dzcG90LmNvbS8=">offiziellen Homepage</a> oder der <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2FpdG9vbHMub3JnL01haW5fUGFnZQ==">Tools Page</a> heruntergeladen werden k&#246;nnen.</p>
<h3>AIML als XML (Gimme Code!)</h3>
<p>AIML ist ziemlich komplex. Es gibt die M&#246;glichkeit einer Unterteilung in Themen, der Extraktion von Mustern, der spezifischen Auswahl der Antworten etc, etc&#8230; Die englischen <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbGljZWJvdC5vcmcvZG9jdW1lbnRhdGlvbi9wdGFncy5odG1s">&#220;bersichten und Tutorials</a> gehen tiefer in die Materie.</p>
<h4>AIML Tags</h4>
<p>Die wichtigsten Tags von AIML:</p>
<dl>
<dt><tt>aiml</tt></dt>
<dd>Der Root-Tag, der die AIML Definitionen umschliesst.</dd>
<dt><tt>category</tt></dt>
<dd>Umschliesst eine Benutzereingabe und Bot-Reaktionen darauf.</dd>
<dt><tt>pattern</tt></dt>
<dd>Muster einer Benutzereingabe. Als Wildcards gibt es <tt>_</tt> und <tt>*</tt>, die sich in der Priorit&#228;t unterscheiden. Pattern werden normalerweise ohne Satzzeichen eingegeben.</dd>
<dt><tt>template</tt></dt>
<dd>Antworten des Bots.</dd>
<dt><tt>set und get</tt></dt>
<dd>Definiere Variablen: So k&#246;nnen Dinge, die der Benutzer gesagt hat gespeichert werden.</dd>
<dt><tt>srai</tt></dt>
<dd>Schaue bei einem anderen Pattern nach, was Du tun sollst.</dd>
<dt><tt>bot</tt></dt>
<dd>Lese eine Eigenschaft des Bots aus.</dd>
<dt><tt>star</tt></dt>
<dd>Alles was an Stelle des Sterns geschrieben wurde.</dd>
<dt><tt>that</tt></dt>
<dd>Der letzte Text des Bots.</dd>
<dt><tt>topic</tt></dt>
<dd>Diese Kategorien werdun nur bei diesem Thema ausgewertet.</dd>
</dl>
<h4>Das Beispiel</h4>
<p>Ein kleines Beispiel mit Leckereien.</p>
<p>[cc lang="XML"]<br />
<?xml version="1.0" encoding="UTF-8"?><br />
<aiml><br />
	<category></p>
<pattern>*</pattern>
		<template><br />
			<random></p>
<li>Warum sprichst Du mit mir?</li>
<li>Was w&#252;rdest Du lieber tun als hier am Computer zu sitzen?</li>
<li>Wie geht es Deinen Freunden?</li>
<p>			</random><br />
		</template><br />
	</category></p>
<p>	<category></p>
<pattern>HALLO</pattern>
		<template>Tachauch</template><br />
	</category></p>
<p>	<category></p>
<pattern>HAI</pattern>
		<template><srai>HALLO</srai></template><br />
	</category></p>
<p>	<category></p>
<pattern>WAS HEISST DAS</pattern>
		<template>Ich habe &#8220;
<that/>&#8221; gesagt&#8230;</template><br />
	</category></p>
<p>	<category></p>
<pattern>WIE HEISST DU</pattern>
		<template>Ich heisse <bot name="name" />. Wie ist Dein Name?</template><br />
	</category></p>
<p>	<category></p>
<pattern>ICH HEISSE *</pattern>
		<template>Hallo auch <set name="name"><star/></set>.</template><br />
	</category></p>
<p>	<category></p>
<pattern>WIE HEISSE ICH</pattern>
		<template><srai>WIEHEISSEICH <get name="name" /></srai></template><br />
	</category><br />
	<category></p>
<pattern>WIEHEISSEICH *</pattern>
		<template>Denkst Du ichbinbl&#246;doderwas? Du heisst <get name="name" />.</template><br />
	</category><br />
	<category></p>
<pattern>WIEHEISSEICH undefined</pattern>
		<template>Das weiss ich nicht, sagst Du es mir?</template><br />
	</category><br />
</aiml><br />
[/cc]</p>
<p>Die erste Kategorie steht f&#252;r die Ausgaben, wenn der Roboter was nicht begreift. Aus den zur Verf&#252;gung stehenden Pattern wird per Zufall eines ausgelesen. Die zweite Kategorie reagiert auf ein &#8220;Hallo&#8221; des Benutzers. In der dritten Kategorie wird gesagt, dass &#8220;Hai&#8221; dem &#8220;Hallo&#8221; entspricht. In der n&#228;chsten Kategorie wird auf Nachfragen eingegangen (mittels <tt>that</tt>) und in der Kategorie darunter wird auf die Botdefinitionsvariable <tt>name</tt> zugegriffen. Jeder Bot kann mit vielen verschiedenen Eigenschaften ausgestattet werden, die &#252;ber diesen Tag ausgelesen werden k&#246;nnen. Das Pattern mit &#8220;ICH HEISSE&#8221; speichert den Namen des Gespr&#228;chspartners in der Variable <tt>name</tt>.</p>
<p>Nun kommt was Spannendes: Wenn der Gespr&#228;chspartner fragt wie er selbst denn heisst, wird jenachdem, ob der Name bekannt ist oder nicht, in verschiedene Kategorien verwiesen.</p>
<p>Ein m&#246;gliches Gespr&#228;ch mit diesem Bot:</p>
<blockquote><p>
M: Hallo<br />
<i>C: Tachauch</i><br />
M: Hai<br />
<i>C: Tachauch</i><br />
M: Was heisst das?<br />
<i>C: Ich habe &#8220;Tachauch&#8221; gesagt&#8230;</i><br />
M: Sprich was.<br />
<i>C: Was w&#252;rdest Du lieber tun als hier am Computer zu sitzen?</i><br />
M: Wie heisst Du?<br />
<i>C: Ich heisse Program E. Wie ist Dein Name?</i><br />
M: Wie heisse ich?<br />
<i>C: Das weiss ich nicht, sagst Du es mir?</i><br />
M: Ich heisse Skaldrom.<br />
<i>C: Hallo auch Skaldrom.</i><br />
M: Wie heisse ich?<br />
<i>C: Denkst Du ichbinbl&#246;doderwas? Du heisst Skaldrom.</i>
</p></blockquote>
<h3>AIML in PHP (Gimme Even Moarrr Code!)</h3>
<h4>Program E</h4>
<p><a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9wcm9ncmFtZS8=">Program E</a> ist die Implementierung eines kompletten Bots in PHP. Es bietet eine  datenbankgest&#252;tzte Chatbotumgebung. Leider Ist die Entwicklung etwas eingeschlafen.</p>
<p>Die Installation ist machbar, folgende Hinweise k&#246;nnen helfen:</p>
<ol>
<li>Glaube mir und lese <tt>instructions.html</tt></li>
<li>in <tt>src/admin/dbprefs.php</tt> m&#252;ssen nicht nur die Datenbankverbindung, sondern auch der Pfad der <tt>startup.xml</tt> konfiguriert werden:<br />
[cc lang="bash"]<br />
$rootdir=&#8221;../../aiml/&#8221;;<br />
[/cc]
</ol>
<p>Leider sind die Fehlermeldungen etwas knapp geraten. Sollte er den Bot nicht einf&#252;gen k&#246;nnen (<tt>Loading bot: 0</tt>)stimmt wahrscheinlich etwas mit der Datenbankverbindung nicht.</p>
<p>Um deutsch zu quasseln, einfach die <tt>german-standalone</tt> von oben in das aiml-Verzeichnis kopieren und nochmals <tt>botloader.php</tt> aufrufen.</p>
<h4>Projekt Program E in a box</h4>
<p>Leider ist Program E ein fertiger Bot und nicht eine Library. Es w&#228;re sch&#246;n wenn man das Ganze objektorientiert in eigenen Applikationen direkt verwenden k&#246;nnte. Zum Gl&#252;ck habe ich soviel Zeit.</p>
<h3>Tools</h3>
<p>Um AIML-Dateien zu editieren gibt es unter Linux leider nichts gescheites. F&#252;r Windows sieht <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3JlYmVjY2EtYWltbC5zb3VyY2Vmb3JnZS5uZXQv">Rebecca</a> sehr nett aus.</p>
<p>Will man nur Bots machen, so kann man sie bei <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5yb2JvdGhvc3RpbmcuZGUv">Robohosting</a> oder <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5wYW5kb3JhYm90cy5jb20=">Pandorabots</a> hosten lassen und sich nur mit deren Hirnen auseinandersetzen. Beide bieten nette Snippets an um die Bots auf der eigenen Site zu verwenden.</p>
<p>F&#252;r Joomla gibt es ein <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2V4dGVuc2lvbnMuam9vbWxhLm9yZy9jb21wb25lbnQvb3B0aW9uLGNvbV9tdHJlZS90YXNrLHZpZXdsaW5rL2xpbmtfaWQsNDMxL0l0ZW1pZCwzNS8=">PlugIn</a>, dass eine einfache Einbindung von Chatbots erm&#246;glicht.</p>
<h3>Weiterf&#252;hrende Literatur</h3>
<p>Teleopolis hat <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5oZWlzZS5kZS90cC9yNC9hcnRpa2VsLzQvNDg2MS8xLmh0bWw=">einen Artikel &#252;ber AIML und AIML-Bots, die Menschen imitieren</a>. Wie immer halb technisch halb klugscheisserisch&#8230; Etwas praktischer geht es bei <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5saW51eC11c2VyLmRlL2F1c2dhYmUvMjAwNi8wOS8wODktYWltbC9pbmRleC5odG1s">Linux User</a> zu. Eine kleine <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy51bmktaGlsZGVzaGVpbS5kZS9+cnNjaG5laWQvQWxpY2V1bmRVbWdlYnVuZy5wZGY=">&#220;bersicht &#252;ber die Tools</a> gibt es bei der Uni Hildesheim.</p>
<h3>Deutsche AIML Datei</h3>
<p>Der Gott des deutschen AIML ist <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5kcm9zc21hbm4uZGUv">Christian Drossmann</a>. Leider ist der Downloadlink auf der AIML-Homepage futsch, aber von seiner Seite aus kann man sie noch <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5kcm9zc21hbm4uZGUvR2VybWFuQWxpY2UvcGFnZTEvYWxpY2UtZG93bmxvYWRzLmh0bWw=">problemlos downloaden</a>. Ebenfalls lustig ist <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5kcm9zc21hbm4uZGUvYWxpY2VibG9nLw==">sein Blog</a>, in dem er &#252;ber die Chats der Besucher seiner Seite mit Alice schreibt.</p>
<h3>Ausblick</h3>
<p>Irgendwann, ja irgendwann werde ich mich auch noch <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5vcGVuY3ljLm9yZy8=">opencyc</a> zuwenden, das ich unglaublich faszinierend finde&#8230;
<p>&copy; 2008 bei Skaldrom Y. Sarg von oncode.info<br />
&#220;bers ein Produkt bloggen lassen oder mit Bloggen Geld verdienen? Mache ich mit <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy50cmlnYW1pLmNvbS8/cmVmPVNrYWxkcm9tK1kuK1Nhcmc=" rel=\"nofollow\">Trigami</a>.</p>
 <img src="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?view=1&post_id=421" width="1" height="1" style="display: none;" /><h3>Ähnliche Artikel</h3><ul class="related_post"><li><a href="http://blog.oncode.info/2008/03/13/spass-und-erleuchtung-auf-dem-xpath/" title="Spass und Erleuchtung auf dem XPath">Spass und Erleuchtung auf dem XPath</a></li><li><a href="http://blog.oncode.info/2008/03/12/active-record-pattern-in-php/" title="Active Record Pattern in PHP">Active Record Pattern in PHP</a></li><li><a href="http://blog.oncode.info/2007/09/12/observer-pattern-in-php-mit-der-spl/" title="Observer Pattern in PHP mit der SPL">Observer Pattern in PHP mit der SPL</a></li><li><a href="http://blog.oncode.info/2008/07/30/automatisches-und-mehrfaches-submitten-von-formularen/" title="Automatisches und mehrfaches submitten von Formularen">Automatisches und mehrfaches submitten von Formularen</a></li><li><a href="http://blog.oncode.info/2008/07/28/dynamische-signatur-e-schrecking-fuer-foren-myspace/" title="Dynamische Signatur - e-Schrecking für Foren, MySpace, &#8230;">Dynamische Signatur - e-Schrecking für Foren, MySpace, &#8230;</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.oncode.info/2008/06/10/aiml-intelligenz-im-xml/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Zattooparty: Fundrising auf neuem Niveau</title>
		<link>http://blog.oncode.info/2008/05/23/zattooparty-fundrising-auf-neuem-niveau/</link>
		<comments>http://blog.oncode.info/2008/05/23/zattooparty-fundrising-auf-neuem-niveau/#comments</comments>
		<pubDate>Fri, 23 May 2008 17:02:55 +0000</pubDate>
		<dc:creator>skaldrom</dc:creator>
		
		<category><![CDATA[Weitere Gedanken]]></category>

		<category><![CDATA[Fundraising]]></category>

		<category><![CDATA[live]]></category>

		<category><![CDATA[Party]]></category>

		<category><![CDATA[Web-2.0]]></category>

		<category><![CDATA[Zattoo]]></category>

		<guid isPermaLink="false">http://blog.oncode.info/2008/05/23/zattooparty-fundrising-auf-neuem-niveau/</guid>
		<description><![CDATA[Liveblogging vom Zattooevent, von n&#252;chtern bis betrunken :)...]]></description>
			<content:encoded><![CDATA[<p>Ok, wir befinden uns auf der Zattooparty, nachdem wir der absolut genialen Beschilderung - bestehend aus verwirrten Leuten mit Google-Maps Ausdrucken in der Hand - gefolgt sind, haben wir sie gefunden: Die <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3phdHRvby5jb20vbmV3c2xldHRlci9jaDIwMDgtMDUtMTUvaW5kZXguaHRtbA==">Zattooparty</a>.<br />
<a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cub25jb2RlLmluZm8vd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDUvemF0dG9vMi5qcGc=" title='Zattooparty'><img src='http://blog.oncode.info/wp-content/uploads/2008/05/zattoo2.thumbnail.jpg' alt='Zattooparty' /></a></p>
<p>Nunja. alle warten&#8230; Auf was wohl? Wahrscheinlich die versprochenen W&#252;rste. Die Ressourcen (die Location) ist leicht unterdimensioniert. Wenn jeder 10te Schweizer hier auftaucht wird es noch enger.</p>
<p>Es handelt sich wohl um ein verstecktes Fundraising, denn das Bier kostet echt 5 Scht&#252;tz! Da bekommt der Ausdruck &#8220;Blondes Gold&#8221; echt eine neue Bedeutung.<br />
<a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cub25jb2RlLmluZm8vd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDUvemF0dG9vMS5qcGc=" title='Blondes Gold'><img src='http://blog.oncode.info/wp-content/uploads/2008/05/zattoo1.thumbnail.jpg' alt='Blondes Gold' /></a><br />
Naja, mal sehen&#8230;</p>
<p>Update 19:25: Die W&#252;rste sind da und erst noch gratis. Es gebe jemandem dem Pfarrer Sieber Bescheid. Der Senf ist gut aber karg (Meinung von <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5kbS00Lm5ldC9pbmRleC5waHA/b3B0aW9uPWNvbV9yZF9yc3MmIzAzODtpZD0x">Fabrice de la Croix</a>).</p>
<p><a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5nb29nbGUuY2gvc2VhcmNoP3E9JTIyRGFua2UrZiVDMyVCQ3IrZGVpbmUrQWJtZWxkdW5nLitXZWl0ZXJoaW4rdmllbCtTcGFzcyttaXQrWmF0dG9vISUyMiYjMDM4O2llPXV0Zi04JiMwMzg7b2U9dXRmLTgmIzAzODthcT10JiMwMzg7cmxzPWNvbS51YnVudHU6ZW4tVVM6dW5vZmZpY2lhbCYjMDM4O2NsaWVudD1maXJlZm94LWE=">Emma</a> habe ich leider noch nicht gesehen.</p>
<p>Update 19:53: Eine Band spielt. Sehr laut. Wie w&#228;re es mit einer Zattooversion &#8220;Ak-hkk sllll-mm thk zn rsss &#8230;&#8221;? Frage von Fabrice de la Croix: Sendet Zattoo auf klingonisch?</p>
<p>Alle sitzen da, der Senf macht brutal aggressiv und <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovLzR0Mi5saS9ibG9nLw==">Case</a> f&#252;hlt sich trotz iiiiiih-foun 1.0&#8230; Er m&#246;chte auch bloggen, kann aber nicht, weil er nicht publishen kann mit Safari. Haha, mehr Air denn Fone&#8230;.</p>
<p>Update 20:46: Die Party n&#228;hert sich dem H&#246;hepunkt. Das vierte Bier. Wir haben leider noch kein Abziehbildchen, aber Fabrice de la Croix hat schon mal die Toilette getaggt. Hier ein Foto mit da Maaan der uns ebendieses vierte Bier gebracht hat:<br />
<a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cub25jb2RlLmluZm8vd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDUvMDAwNC5qcGc=" title='Da Maaan'><img src='http://blog.oncode.info/wp-content/uploads/2008/05/0004.thumbnail.jpg' alt='Da Maaan' /></a></p>
<p>Update 21:08: Bei Case zuhause ist der elektronische Supergau eingetreten und Fabrice de la Croix braucht drei Zellen um sich zu lokalisieren. Was machen Einzeller in dieser Situation?</p>
<p>Fabrice de la Croix kann mit seinem 1-phone (ja, das i ist eigentlich eine 1) Sound aufnehmen. Hier der Beweis: <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=L3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDA4LzA1L3phdHRvby5tcDM=">Die Band die hier performt</a>.</p>
<p>Vielleicht w&#228;ren die Zattooler lieber auf folgendes Angebot eingegangen (kurz danach am Bahnhof Brugg gefunden):<br />
<a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cub25jb2RlLmluZm8vd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDUvZHNjMDAwMDUuanBn" title='Nebenjop….. 1000-2000 Fr. in einer woche verdienen  in serj&#246;se art, natel 076xxxxxxx'><img src='http://blog.oncode.info/wp-content/uploads/2008/05/dsc00005.thumbnail.jpg' alt='Nebenjop….. 1000-2000 Fr. in einer woche verdienen  in serj&#246;se art, natel 076xxxxxxx' /></a>
<p>&copy; 2008 bei Skaldrom Y. Sarg von oncode.info<br />
&#220;bers ein Produkt bloggen lassen oder mit Bloggen Geld verdienen? Mache ich mit <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy50cmlnYW1pLmNvbS8/cmVmPVNrYWxkcm9tK1kuK1Nhcmc=" rel=\"nofollow\">Trigami</a>.</p>
 <img src="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?view=1&post_id=414" width="1" height="1" style="display: none;" /><h3>Ähnliche Artikel</h3><ul class="related_post"><li><a href="http://blog.oncode.info/2008/01/25/uwa-widgets-coden/" title="UWA Widgets coden">UWA Widgets coden</a></li><li><a href="http://blog.oncode.info/2007/12/01/voting-extrem-netvotingcom/" title="Voting Extrem: Netvoting.com">Voting Extrem: Netvoting.com</a></li><li><a href="http://blog.oncode.info/2007/09/11/akuma-oder-freie-musik-fuer-freie-buerger/" title="Akuma! oder: freie Musik für freie Bürger">Akuma! oder: freie Musik für freie Bürger</a></li><li><a href="http://blog.oncode.info/2007/06/06/friendwatch-web-20-und-lokalisierte-dienste/" title="Friendwatch: Web 2.0 und lokalisierte Dienste">Friendwatch: Web 2.0 und lokalisierte Dienste</a></li><li><a href="http://blog.oncode.info/2006/11/25/ein-ajax-baum-der-sich-sein-zustand-merkt/" title="Ein Ajax Baum der sich sein Zustand merkt">Ein Ajax Baum der sich sein Zustand merkt</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.oncode.info/2008/05/23/zattooparty-fundrising-auf-neuem-niveau/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Black Hat SEO: PageRank und &#8220;XSS&#8221;</title>
		<link>http://blog.oncode.info/2008/05/15/black-hat-seo-pagerank-und-xss/</link>
		<comments>http://blog.oncode.info/2008/05/15/black-hat-seo-pagerank-und-xss/#comments</comments>
		<pubDate>Thu, 15 May 2008 13:54:08 +0000</pubDate>
		<dc:creator>skaldrom</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[Backlinks]]></category>

		<category><![CDATA[CrossSiteScripting]]></category>

		<category><![CDATA[Google]]></category>

		<category><![CDATA[Googlehack]]></category>

		<category><![CDATA[Hacking]]></category>

		<category><![CDATA[Pagerank]]></category>

		<category><![CDATA[Security]]></category>

		<category><![CDATA[SEO]]></category>

		<category><![CDATA[XSS]]></category>

		<guid isPermaLink="false">http://blog.oncode.info/2008/05/15/black-hat-seo-pagerank-und-xss/</guid>
		<description><![CDATA[Ein Gedankenexperiment: K&#246;nnte mit XSS der PageRank manipuliert werden?]]></description>
			<content:encoded><![CDATA[<h3>Gedankenspiel</h3>
<p><img align="left" class="lead" src='http://blog.oncode.info/wp-content/uploads/2008/05/fzl.png' alt='Frank Zahnder' />In einem <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=LzIwMDgvMDUvMDcvcGhwX3NlbGYtaXN0LWJvZXNlLXBvdGVudGllbGxlcy1jcm9zcy1zaXRlLXNjcmlwdGluZy14c3Mv">fr&#252;heren Beitrag</a> habe ich schon mal was &#252;ber XSS abgesondert. Dort kann man auch Beispiele sehen, die Texte statt Skripts in die fremden Websites einf&#252;gen.</p>
<p>Lasst uns ein Gedankenspiel machen:<br />
Kurt hat eine Website (und <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUJyUGNnOHkyLTVF">keinen Gurt</a>, wie Insider wissen <img src='http://blog.oncode.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> ). Kurt m&#246;chte einen hohen <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2RlLndpa2lwZWRpYS5vcmcvd2lraS9QYWdlUmFuaw==">PageRank</a>, damit er in den Suchmaschinen gut gelistet, gefunden und mit Geld &#252;bersch&#252;ttet wird. Es wird vermutet, dass der PageRank mit der Anzahl und Qualit&#228;t der Backlinks zusammenh&#228;ngt. Backlinks sind die Links, die von einer fremden Website auf Kurts Machtwerk zeigen. Kurts Namen ist kurz und seine Geduld ist klein; Er mag nicht warten, bis die Webmaster seine &#252;bergenialen Inhalte gefunden und verlinkt haben.</p>
<p>Was w&#252;rde passieren, wenn ebendieser Kurt XSS L&#252;cken ausnutzen w&#252;rde? Was, wenn er Links konstruieren w&#252;rde, die auf fremden Websites Links auf seine eigene Seite darstellen? Was, wenn er diese Links in Foren und anderswo grossz&#252;gig streuen w&#252;rde?<br />
Der Googlebot w&#252;rde den Links folgen, die Verweise auf Kurts Seite finden und ihn belohnen, oder?</p>
<h3>Das Beispiel</h3>
<p><a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5tYXJjYW50LmNoL3N1YmRvbWFpbnMvdmlwZXJnYi9zY3JlZW4ucGhwP3ZnYnhpZmVycD0="%3E%3Ch1%3E%3Ca%20href=%22http://kurt%22%3EKurt,%20mit%20ohne%20Gurt!%3C/a%3E%3C/h1%3E%3Cform%20method='post'%20action='screen.php?vgbxiferp=&#038;vgbreliam=23\">Hier ein Beispiel</a> (Screenshot weil der Fehler korrigiert werden k&#246;nnte).<br />
<a rel=\"nofollow\" href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cub25jb2RlLmluZm8vd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDUva3VydC5wbmc=" title='kurt xss'><img src='http://blog.oncode.info/wp-content/uploads/2008/05/kurt.thumbnail.png' alt='kurt xss' /></a></p>
<p>Nat&#252;rlich kann man auch andere Dinge ausnutzen um seinen Text dorthin zu kriegen und Opfer mit h&#246;herem Pagerank suchen. Aber gerade  dieses Formular scheint <a rel=\"nofollow\" href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5nb29nbGUuY2gvc2VhcmNoP2hsPWRlJiMwMzg7cT1pbnVybCUzQXZnYnhpZmVycCYjMDM4O2J0bkc9U3VjaGUmIzAzODttZXRhPQ==">sehr verbreitet</a> zu sein&#8230;</p>
<h3>Die Frage bleibt&#8230;</h3>
<p>W&#252;rde das gehen? Hat das schon jemand versucht? Ich bin viel zu lieb solche Dinge in Angriff zu nehmen&#8230; LOL
<p>&copy; 2008 bei Skaldrom Y. Sarg von oncode.info<br />
&#220;bers ein Produkt bloggen lassen oder mit Bloggen Geld verdienen? Mache ich mit <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy50cmlnYW1pLmNvbS8/cmVmPVNrYWxkcm9tK1kuK1Nhcmc=" rel=\"nofollow\">Trigami</a>.</p>
 <img src="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?view=1&post_id=410" width="1" height="1" style="display: none;" /><h3>Ähnliche Artikel</h3><ul class="related_post"><li><a href="http://blog.oncode.info/2008/05/07/php_self-ist-boese-potentielles-cross-site-scripting-xss/" title="PHP_SELF ist böse! Potentielles Cross Site Scripting (XSS)!">PHP_SELF ist böse! Potentielles Cross Site Scripting (XSS)!</a></li><li><a href="http://blog.oncode.info/2007/08/20/wieviel-wert-hat-ein-blog-bzw-eine-website/" title="Wieviel Wert hat ein Blog bzw eine Website? ">Wieviel Wert hat ein Blog bzw eine Website? </a></li><li><a href="http://blog.oncode.info/2008/03/20/kleine-seo-tools-mit-quelltext-in-php/" title="Kleine SEO-Tools mit Quelltext in PHP">Kleine SEO-Tools mit Quelltext in PHP</a></li><li><a href="http://blog.oncode.info/2007/12/06/google-hat-mich-wieder-lieb/" title="Google hat mich wieder lieb&#8230;">Google hat mich wieder lieb&#8230;</a></li><li><a href="http://blog.oncode.info/2007/08/29/spamluders-fave-und-bookmarkaktion/" title="Spamluders Fave und Bookmarkaktion">Spamluders Fave und Bookmarkaktion</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.oncode.info/2008/05/15/black-hat-seo-pagerank-und-xss/feed/</wfw:commentRss>
		</item>
		<item>
		<title>15 Sekunden Ruhm; Moodle, e-Learning und die Berufsfachschule BBB im Fernsehen</title>
		<link>http://blog.oncode.info/2008/05/09/15-sekunden-ruhm-moodle-e-learning-und-die-berufsfachschule-bbb-im-fernsehen/</link>
		<comments>http://blog.oncode.info/2008/05/09/15-sekunden-ruhm-moodle-e-learning-und-die-berufsfachschule-bbb-im-fernsehen/#comments</comments>
		<pubDate>Fri, 09 May 2008 11:11:50 +0000</pubDate>
		<dc:creator>skaldrom</dc:creator>
		
		<category><![CDATA[eLearning]]></category>

		<category><![CDATA[Ausbildung]]></category>

		<category><![CDATA[BBB]]></category>

		<category><![CDATA[Bericht]]></category>

		<category><![CDATA[Berufsfachschule]]></category>

		<category><![CDATA[Einstein]]></category>

		<category><![CDATA[Fernsehen]]></category>

		<category><![CDATA[IBM]]></category>

		<category><![CDATA[Moodle]]></category>

		<category><![CDATA[Praesenzunterricht]]></category>

		<category><![CDATA[sfdrs]]></category>

		<category><![CDATA[Skaldrom]]></category>

		<category><![CDATA[TV]]></category>

		<guid isPermaLink="false">http://blog.oncode.info/2008/05/09/15-sekunden-ruhm-moodle-e-learning-und-die-berufsfachschule-bbb-im-fernsehen/</guid>
		<description><![CDATA[Die Berufsfachschule BBB hat wieder einmal zugeschlagen: eLearning und Informatik werden im Wissensmagazin Einstein vorgestellt.]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.oncode.info/wp-content/uploads/2008/07/trophy.png" alt="Trophies" title="Trophies" width="216" height="166" class="lead" align="left" />Die <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5iYmJhZGVuLmNo">Berufsfachschule BBB</a> ist wirklich ziemlich an vorderster Front was die Umsetzung von e-Learning im Pr&#228;senzunterricht angeht. Zum Einen wurde sie von IBM zur <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5iYmJhZGVuLmNoL2Rvd25sb2FkLnBocD8xMzRjNmM5NjZhZjBmYmY5YTZiMzRhZTE3Y2YyMTUzNg==">besten e-Schule in der Sekundarstufe II</a> ausgezeichnet, zum Andern hat das Magazin <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5zZi50di9zZjEvZWluc3RlaW4vaW5kZXgucGhw">Einstein</a> des Schweizer Fernsehens einen kleinen, aber feinen Bericht dar&#252;ber gedreht, der (oder <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy1pbnRlcm5ldC5zZi50di9zZjEvZWluc3RlaW4vc2VuZHVuZy5waHA/ZG9jaWQ9MjAwODA1MDg=">direkt bei SF DRS</a>) angesehen werden kann</p>
<p>Wer in den verschiedenen Beitr&#228;gen meine Fresse erkennt, kriegt drei Vaterunser und Eisw&#252;rfel, um sie auf die Augen zu legen <img src='http://blog.oncode.info/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> .</p>
<p>Aja, den <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2luZm8uanVuaW9yd2ViYXdhcmQuY2gvZGUvZGllLWluc2VsL2FrdHVlbGw=">Juniorwebaward 2008</a> haben wir in unserer Altersklasse auch noch gewonnen&#8230;
<p>&copy; 2008 bei Skaldrom Y. Sarg von oncode.info<br />
&#220;bers ein Produkt bloggen lassen oder mit Bloggen Geld verdienen? Mache ich mit <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy50cmlnYW1pLmNvbS8/cmVmPVNrYWxkcm9tK1kuK1Nhcmc=" rel=\"nofollow\">Trigami</a>.</p>
 <img src="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?view=1&post_id=408" width="1" height="1" style="display: none;" /><h3>Ähnliche Artikel</h3><ul class="related_post"><li><a href="http://blog.oncode.info/2007/05/16/svn-und-moodleintegration-einen-schritt-weiter/" title="SVN und Moodleintegration: Einen Schritt weiter">SVN und Moodleintegration: Einen Schritt weiter</a></li><li><a href="http://blog.oncode.info/2006/09/21/svn-mit-moodle-integrieren/" title="SVN mit Moodle integrieren">SVN mit Moodle integrieren</a></li><li><a href="http://blog.oncode.info/2006/09/10/lams-und-moodle-schon-wars-gewesen/" title="LAMS und Moodle, schön wärs gewesen&#8230;">LAMS und Moodle, schön wärs gewesen&#8230;</a></li><li><a href="http://blog.oncode.info/2008/07/02/antme-spass-mit-programmierbaren-ameisen/" title="AntMe, Spass mit programmierbaren Ameisen">AntMe, Spass mit programmierbaren Ameisen</a></li><li><a href="http://blog.oncode.info/2008/01/22/und-es-geht-doch-gtco-schoolboard-unter-linux/" title="Und es geht doch! GTCO Schoolboard unter Linux">Und es geht doch! GTCO Schoolboard unter Linux</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.oncode.info/2008/05/09/15-sekunden-ruhm-moodle-e-learning-und-die-berufsfachschule-bbb-im-fernsehen/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PHP_SELF ist b&#246;se! Potentielles Cross Site Scripting (XSS)!</title>
		<link>http://blog.oncode.info/2008/05/07/php_self-ist-boese-potentielles-cross-site-scripting-xss/</link>
		<comments>http://blog.oncode.info/2008/05/07/php_self-ist-boese-potentielles-cross-site-scripting-xss/#comments</comments>
		<pubDate>Wed, 07 May 2008 08:12:13 +0000</pubDate>
		<dc:creator>skaldrom</dc:creator>
		
		<category><![CDATA[Theorie und Schnipsel]]></category>

		<category><![CDATA[CrossSiteScripting]]></category>

		<category><![CDATA[Hacking]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[PHP_SELF]]></category>

		<category><![CDATA[Programmieren]]></category>

		<category><![CDATA[secure]]></category>

		<category><![CDATA[Security]]></category>

		<category><![CDATA[Sicherheit]]></category>

		<category><![CDATA[Webserver]]></category>

		<category><![CDATA[XSS]]></category>

		<category><![CDATA[_SERVER]]></category>

		<guid isPermaLink="false">http://blog.oncode.info/2008/05/07/php_self-ist-boese-potentielles-cross-site-scripting-xss/</guid>
		<description><![CDATA[PHP_SELF (und einiges Weiteres in $_SERVER) &#246;ffnet unter Umst&#228;nden ein Scheunentor f&#252;r XSS Attacken.]]></description>
			<content:encoded><![CDATA[<h3>Was haben wir gelernt?</h3>
<p><img src='http://blog.oncode.info/wp-content/uploads/2008/05/evil.png' alt='Evil' align='left' class='lead'/>Ja, uns wurde gelehrt, dass man wenn immer m&#246;glich nicht Dateinamen direkt, sondern eine Variable angeben soll, die f&#252;r den Dateinamen steht. Warum konnte mir zwar noch niemand so genau sagen, aber ich nehme an, dass es darum geht, dass der Dateinamen oder der Pfad &#228;ndern k&#246;nnte. So habe ich ziemlich oft ganz brav geschrieben:</p>
<p>[cc lang="PHP"]</p>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>&#8221; method =&#8221;post&#8221;><br />
&#8230;<br />
</form>
<p>[/cc]<br />
Und (zum Gl&#252;ck) bin ich nicht der Einzige. Eine <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5nb29nbGUuY29tL2NvZGVzZWFyY2g/aGw9ZW4mIzAzODtxPStmb3JtK1BIUF9TRUxGJiMwMzg7c2E9Tg==">kleine Suche auf Googles Codesearch</a> hat gezeigt, dass mindestens Mambo, PHPMyFAQ, Einige Wordpressthemes und viele mehr dasselbe Problem haben. Ich bin bei Weitem auch nicht der Erste, der &#252;ber Probleme mit dieser Technik erfahren <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cucGhwZG9jLmluZm8vYXJjaGl2ZXMvMTMtWFNTLVdvZXMuaHRtbA==">und dar&#252;ber geschrieben</a> hat.</p>
<h3>Problem? mit <tt>$_SERVER['PHP_SELF']</tt>?</h3>
<p>Lasst mich ausholen: Der <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2h0dHBkLmFwYWNoZS5vcmcv">Apache Webserver</a> hat eine Option <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy8yLjIvbW9kL2NvcmUuaHRtbCNhY2NlcHRwYXRoaW5mbw==">AcceptPathInfo</a>, welche standardm&#228;ssig auf <tt>On</tt> ist. Mit dieser Option mappt der Apache beliebig lange Pfade auf Dateien, sofern diese irgendwie Bestandteil des Pfades sind. Der <a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3BocC5hYm91dC5jb20vb2QvbGVhcm5waHAvcXQvX1NFUlZFUl9QSFAuaHRt">Rest wird in Umgebungsvariablen</a> mitgegeben.</p>
<h3>Gimme Code</h3>
<p>Nehmen wir an, es g&#228;be eine Datei <tt>/subdir/mypath.php</tt> welche so aussieht:<br />
[cc lang="PHP"]<br />
<?php<br />
echo "
<pre>";
echo "REQUEST_URI: ".$_SERVER['REQUEST_URI']."\n";
echo "PHP_SELF:    ".$_SERVER['PHP_SELF']."\n";
echo "SCRIPT_NAME: ".$_SERVER['SCRIPT_NAME']."\n";
echo "</pre>
<p>&#8220;;<br />
?><br />
[/cc]</p>
<p>Bei einem Aufruf von: <tt>http://localhost/subdir/mypath.php/additional/stuff/nonsense.php?para=4</tt> mappt Apache netterweise alles auf unsere Datei <tt>http://localhost/subdir/mypath.php</tt> und verstaut den Rest im <tt>$_SERVER</tt> Array. Die Ausgabe ist:</p>
<pre>
REQUEST_URI: /subdir/mypath.php/additional/stuff/nonsense.php?para=4
PHP_SELF:    /subdir/mypath.php/additional/stuff/nonsense.php
SCRIPT_NAME: /subdir/mypath.php
</pre>
<p><tt>PHP_SELF</tt> &#252;bernimmt also den ganzen Krempel und w&#252;rde ihn bei unserem Form auch so darstellen. Angenommen, wir haben ein PHP-Script mit der URL <tt>http://localhost/contact/myform.php</tt> mit folgendem Inhalt:<br />
<tt>&lt;form action=&#8221;&lt;?php echo $_SERVER['PHP_SELF']; ?&gt;&#8221; method =&#8221;post&#8221;&gt;</tt></p>
<p>Ruft man dieses nun mit folgender URL auf (die aufw&#228;ndiger als notwendig konstruiert und des besseren Verst&#228;ndnisses wegen nicht URL-encodiert ist):<br />
<tt>http://localhost/contact/myform.php</tt><tt class="mark">/&#8221;&gt;&lt;/form&gt;Hier ein Javascript: &lt;script&gt;alert(&#8217;gotcha&#8217;);&lt;/script&gt;&lt;form action=&#8221;/contact/myform.php</tt><br />
erh&#228;lt man:<br />
<tt>&lt;form action=&#8221;</tt><tt class="mark">/&#8221;&gt;&lt;/form&gt;Hier ein Javascript: &lt;script&gt;alert(&#8217;gotcha&#8217;);&lt;/script&gt;&lt;form action=&#8221;/contact/myform.php</tt><tt>&#8221; method =&#8221;post&#8221;&gt;</tt></p>
<p>Also vollkommen g&#252;ltiges HTML (sogar das Form funktioniert) mit fremdbestimmbaren Seiteninhalt. Das ist ja wohl h&#228;sslich&#8230;</p>
<h3>Theorie! Gib mir Praxis!</h3>
<p>Ich weiss nicht, wie lange folgende Links funktionieren, beziehungsweise diese Sites anf&#228;llig f&#252;r diese Art von XSS sind:</p>
<p><a rel=\"nofollow\" href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5kaWdpdGFsLXBvc3RjYXJkLmNoL2luZGV4LnBocC8lMjIlM0VIYWxsbyFfU2thbGRyb21fd2FzJiMwMzg7bmJzcF8hJTND">Digital Postcard</a> (Kein XSS, aber mein Text <img src='http://blog.oncode.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ):<br />
<a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cub25jb2RlLmluZm8vd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDUvcG9zdGNhcmQucG5n" title='Postcard XSS'><img src='http://blog.oncode.info/wp-content/uploads/2008/05/postcard.thumbnail.png' alt='Postcard XSS' /></a></p>
<p><a rel=\"nofollow\" href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5tdWx0aW1lZGlhdHJlZmYuZGUvcmVzZXJ2aWVyZW4ucGhwLw=="%3ESkaldrom%20was%20here!%3Cscript%3Ealert(String.fromCharCode(88,83,83));%3C/script%3E\">Multimediatreff</a>:<br />
<a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cub25jb2RlLmluZm8vd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDUvbXVsdGltZWRpYS5wbmc=" title='Multimediatreff'><img src='http://blog.oncode.info/wp-content/uploads/2008/05/multimedia.thumbnail.png' alt='Multimediatreff' /></a></p>
<p><a rel=\"nofollow\" href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5qb2JzLmNoL2luZGV4LnBocC8lMjIlM0VTa2FsZHJvbSUyMHdhcyUyMGhlcmUhJTNDc2NyaXB0JTNFYWxlcnQo"XSS');%3C/script%3E%20%3C%22\">Jobs. ch</a> (nicht im Form, daf&#252;r mit hohem PageRank):<br />
<a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cub25jb2RlLmluZm8vd3AtY29udGVudC91cGxvYWRzLzIwMDgvMDUvam9ic2NoLnBuZw==" title='Jobs.ch'><img src='http://blog.oncode.info/wp-content/uploads/2008/05/jobsch.thumbnail.png' alt='Jobs.ch' /></a></p>
<h3>Was nutzt das dem b&#246;sen Hacker?</h3>
<p>Text in Fremdpages einbauen, Phishing, Indentit&#228;tenklau und noch einiges Weiteres. Ein Folgeartikel wird mindestens eine Anwendung zeigen.</p>
<h3>Was tun?</h3>
<p>Ganz einfach: Das oft verschm&#228;hte <tt>$_SERVER['SCRIPT_NAME']</tt> verwenden!!!</p>
<p>BTW: Viele Variablen in <tt>$_SERVER</tt> sind anf&#228;llig, aber alles muss ich ja auch nicht verplappern, oder?
<p>© 2008 bei Skaldrom Y. Sarg von oncode.info<br />
<a href="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uZGUvZ3AvcmVkaXJlY3QuaHRtbD9pZT1VVEY4JiMwMzg7bG9jYXRpb249aHR0cCUzQSUyRiUyRnd3dy5hbWF6b24uZGUlMkYmIzAzODtzaXRlLXJlZGlyZWN0PWRlJiMwMzg7dGFnPXRlY2dvdHVuZGFuZC0yMSYjMDM4O2xpbmtDb2RlPXVyMiYjMDM4O2NhbXA9MTYzOCYjMDM4O2NyZWF0aXZlPTY3NDI=" rel='nofollow'>Amazon</a>,<br />
f&#252;r B&#252;cher, Sounds, Film, und den ganzen Rest&#8230;</p>
 <img src="http://blog.oncode.info/wp-content/plugins/feed-statistics.php?view=1&post_id=391" width="1" height="1" style="display: none;" /><h3>Ähnliche Artikel</h3><ul class="related_post"><li><a href="http://blog.oncode.info/2008/05/15/black-hat-seo-pagerank-und-xss/" title="Black Hat SEO: PageRank und &#8220;XSS&#8221;">Black Hat SEO: PageRank und &#8220;XSS&#8221;</a></li><li><a href="http://blog.oncode.info/2008/07/30/automatisches-und-mehrfaches-submitten-von-formularen/" title="Automatisches und mehrfaches submitten von Formularen">Automatisches und mehrfaches submitten von Formularen</a></li><li><a href="http://blog.oncode.info/2008/07/28/dynamische-signatur-e-schrecking-fuer-foren-myspace/" title="Dynamische Signatur - e-Schrecking für Foren, MySpace, &#8230;">Dynamische Signatur - e-Schrecking für Foren, MySpace, &#8230;</a></li><li><a href="http://blog.oncode.info/2008/01/25/uwa-widgets-coden/" title="UWA Widgets coden">UWA Widgets coden</a></li><li><a href="http://blog.oncode.info/2007/11/26/php-uwa-widget-library/" title="PHP-UWA Widget Library">PHP-UWA Widget Library</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.oncode.info/2008/05/07/php_self-ist-boese-potentielles-cross-site-scripting-xss/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
