<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-35960478</id><updated>2011-12-16T15:59:09.937+01:00</updated><category term='Usability'/><category term='Marktanteile'/><category term='Encoding'/><category term='Decodierung'/><category term='IE9'/><category term='perl'/><category term='XMLHttpRequest'/><category term='Decoding'/><category term='GP1'/><category term='Erfahrungen'/><category term='Apfel'/><category term='Asynchronous JavaScript and XML'/><category term='DBI'/><category term='Apple'/><category term='Ajax'/><category term='Characters'/><category term='GUI'/><category term='HTTP'/><category term='ISO-8859-1'/><category term='Browsers'/><category term='SQL Standards'/><category term='Chrome'/><category term='Nikon'/><category term='ISO-8859-15'/><category term='Mac OS X'/><category term='synchron'/><category term='synchronous'/><category term='JSON'/><category term='schlecht'/><category term='Browserstatistik'/><category term='nicht benutzbar'/><category term='CPAN'/><category term='asyncron'/><category term='ExtJS'/><category term='Erfahrungsbericht'/><category term='IE7'/><category term='Macintosh'/><category term='Codierung'/><category term='nightly build'/><category term='mySQL'/><category term='kundenunfreundlich'/><category term='IE6'/><category term='php'/><category term='UTF-8'/><category term='Dekodierung'/><category term='synchrone'/><category term='Migration'/><category term='Umlaut'/><category term='Benutzbarkeit'/><category term='Datentypen'/><category term='DBD'/><category term='Google'/><category term='Unicode'/><category term='Firefox'/><category term='Character Set'/><category term='IE8'/><category term='perldoc'/><category term='ISO-Latin-1'/><category term='IE'/><category term='ODBC'/><category term='Kodierung'/><category term='syncron'/><category term='Installation'/><title type='text'>m2w2tech</title><subtitle type='html'>Anything Java, Perl, ExtJS, JavaScript, JSON and tech stuff in general</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://m2w2tech.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35960478/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://m2w2tech.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>m2w2</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.m2w2.de/images/blogspot/mw.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-35960478.post-706576414354590022</id><published>2011-12-14T06:53:00.003+01:00</published><updated>2011-12-16T15:59:10.035+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Browserstatistik'/><category scheme='http://www.blogger.com/atom/ns#' term='IE8'/><category scheme='http://www.blogger.com/atom/ns#' term='IE'/><category scheme='http://www.blogger.com/atom/ns#' term='IE7'/><category scheme='http://www.blogger.com/atom/ns#' term='Chrome'/><category scheme='http://www.blogger.com/atom/ns#' term='IE9'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><category scheme='http://www.blogger.com/atom/ns#' term='Browsers'/><category scheme='http://www.blogger.com/atom/ns#' term='IE6'/><title type='text'>Google Chrome Frame to the rescue!</title><content type='html'>Many of you are still using Microsoft Internet Explorer as the default browser. Which version are you using, especially in your company? I'd be interested in that! Your comments will be greatly appreciated. Why? Well, in IT terms, IE7 is an ancient piece of software today. Even IE8 is already quite old, too, let alone the ten years old IE6 which should clearly be banned from this planet, even according to Microsoft, see&amp;nbsp;&lt;a href="http://www.ie6countdown.com/" target="_blank"&gt;IE6Countdown&lt;/a&gt; which is a Microsoft website. But read on...&lt;br /&gt;
&lt;br /&gt;
To mention a few facts: IE6, IE7, and IE8 all do not support the latest technologies used by today’s web applications. They are all significantly slower than newer versions of IE (IE9+), Google's Chrome, or Mozilla's Firefox. I know many of you are not allowed to arbitrarily install applications on your machines due to your company's understandably restricted IT policy. So still many of you are stuck with IE8, IE7, or even IE6.&lt;br /&gt;
&lt;br /&gt;
But hey, there's something named "Google Chrome Frame" to the rescue! It's an AddOn for Internet Explorer that allows you to use the capabilities and the speed of Google Chrome from within your old IE! That's nothing new, but since a few months, you even do not need needing administrator rights to install it. Have a look at the &lt;a href="http://goo.gl/ASV95" target="_blank"&gt;Chrome Frame Installer&lt;/a&gt;. Go ahead at your own risk, and carefully read Google's user license agreement.&lt;br /&gt;
&lt;br /&gt;
After installation, only dedicated HTML5 sites and sites specially prepared (like Google Mail etc.) are rendered using Chrome Frame under the hood. So you might still need to tweak your Windows Registry (again no need for admin rights) to get Chrome Frame to run as the default browser engine for ALL websites within IE.&lt;br /&gt;
&lt;br /&gt;
So if you have installed Chrome Frame, and if know what the Windows Registry is, how it works, and dare to change it, have a look at the&amp;nbsp;&lt;a href="http://goo.gl/CMnXz" target="_blank"&gt;Chrome Frame Troubleshooting site&lt;/a&gt; to look up the registry keys you need. The most important key you need to create is a key named &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;IsDefaultRenderer&lt;/span&gt;. Its &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;REG_DWORD &lt;/span&gt;value needs to be 1, and it must located under &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;HKCU\Software\Google\ChromeFrame&lt;/span&gt;. If that &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ChromeFrame&lt;/span&gt; folder does not exist, just create it. Restart your IE, go to e.g. &lt;a href="http://www.heise.de/" target="_blank"&gt;heise.de&lt;/a&gt;, right-click into the page. If you see a context menu containing the menu item "About Google Chrome Frame..." you are successfully using Chrome's engines under the hood of your old IE.&lt;br /&gt;
&lt;br /&gt;
By the way, did you know there are now more people using Google's Chrome browser than there are Firefox users, see &lt;a href="http://goo.gl/4Tc4B" target="_blank"&gt;StatsCounter&lt;/a&gt;. This is no surprise to me. Chrome works just fine, and it updates itself. And that' what IE9+ will do in the future: On the&amp;nbsp;&lt;a href="http://goo.gl/FwkSp" target="_blank"&gt;Windows Team Blog&lt;/a&gt; Microsoft's Ryan Gavin says that they "plan to automatically upgrade Windows customers to the latest version of Internet Explorer". Well, ten years late, but a good start.&lt;br /&gt;
&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35960478-706576414354590022?l=m2w2tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://m2w2tech.blogspot.com/feeds/706576414354590022/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35960478&amp;postID=706576414354590022' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35960478/posts/default/706576414354590022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35960478/posts/default/706576414354590022'/><link rel='alternate' type='text/html' href='http://m2w2tech.blogspot.com/2011/12/google-chrome-frame-to-rescue.html' title='Google Chrome Frame to the rescue!'/><author><name>m2w2</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.m2w2.de/images/blogspot/mw.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35960478.post-3187861820060901148</id><published>2010-03-11T18:37:00.000+01:00</published><updated>2010-03-11T18:37:33.196+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ISO-Latin-1'/><category scheme='http://www.blogger.com/atom/ns#' term='XMLHttpRequest'/><category scheme='http://www.blogger.com/atom/ns#' term='Codierung'/><category scheme='http://www.blogger.com/atom/ns#' term='Umlaut'/><category scheme='http://www.blogger.com/atom/ns#' term='Encoding'/><category scheme='http://www.blogger.com/atom/ns#' term='ISO-8859-1'/><category scheme='http://www.blogger.com/atom/ns#' term='Migration'/><category scheme='http://www.blogger.com/atom/ns#' term='mySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='UTF-8'/><category scheme='http://www.blogger.com/atom/ns#' term='Asynchronous JavaScript and XML'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='Character Set'/><category scheme='http://www.blogger.com/atom/ns#' term='Characters'/><category scheme='http://www.blogger.com/atom/ns#' term='ExtJS'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='ISO-8859-15'/><title type='text'>Unterschiede beim Encoding zwischen MySQL 5.1 und 5.0</title><content type='html'>Nach der Umstellung von MySQL 5.0.67 auf 5.1.40 hat unsere Perl-basierte Web-Applikation INSERT-Statements, in denen Strings mit Umlauten vorkamen, zwar klaglos ausgeführt. Am Browser jedoch erschienen plötzlich dennoch wieder seltsame Zeichen, und zwar solche, die ich auch schon vor der in meinem &lt;a href="http://m2w2tech.blogspot.com/2008/09/extjs-iso-8859-1-und-utf-8-verheiratet.html"&gt;früheren Artikel&lt;/a&gt; beschriebenen Problemlösung im Zusammenhang von ExtJS, UTF-8, ISO-8859-1 und Perl beobachtet hatte. Eigentlich war das Problem also schon mal behoben. Warum taucht es jetzt wieder auf? Nun: Das Encoding war bisher systemweit ISO-8859-1. Wie im gerade erwähnten Artikel beschrieben, funkte lediglich ExtJS durch Nutzen der JavaScript-Function encodeURIComponent dazwischen und sendete seine Ajax-Requests UTF-8-codiert. Dieses Problem war, siehe erwähnter Artikel behoben. Jedoch sind in MySQL 5.1 Bugs behoben, die in 5.0.67 wohl noch existiert haben, so auch das Verhalten, dass beim Senden eines INSERT-Statements, in dem ISO-8859-1-codierte Zeichen gemischt mit UTF-8-codierten Zeichen mit der neueren DBMS-Version ("sicherheits"halber?) UTF-8 als Default verwendet wird, während 5.0.67 hier dem INSERT-Statement brav das in den Session-Variablen hinterlegte latin1 aufgezwungen hat. Und da eine Request-Parameter nicht ISO-8859-1-codiert war, sondern UTF8, liefen wir eben in dieses unerwünschte Verhalten rein. Wieder was gelernt...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35960478-3187861820060901148?l=m2w2tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://m2w2tech.blogspot.com/feeds/3187861820060901148/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35960478&amp;postID=3187861820060901148' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35960478/posts/default/3187861820060901148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35960478/posts/default/3187861820060901148'/><link rel='alternate' type='text/html' href='http://m2w2tech.blogspot.com/2010/03/unterschiede-beim-encoding-zwischen.html' title='Unterschiede beim Encoding zwischen MySQL 5.1 und 5.0'/><author><name>m2w2</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.m2w2.de/images/blogspot/mw.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35960478.post-8581099053549595007</id><published>2009-12-03T18:56:00.000+01:00</published><updated>2009-12-03T18:56:51.032+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Usability'/><category scheme='http://www.blogger.com/atom/ns#' term='Nikon'/><category scheme='http://www.blogger.com/atom/ns#' term='Benutzbarkeit'/><category scheme='http://www.blogger.com/atom/ns#' term='GP1'/><title type='text'></title><content type='html'>&lt;span class="Apple-style-span" style="color: grey; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h3 class="GenericStory_Message" data-ft="{&amp;quot;type&amp;quot;:&amp;quot;msg&amp;quot;}" style="color: #333333; font-size: 13px !important; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: hidden; overflow-y: hidden; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;
Gerade habe ich entdeckt, warum mein GPS-Empfänger Nikon GP-1 an meiner Nikon D300s DSLR nicht richtig funktioniert hat. Ein klassischer Bedienungsfehler. Der extrem schwergängige Stecker am GPS-Empfänger war nur zu 99% eingesteckt. Er hatte Spannung, empfing mit durchgängig grün leuchtendem Licht auch GPS-Signale. Die Kamera bekam davon jedoch nichts mit. Mit sehr v&lt;span class="text_exposed_show" style="display: inline;"&gt;iel Kraft machte es beim Neuanschließen dann zwischen 99% und 100% ein leises knackendes Geräusch und schon ging's.&lt;/span&gt;&lt;/h3&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35960478-8581099053549595007?l=m2w2tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://m2w2tech.blogspot.com/feeds/8581099053549595007/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35960478&amp;postID=8581099053549595007' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35960478/posts/default/8581099053549595007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35960478/posts/default/8581099053549595007'/><link rel='alternate' type='text/html' href='http://m2w2tech.blogspot.com/2009/12/gerade-habe-ich-entdeckt-warum-mein-gps.html' title=''/><author><name>m2w2</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.m2w2.de/images/blogspot/mw.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35960478.post-7858917369512972681</id><published>2009-09-04T17:00:00.006+02:00</published><updated>2009-09-06T11:55:03.884+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Macintosh'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='Installation'/><category scheme='http://www.blogger.com/atom/ns#' term='Apfel'/><title type='text'>Auswirkungen von Snow Leopard</title><content type='html'>Gerade eben habe ich Mac OS X 10.6 (Snow Leopard) bei mir installiert. Bisher habe ich mir nicht viel Zeit genommen, die Auswirkungen genau unter die Lupe zu nehmen. Beobachten konnte ich in den ersten 10 Minuten nach der erfolgreichen Installation, die übrigens 56 Minuten gedauert hat (iMac 2007, 2,4GHz, 4 GB RAM), folgendes:&lt;div&gt;&lt;ul&gt;&lt;li&gt;Der freie Platz auf der Festplatte ist um stolze 10,5 GB gewachsen.&lt;/li&gt;&lt;li&gt;Vom von Apple beworbenen schnelleren Starten von Anwendungen merke schon etwas, richtig auffällig ist es aber vor allem bei Apple's hauseigener Anwendung Aperture.&lt;/li&gt;&lt;li&gt;Aperture gibt nach dem Beenden anscheindend endlich allen zuvor allokierten Speicher wieder frei. Schätzungsweise und hoffentlich ist das auch bei anderen Anwendungen so.&lt;/li&gt;&lt;li&gt;iCal versteht sich jetzt von Haus aus mit Accounts aus Google Calendar.&lt;/li&gt;&lt;li&gt;OpenOffice fühlt sich nicht schneller an als unter 10.5 Leopard.&lt;/li&gt;&lt;li&gt;Front Row funktioniert wieder! Unter Leopard hat es bei mir nur anfangs funktioniert, irgendwann konnte ich es dann aber nur noch manuell durch Öffnen der .app-Datei starten.&lt;/li&gt;&lt;li&gt;Nach dem ersten Anmelden lief für etwa eine Minute im Hintergrund ein fensterloses Ruby-Script mit etwa 8% Prozessorlast. Warum, weiß ich nicht.&lt;/li&gt;&lt;li&gt;Der Prozess mdworker, der nach meiner Google-Recherche wohl etwas mit zu indizierenden Dateien und Spotlight zu tun haben könnte, lief nach dem ersten Anmelden für etwa 5 Minuten mit einer Prozessorlast zwischen 10% und 70%.&lt;/li&gt;&lt;li&gt;The GIMP wollte mit der seit Leopard-Zeiten installierten Version 2.4.3 nicht mehr starten, erst mit Version 2.6.7 klappte es wieder. &lt;/li&gt;&lt;li&gt;In Textfeldern innerhalb von Java-Applets funktioniert der Accent Circonflêxe ^ nicht mehr, möglicherweise liegt das aber auch am Update auf Java 1.6.0_15, das kurz vorher anstand.  &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Soweit dazu, jetzt installiere ich iLife'09 und hoffe, dass es damit auch so gut klappt wie mit dem Schneeleoparden.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35960478-7858917369512972681?l=m2w2tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://m2w2tech.blogspot.com/feeds/7858917369512972681/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35960478&amp;postID=7858917369512972681' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35960478/posts/default/7858917369512972681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35960478/posts/default/7858917369512972681'/><link rel='alternate' type='text/html' href='http://m2w2tech.blogspot.com/2009/09/auswirkungen-von-snow-leopard.html' title='Auswirkungen von Snow Leopard'/><author><name>m2w2</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.m2w2.de/images/blogspot/mw.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35960478.post-6993353919020785029</id><published>2009-07-09T14:40:00.015+02:00</published><updated>2009-07-09T15:38:14.336+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Erfahrungen'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Standards'/><category scheme='http://www.blogger.com/atom/ns#' term='Datentypen'/><category scheme='http://www.blogger.com/atom/ns#' term='CPAN'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='mySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Asynchronous JavaScript and XML'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='ODBC'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='ExtJS'/><category scheme='http://www.blogger.com/atom/ns#' term='DBI'/><category scheme='http://www.blogger.com/atom/ns#' term='DBD'/><category scheme='http://www.blogger.com/atom/ns#' term='perldoc'/><title type='text'>MySQL to Perl to JSON</title><content type='html'>Das nette &lt;a href="http://www.cpan.org" target="_blank"&gt;CPAN&lt;/a&gt; stellt für die Umwandlung von Perl-Datenstrukturen in JSON das eigentlich geeignete &lt;a href="http://search.cpan.org/~makamaka/JSON-2.15/lib/JSON.pm" target="_blank"&gt;JSON-Modul&lt;/a&gt; zur Verfügung. Will man jedoch Daten, die man gerade aus einer MySQL-Datenbank geholt hat, in mit dem CPAN-JSON-Modul so in JSON konvertieren, dass gängige JavaScript-Frameworks das JSON anstandslos verarbeiten können, gibt es Probleme:&lt;br&gt;&lt;br&gt;

