<?xml version="1.0" encoding="utf-8"?><!-- generator="WordPress/2.9.2" -->
<rss version="0.92">
<channel>
	<title>www.konri.com</title>
	<link>http://www.konri.com</link>
	<description>KONRI.COM - Java, GWT, Spring, Billing dla SaaS...</description>
	<lastBuildDate>Fri, 26 Feb 2010 12:54:18 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>en</language>
	
	<item>
		<title>Szybka konwersja obiektu na i z XML&#8217;a</title>
		<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 />
Często pisząc krótkie &#8220;spike&#8217;i&#8221; (dla nie wtajemniczonych mianem spike określa się testowe/demonstracyjne aplikacje, lub ich zmodyfikowane fragmenty) potrzebujemy gdzieś zapisać lub przesłać obiekt Javy w formacie XML&#8217;a. Znajdziemy całą masę rozwiązań wspomagających to zadanie, jednak gdy zależy nam na czasie, niekiedy najprostsze rozwiązania są najlepsze.
Oto bardzo szybki przykład takiego zadania:

package com.konri.spikes.xml;
&#160;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import java.text.MessageFormat;
&#160;
public class Sample &#123;
&#160;
	public static void main&#40;String&#91;&#93; args&#41; throws UnsupportedEncodingException &#123;
		SampleObj sampleObj = new SampleObj&#40;&#41;;
		sampleObj.setLabel&#40;&#34;This is test message&#34;&#41;;
		sampleObj.setValue&#40;123&#41;;
		sampleObj.setCheck&#40;true&#41;;
&#160;
		String res = write&#40;sampleObj&#41;;
		System.out.println&#40;&#34;XML:\n&#34; + res&#41;;
&#160;
		SampleObj sampleObj2 = read&#40;res&#41;;
		System.out.println&#40;&#34;Loaded object: &#34; + sampleObj2&#41;;
	&#125;
&#160;
	public static class ...]]></description>
		<link>http://www.konri.com/2010/02/szybka-konwersja-obiektu-na-i-z-xmla</link>
			</item>
	<item>
		<title>Konferencja Zimowy AgileTuning</title>
		<description><![CDATA[W sobotę 20 marca 2010 r. w krakowskich Przegorzałach odbędzie się konferencja Zimowy AgileTuning. Na spotkaniu zaplanowane są prezentacje i dyskusje dotyczące inżynierii oprogramowania, jak i o tematyce całkowicie dowolnej, prowadzone w małych grupach.
Na niezwykłą atmosferę wieczoru składa się obecność właściwych ludzi oraz dobór odpowiedniego miejsca sprzyjającego bezpośrednim i nieskrępowanym dyskusjom. Duża część uczestników przyjeżdża na specjalne zaproszenie organizatorów. Każdy z nich ma bogate i różnorodne doświadczenia.
Program




Ludzie
Rzemiosło


14:00
Rozpoczęcie


14:15
Autoprezentacje Uczestników


15:00
Antonello Caboni, Colin Grossman -
Agile in a Start-up, a rapidly growing organization
Bartosz Bankowski, Szczepan Faber -
Be a VIP and rid your WIP


16:00
Nigel Baker ...]]></description>
		<link>http://www.konri.com/2010/02/konferencja-zimowy-agiletuning</link>
			</item>
	<item>
		<title>Czego unikać w prezentacjach &#8230;</title>
		<description><![CDATA[Świetna &#8211; właśnie &#8211; prezentacja, polecam:

]]></description>
		<link>http://www.konri.com/2010/01/czego-unikac-w-prezentacjach</link>
			</item>
	<item>
		<title>Jak podtrzymać &#8220;żywą&#8221; instancję aplikacji na Google App Engine</title>
		<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>
		<link>http://www.konri.com/2010/01/jak-podtrzymac-instancje-aplikacji-na-google-app-engine</link>
			</item>
	<item>
		<title>Zanim zdecydujesz się na Google App Engine</title>
		<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>
		<link>http://www.konri.com/2010/01/zanim-zdecydujesz-sie-na-google-app-engine</link>
			</item>
	<item>
		<title>Pole serializowalne w GAE datastore</title>
		<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>
		<link>http://www.konri.com/2010/01/pole-serializowalne-w-gae-datastore</link>
			</item>
	<item>
		<title>Czy użycie CPU przez Datastore Cię zrujnuje?</title>
		<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>
		<link>http://www.konri.com/2010/01/czy-uzycie-cpu-przez-datastore-cie-zrujnuje</link>
			</item>
	<item>
		<title>Google App engine i DatastoreTimeoutException</title>
		<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>
		<link>http://www.konri.com/2009/12/google-app-engine-i-datastoretimeoutexception</link>
			</item>
	<item>
		<title>Mail w Google App Engine &#8211; IllegalArgumentException: Unauthorized Sender</title>
		<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>
		<link>http://www.konri.com/2009/11/mail-w-google-app-engine-illegalargumentexception-unauthorized-sender</link>
			</item>
	<item>
		<title>AppEngine JDO i głębokość rekursywnego ładowania list</title>
		<description><![CDATA[Ostatnio odkryłem bardzo przydatne ustawienie dla PersistentManager&#8217;a. Miałem klasę A, jednym z pól klasy A była lista obiektów typu B. Obiekt B również posiadał pole będące listą obiektów typu C.
Tworzyły one pewną całość, listy były niewielkie, maksymalnie kilka elementów, więc chciałem je załadować kompletnie ładując obiekt typu A. Pierwszym krokiem było zdefiniowanie obiektu A:

@PersistenceCapable&#40;identityType = IdentityType.APPLICATION&#41;
public class A &#123;
  @Persistent&#40;defaultFetchGroup = &#34;true&#34;&#41;
  private List&#60;B&#62; bs = new ArrayList&#60;B&#62;&#40;&#41;;
&#125;

potem B:

@PersistenceCapable&#40;identityType = IdentityType.APPLICATION&#41;
public class B &#123;
  @Persistent&#40;defaultFetchGroup = &#34;true&#34;&#41;
  private List&#60;C&#62; cs = new ArrayList&#60;C&#62;&#40;&#41;;
&#125;

i w końcu C, ...]]></description>
		<link>http://www.konri.com/2009/11/appengine-jdo-i-glebokosc-rekursywnego-ladowania-list</link>
			</item>
</channel>
</rss>
