<?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>meier-online &#187; AppEngine</title>
	<atom:link href="http://meier-online.com/tag/appengine/feed/" rel="self" type="application/rss+xml" />
	<link>http://meier-online.com</link>
	<description>Der Blog von Karsten Meier</description>
	<lastBuildDate>Sun, 09 Oct 2011 13:27:57 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Google Technology User Group Hamburg</title>
		<link>http://meier-online.com/2009/06/gtug-hamburg-appengine-mapplet/</link>
		<comments>http://meier-online.com/2009/06/gtug-hamburg-appengine-mapplet/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 15:15:54 +0000</pubDate>
		<dc:creator>meier</dc:creator>
				<category><![CDATA[IT-Szene]]></category>
		<category><![CDATA[AppEngine]]></category>
		<category><![CDATA[Gadgets]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Mapplet]]></category>

		<guid isPermaLink="false">http://meier-online.com/?p=504</guid>
		<description><![CDATA[Erstes Treffen mit den Themen AppEngine, Mapplets und Gadgets. [29dsnh4p5a] Am 23. Juni fand das erste Treffen der Google User Group Hamburg statt. Sie beschäftigt sich mit der Vielzahl der Technologien jenseits einer einfachen Suche, die Google inzwischen zur Nutzung auch für eigene Projekte anbietet. Die Firma &#8220;eprofessional&#8221; stellte an diesem Abend den Raum und [...]]]></description>
			<content:encoded><![CDATA[<h4>Erstes Treffen mit den Themen AppEngine, Mapplets und Gadgets.</h4>
<p>[29dsnh4p5a] Am 23. Juni fand das <a href="http://www.hamburg-gtug.org/2009/05/24-juni-app-engine-gadgets-und-maplets.html">erste Treffen</a> der Google User Group Hamburg statt. Sie beschäftigt sich mit der Vielzahl der Technologien jenseits einer einfachen Suche, die Google inzwischen zur Nutzung auch für eigene Projekte anbietet.<br />
Die Firma <a href="http://www.eprofessional.de">&#8220;eprofessional&#8221;</a> stellte an diesem Abend den Raum und netterweise auch die Getränke. <span id="more-504"></span></p>
<p>Im ersten Teil des Abends stellte Jens Trapp die AppEngine und speziell die Nutzung mit Java vor.<br />
Die AppEngine nutzt nicht eine &#8220;normale&#8221; relationale Datenbank, sondern die speziellen Datastores von Google zur manchmal über die ganze Erde verteilten Speicherung großer Datenmengen. Um die Anpassung bestehender Software zu vereinfachen, ist für einfache Fälle auch eine Abfrage in SQL-Syntax möglich. Einen ähnlicher Weg ist mir auch von der nativen Symbianentwiclung bekannt. Mich persönlich überzeugt das nicht richtig. SQL ist eine interpretierte Sprache. Wird sie von einer statisch typisierten, compilierten Sprache wie Java oder C++ aufgerufen, verbindet man die Nachteile beider Konzepte, ohne die Vorzüge zu genießen. Man verliert die Typsicherheit, riskiert sogar noch Sicherheitslücken (SQL-Injektion), kann andererseits nicht die wunderbaren Eigenschaften einer kompletten SQL-Implementierung nutzen.</p>
<p>Im zweiten Teil stellte Thomas Steiner &#8220;<a href="http://code.google.com/apis/maps/documentation/mapplets/">Mapplets</a>&#8221; und ihre technologischen Verwandten &#8220;Gadgets&#8221; vor. Gadgets können per Javascript auch Webservices aufrufen, dabei werden auch die Sicherheitsrichtlinien der Browser beachtet. Die Gadgets können neben der iGoogle-Webseite auch in anderen Kontexten aufgerufen werden und sogar als Suchmaschinenanzeigen geschaltet werden. Als nettes Beispiel wurde eine Anzeige präsentiert, die bei Sonnenschein oder bei Regen jeweils verschiedene Angebote darstellt.</p>
<p>Zum offiziellen Blog der <a href="http://www.hamburg-gtug.org">Google Technology User Group Hamburg</a></p>
]]></content:encoded>
			<wfw:commentRss>http://meier-online.com/2009/06/gtug-hamburg-appengine-mapplet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jad Check auf Googles Servern</title>
		<link>http://meier-online.com/2009/03/jad-check/</link>
		<comments>http://meier-online.com/2009/03/jad-check/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 19:00:00 +0000</pubDate>
		<dc:creator>meier</dc:creator>
				<category><![CDATA[Mobile]]></category>
		<category><![CDATA[AppEngine]]></category>
		<category><![CDATA[Jad]]></category>
		<category><![CDATA[JME]]></category>
		<category><![CDATA[Midlet]]></category>
		<category><![CDATA[OTA]]></category>
		<category><![CDATA[Qualitätswerkzeug]]></category>

		<guid isPermaLink="false">http://meier-online.com/blog/?p=5</guid>
		<description><![CDATA[Der Jad-Check ist ein Qualitätsicherungswerkzeug für Anbieter von Java-Handysoftware. (J2ME- bzw. JME-Midlets) Er prüft die sogenannte Jad-Datei auf häufig auftretende Fehler. Einige dieser Fehler sind sonst sehr schwer zu finden, sodass man Zeit bei der Fehlersuche spart. Andere Fehler führen nur auf wenigen Handys bei der Installation von Midlets zu Problemen. Nach Murphy Law sind [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://jadcheck.appspot.com"><img class="alignright size-full wp-image-340" title="Der Jad Check Online Dienst" src="http://meier-online.com/blog/uploads/jadchecklogo120x48.png" alt="jadchecklogo120x48" width="120" height="48" /></a>Der Jad-Check ist ein Qualitätsicherungswerkzeug für Anbieter von Java-Handysoftware. (J2ME- bzw. JME-Midlets)<!--88462815--><br />
Er prüft die sogenannte Jad-Datei auf häufig auftretende Fehler. Einige dieser Fehler sind sonst sehr schwer zu finden, sodass man Zeit bei der Fehlersuche spart. Andere Fehler führen nur auf wenigen Handys bei der Installation von Midlets zu Problemen. Nach Murphy Law sind dies typischerweise die von wichtigen Kunden. Als Anbieter kann man sich durch den Test also Ärger sparen und die Kundenzufriedenheit steigern.<span id="more-5"></span></p>
<p>Die Notwendigkeit für so einen Test habe ich schon vor drei Jahren erkannt. Mein damaliger Webhoster hat nach einem Serverupdate vergessen den Mimetyp zu konfigurieren :-( . Solche Fehler wollte ich in Zukunft schnell finden. So habe ich zunächst ein Kommandozeilenwerkzeug geschrieben. Da war ich der Zeit wohl voraus, selbst Online-Shops für Handysoftware haben sich unnötige Fehler in der JAD-Erzeugung geleistet. Schließlich kam ich auf die Idee, eine Onlineversion zu veröffentlichen und so auch Werbung für meine Kompetenz zu machen.</p>
<p>Der Jad Checker ist zugleich mein Projekt, um Googles App Engine einen Praxistest zu unterziehen. Seit August 2008 ist der Dienst online und wurde in den Entwicklerprogrammen von Nokia, SonyEricsson, Sun und Vodafone vorgestellt. Ein Mitarbeiter des Nokia-Entwicklerprogramms gab als Kommentar &#8220;Cool&#8221;. Wahrscheinlich hat er schon mit vielen dieser JAD-Problemen zu tun gehabt.</p>
<p>Bisher bin ich mit der AppEngine zufrieden. Die Entwicklung ging zügig, die Anwendung läuft rund, und es gab noch keine negativen Rückmeldungen. Den Onlinedienst finden Sie hier: <a title="jad check zur Prüfung von Jad-Dateien" href="http://jadcheck.appspot.com/">jadcheck.appspot.com </a></p>
]]></content:encoded>
			<wfw:commentRss>http://meier-online.com/2009/03/jad-check/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fremde Daten mit der AppEngine verarbeiten</title>
		<link>http://meier-online.com/2008/08/fremde-daten-mit-der-appengine-verarbeiten/</link>
		<comments>http://meier-online.com/2008/08/fremde-daten-mit-der-appengine-verarbeiten/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 15:36:00 +0000</pubDate>
		<dc:creator>meier</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[AppEngine]]></category>
		<category><![CDATA[fetch]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[SSL]]></category>

		<guid isPermaLink="false">http://meier-online.com/blog/?p=164</guid>
		<description><![CDATA[Die AppEngine erlaubt es auch, Webseiten oder andere Daten von fremden Servern abzurufen und zu verarbeiten. Das muss verständlicherweise beschränkt werden, da das Missbrauchspotential sehr hoch ist. Es können deshalb nicht beliebige Internetdienste aufgerufen werden, sondern nur &#8220;Webseiten&#8221; bzw. alles, was ein Webserver auf Port 80 oder 443 anbietet.Dazu dient das Modul urlfetch. Der einfachste [...]]]></description>
			<content:encoded><![CDATA[<p>Die AppEngine erlaubt es auch, Webseiten oder andere Daten von fremden Servern abzurufen und zu verarbeiten.<br />
Das muss verständlicherweise beschränkt werden, da das Missbrauchspotential sehr hoch ist. Es können deshalb nicht beliebige Internetdienste aufgerufen werden, sondern nur &#8220;Webseiten&#8221; bzw. alles, was ein Webserver auf Port 80 oder 443 anbietet.<span id="more-164"></span>Dazu dient das Modul urlfetch. Der einfachste Aufruf ist:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> google.<span style="color: black;">appengine</span>.<span style="color: black;">api</span> <span style="color: #ff7700;font-weight:bold;">import</span> urlfetch
...
<span style="color: black;">response</span> = urlfetch.<span style="color: black;">fetch</span><span style="color: black;">&#40;</span>url<span style="color: black;">&#41;</span>
content = response.<span style="color: black;">content</span></pre></div></div>

<p>Wenn alles gut geht, reicht das schon. So weit ist es sehr praktisch. In der Praxis muss man jede Menge Fehler abfangen, zum Beispiel wie in diesem Ausschnitt:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">    <span style="color: #ff7700;font-weight:bold;">try</span>:
        response = urlfetch.<span style="color: black;">fetch</span><span style="color: black;">&#40;</span>jadurl<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> response.<span style="color: black;">status_code</span> == <span style="color: #ff4500;">200</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">xxheaders</span> = response.<span style="color: black;">headers</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">xxcontent</span> = response.<span style="color: black;">content</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">xxFetched</span> = <span style="color: #008000;">True</span>
        <span style="color: #ff7700;font-weight:bold;">elif</span> response.<span style="color: black;">status_code</span> == <span style="color: #ff4500;">404</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">errortext</span> = <span style="color: #483d8b;">&quot;File not found&quot;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">xxcontent</span> = <span style="color: #483d8b;">&quot;not found&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">errortext</span> = <span style="color: #483d8b;">&quot;Bad Response Code&quot;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">xxcontent</span> = response.<span style="color: black;">status_code</span>
    <span style="color: #ff7700;font-weight:bold;">except</span> InvalidURLError:
        <span style="color: #008000;">self</span>.<span style="color: black;">errortext</span> = <span style="color: #483d8b;">&quot;Invalid URL&quot;</span>
    <span style="color: #ff7700;font-weight:bold;">except</span> DownloadError:
        <span style="color: #008000;">self</span>.<span style="color: black;">errortext</span> = <span style="color: #483d8b;">&quot;Error downloading file&quot;</span>
    <span style="color: #ff7700;font-weight:bold;">except</span> ResponseTooLargeError:
        <span style="color: #008000;">self</span>.<span style="color: black;">errortext</span> = <span style="color: #483d8b;">&quot;File to large&quot;</span></pre></div></div>

<p>Man hat auch Zugriff auf die HTTP-Header, beispielweise erhält man den Mime-Type mit</p>
<p><span style="font-family:courier new;">response.headers</span>[<span style="font-family:courier new;">'content-type']<br />
</span></p>
<p>In meinen speziellen Fall würde mich auch interessieren, ob ein Header doppelt geschickt wird. Diese Information scheint man leider nicht zu bekommen.</p>
<p>Man kann auch SSL-geschützte Seiten mittels &#8220;https://&#8221; runterladen. Leider werden dabei derzeit (1.1.) laut Dokumentation die Zertifikate nicht geprüft, sprich die stärkere Sicherheit ist nicht da. Das schränkt die Anwendung zurzeit noch ein.</p>
]]></content:encoded>
			<wfw:commentRss>http://meier-online.com/2008/08/fremde-daten-mit-der-appengine-verarbeiten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dateiupload mit der AppEngine</title>
		<link>http://meier-online.com/2008/07/dateiupload-mit-der-appengine/</link>
		<comments>http://meier-online.com/2008/07/dateiupload-mit-der-appengine/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 15:26:00 +0000</pubDate>
		<dc:creator>meier</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[AppEngine]]></category>
		<category><![CDATA[Dateiupload]]></category>
		<category><![CDATA[file upload]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://meier-online.com/blog/?p=166</guid>
		<description><![CDATA[In CGI-Programmen muss man, wenn man einen Dateiupload anbieten möchte, oft mit temporären Dateien jonglieren. Nun hat man in dieser verteilten Umgebung gar kein Schreibzugriff auf ein Dateisystem im klassischen Sinne. Zunächst habe ich eine Weile in der Dokumentation gesucht, um zu finden, wie es mit der AppEngine geht. Erst in einem Beispiel zur Bildbearbeitung [...]]]></description>
			<content:encoded><![CDATA[<p>In CGI-Programmen muss man, wenn man einen Dateiupload anbieten möchte, oft mit temporären Dateien jonglieren. Nun hat man in dieser verteilten Umgebung gar kein Schreibzugriff auf ein Dateisystem im klassischen Sinne. Zunächst habe ich eine Weile in der Dokumentation gesucht, um zu finden, wie es mit der AppEngine geht. Erst in einem Beispiel zur Bildbearbeitung bin ich dann fündig geworden.<span id="more-166"></span><br />
Es ist schlicht zu einfach. Hat man ein HTML-Eingabefeld zum Upload mit Namen &#8220;uploadfile&#8221;, dann greift man auf die hochgeladenen Daten einfach so zu:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">filecontent = <span style="color: #008000;">self</span>.<span style="color: black;">request</span>.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'uploadfile'</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Der Dateiinhalt befindet sich danach in der Variable &#8220;filecontent&#8221;. Wenn es eine Textdatei ist, kann ich den Inhalt einfach wie einen String verarbeiten.<br />
Für viele Anwendungsfälle ist das sehr bequem und ist völlig ausreichend. Interessant wäre noch zu wissen:</p>
<ul>
<li>Wie kommt man an den ursprünglichen Dateinamen ran?</li>
<li>Kann man möglichst früh die Verarbeitung verweigern, wenn die Datei zu groß ist?</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://meier-online.com/2008/07/dateiupload-mit-der-appengine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>App Engine</title>
		<link>http://meier-online.com/2008/07/app-engine/</link>
		<comments>http://meier-online.com/2008/07/app-engine/#comments</comments>
		<pubDate>Fri, 04 Jul 2008 17:48:00 +0000</pubDate>
		<dc:creator>meier</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[AppEngine]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[webapp]]></category>

		<guid isPermaLink="false">http://meier-online.com/blog/?p=9</guid>
		<description><![CDATA[My first impressions and some notes about programming for Googles App Engine.]]></description>
			<content:encoded><![CDATA[<p>Google erlaubt, Webanwendungen auf ihren Servern laufen zu lassen. Ich habe mir das Angebot etwas näher angeschaut. Es folgen die ersten Notizen:<br />
Pflicht ist die Programmiersprache Python. Es gibt ein SDK, um seine Anwendungen zunächst auf den eigenen Rechner auszuprobieren sowie ein Tutorial.<br />
Ich habe mir das SDK in der Version 1.1 installiert und bin das Tutorial durchgegangen.<span id="more-9"></span></p>
<p>Das SDK kommt mit einem eigenen Webserver. Man startet den Servers mit<br />
<span style="font-family:courier new;">dev_appserver.py helloworld</span><br />
Im Verzeichnis muß eine Konfigurationsdatei im Yaml-Format liegen. In dieser Datei werden URLs den Python-Dateien oder auch Bildern, etc zugeordnet. Fehlt die Datei, oder enthält sie nicht die benötigten Informationen, wird eine Exception geworfen.</p>
<p>Einige Dateien werden werden automatisch in Starverzeichnis des Nutzers angelegt, man kann diese leicht mal übersehen:<br />
eine Konfigurationsdatei des SDK in userdir/.appcfg_nag sowie ein Datastore (praktisch die Datenbank) in userdir\temp\dev_appserver.datastore</p>
<p>Enthalten ist ein kleines Framework mit Namen &#8220;WebApp&#8221;.</p>
<p>Um den Python-Code vom HTML-Code zu trennen, gibt es eine Template-engine mit Django-kompatibler Syntax.<br />
Ich hatte ein Problem mit den Templates: der <em>XML-Header()</em> am Anfang führte dazu, dass diese nicht angezeigt wurden.</p>
<p>Die Template-Sprache selbst nutzt geschweifte Klammern. Das ist verhältnismäßig kompakt, leider kann dadurch das Template schnell zu invaliden HTML-Code ausarten, so dass man das Template selber kaum noch im Browser überprüfen kann.</p>
<p>Zum Speichern der Daten einer Webanwendung nutzt man weder die sonst allgegenwärtigen SQL-Datenbanken noch das Dateisystem. Statt dessen gibt es ein spezielles Storage. Positiv dabei: Man kann eine Klasse einfach von &#8220;<em>db.Model</em>&#8221; ableiten, und die Objekte lassen sich dann komplett in den Datastore schreiben und lesen. Um die einzelnen Instanzvariablen muss man sich keine Gedanken machen, und man muss auch keine Datenbanktabellen deklarieren. Eine SQL-ähnliche Abfragesprache gibt es auch, aber offenbar eher als &#8220;syntaktischer Zucker&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://meier-online.com/2008/07/app-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