Angenommen, das Holen der Daten in Perl erfolgt so
&lt;pre&gt;
my $statementHandle = $dbh-&gt;prepare($statement);
my $queryResult = $statementHandle-&gt;execute();
my $resultHashRef = $statementHandle-&gt;fetchall_arrayref({});
&lt;/pre&gt;

und die Konvertierung nach JSON so
&lt;pre&gt;
my $jsonText = JSON-&gt;new-&gt;encode($resultHashRef);
&lt;/pre&gt;

so werden numerische Werte aus Spalten, die beispielsweise mit SMALLINT(5) angelegt wurden, mit Hochkommata umschlossen, obwohl dies nicht sein dürfte (JavaScript-Frameworks im Frontend erwarten Typsicherheit).&lt;br&gt;&lt;br&gt;

Die eigentliche Information, von welchem Typ eine Spalte ist, ist am Statement-Handle und am DBH jedoch vorhanden. Mit
&lt;pre&gt;
my $typesOfFields  = $statementHandle-&gt;{TYPE};
&lt;/pre&gt;
lassen sich die Datentypen aller in der letzten Abfrage gestellten Spalten holen.&lt;br&gt;&lt;br&gt;

Ein anschließendes Iterieren über die Typen und Ausgabe von deren type_info offenbart die internen Metainformationen über den Datentyp der jeweiligen Spalte (und weil mir JSON gut gefällt, lasse ich mir das auch gleich als JSON ausgeben):&lt;br&gt;

