<?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/category/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>
		<item>
		<title>Google AppEngine &#8211; błąd 500 zaraz po uaktualnieniu aplikacji</title>
		<link>http://www.konri.com/2009/10/google-appengine-blad-500-zaraz-po-uaktualnieniu-aplikacji</link>
		<comments>http://www.konri.com/2009/10/google-appengine-blad-500-zaraz-po-uaktualnieniu-aplikacji#comments</comments>
		<pubDate>Fri, 09 Oct 2009 21:30:00 +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=304</guid>
		<description><![CDATA[Jeżeli zaraz po uaktualnieniu Twojej aplikacji Google App Engine otrzymujesz błąd HTTP 500:
Error: Server Error
The server encountered an error and could not complete your request.
If the problem persists, please report your problem and mention this error message and the query that caused it.
natomiast w logach serwera znajduje się następująca informacja:
Request was aborted after waiting too long to attempt to service your request. Most likely, this indicates that you have reached your simultaneous active request limit. This is almost always due to excessively high latency in your app. Please see http://code.google.com/appengine/docs/quotas.html ...]]></description>
		<wfw:commentRss>http://www.konri.com/2009/10/google-appengine-blad-500-zaraz-po-uaktualnieniu-aplikacji/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
