<?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 &#187; Technologie/IT</title> <atom:link href="http://www.knallisworld.de/blog/category/technologieit/feed/" rel="self" type="application/rss+xml" /><link>http://www.knallisworld.de/blog</link> <description>Where is the beef?</description> <lastBuildDate>Thu, 02 Feb 2012 23:10:07 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <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>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>git-svn vs. svn mv</title><link>http://www.knallisworld.de/blog/2011/04/04/git-svn-vs-svn-mv/</link> <comments>http://www.knallisworld.de/blog/2011/04/04/git-svn-vs-svn-mv/#comments</comments> <pubDate>Mon, 04 Apr 2011 17:44:21 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Technologie/IT]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1356</guid> <description><![CDATA[Da staunte ich nicht schlecht, als das schlichte Wechseln zwischen Branches meines Git-Repositories (via git-svn) keine Wirkung auf den Editor hatte. Wieso waren auf einmal alle Dateien und Versionsangaben die selben? Hatte ich aus Versehen etwas falsches committet? Hatte der Release-Branch jetzt auch die Trunk/Developer-Version? Oh Graus! Nein, hatte er nicht. Sowohl die Subversion-Timeline als [...]]]></description> <content:encoded><![CDATA[<p>Da staunte ich nicht schlecht, als das schlichte Wechseln zwischen Branches meines Git-Repositories (via git-svn) keine Wirkung auf den Editor hatte. Wieso waren auf einmal alle Dateien und Versionsangaben die selben? Hatte ich aus Versehen etwas falsches committet? Hatte der Release-Branch jetzt auch die Trunk/Developer-Version? Oh Graus!</p><p>Nein, hatte er nicht. Sowohl die Subversion-Timeline als auch das eigentliche Repository zeigten alles korrekt an &#8212; Puh! Das bedeutetet jedoch, das aus irgendeinem Grunde dieÂ SynchronisationÂ mit Git in die Hose gegangen war. Leider brachte auch das <a
href="http://www.jukie.net/~bart/blog/svn-branches-in-git">Re-Syncen</a> nichts.</p><p>Erst das nÃ¤here Betrachten in einem visuellen Darstellung mit Hilfe von GitX brachte eine Erkenntnis: Aus irgendeinem Grunde war an einem bestimmten Tag X zwischen zwei Commits ein Merge des Release-Branches in den Hauptzweig &#8220;master/trunk&#8221; geschehen. Da ich mich an eine solche AktivitÃ¤t nicht erinnern konnte (abgesehen der Tatsache, dass mir das mit git-svn auch als KunststÃ¼ck vorkam), ergab das ein groÃŸes Fragezeichen&#8230; bis ich dann sah, was die besagten Commits in der SVN-Timeline waren.</p><p>Aus historischen und situationsabhÃ¤ngigen GrÃ¼nden wurde damals ein unkonventionelle Weg eingeschlagen werden: Aus /trunk wurde Release 1.0; /trunk wurde verschoben (bzw. gelÃ¶scht, auÃŸerhalb des Standard-SVN-Schema) und schlieÃŸlich /branches/new-release nach /trunk verschoben. An dieser Stelle verschluckt sich die Git-SVN-Bridge, und alle drei Branches verschmelzen zu einem gleichen Tree (nÃ¤mlich den Master/Trunk).</p><p>Und die LÃ¶sung des Problems? Einmal abgesehen davon, dass natÃ¼rlich die Aktion im SVN-Repository nicht gerade brilliant war, lÃ¤sst <a
href="http://www.dmo.ca/blog/20070608113513/">sich dies Ã¼ber die .git/config lÃ¶sen</a>. (Hinweis: Ein einfaches git remote rm lÃ¶st das Problem nicht, weil es git-svn remotes sind.)</p><pre><code>[svn-remote "1.1-RELEASE"]
    url = svn+ssh://your-server/home/svn/project-name/branches/1.1-RELEASE</code></pre><p>fetch = :refs/remotes/1.1-RELEASE<br
/> oder auch</p><pre><code>[svn-remote "1.1-RELEASE"]
    url = svn+ssh://your-server/home/svn
    fetch = project-name/branches/1.1-RELEASE:refs/remotes/1.1-RELEASE</code></pre>]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2011/04/04/git-svn-vs-svn-mv/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>IE9 &#8211; 99% von was?</title><link>http://www.knallisworld.de/blog/2011/02/18/ie9-99-von-was/</link> <comments>http://www.knallisworld.de/blog/2011/02/18/ie9-99-von-was/#comments</comments> <pubDate>Fri, 18 Feb 2011 18:37:27 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Browser]]></category> <category><![CDATA[Technologie/IT]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1346</guid> <description><![CDATA[IE9 HTML5 Tests 99%&#8230; Bogus IE9 has none of them, nor does it have any validation, or ranges or the new typesâ€¦ and worst of all for my Uploader widget, still, after all these years, does not support multiple file uploads. So the 99% isnâ€™t 99% of all HTML5 features â€” itâ€™s 99% of the [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://www.dzone.com/links/r/ie9_html5_tests_99_bogus.html">IE9 HTML5 Tests 99%&#8230; Bogus</a></p><blockquote><p>IE9 has none of them, nor does it have any validation, or ranges or the new typesâ€¦ and worst of all for my Uploader widget, still, after all these years, does not support multiple file uploads. So the 99% isnâ€™t 99% of all HTML5 features â€” itâ€™s 99% of the tests that IE implemented. This is like writing your own test and bragging that you passed it.</p></blockquote><p>Ein (weiterer) schÃ¶ner Artikel Ã¼ber den Bullshit Microsofts. Obwohl der IE9 grundlegende und zahlreiche neue Features von HTML5 implementiert, fehlen im Vergleich zu den anderen Browsern noch etliche.. abgesehen davon, das auch diese noch nicht alles implementiert haben.</p><p>Insofern ist die Aussage einer 99% HTML5 (Test)-Abdeckung genauso viel aussagekrÃ¤ftig, wie das Entwickeln und Nutzen von 99 TestfÃ¤llen bei Hunderten Fallunterscheidungen.</p><p>Wetten, dass demnÃ¤chst etliche Zeitungen, Magazine oder gar Blogs von der Ã¼berragenden HTML5-KompatibilitÃ¤t der IE9 berichten werden?</p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2011/02/18/ie9-99-von-was/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>{DEVELOPERS SHAME DAY}</title><link>http://www.knallisworld.de/blog/2010/11/03/developers-shame-day/</link> <comments>http://www.knallisworld.de/blog/2010/11/03/developers-shame-day/#comments</comments> <pubDate>Tue, 02 Nov 2010 22:01:38 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Allgemeines]]></category> <category><![CDATA[Entwicklung]]></category> <category><![CDATA[PHP]]></category> <category><![CDATA[Technologie/IT]]></category> <category><![CDATA[Wtf..?!]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1278</guid> <description><![CDATA[Cem hat kÃ¼rzlich den Developers Shame Day ins Leben gerufen. Als Stichtag wÃ¼rde ich denÂ 3.11.2010 vorschlagen.Â Ich stelle mir vor, dass an diesem Tag alle Entwickler, die ein Blog oder eine Seite betreiben, ein kleines StÃ¼ck Code prÃ¤sentieren, dass aus heutiger (oder vielleicht auch damaliger) Sicht total hirnverbrannt ist. Ein StÃ¼ck Code, dass uns [...]]]></description> <content:encoded><![CDATA[<p>Cem hat kÃ¼rzlich den <a