&lt;pre&gt;
foreach my $typeElement (@$typesOfFields) {
  my $typeInfo = $dbh-&gt;type_info($typeElement);
  my $jsonType = JSON-&gt;new-&gt;encode($typeInfo);
  print "jsonType = ".$jsonType."\n";
}
&lt;/pre&gt;

Die Ausgabe dieses Codes sieht dann für eine Tabelle mit einer einzigen Spalte, die als SMALLINT(5) angelegt wurde, so aus:&lt;br&gt;

&lt;pre&gt;
jsonType = {
 "UNSIGNED_ATTRIBUTE" : 0,
 "MAXIMUM_SCALE" : 0,
 "INTERVAL_PRECISION" : 0,
 "CREATE_PARAMS" : null,
 "NUM_PREC_RADIX" : 10,
 "SEARCHABLE" : 3,
 "LOCAL_TYPE_NAME" : "Short integer",
 "LITERAL_PREFIX" : null,
 "COLUMN_SIZE" : 5,
 "MYSQL_NATIVE_TYPE" : 2,
 "MINIMUM_SCALE" : 0,
 "TYPE_NAME" : "smallint",
 "AUTO_UNIQUE_VALUE" : 0,
 "NULLABLE" : 1,
 "SQL_DATATYPE" : 5,
 "DATA_TYPE" : 5,
 "LITERAL_SUFFIX" : null,
 "CASE_SENSITIVE" : 0,
 "FIXED_PREC_SCALE" : 0,
 "MYSQL_IS_NUM" : 1,
 "SQL_DATETIME_SUB" : 0
}
&lt;/pre&gt;

