<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.0.5" -->
<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/"
	>

<channel>
	<title>Michael Frankl</title>
	<link>http://www.frankl.info/wordpress</link>
	<description>Perl and internet technology</description>
	<pubDate>Fri, 16 May 2008 07:32:50 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.5</generator>
	<language>en</language>
			<item>
		<title>Javascript-Debugging mit Safari</title>
		<link>http://www.frankl.info/wordpress/know-how/internet/javascript-debugging-mit-safari</link>
		<comments>http://www.frankl.info/wordpress/know-how/internet/javascript-debugging-mit-safari#comments</comments>
		<pubDate>Fri, 16 May 2008 07:31:00 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category>Internet</category>

		<category>Mac OS X</category>

		<guid isPermaLink="false">http://www.frankl.info/wordpress/uncategorized/javascript-debugging-mit-safari</guid>
		<description><![CDATA[Internetentwicklern bietet Safari auf den ersten Blick nicht sehr viel, wenn es darum geht Javascript zu Debuggen. In keinem Menü finden sich irgendwelche Einstellungen die helfen können. Mit einem Befehl ausgeführt in der Kommandozeile läßt sich aber ein eingebautes jedoch verstecktes Developer-Menü anschalten:
defaults write com.apple.Safari IncludeDebugMenu 1
Das funktioniert auch unter Leopard.

]]></description>
			<content:encoded><![CDATA[<p>Internetentwicklern bietet Safari auf den ersten Blick nicht sehr viel, wenn es darum geht Javascript zu Debuggen. In keinem Menü finden sich irgendwelche Einstellungen die helfen können. Mit einem Befehl ausgeführt in der Kommandozeile läßt sich aber ein eingebautes jedoch verstecktes Developer-Menü anschalten:</p>
<pre>defaults write com.apple.Safari IncludeDebugMenu 1</pre>
<p>Das funktioniert auch unter Leopard.
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frankl.info/wordpress/know-how/internet/javascript-debugging-mit-safari/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Encodingprobleme Mac OS X</title>
		<link>http://www.frankl.info/wordpress/mac-os-x/encodingprobleme-mac-os-x</link>
		<comments>http://www.frankl.info/wordpress/mac-os-x/encodingprobleme-mac-os-x#comments</comments>
		<pubDate>Tue, 15 Jan 2008 09:08:27 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category>Mac OS X</category>

		<guid isPermaLink="false">http://www.frankl.info/wordpress/uncategorized/encodingprobleme-mac-os-x</guid>
		<description><![CDATA[Immer wieder kommt es zu Problemen mit dem Encoding mit dem Postgres ausgegeben wird. Obwohl die Einstellungen in Postgres scheinbar richtig sind, kommen Umlaute mit dem falschen Encoding aus der DB. Außerdem konnte ich bisher keine Umlaute in Iterm eingeben. Sie wurden einfach ignoriert. Mit diesen Einstellungen habe ich dies korrigiert:
1. In der Datei ~/.inputrc [...]]]></description>
			<content:encoded><![CDATA[<p>Immer wieder kommt es zu Problemen mit dem Encoding mit dem Postgres ausgegeben wird. Obwohl die Einstellungen in Postgres scheinbar richtig sind, kommen Umlaute mit dem falschen Encoding aus der DB. Außerdem konnte ich bisher keine Umlaute in Iterm eingeben. Sie wurden einfach ignoriert. Mit diesen Einstellungen habe ich dies korrigiert:</p>
<p>1. In der Datei ~/.inputrc folgende Zeilen eintragen und speichern:<br />
set meta-flag on<br />
set convert-meta off<br />
set output-meta on</p>
<p>2. In der postgres-Shell das richtige Encoding setzen:<br />
# set client_encoding to &#8216;latin1&#8242;;</p>
<p>(nochmal ansehen geht so: show client_encoding).</p>
<p>3. In ITerm zentral latin1 als encoding einstellen:<br />
<em>Bookmarks::Manage Profiles::Terminal Profiles::Encoding<br />
</em>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frankl.info/wordpress/mac-os-x/encodingprobleme-mac-os-x/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Captchas mit Sinn</title>
		<link>http://www.frankl.info/wordpress/uncategorized/captchas-mit-sinn</link>
		<comments>http://www.frankl.info/wordpress/uncategorized/captchas-mit-sinn#comments</comments>
		<pubDate>Fri, 14 Dec 2007 08:50:26 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category>Uncategorized</category>

		<guid isPermaLink="false">http://www.frankl.info/wordpress/uncategorized/captchas-mit-sinn</guid>
		<description><![CDATA[Leider ist der Einsatz von Captchas für den Benutzer immer eine lästige Angelegenheit: er muss sinnlose Zeichenfolgen abtippen um einem Computer zu beweisen dass er ein Mensch ist.
Das Projekt http://recaptcha.net/learnmore.html verfolgt einen neuen und recht interessanten Ansatz: Statt sinnlose Texte vom Benutzer abtippen zu lassen werden ihm Auszüge aus Büchern vorgsetzt, die von einem OCR-Programm [...]]]></description>
			<content:encoded><![CDATA[<p>Leider ist der Einsatz von Captchas für den Benutzer immer eine lästige Angelegenheit: er muss sinnlose Zeichenfolgen abtippen um einem Computer zu beweisen dass er ein Mensch ist.</p>
<p>Das Projekt <a href="http://recaptcha.net/learnmore.html">http://recaptcha.net/learnmore.html</a> verfolgt einen neuen und recht interessanten Ansatz: Statt sinnlose Texte vom Benutzer abtippen zu lassen werden ihm Auszüge aus Büchern vorgsetzt, die von einem OCR-Programm nicht korrekt erkannt werden konnten. Dieses nicht erkannte Wort wird kombiniert mit einem dem Rechner bekannten Wort. So ist sicher gestellt das der Benutzer  keine Maschine ist und angenommen dass er den unbekannten Text richtig eingibt.</p>
<p>Der Nutzen für die Allgemeinheit ist, dass Texte aus alten Büchern digitalisiert werden.
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frankl.info/wordpress/uncategorized/captchas-mit-sinn/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Google-Maps auf der eigenen Seite einsetzen</title>
		<link>http://www.frankl.info/wordpress/know-how/internet/google-maps-auf-der-eigenen-seite-einsetzen</link>
		<comments>http://www.frankl.info/wordpress/know-how/internet/google-maps-auf-der-eigenen-seite-einsetzen#comments</comments>
		<pubDate>Sat, 25 Nov 2006 21:34:02 +0000</pubDate>
		<dc:creator>micha</dc:creator>
		
		<category>Internet</category>

		<guid isPermaLink="false">http://www.frankl.info/wordpress/uncategorized/google-maps-auf-der-eigenen-seite-einsetzen</guid>
		<description><![CDATA[Wer eine dynamische und sehr leistungsfähige Karte auf seiner Webseite einsetzen möchte, kann das mit Google-Maps recht schnell und problemlos erledigen. Das Angebot von Google ist kostenlos unter der Bedingung, dass die Seite, auf der die Karte eingebunden wird, kostenlos im Internet zur Verfügung steht. Weiterhin bietet Google keinen Support für Entwickler an, die die [...]]]></description>
			<content:encoded><![CDATA[<p>Wer eine dynamische und sehr leistungsfähige Karte auf seiner Webseite einsetzen möchte, kann das mit Google-Maps recht schnell und problemlos erledigen. Das Angebot von Google ist kostenlos unter der Bedingung, dass die Seite, auf der die Karte eingebunden wird, kostenlos im Internet zur Verfügung steht. Weiterhin bietet Google keinen Support für Entwickler an, die die Google-Maps API verwenden möchten. Aber ein Entwickler der sein Handwerk versteht benötigt auch keinen. Es gibt eine ausführliche Beschreibung der Funktionen mit Beispielen und diese einzubinden ist recht einfach.</p>
<p>Möchte man Google-Maps einbinden, benötigt man zunächst einen <a target="_blank" href="http://www.google.de/apis/maps/">Google-Maps API Key</a>. Dieser wird beim Abrufen der Karten von Google übertragen und ist für die Domain auf der die Karte eingebunden wird gültig. Auf jeden Fall ist es ratsam einmal die <a target="_blank" href="http://www.google.de/apis/maps/terms.html">Nutzungsbedingungen</a> durch zu lesen.</p>
<p>Google stellt  eine ausführliche <a target="_blank" href="http://www.google.de/apis/maps/documentation/">Dokumentation der API</a> zur Verfügung. Hier sollen nur die ersten Schritte etwas erläutert werden.</p>
<p>Zunächst definiert man ein DIV, in das die Karte geladen werden soll irgendwo im body-Tag der HTML-Seite:</p>
<p><code><br />
&lt;div style="position: absolute; top: 0px; left: 200px; width: 800px; height: 600px" id="map"&gt;&lt;/div&gt;<br />
</code></p>
<p>Der Anzeigebereich kann man mittels dieses Divs exakt festlegen.</p>
<p>
Im nächsten Schritt wird die Karte mittels eines Javascript-Aufrufes in dieses dif eingebunden.
</p>
<p><code><br />
&lt;script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=abcdefg"<br />
		type="text/javascript"&gt;&lt;/script&gt;<br />
&lt;script type="text/javascript"&gt;<br />
//&lt;![CDATA[</p>
<p>function load() {<br />
&nbsp;&nbsp;&nbsp;if (GBrowserIsCompatible()) {<br />
&nbsp;&nbsp;&nbsp;var map = new GMap2(document.getElementById("map"));<br />
&nbsp;&nbsp;&nbsp;map.setCenter(new GLatLng(37.4419, -122.1419), 13);<br />
&nbsp;&nbsp;&nbsp;}<br />
}</p>
<p>//]]&gt;<br />
&lt;/script&gt;<br />
</code></p>
<p>
Hierbei ist  in der ersten Zeile der eigene Key, der zuvor erstellt wurde, für <i>key=abcdefg</i> eingesetzt werden. Die Funktion <i>load</i> führt dann die eigentliche Initialisierung der Karte aus. Dabei wird zunächst eine Funktion <i>GBrowserIsCompatible()</i> aus der Google-API augerufen, die sicher stellt, das der Browser, der die Seite anzeigt dazu geeignet ist. Danach wird ein neues Karten-Objekt erstellt. Dabei wird die ID des Divs, das die Karten enthalten soll, in diesem Fall &#8220;map&#8221;, übergeben. Der nächste Aufruf zentriert die Karte auf bestimmten Koordinaten. Der erste Parameter von setCenter ist dabei die Koordinate selbst, der zweite Parameter gibt einen Zoom-Level an. Eine genaue Dokumentation zu dem Zoom-Level wurde nicht gefunden. Je kleiner der Wert ist, desto näher wird herangezoomt. Hier muss ein wenig ausprobiert werden.
</p>
<p>Um die Karte das erste mal ausprobieren zu können fehlt nun nur noch ein Aufruf im Body-Tag der HTML-Seite:<br />
<code><br />
&lt;body onload="load();" onunload="GUnload()"&gt;<br />
</code></p>
<p>Dadurch wird die zuvor definierte JS-Funktion load() aufgerufen sobald die Seite im Browser dargestellt wird. Der zweite Aufruf <i>onunload=&#8221;GUnload()&#8221;</i> sorgt dafür, das beim Verlassen der Seite der Speicher des Web-Browsers aufgeräumt wird und sollte deshalb auch unbedingt mit eingebunden werden.
</p>
<p>Ein kleines Beispiel ist <a href="/maps/">hier</a> verfügbar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frankl.info/wordpress/know-how/internet/google-maps-auf-der-eigenen-seite-einsetzen/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Etoken unter Linux initialisieren</title>
		<link>http://www.frankl.info/wordpress/know-how/linux/etoken-unter-linux-initialisieren</link>
		<comments>http://www.frankl.info/wordpress/know-how/linux/etoken-unter-linux-initialisieren#comments</comments>
		<pubDate>Fri, 03 Nov 2006 13:17:36 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category>Linux</category>

		<guid isPermaLink="false">http://www.frankl.info/wordpress/know-how/linux/etoken-unter-linux-initialisieren</guid>
		<description><![CDATA[Die folgenden Schritte sind notwendig um einen Alladin-Etoken unter Linux zu initialisieren. Ein gültiger Private-Key und ein gültiges Zertifikat müssen in Form von .pem-Dateien vorliegen. Es ist zu beachten, daß der Etoken mit dieser Initialisierung nur unter Linux funktioniert, die durch diesen Prozess erstellte Struktur kann nicht von den Tools unter Windows verwendet werden.
Es ist [...]]]></description>
			<content:encoded><![CDATA[<p>Die folgenden Schritte sind notwendig um einen Alladin-Etoken unter Linux zu initialisieren. Ein gültiger Private-Key und ein gültiges Zertifikat müssen in Form von .pem-Dateien vorliegen. Es ist zu beachten, daß der Etoken mit dieser Initialisierung nur unter Linux funktioniert, die durch diesen Prozess erstellte Struktur kann nicht von den Tools unter Windows verwendet werden.</p>
<p>Es ist ratsam, den Private Key nach dem Aufspielen des Etokens zu löschen oder zumindest sehr sicher aufzubewahren.<br />
# löschen und initialisieren der Karte<br />
pkcs15-init -EC –no-so-pin -T -l “mfrankl”</p>
<p>Hier ist nur die User-Pin einzugeben</p>
<p># Passwoerter setzen<br />
pkcs15-init -P -T -l “mfrankls pin” –auth-id 01</p>
<p># Private Key importieren<br />
pkcs15-init -S mfrankl-key.pem –auth-id 01</p>
<p># Zertifikat importieren<br />
pkcs15-init -X mfrankl-cert.pem –auth-id 01
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frankl.info/wordpress/know-how/linux/etoken-unter-linux-initialisieren/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Absturz von DVB-T Receiver</title>
		<link>http://www.frankl.info/wordpress/fun/absturz-von-dvb-t-receiver</link>
		<comments>http://www.frankl.info/wordpress/fun/absturz-von-dvb-t-receiver#comments</comments>
		<pubDate>Thu, 18 May 2006 20:44:44 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category>Fun</category>

		<guid isPermaLink="false">http://www.frankl.info/wordpress/?p=34</guid>
		<description><![CDATA[Auszug aus einer Bedienungsanleitung eines DVB-T Receivers zum Thema "Absturz"]]></description>
			<content:encoded><![CDATA[<p>Hier folgt ein Auszug aus der Bedienungsanleitung eines DVB-T Receivers der Marke Skymaster. Erschreckend daran ist, daß wohl schon davon ausgegangen wird, daß der Nutzer Abstürze sowieso schon von seinem PC gewohnt ist. </p>
<blockquote><p>
&#8220;Das Gerät reagiert nicht mehr: Der Receiver muss sehr viele unterschiedliche Daten verarbeiten und reagiert deshalb manchmal wie der heimische PC: Er stürzt ab. Ein Umschalten beim Empfang von EPG-Daten oder &#8220;unverständlichen&#8221; Daten seitens des Programmanbieters können zum Absturz führen. Ziehen Sie einfach den Netzstecker und warten Sie einige Sekunden, bis Sie das Gerät wieder in Betrieb nehmen.&#8221;
</p></blockquote>
<p>Gefehlt daran hat mir nur noch dieser Absatz: &#8220;Ziehen Sie doch einfach den Stecker, wir können nichts weiter tun um dies in Zukunft zu vermeiden. Finden Sie sich einfach damit ab. Es bringt auch nichts wenn Sie uns die Fehler berichten, da wir sowieso nichts dagegen tun&#8221; <img src='http://www.frankl.info/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><a id="more-34"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.frankl.info/wordpress/fun/absturz-von-dvb-t-receiver/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Online DSL-Geschwindigkeit messen</title>
		<link>http://www.frankl.info/wordpress/know-how/internet/online-dsl-geschwindigkeit-messen</link>
		<comments>http://www.frankl.info/wordpress/know-how/internet/online-dsl-geschwindigkeit-messen#comments</comments>
		<pubDate>Thu, 18 May 2006 20:23:20 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category>Internet</category>

		<guid isPermaLink="false">http://www.frankl.info/wordpress/?p=35</guid>
		<description><![CDATA[Service zum Messen der Geschwindigkeit einer DSL-Verbindung.]]></description>
			<content:encoded><![CDATA[<p>Unter der folgenden Adresse kann man schnell und einfach die Geschwindigkeit der DSL-Verbindung messen. Weitere Ergebnisse zeigen unter anderem die Netzwerkauslastung des Anbieters unter verschiedenen Gesichtspunkten auf.</p>
<p><a href="http://www.wieistmeineip.de/speedtest">http://www.wieistmeineip.de/speedtest</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frankl.info/wordpress/know-how/internet/online-dsl-geschwindigkeit-messen/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Erstellen von Video-DVDs aus komprimierten Videoformaten mit Linux</title>
		<link>http://www.frankl.info/wordpress/know-how/linux/erstellen-von-video-dvds-aus-komprimierten-videoformaten-mit-linux</link>
		<comments>http://www.frankl.info/wordpress/know-how/linux/erstellen-von-video-dvds-aus-komprimierten-videoformaten-mit-linux#comments</comments>
		<pubDate>Tue, 28 Feb 2006 19:58:54 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category>Linux</category>

		<guid isPermaLink="false">http://www.frankl.info/wordpress/?p=31</guid>
		<description><![CDATA[Einfache Vorgehensweise zum Erstellen von DVDs aus komprimierten Videoformaten wie DIVX unter Linux.]]></description>
			<content:encoded><![CDATA[<p>Dieser Eintrag beschreibt, wie aus einer komprimierten Video-Datei wie divx oder anderen unter Linux eine Video-DVD erstellt werden kann. Die einzelnen Schritte sind erstaunlich einfach und funktionieren weitestgehend automatisch. Ich persönlich fand dies einfacher als alle GUI-Tools die ich bisher gesehen habe. Natürlich gibt es keine Garantie für das Funktionieren, ich kann nur sagen daß es für mich gut funktioniert hat <img src='http://www.frankl.info/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Die Umwandlung erfolgt in mehreren Schritten. Ausführliche Infos zu den einzelnen Schritten und weitergehenden Möglichkeiten kann aus den Quellen entnommen werden.</p>
<h2>Schritt 1: Umwandeln des Quellvideos in ein DVD-taugliches Format:</h2>
<p>Für diesen Schritt habe ich als erstes das Tool ffmpeg ausprobiert und war mit dem Ergebnis sehr zufrieden. Es gibt noch zahlreichen weitere Tools, die man ausprobieren könnte. Zu beachten ist, daß man für diesen Schritt schonmal eine DVD-Größe (max. 4,7GB) Plattenplatz im Verzeichnis work benötigt. Sowohl das Verzeichnis work wie auch ziel.mpg können beliebig gewählt werden. Das Verzeichnis work muss vor dem Befehl angelegt werden.</p>
<p><code><br />
mkdir work<br />
ffmpeg -i "quelle.avi" -target dvd work/ziel.mpg<br />
</code></p>
<p>Dieser Schritt benötigt abhängig von der Prozessorleistung einige Zeit.</p>
<h2>Schritt 2: Erstellen der DVD-Struktur</h2>
<p>Mit dem vorliegenden DVD-tauglichen mpg kann nun die DVD-Struktur erstellt werden. Ich habe dabei eine Struktur ohne ein Menü gewählt, das geht schnell und einfach. Zu diesem Schritt habe ich das Tool dvdauthor verwendet. Auch hier gibt es zahlreiche Alternativen, darunter auch hübsche GUI&#8217;s. Zu beachten ist, daß hier nochmals Plattenplatz in DVD-Größe benötigt wird.</p>
<p><code><br />
cd work<br />
dvdauthor -o dvd/ -t ziel.mpg<br />
dvdauthor -o dvd/ -T<br />
</code></p>
<p>Der erste Befehl fügt das in Schritt 1 erstellte mpg in die Struktur ein. Sollen mehrere (kleine) Filme auf die DVD, kann der Aufruf beliebig wiederholt werden. Der zweite Schritt erstellt die endgültige DVD-Struktur. Das ganze dauert auch wieder etwas, jedoch bei weitem nicht so lange wie das Umwandeln des Videos.</p>
<h2>Schritt 3: Prüfen des Ergebnisses</h2>
<p>Um sicher zugehen, daß man auch das erwartete Ergebnis bekommt, kann man sich die DVD vor dem brennen schonmal vorab anschauen. Dies kann mit einem beliebigen DVD-Fähigen Media-Player wie xine oder mplayer erfolgen. Natürlich ist dieser Schritt optional.</p>
<p><code><br />
xine dvd:"$(pwd)/dvd"<br />
</code></p>
<h2>Schritt 4: Erstellen eines ISO-Images</h2>
<p>Mit der Struktur aus Schritt 3 kann nun ein DVD-ISO Image erzeugt werden. Abhängig vom Brenn-Programm kann dieser Schritt auch übersprungen werden. K3b z.B. kann auch direkt die Dateien brennen. Da er aber auch nicht sehr zeitaufwändig ist, schadet es nicht. Dies geht mit dem folgenden Befehl:</p>
<p><code><br />
mkisofs -dvd-video -v -o DVD.iso dvd<br />
</code></p>
<h2>Schritt 5: Brennen des ISO-Images</h2>
<p>Im letzten Schritt muss die DVD nur noch mit einem Brennprogramm der Wahl auf DVD gebrannt werden. Hier kann das KDE-Programm <a href="http://www.k3b.org">k3b</a> empfohlen werden.</p>
<p><strong>Quellen:</strong></p>
<ul>
<li><a href="http://gentoo-wiki.com/HOWTO_ffmpeg_divx_to_dvd">http://gentoo-wiki.com/HOWTO_ffmpeg_divx_to_dvd</a></li>
<li><a href="http://gentoo-wiki.com/HOWTO_Create_a_DVD">http://gentoo-wiki.com/HOWTO_Create_a_DVD</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.frankl.info/wordpress/know-how/linux/erstellen-von-video-dvds-aus-komprimierten-videoformaten-mit-linux/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ajax-Funktionen mit JSON und Perl</title>
		<link>http://www.frankl.info/wordpress/know-how/perl/ajax-funktionen-mit-json-und-perl</link>
		<comments>http://www.frankl.info/wordpress/know-how/perl/ajax-funktionen-mit-json-und-perl#comments</comments>
		<pubDate>Wed, 22 Feb 2006 21:27:10 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category>perl</category>

		<guid isPermaLink="false">http://www.frankl.info/wordpress/?p=30</guid>
		<description><![CDATA[Implementieren von Ajax-Funktionen in Webanwendungen mittels Nachrichtenübertragung auf JSON-Basis]]></description>
			<content:encoded><![CDATA[<h2>JSON als Alternative zu Nachrichtenübertragung auf XML-Basis</h2>
<p>Eine interessante Alternative zu AJAX-Funktionen auf XML-Message-Basis bietet die JSON-Technologie an. Die Übertragung der Nachrichten vom Browser zum Server erfolgt dabei auf Basis einer einfachen Datenstruktur, die am besten beschrieben werden kann als Verschachtelung von Arrays und Hashes. In den meisten Programmiersprachen werden diese Strukuren nativ unterstützt, was die Verbreitung der Technologie extrem vereinfacht.</p>
<p> Der Overhead des durch die XML-Strukturen anfallenden Codes entfällt, somit wird die Übertragung und das Verarbeiten der Nachrichten vereinfacht. Weder auf der Seite des Clients noch auf der des Severs muss eine Transformation der Daten über XSLT oder aber ein Zusammensuchen der Daten durch aufwändiges Navigieren durch das DOM erfolgen. Zudem muss sich der Programmierer keine Gedanken um das Finden einer geeigneten XML-Struktur machen um die Daten hin- und her zu transportieren.</p>
<p>Eine Besonderheit ist dabei, daß die Daten auf der Client-Seite direkt als gültiger Javascript-Code vorliegen. Sie können direkt mit Javascript weiterverarbeitet werden.</p>
<h2>JSON Nachrichtenstruktur</h2>
<p>Die Strutur der zu übetragenden Nachrichten sind ausführlich auf <a href="http://www.json.org">www.json.org</a> beschrieben.</p>
<p><b>Beispiel für eine JSON-Nachricht:</b><br />
<code><br />
{<br />
	"glossary": {<br />
		"title": "example glossary",<br />
		"GlossDiv": {<br />
			"title": "S",<br />
			"GlossList": [{<br />
                "ID": "SGML",<br />
                "SortAs": "SGML",<br />
                "GlossTerm": "Standard Generalized Markup Language",<br />
                "Acronym": "SGML",<br />
                "Abbrev": "ISO 8879:1986",<br />
                "GlossDef":<br />
"A meta-markup language, used to create markup languages such as DocBook.",<br />
                "GlossSeeAlso": ["GML", "XML", "markup"]<br />
            }]<br />
        }<br />
    }<br />
}<br />
</code></p>
<h2>Implementieren auf Client-Seite</h2>
<p>
Um die AJAX-Funktionalität auf der Client-Seite zu implementieren, benötigt man eine Javascript-Library. Eine solche ist auch über die oben genannte Seite <a href="http://www.json.org">www.json.org</a> zu beziehen, allerdings nicht besonders leicht zu finden. </p>
<p>Deshalb hier die direkten Links:</p>
<ul>
<li><a href="http://www.json.org/json.js">Open source code des JSON parser und JSON stringifier</a></li>
<li><a href="http://www.crockford.com/javascript/jsmin.html">Minimierte Version</a> (only about 1K)</li>
</ul>
<p>Weiterhin ist eine Library HTTP.Request hilfreich, mit deren Hilfe die HTTP-Übertragung selbst Browsertransparent durchgeführt werden kann. Sie kann <a href="http://www.openjsan.org/doc/r/rk/rkinyon/HTTP/Request/">hier</a> bezogen werden. Allerdings ist zu beachten, daß in der aktuellen Version dieser Library zur Übertragung immer automatisch der Content-Type  application/x-www-form-urlencoded verwendet wird. Dies führt z.B. bei einem Perl-Backend auf dem Server dazu, daß der Request nicht mehr korrekt ankommt sondern nur zerteilt. Zum Beheben dieses Problems sollte die folgende Zeile in Request.js geändert werden von:</p>
<p><code><br />
 this.transport.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" );<br />
</code></p>
<p>in<br />
<code><br />
 this.transport.setRequestHeader( "Content-type", "plain/text" );<br />
</code></p>
<p>Mit diesen Vorraussetzungen kann nun der Client implementiert werden:<br />
<code><br />
&lt;script type="text/javascript" src="/global/lib/json.js"&gt;&lt;/script&gt;<br />
 &lt;script type="text/javascript" src="/global/lib/HTTP/Request.js"&gt;&lt;/script&gt;<br />
 &lt;script type="text/javascript"&gt;<br />
var req, id = 0, since_msg = new Date();<br />
// vor 5 Stunden<br />
since_msg.setTime(new Date().getTime() - 1000 * 60 * 60 * 5); </p>
<p>function aktualisieren () {<br />
  var txt = document.getElementById('eingabe');</p>
<p>  req = new HTTP.Request({<br />
    uri: '/test/testajax',<br />
    postbody: JSON.stringify( {<br />
      method  : 'finduser',<br />
      id     : id++,<br />
      params  : [  txt.value, since_msg.getTime() ]<br />
    }),<br />
    onSuccess: function (trans) {<br />
      var data;<br />
      try {<br />
        var data = eval('('+trans.responseText+')'); // JSON "parsen"<br />
      } catch(e) {<br />
        alert('eval: Ungültiges JSON: ' + e);<br />
        return;<br />
      }<br />
      // hier kann ggf. noch auf data.error geprüft werden<br />
      nachrichten(data.result);<br />
    }<br />
  });<br />
  /*txt.value = ''; // Text im Eingabefeld nach Versand löschen*/<br />
  txt.focus();  // Benutzer kann weiter Text eingeben<br />
}</p>
<p>function nachrichten (result) {<br />
  var ausgabe = document.getElementById('ausgabe'); // DIV fuer Text<br />
  if (result) {       // Antwort auf update_box<br />
  	ausgabe.innerHTML="";</p>
<p>	  for (var i = 0; i &lt; result.length; i++) {<br />
    	  ausgabe.innerHTML += result[i] + "&lt;br&gt;\n";<br />
    	}<br />
  }<br />
}</p>
<p> &lt;/script&gt;</p>
<p>		&lt;form action="#" onsubmit="aktualisieren();"&gt;<br />
  Ihr Text: &lt;input type="text" id="eingabe" value=""  onkeyup="aktualisieren();"/&gt;<br />
  &lt;input type="button" value="senden + empfangen"<br />
         onclick="aktualisieren();"/&gt;<br />
 &lt;/form&gt;<br />
 &lt;div id="ausgabe"&gt;&lt;/div&gt;</p>
<p></code></p>
<p>Die wichtigsten Code-Stellen:</p>
<p><code><br />
JSON.stringify( {<br />
      method  : 'finduser',<br />
      id     : id++,<br />
      params  : [  txt.value, since_msg.getTime() ]<br />
 }<br />
</code></p>
<p>Hier wird ein Hash der die Nachrichtenbestandteile enthält mittels <i>JSON.stringify</i> zu einem JSON-String umgewandelt. Die RPC-Methode, die dabei auf dem Server aufgerufen wird, nennt sich <i>finduser</i>. Sie bekommt die Parameter <i>txt.value, since_msg.getTime()</i>. <i>id</i> ist eine fortlaufende Nummer, die zur Identifizierung des Requests bei asynchron eintreffenden Ergebnissen dient.</p>
<p>Der erzeugte JSON-String zur Übertragung sieht dann so aus:<br />
<code><br />
{"method":"finduser","id":0,"params":["micha",1140627355276]}<br />
</code></p>
<p>Mittels der Anweisung:<br />
<code><br />
 req = new HTTP.Request({<br />
    uri: '/test/testajax',<br />
    postbody: JSON.stringify( {<br />
      method  : 'finduser',<br />
      id     : id++,<br />
      params  : [  txt.value, since_msg.getTime() ]<br />
    }),<br />
    onSuccess: function (trans) {<br />
      var data;<br />
      try {<br />
        var data = eval('('+trans.responseText+')'); // JSON "parsen"<br />
      } catch(e) {<br />
        alert('eval: Ungültiges JSON: ' + e);<br />
        return;<br />
      }<br />
      // hier kann ggf. noch auf data.error geprüft werden<br />
      nachrichten(data.result);<br />
    }<br />
  });<br />
</code></p>
<p>wird der HTTP-Request übetragen. <i>onSuccess</i> beinhaltet eine Funktion, die bei einem erfolgreichen Request ausgeführt wird. Hier wird die Antwort verarbeitet und dynamisch in die dargestellte Seite eingebaut.</p>
<h2>Implementierung auf der Server-Seite</h2>
<p>Auf der Server-Seite ist die Implementierung natürlich abhängig von der Programmiersprache der Wahl. JSON-Implementierungen sind in zahlreichen gängigen Programmiersprachen vorhanden, Links dazu sind auch über <a href="http://www.json.org">www.json.org</a> zu finden.</p>
<p>Hier soll die Implementierung in Perl betrachtet werden. Wie man es von Perl gewohnt ist, steht ein fertiges CPAN-Modul <a href="http://search.cpan.org/~makamaka/JSON/">JSON</a> zur Verfügung, daß das Einbinden denkbar einfach macht. Es funktioniert (unter anderem) mit einer RPC-Schnittstelle á la SOAP. Im Idealfall muss man sich noch nicht einmal mit den JSON-Datenstrukturen beschäftigen, sondern bekommt die Parameter direkt als Funktionsparameter geliefert und gibt Perl-Datenstrukturen zurück. Die nötigen Umwandlungen passieren im Hintergrund.</p>
<p><code><br />
 package MyJSON;<br />
 use strict;<br />
 sub finduser {<br />
    my $server = shift;<br />
    my $username = shift;<br />
    my $time = shift;<br />
     #...<br />
     # return a scalar value or a hashref or an arryaref. Z.B.:<br />
     # return {'username'=>"Franz Mustermann", 'userid'=>14};<br />
 }</p>
<p>package main;<br />
 use strict;<br />
 use JSONRPC::Transport::HTTP;<br />
 use MyJSON;</p>
<p> # a la XMLRPC::Lite<br />
 JSONRPC::Transport::HTTP::CGI->dispatch_to('MyJSON')->handle();<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.frankl.info/wordpress/know-how/perl/ajax-funktionen-mit-json-und-perl/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Untersuchen der Datenübermittlung bei POST-Queries</title>
		<link>http://www.frankl.info/wordpress/know-how/untersuchen-der-datenubermittlung-bei-post-queries</link>
		<comments>http://www.frankl.info/wordpress/know-how/untersuchen-der-datenubermittlung-bei-post-queries#comments</comments>
		<pubDate>Tue, 14 Feb 2006 11:32:49 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
		
		<category>Know-How</category>

		<guid isPermaLink="false">http://www.frankl.info/wordpress/?p=29</guid>
		<description><![CDATA[Im Zusammenhang mit der Übertragung von XML-Queries oder Ähnlichem für AJAX ist es von Vorteil zu wissen, wie die verschiedenen Möglichkeiten zum Übertragen von Daten per POST an einen Server genau funktioniert. Einige Fehler bei der Übertragung der Daten lassen sich damit schnell verstehen.
 application/x-www-form-urlencoded
Ohne irgendwelche Angaben schickt der Browser die Daten in dieser Kodierung:
Content-Type: [...]]]></description>
			<content:encoded><![CDATA[<p>Im Zusammenhang mit der Übertragung von XML-Queries oder Ähnlichem für AJAX ist es von Vorteil zu wissen, wie die verschiedenen Möglichkeiten zum Übertragen von Daten per POST an einen Server genau funktioniert. Einige Fehler bei der Übertragung der Daten lassen sich damit schnell verstehen.</p>
<h2> application/x-www-form-urlencoded</h2>
<p>Ohne irgendwelche Angaben schickt der Browser die Daten in dieser Kodierung:<br />
Content-Type: application/x-www-form-urlencoded<br />
Sie wird auch verwendet, wenn im Formtag dieses Attribut verwendet wird:<br />
<code><br />
enctype="application/x-www-form-urlencoded"<br />
</code></p>
<p>Der Body der Nachricht sieht dann wie folgt aus:<br />
<code><br />
param1=jjhkjh&#038;param2=ghzzvfh+asd+asdas&#038;inhalt=inhalt+der+tt%0D%0Asadasd%0D%0Asad%0D%0Aasd%0D%0A%0D%0Aas%0D%0Ada%0D%0As<br />
</code></p>
<p>Sie ist also wie der Content-Type schon sagt URL kodiert und könnte auch einfach wie sie ist in einem GET-Aufruf benutzt werden. Zu beachten ist, dass mit dieser Methode keine Dateien übertragen werden können. Hier wird lediglich der Dateiname übertragen, der eigentliche Inhalt nicht.</p>
<h2>multipart/form-data</h2>
<p>Die zweite Möglichkeit ist dieser Typ:<br />
<code>enctype="multipart/form-data"</code></p>
<p>Hierbei wird jeder einzelne Parameter in einem durch einen Boundary-abgetrennten Bereich transportiert, ähnlich wie das bei MIME-Messages geschieht. Diese Methode ist auf jeden Fall zu wählen, wenn eine oder mehrere Dateien zum Server übertragen werden sollen, im Gegensatz zur ersten Methode ist auch der Transport von Binär-Dateien möglich.</p>
<p>Beispiel:</p>
<p><code><br />
POST /admin/users HTTP/1.1<br />
Host: atlas.mf.devel<br />
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20060117 Firefox/1.0.7<br />
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5<br />
Accept-Language: de,en-us;q=0.7,en;q=0.3<br />
Accept-Encoding: gzip,deflate<br />
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7<br />
Keep-Alive: 300<br />
Connection: keep-alive<br />
Referer: http://atlas.mf.devel/admin/users?action=edit&#038;id=51&#038;order=ldap&#038;sessionid=e4a6a108394d2d124b89e73d0c4ff5391&#038;style=popup&#038;style=popup<br />
Cookie: sessionid=e4a6a108394d2d124b89e73d0c4ff5391<br />
Content-Type: multipart/form-data; boundary=---------------------------12440347477298357471720878039<br />
Content-Length: 4599<br />
-----------------------------12440347477298357471720878039<br />
Content-Disposition: form-data; name="atk"</p>
<p>74609419<br />
-----------------------------12440347477298357471720878039<br />
Content-Disposition: form-data; name="id"</p>
<p>51<br />
-----------------------------12440347477298357471720878039<br />
Content-Disposition: form-data; name="action"</p>
<p>update<br />
-----------------------------12440347477298357471720878039<br />
Content-Disposition: form-data; name="offset"</p>
<p>-----------------------------12440347477298357471720878039<br />
Content-Disposition: form-data; name="order"</p>
<p>ldap<br />
-----------------------------12440347477298357471720878039<br />
</code>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frankl.info/wordpress/know-how/untersuchen-der-datenubermittlung-bei-post-queries/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