href="http://phphacker.net/2010/10/26/der-developers-shame-day/">Developers Shame Day ins Leben gerufen</a>.</p><blockquote><p>Als Stichtag wÃ¼rde ich denÂ <strong>3.11.2010</strong> vorschlagen.Â Ich stelle mir vor, dass an diesem Tag alle Entwickler, die ein Blog oder eine Seite betreiben, ein kleines StÃ¼ck Code prÃ¤sentieren, dass aus heutiger (oder vielleicht auch damaliger) Sicht total hirnverbrannt ist. Ein StÃ¼ck Code, dass uns selbst die SchamrÃ¶te ins Gesicht steigen lÃ¤sst. Dabei ist egal, ob es sich um PHP, JavaScript, CSS, HTML, Java, C oder sonst etwas handelt. Es muss nur von euch sein und es darf nicht verÃ¤ndert werden (umeventuell doch als total verrÃ¼ckter Hund dazustehenÂ  ). Ein kleiner erlÃ¤uternder Text sollte natÃ¼rlich auch nicht fehlen.</p></blockquote><p><img
class="aligncenter size-full wp-image-1287" title="Developers Shame Day" src="http://www.knallisworld.de/blog/wp-content/uploads/2010/11/developersshameday.png" alt="" width="500" height="100" /></p><p>Und das ist mein Beitrag, wohl einer meiner ersten Gehversuche in PHP. Der Quellcode entstammt einer Datei namens &#8220;functions.inc.php&#8221; [sic!]. Und <em>es scheint</em> <em>so</em> <img
src='http://www.knallisworld.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> , also wÃ¤re es eine grÃ¶ÃŸere Anwendung gewesen, ich habe jedoch echt keine Ahnung mehr welche &#8212; vielleicht die erste PHP-Homepage in Eigenentwicklung? Die Datei hatte sich irgendwie auf meine &#8220;Informatik-Diskette&#8221; [sic!] (Oberstufenkurs) verirrt, von der ich tatsÃ¤chlich noch ein Abbild hatte. Der Rest der ProgrammiersÃ¼nden muss entweder (m)einen Backup-AufrÃ¤umaktionen oder einem vor einigen Jahren aufgetreten Backupmediumfehler zum Opfen gefallen sein. Zu meiner Verteidigung kann ich wohl nur sagen hoffen, dass dies einer erste Spielversion war und nie &#8220;produktiv&#8221; wurde.</p><h3>Listing</h3><p>Bitte in voller LÃ¤nge genieÃŸen. Jede Zeile ist ein Genuss. *ankoppfass*</p><p>UnverÃ¤ndert, nur Benutzername/Passwort habe ich ausgeixt.</p><p>Datei: <em>functions.inc.php (von 2002 oder 2003)</em></p><pre class="brush: php; title: ; notranslate">
&lt;?php
//conf.inc.php
//please don't change this file manually - go to your admin-area to change settings!!!
$listname=&quot;Meine Linkliste&quot;;
$listname2=&quot;Downloads&quot;;
$linkwidth=&quot;100%&quot;;
$addpagewidth=&quot;50%&quot;;
$catorder=&quot;name&quot;;
$incatsort=&quot;Hits&quot;;
$perpage=&quot;5&quot;;
$max_search=&quot;10&quot;;
$adminpw=&quot;a&quot;;
$max_desc_leng=&quot;500&quot;;
$html=&quot;ON&quot;;
$language=&quot;german.lang&quot;;
$timeformat=&quot;1&quot;;
 @include(&quot;global/$language&quot;); // language-file
 @include(&quot;../global/$language&quot;); // language-file