Für eine Tabelle mit einer Spalte, die mit VARCHAR(255) angelegt wurde, sieht sie so aus:&lt;br&gt;

&lt;pre&gt;
jsonType = {
 "UNSIGNED_ATTRIBUTE" : 0,
 "MAXIMUM_SCALE" : 0,
 "INTERVAL_PRECISION" : 0,
 "CREATE_PARAMS" : "max length",
 "NUM_PREC_RADIX" : null,
 "SEARCHABLE" : 3,
 "LOCAL_TYPE_NAME" : "variable length string",
 "LITERAL_PREFIX" : "'",
 "COLUMN_SIZE" : 255,
 "MYSQL_NATIVE_TYPE" : 253,
 "MINIMUM_SCALE" : 0,
 "TYPE_NAME" : "varchar",
 "AUTO_UNIQUE_VALUE" : 0,
 "NULLABLE" : 1,
 "SQL_DATATYPE" : 12,
 "DATA_TYPE" : 12,
 "LITERAL_SUFFIX" : "'",
 "CASE_SENSITIVE" : 0,
 "FIXED_PREC_SCALE" : 0,
 "MYSQL_IS_NUM" : 0,
 "SQL_DATETIME_SUB" : 0
}
&lt;/pre&gt;

Das Feld, anhand dessen man numerische von nicht-numerischen Spalten unterscheiden kann, ist MYSQL_IS_NUM. Ist sein Wert 0, ist es kein numerisches Feld, bei 1 schon. Jedoch verursacht speziell die Kombination von Anforderungen, MySQL plus Perl plus JSON, noch ein weiteres Problem: Weder MySQL noch Perl kennen atomare Bool-Werte. In MySQL behilft man sich im CREATE TABLE-Statment in den allermeisten Fällen mit enum('true','false'). Jedoch kennt auch Perl keinen eigens dafür gedachten Boolean-Typ, so dass bei der JSON-Konvertierung der Bool-Wert auch hier mit Hochkommata umschlossen wird.&lt;br&gt;&lt;br&gt;

Das JSON-Modul aus dem CPAN sieht für Boolsche Werte hier die eigenen Typen JSON::true oder JSON::false vor. Damit man diese in einer Perl-Datenstruktur jedoch setzen kann, muss man erst herausfinden, ob eine Spalte überhaupt ein enum-Typ war. enum unterscheidet sich vom VARCHAR weder beim MYSQL_IS_NUM noch beim LITERAL_SUFFIX, das aussagt, ob der Value bei der Ausgabe in Quotes gesetzt werden soll oder nicht. Glücklicherweise gibt es hier noch das Feld MYSQL_NATIVE_TYPE, das für den enum den Wert 254, für den VARCHAR jedoch den Wert 253 trägt (für SMALLINT(5) hat es den Wert 2).&lt;br&gt;&lt;br&gt;

Mit diesem Wissen lässt sich nun mit ein wenig Aufwand ein korrekter JSON-String bauen, der von JavaScript-Frameworks wie beispielsweise &lt;a href="http://extjs.com/products/extjs" target="_blank"&gt;ExtJS&lt;/a&gt; anstandslos geschluckt wird.&lt;br&gt;&lt;br&gt;

