<?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>Sebastian Thiele &#187; Programmieren</title>
	<atom:link href="http://sebastian.thiele.me/blog/category/it/programmieren/feed" rel="self" type="application/rss+xml" />
	<link>http://sebastian.thiele.me</link>
	<description>Mein Leben, meine Arbeit und ich</description>
	<lastBuildDate>Thu, 02 Sep 2010 17:32:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Tabellenzeilen unterschiedlich gestalten mit jQuery</title>
		<link>http://sebastian.thiele.me/blog/jquery-even-odd/1873?piwik_campaign=RSS&amp;piwik_kwd=1873</link>
		<comments>http://sebastian.thiele.me/blog/jquery-even-odd/1873?piwik_campaign=RSS&amp;piwik_kwd=1873#comments</comments>
		<pubDate>Mon, 26 Jul 2010 09:38:33 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[tabelle]]></category>

		<guid isPermaLink="false">http://sebastian.thiele.me/?p=1873</guid>
		<description><![CDATA[Vielen lange Tabellen haben den Nachteil, dass sie unübersichtlich werden. Schnell verrutscht man in der Zeile und schon kann man von vorne anfangen. Beliebt ist es ja, jede zweite Zeile unterschiedlich zu formatieren um nicht ganz so schnell die Übersicht zu verlieren. Am einfachsten ist es, wenn man eine statische Tabelle hat, die sich nicht [...]]]></description>
			<content:encoded><![CDATA[<p>Vielen lange Tabellen haben den Nachteil, dass sie unübersichtlich werden. Schnell verrutscht man in der Zeile und schon kann man von vorne anfangen. Beliebt ist es ja, jede zweite Zeile unterschiedlich zu formatieren um nicht ganz so schnell die Übersicht zu verlieren.</p>
<p>Am einfachsten ist es, wenn man eine statische Tabelle hat, die sich nicht mehr verändert. Einfach jede gerade (engl. even) oder ungerade (engl. odd) Zeile mit einer entsprechenden CSS Klasse  versehen. Wie man dann das CSS gestaltet ist jedem selbst überlassen aber eine dezente Hintergrundfarbe ist immer Hilfreich.</p>
<p>Das Ganze wird erst zu einem Problem, wenn man die Tabelle am besten per JavaScript dynamisch erstellen lässt. Nehmen wir an es können beliebig viele Zeilen hinzugefügt werde und an beliebigen Stellen wieder entfernt werden, so dass die Reihenfolge nicht vorhersehbar ist. Also müssen die Formatierungen dynamisch vorgenommen werden. Beispielhaft soll das mal an der statischen Tabelle gezeigt werden.</p>
<pre class="brush: xml; highlight: [13,14,18,19];">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;
   &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;

&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
	&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt;
	&lt;title&gt;jQuery even odd&lt;/title&gt;
	&lt;meta name=&quot;author&quot; content=&quot;Sebastian Thiele&quot;&gt;
	&lt;!-- Date: 2010-07-25 --&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot;&gt;
	  $(document).ready(function() {
	    $(&quot;tbody&quot;).find(&quot;tr:even&quot;).addClass(&quot;even&quot;);
	    $(&quot;tbody&quot;).find(&quot;tr:odd&quot;).addClass(&quot;odd&quot;);
	  });
	&lt;/script&gt;
	&lt;style type=&quot;text/css&quot;&gt;
	  .even{color:red;}
	  .odd{color:blue;}
	&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

  &lt;table&gt;
    &lt;thead&gt;
      &lt;tr&gt;
        &lt;th&gt;Zeile1&lt;/th&gt;
        &lt;th&gt;Zeile1&lt;/th&gt;
      &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;Zeile2&lt;/td&gt;
        &lt;td&gt;Zeile2&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Zeile3&lt;/td&gt;
        &lt;td&gt;Zeile3&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Zeile4&lt;/td&gt;
        &lt;td&gt;Zeile4&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>In dem Beispiel werden alle gerade und ungeraden Zeilen der Tabelle (genauer gesagt innerhalb des tbody&#8217;s) unterschiedlich formatiert. Wenn es kein tbody gibt, musst einfach das (&#8220;tbody&#8221;) weggelassen werden.</p>
<p>Auf das fiktive, dynamische Problem von oben angewendet muss der super simple jQuerykonstrukt in den &#8220;Zeile hinzufügen&#8221; oder &#8220;Zeile entfernen&#8221; Aufruf eingebunden werden.</p>
<p>Super simple dank <a href="http://jquery.com/" target="_blank">jQuery</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sebastian.thiele.me/blog/jquery-even-odd/1873?piwik_campaign=RSS&amp;piwik_kwd=1873/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HowTo Google Language API einfach nutzen</title>
		<link>http://sebastian.thiele.me/blog/howto-google-language-api-einfach-nutzen/1706?piwik_campaign=RSS&amp;piwik_kwd=1706</link>
		<comments>http://sebastian.thiele.me/blog/howto-google-language-api-einfach-nutzen/1706?piwik_campaign=RSS&amp;piwik_kwd=1706#comments</comments>
		<pubDate>Tue, 25 May 2010 11:00:12 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Anleitung]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[language]]></category>
		<category><![CDATA[script]]></category>

		<guid isPermaLink="false">http://sebastian.thiele.me/?p=1706</guid>
		<description><![CDATA[Letztens habe ich mal ein wenig mit der Google AJAX Language API herum gespielt. Ich finde da haben sie wieder etwas sehr gutes und einfaches entwickelt. Beispielsweise habe ich das auf meiner (noch nicht fertigen) github Seite (http://sethiele.github.com) eingesetzt um Benutzern meine letzten Tweets und Blogposts in ihrer Sprache anzuzeigen. Im Folgenden möchte ich Schritt für [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sebastian.thiele.me/wp-content/uploads/2010/05/willkommen.png" rel="lightbox[1706]"><img class="aligncenter size-full wp-image-1707" title="willkommen" src="http://sebastian.thiele.me/wp-content/uploads/2010/05/willkommen.png" alt="willkommen" width="600" height="85" /></a>Letztens habe ich mal ein wenig mit der <a href="http://code.google.com/intl/de-DE/apis/ajaxlanguage/" target="_self">Google AJAX Language API</a> herum gespielt. Ich finde da haben sie wieder etwas sehr gutes und einfaches entwickelt. Beispielsweise habe ich das auf meiner (noch nicht fertigen) github Seite (http://sethiele.github.com) eingesetzt um Benutzern meine letzten Tweets und Blogposts in ihrer Sprache anzuzeigen. Im Folgenden möchte ich Schritt für Schritt zeigen wie man das ganze erfolgreich umsetzt. Am Ende soll eine Seite existieren auf der Text je nach vom Besucher eingestellter Browsersprache angezeigt werden soll.</p>
<p>Zur besseren Lesbarkeit teile ich den HTML Code und des benötigte JavaScript (JS) in zwei Dateien. In die Datei content.html und language.js. Beide gibt es am Ende auch zum herunterladen.</p>
<p>Für diese Anleitung sollte man schon ein wenig mit jQuery vertraut sein.<span id="more-1706"></span></p>
<h2>Ein Einfaches Beispiel</h2>
<pre class="brush: xml; first-line: 1; highlight: [4,5];">&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;test translate&lt;/title&gt;
      &lt;script type=&quot;text/javascript&quot; src=&quot;http://www.google.com/jsapi&quot;&gt;&lt;/script&gt;
      &lt;script type=&quot;text/javascript&quot; src=&quot;language.js&quot;&gt;&lt;/script&gt;</pre>
<p><em>content.html</em></p>
<p>Zuerst muss die Google Ajax Api eingebunden werden. In Zeile 4 geschieht das über das herkömmliche &lt;script&gt; Tag.<br />
In Zeile 5 wird noch die JS Datei eingebunden, in der unser JS stehen soll.</p>
<pre class="brush: xml; first-line: 6; highlight: [8,9];">  &lt;/head&gt;
  &lt;body&gt;
    &lt;div id=&quot;inhalt&quot;&gt;
      Dank &lt;a href=&quot;http://sebastian.thiele.me/blog/howto-google-language-api-einfach-nutzen/1706&quot;&gt;dieses&lt;/a&gt; tollen Tutorials von &lt;b&gt;Sebastian&lt;/b&gt; kann ich meine Seite jetzt auch &lt;i&gt;in mehreren Sprachen&lt;/i&gt; anbieten.
    &lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre>
<p><em>content.html</em></p>
<p>Wie Wichtig an dieser Stelle ist die ID des Divs (Zeile 8 ) und der Inhalt (Zeile 9). Alles andere kann beliebig sein. Auch kann CSS angewendet werden wie es beliebt.<br />
Ich habe extra ein Beispiel Text ausgesucht, der mit ein wenig (mehr oder weniger sinnvollen) HTML formatierten Inhalt versehen ist. Um zu zeigen, dass die Formatierung am ende übernommen wird. Die Google Language API verändert keine Formatierung.</p>
<p>Das war auch schon alles an der content.html Datei. Der rest der Magie kommt in der language.js Datei.</p>
<pre class="brush: jscript; highlight: [2,4];">// Lade jQuery von Google
google.load(&quot;jquery&quot;, &quot;1.4.2&quot;);
// Lade Language support
google.load(&quot;language&quot;, &quot;1&quot;);
// Wenn Seite geladen beginne mit jQuery Magic
google.setOnLoadCallback(function() {</pre>
<p><em>translate.js</em></p>
<p>Ich habe mich dazu entschlossen gleich die <a href="http://code.google.com/intl/de-DE/apis/ajaxlibs/documentation/index.html#jquery" target="_blank">von Google zur Verfügung gestellte jQuery Version</a> zu nutzen (Zeile 2). Der Vorteil ist (meiner Sicht nach), wenn sie viele Verwenden ist sie schon in vielen Browsercashes drin und muss nicht immer wieder neu geladen werden.<br />
In Zeile 4 Lade ich die Google Language API in der Version eins. Und Zeile 6 öffnet die JS Verarbeitung, sobald  die HTML Seite fertig geladen ist. Okay, man könnte auch direkt die Übersetzung anschmeißen und nicht auf das Ende der Seite warten, doch dann könnte es zu konflikten kommen, falls noch Inhalte geladen werden (Bilder usw.)</p>
<pre class="brush: jscript; first-line: 7;">
  var translate = function(text){
    // Überprüfen welche Sprache der gesendete Text hat
    google.language.detect(text, function(result){
      // Es dürfen keine Fehler aufgetreten sein
      if (!result.error &amp;&amp; result.language) {</pre>
<p><em>translate.js</em></p>
<p>In Zeile 9 wird die Sprache des übermittelten Textes überprüft. Die Spracherkennung ist meiner Erfahrung nach recht gut. In Zeile 11 Wird gezeigt, dass eine Fehlerbehandlung gemacht werden sollte. Sollte keine Schrift erkannt sein oder ist dabei ein Fehler aufgetaucht wird der alte Text angezeigt (er wird nicht übersetzt).</p>
<pre class="brush: jscript; first-line: 12; highlight: [18];">
        // Überprüfen welche Sprache im Browser eingestellt ist
        if (navigator.appName == 'Netscape')
          var language = navigator.language;
        else
          var language = navigator.browserLanguage;
        // Wenn eingestellte Sprache gleich übermittelte Sprache dann abbrechen
        if (result.language == language.substring(0,2)) return;
</pre>
<p><em>translate.js</em></p>
<p>Hier wird in Zeile 13 bis 16 die eingestellte Sprache im Browser herausgefunden. Dabei sind zwei unterschiedliche Wege nötig, da mal wieder nicht alle Browser gleich Antwort geben.<br />
In Zeile 18 wird noch überprüft ob die eingestellte Sprache, die gleiche ist, wie die des Textes. Wenn dem so ist, wird die Verarbeitung abgebrochen, und es wird kein anderer Text angezeigt. (Man muss ja den TExt nicht noch mal übersetzen lassen). Zu beachten ist, dass in Zeile 18 .substring(0,2) angewendet wird. Das ist nötig, da einige Browser nicht (z.B.) mit en antworten (was Google verwendet) sondern mit eng. Aber für Google werden nur zei Buchstaben benötigt.</p>
<pre class="brush: jscript; first-line: 19; highlight: [20,21];">
        // Text übersetzen
        google.language.translate(text, result.language, language.substring(0,2), function(result) {
          $('#inhalt').html(result.translation);
        });
      }
    });
  };</pre>
<p><em>translate.js</em></p>
<p>Die eigentliche Übersetzung geschieht in Zeile 20. Der Google Funktion translate muss als Parameter der zu übersetzende Text, die Quellsprache, die Zielsprache und eine Callback Funktion übergeben werden.<br />
Zeile 21 Schreibt das ganze dann wieder in den DIV (Überschreibt das alte original). Tipp von mir, ich würde immer noch irgendwie kenntlich machen, dass es ein von Google Übersetzer Text ist, um den Besuchern zu zeigen, dass man an einigen Stellen nicht zu doof ist zum übersetzen, sondern dass es maschinell übersetzt wurde.</p>
<pre class="brush: jscript; first-line: 26;">
  // Sende Inhalt zum übersetzen
  translate($('#inhalt').html());
});</pre>
<p><em>translate.js</em></p>
<p>Fehlt nur noch Zeile 27 um die Übersetzung zu starten.<br />
Mit ein wenig mehr Code kann man die Funktion auch noch so erweitern, dass man mehrere Elemente übersetzen kann. Dazu sollte der Funktion mitgeteilt werden, wo am ende die Übersetzung hingeschrieben werden muss (Zeile 21).</p>
<p>Mit noch ein wenig mehr jQuery Magic kann auch noch ein schönes &#8220;AJAX Wait&#8221; Bildchen angezeigt werden, und erst nach der Übersetzung (oder auch nicht Übersetzung) wird der Text angezeigt. Aber da zähle ich ganz auf euch und eure Kreativität.</p>
<p>Und wie versprochen wird sogar ein (mehr oder weniger sinnvoll) formatierter, übersetzter Text ausgegeben.</p>
<p>Fragen? Anregungen? Ich bin gerne für Feedback offen.</p>
<p>Quellcode: <a href="http://sebastian.thiele.me/wp-content/uploads/2010/05/Google-Language-v1.zip">Google-Language-v1</a></p>
<p>Lizenz: <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.de" target="_blank">cc by-nc-sa</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sebastian.thiele.me/blog/howto-google-language-api-einfach-nutzen/1706?piwik_campaign=RSS&amp;piwik_kwd=1706/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Webfonts</title>
		<link>http://sebastian.thiele.me/blog/google-webfonts/1691?piwik_campaign=RSS&amp;piwik_kwd=1691</link>
		<comments>http://sebastian.thiele.me/blog/google-webfonts/1691?piwik_campaign=RSS&amp;piwik_kwd=1691#comments</comments>
		<pubDate>Wed, 19 May 2010 19:13:28 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Suchmaschine]]></category>

		<guid isPermaLink="false">http://sebastian.thiele.me/?p=1691</guid>
		<description><![CDATA[Google hat eine wirklich einfach Möglichkeit geschaffen einfach Schriftarten zu verwenden, die nicht so ohne weiteres auf allen Rechnern installiert ist. Früher mussten dafür Texte in Grafiken umgewandelt werden. Nachteil ganz klar: Suchmaschinen wissen nicht was auf dem Bild zu sehen ist und man konnte nicht einfach kopieren1. Doch nun geht das ganze recht einfach: [...]]]></description>
			<content:encoded><![CDATA[<p>Google hat eine wirklich einfach Möglichkeit geschaffen einfach Schriftarten zu verwenden, die nicht so ohne weiteres auf allen Rechnern installiert ist.</p>
<p>Früher mussten dafür Texte in Grafiken umgewandelt werden. Nachteil ganz klar: Suchmaschinen wissen nicht was auf dem Bild zu sehen ist und man konnte nicht einfach kopieren<sup><a href="http://sebastian.thiele.me/blog/google-webfonts/1691?piwik_campaign=RSS&amp;piwik_kwd=1691#footnote_0_1691" id="identifier_0_1691" class="footnote-link footnote-identifier-link" title="Ab und an ist das ja doch mal gew&uuml;nscht">1</a></sup>.</p>
<p>Doch nun geht das ganze recht einfach:</p>
<pre class="brush: xml;">&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt;
&lt;title&gt;Test Text&lt;/title&gt;
&lt;link href='http://fonts.googleapis.com/css?family=Reenie+Beanie' rel='stylesheet' type='text/css'&gt;
&lt;style type=&quot;text/css&quot;&gt;
h1 { font-family: 'Reenie Beanie', arial, serif; }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Dieser Text hat jetzt eine besondere Schrift&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<div id="attachment_1697" class="wp-caption aligncenter" style="width: 546px"><a href="http://sebastian.thiele.me/wp-content/uploads/2010/05/google-schriften.png" rel="lightbox[1691]"><img class="size-full wp-image-1697" title="Google Schriften" src="http://sebastian.thiele.me/wp-content/uploads/2010/05/google-schriften.png" alt="Google Schriften" width="536" height="34" /></a><p class="wp-caption-text">Google Schriften</p></div>
<p>Wie gesagt verdammt einfach. Wie es genau geht findet man auf <a href="http://code.google.com/webfonts" target="_blank">http://code.google.com/webfonts</a></p>
<ol class="footnotes"><li id="footnote_0_1691" class="footnote">Ab und an ist das ja doch mal gewünscht</li></ol>]]></content:encoded>
			<wfw:commentRss>http://sebastian.thiele.me/blog/google-webfonts/1691?piwik_campaign=RSS&amp;piwik_kwd=1691/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Maps mit gMap jQuery Plugin</title>
		<link>http://sebastian.thiele.me/blog/google-maps-mit-gmap-jquery-plugin/1640?piwik_campaign=RSS&amp;piwik_kwd=1640</link>
		<comments>http://sebastian.thiele.me/blog/google-maps-mit-gmap-jquery-plugin/1640?piwik_campaign=RSS&amp;piwik_kwd=1640#comments</comments>
		<pubDate>Sun, 09 May 2010 15:31:21 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[google map]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://sebastian.thiele.me/?p=1640</guid>
		<description><![CDATA[Über einen tweet bin ich auf gMap aufmerksam geworden, ein jQuery Plugin. Bis her fand ich es immer recht mühsam eine Google Map auf eine Seite zu bringen. Doch dank gMap (aktuelle Version 1.1.0) ist das ganze jetzt recht einfach geworden. Alles was man braucht ist ein wenig HTML/ JavaScript Ahnung, einen Google Map API [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1642" class="wp-caption aligncenter" style="width: 569px"><a href="http://sebastian.thiele.me/wp-content/uploads/2010/05/gMap.png" rel="lightbox[1640]"><img class="size-full wp-image-1642" title="gMap" src="http://sebastian.thiele.me/wp-content/uploads/2010/05/gMap.png" alt="gMap" width="559" height="258" /></a><p class="wp-caption-text">gMap</p></div>
<p>Über einen tweet bin ich auf <a href="http://gmap.nurtext.de/" target="_blank">gMap</a> aufmerksam geworden, ein <a href="http://jquery.com/" target="_blank">jQuery</a> Plugin. Bis her fand ich es immer recht mühsam eine Google Map auf eine Seite zu bringen. Doch dank gMap (<a href="http://gmap.nurtext.de/download.html" target="_blank">aktuelle Version 1.1.0</a>) ist das ganze jetzt recht einfach geworden. Alles was man braucht ist ein wenig HTML/ JavaScript Ahnung, einen <a href="http://code.google.com/intl/en-US/apis/maps/signup.html" target="_blank">Google Map API Key</a> und gMap mit jQuery.</p>
<p>3 Zeilen Code reichen aus um eine Karte auf den Bildschirm zu zaubern. (<a href="http://gmap.nurtext.de/documentation.html" target="_blank">Siehe Dokumentation</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://sebastian.thiele.me/blog/google-maps-mit-gmap-jquery-plugin/1640?piwik_campaign=RSS&amp;piwik_kwd=1640/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ich nun auch mit FF Searchplugin</title>
		<link>http://sebastian.thiele.me/blog/ich-nun-auch-mit-ff-searchplugin/721?piwik_campaign=RSS&amp;piwik_kwd=721</link>
		<comments>http://sebastian.thiele.me/blog/ich-nun-auch-mit-ff-searchplugin/721?piwik_campaign=RSS&amp;piwik_kwd=721#comments</comments>
		<pubDate>Fri, 20 Mar 2009 09:05:36 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Anleitung]]></category>
		<category><![CDATA[Beschreibung]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Inhalt]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[Suche]]></category>
		<category><![CDATA[Suchen]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://blog.sebastian-thiele.net/?p=721</guid>
		<description><![CDATA[Nach dem Erfolg1 des Bee5 Searchplugins (Bee5 Suchplugin für FireFox) und dem Versuch meiner Herzdame gestern etwas über Ubuntu auf meinem Blog zu finden, habe ich mich entschlossen nun auch ein Searchplugin für meinen Blog anzubieten. Dem Aufmerksamen betrachter wird es sicher aufgefallen sein, dass sich beim Besuchen des Blogs die Suchleiste im Firefox verändert [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-722" title="top_mysearchplugin" src="http://blog.sebastian-thiele.net/wp-content/uploads/top_mysearchplugin.png" alt="top_mysearchplugin" width="500" height="45" />Nach dem Erfolg<sup><a href="http://sebastian.thiele.me/blog/ich-nun-auch-mit-ff-searchplugin/721?piwik_campaign=RSS&amp;piwik_kwd=721#footnote_0_721" id="identifier_0_721" class="footnote-link footnote-identifier-link" title="der noch zu erwarten ist *hust hust*">1</a></sup> des <a href="http://blog.sebastian-thiele.net/2009/03/19/bee5-firefox-searchplugin-v10/" target="_blank">Bee5 Searchplugins (Bee5 Suchplugin für FireFox)</a> und dem Versuch meiner Herzdame gestern etwas über <a href="http://blog.sebastian-thiele.net/tag/ubuntu/">Ubuntu</a> auf meinem Blog zu finden, habe ich mich entschlossen nun auch ein Searchplugin für meinen Blog anzubieten.</p>
<p><img class="alignleft size-full wp-image-734" title="mein_blog_searchplugin" src="http://blog.sebastian-thiele.net/wp-content/uploads/mein_blog_searchplugin.png" alt="mein_blog_searchplugin" width="249" height="240" />Dem Aufmerksamen betrachter wird es sicher aufgefallen sein, dass sich beim Besuchen des Blogs die Suchleiste im Firefox verändert hat. Klappt man sie nun auch findet sich dort auch ein neuer Eintrag.</p>
<p>Geschmeidig und einfach kann man nun durch einen Klick auf die (links) markierte Zeile klicken, und das Suchplugin zu den beliebsten Scuhmaschienen hinzufügen.<sup><a href="http://sebastian.thiele.me/blog/ich-nun-auch-mit-ff-searchplugin/721?piwik_campaign=RSS&amp;piwik_kwd=721#footnote_1_721" id="identifier_1_721" class="footnote-link footnote-identifier-link" title="Man, der Gedanke meine Seite neben Seiten wie Google, Wikipedia, Amazon und Co stehen zu haben ist nen tolles gef&uuml;hl   ">2</a></sup></p>
<p>Es wäre jetzt aber sehr plump von mir einfach nur einen Beitrag zu schreiben, in dem ich sage, was ich habe <img src='http://sebastian.thiele.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  neee ich nutze die Gelegenheit auch gleich um zu beschreiben<sup><a href="http://sebastian.thiele.me/blog/ich-nun-auch-mit-ff-searchplugin/721?piwik_campaign=RSS&amp;piwik_kwd=721#footnote_2_721" id="identifier_2_721" class="footnote-link footnote-identifier-link" title="Original siehe hier">3</a></sup> , wie jeder mit ein ganz, gaaanz wenig Ahnung von der Materie hat so ein Blugin erstellen kann. Speziell werde ich auf die Zielgruppe Blogbetreiber<sup><a href="http://sebastian.thiele.me/blog/ich-nun-auch-mit-ff-searchplugin/721?piwik_campaign=RSS&amp;piwik_kwd=721#footnote_3_721" id="identifier_3_721" class="footnote-link footnote-identifier-link" title="mit WordPress">4</a></sup> eingehen, was aber nicht heißt, dass es nicht auch für andere Seitenbetreiber geeignet ist.</p>
<p><strong>Was braucht man?</strong></p>
<p>Nur wenig dinge werden im Vorfeld benötigt:</p>
<ul>
<li>Eine Webseite mit einer Möglichkeit etwas zu suchen.<br />
Man muss wissen, wie die Seite eine Suchanfrage verarbeitet (Auf welche Seite gelangt man, wenn man die Suchmaske bestätigt, welche Informationen werden auf welche Art und weise mitgeteilt (Wie heißen die Variablen, wie werden sie übertragen (POST oder GET) )</li>
<li>Ein Icon in der Größe 16&#215;16 Pixel.<br />
Ich habe dafür mein FavIcon benutzt (Man muss das Rad ja nicht zwei mal erfinden</li>
<li>Einen Texteditor</li>
<li>Optional Zugriff auf den Quellcode der Seite speziell auf den Headerbereich</li>
</ul>
<p><span id="more-721"></span><strong>Los geht es mit einer Dummie-XML Datei</strong></p>
<p>Zuerst nimmt man sich eine Beispieldatei<sup><a id="identifier_2_721" class="footnote-link footnote-identifier-link" title="Original siehe hier" href="http://blog.sebastian-thiele.net/?p=721#footnote_2_721">3</a></sup></p>
<pre lang="xml">&lt;OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" xmlns:moz="http://www.mozilla.org/2006/browser/search/"&gt;
  &lt;ShortName&gt;NAME&lt;/ShortName&gt;
  &lt;Description&gt;BESCHREIBUNG&lt;/Description&gt;
  &lt;InputEncoding&gt;z.B. UTF-8&lt;/InputEncoding&gt;
  &lt;Image width="16" height="16" type="image/x-icon"&gt;http://example.com/favicon.ico&lt;/Image&gt;
  &lt;Url type="text/html" method="method" template="http://example.com/"&gt;
    &lt;Param name="suchVariable" value="{searchTerms}"/&gt;
    ...
    &lt;Param name="paramNameN" value="paramValueN"/&gt;
  &lt;/Url&gt;
  &lt;moz:SearchForm&gt;http://example.com&lt;/moz:SearchForm&gt;
&lt;/OpenSearchDescription&gt;</pre>
<ul>
<li><strong>Zeile 2:</strong> Dort wird der Name eingetragen, der später in dem Suchfeld zu sehen sein soll (Wenn keine Suche eingetragen ist)</li>
<li><strong>Zeile 3:</strong> Eine Kurze Beschreibung (worum geht es)</li>
<li><strong>Zeile 4:</strong> Mit welcher Kodierung soll gesendet werden. Ich empfehle UTF-8</li>
<li><strong>Zeile 5:</strong> Hier die URL von eurem Icon. Ihr könnt auch das  <a class="external" title="http://en.wikipedia.org/wiki/Data:_URI_scheme" rel="external nofollow" href="http://en.wikipedia.org/wiki/Data:_URI_scheme" target="_blank">data: URI scheme</a> nutzen. Aber wenn ihr der Anleitung folgt, wird es automatisch umgewandelt.</li>
<li><strong>Zeile 6:</strong> Dort tragt Ihr sowohl eure gewünschte <a href="http://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Argument.C3.BCbertragung" target="_blank">Methode zur übertragung der Daten</a> (POST oder GET)  als auch die Adresse auf der die anfrage verarbeitet werden soll. Da ist nun das wissen über eure Seite gefragt, wo landet die Suche? Bei WP ist es die Startseite des Blogs und Methode GET.</li>
<li><strong>Zeile 7-9:</strong> Hier könnt ihr nun die Parameter eintragen, die bei der Suche übergeben werden sollen (Variablen &#8211; Namen Paar. {searchTerms} ist dabei der Wert, der in das Suchfeld eingeben wurde. Ihr könnt da so viele Parameter angeben wie ihr wollt. Bei WP lautet dar name der suche einfach nur s (kleines S). Ich lass zur auswertung (reines interesse von mir, wie das Plugin benutzt wird) noch einen weiteren Parameter übergeben, in dem ich auswerten kann, ob die Suche von meinem Plugin kommt.</li>
<li><strong>Zeile 11:</strong> Beinhaltet eure Webseite. Damit ist sichergestellt, dass ein Benutzer, der ohne Eingabe eines Suchgegriffes direkt auf eure Seite kommt.</li>
</ul>
<p>Das war es schon (fast). Wenn ihr jetzt noch wollt, dass sich das Plugin selbst updatet<sup><a href="http://sebastian.thiele.me/blog/ich-nun-auch-mit-ff-searchplugin/721?piwik_campaign=RSS&amp;piwik_kwd=721#footnote_4_721" id="identifier_4_721" class="footnote-link footnote-identifier-link" title="Erst ab FF Version 3.1 m&ouml;glich">5</a></sup>, falls ihr mal etwas ändert (z.B. Die Seite die die suche bearbeitet ist umgezogen) , müsst ihr noch eine Zeile hinzufügen (ich empfehle nach Zeile 10)</p>
<pre lang="xml">&lt;Url type="application/opensearchdescription+xml" rel="self" template="http://example/mysearchplugin.xml" /&gt;</pre>
<p>Dort tragt ihr bei template einfach die URL zu eurer später hochgeladenen xml Datei ein und das Plugin (soll) macht selber updates.</p>
<p>Die Datei speichert ihr nun als *.xml Datei ab und ladet sie dann per FTP auf eure Webseite hoch.</p>
<p><strong>Jetzt soll eure Seite eure Benutzer darüber informieren, dass ihr solch ein Plugin benutzt</strong></p>
<p>Klar, was nutzt so ein Plugin, wenn es niemand nutzt, weil es unbekannt ist.<br />
In eurem HTML Code (ziwschen &lt;head&gt; und &lt;/head&gt; fügt ihr folgenden Code ein:</p>
<pre lang="html">&lt;link rel="search" type="application/opensearchdescription+xml" title="searchTitle" href="pluginURL"&gt;</pre>
<p>Ersetzt searchTitle durch den Namen eurer Suche und pluginURL durch die URL zu eurer XML Datei, die ihr gerade hochgeladen habt.<br />
Nun wird jeder FF Benutzer informiert<sup><a href="http://sebastian.thiele.me/blog/ich-nun-auch-mit-ff-searchplugin/721?piwik_campaign=RSS&amp;piwik_kwd=721#footnote_5_721" id="identifier_5_721" class="footnote-link footnote-identifier-link" title="Das Dropdowfeld in der Suchleiste ver&auml;ndert die Farbe">6</a></sup>, dass es was zu suchen bei euch gibt.</p>
<p>Ich hoffe es konnte euch helfen, und es sprießen jetzt die Suchplugins nur so aus dem Boden. (Würde mich über Feedback freuen)</p>
<ol class="footnotes"><li id="footnote_0_721" class="footnote">der noch zu erwarten ist *hust hust*</li><li id="footnote_1_721" class="footnote">Man, der Gedanke meine Seite neben Seiten wie Google, Wikipedia, Amazon und Co stehen zu haben ist nen tolles gefühl <img src='http://sebastian.thiele.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </li><li id="footnote_2_721" class="footnote">Original siehe <a href="https://developer.mozilla.org/en/Creating_OpenSearch_plugins_for_Firefox" target="_blank">hier</a></li><li id="footnote_3_721" class="footnote">mit WordPress</li><li id="footnote_4_721" class="footnote">Erst ab FF Version 3.1 möglich</li><li id="footnote_5_721" class="footnote">Das Dropdowfeld in der Suchleiste verändert die Farbe</li></ol>]]></content:encoded>
			<wfw:commentRss>http://sebastian.thiele.me/blog/ich-nun-auch-mit-ff-searchplugin/721?piwik_campaign=RSS&amp;piwik_kwd=721/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bee5 Firefox Searchplugin v1.0</title>
		<link>http://sebastian.thiele.me/blog/bee5-firefox-searchplugin-v10/692?piwik_campaign=RSS&amp;piwik_kwd=692</link>
		<comments>http://sebastian.thiele.me/blog/bee5-firefox-searchplugin-v10/692?piwik_campaign=RSS&amp;piwik_kwd=692#comments</comments>
		<pubDate>Thu, 19 Mar 2009 12:42:30 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Bee5]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Geld]]></category>
		<category><![CDATA[Geldverdienen]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[Suche]]></category>
		<category><![CDATA[sudo]]></category>
		<category><![CDATA[Tipp]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[Werbung]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.sebastian-thiele.net/?p=692</guid>
		<description><![CDATA[Bee5, das Unternehmen, welches Geld zurück gibt beim Einkauf in über 3.000 Onlineangeboten1, hat eine (wie ich finde) super Geschäftsidee (Erweiterung) im Programm; die sogenannte Developer-Corner. Interessierte Leute können Plugins, Erweiterungen, Programme und vieles mehr bauen und bekommen dafür 2% der generierten Einnahmen, die das jeweilige Programm erzielt2. Auch ich habe mich rangesetzt und eine [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://bee5.de/bee80s9s9E2"><img class="aligncenter size-full wp-image-693" title="top_bee51" src="http://blog.sebastian-thiele.net/wp-content/uploads/top_bee51.png" alt="top_bee51" width="500" height="200" /></a><a href="http://bee5.de/bee80s9s9E2" target="_blank">Bee5</a>, das Unternehmen, welches Geld zurück gibt beim Einkauf in über 3.000 Onlineangeboten<sup><a href="http://sebastian.thiele.me/blog/bee5-firefox-searchplugin-v10/692?piwik_campaign=RSS&amp;piwik_kwd=692#footnote_0_692" id="identifier_0_692" class="footnote-link footnote-identifier-link" title="eigene Angaben">1</a></sup>, hat eine (wie ich finde) super Geschäftsidee (Erweiterung) im Programm; die sogenannte Developer-Corner. Interessierte Leute können Plugins, Erweiterungen, Programme und vieles mehr bauen und bekommen dafür 2% der generierten Einnahmen, die das jeweilige Programm erzielt<sup><a href="http://sebastian.thiele.me/blog/bee5-firefox-searchplugin-v10/692?piwik_campaign=RSS&amp;piwik_kwd=692#footnote_1_692" id="identifier_1_692" class="footnote-link footnote-identifier-link" title="Was auch der Grund daf&uuml;r ist, das ich hier noch einmal Werbung daf&uuml;r mache">2</a></sup>.</p>
<p>Auch ich habe mich rangesetzt und eine klitzekleine, aber sehr nützliche Erweiterung für den Firefox(FF) geschrieben. Eigentlich ist es keine Erweiterung, viel mehr ein Suchplugin<sup><a href="http://sebastian.thiele.me/blog/bee5-firefox-searchplugin-v10/692?piwik_campaign=RSS&amp;piwik_kwd=692#footnote_2_692" id="identifier_2_692" class="footnote-link footnote-identifier-link" title="In neudeutsch ein Searchplugin">3</a></sup>, welches sich nach der wirklich simplen Installation in das Suchmaschienenfeld von Firefox einhängt und einen einfachen Weg bietet, Bee5 Links zu erzeugen. Und so geht es:</p>
<p><strong>01 Auf der Tool-Seite von Bee5 das Tool aktivieren</strong></p>
<p>Du gehst auf die Webseite von <a href="http://bee5.de/bee80s9s9E2" target="_blank">Bee5</a>, logst dich ein<sup><a href="http://sebastian.thiele.me/blog/bee5-firefox-searchplugin-v10/692?piwik_campaign=RSS&amp;piwik_kwd=692#footnote_3_692" id="identifier_3_692" class="footnote-link footnote-identifier-link" title="Wenn du noch nicht angemeldet bist, kannst du das gleich tun und 2,00 Euro Begr&uuml;&szlig;ungsgeld (wie wir Ossis Sagen w&uuml;rden) bekommen.">4</a></sup> und betrittst die <a href="http://bee5.de/my/tools.html?r=bee80s9s9E2" target="_blank">Tool-Seite von Bee5</a>. Auf dieser Seite werden alle Tools vorgestellt, die bereits existieren. Natürlich wollen wir hier das <strong>Bee5 Firefox Searchplugin</strong> haben und somit klickst du <a href="http://bee5.de/my/tools-detail.html?h=1kB01Cnx5e&amp;r=bee80s9s9E2" target="_blank">das an</a>. Nachdem du den Download angestoßen hast, kommst du auf eine kleine Seite, die dich einige Einstellungen ändern lässt (zum Beispiel Art des Links und Linklänge). Mit der Bestätigung der Einstellungen, bekommst du eine XML Datei zum Download angeboten.</p>
<p><strong>02 Die Installation</strong></p>
<p>Nach dem Download der XML Datei muss diese nur in das Searchpluginverzeichnis des Firefox gespeichert werden. Davon gibt es zwei. 1. das eigene Verzeichnis;  dieses befindet sich innerhalb deiner eigenen Ordnerstruktur (unter eigene Dateien oder in eurem Homeverzeichnis). 2. das globale Verzeichnis; dieses befindet sich unterhalb des Installationsverzeichnisses des FF und ist für alle Benutzer an diesem Rechner zuständig. Um in diesem Verzeichnis etwas zu ändern, brauchst du Admin- bzw. root-Rechte.<sup><a href="http://sebastian.thiele.me/blog/bee5-firefox-searchplugin-v10/692?piwik_campaign=RSS&amp;piwik_kwd=692#footnote_4_692" id="identifier_4_692" class="footnote-link footnote-identifier-link" title="TIPP: Wenn mehrere Menschen an einem Rechner sitzen, z.B. ein Familienrechner oder ein B&uuml;rorechner ODER GAR ein Server, an dem viele Benutzer arbeiten, versucht das Plugin in das globale Verzeichnis zu bekommen, denn so k&ouml;nnen alle Benutzer f&uuml;r euch Geld verdienen   ">5</a></sup> Im Folgenden will ich die Ordner kurz benennen, in denen das Plugin gespeichert sein muss. Natürlich können diese Pfade von Installation zu Installation abweichen.<sup><a href="http://sebastian.thiele.me/blog/bee5-firefox-searchplugin-v10/692?piwik_campaign=RSS&amp;piwik_kwd=692#footnote_5_692" id="identifier_5_692" class="footnote-link footnote-identifier-link" title="Leider kann ich nur f&uuml;r Windows und Linux (Debian &amp;amp; Ubuntu) reden, da ich von MacOS (was auch unterst&uuml;tzt wird) und Firefox LEIDER NOCH keine Ahnung habe">6</a></sup>:</p>
<ul>
<li>Windows:
<ul>
<li>Lokales Verzeichnis (Nur für einen Benutzer):<br />
Kopiere die XML-Datei in den Ordner: leider ist mir der Pfad gerade nicht bekannt, da ich kein Windows habe</li>
<li>Globales Verzeichnis (Alle Benutzer):<br />
Kopiere die XML-Datei in den Ordner: $LAUFWERK:\$INSTALLATIONSPFAD\searchplugins</li>
</ul>
</li>
<li>Linux (Ubuntu &amp; Debian)
<ul>
<li>Lokales Verzeichnis (Nur für einen Benutzer):<br />
Kopiere die XML-Datei in den Ordner: ~/.mozilla/firefox/$PROFILORDNER/searchplugins/</li>
<li>Globales Verzeichnis (Alle Benutzer) (Du brauchst root/ sudo Rechte):<br />
Kopiere die XML-Datei in den Ordner: /usr/lib/firefox-$VERSION/searchplugins/</li>
</ul>
</li>
</ul>
<p>$LAUFWERK = der Buchstabe deines Laufwerkes (normalerweise C)<br />
$BENUTZERNAME = dein Benutzername (z.B. Administrator, Hansi, &#8230;)<br />
$INSTALLATIONSPFAD = z.B. c:\windows\mozilla firefox oder /<br />
$PROFILORDNER = irgendwelche Zahlen und Buchstaben PUNKT eurem Profil (Normalerweise <em>default</em>, es sei denn ihr habt mehrere)<br />
$VERSION = die aktuell benutzte Firefoxversion</p>
<p><img class="alignright size-thumbnail wp-image-694" title="searchengine_list" src="http://blog.sebastian-thiele.net/wp-content/uploads/searchengine_list-125x150.png" alt="searchengine_list" width="125" height="150" />Nach der Installation muss der Firefox neugestartet werden. Danach solltest du in deiner Suchmaschinensuchleiste den Bee5 Eintrag finden. Nun kannst du den Bee5 Eintrag auswählen, so dass er aktiv ist. <img class="alignnone size-full wp-image-695" title="searchengine_bee5" src="http://blog.sebastian-thiele.net/wp-content/uploads/searchengine_bee5.png" alt="searchengine_bee5" width="252" height="31" /></p>
<p>Ab sofort kannst du (oder auch deine Rechnermitbenutzer) bequem und einfach den Link der umzuwandelnden Seite in das Suchfeld eingeben, ohne erst die bee5 Seite öffnen zu müssen.</p>
<p>Adresse aus der Adressleiste kopieren, in das Suchfeld eingeben und mit Enter umwandeln lassen.</p>
<p>Auf der Seite, auf die du gelangst, wird dir der umgewandelte Link angezeigt, so dass du auch die Möglichkeit hast, ihn an Andere weiter zu geben. Nach einer gewissen Zeit wirst du auf die entsprechende Seite weitergeleitet. Du kannst es natürlich auch verkürzen, indem du auf den Link klickst.</p>
<p>Du wandelst damit eine Adresse in einen bezahlten Bee5 Link in weniger als 4 Klicks um.<sup><a href="http://sebastian.thiele.me/blog/bee5-firefox-searchplugin-v10/692?piwik_campaign=RSS&amp;piwik_kwd=692#footnote_6_692" id="identifier_6_692" class="footnote-link footnote-identifier-link" title="Ich gehe davon aus, dass das Plugin ausgew&auml;hlt ist und du die Tastenkombinationen zum Kopieren ([Strg] + [C]) und zum Einf&uuml;gen ([Strg] + [V]) nutzt.">7</a></sup></p>
<ol class="footnotes"><li id="footnote_0_692" class="footnote">eigene Angaben</li><li id="footnote_1_692" class="footnote">Was auch der Grund dafür ist, das ich hier noch einmal Werbung dafür mache</li><li id="footnote_2_692" class="footnote">In neudeutsch ein Searchplugin</li><li id="footnote_3_692" class="footnote">Wenn du noch nicht angemeldet bist, kannst du das gleich tun und 2,00 Euro Begrüßungsgeld (wie wir Ossis Sagen würden) bekommen.</li><li id="footnote_4_692" class="footnote">TIPP: Wenn mehrere Menschen an einem Rechner sitzen, z.B. ein Familienrechner oder ein Bürorechner ODER GAR ein Server, an dem viele Benutzer arbeiten, versucht das Plugin in das globale Verzeichnis zu bekommen, denn so können alle Benutzer für euch Geld verdienen <img src='http://sebastian.thiele.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  </li><li id="footnote_5_692" class="footnote">Leider kann ich nur für Windows und Linux (Debian &amp; Ubuntu) reden, da ich von MacOS (was auch unterstützt wird) und Firefox LEIDER NOCH keine Ahnung habe</li><li id="footnote_6_692" class="footnote">Ich gehe davon aus, dass das Plugin ausgewählt ist und du die Tastenkombinationen zum Kopieren ([Strg] + [C]) und zum Einfügen ([Strg] + [V]) nutzt.</li></ol>]]></content:encoded>
			<wfw:commentRss>http://sebastian.thiele.me/blog/bee5-firefox-searchplugin-v10/692?piwik_campaign=RSS&amp;piwik_kwd=692/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Mailadresse auf webseiten vor Spam schützen (Grafik)</title>
		<link>http://sebastian.thiele.me/blog/mailadresse-auf-webseiten-vor-spam-schutzen-grafik/649?piwik_campaign=RSS&amp;piwik_kwd=649</link>
		<comments>http://sebastian.thiele.me/blog/mailadresse-auf-webseiten-vor-spam-schutzen-grafik/649?piwik_campaign=RSS&amp;piwik_kwd=649#comments</comments>
		<pubDate>Tue, 03 Mar 2009 10:34:28 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Benutzerfreundlichkeit]]></category>
		<category><![CDATA[Bilder]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[Inhalt]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Spam]]></category>
		<category><![CDATA[spamgourmet]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[Webseiten]]></category>

		<guid isPermaLink="false">http://blog.sebastian-thiele.net/?p=649</guid>
		<description><![CDATA[Ich arbeite gerade an einem &#8220;kleinen&#8221; Projekt1. Dabei werden Daten von Firmen öffentlich dargestellt. Um nun den Firmen zumindest von dieser Seite aus keinen Spam zu zuschanzen, habe ich mich dazu entschlossen, die Mailadressen der Firmen nicht im klartext, und auch nicht in einer &#8220;Verschlüsselten&#8221; Form (@ wird zu (at) usw) anzuzeigen, sondern sie relativ [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-650" title="top_mailgrafik" src="http://blog.sebastian-thiele.net/wp-content/uploads/top_mailgrafik.png" alt="top_mailgrafik" width="500" height="200" />Ich arbeite gerade an einem &#8220;kleinen&#8221; Projekt<sup><a href="http://sebastian.thiele.me/blog/mailadresse-auf-webseiten-vor-spam-schutzen-grafik/649?piwik_campaign=RSS&amp;piwik_kwd=649#footnote_0_649" id="identifier_0_649" class="footnote-link footnote-identifier-link" title="Was auch erkl&auml;rt, warum hier in den letzten Tagen (und warscheinlich auch in den n&auml;chsten Tagen) wenig neues los war.">1</a></sup>. Dabei werden Daten von Firmen öffentlich dargestellt. Um nun den Firmen zumindest von dieser Seite aus keinen Spam zu zuschanzen, habe ich mich dazu entschlossen, die Mailadressen der Firmen nicht im klartext, und auch nicht in einer &#8220;Verschlüsselten&#8221; Form (@ wird zu (at) usw) anzuzeigen, sondern sie relativ Spamsicher art als Grafik dazustellen. Und wie man das Technisch macht, und was es bringt will ich hier einmal beschreiben.<span id="more-649"></span></p>
<h3>Warum ist es sinnvoll Mailadressen als Grafiken anzuzeigen?</h3>
<p>Die Personen, die (finanzielles) Interesse daran haben Emailadressen aus dem Internet heraus zu holen sind immer dabei Ihre &#8220;Dienste&#8221; zu verbessern. Eine Emailadresse aller test@test.de<sup><a href="http://sebastian.thiele.me/blog/mailadresse-auf-webseiten-vor-spam-schutzen-grafik/649?piwik_campaign=RSS&amp;piwik_kwd=649#footnote_1_649" id="identifier_1_649" class="footnote-link footnote-identifier-link" title="Gibt es die Mailadresse eigentlich? Wenn Ja, wird da sicher nen Haufen Spam drauf ankommen, ich kenne viele, die diese Mailadresse als Beispiel nutzen">2</a></sup> ist dabei schnell aufgefunden und in ihr System übertragen. Mailadressen haben einen ungeahnten Nachteil, wenn es darum geht sie Automatisiert aufzufinden. Sie haben eine vorgegebene Syntax (Schreibweise). So muss immer ein @ und (mind.) ein Punkt enthalten sein. Somit kann man eine Mailadresse recht einfach mit Regulären Ausdrücken ausfindig machen <strong>([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}</strong> . Auch die (mehr oder weniger) erfolgreichen Versuche Mailadressen zu &#8220;Codieren&#8221; sind auf dauer gesehen eher weniger wirkungslos. Auch die Spamsammler betrachten sich ab und an mal Webseiten und können ihre Suche ohne weiteres auf (at), [at], &lt;at&gt;, (punkt), [punkt], &lt;punkt&gt; und was es da nicht alles gibt einstellen. Der Zeitaufwand, den die Maschienen für duzende von varianten brauchen sind so gering und kosten die Adresshändler kaum etwas<sup><a href="http://sebastian.thiele.me/blog/mailadresse-auf-webseiten-vor-spam-schutzen-grafik/649?piwik_campaign=RSS&amp;piwik_kwd=649#footnote_2_649" id="identifier_2_649" class="footnote-link footnote-identifier-link" title="Botnetze sei dank">3</a></sup>.<br />
Da gibt es ja noch die zahlreichen varianten Mailadressen per JavaScript zu codieren und bei einem klick wieder zu entschlüsseln. Die Spamrobotter können (meines wissens) kein JS. Damit ist es eine Sinnvolle Sache, wenn da nicht die Besucher sind, die JavaScript in ihrem Browser ausgestellt haben. (Die sehen keine Mailadressen)</p>
<p>So genug damit die anderen Methoden schlecht zu machen. Warum nun Grafiken? Meines Wissens ist es sehr schwer und kompliziert Text von Grafiken abzulesen. Besonders dann, wenn der Kontrast (Vordergrund zu Hintergrund) sehr gering ist. (Dazu später mehr). Die Roboter können somit den Text auf den Grafiken nicht auslesen und ihnen bleibt der Inhalt verborgen. Doch Achtung, man macht die gesamte wirkung wieder kaputt, wenn man die Mailadresse beispielsweise als alt-Atribut an das IMG Tag anhängt. (Doch auch dazu gleich mehr). Nach dem gleichen Prinzip funtionieren auch die Image Catcher die man beispielsweise beim anmelden auf einigen Seiten ausfüllen muss.</p>
<h3>Welche Nachteile bringt es mit sich?</h3>
<p>Alles hat eine Schattenseite, so auch diese Methode. Dadurch, dass die Mailadresse als Bild angezeigt wird, und wir das alt-Atribut des IMG-Tags nicht sinnvoll belegen dürfen schließen wird Besucherkreise vollkommen aus. Gemeint sind die Benutzer, die a) Grafiken in ihrem Browser (zum Traffic sparen) ausgestellt haben b) Benutzer, die mit einem reinen Texteditor unterwegs sind<sup><a href="http://sebastian.thiele.me/blog/mailadresse-auf-webseiten-vor-spam-schutzen-grafik/649?piwik_campaign=RSS&amp;piwik_kwd=649#footnote_3_649" id="identifier_3_649" class="footnote-link footnote-identifier-link" title="Ja die gibt es immernoch">4</a></sup> und c) (fast am wichtigsten) Benutzer mit einer Beeinträchtigung im Sehvermögen. Benutzer aus der letzen Zielgruppe lassen sich meist Webseiten vorlesen, in Blindenschrift übersetzen oder  versuchen diese durch besondere Browsereinstellungen der Webseite zu vergrößern.<sup><a href="http://sebastian.thiele.me/blog/mailadresse-auf-webseiten-vor-spam-schutzen-grafik/649?piwik_campaign=RSS&amp;piwik_kwd=649#footnote_4_649" id="identifier_4_649" class="footnote-link footnote-identifier-link" title="Thema Barierefreiheit SEHR WIRCHTIG">5</a></sup> Beim übersetzen/ vorlesen lassen wandeln sich die Vorteile der Grafiken gegen Spammer auf einmal in Nachteile gegen unsere Besucher. Auch die Software, die diese Übersetzungen macht kann den Inhalt dieser Bilder nicht erkennen, und übersetzen/ Vorlesen. Und die Benutzer, die mit einer vergrößerten Schriftart unterwegs sind, können die Grafiken nicht erkennen, da sie sich nicht mit vergrößern lassen. Zudem kann es vorkommen, wenn man die Grafiken auf einem anderen Server speichert/ erzeugen lässt, dass die Grafiken nicht erreichbar sind.</p>
<p>Aufgrund all dieser Nachteile ist der Einsatz dieser Methode im (deutschen) Impressum nicht erlaubt. Aber für ein Impressum empfehle ich eh die <a href="http://blog.sebastian-thiele.net/2009/01/22/nie-mehr-spam-mit-spamgourmetcom/" target="_blank">Verwendung von Spamgourmet Adressen</a>.</p>
<h3>Wie wird es technisch (in PHP) umgesetzt?</h3>
<p>Zur Umsetzung dieser Technik habe ich mir das Programm von &#8220;mike at mike-griffiths dot co dot uk&#8221; von <a href="http://de3.php.net/manual/de/function.imagestring.php" target="_blank">de3.php.net</a> als Vorbild genommen.</p>
<p>Zunächst einmal einmal die Verarbeitung des Bildes in einer PHP Datei (bei mir heißt sie email.php)</p>
<pre lang="php">&lt;?php
// Den String der Mailadresse erst zurückübersetzen und dann
// als $string speichern
$erse = Array("@", ".");
$such = Array("_++_", "_+_");
$string  = str_replace($such, $erse, $_GET[value]);

// Schriftgröße setzen
$font_size = 2;

// Breite des Bildes berechnen (Abhängig von Schriftgröße
$width  = imagefontwidth($font_size)*strlen($string);
// Höhe so setzen, dass die Schrift auch raufpasst
$height = imagefontheight($font_size);
// Rohgerüst des Bildes erstellen
$img = imagecreate($width,$height);
// Hintergrundfarbe (Anpassen auf eigene BG-Color
$bg    = imagecolorallocate($img, 255, 255, 255);
// Schriftfarbe (selbstwehlbar (siehe Verbesserungen))
$color = imagecolorallocate($img, 240, 145, 71);
// Stringlänge
$len = strlen($string);
// Y-Koordinate des Zeichens, X ändern, Y ist fest
$ypos = 0;
// Durch den String laufen
for($i=0;$i&lt;$len;$i++){
// Position des Zeichens horizontal
$xpos = $i * imagefontwidth($font_size);
// "Zeichne" Zeichen
imagechar($img, $font_size, $xpos, $ypos, $string, $color);
// Entferne Zeichen aus dem String
$string = substr($string, 1);

}
// Headertyp um als Img angezeigt zu werden
header("Content-Type: image/gif");
imagegif($img);
// Und bild wieder löschen (Speicheraufräumen)
imagedestroy($img);
?&gt;</pre>
<p>Ich denke es ist alles selbsterklärend. Das einzigste ws zu erklären wäre sind die Zeilen 4-6 aber das wird sicherlich jetzt klar, wenn ich meinen Aufruf dieser &#8220;Grafik&#8221; zeige:</p>
<pre lang="php">&lt;?php
/* Umwandeln der Markanten Zeichen in FREI wählbare Zeichen, um bei der Übergabe
 * an die php Datei keinen "Verdacht" zu erzeugen
 */
$such = Array("@", ".");
$erse = Array("_++_", "_+_");
$emailadcode = str_replace($such, $erse, "test@test.de");
// Aufrufen der PHP Datei mit Übergabe der codieren Mailadresse (wie immer)
echo "eMail: &lt;img src=\"/img/email.php?value=$emailadcode\" alt=\"Zum Schutz vor Spam wird diese Mailadresse als Grafik angezeigt. Wir bitten dies zu entschuldigen.\" /&gt;";
// Achtet bitte auf das alt-Atribut, um auch Menschen eine Erklärung zu geben, die keine Bilder sehen
?&gt;</pre>
<h3>Wie kann man das ganze (theoretisch) noch optimieren?</h3>
<p>Es ist alles erlaubt, um den Spamrobotern das &#8220;Leben&#8221; zu erschweren. Denkbar ist dabei:</p>
<ul>
<li>Die Schriftfarbe in einem möglichst geringen Kontrast zur Hintergrundfarbe halten (Achtung Benutzerfreundlichkeit)</li>
<li>Die Emailadresse zwei teilen. Entweder horizontal oder Vertikal. Selbst wenn ein Roboter den Inhalt auslesen kann, kann er mit der halben Adresse wenig anfangen. Ich Empfehle die Teilung in horizontaler Ebene.</li>
</ul>
<p>Ich hoffe euch hat meine Erklärung gefallen. Für Anregungen und verbesserungen bin ich stets dankbar.</p>
<ol class="footnotes"><li id="footnote_0_649" class="footnote">Was auch erklärt, warum hier in den letzten Tagen (und warscheinlich auch in den nächsten Tagen) wenig neues los war.</li><li id="footnote_1_649" class="footnote">Gibt es die Mailadresse eigentlich? Wenn Ja, wird da sicher nen Haufen Spam drauf ankommen, ich kenne viele, die diese Mailadresse als Beispiel nutzen</li><li id="footnote_2_649" class="footnote">Botnetze sei dank</li><li id="footnote_3_649" class="footnote">Ja die gibt es immernoch</li><li id="footnote_4_649" class="footnote">Thema Barierefreiheit SEHR WIRCHTIG</li></ol>]]></content:encoded>
			<wfw:commentRss>http://sebastian.thiele.me/blog/mailadresse-auf-webseiten-vor-spam-schutzen-grafik/649?piwik_campaign=RSS&amp;piwik_kwd=649/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>RoR: Session über die Datenbank ohne Fehler</title>
		<link>http://sebastian.thiele.me/blog/ror-session-uber-die-datenbank-ohne-fehler/547?piwik_campaign=RSS&amp;piwik_kwd=547</link>
		<comments>http://sebastian.thiele.me/blog/ror-session-uber-die-datenbank-ohne-fehler/547?piwik_campaign=RSS&amp;piwik_kwd=547#comments</comments>
		<pubDate>Thu, 12 Feb 2009 20:01:22 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[Fehler]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[RoR]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.sebastian-thiele.net/?p=547</guid>
		<description><![CDATA[In meinen unzähligen Stunden, und meiner hohen Erfahrung mit Ruby on Rails1 ist mir dabei ein Fehler aufgefallen2 Aktiviert3 man in der config/enviroment.rb, dass man Sessions in der Datenbank speichern möchte ergibt sich da ein Problem. Zunächst einmal das Auskommentieren, in der config/envirement.rb: # Use the database for sessions instead of the cookie-based default, # [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-549" title="top_ruby_session" src="http://blog.sebastian-thiele.net/wp-content/uploads/top_ruby_session.png" alt="top_ruby_session" width="500" height="200" />In meinen unzähligen Stunden, und meiner hohen Erfahrung mit Ruby on Rails<sup><a href="http://sebastian.thiele.me/blog/ror-session-uber-die-datenbank-ohne-fehler/547?piwik_campaign=RSS&amp;piwik_kwd=547#footnote_0_547" id="identifier_0_547" class="footnote-link footnote-identifier-link" title="Ich lerne es gerade RoR mit hilfe des wirklich genialen Buches: Agile Web Development with Rails. G&uuml;nstig zu bekommen in der Secound Edition oder ab M&auml;rz 09 in der neusten Auflage">1</a></sup> ist mir dabei ein Fehler aufgefallen<sup><a href="http://sebastian.thiele.me/blog/ror-session-uber-die-datenbank-ohne-fehler/547?piwik_campaign=RSS&amp;piwik_kwd=547#footnote_1_547" id="identifier_1_547" class="footnote-link footnote-identifier-link" title="Mal abgesehen das in der neusten Version kein scaffolding verf&uuml;gbar ist">2</a></sup></p>
<p>Aktiviert<sup><a href="http://sebastian.thiele.me/blog/ror-session-uber-die-datenbank-ohne-fehler/547?piwik_campaign=RSS&amp;piwik_kwd=547#footnote_2_547" id="identifier_2_547" class="footnote-link footnote-identifier-link" title="Kommentiert man aus">3</a></sup> man in der config/enviroment.rb, dass man Sessions in der Datenbank speichern möchte ergibt sich da ein Problem.</p>
<p>Zunächst einmal das Auskommentieren, in der config/envirement.rb:</p>
<pre># Use the database for sessions instead of the cookie-based default,
# which shouldn't be used to store highly confidential information
# (create the session table with "rake db:sessions:create")
<strong>  config.action_controller.session_store = :active_record_store</strong></pre>
<p>Danach legt man die Datenbank-migration an:</p>
<pre>$ rake db:session:create
$ rake db:migrate</pre>
<p>Nun noch den Server neu starten und schon bekommt man folgenden Fehler:</p>
<p>No :secret given to the #protect_from_forgery call.  Set that or use a session store capable of generating its own keys (Cookie Session Store).</p>
<p>Diesen Fehler kann man aber<sup><a href="http://sebastian.thiele.me/blog/ror-session-uber-die-datenbank-ohne-fehler/547?piwik_campaign=RSS&amp;piwik_kwd=547#footnote_3_547" id="identifier_3_547" class="footnote-link footnote-identifier-link" title="Und f&uuml;r diesen Hinweis, danke ich Justin Ball und seinen Blog">4</a></sup> beheben, indem man in der app/controllers/application.rb die folgende Zeile auskommentiert.</p>
<pre># See ActionController::RequestForgeryProtection for details
# Uncomment the :secret if you're not using the cookie session store
<strong># protect_from_forgery # :secret =&gt; 'e4c718c85b37ffad4702ac57fd6c58ac'</strong></pre>
<p>Server nochmal neu starten und es kann weiter gehen.</p>
<ol class="footnotes"><li id="footnote_0_547" class="footnote">Ich lerne es gerade RoR mit hilfe des wirklich genialen Buches: Agile Web Development with Rails. Günstig zu bekommen in der <a href="http://www.amazon.de/gp/product/0977616630?ie=UTF8&amp;tag=sebatde-21&amp;linkCode=as2&amp;camp=1638&amp;creative=19454&amp;creativeASIN=0977616630" target="_blank">Secound Edition</a> oder ab <a href="http://www.amazon.de/gp/product/1934356166?ie=UTF8&amp;tag=sebatde-21&amp;linkCode=as2&amp;camp=1638&amp;creative=19454&amp;creativeASIN=1934356166" target="_blank">März 09 in der neusten Auflage</a></li><li id="footnote_1_547" class="footnote">Mal abgesehen das in der neusten Version kein scaffolding verfügbar ist</li><li id="footnote_2_547" class="footnote">Kommentiert man aus</li><li id="footnote_3_547" class="footnote">Und für diesen Hinweis, danke ich <a href="http://www.justinball.com/2008/02/07/secret-given-to-the-protect_from_forgery-call/" target="_blank">Justin Ball und seinen Blog</a></li></ol>]]></content:encoded>
			<wfw:commentRss>http://sebastian.thiele.me/blog/ror-session-uber-die-datenbank-ohne-fehler/547?piwik_campaign=RSS&amp;piwik_kwd=547/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ruby on Rails und Subversion</title>
		<link>http://sebastian.thiele.me/blog/ruby-on-rails-und-subversion/524?piwik_campaign=RSS&amp;piwik_kwd=524</link>
		<comments>http://sebastian.thiele.me/blog/ruby-on-rails-und-subversion/524?piwik_campaign=RSS&amp;piwik_kwd=524#comments</comments>
		<pubDate>Wed, 11 Feb 2009 14:00:13 +0000</pubDate>
		<dc:creator>Sebastian</dc:creator>
				<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Webseiten]]></category>
		<category><![CDATA[Anleitung]]></category>
		<category><![CDATA[Buch]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[Fehler]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[user]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.sebastian-thiele.net/?p=524</guid>
		<description><![CDATA[Ich beginne gerade damit Ruby on Rails zu erlernen. Und gerade als Anfänger passiert es sehr schnell, dass man mal einen Fehler macht, den man so ohne weiteres nicht wieder ausbessern kann. In so einem Fall (aber auch in jedem anderen) mit einer Versionierungsmöglichkeit, wie beispielsweise Subversion zu arbeiten. Ich habe Bereits ein paar mal [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-525" title="top_ruby_svn" src="http://blog.sebastian-thiele.net/wp-content/uploads/top_ruby_svn.png" alt="top_ruby_svn" width="500" height="200" />Ich beginne gerade damit Ruby on Rails zu erlernen. Und gerade als Anfänger passiert es sehr schnell, dass man mal einen Fehler macht, den man so ohne weiteres nicht wieder ausbessern kann. In so einem Fall (aber auch in jedem anderen) mit einer Versionierungsmöglichkeit, wie beispielsweise Subversion zu arbeiten. <a href="http://blog.sebastian-thiele.net/tag/subversion/" target="_self">Ich habe Bereits ein paar mal über SVN geschrieben.</a> Subversion bietet sich nicht nur an, wenn man es vermeiden will, Fehler in Programmen wieder ungeschehen zu machen, sondern auch beim arbeiten im Team ist SVN hilfreich. Wie ich so mitbekommen habe gehört die verbindung Rails &amp; SVN zum defakto Standart. Darum will ich hier mal ein paar Sachen beschreiben, um auch Anfängern den Umgang mit diesen beiden Techniken zu erleichtern.</p>
<p><span id="more-524"></span>Zunächst einmal sollte natürlich SVN installiert sein. Darauf gehe ich hier nicht weiter darauf ein, denn es gibt ja bereits eine Anleitung von mir.<sup><a href="http://sebastian.thiele.me/blog/ruby-on-rails-und-subversion/524?piwik_campaign=RSS&amp;piwik_kwd=524#footnote_0_524" id="identifier_0_524" class="footnote-link footnote-identifier-link" title="Subversion unter Debian installieren">1</a></sup></p>
<p>Am besten sollte im Vorfeld überlegt werden, wie das Projekt heißen soll. In diesem Fall soll der Name des Projektes <strong>demo</strong> sein. Für dieses Projekt wird ein SVN-Projekt angelegt:<sup><a href="http://sebastian.thiele.me/blog/ruby-on-rails-und-subversion/524?piwik_campaign=RSS&amp;piwik_kwd=524#footnote_1_524" id="identifier_1_524" class="footnote-link footnote-identifier-link" title="Beispielhaft wird hier auf einem Linux-System gearbeitet. Die Alternativen Befehle f&uuml;r Windows sind u.a. ls = dir ">2</a></sup><sup><a href="http://sebastian.thiele.me/blog/ruby-on-rails-und-subversion/524?piwik_campaign=RSS&amp;piwik_kwd=524#footnote_2_524" id="identifier_2_524" class="footnote-link footnote-identifier-link" title="Alle Zeilen mit $ beginnend sind eingaben in die Komandozeile. Alle Zeilen ohne, sind ausgaben auf der Komandozeile">3</a></sup></p>
<pre>$ <strong>svnadmin create /Pfad/zu/den/SVN/Projekten/demo</strong>
$ <strong>ls /Pfad/zu/den/SVN/Projekten/demo</strong></pre>
<p><img class="aligncenter size-full wp-image-528" title="01" src="http://blog.sebastian-thiele.net/wp-content/uploads/01.png" alt="01" width="500" height="38" /><strong>Anmerkung:</strong> Ich habe einmal den Fehler gemacht, mein SVN-Projekt Rails_demo zu nennen, obwohl mein Rails-Projekt<sup><a href="http://sebastian.thiele.me/blog/ruby-on-rails-und-subversion/524?piwik_campaign=RSS&amp;piwik_kwd=524#footnote_3_524" id="identifier_3_524" class="footnote-link footnote-identifier-link" title="Ich bitte vielmals um Entschuldigung, sollte mir im laufe der Zeit auch mal &amp;#8220;Ruby-Projekt&amp;#8221; rausrutschen">4</a></sup> nur demo hieß. Dies führt im späteren dazu, dass auch das Rails-Projekt Rails_demo heißt. Rails mag es aber scheinbar gar nicht, wenn Projekte nach dem erstellen umgenannt werden.</p>
<p>Nachdem das SVN-Projekt erstellt wurde, muss nun noch das Rails-Projekt erstellt werden:</p>
<pre>$ <strong>rails demo --database=mysql</strong>
create
create  app/controllers
create  app/helpers
create  app/models
create  app/views/layouts
create  config/environments
create  config/initializers
create  db
create  doc
create  lib
create  lib/tasks
...</pre>
<p>Das ist ja alles nichts neues. Nun kann aber einiges Eingestellt werden, damit SVN auch optimal genutzt wird.</p>
<p><strong>SVN Einstellen</strong></p>
<pre>$ <strong>cd demo</strong>
$ <strong>svn import -m "initial import" . file:///Pfad/zu/den/SVN/Projekten/demo</strong>
A   demo/test
A   demo/test/unitL
...
Commited revision 1.</pre>
<p>Mit diesem Befehl wird das aktuelle Projekt in das SVN aufgenommen.</p>
<p><strong>Anmerkung:</strong> Wichtig ist an dieser Stelle der PUNKT. Er bezieht sich auf den Ort, ab dem Importiert werden soll. der PUNKT ist dabei das aktuelle Verzeichnis.</p>
<p>Jetzt muss das gerade eingecheckte Projekt auch wieder ausgecheckt werden, um veränderungen vorzunehmen. Dazu muss das bestehende Rails-Projekt gelöscht werden. Keine Angst, es wurde je gerade gesichert, wem das aber zu heikel ist, dem wird empfohlen das Projekt nicht zu löschen sondern zu verschieben:</p>
<pre>$ <strong>cd ..</strong>
$ <strong>mv demo demo_backup</strong></pre>
<p>Nun muss das neue Projekt wieder ausgecheckt werden:</p>
<pre>$ <strong>svn checkout file:///Pfad/zu/den/SVN/Projekten/demo</strong>
...
Checked out revision 1.
$ <strong>cd demo</strong></pre>
<p>In dem wieder zurückgeholten Projekt müssen nun einige Sachen eingestellt werden. Beispielsweise ist es nicht angebracht (gerade bei Teamarbeit) die Log-Dateien und die config/database.yml-Datei zu versionieren. Jedes Teammitglied hat seine Eigenen Logs und Datenbankeinstellungen. Gerade letzteres in verbindung mit migrations ist ein wansiniger Vorteil von Rails (wie ich finde).</p>
<p>Nun werden wir SVN anweisen die Log-Dateien zu entfernen.</p>
<pre>$ <strong>svn remove log/*</strong>
...
$ <strong>svn commit -m "removed log files"</strong>
...
Commit revision 2.

Nun muss SVN mitgeteilt werden, dass evtl. neu erzeigte Log-Files weiterhin ignoriert werden sollen.

$ <strong>svn propset svn:ignore "*.log" log/</strong>
property 'svn:ignore' set on 'log'
$ <strong>svn update log/</strong>
At revision 2.
$ <strong>svn commit -m "svn ignore for new log/*.log files</strong>"
...
Commited revision 3.</pre>
<p>Ähnlich muss mit der config/database.yml Datei verfahren werden. Erst wird die Datei im SVN umgenannt, anschließend wird sie wieder ignoeriert (denn im Anschluss muss die database.yml-Datei &#8220;lokal&#8221; wieder hergestellt werden)</p>
<pre>$ <strong>svn move config/database.yml config/database.original</strong>
A   config/database.original
D   config/database.yml
$ <strong>svn commit -m "moved config/databas.yml to config/databas.original</strong>
...
Commitet revision 4.
$ <strong>svn propset svn:ignore "database.yml" config/</strong>
property 'svn:ignore' set on 'config'
$ <strong>svn update config/</strong>
At revision 4.
$ <strong>svn commit -m "Ignore database.yml"</strong>
...
Committed revision 5.
$ <strong>cp config/database.original config/database.yml</strong></pre>
<p>Das waren &#8220;auch&#8221; schon alle Vorbereitungen.</p>
<p>Nun müssen aber auch noch alle durch den (script/gernerate) Generator erstellten Dateien zum SVN hinzugefügt werden.</p>
<pre>$ <strong>ruby script/generate controller foo --svn</strong></pre>
<p>Mit hilfe der Option &#8211;svn (oder -c) werden alle Dateien automatisch ins das SVN-Prjekt aufgenommen.</p>
<p>Rails Logo CC von <a href="http://railslogo.com/" target="_blank">http://railslogo.com/</a></p>
<p>Quellen:</p>
<ul>
<li>Rails Kochbuch : [rapid Web development mit Rails 1.2] / Rob Orsini. Dt. Übers. von Peter Klicman. &#8211; Dt. Ausg., 1. Aufl. : O&#8217;Reilly, 2007. &#8211; XVI</li>
<li><a href="http://wiki.rubyonrails.org/rails/pages/HowtoUseRailsWithSubversion" target="_blank">wiki.rubyonrails.org</a> Stand: 11.02.2009, Rev. 299</li>
</ul>
<ol class="footnotes"><li id="footnote_0_524" class="footnote"><a href="http://blog.sebastian-thiele.net/2008/12/13/subversion-server-unter-debian/" target="_blank">Subversion unter Debian installieren</a></li><li id="footnote_1_524" class="footnote">Beispielhaft wird hier auf einem Linux-System gearbeitet. Die Alternativen Befehle für Windows sind u.a. ls = dir </li><li id="footnote_2_524" class="footnote">Alle Zeilen mit $ beginnend sind eingaben in die Komandozeile. Alle Zeilen ohne, sind ausgaben auf der Komandozeile</li><li id="footnote_3_524" class="footnote">Ich bitte vielmals um Entschuldigung, sollte mir im laufe der Zeit auch mal &#8220;Ruby-Projekt&#8221; rausrutschen</li></ol>]]></content:encoded>
			<wfw:commentRss>http://sebastian.thiele.me/blog/ruby-on-rails-und-subversion/524?piwik_campaign=RSS&amp;piwik_kwd=524/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
