<?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; perl</title>
	<atom:link href="http://www.frankl.info/wordpress/category/know-how/perl/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>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>Umwandeln von Latin1 in Unicode in der Shell</title>
		<link>http://www.frankl.info/wordpress/know-how/perl/umwandeln-von-latin1-in-unicode-in-der-shell</link>
		<comments>http://www.frankl.info/wordpress/know-how/perl/umwandeln-von-latin1-in-unicode-in-der-shell#comments</comments>
		<pubDate>Tue, 15 Nov 2005 11:18:30 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://www.frankl.info/wordpress/know-how/perl/umwandeln-von-latin1-in-unicode-in-der-shell</guid>
		<description><![CDATA[Da ich kein Shell-Script gefunden habe hier eine kleine Perl-Lösung:
#!/usr/bin/perl
use strict;
use Unicode::String;
print Unicode::String::latin1($ARGV[0])->utf8();
Ausführen mit:
perl iso2uni.pl Ümläüte
]]></description>
			<content:encoded><![CDATA[<p>Da ich kein Shell-Script gefunden habe hier eine kleine Perl-Lösung:</p>
<p><code>#!/usr/bin/perl</p>
<p>use strict;<br />
use Unicode::String;<br />
print Unicode::String::latin1($ARGV[0])->utf8();</code></p>
<p>Ausführen mit:<br />
perl iso2uni.pl Ümläüte</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frankl.info/wordpress/know-how/perl/umwandeln-von-latin1-in-unicode-in-der-shell/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Abhängigkeiten von Perl-Modulen</title>
		<link>http://www.frankl.info/wordpress/know-how/perl/anhangigkeiten-von-perl-modulen</link>
		<comments>http://www.frankl.info/wordpress/know-how/perl/anhangigkeiten-von-perl-modulen#comments</comments>
		<pubDate>Fri, 11 Nov 2005 09:41:23 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://www.frankl.info/wordpress/?p=22</guid>
		<description><![CDATA[Wer das Problem hat, mit einem bestimmten Server kein CPAN benutzen zu können wird das schonmal durchgemacht haben: Modul runterladen, irgendwie auf den Server übertragen, versuchen zu installieren, die  nächste Abhängigkeit feststellen und wieder von vorne.
Eine Lösung dafür bietet das Perl-Module CPAN::Unwind, das in der Lage ist, ohne die zu installieren die Abhängigkeiten von [...]]]></description>
			<content:encoded><![CDATA[<p>Wer das Problem hat, mit einem bestimmten Server kein CPAN benutzen zu können wird das schonmal durchgemacht haben: Modul runterladen, irgendwie auf den Server übertragen, versuchen zu installieren, die  nächste Abhängigkeit feststellen und wieder von vorne.</p>
<p>Eine Lösung dafür bietet das Perl-Module CPAN::Unwind, das in der Lage ist, ohne die zu installieren die Abhängigkeiten von einem Modul herauszufinden. So können diese gesammelt heruntergeladen und übertragen werden. Das Modul installiert ein shell-Tool namens cpan-unwind.</p>
<p>Mit dem Befehl:<br />
cpan-unwind PDF::API2</p>
<p>Es scheint noch einige Kinderkrankheiten zu geben, so erhält man manche komische Fehlermeldung, grundsätzlich ist das aber schon nützlich.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frankl.info/wordpress/know-how/perl/anhangigkeiten-von-perl-modulen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CPAN einstellen</title>
		<link>http://www.frankl.info/wordpress/know-how/perl/cpan-einstellen</link>
		<comments>http://www.frankl.info/wordpress/know-how/perl/cpan-einstellen#comments</comments>
		<pubDate>Thu, 03 Nov 2005 14:48:07 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://www.frankl.info/wordpress/?p=18</guid>
		<description><![CDATA[CPAN-Kommandos die man immer wieder braucht.
Bedienung:
m Modulname: Zeige Infos zu einem Modul
install Modulname: Module installieren
force install Modulname: Modulinstall erzwingen
Einstellungen
o conf: Einstellungen anzeigen
o conf urllist unshift &#8220;mirror&#8221;: Mirror eintragen (hinzufügen)
o conf urllist shift: mirror entfernen
]]></description>
			<content:encoded><![CDATA[<p>CPAN-Kommandos die man immer wieder braucht.</p>
<p>Bedienung:<br />
m Modulname: Zeige Infos zu einem Modul<br />
install Modulname: Module installieren<br />
force install Modulname: Modulinstall erzwingen</p>
<p>Einstellungen<br />
o conf: Einstellungen anzeigen<br />
o conf urllist unshift &#8220;mirror&#8221;: Mirror eintragen (hinzufügen)<br />
o conf urllist shift: mirror entfernen</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frankl.info/wordpress/know-how/perl/cpan-einstellen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PDF::API2</title>
		<link>http://www.frankl.info/wordpress/know-how/perl/pdfapi2</link>
		<comments>http://www.frankl.info/wordpress/know-how/perl/pdfapi2#comments</comments>
		<pubDate>Thu, 20 Oct 2005 07:35:38 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://www.frankl.info/wordpress/?p=16</guid>
		<description><![CDATA[Tutorial, dass die Basics von PDF::API2 ganz gut erklärt.
http://pdfapi2.sourceforge.net/twiki/
]]></description>
			<content:encoded><![CDATA[<p>Tutorial, dass die Basics von PDF::API2 ganz gut erklärt.</p>
<p>http://pdfapi2.sourceforge.net/twiki/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frankl.info/wordpress/know-how/perl/pdfapi2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ausgabe des Data::Dumper begrenzen</title>
		<link>http://www.frankl.info/wordpress/know-how/perl/ausgabe-des-datadumper-begrenzen</link>
		<comments>http://www.frankl.info/wordpress/know-how/perl/ausgabe-des-datadumper-begrenzen#comments</comments>
		<pubDate>Mon, 17 Oct 2005 08:58:20 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
				<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://www.frankl.info/wordpress/?p=15</guid>
		<description><![CDATA[Bei der Ausgabe von Objekten ist Data::Dumper oft zu gesprächig, weil er die Strukturen bis ganz in die Tiefe ausgibt. So läßt sich die Tiefe begrenzen:

use Data::Dumper;
$Data::Dumper::Maxdepth = 2;

]]></description>
			<content:encoded><![CDATA[<p>Bei der Ausgabe von Objekten ist Data::Dumper oft zu gesprächig, weil er die Strukturen bis ganz in die Tiefe ausgibt. So läßt sich die Tiefe begrenzen:</p>
<p><code><br />
use Data::Dumper;<br />
$Data::Dumper::Maxdepth = 2;<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.frankl.info/wordpress/know-how/perl/ausgabe-des-datadumper-begrenzen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Howto create vCards with perl</title>
		<link>http://www.frankl.info/wordpress/uncategorized/howto-create-vcards-with-perl</link>
		<comments>http://www.frankl.info/wordpress/uncategorized/howto-create-vcards-with-perl#comments</comments>
		<pubDate>Mon, 26 Sep 2005 10:44:37 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://www.frankl.info/wordpress/?p=13</guid>
		<description><![CDATA[Want to create vcards from Perl? This is a little howto to do so using the Text::vCard Perl Module.]]></description>
			<content:encoded><![CDATA[<p>I wanted to create vcards out of userdata from an application. There is a module called Text::vCard and the first impression was that it would be an easy job. Finally it took much more time than I thought because the documentation is not easy to understand and does not describe the API completly.</p>
<p>For this reason i want to write a small howto for the next time <img src='http://www.frankl.info/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>I wanted to get the textual output from the vcard. So I started creating an new Text::vCard, but could not find a method to output the content. After some reading I found out that the only way is to use am addressbook and create a vcard from this one:</p>
<p><code><br />
my $addressbook = new Text::vCard::Addressbook();<br />
my $vcard = $addressbook->add_vcard();<br />
</code></p>
<p>Next Step is to fill the base-data. Vcard knows base-data and &#8220;more complex&#8221; data. Note that $self is my user-object which contains the data.</p>
<p><code><br />
# Basisdaten einfuegen<br />
$vcard->fullname($self->get_fullname());<br />
$vcard->email( $self->get('email') );<br />
$vcard->uid($self->get('user'));<br />
$vcard->title($self->get('title'));<br />
</code></p>
<p>Next Step is an Name-Node. This node belongs to the more complex ones and you can use. I do not know for what more than one of them can be used, but there must be any reason. The Method add_node is used to create a new node of a special type.</p>
<p><code><br />
# namen setzen<br />
my $name = $vcard->add_node({'node_type'=>'N'});<br />
$name->family( $self->get('name') );<br />
$name->given( $self->get('prename') );<br />
</code></p>
<p>Next i added an address-node. You can add multiple here i think. I did not try, but in other nodes you can do something like that: $add->add_types(&#8217;WORK&#8217;);</p>
<p><code><br />
# Adresse einsetzen<br />
my $ad = $vcard->add_node({'node_type'=>'ADR'});<br />
$ad->add_types('work');<br />
$ad->street( $self->get('street') );<br />
$ad->city( $self->get('city') );<br />
$ad->post_code($self->get('zip') );<br />
</code></p>
<p>Finally I added phone numbers. Please note the call add_types(['WORK', 'fax']) to mark that the phone-number is a fax at work.</p>
<p><code><br />
# Telefonnummern<br />
my $p = $vcard->add_node({'node_type'=>'TEL'});<br />
$p->add_types('WORK');<br />
$p->value($self->get('phone'));</p>
<p>my $fax = $vcard->add_node({'node_type'=>'TEL'});<br />
$fax->add_types(['WORK', 'fax']);<br />
$fax->value($self->get('fax'));</p>
<p>my $mobil = $vcard->add_node({'node_type'=>'TEL'});<br />
$mobil->add_types('cell');<br />
$mobil->value($self->get('mobil'));<br />
</code></p>
<p>Finally you can get the output using the addressbook-object:</p>
<p><code>my $textonly = $addressbook->export()</code></p>
<p>If you want to print this to a browser, do not forget to send a proper content-type like text/v-card, so the browser knows what to to with it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.frankl.info/wordpress/uncategorized/howto-create-vcards-with-perl/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