//connect.inc.php
// DON'T CHANGE THIS FILE MANUALLY - EDIT ONLY VIA ADMIN-AREA
$server=&quot;localhost&quot;;
$user=&quot;xxx&quot;;
$pass=&quot;xxx&quot;;
$mydb=&quot;xxx&quot;;
$db_prefix=&quot;xl_&quot;;
$db_prefix2=&quot;dl_&quot;;
function JPDiv ($a,$b) {
  $i=0;
  $j=0;
  while($j==0) {
    if(($a/($b*($i+1)))&gt;1) {
      $i++;
    } else {
      $j = 1;
    }
  }
return $i;
}
function JPDatumZeit ($a) {
  $JPTag = array(&quot;Sonntag&quot;,&quot;Montag&quot;,&quot;Dienstag&quot;,&quot;Mittwoch&quot;,&quot;Donnerstag&quot;,&quot;Freitag&quot;,&quot;Samstag&quot;);
  $JPMonat = array(&quot;Januar&quot;,&quot;Februar&quot;,&quot;MÃ¤rz&quot;,&quot;April&quot;,&quot;Mai&quot;,&quot;Juni&quot;,&quot;Juli&quot;,&quot;August&quot;,&quot;September&quot;,&quot;Oktober&quot;,&quot;November&quot;,&quot;Dezember&quot;);
  $JPDatumTag = $JPTag[date(&quot;w&quot;,$a)];
  $JPDatumMonat = $JPMonat[date(&quot;n&quot;,$a)-1];
  $JPDatumJahr = date(&quot;Y&quot;,$a);
  $JPZeit = date(&quot;H:i:s&quot;,$a);
  $b = $JPDatumTag . &quot;, &quot; . date(&quot;j&quot;) . &quot;. &quot; . $JPDatumMonat . &quot; &quot; . $JPDatumJahr . &quot; [&quot; . $JPZeit . &quot;]&quot;;
return $b;
}
function JPDatumZeit2 ($a) {
  $JPDatumJahr = date(&quot;Y&quot;,$a);
  $JPZeit = date(&quot;H:i:s&quot;,$a);
  $b = date(&quot;j&quot;) . &quot;.&quot; . date(&quot;w&quot;,$a)+1 . &quot;.&quot; . $JPDatumJahr . &quot; [&quot; . $JPZeit . &quot;]&quot;;
return $b;
}
class my_zugriff{
//Variablen fÃ¼r Zugangsdaten
var $user=&quot;xxx&quot;;		//Benutzername fÃ¼r den MySQL-Zugang
var $password=&quot;xxx&quot;;		//Passwort
var $host=&quot;localhost&quot;;	//Name (IP-Adr.) des Rechners mit MySQL
var $dbname=&quot;xxx&quot;; 	//Name der Datenbank
//Weitere Variablen
var $db_verbindung=false; //Speichert die Verbindungskennung
var $sql_result=false; //Speichert die Kennung eines ausgewerteten SQL-Befehls
//Konstruktor definieren
function my_zugriff(){
   //Funktion verbinden wird bei Aufruf der Klasse ausgefÃ¼hrt
	 $this-&gt;verbinden();
}
//Falls keine Verbindung besteht,
//Verbindung aufbauen und Datenbank als Standard definieren
function verbinden(){
if ($this-&gt;db_verbindung==false){
   $this-&gt;db_verbindung = @mysql_connect($this-&gt;host, $this-&gt;user, $this-&gt;password);
   if(empty($this-&gt;db_verbindung)){
      $this-&gt;fehler(&quot;Beim Verbinden&quot;);
   }
   $auswahl = @mysql_select_db($this-&gt;dbname, $this-&gt;db_verbindung);
   if(empty ($auswahl)){
      $this-&gt;fehler(&quot;Beim Ausw&amp;auml;hlen der DB&quot;);
   }
   return $this-&gt;db_verbindung;
}
}
//Gibt Fehlermeldung aus und beendet das Skript
function fehler($fehlerpunkt){
    echo $fehlerpunkt . &quot; ist ein Fehler aufgetreten!&lt;br&gt;&quot;;
		echo mysql_error() . &quot;&lt;br&gt;&quot;; //Fehlerbezeichnung
		echo mysql_errno();	 	 		//Fehlernummer
		echo &quot;&lt;/body&gt;&lt;/html&gt;&quot;;		//Html-Tags schlieÃŸen
		exit;
}
//SQL-Befehl ausfÃ¼hren
function sql_befehl($sql){
$this-&gt;sql_result = @mysql_query($sql, $this-&gt;db_verbindung);
if (empty($this-&gt;sql_result)){
	 $this-&gt;fehler(&quot;Beim Senden der Abfrage&quot;);
}
return $this-&gt;sql_result;
}
//Falls zuvor ein SQL-Befehl ausgefÃ¼hrt wurde,
//wird hier das Array mit den DatensÃ¤tzen ausgegeben
function sql_daten(){
if(!empty($this-&gt;sql_result)){
		$sql_array=@mysql_fetch_array($this-&gt;sql_result);
		return $sql_array;
}else{
		$this-&gt;fehler(&quot;Beim Ausgeben der Datens&amp;auml;tze&quot;);
}
}
//eig. Fkt
function sql_num_rows($sql){
$this-&gt;sql_befehl($sql);
$rows = MYSQL_NUM_ROWS($this-&gt;sql_result);
return $rows;
}
}
$db=new my_zugriff();
$db-&gt;sql_befehl(&quot;SELECT elem_string FROM elem_global WHERE elem_name='JPmyVersion'&quot;);
$myVersion_now = $db-&gt;sql_daten();
 $JPmyVersion = $myVersion_now[0];
