<?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>knallisworld</title> <atom:link href="http://www.knallisworld.de/blog/feed/" rel="self" type="application/rss+xml" /><link>http://www.knallisworld.de/blog</link> <description>Where is the beef?</description> <lastBuildDate>Wed, 02 May 2012 20:22:58 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <item><title>Kurz notiert: Installieren von git-svn mit den aktuellen MacPorts unter OS X Lion</title><link>http://www.knallisworld.de/blog/2012/05/02/kurz-notiert-installieren-von-git-svn-mit-den-aktuellen-macports-unter-os-x-lion/</link> <comments>http://www.knallisworld.de/blog/2012/05/02/kurz-notiert-installieren-von-git-svn-mit-den-aktuellen-macports-unter-os-x-lion/#comments</comments> <pubDate>Wed, 02 May 2012 16:31:33 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Allgemeines]]></category> <category><![CDATA[MacOS X]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1429</guid> <description><![CDATA[Unter Updating Xcode and MacPorts for OSX Lion findet man die schnelle Antwort, was man machen muss. Kurz: port install git +svn ist die Lösung!]]></description> <content:encoded><![CDATA[<p>Unter <a
title="Updating Xcode and MacPorts for OSX Lion" href="http://www.anthonymclin.com/code/7-miscellaneous/106-updating-xcode-and-macports-for-osx-lion">Updating Xcode and MacPorts for OSX Lion</a> findet man die schnelle Antwort, was man machen muss.</p><p>Kurz: <em>port install git +svn</em> ist die Lösung!</p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2012/05/02/kurz-notiert-installieren-von-git-svn-mit-den-aktuellen-macports-unter-os-x-lion/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Ändern einer IP-Route als User (Mac OS X) // sudoers [Update]</title><link>http://www.knallisworld.de/blog/2012/05/01/andern-einer-ip-route-als-user-mac-os-x-sudoers/</link> <comments>http://www.knallisworld.de/blog/2012/05/01/andern-einer-ip-route-als-user-mac-os-x-sudoers/#comments</comments> <pubDate>Tue, 01 May 2012 13:27:28 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Konfiguration]]></category> <category><![CDATA[MacOS X]]></category> <category><![CDATA[Sicherheit]]></category> <category><![CDATA[Technologie/IT]]></category> <category><![CDATA[route]]></category> <category><![CDATA[sudoers]]></category> <category><![CDATA[vpn]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1417</guid> <description><![CDATA[Im Zuge einer Überarbeitung meiner VPN-Firewall-Gateway-VM stolperte ich wieder über den Routing-Activator. Dieses kleine Script macht nichts anderes, als das externe VPN-Netzwerk über dei Gateway-VM zu routen. Da jedoch route zwingend root-Rechte benötigt, musste ich bei jedem VPN-Aufbau (sprich: Starten der VPN-Gateway-VM) oder einem Netzwerk-Neustart ein sudo /path/to/your/script via Terminal abfeuern &#8212; inklusive lästiger Passworteingabe. [...]]]></description> <content:encoded><![CDATA[<p>Im Zuge einer Überarbeitung meiner VPN-Firewall-Gateway-VM stolperte ich wieder über den Routing-Activator. Dieses kleine Script macht nichts anderes, als das externe VPN-Netzwerk über dei Gateway-VM zu routen. Da jedoch <code>route</code> zwingend root-Rechte benötigt, musste ich bei jedem VPN-Aufbau (sprich: Starten der VPN-Gateway-VM) oder einem Netzwerk-Neustart ein <code>sudo /path/to/your/script</code> via Terminal abfeuern &#8212; inklusive lästiger Passworteingabe.</p><div
id="gist-2567890" class="gist"><div
class="gist-file"><div
class="gist-data gist-syntax"><div
class="highlight"><pre><div class='line' id='LC1'><span class="c">#!/bin/bash</span></div><div class='line' id='LC2'><span class="c"># Routing the 192.168.1.0/24 net via the gateway at 192.168.0.101</span></div><div class='line' id='LC3'>sudo route -n add 192.168.1.0 192.168.0.101 255.255.255.0</div></pre></div></div><div
class="gist-meta"> <a
href="https://gist.github.com/raw/2567890/a1e6b305ef14f176caabc602e5bed6c916590e56/my-route-script.sh" style="float:right;">view raw</a> <a
href="https://gist.github.com/2567890#file_my_route_script.sh" style="float:right;margin-right:10px;color:#666">my-route-script.sh</a> <a
href="https://gist.github.com/2567890">This Gist</a> brought to you by <a
href="http://github.com">GitHub</a>.</div></div></div><p>Okay. Gehen wir das Problem an!</p><p>Das eigentliche Problem ist, das <code>route</code> nur als <em>superuser</em> ausgeführt werden darf. Für solche Fälle gibt es die <em>sudoers</em>-Datei, welche in Kurzform beschreibt, welche User welche Befehle als <em>superuser</em> ausführen dürfen. In der Regel landen dort manchmal Services (wenn ein Service bspw. zwar als Superuser gestartet werden muss, aber eigentlich im Kontext eines normalen Benutzers läuft und gesteuert wird) oder bestimmte Systembefehle.</p><p>Nun könnte man natürlich <em>route</em> für den eigenen Benutzer komplett freischießen, aber dann gelte dieser Freibrief für alle Prozesse. Nein, das will man auch nicht. Eigentlich soll ja nur die eine Route erlaubt werden. Und da praktischerweise diese Konfiguration bereits als ein Script &#8212; <code>/path/to/your/script</code> &#8211; vorliegt, wird einfach dieses dort eingetragen. Dabei sind jedoch einige Vorsichtsmaßnahmen zu treffen.</p><ol><li>Mit dem Befehl <code>sudo visudo</code> öffnet man eine spezielle Instanz von <em>vi</em> zum Editieren der sudoers.</li><li>Ganz am Ende trägt man eine weitere Zeile an (man kann sich an den Beispielen orientieren):<br
/><div
id="gist-2579934" class="gist"><div
class="gist-file"><div
class="gist-data gist-syntax"><div
class="highlight"><pre><div class='line' id='LC1'><span class="c"># USER := your username </span></div><div class='line' id='LC2'>USER <span class="nv">ALL</span><span class="o">=</span>NOPASSWD: /path/to/your/script</div></pre></div></div><div
class="gist-meta"> <a
href="https://gist.github.com/raw/2579934/e64eadbd6c9f17f57e3d45bd160015e6597c51c3/gistfile1.sh" style="float:right;">view raw</a> <a
href="https://gist.github.com/2579934#file_gistfile1.sh" style="float:right;margin-right:10px;color:#666">gistfile1.sh</a> <a
href="https://gist.github.com/2579934">This Gist</a> brought to you by <a
href="http://github.com">GitHub</a>.</div></div></div> <br
/> Damit erlaubt man dem Benutzer USER das Ausführen des definierten Commands ohne Passwortabfrage.<br
/> Sollte das Script natürlich woanders liegen, so muss das angepasst werden (irgendwie klar, oder?) Man kann auch andere Muster (beispielsweise ganze Gruppen) oder andere Modi wählen (siehe dazu <em>man sudoers</em>).</li><li>Wichtig: Um jegliches Sicherheitsrisiko zu vermeiden, sollte man unbedingt das Script danach abschotten. Dazu werden die Rechte auf das mindeste entfernt.<div
id="gist-2580025" class="gist"><div
class="gist-file"><div
class="gist-data gist-syntax"><div
class="highlight"><pre><div class='line' id='LC1'><span class="c"># Removes write access for all users (avoids injecting code)</span></div><div class='line' id='LC2'>sudo chmod -w /path/to/your/script</div><div class='line' id='LC3'><br/></div><div class='line' id='LC4'><span class="c"># Transfers the script to root (owned by)</span></div><div class='line' id='LC5'>sudo chown root /path/to/your/script</div></pre></div></div><div
class="gist-meta"> <a
href="https://gist.github.com/raw/2580025/f8a89e7974c30412e6c36933a3fb934627f531d0/gistfile1.sh" style="float:right;">view raw</a> <a
href="https://gist.github.com/2580025#file_gistfile1.sh" style="float:right;margin-right:10px;color:#666">gistfile1.sh</a> <a
href="https://gist.github.com/2580025">This Gist</a> brought to you by <a
href="http://github.com">GitHub</a>.</div></div></div><ol><li><code>sudo chmod -w /path/to/your/script</code> entfernt für alle Benutzer das Schreibrecht (muss man es dennoch editieren, geht es mit sudo vi und einem abschließenden :wq! natürlich dennoch).</li><li><code>sudo chown root /path/to/your/script</code> übertragt das Script dem Root-Benutzer, um eine nachträgliche Rechte-Änderung ohne Passwort zu verhindern.</li></ol></li><li>Fertig. Das Script kann nun mit <code>sudo /path/to/your/script</code> nun mit Rechten des <em>superuser</em> gestartet werden (ohne Passwort) und ist gleichzeitig ohne administrative Rechte nicht mehr änderbar.</li></ol> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2012/05/01/andern-einer-ip-route-als-user-mac-os-x-sudoers/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Skype 5 for Mac: Themes</title><link>http://www.knallisworld.de/blog/2012/04/21/skype-5-for-mac-themes/</link> <comments>http://www.knallisworld.de/blog/2012/04/21/skype-5-for-mac-themes/#comments</comments> <pubDate>Sat, 21 Apr 2012 16:45:26 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[MacOS X]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1414</guid> <description><![CDATA[Gerade herausgefunden: Skype unterstützt Themes für die Nachrichten. Allerdings muss man erstmal suchen, denn es findet sich weder eine In-App Download-Möglichkeit noch ein Verzeichnis von Skype selber. Vor über einem Jahr haben die zwar macthemes.sykpe.com präsentiert, diese Domain ist jedoch mittlerweile offline. Es gibt aber dann immerhin ein kleine Liste unter joemiller.me/2011/05/24/alternative-skins-for-skype-5-on-mac-osx. Gefallen tut mir da [...]]]></description> <content:encoded><![CDATA[<p>Gerade herausgefunden: Skype unterstützt Themes für die Nachrichten.</p><p
style="text-align: center;"><img
class="aligncenter size-full wp-image-1415" title="Skype 5 Mac Theme Switch" src="http://www.knallisworld.de/blog/wp-content/uploads/2012/04/Bildschirmfoto-2012-04-21-um-18.01.06.png" alt="" width="366" height="105" /></p><p>Allerdings muss man erstmal suchen, denn es findet sich weder eine In-App Download-Möglichkeit noch ein Verzeichnis von Skype selber. Vor über einem Jahr haben die zwar macthemes.sykpe.com präsentiert, diese Domain ist jedoch mittlerweile offline.</p><p>Es gibt aber dann immerhin ein kleine Liste unter <a
title="joemiller.me/2011/05/24/alternative-skins-for-skype-5-on-mac-osx" href="http://joemiller.me/2011/05/24/alternative-skins-for-skype-5-on-mac-osx/">joemiller.me/2011/05/24/alternative-skins-for-skype-5-on-mac-osx</a>. Gefallen tut mir da spontan Brief (<a
href="http://media.miekd.com/brief/">Webseite</a>, <a
href="https://github.com/miekd/Brief">Sourcen bei GitHub</a>). Ist etwas kompakter und im Skype/Mac-Style. Schön.</p><p>Zum Installieren reicht dieses Snippet. Danach einfach Skype neu starten.<br
/> <script src="https://gist.github.com/2438284.js?file=gistfile1.sh"></script></p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2012/04/21/skype-5-for-mac-themes/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Herrlicher PHP-Rant</title><link>http://www.knallisworld.de/blog/2012/04/11/herrlicher-php-rant/</link> <comments>http://www.knallisworld.de/blog/2012/04/11/herrlicher-php-rant/#comments</comments> <pubDate>Wed, 11 Apr 2012 13:43:59 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[Technik]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1409</guid> <description><![CDATA[Da hat jemand einen äußerst umfangreichen PHP-Rant verfasst. PHP: a fractal of bad design Falls ein Leser also mit PHP arbeitet: Lesen! Und zwar nicht unbedingt deswegen, um nachher PHP abzuschwören (okay, das wäre aber auch keine schlechte Idee), sondern um die Stolpersteine besser zu wissen und in Zukunft besser zu umfahren. Der Autor lässt [...]]]></description> <content:encoded><![CDATA[<p>Da hat jemand einen äußerst umfangreichen PHP-Rant verfasst.</p><p><a
href="http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/">PHP: a fractal of bad design</a></p><p>Falls ein Leser also mit PHP arbeitet: Lesen! Und zwar nicht unbedingt deswegen, um nachher PHP abzuschwören (okay, das wäre aber auch keine schlechte Idee), sondern um die Stolpersteine besser zu wissen und in Zukunft besser zu umfahren.</p><p>Der Autor lässt hierbei wirklich nichts grade stehen und geht alles an: von Parser über die Exceptions bis hin zur Security. Es schadet übrigens natürlich nicht, diesen Beitrag dan auch selbst kritisch zu lesen (nicht alles, was PHP seiner Meinung nach schlecht/nicht kann, ist auch wirklich so schlimm), aber es sollte mindestens sensibel machen.</p><p>Und nebenbei kann man über so manches &#8220;Was haben sich die PHP-Entwickler dabei nur gedacht?&#8221; entweder laut lachen oder weinen &#8212; je nach dem.</p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2012/04/11/herrlicher-php-rant/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Feature Detection, my ass!</title><link>http://www.knallisworld.de/blog/2012/02/03/feature-detection-my-ass/</link> <comments>http://www.knallisworld.de/blog/2012/02/03/feature-detection-my-ass/#comments</comments> <pubDate>Thu, 02 Feb 2012 23:10:07 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[JavaScript]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1406</guid> <description><![CDATA[Ein Tag wie jeder andere &#8220;im IE funktioniert die Anwendung nicht mehr, nichts lädt mehr&#8221;. Man ist es ja eigentlich gewohnt, zumal es sich hierbei ja um eine umfangreiche RIA in Ext JS handelt. Trotz laufender JSLint-Überwachung für Fehler wie trailing comma mogelt sich immer mal wieder ein Problem herein. Ungewöhnlich war diesmal allerdings, dass [...]]]></description> <content:encoded><![CDATA[<p>Ein Tag wie jeder andere &#8220;im IE funktioniert die Anwendung nicht mehr, nichts lädt mehr&#8221;. Man ist es ja eigentlich gewohnt, zumal es sich hierbei ja um eine umfangreiche RIA in Ext JS handelt. Trotz laufender JSLint-Überwachung für Fehler wie <em>trailing comma</em> mogelt sich immer mal wieder ein Problem herein. Ungewöhnlich war diesmal allerdings, dass bei der weiteren Untersuchung auffiel, dass das Problem auf einem IE9 auftrat (Hut ab vor Microsoft, IE9 ist eigentlich sehr gut). Ein Gegencheck in der VM mit IE6 und IE8 zeigte das Verhalten nicht. Auch die Prüfung auf einem realen Windows 7-System mit IE9 war problemlos.</p><p>Nun ja, genauer gesagt, das Problem trat auf einem (Test-) Windows Server 2008 mit IE9 auf. Aha..?</p><p>Nach einem schnellen Aufschalten auf den Testserver und dem Aufruf der Debugging-Tools offenbarte, dass der IE9 an genau einer Stelle auf Nase flog:<em> aAudio=&#8221;Audio&#8221;in window?new Audio(&#8220;&#8221;):{} </em>Im Prinzip ein ganz normale Art und Weise, eine Feature Detection durchzuführen. Für diejenigen, die nicht in JavaScript firm sind: Die Variable <em>aAudio</em> wird, falls im Objekt <em>window</em> eine Eigenschaft <em>Audio</em> vorhanden ist, mit einer neuen Instanz eben dieser <em>Audio</em>-Klasse belegt, andernfalls mit einem leeren Objekt (hilfreich ist hierbei zu wissen, dass window der Standardscope ist).</p><p>Das heißt also, nur wenn der Browser die HTML5-API &#8220;Audio&#8221; kann, wird auch eine Instanz davon erstellt. Weiter später wird im Script auf eine spezielle Eigenschaft/Methode dieser Variable geprüft: Damit lässt sich dann feststellen, ob HTMl5-Audio implementiert wird (hier: <em>canPlay</em>). Das gesamte Problem gilt natürlich auch analog für die HTML5-API des Tags <em>video</em>.</p><p>Eine Exception <em>&#8220;Not implemented&#8221;</em>, die nicht aus der Anwendung kam, nicht aus dem Framework und auch nicht aus dem Plugin, welches im Endeffekt diese Zeile beinhaltet, wurde geschmissen und stoppte die gesamte Anwendung bzw. das verursachende Script. Und genau diese Zeile war die Feature Detection für HTML5-Audio in einer Sammlung von Flash/Video/Audio-Funktionalitäten.</p><p><strong>Lange Rede, kurzer Sinn:</strong> Der Internet Explorer 9 hat u.a. die HTML5-APIs für Audio und Video implementiert &#8212; eigentlich. Nicht jedoch auf einem Windows Server 2008, denn dort wird dafür ein optional zu installierendes Feature &#8212; so called <em>Desktop Experience Feature</em> &#8212; des Betriebssystems benötigt. Und damit das ganze auch richtig gegen die Wand fahren kann und muss, tut man (der Browser) erstmal so, als würde er HTML5-Audio anbieten können (API <em>window.Audio</em> gibt es!), schmeißt dann aber eine Exception, wenn man das Objekt tatsächlich nutzt.</p><p>Tatsächlich ist die einzige Lösung, dies mit einem billigen try-catch zu lösen. Eine Post-Recherche ergab, die Macher von Feature-Detection-Framework Modernizr haben das genauso gemacht.</p><p>Es hat sich in den Jahren nicht viel geändert: Sonderwürste für den IE stehen weiterhin an.</p><h2>Hintergrund &#8211; oder: Die Sache selbst</h2><p>Eine granulare Feature Detection ist heutzutage bei modernen Webanwendungen oder besser -frameworks quasi Pflicht. Hat man früher noch eine grobe Browser Detection (Browserhersteller und -version) vorgenommen, um daraus herzuleiten, ob Feature X unterstützt wird, so prüft man heute besser auf dieses Feature direkt. Erstens sind die Features unzählig mehr geworden, zum anderen benötigt das das &#8220;Wissen&#8221;, welcher Browser welches Feature kann. Außerdem ist es mit den modernen Workingdraft/Livingstandard-Trends quasi unmöglich geworden, Features zu bestimmten Browsern zuzuordnen. Chrome und Firefox aktualisieren sich mittlerweile  mehr oder weniger selbstständig; und überhaupt ist die Geschwindigkeit der Browserentwicklungen so schnell geworden, dass eine Browser-basierte Herleitung von Feature-Verfügbarkeiten schwierig wird. Ein ganz gutes Beispiel ist HTML5 &#8212; denn HTML5 ist als Standard weder komplett fertig, noch in einem/jedem Browser gleichwertig implementiert.</p><p>In der Regel läuft eine Feature-Detection wie folgt ab: Man prüft, ob die Voraussetzungen bspw. für einen Tag oder eine DOM-API-Funktion vorhanden ist und ermittelt gegebenenfalls noch weitere Ausprägungen.</p><h2>Beispiele</h2><ul><li>navigator.geolocation ist nicht undefined, wenn der Browser die Geolocation-API kann.</li><li>document.createElement(&#8216;canvas&#8217;).getContext ist nicht undefined, wenn der Browser Canvas-Tags unterstützt und damit Canvas zeichnen kann.</li><li>document.createElement(&#8216;audio&#8217;).canPlay ist nicht undefined, wenn der Browser HTML5-Audio-Tags unterstützt und demnach HTML5-Audio abspielen kann.</li></ul><h2>Weitere Links</h2><ul><li><a
href="https://developer.mozilla.org/en/Browser_Feature_Detection">Mozilla Browser Feature Detection</a></li><li><a
href="http://developer.practicalecommerce.com/articles/2572-Detect-HTML5-Features-Before-You-Use-Them">Detect HTML5 Features Before You Use Them</a></li><li><a
href="https://github.com/Modernizr/Modernizr/issues/224">GitHub/Modernizr: #224 IE 9 Running on Windows Server SKU can cause an exception to be thrown</a></li><li><a
href="http://msdn.microsoft.com/en-us/ie/ff959805#_Known_Installation_Issues">Release Notes for Internet Explorer 9: Known Issues</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2012/02/03/feature-detection-my-ass/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Migration von Trac zu JIRA</title><link>http://www.knallisworld.de/blog/2011/08/07/migration-von-trac-zu-jira/</link> <comments>http://www.knallisworld.de/blog/2011/08/07/migration-von-trac-zu-jira/#comments</comments> <pubDate>Sun, 07 Aug 2011 12:57:53 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Howtos]]></category> <category><![CDATA[Management]]></category> <category><![CDATA[Tutorial]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1391</guid> <description><![CDATA[Einführung von Atlassians Confluence, FishEye und JIRA In diesem Artikel geht es um die Installation und Konfiguration von Atlassians JIRA, FIshEye und Confluence in einer ursprünglich rein Trac-basierten Umgebung. Ich gehe davon aus, dass die Hersteller-Guides bereits bekannt sind oder bei Fragen zu Rate gezogen werden. Es werden nicht alle Funktionen und Features der Produkte [...]]]></description> <content:encoded><![CDATA[<h2>Einführung von Atlassians Confluence, FishEye und JIRA</h2><p>In diesem Artikel geht es um die Installation und Konfiguration von Atlassians JIRA, FIshEye und Confluence in einer ursprünglich rein Trac-basierten Umgebung.</p><p>Ich gehe davon aus, dass die Hersteller-Guides bereits bekannt sind oder bei Fragen zu Rate gezogen werden. Es werden nicht alle Funktionen und Features der Produkte im einzelnen vorgestellt oder erklärt (etwa: Was ist ein Crowd-Server? oder Wie stelle ich den Benutzer-Signup aus?).</p><ul><li>http://confluence.atlassian.com/display/JIRA/JIRA+Documentation</li><li>http://confluence.atlassian.com/display/FISHEYE/FishEye+Documentation+Home</li><li>http://confluence.atlassian.com/display/DOC/Confluence+Documentation+Home</li></ul><h3>Installationen</h3><p>Für eine saubere Installation empfiehlt es sich, die Anwendungen von einander getrennt zu installieren.</p><p>Alle drei Produkte lassen sich als Standalone oder als WAR herunterladen und installieren. Während die WAR -Variante nur in einen vorhandenen Tomcat deployt wird, ist die Standalone-Variante eine fertig konfigurierte Einheit, die auch entsprechend korrekt konfiguriert ist. Aus mehreren Gründen ist die Standalone-Variante vorzuziehen: Service-Able, besseres Tuning im Performance-Problemfall.</p><p>Leider ist die Qualität der Standalone-Versionen nicht überall gleich; JIRA ist dabei am Besten und quasi vollständig.</p><p>Für diesen Beitrag installieren wir die Produkte jeweils in die drei Verzeichnisse /opt/confluence, /opt/fisheye und /opt/jira. Und natürlich unter Linux.</p><h4>JIRA</h4><p>Praktischerweise wird JIRA in einem selbstausführenden Installer zur Verfügung gestellt. Also sudo gestartet, sollte man hier den empfohlenen Weg nehmen und JIRA als Service mit eigenem Benutzer installieren. Da der Installer selbstständig einen Benutzer jira anlegen wird, sollte dieser nicht vorher schon existieren. Ist bereits einer vorhanden, legt der Installer jira1 an, inkl. einem gleichlautenden Service.</p><p>Danach ist JIRA installiert und muss via Web konfiguriert werden. Für die produktive Installation bedeutet dies beispielsweise eine externe Datenbankanbindung.</p><p><strong>Hinweis:</strong> Sofern der Administratorzugang mit einem Benutzer aus dem späteren Trac-Import matchen soll, sollte der Benutzername gleich heißen.</p><p><strong>Hinweis:</strong> Sollen mehrere Tomcats auf einer Maschine laufen, müssen die Ports entsprechend verändert werden. Die JIRA-Tomcat-Konfiguration ist unter conf/server.xml zu finden. Dort findet sich auch ein auskommentierter Connector für AJP.</p><p>Es empfiehlt sich, den Remote- und API-Zugriff sofort zu aktivieren, da dieser in der Regel immer gebraucht wird (etwa für <a
href="http://www.eclipse.org/mylyn/">Eclipse Mylyn</a>).</p><p>Falls die Benutzerkonten zwischen JIRA, Confluence und FishEye synchronisiert werden sollen (und das ist sicher zu empfehlen): Das Feature heißt bei Atlassian Crowd und ist in allen Produkten implementiert. Hierbei spielt JIRA dann den Crowd-Server, d.h. es stellt die Konten und Passwörter zur Verfügung. Confluence und FishEye werden später nur passiv gespiegelt.</p><h4>FishEye</h4><p>FishEye wird im Gegensatz zu JIRA nicht mit einem Installer ausgeliefert. Das Archiv entpackt hinterlässt nur die Applikation. Da der Standardport von FishEye 8060 ist und sich damit selten mit anderen Diensten überschneidet, kann man dies so stehen lassen.</p><p>Da FishEye von sich aus kein Service-Script mitliefert, muss man das selber beisteuern. Außerdem muss man sich auch selber um einen Benutzer (etwa sinnigerweise fisheye) kümmern.</p><p><script src="https://gist.github.com/1130328.js?file=fisheye"></script></p><p>FishEye wird per Default in eine HSQLDB installiert. Im Gegensatz zu JIRA kann man nicht bereits zu Beginn eine alternative Datenbank auswählen. Dafür kann Fisheye jedoch on the fly via Administration/Database in eine externe Datenbank migriert werden.</p><p>Falls die Crowd-Funktionalität von JIRA verwendet werden soll, muss in der Administration der JIRA-Server als &#8220;Application-Link&#8221; angelegt werden. Anschließend kann man die Benutzer synchronisieren (etwa automatisch jede Stunde) und das lokale Registrieren abschalten.</p><p><strong>Hinweis:</strong> Mit dem FishEye-Administrator-Passwort kommt man immer in die Admin-Backend zurück. Dennoch empfehle ich, einen Login in einem separaten Browser (oder einfach im Inkognito-Modus) auszuprobieren. Per Default werden Benutzer, die in der Gruppe jira-administrators sind, auch automatisch FishEye-Administratoren.</p><p>Erst nach Abschluss dieser Feinheiten lohnt sich das Anlegen von Repositories.</p><p><strong>Hinweis:</strong> Lässt man die alte Trac-Installation noch weiter laufen, so kann man in den Eigenschaften eines FishEye-Repositories einen Linker definieren, damit in Commits erscheinenden Ticket-Referenzen (#123) auf Trac verweisen können (reguläres Muster: #(\d+)). Prinzipiell kann man auch einen Link auf FishEye selber erzeugen, das funktioniert natürlich nur, wenn keine Tickets aufgrund von Projekt-Splittung verschoben wurden.</p><p>Nach erfolgtem Anlegen und Indizieren des Repositorys (oder der Repositories) sollte der Übersichtlichkeit wegen Projekte anlegen &#8212; idealerweise in der gleichen Struktur wie unter JIRA. Anschließend kann man mit den Application-Links dafür sorgen, dass erstens FishEye weißt, dass ein ein bestimmtes Projekt einer JIRA-Installation in den Changeset-Kommentaren verlinkbar ist und zweitens der entsprechenden JIRA-Installation eine Backreferenz auf diese FishEye-Quelle geben.</p><p>Mit dieser Konfiguration werden Commits mit einem Verweis auf ein Ticket (&#8220;&#8230; PROJECTKEY-123&#8230;&#8221;) automatisch auf JIRA verlinkt und gleichzeitig im JIRA-Vorgang als Aktivität aufgelistet.</p><h4>Confluence</h4><p>Wie FishEye bietet auch Confluence nur ein entpacktes Verzeichnis an. Auch hier muss man sich um ein Service-Script und einen Benutzer selber kümmern.</p><p><script src="https://gist.github.com/1130328.js?file=confluence"></script></p><p>Auch hier sollte man nach erfolgter Installation die Authentifizerung auf JIRA umstellen. Dafür muss man eine Referenz auf JIRA anlegen. Eventuell ist es auch nötig, eine zusätzliche Referenz seitens JIRA auf Confluence (erlaubte Abfrage der Konten) anzulegen.</p><p><strong>Wichtiger Hinweis:</strong> Es ist dringendst zu empfehlen, vor dem Switch auf den JIRA-Crowd-Server dem eigenen Konto (in JIRA) die neu zu erstellenden Benutzergruppe confluence-administrators hinzuzufügen &#8212; ansonsten sperrt man sich sofort aus. Hat man den Abgleichtimer auf eine Stunde gestellt und will &#8211; für Confluence &#8211; nicht von vorne anfangen, ist man eine Stunde merkbefreit.</p><h3>Von Trac nach JIRA</h3><h4>Upgrade auf Trac 0.12</h4><p>Das Importwerkzeug von JIRA ist nur mit Trac-Export-Daten kompatibel, die aus einer 0.12-Installation heraus erstellt wurden.</p><p>Die vorhandene Trac-Installation lief leider noch in der Vorgängerversion 0.11. Das macht sich unter anderem daran bemerkbar, das zwar der Import prinzipiell funktioniert, aber beispielsweise alle Zeiten/Zeitstempel falsch sind (01. Januar 1970). Dieser Umstand wird durch eine Änderung der internen Speicherung von Timestamps in Trac geschuldet (0.11 speichert in Sekunden, 0.12 jedoch in Mikrosekunden).</p><p>Daher war es zunächst erforderlich, die vorhandene Trac-Installation mittels Upgrade auf 0.12 zu aktualisieren. Je nach Installation ist ein <a
href="http://trac.edgewall.org/wiki/0.12/TracUpgrade">Upgrade einfach oder umständlich</a>.</p><p>Hinweis: Es kann durchaus sinnvoll sein, dass man seine bisherige Trac-Installation unverändert lassen will. Dies ist relativ einfach zu bewerkstelligen. Auf einer separaten Maschine (dafür eignet sich auch ein schnell aufgezogenes Debian in der VM) wird Trac 0.12 etwa via apt-get installiert. Danach wird ein Trac-Repository konfiguriert und anschließend das existierende Repository 1:1 herüberkopiert. Die anschließenden Befehle <em>trac-admin upgrade</em> und <em>trac-admin wiki upgrade</em> hiefen sowohl die Trac-Datenbank als auch die Wikiseiten auf die neue Version &#8211; fertig!</p><h4>Export von Trac</h4><p>Die Trac-Daten werden wie folgt exportiert: Die Tickets liegen alle in einer Datenbank im Repository, die Attachments liegen als Dateistruktur ebenfalls im Repository. Man wechselt in das Verzeichnis vom Trac-Repository und packt alles zusammen in ein Zip-Archiv.</p><h4>Import in JIRA</h4><p>Im Import-Assistenten wählt man Trac und danach das zuvor erstellte Zip-Archiv. Je nach Größe kann es erforderlich sein, dass man in der JIRA-Administration das Upload-Limit für Dateien (kurzfristig) erhöhen muss. Der Assistent entpackt das Archiv und analysiert die Strukturen. Sofern man keine Besonderheiten hat, kann man die Schritte alle absegnen. Eventuelle CustomFields sollten ebenfalls als solche auch in JIRA eingefügt werden.</p><h4>Das &#8220;No-Priority&#8221;-Issue</h4><p>Beim Import der Ticket-Daten wurde das Feld Priority nicht korrekt übernommen. Das hat die Auswirkung, dass beim Editieren eines Tickets automatisch die erstbeste Priorität seitens JIRA verwendet wird. Und das ist 1 =&gt; Blocker. Etwas unschön.</p><p>Prinzipiell ist so etwas aber kein großer Aufwand, da JIRA ein sehr ausgeklügeltes und vor allem funktionierendes Mehrfachbearbeitungsmanagement mitliefert. Über &#8220;Vorgänge / Suchen / Erweitert&#8221; kann man mittes JQL eine sehr spezifische Abfrage nach Vorgängen machen. Über jede getätigte Abfrage lässt sich über den Button &#8220;Tools&#8221; in der rechten, oberen Ecke eine Mehrfachbearbeitung starten.</p><p><strong>Hinweis:</strong> Da der Name des Trac-Felds &#8220;Priority&#8221; mit dem JIRA-Feld &#8220;Priority&#8221; konkurriert, hat der Importer ein generisches Feld (cf-xxxx) anlegt.</p><p>Über die Abfrage &#8220;status = Reopened and priority is empty and cf[xxxxx] = Blocker&#8221; lassen sich beispielsweise alle &#8220;prioritätslosen&#8221; Tickets abfragen, die aus Trac mit Blocker-Priorität kommen&#8221;. Über die Mehrfachbearbeitung setzt man dann die Priorität auf &#8220;Blocker&#8221;. Das gleiche für alle anderen Prioritäten.</p><h4>Das &#8220;Reopened Issues&#8221;-Issue</h4><p>Beim Import der Ticket-Daten wurden alle bereits geschlossenen und &#8220;resolved&#8221; Tickets mit dem Status &#8220;Reopened&#8221; eingeladen. Auch hierfür eignet sich die Mehrfachbearbeitung.</p><p><strong>Hinweis:</strong> Der Workflow erfordert beim Schließen eines Vorgangs die Angabe einer Resolution. Daher ist es wie bei &#8220;No-Priority&#8221; empfehlenswert, die Abfrage gruppiert nach eine Trac-Resolution zu machen. Ansonsten verliert man die originale Resolution.</p><h3>Von Trac nach Confluence</h3><h4>Export von Trac</h4><p>Die Daten der Wiki-Seiten liegen als Dateistruktur im Trac-Repository. Da der Export bereits unter &#8220;Von Trac nach JIRA&#8221; erfolgt ist, hat man die Wiki-Daten bereits vorliegen.</p><h4>Import in Confluence</h4><p>Für den Import der Daten steht ein universelles Java-Programm zur Verfügung (ist in der Confluence-Administration unter Import zu finden). Damit lassen sich die Trac-Daten (aber auch noch eine ganze Reihe anderer Formate/Anwendungen) in das Confluence-Schema importieren. Das Programm ist etwas unglücklich designed und die Steuerung ist an einigen Punkten etwas unsauber implementiert &#8212; sofern man jedoch einiges beachtet, funktioniert alles einwandfrei.</p><p>Zunächst wählt man in der Liste &#8220;trac&#8221; aus. Danach wählt man den Ordner der Attachments aus, was voraussetzt, das man das Trac-Repository auf dem Rechner zur Verfügung stehen hat, auf welchem der Importer ausgeführt wird. Anschließend wählt man die Wiki-Seiten aus. Hierbei ist anzumerken, dass der Importer den kompletten, absoluten Pfad der Dateien übernimmt! Das ist äußerst unschön, weil man zwar in Confluence später zwar einzelne, aber nicht mehrere Seiten gleichzeitig verschieben kann. Unter Umständen kann es sinnvoll sein, die Wiki-Seiten für diesen Import kurzfristig auf einem /-Level anzulegen. Ein Unding ohnegleichens.</p><p>Nach der Angabe der Confluence-Server-Angaben werden die Daten importiert. Hinweis: Die externe API muss in Confluence selbstverständlich aktiviert sein.</p><h2>Bonus</h2><h3>Hudson/Jenkins-Integration</h3><p>Zwar bietet Atlassian natürlich eine perfekte Integration in und mit ihrem eigenen Buildserver <a
href="http://www.atlassian.com/software/bamboo/">Bamboo</a> an, dies ist aber nicht zwingend erforderlich. In der Regel reicht es aus, wenn man im Ticket automatisch/sofort erkennen kann, mit welchem Build ein Ticket bzw. ein entsprechender Changeset aufgenommen wurde. Dafür gibt es das Jenkins <a
href="https://wiki.jenkins-ci.org/display/JENKINS/JIRA+Plugin">JIRA-Plugin</a>.</p><p>Zuallererst muss in der globalen Konfiguration von Jenkins die JIRA-Installation konfiguriert werden. In den meisten Fällen muss dafür ein Benutzer angegeben werden: Will man es schön und sauber, dann legt man unter JIRA einen eigenen Buildserver-Benutzer an (etwa mit schönem Avatar?) und trägt dessen Zugangsdaten (generisches, langes Passwort?) in der Jenkins-Konfiguration ein.</p><p>Danach kann man im entsprechenden Jenkins-Job das JIRA-Plugin aktivieren und weiteres Tuning machen.</p><p>Mit dieser Konfiguration wird ein Build als weitere Aktivität in einem JIRA-Vorgang auftauchen.</p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2011/08/07/migration-von-trac-zu-jira/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>CSS3: SASS, Compass und PIE</title><link>http://www.knallisworld.de/blog/2011/07/24/css3-sass-compass-und-pie/</link> <comments>http://www.knallisworld.de/blog/2011/07/24/css3-sass-compass-und-pie/#comments</comments> <pubDate>Sun, 24 Jul 2011 19:27:09 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Browser]]></category> <category><![CDATA[JavaScript]]></category> <category><![CDATA[Technologie/IT]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1387</guid> <description><![CDATA[Nach einer längeren Pause gibt es heute ein paar kurze Notizen zum Thema CSS3 und Internet Explorer. Aber der Reihe nach. SASS So schön CSS ist, so alt und stupide ist der Spielraum zum entwickeln und konzipieren. CSS kann keine Vererbung, keine Strukturierungen, keine Kapselungen bzw. Mixins. Das einzige, was CSS kann: eine Aneinanderreihung von [...]]]></description> <content:encoded><![CDATA[<p>Nach einer längeren Pause gibt es heute ein paar kurze Notizen zum Thema CSS3 und Internet Explorer.</p><p>Aber der Reihe nach.</p><h2>SASS</h2><p>So schön CSS ist, so alt und stupide ist der Spielraum zum entwickeln und konzipieren. CSS kann keine Vererbung, keine Strukturierungen, keine Kapselungen bzw. Mixins. Das einzige, was CSS kann: eine Aneinanderreihung von Tags, bspw. <em>#element ul &gt; li</em></p><p>Mit <a
title="Syntactically Awesome Stylesheets" href="http://sass-lang.com/">SASS</a> ist das alles möglich. Es sind hierarchische Strukturen möglich, man kann Mixins (Kurzanweisungen für ein Set von Funktionen/Attributen, Stichwort: Browser-Cross-Features) oder endlich Variablen im CSS nutzen. Der Code-Syntax ist dabei eine Erweiterung von CSS3* (d.h. CSS selber ist weiterhin möglich) und wird üblicherweise in .scss-Dateien abgelegt. Jedes öffentlich zugängliche Stylesheet muss dann in ein &#8220;normales&#8221; CSS umgeschrieben werden, das erledigt SASS wahlweise auf Knopfdruck oder mit einem Watchdog (Befehl watch). Mit letzterem geschieht die Generierung on-the-fly, d.h. man kann zwischen SCSS und Browser genauso wechseln wie beim guten alten CSS.</p><p>* So lange man natürlich kein CSS3 nutzt, ist man auch CSS2 kompatibel.</p><h2>Compass</h2><p>Als Erweiterung für SASS gedacht, erweitert <a
title="CSS Authoring Framework" href="http://compass-style.org/">Compass</a> das Funktionsspektrum um einige hilfreiche CSS(3)-Features. Die <a
href="http://compass-style.org/reference/compass/">Referenz</a> zeigt stets den aktuellen Stand und auf GitHub sind die <a
href="https://github.com/chriseppstein/compass">Sourcen offen</a> zugänglich. Um beispielsweise die mittlerweile zahlreichen (6!) vendor-spezifischen Anweisungen eines linearen Gradienten (hier: weiß zu schwarz) zu erzeugen, reicht das simple Mixin <em>linear-gradient(color-stops(white, black))</em>.</p><p>Nett: Als Pull bekam das Projekt auch schließlich einen <a
href="https://github.com/chriseppstein/compass/issues/183">experimentellen Hack</a>, damit Gradienten out-of-the-box im IE6-8 funktionieren. So funktioniert Open Source.</p><h2>PIE</h2><p><a
href="http://css3pie.com/">CSS3PIE</a> ist eine winzige Library, die in Form einer HTC (so genannte HTML Components, eine microsoft-spezifische JavaScript-Datei) weitestgehend die CSS3-Features border-radius, box-shadow und linear-gradient bereitstellt.</p><p>In Compass ist PIE <a
href="http://compass-style.org/reference/compass/css3/pie/">optional verfügbar</a>. Mit der Ergänzung einer Zeile SCSS-Code ist damit ein runder, schattierter Button real.</p><h2>Beispiele</h2><p><script type="text/javascript" src="https://gist.github.com/1102972.js">// < ![CDATA[</p>
<p>// ]]&gt;</script></p><h2>Da war noch was&#8230;</h2><p>CSS3PIE wurde dieses Jahr ein Teil von Sencha. Da ist es nicht verwunderlich, dass Sencha selber für ihren Theme-Generator (Bestandteil der <a
href="http://www.sencha.com/products/sdk-tools/">Sencha SDK Tools</a>)  für ExtJS/SenchaTouch auf Compass, <a
href="http://code.google.com/p/phantomjs/">PhantomJS</a> u.a. setzt.</p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2011/07/24/css3-sass-compass-und-pie/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>OS X, MacPorts und db46 broken</title><link>http://www.knallisworld.de/blog/2011/05/13/os-x-macports-und-db46-broken/</link> <comments>http://www.knallisworld.de/blog/2011/05/13/os-x-macports-und-db46-broken/#comments</comments> <pubDate>Fri, 13 May 2011 20:35:02 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Kurz notiert]]></category> <category><![CDATA[MacOS X]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1381</guid> <description><![CDATA[Schnell &#8220;port install git-core&#8221;, schon erhält man eine Fehlermeldung: Error: Failed to install db46 Problemlösung hier gefunden: einfach das aktuelle Java Developer Update installieren (Hintergrund: db64 scheint beim Installieren eine bestimmte Datei zu erwarten, die eben nur noch im Developerpaket vorhanden ist).]]></description> <content:encoded><![CDATA[<p>Schnell &#8220;port install git-core&#8221;, schon erhält man eine Fehlermeldung:</p><p>Error: Failed to install db46</p><p>Problemlösung <a
href="http://old.nabble.com/failed-to-install-db46-(for-git-core)-td30324826.html">hier gefunden</a>: einfach das aktuelle <a
href="https://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?bundleID=20719">Java Developer Update</a> installieren (Hintergrund: db64 scheint beim Installieren eine bestimmte Datei zu erwarten, die eben nur noch im Developerpaket vorhanden ist).</p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2011/05/13/os-x-macports-und-db46-broken/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Autodiscovery der Searchengine in Google Chrome + OpenSearch</title><link>http://www.knallisworld.de/blog/2011/04/14/autodiscovery-der-searchengine-in-google-chrome-opensearch/</link> <comments>http://www.knallisworld.de/blog/2011/04/14/autodiscovery-der-searchengine-in-google-chrome-opensearch/#comments</comments> <pubDate>Thu, 14 Apr 2011 16:58:59 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Browser]]></category> <category><![CDATA[Google Chrome]]></category> <category><![CDATA[Technologie/IT]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1365</guid> <description><![CDATA[Unter dem Titel &#8220;Suche in Chrome per type=search anmelden&#8221; fand ich die Tage einen netten Hinweis von Markus. Es geht darum, dass der Chrome automatisch Suchmaschinen hinzufügt. Auch ich dachte bisher, dass Google einfach nur eine gute Liste eingepflegt hat (bspw. mit amazon.de), aber mitnichten: Die Amazon.de-Suchmaschine ist bei mir nur deswegen drin, weil ich [...]]]></description> <content:encoded><![CDATA[<p><img
class="alignright size-medium wp-image-1368" title="OpenSearch in Firefox 4" src="http://www.knallisworld.de/blog/wp-content/uploads/2011/04/opensearch-in-firefox-4-300x199.png" alt="" width="300" height="199" /></p><p>Unter dem Titel <a
href="http://markus-schlegel.com/weblog/suche-in-chrome-per-typesearch-anmelden">&#8220;Suche in Chrome per type=search anmelden&#8221;</a> fand ich die Tage einen netten Hinweis von Markus. Es geht darum, dass der Chrome automatisch Suchmaschinen hinzufügt. Auch ich dachte bisher, dass Google einfach nur eine gute Liste eingepflegt hat (bspw. mit amazon.de), aber mitnichten: Die Amazon.de-Suchmaschine ist bei mir nur deswegen drin, weil ich die Amazonseite besucht habe und Chrome dort eine Suchmaschine &#8220;gefunden&#8221; hat. Aber warum gerade Amazon.de? Warum dict.cc?</p><p>Markus erster Hinweis war, dass es mit dem neuen HTML-Inputfeld-Typ &#8220;search&#8221; zusammenhängt. Ein anderer Kommentator brachte noch OpenSearch ins Spiel.. und als meine ersten Tests überhaupt nicht fruchteten, setzte ich mich mal genauer an das Thema heran. Den Großteil des Ergebnisses habe ich bereits in Markus&#8217; Beitrag als <a
href="http://markus-schlegel.com/weblog/suche-in-chrome-per-typesearch-anmelden#c000599">Kommentar</a> geschrieben.</p><h3>OpenSearch</h3><p>Beginnen wir mit <a
href="http://www.opensearch.org/Specifications/OpenSearch/1.1">OpenSearch</a>: Dies ist ein &#8212; noch nicht standardisierter &#8212; Entwurf für ein Dokument, welches die Metainformationen einer Suchmaschine beschreibt: Name, Beschreibung, URL-Pattern, Sprache, usw.</p><p>Ein solches OSDD (OpenSearch Description Document) sieht dabei vereinfacht und exemplarisch so aus:</p><pre class="brush: xml; title: ; notranslate">&lt;OpenSearchDescription xmlns=&quot;http://a9.com/-/spec/opensearch/1.1/&quot;&gt;
&lt;ShortName&gt;Example&lt;/ShortName&gt;
&lt;Description&gt;My example search engine&lt;/Description&gt;
&lt;InputEncoding&gt;UTF-8&lt;/InputEncoding&gt;
&lt;Image height=&quot;16&quot; width=&quot;16&quot; type=&quot;image/x-icon&quot;&gt;http://example.org/favicon.ico&lt;/Image&gt;
&lt;Url type=&quot;text/html&quot; template=&quot;http://example.org/index.html#search={searchTerms}&quot;/&gt;
&lt;/OpenSearchDescription&gt;</pre><p>Damit ein Browser die OSDD auch finden kann, muss sie innerhalb des HTML-Heads als Metainformation eingefügt werden:</p><pre class="brush: xml; title: ; notranslate">&lt;link title=&quot;Example&quot; type=&quot;application/opensearchdescription+xml&quot; rel=&quot;search&quot; href=&quot;http://example.org/opensearch.xml&quot;&gt;
</pre><p>Voilá! Ein Firefox findet damit bereits die Suchmaschine und bietet, wenn man auf den kleinen Pfeil unter dem aktuellen Suchmaschinen-Icon klickt, das Hinzufügen der neuen an. Das gilt im Übrigen auch für den Internet Explorer 8. Ab FF 2 und IE7 kann zudem explizit auf eine solche OSDD per JavaScript verwiesen werden:</p><pre class="brush: jscript; title: ; notranslate">window.external.AddSearchProvider(&quot;http://example.org/opensearch.xml&quot;);</pre><h3>Autodiscovery Mode in Chrome</h3><p><a
href="http://www.knallisworld.de/blog/wp-content/uploads/2011/04/opensearch-in-chrome-11a.png"><img
class="alignright size-medium wp-image-1370" title="Autodiscovery &amp; OpenSearch in Chrome 11 (Schritt 1)" src="http://www.knallisworld.de/blog/wp-content/uploads/2011/04/opensearch-in-chrome-11a-300x20.png" alt="" width="300" height="20" /></a></p><p>Google Chrome erkennt auch diese OSDD, stellt aber zur Zeit keine geeignete UI wie etwa Firefox oder Internet Explorer zur Verfügung. Vielmehr werden hier die Suchmaschinen automatisch erkannt, eingetragen und über die kombinierte Adress- und Suchleiste zur Verfügung gestellt.</p><p>Der Trigger für den Autodiscovery Mode ist dabei zwar ein INPUT-Field mit dem Typ &#8220;search&#8221; oder wahlweise mit dem Typ &#8220;text&#8221; und dem Namen &#8220;s&#8221;. Der eigentliche <del>Clou</del> Witz an der Sache ist jedoch, dass Chrome dieses HTML-Element explizit auf der Startseite der Domain erwartet. Es muss also auf der example.org/index.html oder example.org/startseite.jsp auftauchen. Funktioniert die OSDD prinzipiell von allen Seiten aus, so funktioniert der Autodiscovery Mode in keinem (virtuellen) Unterverzeichnis.</p><p><a
href="http://www.knallisworld.de/blog/wp-content/uploads/2011/04/opensearch-in-chrome-11b.png"><img
class="alignright size-medium wp-image-1371" title="Autodiscovery &amp; OpenSearch in Chrome 11 (Schritt 2)" src="http://www.knallisworld.de/blog/wp-content/uploads/2011/04/opensearch-in-chrome-11b-300x43.png" alt="" width="300" height="43" /></a></p><p>Interessanterweise spielt es aber keine Rolle, wie lange die Seite angezeigt wird. Liegt also bspw. eine example.org/index.html vor, die einen Meta-Refresh nach 0 Sekunden (sprich: sofort) macht, dann funktioniert der Autodiscovery Mode dennoch. Zusätzlich kann man das Formular auch unsichtbar machen, dies hat keine Auswirkungen.</p><p>Im Grunde reicht also dieses Schnippselchen, sofern man keine adäquate oder sinnvolle Startseite hat:</p><pre class="brush: xml; title: ; notranslate">&lt;form style=&quot;display: none;&quot;&gt;&lt;input type=&quot;search&quot; name=&quot;s&quot; /&gt;&lt;/form&gt;</pre><p>Die eigentliche Konfiguration holt sich Chrome wiederum aus der OSDD.</p><h3>Drawbacks</h3><ul><li>Apple Safari scheint bis dato keinerlei native Unterstützung für OSDD oder vergleichbares zu haben. Am nächsten kommt das Plugin <a
href="http://www.inquisitorx.com/safari/index_de.php">Inquisitor</a>.</li><li>Internet Explorer 9 scheint auf den ersten Blick keine Unterstützung für OSDD zu haben. Evtl. habe ich es aber auch noch nicht gefunden?</li><li>Opera hat auch keine Unterstützung.</li></ul><ul><li>Spezialfall: Im Verbund mit einem Suchparameter via Hash (Ajax/RIAs) wird bei Firefox nur der location.hash ausgetauscht (die Applikation bleibt). Google hingegen veranlasst einen kompletten neuen Request auf location.href, womit die gesamte Applikation neu geladen wird.</li></ul><h3>tl;dr: in a nutshell und lost facts</h3><ul><li>Die opensearch.xml stellt Metainformationen für eine Suchmaschine bereit und muss auf der HTML-Seite verlinkt werden.</li><li>Für den Autodiscovery Mode von Chrome muss auf einer Seite im Domain-Root ein INPUT-Feld &#8220;type=search&#8221; oder &#8220;name=s&#8221; vorhanden sein.</li><li>Das Formular respektive Feld muss weder für den Benutzer sichtbar sein (CSS), noch lange angezeigt werden (Redirect nach 0 Sekunden).</li><li>Manuelles Hinzufügen über eine API in nahezu allen aktuellen Browsern möglich.</li><li>Es können mehrere Suchmaschinen je Seite verwaltet werden (betrifft OSDD).</li></ul><h3>Links</h3><ul><li><a
href="http://www.opensearch.org/Community/OpenSearch_search_clients">OpenSearch Supported Clients</a></li><li><a
href="http://www.opensearch.org/Documentation/Developer_best_practices_guide">OpenSearch Developer Best Practices</a></li></ul><p><b>Update:</b> Martin Thoma hat einen englischen Artikel (<a
href="http://martin-thoma.com/search-engine-autodiscovery/">http://martin-thoma.com/search-engine-autodiscovery/</a>) geschrieben, der auf diesem basiert. Ergänzende Informationen sind zum Beispiel die aktualisierten Kompatibilitäten (IE7).</p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2011/04/14/autodiscovery-der-searchengine-in-google-chrome-opensearch/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Video von Fukushima innerhalb der Sperrzone</title><link>http://www.knallisworld.de/blog/2011/04/08/video-von-fukushima-innerhalb-der-sperrzone/</link> <comments>http://www.knallisworld.de/blog/2011/04/08/video-von-fukushima-innerhalb-der-sperrzone/#comments</comments> <pubDate>Fri, 08 Apr 2011 17:14:03 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Allgemeines]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1360</guid> <description><![CDATA[Manche haben scheinbar nichts Besseres zu tun, als mit einer HD-Cam da rumzulaufen. Die Hälfte des Films piepsen die Geigerzähler.. via fefe]]></description> <content:encoded><![CDATA[<p><a
href="http://www.youtube.com/watch?v=yp9iJ3pPuL8"><img
src="http://img.youtube.com/vi/yp9iJ3pPuL8/2.jpg"></a></p><p><a
href="http://www.youtube.com/watch?v=yp9iJ3pPuL8">Click here</a> to view the video on YouTube.</p><p>Manche haben scheinbar nichts Besseres zu tun, als mit einer HD-Cam da rumzulaufen. Die Hälfte des Films piepsen die Geigerzähler..</p><p>via <a
href="http://blog.fefe.de/?ts=b36184c1">fefe</a></p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2011/04/08/video-von-fukushima-innerhalb-der-sperrzone/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
