<?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>Michael Frankl &#187; Know-How</title>
	<atom:link href="http://www.frankl.info/wordpress/category/know-how/feed" rel="self" type="application/rss+xml" />
	<link>http://www.frankl.info/wordpress</link>
	<description>Perl and internet technology</description>
	<lastBuildDate>Mon, 12 Jul 2010 12:17:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Wie man günstig aus Deutschland auf ein spanisches Handy telefonieren kann</title>
		<link>http://www.frankl.info/wordpress/know-how/internet/sonstiges/wie-man-gunstig-aus-deutschland-auf-ein-spanisches-handy-telefonieren-kann</link>
		<comments>http://www.frankl.info/wordpress/know-how/internet/sonstiges/wie-man-gunstig-aus-deutschland-auf-ein-spanisches-handy-telefonieren-kann#comments</comments>
		<pubDate>Sun, 11 Jul 2010 21:28:02 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
				<category><![CDATA[Sonstiges]]></category>
		<category><![CDATA[voip]]></category>
		<category><![CDATA[ausland]]></category>
		<category><![CDATA[Billig-Anbieter]]></category>
		<category><![CDATA[handy]]></category>
		<category><![CDATA[intervoip]]></category>
		<category><![CDATA[softphone]]></category>
		<category><![CDATA[spanien]]></category>
		<category><![CDATA[sparen]]></category>
		<category><![CDATA[telefonieren]]></category>
		<category><![CDATA[telefonrechnung]]></category>

		<guid isPermaLink="false">http://www.frankl.info/wordpress/?p=100</guid>
		<description><![CDATA[Sehr günstig ins Ausland auf Festnetznummern und Mobiltelefone anrufen via VOIP.]]></description>
			<content:encoded><![CDATA[<p>Heute gibt es viele Leute, die keinen Festnetzanschluss, sondern nur noch ein Mobiltelefon haben. Problematisch wird das, wenn der Gesprächspartner im Ausland ist. Über einen normalen deutschen Festnetz-Anschluss können regelmäßige Gespräche von z.B. einer viertel Stunde richtig ins Geld gehen. In meinem Beispiel sind dies 0,35 Euro in der Minute. Zwei mal im Monat 30 Minuten telefonieren macht 21,00 Euro. Das war für mich Grund genug nach einer günstigeren Alternative zu suchen.<br />
<a href="http://www.frankl.info/wordpress/wp-content/uploads/2010/07/Rates_calculator1.png"><img src="http://www.frankl.info/wordpress/wp-content/uploads/2010/07/Rates_calculator1-300x267.png" alt="Rates_calculator" title="Rates_calculator" width="300" height="267" class="alignleft size-medium wp-image-104" /></a></p>
<h2>Suchen eines VOIP-Anbieters</h2>
<p>Die erste Idee war natürlich hier einen günstigen VOIP-Anbieter zu finden. Nach kurzer Recherche bin ich auf den Anbieter <a href="http://intervoip.com">intervoip.com</a> gestoßen. Die Preise sind schon sehr attraktiv: ca 0,07 Euro/Minute ins spanische Mobilfunknetz. Die Recherche nach Erfahrungen mit dem Anbieter ergab, dass man die Preise relelmäßig im Auge behalten sollte. Es gab wohl Anpassungen, die sich aber auch eher im einstelligen Cent-Bereich bewegt haben. Die Infos waren für mich ausreichen, um das mal auszuprobieren. Als nächstes also einen Account anlegen und Guthaben aufladen, das abtelefoniert werden kann. Ich habe mich dabei entschieden, die Überweisung über PayPal zu machen und die Gebühr in Kauf zu nehmen. Die Accountdaten sollte man sich gut merken, da man sie später zur Einrichtung braucht.</p>
<h2>VOIP-Softphone installieren</h2>
<p>Als nächstes muss ein Softphone für den Rechner her. Bei Intervoip gibt es zwar ein Softphone, das ich jedoch nicht verwenden konnte und wollte. Zum einen gibt es die nicht für den Mac, ausserdem bin ich wenn möglich dafür, verbreitete Standard-Software zu verwenden anstelle einer solchen proprietären Lösung. Das ist auch kein Problem, alle benötigten Daten sind auf der Seite beschrieben. Meine Wahl viel auf <a href="http://www.zoiper.com">Zoiper</a>. Hier fand ich die Classic-Version für meine Zwecke ausreichend. Die Software gibt es für Mac, Windows und Linux.</p>
<p><a href="http://www.frankl.info/wordpress/wp-content/uploads/2010/07/zoiper.png"><img class="alignnone size-medium wp-image-110" title="zoiper" src="http://www.frankl.info/wordpress/wp-content/uploads/2010/07/zoiper-300x232.png" alt="zoiper" width="300" height="232" /></a></p>
<h2>Softphone konfigurieren</h2>
<p>Nun musste das Softphone noch eingerichtet werden. Die notwendigen Daten:</p>
<ul>
<li>SIP port : 5060</li>
<li>Registrar : sip.intervoip.com</li>
<li>Proxy server : sip.intervoip.com</li>
<li>Outbound proxy server : leave empty</li>
<li>Account name : your InterVoip username</li>
<li>Password : your InterVoip password</li>
<li>Display name/number : your InterVoip username or voipnumber</li>
<li>Stunserver (option) : stun.intervoip.com</li>
</ul>
<p><a href="http://www.frankl.info/wordpress/wp-content/uploads/2010/07/zoiper_config.png"><img src="http://www.frankl.info/wordpress/wp-content/uploads/2010/07/zoiper_config-300x252.png" alt="zoiper_config" title="zoiper_config" width="300" height="252" class="alignleft size-medium wp-image-115" /></a></p>
<p>Den Stunserver sollte man, obwohl er in der Beschreibung als optional angegeben ist, auf den Wert stun.intervoip.com setzen. Bei einem ersten Test kam es bei dem voreingestellten stun-Server von Zoiper zu massiven Störgeräuschen.</p>
<h2>Fazit</h2>
<p>Natürlich muss der Rechner noch entsprechend ausgerüstet sein: ein Micro und Lautsprecher oder ein Headset braucht man, um den Ton rein und raus zu bekommen. Dann kann es los gehen mit dem Telefonieren. Beim ersten Telefonat musste ich die Laustärke des Micros noch auf etwa die Hälfte runter regeln (siehe Zoiper-Bild), dass ist aber vermutlich sehr rechnerspezifisch. Meine erste Erfahrung mit dem Dienst ist sehr positiv. Die Sprachqualität war recht gut und man kann entspannt telefonieren, ohne an die Rechnung am Monatsende zu denken.</p>
<p>Eine weitere interessante Möglichkeit von intervoip.com nennt sich Phone-to-Phone. Nach dem Login auf der Seite kann man diese Funktion auswählen. Man gibt die eigene Festnetznummer sowie die Zielrufnummer an und wird dann auf diesem Weg verbunden. Die Kosten für diesen Dienst sind nur wenig höher als das reine VOIP-Telefonat.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frankl.info/wordpress/know-how/internet/sonstiges/wie-man-gunstig-aus-deutschland-auf-ein-spanisches-handy-telefonieren-kann/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>micha</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[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>
		<slash:comments>0</slash:comments>
		</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><![CDATA[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>
		<slash:comments>0</slash:comments>
		</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>micha</dc:creator>
				<category><![CDATA[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>
		<slash:comments>3</slash:comments>
		</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><![CDATA[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>
		<slash:comments>3</slash:comments>
		</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><![CDATA[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>
		<slash:comments>0</slash:comments>
		</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><![CDATA[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>
		<slash:comments>3</slash:comments>
		</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><![CDATA[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>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Öffnen von lokalen Dateien über einen Link auf einer Internetseite</title>
		<link>http://www.frankl.info/wordpress/know-how/offnen-von-lokalen-dateien-uber-einen-link-auf-einer-internetseite</link>
		<comments>http://www.frankl.info/wordpress/know-how/offnen-von-lokalen-dateien-uber-einen-link-auf-einer-internetseite#comments</comments>
		<pubDate>Tue, 20 Dec 2005 10:27:10 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
				<category><![CDATA[Know-How]]></category>

		<guid isPermaLink="false">http://www.frankl.info/wordpress/know-how/offnen-von-lokalen-dateien-uber-einen-link-auf-einer-internetseite</guid>
		<description><![CDATA[Hintergrund
Für ein Projekt ist es nötig auf einer Internetseite Links auf lokale Dateien anzubieten. Das Problem ist, das die Browser die aus Sicherheitsgründen blocken. Die Links sehen etwa aus, wie dieses Beispiel:

&#60;a href="file://netshare/mountpoint/xy/datei.doc"&#62;datei.doc&#60;/a&#62;

Browserdetails
Firefox

Default-Verhalten: Firefox öffnet die Links nicht. Genauer gesagt reagiert er gar nicht darauf.
Abhilfe: Das Blocken der file:// -Aufrufe im Firefox kann durch eine [...]]]></description>
			<content:encoded><![CDATA[<h2>Hintergrund</h2>
<p>Für ein Projekt ist es nötig auf einer Internetseite Links auf lokale Dateien anzubieten. Das Problem ist, das die Browser die aus Sicherheitsgründen blocken. Die Links sehen etwa aus, wie dieses Beispiel:<br />
<code><br />
&lt;a href="file://netshare/mountpoint/xy/datei.doc"&gt;datei.doc&lt;/a&gt;<br />
</code></p>
<h2>Browserdetails</h2>
<h3>Firefox</h3>
<ul>
<li><strong>Default-Verhalten:</strong> Firefox öffnet die Links nicht. Genauer gesagt reagiert er gar nicht darauf.</li>
<li><strong>Abhilfe:</strong> Das Blocken der file:// -Aufrufe im Firefox kann durch eine Konfigurationseinstellung beeinflusst werden. Dabei gibt vor und nach Version 1.5 von Firefox bzw. vor und nach Mozilla 1.8 unterschiedliche Konfigurationseinstellungen. Siehe dazu: <a href="http://kb.mozillazine.org/Links_to_local_pages_don%27t_work">Links to local pages don&#8217;t work</a></li>
</ul>
<h3>Konqueror <small>(Version 3.4.1)</small></h3>
<ul>
<li><strong>Default-Verhalten:</strong> Rückfrage ob die unsichere Aktion (Datei öffnen) durchgeführt werden soll.</li>
<li><strong>Abhilfe:</strong> nicht nötig.
</li>
</ul>
<h3>Internet Explorer IE<small>(Version6.0)</small></h3>
<ul>
<li><strong>Default-Verhalten:</strong> Rückfrage ob die unsichere Aktion (Datei öffnen) durchgeführt werden soll.</li>
<li><strong>Abhilfe:</strong> nicht nötig.
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.frankl.info/wordpress/know-how/offnen-von-lokalen-dateien-uber-einen-link-auf-einer-internetseite/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Änderungen in der Verhaltensweise von LibXSLT gegenüber früheren Versionen</title>
		<link>http://www.frankl.info/wordpress/know-how/anderungen-in-der-verhaltensweise-von-libxslt-gegenuber-fruheren-versionen</link>
		<comments>http://www.frankl.info/wordpress/know-how/anderungen-in-der-verhaltensweise-von-libxslt-gegenuber-fruheren-versionen#comments</comments>
		<pubDate>Tue, 13 Dec 2005 12:22:48 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
				<category><![CDATA[Know-How]]></category>

		<guid isPermaLink="false">http://www.frankl.info/wordpress/know-how/anderungen-in-der-verhaltensweise-von-libxslt-gegenuber-fruheren-versionen</guid>
		<description><![CDATA[Neuere Versionen von LibXSLT haben ihr Verhalten hinsichtlich der Prüfung von Attributen verändert. Vor allen Dingen kommt dies zum tragen, wenn man in xpath-Ausdrücken parameter abprüft, die nicht mehr vorhanden sind.
Beispiel:

xml1:
&#60;product name="" /&#62;
xml2:
&#60;product /&#62;
xslt:
&#60;xsl :apply-template select="/product[@name='']" /&#62;

Früher hat sich der xsl-code für xml1 und xml2 gleich verhalten. Jetzt wird allerdings Version xml2 nicht mehr aufgrufen, [...]]]></description>
			<content:encoded><![CDATA[<p>Neuere Versionen von LibXSLT haben ihr Verhalten hinsichtlich der Prüfung von Attributen verändert. Vor allen Dingen kommt dies zum tragen, wenn man in xpath-Ausdrücken parameter abprüft, die nicht mehr vorhanden sind.</p>
<p>Beispiel:<br />
<code><br />
xml1:<br />
&lt;product name="" /&gt;</p>
<p>xml2:<br />
&lt;product /&gt;</p>
<p>xslt:<br />
&lt;xsl :apply-template select="/product[@name='']" /&gt;<br />
</code></p>
<p>Früher hat sich der xsl-code für xml1 und xml2 gleich verhalten. Jetzt wird allerdings Version xml2 nicht mehr aufgrufen, weil die XSL-Prüfung implizit vorraussetzt, dass das Attribut name vorhanden sein muss.</p>
<p>Die Kernaussage ist also:<br />
früher: Attribut leer < => Attribut nicht vorhanden<br />
jetzt: Attribut leer != Attribut nicht vorhanden </p>
<p>Die Prüfungen müssen also ggf. erweitert werden um den Bestandteil Attribut gar nicht definiert:<br />
<code><br />
<xsl :apply-template select="/product[@name='' or not(@name)]" /><br />
</code></p>
<p>Im folgenden die Ausgabe eines Test-Stylesheets auf die Daten<br />
<strong>Daten:</strong><br />
<code><br />
&lt;data name1="hallo" name2="" /&gt;<br />
</code></p>
<p><strong>Ausgabe</strong><br />
<code><br />
-------------------------<br />
Prüfung auf @name1="test":<br />
- @namex === @name1 vorhanden<br />
- @namex='' ===<br />
- @namex='hallo' === @name1 hallo<br />
- @namex!='xxx' === @name1 ist nicht xxx<br />
- not(@namex) ===<br />
-------------------------<br />
Prüfung auf @name2="":<br />
- @namex === @name2 vorhanden<br />
- @namex='' === @name2 leer<br />
- @namex='hallo' ===<br />
- @namex!='xxx' === @name2 ist nicht xxx<br />
- not(@namex) ===<br />
-------------------------<br />
Prüfung auf @name3 das nicht vorhanden ist:<br />
- @namex ===<br />
- @namex='' ===<br />
- @namex='hallo' ===<br />
- @namex!='xxx' ===<br />
- not(@namex) === Attribut nicht vorhanden<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.frankl.info/wordpress/know-how/anderungen-in-der-verhaltensweise-von-libxslt-gegenuber-fruheren-versionen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
