<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MIGHTY MARCUS BLOG</title>
	<atom:link href="http://www.mighty-marcus.de/feed" rel="self" type="application/rss+xml" />
	<link>http://www.mighty-marcus.de</link>
	<description>Zu arm für einen Slogan!</description>
	<lastBuildDate>Wed, 04 Apr 2012 04:20:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>PHP Interface &#8211; für was ist das eigentlich gut?</title>
		<link>http://www.mighty-marcus.de/php-interface-fur-was-ist-das-eigentlich-gut/195</link>
		<comments>http://www.mighty-marcus.de/php-interface-fur-was-ist-das-eigentlich-gut/195#comments</comments>
		<pubDate>Wed, 04 Apr 2012 04:17:39 +0000</pubDate>
		<dc:creator>mighty.marcus</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.mighty-marcus.de/?p=195</guid>
		<description><![CDATA[Da ich bisher noch nie gecheckt habe für was Interfaces gut sein sollen habe ich mal versucht mir das selbst mit einem Beispiel nahe zu bringen. Und jetzt hab ichs kapiert. Vielleicht checkts durch dieses Beispiel auch ein anderer PHP-Coder, &#8230; <a href="http://www.mighty-marcus.de/php-interface-fur-was-ist-das-eigentlich-gut/195">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Da ich bisher noch nie gecheckt habe für was Interfaces gut sein sollen habe ich mal versucht mir das selbst mit einem Beispiel nahe zu bringen. Und jetzt hab ichs kapiert. <img src='http://www.mighty-marcus.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Vielleicht checkts durch dieses Beispiel auch ein anderer PHP-Coder, der das auch noch nicht so kapiert hat. Bzw. isses ja mehr oder weniger übertragbar auf andere OOP-Sprachen.<br />
<span id="more-195"></span><br />
Basisklasse ist Human. Sepp ist ein Human, Maria auch.</p>
<p>Klasse Male leitet sich ab von Human. (Male extends Human)<br />
Klasse Female leitet sich ab von Human. (Female extends Human)</p>
<p>Beide können auf die Methoden von Human zugreifen (eat, drink).</p>
<p>Male implementiert Interface IMale (und somit die Methode &#8220;ejakulieren&#8221;).<br />
Female implementiert Interface IFemale (und somit die Methode &#8220;schwanger werden&#8221;).</p>
<p>Male kann ejakulieren, Female nicht (naja, darüber kann man streiten, klar ^^).<br />
Female kann schwanger werden, Male nicht.</p>
<p>Ne, so stimmt das eigentlich nicht.<br />
Male muss ejakulieren können. Wenn die Methode ejakulieren fehlt, dann ist die Klasse Male fehlerhaft. Deshalb wird durch das Interface Male sicher gestellt, dass Male ejakulieren kann, ansonsten wird das Skript mit einer Fehlermeldung beendet.</p>
<p>Female muss schwanger werden können. Wenn die Methode &#8220;schwanger werden&#8221; fehlt, ist die Klasse Female fehlerhaft (bzw. unvollständig).</p>
<p>Ich hab das echt nie gecheckt bzw. nicht so genau angeschaut, deshalb dacht ich immer das ich das auch noch lernen muss, irgendwann halt. Dabei ist es total easy.</p>
<p>[php]</p>
<p>class Human {</p>
<p>	protected $name;<br />
	protected $gender;<br />
	protected $age;</p>
<p>	public function eat($food){<br />
	echo &#8220;{$this->name} isst {$food}.\n&#8221;;<br />
	}</p>
<p>	public function drink($drink){<br />
	echo &#8220;{$this->name} trinkt {$drink}.\n&#8221;;<br />
	}</p>
<p>}</p>
<p>interface IMale {<br />
function ejaculate($female);<br />
}</p>
<p>class Male extends Human implements IMale {</p>
<p>	public function __construct($name, $age) {<br />
	$this->name = $name;<br />
	$this->age = (int) $age;<br />
	$this->gender = &#8220;male&#8221;;<br />
	}</p>
<p>	public function ejaculate($female){<br />
	echo &#8220;{$this->name} ejakuliert auf {$female->name} => &#8220;;	</p>
<p>	if (get_class($female) != get_class($this)) $female->getPregnant($this);<br />
	elseif ($female == $this) echo &#8220;{$this->name} hat onaniert.\n&#8221;;<br />
	else echo &#8220;{$this->name} hat mit {$female->name} Poposex gemacht.\n&#8221;;</p>
<p>	}</p>
<p>}</p>
<p>interface IFemale {<br />
function getPregnant($male);<br />
}</p>
<p>class Female extends Human implements IFemale {</p>
<p>	private $pregnant;</p>
<p>	public function __construct($name, $age) {</p>
<p>	$this->name = $name;<br />
	$this->age = (int) $age;<br />
	$this->gender = &#8220;female&#8221;;	</p>
<p>	}</p>
<p>	public function getPregnant($male) {</p>
<p>		if ($this->pregnant) {<br />
		echo &#8220;{$this->name} ist bereits schwanger.\n&#8221;;<br />
		return;<br />
		}</p>
<p>		if (get_class($male) != get_class($this)) {<br />
		$this->pregnant = true;<br />
		echo &#8220;{$this->name} wurde von {$male->name} geschwängert.\n&#8221;;<br />
		}</p>
<p>	}</p>
<p>}</p>
<p>$sepp = new Male(&#8216;Sepp&#8217;, 36);<br />
$klaus = new Male(&#8216;Klaus&#8217;, 27);<br />
$maria = new Female(&#8216;Maria&#8217;, 26);</p>
<p>print_r($sepp);<br />
print_r($maria);<br />
print_r($klaus);</p>
<p>$sepp->eat(&#8216;Pizza&#8217;);<br />
$sepp->drink(&#8216;Bier&#8217;);<br />
$maria->eat(&#8216;Pizza&#8217;);<br />
$maria->drink(&#8216;Bier&#8217;);</p>
<p>$sepp->ejaculate($maria);<br />
$sepp->ejaculate($sepp);<br />
$klaus->ejaculate($sepp);<br />
$klaus->ejaculate($maria);</p>
<p>/*<br />
Male Object<br />
(<br />
    [name:protected] => Sepp<br />
    [gender:protected] => male<br />
    [age:protected] => 36<br />
)<br />
Female Object<br />
(<br />
    [pregnant:Female:private] =><br />
    [name:protected] => Maria<br />
    [gender:protected] => female<br />
    [age:protected] => 26<br />
)<br />
Male Object<br />
(<br />
    [name:protected] => Klaus<br />
    [gender:protected] => male<br />
    [age:protected] => 27<br />
)</p>
<p>Sepp isst Pizza.<br />
Sepp trinkt Bier.<br />
Maria isst Pizza.<br />
Maria trinkt Bier.<br />
Sepp ejakuliert auf Maria => Maria wurde von Sepp geschwängert.<br />
Sepp ejakuliert auf Sepp => Sepp hat onaniert.<br />
Klaus ejakuliert auf Sepp => Klaus hat mit Sepp Poposex gemacht.<br />
Klaus ejakuliert auf Maria => Maria ist bereits schwanger.<br />
*/<br />
[/php]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mighty-marcus.de/php-interface-fur-was-ist-das-eigentlich-gut/195/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WordPress Anti Spam Snippet</title>
		<link>http://www.mighty-marcus.de/wordpress-anti-spam-snippet/177</link>
		<comments>http://www.mighty-marcus.de/wordpress-anti-spam-snippet/177#comments</comments>
		<pubDate>Fri, 22 Apr 2011 07:43:51 +0000</pubDate>
		<dc:creator>mighty.marcus</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[anti]]></category>
		<category><![CDATA[antispam]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wordpress antispam]]></category>

		<guid isPermaLink="false">http://www.mighty-marcus.de/?p=177</guid>
		<description><![CDATA[Die meisten Kommentare, die ich in meinem Blog bekomme sind SPAM! Und zwar meist &#8211; nein immer &#8211; englischsprachig. Und ich wette die Spamer und Spambots können kein deutsch. Also hab ich ein WordPress Mini Anti Spam System geschrieben. Das &#8230; <a href="http://www.mighty-marcus.de/wordpress-anti-spam-snippet/177">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Die meisten Kommentare, die ich in meinem Blog bekomme sind SPAM!<br />
Und zwar meist &#8211; nein immer &#8211; englischsprachig. Und ich wette die Spamer und Spambots können kein deutsch.<br />
Also hab ich ein WordPress Mini Anti Spam System geschrieben. Das ganze ist nur ein paar Zeilen groß, dürfte aber die meisten Spamer fern halten.<span id="more-177"></span></p>
<p>Vielleicht brauchts ja sonst noch jemand, es ist eine Sache von ein paar Minuten und man braucht keinen API Key oder sonstiges. Hier eine Anleitung, was man machen muss, um vor englischsprachigem Spam verschont zu bleiben.</p>
<p>Die Idee ist folgende: Unter dem Kommentar-Formular wird das Bild einer Frucht angezeigt. Darunter ist ein weiteres Input-Feld, in das der Kommentator den Namen der Frucht schreiben muss. Und zwar auf deutsch.</p>
<p>1. Spambots sind zu blöd Früchte zu erkennen<br />
2. die meisten Spambots können kein deutsch<br />
3. englisch kommentierende Spamer können die Früchte erkennen, können aber kein deutsch (zumindest die meisten). Ausser sie schauen in ein Wörterbuch, aber ich glaube da suchen sie sich eher den nächsten Blog.</p>
<p>Naja, ich muss wohl erstmal ne Zeitlang warten, aber ich hab so das Gefühl, dass jetzt erstmal Schluss ist mit dem massenhaften Spam.</p>
<p>Schritt 1 &#8211; Speichert euch die ganzen Bilder unter den gleichen Namen wie ich sie habe auf den Rechner (1.jpg &#8211; 8.jpg)</p>
<p><img src="http://mighty-marcus.de/fruits/1.jpg" alt="fruit1" /><br />
<img src="http://mighty-marcus.de/fruits/2.jpg" alt="fruit2" /><br />
<img src="http://mighty-marcus.de/fruits/3.jpg" alt="fruit3" /><br />
<img src="http://mighty-marcus.de/fruits/4.jpg" alt="fruit4" /><br />
<img src="http://mighty-marcus.de/fruits/5.jpg" alt="fruit5" /><br />
<img src="http://mighty-marcus.de/fruits/6.jpg" alt="fruit6" /><br />
<img src="http://mighty-marcus.de/fruits/7.jpg" alt="fruit7" /><br />
<img src="http://mighty-marcus.de/fruits/8.jpg" alt="fruit8" /></p>
<p>2. Schritt<br />
Erstellt auf eurem Webspace einen Ordner namens &#8220;fruits&#8221;, und zwar im untersten Verzeichnis. Ladet dort per ftp die Bilder hoch. (die genaus heissen müssen, wie bei mir)</p>
<p>3. Schritt<br />
Öffnet mit einem Editor die Datei comment-template.php im wp-includes Ordner (per ftp downloaden).<br />
Sucht die Stelle</p>
<p>[php]</p>
<p class="form-submit">
[/php]</p>
<p>DAVOR fügt ihr diesen Code ein:</p>
<p>[php]<br />
<?php<br />
// hacked by mighty marcus / spam protection<br />
$fruit = mt_rand(1, 8);<br />
echo '
<p style="font-weight:bold; font-size: 16px; color: #888">&#8216;;<br />
echo &#8216;<img src="http://www.deinedomain.de/fruits/'.$fruit.'.jpg" alt="fruit" title="fruit" /><br />&#8216;;<br />
echo &#8216;Was ist das?<span style="color:#F00">*</span><br />&#8216;;<br />
echo &#8216;<br />
<input type="hidden" name="fruit" value="'.$fruit.'" />&#8216;;<br />
echo &#8216;<br />
<input type="text" name="fruit_answer" />&#8216;;<br />
echo &#8216;</p>
<p>&#8216;;<br />
// end hack<br />
?><br />
[/php]</p>
<p>Datei speichern und wieder hochladen.</p>
<p>4. Schritt<br />
Holt euch die Datei wp-comments-post.php im untersten Verzeichnis und öffnet sie mit einem Editor.<br />
Sucht die Stelle:<br />
[php]<br />
if ( &#8221; == $comment_content )<br />
	wp_die( __(&#8216;Error: please type a comment.&#8217;) );<br />
[/php]</p>
<p>DANACH einfügen:<br />
[php]<br />
// hack<br />
if (isset($_POST['fruit_answer']) &#038;&#038; $_POST['fruit_answer'] != &#8221;) {<br />
$fruit_ary = array(&#8221;, &#8216;ananas&#8217;, &#8216;erdbeere&#8217;, &#8216;pfirsich&#8217;, &#8216;apfel&#8217;, &#8216;kirsche&#8217;, &#8216;banane&#8217;, &#8216;birne&#8217;, &#8216;zitrone&#8217;);<br />
$fruit = $fruit_ary[$_POST['fruit']];<br />
	if ($fruit != strtolower($_POST['fruit_answer']))<br />
	wp_die( __(&#8216;Fehler: Du müsstest eigentlich wissen, was das für eine Frucht ist!&#8217;) );<br />
}<br />
else<br />
wp_die( __(&#8216;Fehler: Sie müssen den Namen der Frucht eintragen!&#8217;) );<br />
// hack end<br />
[/php]</p>
<p>Fertig. Die Spambot Macher könnten jetzt zwar einfach den Blogeintrag lesen und ihren Bots beibringen, dass zum Beispiel 1.jpg eine Ananas ist usw&#8230; Aber ich schätze nur wegen meinem Blog wird das keiner machen. Check it out!</p>
<p>Wie immer am Ende noch ein paar Keywords, haha. Anti Spam yes Anti Spam. Ein Minimales Anti Spam System für WordPress von mighty.marcus. See ya (in hell) !</p>
<p>UPDATE: Und es funktioniert. Bisher kein einziger Spam-Kommentar!</p>
<p>UPDATE 2 (24. April): Immer noch kein Spam! Haha Loser!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mighty-marcus.de/wordpress-anti-spam-snippet/177/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ajax mit PHP und Jquery</title>
		<link>http://www.mighty-marcus.de/ajax-mit-php-und-jquery/167</link>
		<comments>http://www.mighty-marcus.de/ajax-mit-php-und-jquery/167#comments</comments>
		<pubDate>Fri, 01 Apr 2011 18:59:29 +0000</pubDate>
		<dc:creator>mighty.marcus</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[ajax jquery]]></category>
		<category><![CDATA[ajax php]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jquery ajax]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.mighty-marcus.de/?p=167</guid>
		<description><![CDATA[Ajax mit ein paar Zeilen. Jquery machts möglich. im Html-Header: [php] var infoBox; /* wir speichern die Referenz zum Element #infoBox ( id=&#8221;infoBox&#8221;) in der globalen Variable infoBox * Und zwar erst, wenn der DOM komplett geladen ist, Ansonsten könnte &#8230; <a href="http://www.mighty-marcus.de/ajax-mit-php-und-jquery/167">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ajax mit ein paar Zeilen. Jquery machts möglich.<br />
<span id="more-167"></span><br />
im Html-Header:<br />
[php]<br />
var infoBox;</p>
<p>/* wir speichern die Referenz zum Element #infoBox ( id=&#8221;infoBox&#8221;) in der globalen Variable infoBox<br />
* Und zwar erst, wenn der DOM komplett geladen ist, Ansonsten könnte es sein, dass infoBox = null<br />
* Es ist zwar in diesem Beispiel nicht notwendig, aber man sollte es sich angewöhnen sich gleich Referenzen<br />
* zu DOM-Element anzulegen, die man öfter benutzt.<br />
*/ </p>
<p>$(document).ready(function() {<br />
infoBox = $(&#8220;#infoBox&#8221;);<br />
});</p>
<p>// Diese JS-Funktion ruft die Jquery-Funktion &#8220;post&#8221; auf. Der Output einer Datei wird gespeichert in &#8220;data&#8221;.<br />
// Die Jquery-Funktion &#8220;html&#8221; fügt data in das Element #infoBox ein.<br />
function get_servertime() {<br />
	$.post(&#8220;php_output.php&#8221;, function(data) {<br />
	$(infoBox).html(data);<br />
	});<br />
}</p>
<p>Ein Link mit onclick=&#8221;get_servertime(); return false;&#8221; href=&#8221;javascript:&#8221;</p>
<p>Eine Datei php_output.php.</p>
<p>echo date(&#8220;d.m.Y H:i&#8221;, time());<br />
[/php]</p>
<p>Und fertig. Wenn man auf den Link klickt, holt Jquery sich den Output der Datei php_output.php und fügt ihn in das Element #infoBox im DOM ein.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mighty-marcus.de/ajax-mit-php-und-jquery/167/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sin cos tan entdeckung</title>
		<link>http://www.mighty-marcus.de/sin-cos-tan-entdeckung/159</link>
		<comments>http://www.mighty-marcus.de/sin-cos-tan-entdeckung/159#comments</comments>
		<pubDate>Fri, 31 Dec 2010 03:55:21 +0000</pubDate>
		<dc:creator>mighty.marcus</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[text]]></category>
		<category><![CDATA[textscroller]]></category>

		<guid isPermaLink="false">http://www.mighty-marcus.de/?p=159</guid>
		<description><![CDATA[Damals in der Schule hatte ich in Mathe eine 6. Ja eine 6! Und das als angehender Programmierer. Nicht schlecht, oder? Vor ein paar Tagen habe ich mich aber mal ein bisschen damit beschäftigt und das neu erworbene Wissen gleich &#8230; <a href="http://www.mighty-marcus.de/sin-cos-tan-entdeckung/159">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Damals in der Schule hatte ich in Mathe eine 6. Ja eine 6! Und das als angehender Programmierer. Nicht schlecht, oder?<br />
Vor ein paar Tagen habe ich mich aber mal ein bisschen damit beschäftigt und das neu erworbene Wissen gleich in einem Flash-Textscroller genutzt.</p>
<p><a href="http://www.mighty-marcus.de/projekte/flash/textdemo.html"></p>
<p>Sehts euch an.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mighty-marcus.de/sin-cos-tan-entdeckung/159/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zufälliges Sternensystem &#8211; Perlin Noise und Flash</title>
		<link>http://www.mighty-marcus.de/zufalliges-sternensystem-perlin-noise-und-flash/100</link>
		<comments>http://www.mighty-marcus.de/zufalliges-sternensystem-perlin-noise-und-flash/100#comments</comments>
		<pubDate>Sun, 21 Mar 2010 23:15:39 +0000</pubDate>
		<dc:creator>mighty.marcus</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[noise]]></category>
		<category><![CDATA[perlin]]></category>
		<category><![CDATA[perlin noise]]></category>
		<category><![CDATA[Planeten]]></category>
		<category><![CDATA[Sternensystem]]></category>
		<category><![CDATA[tilemap]]></category>
		<category><![CDATA[zufall]]></category>
		<category><![CDATA[zufällige Planeten]]></category>
		<category><![CDATA[zufallsgeneriert]]></category>
		<category><![CDATA[zufallsgeneriertes Sternensysten]]></category>

		<guid isPermaLink="false">http://www.mighty-marcus.de/?p=100</guid>
		<description><![CDATA[Eigentlich wollte ich nur eine zufallsgenerierte Sternenkarte erstellen, mit Clustern (Sternenhaufen), verschiedenen Planeten, Tilemaps auf den Planeten&#8230; Aber wie macht man so etwas? Meine Vorstellung lag bei so hunderten verschiedenen Planeten, die alle auch noch begehbar sein sollten. Man sollte &#8230; <a href="http://www.mighty-marcus.de/zufalliges-sternensystem-perlin-noise-und-flash/100">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Eigentlich wollte ich nur eine zufallsgenerierte Sternenkarte erstellen, mit Clustern (Sternenhaufen), verschiedenen Planeten, Tilemaps auf den Planeten&#8230; Aber wie macht man so etwas? Meine Vorstellung lag bei so hunderten verschiedenen Planeten, die alle auch noch begehbar sein sollten. Man sollte mit einem Raumschiff in ein Sternensystem fliegen können und dort &#8211; ganz Starflight &#8211; auf den Planeten landen können. Man sollte die Oberfläche der Planeten schon vom Weltraum aus erkennen können, und die Planeten sollten alle einzigartig sein. Zufallsgeneriert eben.<span id="more-100"></span><br />
Bei meinen Internet-Recherchen, auf der Suche nach brauchbaren Tutorials, bin ich irgendwann auf das Stichwort Perlin Noise gestoßen. Es ist ein Alogrithmus, oder eher ein Filter, der nun ja : Chaos verursacht. So mancher kennt bestimmt den Wolken-Effekt von Photoshop. So in etwa arbeitet der Perlin Noise-Filter. Mit ihm ist es möglich zufallsgenerierte Heightmaps zu erstellen.<br />
Eine Heightmap ist eine Karte mit Pseudozufälligen Erhöhungen und Vertiefungen darauf, und zwar in SW.<br />
Diese Erhöhungen kann man mit einem geeigneten Programm parsen und daraufhin seine Tiles verteilen.<br />
Ich will auch gar nicht viel drum herum labern, jedenfalls habe ich zu meiner Freude festgestellt, dass es in der Flash-Entwicklungsumgebung eine Perlin-Noise-Methode gibt. Eigentlich eher zur Bildbearbeitung gedacht, taugt diese aber auch dazu, künstliche Welten zu erzeugen.</p>
<p>Ich habe heute ein bisschen damit herumgespielt und bin mit dem Ergebnis echt zufrieden. Jetzt kann ich endlich ein cooles Space-Spiel programmieren, oder es zumindest versuchen.</p>
<p>Entweder werde ich ein festes Universum erzeugen, und das Ergebnis in einer Datenbank speichern&#8230; So um die 1000 verschiedene Planeten mit zufallsgenerierten Namen, oder es wird immer bei jedem Spielbeginn ein neues Universum erstellt. Wie auch immer, Ideen habe ich, nur mit der Umsetzung hapert es meistens (ich träume von einer Art Galactic Civilziations 2 Spiel, mit Multiplayer. Mal sehen was ich wirklich daraus mache.)</p>
<p>Aber seht euch einfach mal das Sternensystem an. BTW ich bin kein Grafiker, mich interessiert eher dieses Zufalls-Zeugs. (Ruhig öfter mal den Browser aktualisieren für andere Ergebnisse.)</p>
<p>Perlin Nose, aha noch ein paar Keywords einbaue, SEO Haha!</p>
<p>Perlin Noise und Flash AS3 Actionscript, zufallsgeneriertes Sternensystem.</p>
<p>Achso ja der Link, den hätt ich ja fast vergessen&#8230;</p>
<p>Häng zuviel vorm PC!</p>
<p><a href="http://www.mighty-marcus.de/wp-content/perlin.html">Perlin Noise Demo</a></p>
<p>Bye bye!</p>
<p>Ach ja, klickt ruhig auf die Planeten um das Surface zu sehen. Sieht zwar nicht besonders aus aber die Möglichkeiten sind faszinierend (Stichwort Tilemap).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mighty-marcus.de/zufalliges-sternensystem-perlin-noise-und-flash/100/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Flash XML Socket und Perl Socket Server</title>
		<link>http://www.mighty-marcus.de/flash-xml-socket-und-perl-socket-server/95</link>
		<comments>http://www.mighty-marcus.de/flash-xml-socket-und-perl-socket-server/95#comments</comments>
		<pubDate>Mon, 11 Jan 2010 00:58:54 +0000</pubDate>
		<dc:creator>mighty.marcus</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[bayeux]]></category>
		<category><![CDATA[comet]]></category>
		<category><![CDATA[echtzeit]]></category>
		<category><![CDATA[policy file]]></category>
		<category><![CDATA[policy file request]]></category>
		<category><![CDATA[socket server]]></category>
		<category><![CDATA[xml socket server]]></category>

		<guid isPermaLink="false">http://www.mighty-marcus.de/?p=95</guid>
		<description><![CDATA[Flashs XMLSocket-Klasse in Verbindung mit Perl-Sockets Mit Perl ist viel mehr möglich als „nur“ dynamische Webseiten zu erstellen, auch auf die Socket-API von C lässt sich darauf zugreifen und in Verbindung mit Flash als Client lassen sich damit Chats und &#8230; <a href="http://www.mighty-marcus.de/flash-xml-socket-und-perl-socket-server/95">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Flashs XMLSocket-Klasse in Verbindung mit Perl-Sockets</p>
<p>Mit Perl ist viel mehr möglich als „nur“ dynamische Webseiten zu erstellen, auch auf die Socket-API von C lässt sich darauf zugreifen und in Verbindung mit Flash als Client lassen sich damit Chats und sogar Multiplayer-Spiele realisieren.<span id="more-95"></span> Was ist ein Socket? Um es kurz zu machen: ein Socket ist eine Schnittstelle in einem Netzwerk, die es ermöglicht Daten beinahe in Echtzeit zu übertragen. Dabei fungiert ein Perl-Script als zentraler Server, lauscht auf Verbindungen und eingehende Daten, parst die Daten und sendet sie bei Bedarf weiter an andere Computer, die auch mit dem Perl-Server verbunden sind.<br />
Zum Vergleich: ein Apache-Webserver macht eigentlich das selbe. Er lauscht auf sogenannte HTTP-Requests, die wir senden, wenn wir einen Link anklicken. Der Webserver parst die Daten und liefert uns die gewollte Seite aus. Der vorteilhafte Unterschied zwischen einem Apache-Webserver und einem Perl-Socket-Server liegt aber darin, dass es nicht ganze HTML-Seiten sind, die über die Leitungen fließen, sondern schlanke Strings.</p>
<p>Kleines Beispiel: Wir klicken einen Button in Flash an, auf dem steht: Zeig mir die Server-Zeit.<br />
Flash sendet durch einen (TCP-)Socket den String „[aktion:serverzeit]\0“ an den Perl-Socket-Server. Das „\0“ fügt der Flash-Player übrigens automatisch hinzu, um damit das Ende des Strings zu signalisieren.<br />
Der Perl-Server parst den String und findet heraus: aha, ich soll die Serverzeit ausliefern. Als Antwort schickt er nun den String „[serverzeit:12:32:54]\0“.<br />
Es sei an dieser Stelle auch gleich erwähnt, dass die XMLSocket-Klasse nicht zwingend Strings im XML-Format verlangt. Und das ist auch gut so, denn ein<br />
 „&lt;xml version=“1.0“&gt;&lt;aktion&gt;serverzeit&lt;/aktion&gt;&lt;/xml&gt;“ im vergleich zu „[aktion:serverzeit]“ ist ganz klar bandbreitenschonender, weil man einfach viel weniger Daten senden muss. Natürlich hätte ich auch „{aktion}{serverzeit}“ schreiben können oder auch „[a][s]“ oder gar „[s]“. Welches Protokoll man auch verwendet, solange man es selbst versteht und solange es logisch ist, passt alles.</p>
<p>Perl, der Meister der Regular-Expressions. Damit wird es sehr einfach, die Daten zu parsen.</p>
<p>$flashDaten =~ /\[aktion:(\w+)\]/;<br />
my $aktion = $1;</p>
<p>if ($aktion eq „serverzeit“) {<br />
my ($sec,$min,$hour) = localtime(time);<br />
my $anwort = „[serverzeit:$hour:$min:$sec]\0“;<br />
sende_zurück($antwort);<br />
}</p>
<p>Ok, ich glaube man hat mich verstanden: Sockets dienen hauptsächlich dazu möglichst kleine Daten möglichst schnell zu senden/empfangen, und bieten damit die Möglichkeit viele Clients gleichzeitig zu bedienen. Man stelle sich einen Chat vor auf dem sich gerade hunderte User unterhalten. Die Nachrichten müssen so schnell wie möglich weitergeleitet werden, um überhaupt einen Chat möglich zu machen. Es reicht nicht, die Nachrichten in einer Datenbank zu speichern und alle paar Sekunden mittels eines HTTP-Requests die Seite zu aktualisieren. Es gibt zwar solche Chats, z.B. mit PHP, MySQL und Javascript (für automatische HTTP-Requests) realisiert – aber die taugen doch nicht wirklich was; und zwingen mit steigender Useranzahl selbst die stärksten Server in die Knie.</p>
<p>Ein ganz nützliches Perl-Modul, mit dem die Arbeit mit Sockets zum Kinderspiel wird, ist das POE-Modul. POE heisst Perl Object Environment, es ist objektorientiert und dadurch ist die Syntax auch leicht verständlich.</p>
<p>Was ist POE? POE ist ein Framework, welches es wie ein Betriebssystem erlaubt, mehrere Prozesse in einem Perl-Skript gleichzeitig laufen zu lassen, über sogenannte Sessions. Es lassen sich damit wunderbare Programme schreiben, in denen verschiedene Sessions sich um verschiedene Aufgaben kümmern. Da es für viele Bereiche – vor allem im Netzwerk-Bereich – vorgefertigte POE-Module gibt, schreibt sich ein Socket-Server damit fast schon von alleine. Die Hauptarbeit überlassen wir einfach POE und können uns direkt um die lustigen Sachen kümmern wie die Logik unseres Servers, Datenparsen usw.</p>
<p>Ladet euch das POE-Framework von CPAN herunter und installiert es. Falls ihr keinen eigenen Server habt sondern einen Webspace ohne Root-Zugang, kein Problem. Erstellt einfach einen Ordner auf dem Webspace, ladet dort das POE-Modul hoch und inkludiert es anstatt einfach nur:</p>
<p>use POE;</p>
<p>mit&#8230;</p>
<p>use lib „dein/absoluter/pfad/zum/POE-Ordner/lib“;<br />
use POE;</p>
<p>Nun aber endlich mal zu einem Beispiel. Ich zeige euch einen kompletten Perl-Socket-Server, der eigentlich zwei Server beinhaltet: der eigentliche Hauptserver kümmert sich um den Flash-Film, der andere Server &#8211; nennen wir ihn Policy-File-Server &#8211;  kümmert sich um die Auslieferung einer virtuellen XML-Datei, dem sogenannten Policy-File. Policy-File, was ist das?<br />
Nun ja, machen wir es kurz: Adobe verlangt aus Sicherheitsgründen die Auslieferung eines virtuellen Policy-Files, quasi eine Datei in der geschrieben steht, dass der Flash-Film dazu berechtigt ist auf bestimmte Ports des Servers zugreifen zu dürfen.<br />
Diese Datei liegt in unserem Perl-Skript in einem String und wartet nur darauf, in die große weite Welt verschickt zu werden. Sie sieht, bei mir zumindest, so aus:</p>
<p>my $xml = &#8216;&lt;?xml version=&#8221;1.0&#8243;?&gt;&lt;!DOCTYPE cross-domain-policy SYSTEM &#8220;/xml/dtds/cross-domain-policy.dtd&#8221;&gt;&lt;cross-domain-policy&gt;&lt;site-control permitted-cross-domain-policies=&#8221;master-only&#8221;/&gt;&lt;allow-access-from domain=&#8221;localhost&#8221; to-ports=&#8221;5006&#8243; /&gt;&lt;/cross-domain-policy&gt;&#8217;;</p>
<p>Wie man sieht, steht darin geschrieben, dass localhost auf den Flash-Film zugreifen darf, und der Flash-Film auf den Server auf Port 5006.</p>
<p>Auf Port 5005 lauscht ein zweiter Server, also eine zweite POE-Session, die sich um nichts anderes kümmert als auf eine Verbindung und einen String „&lt;policy-file-request/&gt;\0“.<br />
Schickt ein Flash-Film – oder wer auch immer – solch einen String, bekommt er als Antwort die $xml-Datei.</p>
<p>Ladet euch einfach <a href="http://www.mighty-marcus.de/downloads/xmlsocket.zip">die Quelltexte für den Actionscript-Client und den Perl-Server</a> herunter. Schaut euch mal die Datei testServer.pl an.</p>
<p>Ganz kurz, was der Hauptserver macht: Er lauscht auf Verbindungen, akzeptiert diese, schreibt die Verbindungen oder besser gesagt die Referenzen dazu in das Array @connections, sendet eingehende Daten an die Verbindungen (im Array @connections, ausser an den Sender), löscht beendete Verbindungen wieder aus @connections (das ist wichtig, damit der Server nicht versucht Daten an bereits beendete Verbindungen zu senden – was zu einem sehr unschönen Programmabbruch führen würde). Daten parsen tut er nicht, aber falls er das tun soll, könnte es etwa so aussehen wie schon oben erwähnt, mit Regular Expressions:</p>
<p>$buff =~ /\[aktion:(\w+)\]/;<br />
my $aktion = $1;</p>
<p>if ($aktion eq „serverzeit“) {<br />
my ($sec,$min,$hour) = localtime(time);<br />
my $anwort = „[serverzeit:$hour:$min:$sec]\0“;<br />
$outbuffer{$client} .= $antwort;<br />
$kernel->select_write($client, „event_write“);<br />
}</p>
<p>Nun zum Flash-Teil. Wir erstellen nun einen Flash-Film, der einfach ein blaues Viereck zeigt. Dieses Viereck lässt sich verschieben, und wenn man es verschoben hat, sendet es die neuen Koordinaten des Vierecks an die anderen Flash-Filme, die noch mit dem Server verbunden sind. Die anderen Flash-Filme platzieren das Viereck dann an der neuen Position.</p>
<p>Ich zeige erstmal den Actionscript-Code. Es ist übrigens möglich den Code via der freien Flex-SDK<br />
zu kompilieren, falls man kein Flash besitzt. Und das schöne an der Flex-SDK ist – außer dass sie nichts kostet – dass man sie auch unter Linux einsetzen kann. Da POE unter Windows nur zu Versuchszwecken taugt (POE verursacht zumindest beim strawberry-Perl unter Windows nach kurzer Zeit eine CPU-Auslastung von 100%) ist das natürlich sehr praktisch.<br />
Falls ihr an der Flex-SDK interessiert seit, benutzt Google, ist leicht zu finden.</p>
<p>Erstellt in Flash einen neuen Film, speichert ihn und gebt in den Eigenschaften als Dokumentklasse TestSocket an. Mit TestSocket ist die Datei TestSocket.as gemeint, die ihr zusammen mit dem neuen Flash-Film in den selben Ordner kopiert. Oder kopiert die AS-Datei in den bin-Ordner der Flex-SDK und kompiliert den Code mittles Eingabeaufforderung bzw. Terminal dort mit mxmlc TestSocket.as. Danach bindet ihr die SWF-Datei in eine HTML-Seite ein und ladet diese zusammen mit der SWF-Datei auf euren Webspace bzw. xampp bzw. /var/www/ oder wo auch immer ihr eure Webseiten liegen habt hoch.</p>
<p>Startet nun den Server mittels Terminal oder Eingabeaufforderung und ruft über den Browser die HTML-Seite mit dem Flash Film auf. Wenn alles geklappt hat, macht weitere Fenster oder Tabs auf und verschiebt das Viereck. Es müsste nun auf allen anderen Seiten ebenfalls verschoben worden sein.</p>
<p>Ach ja, ein besonderes Schmankerl für die eigene Webseite ist es natürlich einen unsichtbaren Flash-Film laufen zu lassen, der eine Socket-Verbindung herstellt. So ist ein Datenaustausch auch ohne Seitenreload möglich. Dabei kann man Javascript als Brücke verwenden, um so empfangene Daten direkt im Browser auszugeben bzw. anzuzeigen. Man stelle sich einfach vor, dass ein User namens „Hans“ dem User mit der Uid 12 eine Nachricht schreibt, ganz normal über die Webseite. Nun wird eine Funktion in Javascript aufgerufen, die dem Flash-Film sagt, er soll eine Nachricht an den Server schicken, z.B. „[post][12][Hans]“. Der Server parst diesen String und findet heraus: aha, ich soll dem User 12 Bescheid sagen, dass er soeben Post von Hans bekommen hat. Der Server schickt an den Socket des Users 12 den String „[post][Hans]“.<br />
Nun erscheint am rechten unteren Bildschirmrand des Postempfängers – der ja noch nichts von seinem Glück weiß, weil er die Seite noch nicht aktualisiert hat – eine kleine schicke Box, in der steht: „Sie haben Post von Hans!“. Posteingang-Benachrichtigung ohne Seitenreload beinahe in Echtzeit, realisiert mit einem TCP-Socket.</p>
<p>Sehr vorteilhaft ist es natürlich diesen unsichtbaren Flash-Film in einer Hauptseite laufen zu lassen, in der die eigentlichen Webseiten in einem iframe dargestellt werden. Warum? Weil sonst bei jedem neuen Seitenaufruf die Verbindung unterbrochen und dann wieder hergestellt wird.</p>
<p>Es gibt übrigens eine Javascript-Klasse, die diese Brücke herstellt, gebt mal in einer Suchmaschine „JSXML Bridge Javascript Flash“ ein. Diese Klasse arbeitet mit der ExternalInterface-Klasse von Flash.</p>
<p>Zuguterletzt noch zwei Punkte:<br />
1.Warum muss ich jeden String, den ich vom Perl-Socket-Server an einen Flash-Client schicke mit einem „\0“ beenden? Weil Flash sonst ewig auf das Ende der Nachricht warten würde.<br />
2.Kann jedes Programm, dass Socketverbindungen möglich macht, von jedem anderen Menschen dazu benutzt werden meine auf Port 5005 und 5006 lauschenden Server mit Nachrichten geradezu zu überfluten? Und ob. Stichwort Flooding. Leider können die Server nicht erkennen, ob Daten von einem Flash-Film, einem C++-Programm, einem anderen Perl-Skript oder von sonstwo geschickt werden. Hier ist es wirklich sehr wichtig, sich sichheitstechnisch abzusichern, will man nicht von seinem Webhoster gesperrt werden. Ich z.B. habe es so realisiert, dass nachdem sich ein User in meine Webseite eingeloggt hat seine IP-Adresse über einen UNIX-Socket an das POE-Skript gesendet wird; diese IP-Adresse wird für ein paar Sekunden erlaubt, d.h. Nur IP-Adressen werden gestattet, die praktisch „von oben“ ein okay bekommen haben, und das nur für ein paar Sekunden. Jede andere IP-Adresse wird gar nicht erst reingelassen bzw. sofort wieder rausgeworfen. „Tut mir leid, sie stehen nicht auf der Gästeliste!“. Ausserdem muss der Client auch seine Session-ID mitschicken, und es wird geprüft, ob diese in der Datenbank unter den eingeloggten Usern steht. Wenn nicht, auf Wiedersehen.</p>
<p>Okay, und das ist auch das Stichwort für mich, ich muss weg. Ich hoffe ich konnte dem einen oder anderen einen groben Einblick in die Welt der Sockets bieten und wünsche euch viel Spaß beim Erstellen von coolen Flash-Perl-Applikationen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mighty-marcus.de/flash-xml-socket-und-perl-socket-server/95/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Keywords in der Url &#8211; ein kleiner Test</title>
		<link>http://www.mighty-marcus.de/keywords-in-der-url-ein-kleiner-test/24</link>
		<comments>http://www.mighty-marcus.de/keywords-in-der-url-ein-kleiner-test/24#comments</comments>
		<pubDate>Sun, 15 Feb 2009 20:56:58 +0000</pubDate>
		<dc:creator>mighty.marcus</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[keyword in der url]]></category>
		<category><![CDATA[keywords]]></category>
		<category><![CDATA[keywords in der url]]></category>

		<guid isPermaLink="false">http://www.mighty-marcus.de/?p=24</guid>
		<description><![CDATA[Ich werde hier mal für mich &#8211; und alle die es interessiert &#8211; mal einen kleinen Test starten. Und zwar geht es um das Thema Keywords in der Url &#8211; bringt es tatsächlich Vorteile für das Ranking? Ich habe mittels &#8230; <a href="http://www.mighty-marcus.de/keywords-in-der-url-ein-kleiner-test/24">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ich werde hier mal für mich &#8211; und alle die es interessiert &#8211; mal einen kleinen Test starten.<br />
Und zwar geht es um das Thema Keywords in der Url &#8211; bringt es tatsächlich Vorteile für das Ranking? Ich habe mittels PHP zwei zufallsgenerierte Texte erstellt, in denen 420 unterschiedliche Pseudo-Wörter vorkommen. 399 &#8220;Wörter&#8221; davon bestehen ganz einfach aus zufällig generierten Buchstabenfolgen, die 6 Buchstaben lang sind. 21 mal kommt das Pseudo-Wort &#8220;Deiramantis&#8221; vor, das in diesem Test die Rolle des Keywords spielt, und dessen Keyworddichte 5% ausmacht.<br />
Die Texte sollen keinen Double Content erzeugen sondern ein jeder soll unique sein. Keyworddichte, Länge des Textes und die Postition der Keywords (Das erste sowie jedes 21te Wort) sind aber identisch. <span id="more-24"></span></p>
<p>Wir haben also zwei unterschiedliche Texte, die in Hinblick auf das relevante Keyword jedoch völlig gleich sind.</p>
<p>Der erste Text wird über diesen Artikel über diesen Link: <a href="http://mighty-marcus.de/deiramantis.html" target="_blank">deiramantis</a> für die Suchmaschinen erreichbar sein.</p>
<p>Der zweite Text wird über diesen Artikel über diesen Link: <a href="http://mighty-marcus.de/test007.html" target="_blank">deiramantis</a> für die Suchmaschinen erreichbar sein.</p>
<p>Die Linktexte sind also die gleichen, die Dateinamen &#8211; und somit die URL sind aber verschieden. Beim ersten Text ist das Keyword in der Url vorhanden; beim zweiten nicht. Ob es nun eine Rolle spielt, dass der Link zu Text eins eher vorkommt, also die Suchmaschine eher darauf stößt als auf den zweiten Text, lasse ich jetzt mal ausser Acht.</p>
<p>Als Titel und Description werde ich einfach die ersten 5 Pseudo-Wörter des jeweiligen Textes bzw. die ersten 12 Wörter des jeweiligen Textes verwenden. So sind auch Titel und Description unique, obwohl sie eigentlich suchmaschinentechnisch gesehen äquivalent sind. Wichtig ist ja nur das Keyword.</p>
<p>Die Ergebnisse werde ich dann in ein paar Wochen hier posten.</p>
<p>Ach, jetzt habe ich doch glatt vergessen suchmaschinenfreundlich zu schreiben. Also müssen natürlich noch ein paar Keywords rein. HALLO OUT THERE! Hier geht es um das Thema: Keywords in der Url &#8211; ein praktischer Test.</p>
<p>Ich tippe mal stark darauf, dass der Text mit dem Keyword Dateinamen das Rennen macht.</p>
<p>UPDATE: Inzwischen wurde die Seite test007.html in den Index aufgenommen, wenn man im index-cache nachsieht sogar schon am 16.02.2009, also einen Tag nach Veröffentlichung dieses Artikels.<br />
Die andere Seite mit dem Keyword im Dateinamen ist allerdings noch nicht aufgetaucht. Das muss man jetzt nicht verstehen, denke ich mal. Heute ist der 24.02.</p>
<p>UPDATE2: 27. Februar.<br />
Die zweite Seite deiramantis.html wurde nun auch in den Index aufgenommen. Momentan belegt sie noch den zweiten Platz. Mal sehen, ob sich das noch ändert.</p>
<p>Momentan sieht es so aus: <a href="http://www.google.de/search?source=ig&#038;hl=de&#038;rlz=&#038;=&#038;q=deiramantis&#038;btnG=Google-Suche&#038;meta=lr%3D" target="_blank">KLICK ME!</a></p>
<p>UPDATE 1. April 2009</p>
<p>Ähm, ja, lasst euch vom Datum (1.April) nicht täuschen. Ich haber gerade bei Google nachgeschaut und hab gesehen, dass sich der deiramantis.html Artikel jetzt doch durchgesetzt hat. Also das Keyword in der URL scheint doch besser bewertet zu werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mighty-marcus.de/keywords-in-der-url-ein-kleiner-test/24/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Keywords aus dem Text generieren mit PHP</title>
		<link>http://www.mighty-marcus.de/keywords-aus-dem-text-generieren-mit-php/8</link>
		<comments>http://www.mighty-marcus.de/keywords-aus-dem-text-generieren-mit-php/8#comments</comments>
		<pubDate>Mon, 09 Feb 2009 10:18:56 +0000</pubDate>
		<dc:creator>mighty.marcus</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[aus dem text]]></category>
		<category><![CDATA[automatisch]]></category>
		<category><![CDATA[generieren]]></category>
		<category><![CDATA[keywords]]></category>
		<category><![CDATA[mit php]]></category>
		<category><![CDATA[preg_match_all]]></category>

		<guid isPermaLink="false">http://www.mighty-marcus.de/?p=8</guid>
		<description><![CDATA[Wie der Titel schon sagt, werde ich euch mal zeigen wie man mittels PHP Keywords aus einem String ziehen kann. Dazu zeige ich euch mein kleines Skript, welches ich für mein Forum geschrieben habe. Es durchsucht den Text nach Wörtern, &#8230; <a href="http://www.mighty-marcus.de/keywords-aus-dem-text-generieren-mit-php/8">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Wie der Titel schon sagt, werde ich euch mal zeigen wie man mittels PHP Keywords aus einem String ziehen kann. Dazu zeige ich euch mein kleines Skript, welches ich für mein Forum geschrieben habe.<br />
Es durchsucht den Text nach Wörtern, die groß geschrieben sind. Ich gehe nämlich davon aus, dass alle Wörter, die groß geschrieben sind, wichtig sind. Großgeschriebene Wörter sind ja meist Namen, Orte oder Objekte, kleine meistens nicht.<br />
Klar, die besten Keywords sind die, die man manuell eingibt. Hat man jedoch nicht die Zeit oder Muse dazu, das selbst zu machen, ist so ein Keyword Generator eine gute Wahl.<br />
<span id="more-8"></span><br />
Keyword Meta Tags sollen ja von manchen Suchmaschinen inzwischen ignoriert werden oder zumindest an Bedeutung verloren haben. Anders sieht es jedoch aus, wenn man mit Adsense Werbung anzeigen lässt. Dabei spielen die Meta Tags doch ein wichtige Rolle. Oder denkt an Tag-Wolken. Um die zu erzeugen ist es notwendig, die wichtigsten Wörter herauszufischen und sie je nach Vorkommen unterschiedlich groß darzustellen, evtl. noch mit unterschiedlichen Farben von dunkelgrau bis weiß. Ganz unten könnt ihr euch ein Beispiel ansehen, wie ich es in meinem Forum verwende.<br />
Das müsst ihr dann aber selbst programmieren.</p>
<p>Eine viel bessere Lösung wäre es, nicht nur nach großgeschriebenen Wörtern zu suchen, sondern den Text mit einer Keywords-Bibliothek zu vergleichen. Das ist jedoch mühsam, denn wo kriegt man so eine Keywords Bibliothek her, in der so ziemlich alle Wörter stehen, die wichtig sein könnten? Zweitens würde sicher die Performance darunter leiden, wenn wir den Text mit solch einer riesigen Bibliothek vergleichen würden.</p>
<p>Mein Keyword Generator macht den Job auch ziemlich gut. Ein Problem sind die Leute, die alles klein schreiben, aber mit denen müssen wir halt leben.</p>
<p>Wir fangen einfach mal an und erstellen einen String mit dem Text.</p>
<p>[php]<br />
$text = &#8216;Wir schreiben einen Keyword Generator. Man könnte auch sagen es ist ein Keyword Generator Tool, vielleicht schreiben wir einfach mal Keyword-Generator Tool, oder auch Keyword-GENERATOR-Tool, was ja das gleiche ist. Das Keyword in diesem Text ist natürlich KeYwoRD.&#8217;;<br />
[/php]</p>
<p>Wir haben jetzt unseren Text, der in der Praxis z.b. aus sämtlichen Forumspostings einer Seite bestehen könnte, so wie es in meinem Forum der Fall ist.</p>
<p>Nun machen wir uns daran, einfach mal alle groß geschriebenen Wörter und Wortkombinationen (bestehend aus maximal 3 aufeinanderfolgenden groß geschriebenen Wörtern) herauszufiltern. Dafür benutzen wir ein Pattern und den PHP Befehl preg_match_all.</p>
<p>[php]<br />
$pattern1 = &#8216;/\b[A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+ [A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+ [A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+|[A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+ [A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+|[A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+\b/&#8217;;<br />
preg_match_all($pattern1, $text, $array1);<br />
[/php]</p>
<p>Nicht erschrecken! Dieses Pattern besteht regex-Mustern, also Mustern, mit denen wir nach Übereinstimmungen suchen können. [A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+ bedeutet einfach, wir suchen nach Wörtern, deren erster Buchstabe groß geschrieben ist, die darauf folgenden Wörter groß oder klein geschrieben sind, und das Wort muss aus mindestens 3 Buchstaben bestehen.<br />
Da wir aber nicht nur einzelne Wörter auslesen wollen, sondern auch Kombinationen aus Wörtern, sagen wir in unserem Muster, dass zuerst nach Wortkombinationen aus drei Wörtern gesucht werden soll &#8211; oder nach Kombis mit zwei Wörtern, zum Schluß nach einzelnen Wörtern &#8211; in dieser Reihenfolge.</p>
<p>Wir schauen uns mal das Ergebnis an, welches in dem Array $array1[0] gespeichert ist.</p>
<p>[php]<br />
print_r($array1[0]);<br />
[/php]</p>
<p>Das Ergebnis:<br />
Array ( [0] => Wir [1] => Keyword Generator [2] => Man [3] => Keyword Generator Tool [4] => Keyword [5] => Generator Tool [6] => Keyword [7] => GENERATOR [8] => Tool [9] => Das Keyword [10] => Text [11] => KeYwoRD )</p>
<p>Naja, irgendwie ist da etwas schief gelaufen! Wo kommt denn Generator Tool her, oder gar Generator? In unserem Muster steht doch Keyword-Generator Tool, aber wir bekommen nur Generator Tool. Achja, der Bindestrich. Klar, unser Muster ignoriert Keyword-Generator, da es davon ausgeht, dass Wortkombinationen mit einem Leerzeichen getrennt werden. Also ersetzen wir einfach mal alle Binde- und Unterstriche mit einem Leerzeichen, sodaß aus Keyword-Generator Tool ganz einfach Keyword Generator Tool wird.</p>
<p>[php]<br />
$text = str_replace(array(&#8216;-&#8217;,'_&#8217;),array(&#8216; &#8216;),$text);<br />
[/php]</p>
<p>Array ( [0] => Wir [1] => Keyword Generator [2] => Man [3] => Keyword Generator Tool [4] => Keyword Generator Tool [5] => Keyword GENERATOR Tool [6] => Das Keyword [7] => Text [8] => KeYwoRD ) </p>
<p>Ja, so gefällt mir das schon besser.</p>
<p>Jetzt zählen wir die Wörter nach ihrem Vorkommen und sortieren sie auch danach. Das geht ziemlich einfach.</p>
<p>[php]<br />
$ausgabe1 = array_count_values($array1[0]);<br />
array_multisort($ausgabe1, SORT_DESC);<br />
[/php]</p>
<p>Nun haben wir ein weiteres Array, nämlich $ausgabe1. Wir sehen uns mal den Inhalt an.</p>
<p>[php]<br />
print_r($ausgabe1);<br />
[/php]</p>
<p>Array ( [Keyword Generator Tool] => 2 [Text] => 1 [KeYwoRD] => 1 [Das Keyword] => 1 [Keyword GENERATOR Tool] => 1 [Man] => 1 [Wir] => 1 [Keyword Generator] => 1 ) </p>
<p>Aha, wie wir sehen, bestehen die Schlüssel dieses Arrays aus unseren Wörtern, die Werte bestehen aus der Häufigkeit ihres Vorkommens. Demnach kommt Keyword Generator Tool 2 mal vor, Text 1 mal, KeYwoRD auch 1 mal. Moment, das ist doch dumm. KeYwoRD und Keyword ist doch das selbe.<br />
Ja, für Menschen natürlich schon, für einen Computer ist es aber absolut nicht das selbe.</p>
<p>Also was machen wir? Wir lösen dieses Problem ganz einfach so: wir wandeln von Anfang an alle unsere durch das Muster gefundenen Wörter in Kleinbuchstaben um, um dann jeden ersten Buchstaben eines jeden Wortes in einen Großbuchstaben zu verwandeln.</p>
<p>[php]<br />
$array1[0] = array_map(&#8216;ucwords&#8217;, array_map(&#8216;strtolower&#8217;, $array1[0]));<br />
[/php]</p>
<p>Ergebnis:<br />
Array ( [Keyword Generator Tool] => 3 [Text] => 1 [Keyword] => 1 [Das Keyword] => 1 [Wir] => 1 [Man] => 1 [Keyword Generator] => 1 ) </p>
<p>Gut, es hat hingehauen. Keyword GENERATOR Tool wurde zu Keyword Generator Tool und kommt nun drei mal vor, statt nur 2 mal wie vorher.</p>
<p>Wir werden jetzt mal einen String erzeugen, den wir dann einfach als META-TAG benutzen können. Die Werte des Arrays, also das Vorkommen der Wörter, interessiert uns jetzt nicht mehr, da wir ja die Worte schon danach geordnet haben. Uns interessieren jetzt die Schlüssel, also die Wörter, die wir für unsere Liste brauchen.</p>
<p>[php]<br />
$keywords = array_keys($ausgabe1);<br />
$keywords = implode(&#8216;, &#8216;,$keywords);<br />
echo $keywords;<br />
[/php]</p>
<p>Ergebnis:<br />
Keyword Generator Tool, Text, Keyword, Das Keyword, Wir, Man, Keyword Generator</p>
<p>Naja, nicht schlecht, aber auch noch nicht das wahre. Die Wörter &#8220;Wir&#8221;, &#8220;Man&#8221; und auch das &#8220;Das&#8221; haben in unserer Liste nichts verloren. Faul wie wir sind, werden wir sie direkt am Anfang einfach aus dem Text entfernen. Dazu brauchen wir eine sogenannte Stopwords-Liste.</p>
<p>Stopwords sind z.B. das, er, sie, es, wenn, seine, und etc.</p>
<p>[php]<br />
$stopwords = array(&#8216;Wir &#8216;,&#8217;Das &#8216;,&#8217;Man &#8216;);<br />
$text = str_replace($stopwords,&#8221;,$text);<br />
[/php]</p>
<p>Das ist so ziemlich die einfachste Methode, um ungewünschte Wörter zu entfernen. Wir benutzen ganz einfach str_replace und fügen nach jedem Stopword ein Leerezeichen hinzu. So können wir vermeiden, dass aus Wörtern wie &#8220;Manchester&#8221; &#8220;chester&#8221; wird, wenn wir das &#8220;Man&#8221; entfernen, oder aus dem Wort &#8220;Wirtshaus&#8221; &#8220;tshaus&#8221;.<br />
Normalerweise werden diese Stopwords eh klein geschrieben und fallen eh durch unser Suchraster, allerdings kann es vorkommen, dass diese Wörter auch mal groß geschrieben werden. Eben am Satzanfang.</p>
<p>Das einzige Problem ist es, wenn dem &#8220;Wir&#8221; oder &#8220;Das&#8221; oder &#8220;Man&#8221; kein Leerzeichen folgen würde, sonder z.B. ein Komma. Dieses &#8220;Das,&#8221; würde nicht entfernt werden.<br />
Mit preg_replace könnten wir das auch noch hinkriegen, aber erstens müssten wir dann unser ganzes Skript umkrempeln. Ich habe jetzt keine Lust, genauer darauf einzugehen, es hat jedenfalls etwas mit der Reihenfolge meines Skripts zu tun. <img src='http://www.mighty-marcus.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Und zweitens geht es auch so, und das wahrscheinlich performance-freundlicher (genau!!). <img src='http://www.mighty-marcus.de/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<p>Gut, dann schauen wir mal, wie es jetzt aussieht.</p>
<p>Keyword Generator Tool, Keyword, Text, Keyword Generator</p>
<p>Ok. Bei längeren Texten empfiehlt es sich auch, die Keywords auf maximal 40 Wörter zu beschneiden.</p>
<p>[php]<br />
$ausgabe1 = array_slice($ausgabe1,0,39);<br />
[/php]</p>
<p>Bis jetzt sieht unser Skript so aus:</p>
<p>[php]<br />
$stopwords = array(&#8216;Man &#8216;,&#8217;Wir &#8216;,&#8217;Das &#8216;);<br />
$text = &#8216;Wir schreiben einen Keyword Generator. Man könnte auch sagen es ist ein Keyword Generator Tool, vielleicht schreiben wir einfach mal Keyword-Generator Tool, oder auch Keyword-GENERATOR-Tool, was ja das gleiche ist. Das Keyword in diesem Text ist natürlich KeYwoRD.&#8217;;<br />
$text = str_replace($stopwords,&#8221;,$text);<br />
$text = str_replace(array(&#8216;-&#8217;,'_&#8217;),array(&#8216; &#8216;),$text);<br />
$pattern1 = &#8216;/\b[A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+ [A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+ [A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+|[A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+ [A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+|[A-Z\ÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+\b/&#8217;;<br />
preg_match_all($pattern1, $text, $array1);<br />
$array1[0] = array_map(&#8216;ucwords&#8217;, array_map(&#8216;strtolower&#8217;, $array1[0]));<br />
$ausgabe1 = array_count_values($array1[0]);<br />
$ausgabe1 = array_slice($ausgabe1,0,39);<br />
array_multisort($ausgabe1, SORT_DESC);<br />
$keywords = array_keys($ausgabe1);<br />
$keywords = implode(&#8216;, &#8216;,$keywords);<br />
echo $keywords;<br />
[/php]</p>
<p>Wir können es aber noch besser machen.<br />
Und zwar benutzen wir einfach mehrere Pattern. Das erste Pattern liest alle großgeschriebenen Wörter aus, sowie auch alle Wortkombinationen aus maximal drei aufeinander folgenden großgeschriebenen Wörtern.</p>
<p>Das zweite Pattern liest nur alle Wortkombinationen bestehend aus exakt drei aufeinander folgenden großgeschriebenen Wörtern aus. (Und zwar nicht aus dem ganzen Text sondern aus dem 1. Ergebnis, weil hier schon alles was wir brauchen enthalten ist. Es wäre ja auch blöd viermal den gesamten Text durchzusuchen)</p>
<p>Das dritte Pattern liest nur alle Wortkombinationen bestehend aus exakt zwei aufeinander folgenden großgeschriebenen Wörtern aus. Natürlich aus dem vorigen Ergebnis.</p>
<p>Und das vierte Pattern liest nur alle einzelnen roßgeschriebenen Wörter aus. Natürlich aus dem vorigen Ergebnis.</p>
<p>Dazu poste ich einfach mal das veränderte Skript und erkläre dann, was es damit auf sich hat.</p>
<p>[php]<br />
$tags = &#8216;Wir schreiben einen Keyword Generator. Man könnte auch sagen es ist ein Keyword Generator Tool, vielleicht schreiben wir einfach mal Keyword-Generator Tool, oder auch Keyword-GENERATOR-Tool, was ja das gleiche ist. Das Keyword in diesem Text ist natürlich KeYwoRD.&#8217;;</p>
<p>$pattern1 = &#8216;/\b[A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+ [A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+ [A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+|[A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+ [A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+|[A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+\b/&#8217;;<br />
$pattern2 = &#8216;/\b[A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+ [A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+ [A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+\b/&#8217;;$pattern3 = &#8216;/\b[A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+ [A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+\b/&#8217;;<br />
$pattern4 = &#8216;/\b[A-ZÄÖÜ]{1}+[A-Za-zäüöéèáàúùß]{2,}+\b/&#8217;;</p>
<p>preg_match_all($pattern1, $tags, $array1);<br />
$tags2 = implode(&#8216;, &#8216;,$array1[0]);<br />
preg_match_all($pattern2, $tags2, $array2);<br />
$tags3 = implode(&#8216;, &#8216;,$array1[0]);<br />
preg_match_all($pattern3, $tags3, $array3);<br />
$tags4 = implode(&#8216;, &#8216;,$array1[0]);<br />
preg_match_all($pattern4, $tags4, $array4);</p>
<p>$array1[0] = array_map(&#8216;ucwords&#8217;, array_map(&#8216;strtolower&#8217;, $array1[0]));<br />
$array2[0] = array_map(&#8216;ucwords&#8217;, array_map(&#8216;strtolower&#8217;, $array2[0]));<br />
$array3[0] = array_map(&#8216;ucwords&#8217;, array_map(&#8216;strtolower&#8217;, $array3[0]));<br />
$array4[0] = array_map(&#8216;ucwords&#8217;, array_map(&#8216;strtolower&#8217;, $array4[0]));</p>
<p>$ausgabe1 = array_count_values($array1[0]);<br />
$ausgabe2 = array_count_values($array2[0]);<br />
$ausgabe3 = array_count_values($array3[0]);<br />
$ausgabe4 = array_count_values($array4[0]);</p>
<p>$new_keys = array_merge($ausgabe1,$ausgabe2,$ausgabe3,$ausgabe4);<br />
array_multisort($new_keys, SORT_DESC);<br />
$new_keys = array_slice($new_keys,0,39);<br />
$keywords = array_keys($new_keys);<br />
$keywords = implode(&#8216;, &#8216;,$keywords);<br />
[/php]</p>
<p>Das Ergebnis:</p>
<p>Erstes Skript:<br />
Keyword Generator Tool, Keyword, Text, Keyword Generator</p>
<p>Zweites Skript:<br />
Keyword, Generator, Keyword Generator, Tool, Keyword Generator Tool, Text</p>
<p>Genial, Keyword ist an erster Stelle. Das Generator an zweiter stelle bereitet mir aber doch irgendwie Unbehangen. Um einen Generator geht es hier ja nicht wirklich, oder?</p>
<p>Hm, kurz überlegen. Mit array_merge verbinden wir ja alle $ausgabe Arrays zu einem einzigen Array, das uns dann das Ergebnis liefert. </p>
<p>In $ausgabe1 finden wir alle Wörter und Wortkombinationen. Wenn das Pattern auf eine Wortkombination aus drei Wörtern stößt, wird dieser Treffer gespeichert. Es speichert dann bei Keyword Generator Tool nur &#8220;Keyword Generator Tool&#8221;. &#8220;Generator&#8221; und &#8220;Tool&#8221; wird nicht noch mal gespeichert.<br />
Wenn es aber nicht auf eine Wortkombination aus drei Elementen stößt, schaut es nach, ob es eine Wortkombination aus zwei Worten findet. &#8220;Keyword Generator&#8221; zum Beispiel. Wir auch vorher speichert es &#8220;Keyword Generator&#8221; und fährt mit der Suche fort, ohne sich um den &#8220;Generator&#8221; zu kümmern.</p>
<p>In $ausgabe2 finden wir alle Wortkombinationen aus drei Elementen bestehend. Das zweite Pattern ignoriert jetzt alle einzelnen Wörter und alle Kombis mit zwei Elementen.</p>
<p>In $ausgabe3 finden wir alle Kombis aus zwei Elementen.</p>
<p>In $ausgabe4 finden wir alle einzelnen Wörter, unabhängig davon, ob diese in einer Wortkombination stehen oder nicht. Es findet bei &#8220;Keyword Generator Tool&#8221; einmal &#8220;Keyword&#8221;, einmal &#8220;Generator&#8221; und einmal &#8220;Tool&#8221;.</p>
<p>Mit [php]array_merge($ausgabe1,$ausgabe2,$ausgabe3,$ausgabe4);[/php] fügen wir nun alle $ausgaben zusammen, wobei die Werte der jeweils vorherigen $ausgabe von der folgenden Ausgabe überschrieben werden.</p>
<p>Das heisst, steht in $ausgabe1 das Wort Keyword => 4 mal, und in $ausgabe4, dass ja alle einzelnen Wörter zählt, Keyword => 6 mal, wird aus dem Keyword => 4 in $ausgabe1 Keyword => 6.</p>
<p>Und so weiter.</p>
<p>Das Problem ist nun die Sache mit dem Generator. In der ersten $ausgabe1 kommt es gar nicht vor, denn im Text steht es nicht alleine, d.h. es steht immer in einer Kombination. Das ist schon mal gut.<br />
In $ausgabe4 wird aber auf die Kombinationen gepfiffen und es erscheint dann trotzdem im Ergebnis-Array, und zwar nicht nur einmal sondern öfter, weil es ja schon in &#8220;Keyword Generator&#8221; vorkommt, aber auch in &#8220;Keyword Generator Tool&#8221;. Dabei ist dieses &#8220;Generator&#8221;, wenn es alleine steht, unnütz, belegt aber in unserer Keywords-Liste den zweiten Platz.</p>
<p>Das ist gewiss suboptimal. Was könnte man da machen? Die Lösung ist natürlich relativ einfach.<br />
Wir schauen einfach in unserer ersten $ausgabe1 nach, ob das Wort &#8220;Generator&#8221; auch als einzelnes Wort ausserhalb einer Kombi gefunden wurde. Ist dem so, schenken wir ihm die volle Aufmerksamkeit. Ist dem nicht so, ignorieren wir es komplett als einzelnes Wort: Wir lassen es erst gar nicht in unserem Suchergebnis erscheinen.</p>
<p>Dazu schreiben wir einfach vor dem array_merge($ausgabe1,$ausgabe2,$ausgabe3,$ausgabe4); zwei foreach-Schleifen. Die kümmern sich nur um die einzelnden und um die Kombis mit 2 Elementen. Um die 3er Kombis müssen wir uns nicht weiter kümmern, wir können sie danach einfach zum ersten $ausgabe1 dazufügen.<br />
[php]<br />
foreach ($ausgabe3 as $key => $value) {<br />
if (isset($ausgabe1[$key])) {$ausgabe1[$key] = $value;}<br />
}</p>
<p>foreach ($ausgabe4 as $key => $value) {<br />
if (isset($ausgabe1[$key])) {$ausgabe1[$key] = $value;}<br />
}<br />
[/php]<br />
Wir ändern jetzt einfach die Zeile mit<br />
[php]$new_keys = array_merge($ausgabe1,$ausgabe2,$ausgabe3,$ausgabe4);[/php]<br />
 in<br />
[php]$new_keys = array_merge($ausgabe1,$ausgabe2);[/php]</p>
<p>In den Schleifen steht einfach drin, dass wir für jeden Treffer in den jeweiligen $ausgaben diese mit dem Wert in $ausgabe1 ersetzen &#8211; so kann kein in einer Kombi gefundenes &#8220;Generator&#8221; im Ergebnis landen.<br />
Anders ist es, wenn wir im Text einmal das Wort &#8220;Generator&#8221; alleine finden würden. Das ist aber nicht der Fall.</p>
<p>Und das Ergebnis sieht dann so aus:</p>
<p>Keyword, Keyword Generator, Keyword Generator Tool, Text</p>
<p>Das Generator ist weg.</p>
<p>Nehmen wir jetzt mal ein anderes Beispiel als Text.</p>
<p>&#8220;Super Metroid Fans können mit dem Super Metroid Hack Super Metroid Redesign endlich mal ein neues Super Metroid spielen. Metroid ist ja auch ein geiles Spiel! Super Metroid Redesign ist ein Hack vom originalen Super Metroid. Es ist einfach genial.&#8221;</p>
<p>Ergebnis:<br />
Metroid, Super Metroid, Super Metroid Redesign, Hack, Spiel, Super Metroid Hack, Super Metroid Fans</p>
<p>Seht ihr was ich meine? Metroid ist an erster Stelle, weil es auch mal als alleine stehendes Wort gefunden wird. Super ist erst gar nicht dabei? Warum nicht? Weil es im Text nicht ein einziges mal ausserhalb einer Kombination vorkommt. Hack kommt vor, und Spiel kommt auch vor, aber Super nicht. Das finde ich gut, denn Super würde den ersten Platz in unserer Liste belegen, weil es in Kombis öfter auftaucht.</p>
<p>Evtl. werde ich das Skript noch soweit verändern, dass ein alleine stehendes Wort auch öfter Vorkommen muss, um gezählt zu werden.</p>
<p>Denn was passiert, wenn in dem Text zufällig &#8220;Ja, das ist Super!&#8221; vorkommt. Na, die Frage könnt ihr doch selbst beantworten, nehme ich an.</p>
<p>So, jetzt muss ich aber Schluß machen.<br />
Ich hoffe der eine oder andere kann mit diesem Beinahe Tutorial etwas anfangen. Ich weiß, das Skript ist nicht perfekt, aber vermutlich ein guter Ansatz für Newbies, die auch mal so etwas programmieren wollen und nicht nur fertige Skripts einbauen wollen.</p>
<p>Wenn ihr euch für die Sache interessiert könnt ihr irgendwann sicher ein Skript schreiben, dass meins alt aussehen lässt. Viel Spaß dabei. (Ich werde dann mal versuchen es zu verbessern.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mighty-marcus.de/keywords-aus-dem-text-generieren-mit-php/8/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>

