<?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>www.konri.com &#187; Google App Engine</title>
	<atom:link href="http://www.konri.com/tag/gae/feed" rel="self" type="application/rss+xml" />
	<link>http://www.konri.com</link>
	<description>KONRI.COM - Java, GWT, Spring, Billing dla SaaS...</description>
	<lastBuildDate>Mon, 19 Jul 2010 07:26:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Jak podtrzymać &#8220;żywą&#8221; instancję aplikacji na Google App Engine</title>
		<link>http://www.konri.com/2010/01/jak-podtrzymac-instancje-aplikacji-na-google-app-engine</link>
		<comments>http://www.konri.com/2010/01/jak-podtrzymac-instancje-aplikacji-na-google-app-engine#comments</comments>
		<pubDate>Tue, 12 Jan 2010 21:28:56 +0000</pubDate>
		<dc:creator>Konrad</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Polecane]]></category>

		<guid isPermaLink="false">http://www.konri.com/?p=411</guid>
		<description><![CDATA[W poprzednim poście pisałem iż czas życia instancji aplikacji w kontenerze GAE jest bardzo ograniczony ? aplikacja ładowana jest w momencie zapytania ? pozostaje w pamięci przez krótki czas ? o ile nie nadejdzie kolejne zapytanie.
Przy małym ruchu powoduje to w praktyce ładowanie aplikacji dla każdego zapytania &#8211; używając np. Springframework powoduje to kilkunasto sekundowe opóźnienie w obsłudze zapytania ? co jest niedopuszczalne.
Jak na razie jedynym rozwiązaniem, choć nie jestem w 100% przekonany, iż można założyć, że kolejne zapytanie zostanie obsłużone przez tą samą instancję, a po drugie zjada to ...]]></description>
		<wfw:commentRss>http://www.konri.com/2010/01/jak-podtrzymac-instancje-aplikacji-na-google-app-engine/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zanim zdecydujesz się na Google App Engine</title>
		<link>http://www.konri.com/2010/01/zanim-zdecydujesz-sie-na-google-app-engine</link>
		<comments>http://www.konri.com/2010/01/zanim-zdecydujesz-sie-na-google-app-engine#comments</comments>
		<pubDate>Tue, 12 Jan 2010 20:19:54 +0000</pubDate>
		<dc:creator>Konrad</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Polecane]]></category>

		<guid isPermaLink="false">http://www.konri.com/?p=402</guid>
		<description><![CDATA[Zanim zdecydujesz się na Google App Engine warto wiedzieć o pewnych przypadłościach i zastosowanych rozwiązaniach.

[-] Zapytania do Datastore mogą zwrócić jedynie do 1000 rekordów, zespół GAE pracuje nad propozycją kursora, który będzie pozwalał na iteracje po większej ilości danych.
[--] Duże limitacje GQL &#8211; w sortowaniu oraz użyciu operatorów. Szczegóły można przeczytać tutaj.
[---] Znaczne zużycie API CPU dla zapisu i odczytu danych z Datastore, zwłaszcza gdy ich hierarchia jest dość głęboka (więcej na ten temat w moim poprzednim poście &#8211; i o rozwiązaniu używając pola Serializowalnego).
[-] Długi czas tworzenia indeksów &#8211; ...]]></description>
		<wfw:commentRss>http://www.konri.com/2010/01/zanim-zdecydujesz-sie-na-google-app-engine/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pole serializowalne w GAE datastore</title>
		<link>http://www.konri.com/2010/01/pole-serializowalne-w-gae-datastore</link>
		<comments>http://www.konri.com/2010/01/pole-serializowalne-w-gae-datastore#comments</comments>
		<pubDate>Sun, 03 Jan 2010 21:18:13 +0000</pubDate>
		<dc:creator>Konrad</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Polecane]]></category>

		<guid isPermaLink="false">http://www.konri.com/?p=393</guid>
		<description><![CDATA[W poprzednim poście napisałem o problemach z niebywale dużym zużyciem CPU podczas operacji zapisu do datastore Google App Engine. Od kilku dni zastanawiałem się, jak zaradzić temu problemowi &#8211; rozwiązanie znalazłem i zaimplementowałem dosłownie przed chwileczką.
Struktura rekordu z danymi zapisywany podczas zapytania do API była dość rozgałęziona &#8211; coś w stylu drzewa o 3 poziomach na drugim poziomie około 3-4 rekordów &#8211; na kolnym po około 2-3 dla każdego elementu z poziomu wyżej. Co ważne, żaden z elementów poniżej głównego rekordu nie był używany w zapytaniach.
Po kilku nieudanych próbach ograniczenia ...]]></description>
		<wfw:commentRss>http://www.konri.com/2010/01/pole-serializowalne-w-gae-datastore/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Czy użycie CPU przez Datastore Cię zrujnuje?</title>
		<link>http://www.konri.com/2010/01/czy-uzycie-cpu-przez-datastore-cie-zrujnuje</link>
		<comments>http://www.konri.com/2010/01/czy-uzycie-cpu-przez-datastore-cie-zrujnuje#comments</comments>
		<pubDate>Fri, 01 Jan 2010 22:18:16 +0000</pubDate>
		<dc:creator>Konrad</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Polecane]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://www.konri.com/?p=372</guid>
		<description><![CDATA[Bawiąc się z małym projektem aplikacji dla Google App Engine doszedłem do różnych interesujących wniosków.
Jednym z ciekawszych jest użycie CPU &#8211; i bynajmniej nie CPU generowanego przez kod samej aplikacji &#8211; a CPU użyte przez datastore (jak wywnioskować można z panelu administracyjnego &#8211; około 90% użycia CPU jest generowane przez API Calls CPU).
Konsumowane jest ono w dość dużym tempie. Moja przykładowa aplikacja zapisuje pewne dane przy zapytaniu przesłanym do API. Zapytanie takie może zapisać/uaktualnić około (oszacowane manualnie na podstawie definicji modelu klas danych) 20 wierszy, musi załadować również dwa troszkę ...]]></description>
		<wfw:commentRss>http://www.konri.com/2010/01/czy-uzycie-cpu-przez-datastore-cie-zrujnuje/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google App engine i DatastoreTimeoutException</title>
		<link>http://www.konri.com/2009/12/google-app-engine-i-datastoretimeoutexception</link>
		<comments>http://www.konri.com/2009/12/google-app-engine-i-datastoretimeoutexception#comments</comments>
		<pubDate>Mon, 28 Dec 2009 22:55:42 +0000</pubDate>
		<dc:creator>Konrad</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Polecane]]></category>
		<category><![CDATA[datastore]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://www.konri.com/?p=383</guid>
		<description><![CDATA[Po kilku tygodniach zabawy z GAE zauważyć można masę problemów. Jedną z bardzo denerwujących przypadłości Clouda w wykonaniu Google jest problem z Datastore, do którego proste zapytanie przekracza dozwolony czas odpowiedzi.
Logi prostej aplikacji po pewnym czasie pełne są informacji o DatastoreTimeoutException.
Na dyskusję na ten temat można natknąć się tu. Sugestią inżynierów z Google zdaje się być ponowienie próby operacji na datastor&#8217;ze w przypadku takiego błędu. O ile nie najgorzej to wygląda w przypadku odczytu danych o tyle już sprawa zapisu z takim rozwiązaniem była by co nieco dyskusyjna. Jak na ...]]></description>
		<wfw:commentRss>http://www.konri.com/2009/12/google-app-engine-i-datastoretimeoutexception/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mail w Google App Engine &#8211; IllegalArgumentException: Unauthorized Sender</title>
		<link>http://www.konri.com/2009/11/mail-w-google-app-engine-illegalargumentexception-unauthorized-sender</link>
		<comments>http://www.konri.com/2009/11/mail-w-google-app-engine-illegalargumentexception-unauthorized-sender#comments</comments>
		<pubDate>Mon, 30 Nov 2009 20:11:11 +0000</pubDate>
		<dc:creator>Konrad</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Polecane]]></category>

		<guid isPermaLink="false">http://www.konri.com/?p=369</guid>
		<description><![CDATA[<br />
<b>Warning</b>:  array_keys() [<a href='function.array-keys'>function.array-keys</a>]: The first argument should be an array in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>1904</b><br />
<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>1904</b><br />
<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>2257</b><br />
<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>3206</b><br />
<br />
<b>Warning</b>:  implode() [<a href='function.implode'>function.implode</a>]: Argument must be an array in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>3258</b><br />
<br />
<b>Warning</b>:  array_keys() [<a href='function.array-keys'>function.array-keys</a>]: The first argument should be an array in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>3289</b><br />
<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>3289</b><br />
<br />
<b>Warning</b>:  array_keys() [<a href='function.array-keys'>function.array-keys</a>]: The first argument should be an array in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>3332</b><br />
<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>3332</b><br />
<br />
<b>Warning</b>:  array_keys() [<a href='function.array-keys'>function.array-keys</a>]: The first argument should be an array in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>3477</b><br />
<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>3477</b><br />
Jeżeli w Google App Engine próbujesz wysłać wiadomość e-mail i w logu widzisz błąd:

Illegal Arguments java.lang.IllegalArgumentException: Unauthorized Sender

upewnij się, czy aby na pewno jaki SENDER ustawione jest konto, które jest zarejestrowane jako jeden z administratorów Twojej aplikacji.
GAE pozwala wysyłać maile jedynie z kont zarejestrowanych jako administrator aplikacji. Możesz dodać dowolną ilość takich kont do swojej aplikacji w zakładce &#8220;Developers&#8221; w panelu administracyjnym.
]]></description>
		<wfw:commentRss>http://www.konri.com/2009/11/mail-w-google-app-engine-illegalargumentexception-unauthorized-sender/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pusta lista obiektów w JDO</title>
		<link>http://www.konri.com/2009/10/pusta-lista-obiektow-w-jdo</link>
		<comments>http://www.konri.com/2009/10/pusta-lista-obiektow-w-jdo#comments</comments>
		<pubDate>Mon, 26 Oct 2009 20:52:39 +0000</pubDate>
		<dc:creator>Konrad</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Polecane]]></category>
		<category><![CDATA[data store]]></category>

		<guid isPermaLink="false">http://www.konri.com/?p=351</guid>
		<description><![CDATA[Nie wiem jak wy, ale ja wolę eksploracyjne uczenie się nowych technologii. Czytanie kompleksowo dokumentcaji jakoś mi nie wychodzi   Wolę odpalić Google i znaleźć to co potrzebuję.
I tak właśnie nie ładująca się lista obiektów zdefiniowana jako pole w jednej z klas pozwoliła mi odkryć taką oto stronę, gdzie czarno na białym (no, może z odrobiną koloru) przeczytać możemy o Fetch Groups &#8211; czyli tłumacząc (nie dosłownie) grupach przechwytywania &#8211; bo przynoszenia dziwnie brzmi.
Zdefiniowanie listy w sposób następujący:

@Persistent&#40;defaultFetchGroup = &#34;true&#34;&#41;
private List&#60;Perspective&#62; perspectives = new ArrayList&#60;Perspective&#62;&#40;&#41;;

Znacząco poprawia sytuację&#8230;
Grupa obiektów ładuje ...]]></description>
		<wfw:commentRss>http://www.konri.com/2009/10/pusta-lista-obiektow-w-jdo/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lokalny podgląd DataStore w GAE</title>
		<link>http://www.konri.com/2009/10/lokalny-podglad-datastore-w-gae</link>
		<comments>http://www.konri.com/2009/10/lokalny-podglad-datastore-w-gae#comments</comments>
		<pubDate>Wed, 14 Oct 2009 09:09:43 +0000</pubDate>
		<dc:creator>Konrad</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Polecane]]></category>
		<category><![CDATA[data store]]></category>

		<guid isPermaLink="false">http://www.konri.com/?p=346</guid>
		<description><![CDATA[Często sprawy oczywiste są najtrudniejsze do odkrycia!
I tym razem tak było. Przeoczyłem część dokumentacji do Google App Engine i już w duchu narzekałem, że nie można lokalnie podejrzeć i edytować Data Store dla GAE. No i nic bardziej mylnego, jak jasno napisane w dokumentacji wystarczy otworzyć: http://localhost:8080/_ah/admin gdy nasza aplikacja jest uruchomiona i po sprawie!
Pozdrowionka!
]]></description>
		<wfw:commentRss>http://www.konri.com/2009/10/lokalny-podglad-datastore-w-gae/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google AppEngine &#8211; kolejne schody&#8230;</title>
		<link>http://www.konri.com/2009/10/google-appengine-kolejne-schody</link>
		<comments>http://www.konri.com/2009/10/google-appengine-kolejne-schody#comments</comments>
		<pubDate>Mon, 12 Oct 2009 18:20:16 +0000</pubDate>
		<dc:creator>Konrad</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Polecane]]></category>

		<guid isPermaLink="false">http://www.konri.com/?p=327</guid>
		<description><![CDATA[
Ech. Nie jest łatwo zaprzyjaźnić się z GAE. Ciągle jakieś schody&#8230;
Przed momentem odkryłem problem z dostępem za pomocą refleksji do java.util.TimeZone, chcąc wyświetlić listę stref czasowych.
Wszystko zaczęło się niewinnie, od atrybutu modelu, zawierającego przefiltrowane listy:

@ModelAttribute&#40;&#34;timeZones&#34;&#41;
public List&#60;TimeZone&#62; getTimeZones&#40;&#41; &#123;
    return TimeTools.TIME_ZONES;
&#125;

i kodu jsp:

&#60;form:select path=&#34;timeZoneID&#34;&#62;
    &#60;form:options items=&#34;${timeZones}&#34; itemValue=&#34;id&#34; itemLabel=&#34;displayName&#34;/&#62;
&#60;/form:select&#62;

Po otwarciu tego JSP AppEngine wyrzuca błąd:
HTTP ERROR: 500
access denied (java.lang.RuntimePermission accessClassInPackage.sun.util.calendar)
RequestURI=/product/add.htm
Caused by:
java.security.AccessControlException: access denied (java.lang.RuntimePermission accessClassInPackage.sun.util.calendar)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at com.google.appengine.tools.development.DevAppServerFactory
$CustomSecurityManager.checkPermission(DevAppServerFactory.java:139)
&#8230;
Problem tkwi w tym, że form:options używa refleksji do pobrania pól id dla itemValue oraz displayName dla itemLabel. ...]]></description>
		<wfw:commentRss>http://www.konri.com/2009/10/google-appengine-kolejne-schody/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