Geholfen haben mir:&lt;br&gt;
&lt;a target="_blank" href="http://www.mathematik.uni-ulm.de/help/perl5/doc/DBD/mysql.html"&gt;http://www.mathematik.uni-ulm.de/help/perl5/doc/DBD/mysql.html&lt;/a&gt;&lt;br&gt;
&lt;a target="_blank" href="http://www.freeopenbook.com/mysqlcookbook/mysqlckbk-CHP-9-SECT-3.html"&gt;http://www.freeopenbook.com/mysqlcookbook/mysqlckbk-CHP-9-SECT-3.html&lt;/a&gt;&lt;br&gt;
&lt;a target="_blank" href="http://cpansearch.perl.org/src/CAPTTOFU/DBD-mysql-3.0007/dbdimp.c"&gt;http://cpansearch.perl.org/src/CAPTTOFU/DBD-mysql-3.0007/dbdimp.c&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35960478-6993353919020785029?l=m2w2tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://m2w2tech.blogspot.com/feeds/6993353919020785029/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35960478&amp;postID=6993353919020785029' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35960478/posts/default/6993353919020785029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35960478/posts/default/6993353919020785029'/><link rel='alternate' type='text/html' href='http://m2w2tech.blogspot.com/2009/07/mysql-to-perl-to-json.html' title='MySQL to Perl to JSON'/><author><name>m2w2</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.m2w2.de/images/blogspot/mw.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35960478.post-4782559386064032258</id><published>2009-02-06T11:03:00.007+01:00</published><updated>2010-02-04T13:00:33.917+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Erfahrungen'/><category scheme='http://www.blogger.com/atom/ns#' term='nicht benutzbar'/><category scheme='http://www.blogger.com/atom/ns#' term='Erfahrungsbericht'/><category scheme='http://www.blogger.com/atom/ns#' term='schlecht'/><category scheme='http://www.blogger.com/atom/ns#' term='kundenunfreundlich'/><title type='text'>Erfahrungen mit Strato Mail-Hosting</title><content type='html'>Das Unternehmen, in dem und für das ich arbeite, lässt E-Mail-Dienste bei Strato hosten. Jedem Mitarbeiter stehen 2 GB an Speicherplatz zur Verfügung. Nicht mehr ganz zeitgemäß, aber momentan noch ausreichend. Nun ist es aber so, dass einem Teil der Mitarbeiter täglich schätzungsweise durchschnittlich 100 Mails zugestellt werden. Gelegentlich sind es jedoch auch mehrere Tausend (fragen Sie nicht warum, denn ja: es IST wirklich erforderlich ;-)). Dann jedoch verhalten sich die Strato-Mailserver sehr sehr sonderbar.
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Bei manchen Leuten, die mit IMAP arbeiten, reagiert der Server beim Versuch, in einen anderen Ordner zu wechseln, gar nicht oder sehr langsam.
&lt;/li&gt;
&lt;li&gt;Beim Versuch, einen Ordner mit dem IMAP-Kommando EXPUNGE von bereits gelöschten Mails endgültig zu befreien, kommt keine Antwort vom Server.
&lt;/li&gt;
&lt;li&gt;Beim Versuch, mich in den Webmail-Dienst von Strato einzuloggen, bekomme ich trotz garantiert korrektem Passwort nun die Meldung "Benuterdaten ungültig!". Kommentar von einem Kollegen: Das kommt alle paar Monate mal vor.
&lt;/li&gt;
&lt;li&gt;Beim Versuch, mit dem Mail-Client Thunderbird nach Mails auf dem Server zu suchen, bekomme ich die Meldung "Command Systax Error". Bei meinem privaten Mail-Account (anderer Provider) geht das problemlos mit demselben Mail-Client.
&lt;/li&gt;
&lt;li&gt;Downloads von größeren Attachments auf den lokalen Rechner starten meist erst nach mehreren Minuten.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Und am allerübelsten: Das Passwort zum Abrufen und Versenden von Mails kann nicht über das Webinterface http://communicator.strato.de/ geändert werden. Sicherlich kommt es bei tausenden von Kunden häufiger vor, dass jemand sein Passwort vergessen, verlegt oder gar jemandem -willentlich oder nicht- verraten hat und das Passwort deshalb ändern oder zurücksetzen will. Strato unterstützt das nicht aktiv. Schade.&lt;/li&gt;
&lt;/ul&gt;
Privat habe ich bei einem anderen Anbieter einen Mail-Account, der momentan über 8000 Mails enthält und den ich ebenfalls über IMAP over SSL nutze, ohne auch nur eines der oben genannten Probleme, und egal mit welchem Mail-Client. Ich werde bei längerer Weigerung der Strato-Server, mich meine Geschäfte ordentlich abwickeln zu lassen (und einen Auto-Responder einrichten gehört für mich dazu) den Verantwortlichen in unserem Unternehmen empfehlen, den Mail-Dienst zu wechseln.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35960478-4782559386064032258?l=m2w2tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://m2w2tech.blogspot.com/feeds/4782559386064032258/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35960478&amp;postID=4782559386064032258' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35960478/posts/default/4782559386064032258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35960478/posts/default/4782559386064032258'/><link rel='alternate' type='text/html' href='http://m2w2tech.blogspot.com/2009/02/erfahrungen-mit-strato-mail-hosting.html' title='Erfahrungen mit Strato Mail-Hosting'/><author><name>m2w2</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.m2w2.de/images/blogspot/mw.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35960478.post-7436097699484044521</id><published>2008-09-18T07:06:00.004+02:00</published><updated>2008-09-18T07:35:25.466+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Browserstatistik'/><category scheme='http://www.blogger.com/atom/ns#' term='Marktanteile'/><title type='text'>WebKit hui</title><content type='html'>Das Unternehmen Net Applications veröffentlicht, wie einige anderen auch, Browser- und Betriebssystemstatistiken. Diese beruhen darauf, mit welcher Kennung sich ein Browser beim Server einer besuchten Website zu erkennen gibt. Aus dieser Kennung lässt sich fast immer das Betriebssystem und der Browsertyp herauslesen.&lt;br/&gt;&lt;br/&gt;

