<?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>snirgel.de - Es ist im Computer drin &#187; snirgel</title>
	<atom:link href="http://www.snirgel.de/author/admin/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.snirgel.de</link>
	<description>openid, open standards, offene standards, open web</description>
	<lastBuildDate>Thu, 19 Aug 2010 11:46:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>OOT: Seminarreihe</title>
		<link>http://www.snirgel.de/2010/08/19/oot-seminarreihe/</link>
		<comments>http://www.snirgel.de/2010/08/19/oot-seminarreihe/#comments</comments>
		<pubDate>Thu, 19 Aug 2010 11:29:52 +0000</pubDate>
		<dc:creator>snirgel</dc:creator>
				<category><![CDATA[stuff]]></category>
		<category><![CDATA[chicken]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[fun]]></category>
		<category><![CDATA[ninja]]></category>
		<category><![CDATA[ninjas]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[seminare]]></category>
		<category><![CDATA[seminarreihe]]></category>
		<category><![CDATA[spass]]></category>

		<guid isPermaLink="false">http://www.snirgel.de/?p=360</guid>
		<description><![CDATA[OOT = Out Of Topic

Aus aktuellem Anlass möchte ich  [...]]]></description>
			<content:encoded><![CDATA[<p>OOT = Out Of Topic</p>
<p>Aus aktuellem Anlass möchte ich heute einmal auf folgende Seminarreihe hinweisen. Anmeldungen bitte in den Kommentaren. Die Gebühren können direkt an mich überwiesen werden oder auch Bar per Post zugestellt werden.</p>
<p>Kategorie: Freizeit<br />
<strong>Thema: Actionfiguren sammeln leicht gemacht</strong><br />
Referent: <a href="http://notizblog.org">Matthias Pfefferle</a><br />
Kosten: 3000 Euro (Early Bird: 3500), ggf, Gruppenrabatt<br />
Teilnehmerzahl: unbegrenzt</p>
<p>Kategorie: Games<br />
<strong>Thema: PHP zocken für Fortgeschrittene</strong><br />
Referenten: <a href="http://notizblog.org">Matthias Pfefferle</a> &#038; <a href="http://weyands.net/">Christian Weyand</a><br />
Kosten: 6000 Euro (Early Bird: 6500), ggf, Gruppenrabatt<br />
Teilnehmerzahl: unbegrenzt</p>
<p>Katgorie: Sport<br />
<strong>Thema: So kickst du HTML</strong><br />
Referent: <a href="http://www.derfussballblogger.de">Christian Schätzle</a><br />
Kosten: 3000 Euro (Early Bird: 3500), ggf, Gruppenrabatt<br />
Voraussetzung: Gute Grundkondition<br />
Teilnehmerzahl: unbegrenzt</p>
<p>Kategorie: Philosophie<br />
<strong>Thema: Code like a chicken &#8211; Wer war zuerst da? DER Huhn oder DAS Ei?</strong><br />
Referent: <a href="http://www.thomashuhn.com">Thomas Huhn</a><br />
Kosten: 3000 Euro (Early Bird: 3500), ggf, Gruppenrabatt<br />
Voraussetzung: Gut erweitertes Bewußtsein zur Not künstlich herbeigeführt</p>
<p>Kategorie: Freizeit<br />
<strong>Thema: Comics lesen für Dummies</strong><br />
Referent: <a href="http://notizblog.org">Matthias Pfefferle</a><br />
Kosten: 3000 Euro (Early Bird: 3500), ggf, Gruppenrabatt<br />
Teilnehmerzahl: unbegrenzt</p>
<p>Kategorie: Pop und Rock<br />
<strong>Thema: Symfony of destruction</strong><br />
Referent: <a href="http://weyands.net/">Christian Weyand</a><br />
Kosten: 3000 Euro (Early Bird: 3500), ggf, Gruppenrabatt<br />
Teilnehmerzahl: unbegrenzt</p>
<p>Kategorie: Sport<br />
<strong>Thema: Fuck the norm and fight the code</strong><br />
Referent: <a href="http://www.snirgel.de/">Karina Mies</a><br />
Kosten: 3000 Euro (Early Bird: 3500), ggf, Gruppenrabatt<br />
Anmerkung: Für etwaige Verletzungen übernimmt der Veranstalter keine Haftung. Körperexterne Waffen nicht erlaubt.<br />
Teilnehmerzahl: unbegrenzt</p>
<p>Kategorie: Esotherik<br />
<strong>Thema: Den Linux Kernel verstehen und tanzen</strong><br />
Referent: <a href="http://uberdirk.de">Dirk Müller</a><br />
Kosten: 3000 Euro (Early Bird: 3500), ggf, Gruppenrabatt<br />
Voraussetzung: Gut erweitertes Bewußtsein zur Not künstlich herbeigeführt<br />
Teilnehmerzahl: unbegrenzt</p>
<p>Der jeweilige Seminarort wird je nach Teilnehmerzahl gewählt und zu späterem Zeitpunk bekannt gegeben.</p>
<p>Ich denke die Themen sind durchaus interessant und sehr abwechslungsreich und das ein oder andere Schnäppchen ist auch dabei. Wir freuen uns über rege Teilnahme.</p>
 <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://www.snirgel.de/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><p style="clear: both;">
                   <iframe scrolling="no" frameborder="0" marginwidth="0" marginheight="0"
                           style="overflow: hidden; width: 400px; height: 30px;"
                           src="http://widgets.yiid.com/w/like/full.php?cult=de&type=like&url=http%3A%2F%2Fwww.snirgel.de%2F2010%2F08%2F19%2Foot-seminarreihe%2F&title=OOT%3A+Seminarreihe&color=%23000000"
                           allowtransparency="true">
                   </iframe>
                   </p>]]></content:encoded>
			<wfw:commentRss>http://www.snirgel.de/2010/08/19/oot-seminarreihe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linklog &#8211; 312376.85052004055</title>
		<link>http://www.snirgel.de/2010/08/16/linklog-312376-85052004055/</link>
		<comments>http://www.snirgel.de/2010/08/16/linklog-312376-85052004055/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 10:45:45 +0000</pubDate>
		<dc:creator>snirgel</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[linklog]]></category>

		<guid isPermaLink="false">http://www.snirgel.de/?p=342</guid>
		<description><![CDATA[Wenn das in der Überschrift steht, dann kommt ein Post [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn das in der Überschrift steht, dann kommt ein Post mit Links, die ich in der letzten Zeit hilfreich, cool, witzig oder vielleicht auch doof fand. Anzumerken ist, dass ich dabei nicht den Anspruch auf absolute Aktualität habe, denn auch Sachen die schon etwas älter sind können ja trotzdem gut sein und einem das Leben erleichtern und verschönern.</p>
<p><strong><a href="http://html5boilerplate.com/">HTML5 Boilerplate</a></strong><br />
<a href="http://paulirish.com/">Paul Irish</a> und <a href="http://nimbupani.com/">Divya Manian</a> haben eine HTML5-Template-Schablone gebastelt, die man quasi als Vorlage nutzen und weiterverarbeiten kann. Alles dazu fintet ihr unter <a href="http://www.html5boilerplate.com">html5boilerplate.com</a> und den <a href="http://github.com/paulirish/html5-boilerplate">aktuellen Code</a> dazu natürlich bei <a href="http://github.com">github</a></p>
<p><strong><a href="http://jquerymobile.com/2010/08/announcing-the-jquery-mobile-project/">jQuery Mobile Project</a></strong><br />
Auch wenn ich in Sachen mobile mehr der Steinzeitmensch bin find ichs natürlich cool, dass man sich mit dem Projekt darum kümmert, eine platformübergreifende Lösung für JS-Mobile-Applikationen zu bauen: <a href="http://jquerymobile.com/">http://jquerymobile.com/</a>. Vielleicht holt mich das ja dann auch aus der Steinzeit in die Neuzeit zurück.</p>
<p><strong><a href="http://centricle.com/tools/html-entities/">HTML Entititities</a></strong><br />
Um mit euch meinen wunderschönen Code teilen zu können habe ich mich auf die Suche nach einem Wp-Plugin gemacht, was mir die HTML-Tags in Entities umwandelt, damit alles richtig dargestellt wird. Nach erfolglosem Finden bin ich aber <a href="http://centricle.com/tools/html-entities/">auf dies kleine Tool</a> gestoßen, was per Button-Klick alles umwandelt. Sicherlich auch nicht der Königsweg, aber trotzdem nett und mir eine Erwähnung wert.</p>
<p><strong><a href="http://js1k.com/home">Competition! Competition! Competition!</a></strong><br />
Leider scheitere ich immer an meiner eigenen Unkreativität und stehe mir deswegen selbst im Weg, um an sowas teilzunehmen, trotzdem finde ich die Aktion <a href="http://js1k.com/home">JS1k</a> großartig. Ziel ist es ein Javascript zu schreiben, was kleiner als 1 Kilobyte und dabei trotzdem cool ist. Vielleicht hab ihr ja ne Idee???</p>
<script type="text/javascript">
var flattr_wp_ver = '0.9.11';
var flattr_uid = '17104';
var flattr_url = 'http://www.snirgel.de';
var flattr_lng = 'de_DE';
var flattr_cat = 'text';
var flattr_tag = 'blog,wordpress,rss,feed';
var flattr_btn = 'large';
var flattr_tle = 'snirgel.de - Es ist im Computer drin';
var flattr_dsc = 'openid, open standards, offene standards, open web';
</script>
<script src="http://api.flattr.com/button/load.js?v=0.2" type="text/javascript"></script> <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://www.snirgel.de/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><p style="clear: both;">
                   <iframe scrolling="no" frameborder="0" marginwidth="0" marginheight="0"
                           style="overflow: hidden; width: 400px; height: 30px;"
                           src="http://widgets.yiid.com/w/like/full.php?cult=de&type=like&url=http%3A%2F%2Fwww.snirgel.de%2F2010%2F08%2F16%2Flinklog-312376-85052004055%2F&title=Linklog+%26%238211%3B+312376.85052004055&color=%23000000"
                           allowtransparency="true">
                   </iframe>
                   </p>]]></content:encoded>
			<wfw:commentRss>http://www.snirgel.de/2010/08/16/linklog-312376-85052004055/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript: Klickst du schneller</title>
		<link>http://www.snirgel.de/2010/08/06/javascript-klickst-du-schneller/</link>
		<comments>http://www.snirgel.de/2010/08/06/javascript-klickst-du-schneller/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 11:30:13 +0000</pubDate>
		<dc:creator>snirgel</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[binding]]></category>
		<category><![CDATA[data-attr]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[onclick]]></category>

		<guid isPermaLink="false">http://www.snirgel.de/?p=320</guid>
		<description><![CDATA[Ganz vergessen vorm Urlaub zu veröffentlichen: 

Jaj [...]]]></description>
			<content:encoded><![CDATA[<p>Ganz vergessen vorm Urlaub zu veröffentlichen: </p>
<p>Jaja&#8230;immer noch die onclick &#8211; Geschichte. Dies wird dann aber der letzte Post dazu, versprochen. Ich hab da aber nach langem Rumdiskutieren und Recherchieren mal ein wenig getestet und will euch die Ergebnisse nicht vorenthalten, falls ihr mal vor dem selben Problem steht.</p>
<p>Die Sache war nämlich die, dass mein <a href="http://notizblog.org">CTO</a> und ich nicht auf einen Nenner gekommen sind, ob wir trotz der großartigen Erkenntnis mit dem data-attr nicht doch onclick benutzen sollen. Argumente für und gegen Beides gab es ausreichend. Es mußten also Fakten her und die sollten sich daraus generieren, was nun beim initialen Laden letztendlich schneller ist.</p>
<p>Um dies rauszufinden bin ich zunächst hergegangen und habe eine Seite gebaut, die mir 1000 links erzeugt hat und mir einen Timer je ans Anfang und Ende des Body-Elements gesetzt:</p>
<pre>
&lt;body&gt;
  &lt;script&gt;console.time('timerName');&lt;/script&gt;
  &lt;?php for(i=0, i&lt;2000, i++) { ?&gt;
    &lt;a href=&quot;/&quot;&gt;dumdidum&lt;/a&gt;
  &lt;?php } ?&gt;
  &lt;script type=&quot;text/javascript&quot; src=&quot;meinescripte.min.js&quot;&gt;&lt;/script&gt;
  &lt;script&gt;console.timeEnd('timerName');&lt;/script&gt;
&lt;/body&gt;
</pre>
<p>Die Seite habe ich jetzt 30 mal geladen und die Zeit gemessen um einen Referenzwert zu bekommen.<br />
Um den Durchschnitt zu bilden habe ich von den gesammelten Zeiten je die schnellste und langsamste Zeit rausgestrichen, also folgende Rechnung durchgeführt:</p>
<p>Durchschnitt = &sum;(time(1&#8230;29))/28 (->ich bin nicht so gut in Formeln aufstellen wie man merkt, aber ich denke, ihr wißt, was ich meine)</p>
<p>Dann habe ich meinen Link mit einem onclick bestückt:</p>
<pre>
&lt;body&gt;
  &lt;script&gt;console.time('timerName');&lt;/script&gt;
  &lt;?php for(i=0, i&lt;2000, i++) { ?&gt;
    &lt;a href=&quot;/&quot; onclick=&quot;myfunction({'id':'&lt;?php echo $i ?&gt;'})&quot;&gt;dumdidum&lt;/a&gt;
  &lt;?php } ?&gt;
  &lt;script type=&quot;text/javascript&quot; src=&quot;meinescripte.min.js&quot;&gt;&lt;/script&gt;
  &lt;script&gt;console.timeEnd('timerName');&lt;/script&gt;
&lt;/body&gt;
</pre>
<p>Selbiges noch einmal in der bind-click-unobstrusive-data-attr Variante:</p>
<pre>
&lt;body&gt;
  &lt;script&gt;console.time('timerName');&lt;/script&gt;
  &lt;div id=&quot;parentid&quot;&gt;
    &lt;?php for(i=0, i&lt;2000, i++) { ?&gt;
      &lt;a href=&quot;/&quot; class=&quot;my-link&quot; data-obj='{&quot;id&quot;:&quot;&lt;?php echo $i; ?&gt;&quot;}'&gt;dumdidum&lt;/a&gt;
    &lt;?php } ?&gt;
  &lt;/div&gt;
  &lt;script type=&quot;text/javascript&quot; src=&quot;meinescripte.min.js&quot;&gt;&lt;/script&gt;

  &lt;script&gt;
    jQuery(document).ready( function() {
      jQuery('#parentid .my-link').live('click', function(){
        return false;
      });
    });
    console.timeEnd('timerName');
  &lt;/script&gt;
&lt;/body&gt;
</pre>
<p>Nach wiederum je 30 Reloads und obiger Rechnung ergaben sich zum allgemeinen Erstaunen folgende Ergebnisse:</p>
<table>
<tr>
<td>Ohne Klick:</td>
<td>1577,50 Sekunden</td>
</tr>
<tr>
<td>Late Binding:</td>
<td>1726,03 Sekunden</td>
</tr>
<tr>
<td>onclick:</td>
<td>1885,07 Sekunden</td>
</tr>
</table>
<p>Irgendwie hatte ich nicht damit gerechnet, dass das late-binding wirklich schneller ist, als das gute alte onclick. Warum das so ist, kann ich mir auch nicht ganz erklären. Ich schätze mal, dass es daran liegen könnte, dass bei jedem onclick ein Event-Objekt instanziiert wird und das wohl seine Zeit dauert, wenn das bei jedem onclick extra gemacht wird, als eben gesammelt nachher. Aber wie gesagt, im Detail hab ich keinen Plan.</p>
<p>Ich hoffe mal, dass das Ganze jetzt nicht zu sehr nach Milchmädchenrechnung aussieht, denn natürlich könnte man meinen, dass nach 30 Reloads und bei der Art der Messung wahrhaftig keine validen Ergebnisse zustande kommen. Aber meiner Ansicht nach, ist eine klare Tendenz zu erkennen, dass das late-binding etwas performanter abläuft.</p>
 <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://www.snirgel.de/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><p style="clear: both;">
                   <iframe scrolling="no" frameborder="0" marginwidth="0" marginheight="0"
                           style="overflow: hidden; width: 400px; height: 30px;"
                           src="http://widgets.yiid.com/w/like/full.php?cult=de&type=like&url=http%3A%2F%2Fwww.snirgel.de%2F2010%2F08%2F06%2Fjavascript-klickst-du-schneller%2F&title=Javascript%3A+Klickst+du+schneller&color=%23000000"
                           allowtransparency="true">
                   </iframe>
                   </p>]]></content:encoded>
			<wfw:commentRss>http://www.snirgel.de/2010/08/06/javascript-klickst-du-schneller/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JS: onclick war die Frage, HTML5 die Antwort?</title>
		<link>http://www.snirgel.de/2010/07/14/js-onclick-war-die-frage-html5-die-antwort/</link>
		<comments>http://www.snirgel.de/2010/07/14/js-onclick-war-die-frage-html5-die-antwort/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 06:29:47 +0000</pubDate>
		<dc:creator>snirgel</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[data-attribute]]></category>

		<guid isPermaLink="false">http://www.snirgel.de/?p=295</guid>
		<description><![CDATA[Gestern hatte ich ja die Frage aufgeworfen, ob das gute [...]]]></description>
			<content:encoded><![CDATA[<p>Gestern hatte ich ja die Frage aufgeworfen, ob das gute alte onclick eigentlich noch verwendet werden soll und/oder ob man auf Biegen und Brechen auf unobstrusive bestehen sollte. Mein größtes Problem bei der ganzen unobstrusive Geschichte war dabei, dass ich mir Information wie, an welche Action und mit welchen Parametern, irgendwo im HTML merken muss, um das ganze möglichst generisch zu behandeln. </p>
<p>Nach einigen Diskussionen und Recherche ist mir eine Lösung untergekommen, die ich zu diesem Zeitpunkt zwar warscheinlich nicht implementieren werde, ich aber trotzdem irgendwie großartig finde (zugegeben, ich habe mich mit HTML 5 bisher noch nicht sonderlich auseinandergesetzt, weil &#8220;Never trust a draft&#8221;). Deswegen hier dann mal der Ansatz für alle, die wie ich vielleicht noch ein wenig hinterher sind:</p>
<p>1. Man definiere ein Element und füge die in HTML5 vorgesehen data-attribute hinzu:</p>
<pre>
  &lt;ul&gt;
    &lt;li class="listeelement" data-action="login" data-id="1" data-params="a=b"&gt;
      &lt;div&gt;contentzeug&lt;/div&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
</pre>
<p>2. Man hole sich die gesetzten data-attribute im Javascript<br />
2.1 Einmal für die doofen Browser statisch:</p>
<pre>
jQuery('.listeelement').live( "click", function() {
  var action = this.getAttribute('data-action');
  var id = this.getAttribute('data-id');
  var params = this.getAttribute('data-params');
}
</pre>
<p>Statisch deswegen, weil ich hier beim im Javascript auch immer genau wissen muss, welche data-attributes gesetzt sind</p>
<p>2.2 Für die doofen Browser <a href="http://www.orangesoda.net/jquery.dataset.html">mit jQuery-Plugin</a> und nicht ganz so statisch, da es eine Methode gibt, die alle data-attribute holt</p>
<pre>
jQuery('.listeelement').live( "click", function() {
    var mydataset =  jQuery(this).dataset();
    var myaction = mydataset.action;
    delete mydataset.action //damit die action nicht nochmal ans GET/POST als Param dran gehangen wird
    doSendRequest(myaction, mydataset);
});
</pre>
<p>2.3 Oder ganz einfach wie in der <a href="http://dev.w3.org/html5/spec/Overview.html#attr-data/">HTML5-Spec beschrieben</a>, was im Endeffekt wohl dasselbe ist, wie 2.2. Da ich das Plugin nicht ausprobiert habe, kann ich derweil nicht sagen, was es mit den data-attributen in den doofen Browsern macht. Gilt noch zu recherchieren!</p>
<pre>
  jQuery('.listeelement').live( "click", function() {
    var mydataset =  this.dataset;
    var myaction = mydataset.action;
    delete mydataset.action //damit die action nicht nochmal ans GET/POST als Param dran gehangen wird
    doSendRequest(myaction, mydataset);
  });
</pre>
<p>3. Man schicke den ganzen Kram an die Action. Aber ACHTUNG, nicht funktionierend mit der Variante 1, da müßt ich dann nochmal bißchen Hirnschmalz für opfern, um das praktikable zu gestalten:</p>
<pre>
  function doSendRequest(pAction, pParams) {
      jQuery.ajax({
        type: "GET",
        url: pAction,
        data: pParams,
        success: doSomething
      });
  }
</pre>
<p>Na? Was meint Ihr? Ich finds insgesamt ner sehr gelungend Lösung und bin nahezu begeistert, mal abgesehn von der statischen Variante für die doofen Browser, aber sicherlich ließe sich auch hier noch was geeignetes finden.</p>
<p>Mein herzlicher Dank geht an den Input von der großartigen Community von <a href="http://stackoverflow.com/">Stackoverflow</a>. Klickt ihr <a href="http://stackoverflow.com/questions/3235941/javascript-best-practice-onclick-vs-unobstrusive">hier</a> und <a href="http://stackoverflow.com/questions/2412947/do-html5-custom-data-attributes-work-in-ie-6">hier</a> um die entsprechenden Diskussionen anzuschauen.</p>
<script type="text/javascript">
var flattr_wp_ver = '0.9.11';
var flattr_uid = '17104';
var flattr_url = 'http://www.snirgel.de';
var flattr_lng = 'de_DE';
var flattr_cat = 'text';
var flattr_tag = 'blog,wordpress,rss,feed';
var flattr_btn = 'large';
var flattr_tle = 'snirgel.de - Es ist im Computer drin';
var flattr_dsc = 'openid, open standards, offene standards, open web';
</script>
<script src="http://api.flattr.com/button/load.js?v=0.2" type="text/javascript"></script> <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://www.snirgel.de/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><p style="clear: both;">
                   <iframe scrolling="no" frameborder="0" marginwidth="0" marginheight="0"
                           style="overflow: hidden; width: 400px; height: 30px;"
                           src="http://widgets.yiid.com/w/like/full.php?cult=de&type=like&url=http%3A%2F%2Fwww.snirgel.de%2F2010%2F07%2F14%2Fjs-onclick-war-die-frage-html5-die-antwort%2F&title=JS%3A+onclick+war+die+Frage%2C+HTML5+die+Antwort%3F&color=%23000000"
                           allowtransparency="true">
                   </iframe>
                   </p>]]></content:encoded>
			<wfw:commentRss>http://www.snirgel.de/2010/07/14/js-onclick-war-die-frage-html5-die-antwort/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>JS: onclick oder nicht, das ist hier die Frage</title>
		<link>http://www.snirgel.de/2010/07/13/js-onclick-oder-nicht-das-ist-hier-die-frage/</link>
		<comments>http://www.snirgel.de/2010/07/13/js-onclick-oder-nicht-das-ist-hier-die-frage/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 08:16:07 +0000</pubDate>
		<dc:creator>snirgel</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[bestpractice]]></category>
		<category><![CDATA[eventhandling]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[unubstrusive]]></category>

		<guid isPermaLink="false">http://www.snirgel.de/?p=286</guid>
		<description><![CDATA[Ich versuche mittlerweile Javascript immer möglichst g [...]]]></description>
			<content:encoded><![CDATA[<p>Ich versuche mittlerweile Javascript immer möglichst generisch zu schreiben um Redundanzen zu vermeiden und  zusätzlich möchte ich am liebsten auch kein Inline-Javascript verwenden. Diese hat neben den best-practice-unobstrusive-&#8230; auch Performance-Gründe, denn bei jedem sich öffnenden Script-Tag im Code wartet die Seite beim Laden bis dieser ausgeführt ist und wird dann erst weiter gerendert.</p>
<p>Jetzt stehe ich gerade vor dem Problem, dass ich eine Liste von Elementen habe, die bei einem Klick alle das gleiche machen sollen, nämlich einen Request, der HTML zurückliefert, womit ein anderer Bereich der Seite aktualisiert wird:</p>
<pre>
  &lt;ul&gt;
    &lt;li class="listeelement" id="load-content-id-1"&gt;&lt;div&gt;contentzeug&lt;/div&gt;&lt;/li&gt;
    &lt;li class="listeelement" id="load-content-id-2"&gt;&lt;div&gt;contentzeug&lt;/div&gt;&lt;/li&gt;
    &lt;li class="listeelement" id="load-content-id-3"&gt;&lt;div&gt;contentzeug&lt;/div&gt;&lt;/li&gt;
    &lt;li class="listeelement" id="load-content-id-4"&gt;&lt;div&gt;contentzeug&lt;/div&gt;&lt;/li&gt;
  &lt;/ul&gt;
</pre>
<p>Im ersten Moment würde ich jetzt den Klick wie folgt an das .listelement hängen und den Request starten (so auch meine bisherige Vorgehensweise):</p>
<pre>
function sendRequest() {
  jQuery('.listeelement').live( "click", function() {
    1. Fummel die Id des nachzuladenden Contents aus der css-id raus
    2. Sende den Request an die Action
  });
}
</pre>
<p>Irgendwie nervt mich hierbei aber ganz gewaltig Punkt 1 bei der Verarbeitung des Klicks. Denn man muss etwaige Parameter erstens immer irgendwie im Markup &#8216;verstecken&#8217; und zweitens es dann wieder rausfummeln um es an die Action zu schicken. Schön ist anders und unter dem Performance-Aspekt kann das ja auch nicht der Stein des Weisen sein. </p>
<p>Am einfachsten und mir am liebsten wäre meiner Ansicht nach einfach folgendes:</p>
<pre>
  &lt;ul>
    &lt;li onclick="sendRequest({'id' : '1' })"&gt;&lt;div&gt;contentzeug&lt;/div&gt;&lt;/li&gt;
    &lt;li onclick="sendRequest({'id' : '2' })"&gt;&lt;div&gt;contentzeug&lt;/div&gt;&lt;/li&gt;
    &lt;li onclick="sendRequest({'id' : '3' })"&gt;&lt;div&gt;contentzeug&lt;/div&gt;&lt;/li&gt;
    &lt;li onclick="sendRequest({'id' : '4' })"&gt;&lt;div&gt;contentzeug&lt;/div&gt;&lt;/li&gt;
  &lt;/ul&gt;
</pre>
<p>Woraus sich folgendes Script ergibt:</p>
<pre>
function sendRequest(pParams) {
      jQuery.ajax({
        type: "GET",
        url: action,
        dataType: "json",
        data: pParams,
        success: doSomething
      });
}
</pre>
<p>Die Verarbeitung ist, meiner Ansicht nach, damit definitv viel einfacher und auch schneller, würd ich mal meinen.<br />
Ich bin aber etwas unsicher, ob das jetzt ne gute oder schlechte Idee ist diesen Weg zu gehn, da zumal auch nicht genau weiß, ob das onclick überhaupt noch verwendet werden soll.</p>
<p>Na vielleicht hat da ja irgendjemand ne Meinung dazu. Würde mich freuen und auch wirklich weiterhelfen.</p>
 <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://www.snirgel.de/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><p style="clear: both;">
                   <iframe scrolling="no" frameborder="0" marginwidth="0" marginheight="0"
                           style="overflow: hidden; width: 400px; height: 30px;"
                           src="http://widgets.yiid.com/w/like/full.php?cult=de&type=like&url=http%3A%2F%2Fwww.snirgel.de%2F2010%2F07%2F13%2Fjs-onclick-oder-nicht-das-ist-hier-die-frage%2F&title=JS%3A+onclick+oder+nicht%2C+das+ist+hier+die+Frage&color=%23000000"
                           allowtransparency="true">
                   </iframe>
                   </p>]]></content:encoded>
			<wfw:commentRss>http://www.snirgel.de/2010/07/13/js-onclick-oder-nicht-das-ist-hier-die-frage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JS: Simple Error Handling</title>
		<link>http://www.snirgel.de/2010/07/08/js-simple-error-handling/</link>
		<comments>http://www.snirgel.de/2010/07/08/js-simple-error-handling/#comments</comments>
		<pubDate>Thu, 08 Jul 2010 15:47:23 +0000</pubDate>
		<dc:creator>snirgel</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[errorhandling]]></category>
		<category><![CDATA[errors]]></category>
		<category><![CDATA[js]]></category>

		<guid isPermaLink="false">http://www.snirgel.de/?p=272</guid>
		<description><![CDATA[Error-Handling für Javascript ist derzeit bei mir und  [...]]]></description>
			<content:encoded><![CDATA[<p>Error-Handling für Javascript ist derzeit bei mir und meiner Umgebung ein viel diskutiertes Thema. Die Frage ist dabei: Wie fängt man die Fehler ab und loggt sie mit und das alles am besten noch so, dass die Performance nicht darunter leidet.</p>
<p>Der Königinnenweg ist mir dabei noch nicht ganz gekommen. Aber zwei Dinge sollte man von vorneherein schonmal machen, um Fehler einzugrenzen, abzufangen, wegzutun: </p>
<p>1. Alle Javascriptfehler global unterdrücken:</p>
<pre>
window.onerror=function(msg, url, linenumber){
   //request starten um fehler wegzuloggen
   return true;
}
</pre>
<p>Dies bewirkt, dass der User auch noch weiter klicken kann, selbst wenn irgendwo ein Semikolon im Js-Code gefehlt hat. Die drei Parameter msg, url und linenumber geben dabei genauer Auskunft darüber, was genau wo passiert ist.<br />
Diese Info könnte man jetzt bspw. über einen xh-request irgendwo an den Server schicken und wegloggen.</p>
<p>2. Ajax-Request-Fehler abfangen</p>
<pre>
  onreadystatechange = myonreadystatecallback
</pre>
<p>In der myonreadystatecallback kann man dann die verschiedenen Stati des Requests reagieren und gegebenenfalls die Response-Fehler auswerten und wegloggen. Das ganze kann dann so aussehn:</p>
<pre>
  xhr.onreadystatechange = function() {

    if(xhr.readyState == 4 //4 = request fertig) {
      if(xhr.status != 200) {
        //request starten um fehler wegzuloggen
      }
    }
  }
</pre>
<p>Da der Post ja Simple Error Handling heißt, soll es das auch erstmal gewesen sein. In großen Projekten ist es natürlich sinnvoll für beide Lösungen eine globale Error-Klasse zu schreiben, die sich um die Behandlung kümmert.<br />
Sowas behandlen wir dann vielleicht besser in einem Advanced Error Handling Post <img src='http://www.snirgel.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Denn das Thema kann man bis zur Erschöpfung diskutieren und behandeln.</p>
<p>Insgesamt ist es aber so, dass man mit diesen beiden kleinen Lösungen schonmal jede Menge schaffen kann.<br />
Kurzzeitig hab ich mal gedacht, dass es auch ne gute Idee wäre, um alles im Javascript ein try&#8230;.catch drumzupacken und im catch dann den Fehler wegzuloggen. Mir wurde dann aber recht schnell klar (gemacht), dass dies sehr zur lasten der Performance geht und vor allem versucht wird die Fehler des Entwicklers abzufangen. Und der soll ja eigentlich gar nicht erst welche machen (jslint will hurt your feelings? joa&#8230;aber helfen tuts scho&#8230;)</p>
<script type="text/javascript">
var flattr_wp_ver = '0.9.11';
var flattr_uid = '17104';
var flattr_url = 'http://www.snirgel.de';
var flattr_lng = 'de_DE';
var flattr_cat = 'text';
var flattr_tag = 'blog,wordpress,rss,feed';
var flattr_btn = 'large';
var flattr_tle = 'snirgel.de - Es ist im Computer drin';
var flattr_dsc = 'openid, open standards, offene standards, open web';
</script>
<script src="http://api.flattr.com/button/load.js?v=0.2" type="text/javascript"></script> <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://www.snirgel.de/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><p style="clear: both;">
                   <iframe scrolling="no" frameborder="0" marginwidth="0" marginheight="0"
                           style="overflow: hidden; width: 400px; height: 30px;"
                           src="http://widgets.yiid.com/w/like/full.php?cult=de&type=like&url=http%3A%2F%2Fwww.snirgel.de%2F2010%2F07%2F08%2Fjs-simple-error-handling%2F&title=JS%3A+Simple+Error+Handling&color=%23000000"
                           allowtransparency="true">
                   </iframe>
                   </p>]]></content:encoded>
			<wfw:commentRss>http://www.snirgel.de/2010/07/08/js-simple-error-handling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Themenbruchkante</title>
		<link>http://www.snirgel.de/2010/06/25/themenbruchkante/</link>
		<comments>http://www.snirgel.de/2010/06/25/themenbruchkante/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 14:06:04 +0000</pubDate>
		<dc:creator>snirgel</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[sheself]]></category>

		<guid isPermaLink="false">http://www.snirgel.de/?p=260</guid>
		<description><![CDATA[Insgesamt und überhaupt und sowieso hat das wenig Sinn [...]]]></description>
			<content:encoded><![CDATA[<p>Insgesamt und überhaupt und sowieso hat das wenig Sinn, den Themenschwerpunkt in diesem Blog weiterhin auf das OpenWeb und die damit verbunden Standards, wie vor allem OpenID zu beschränken. Desterwegen habe ich mich dazu entschlossen, euch in Zukunft verstärkt mit anwendungsentwicklertechnischen Problematiken zu konfrontieren. Javascript (!), PHP, Symfony und Co., sind die Dinge, mit denen ich mich tagtäglich am meisten beschäftige, warum also nicht auch die Thematik dieses Blogs ein wenig mehr darauf konzentrieren? </p>
<p>Nicht, dass mich das Openweb nicht mehr interessiert und es darüber nichts mehr zu sagen gäbe, aber erstens reg ich mich meistens sowieso nur auf, zweitens kostet es mich wahnsinnig viel Zeit einen Post über die diesbezüglichen Themen zu verfassen und drittens schließt das eine das andere ja nicht aus. Trotzdem wird es ab sofort etwas Entwickler- und vor allem Javascript-lastiger. Schätzungsweise werden damit auch die Posts kürzer und die Frequenz höher, da ich häufiger schreiben kann, was mir gerade durch den Kopf geht, ohne stundenlang ausholen zu müssen.</p>
<p>Euren Mut und Unmut darüber dürft ihr dann gerne über den in den letzten Wochen entstandenen Button äussern. Kaum zu glauben, dass so ein kleines Ding soviel Tränen, Schweisss und Blut kosten kann. Würde mich also freuen, wenn ihr mal klicken könntet <img src='http://www.snirgel.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><iframe src="http://widgets.yiid.com/w/like/full.php?url=http://www.snirgel.de/2010/06/25/themenbruchkante/" style="overflow:hidden; width: 400px; height: 30px;" frameborder="0" scrolling="no" marginheight="0" allowTransparency="true"></iframe></p>
<p>Feedback welcome (zur Themenbruchkante UND vor allem zum Button natürlich, der sich allerdings noch in der Testphase befindet).</p>
 <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://www.snirgel.de/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><p style="clear: both;">
                   <iframe scrolling="no" frameborder="0" marginwidth="0" marginheight="0"
                           style="overflow: hidden; width: 400px; height: 30px;"
                           src="http://widgets.yiid.com/w/like/full.php?cult=de&type=like&url=http%3A%2F%2Fwww.snirgel.de%2F2010%2F06%2F25%2Fthemenbruchkante%2F&title=Themenbruchkante&color=%23000000"
                           allowtransparency="true">
                   </iframe>
                   </p>]]></content:encoded>
			<wfw:commentRss>http://www.snirgel.de/2010/06/25/themenbruchkante/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Wer bin ich und wenn ja mit wem? &#8211; Authentifizierung mit FbConnect oder OpenID</title>
		<link>http://www.snirgel.de/2010/03/28/wer-bin-ich-und-wenn-ja-mit-wem-authentifizierung-mit-fbconnect-oder-openid/</link>
		<comments>http://www.snirgel.de/2010/03/28/wer-bin-ich-und-wenn-ja-mit-wem-authentifizierung-mit-fbconnect-oder-openid/#comments</comments>
		<pubDate>Sun, 28 Mar 2010 15:30:52 +0000</pubDate>
		<dc:creator>snirgel</dc:creator>
				<category><![CDATA[OpenID]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[data portability]]></category>
		<category><![CDATA[datenaustausch]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[facebook connect]]></category>

		<guid isPermaLink="false">http://www.snirgel.de/?p=250</guid>
		<description><![CDATA[Wie angekündigt werde ich nun heute endlich den "Kampf [...]]]></description>
			<content:encoded><![CDATA[<p>Wie <a href="http://www.snirgel.de/2010/02/14/ring-frei/">angekündigt</a> werde ich nun heute endlich den &#8220;Kampf&#8221; eröffnen und dabei die offenen Technologien und im Gegenzug Facebook-Connect mal etwas genauer anschauen (Achtung, im Vergleich zu sonst wird es etwas technischer) :</p>
<p>&#8220;Authentifizierung und Austausch von Profildaten. Wer ist der User, der meinen Service nutzen möchte?&#8221;</p>
<p>Dank <a href="http://www.yiid.com" target="_blank">yiid</a> durfte ich mich in letzter Zeit etwas näher mit Facebook und dessen APIs auseinandersetzen (man kann sich jetzt seine Facebook-Aktivitäten in <a href="http://www.yiid.com" target="_blank">yiid</a> anzeigen lassen). Dies war, nach anfänglich sehr hoher Motivation meinerseits, nicht unbedingt der Spass, den ich erwartet hatte, sondern ist zur etwas größeren Herausforderung mutiert. Wie auch immer hoffe ich, dass ich jetzt nicht zu (negativ) vorbelastet bin und meine Voreingenommenheit sich in Grenzen hält. Sollte ich zu kritisch werden, dann bitte ich dies zu entschuldigen und auf jeden Fall in den Kommentaren anzumerken.</p>
<h2>OpenID integrieren</h2>
<p>Unter <a href="http://wiki.openid.net/Libraries" target="_blank">wiki.openid.net/Libraries</a> sind neben den Bibliotheken für alle gängigen Programmiersprachen (Java, C#, Python, Ruby&#8230;.) auch insgesamt 7 PHP-Bibliotheken gelistet. Für welche man sich dabei entscheiden mag, ist sicherlich letztendlich Geschmacksache. So gibt es bspw. sowohl Plugins für diverse Frameworks wie Symfony oder auch Drupal, als aber auch unabhängige Klassen, die ich persönlich bevorzugen würde, da Plugins, wie für Symfony, meistens doch nicht genau das machen was man will oder nicht zur Projektkonfiguration passen. Meine Empfehlung deswegen sind die <a href="http://openidenabled.com/php-openid/" target="_blank">PHPOpenID-Klassen von JanRain</a>, mit denen man meiner Ansicht nach nicht viel falsch machen kann (denn ja quasi von den OpenID-Machern gemacht <img src='http://www.snirgel.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ). <a href="http://openidenabled.com/php-openid/" target="_blank">PHPOpenId</a> bringen eigentlich alles mit, was man für einen lauffähigen Client braucht und für ambitionierte bietet die Bibliothek auch die Möglichkeit, selbst einen Provider zu implementieren. Die Extensions für <a href="http://openid.net/specs/openid-simple-registration-extension-1_0.html">sReg</a> und <a href="http://www.axschema.org/" target="_blank">Attribute Exchange</a> sind in den Klassen ebenfalls mit enthalten.</p>
<p>Leider habe ich selbst noch nie einen OpenID-Consumer in ein bestehendes Projekt eingebaut. Um mir aber doch eine Meinung bilden zu können habe ich mir heute mal die Mühe gemacht, zumindest mal etwas näher draufzuschauen und bin <a href="http://www.drweb.de/magazin/openid-demystified-teil-1/" target="_blank">dem -meiner Ansicht nach großartigen- Tutorial</a> auf <a href="http://www.drweb.de/magazin/openid-demystified-teil-1/" target="_self">Dr. Web</a> gefolgt, um mal eine grobe Consumer-Implementierung bei mir Lokal zu &#8220;simulieren&#8221;. Dank des Tutorials war dies denkbar einfach und ich habe keine halbe Stunde gebraucht, um einen Login mit meiner OpenID hinzubekommen und die sReg-Daten gabs obendrein noch gratis dazu. (Aufgrund des erwähnten Tutorials spare ich mir an dieser Stelle weitere Details zur Implentierung, denn ich würde sowieso nur das wiedergeben, was dort steht.). Die komplette OpenId-Integration läuft auf der Server-Seite ab, was die Sache auch nochmal vereinfacht und ich musste mich eigentlich lediglich mit dem anständigen Includieren der Klassen und der Kommunikation zwischen meinem Client und dem Provider kümmern und sonst nichts (Warum das erwähnenswert ist sehen wir nachher bei der Facebook Connect &#8211; Integration).</p>
<p>Natürlich kann man dies als eine kleine Milchmädchenrechnung auslegen, denn ich habe ja kein komplexes Framework, in das das Ganze integriert werden muss. Doch auf Grund der Einfachheit und der Aussagen anderer Entwickler schätze ich den Aufwand auf keinesfalls höher als einen Tag, womit sich der Arbeitsaufwand in Grenzen hält will ich meinen.</p>
<p>Ist man absoluter Neuling auf dem Gebiet OpenID, dann fällt die Auseinandersetzung mit der Thematik sicherlich im ersten Moment ein wenig schwerer. Aber mittlerweile ist OpenID aus den Kinderschuhen entwachsen und es existieren zahlreiche Erklärungen, Tutorials und Dokumentationen zu OpenID. Hier eine kleine Liste:</p>
<ul>
<li>Oben erwähntes Tutorial in Deutsch: <a href="http://www.drweb.de/magazin/openid-demystified-teil-1/">http://www.drweb.de/magazin/openid-demystified-teil-1/</a></li>
<li>Einführung bei Heise (deutsch): <a href="http://www.heise.de/developer/artikel/Identity-Management-Authentifizierungsdienste-mit-OpenID-227202.html" target="_blank">http://www.heise.de/developer/artikel/Identity-Management-Authentifizierungsdienste-mit-OpenID-227202.html</a></li>
<li>Alles über OpenID (deutsch): <a href="http://openidgermany.de">http://openidgermany.de</a></li>
<li>Und natürlich nicht zu vergessen die Basics <a href="http://www.snirgel.de/2008/12/14/openwatt-openid-teil-1/">hier</a> und <a href="http://www.snirgel.de/2008/12/21/openwatt-openid-teil-2/">hier</a> <img src='http://www.snirgel.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  (deutsch)</li>
<li>Best Practice für Consumer (englisch):  <a href="http://wiki.openid.net/Details-of-UX-Best-Practices-for-RPs">http://wiki.openid.net/Details-of-UX-Best-Practices-for-RPs</a></li>
</ul>
<p>OpenID als Consumer für den SingleSignOn zu implementieren scheint mir verhältnismäßig einfach und schnell zu gehen. Mit einem Gewissen Basiswissen und den ausreichenden Dokumentationen fühle ich mich gut gewappnet und konnte schnell und erfolgreich einen Login/Registrierung bauen. Die Integration in ein komplexes Framework kann ich zwar nicht hundertprozentig beurteilen, scheint aber auch vom Aufwand überschaubar. Wenn die Bibliotheken in anderen Programmiersprachen ähnlich komfortabel sind, wie die für PHP, dann fallen mir wenig bis keine Argumente gegen eine Implentierung ein.</p>
<h2>Facebook Connect ingetrieren</h2>
<p>Während ich mich bei der OpenID-Imlementierung lediglich um die serverseitige Implementierung und damit auf PHP konzentrieren konnte, scheinen die Bedürfnisse für Facebook doch ein wenige vielfältiger zu sein. Für den Registrierungs- und Login-Prozess empfiehlt Facebook in seinen Getting-Startet-Dokus die Implementierung mit Javascript, der FacebookMarkupLanguage UND einer serverseitigen Programmiersprache wie PHP. Die <a href="http://wiki.developers.facebook.com/index.php/User:Client_Libraries" target="_blank">serverseitigen Clien-Libraries</a> sind dabei, wie bei OpenID in jeder gängigen Programmiersprache vorhanden, wobei es allerdings von Seiten Facebooks nur für einige wenige einen Support gibt (z.B. für PHP5). Um überhaupt mit der Facebook-Implementierung beginnen zu können, muss man neben den Library-Include noch eine App innerhalb von Facebook selbst anlegen und korrekt konfigurieren, dort erhält man dann auch die unbedingt notwendige application id und das application secret. Beim erstellen der App wird man aufgefordert, die sogenannte  xd_receiver.htm herunterzuladen und gebeten, diese im Verzeichnisroot der eigenen Applikation abzulegen. Hat man dies alles gemacht, dann kann man mit der eigentlichen Implementierung beginnen.</p>
<p>Leider muss ich an dieser Stelle sagen, dass es den Rahmen dieses ohnehin schon wieder sehr langen Artikels definitiv sprengen würde, eine komplette Facebook-Connect-Implementierung zu beschreiben. Deswegen muss ich vorerst  auf die (englischen) Tutorials, die von Facebook selbst bereitgestellt werden verweisen:</p>
<ul>
<li>FacebookConnect Tutorial: <a href="http://wiki.developers.facebook.com/index.php/Facebook_Connect_Tutorial1">http://wiki.developers.facebook.com/index.php/Facebook_Connect_Tutorial1</a></li>
<li>Tutorial von Goldsteintech.com: <a href="http://www.goldsteintech.com/facebook_connect/landing_page.php">http://www.goldsteintech.com/facebook_connect/landing_page.php</a></li>
</ul>
<p>Auf deutsch habe ich dazu noch nichts wirklich Gutes gefunden (wenn ihr eins kennt, bitte in den Kommentaren posten), plane aber in den nächsten Wochen selbst Eines zu schreiben und hier zu veröffentlichen, also noch ein wenig Geduld <img src='http://www.snirgel.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Grob erklärt läuft das Ganze aber über die Facebook-Session-Cookies ab, und es wird überprüft, ob der User gerade bei Facebook eingeloggt ist. Wenn ja, dann muss man nachschauen, ob man innerhalb des Systems eine passende Fb-UserId hat, wenn ja, dann kann man den User einloggen, wenn nein, dann muss der User den FB-Button klicken (ebenso, wenn er gerade nicht bei Fb eingeloggt ist). Nach dem Klicken auf den Button, dem Login bei Facebook und ggf. der Autorisierung der App kommt der User dann zurück auf den eigenen Service und man überpüft erneut die userid. Gibt es den User tatsächlich noch nicht, dann bietet man eine Registrierung an und speichert daraufhin die Daten und die UserId, gibt es ihn, dann kann man ihn einloggen.</p>
<p>Diese Kommunikation wird insgesamt, wie gesagt mit Javascript, FBML und PHP abgefrühstückt. Sicherlich ist auch eine Implenetierung nur mit PHP und HTML möglich, habe ich aber nur kurz ausprobiert und hat nicht besonders gut geklappt (was auch an mir liegen kann).</p>
<p>Hat man nun alles geschafft und erfolgreich eingebaut und alles funktioniert, dann bekommt man (dank der freizügigen FB privacy policies) auch hier eine Fülle von Informationen über den gerade angemeldeten User. Einen kompletten Überblick darüber findet ihr <a href="http://wiki.developers.facebook.com/index.php/Users.getInfo">hier.</a> Vorraussetzung hierfür ist allerdings unbedingt, dass der User eure App hinzugefügt und autorisiert hat.</p>
<p>Die Facebook-Connect-Integration ist mir persönlich sehr schwer gefallen, da mich der Mischmasch aus JS/FBML und PHP extrem irritiert hat. Die Dokumentation der gesamten Facebook-APIs ist zwar unglaublich umfangreich, aber in diesem Fall ist weniger vielleicht manchmal mehr. Beim lesen kommt man von Hölzchen auf Stöckchen und findet eigentlich nie raus, was man jetzt wirklich braucht oder gar falsch macht, wenn etwas nicht klappt. Klar klingt das jetzt sehr schwarz-weiß-malerisch, aber ich habe doch hin und wieder mal irgendwelche APIs angebunden und mir eigentlich selten so schwer getan. Ich schiebe dies auf den Overkill an Informationen, den man bekommt, denn auch die Schritt für Schritt-Anweisungen innerhalb der Doku verweisen einen immer wieder auf weiterführende Informationen und am Ende weiß man gar nicht mehr, wo man vorne angefangen hat.</p>
<p>Genervt hat auch die Registrierung der App innerhalb von Facebook, denn es gibt dann doch ne ganze Menge, die man konfigurieren muss oder jedenfalls kann. Und auch hier hilft einem die Dokumentation nicht so wirklich weiter, denn um komplett zu verstehen, was man wofür braucht oder auch nicht ist man eine ganze ganze Weile erstmal beschäftig. Gefühlt war es so, als hätte ich vorher erstmal ne ein paar Tage recherchieren und Facebook Connect KOMPLETT verstehen müssen, um endlich vernünftig anfangen zu können (und wie gesagt, war jetzt auch nicht meine erste API).</p>
<p>Und leider muss ich noch ein weiteres Minus für Facebook vergeben, denn so schnell ich eben ganz fix den OpenID-Client bei mir lokal implementieren und auch testen konnte, so wenig ging dies mit Facebook Connect, denn die Entwicklung des FB-Logins innerhalb einer lokalen Testumgebung hat nach stundenlangem Rumgefummel immer wieder bloss eine Endlosschleife hervorgebracht. Kann sein, dass es Möglichkeiten gibt, FB lokal zu testen. Wenn ja, dann weiß ich allerdings nicht wie und scheint auch ein wenig mehr Aufwand zu sein. Hinzukommt, dass Facebook den Firebug blockiert, was bedeutet, dass bei angeschaltetem Firebug kein Facebook-Javascript  ausgeführt wird, was das Entwickeln und Debuggen nicht unbedingt besser macht.</p>
<p>Fazit:</p>
<ul>
<li>OpenID &#8211; Klar abgegrenzt, übersichtlich und überschaubar im Aufwand mit wenigen Implementierungshürden und guten Dokus. Zudem gut zu entwickeln, weil lokal test- und ausführbar.</li>
<li>FacebookConnect &#8211; Relativ viele Hürden vorab und Information-Overkill während der Implentierung und bei der Doku. Zudem nicht besonders entwicklerfreundlich durch komplizierte oder nicht mögliche lokale Integration und Testbarkeit. Allerdings: Hat mans mal Verstanden und die Einstiegshürden überwunden, dann ist es ok damit zu arbeiten und warscheinlich sogar relativ einfach <img src='http://www.snirgel.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  -&gt; Übrigends auch ein Satz der mir relativ oft beim Einlesen begegnet ist (&#8216;Wenn mans erst verstanden hat&#8230;..&#8217;)</li>
</ul>
<p>Jaja, ich weiß, die die mich kennen und die Kritiker unter Euch werden jetzt sagen: &#8220;War ja klar, dass sie Facebook per se negativer Beurteilen wird&#8221;. Stimmt, ich mag Facebook und seine, von mir als arrogant empfundene, Politik nicht besonders. Aber als ich angefangen habe mich damit zu beschäftigen, war ich hoch motiviert und auch einigermaßen vorurteilsfrei (ausser,dass es eben proprietär ist). Nach einigen Tagen war ich allerdings so frustriert wie noch nie in meinem Entwicklerdasein, was mich eben zu diesem ein wenig schwarz-weiß-malerischen Urteil gebracht hat.</p>
<p>Auserdem muss ich noch dazu sagen, dass es beim nächsten mal um die Autorisierung von Daten geht, also Facebook vs. oAuth und ich habe den Verdacht, dass Facebook dabei etwas besser abschneiden könnte <img src='http://www.snirgel.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<script type="text/javascript">
var flattr_wp_ver = '0.9.11';
var flattr_uid = '17104';
var flattr_url = 'http://www.snirgel.de';
var flattr_lng = 'de_DE';
var flattr_cat = 'text';
var flattr_tag = 'blog,wordpress,rss,feed';
var flattr_btn = 'large';
var flattr_tle = 'snirgel.de - Es ist im Computer drin';
var flattr_dsc = 'openid, open standards, offene standards, open web';
</script>
<script src="http://api.flattr.com/button/load.js?v=0.2" type="text/javascript"></script> <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://www.snirgel.de/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><p style="clear: both;">
                   <iframe scrolling="no" frameborder="0" marginwidth="0" marginheight="0"
                           style="overflow: hidden; width: 400px; height: 30px;"
                           src="http://widgets.yiid.com/w/like/full.php?cult=de&type=like&url=http%3A%2F%2Fwww.snirgel.de%2F2010%2F03%2F28%2Fwer-bin-ich-und-wenn-ja-mit-wem-authentifizierung-mit-fbconnect-oder-openid%2F&title=Wer+bin+ich+und+wenn+ja+mit+wem%3F+%26%238211%3B+Authentifizierung+mit+FbConnect+oder+OpenID&color=%23000000"
                           allowtransparency="true">
                   </iframe>
                   </p>]]></content:encoded>
			<wfw:commentRss>http://www.snirgel.de/2010/03/28/wer-bin-ich-und-wenn-ja-mit-wem-authentifizierung-mit-fbconnect-oder-openid/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Yahoo! als Zwitter</title>
		<link>http://www.snirgel.de/2010/02/16/yahoo-als-zwitter/</link>
		<comments>http://www.snirgel.de/2010/02/16/yahoo-als-zwitter/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 08:45:38 +0000</pubDate>
		<dc:creator>snirgel</dc:creator>
				<category><![CDATA[OpenID]]></category>
		<category><![CDATA[data portability]]></category>
		<category><![CDATA[datenaustausch]]></category>
		<category><![CDATA[oAuth]]></category>
		<category><![CDATA[openid-oauth-hybrid]]></category>

		<guid isPermaLink="false">http://www.snirgel.de/?p=237</guid>
		<description><![CDATA[Nachdem ich im letzten Post Yahoo! unverschämter Weise [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem ich im letzten Post Yahoo! unverschämter Weise verschwiegen hab bekommen die eben jetzt ihren Eigenen. Nachdem sie bereits im September letzten Jahres eine Referenzimplementierung des <a href="http://step2.googlecode.com/svn/spec/openid_oauth_extension/latest/openid_oauth_extension.html">openID-oAuth-Hybrid-Protokolls</a> mit Plaxo vollzogen hatten, gab es letzte Woche die Nachricht, dass es nun eine erneute Implementierung des <a href="http://step2.googlecode.com/svn/spec/openid_oauth_extension/latest/openid_oauth_extension.html">Protokolls</a> gibt, welches eine openID-Authentifizierung direkt mit  oAuth-Autorisierung kombiniert.</p>
<p>Für den User heißt das im Klartext, dass man, nachdem man sich per openID angemeldet hat nicht mehr per Username/Passwort seine Daten nochmals zum Austausch freigeben muss, sondern die Datenfreigabe geschieht in einem Rutsch direkt bei der Anmeldung/Registrierung:</p>
<p><a href="http://www.snirgel.de/wp-content/uploads/2010/02/hybrid-dialog.png"><img class="alignnone size-full wp-image-238" title="hybrid-dialog" src="http://www.snirgel.de/wp-content/uploads/2010/02/hybrid-dialog.png" alt="hybrid-dialog" width="504" height="512" /></a></p>
<p>Die erneute Implementierung findet man bei <a href="http://www.huffingtonpost.com/" target="_blank">www.huffingtonpost.com</a>. Gut, die Seite interessiert den deutschen Nutzer vielleicht nicht wirklich wahnsinnig, funktioniert aber einwandfrei und zum ausprobieren mal ganz gut. Das einzige, was ich zu bemängeln weiß ist, dass ich innerhalb des Dialoges den Zugang zu meinen Daten nicht sperren konnte. Vielleicht war ich da aber nicht wirklich schlau genug, wer weiß.</p>
<p>Na dann hoffe ich doch, dass ich bald mal einen Post zustande bekomme, indem ich das Hybrid-Protokoll genauer erkläre <img src='http://www.snirgel.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
 <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://www.snirgel.de/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><p style="clear: both;">
                   <iframe scrolling="no" frameborder="0" marginwidth="0" marginheight="0"
                           style="overflow: hidden; width: 400px; height: 30px;"
                           src="http://widgets.yiid.com/w/like/full.php?cult=de&type=like&url=http%3A%2F%2Fwww.snirgel.de%2F2010%2F02%2F16%2Fyahoo-als-zwitter%2F&title=Yahoo%21+als+Zwitter&color=%23000000"
                           allowtransparency="true">
                   </iframe>
                   </p>]]></content:encoded>
			<wfw:commentRss>http://www.snirgel.de/2010/02/16/yahoo-als-zwitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ring frei</title>
		<link>http://www.snirgel.de/2010/02/14/ring-frei/</link>
		<comments>http://www.snirgel.de/2010/02/14/ring-frei/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 15:43:53 +0000</pubDate>
		<dc:creator>snirgel</dc:creator>
				<category><![CDATA[OpenID]]></category>
		<category><![CDATA[datenaustausch]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[data portability]]></category>
		<category><![CDATA[facebook connect]]></category>
		<category><![CDATA[friend connect]]></category>

		<guid isPermaLink="false">http://www.snirgel.de/?p=229</guid>
		<description><![CDATA[Datenaustausch (Data Portability) ist mittlerweile ein  [...]]]></description>
			<content:encoded><![CDATA[<p>Datenaustausch (<a title="dataportability" href="http://de.wikipedia.org/wiki/DataPortability" target="_blank">Data Portability</a>) ist mittlerweile ein vielgenutztes Buzz-Word und wird auf unterschiedliche Art und Weisen vollzogen. Ein Konkurrenzkampf zwischen den Protokollen, Spezifikationen und API&#8217;s ist in vollem Gange und eine Einigung scheint nicht in Sicht. So arbeiten Facebook, Google und aber auch die Open-Web-Gemeinde an Lösungen, Userdaten auszutauschen und die verschiedenen Services untereinander zu vernetzen. Allen Lösungen liegen dabei die gleichen Problemstellungen zu Grunde:</p>
<p>- Autorisierung und Austausch von Profildaten, also wer ist der User, der meinen Service benutzen möchte?<br />
- Welche Daten dürfen wann und wo verwendet werden?<br />
- Wie ist der User sozial vernetzt?<br />
- Was treiben der User und seine Freunde gerade?</p>
<p>Demnach wird es wohl mal Zeit etwas Licht ins Dunkel zu bringen und die Möglichkeiten vorzustellen, zu evaluieren und (wenn möglich) miteinander zu vergleichen. Aber erstmal, was gibt es eigentlich miteinander zu vergleichen?</p>
<h3>Open&#8230;</h3>
<p>Von den offenen Technologien muss man an dieser Stelle wohl als erstes den <a href="http://therealmccrea.com/2008/09/19/joseph-smarr-at-web-20-on-the-new-open-stack/" target="_blank">Open Stack</a> nennen. Der Open Stack ist eine Sammlung von Technologien, die Authentifizierung (<a href="http://openid.net/developers/" target="_blank">openID</a>), Autorisierung (<a href="http://oauth.net/about/" target="_blank">oAuth</a>), Kontaktaustausch(<a href="http://portablecontacts.net/" target="_blank">Portable Contacts</a>) und Anwendungs-Portabilität(<a href="http://www.opensocial.org/" target="_blank">Open Social</a>) beschreiben. Dazu gehört auch noch <a href="http://hueniverse.com/misc/xrds-simple/">XRDS-Simple</a>, dass für Discovery/&#8217;Routing&#8217; zuständig ist. Der Herr Pfefferle hat den open stack mal als <a href="http://notizblog.org/2008/09/23/one-stack-to-access-them-all/#" target="_blank">OSI-Modell der offenen Standards </a>beschrieben, was ich ganz treffend finde und ich will meinen, dass damit ist ja schonmal eine ganze Menge abgehandelt ist. Und auch wenn der Begriff open stack in Internetzeit gerechnet schon fast aus dem Mittelalter stammt, gibt es bisher kaum vergleichbare Ideen und die dort enthaltenen Spezifikationen werden nach wie vor weiterenwickelt.</p>
<p>Neben den Open Stack-Technologien und Austauschmöglichkeiten rücken derweil die User-Aktivitäten, die plattformübergreifend ausgetauscht werden wollen, in den Vordergrund des Geschehens. Das wird sehr gut mit der (noch im Draft-Zustand befindlichen) <a href="http://martin.atkins.me.uk/specs/activitystreams/atomactivity" target="_blank">Atom-Activity-Extension</a> beschrieben und scheint mir sich zunehmend auch durchzusetzen.</p>
<h3>Facebook Connect</h3>
<p>Während die offenen Technologien für sich gekapselt sind und es für die einzelnen Probleme jeweils eine für sich geschlossene Lösung gibt, sieht das bei <a href="http://wiki.developers.facebook.com/index.php/Main_Page">Facebook-Connec</a>t schon ganz anders aus. Natürlich gibt es auch hier für die unterschiedlichen Bedürfnisse unterschiedliche Möglichkeiten, die Daten auszutauschen, aber prinzipiell ist FBC eine in sich abgeschlossene API (für mich beim Einlesen eine eierlegende Wollmilch-Api <img src='http://www.snirgel.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ). Das bedeuted, dass der Austausch der unterschiedlichen Daten, nach der Authentifizierung mit dem facebook-eigenen Mechanismus, über ebenso facebook-eigene Technologien, wie die Facebook Markup Language(FBML), die Extended Facebook Markup Language (XFBML), die Facebook Query Language (FQL), eine RESTful Api oder über die Javascript-Library vonstatten geht.</p>
<h3>Google Friend Connect</h3>
<p><a href="http://code.google.com/intl/de-DE/apis/friendconnect/" target="_blank">Google Friend Connect</a> ist Googles Versuch in das soziale Web-Geschehen einzugreifen, was ja auch nicht unsinnvoll ist, da ja fast jeder einen Google-Account hat. Zum Datenaustausch setzt Google auch auf die oben schon z.Teil genannten Technologien, wie openID, oAuth, open social, Activity Extension und Portable Contacts (könnte vielleicht auch daran liegen, dass Google den Kram mehr oder weniger entwickelt hat oder zumindest stark beteiligt war).</p>
<h3>MyspaceID</h3>
<p>Ich wage mal zu behaupten, dass Myspace im großen und ganzen nicht so eine große Rolle in der hier erwähnten Angelegenheit spielt. Da die Jungs und Mädels sich dort aber auch sehr viel Mühe geben erwähne ich es mal der Vollständigkeit halber. Auserdem ist Myspace zwar auf dem absteigenden Ast, hat aber immernoch eine große Nutzer- und Fangemeinde.<br />
<a href="http://wiki.developer.myspace.com/index.php?title=Main_Page">MyspaceID</a> ist ein Mittelding aus proprietärer und offener Lösung. Für Autorisierung und Benutzerdatenaustausch an sich wird dort eine eigene API (Javascript und REST) benutzt, während zur Authentifizierung, die Aktivitäten und die Apps je oAuth, die Atom-Extension und open social verwendet wird. Ich kann die Strategie hierbei nicht ganz nachvollziehen und denke, dass Myspace sich mit seiner proprietären MyspaceID statt openID keinen so großen gefallen getan hat, denn wer um Nutzerdaten kämpft sollte vielleicht nicht seine Energie in die Entwicklung eigener SignOn-Technologien stecken, die dann eh niemand implementiert (oder schonmal jemand einen: mit-myspace-einloggen-knopf gesehn?). Nja..Meinungen, Meinungen, Meinungen&#8230;..</p>
<p>Update: Wie ich auf Grund des Feedbacks gelernt habe benutzt Myspace komplett den open stack und nicht, wie von mir fehlerhaft dargestellt, eine teils eigene Lösung.</p>
<p>Soweit so gut. Wie unschwer zu erkennen ist kann man also feststellen, dass der Kampf des Datenaustauschs im Großen und Ganzen zwichen den offenen Standards, die eben auch von Google eingesetzt werden, und FacebookConnect abspielt. Dies könnte den Schluss zulassen, dass man sich näher damit beschäftigen müßte, da es ja nur Facebook ist, was offen geschlossen (hihi) agiert. Aber mit 300 Millionen Usern und der Funktion als Datenhub, denn jeder verknüpft ja Twitter, Flickr und Sonstiges mit Facebook, ist dies eine Tatsache, die keinesfalls vernachläßigt werden darf.</p>
<h3>&#8230;und so gehts dann weiter</h3>
<p>Der weiter Plan ist deswegen die Eingangs erwähnten Fragen hinsichtlich Datenqualität und -quantitität, Implementierung(theoretisch, denn ich hab ganz ehrlich keine Zeit spasseshalber mal alles zu implementieren) und Doku, Sicherheit/Transparenz/Usability zu beantworten. Dabei werde ich mich aber wohl auf Facebook vs. Open beschränken.</p>
<script type="text/javascript">
var flattr_wp_ver = '0.9.11';
var flattr_uid = '17104';
var flattr_url = 'http://www.snirgel.de';
var flattr_lng = 'de_DE';
var flattr_cat = 'text';
var flattr_tag = 'blog,wordpress,rss,feed';
var flattr_btn = 'large';
var flattr_tle = 'snirgel.de - Es ist im Computer drin';
var flattr_dsc = 'openid, open standards, offene standards, open web';
</script>
<script src="http://api.flattr.com/button/load.js?v=0.2" type="text/javascript"></script> <p>Feel free to Flattr this post at <a href="http://flattr.com/" title="Flattr" target="_blank">flattr.com</a>, if you like it.</p> <p><a href="http://flattr.com/" title="Flattr" target="_blank"><img src="http://www.snirgel.de/wp-content/plugins/flattrss/button-compact-static-100x17.png" alt="flattr this!"/></a></p><p style="clear: both;">
                   <iframe scrolling="no" frameborder="0" marginwidth="0" marginheight="0"
                           style="overflow: hidden; width: 400px; height: 30px;"
                           src="http://widgets.yiid.com/w/like/full.php?cult=de&type=like&url=http%3A%2F%2Fwww.snirgel.de%2F2010%2F02%2F14%2Fring-frei%2F&title=Ring+frei&color=%23000000"
                           allowtransparency="true">
                   </iframe>
                   </p>]]></content:encoded>
			<wfw:commentRss>http://www.snirgel.de/2010/02/14/ring-frei/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
