<?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>xlab &#187; Java</title>
	<atom:link href="http://xlab.pl/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://xlab.pl</link>
	<description>XSolve laboratory - dzielimy się tym co wiemy...</description>
	<lastBuildDate>Mon, 09 Jan 2012 15:29:06 +0000</lastBuildDate>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Efektywne programowanie w javie</title>
		<link>http://xlab.pl/efektywne-programowanie-w-javie/</link>
		<comments>http://xlab.pl/efektywne-programowanie-w-javie/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 15:51:06 +0000</pubDate>
		<dc:creator>pawel.henek</dc:creator>
				<category><![CDATA[Programowanie Java]]></category>
		<category><![CDATA[helion]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[joshua bloch]]></category>
		<category><![CDATA[książki java]]></category>
		<category><![CDATA[książki programowanie]]></category>
		<category><![CDATA[programiści java]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1901</guid>
		<description><![CDATA[Miałem ostatnio przyjemność studiować książkę autorstwa Joshuę Blocha &#8211; bardzo ciekawa postać świata javy, doktora informatyki z Carnegie Mellon University, aktualnie pracującego jako Java Chief Architect w Google. Od wielu lat realizujący projekty i badania głównie związane m.in. z javą, systemami rozproszonymi. Bogate doświadczenie akademickie, komercyjne (przed Google pracował w Sun&#8217;ie) oraz pochlebne opinie czytelników [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Miałem ostatnio przyjemność studiować książkę autorstwa Joshuę Blocha &#8211;  bardzo ciekawa postać świata javy, doktora informatyki z Carnegie Mellon  University, aktualnie pracującego jako Java Chief Architect w Google.  Od wielu lat realizujący projekty i badania głównie związane m.in. z  javą, systemami rozproszonymi. Bogate doświadczenie akademickie,  komercyjne (przed Google pracował w Sun&#8217;ie) oraz pochlebne opinie  czytelników gwarantują, że każda książka której jest autorem nie schodzi  poniżej pewnego merytorycznego poziomu. Nie inaczej jest też w  przypadku książki Effective Java: Programming Language Guide (w Polsce  Java. Efektywne programowanie, Helion).</p>
<p><a class="alignleft" style="float: left; margin: 10px 10px 10px 0;" href="http://helion.pl/ksiazki/java-efektywne-programowanie-wydanie-ii-joshua-bloch,javep2.htm" target="_blank"><img class="alignleft size-medium wp-image-1917" title="Java. Efektywne Programowanie" src="http://xlab.pl/wp-content/uploads/2011/10/Obrazek-1-209x300.png" alt="" width="209" height="300" /></a>To czym zdecydowanie różnią  się książki Blocha od innych dotyczących programowania czy też javy,  jest to że w każdej z nich skupia się na pewnej niszy w temacie o którym  pisze. W przypadku efektywnego programowania, skupia się na  praktycznych aspektach tworzenia oprogramowania, dobrych, sprawdzonych  wzorcach postępowania przy jego projektowaniu oraz na specyficznych dla  javy zagadnieniach. Autor porusza 78 tematów, z którego każdy to kilku  stronnicowy artykuł szczegółowo omawiający problem. Materiał zawarty w  książce został skatagoryzowany według pewnych większych grup problemów,  które porusza.  Autor rozpoczyna od omawiania zagadnień związanych  z tworzeniem i usuwaniem obiektów, następnie przechodzi do tych  związanych z projektowaniem klas, w tym aspektów specyficznych dla javy.  Można tutaj dowiedzieć się m.in. dlaczego należy uważnie używać  singletonów, podstaw działania garbage collectora, jak definiować  prawidłowe metody hashCode czy equals, dlaczego warto stosować  interfejsy czy zastępować dziedziczenie kompozycją. Na uwagę zasługe  fakt, iż autor stara się być jak najbardziej obiektywny, dostrzega  zarówno zalety proponowanych przez siebie rozwiązań jak i ewentualne  wady.  W dalszej kolejności omawia takie konstrukcje jak  typy ogólne, wyliczeniowe i adnotacje. Udziela praktycznych wskazówek  jakich konstrukcji języka i praktyk programowania używać, a jakie są już  przestarzałe. W ostatnich rozdziałach omawia sposoby wydajnego i  rozsądnego korzystania z wyjątków,  dzieli się doświadczeniem w kwestii  współbieżności oraz serializacji.  Cała wiedza z książki jest  gdzieś pewnie rozsiana po internecie w postaci pojedynczych postów na  blogach czy artykułów. Wydaje mi się jednak iż warto takie kompendium  wiedzy nt problemów specyficznych dla javy mieć zawsze pod ręką i od  czasu do czasu odświeżyć swoją pamięć. Gorąco polecam książkę <a href="http://helion.pl/ksiazki/java-efektywne-programowanie-wydanie-ii-joshua-bloch,javep2.htm">Java. Efektywne programowanie</a> . Tymczasem uciekam do kolejnego dziecka Blocha &#8211; <a href="http://www.javapuzzlers.com/">Java puzzlers</a> .</p>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/efektywne-programowanie-w-javie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python &#8211; widziany okiem Javianina</title>
		<link>http://xlab.pl/python-widziany-okiem-javianina/</link>
		<comments>http://xlab.pl/python-widziany-okiem-javianina/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 21:22:42 +0000</pubDate>
		<dc:creator>pawel.rychlik</dc:creator>
				<category><![CDATA[Ogólne]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[podstawy]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1855</guid>
		<description><![CDATA[Całkiem niedawno wpadł mi w ręce podręcznik do Pythona. Książka wyglądała na interesującą, więc długo nie zwlekając wziąłem się za czytanie, chwilę później już pisałem pierwsze Hello-world&#8216;y w dotąd zupełnie mi obcym języku. Z początku nie bardzo wiedziałem, którą wersje Pythona zainstalować &#8211; strona python.org oferuje multum możliwości, dostępne jest kilkanaście (kilkadziesiąt?) paczek, przygotowanych pod [...]]]></description>
			<content:encoded><![CDATA[<p>Całkiem niedawno wpadł mi w ręce podręcznik do Pythona. Książka wyglądała na interesującą, więc długo nie zwlekając wziąłem się za czytanie, chwilę później już pisałem pierwsze <em>Hello-world</em>&#8216;y w dotąd zupełnie mi obcym języku. Z początku nie bardzo wiedziałem, którą wersje Pythona zainstalować &#8211; strona python.org oferuje multum możliwości, dostępne jest kilkanaście (kilkadziesiąt?) paczek, przygotowanych pod konkretne platformy i maszyny. Pokierowałem się podpowiedziami znalezionymi w internecie: 3.x to najnowsza odmiana tego języka, 2.x jest starszą wersją (ale wciąż rozwijaną do 2013r.). Aplikacje pisane pod 3.x mogą nie być w pełni kompatybilne z Pythonem serii 2.x (i odwrotnie), ponadto większość zewnętrznych bibliotek była pisana pod starszą wersją, dlatego też zdecydowałem się na &#8222;bezpieczne&#8221; 2.6.7.</p>
<p>Nagłówek artykułu sugeruje, że będę starał się dokonać porównania Javy i Pythona. Przecież to dwa kompletnie różne światy. Niemniej jednak postaram się w skrócie nakreślić czym cechuje się Python i opisać co poniektóre ciekawsze rozwiązania, z którymi spotkałem się podczas mojej krótkiej i burzliwej znajomości z tym językiem.</p>
<p><strong>Intro</strong></p>
<p>W odróżnieniu do Javy, Python jest językiem typowanym dynamicznie: zmiennych się nie deklaruje i tym samym nie określa się ich typu. Znaczy to mniej więcej tyle, że do tej samej zmiennej można przypisywać obiekty różnych klas bez potrzeby rzutowania, nie narażając się na odpowiednik javowego <em>ClassCastException</em>. Skoro już mowa o klasach &#8211; Python jest w pełni obiektowy, a więc typy proste (<span style="color: #e34adc">bool</span><span style="color: #808030">,</span> <span style="color: #e34adc">int</span><span style="color: #808030">,</span> <span style="color: #e34adc">float</span><span style="color: #808030">,</span> <span style="color: #e34adc">complex</span>) również są obiektami. Python jest językiem interpretowanym, nie wymagającym kompilacji (ten krok jest opcjonalny &#8211; interpreter może generować skompilowany kod do plików *.pyc). Fakt ten może spodobać się weteranom Javy &#8211; przecież nieraz budowanie złożonych projektów potrafiło zająć ładne parenaście minut. Jednak dynamiczne typowanie w połączeniu z brakiem konieczności kompilacji (który de facto często w pewnym stoponiu weryfikuje poprawność kodu) i nieuwagą programisty może przyczynić się do powstawania błędów. Ale to temat na osobną dyskusję.</p>
<p><strong>Liczby.</strong></p>
<p>Cechą, której nie miałem okazji specjalnie wykorzystać, a która bardzo pozytywnie mnie zaskoczyła, jest wbudowana obsługa liczb zespolonych. Dostępny mamy typ prosty <span style="color: #e34adc">complex</span>.</p>
<pre style="color: #000000;background: #ffffff"><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> 1j <span style="color: #808030">*</span> 1J
<span style="color: #808030">(</span><span style="color: #808030">-</span><span style="color: #008c00">1</span><span style="color: #808030">+</span>0j<span style="color: #808030">)</span>
<span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> 1j <span style="color: #808030">*</span> <span style="color: #e34adc">complex</span><span style="color: #808030">(</span><span style="color: #008c00">0</span><span style="color: #808030">,</span><span style="color: #008c00">1</span><span style="color: #808030">)</span>
<span style="color: #808030">(</span><span style="color: #808030">-</span><span style="color: #008c00">1</span><span style="color: #808030">+</span>0j<span style="color: #808030">)</span>
<span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> a<span style="color: #808030">=</span><span style="color: #008000">1.5</span><span style="color: #808030">+</span><span style="color: #008000">0.</span>5j
<span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> a<span style="color: #808030">.</span>real
<span style="color: #008000">1.5</span>
<span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> a<span style="color: #808030">.</span>imag
<span style="color: #008000">0.5</span></pre>
</p>
<p>Kolejną ciekawostką jest fakt, że ograniczeniem długości liczby typu long jest w zasadzie tylko ilość dostępnej pamięci operacyjnej. Dostajemy zatem &#8222;out-of-the-box&#8221; możliwość wyrażania odległości międzygalaktycznych w milimetrach. Tylko co, jeśli będziemy chcieli przekazać obliczony wynik na inną maszynę?</p>
<p><strong>(), [], {}.</strong></p>
<p>Zdarza się, że potrzebujemy, aby metoda zwróciła więcej niż jeden obiekt. Rzecz jasna mowa tu nie o liście/tablicy, ale o obiektach różnych typów. Jednocześnie nie widzimy sensu tworzenia nowej klasy, która i tak byłaby wykorzystana tylko w tym jednym miejscu. Wtedy (na przykładzie Javy) zaczyna się kombinowanie: może przekazywać jeden obiekt przez parametr, w metodzie wypełniać go danymi, a drugą część informacji zwracać przez return statement?; może przejrzeć pakiet *utils w poszukiwaniu generycznej klasy Pair&lt;A,B&gt; lub Trio&lt;A,B,C&gt; i we wspomnianej metodzie zwracać właśnie obiekt takiej klasy? a może spróbować użyć mapę?</p>
<p>Zdaje się, że m.in. wówczas przydałyby się znane z Pythona <em>krotki</em> &#8211; niemodyfikowalne sekwencje referencji dostępnych niezależnie. Dostęp do poszczególnych elementów odbywa się przez podanie indeksu (numeracja od zera).</p>
<pre style="color: #000000;background: #ffffff"><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> <span style="color: #e34adc">tuple</span> <span style="color: #808030">=</span> <span style="color: #008c00">12345</span><span style="color: #808030">,</span> <span style="color: #008c00">54321</span><span style="color: #808030">,</span> <span style="color: #0000e6">'hello!'</span>
<span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> <span style="color: #e34adc">tuple</span>
<span style="color: #808030">(</span><span style="color: #008c00">12345</span><span style="color: #808030">,</span> <span style="color: #008c00">54321</span><span style="color: #808030">,</span> <span style="color: #0000e6">'hello!'</span><span style="color: #808030">)</span>
<span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> <span style="color: #e34adc">tuple</span> <span style="color: #808030">=</span> <span style="color: #808030">(</span><span style="color: #008c00">12345</span><span style="color: #808030">,</span> <span style="color: #008c00">54321</span><span style="color: #808030">,</span> <span style="color: #0000e6">'hello!'</span><span style="color: #808030">)</span>
<span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> <span style="color: #e34adc">tuple</span>
<span style="color: #808030">(</span><span style="color: #008c00">12345</span><span style="color: #808030">,</span> <span style="color: #008c00">54321</span><span style="color: #808030">,</span> <span style="color: #0000e6">'hello!'</span><span style="color: #808030">)</span>
<span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> <span style="color: #e34adc">tuple</span><span style="color: #808030">[</span><span style="color: #008c00">0</span><span style="color: #808030">]</span>
<span style="color: #008c00">12345</span></pre>
</p>
<p>Idąc za ciosem &#8211; kolejnym typem danych jest lista, oznaczana przy pomocy nawiasów kwadratowych. Bardzo podobna do krotki, jednak daje możliwość modyfikacji swoich danych.</p>
<pre style="color: #000000;background: #ffffff"><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> <span style="color: #e34adc">list</span> <span style="color: #808030">=</span> <span style="color: #808030">[</span><span style="color: #0000e6">'spam'</span><span style="color: #808030">,</span> <span style="color: #0000e6">'eggs'</span><span style="color: #808030">,</span> <span style="color: #008c00">100</span><span style="color: #808030">,</span> <span style="color: #008c00">1234</span><span style="color: #808030">]</span>
<span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> <span style="color: #e34adc">list</span>
<span style="color: #808030">[</span><span style="color: #0000e6">'spam'</span><span style="color: #808030">,</span> <span style="color: #0000e6">'eggs'</span><span style="color: #808030">,</span> <span style="color: #008c00">100</span><span style="color: #808030">,</span> <span style="color: #008c00">1234</span><span style="color: #808030">]</span></pre>
</p>
<p>Słowniki, które w Pythonie tworzy się przy użyciu nawiasów klamrowych, prezentują nieco inny sposób grupowania danych. Podczas gdy krotki i listy są numerowane na podstawie indeksów liczbowych, słowniki do indeksacji stosują nazwy &#8211; mogą to być litery, ciągi znaków lub symbole. Słowniki można porównać do java.util.Map, dane wkładamy podając klucz oraz odpowiadającą mu wartość, klucze muszą być unikatowe, jednak pod jednym kluczem wystąpić może wiele wartości.</p>
<pre style="color: #000000;background: #ffffff"><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> tel <span style="color: #808030">=</span> <span style="color: #800080">{</span><span style="color: #0000e6">'jack'</span><span style="color: #808030">:</span> <span style="color: #008c00">4098</span><span style="color: #808030">,</span> <span style="color: #0000e6">'sape'</span><span style="color: #808030">:</span> <span style="color: #008c00">4139</span><span style="color: #800080">}</span>
<span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> tel<span style="color: #808030">[</span><span style="color: #0000e6">'guido'</span><span style="color: #808030">]</span> <span style="color: #808030">=</span> <span style="color: #008c00">4127</span>
<span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> tel
<span style="color: #800080">{</span><span style="color: #0000e6">'sape'</span><span style="color: #808030">:</span> <span style="color: #008c00">4139</span><span style="color: #808030">,</span> <span style="color: #0000e6">'guido'</span><span style="color: #808030">:</span> <span style="color: #008c00">4127</span><span style="color: #808030">,</span> <span style="color: #0000e6">'jack'</span><span style="color: #808030">:</span> <span style="color: #008c00">4098</span><span style="color: #800080">}</span>
<span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> tel<span style="color: #808030">[</span><span style="color: #0000e6">'jack'</span><span style="color: #808030">]</span>
<span style="color: #008c00">4098</span>
<span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> <span style="color: #800000;font-weight: bold">del</span> tel<span style="color: #808030">[</span><span style="color: #0000e6">'sape'</span><span style="color: #808030">]</span>
<span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> tel<span style="color: #808030">[</span><span style="color: #0000e6">'irv'</span><span style="color: #808030">]</span> <span style="color: #808030">=</span> <span style="color: #008c00">4127</span>
<span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> tel
<span style="color: #800080">{</span><span style="color: #0000e6">'guido'</span><span style="color: #808030">:</span> <span style="color: #008c00">4127</span><span style="color: #808030">,</span> <span style="color: #0000e6">'irv'</span><span style="color: #808030">:</span> <span style="color: #008c00">4127</span><span style="color: #808030">,</span> <span style="color: #0000e6">'jack'</span><span style="color: #808030">:</span> <span style="color: #008c00">4098</span><span style="color: #800080">}</span></pre>
</p>
<p>Ciekawym niuansem jest możliwość dostępu do elementów sekwencji podając ujemną wartość indeksu. W Javie chcąc pobrać ostatni element listy, potrzeba mniej więcej takiego kodu: list.get(list.size() &#8211; 1); podczas gdy w Pythonie wystarczy: list[-1]. Przechodząc kolejno elementy listy użylibyśmy indeksów od 0 do len(list)-1. Ten sam efekt można osiągnąć iterując od -len(list) do -1. Taka mała rzecz, a cieszy.</p>
<p>Istnieją również skróty na &#8222;krojenie&#8221; sekwencji. W Javie skorzystalibyśmy z metody List.subList(), która zwraca widok oryginalnej listy. Odpowiadająca temu instrukcja Pythona to zaledwie: list[a:b], gdzie a i b to indeks początkowy i końcowy nowej listy.</p>
<pre style="color: #000000;background: #ffffff">s <span style="color: #808030">=</span> <span style="color: #0000e6">"ABCDEF"</span>
s<span style="color: #808030">[</span><span style="color: #008c00">2</span><span style="color: #808030">:</span><span style="color: #008c00">5</span><span style="color: #808030">]</span>  <span style="color: #808030">-</span><span style="color: #808030">-</span><span style="color: #808030">&gt;</span> <span style="color: #0000e6">"CDE"</span>
s<span style="color: #808030">[</span><span style="color: #008c00">4</span><span style="color: #808030">:</span><span style="color: #808030">]</span>   <span style="color: #808030">-</span><span style="color: #808030">-</span><span style="color: #808030">&gt;</span> <span style="color: #0000e6">"EF"</span>
s<span style="color: #808030">[</span><span style="color: #808030">:</span><span style="color: #008c00">2</span><span style="color: #808030">]</span>   <span style="color: #808030">-</span><span style="color: #808030">-</span><span style="color: #808030">&gt;</span> <span style="color: #0000e6">"AB"</span>
s<span style="color: #808030">[</span><span style="color: #808030">:</span><span style="color: #808030">-</span><span style="color: #008c00">1</span><span style="color: #808030">]</span>  <span style="color: #808030">-</span><span style="color: #808030">-</span><span style="color: #808030">&gt;</span> <span style="color: #0000e6">"ABCDE"</span>
s<span style="color: #808030">[</span><span style="color: #808030">-</span><span style="color: #008c00">1</span><span style="color: #808030">:</span><span style="color: #808030">]</span>  <span style="color: #808030">-</span><span style="color: #808030">-</span><span style="color: #808030">&gt;</span> <span style="color: #0000e6">"F"</span>
s<span style="color: #808030">[</span><span style="color: #808030">:</span><span style="color: #808030">]</span>    <span style="color: #808030">-</span><span style="color: #808030">-</span><span style="color: #808030">&gt;</span> <span style="color: #0000e6">"ABCDEF"</span></pre>
</p>
<p>Kolejny interesujący feature to funkcja range(a, b, c), która zwraca listę liczb od a do b (z opcjonalnym krokiem c), i która często przydaje się przy definiowaniu pętli for..in. Funkcja xrange() spełnia taką samą rolę, jednak poleca się ją stosować przy dużych rozmiarach list: zamiast alokować zbędnie duży fragment pamięci tylko po to, aby trzymać w niej uporządkowane wartości &#8211; xrange() na potrzeby iteracji tworzy tzw. lazy-list, która generuje i udostępnia jedynie elementy potrzebne w danej chwili.</p>
<pre style="color: #000000;background: #ffffff"><span style="color: #696969"># liczenie silni ze 100:</span>
product <span style="color: #808030">=</span> <span style="color: #008c00">1</span><span style="color: #006600">L</span>
<span style="color: #800000;font-weight: bold">for</span> i <span style="color: #800000;font-weight: bold">in</span> <span style="color: #e34adc">xrange</span><span style="color: #808030">(</span><span style="color: #008c00">1</span><span style="color: #808030">,</span> <span style="color: #008c00">100</span><span style="color: #808030">)</span><span style="color: #808030">:</span>
    product <span style="color: #808030">=</span> product <span style="color: #808030">*</span> i</pre>
</p>
<p><strong>Pozostałe małe plusiki</strong></p>
<p>Bardzo istotnym elementem kodu Pythona są białe znaki, a konkretnie wcięcia. To one określają bloki kodu. Z jednej strony jest to plus &#8211; mniej pisania, mniej linii kodu. Jednak błędnie zaaplikowane wcięcia w kodzie (np. wynikające z popularnej techniki copy-paste) mogą spowodować ciężkie do wytropienia błędy.</p>
<p>Świetnym ułatwieniem, które przydałoby się w innych językach, jest możliwość szeregowania (chaining) operatorów porównań:</p>
<pre style="color: #000000;background: #ffffff"><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> x <span style="color: #808030">=</span> <span style="color: #008c00">5</span>
<span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> <span style="color: #008c00">1</span> <span style="color: #808030">&lt;</span> x <span style="color: #808030">&lt;</span> <span style="color: #008c00">10</span>
<span style="color: #e34adc">True</span></pre>
</p>
<p>Porównania wartości String&#8217;ów w Pythonie to kwestia użycia operatorów == lub !=. Daje to sporo poziom przejrzystości kodu, w porównaniu do Javy, gdzie wykorzystalibyśmy String.equals(), compare() lub compareTo().</p>
<p>Podobnie jak w Scali, w Pythonie możliwe jest deklarowanie funkcji wewnątrz funkcji. Zamiast powielać ten sam fragment kodu, lepiej zdefiniować i wywołać nową funkcję. Taka fragmentacja szybko mogłaby doprowadzić do zmniejszenia czytelności interfejsu danej klasy (multum krótkich metod), toteż warto zastanowić się nad umieszczeniem nowej funkcji w ciele funkcji, w której będzie ona używana. Korzystać również możemy z funkcji lambda (któtkich funkcji anonimowych), znanych m.in. z C# i Scali.</p>
<p><strong>&#8222;Talk less, more action&#8221;</strong></p>
<p>Podaje się, że pisząc w Pythonie, można być 5-10 razy bardziej produktywnym niż w Javie. Trudno się temu dziwić, jeśli otwarcie i odczytanie pliku tekstowego w Pythonie sprowadza się do:</p>
<pre style="color: #000000;background: #ffffff"><span style="color: #e34adc">file</span> <span style="color: #808030">=</span> <span style="color: #e34adc">open</span><span style="color: #808030">(</span><span style="color: #0000e6">'plik'</span><span style="color: #808030">)</span>
<span style="color: #e34adc">file</span><span style="color: #808030">.</span>read<span style="color: #808030">(</span><span style="color: #808030">)</span></pre>
</p>
<p>Podczas gdy w Javie należałoby zadeklarować odpowiedni bufor, utworzyć strumień podając ścieżke pliku, prawdopodobnie czytać fragmentami w pętli, całość okraszając tłustą warstwą try {} catch().</p>
<p>Python pozwala na dużą swobodę. Jest językiem skryptowym, ale nie oznacza to, że nie można pisać w nim kodu zorientowanego obiektowo. Oferuje zaawansowaną modularność (wprowadza pojęcie modułu i pakietu), choć właściwie całą, nawet bardziej skomplikowaną aplikację można zawrzeć w jednym pliku *.py.</p>
<p>Python daje duże możliwości. Może być stosowany przy projektach z wielu dziedzin, jako język podstawowy, jak i uzupełniający. Zbudujemy w nim GUI (pyGTK), napiszemy testy jednostkowe (pyUnit), utworzymy zwięzły i treściwy skrypcik użytkowy, dostarczymy plugin do Firefox&#8217;a, tudzież rozszerzenie do Blender&#8217;a, połączymy się z relacyjną bazą danych, obsłużymy dokumenty XML (wbudowane parsery SAX i DOM, narzędzia walidacji, transformacji XML, dodatkowy pakiet PyXML), wreszcie w parudziesięciu liniach zmieścimy prostego klienta email, czy komunikator sieciowy, postawimy aplikację webową (framework Django), w międzyczasie korzystając z bibliotek pisanych w C lub C++.</p>
<p><strong>Ok. Gdzie jest haczyk</strong><strong>?</strong></p>
<p>Python może nie wydawać się stabilną platformą, jeśli w danym momencie korzysta się z elementów, które z czasem się zmieniają. Jeśli chce się budować większą aplikację, warto trzymać się jednej wersji języka. Niestety takie podejście też nie jest najlepsze, bo:</p>
<ul>
<li> Nowsze wersje bibliotek zazwyczaj powstają tylko dla najnowszych wersji Pythona</li>
<li> Pewne nowe elementy Pythona mogą spowodować subtelne zmiany w działaniu aplikacji, które nie dadzą się łatwo wykryć. To z pewnością nie sprzyja biznesowi.</li>
</ul>
<p>Weźmy konkretny przykład. W Pythonie 2.3.4 i wcześniejszym poniższy snippet powoduje wygenerowanie wyniku, którego oczekuje się po programie napisanym w C:</p>
<pre style="color: #000000;background: #ffffff"><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> <span style="color: #800000;font-weight: bold">print</span> <span style="color: #0000e6">"%x"</span> <span style="color: #808030">%</span> <span style="color: #808030">-</span><span style="color: #008c00">2</span>
fffffffe</pre>
</p>
<p>Poczynając od wersji 2.4 widzimy z goła odmienny wynik:</p>
<pre style="color: #000000;background: #ffffff"><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span><span style="color: #808030">&gt;</span> <span style="color: #800000;font-weight: bold">print</span> <span style="color: #0000e6">"%x"</span> <span style="color: #808030">%</span> <span style="color: #808030">-</span><span style="color: #008c00">2</span>
<span style="color: #808030">-</span><span style="color: #008c00">2</span></pre>
</p>
<p>Przedstawiona zmiana może wydawać się błaha, ale tak nie jest. W nowszej wersji Pythona zmianie uległ sposób traktowania liczb całkowitych bez znaku. Ponieważ z liczb całkowitych korzysta się nawet w najmniejszym skrypcie, tego rodzaju zmiana może nieść kolosalne konsekwencje.</p>
<p>Innymi słowy &#8211; Python jest na tyle młodym językiem, że jego twórcy na razie nie przejmują się kwestiami zgodności i stabilności (przynajmniej nie tak bardzo jak w Javie, w której cykle życia oprogramowania obejmują niejednokrotnie 10 lat).</p>
<p>Python to nie tylko maszyna wirtualna, API i składnia &#8211; to także zbiór bibliotek otaczających podstawowe funkcje systemu operacyjnego. Z założenia skrypty pythonowe mają być przenośne pomiędzy systemami operacyjnymi i hardware&#8217;m. Często ochrona przed różnicami pomiędzy systemami jest iluzoryczna, zwłaszcza w kwestii obsługi protokołów sieciowych i wielowątkowości. Np. interfejs gniazd sieciowych, stosowany w wielu programach, zgłasza inne wyjątki pod Windows, a inne pod *nix. Więc albo wyłapuje się wszystkie wyjątki, albo stosuje się osobny kod dla tych przypadków.</p>
<p>Z mojego, subiektywnego punktu widzenia mechanizm dołączania dodatkowych zewnętrznych bibliotek do instancji Pythona jest niekiedy mocno przesadzony. Nie wszystkie biblioteki wymagają instalacji &#8211; niektóre zwyczajnie wrzucamy do katalogu PythonXX\Lib\site-packages i po wykonaniu odpowiedniej instrukcji importu od razu są widoczne z poziomu interpretera. Inne biblioteki dostarczają cały instalator, który teoretycznie powinien wszystkim się zająć.<br />
Ku przestrodze: Instalacja Pythona 2.6.7 pod 64bitowym Windows7 nie powinna stwarzać problemów. Jednak potem doinstalowanie dodatkowych modułów może okazać się już nie takie proste &#8211; biblioteka szuka w rejestrze informacji o ścieżkce instalacji wymaganej wersji Pythona &#8211; i nic nie znajduje. Wtedy niezwykle irytujący staje się fakt, że byle biblioteka (której kod pewnie mieści się na paru ekranach), z wielce wyszukanym instalatorem, jest nie do zainstalowania, choćbyśmy ściągali coraz to inne wersje i samego Pythona i rozszerzeń. Jakby tego było mało &#8211; deinstalacja pod Win7 trwa ~8minut, i zostawia po sobie multum śmieci, m.in. w katalogach systemowych.</p>
<p>Dużym minusem jest brak możliwości debuggowania wątków (oczywiście można próbować to &#8222;obejść&#8221; przy pomocy logger&#8217;a, lub pisząc dokładne testy jednostkowe).</p>
<p><strong>Outro</strong></p>
<p>Python jest narzędziem zorientowanym na maksymalną zwięzłość, prostotę i wysoki stopień abstrakcji. Dzięki temu pozwala na szybkie i efektywne tworzenie aplikacji. Pozwala skupić się na samej funkcjonalności programu, odkładając kwestie niskopoziomowe na dalsze tło. Byłby świetnym wyborem, kiedy przyjdzie potrzeba napisania na szybko prostego skryptu, czy niewielkiej aplikacji w ramach uczelnianego projektu. Zdaje się, że nie jest to jeszcze język na tyle dojrzały, ustabilizowany i konsekwentny, aby na jego podstawie pisać rozbudowane aplikacje biznesowe o długim cyklu życia. Chyba, że jako wyjątkowo wysoko-poziomowy język uzupełniający, stanowiący niewielką część całości aplikacji.</p>
<p><strong>Polecam</strong></p>
<p><a title="http://stackoverflow.com/questions/101268/hidden-features-of-python" href="http://stackoverflow.com/questions/101268/hidden-features-of-python" target="_blank">http://stackoverflow.com/questions/101268/hidden-features-of-python</a></p>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/python-widziany-okiem-javianina/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>XSolve na konferencji Confitura 2011</title>
		<link>http://xlab.pl/xsolve-na-konferencji-confitura-2011/</link>
		<comments>http://xlab.pl/xsolve-na-konferencji-confitura-2011/#comments</comments>
		<pubDate>Mon, 13 Jun 2011 22:23:18 +0000</pubDate>
		<dc:creator>Wojtek Sznapka</dc:creator>
				<category><![CDATA[Programowanie Java]]></category>
		<category><![CDATA[confitura]]></category>
		<category><![CDATA[domain-driven design]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[konferencja]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[scala]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1819</guid>
		<description><![CDATA[W minioną sobotę sześcioosobowa delegacja firmy  XSolve wzięła udział w konferencji Confitura 2011. Impreza organizowana przez grupę Warszawa JUG była poświęcona głównie technologii Java, ale nie zabrakło też nowinek z okolic Javy, czyli Scali, NoSQL, cloud computingu czy różnych tematów architektonicznych. Jednogłośnie uznaliśmy, że najlepszym wykładem był Domain-Driven Design Sławomira Sobótki, który w bardzo przystępny [...]]]></description>
			<content:encoded><![CDATA[<p>W minioną sobotę sześcioosobowa delegacja firmy  XSolve wzięła udział w konferencji <a href="http://confitura.pl">Confitura 2011</a>. Impreza organizowana przez grupę Warszawa JUG była poświęcona głównie technologii Java, ale nie zabrakło też nowinek z okolic Javy, czyli Scali, NoSQL, cloud computingu czy różnych tematów architektonicznych.<span id="more-1819"></span></p>
<p>Jednogłośnie uznaliśmy, że najlepszym wykładem był Domain-Driven Design Sławomira Sobótki, który w bardzo przystępny sposób pokazał tą technikę projektowania i modelowania systemów. DDD ma zastosowanie szczególnie tam, gdzie model domenowy jest bardzo złożony, a czas życia systemu liczy się w latach.</p>
<p>Ciekawa była również prezentacja Bartka Majsaka &#8222;Jak wycisnąć maksimum z testów&#8221;. TDD nie jest nam obce, ale podejścia jakie pokazał Bartek bardzo nam przypadły do gusty. W szczególności mam tu na myśli testy behawioralne oraz nagrywanie wykonania testów techniką screen-capture, co pozwala nam błyskawicznie przejrzeć testy funkcjonalne, które nie zakończyły się sukcesem.</p>
<p>Dwa wykłady były poświęcone tylko i wyłącznie Scali, którą nazywa się czasem następcą Javy. W szczególności pasowały one Pawłowi, który jest zapalonym miłośnikiem tej technologii i firmowy ekspertem w tej dziedzinie. Szczególnie zaciekawiło nas usytyuowanie Scali w klasie rozwiązań Enterprise, które prezentował Paweł Dolega.</p>
<p>Oczywiście nie ominęliśmy też prelekcji o architekturze modelu dla rozwiązań NoSQL. Prowadzący spotkał się z niemałymi sprzeciwami z widowni, dzięki czemu prezentacja nabrała dynamiki i zmusiła Jarosława do usilnego bronienia swoich poglądów :-)</p>
<p>Podsumowując, konferencję oceniamy pozytywnie. Nie ma zarzutów co do organizacji, która była na prawdę na wysokim poziomie, aczkolwiek mieliśmy wrażenie, że 45 minutowe prezentacje rzadko komu wystarczały, żeby przeprowadzić pełny wykład. Większość prelekcji była dobrze przygotowana i przeprowadzona, aczkolwiek zdarzały się też takie, które wymagają większego wysiłku w przyszłości :-) Generalnie Confiturę uznajemy za udaną i z chęcią wybierzemy się również w przyszłym roku.</p>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/xsolve-na-konferencji-confitura-2011/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Trzeźwe spojrzenie na: Design By Contract by Google</title>
		<link>http://xlab.pl/trzezwe-spojrzenie-na-design-by-contract-by-google/</link>
		<comments>http://xlab.pl/trzezwe-spojrzenie-na-design-by-contract-by-google/#comments</comments>
		<pubDate>Wed, 09 Feb 2011 01:34:30 +0000</pubDate>
		<dc:creator>Konrad Malawski</dc:creator>
				<category><![CDATA[Programowanie Java]]></category>
		<category><![CDATA[adnotacje]]></category>
		<category><![CDATA[AST]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[contract]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[kontrakty]]></category>
		<category><![CDATA[piękno]]></category>
		<category><![CDATA[pragmatycznie]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[tricks]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1747</guid>
		<description><![CDATA[Design By Contract Dzisiejszy wpis będzie o znanej i generalnie dość znanej i mającej wiele zalet metodyce Design By Contract. Temat &#8222;wypłynął&#8221; ponownie dla wielu javovców tym razem dzięki wydaniu biblioteki  CoFoJa (o którym właśnie będzie ten post) przez dwóch pracowników Google przy ścisłej współpracy z autorem pierwowzoru tego projektu. Dlaczego jednak nietypowy tytuł posta [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Design By Contract</strong></p>
<p>Dzisiejszy wpis będzie o znanej i generalnie dość znanej i mającej wiele zalet metodyce <strong>Design By Contract</strong>. Temat &#8222;wypłynął&#8221; ponownie dla wielu javovców tym razem dzięki wydaniu biblioteki  <strong>CoFoJa</strong> (o którym właśnie będzie ten post) przez dwóch pracowników <strong>Google</strong> przy ścisłej współpracy z <a href="http://www.linkedin.com/pub/dir/Johannes/Rieken">autorem pierwowzoru tego projektu</a>. Dlaczego jednak nietypowy tytuł posta &#8211; &#8222;trzeźwe spojrzenie&#8221;? Ponieważ w odróżnieniu od niektórych nie oceniam technologii na podstawie &#8222;wow factor&#8221; a realnej używalności. Gotowi mini review tego toola? No to lecimy&#8230; :-)</p>
<p><strong>Contracts For Java</strong></p>
<p>Na początek warto rzucić okiem na <a href="http://google-opensource.blogspot.com/2011/02/contracts-for-java.html">googlowy blog</a> gdzie ogłoszono premierę tego narzędzia oraz oczywiście samą <a href="http://code.google.com/p/cofoja/">stronę domową projektu </a><acronym title="Contracts For Java"><a href="http://code.google.com/p/cofoja/"><strong>CoFoJa</strong></a></acronym>. Oczywiście na samym przekierowaniu nie poprzestanę więc zaczniemy od mini definicji od strony użytkownika metodyki design by contract. Jak możemy przeczytać chociażby <strong>w pragmatycznym programiście </strong>metodyka ta ma dość spory potencjał i ciekawe możliwości &#8211; generalnie chodzi o określanie &#8222;kontraktów&#8221; na naszych metodach. Zakładanie kontraktów ma pewną wyższość nad pisanie testów jednostkowych ponieważ możemy kontrakt założyć na interfejsie a wszystkie implementujące go klasy będą z nim związane</p>
<p>Kontrakt może na przykład zapewnić:</p>
<ul>
<li>wykonanie danej metody tylko i wyłącznie wtedy gdy przekazane jej argumenty spełniają pewne kryteria (w kontekście CoFoJa byłoby to <strong>@Requires</strong>)</li>
<li>zagwarantowanie spełnienia pewnych warunków po opuszczeniu metody (w kontekście CoFoJa byłoby to <strong>@Ensures</strong> ewentualnie <strong>@ThrowEnsures</strong> jeśli chcemy mieć kontrakt na rzucenie wyjątku)</li>
<li>zagwarantowanie ogólnych warunków na konkretnej np. klasie (<strong>@Invariant</strong>)</li>
</ul>
<p>Ok, skoro znamy podstawowe building blocks (zaczerpnięte skądżeby inąd niż z <a href="http://en.wikipedia.org/wiki/Eiffel_%28programming_language%29">Eiffla</a> oczywiście) zobaczmy jakieś przykładowe poadnotowane nimi API:</p>
<p><script src="https://gist.github.com/817547.js?file=gistfile1.java"></script> <strong>A teraz praktycznie</strong></p>
<p>Najlepiej jest chwilkę się w niego wgryźć, powinien być stosunkowo zrozumiały. Nie chcemy nigdy mieć ujemnej ilości bananów &#8211; spowodowałoby to złamanie kontraktu. Podobne przykładowe kontrakty wejściowe/wyjściowe widzimy na metodach oraz jeden mały tip: metoda <strong>old()</strong> jest dostarczana automagicznie i oznacza &#8222;starą wartość tego wywołania&#8221; czyli przed wykonaniem metody na którą zakładamy ten kontrakt. Poza tym mamy tutaj do czynienia w sumie z zwyczajnym kodem Java który niestety jest wewnątrz stringa&#8230; Świadomy programista zapewne już ma zapaloną lampkę alarmową, że to będzie nie refaktorowalne i bez sensu&#8230; Na pocieszenie dodam iż kod Java zawarty w tych stringach faktycznie jest &#8222;kompilowany&#8221;i jak coś popsujemy składniowo, kontrakty się nie skompilują i dostaniemy normalne informacje jakby to się nam nie kompilował normalny &#8222;nasz kod&#8221;. Co do wygody refaktoringu&#8230; Na szczęscie korzystam z porządnego IDE (<strong>IntelliJ IDEA</strong>) i takie &#8222;problemy&#8221; mnie nie dotyczą ;-). Wybrałem inject języka <strong>Groovy</strong> do tych stringów aby parser składniowy nie dziwił się pojawienia się metody old() &#8222;z nikąd&#8221;:<a href="http://xlab.pl/wp-content/uploads/2011/02/intellij.png"><img class="aligncenter size-full wp-image-1752" title="intellij" src="http://xlab.pl/wp-content/uploads/2011/02/intellij.png" alt="" width="600" /></a> <strong>Problem</strong> z &#8222;nie podpowiadaniem metod&#8221; jak i &#8222;nie da się refaktorować&#8221; jak widać został od razu <strong>wyeliminowany</strong> :-) <em><strong>Hooray for JetBrains.</strong></em> Poszukajmy jednak kolejnego problemu z tym API&#8230; Tak jest, <strong>@ThrowEnsures </strong>jest trochę brzydki a nie koniecznie musi być cały w stringu. Jak działa obecnie? Przekazujemy mu listę stringów gdzie parami występują &#8222;wyjątek&#8221; + &#8222;warunek kiedy ma zostać rzucony&#8221;. Chętniej zobaczył bym to w formie podobnej do poniższej (tylko szybki szkic taki), a wy?</p>
<p><script src="https://gist.github.com/817695.js?file=gistfile1.java"></script></p>
<p>Ok czas na uruchomienie kodu z &#8222;włączonymi kontraktami&#8221;&#8230; I&#8230; niestety nie okazało się to takie trywialne na obecnym etapie projektu. Niestety trzeba sobie ręcznie poustawiać processowanie adnotacji (norma, tutaj się niewiele zmieni) jednak trochę problemów nastarcza mi obecnie widoczność klas/pól dla CoFoJa w intellij. Classpath (dla procesora) zdaje się być ustawiony poprawny oraz jego klasa jak i inne opcje też jednak nie dochodzi do poprawnego przeparsowania wszystkich reguł. No cóż, może jutro się uda &#8211; tymczasem odsyłam do <a href="http://fsteeg.com/2011/02/07/setting-up-contracts-for-java-in-eclipse/">poradnika dla użytkowników Eclipse</a> gdzie to członek społeczności sprawnie poradził sobie z tym problemem :-)</p>
<p><strong>Trzeźwe spojrzenie: &#8222;Czy obecnie warto?</strong>&#8221;</p>
<p>Pozostaje pytanie&#8230; Czy warto się zainteresować CoFoJa jak i samym DBC? Pytanie jest chyba równie ogólne jak &#8222;czy warto meta-programować?&#8221; także wprost odpowiedzi nie udzielę. Miejmy jednak na uwadze że jak na razie używanie CoFoJa nie jest zbyt wygodne a adnotacje można by jeszcze trochę poszlifować. Trzeba by jeszcze rzucić okiem jak stoimy z integracją tego z Maven &#8211; aby normalnie testując bądź klikając sobie po projekcie te kontrakty mogły się przydawać. Sama idea jest ciekawa i jakby integracja z narzędziami była wygodniejsza &#8211; a może od razu pluginy do IDE &#8211; można by się nad tym porządniej zastanawiać. <strong>Jak na razie projekcik odkładamy ten projekt spokojnie na półkę &#8222;worth watching&#8221; i liczymy na rychłe wydanie 2.0.</strong> :-)</p>
<p>PS: Jeżeli interesują Cię takie jak i inne ciekawe metodyki i sposoby tworzenia <strong>pięknego</strong>, czystego<strong> kodu, </strong>zapraszam serdecznie na co 2 tygodniowe spotkania <em><a href="http://sckrk.com">SCKRK </a></em>gdzie obecnie dyskutujemy w formie &#8222;reading club&#8221; nad <strong>D</strong>omain <strong>D</strong>riven <strong>D</strong>esign :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/trzezwe-spojrzenie-na-design-by-contract-by-google/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>XSolve @ JavaCamp #5</title>
		<link>http://xlab.pl/xsolve-javacamp-5/</link>
		<comments>http://xlab.pl/xsolve-javacamp-5/#comments</comments>
		<pubDate>Thu, 16 Dec 2010 22:30:33 +0000</pubDate>
		<dc:creator>Konrad Malawski</dc:creator>
				<category><![CDATA[Programowanie Java]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[javacamp]]></category>
		<category><![CDATA[jug]]></category>
		<category><![CDATA[pjug]]></category>
		<category><![CDATA[polishjug]]></category>
		<category><![CDATA[sponsor]]></category>
		<category><![CDATA[spotkanie]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1646</guid>
		<description><![CDATA[Niecały miesiąc temu odbył się, piąty już z kolei, <strong>JavaCamp </strong>w Krakowie. JavaCamp to seria "większych" spotkań organizowany przez <strong>Polish Java User Group</strong>. Naszym pomysłem na spotkania JUGowe jest jak widać "rzadziej, a więcej", trochę inaczej niż pozostałe JUGi które zazwyczaj spotykają się regularnie, za to na jedną prelekcję. W związku z tym, że obecnie pracuję w XSolve wpadliśmy (piszę "my" jako członek PJUGa jak i zespołu XSolve) na pomysł zasponsornowania tego wydania JC, a teraz nareszcie możemy pochwalić się umieszczonymi nagraniami z spotkania na parleys.com... Aby zobaczyć nagrania oraz dowiedzieć się więcej o samym spotkaniu, przeczytaj resztę tego posta.]]></description>
			<content:encoded><![CDATA[<p>Niecały miesiąc temu odbył się, piąty już z kolei, <strong>JavaCamp </strong>w Krakowie. JavaCamp to seria &#8222;większych&#8221; spotkań organizowany przez <strong>Polish Java User Group</strong>. Naszym pomysłem na spotkania JUGowe jest jak widać &#8222;rzadziej, a więcej&#8221;, trochę inaczej niż pozostałe JUGi które zazwyczaj spotykają się regularnie, za to na jedną prelekcję. W związku z tym, że obecnie pracuję w XSolve wpadliśmy (piszę &#8222;my&#8221; jako członek PJUGa jak i zespołu XSolve) na pomysł zasponsornowania tego wydania JC, a teraz nareszcie możemy pochwalić się umieszczonymi nagraniami z spotkania na <strong><a href="http://www.parleys.com">parleys.com</a></strong> (kto nie zna &#8211; niech wejdzie i pozna).</p>
<p>Na pierwszy ogień poszedł Łukasz Lenart, który opowiedział troszkę o byciu lepszym programistą, miękkich umiejętnościach oraz na przykład Zen To Done lub znanym Pomodoro. Prezentacja bardzo przyjemna i omawiająca rzeczy &#8222;wydawałoby się że oczywiste&#8221;. Problem leży w tym że czasami (hah! A może nawet &#8222;często&#8221;?!) o tych rzeczach najprostszych się zapomina wpadając w wir ślepego klepania kodu&#8230; ;-)</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="474" height="443" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="pageId" value="2236" /><param name="src" value="http://www.parleys.com/share/parleysshare2.swf?pageId=2236" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="474" height="443" src="http://www.parleys.com/share/parleysshare2.swf?pageId=2236" pageid="2236" allowfullscreen="true"></embed></object></p>
<p>Drugą prezentację prowadziłem ja, a temat był oczywiście jednym z dla mnie obecnie bardzo (<em>bardzo</em>) istosnych: rozproszone systemy kontroli wersji, a konkretniej: git. Była to moja pierwsza prezentacja przed &#8222;większą&#8221; publicznością i mimo drobnych komplikacji (&#8222;demo syndrome&#8221;&#8230; ;-)) przekazałem uczestnikom dość dobrą dawkę użytecznych informacji na temat git&#8217;a, co może potwierdzić wzmożone zainteresowanie i migracje wśród znajomych od czasu tej prezentacji&#8230;</p>
<p><object width="474" height="443"><param name="movie" value="http://www.parleys.com/share/parleysshare2.swf?pageId=2235"></param><param name="allowFullScreen" value="true"></param><param name="pageId" value="2235"></param><embed src="http://www.parleys.com/share/parleysshare2.swf?pageId=2235" type="application/x-shockwave-flash" allowfullscreen="true" width="474" height="443"></embed></object></p>
<p>Po przerwie na pizzę ufundowaną przez XSolve, do prezentowania przystąpił Łukasz Żmudziński. Proszanym tematem był projekt Lombok &#8211; który swoją drogą niedługo później autorzy bardzo wesoło prezentowali na niemieckim Devoxx :-). Lombok za cel stawia sobie zdjęcie z programistów Java smętnego klepania tak zwanego boilerplate (&#8222;ten szum który musimy naklepać w każdym POJO etc etc&#8221;).</p>
<p><object width="474" height="443"><param name="movie" value="http://www.parleys.com/share/parleysshare2.swf?pageId=2237"/><param name="allowFullScreen" value="true"/><param name="pageId" value="2237"/><embed src="http://www.parleys.com/share/parleysshare2.swf?pageId=2237" type="application/x-shockwave-flash" allowfullscreen="true" width="474" height="443"/><br />
</object></p>
<p>Ostatnia prezentacja tego dnia poruszyła tematykę również mi bardzo bliską i ciekawą: TDD, na przykładach. Łukasz Czerpak pokazał na licznych przykładach jak powinny wyglądać dobre testy. Jego przykładowe testy (których było mnóstwo) były dla mnie dość ciekawe jako, że z EJB większej styczności dotychczas jeszcze nie miałem.</p>
<p><object width="474" height="443"><param name="movie" value="http://www.parleys.com/share/parleysshare2.swf?pageId=2238"/><param name="allowFullScreen" value="true"/><param name="pageId" value="2238"/><embed src="http://www.parleys.com/share/parleysshare2.swf?pageId=2238" type="application/x-shockwave-flash" allowfullscreen="true" width="474" height="443"/><br />
</object></p>
<p>To by było na tyle nagrań z piątej edycji JavaCamp&#8217;u. Zapraszamy na przyszłe (już niebawem) oraz oczywiście na nadchodzący wielkimi krokami GeeCON. :-) W razie zainteresowania innymi nagraniami i przyszłymi spotkaniami Polskiego JUGa, zapraszamy na <strong><a href="http://www.java.pl">java.pl</a> </strong>oraz <a href="http://parleys.com/#st=4&amp;id=15447">nasz kanał na parleys.com</a>&#8230; :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/xsolve-javacamp-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fast development with Spring, Roo &amp; GWT</title>
		<link>http://xlab.pl/fast-development-with-spring-roo-gwt/</link>
		<comments>http://xlab.pl/fast-development-with-spring-roo-gwt/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 12:02:09 +0000</pubDate>
		<dc:creator>Łukasz Zagórski</dc:creator>
				<category><![CDATA[Programowanie Java]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Roo]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://xlab.pl/?p=1215</guid>
		<description><![CDATA[Na tapecie narzędzie Spring Roo pozwalające generować kod dla projektów tworzonych z wykorzystaniem framework&#8217;a Spring. Wspomniany program zyskał ostatnio wsparcie dla technologii GWT, czego efektem jest poniższy tutorial. Zaprezentowane zostanie w jaki sposób bardzo niskim kosztem stworzyć z jego pomocą prostą aplikację. Zagadnienie podzieliłem na kilka postów. Temat pierwszego obejmuje podstawowe zagadnienia i zbliżony jest do tego [...]]]></description>
			<content:encoded><![CDATA[<div>Na tapecie narzędzie <strong>Spring Roo </strong>pozwalające generować kod dla projektów tworzonych z wykorzystaniem framework&#8217;a Spring. Wspomniany program zyskał ostatnio wsparcie dla technologii <strong>GWT, </strong>czego efektem jest poniższy tutorial. Zaprezentowane zostanie w jaki sposób bardzo niskim kosztem stworzyć z jego pomocą prostą aplikację. Zagadnienie podzieliłem na kilka postów. Temat pierwszego obejmuje podstawowe zagadnienia i zbliżony jest do tego co zaprezentował Ben Alex (ojciec Roo) na ostatnim Google IO, tu temat zostanie przedstawiony w sposób bardziej kompletny po to aby osoby z wiedzą==0 we wspomnianych technologiach mogły z powodzeniem zacząć. Celem tutoriala jest implementacja kompletnej aplikacji przy okazji zbytnio się nie męcząc. Dodatkowo w kolejnych częściach postaram się dodać analizę generowanego przez Roo kodu.</div>
<p><br/></p>
<div><strong>1.</strong> Najprostszym sposobem na rozpoczęcie pracy jest ściągnięcie i zainstalowanie<strong> STS </strong>(SpringSource Tool Suite) spod adresu: <a href="http://www.springsource.com/products/springsource-tool-suite-download">http://www.springsource.com/products/springsource-tool-suite-download</a> .</div>
<div>Jest to zintegrowane środowisko programistyczne, które de-facto jest podrasowanym Eclipse&#8217;m springowymi pluginami. Zainstalowanie go ułatwi start w projekcie ponieważ domyślnie zawiera większą część potrzebnych rozszerzeń. W dystrybucji zainstalowany jest plugin ułatwiający pracę z Roo o nazwie &#8222;Roo shell&#8221;, trzeba włączyć jego widok lub wywołać za pomocą skrótu Ctrl + r. We wspomnianej konsoli należy do bólu stosować polecenie &#8222;hint&#8221; i skrót Ctrl + Space.</div>
<p><br/></p>
<div><strong>2.</strong> Następnie instalujemy dowolną bazę danych (w przykładzie wykorzystano MYSQL) i utworzyć w niej bazę &#8222;informations&#8221;.</div>
<p><br/></p>
<div><strong>3.</strong> Kolejno można już uruchomić środowisko programistyczne i ściągnąć potrzebne rozszerzenia. Na początku wystarczy Google Plugin for Eclipse.</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_211fzr88gfn_b.jpg"><img class="alignnone size-full wp-image-1216" title="dcq2pcgs_211fzr88gfn_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_211fzr88gfn_b.jpg" alt="" width="870" height="265" /></a></div>
<div><strong><br/><br />
4.</strong> Następnie należy przystąpić do utworzenia projektu Roo. Najprościej za pomocą menu &#8222;File&#8221; (jak przedstawiono poniżej).</div>
<p><br/><br />
<a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_199cjc2hqfc_b-1.jpg"><img src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_199cjc2hqfc_b-1.jpg" alt="" title="dcq2pcgs_199cjc2hqfc_b (1)" width="977" height="627" class="alignleft size-full wp-image-1276" /></a></p>
<div>Należy wpisać nazwę projektu i określić główną paczkę.</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_200gmhrgd8t_b.jpg"><img class="alignnone size-full wp-image-1217" title="dcq2pcgs_200gmhrgd8t_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_200gmhrgd8t_b.jpg" alt="" width="540" height="694" /></a></div>
<div><br/>Po wypełnieniu formularza &#8222;klikniąć&#8221; Next, Finish i można obserwować poruszenie u dołu ekranu w konsoli Roo.</div>
<div><strong><br/><br />
5.</strong> Po założeniu projektu trzeba skonfigurować warstwę utrwalania.</div>
<div>Aby to zrobić wykorzystany zostanie wspomniany Roo Shell, a aby to osiągnąć wystarczy wpisać polecenie jak poniżej.</div>
<div>Po jego wykonaniu skonfigurowana zostanie warstwa utrwalania dla bazy MYSQL z implementacją Hibernate do bazy o nazwie &#8222;informations&#8221;.</div>
<div>Dodatkowe opcje konfiguracji (takie jak użytkownik i hasło do bazy) można ustawić w pliku <strong>database.properties</strong>.</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_201fnwpqz2b_b.jpg"><img class="alignleft size-full wp-image-1219" title="dcq2pcgs_201fnwpqz2b_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_201fnwpqz2b_b.jpg" alt="" width="885" height="329" /></a></div>
<p><br/></p>
<div><strong>6.</strong> Kolejno tworzymy pierwszą encję za pomocą komendy jak poniżej.</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_203fp6f9zfm_b.jpg"><img class="alignleft size-full wp-image-1220" title="dcq2pcgs_203fp6f9zfm_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_203fp6f9zfm_b.jpg" alt="" width="875" height="322" /></a></div>
<p><br/></p>
<div><strong>7.</strong> Mając stworzona encję dodajemy do niej pola.</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_204zvjz9kcr_b.jpg"><img class="alignleft size-full wp-image-1221" title="dcq2pcgs_204zvjz9kcr_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_204zvjz9kcr_b.jpg" alt="" width="865" height="325" /></a></div>
<p><br/></p>
<div><strong>8.</strong> Po dodaniu odpowiednich pól do encji można &#8222;podpiąć&#8221; GWT poprzez wpisanie w konsoli Roo &#8222;gwt setup&#8221;.</div>
<div>Komenda ta spowoduje wygenerowanie kodu warstwy prezentacji.</div>
<p><br/></p>
<div><strong>9.</strong> Następnie należy skonfigurować GWT &#8222;klikając&#8221; prawym przyciskiem na projekcie i wybierając opcję jak poniżej.</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_205drr832gm_b.jpg"><img class="alignleft size-full wp-image-1222" title="dcq2pcgs_205drr832gm_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_205drr832gm_b.jpg" alt="" width="620" height="772" /></a></div>
<p><br/></p>
<div>Należy upewnić się, że wybrane jest SDK GWT 2.1.0.M1 .</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_207ccncgngh_b.jpg"><img class="alignleft size-full wp-image-1223" title="dcq2pcgs_207ccncgngh_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_207ccncgngh_b.jpg" alt="" width="638" height="628" /></a></div>
<p><br/></p>
<div><strong>10.</strong> Popełniwszy powyższe punkty należy włączyć Maven Dependency Management,</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_209dmf4hrt8_b.jpg"><img class="alignleft size-full wp-image-1224" title="dcq2pcgs_209dmf4hrt8_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_209dmf4hrt8_b.jpg" alt="" width="571" height="722" /></a></div>
<p><br/></p>
<div>&#8222;odświeżyć&#8221; projekt, uruchomić,</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_208dpn99kdw_b.jpg"><img class="alignleft size-full wp-image-1225" title="dcq2pcgs_208dpn99kdw_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_208dpn99kdw_b.jpg" alt="" width="573" height="745" /></a></div>
<p><br/></p>
<div>wybrać katalog z buildem,</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_210gq7nh7cs_b.jpg"><img class="alignleft size-full wp-image-1226" title="dcq2pcgs_210gq7nh7cs_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_210gq7nh7cs_b.jpg" alt="" width="475" height="659" /></a></div>
<p><br/></p>
<div>i VOILA! .</div>
<p><br/></p>
<div>W rezultacie otrzymujemy aplikację (screen wygenerowanej warstwy prezentacji poniżej) która umożliwia dodawanie rekordów do bazy, przeglądanie ich na stronicowanej liście, edycję i usuwanie.</div>
<p><br/></p>
<div>Proces tworzenia zajmuje około 5 min (mając już skonfigurowane środowisko).</div>
<div>Dodatkowo w pliku logu zapisywane są wszystkie wykonywane w konsoli Roo instrukcje co pozwala odtworzyć cały proces .</div>
<p><br/></p>
<div><a href="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_212fmwzrvfm_b.jpg"><img class="alignleft size-full wp-image-1227" title="dcq2pcgs_212fmwzrvfm_b" src="http://xlab.pl/wp-content/uploads/2010/06/dcq2pcgs_212fmwzrvfm_b.jpg" alt="" width="869" height="895" /></a></div>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/fast-development-with-spring-roo-gwt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Invalid memory access of location używając GWT</title>
		<link>http://xlab.pl/invalid-memory-access-of-location-uzywajac-gwt/</link>
		<comments>http://xlab.pl/invalid-memory-access-of-location-uzywajac-gwt/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 19:33:23 +0000</pubDate>
		<dc:creator>Mateusz Kubiczek</dc:creator>
				<category><![CDATA[Programowanie Java]]></category>
		<category><![CDATA[Google Web Toolkit]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.xlab.pl/?p=669</guid>
		<description><![CDATA[Po zaktualizowaniu Safari do wersji 4.0.4 w systemie Mac OS możemy natrafić na bardzo nieprzyjemny błąd uruchamiając Hosted Mode GWT z Eclipse: Invalid memory access of location 00000010 eip=901a277b Odrobina googlowania podsunęła rozwiązanie: http://code.google.com/p/google-web-toolkit/issues/detail?id=4220#c22 Należy ściągnąć aktualny build WebKit pod MacOS stąd: http://nightly.webkit.org/ Otworzyć dwuklikająć plik .dmg, przeciągnąć WebKit do /Applications/ W Eclipse wybrać Run [...]]]></description>
			<content:encoded><![CDATA[<p>Po zaktualizowaniu Safari do wersji 4.0.4 w systemie Mac OS możemy natrafić na bardzo nieprzyjemny błąd uruchamiając Hosted Mode GWT z Eclipse:</p>
<blockquote><p>Invalid memory access of location 00000010 eip=901a277b</p></blockquote>
<p>Odrobina googlowania podsunęła rozwiązanie: <a href="http://code.google.com/p/google-web-toolkit/issues/detail?id=4220#c22">http://code.google.com/p/google-web-toolkit/issues/detail?id=4220#c22</a></p>
<ol>
<li>Należy ściągnąć aktualny build WebKit pod MacOS stąd: <a href=" http://nightly.webkit.org/"> http://nightly.webkit.org/</a></li>
<li>Otworzyć dwuklikająć plik .dmg, przeciągnąć WebKit do /Applications/</li>
<li>W Eclipse wybrać Run -> Run Configurations z menu.</li>
<li>Po lewej stronie wybrać naszą aplikację (pod Web Applications)</li>
<li>Wybrać zakłądkę &#8222;Environment&#8221;</li>
<li>Dodać zmienną:<br />
Name: DYLD_FRAMEWORK_PATH<br />
Value: /Applications/WebKit.app/Contents/Frameworks/10.5</li>
<li>Zapisać</li>
</ol>
<p>Problem powinien być rozwiązany.</p>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/invalid-memory-access-of-location-uzywajac-gwt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