Verfolgt man die bei Net Applications verfügbare &lt;a href="http://marketshare.hitslink.com/report.aspx?qprid=9&amp;qpdt=1&amp;qpct=4&amp;qptimeframe=M&amp;qpsp=92&amp;qpnp=25" target="_blank"&gt;Statistik&lt;/a&gt; über verwendete Betriebssysteme vom September 2006 bis August 2008, sieht man, dass der Marktanteil von Microsoft Windows in diesem Zeitram von 94,8% auf 90,66% gesunken ist. Das sind also 4,14&amp;nbsp;Prozentpunkte in 23&amp;nbsp;Monaten, das macht 0,18&amp;nbsp;Prozentpunkte pro Monat. Im selben Zeitraum ist der Anteil der Benutzer, die mit Apples Betriebssystem Mac OS X arbeiten, von 4,72% auf 7,86%, also um 3,14 Prozentpunkte (oder anders ausgedrückt um 66,53% oder um 0,14&amp;nbsp;Prozentpunkte im Monat) gestiegen. Würde man diese Wachstumskurven ganz naiv monoton weiterzeichenen, wäre Microsoft in 503,7&amp;nbsp;Monaten, also knapp 42(!)&amp;nbsp;Jahren, weg vom Fenster und Apple hätte im selben Zeitraum 68,76% des Marktes erobert.&lt;br/&gt;&lt;br/&gt; 

Ganz so einfach ist es zum Glück nicht. Die mathematischen Ableitungen der Kurven aus der Statistik sind kaum ermittelbar und wären auch kein verlässlicher Indikator für die zu erwartenden Änderungen. Hier spielt viel Marketing mit rein, Sympathien der Anwender können sich von heute auf morgen ändern. Der Trend wird jedoch klar: Apples Betriebssystem kommt, Microsoft verliert Anteile. Gleichzeitig hat inzwischen Google seinen Browser Chrome veröffentlicht, der mit "WebKit" auf der selben technischen Basis wie Apples Browser Safari steht. Auch das iPhone und dessen Verwandter, der iPod touch, nutzen für ihren integrierten Safari-Browser die WebKit-Basis. WebKit wird wegen seiner hohen Geschwindigkeit geschätzt, und die Browser, die WebKit als Basis verwenden, glänzen, viel mehr als Microsofts Internet Explorer in der aktuellen Version 7, mit Konformität zu festgelegten Standards.&lt;br/&gt;&lt;br/&gt;

Entwickler von Web-Anwendungen tun also gut daran, künftig noch mehr damit zu rechnen, dass ihre Kunden WebKit-basierte Browser wie Safari und Chrome verwenden. Und erst recht ist angesagt, bei der Entwicklung von Web-Anwendungen Frameworks zu verwenden, die von der Komplexität bei der Entwicklung für unterschiedliche Browser abstrahieren und eine API oberhalb dieser Ebene anbieten.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35960478-7436097699484044521?l=m2w2tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://m2w2tech.blogspot.com/feeds/7436097699484044521/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35960478&amp;postID=7436097699484044521' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35960478/posts/default/7436097699484044521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35960478/posts/default/7436097699484044521'/><link rel='alternate' type='text/html' href='http://m2w2tech.blogspot.com/2008/09/webkit-hui.html' title='WebKit hui'/><author><name>m2w2</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.m2w2.de/images/blogspot/mw.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35960478.post-2489467416625367192</id><published>2008-09-10T20:30:00.013+02:00</published><updated>2008-09-10T22:08:17.015+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Decoding'/><category scheme='http://www.blogger.com/atom/ns#' term='ISO-Latin-1'/><category scheme='http://www.blogger.com/atom/ns#' term='Codierung'/><category scheme='http://www.blogger.com/atom/ns#' term='Encoding'/><category scheme='http://www.blogger.com/atom/ns#' term='ISO-8859-1'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='mySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Decodierung'/><category scheme='http://www.blogger.com/atom/ns#' term='UTF-8'/><category scheme='http://www.blogger.com/atom/ns#' term='Kodierung'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='ExtJS'/><category scheme='http://www.blogger.com/atom/ns#' term='Unicode'/><category scheme='http://www.blogger.com/atom/ns#' term='Dekodierung'/><category scheme='http://www.blogger.com/atom/ns#' term='ISO-8859-15'/><title type='text'>ExtJS, ISO-8859-1 und UTF-8 verheiratet</title><content type='html'>Aktuelle Web-Anwendungen nutzen als Encoding-Schema ihrer angezeigten Seiten als auch ihrer in Datenbanken gespeicherten Daten in den allermeisten Fällen UTF-8. Die Vor- und Nachteile sind anderenorts ausreichend &lt;a target="_blank" href="http://en.wikipedia.org/wiki/UTF-8#Advantages_and_disadvantages"&gt;dokumentiert&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;

Jedoch gibt es auch Anwendungen, die bereits vor der "UTF-8-Zeit" entstanden sind. Solche Anwendungen nutzen beispielsweise ISO 8859-1 oder andere Encoding-Schemata und lassen sich aufgrund des Aufwands nicht ohne weiteres umstellen. Sie arbeiten nicht "besser" oder "schlechter" als die, die UTF-8 nutzen. Interessant wird es jedoch, wenn solche Systeme plötzlich mit Daten zurecht kommen müssen, die in anderen Kodierungen vorliegen.&lt;br/&gt;&lt;br/&gt;

Situationen, in denen ein System plötzlich mit anderen Encodings umgehen können muss, sind beispielsweise die Anbindung an ein Fremdsystem, das nicht das eigene Encoding unterstützt oder auch die Nutzung eines Frameworks, das ein bestimmtes Encoding erzwingt. &lt;br/&gt;&lt;br/&gt;

Ajax-Bibliotheken, die auch Mittel zur Komposition der Web-Oberfläche anbieten, sind solche Frameworks. Vor dem Absenden von Formulardaten per XMLHttpRequest nutzt beispielsweise das Ajax-Framework ExtJS (aktuell: Version 2.2) die JavaScript-Funktion &lt;a target="_blank" href="http://de.selfhtml.org/javascript/objekte/unabhaengig.htm#encode_uri_component"&gt;encodeURIComponent&lt;/a&gt;. Die Daten, die im dann abgesendeten Request am Server ankommen sind dann erstens URI-kodiert und zweitens UTF-8-kodiert. Dies tut ExtJS völlig unabhängig vom Encoding der Seite, von der aus der XMLHttpRequest abgesendet wurde, also auch dann, wenn das Encoding der Seite zufällig schon ISO-8859-1 lautet. Auch der Versuch, durch das künstliche Setzen von Request-Parametern das jeweilige Framework dazu zu bewegen, die URI-kodierten Daten mit ISO-8859-1-Kodierung auf die Leitung zu pusten, schlagen dann fehl. Im Fall von ExtJS wird in dessen Entwicklerforum immer wieder empfohlen, mittels &lt;br/&gt;

