<?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>Martok&#039;s Place &#187; Web</title>
	<atom:link href="http://www.martoks-place.de/category/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.martoks-place.de</link>
	<description></description>
	<lastBuildDate>Mon, 16 Jan 2012 23:57:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Cold Restart</title>
		<link>http://www.martoks-place.de/2011/12/cold-restart/</link>
		<comments>http://www.martoks-place.de/2011/12/cold-restart/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 03:25:05 +0000</pubDate>
		<dc:creator>Martok</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Umzug]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.martoks-place.de/?p=684</guid>
		<description><![CDATA[Der ein oder andere wird es vielleicht schon gemerkt haben: hier im Blog hat sich mal wieder was an der Oberfläche geändert. Aber nicht nur da Hier lief bis grade eben ein (jetzt kann ichs ja rausposaunen) sehr altes WordPress 2.8 mitsamt allen Sicherheitsproblemen die man sich da einhandelt. Was aber viel problematischer war: das [...]]]></description>
			<content:encoded><![CDATA[<p>Der ein oder andere wird es vielleicht schon gemerkt haben: hier im Blog hat sich mal wieder was an der Oberfläche geändert. Aber nicht nur da <img src='http://www.martoks-place.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Hier lief bis grade eben ein (jetzt kann ichs ja rausposaunen) sehr altes WordPress 2.8 mitsamt allen Sicherheitsproblemen die man sich da einhandelt. Was aber viel problematischer war: das Theme war ein für WordPress 1.irgendwas angepasstes das schon seit einigen Jahren nur noch im hinterletzten Kompatiblilitätszweig lief. Und mit neueren WPs jetzt gar nicht mehr. Es musste also was neues her.<br />
<span id="more-684"></span><br />
Genau das ist in den letzten Tagen entstanden: ein neues Layout, diesmal nichts verändertes sondern komplett (aus Einzelteilen aus TwentyEleven) selbst zusammengebastelt. Im Endeffekt löst das aber das Problem nicht, sondern nur den komplizierten Teil.<br />
Durch alle Revisionen durch updaten wollte ich allerdings auch nicht, denn das hatte ich bisher schon gemacht und einiges an durcheinander in der Datenbank hinterlassen. Mal ganz davon abgesehen, dass die immer noch im Charset latin1 war &#8211; mehr als einmal ein Ärgernis. Also hilft eigentlich nur eins: eine komplette Neuinstallation. Genau das hat jetzt stattgefunden.</p>
<p>Das war der Plan:</p>
<ol>
<li>Dateien dynchronisieren: Beta->lokale Kopie</li>
<li>Dateien dynchronisieren: Live->lokale Kopie</li>
<li>Abgleichen der Uploads (das macht der Importer nämlich nicht zwingend richtig)</li>
<li>Baustellen-Seite vorschalten</li>
<li>DB-Export: Live-Schema</li>
<li>DB-Export: Beta-Schema</li>
<li>wp_ Tabellen auf Live-Schema löschen</li>
<li>Umbenennen des WordPress-Verzeichnisses auf dem Server</li>
<li>Import der Beta-Datenbank im Livesystem</li>
<li>Verschieben des Beta-Verzeichnisses ins Livesystem</li>
<li>Anpassen der Zugangsdaten in wp-config.php</li>
<li>Anpassen der Pfade im Backend</li>
<li>Baustellen-Seite wegnehmen</li>
</ol>
<p>Wider Erwarten hat das sogar fast alles funktioniert &#8211; jedenfalls bis ich mich anmelden wollte <img src='http://www.martoks-place.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  An sich ging das alles, nur leider hatte jedes Formular eine falsche Zieladresse: nämlich eine vom Testsystem. Also den vorletzten Schritt direkt in der Datenbank erledigt und schon funktioniert alles.</p>
<p>Leider gibt&#8217;s das alte Besucherzählsystem (<em>Readers Count</em>) nicht mehr, und das jetzt verwendete <em>Count Per Day</em> hat ein so anderes Zählsystem, dass ich das nicht schmerzfrei übernommen kriege. Es gilt also: alles auf Anfang!</p>
<p>Anmerkungen, gefundene Fehler (und Behebungen) zum neuen Thema könnt ihr gerne mitteilen &#8211; entweder direkt oder in den Kommentaren.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.martoks-place.de/2011/12/cold-restart/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>They did it again&#8230;</title>
		<link>http://www.martoks-place.de/2011/12/they-did-it-again/</link>
		<comments>http://www.martoks-place.de/2011/12/they-did-it-again/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 21:29:32 +0000</pubDate>
		<dc:creator>Martok</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Heise]]></category>
		<category><![CDATA[Mailer]]></category>

		<guid isPermaLink="false">http://www.martoks-place.de/?p=672</guid>
		<description><![CDATA[Was mich manchmal echt wundert &#8211; können sich manche Firmen eigentlich halten. Web.de ist so eine. Die einzigen Freemailer die überhaupt noch eine nennenswerte Postfachgrößenbeschränkung haben und größere Postfächer nur per Abofalle (siehe diverse Artikel in der c&#8217;t-Sparte &#8220;Vorsicht Kunde&#8221;) verkaufen haben jetzt wieder zugeschlagen. Im Rahmen einer lustigen Aktion bieten sie grade das an: [...]]]></description>
			<content:encoded><![CDATA[<p>Was mich manchmal echt wundert &#8211; können sich manche Firmen eigentlich halten. Web.de ist so eine. Die einzigen Freemailer die überhaupt noch eine nennenswerte Postfachgrößenbeschränkung haben und größere Postfächer nur per Abofalle (siehe diverse Artikel in der c&#8217;t-Sparte &#8220;Vorsicht Kunde&#8221;) verkaufen haben jetzt wieder zugeschlagen.</p>
<p>Im Rahmen einer lustigen Aktion bieten sie grade das an:</p>
<blockquote><p>der Speicher Ihres WEB.DE Postfachs wird ab sofort von 12 MB auf 500 MB erweitert. Das bedeutet 40 mal mehr Platz für Ihre E-Mails.</p></blockquote>
<p>Und damit nur noch ein 4tel statt ein 160stel der Konkurrenz im eigenen Haus!<br />
Aber darum gehts noch nicht.</p>
<blockquote><p>Zur Aktivierung des zusätzlichen E-Mail-Speichers, benötigen Sie eine Programmerweiterung, die Sie hier kostenlos und ohne Verpflichtungen herunterladen können. Bitte klicken Sie auf &#8220;Aktivieren&#8221;, um Ihr Postfach von 12 MB auf 500 MB kostenlos zu erweitern und die nötige Programmerweiterung zu installieren. </p></blockquote>
<p>War ja klar. Ich wusste gar nicht, dass ich Bundestrojanerzielperson bin.</p>
<p>Da mich das aber echt nervt, alle paar Tage das Postfach ausräumen zu müssen, also das einzig gangbare gemacht: neuen Windows-User ohne irgendwelche Rechte angelegt, mit dem ein neues Browserprofil gemacht, genau die Toobar installiert und einmal angemeldet. Danach alles entstandene gelöscht.</p>
<p>Und was erhalte ich 2 Sekunden Später in einer neuen Mail? Eine Werbefalle:<br />
<img src="/blog/wp-content/uploads/2011/12/wde2.png" alt="Web.de Werbemail 2" title="Web.de Werbemail 2" width="346" height="232" class="alignnone size-full wp-image-676" /> <img src="/blog/wp-content/uploads/2011/12/wde1.png" alt="Web.de Werbemail 1" title="Web.de Werbemail 1" width="262" height="214" class="alignnone size-full wp-image-673" /></p>
<p>Ja, richtig gelesen, da steht, ich würde nur im Club 500MByte bekommen. Kurz IMAP gefragt: nein, ist nicht so, ich hab schon 680960KByte (was übrigens 650MByte sind). Der unbedarfte Nutzer denkt sich jetzt &#8220;oh hey, nur noch ein Schritt den sie vorher nicht erwähnt haben, da steht ja immer noch Kostenlos dran&#8221;.<br />
Und schon zahlt man sich dumm und dusselig, denn wie wir gelernt haben ist das Ding nicht ohne Medien und/oder Gericht kündbar.</p>
<p>Gut, dass ich ein unbedarfter Nutzer bin &#8211; hoffentlich lesen das hier einige von diesen vorher.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.martoks-place.de/2011/12/they-did-it-again/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Google Minus</title>
		<link>http://www.martoks-place.de/2011/08/google-minus/</link>
		<comments>http://www.martoks-place.de/2011/08/google-minus/#comments</comments>
		<pubDate>Tue, 16 Aug 2011 19:21:29 +0000</pubDate>
		<dc:creator>Martok</dc:creator>
				<category><![CDATA[Politik und Philosophie]]></category>
		<category><![CDATA[Real Life]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Datenschutz]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://www.martoks-place.de/?p=613</guid>
		<description><![CDATA[Das wars. Heute schlag 23:59:59 (oder nah dran) wird mein Google+-Account sein Ende finden, und ich werde mal testen ob man den so rückstandsfrei entfernen kann, wie es das Control Panel glauben lässt. Hier möchte ich ein Fazit ziehen. Was ist Google+? Laut Eigenaussage sollte Google+ mal ein soziales Netzwerk werden. Nach den&#8230; wenig erfolgreichen [...]]]></description>
			<content:encoded><![CDATA[<p>Das wars.</p>
<p>Heute schlag 23:59:59 (oder nah dran) wird mein Google+-Account sein Ende finden, und ich werde mal testen ob man den so rückstandsfrei entfernen kann, wie es das Control Panel glauben lässt.<br />
Hier möchte ich ein Fazit ziehen.</p>
<p><span id="more-613"></span></p>
<p><strong>Was ist Google+?</strong><br />
Laut Eigenaussage sollte Google+ mal ein soziales Netzwerk werden. Nach den&#8230; wenig erfolgreichen Orkut und Buzz wollte Google mal alles richtig machen.<br />
In wirklichkeit ist es Twitter ohne Zeichenbegrenzung. Dazu gibt es ein paar nette Spielereien: Huddles und Hangouts <span style="color:#777">(und seit dieser Woche Spiele-Apps wie bei der Fratzenkladde)</span>. Ersteres ist ein Multi-User-Chat mit direkter Integration von Mobilgeräten, SMS und Webclients; letzteres sind Videochats mit bis zu 10 Personen gleichzeitig. Da geht das Problem schon los: wenn ich einen Chat will, hab ich dafür Skype oder IRC. Und Videokonferenzen fällt eh aus, nicht jeder hat 100MBit.</p>
<p><strong>Plus</strong><br />
Damit bleibt nur der Twitter-Part: asynchrone Beziehungen und ein einfach benutzbarer Stream sind ziemlich praktisch und haben recht hohen Share-Faktor.</p>
<p>Außerdem lange dabei gehalten hat mich <a href="https://plus.google.com/117024231055768477646">Isotopp</a>, der seinen <a href="https://twitter.com/isotopp">Twitter-Account</a> eingestampft hat. Im Endeffekt sind er und Notch (der aber noch twittert; auf G+ gibts nur immer mal nette Screenshots vom Adventure Update) das einzige, was mich einmal am Tag reinschauen lässt.</p>
<p><strong>Minus</strong><br />
Google+ mit seinen Kreisen wäre eine unglaublich gute Plattform für Wave gewesen: Schnell mal einen Kreis zum Brainstorming auf eine gemeinsame Plattform werfen. Selbst wenns nicht mehr läuft, wäre das für Google wohl kein Akt gewesen, schnell mal eine Wave-Instanz aufzusetzen. Naja, die wollten ja nicht. (Ja, ich hatte eine Suggestion eingereicht.)</p>
<p>Dann ist das ganze furchtbar langsam. Ich mein, nicht so langsam wie das verajaxte Twitter, aber wie auch bei Hangouts merkt man, dass es für 16MBit mit maximaler Latenz in der Größenordnung von 30ms ausgelegt wurde.</p>
<p>Das größte Problem ist aber ein anderes: die Realnamens-Policy von Google. Da drüber haben nun wirklich schon alle alles gesagt haben, verlinke ich hier nur auf <a href="http://www.zeit.de/digital/datenschutz/2011-08/googleplus-name-pseudonym/komplettansicht">Kai Biermann in der Zeit</a>.</p>
<p>Um meine Meinung auf den Punkt zu bringen:</p>
<p><span style="color:#777">(fast)</span> Niemand, der meinen echten Namen kennt ist auf Google+. Von niemandem, der auf Google+ ist, will ich dass sie meinen Realname kennen (oder jedenfalls nutzt es ihnen nichts). Wer von mir etwas digitales will (Forenmember)/wollen könnte (Piraten) kennt mich unter Martok. Ich will nicht, dass mir eine Digitale Entität sagt, wie ich heiße. Ich will denen sagen, wie ich auftreten will.</p>
<p><strong>Fazit</strong><br />
G+ hat für mich weniger Nutzen als Nerv.</p>
<p>Das tu ich mir nicht an. Wenn ich Nerv will, baue ich mir ein Linux.</p>
<p>But that&#8217;s another story for another time.</p>
<p><strong>PS</strong>:<br />
Wenn jemand noch rein will, z.B. um selbst auszutreten: <a href="https://plus.google.com/_/notifications/ngemlink?path=%2F%3Fgpinv%3DT4oNBFmdWQU%3Ad_cGifzNFCA">Invite</a>. Geht vermutlich nicht mehr wenn ich weg bin <img src='http://www.martoks-place.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.martoks-place.de/2011/08/google-minus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to not be evil [Update]</title>
		<link>http://www.martoks-place.de/2010/10/how-to-not-be-evil/</link>
		<comments>http://www.martoks-place.de/2010/10/how-to-not-be-evil/#comments</comments>
		<pubDate>Mon, 04 Oct 2010 03:03:03 +0000</pubDate>
		<dc:creator>Martok</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Edgemonkey]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://www.martoks-place.de/?p=461</guid>
		<description><![CDATA[Wer kennt sie nicht, die beliebte Funktion eval()? Chrome zum Beispiel Das heißt auch, dass die bisher im Edgemonkey verwendete Kombination von eval/uneval zur (de)serialisierung von Einstellung und Speicherung dieser so in Chrome nie funktionieren wird (selbst wenn später einmal eine GM_setValue-Alternative zur Verfügung steht &#8211; stay tuned). Es muss also jedes Vorkommen davon durch [...]]]></description>
			<content:encoded><![CDATA[<p>Wer kennt sie nicht, die beliebte Funktion eval()? Chrome zum Beispiel <img src='http://www.martoks-place.de/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Das heißt auch, dass die bisher im Edgemonkey verwendete Kombination von eval/uneval zur (de)serialisierung von Einstellung und Speicherung dieser so in Chrome nie funktionieren wird (selbst wenn später einmal eine <a href="http://wiki.greasespot.net/GM_setValue">GM_setValue</a>-Alternative zur Verfügung steht &#8211; stay tuned). Es muss also jedes Vorkommen davon durch die eigentlich viel schöneren und moderneren <a href="https://developer.mozilla.org/En/Using_JSON_in_Firefox">JSON.parse und JSON.stringify</a> ersetzt werden. Was aber nicht so einfach ist, da die Migration bisheriger Daten natürlich funktionieren muss.<br />
Was gar nicht so einfach ist &#8211; uneval erzeugt <strong>kein</strong> JSON, sondern nur etwas was <em>so ähnlich</em> aussieht!</p>
<p>Man muss also etwas tun, um die Daten in valides JSON zu konvertieren. Was nicht einfach geht, ohne uneval. Bleibt also nur, den String als solchen zu bearbeiten. And here&#8217;s how:<br />
<span id="more-461"></span></p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">JSON.<span style="color: #660066;">convertFromUneval</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>u<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #003366; font-weight: bold;">function</span> protect<span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> s.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/./g</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>m<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">'#'</span><span style="color: #339933;">+</span>m.<span style="color: #660066;">charCodeAt</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #003366; font-weight: bold;">function</span> unprotect<span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> s.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/#([a-f0-9]+)/g</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>m<span style="color: #339933;">,</span>c<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">return</span> String.<span style="color: #660066;">fromCharCode</span><span style="color: #009900;">&#40;</span>parseInt<span style="color: #009900;">&#40;</span>c<span style="color: #339933;">,</span><span style="color: #CC0000;">16</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000066; font-weight: bold;">return</span> u.
    <span style="color: #006600; font-style: italic;">// remove outer braces</span>
    match<span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/^((.*))$/</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span>.
    <span style="color: #006600; font-style: italic;">// protect strings</span>
    replace<span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/(?::&quot;&quot;)|(?::&quot;(.*?)([^\]&quot;))/g</span><span style="color: #339933;">,</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>m<span style="color: #339933;">,</span>g1<span style="color: #339933;">,</span>g2<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">':&quot;'</span><span style="color: #339933;">+</span><span style="color: #009900;">&#40;</span>isUndef<span style="color: #009900;">&#40;</span>g2<span style="color: #009900;">&#41;</span><span style="color: #339933;">?</span><span style="color: #3366CC;">''</span><span style="color: #339933;">:</span>protect<span style="color: #009900;">&#40;</span>g1<span style="color: #339933;">+</span>g2.<span style="color: #660066;">charAt</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #3366CC;">'&quot;'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.
    <span style="color: #006600; font-style: italic;">// prepare unquoted param names using single ticks</span>
    replace<span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/([{,])s*([^:'{,]+?):/g</span><span style="color: #339933;">,</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>g<span style="color: #339933;">,</span>g1<span style="color: #339933;">,</span>g2<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">return</span> g1<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;'&quot;</span><span style="color: #339933;">+</span>g2<span style="color: #339933;">+</span><span style="color: #3366CC;">&quot;':&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.
    <span style="color: #006600; font-style: italic;">// remove undefined, JSON has no notation of that data type</span>
    replace<span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/([,{])s?'(?:[^']|(?:(?:\\)*\'))*':(void 0)([,}])?/g</span><span style="color: #339933;">,</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>g<span style="color: #339933;">,</span>g1<span style="color: #339933;">,</span>g2<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>g1<span style="color: #339933;">!==</span><span style="color: #3366CC;">'{'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">?</span>g1<span style="color: #339933;">=</span><span style="color: #3366CC;">''</span><span style="color: #339933;">:</span>g1<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>g1 <span style="color: #339933;">&amp;&amp;</span> g2<span style="color: #339933;">!==</span><span style="color: #3366CC;">'}'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">?</span><span style="color: #3366CC;">''</span><span style="color: #339933;">:</span>g2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.
    <span style="color: #006600; font-style: italic;">// turn single into double tics</span>
    replace<span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/'(.+?)':/g</span><span style="color: #339933;">,</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>g<span style="color: #339933;">,</span>g1<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">'&quot;'</span><span style="color: #339933;">+</span>g1.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/\'/g</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;'&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/&quot;/g</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'<span style="color: #000099; font-weight: bold;">\&quot;</span>'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #3366CC;">'&quot;:'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.
    <span style="color: #006600; font-style: italic;">// unprotect strings (unwind x sequences: JSON as a Unicode standard doesn't have ASCII escapes)</span>
    <span style="color: #006600; font-style: italic;">// and do that w/o lookbehinds, which would be waaaay to easy</span>
    replace<span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/:&quot;((#[a-f0-9]+)+)&quot;/g</span><span style="color: #339933;">,</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>m<span style="color: #339933;">,</span>t<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">':&quot;'</span><span style="color: #339933;">+</span>unprotect<span style="color: #009900;">&#40;</span>t<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/(?:(?:\\)*\)*(\x([0-9A-F]{2}))/g</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>m<span style="color: #339933;">,</span>g1<span style="color: #339933;">,</span>g2<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#40;</span>m.<span style="color: #660066;">length</span><span style="color: #339933;">%</span>2<span style="color: #009900;">&#41;</span><span style="color: #339933;">?</span>m<span style="color: #339933;">:</span>m.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span>g1<span style="color: #339933;">,</span>String.<span style="color: #660066;">fromCharCode</span><span style="color: #009900;">&#40;</span>parseInt<span style="color: #009900;">&#40;</span>g2<span style="color: #339933;">,</span><span style="color: #CC0000;">16</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #3366CC;">'&quot;'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
JSON.<span style="color: #660066;">parseUneval</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>u<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">return</span> JSON.<span style="color: #660066;">parse</span><span style="color: #009900;">&#40;</span>JSON.<span style="color: #660066;">convertFromUneval</span><span style="color: #009900;">&#40;</span>u<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ist diesmal sogar kommentiert, da brauch ich gar nichts weiter schreiben. Schön! Man könnte das ganze zwar sogar noch weiter einkürzen, aber wer will das schon &#8211; soll ja auch noch lesbar sein.<br />
Was jetzt noch zu tun bliebe, wäre JSON (oder uneval&#8217;d code) zweifelsfrei erkennen &#8211; aber hier werde ich wohl trial&#038;error nutzen: &#8220;Wenn es sich nicht als JSON parsen lässt, wirds wohl was anderes sein&#8221;. Soll sich doch Spidermonkey damit rumärgern! <img src='http://www.martoks-place.de/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Dieser Schnipsel steht wie der Rest des Affen unter CC-BY-NC-SA. Ergänzungen und Fixes willkommen, sollte z.B. mein Test-Objekt noch seltsame Sachen nicht enthalten!</p>
<p><strong>Update</strong>: Kommentator BenBE hatte doch richtig vermutet: da war noch einiges holprig drin. Ein 316kByte-Datengewusel ist halt doch ein besserer Testcase als etwas konstruiertes <img src='http://www.martoks-place.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Der String-protect-Teil ist nach wie vor nicht wirklich korrekt, wie jeder einfache Testcase zeigt. Bis zum Beweis des Gegenteils hoffe ich aber, dass es für den Affen reicht.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.martoks-place.de/2010/10/how-to-not-be-evil/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hackfox &#8211; Foxhacks</title>
		<link>http://www.martoks-place.de/2010/09/hackfox-foxhacks/</link>
		<comments>http://www.martoks-place.de/2010/09/hackfox-foxhacks/#comments</comments>
		<pubDate>Mon, 27 Sep 2010 14:30:57 +0000</pubDate>
		<dc:creator>Martok</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Edgemonkey]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Userscripts]]></category>

		<guid isPermaLink="false">http://www.martoks-place.de/?p=453</guid>
		<description><![CDATA[Viele von denen, die hier lesen dürften mein Projekt EdgeMonkey kennen. Für die paar, die es nicht tun: es handelt sich um ein Userscript für Greasemonkey, welches die Entwickler-Ecke verschönert. Jedenfalls: viele der dort eingesetzten Techniken waren schon immer Bleeding Edge, was Userscripts angeht. Deswegen wirds da auch schnell mal blutig, wenn sich irgendwo etwas [...]]]></description>
			<content:encoded><![CDATA[<p>Viele von denen, die hier lesen dürften mein Projekt <a href="http://github.com/martok/edgemonkey">EdgeMonkey</a> kennen. Für die paar, die es nicht tun: es handelt sich um ein Userscript für Greasemonkey, welches die <a href="http://www.entwickler-ecke.de/index.php">Entwickler-Ecke</a> verschönert.<br />
Jedenfalls: viele der dort eingesetzten Techniken waren schon immer Bleeding Edge, was Userscripts angeht. Deswegen wirds da auch schnell mal blutig, wenn sich irgendwo etwas ändert.</p>
<p>So ist das bereits mehrmals passiert &#8211; die neue Sandbox der Greasemonkey 0.8-Reihe war wohl das offensichtlichste. Aber das war ja noch einfach zu umgehen. Richtig spaßig ist das aber erst viel später auf Firefox 4 geworden, welcher mich auch dazu gebracht hat die hier besprochene Thematik mal genauer zu analysieren.<br />
<span id="more-453"></span></p>
<p><strong>Wie alles anfing&#8230;</strong><br />
Grundsätzlich bestehen die Foren der Entwickler-Ecke meistens aus mehreren Frames. Für viele User ist dabei mindestens die Shoutbox ein IFRAME, zusätzlich existiert auf den &#8220;Beitrag beantworten&#8221;-Seiten eine Kurzansicht der letzten paar Beiträge (&#8220;Topicreview&#8221;). Dieser Aufbau stellt Userscripts vor einige Hürden, werden sie doch für jede Seite separat ausgeführt &#8211; ab GM 0.8 eben sogar in einer getrennten Sandbox, die verhindern soll dass sich Webseiten über den GM Chrome-Privilegien holen können. Man möchte aber an einigen Stellen, dass die Scripte zusammenarbeiten können und Funktionen sowie Daten gemeinsam nutzen.</p>
<p><strong>Erster Ansatz</strong><br />
De Grundidee war nun, dass das zuerst geladene Frame (meistens wohl das Hauptfenster) eine Variable <em>EM</em> in das window injeziert. Später geladene Frames suchen in ihrem window.parent dann danach und weisen dieses Objekt einer eigenen Variable zu:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>SOP_ok <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span>isEmpty<span style="color: #009900;">&#40;</span>unsafeWindow.<span style="color: #660066;">parent</span>.<span style="color: #660066;">EM</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  window.<span style="color: #660066;">EM</span> <span style="color: #339933;">=</span> unsafeWindow.<span style="color: #660066;">parent</span>.<span style="color: #660066;">EM</span><span style="color: #339933;">;</span>
  unsafeWindow.<span style="color: #660066;">EM</span> <span style="color: #339933;">=</span> EM<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
  window.<span style="color: #660066;">EM</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
  unsafeWindow.<span style="color: #660066;">EM</span> <span style="color: #339933;">=</span> EM<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Dies muss man natürlich immer zweimal tun: einmal für das <em>window</em> aus der Sandbox und einmal für das externe <em>unsafeWindow</em>.</p>
<p>Diese Variante hat gut funktioniert, bis Firefox 4 kam. Dieser erzeugt bei der genutzten Funktion evalInSandbox noch einen weiteren Kontext, so dass <em>window</em> nicht mehr das globale Objekt ist. Damit ändert sich das Verhalten des Codes signifikant, so dass nach ausführung des oberen Blocks</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> foo<span style="color: #339933;">=</span> EM<span style="color: #339933;">;</span></pre></div></div>

<p> nicht funktionieren wird &#8211; <em>EM</em> ist <em>undefined</em>, <em>window.EM</em> wäre es nicht.</p>
<p>Damit war die bisherige Technologie ein Fall für gründliches Überdenken. Mit dem netten Nebeneffekt, dass gleich noch ein weiterer Fehler gefunden wurde. Leider ein konzeptioneller, denn diese Methode hat ziemliche Probleme damit, dass das Topicreview auch eine Pagehacks-Instanz hat. Diese überschreibt dann die der Hauptseite. Nicht gut das ist. Transparenter du denken musst, junger Padawan!</p>
<p><strong>How it should have worked&#8230;</strong><br />
Dann ist mir etwas eingefallen, was ich vor der Lektüre von Crockford&#8217;s <a href="http://www.amazon.de/dp/0596517742/">The Good Parts</a> zwar wusste, aber nicht wirklich angewendet hatte: JavaScripts Prototypische Vererbung. In a nutshell bedeutet diese, dass ein Objekt zuerst nachsieht, ob es eine Eigenschaft selbst enthält, dann bei seinem Protoypten, dann bei dessen Prototypen etc., bis Object() dann keinen mehr hat.<br />
Dies kann man nutzen, um bestimmte Eigenschaften global zu machen und andere Privat zu halten. Praktischerweise lässt einen die Mozilla-JS-Engine auch an das dafür verwendete <em>__proto__</em>-Pseudoproperty ran, so dass man schreiben kann (nicht wörtlich so, aber die Idee kommt so besser rüber als im Orignalcode, welcher noch Code enthält um auf Fertigstellung zu warten):</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> newEM <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>SOP_ok <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span>isEmpty<span style="color: #009900;">&#40;</span>unsafeWindow.<span style="color: #660066;">parent</span>.<span style="color: #660066;">EM</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  newEM.__proto__ <span style="color: #339933;">=</span> unsafeWindow.<span style="color: #660066;">parent</span>.<span style="color: #660066;">EM</span>.__proto__<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
  newEM.__proto__ <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
window.<span style="color: #660066;">EM</span> <span style="color: #339933;">=</span> newEM<span style="color: #339933;">;</span>
unsafeWindow.<span style="color: #660066;">EM</span> <span style="color: #339933;">=</span> newEM<span style="color: #339933;">;</span></pre></div></div>

<p>Dann gilt für jedes Frame:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">EM.__proto__.<span style="color: #660066;">foo</span><span style="color: #339933;">=</span><span style="color: #CC0000;">42</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// ist danach überall sichtbar</span>
EM.<span style="color: #660066;">bar</span><span style="color: #339933;">=</span><span style="color: #CC0000;">23</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// nur dieses Frame hat die Variable. Andere könnten EM.bar auch als 5 deklarieren!</span></pre></div></div>

<p>Womit das Ziel erreicht wäre: es ist möglich, Felder zwischen Frames zu teilen. Es ist aber auch möglich, private Felder zu deklarieren.<br />
Nun funktioniert dieser Ansatz sehr schön direkt im Browser, als ClientSide-Script. Aber als Greasemonkey-Script&#8230; nunja, ich weiß nicht <em>was</em> da passiert, aber es ist etwas anderes. Wer möchte, kann sich das im <a href="http://www.martoks-place.de/test/js_emtest/">Proof Of Concept</a> ansehen.</p>
<p><strong>&#8230; and what we did instead</strong><br />
Nun ist das Problem nicht ganz unbekannt, weswegen mal jemand den <a href="http://wiki.greasespot.net/Content_Scope_Runner">Content Scope Runner</a> erfunden hat. Keine Rocket Surgery, aber schon soweit genial dass einfach der Code ins DOM injiziert wird und damit im Content Scope läuft. Nett, aber wir brauchen ja die Chrome-Privilegien die uns GM gibt.</p>
<p>Die Lösung ist nun, beide Techniken zu kombinieren: Die Objekt-Verlinkung passiert im Content Scope, der Rest des Scripts läuft wie gewohnt als Userscript. Dies erfordert etwas mehr Aufwand, da die jeweiligen Warteschleifen natürlich auch mit gebaut werden müssen.</p>
<p>Der Loader an sich wird relativ einfach, da alles in 2 Unterfunktionen gemacht wird. <em>Env</em> wird vorher mit Informationen über die Umgebung gefüllt, <em>Env.parentName</em> enthält dann Bezeichner wie <em>&#8220;window.parent&#8221;</em>.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">  <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>Env.<span style="color: #660066;">isSOPPass</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    injectInitCode<span style="color: #009900;">&#40;</span>Env.<span style="color: #660066;">parentName</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    waitForObject<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
    injectInitCode<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    waitForObject<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></div></div>

<p>injectInitCode tut nun genau das: einen Code generieren, der bei Ausführung ein neues EM-Objekt erstellt und entweder mit leerem <em>__proto__</em> oder dem <em>__proto__</em> des übergebenen Objektes verknüpft. Sollte etwas übergeben worden sein, muss natürlich gewartet werden, bis das Objekt dann auch verfügbar ist. Dies passiert im Conent Scope, damit funktioniert der Code!</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">  <span style="color: #003366; font-weight: bold;">function</span> injectInitCode<span style="color: #009900;">&#40;</span>p<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> code<span style="color: #339933;">=</span><span style="color: #3366CC;">''</span><span style="color: #339933;">;</span>
    code<span style="color: #339933;">+=</span><span style="color: #3366CC;">'(function(par){'</span><span style="color: #339933;">;</span>
    code<span style="color: #339933;">+=</span><span style="color: #3366CC;">' var newEM = {};'</span><span style="color: #339933;">;</span>
    code<span style="color: #339933;">+=</span><span style="color: #3366CC;">' if (par) {'</span><span style="color: #339933;">;</span>
    code<span style="color: #339933;">+=</span><span style="color: #3366CC;">'  var wait=setTimeout(function() {'</span><span style="color: #339933;">;</span>
    code<span style="color: #339933;">+=</span><span style="color: #3366CC;">'   if (typeof par.EM!==&quot;undefined&quot;) {'</span><span style="color: #339933;">;</span>
    code<span style="color: #339933;">+=</span><span style="color: #3366CC;">'    clearInterval(wait);'</span><span style="color: #339933;">;</span>
    code<span style="color: #339933;">+=</span><span style="color: #3366CC;">'    newEM.__proto__ = par.EM.__proto__;'</span><span style="color: #339933;">;</span>
    code<span style="color: #339933;">+=</span><span style="color: #3366CC;">'    window.EM = newEM;'</span><span style="color: #339933;">;</span>
    code<span style="color: #339933;">+=</span><span style="color: #3366CC;">'   }'</span><span style="color: #339933;">;</span>
    code<span style="color: #339933;">+=</span><span style="color: #3366CC;">'  }, 10);'</span><span style="color: #339933;">;</span>
    code<span style="color: #339933;">+=</span><span style="color: #3366CC;">' } else {'</span><span style="color: #339933;">;</span>
    code<span style="color: #339933;">+=</span><span style="color: #3366CC;">'  newEM.__proto__ = {};'</span><span style="color: #339933;">;</span>
    code<span style="color: #339933;">+=</span><span style="color: #3366CC;">'  window.EM = newEM;'</span><span style="color: #339933;">;</span>
    code<span style="color: #339933;">+=</span><span style="color: #3366CC;">' } '</span><span style="color: #339933;">;</span>
    code<span style="color: #339933;">+=</span><span style="color: #3366CC;">'})('</span><span style="color: #339933;">+</span>p<span style="color: #339933;">+</span><span style="color: #3366CC;">')'</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> script<span style="color: #339933;">=</span>document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'script'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    script.<span style="color: #660066;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'type'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'text/javascript'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    script.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> code<span style="color: #339933;">;</span>
    document.<span style="color: #660066;">documentElement</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>script<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    document.<span style="color: #660066;">documentElement</span>.<span style="color: #660066;">removeChild</span><span style="color: #009900;">&#40;</span>script<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Nun will aber der Rest des Scripts sein gemütliches Chrome Scope nicht verlassen&#8230; also muss die weitere Initialisierung so lange verzögert werden, biss das Content-Script unser Objekt verknotet hat &#8211; danach können wir nach belieben drauf operieren. Auch hier wieder die übliche setInterval-Methode, die nach wenigen (naja, so schnell ist Firefox ja nicht&#8230;) Versuchen ein <em>EM</em>-Objekt im <em>unsafeWindow</em> vorfindet und nach ein paar Scoping-Würgarounds dieses überall bekannt gemacht hat. Wenn das der Fall ist, können noch schnell globale Objekte erstellt werden (hier nur symbolhaft) und die eigentliche, seitenspezifische Initialisierung kann stattfinden. Wie sich vermuten lässt, passiert dies in <em>startup()</em>. Die ist dann auch so uninteressant und total by-the-book, dass sie hier nicht mehr Gegenstand ist.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">  <span style="color: #003366; font-weight: bold;">function</span> waitForObject<span style="color: #009900;">&#40;</span>buildglobals<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> wait<span style="color: #339933;">=</span>setInterval<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> unsafeWindow.<span style="color: #660066;">EM</span><span style="color: #339933;">!==</span> <span style="color: #3366CC;">&quot;undefined&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        clearInterval<span style="color: #009900;">&#40;</span>wait<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        window.<span style="color: #660066;">EM</span> <span style="color: #339933;">=</span> unsafeWindow.<span style="color: #660066;">EM</span><span style="color: #339933;">;</span>
        EM <span style="color: #339933;">=</span> window.<span style="color: #660066;">EM</span><span style="color: #339933;">;</span>  <span style="color: #006600; font-style: italic;">// Für Fx4</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>buildglobals<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          EM.__proto__.<span style="color: #660066;">Ajax</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> AJAXObject<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #006600; font-style: italic;">//awesome, we're done</span>
        startup<span style="color: #009900;">&#40;</span>EM<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>Mein Fazit</strong><br />
Also zuerstmal: meine Aussage steht noch, dass man mit JS wirklich alles lösen kann. Glück gehabt <img src='http://www.martoks-place.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Was lernen wir aus dem Ganzen: man sollte immer mal Out Of The Box denken, gerade wenn man eine Sandbox verlassen will. Um auf diese Idee zu kommen brauchte es immerhin einen <a href="http://github.com/greasemonkey/greasemonkey/issues/issue/1197">Bug-Eintrag</a> bei Greasemonkey. Ich bin immer noch überzeugt, dass das Verhalten von GM hier ein Bug ist. Wenn auch keiner der Sorte &#8220;geht nicht&#8221;, sonder &#8220;geht anders nicht als es nicht gehen sollte&#8221;.</p>
<p>Wichtigste Erkenntnis dürfte aber sein, dass man es mit Security nicht übertreiben sollte. Nicht immer, wenn etwas sicherer wird, wird es auch besser. Ohne die extrem fiese Sandbox müsste ich nichts Injecten und das Window hätte es nicht so leicht, rauszukriegen dass hier ein Edgemonkey am Werk ist. Dies sollte man wohl bei jeder Art Software-Entwicklung bedenken.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.martoks-place.de/2010/09/hackfox-foxhacks/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ikarus</title>
		<link>http://www.martoks-place.de/2010/07/ikarus/</link>
		<comments>http://www.martoks-place.de/2010/07/ikarus/#comments</comments>
		<pubDate>Sun, 25 Jul 2010 19:16:31 +0000</pubDate>
		<dc:creator>Martok</dc:creator>
				<category><![CDATA[Real Life]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Essen]]></category>
		<category><![CDATA[Fefe]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Koch]]></category>

		<guid isPermaLink="false">http://www.martoks-place.de/?p=422</guid>
		<description><![CDATA[Eins scheint in letzter Zeit moderern zu sein: nein, nicht Zurücktreten. Gut, das auch, aber das meine ich nicht. Ich meine eher die Tendenz von &#8220;Autoritätspersonen&#8221; im rhetorischen Sinne sich selbst zu entschärfen. Beispiele gefällig? Kolja Kleeberg, seines Zeichens Sternekoch und öfter mal bei KernerLanz kochenderweise zu beobachten erklärt doch einfach mal so in einem [...]]]></description>
			<content:encoded><![CDATA[<p>Eins scheint in letzter Zeit moderern zu sein: nein, nicht Zurücktreten.<br />
Gut, das auch, aber das meine ich nicht.</p>
<p>Ich meine eher die Tendenz von &#8220;Autoritätspersonen&#8221; im rhetorischen Sinne sich selbst zu entschärfen.</p>
<p>Beispiele gefällig?<br />
<span id="more-422"></span><br />
Kolja Kleeberg, seines Zeichens Sternekoch und öfter mal bei <del>Kerner</del>Lanz kochenderweise zu beobachten erklärt doch einfach mal so in einem Nebensatz, dass er Eis mit Glucosesirup anrührt.<br />
Glukosesirup, wir erinnern uns, ist das Zeug <a href="http://www.peter-weck.de/glykoproteinsyndrom.pdf">hier</a>. Relativ einfacher Test: kriegt man noch während dem Essen Sodbrennen (nicht wirklich Sodbrennen, aber recht ähnliche Empfindung), waren größere Mengen GFS dabei.<br />
Er verkündet also, dass er im Sternerestaurant den gleichen Mist serviert, wie ein Billigsteis aus dem nächstschlechtesten Discounter. Der einzige Vorteil dürfte wohl sein, dass seine Portionen kleiner sind. Mit etwas Glück ist der Schaden also nicht ganz so groß.</p>
<p>Kann man sich garnicht ausdenken, sowas.</p>
<p>Womit wir elegant zu Person 2. übergelitten hätten: Felix von Leitner aka Fefe. Der, der mit <a href="http://blog.fefe.de">blog.fefe.de</a> den gefühlt größten deutschen Linkdumpverschwörungsblog betreibt. Seit kurzem auch noch den Podcast <a href="http://alternativlos.org">Alternativlos</a> zusammen mit <a href="http://frank.geekheim.de">Frank Rieger</a>.</p>
<p>Zu diesem dann ein <a href="http://blog.fefe.de/?ts=b2b59d34">Rant</a>, in dem er auf Firefox&#8217; SVG-Support eindrischt. Man kann Firefox ja nun viel vorwerfen (ja, das Ding ist *Popo*lahm), aber das nun grade nicht.<br />
Erst recht sollte man ruhig sein, wenn man selbst sämtliche Standards ignoriert, dann aber fordert dass andere aus dem was man verbrochen hat &#8220;riechen&#8221; können was man will. Naja. Jedenfalls ging dann eine Mail an ihn.</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">Betreff: Alternativlos, SVG&amp;co
Von: Martok &lt;webmaster@martoks-place.de&gt;
An: Felix von Leitner &lt;felix-bloginput@fefe.de&gt;
Hallo,
&nbsp;
Du schaffst es immer wieder, provokante Thesen aufzustellen. Aber man
kanns auch übertreiben.
&nbsp;
Erstmal, vorneweg: Wenn man sich über Darstellungsfehler seiner
Webseiten beschwert, sollte man wenigstens erstmal seinen eigenen Code
im Griff haben. Der Unterschied zwischen Quirks und Strict Mode ist ein
himmelweiter.
blog.fefe.de, fefe.de, alternativlos.org: das hat nichts mit HTML zu
tun, das ist bestenfalls Buchstaben(Tag)suppe.
&nbsp;
So, zu SVG.
Erstmal: wenn man sich nach dem W3C richten würde, gäbe es folgendes zu
beachten: SVG definiert ein eigenständiges Dokument. Wie bindet man
Dokumente wie ein PDF ein? Richtig. Und genauso auch SVG.
&nbsp;
Dass Webkit und Opera das &quot;einfach so&quot; per &lt;img&gt; können ist nichts
weiter als Ausdruck der grade von dir gescholtenen Sandbox-Hölle: Sch***
auf Sicherheitslücken, wir haben ja eine Sandbox. Da können wir auch mal
Fremdcode per Bild laden und unblockbar ausführen. (Ich weiß dass Opera
keine hat. Aber Opera und Sicherheit.. äh, naja. Ob die den
Scripting-Teil von SVG dann können, kann ich mangels passender
Testgrafik grad nicht verifizieren)
&nbsp;
Das dann mit (übrigens kaputtem, s.u.) JavaScript fixen zu wollen...
Ähm, wie lange machst du im Web rum? (Mal geraten: länger als ich)
Hint: &lt;object&gt;-Tags können degraden.
---HTML---
&lt;object width=&quot;331&quot; height=&quot;451&quot; type=&quot;image/svg+xml&quot; data=&quot;logo.svg&quot;&gt;
  &lt;img width=&quot;331&quot; height=&quot;451&quot; src=&quot;logo.jpg&quot; alt=&quot;Logo&quot;&gt;
&lt;/object&gt;
---/HTML---
Funktioniert überall.
Spricht eigentlich was gegen PNG oder wenigstens GIF für die
Raster-Version? Gibt dann nicht so fiese Artefakte.
&nbsp;
Zum Script selbst: dank völlig grammatikfreier Tagsuppe ist das
Parse-Ergebnis weitgehend dem Zufall überlassen. Unter Anderem wird der
&lt;noscript&gt;-Teil als dem &lt;head&gt; zugehörig geraten und dementsprechend
wird genau kein Bild dargestellt... Aber eigentlich braucht man das ja
auch gar nicht.
&nbsp;
Lustigerweise kriegt man mit deaktivertem Javascript auch
&lt;audio&gt;/&lt;video&gt; nicht angezeigt. Das ist doch eigentlich ein viel
größeres Ei, oder?
&nbsp;
Und noch ein kleiner Vorschlag hintendran: füge &quot;Proudly ignoring any
W3C standards&quot; dem Footer hinzu. Passen würde es.
&nbsp;
Schöne Grüße am Rant-End:
Sebastian
&nbsp;
PS: nettes Logo übrigens, muss ja auch mal gesagt werden.</pre></div></div>

<p>Eine gute halbe Stunde später habe ich darauf eine Antwort erhalten, die zu zitieren mir nicht nur das deutsche Copyright verbietet (ich müsste ihn fragen, was aber nicht mehr geht. Neben einigen Unflätigkeiten steht da auch ein <a href="http://en.wikipedia.org/wiki/Plonk_%28Usenet%29">*plonk</a>* drin.), sondern auch der Anstand.<br />
Wenn getroffene Hunde bellen, dann hab ich wohl mit einer LBX-Autokanone ein unbewegtes Ziel beharkt.<br />
Da hat einer noch ganz andere Probleme als kaputtes HTML.</p>
<p><strong>Nachtrag</strong>: Außerdem bezeichnend: die offensichtliche Abneigung gegen PGP. Ich kann also gar nicht mal mit Sicherheit sagen, dass die Antwort nicht eventuell von einem Bot mit Tourette&#8217;s stammt. <strong>/Nachtrag</strong></p>
<p>Was ich ihm allerdings <em>wirklich</em> übel nehme: dass er tatsächlich trotzdem angefangen hat den Code etwas zu sortieren. Also entweder, ich bin nicht kritikfähig, dann ignoriere ich das aber auch alles.<br />
Oder ich nehme Kritik an, dann werde ich aber auch nicht ausfallend.</p>
<p>Ist immer noch kein HTML, aber zumindest ein &lt;body>-Element ist schonmal drin. Auch der DOCTYPE sagt jetzt zumindest nicht mehr &#8220;HTML4.0 transitional&#8221; an, sondern reines HTML5.<br />
Der geht so jetzt sogar durch den Validator, auch wenn das nach wie vor nicht dem Standard entspricht (ich hab extra nochmal nachgelesen). Da hat das W3C also durchaus noch etwas zu tun. Als Beispiele seien mal fehlende schließende Tags, fehlende Quotes an Attributwerten und nach wie vor fehlende &lt;html> und &lt;head> genannt.</p>
<p>Aber wie sagte uns schon der unbekannte Dichter?</p>
<blockquote><p>Wer hoch fliegen will, muss zunächst einmal abgehoben sein.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.martoks-place.de/2010/07/ikarus/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Aus dem Maschinenraum</title>
		<link>http://www.martoks-place.de/2010/04/aus-dem-maschinenraum/</link>
		<comments>http://www.martoks-place.de/2010/04/aus-dem-maschinenraum/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 21:55:41 +0000</pubDate>
		<dc:creator>Martok</dc:creator>
				<category><![CDATA[Intern]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Fun]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.martoks-place.de/?p=415</guid>
		<description><![CDATA[Heute mal wieder so ein paar schöne WTF-Momente gehabt. Das ist zwar bei WordPress nix neues, weswegen ich heute auch mit Serendipity experimentiert hab. Das ist zwar toll, aber die Permalinkstruktur gefällt mir nicht wirklich, und der Import hat auch nicht geklappt (konsquent falscher Zeichensatz). Ist aber hier nicht das Thema Was mich heute zum [...]]]></description>
			<content:encoded><![CDATA[<p>Heute mal wieder so ein paar schöne WTF-Momente gehabt. Das ist zwar bei WordPress nix neues, weswegen ich heute auch mit Serendipity experimentiert hab. Das ist zwar toll, aber die Permalinkstruktur gefällt mir nicht wirklich, und der Import hat auch nicht geklappt (konsquent falscher Zeichensatz). Ist aber hier nicht das Thema <img src='http://www.martoks-place.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Was mich heute zum wiederholten Mal verwundert hat, sind spontan nicht mehr funktionierende PHP-Skripte.<br />
PHPExec meinte doch eben völlig unmotiviert (&#8220;I didn&#8217;t touch anything! *looks away*&#8221;), mir einen Fehler zu melden, eine Variable wäre nicht initialisiert. Das war sie zwar wirklich nicht, aber das Skript lief ohne Unterschied literally seit Jahren. Fehlerfrei. Ich hab eine glaubhafte Versicherung meines Hosters, dass er auch nix gemacht hat&#8230;</p>
<p>Sowas hatte ich schonmal: ein Datenbank-Wrapper, der schon Wochenlang genutzt wurde, meinte auf einmal, Bind-Variablen nicht mehr richtig übergeben zu wollen. Und Überraschung: laut Manual hätte es nie funktionieren können.</p>
<p>Hatte schonmal jemand ähnliche Effekte? Plötzlich veränderliches Verhalten ist etwas, was ich mir so gar nicht erklären kann.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.martoks-place.de/2010/04/aus-dem-maschinenraum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Medienkompetenz: Nutzen von Instant Messengern</title>
		<link>http://www.martoks-place.de/2009/11/medienkompetenz-im/</link>
		<comments>http://www.martoks-place.de/2009/11/medienkompetenz-im/#comments</comments>
		<pubDate>Sun, 29 Nov 2009 01:17:34 +0000</pubDate>
		<dc:creator>Martok</dc:creator>
				<category><![CDATA[Fremdblogs]]></category>
		<category><![CDATA[Real Life]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Fefe]]></category>
		<category><![CDATA[Isotopp]]></category>
		<category><![CDATA[Medien]]></category>
		<category><![CDATA[Medienkompetenz]]></category>

		<guid isPermaLink="false">http://www.martoks-place.de/?p=376</guid>
		<description><![CDATA[Sowohl Isotopp als auch Fefe veranstalten eine Artikelserie zum Thema Medienkompetenz. Nachdem Wikipedia, Interviews und Suchen schon abgehandelt sind, bleibt noch das Thema &#8220;Kommunikationsmittel&#8221; übrig. Immerhin hat da mal jemand so etwas wie EMail, IRC und Instant Messaging erfunden. Dazu hatte ich sowieso einen Artikel in Vorbereitung, den ich hier mal in etwas veränderter Form [...]]]></description>
			<content:encoded><![CDATA[<p>Sowohl <a href="http://blog.koehntopp.de/archives/2696-Blogstoeckchen-Medienkompetenz.html">Isotopp</a> als auch <a href="http://blog.fefe.de/?ts=b5ef5deb">Fefe</a> veranstalten eine Artikelserie zum Thema Medienkompetenz. Nachdem Wikipedia, Interviews und <a href="http://www.orkpiraten.de/blog/medienkompetenz-dinge-finden-im-internet">Suchen</a> schon abgehandelt sind, bleibt noch das Thema &#8220;Kommunikationsmittel&#8221; übrig. Immerhin hat da mal jemand so etwas wie EMail, IRC und Instant Messaging erfunden.</p>
<p>Dazu hatte ich sowieso einen Artikel in Vorbereitung, den ich hier mal in etwas veränderter Form in die Artikelserie einreihen will.</p>
<p>Dabei will ich mich selber hier eher auf Chat-Artige, also vor allem IRC und IMs und den halbwegs vernünftigen Umgang damit stürzen, da scheinen doch in vielen Kreisen (auch und grade von erfahrenen Anwendern; Digital Natives) recht große Interpretationsunterschiede zu bestehen.<br />
<span id="more-376"></span><br />
Doch zum Anfang: E-Mail. Die Form der Internet-Kommunikation schlechthin &#8211; Mail schreiben, abschicken, auf die Antwort warten. Abgesehen von technischen Details wie verschiedenen Oberflächen, Automatisierungen wie Mailinglisten und der Abtarnung in Privat-Nachricht-Systemen von Foren und Social Networks hat sich da nichts großartig an der kulturellen Methode geändert. Ebene E-Mail, elektronische Post.</p>
<p>Wesentlich anders ist da die Echtzeit-Kommunikation in (Web-)Chats aller Formen und Farben: IRC, ICQ, MSN, Jabber, Skype und so weiter.<br />
Zusätzlich zum reinen Nachrichtenaustausch stellen diese allesamt noch eine weitere Information zur Verfügung: den Status. Damit kann jeder Teilnehmern den anderen (oder Teilmengen davon) kenntlich machen, was er grade tut, außer in den diversen Netzen aktiv zu sein. Ist er anwesend, grade beim Essen, macht er Hausaufgaben oder ist sein Rechner völlig allein zu Hause? Das ermöglicht es den anderen, abzuschätzen ob und wann man wohl mit einer Reaktion rechnen kann, oder ob man seine Anfrage vielleicht zurückstellen sollte, bis der Empfänger wieder Zeit hat. Und nicht nur das, es erzeugt auch eine gewisse Verpflichtung zu eben dieser Überlegung. Immerhin hat der Empfänger seinen Status gesetzt, also wird er auch erwarten dass das etwas bewirkt.</p>
<p>Nun haben viele Netzwerke noch eine weitere nette Funktion: das Senden von so genannten Offline-Nachrichten. Nachrichten werden also, solange der Empfänger nicht verfügbar ist, &#8220;irgendwo&#8221; gespeichert und später nachgesendet. Das Instant Messaging degradiert also transparent zu asynchronem Nachrichtenaustausch, E-Mail also.<br />
Und was haben wir oben erfahren? Nachricht schreiben, auf Antwort warten. Das schließt ein, dass die Nachricht eine Information enthalten sollte.<br />
An der Stelle ist dann auch der Übergang von allgemeinen Feststellungen zu meinen persönlichen Erfahrungen mit Leuten, die eben genau diese Tatsache ignoriert haben.</p>
<p>Nicht nur einmal bin ich nach längerer Zeit wieder an den Rechner gekommen und hatte da mehrere Nachrichtensitzungen stehen, die in meiner (per Status angezeigten) Abwesenheit entstanden sind. Und was war der Text? &#8220;Hi&#8221;, &#8220;Hallo&#8221;, &#8220;Wie gehts?&#8221;. Nichts weiter. Schlussfolgerung für mich: Keine Information übertragen -> Read and Forget.</p>
<p>Versuche ich nun also, jemand zu erreichen der gerade nicht verfügbar ist, gehe ich vor wie bei normalen Mails: Kurzer Gruß, Formulieren des Anliegens und eventuell noch ein &#8220;Antworte bitte zeitnah&#8221;. Hat sich das Thema erledigt, kann ich das &#8211; oh Wunder &#8211; genauso kommunizieren und so dem ggf. erst später zurückkehrenden Empfänger das sinnlose Nachdenken über gelöste Probleme ersparen.</p>
<p>Was ich damit sagen will: nur, weil es dem &#8220;normalen&#8221; Ablauf entspricht, muss man nicht unbedingt nach dem Gruß darauf warten dass der Partner irgendwas sagt. Immerhin hat er ja schon eine Allzweck-Antwort gegeben: seinen Status. Grade wenn man nach längerer Inaktivität wiederkommt und ein nichtssagendes Hi vorfindet, fühle zumindest ich mich durchaus verarscht.</p>
<p>In der Hoffnung, dass sich manche hier wiedererkannt haben (und am Besten auch ihr Verhalten ändern):<br />
Martok out.</p>
<p>PS: Ja, ich meine besonders euch 3 <img src='http://www.martoks-place.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.martoks-place.de/2009/11/medienkompetenz-im/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>IMDB Kreuzvergleichssuche</title>
		<link>http://www.martoks-place.de/2009/10/imdb-kreuzvergleichssuche/</link>
		<comments>http://www.martoks-place.de/2009/10/imdb-kreuzvergleichssuche/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 01:32:26 +0000</pubDate>
		<dc:creator>Martok</dc:creator>
				<category><![CDATA[Fremdblogs]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Dark Angel]]></category>
		<category><![CDATA[IMDB]]></category>
		<category><![CDATA[Isotopp]]></category>
		<category><![CDATA[Web-Design]]></category>

		<guid isPermaLink="false">http://www.martoks-place.de/?p=371</guid>
		<description><![CDATA[Dieser Artikel sollte eigentlich nur ein Kommentar bei Isotopp werden, ist aber doch etwas länger geworden; deswegen kommt hier tatsächlich mal wieder etwas sinnvoller Content. Isotopp vermisst in der IMDB eine Funktion, die Schnittmenge der Mitwirkenden von mehreren Filmen bilden zu können. Durchaus verständlich, immerhin hat man ja doch öfter mal einen &#8220;Mensch, den/die kenn [...]]]></description>
			<content:encoded><![CDATA[<p>Dieser Artikel sollte eigentlich nur ein Kommentar bei Isotopp werden, ist aber doch etwas länger geworden; deswegen kommt hier tatsächlich mal wieder etwas sinnvoller Content.</p>
<p><a href="http://blog.koehntopp.de/archives/2663-Vermisste-Funktion-in-der-IMDB.html">Isotopp vermisst</a> in der IMDB eine Funktion, die Schnittmenge der Mitwirkenden von mehreren Filmen bilden zu können. Durchaus verständlich, immerhin hat man ja doch öfter mal einen &#8220;Mensch, den/die kenn ich doch aus $Serie/$Film&#8221;-Moment.</p>
<p>Ein Kommentator empfiehlt dann die <a href="http://www.imdb.com/common-search">Common Name Search</a>. Die hab ich mal getestet; Fazit: Müll.</p>
<p>Aber zum Detail:<br />
<span id="more-371"></span></p>
<p>Wie funtioniert diese Suche also? Man gibt zwei oder mehr Titel in ein Textfeld ein und lässt IMDB damit arbeiten. Soweit die Theorie, in Wirklichkeit ist schon Schritt eins nicht so einfach.<br />
Das Problem ist, dass man den Namen genau(!) im IMDB-Format(!!) kennen muss. Das ist fast unmöglich, schon weil IMDB Anführungszeichen mehr oder weniger zufällig verteilt. Man bekommt also bei nicht eindeutigen Angaben eine Auswahlliste von close matches, in der man dann die gemeinten auswählt. Wenn man denn weiß welchen man GENAU meint, wie gesagt.</p>
<p>Beispiel: Dark Angel (Serie) und Without A Trace (Serie). Okay, Eingeben, abschicken.<br />
19 close matches für Dark Angel, 4 für Without A Trace. Dass DA 2000 war, weiß man als Fan. Jetzt muss man nur noch die richtige WaT suchen&#8230; das ist die von 2002. Ich habs ausprobieren müssen.</p>
<p>Und dann findet er eben genau nichts, obwohl die Credits in beide Richtungen richtig drin stehen. Im Beispiel mein ich mindestens J.C. MacKenzie, der mir neulich in einer Wiederholungsfolge von Without A Trace aufgefallen war, und dessen Filmografie vollständig und korrekt beide Serien listet. Auch direkte Episoden-Angabe bringt genau nichts. Also: #FAIL.</p>
<p>Oder mal was einfaches: vergleiche Firefly und Sarah Connor Chronicles. Kleiner Tipp: letztere heißt &#8216;&#8221;Terminator: The Sarah Connor Chronicles&#8221; (2008)&#8217;<br />
Wen finden wir? Niemand. Serenity und TSCC findet wenigstens eine VFX-Designer(?)in.</p>
<p>Serenity mit Firefly vergleichen sollte ja nun wenigstens was bringen, denkt man sich. Geht immerhin, findet aber auch nur die Crew.</p>
<p>Kurz: diese Funktion ist ein Witz und findet nur ganz selten wirklich etwas. Und wenn, dann nicht das was mich als Suchenden interessiert.</p>
<p>Sie kann also als nicht-existent angenommen werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.martoks-place.de/2009/10/imdb-kreuzvergleichssuche/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Es lebt!</title>
		<link>http://www.martoks-place.de/2009/06/es-lebt/</link>
		<comments>http://www.martoks-place.de/2009/06/es-lebt/#comments</comments>
		<pubDate>Sun, 07 Jun 2009 15:31:02 +0000</pubDate>
		<dc:creator>Martok</dc:creator>
				<category><![CDATA[Intern]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Update]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.martoks-place.de/?p=301</guid>
		<description><![CDATA[Nein, Frankenstein hat nix damit zu tun. Ich hab nur grade mal WordPress auf Version 2.7.1 katapultiert. Sieht nett aus, das ganze. Oh, und schneller fühlt sich das Dashboard auch an, was ja grade für WordPress echt mal nötig ist. Und dann möchte ich mal noch auf meine Ideenkiste hinweisen, so dolle viel ist da [...]]]></description>
			<content:encoded><![CDATA[<p>Nein, Frankenstein hat nix damit zu tun.</p>
<p>Ich hab nur grade mal WordPress auf Version 2.7.1 katapultiert. Sieht nett aus, das ganze. Oh, und schneller fühlt sich das Dashboard auch an, was ja grade für WordPress echt mal nötig ist.</p>
<p>Und dann möchte ich mal noch auf meine<a href="/ideas/"> Ideenkiste</a> hinweisen, so dolle viel ist da ja noch nicht los.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.martoks-place.de/2009/06/es-lebt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