?&gt;
</pre><h3>Selbstreflexion</h3><ul><li>Struktur: globale Variablen</li><li>Struktur/Aufbau:Â als Script noch okay, aber als Include? Oweh..</li><li>Includes mittendrin</li><li>Variabel- und Funktionsnamen multilingual</li><li>Inhalt der Funktionen..</li><li>kein gÃ¤ngiger Codestyle (ja, der Blog zeigt&#8217;s richtig an)</li><li>Inline-SQL(!)</li></ul><p>Kurzum: What the hell&#8230;?</p><p>Weitere via <a
href="http://www.google.de/search?q=%22developers+shame+day">Google</a> oder <a
href="http://twitter.com/#!/search/Developers%20Shame%20Day">Twitter</a> oder <a
href="http://www.facebook.com/event.php?eid=165246213503708">Facebook</a>.</p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2010/11/03/developers-shame-day/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Beauty Of The Web?</title><link>http://www.knallisworld.de/blog/2010/09/15/beauty-of-the-web/</link> <comments>http://www.knallisworld.de/blog/2010/09/15/beauty-of-the-web/#comments</comments> <pubDate>Wed, 15 Sep 2010 18:54:44 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Aktuelles]]></category> <category><![CDATA[Internet Explorer]]></category> <category><![CDATA[Technologie/IT]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1253</guid> <description><![CDATA[Nun ja, Microsoft stellt seinen neuen Internet Explorer 9 Beta vor. Und da man heutzutage nicht einfach mehr ein Produkt vorstellt, gibt es dazu gleich eine komplette eigene Seite. www.BeautyOfTheWeb.com Wie gut der Browser jetzt ist, werden wir in den nÃ¤chsten Tagen merken. Zu der Seite sei gesagt: Rein technisch scheint sie voll aufneuen Technologien [...]]]></description> <content:encoded><![CDATA[<p>Nun ja, Microsoft stellt seinen neuen Internet Explorer 9 Beta vor. Und da man heutzutage nicht einfach mehr ein Produkt vorstellt, gibt es dazu gleich eine komplette eigene Seite. <a
href="http://www.beautyoftheweb.com">www.BeautyOfTheWeb.com</a></p><p>Wie gut der Browser jetzt ist, werden wir in den nÃ¤chsten Tagen merken. Zu der Seite sei gesagt: Rein technisch scheint sie voll aufneuen Technologien zu setzen bzw. <strong>ohne Flash und Silverlight</strong> auszukommen. Die Seite ist schnell und auch ohne IE benutzbar. Im Gegensatz zu Apple haben sie es auch tunlichst vermieden, irgendwelche Browser kÃ¼nstlich auszuschlieÃŸen, oder sollte ich etwas Ã¼bersehen haben?</p><p>Mit Silverlight war es wohl schwieriger, mit Flash wohl unmÃ¶glich, noch mehr Performance rauszukitzeln. SchlieÃŸlich soll der Browser IE9 ja zeigen, wie gut er ist. Also, keine Plugins, sondern pure HTML-Magie. Und CSS-Magie. Und Javascript-Magie.</p><p>Ein Schlag in Adobes Gesicht.</p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2010/09/15/beauty-of-the-web/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>[Howto] Maven: Wie man eine ausfÃ¼hrbare Jar in eine Java-Webanwendung (War) via Webstart integriert.</title><link>http://www.knallisworld.de/blog/2010/09/04/howto-maven-wie-man-eine-ausfuhrbare-jar-in-eine-java-webanwendung-war-via-webstart-integriert/</link> <comments>http://www.knallisworld.de/blog/2010/09/04/howto-maven-wie-man-eine-ausfuhrbare-jar-in-eine-java-webanwendung-war-via-webstart-integriert/#comments</comments> <pubDate>Sat, 04 Sep 2010 17:06:20 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Allgemeines]]></category> <category><![CDATA[Empfehlungen]]></category> <category><![CDATA[Java]]></category> <category><![CDATA[Technologie/IT]]></category> <category><![CDATA[Tipps]]></category> <category><![CDATA[jar]]></category> <category><![CDATA[maven]]></category> <category><![CDATA[war]]></category> <category><![CDATA[webstart]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1225</guid> <description><![CDATA[Die Situation Es bestehen zwei lauffÃ¤hige, fertige Projekte in Maven, welche beide auch vollwertige Artefakte bilden kÃ¶nnen. Zum einen die Webanwendung &#8212; nennen wir sie hier mal webportal &#8212; mit einem WAR-Artefakt, etwa fÃ¼r einen Tomcat. Ob das Artefakt als Snapshot oder Release gemacht wird, ob es nur generiert oder auch in ein Repository deployt [...]]]></description> <content:encoded><![CDATA[<h3>Die Situation</h3><p>Es bestehen zwei lauffÃ¤hige, fertige Projekte in Maven, welche beide auch vollwertige Artefakte bilden kÃ¶nnen.</p><p><a
href="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/Bildschirmfoto-2010-09-04-um-18.52.33.png"></a>Zum einen die Webanwendung &#8212; nennen wir sie hier mal <em>webportal</em> &#8212; mit einem WAR-Artefakt, etwa fÃ¼r einen Tomcat. Ob das Artefakt als Snapshot oder Release gemacht wird, ob es nur generiert oder auch in ein Repository deployt wird, ist hierbei nicht von weiterer Bedeutung.<a
href="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/Nuvola_mimetypes_java_jar.png"><img
class="size-full wp-image-1232 alignright" title="Nuvola_mimetypes_java_jar" src="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/Nuvola_mimetypes_java_jar.png" alt="" width="128" height="128" /></a></p><p>Zum anderen die normale Clientanwendung &#8212; nennen wir sie doch einfach <em>userclient</em> &#8212; mit einem JAR-Artefakt. Wichtig ist natÃ¼rlich, dass hier eine startfÃ¤hige Main-Klasse vorhanden ist. Dies sollte jedoch der Regelfall sein, daher nur der formale Hinweis.</p><p>Zusammengefasst, und der Auftrag an dieses Howto ist also: Wie konfiguriert und erweitert man den Buildzyklus in welchem Projekt an welcher Stelle am geschicktesten, um auf einfachem Wege die JAR-Datei <em>userclient</em> in die Webanwendung <em>webportal</em> als Java Webstart zu integrieren. Dabei ist es hilfreich, wenn man via <em>pom.xml</em> (und natÃ¼rlich der Macht der Properties) die Versionen spezifizieren kann. Der gesamte Prozess von auswÃ¤hlen, signieren und ausliefern soll dabei automatisch und ohne weiteres Eingreifen des Entwicklers geschehen kÃ¶nnen. Idealerweise sollte das ganze auch optional sein &#8212; dazu gibt es dann mehr unter &#8220;Optimierungen und Verbesserungen&#8221;.</p><p><span
id="more-1225"></span></p><h3>Die Grundlagen</h3><p><a
href="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/Bildschirmfoto-2010-09-04-um-18.54.54.png"><img
class="alignleft size-full wp-image-1234" title="Java 6 Webstart" src="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/Bildschirmfoto-2010-09-04-um-18.54.54.png" alt="" width="327" height="145" /></a>Ich mÃ¶chte jetzt nicht viel Ã¼ber die Grundlagen verlieren, nur so viel sei gesagt. Aus Sicht von Maven ist die Konfiguration &#8220;nur&#8221; ein weiteres Plugin von vielen. Daraus ergibt sich natÃ¼rlich auch die MÃ¶glichkeit, via Properties oder Profilen die Konfiguration sehr dynamisch zu halten. Webstart ist eine Technik, die an sich nichts mit Maven zu tun hat. Man kann auch &#8220;hÃ¤ndisch&#8221; seine Jar-Datei Ã¼ber eine URL verfÃ¼gbar machen. Man muss dann jedoch alles selber und richtig machen: Versionisierung, Signierung und Deployment. Die Signierung ist gerade dann wichtig, wenn die Applikation erweiterte/volle Rechte benÃ¶tigt.</p><h3>Die MÃ¶glichkeiten</h3><p>Es gibt eine Reihe von Maven-Plugins, die einen unterschiedliche AnsÃ¤tze und LÃ¶sungen bieten.</p><p>Das <a
href="http://maven.apache.org/plugins/maven-jar-plugin/">Maven Jar Plugin</a> bietet etwa unter anderem die MÃ¶glichkeit, die Jar-Dateien zu signieren. Dies wÃ¤re jedoch nur die halbe Miete, da weder die Jar-Dateien bekannt noch auslieferbar sind. Auch das <a
href="http://mojo.codehaus.org/keytool-maven-plugin/">Keytool plugin</a> ist nicht vollstÃ¤ndig, denn es unterstÃ¼tzt zwar das Keystore gestÃ¼tzte signieren, aber auch nicht mehr. Wohl aber kÃ¶nnen diese Plugin als Basis fÃ¼r andere dienen.</p><p>Weitaus mehr Funktionen kann das <a
href="http://mojo.codehaus.org/webstart/webstart-maven-plugin/">Webstart Maven Plugin</a> bieten. Es gibt verschiedene Arten der Erzeugung der Jnlp-Datei und dem damit verbundenen Sammeln, Bestimmen und Signieren der AbhÃ¤ngigkeiten in Form weiterer Jars oder Classfiles. Es ist auch ein hilfreiches Plugin, wenn man aus einem Projekt heraus direkt Jnlp &amp; Ressourcen erzeugen will.</p><p>In diesem Howto ist aber vor allem ein Ziel von Relevanz:Â Die Variante mit dem Jnlp-Download-Servlet: das Goal <a
href="http://mojo.codehaus.org/webstart/webstart-maven-plugin/jnlp-download-servlet-mojo.html">webstart:jnlp-download-servlet</a>.<a
href="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/jnlp.gif"><img
class="alignright size-full wp-image-1235" title="jnlp" src="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/jnlp.gif" alt="" width="128" height="128" /></a></p><p>Dieses Goal erzeugt im Buildprozess ein weiteres Verzeichnis mit den Ressourcen des <em>userclients</em> und der dazugehÃ¶renden Jnlps. Ein spezielles Servlet Ã¼bernimmt die Auslieferungen.</p><h3>Die Konfiguration im Projekt <em>userclient</em></h3><p>Das Projekt muss und sollte nicht &#8220;wissen&#8221;, dass es Ã¼ber Webstart irgendwo eingebunden wird. Daher sind keine Ã„nderungen nÃ¶tig. Wohl aber muss bekannt sein, wie die aktuelle bzw. die gewÃ¼nschte Version ist und ggf. das Maven-Repository der Deploys.</p><h3>Die Konfiguration im Projekt <em>webportal</em></h3><p><a
href="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/Bildschirmfoto-2010-09-04-um-18.52.33.png"><img
title="Maven" src="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/Bildschirmfoto-2010-09-04-um-18.52.33.png" alt="" width="170" height="50" /></a>Das <em>webportal</em> muss hingegen durchaus von der Existenz des <em>userclients</em> wissen, denn jenes es soll ja in diese Webanwendung integriert werden. Die Konfiguration besteht im Wesentlichen aus drei Schritten: JnlpDownloadServlet-AbhÃ¤ngigkeit einfÃ¼gen, Servlet in der web.xml registrieren und Build-Plugin in der pom.xml konfigurieren.</p><h4>JnlpDownloadservlet (pom.xml)</h4><p>Das Maven-Paket findet sich unter dem Namen <em>com.sun.java.jnlp</em> bzw.Â <em>jnlp-servlet</em> wieder. Als einfache AbhÃ¤ngigkeit ist es damit im Classpath und beispielsweise in der web.xml verwendbar. <a
href="http://coffeebreaks.org/tmp/maven-staging/webstart/site/jnlp101.html">Weitere Informationen.</a></p><pre class="brush: xml; title: ; notranslate">
&lt;dependency&gt;
    &lt;groupId&gt;com.sun.java.jnlp&lt;/groupId&gt;
    &lt;artifactId&gt;jnlp-servlet&lt;/artifactId&gt;
    &lt;version&gt;5.0&lt;/version&gt;
&lt;/dependency&gt;
</pre><h4>web.xml</h4><p>Zur Basiskonfiguration muss nur das Servlet registriert und mit einem URL-Pattern verknÃ¼pft werden. Das klingt trivial, und das ist es auch.</p><pre class="brush: xml; title: ; notranslate">
&lt;servlet&gt;
  &lt;servlet-name&gt;JnlpDownloadServlet&lt;/servlet-name&gt;
  &lt;servlet-class&gt;jnlp.sample.servlet.JnlpDownloadServlet&lt;/servlet-class&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
  &lt;servlet-name&gt;JnlpDownloadServlet&lt;/servlet-name&gt;
  &lt;url-pattern&gt;/webstart/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;</pre><p>Damit wird die URL domain.tld/context/webstart an das Servlet gemappt. Dadurch kann das Servlet auch auf &#8220;virtuelle Dateianfragen&#8221; reagieren, etwa nach Jar-Dateien ohne Versions-Qualifkation (obwohl sie als versionierte Artefakte vorliegen).</p><p>Die Konfiguration lÃ¤sst noch einige Dinge erweitern, verÃ¤ndern und tweaken (siehe Absatz Optimierungen und Verbesserungen). FÃ¼r den Haupteinsatzzweck &#8211; das Bereitstellen einer oder mehrerer Jars via Webstart ist das jedoch vÃ¶llig ausreichend.</p><p><a
href="http://download.oracle.com/javase/6/docs/technotes/guides/javaws/developersguide/downloadservletguide.html">Weitere Informationen bei Oracle/Java</a>.Â Und <a
href="http://mojo.codehaus.org/webstart/webstart-maven-plugin/examples/advanced_jnlp_download_servlet.html">weitere Informationen bei Codehaus</a>.</p><h4>pom.xml</h4><p>Neben der AbhÃ¤ngigkeit des <em>JnlpDownloadServlet</em> muss das eigentlichen <em>Maven Webstart Plugin</em> fÃ¼r seinen Einsatz konfiguriert werden. Das Build-Plugin benÃ¶tigt zudem noch ein Template (fÃ¼r die Generierung der Jnlp), die wird weiter unten beschrieben.</p><p>Zur Grundkonfiguration gehÃ¶rt:</p><ol><li>Wo liegt das Jnlp-Template?</li><li>Wie heiÃŸt der Ausgabename der Jnlp?</li><li>Welche AbhÃ¤ngigkeiten gibt es fÃ¼r das Paket &#8212; hier wÃ¤re das der <em>userclient</em>?</li></ol><p>Des Weiteren lÃ¤sst sich bestimmen, ob etwa weitere (transitive) AbhÃ¤ngigkeiten mitausgeliefert werden sollen (bei Webstart ist das wohl meist sinnvoll), ob die Ressourcen signiert werden sollen und ob alles nochmals komprimiert deployt werden soll. <a
href="http://mojo.codehaus.org/webstart/webstart-maven-plugin/examples/advanced_jnlp_download_servlet.html">Weitere Informationen</a>.</p><p>Prinzipiell ist man weder auf eine AbhÃ¤ngigkeit pro Paket/JNLP beschrÃ¤nkt noch auf eine JNLP pro Plugin-Call geschweige denn des gesamten Projekts. Ãœber das KonfigurationsschlÃ¼sselwort <em>commonJarResources</em> kÃ¶nnen sogar gemeinsam verwendete AbhÃ¤ngigkeiten definiert werden.</p><p>Da der userclient erweiterte Rechte benÃ¶tigt, mÃ¼ssen alle Classfiles und Jars signiert werden. Wahlweise verwendet dafÃ¼r einen vorhandenen Keystore oder erstellt einen neuen. FÃ¼r diese Zwecke wird pro Buildvorgang ein neuer Keystore angelegt, damit signiert und danach wieder gelÃ¶scht.</p><p>Die Execution ist sinnigerweise <em>process-resources</em> mit dem Goal <em>jnlp-download-servlet</em>, denn streng genommen sind es ja nur weitere Ressourcen.</p><pre class="brush: xml; title: ; notranslate">
&lt;plugin&gt;
  &lt;groupId&gt;org.codehaus.mojo.webstart&lt;/groupId&gt;
  &lt;artifactId&gt;webstart-maven-plugin&lt;/artifactId&gt;
  &lt;executions&gt;
    &lt;execution&gt;
      &lt;phase&gt;process-resources&lt;/phase&gt;
      &lt;goals&gt;
        &lt;goal&gt;jnlp-download-servlet&lt;/goal&gt;
      &lt;/goals&gt;
    &lt;/execution&gt;
  &lt;/executions&gt;
  &lt;configuration&gt;
    &lt;outputDirectoryName&gt;webstart&lt;/outputDirectoryName&gt;
    &lt;excludeTransitive&gt;false&lt;/excludeTransitive&gt;
    &lt;jnlpFiles&gt;
      &lt;jnlpFile&gt;
        &lt;templateFilename&gt;template.vm&lt;/templateFilename&gt;
        &lt;outputFilename&gt;UserClient.jnlp&lt;/outputFilename&gt;
        &lt;jarResources&gt;
          &lt;jarResource&gt;
            &lt;groupId&gt;org.example.userclient&lt;/groupId&gt;
            &lt;artifactId&gt;example-userclient&lt;/artifactId&gt;
            &lt;version&gt;1.0.0&lt;/version&gt;
            &lt;mainClass&gt;org.example.userclient.Main&lt;/mainClass&gt;
          &lt;/jarResource&gt;
        &lt;/jarResources&gt;
      &lt;/jnlpFile&gt;
    &lt;/jnlpFiles&gt;
    &lt;outputJarVersions&gt;true&lt;/outputJarVersions&gt;
    &lt;verbose&gt;false&lt;/verbose&gt;
  &lt;/configuration&gt;
&lt;/plugin&gt;
</pre><p>Mit dieser Konfiguration werden die Jar-Dateien inkl. AbhÃ¤ngigkeiten in das Verzeichnis <em>webstart</em> gepackt &#8212; remember? wie in der <em>web.xml</em>. Das Template heiÃŸt <em>template.vm</em> und ist per default unter <em>src/main/jnlp</em> zu finden. Dies lieÃŸe sich mit <em>templateDirectory</em> Ã¼berrschreiben. Der Name der Jnlp lautet <em>UserClient.jnlp</em>, damit ergibt sich die spÃ¤tere Web-Url: <em>http://example.org/context/webstart/UserClient.jnlp</em>. Die eigentlichen Ressourcen und AbhÃ¤ngigkeiten werden in <em>jarResources/jarResource</em> definiert. Bei einfachen Projekten wird dies nur eine Ressource sein, theoretisch wÃ¤ren auch mehrere mÃ¶glich. Die Konfiguration Ã¤hnelt der der <em>dependencies</em>.</p><h4>template.vm</h4><p>Im Prinzip ist das Template eine unfertige Jnlp. Sie wird durch das Maven Plugin mit den endgÃ¼ltigen Daten befÃ¼llt. Da bereits die pom.xml Ã¼ber einige Informationen wie Projektnamen, -beschreibung oder -url verfÃ¼gt, kÃ¶nnen so sehr einfach die Daten mit Ã¼bernommen werden. Man kann jedoch auch die Platzhalter entfernen &#8212; es ist eben nur ein Template.</p><p>Ein Beispiel kÃ¶nnte so aussehen:</p><pre class="brush: xml; title: ; notranslate">
&lt;jnlp spec=&quot;$jnlpspec&quot; codebase=&quot;$$codebase&quot;&gt;
  &lt;information&gt;
    &lt;title&gt;$project.Name&lt;/title&gt;
    &lt;vendor&gt;$project.Organization.Name&lt;/vendor&gt;
    &lt;homepage href=&quot;$project.Url&quot;/&gt;
    &lt;description&gt;$project.Description&lt;/description&gt;
    &lt;icon href=&quot;../resources/images/logo.png&quot;/&gt;
    &lt;icon href=&quot;../resources/images/logo.png&quot; kind=&quot;splash&quot;/&gt;
#if($offlineAllowed)
&lt;offline-allowed/&gt;
#end
  &lt;/information&gt;
#if($allPermissions)
&lt;security&gt;
&lt;all-permissions/&gt;
&lt;/security&gt;
#end
  &lt;resources&gt;
    &lt;j2se version=&quot;$j2seVersion&quot;/&gt;
$dependencies
  &lt;/resources&gt;
  &lt;application-desc main-class=&quot;$mainClass&quot;&gt;&lt;/application-desc&gt;
&lt;/jnlp&gt;
</pre><p>Mehr oder weniger simpel, oder? Eventuell sollte man die Adressen zum Logo anpassen (oder entfernen); gerade die letzte Zeile erzeugt einen netten Splashscreen (Ladebild) wÃ¤hrend dem Starten und Laden der Anwendung. Das ist immer gerne willkommen.</p><p>Wichtig: Im Gegensatz zu dem einen oder anderen Beispiel ist es hierbei wichtig, dass die Variable $$codebase heiÃŸt. Nicht etwa ${codebase}. Insgesamt sind in der JNLP &#8212; sofern man sie Ã¼ber das Servlet ausliefert &#8212; folgende Variablen verfÃ¼gbar: codebase, name, context und site.</p><h3>Optimierungen und Verbesserungen</h3><p
style="text-align: center;"><a
href="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/IMG_0095.jpg"><img
class="aligncenter size-large wp-image-1236" title="IMG_0095" src="http://www.knallisworld.de/blog/wp-content/uploads/2010/09/IMG_0095-1024x475.jpg" alt="" width="768" height="356" /></a></p><h4>&#8220;Einmal signiert, bitte!&#8221;</h4><p>Um <em>all-permissions</em> nutzen zu kÃ¶nnen, mÃ¼ssen die Jars und Classfiles signiert werden. Das erreicht man, indem man unter dem XML-Knoten <em>configuration</em> einen Knoten <em>sign</em> anlegt, etwa:</p><pre class="brush: xml; title: ; notranslate">
&lt;sign&gt;
	&lt;keystore&gt;keystore.ks&lt;/keystore&gt;
	&lt;keypass&gt;pass&lt;/keypass&gt;
	&lt;storepass&gt;pass&lt;/storepass&gt;
	&lt;alias&gt;userclient&lt;/alias&gt;
	&lt;validity&gt;36500&lt;/validity&gt;
	&lt;dnameCn&gt;UserClient&lt;/dnameCn&gt;
	&lt;dnameOu&gt;Software Development&lt;/dnameOu&gt;
	&lt;dnameO&gt;The Example Networks&lt;/dnameO&gt;
	&lt;dnameL&gt;Cologne&lt;/dnameL&gt;
	&lt;dnameSt&gt;NRW&lt;/dnameSt&gt;
	&lt;dnameC&gt;DE&lt;/dnameC&gt;
	&lt;verify&gt;false&lt;/verify&gt;
	&lt;keystoreConfig&gt;
		&lt;delete&gt;true&lt;/delete&gt;
		&lt;gen&gt;true&lt;/gen&gt;
	&lt;/keystoreConfig&gt;
&lt;/sign&gt;
</pre><p>Hierbei wird der Keystore lokal erzeugt (keystoreConfig/gen ist true) und nach Gebrauch wieder gelÃ¶scht (keystoreConfig/delete ist true). SelbstverstÃ¤ndlich kann man hier auch a) noch einen Keystore-Generator (s.o.) nutzen oder einen fest konfigurierten, dauerhaften. Dann sollte man natÃ¼rlich die Konfiguration entsprechend anpassen.</p><h4>&#8220;Bitte Optional&#8221; &#8212; alles in ein Profil</h4><p>Die Profile in der <em>pom.xml</em> sind ein mÃ¤chtiges Werkzeug, um bestimmte Features zusammenzufassen. So kÃ¶nnte man das gesamte Build-Plugin in ein Profil &#8212; etwa mit dem Namen <em>with-webstart</em> &#8212; ablegen.</p><p>Selbst die AbhÃ¤ngigkeit zum JnlpDownloadServlet kann man dorthin verlagern &#8212; wenn man daran denkt, dass in diesem Falle auch die web.xml dynamisch erstellt werden soll.</p><h4>Macht der Properties</h4><p>Man kann die Gesamtkonfiguration um einiges komfortabler machen, indem man Properties einfÃ¼hrt und deren Standardwerte &#8220;oben&#8221; in der <em>pom.xml</em> definiert. Gute Kandidaten hierbei wÃ¤ren: userclient.version, keystore.file, keystore.keypass, keystore.storepass und keystore.alias.</p><h4>Noch mehr in Sachen Jnlp</h4><p>In der <em>web.xml</em> kann des Weiteren das verhalten des JnpDownloadServlet verÃ¤ndert werden. Ein Ãœberblick Ã¼ber einige MÃ¶glichkeiten: Â Mimetypen Ã¤ndern, Dateiendungen Ã¤ndern, weitere Mappings anlegen, spezielles Debugging.</p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2010/09/04/howto-maven-wie-man-eine-ausfuhrbare-jar-in-eine-java-webanwendung-war-via-webstart-integriert/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Nette HTML5 Techdemo</title><link>http://www.knallisworld.de/blog/2010/08/31/nette-html5-techdemo/</link> <comments>http://www.knallisworld.de/blog/2010/08/31/nette-html5-techdemo/#comments</comments> <pubDate>Mon, 30 Aug 2010 22:49:38 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Technologie/IT]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1211</guid> <description><![CDATA[The Wilderness Downtime &#8230; ist eine rein HTML5-Anwendung, welche sich auf Basis einer Adresse, den dazugehÃ¶rigen Google Earth und Google StreetView Daten einen Musicclip &#8220;rendert&#8221;. Sehr kreative Idee! Funktioniert mit einem aktuellen Chrome, Chromium oder auch Safari. Wohl aber dem, der ein bisschen Power im Arsch/Rechner hat. Entstammt aus den Google Experiments, und der Chrome [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://www.thewildernessdowntown.com/">The Wilderness Downtime</a></p><p>&#8230; ist eine rein HTML5-Anwendung, welche sich auf Basis einer Adresse, den dazugehÃ¶rigen Google Earth und Google StreetView Daten einen Musicclip &#8220;rendert&#8221;. Sehr kreative Idee!</p><p>Funktioniert mit einem aktuellen Chrome, Chromium oder auch Safari. Wohl aber dem, der ein bisschen Power im Arsch/Rechner hat.</p><p>Entstammt aus den Google Experiments, und der Chrome ist auch zu empfehlen (vor allem bei leistungsschwÃ¤cheren Rechnern).</p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2010/08/31/nette-html5-techdemo/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Safari Extension: HTML5-Video fÃ¼r Tagesschau.de</title><link>http://www.knallisworld.de/blog/2010/08/01/safari-extension-html5-video-fur-tagesschau-de/</link> <comments>http://www.knallisworld.de/blog/2010/08/01/safari-extension-html5-video-fur-tagesschau-de/#comments</comments> <pubDate>Sun, 01 Aug 2010 16:58:30 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[JavaScript]]></category> <category><![CDATA[Safari Extensions]]></category> <category><![CDATA[Technologie/IT]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1152</guid> <description><![CDATA[Die Tagesschau hat in den letzten Tagen ihre Video-Ausgabe-Formate etwas erweitert. Neben dem Format Ogg wurde auch etwas die BenutzerfÃ¼hrung (in meinen Augen) verbessert. Wie auch immer: Ich habe auf die Schnelle eine Extension geschrieben, welche die Flash-Player auf Tagesschau.de automatisch in entsprechende HTML5-Tags umwandelt. Der Code ist zur freien VerfÃ¼gung unter GitHub einsehbar, der [...]]]></description> <content:encoded><![CDATA[<p>Die Tagesschau hat in den letzten Tagen ihre Video-Ausgabe-Formate etwas <a
href="http://linuxundich.de/de/ubuntu/tagesschau-mit-ogg-theora-videos/">erweitert</a>. Neben dem Format Ogg wurde auch etwas die BenutzerfÃ¼hrung (in meinen Augen) verbessert.</p><p>Wie auch immer: Ich habe auf die Schnelle eine Extension geschrieben, welche die Flash-Player auf Tagesschau.de automatisch in entsprechende HTML5-Tags umwandelt. Der Code ist zur freien VerfÃ¼gung unter GitHub <a
href="http://github.com/knalli/knallicious/tree/master/TagesschauVideo.safariextension/">einsehbar</a>, der Download ist ebenfalls dort unter <a
href="http://github.com/knalli/knallicious/downloads">Downloads</a> zu finden.</p><p>Beispiel anhand der Seite http://www.tagesschau.de/ausland/swift172.html</p><div
id="attachment_1153" class="wp-caption aligncenter" style="width: 310px"><a
href="http://www.knallisworld.de/blog/wp-content/uploads/2010/08/Bildschirmfoto-2010-08-01-um-18.52.24.png"><img
class="size-medium wp-image-1153" title="Tagesschau mit Flash" src="http://www.knallisworld.de/blog/wp-content/uploads/2010/08/Bildschirmfoto-2010-08-01-um-18.52.24-300x166.png" alt="Tagesschau mit Flash" width="300" height="166" /></a><p
class="wp-caption-text">Tagesschau mit Flash</p></div><div
id="attachment_1154" class="wp-caption aligncenter" style="width: 310px"><a
href="http://www.knallisworld.de/blog/wp-content/uploads/2010/08/Bildschirmfoto-2010-08-01-um-18.46.45.png"><img
class="size-medium wp-image-1154" title="Tagesschau mit HTML5" src="http://www.knallisworld.de/blog/wp-content/uploads/2010/08/Bildschirmfoto-2010-08-01-um-18.46.45-300x170.png" alt="Tagesschau mit HTML5" width="300" height="170" /></a><p
class="wp-caption-text">Tagesschau mit HTML5</p></div><p>Der Code ist wenig-bis-gar-nicht dokumentiert, sollte aber bei der mehr oder weniger jQuery-TrivilitÃ¤t nicht notwendig sein. Eine Adaption fÃ¼r Chrome/Firefox sollte einfach sein. Wie man im Code sieht, habe ich sogar das Ogg-Format ausgelesen.</p><div
id="attachment_1156" class="wp-caption aligncenter" style="width: 310px"><a
href="http://www.knallisworld.de/blog/wp-content/uploads/2010/08/Bildschirmfoto-2010-08-01-um-18.55.43.png"><img
class="size-medium wp-image-1156" title="Resultat: HTML" src="http://www.knallisworld.de/blog/wp-content/uploads/2010/08/Bildschirmfoto-2010-08-01-um-18.55.43-300x39.png" alt="Resultat: HTML" width="300" height="39" /></a><p
class="wp-caption-text">Resultat: HTML</p></div><p>Anregungen sind gerne willkommen.</p><p>Derzeit werden nur die Filme auf normalen Artikeln ausgetauscht; keine Sidebars, mutmaÃŸlich auch keine Extra- oder Spezialseiten. AuÃŸerdem ist &#8211; derzeit &#8211; die Kodierung auf H.264-High und Ogg fest eingestellt. Flash lÃ¤dt im Vergleich immer H.264-Medium.</p> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2010/08/01/safari-extension-html5-video-fur-tagesschau-de/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Tipp: Douglas Crockford &#8211; The JSON Saga</title><link>http://www.knallisworld.de/blog/2010/06/06/tipp-douglas-crockford-the-json-saga/</link> <comments>http://www.knallisworld.de/blog/2010/06/06/tipp-douglas-crockford-the-json-saga/#comments</comments> <pubDate>Sun, 06 Jun 2010 12:39:45 +0000</pubDate> <dc:creator>knalli</dc:creator> <category><![CDATA[Empfehlungen]]></category> <category><![CDATA[Technologie/IT]]></category> <category><![CDATA[Video]]></category> <guid
isPermaLink="false">http://www.knallisworld.de/blog/?p=1101</guid> <description><![CDATA[Link Der Chuck Norris im JavaScript. Beispiel? I give permission for IBM, its customers, partners, and minions, to use JSLint for evil.]]></description> <content:encoded><![CDATA[<p><a
href="http://developer.yahoo.com/yui/theater/video.php?v=crockford-json">Link</a></p><p>Der Chuck Norris im JavaScript. <img
src='http://www.knallisworld.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p><p>Beispiel?</p><blockquote><p>I give permission for IBM, its customers, partners, and minions, to use JSLint for evil.</p></blockquote> ]]></content:encoded> <wfw:commentRss>http://www.knallisworld.de/blog/2010/06/06/tipp-douglas-crockford-the-json-saga/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