&lt;pre&gt;
Ajax.defaultHeaders = {
    "Content-Type": "text/javascript; charset=ISO-8859-1"
}
&lt;/pre&gt;

zu erzwingen, dass die Formulardaten ISO-8859-1-kodiert versendet werden. Dies ist so jedoch nicht möglich. Es ist irrelevant, welches Encoding der Browser vorgibt(!), wenn die im Request enthaltenen Daten dann doch nicht so kodiert sind wie angegeben. Vielmehr ist es nötig, serverseitig richtig mit den Daten umzugehen.&lt;br/&gt;&lt;br/&gt;

Dazu macht man zunächst serverseitig eine URI-Dekodierung, anschließend eine UTF-8-Dekodierung. Sollen die Daten dann in Systemen verarbeitet werden, die eine ISO-8859-1-Kodierung nutzen, werden die Daten also auch noch ISO-8859-1-kodiert.&lt;br/&gt;&lt;br/&gt;

Symptome, an denen sich fehlende oder falsche Kodierungen erkennen lassen:&lt;br&gt;&lt;br/&gt;
&lt;ul&gt;
&lt;li&gt; Wurde die URI-Dekodierung vergessen, sieht man die Zeichenkette "%20" statt eines Leerzeichens und statt eines "@" sieht man beispielsweise "%40".&lt;/li&gt;
&lt;li&gt; Wurden Daten URI-dekodiert aber nicht UTF-8-dekodiert, macht sich das bei späterer Anzeige auf einer Website durch die zwei(!) Zeichen "Ã¤" statt einem ä bemerkbar.&lt;/li&gt;
&lt;li&gt; Hat man sowohl die URI-Dekodierung als auch die UTF-8-Dekodierung vorgenommen, aber die ISO-8859-1-Kodierung vergessen, erscheint an der Weboberfläche statt eines "ä" dann eine nicht eindeutig bestimmbares Zeichen statt eines "ä".&lt;/li&gt;
&lt;li&gt; Wurde weder die UTF-8- noch die URI-Dekodierung vorgenommen und werden diese Daten dann ISO-8859-1-kodiert zur Anzeige gebracht, erscheint "ÃƒÂ¤" statt eines "ä". Noch übler wird es, wenn diese Daten von der Web-Oberfläche wiederum innerhalb eines Formulars abgesendet und serverseitig wiederum falsch verarbeitet werden. Die vier Sonderzeichen "ÃƒÂ¤" würden wiederum falsch verarbeitet und später im Fall einer erneuten Anzeige am UI dann mit acht(!) Sonderzeichen angezeigt...&lt;/li&gt;
&lt;/ul&gt;&lt;br/&gt;

Übertragen auf das gute alte &lt;a target="_blank" href="http://en.wikipedia.org/wiki/IPO_Model"&gt;EVA-Prinzip&lt;/a&gt; von Eingabe, Verarbeitung und Ausgabe heißt das: Kann man also nicht die Encoding-Einstellungen der miteinander kommunizierenden Systeme ändern, gilt: Alles, was rein kommt, wird dekodiert, dann verarbeitet und bei der Ausgabe wieder so kodiert, dass das empfangende System damit umgehen kann.&lt;br/&gt;&lt;br/&gt;

Systemweit UTF-8 zu verwenden ist also ein guter und häufiger Rat. Ein schönes Plädoyer für UTF-8 ist &lt;a target="_blank" href="http://www.6b.com/journal/plaedoyer-fuer-utf-8/"&gt;hier&lt;/a&gt; zu finden.&lt;br/&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35960478-2489467416625367192?l=m2w2tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.6b.com/journal/plaedoyer-fuer-utf-8/' title='ExtJS, ISO-8859-1 und UTF-8 verheiratet'/><link rel='replies' type='application/atom+xml' href='http://m2w2tech.blogspot.com/feeds/2489467416625367192/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35960478&amp;postID=2489467416625367192' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35960478/posts/default/2489467416625367192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35960478/posts/default/2489467416625367192'/><link rel='alternate' type='text/html' href='http://m2w2tech.blogspot.com/2008/09/extjs-iso-8859-1-und-utf-8-verheiratet.html' title='ExtJS, ISO-8859-1 und UTF-8 verheiratet'/><author><name>m2w2</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.m2w2.de/images/blogspot/mw.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35960478.post-1200987622132290718</id><published>2008-09-02T15:28:00.016+02:00</published><updated>2008-09-27T07:35:55.042+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Asynchronous JavaScript and XML'/><category scheme='http://www.blogger.com/atom/ns#' term='XMLHttpRequest'/><category scheme='http://www.blogger.com/atom/ns#' term='HTTP'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='synchron'/><category scheme='http://www.blogger.com/atom/ns#' term='asyncron'/><category scheme='http://www.blogger.com/atom/ns#' term='synchrone'/><category scheme='http://www.blogger.com/atom/ns#' term='nightly build'/><category scheme='http://www.blogger.com/atom/ns#' term='synchronous'/><category scheme='http://www.blogger.com/atom/ns#' term='syncron'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Firefox 3.0.x kann keine synchronen Ajax-Calls</title><content type='html'>Zumindest nicht immer (siehe &lt;a href="#firefoxNoAsyncUpdate"&gt;Update&lt;/a&gt; weiter unten): Wie ich gerade schmerzlich feststellen musste, beherrscht Firefox 3.0.1 keine synchronen Ajax-Requests. Das Problem ist bei Mozilla bekannt. Die entsprechenden Bugs sind in der Bugzilla-Datenbank von Firefox gepflegt: 
&lt;br/&gt;

&lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=444457" target="_blank"&gt;Erster Bug&lt;/a&gt;&lt;br/&gt;
&lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=333198" target="_blank"&gt;Zweiter Bug&lt;/a&gt;&lt;br/&gt;
&lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=445714" target="_blank"&gt;Dritter Bug&lt;/a&gt;&lt;br/&gt;
&lt;br/&gt;

Mit Firefox Version 3.1b1 (zum jetzigen Zeitpunkt &lt;a  target="_blank" href="http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/"&gt;hier&lt;/a&gt; erhältlich) ist das Problem laut meinen Tests behoben.
&lt;br/&gt;
&lt;br/&gt;

(Es gibt jetzt sicher Stimmen, die sagen, dass man Ajax-Requests ohnehin nicht synchron machen sollte und die behaupten, dass es synchrone Aufrufe niemals wirklich erforderlich sind. Ich brauche es definitiv und ich behaupte im Gegenzug, dass diejenigen, die das sagen, einfach noch nicht in der Situation waren, dass synchronen Aufrufe wirklich nötig waren. Warum wohl ist es überhaupt in der XMLHttpRequest-API vorgesehen, dass man den Aufruf synchron machen kann?)&lt;br/&gt;&lt;br/&gt;

&lt;a name="firefoxNoAsyncUpdate"&gt;&lt;b&gt;Update&lt;/b&gt;&lt;/a&gt;: Mit einem Workaround ist es mir gelungen, das Problem für alle wichtigen Browser zu umgehen. Vorher sah der Code so aus:&lt;br/&gt;&lt;br/&gt;

function determineXyz() {&lt;br/&gt; 
&amp;nbsp; var xhr = getXmlHttpRequest(); &lt;br/&gt;
&amp;nbsp; var postParams = "isXyz=1"; &lt;br/&gt;
&amp;nbsp; xhr.open("POST", "../someBackend.do", false); &lt;br/&gt;
&amp;nbsp; xhr.onreadystatechange = function() { &lt;br/&gt;
&amp;nbsp; &amp;nbsp; if (xhr.readyState == 4) { &lt;br/&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; if (xhr.status == 200 || xhr.status == 304) { &lt;br/&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; alert(xhr.responseText); &lt;br/&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;br/&gt;
&amp;nbsp; &amp;nbsp; } &lt;br/&gt;
&amp;nbsp; } &lt;br/&gt;
&amp;nbsp; xhr.send(postParams); &lt;br/&gt;
}&lt;br/&gt;&lt;br/&gt;

Hier wird der onreadystatechange-Handler in Firefox nicht aufgerufen. Seltsamerweise wird er in Firefox 2 &lt;i&gt;dann&lt;/i&gt; aufgerufen, wenn Firebug installiert und aktiviert ist. In Firefox 3 wird er auch dann nicht aufgerufen. Ausnahmsweise arbeiten hier sowohl IE6 als auch IE7 fehlerfrei.&lt;br/&gt;&lt;br/&gt;

Wenn man sich nun nach der inzwischen allzu gewohnten Denke, dass Requests doch so schön asynchron sind jedoch endlich mal wieder klar macht, dass das Senden eines synchronen Requests wie im obigen Code das Ablaufen des Scripts nach dem Aufruf von xhr.send(postParams) blockiert und dass somit nach dieser Zeile das xhr.responseText bereits gefüllt sein muss, ist die &lt;b&gt;Abhilfe&lt;/b&gt; klar:&lt;br/&gt;&lt;br/&gt;

function determineXyz() { &lt;br/&gt;
&amp;nbsp; &amp;nbsp;var xhr = getXmlHttpRequest(); &lt;br/&gt;
&amp;nbsp; &amp;nbsp;var postParams = "isXyz=1"; &lt;br/&gt;
&amp;nbsp; &amp;nbsp;xhr.open("POST", "../someBackend.do", false); &lt;br/&gt;
&amp;nbsp; &amp;nbsp;xhr.send(postParams); &lt;br/&gt;
&amp;nbsp; &amp;nbsp;// Obige Zeile blockiert solange, bis die Response vom Server &lt;br/&gt;
&amp;nbsp; &amp;nbsp;// vorliegt. Anschließend kann auf xhr.responseText zugegriffen&lt;br/&gt;
&amp;nbsp; &amp;nbsp;// werden:&lt;br/&gt;
&amp;nbsp;  alert(xhr.responseText); &lt;br/&gt;
} &lt;br/&gt;&lt;br/&gt;

Es ist also wichtig, zu wissen, dass ein alleiniges Ändern des dritten Übergabeparameters (isAsynchronous) an die Methode open des XMLHttpRequest-Objekts von true nach false ein Script nicht über alle Browser hinweg verlässlich synchron statt asynchron arbeiten lässt.&lt;br/&gt;&lt;br/&gt;

Ich habe diese Möglichkeit im &lt;a target="_blank" href="http://support.mozilla.com/tiki-view_forum_thread.php?locale=nl&amp;comments_parentId=124952&amp;forumId=1"&gt;Mozilla Support Forum&lt;/a&gt; gepostet und werde dort das Feedback der anderen hier kommentieren, wenn es noch andere Lösungen gibt. &lt;br/&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35960478-1200987622132290718?l=m2w2tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://m2w2tech.blogspot.com/feeds/1200987622132290718/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35960478&amp;postID=1200987622132290718' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35960478/posts/default/1200987622132290718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35960478/posts/default/1200987622132290718'/><link rel='alternate' type='text/html' href='http://m2w2tech.blogspot.com/2008/09/firefox-301-kann-keine-synchronen-ajax.html' title='Firefox 3.0.x kann keine synchronen Ajax-Calls'/><author><name>m2w2</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.m2w2.de/images/blogspot/mw.jpg'/></author><thr:total>0</thr:total></entry></feed>
