<?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>KoziołekWeb &#187; Java</title>
	<atom:link href="http://koziolekweb.pl/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://koziolekweb.pl</link>
	<description>Sięgam tam gdzie wzrok nie sięga, a tam NullPointerException</description>
	<lastBuildDate>Tue, 22 May 2012 11:25:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<image>\n<url>http://koziolekweb.pl/icon.png</url>\n<title>KoziołekWeb</title>\n<link>http://koziolekweb.pl</link>\n<width></width>\n<height></height>\n</image>\n		<item>
		<title>Eclipse, Maven i JasperReports</title>
		<link>http://koziolekweb.pl/2012/05/20/eclipse-maven-i-jasperreports/</link>
		<comments>http://koziolekweb.pl/2012/05/20/eclipse-maven-i-jasperreports/#comments</comments>
		<pubDate>Sun, 20 May 2012 21:32:43 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[JasperReports]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2558</guid>
		<description><![CDATA[      
      Mamy sobie projekt zarządzany za pomocą Mavena, edytowany w Eclipse w którym to projekcie jesteśmy zmuszeni korzystać z Jasper Reports. Sam silnik JR jest bardzo fajny i mi osobiście strasznie się podoba. W połączeniu z Eclipsem wychodzą niestety wszystkie wady tego ostatniego. Eclipse nie ma dobrego edytora wizualnego. Nigdy nie miał i jest to jego [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Mamy sobie projekt zarządzany za pomocą Mavena, edytowany w Eclipse w którym to projekcie jesteśmy zmuszeni korzystać z Jasper Reports. Sam silnik JR jest bardzo fajny i mi osobiście strasznie się podoba. W połączeniu z Eclipsem wychodzą niestety wszystkie wady tego ostatniego.<br />
Eclipse nie ma dobrego edytora wizualnego. Nigdy nie miał i jest to jego poważna przypadłość. Plugin JR kontynuuje tą złą tradycję. Zaczyna dodawać swoje atrybuty, jakieś cuda z edycją szablonów&#8230; generalnie ssie. Jeżeli nie chcemy użerać się z tym pluginem wystarczy użyć zwykłego edytora xml, który jest w Eclipse. No nie do końca&#8230; Pliki szablonów JR mają rozszerzenie <samp>jrxml</samp>, które jest traktowane w edytorze jako niewłaściwe. Nic nie pomaga kojarzenie plików z edytorem w konfiguracji. Po prostu edytor XML po załadowaniu pliku z rozszerzeniem innym niż xml zachowuje się jak zwykły notatnik.</p>
<p>Mamy jednak do dyspozycji Mavena i jego mechanizm pluginów:</p>
<p class="listing">Listing 1. Konfiguracja pluginu kompilatora JR</p>
<pre class="xml" name="code">
<plugin>
	<groupId>org.codehaus.mojo</groupId>
	<artifactId>jasperreports-maven-plugin</artifactId>
	<version>1.0-beta-2</version>
	<configuration>
		<outputDirectory>target/jasperreports/compiled</outputDirectory>
		<xmlValidation>true</xmlValidation>
		<sourceDirectory>src/main/resources/jasperreports</sourceDirectory>
		<sourceFileExt>xml</sourceFileExt>
	</configuration>
	<executions>
		<execution>
			<goals>
				<goal>compile-reports</goal>
			</goals>                                                       
<phase>compile</phase>
		</execution>
	</executions>
</plugin></pre>
<p>Nas interesuje opcja <samp>sourceFileExt</samp>, która pozwala na określenie jakie rozszerzenie ma plik z szablonem raportu. Dzięki temu można użyć plików z rozszerzeniem xml, które są prawidłowo edytowane w Eclipse.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/05/20/eclipse-maven-i-jasperreports/&amp;title=Eclipse%2C+Maven+i+JasperReports" title="dodaj 'Eclipse, Maven i JasperReports' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Eclipse, Maven i JasperReports' do Del.icio.us" alt="dodaj 'Eclipse, Maven i JasperReports' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/05/20/eclipse-maven-i-jasperreports/&amp;title=Eclipse%2C+Maven+i+JasperReports" title="dodaj 'Eclipse, Maven i JasperReports' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Eclipse, Maven i JasperReports' do digg" alt="dodaj 'Eclipse, Maven i JasperReports' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/05/20/eclipse-maven-i-jasperreports/" title="dodaj 'Eclipse, Maven i JasperReports' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Eclipse, Maven i JasperReports' do Technorati" alt="dodaj 'Eclipse, Maven i JasperReports' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/05/20/eclipse-maven-i-jasperreports/&amp;title=Eclipse%2C+Maven+i+JasperReports" title="dodaj 'Eclipse, Maven i JasperReports' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Eclipse, Maven i JasperReports' do Stumble Upon" alt="dodaj 'Eclipse, Maven i JasperReports' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/05/20/eclipse-maven-i-jasperreports/&amp;title=Eclipse%2C+Maven+i+JasperReports" title="dodaj 'Eclipse, Maven i JasperReports' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Eclipse, Maven i JasperReports' do Google Bookmarks" alt="dodaj 'Eclipse, Maven i JasperReports' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/05/20/eclipse-maven-i-jasperreports/&amp;t=Eclipse%2C+Maven+i+JasperReports" title="dodaj 'Eclipse, Maven i JasperReports' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Eclipse, Maven i JasperReports' do FaceBook" alt="dodaj 'Eclipse, Maven i JasperReports' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/05/20/eclipse-maven-i-jasperreports/&amp;title=Eclipse%2C+Maven+i+JasperReports" title="dodaj 'Eclipse, Maven i JasperReports' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Eclipse, Maven i JasperReports' do wykop.pl" alt="dodaj 'Eclipse, Maven i JasperReports' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/05/20/eclipse-maven-i-jasperreports/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Rozwiązanie zagadki projektowej numer 2</title>
		<link>http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/</link>
		<comments>http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/#comments</comments>
		<pubDate>Fri, 18 May 2012 19:33:23 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2552</guid>
		<description><![CDATA[      
      W tej zagadce należało rozpatrzyć dwie kwestie. Synchroniczność i asynchroniczność Mając pewną długą operację zazwyczaj musimy zdecydować czy ma być ona wykonana synchronicznie czy asynchronicznie. Oba podejścia są dobre. Wybór zależy zatem od konkretnego przypadku. Ogólnie jeżeli nie mamy jakiś obostrzeń to wybór metody asynchronicznej jest co do zasady odpowiedni. Metoda synchroniczna powinna zostać wybrana [...]]]></description>
			<content:encoded><![CDATA[      
      <p>W tej <a href="http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/">zagadce</a> należało rozpatrzyć dwie kwestie.</p>
<h4>Synchroniczność i asynchroniczność</h4>
<p>Mając pewną długą operację zazwyczaj musimy zdecydować czy ma być ona wykonana synchronicznie czy asynchronicznie. Oba podejścia są dobre. Wybór zależy zatem od konkretnego przypadku. Ogólnie jeżeli nie mamy jakiś obostrzeń to wybór metody asynchronicznej jest co do zasady odpowiedni. Metoda synchroniczna powinna zostać wybrana jeżeli w trakcie trwania danej operacji inne działania mogą wpłynąć na jej wynik. Względnie w przypadku aplikacji webowych jeżeli kolejne żądania mogą spowodować nieprawidłowe działanie aplikacji.<br />
Przykładowo dobrym miejscem na wykonanie akcji synchronicznej jest zdalna aktualizacja sterowników routera albo definicji raportu Jasper Reports. Czyli tam gdzie nie będziemy wstanie zagwarantować iż żądanie wysłane w trakcie operacji skończy się sukcesem.</p>
<h4>Ten sam JVM czy inny</h4>
<p>Jest to znacznie ciekawszy problem. Generalnie wszystko zależy od tego czy nasza operacja może doprowadzić do sytuacji w której JVM nie będzie mógł kontynuować pracy. Takich przypadków jest kilka.</p>
<h5>Brak pamięci</h5>
<p>Coraz rzadsza przypadłość. W czasach Javy 32bitowej i limitu niecałych 2GB na proces opłacało się wyrzucić ciężkie i pamięciożerne zadania do osobnego JVM. W razie wystąpienia wyjątku główny proces był nienaruszony. Dziś brak RAM dla JVM nie jest już problemem. Jak trzeba to się instaluje. Jak mało to się odpala coherence i współdzieli RAM pomiędzy maszynami.</p>
<h5>Przepełnienie stosu wywołań i nieskończone pętle</h5>
<p>W ogólności sytuacje gdzie zadanie idzie w przysłowiowe maliny. W takim wypadku siłowe ubicie procesu za pomocą SIGKILL jest zdecydowanie łatwiejsze niż próby ubicia wątku na działającym serwerze. </p>
<h5>Nadużywanie GC w czasie działania</h5>
<p>Sytuacja w której po zakończeniu pracy uruchamiany jest GC i radośnie sprząta&#8230; minutę, dwie&#8230; albo i więcej. Czasami tak bywa. Niestety uruchomienie GC może zablokować serwer&#8230; a to boli.</p>
<h4>Synchroniczność wywołania zewnętrznego JVM</h4>
<p>Mówiąc po polsku oczekiwanie na zakończenie uruchomionego procesu JVM. Zasady takie jak wymieniłem wyżej. Z tą różnicą, że opłaca się to robić tylko przy małej ilości użytkowników ponieważ osoby, które wyślą żądanie w trakcie działania procesu, ale nie wiedzą o jego uruchomieniu nie powinny spotykać się zbyt często z komunikatem w stylu &#8220;przerwa konserwacyjna&#8221;.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/&amp;title=Rozwi%C4%85zanie+zagadki+projektowej+numer+2" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Del.icio.us" alt="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/&amp;title=Rozwi%C4%85zanie+zagadki+projektowej+numer+2" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do digg" alt="dodaj 'Rozwiązanie zagadki projektowej numer 2' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Technorati" alt="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/&amp;title=Rozwi%C4%85zanie+zagadki+projektowej+numer+2" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Stumble Upon" alt="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/&amp;title=Rozwi%C4%85zanie+zagadki+projektowej+numer+2" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Google Bookmarks" alt="dodaj 'Rozwiązanie zagadki projektowej numer 2' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/&amp;t=Rozwi%C4%85zanie+zagadki+projektowej+numer+2" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do FaceBook" alt="dodaj 'Rozwiązanie zagadki projektowej numer 2' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/&amp;title=Rozwi%C4%85zanie+zagadki+projektowej+numer+2" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Rozwiązanie zagadki projektowej numer 2' do wykop.pl" alt="dodaj 'Rozwiązanie zagadki projektowej numer 2' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/05/18/rozwiazanie-zagadki-projektowej-numer-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wstrzykiwanie pól statycznych w Guice</title>
		<link>http://koziolekweb.pl/2012/05/15/wstrzykiwanie-pol-statycznych-w-guice/</link>
		<comments>http://koziolekweb.pl/2012/05/15/wstrzykiwanie-pol-statycznych-w-guice/#comments</comments>
		<pubDate>Tue, 15 May 2012 20:32:18 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Guice]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2542</guid>
		<description><![CDATA[      
      Czasami życie płata nam figla i należy jakoś obsłużyć sytuację, w której dana klasa ma pole statyczne wymagające wstrzyknięcia. Oczywiście takie sytuacje mają miejsce zazwyczaj wtedy gdy trafiamy na jakiś kod zastany, w którym jest burdel i chcemy w miarę niskim pozbyć się operatora new. Okazuje się, że obsłużenie takiej sytuacji w Guice jest dziecinnie [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Czasami życie płata nam figla i należy jakoś obsłużyć sytuację, w której dana klasa ma pole statyczne wymagające wstrzyknięcia. </p>
<p>Oczywiście takie sytuacje mają miejsce zazwyczaj wtedy gdy trafiamy na jakiś kod zastany, w którym jest burdel i chcemy w miarę niskim pozbyć się operatora new.</p>
<p>Okazuje się, że obsłużenie takiej sytuacji w Guice jest dziecinnie proste. Na poniższym listingu przykładowa konfiguracji wykonująca wstrzyknięcie statyczne:</p>
<p class="listing">Listing 1. Wstrzyknięcie statycznego pola.</p>
<pre class="java" name="code">public class SimpleUserModule extends AbstractModule {

	@Override
	protected void configure() {
		install(new FactoryModuleBuilder().implement(SimpleUser.class,
				SimpleUser.class).build(SimpleUserFactory.class));
		requestStaticInjection(SimpleUser.class);
	}

}</pre>
<p>Na listingu jest też konfiguracja dla <samp>Assisted Injection</samp>, ale o tym przy innej okazji. Jak widać samo wstrzyknięcie ogranicza się do wywołania dodatkowej metody. Jedyną rzeczą, o którą należy się martwić jest dostarczenie wszystkich zależności.</p>
<p>I na koniec mała sonda:</p>
<ul>
<li>ma być więcej krótkich wpisów, ale często.</li>
<li>ma być więcej długich wpisów, ale rzadziej.</li>
</ul>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/05/15/wstrzykiwanie-pol-statycznych-w-guice/&amp;title=Wstrzykiwanie+p%C3%B3l+statycznych+w+Guice" title="dodaj 'Wstrzykiwanie pól statycznych w Guice' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Wstrzykiwanie pól statycznych w Guice' do Del.icio.us" alt="dodaj 'Wstrzykiwanie pól statycznych w Guice' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/05/15/wstrzykiwanie-pol-statycznych-w-guice/&amp;title=Wstrzykiwanie+p%C3%B3l+statycznych+w+Guice" title="dodaj 'Wstrzykiwanie pól statycznych w Guice' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Wstrzykiwanie pól statycznych w Guice' do digg" alt="dodaj 'Wstrzykiwanie pól statycznych w Guice' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/05/15/wstrzykiwanie-pol-statycznych-w-guice/" title="dodaj 'Wstrzykiwanie pól statycznych w Guice' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Wstrzykiwanie pól statycznych w Guice' do Technorati" alt="dodaj 'Wstrzykiwanie pól statycznych w Guice' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/05/15/wstrzykiwanie-pol-statycznych-w-guice/&amp;title=Wstrzykiwanie+p%C3%B3l+statycznych+w+Guice" title="dodaj 'Wstrzykiwanie pól statycznych w Guice' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Wstrzykiwanie pól statycznych w Guice' do Stumble Upon" alt="dodaj 'Wstrzykiwanie pól statycznych w Guice' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/05/15/wstrzykiwanie-pol-statycznych-w-guice/&amp;title=Wstrzykiwanie+p%C3%B3l+statycznych+w+Guice" title="dodaj 'Wstrzykiwanie pól statycznych w Guice' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Wstrzykiwanie pól statycznych w Guice' do Google Bookmarks" alt="dodaj 'Wstrzykiwanie pól statycznych w Guice' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/05/15/wstrzykiwanie-pol-statycznych-w-guice/&amp;t=Wstrzykiwanie+p%C3%B3l+statycznych+w+Guice" title="dodaj 'Wstrzykiwanie pól statycznych w Guice' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Wstrzykiwanie pól statycznych w Guice' do FaceBook" alt="dodaj 'Wstrzykiwanie pól statycznych w Guice' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/05/15/wstrzykiwanie-pol-statycznych-w-guice/&amp;title=Wstrzykiwanie+p%C3%B3l+statycznych+w+Guice" title="dodaj 'Wstrzykiwanie pól statycznych w Guice' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Wstrzykiwanie pól statycznych w Guice' do wykop.pl" alt="dodaj 'Wstrzykiwanie pól statycznych w Guice' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/05/15/wstrzykiwanie-pol-statycznych-w-guice/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Java Slayer &#8211; Google Slayer</title>
		<link>http://koziolekweb.pl/2012/05/09/java-slayer-google-slayer/</link>
		<comments>http://koziolekweb.pl/2012/05/09/java-slayer-google-slayer/#comments</comments>
		<pubDate>Wed, 09 May 2012 10:50:51 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Java Slayer]]></category>
		<category><![CDATA[javac]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2526</guid>
		<description><![CDATA[      
      Pytanie zrodzone na liście WJUGu: Co stanie się jak będziemy chcieli skompilować takie coś: Listing 1. I co? public class App{ public static void main(String[] args) { System.out.println(sum(1,2,3)); } public static int sum(int...numbers) { int sum = 0; http://google.com for (int i = 0; i < numbers.length; i++) { sum += numbers[i]; } return sum; [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Pytanie zrodzone na liście WJUGu:</p>
<p>Co stanie się jak będziemy chcieli skompilować takie coś:</p>
<p class="listing">Listing 1. I co?</p>
<pre name="code" class="java">public class App{
	public static void main(String[] args) {
		System.out.println(sum(1,2,3));
	}                                             

	public static int sum(int...numbers) {
		int sum = 0;                              

http://google.com

		for (int i = 0; i < numbers.length; i++) {
			sum += numbers[i];
		}
		return sum;
	}                                             

}</pre>
<p>???</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/05/09/java-slayer-google-slayer/&amp;title=Java+Slayer+%26%238211%3B+Google+Slayer" title="dodaj 'Java Slayer &#8211; Google Slayer' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Java Slayer &#8211; Google Slayer' do Del.icio.us" alt="dodaj 'Java Slayer &#8211; Google Slayer' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/05/09/java-slayer-google-slayer/&amp;title=Java+Slayer+%26%238211%3B+Google+Slayer" title="dodaj 'Java Slayer &#8211; Google Slayer' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Java Slayer &#8211; Google Slayer' do digg" alt="dodaj 'Java Slayer &#8211; Google Slayer' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/05/09/java-slayer-google-slayer/" title="dodaj 'Java Slayer &#8211; Google Slayer' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Java Slayer &#8211; Google Slayer' do Technorati" alt="dodaj 'Java Slayer &#8211; Google Slayer' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/05/09/java-slayer-google-slayer/&amp;title=Java+Slayer+%26%238211%3B+Google+Slayer" title="dodaj 'Java Slayer &#8211; Google Slayer' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Java Slayer &#8211; Google Slayer' do Stumble Upon" alt="dodaj 'Java Slayer &#8211; Google Slayer' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/05/09/java-slayer-google-slayer/&amp;title=Java+Slayer+%26%238211%3B+Google+Slayer" title="dodaj 'Java Slayer &#8211; Google Slayer' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Java Slayer &#8211; Google Slayer' do Google Bookmarks" alt="dodaj 'Java Slayer &#8211; Google Slayer' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/05/09/java-slayer-google-slayer/&amp;t=Java+Slayer+%26%238211%3B+Google+Slayer" title="dodaj 'Java Slayer &#8211; Google Slayer' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Java Slayer &#8211; Google Slayer' do FaceBook" alt="dodaj 'Java Slayer &#8211; Google Slayer' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/05/09/java-slayer-google-slayer/&amp;title=Java+Slayer+%26%238211%3B+Google+Slayer" title="dodaj 'Java Slayer &#8211; Google Slayer' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Java Slayer &#8211; Google Slayer' do wykop.pl" alt="dodaj 'Java Slayer &#8211; Google Slayer' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/05/09/java-slayer-google-slayer/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Zagadka projektowa 2</title>
		<link>http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/</link>
		<comments>http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/#comments</comments>
		<pubDate>Mon, 07 May 2012 20:17:04 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Wzorce projektowe]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2520</guid>
		<description><![CDATA[      
      Kolejna zagadka najpierw jednak rozwiązanie poprzedniej zagadki. Który listener lepszy Oba są dobrym rozwiązaniem. Wybór powinien nastąpić w wyniku analizy polegającej na odpowiedzi na pytanie: Kto powinien decydować o tym, że dane zdarzenie zakończyło się sukcesem albo porażką? Jeżeli decyzję powinien podjąć klient to lepszym jest listener z listingu 1. Jeżeli to my decydujemy to [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Kolejna zagadka najpierw jednak rozwiązanie <a href="http://koziolekweb.pl/2012/05/05/zagadka-projektowa/">poprzedniej zagadki</a>.</p>
<h4>Który listener lepszy</h4>
<p>Oba są dobrym rozwiązaniem. Wybór powinien nastąpić w wyniku analizy polegającej na odpowiedzi na pytanie:</p>
<blockquote><p>Kto powinien decydować o tym, że dane zdarzenie zakończyło się sukcesem albo porażką?</p></blockquote>
<p>Jeżeli decyzję powinien podjąć klient to lepszym jest listener z listingu 1. Jeżeli to my decydujemy to oczywiście rozwiązanie z listingu 2.<br />
Istnieją jednak dwa wyjątki. Pierwszy to duże zróżnicowanie protokołów (zdarzeń powodujących wywołanie listenera) w tym przypadku lepszym rozwiązaniem jest druga wersja listenera. Działa ona wtedy jak adapter. Jeżeli jednak protokół jest jeden i jest dobrze zdefiniowany to pierwszy z listenerów jest wystarczający. Jego użycie upraszcza nasz kod.<br />
Drugi wyjątek to sytuacja w której nie interesuje nas treść zdarzenia, ale tylko fakt jego zaistnienia. Jest to typowa sytuacja dla listenerów o których mówił Daniel w swoim komentarzu &#8211; loggerów, ale też np. listenerów audytowych czy listenerów związanych z bezpieczeństwem. </p>
<h4>Zagadka właściwa</h4>
<p>Dzisiejsza zagadka jest trochę trudniejsza. Mamy do wykonania pewne długotrwale zadanie. Wiemy, że będzie ono wykonywało się bardzo długo w stosunku do oczekiwań użytkownika. Pytanie brzmi:</p>
<blockquote><p>Poniższa lista zawiera kilka modeli wykonania zadania. Czym będziesz kierować się przy wyborze konkretnego modelu?</p>
<ul>
<li>Wywołanie synchroniczne EBJ albo usługi działającej w ramach tego samego procesu JVM wraz ze zmianą konfiguracji aplikacji webowej tak by nie groził błąd HTTP 408 request timeout.</li>
<li>Wywołanie synchroniczne usługi działającej w ramach innego procesu JVM.</li>
<li>Wywołanie asynchroniczne EJB albo usługi działającej w ramach tego samego procesu JVM.</li>
<li>Wywołanie asynchroniczne usługi działającej w ramach innego procesu JVM.</li>
</ul>
</blockquote>
<p>Od razu mówię, ze wszystkie punkty mają sens. Twoim zadaniem jest wskazanie przykładowych sytuacji, w których zastosowanie poszczególnych rozwiązań jest najlepsze.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/&amp;title=Zagadka+projektowa+2" title="dodaj 'Zagadka projektowa 2' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Zagadka projektowa 2' do Del.icio.us" alt="dodaj 'Zagadka projektowa 2' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/&amp;title=Zagadka+projektowa+2" title="dodaj 'Zagadka projektowa 2' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Zagadka projektowa 2' do digg" alt="dodaj 'Zagadka projektowa 2' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/" title="dodaj 'Zagadka projektowa 2' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Zagadka projektowa 2' do Technorati" alt="dodaj 'Zagadka projektowa 2' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/&amp;title=Zagadka+projektowa+2" title="dodaj 'Zagadka projektowa 2' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Zagadka projektowa 2' do Stumble Upon" alt="dodaj 'Zagadka projektowa 2' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/&amp;title=Zagadka+projektowa+2" title="dodaj 'Zagadka projektowa 2' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Zagadka projektowa 2' do Google Bookmarks" alt="dodaj 'Zagadka projektowa 2' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/&amp;t=Zagadka+projektowa+2" title="dodaj 'Zagadka projektowa 2' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Zagadka projektowa 2' do FaceBook" alt="dodaj 'Zagadka projektowa 2' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/&amp;title=Zagadka+projektowa+2" title="dodaj 'Zagadka projektowa 2' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Zagadka projektowa 2' do wykop.pl" alt="dodaj 'Zagadka projektowa 2' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/05/07/zagadka-projektowa-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zagadka projektowa</title>
		<link>http://koziolekweb.pl/2012/05/05/zagadka-projektowa/</link>
		<comments>http://koziolekweb.pl/2012/05/05/zagadka-projektowa/#comments</comments>
		<pubDate>Sat, 05 May 2012 20:50:13 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Wzorce projektowe]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2512</guid>
		<description><![CDATA[      
      Dziś będzie &#8220;lajcik&#8221;. Mam dla was zagadkę projektową. Załóżmy, że mamy zaprojektować klasę służącą do komunikacji z pewną usługą. Przy czym usługa ta odpowiada na zadane pytania w taki sposób, że odpowiedź może interesować wiele obiektów w ramach aplikacji. Przykładem może być tu proste wciśnięcie przycisku do którego możemy przypisać wiele listenerów. Generalnie zatem mówiąc [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Dziś będzie &#8220;lajcik&#8221;. Mam dla was zagadkę projektową. Załóżmy, że mamy zaprojektować klasę służącą do komunikacji z pewną usługą. Przy czym usługa ta odpowiada na zadane pytania w taki sposób, że odpowiedź może interesować wiele obiektów w ramach aplikacji. Przykładem może być tu proste wciśnięcie przycisku do którego możemy przypisać wiele listenerów. Generalnie zatem mówiąc mamy do czynienia ze <a href="http://pl.wikipedia.org/wiki/Obserwator_(wzorzec_projektowy)" target="_blank" title="From Wikipedia the definition of: Obserwator_(wzorzec_projektowy)" class="wikiterm" >wzorcem obserwatora</a><sup class="wikiicon" ><em>W</em></sup>. Jest on przydatny w wielu sytuacjach. Zadać by się mogło nawet niezbyt oczywistych. Na wzorcu tym można budować interfejsy <a href="http://en.wikipedia.org/wiki/Service_provider_interface">SPI</a>, ale też wykorzystać go do rozluźnienia powiązań pomiędzy obiektami. W tym ostatnim przypadku można zastąpić tradycyjne wiązanie jeden do jednego wiązaniem jeden do wielu dzięki czemu można z łatwością wpinać się w różne miejsca aplikacji bez potrzeby jej modyfikowania.</p>
<p>Przykładowo tradycyjna aplikacja wykorzystująca formularze CUD (Create, Uprade, Delete) ma zazwyczaj podpięty jeden obiekt DAO, który realizuje poszczególne operacje. Co jednak gdy chcemy informować różne usługi o zmianach zachodzących w obiekcie? Chociażby zapisywać logi do celów audytowych czy statystycznych? Oczywiście można wprowadzać zmiany. Ba! Można do tego użyć programowania aspektowego i wstawiać aspekty w runtime&#8230; można&#8230; można też od początku stosować kolekcje usług i później dodawać/usuwać pojedyncze elementy. </p>
<p>Jednak nie o tym chciałem, choć temat ciekawy.</p>
<p>Mamy sobie do zaimplementowania listener dla pewnej usługi. Wywołanie usługi może zakończyć się na dwa sposoby sukcesem albo porażką (LOL odkrywcze). Teraz zagadka. </p>
<p>Na poniższych listingach przedstawiono dwa interfejsy listenera pewnej usługi. Pytanie brzmi, który z nich jest lepszym rozwiązaniem i w jakiej sytuacji:</p>
<p class="listing">Listing 1. Listener &#8220;jednometodowy&#8221;</p>
<pre class="java" name="code">interface ServiceListener{
    public void onEvent(Event e);
}</pre>
<p>Klasa <samp>Event</samp> zawiera odpowiedź usługi w czystej postaci (strumień, String, prymityw).</p>
<p class="listing">Listing 2. Listener &#8220;wielemetodowy&#8221;</p>
<pre class="java" name="code">interface ServiceListener{
    public void onSuccess(Response r);

    public void onError(Error e);
}</pre>
<p>Klasy <samp>Response</samp> i <samp>Error</samp> zawierają odpowiedź w czystej postaci, ale są wstępnie filtrowane tak by rozróżnić sukcesy i porażki.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/05/05/zagadka-projektowa/&amp;title=Zagadka+projektowa" title="dodaj 'Zagadka projektowa' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Zagadka projektowa' do Del.icio.us" alt="dodaj 'Zagadka projektowa' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/05/05/zagadka-projektowa/&amp;title=Zagadka+projektowa" title="dodaj 'Zagadka projektowa' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Zagadka projektowa' do digg" alt="dodaj 'Zagadka projektowa' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/05/05/zagadka-projektowa/" title="dodaj 'Zagadka projektowa' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Zagadka projektowa' do Technorati" alt="dodaj 'Zagadka projektowa' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/05/05/zagadka-projektowa/&amp;title=Zagadka+projektowa" title="dodaj 'Zagadka projektowa' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Zagadka projektowa' do Stumble Upon" alt="dodaj 'Zagadka projektowa' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/05/05/zagadka-projektowa/&amp;title=Zagadka+projektowa" title="dodaj 'Zagadka projektowa' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Zagadka projektowa' do Google Bookmarks" alt="dodaj 'Zagadka projektowa' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/05/05/zagadka-projektowa/&amp;t=Zagadka+projektowa" title="dodaj 'Zagadka projektowa' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Zagadka projektowa' do FaceBook" alt="dodaj 'Zagadka projektowa' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/05/05/zagadka-projektowa/&amp;title=Zagadka+projektowa" title="dodaj 'Zagadka projektowa' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Zagadka projektowa' do wykop.pl" alt="dodaj 'Zagadka projektowa' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/05/05/zagadka-projektowa/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin</title>
		<link>http://koziolekweb.pl/2012/05/03/uzyskiwanie-tokena-bezpieczenstwa-z-facebooka-w-aplikacji-vaadin/</link>
		<comments>http://koziolekweb.pl/2012/05/03/uzyskiwanie-tokena-bezpieczenstwa-z-facebooka-w-aplikacji-vaadin/#comments</comments>
		<pubDate>Thu, 03 May 2012 21:27:45 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Guice]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Vaadin]]></category>
		<category><![CDATA[Facebook]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2508</guid>
		<description><![CDATA[      
      Generalnie Vaadin strzela focha jak mu się chce majstrować przy przekierowaniach w oknie aplikacji. Nie jest to duży foch, ale wymaga od nas trochę pracy. Przygotowania Co należy mieć zanim w ogóle przejdziemy do pracy? Po pierwsze należy zarejestrować się jako deweloper do Facebooka. Następnie w zakładce &#8220;Aplikacje&#8221; tworzymy nową aplikację. Przechodzimy do jej konfiguracji [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Generalnie Vaadin strzela focha jak mu się chce majstrować przy przekierowaniach w oknie aplikacji. Nie jest to duży foch, ale wymaga od nas trochę pracy. </p>
<h4>Przygotowania</h4>
<p>Co należy mieć zanim w ogóle przejdziemy do pracy? Po pierwsze należy <a href="https://developers.facebook.com/">zarejestrować się</a> jako deweloper do Facebooka. Następnie w zakładce &#8220;Aplikacje&#8221; tworzymy nową aplikację. Przechodzimy do jej konfiguracji i oznaczamy jako &#8220;webside&#8221; podając URL aplikacji. Posiada ona kilka ważnych elementów:</p>
<ul>
<li><b>App ID/API Key</b> &#8211; unikalny identyfikator aplikacji.</li>
<li><b>App Secret</b> &#8211; &#8220;odcisk palca&#8221;, czyli tajny identyfikator.</li>
<li><b>Site URL</b> &#8211; adres aplikacji</li>
<li><b>Post-Authorize Redirect URL</b> &#8211; adres przekierowania po uzyskaniu tokena</li>
</ul>
<p>Najważniejsze na tej liście są adresy URL. Pierwszy z nich to adres na który skieruje nas FB jeżeli wybierzemy aplikację z menu &#8220;Aplikacje&#8221; w części użytkownika. Drugi to adres, na który zostanie przekierowane żądanie po uzyskaniu tokena (zgody użyszkodnika na dostęp do profilu).</p>
<h4>Po stronie Vaadin</h4>
<p>Przedstawię tu kilka luźnych klas, które łączę za pomocą Guice. </p>
<h5>Żądanie tokenu</h5>
<p>Tu nie ma zbyt dużo filozofii no może poza fochami Vaadin <img src='http://koziolekweb.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p class="listing">Listing 1. Przykładowy listener dla przycisku logowania</p>
<pre class="java" name="code">class SecuriedButtonClickListener implements ClickListener {

	private static final long serialVersionUID = 194416383513769075L;

	@Inject
	private Application myVaadinApplication;

	@Inject
	@Named("FB.appId")
	private String appId;

	@Inject
	@Named("FB.redirect")
	private String redirect;

	@Inject
	private Random random;

	@SecureAction
	public void buttonClick(ClickEvent event) {
	        myVaadinApplication.getMainWindow().addComponent(
				new Label("Thank you for clicking"));

		String target = "https://www.facebook.com/dialog/oauth?client_id="
				+ appId + "&#038;redirect_uri=" + redirect + "&#038;state="
				+ random.nextInt();
		myVaadinApplication.getMainWindow().open(new ExternalResource(target),
				"_top");
	}
}</pre>
<p>Ostatnia linijka najważniejsza. Generalnie Vaadin nie pozwala na otwieranie zasobów innych niż obrazki i pdfy w ramach dyrektywy <samp>_self</samp>. To jest ten mały foch. Gdy użyjemy <samp>_top</samp> bangla. Parametry są jasne no może poza ostatnim. Jest to tekstowy identyfikator żądania, który pozwala na identyfikację konwersacji pomiędzy serwerami FB, a naszą aplikacją. </p>
<h5>Obsługa odpowiedzi</h5>
<p>Tu też nie ma tu dużo filozofii. Vaadin udostępnia interfejs <samp>ParameterHandler</samp> służący do obsługi parametrów żądania. Dodajemy go do aplikacji. </p>
<p class="listing">Listing 2. Przykładowy listener dla odpowiedzi serwera</p>
<pre class="java" name="code">class StandardParameterHandler implements ParameterHandler {

	public void handleParameters(Map<String, String[]> parameters) {
		for (Map.Entry<String, String[]> entry : parameters.entrySet()) {
			System.out.println(entry.getKey() + "="
					+ Arrays.toString(entry.getValue()));
		}
	}
}</pre>
<p>Odpowiedzi serwera mogą być dwojakie. Pierwsza pojawia się w momencie gdy użytkownik zgodzi się na dostęp naszej strony do jego profilu. W takim wypadku parametry w odpowiedzi są dwa. Pierwszy <samp>state</samp> to nadany przez nas identyfikator. W Przypadku Vaadin jest on średnio przydatny ponieważ aplikacja zachowuje swój stan aż do wygaśnięcia sesji HTTP na serwerze zatem nawet po opuszczeniu okna aplikacji będzie ona wisiała przez pewien czas w pamięci i odpowiedź serwera zostanie poprawnie połączona z instancją. Drugi parametr nosi nazwę <samp>code</samp> i należy go traktować jako tymczasowy identyfikator użytkownika. Posłuży on wraz z <b>App Secret</b> do pobrania identyfikatora użytkownika służącego do pobierania danych z Open Graph.<br />
Drugi typ odpowiedzi pojawia się w momencie gdy użytkownik odmówił współpracy. W tym przypadku adres zwrotny będzie zawierał parametry <samp>state</samp>, <samp>error</samp>, <samp>error_reason</samp> i <samp>error_description</samp>, które opisują nam co dokładnie się stało.</p>
<h4>Podsumowanie</h4>
<p>Przedstawiłem tu wersję minimum. W takim przypadku użytkownik został zalogowany z pomocą FB, ale nie zostały pobrane żadne informacje o jego osobie. W takim przypadku użytkownik nadal musi wprowadzić wszelkie dane takie jak nick czy avatar. Jest to bardzo wygodna metoda jeżeli chcemy użytkownikom pozwolić na identyfikację, ale nie chcemy by podawali nam swoje dane.<br />
Należy pamiętać też o dwóch rzeczach. Pierwsza to żądanie minimum. Nie ma sensu proszenie użytkownika o udostępnianie danych jeżeli nie będziemy z nich korzystać. Druga to właściwe zabezpieczenie aplikacji. FB pozwala na identyfikację użytkownika, ale wszelkie elementy związane z zabezpieczeniem aplikacji, przyznawaniem uprawnień itp. nadal należy wykonać własnym sumptem. Logowanie z FB to tylko logowanie &#8211; username/password nic więcej.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/05/03/uzyskiwanie-tokena-bezpieczenstwa-z-facebooka-w-aplikacji-vaadin/&amp;title=Uzyskiwanie+tokena+bezpiecze%C5%84stwa+z+Facebooka+w+aplikacji+Vaadin" title="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do Del.icio.us" alt="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/05/03/uzyskiwanie-tokena-bezpieczenstwa-z-facebooka-w-aplikacji-vaadin/&amp;title=Uzyskiwanie+tokena+bezpiecze%C5%84stwa+z+Facebooka+w+aplikacji+Vaadin" title="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do digg" alt="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/05/03/uzyskiwanie-tokena-bezpieczenstwa-z-facebooka-w-aplikacji-vaadin/" title="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do Technorati" alt="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/05/03/uzyskiwanie-tokena-bezpieczenstwa-z-facebooka-w-aplikacji-vaadin/&amp;title=Uzyskiwanie+tokena+bezpiecze%C5%84stwa+z+Facebooka+w+aplikacji+Vaadin" title="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do Stumble Upon" alt="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/05/03/uzyskiwanie-tokena-bezpieczenstwa-z-facebooka-w-aplikacji-vaadin/&amp;title=Uzyskiwanie+tokena+bezpiecze%C5%84stwa+z+Facebooka+w+aplikacji+Vaadin" title="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do Google Bookmarks" alt="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/05/03/uzyskiwanie-tokena-bezpieczenstwa-z-facebooka-w-aplikacji-vaadin/&amp;t=Uzyskiwanie+tokena+bezpiecze%C5%84stwa+z+Facebooka+w+aplikacji+Vaadin" title="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do FaceBook" alt="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/05/03/uzyskiwanie-tokena-bezpieczenstwa-z-facebooka-w-aplikacji-vaadin/&amp;title=Uzyskiwanie+tokena+bezpiecze%C5%84stwa+z+Facebooka+w+aplikacji+Vaadin" title="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do wykop.pl" alt="dodaj 'Uzyskiwanie tokena bezpieczeństwa z Facebooka w aplikacji Vaadin' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/05/03/uzyskiwanie-tokena-bezpieczenstwa-z-facebooka-w-aplikacji-vaadin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zarządzanie modułami Guice za pomocą ServiceLoader</title>
		<link>http://koziolekweb.pl/2012/05/02/zarzadzanie-modulami-guice-za-pomoca-serviceloader/</link>
		<comments>http://koziolekweb.pl/2012/05/02/zarzadzanie-modulami-guice-za-pomoca-serviceloader/#comments</comments>
		<pubDate>Wed, 02 May 2012 21:54:30 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Geri]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Guice]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Gucie]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2502</guid>
		<description><![CDATA[      
      Skoro w tytule siedzi nazwa klasy to oznacza, że będzie mocno technicznie. Jednak nie tym razem Opis problemu Generalnie mamy sobie kilkanaście niezależnych modułów Gucie, które łączone w różny sposób tworzą naszą aplikację. Świetnym przykładem tego typu rozwiązań są wszelkie aplikacje oparte o pluginy jak chociażby CMSy czy CRMy. Rzecz w tym, że instalacja wszystkich [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Skoro w tytule siedzi nazwa klasy to oznacza, że będzie mocno technicznie. Jednak nie tym razem <img src='http://koziolekweb.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h4>Opis problemu</h4>
<p>Generalnie mamy sobie kilkanaście niezależnych modułów Gucie, które łączone w różny sposób tworzą naszą aplikację. Świetnym przykładem tego typu rozwiązań są wszelkie aplikacje oparte o pluginy jak chociażby CMSy czy CRMy. Rzecz w tym, że instalacja wszystkich wymaganych modułów może być kłopotliwa. Dlaczego? Skoro moduły są niezależne to problem z konfiguracją odkryjemy dopiero po starcie aplikacji w dodatku problem ten najprawdopodobniej zgłoszą użytkownicy. Objawy? Na przykład brak części usług i funkcjonalności. Oczywiście są testy, ale&#8230;</p>
<h4>Rozwiązanie</h4>
<p>Nazywa się <a href="http://pl.wikipedia.org/wiki/Geri_i_Freki" target="_blank" title="From Wikipedia the definition of: Geri i Freki" class="wikiterm" >Geri</a><sup class="wikiicon" ><em>W</em></sup> i jest moją propozycją na prosty moduł Guice. Co robi? Otóż wykorzystując mechanizm <samp>ServiceLoader</samp> wyszukuje i instaluje moduły Guice. W obecnej wersji jest to dość prymitywne rozwiązanie, które ma wiele wad, ale na pewno będę je rozwijał i zostaną one wyeliminowane.<br />
Do pobrania z Githuba > <a href="https://github.com/Koziolek/Geri">Geri na GitHub</a>. </p>
<h4>Sposób użycia</h4>
<p>Po pierwsze po stronie Guice wystarczy:</p>
<p class="listing">Listing 1. Użycie Geri</p>
<pre class="java" name="code">
Guice.createInjector(new GeriModule());
</pre>
<p>Jednak by to zadziałało trzeba odpowiednio przygotować swoje moduły.</p>
<ul>
<li>W <samp>META-INF</samp> tworzymy katalog <samp>services</samp></li>
<li>W nim plik o nazwie <samp>com.google.inject.Module</samp></li>
<li>W pliku umieszczamy pełną, kwalifikowaną nazwę klasy implementującą interfejs <samp>com.google.inject.Module</samp>.</li>
</ul>
<p>Moduł ma pewne ograniczenia:</p>
<ul>
<li>Powinien mieć konstruktor bezparametrowy.</li>
<li>Może mieć konstruktor domyślny.</li>
</ul>
<p>W przeciwnym wypadku całość posypie się z błędami z <samp>ServiceLoader</samp>.</p>
<p>Jeżeli chcemy ograniczyć możliwość ładowania modułów do ładowania ich z określonych <samp>ClassLoader</samp>ów to można wywołać Geri przekazując jako parametry konstruktora nasze <samp>ClassLoader</samp>y.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/05/02/zarzadzanie-modulami-guice-za-pomoca-serviceloader/&amp;title=Zarz%C4%85dzanie+modu%C5%82ami+Guice+za+pomoc%C4%85+ServiceLoader" title="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do Del.icio.us" alt="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/05/02/zarzadzanie-modulami-guice-za-pomoca-serviceloader/&amp;title=Zarz%C4%85dzanie+modu%C5%82ami+Guice+za+pomoc%C4%85+ServiceLoader" title="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do digg" alt="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/05/02/zarzadzanie-modulami-guice-za-pomoca-serviceloader/" title="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do Technorati" alt="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/05/02/zarzadzanie-modulami-guice-za-pomoca-serviceloader/&amp;title=Zarz%C4%85dzanie+modu%C5%82ami+Guice+za+pomoc%C4%85+ServiceLoader" title="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do Stumble Upon" alt="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/05/02/zarzadzanie-modulami-guice-za-pomoca-serviceloader/&amp;title=Zarz%C4%85dzanie+modu%C5%82ami+Guice+za+pomoc%C4%85+ServiceLoader" title="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do Google Bookmarks" alt="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/05/02/zarzadzanie-modulami-guice-za-pomoca-serviceloader/&amp;t=Zarz%C4%85dzanie+modu%C5%82ami+Guice+za+pomoc%C4%85+ServiceLoader" title="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do FaceBook" alt="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/05/02/zarzadzanie-modulami-guice-za-pomoca-serviceloader/&amp;title=Zarz%C4%85dzanie+modu%C5%82ami+Guice+za+pomoc%C4%85+ServiceLoader" title="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do wykop.pl" alt="dodaj 'Zarządzanie modułami Guice za pomocą ServiceLoader' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/05/02/zarzadzanie-modulami-guice-za-pomoca-serviceloader/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IoC Guice, a ręczne tworzenie (specyficznych) obiektów</title>
		<link>http://koziolekweb.pl/2012/05/01/ioc-guice-a-reczne-tworzenie-specyficznych-obiektow/</link>
		<comments>http://koziolekweb.pl/2012/05/01/ioc-guice-a-reczne-tworzenie-specyficznych-obiektow/#comments</comments>
		<pubDate>Tue, 01 May 2012 20:15:48 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Guice]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Dobre Praktyki]]></category>
		<category><![CDATA[IoC]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2500</guid>
		<description><![CDATA[      
      Pracuję dzielnie nad archetypem &#8211; stosem technologicznym dla mojej przyszłej działalności twórczej. Przy okazji naciąłem się na coś co już co najmniej dwa razy przerabiałem i nie powinienem mieć problemów. Na problem ręcznego tworzenia obiektów, których zależności są wstrzykiwane. Po co ręcznie tworzysz obiekty? Nie są to zwykłe obiekty, ale bardzo specyficzne &#8211; interceptory. Tworzymy [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Pracuję dzielnie nad archetypem &#8211; stosem technologicznym dla mojej przyszłej działalności twórczej. Przy okazji naciąłem się na coś co już co najmniej dwa razy przerabiałem i nie powinienem mieć problemów. Na problem ręcznego tworzenia obiektów, których zależności są wstrzykiwane. </p>
<h4>Po co ręcznie tworzysz obiekty?</h4>
<p>Nie są to zwykłe obiekty, ale bardzo specyficzne &#8211; interceptory. Tworzymy je w ramach metody <samp>configure</samp> z klasy <samp>AbstractModule</samp>. Musimy je stworzyć ręcznie i nasze pole manewru w tej dziedzinie jest ograniczone. Problem zaczyna się w momencie gdy:</p>
<ul style="list-style-type:armenian">
<li>Interceptor ma pewne zależności, które powinny być zarządzane przez kontener IoC.</li>
<li>Zależności te mają inny zasięg niż aplikacja.</li>
</ul>
<p>By wam nie było smutno &#8211; przykładzik:</p>
<p class="listing">Listing 1. Interceptor sprawdzający uprawnienia</p>
<pre class="java" name="code">class SecuredMethodInterceptor implements MethodInterceptor {

	@Inject
	private Subject subject;

	public Object invoke(MethodInvocation invocation) throws Throwable {
		if(subject.isAuthenticated()){
			System.out.println("OK");
		}
		return invocation.proceed();
	}
}</pre>
<p>Jeżeli zrobimy takie coś w aplikacji webowej gdzie <samp>subject<samp> ma ustawiony zakres na sesję to dostaniemy </p>
<p class="listing">Listing 2. Błąd konfiguracji kontenera IoC</p>
<pre class="bash" name="code">Error in custom provider, com.google.inject.OutOfScopeException: Cannot access scoped object. Either we are not currently inside an HTTP Servlet request, or you may have forgotten to apply com.google.inject.servlet.GuiceFilter as a servlet filter for this request.</pre>
<h4>Jak temu zaradzić?</h4>
<p>W takim wypadku należy zastosować wstrzyknięcie providera. Oczywiście problemem może być brak takowego, ale w takim przypadku należy zastosować Assisted Injection plus providera w ramach obiektu objętego danym zakresem. Sprawa skomplikowana i nie do końca przeze mnie obczajona. </p>
<p>Zatem prawidłowa klasa interceptora będzie wyglądać tak:</p>
<p class="listing">Listing 3. Interceptor sprawdzający uprawnienia v2</p>
<pre class="java" name="code">class SecuredMethodInterceptor implements MethodInterceptor {

	@Inject
	private Provider<Subject> subjectProvider;

	public Object invoke(MethodInvocation invocation) throws Throwable {
		Subject subject = subjectProvider.get();
		if(subject.isAuthenticated()){
			System.out.println("OK");
		}
		return invocation.proceed();
	}
}</pre>
<p>W takim wypadku wstrzyknięty provider sam zadba o odpowiedni zakres.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/05/01/ioc-guice-a-reczne-tworzenie-specyficznych-obiektow/&amp;title=IoC+Guice%2C+a+r%C4%99czne+tworzenie+%28specyficznych%29+obiekt%C3%B3w" title="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do Del.icio.us" alt="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/05/01/ioc-guice-a-reczne-tworzenie-specyficznych-obiektow/&amp;title=IoC+Guice%2C+a+r%C4%99czne+tworzenie+%28specyficznych%29+obiekt%C3%B3w" title="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do digg" alt="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/05/01/ioc-guice-a-reczne-tworzenie-specyficznych-obiektow/" title="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do Technorati" alt="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/05/01/ioc-guice-a-reczne-tworzenie-specyficznych-obiektow/&amp;title=IoC+Guice%2C+a+r%C4%99czne+tworzenie+%28specyficznych%29+obiekt%C3%B3w" title="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do Stumble Upon" alt="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/05/01/ioc-guice-a-reczne-tworzenie-specyficznych-obiektow/&amp;title=IoC+Guice%2C+a+r%C4%99czne+tworzenie+%28specyficznych%29+obiekt%C3%B3w" title="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do Google Bookmarks" alt="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/05/01/ioc-guice-a-reczne-tworzenie-specyficznych-obiektow/&amp;t=IoC+Guice%2C+a+r%C4%99czne+tworzenie+%28specyficznych%29+obiekt%C3%B3w" title="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do FaceBook" alt="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/05/01/ioc-guice-a-reczne-tworzenie-specyficznych-obiektow/&amp;title=IoC+Guice%2C+a+r%C4%99czne+tworzenie+%28specyficznych%29+obiekt%C3%B3w" title="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do wykop.pl" alt="dodaj 'IoC Guice, a ręczne tworzenie (specyficznych) obiektów' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/05/01/ioc-guice-a-reczne-tworzenie-specyficznych-obiektow/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Nie obfuskuj kodu&#8230; nigdy</title>
		<link>http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/</link>
		<comments>http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 20:26:59 +0000</pubDate>
		<dc:creator>Koziolek</dc:creator>
				<category><![CDATA[Antywzorce]]></category>
		<category><![CDATA[Inżynieria Oprogramowania]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaME]]></category>

		<guid isPermaLink="false">http://koziolekweb.pl/?p=2496</guid>
		<description><![CDATA[      
      Po raz kolejny na 4p pojawił się temat &#8220;jaki obfuskator&#8221;. I po raz kolejny odpowiedź brzmi &#8220;najlepiej żaden&#8221;. Generalnie współczesne obfuskatory potrafią robić kilka rzeczy poza samym zaciemnianiem nazw. Te są przydatne: Usuwanie nieużywanego kodu. Usuwanie informacji dla debuggera. Upraszczanie niektórych wyrażeń (shriking). Optymalizacja kodu m.n. wykorzystania zmiennych lokalnych. W efekcie możemy dostać kod mniejszy [...]]]></description>
			<content:encoded><![CDATA[      
      <p>Po raz kolejny na 4p pojawił się temat &#8220;jaki obfuskator&#8221;. I po raz kolejny odpowiedź brzmi &#8220;najlepiej żaden&#8221;.</p>
<p>Generalnie współczesne obfuskatory potrafią robić kilka rzeczy poza samym zaciemnianiem nazw. Te są przydatne:</p>
<ul>
<li>Usuwanie nieużywanego kodu.</li>
<li>Usuwanie informacji dla debuggera.</li>
<li>Upraszczanie niektórych wyrażeń (shriking).</li>
<li>Optymalizacja kodu m.n. wykorzystania zmiennych lokalnych.</li>
</ul>
<p>W efekcie możemy dostać kod mniejszy i trochę wydajniejszy, ale będziemy musieli za to zapłacić bardzo wysoką cenę. Jest nią możliwość utrzymania kodu. Skoro kod wyjściowy zostanie potraktowany refaktoryzacją Zmiana nazwy to w efekcie gdy otrzymany od klienta stacktrace stanie się ciekawą łamigłówką pt. &#8220;Co to za klasa się wyjebała&#8221;.<br />
Kolejną wadą jest utrata możliwości powtórnego użycia kodu. Obfuskowany jar, który zawiera zestaw metod narzędziowych&#8230; a ty siedzisz i piszesz wszytko od nowa <img src='http://koziolekweb.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
Na koniec należy też dodać utratę powiązania pomiędzy kodem, a dokumentacją. Wdrożenie nowego człowieka w projekt będzie bolesne&#8230; szczególnie jak mu się trafi obfuskowany stacktrace.</p>
<p>Zalety? Tak są. Obfuskatorów należy używać jeżeli piszemy na platformę JME albo Java Card i mamy ograniczenia co do ilości wyprodukowanego kodu. W takim wypadku warto użyć obfuskatora. Kolejną jest użycie obfuskatora z wyłączonym modułem zmiany nazw  w celu optymalizacji kodu. Zazwyczaj jest to upraszczanie wyrażeń (np. dodawania Stringów) lepsze wykorzystanie zmiennych lokalnych, usuwanie informacji dla debuggera czy martwego kodu. Czasami niewielkie zyski w tym zakresie są jak najbardziej pożądane. Przykładowo jeżeli uda nam się zmniejszyć wielkość paczki pobieranej przez klienta o 10% to dla 100MB jara wynik 10MB mniej na pobranie jest już znaczący zarówno dla naszych dysków jak i łączy.</p>
<p>Ale najważniejsze. Nie używajcie obfiskatorów. Najlepiej nigdy.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Dodaj do </em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/&amp;title=Nie+obfuskuj+kodu%26%238230%3B+nigdy" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Del.icio.us"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Del.icio.us" alt="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/&amp;title=Nie+obfuskuj+kodu%26%238230%3B+nigdy" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do digg"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do digg" alt="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Technorati"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Technorati" alt="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/&amp;title=Nie+obfuskuj+kodu%26%238230%3B+nigdy" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Stumble Upon"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/stumbleupon.png" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Stumble Upon" alt="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Stumble Upon" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/&amp;title=Nie+obfuskuj+kodu%26%238230%3B+nigdy" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Google Bookmarks"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/google.png" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Google Bookmarks" alt="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/&amp;t=Nie+obfuskuj+kodu%26%238230%3B+nigdy" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do FaceBook"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do FaceBook" alt="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.wykop.pl/dodaj?url=http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/&amp;title=Nie+obfuskuj+kodu%26%238230%3B+nigdy" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do wykop.pl"><img src="http://koziolekweb.pl/wp-content/plugins/social-bookmarking-reloaded/wykop.png" title="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do wykop.pl" alt="dodaj 'Nie obfuskuj kodu&#8230; nigdy' do wykop.pl" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://koziolekweb.pl/2012/04/30/nie-obfuskuj-kodu-nigdy/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

