<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8092343615208752185</id><updated>2024-10-25T05:02:19.706+02:00</updated><category term="java killers"/><category term="odkryte w boju"/><category term="personalne niebanalne"/><category term="ruby on rails"/><category term="SCA"/><category term="praca magisterska"/><category term="blog"/><category term="java"/><category term="netbeans"/><category term="oracle"/><category term="praca"/><category term="ruby"/><category term="glassfish"/><category term="how-to"/><category term="jboss"/><category term="latex"/><category term="lyx"/><category term="Google"/><category term="M$"/><category term="events"/><category term="jee"/><category term="jee5"/><category term="jruby"/><category term="maven"/><category term="news buzz"/><category term="project management"/><category term="tools dig"/><category term="wakacje"/><category term="wroclaw jug"/><title type='text'>Whatever, we all gonna die anyway</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>55</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-4055666635948877686</id><published>2009-07-08T08:58:00.001+02:00</published><updated>2010-08-05T21:47:02.603+02:00</updated><title type='text'>Krótsza wersja poprzedniego posta</title><content type='html'>Zapraszam tu:&lt;span style=&quot;font-weight: bold;&quot;&gt; &lt;a href=&quot;www.paulszulc.com&quot;&gt;www.paulszulc.com&lt;/a&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/4055666635948877686/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/4055666635948877686' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/4055666635948877686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/4055666635948877686'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2009/07/krotsza-wersja-poprzedniego-posta.html' title='Krótsza wersja poprzedniego posta'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-3920301159568072717</id><published>2009-05-13T21:30:00.001+02:00</published><updated>2010-08-05T21:47:38.595+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blog"/><title type='text'>svn merge -r:53:1</title><content type='html'>Bum Bum Bum, Bęc Bęc, Tadam: &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-weight: bold; &quot;&gt;&lt;a href=&quot;www.paulszulc.com&quot;&gt;www.paulszulc.com&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;A teraz szczegóły:&lt;br /&gt;&lt;br /&gt;Troszeczkę ponad rok temu zadebiutowałem z moim blogiem. Teraz po wypoceniu 53 postów nadchodzi dość poważna zmiana: &lt;span style=&quot;font-weight: bold;&quot;&gt;przechodzę na język angielski!&lt;/span&gt;&lt;br /&gt;Powiesz: język angielski? Już to kiedyś było... Zgadza się, pierwszy post jaki powstał na tym blogu, był w języku angielskim. Wtedy jednak Jacek Laskowski i Radek Holewa przekonali mnie, aby bloga prowadzić w języku polskim. Chociaż wciąż biłem się z myślami, w końcu decydowałem się na ojczysty język.&lt;br /&gt;&lt;br /&gt;To było rok, zatem skąd ta zmiana, czemu rollback do wersji 1? Coż, złożyło się na to kilka spraw.&lt;br /&gt;Nie bez znaczenia był wpis na blogu &lt;a href=&quot;http://pbadenski.blogspot.com/2009/03/keywords-vs-api-continued.html&quot;&gt;Pawła Badeńskiego&lt;/a&gt;, a tak naprawdę follow up do bloga &lt;a href=&quot;http://www.codinghorror.com/blog/archives/001248.html&quot;&gt;Jeff&#39;a Atwooda&lt;/a&gt;. Ten konkretny &lt;a href=&quot;http://www.codinghorror.com/blog/archives/001248.html&quot;&gt;post&lt;/a&gt; polecam przeczytać wszystkim, którzy piszą swoje blogi po polsku. Można się z nim zgadzać lub nie, mnie osobiście to przekonało całkowicie. To znaczy nawet nie tyle co mnie przekonało, a utwierdziło w przekonaniu.&lt;br /&gt;&lt;br /&gt;Po co pisać bloga technicznego? Jaki jest tego cel? Różni ludzie mają różne powody. Dla mnie najważniejsze były zawsze dwa: po pierwsze aby poznać przez niego jak najwięcej osób, po drugie aby dostać jak największy zastrzyk wiedzy. Każdy (no nie przesadzajmy, że każdy, ale powiedzmy każdy ciekawy) post na moim blogu powodował sprzężenie zwrotne. Dostawałem ogromny feedback od czytających (czy to w komentarzach czy w mailach). Napisać post to dopiero połowa frajdy z pisania bloga, obronić go potem przed krytyczną publiką, podyskutować, tu sie zaczyna prawdziwa jazda.&lt;br /&gt;&lt;br /&gt;Kiedy spojrze sobie na swoje staty, widze, jak często ludzie z całego świata, zachęceni jakimś hasłem na googlu, wchodzili na mojego bloga, żeby tylko przekonać się, że informacje, które poszukiwali są napisane w jakimś obcym dla nich języku. Miałem w ciągu dnia 50 wejść na strone, z czego 20 wejść trwało do 3 sekund maksymalnie. No bo co z tego, że Protugalczyk chciał wiedzieć jak zainstalować Oracla naUbuntu, skoro polskiego nie zna ani trochę? Czy nie zdażyło Wam się kiedykolwiek szukać odpowiedzi na jakiś rzadki problem i jedyne co google pokazywały to pojedyńcze forum w języku japońskim? Ta jedna jedyna odpowiedź w całym necie na dręczący Was problem, musiała być akurat napisana w &quot;ślaczkach&quot; I taka myśl tylko przychodzi wtedy do głowy: &quot;Czemu on kurde nie napisał tego po angielsku?!&quot;.&lt;br /&gt;I tu dochodzimy do sedna sprawy. Angielski stał się defacto takim esperanto świata IT. Trudno mi sobie wobraźć pracę w moim zawodzie bez znajomości tego języka choćby w czytaniu. Niedawno odbyta konferencja GeeCON2009 w Krakowie (za którą nota bene wielkie brawa dla organizatorów) uświadomiła mi, że tak naprawdę polscy programiści, znają język angielski bardzo dobrze. Jaki jest więc sens pisania po polsku?&lt;br /&gt;&lt;br /&gt;&quot;Polacy nie gęsi, też swój język mają&quot;. Prawda, ale ja prowadze blog techniczny, zawężony do konkretnej grupy osób, dla której nie ma już barier, granic. One po prostu nie istnieją. Może gdybym prowadził bloga o Wrocławiu, polskich lasach mieszanych, czy muzyce folklorystycznej Dolnego Śląska, wydawanie go po angielsku miałoby się z celem. Ale gdy pisze te moje wypociny, często zadając w postach, więcej pytań, niż dając odpowiedzi, czemu ograniczać mam grono słuchaczy,  skoro i tak wszyscy język angielski znają?&lt;br /&gt;&lt;br /&gt;Tak sobie myślę, że fajnie byłoby się pokłócić z jakimś Francuzem czy Chińczykiem o wyższkości Springa nad EJB (czy EJB nad Springa). Teraz mam nadzięję będę miał taką okazję :)&lt;br /&gt;Pytanie pozostaje tylko jedno, czy nowego bloga dodacie też do swoich RSSów? Mam cichą nadzieję, że tak :). Wystarczy wejść: &lt;a href=&quot;http://paulszulc.wordpress.com/&quot;&gt;http://paulszulc.wordpress.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Paweł Szulc&lt;br /&gt;&lt;br /&gt;PS. Pytanie czemu nagle wordpress.com a nie blogspot.com? Bo WordPress jest o niebo bardziej konfigurowalny, łatwiej zarządzalny i kilka fajnych rzeczy (jak staty wejść czy rssów) ma na starcie.</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/3920301159568072717/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/3920301159568072717' title='Komentarze (13)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/3920301159568072717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/3920301159568072717'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2009/05/svn-merge-r531.html' title='svn merge -r:53:1'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-2248867210567113685</id><published>2009-02-24T13:24:00.004+01:00</published><updated>2009-02-24T13:35:22.081+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="events"/><category scheme="http://www.blogger.com/atom/ns#" term="wroclaw jug"/><title type='text'>Pierwsze spotkanie Wrocław Java User Group</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7CgS8QLMnbvGdWTQ4ei-vmDmwQ2sHQklTJ27jsnXUx75Lg1ekNzvWGHV9sO78xG-ZPNLJsD2dYO7nIlHmnYGUTOlMfaY-qvPlIMqBfqqIBWW-suxdZ-3ifQDovyYS3yCb_70TNnTJX4o/s1600-h/wroclaw-jug-frame.png&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 111px; height: 200px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7CgS8QLMnbvGdWTQ4ei-vmDmwQ2sHQklTJ27jsnXUx75Lg1ekNzvWGHV9sO78xG-ZPNLJsD2dYO7nIlHmnYGUTOlMfaY-qvPlIMqBfqqIBWW-suxdZ-3ifQDovyYS3yCb_70TNnTJX4o/s200/wroclaw-jug-frame.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5306341243523829810&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Tak tak moi mili, w końcu doczekaliśmy się wrocławskiego JUGa! Od czasu jak skończyłem zabawę ze studiami na Politechnice Wrocławskiej (i pałeczkę nad PWrJUG przejął kto inny), zastanawiałem się czy i kiedy ruszyć z wrocławskim JUGiem. No i tyle czasu mi to zastanawianie się zajęło, że temat w końcu ruszył &lt;a href=&quot;http://pawelzubkiewicz.blogspot.com/&quot;&gt;ktoś inny&lt;/a&gt;, a mi pozostaje się już tylko przyłączyć. W głowie mam pełno pomysłów, jeśli chociaż połowe z nich uda się zrealizować, myślę, że będzie ciekawie.&lt;br /&gt;&lt;br /&gt;Poniżej oficjalne zaproszenie ze strony &lt;a href=&quot;http://groups.google.com/group/wroclaw-jug&quot;&gt;Wrocław JUG&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Witam,&lt;br /&gt;Mam ogromną przyjemność poinformować Was o powstaniu Wrocławskiej Grupy Użytkowników Technologii Java (tak, wreszcie ;-)&lt;br /&gt;&lt;br /&gt;Już w najbliższy wtorek 24 lutego o godzinie 18:30 w sali 119 Instytutu Informatyki Uniwersytetu Wrocławskiego odbędzie się nasze pierwsze spotkanie. Wszystkich serdecznie zapraszamy.&lt;br /&gt;&lt;br /&gt;Na początek Przemysław Pokrywka przybliży nam statycznie typizowaną wersję dobrze znanego wzorca builder. Wzorzec ten przeżywa teraz renesans popularności dzięki publikacjom Josha Blocha i oddźwięku w blogosferze. Nie radzi sobie jednak najlepiej z obsługą najbardziej skomplikowanych przypadków. Sprawdzenie poprawności parametrów tworzonego obiektu następuje późno - dopiero w czasie wykonania. Przemek przedstawi jego usprawnienie, dzięki któremu można zablokować możliwość tworzenia niepoprawnych obiektów już na etapie kompilacji. Pokaże, jak je wykorzystać na przykładzie zaczerpniętym z wrocławskiej rzeczywistości - czynności, która normalnie powinna być prosta, a została wspaniale skomplikowana - płatności za przedszkole :)&lt;br /&gt;&lt;br /&gt;Przemek programuje w Javie od 9 lat, od 4 lat komercyjnie. Interesują go tematy z kręgu OOP, refaktoryzacji, wzorców projektowych, podejścia funkcyjnego, AOSD, SCM, Linux, open-source, agile, lean.&lt;br /&gt;&lt;br /&gt;Z racji tego, że będzie to pierwsze spotkanie Wrocław JUG, po prelekcji Przemka zamierzamy omówić sprawy organizacyjne. Chcemy się przedstawić :-) , powiedzieć Wam jakie mamy plany i pomysły związane z Wrocław JUG. Wysłuchać Waszych opinii, pomysłów, dowiedzieć się jakie macie oczekiwania. Liczymy też na Waszą pomoc przy dalszym rozwijaniu całej inicjatywy.&lt;br /&gt;&lt;br /&gt;Przewidywany czas spotkanie to około 2 godziny. Wstęp wolny!&lt;br /&gt;&lt;br /&gt;Więcej informacji oraz aktualności związane z działalnością Wrocław JUG możecie znaleźć na www.wroclaw.jug.pl.&lt;br /&gt;&lt;br /&gt;Serdecznie zapraszam (w moim i moich kolegów imieniu)&lt;br /&gt;Paweł Zubkiewicz&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Z mojej strony powiem tyle: przybywajcie licznie, im więcej nas, tym lepiej dla wszystkich :)</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/2248867210567113685/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/2248867210567113685' title='Komentarze (5)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/2248867210567113685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/2248867210567113685'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2009/02/pierwsze-spotkanie-wrocaw-java-user.html' title='Pierwsze spotkanie Wrocław Java User Group'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7CgS8QLMnbvGdWTQ4ei-vmDmwQ2sHQklTJ27jsnXUx75Lg1ekNzvWGHV9sO78xG-ZPNLJsD2dYO7nIlHmnYGUTOlMfaY-qvPlIMqBfqqIBWW-suxdZ-3ifQDovyYS3yCb_70TNnTJX4o/s72-c/wroclaw-jug-frame.png" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-6017491879462829259</id><published>2009-01-29T13:00:00.003+01:00</published><updated>2009-01-29T13:27:15.721+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="how-to"/><category scheme="http://www.blogger.com/atom/ns#" term="jboss"/><category scheme="http://www.blogger.com/atom/ns#" term="jee"/><title type='text'>JBoss: jeden serwer, wiele domen</title><content type='html'>JBoss w standardowej konfiguracji przygotowany jest do pracy z jedną domeną. Oczywiście może obsługiwać więcej domen, ale wszystkie domeny dla danego serwera będą odwoływać się do tej samej instancji.&lt;br /&gt;Przykładowo załóżmy, że kupiliśmy dwie domeny dla naszych dwóch niezależnych biznesów:&lt;br /&gt;&lt;br /&gt;kwiaty-na-zamowienie.pl&lt;br /&gt;antypatia.pl&lt;br /&gt;&lt;br /&gt;Obie domeny wskazują na ten sam adres IP naszego serwera aplikacyjnego.&lt;br /&gt;&lt;br /&gt;Napisaliśmy dwie niezależne aplikacje wykorzystując J2EE i spakowaliśmy je do war&#39;ów lub ear&#39;ów, w naszym przykładzie kwiaty.war oraz antypatia.war. Jeśli wdrożymy je na serwer aplikacyjny, bedziemy mieli do nich dostep z adresów:&lt;br /&gt;&lt;br /&gt;http://kwiaty-na-zamowienie.pl/kwiaty&lt;br /&gt;http://antypatia.pl/antypatia&lt;br /&gt;&lt;br /&gt;Co jest nie tak z tym rozwiązaniem? Cóż, abstrachując narazie od faktu, że nikt nam nigdy nie wejdzie na naszą stronę (bo ludzie przezwyczajeni są do tego, iż w adresie wpisują tylko adres domeny (antypatia.pl, kwiaty-na-zamowienie.pl) i nie dopisują nic po slashu), musimy mieć jeszcze na uwadze, że takie adresy też będą działać:&lt;br /&gt;&lt;br /&gt;http://kwiaty-na-zamowienie.pl/&lt;span style=&quot;font-weight: bold;&quot;&gt;antypatia&lt;/span&gt;&lt;br /&gt;http://antypatia.pl/&lt;span style=&quot;font-weight: bold;&quot;&gt;kwiaty&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;a to już jest totalnie nie do zaakceptowania. O ile obie aplikacje są wdrożone na tym samym serwerze , o tyle chcielibyśmy http://kwiaty-na-zamowienie.pl przenosilo nas do aplikacji kwiaty.war, a http://antypatia.pl/&lt;span style=&quot;font-weight: bold;&quot;&gt; &lt;/span&gt;do aplikacji aplikacja.war.&lt;br /&gt;&lt;br /&gt;Na szczęście serwer JBoss obsługuje wirtualne serwery w ramach różnych domen. Innymi słowy jesteśmy wstanie&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt; tak skonfigurować serwer aplikacyjny, aby obługiwał żądania w zależności od tego z jaką domeną będzie każdorazowo żadanie powiązane.&lt;br /&gt;Konfirgurację tą przeprowadzamy w pliku server.xml (gdzie znaleźć ten plik pisałem w &lt;a href=&quot;http://paulszulc.blogspot.com/2008/11/zmiana-portu-jboss-application-server-z.html&quot;&gt;poście o zmianie defaultowego portu w JBossie&lt;/a&gt;). Cały trik polega na dodaniu tagów &amp;lt;Host&amp;gt; dla każdego wirtualnego serwera, który chcemy obsługiwać. Tak więc, aby obsłużyć dwie wspomniane już wcześniej domeny należy:&lt;br /&gt;&lt;br /&gt;1. w pliku server.xml dodać:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;programlisting&quot;&gt;&amp;lt;Server&gt;&lt;br /&gt;&lt;br /&gt;(...)&lt;br /&gt; &amp;lt;Engine name=&quot;jboss.web&quot; defaultHost=&quot;vhost1&quot;&gt;&lt;br /&gt;    &amp;lt;Realm className=&quot;org.jboss.web.tomcat.security.JBossSecurityMgrRealm&quot;&lt;br /&gt;           certificatePrincipal=&quot;org.jboss.security.auth.certs.SubjectDNMapping&quot;&lt;br /&gt;       /&gt;&lt;br /&gt;    &amp;lt;Logger className=&quot;org.jboss.web.tomcat.Log4jLogger&quot;&lt;br /&gt;            verbosityLevel=&quot;WARNING&quot;&lt;br /&gt;            category=&quot;org.jboss.web.localhost.Engine&quot;/&gt;&lt;br /&gt;&lt;br /&gt;       &amp;lt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Host name=&quot;kwiaty&quot;&lt;/span&gt; autoDeploy=&quot;true&quot;&lt;br /&gt;             deployOnStartup=&quot;true&quot; deployXML=&quot;true&quot;&gt;&lt;br /&gt;           &amp;lt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Alias&gt;kwiaty-na-zamowienie.pl&lt;/span&gt;&lt;br /&gt;           &amp;lt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Alias&gt;www.kwiaty-na-zamowienie.pl&lt;/span&gt;&lt;br /&gt;           &amp;lt;Valve className=&quot;org.apache.catalina.valves.AccessLogValve&quot;&lt;br /&gt;                  prefix=&quot;vhost1&quot; suffix=&quot;.log&quot; pattern=&quot;common&quot;&lt;br /&gt;                  directory=&quot;${jboss.server.home.dir}/log&quot;/&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;           &amp;lt;DefaultContext cookies=&quot;true&quot; crossContext=&quot;true&quot; override=&quot;true&quot;/&gt;&lt;br /&gt;       &amp;lt;/Host&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;            &lt;/span&gt;&amp;lt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Host name=&quot;antypatia&quot;&lt;/span&gt; autoDeploy=&quot;true&quot;&lt;br /&gt;             deployOnStartup=&quot;true&quot; deployXML=&quot;true&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;                &lt;/span&gt;&amp;lt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Alias&gt;www.antypatia.pl&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;                &lt;/span&gt;&amp;lt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Alias&gt;antypatia.pl  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;           &amp;lt;Valve className=&quot;org.apache.catalina.valves.AccessLogValve&quot;&lt;br /&gt;                  prefix=&quot;vhost2&quot; suffix=&quot;.log&quot; pattern=&quot;common&quot;&lt;br /&gt;                  directory=&quot;${jboss.server.home.dir}/log&quot;/&gt;&lt;br /&gt;&lt;br /&gt;           &amp;lt;DefaultContext cookies=&quot;true&quot; crossContext=&quot;true&quot; override=&quot;true&quot;/&gt;&lt;br /&gt;      &amp;lt;/Host&gt;&lt;br /&gt; &amp;lt;/Engine&gt;&lt;br /&gt;&amp;lt;/Service&gt;&lt;br /&gt;&amp;lt;/Server&gt;&lt;/pre&gt;2. powiadomić każdą z aplikacji do jakiego serwera wirtualnego należą&lt;br /&gt;&lt;br /&gt;W tym celu wystarczy w pliku jboss-web.xml dodać wpis (na przykładzie aplikacji antypatia.pl):&lt;br /&gt;&lt;pre&gt;&lt;pre class=&quot;programlisting&quot;&gt;&amp;lt;jboss-web&gt;&lt;br /&gt;&amp;lt;virtual-host&gt;antypatia.pl&amp;lt;/virtual-host&gt;&lt;br /&gt;&amp;lt;/jboss-web&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;Na koniec aby nasza strona była widoczna z adres www.antypatia.pl a nie z www.antypatia.pl/antypatia, zmieniamy contextRoot na /.&lt;br /&gt;&lt;br /&gt;Aby tego dokonać należy:&lt;br /&gt;&lt;br /&gt;a) w przypadku aplikacji webowych będących poza plikiem .ear ponownie wyedytować plik i dodac wpis&lt;br /&gt;&lt;pre&gt;&lt;pre class=&quot;programlisting&quot;&gt;&amp;lt;jboss-web&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot; class=&quot;bold&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot; class=&quot;bold&quot;&gt;context-root&gt;/&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot; class=&quot;bold&quot;&gt;/context-root&gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;virtual-host&gt;antypatia.pl&amp;lt;/virtual-host&gt;&lt;br /&gt;&amp;lt;/jboss-web&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;b) w przypadku aplikacji pakowanych do pliku .ear&lt;br /&gt;&lt;br /&gt;* wyedytować plik wdrożeniowy application.xml&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;pre class=&quot;programlisting&quot;&gt;&amp;lt;application xmlns=&quot;http://java.sun.com/xml/ns/j2ee&quot; version=&quot;1.4&quot;&lt;br /&gt;&lt;br /&gt;(...)&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;programlisting&quot;&gt;&amp;lt;module&gt;        &lt;/pre&gt;&lt;pre class=&quot;programlisting&quot;&gt;   &amp;lt;ejb&gt;antypatia.jar    &lt;/pre&gt;&lt;pre class=&quot;programlisting&quot;&gt;&amp;lt;/module&gt;    &lt;/pre&gt;&lt;pre class=&quot;programlisting&quot;&gt;&amp;lt;module&gt;        &lt;/pre&gt;&lt;pre class=&quot;programlisting&quot;&gt;   &amp;lt;web&gt;            &lt;/pre&gt;&lt;pre class=&quot;programlisting&quot;&gt;     &amp;lt;web-uri&gt;web-client.war&amp;lt;/web-uri&gt;            &lt;/pre&gt;&lt;pre class=&quot;programlisting&quot;&gt;     &amp;lt;&lt;span class=&quot;bold&quot;&gt;&lt;b&gt;context-root&gt;/&lt;/b&gt;&lt;/span&gt;&amp;lt;&lt;span class=&quot;bold&quot;&gt;&lt;b&gt;/context-root&gt;&lt;/b&gt;&lt;/span&gt;        &lt;/pre&gt;&lt;pre class=&quot;programlisting&quot;&gt;   &amp;lt;/web&gt;    &lt;/pre&gt;&lt;pre class=&quot;programlisting&quot;&gt;&amp;lt;/module&gt;&lt;br /&gt;&lt;pre class=&quot;programlisting&quot;&gt;&lt;pre class=&quot;programlisting&quot;&gt;&amp;lt;/application&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;Jesli naszego .eara budujemy przez Mavena, odpowiednik powyższego wpisu znajdziemy w POMie.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;referencje:&lt;br /&gt;&lt;a href=&quot;http://docs.jboss.org/jbossas/guides/webguide/r2/en/html/ch07.html#ch9.virtualhost.ex&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;http://docs.jboss.org/jbossas/guides/webguide/r2/en/html/ch07.html#ch9.virtualhost.ex&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://docs.jboss.org/jbossas/guides/webguide/r2/en/html/ch06.html&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;http://docs.jboss.org/jbossas/guides/webguide/r2/en/html/ch06.html&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://ranjankumar.com/2008/08/14/how-to-set-context-root-of-web-application-in-jboss/&quot;&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;http://ranjankumar.com/2008/08/14/how-to-set-context-root-of-web-application-in-jboss/&lt;/span&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/6017491879462829259/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/6017491879462829259' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/6017491879462829259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/6017491879462829259'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2009/01/jboss-jeden-serwer-wiele-domen.html' title='JBoss: jeden serwer, wiele domen'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-3035670186700355210</id><published>2009-01-28T07:51:00.004+01:00</published><updated>2009-01-28T08:14:14.897+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="news buzz"/><title type='text'>News Buzz: 28 styczeń 2009</title><content type='html'>Kilka ciekawych artykułów znalezionych w sieci:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://blog.xebia.com/2009/01/26/git-101/&quot;&gt;GIT: kompedium wiedzy&lt;/a&gt; -   GIT to repozytorium kodu stworzone przez Linusa Torvaldsa (tak, ten gość od Linuxa), które zbiera ostatnimi czasy coraz większe rzesze zwolenników. Główne zalety to szybkość, rozproszona struktura oraz cudowne podejście do branch&#39;y (jeśli kolejny dzień klniesz na svn, bo znów rzucił jakiś konflikt przy zwykłym margeu, zapoznaj sie z GITem - tu wszystko od poczatku do konca jest branchem i marge działają o niebo lepiej). W tym poście autor zebrał ogromną ilość linków do najróżniejszych zasobów w sieci odnoszących się do GITa. Gorąco polecam.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://agileartisans.com/main/blog/149&quot;&gt;Optimize Your Team&lt;/a&gt; - ciekawy i relatywnie krótki post odnoszący się do metodyk zwinnych. Trendy, których w polskich firmach IT pewnie jeszcze długo nie zobaczymy&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.carlobonamico.com/blog/2009/01/27/slides-for-the-maven2-in-the-real-world-talk-javaday-2009/&quot;&gt;Maven 2 advanced&lt;/a&gt; - jak mówi sam autor, w sieci jest trylion tutoriali pokazujących podstawy Mavena, o wiele mniej artykułów odnośnie ciutke bardziej skomplikowanych przykładów niż przysłowiowe Hallo world. Pokaz slajdów ze spotkania włoskiego JUG Roma.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.infoq.com/news/2009/01/jpa20&quot;&gt;JEE6 - JPA 2.0&lt;/a&gt; - aby być na czasie i wiedzieć w jakim kierunku zmierza enterprise Java, zachęcam do zapoznania się z tym krótkim wpisem&lt;/li&gt;&lt;/ul&gt;Miłego czytania :)</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/3035670186700355210/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/3035670186700355210' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/3035670186700355210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/3035670186700355210'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2009/01/news-buzz-28-styczen-2009.html' title='News Buzz: 28 styczeń 2009'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-7614731052999151261</id><published>2009-01-27T08:20:00.004+01:00</published><updated>2009-08-12T09:39:46.029+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="odkryte w boju"/><title type='text'>Unable to find valid certification path to requested target</title><content type='html'>--------------------------&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://paulszulc.wordpress.com/2009/08/05/headache-pill-unable-to-find-valid-certification-path-to-requested-target/&quot;&gt;Unable to find valid certification path &lt;/a&gt;in English&lt;br /&gt;&lt;br /&gt;--------------------------&lt;br /&gt;&lt;br /&gt;Jeśli nawiązujecie połączenie z usługą sieciową (web service) poprzez https (czyli z użyciem SSL) natrafić możecie na dość znany wyjątek:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Oznacza to tyle, że łączymy się z usługą przez SSL i nie znamy lub nie akceptujemy certyfikatu uwierzytelniającego tej usługi. Gdybyśmy łączyli się ze stroną www przez przeglądarkę, wyskoczyłoby nam znane okienko informujące nas, że połączenie nie może być nawiązane, gdyż (cytując Firefox&#39;a) &quot;certyfikat nie jest zaufany, ponieważ certyfikat wystawcy nie jest zaufany.&quot;. Wtedy najczęściej klikamy &quot;Zaufaj witrynie&quot; lub &quot;Potwierdź wyjątek bezpieczeństwa&quot; i już możemy oglądać naszą witrynę w bezpiecznym połączeniu SSL.&lt;br /&gt;&lt;br /&gt;W przypadku programów napisanych w języku Java, nie mamy pewności, że zawsze po drugiej stronie aplikacji będzie siedział użytkownik, który kliknie &quot;Potwierdź wyjątek bezpieczeństwa&quot;. Dlatego, aby aplikacja łączyła się zawsze poprawnie przez SSL, należy wcześniej ten &quot;wyjątek&quot; potwierdzić.&lt;br /&gt;Najprostszym sposobem jest wygenerowanie tak zwanego keystore&#39;a dla danego certyfikatu i potem użycie go w aplikacji. Robi się to w sposób następujący:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;1. wygenerowanie pliku .cer&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Jest to plik reprezentujący certyfikat. Często jest udostępniany przez firmę, z której serwerem łączymy się przez SSL. Jeśli jednak nie mamy do niego dostępu najprościej go zdobyć wchodząc na dany adres usługi (ten adres uslugi, z która później ma łączyć się nasza aplikacja) poprzez dowolną przeglądarkę. Potwierdzić certyfikat, następnie odnaleźć go w ustawieniach przeglądarki i na końcu wyeksportować do pliku .cer. Większość przeglądarek (na pewno Firefox i Opera) udostępniają taką funkcjonalność.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;2. wygenerować keystore&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Keystore możemy wygenerować wraz z narzędziem keytool, które dostępne mamy zawsze wraz z naszym JDK. Wywołujemy ten program w konsoli w sposób następujący:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size:smaller;&quot;&gt;&lt;span style=&quot;font-family:Courier New;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;keytool&lt;/span&gt; -import -trustcacerts &lt;span style=&quot;font-weight: bold;&quot;&gt;-keystore cacerts&lt;/span&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;-storepass twoje_haslo&lt;/span&gt; -noprompt -file &lt;span style=&quot;font-weight: bold;&quot;&gt;cert.cer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;gdzie: -file to wygenerowany w punkcie pierwszym plik .cer, -keystore to nazwa pliku keystore (może być dowolna), -storepass to hasło które będzie używane wraz z danym keystorem.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;3. ustawienie propertiesów&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Na końcu należy wygenerowany plik keystore (w naszym przypadku nazywa się cacerts) wrzucić do katalogu naszej aplikacji, a w samym kodzie ustawić dwa dodatkowe propertiesy:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;            System.setProperty(&quot;javax.net.ssl.trustStore&quot;, &quot;cacerts&quot;);&lt;br /&gt;            System.setProperty(&quot;javax.net.ssl.trustStorePassword&quot;, &quot;twoje_haslo&quot;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Od tego momentu powinniśmy bez problemów łączyć się z dowolną bramką webservicową (czy też jakąkolwiek usługą w sieci) poprzez SSL.&lt;br /&gt;&lt;br /&gt;Referencje:&lt;br /&gt;&lt;a href=&quot;http://wso2.org/forum/thread/3018&quot;&gt;http://wso2.org/forum/thread/3018&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://blogs.sun.com/andreas/entry/no_more_unable_to_find&quot;&gt;http://blogs.sun.com/andreas/entry/no_more_unable_to_find&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/7614731052999151261/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/7614731052999151261' title='Komentarze (7)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/7614731052999151261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/7614731052999151261'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2009/01/unable-to-find-valid-certification-path.html' title='Unable to find valid certification path to requested target'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-5696820246672117701</id><published>2009-01-22T12:35:00.002+01:00</published><updated>2009-01-22T12:48:05.430+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java killers"/><title type='text'>Java Killers #10</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIGIqott-jQcNO2C1F_ugd8UVsMinmTyBZKtRSQoNFhikdPYszBSjtwlwQmxdCfBRPne6-PL_BYT7Qm39rTjlQaHi0UiKG8QAiapR6Jc3nIUgCuVJYl8ODl2TuLVXiTPmaguhZMrPqKQ4/s1600-h/hitman.jpg&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 120px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIGIqott-jQcNO2C1F_ugd8UVsMinmTyBZKtRSQoNFhikdPYszBSjtwlwQmxdCfBRPne6-PL_BYT7Qm39rTjlQaHi0UiKG8QAiapR6Jc3nIUgCuVJYl8ODl2TuLVXiTPmaguhZMrPqKQ4/s200/hitman.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5294081815761726802&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Dziejszy Java Killer prosty i  niezbyt wyrafinowany. Ależ jak wiele bólu może dostarczyć, gdy taki kod dostanie się na produkcje, wie tylko programista, który to przeżył...&lt;br /&gt;No dobra, nie jest, aż tak tragicznie, ale mimo wszystko boli. Pytanie na dziś, co wypisze na konsoli działanie poniższego programu:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;&lt;br /&gt;SortedSet&lt;string&gt; names = new TreeSet&lt;string&gt;();&lt;br /&gt;&lt;br /&gt;names.add(&quot;Gąskalska Anna&quot;);&lt;br /&gt;names.add(&quot;Enigmatyczna Jola&quot;);&lt;br /&gt;names.add(&quot;Ambroży Tomasz&quot;);&lt;br /&gt;names.add(&quot;Ędward Ącki&quot;);&lt;br /&gt;&lt;br /&gt;System.out.println(names);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/string&gt;&lt;/string&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Odpowiedzi możliwych kilka, a prawdziwa jak zwykle tylko jedna:&lt;br /&gt;&lt;br /&gt;A) [Gąskalska Anna]&lt;br /&gt;B) [Ambroży Tomasz, Enigmatyczna Jola, Gąskalska Anna, Ędward Ącki]&lt;br /&gt;C) [Ambroży Tomasz, Enigmatyczna Jola, Ędward Ącki, Gąskalska Anna ]&lt;br /&gt;D) [Ambroży Tomasz, Ędward Ącki, Enigmatyczna Jola, Gąskalska Anna ]&lt;br /&gt;E) java.util.SortedSet@122cdb6&lt;br /&gt;F) błąd kompilacji&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFoFEPVR2zMCXNglrQcH19TozRmHLtN-3DHoqyKc9RmIVvFZqtOFqbWavmEqbbDX0wyZx5mBpQY3Kr0u-hhKhZAaoF763TU3L29MuR0LRFOyb0qsvqD_xOVrDtHK7AfY2kWa3N966DUnk/s1600-h/hitman-answer.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFoFEPVR2zMCXNglrQcH19TozRmHLtN-3DHoqyKc9RmIVvFZqtOFqbWavmEqbbDX0wyZx5mBpQY3Kr0u-hhKhZAaoF763TU3L29MuR0LRFOyb0qsvqD_xOVrDtHK7AfY2kWa3N966DUnk/s320/hitman-answer.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5294082108296466482&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Otóż okazuje się, że prawidłowa odpowiedź to:&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;B)  [Ambroży Tomasz, Enigmatyczna Jola, Gąskalska Anna, Ędward Ącki]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Jak to!? Przecież miała być lista posortowana alfbatecznie! Co jest grane? Cóż, program zachowuje się zgodnie ze specyfikacją, gdzie wyraźnie czytamy:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Method comparesTo (...) compares two strings lexicographically. The comparison is &lt;span style=&quot;font-weight: bold;&quot;&gt;based on the Unicode&lt;/span&gt; value of each character in the strings. (...) Method compareTo returns the difference of the two character values at position &lt;code&gt;k&lt;/code&gt; in the two string -- that is, the value this.charAt(k)-anotherString.charAt(k).&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;A jak przyjrzymy się znakom Unicode, polskie krzaczki mają wartości o niebo większe od standardowych literek z alfabetu łacińskiego. I tak ę, ą, ć, ń, ż, ź, ś, ó oraz ł będzie zawsze stać za całą resztą abecadła.&lt;br /&gt;Miejscie to prosze na uwadze, sortując swoje listy :)</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/5696820246672117701/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/5696820246672117701' title='Komentarze (13)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/5696820246672117701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/5696820246672117701'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2008/11/java-killers-10.html' title='Java Killers #10'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIGIqott-jQcNO2C1F_ugd8UVsMinmTyBZKtRSQoNFhikdPYszBSjtwlwQmxdCfBRPne6-PL_BYT7Qm39rTjlQaHi0UiKG8QAiapR6Jc3nIUgCuVJYl8ODl2TuLVXiTPmaguhZMrPqKQ4/s72-c/hitman.jpg" height="72" width="72"/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-4872838273875695451</id><published>2009-01-21T08:40:00.000+01:00</published><updated>2009-01-21T08:52:26.759+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="odkryte w boju"/><category scheme="http://www.blogger.com/atom/ns#" term="oracle"/><title type='text'>Oracle Application Server (Apex) nie wstaje</title><content type='html'>Instalując Oracla na Ubuntu natknąłem się na ciekawą sytuację. Instancja bazy była uruchomiona, jednakże nie mogłem połączyć się z Application Serverem (a konkretnie z aplikacja apex, zarządzającą bazą danych). Ponieważ podobną sytuację spotkałem na dwóch różnych kompach, pomyślałęm, że podziele się wiedzą jak wyjść z takiego impasu.&lt;br /&gt;&lt;br /&gt;Ponieważ żadnym Oraclowym ekspertem nie jestem, zrobiłem to co wydawało się intuicyjne:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;1. sprawdziłem status&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;pawel@ingrid:~$ &lt;/span&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;sudo /etc/init.d/oracle-xe status&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;[sudo] password for pawel:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 03-NOV-2008 19:35:13&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Copyright (c) 1991, 2005, Oracle.  All rights reserved.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_XE)))&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;TNS-12541: TNS:no listener&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt; TNS-12560: TNS:protocol adapter error&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;  TNS-00511: No listener&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;   Linux Error: 111: Connection refused&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ingrid)(PORT=1521)))&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;TNS-12541: TNS:no listener&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt; TNS-12560: TNS:protocol adapter error&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;  TNS-00511: No listener&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;   Linux Error: 111: Connection refused&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;2. Zrestartowałem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;pawel@ingrid:~$&lt;span style=&quot;font-weight: bold;&quot;&gt; sudo /etc/init.d/oracle-xe restart&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Shutting down Oracle Database 10g Express Edition Instance.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Stopping Oracle Net Listener.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Starting Oracle Net Listener.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Starting Oracle Database 10g Express Edition Instance.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;3. I zaczeło działać :)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;pawel@ingrid:~$ sudo /etc/init.d/oracle-xe status&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;LSNRCTL for Linux: Version 10.2.0.1.0 - Production&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Copyright (c) 1991, 2005, Oracle.  All rights reserved.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_XE)))&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;STATUS of the LISTENER&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Alias                     LISTENER&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production&lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Uptime                    0 days 0 hr. 0 min. 52 sec&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Trace Level               off&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Security                  ON: Local OS Authentication&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;SNMP                      OFF&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Default Service           XE&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Listener Parameter File   /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/admin/listener.ora&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Listener Log File         /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/log/listener.log&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;Listening Endpoints Summary...&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC_FOR_XE)))&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ingrid)(PORT=1521)))&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=8080))&lt;/span&gt;(Presentation=HTTP)(Session=RAW))&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Services Summary...&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Service &quot;PLSExtProc&quot; has 1 instance(s).&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;  Instance &quot;PLSExtProc&quot;, status UNKNOWN, has 1 handler(s) for this service...&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Service &quot;XE&quot; has 1 instance(s).&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;  Instance &quot;XE&quot;, status READY, has 1 handler(s) for this service...&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Service &quot;XEXDB&quot; has 1 instance(s).&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;  Instance &quot;XE&quot;, status READY, has 1 handler(s) for this service...&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Service &quot;XE_XPT&quot; has 1 instance(s).&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;  Instance &quot;XE&quot;, status READY, has 1 handler(s) for this service...&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;The command completed successfully&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ot wielka filozofia... Ale działa i to chyba najważniejsze :)</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/4872838273875695451/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/4872838273875695451' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/4872838273875695451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/4872838273875695451'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2008/11/oracle-application-server-apex-nie.html' title='Oracle Application Server (Apex) nie wstaje'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-3219531560933717382</id><published>2009-01-20T11:40:00.001+01:00</published><updated>2009-01-22T12:23:24.477+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="personalne niebanalne"/><title type='text'>SCJP passed, na horyzoncie SCBCD</title><content type='html'>&lt;span style=&quot;font-style: italic;&quot;&gt;Ten post przygotwany miałem już kilka miesięcy temu, ale gdzieś się zawieruszył w czeluściach archiwum. Cóż, lepiej późno niż wcale :)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Od dłuższego czasu jestem czytelnikiem bloga Racjonalny Developer. Z autorem bloga nie znam się za bardzo (wymieniliśmy kiedyś jedną czy dwie korespondencje), ale jednak mamy coś wspólnego. Po pierwsze w podobnym czasie pozakładaliśmy blogi, oboje mamy wpisy o trikach w javie (u mnie seria Java Killers u niego luźne wpisy), a teraz na dodatek zdaliśmy oboje SCJP w podobnym czasie i oboje przymierzamy się do SCBCD. Może to zbieg okoliczności, choć jak mówił Vandetta &quot;nie ma zbiegów okoliczności, jest tylko ich złudzenie&quot;.&lt;br /&gt;No ale pomyślałem sobie, że skoro racjonalny developer się chwali to ja też mogę. Zdałem SCJP 6.0. Hurra! Czy było trudno, hm... ciężko powiedzieć co znaczy trudno. Wydawało mi się, że będzie to bułka z masłem, a zdałem na 80%. Jeśli chcesz wiedzieć czy zdasz wystarczy przerobić 3 symulatory SCJP (których pełno w książkach i na sieci) i jeśli średnia wyniesie więcej jak 70% to spokojnie możesz się wybrać. Jeśli natomiast zależy ci na dogłebnym zdobyciu wiedzy, czyli nie  idziesz po certyfikat tylko po to, żeby go mieć, ale też chcesz się czegoś po prostu w świecie nauczyć, polecam zdecydowanie książkę &quot;SCJP, SCJD - Complete Java 2 Certification - Study Guide, 5Ed&quot;. Nie ma chyba bardziej kompletnego podręcznika do SCJP niż właśnie ta książka autorstwa Philip Heller oraz Simon Roberts (nota bene autorów wielu pytań egzaminacyjnych SCJP). Dodatkowo jako reviewu polecam &quot;Sun Certified Programmer for Java 5 Study Guide&quot; autorstwa Kathy Sierra. Książka jest prawie kompletna (kilku informacji w niej nie znalazłem), ale zawiera za to CD z mock egzaminami. Bardzio fajnie rozwiązane są te próbne egzaminy, gdyż jeśli nie znasz odpowiedzi na dane pytanie, program wskazuje Ci dokładne miejsce w książce, gdzie odpowiedź na to pytanie znajdziedz. Narzędzie bardzo przydatne przy powtórkach.</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/3219531560933717382/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/3219531560933717382' title='Komentarze (15)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/3219531560933717382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/3219531560933717382'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2009/01/scjp-passed-na-horyzoncie-scbcd.html' title='SCJP passed, na horyzoncie SCBCD'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-4391883985808121714</id><published>2008-11-13T08:35:00.004+01:00</published><updated>2008-11-13T08:45:32.339+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="odkryte w boju"/><title type='text'>Name clash: has the same erasure but does not override it</title><content type='html'>Pisząc aplikacje wykorzystujące generyki, możecie natrafić na przedziwny błąd. Wyobraźcie sobie interfejs IDao (z pojedyncza metoda updateStubs(List&amp;lt;T&amp;gt;) oraz klasę, która go implementuje AbstractDao. I nagle kompilator krzyczy:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Name clash: The method updateStubs(List) of type AbstractDao&amp;lt;T&amp;gt; has the same erasure as updateStubs(List) of type IDao but does not override it.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Zaraz zaraz, metoda z klasy ma taką samantykę i erasure jak nadrzędna metoda z interfejsu, ale jej nie nadpisuje? O co chodzi? &lt;br /&gt;Spójrzmy na początek definicji interfejsu:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public interface IDao&amp;lt;T extends IStub&amp;gt; {&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;a następnie na początek defnicji klasy AbstractDao:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public abstract class AbstractDao&amp;lt;T extends IStub&amp;gt; implements IDao {&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Co jest nie tak? Otóż wprawna osoba odrazu zauważy (a nieroztropny [czytaj ja] programista przegapi) fakt, iż przy IDao brakuje odwołania do typu generycznego! Poprawnie powyższa definicja powinna wyglądać następująco:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public abstract class AbstractDao&amp;lt;T extends IStub&amp;gt; implements IDao&lt;span style=&quot;font-weight:bold;&quot;&gt;&amp;lt;T&amp;gt; &lt;/span&gt;{&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Po tej małej zmianie wszystko powino być już w porządku, a kompilator nie krzyczy, że ma metode w podklasie, ale jej nie nadpisze.</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/4391883985808121714/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/4391883985808121714' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/4391883985808121714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/4391883985808121714'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2008/11/name-clash-has-same-erasure-but-does.html' title='Name clash: has the same erasure but does not override it'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-2436583907894003784</id><published>2008-11-10T22:15:00.007+01:00</published><updated>2008-11-10T22:25:38.921+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java killers"/><title type='text'>Java Killers #009</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqQ6zmWkg3LSBy5Jaqo-7Bec5-aKfFDFhjKUz3jjSaeEJkxxQqZkJ76Ak8ZMs_IwhXuQJgO5bqxhrW2jOZgeQ-bOIIQuHj05M3KJTOEb4X0eoYEj3zvTwx5QtqCDZOZUKVW_vynlGpCkQ/&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 233px; height: 139px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqQ6zmWkg3LSBy5Jaqo-7Bec5-aKfFDFhjKUz3jjSaeEJkxxQqZkJ76Ak8ZMs_IwhXuQJgO5bqxhrW2jOZgeQ-bOIIQuHj05M3KJTOEb4X0eoYEj3zvTwx5QtqCDZOZUKVW_vynlGpCkQ/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; Jakiś czas temu odezwał się do mnie dobry znajomy Paweł Badeński, który uhahany rozpoczął rozmowę na gadu z tekstem &quot;Patrz na to: ...&quot; po czym wkleił kawałek kodu. Kod przerzuciłem na szybko do ulubionego IDE i już wtedy wiedziałem, że te kilka lini ma predyspozycje na kolejny odcinek killersów. Problem pozostawał jednak wciąż, gdyż za diabła nie wiedziałem, czemu kod zachowywał się właśnie tak a nie inaczej. Szybkie przestudiowania &lt;a href=&quot;http://java.sun.com/docs/books/jls&quot;&gt;Java Language Specification&lt;/a&gt; nie dało odpowiedzi, google na szybko też nie były takie cwane, jak zwykle. Dopiero po dłuższej chwili grzebania udało mi się dotrzeć do buga na &lt;a href=&quot;http://bugs.sun.com/&quot;&gt;bugs.sun.com&lt;/a&gt;, gdzie po dogłebnej lekturze i ponownym otworzeniu Java Language Specification, wszystko stało się jasne. Jestem ciekaw czy i dla Was dziewiąta odsłona Java Killers będzie taką samą łamigłówką jak była dla mnie. A oto ona:&lt;br /&gt;&lt;br /&gt;Mając poniższy kod, jakiego spodziewamy się outputu:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class=&quot;keyword-directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;keyword-directive&quot;&gt;class&lt;/span&gt; Foo&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;keyword-directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;keyword-directive&quot;&gt;int&lt;/span&gt; loo(List&amp;lt;String&amp;gt; a)&lt;br /&gt;{&lt;br /&gt; &lt;span class=&quot;keyword-directive&quot;&gt;return&lt;/span&gt; 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;keyword-directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;keyword-directive&quot;&gt;double&lt;/span&gt; loo(List&amp;lt;Integer&amp;gt; a)&lt;br /&gt;{&lt;br /&gt; &lt;span class=&quot;keyword-directive&quot;&gt;return&lt;/span&gt; -1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;keyword-directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;keyword-directive&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;keyword-directive&quot;&gt;void&lt;/span&gt; main(String[] args)&lt;br /&gt;{&lt;br /&gt; List list = &lt;span class=&quot;keyword-directive&quot;&gt;new&lt;/span&gt; ArrayList&amp;lt;Integer&amp;gt;();&lt;br /&gt; System.out.println(&quot;output: &quot; + &lt;span class=&quot;keyword-directive&quot;&gt;new&lt;/span&gt; Foo().loo(list));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Odpowiedź poprawna tylko jedna, a kilka do wyboru:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A. Klasa nie skompiluje się, javac poinformuje nas, że &quot;name clash: loo(java.util.List&lt;java.lang.string&gt;) and loo(java.util.List&lt;java.lang.integer&gt;) have the same signature and erasure&quot;&lt;br /&gt;B. Klasa nie skompiluje się, javac poinformuje nas, że &quot;reference to loo is ambiguous&quot;&lt;br /&gt;C. Skompiluje się, ale wyrzucony zostanie RuntimeException po uruchomieniu programu&lt;br /&gt;D. Program skompiluje się i uruchomi się bez wyjątków i zostanie wypisane na ekranie &#39;output: -1&#39;&lt;br /&gt;E. Program skompiluje się i uruchomi się bez wyjątków i zostanie wypisane na ekranie &#39;output: 1&#39;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYhh0ObOghxFOz1R0js0D7bKh4R07ufXaSmYnxwAdDtuDAtT0YnU9tcfEhAGd7ZkkokSm80D76xYRaiftE8g6kvaDYvZcXHBZahN4ZxxjQ7by8P1JOaPCvtUYmLEE49yBK-kT-pBByGZg/&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 388px; height: 290px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYhh0ObOghxFOz1R0js0D7bKh4R07ufXaSmYnxwAdDtuDAtT0YnU9tcfEhAGd7ZkkokSm80D76xYRaiftE8g6kvaDYvZcXHBZahN4ZxxjQ7by8P1JOaPCvtUYmLEE49yBK-kT-pBByGZg/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I uwaga uwaga, poprawna odpowiedź to &lt;span style=&quot;font-weight: bold;&quot;&gt;B!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Osoby, które przekonane były, że oby dwie metody loo miały taką samą sygnaturę  i przez to kod się nie kompilował, nie martwcie się, nie byliście jedyni, którzy zaznaczyli odpowiedź A. Otóż okazuje się, że jednak sygnatury obu metod się różnią i występuje najprostszy w świecie method overloading. Później w czasie wywołania metody loo w ciele metody main, następuje konsternacja, gdyż kompilator widzi zmienną niegenneryczną List list i nie ma pojęcia do której metody loo ma się odwołać, stąd jego krzyk &lt;/span&gt;&lt;/java.lang.integer&gt;&lt;/java.lang.string&gt;&quot;reference to loo is ambiguous&quot;.&lt;br /&gt;Ok, ktoś się spyta, jak to metody loo mają taką samą sygnaturę? Patrząc na &lt;a href=&quot;http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.9&quot;&gt;Java Language Specification punkt 8.4.9&lt;/a&gt;, widzimy, że:&lt;br /&gt;&lt;br /&gt;* obie metody mają taką samą nazwę&lt;br /&gt;* obie metody mają taką samą liczbę formalnych parametrów oraz parametrów typów prostych&lt;br /&gt;* &lt;span style=&quot;font-weight: bold;&quot;&gt;ALE&lt;/span&gt; typy tych parametrów&lt;span style=&quot;font-weight: bold;&quot;&gt; się różnią&lt;/span&gt;, List&amp;lt;String&amp;gt; to co innego niż List&amp;lt;Integer&amp;gt;! Mimo, że przed samą kompilacją wszystkie generyki zostają zrzucone i nie są brane pod uwagę podczas kompilacji (pisałem o tym w poprzednich killersach) o tyle są uwzględniane podczas operacji zwanej &quot;type erasure&quot; - dlatego właśnie List&amp;lt;String&amp;gt; to co innego niż List&amp;lt;Integer&amp;gt;.&lt;br /&gt;&lt;br /&gt;No i to tyle na dziś. Kto znał poprawną odpowiedź?&lt;br /&gt;&lt;br /&gt;PS. Wspomniana strona do której dotarłem (i musiałem się nieźle nagooglać) znajduje się tutaj: &lt;java.lang.string&gt;&lt;java.lang.integer&gt;&lt;a href=&quot;http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6182950&quot;&gt;http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6182950&lt;/a&gt;&lt;br /&gt;&lt;/java.lang.integer&gt;&lt;/java.lang.string&gt;&lt;/integer&gt;&lt;/string&gt;&lt;/integer&gt;&lt;/string&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/2436583907894003784/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/2436583907894003784' title='Komentarze (5)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/2436583907894003784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/2436583907894003784'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2008/11/java-killers-009.html' title='Java Killers #009'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqQ6zmWkg3LSBy5Jaqo-7Bec5-aKfFDFhjKUz3jjSaeEJkxxQqZkJ76Ak8ZMs_IwhXuQJgO5bqxhrW2jOZgeQ-bOIIQuHj05M3KJTOEb4X0eoYEj3zvTwx5QtqCDZOZUKVW_vynlGpCkQ/s72-c" height="72" width="72"/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-7591289416048613261</id><published>2008-11-05T09:00:00.001+01:00</published><updated>2008-11-05T10:49:24.390+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="jee5"/><category scheme="http://www.blogger.com/atom/ns#" term="maven"/><category scheme="http://www.blogger.com/atom/ns#" term="odkryte w boju"/><title type='text'>Maven javaee-api-5</title><content type='html'>Jeśli dane jest Wam pisać aplikacje JEE5 z użyciem mavena, dość paradoksalnie możecie się spotkać z brakiem w dostępnych repozytoriach pliku &lt;span style=&quot;font-weight: bold;&quot;&gt;javaee-api-5.jar &lt;/span&gt;(definiującego API standardu JEE5). Jeśli więc kiedykolwiek dostaniecie informacje od mavena, że nie może za żadne skarby znaleźć API JEE5, polecam zajrzeć tutaj:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;https://maven-repository.dev.java.net/nonav/repository/javaee/jars/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;W &lt;a href=&quot;https://maven-repository.dev.java.net/nonav/repository&quot;&gt;repozytorium java.net&lt;/a&gt; jar z API standardu leży sobie grzecznie, czekając, aż go ktoś ściągnie.</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/7591289416048613261/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/7591289416048613261' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/7591289416048613261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/7591289416048613261'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2008/11/maven-javaee-api.html' title='Maven javaee-api-5'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-8754673270100432010</id><published>2008-11-04T08:00:00.000+01:00</published><updated>2008-11-04T08:00:02.326+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="jboss"/><category scheme="http://www.blogger.com/atom/ns#" term="odkryte w boju"/><title type='text'>Zmiana portu JBoss Application Server z 8080 na inny</title><content type='html'>JBoss Application Server uruchamia się standardowo na porcie 8080. W odróżnieniu od Glassfisha nie ma admina webowego (co jest zastanawiające czemu) i żeby cokolwiek zmienić w konfiguracji, trzeba poedytować pliki konfigów.&lt;br /&gt;&lt;br /&gt;W tym poście zakładam, że JBoss zainstalowany jest w katalogu /opt/jboss/. Aby zmienić port HTTP z 8080 na jakiś inny należy dostać się do pliku server.xml zlokalizownego w /opt/jboss/server/default/deploy/jboss-web.deployer/ i wyedtować go.  Odnajdujem poniższy wpis i w miejscu XXX wpisujemy intersujący nas port (na przykład 80):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  &amp;lt;Connector &lt;span style=&quot;font-weight:bold;&quot;&gt;port=&quot;XXX&quot;&lt;/span&gt; address=&quot;${jboss.bind.address}&quot;    &lt;br /&gt;         maxThreads=&quot;250&quot; maxHttpHeaderSize=&quot;8192&quot;&lt;br /&gt;         emptySessionPath=&quot;true&quot; protocol=&quot;HTTP/1.1&quot;&lt;br /&gt;         enableLookups=&quot;false&quot; redirectPort=&quot;8443&quot; acceptCount=&quot;100&quot;&lt;br /&gt;         connectionTimeout=&quot;20000&quot; disableUploadTimeout=&quot;true&quot; /&gt;&lt;br /&gt;&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/8754673270100432010/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/8754673270100432010' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/8754673270100432010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/8754673270100432010'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2008/11/zmiana-portu-jboss-application-server-z.html' title='Zmiana portu JBoss Application Server z 8080 na inny'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-5662380407933048974</id><published>2008-11-03T12:00:00.001+01:00</published><updated>2008-11-03T13:49:59.664+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="odkryte w boju"/><category scheme="http://www.blogger.com/atom/ns#" term="oracle"/><title type='text'>Oracle Apex widoczny poza localhost&#39;em</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhucZnE8Z7yAfnZ43bIhdJAnRYx0aKniJC2WRO5zp53TqWoE_88XBK8fxH6AZqDjroN1gJ3XjM4MxfokeUCpPt6k9i5nbVTtg21wQAqwLTo6U7-VLePoxjyAsdOSzuObakUNfDTlLVpbok/s1600-h/apex.png&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 138px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhucZnE8Z7yAfnZ43bIhdJAnRYx0aKniJC2WRO5zp53TqWoE_88XBK8fxH6AZqDjroN1gJ3XjM4MxfokeUCpPt6k9i5nbVTtg21wQAqwLTo6U7-VLePoxjyAsdOSzuObakUNfDTlLVpbok/s200/apex.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5264162920755977282&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Ostatnio &lt;a href=&quot;http://paulszulc.blogspot.com/2008/08/instalacja-oracle-na-ubuntu.html&quot;&gt;pisałem jak zainstalować Oracla&lt;/a&gt; na Ubuntu, dziś pora przyjrzeć się aplikacji webowej Apex (pozwalająca zarządzać bazą danych), która standardowo instaluje się wraz z Oraclem i dostępna jest pod adresem http://localhost:8080/apex. Wszystko działa fajnie, do czasu gdy chcielibyśmy dostać się do aplikacji przez inny adres niż http://localhost, czyli zdalnie. Poniżej krótka instrukcja jak to zrobić:&lt;br /&gt;&lt;br /&gt;1. zainstaluj sqlplus jeśli (jeszcze nie masz):&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;apt-get install sqlplus&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2. ustaw ORACLE_HOME (jesli jeszcze tego nie zrobiles):&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;3. zaloguj się do sqlplusa jako user &lt;span style=&quot;font-size:100%;&quot;&gt;SYSTEM&lt;/span&gt;&lt;br /&gt;﻿&lt;span style=&quot;font-size:100%;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;sqlplus system&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;4. gdy pojawi się sql prompt (ktoś zna polski odpowiednik słówka prompt?) wpisz:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;SQL&gt; EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Powinno zacząć działać.</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/5662380407933048974/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/5662380407933048974' title='Komentarze (4)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/5662380407933048974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/5662380407933048974'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2008/11/oracle-apex-widoczny-poza-localhostem.html' title='Oracle Apex widoczny poza localhost&#39;em'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhucZnE8Z7yAfnZ43bIhdJAnRYx0aKniJC2WRO5zp53TqWoE_88XBK8fxH6AZqDjroN1gJ3XjM4MxfokeUCpPt6k9i5nbVTtg21wQAqwLTo6U7-VLePoxjyAsdOSzuObakUNfDTlLVpbok/s72-c/apex.png" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-1293483711167710250</id><published>2008-11-02T21:45:00.005+01:00</published><updated>2008-11-02T21:54:27.522+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="personalne niebanalne"/><title type='text'>Where is everybody?</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQZk5e3R1B41eqRKUuoVawYq2ihdTlWuFhAYFrpsJNozgOA1M9MJg8y8ONMgLNXlgP-Snb9f6Mi7_FYUcbmn6JsRU7tn_ZT7m7qfUaX68-ff_viIuS17bVM4QSHUtvKNa5WQG8VSra8Ik/s1600-h/whereiseverybody.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 304px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQZk5e3R1B41eqRKUuoVawYq2ihdTlWuFhAYFrpsJNozgOA1M9MJg8y8ONMgLNXlgP-Snb9f6Mi7_FYUcbmn6JsRU7tn_ZT7m7qfUaX68-ff_viIuS17bVM4QSHUtvKNa5WQG8VSra8Ik/s400/whereiseverybody.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5264165465332656402&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&quot;Where is everybody???&quot; No właśnie, dobre pytanie. Blog trochę podumarł i przycichł. Czemu? Otóż zaczynamy z kolegami mały skromny start-up (o którym może kiedyś, jak już coś będzie wydane na świat) i przez ostatnie dwa miesiące poświęciłem się mu bezgranicznie. Teraz troszkę się już uspokoiło i ponownie mogę wrócić do zajęcia, które sprawia mi też sporo radości - blogowania.&lt;br /&gt;&lt;br /&gt;Do zobaczenia niebawem, trochę się nazbierało dziwnych sytuacji, o których warto by tu napisać.</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/1293483711167710250/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/1293483711167710250' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/1293483711167710250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/1293483711167710250'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2008/11/where-is-everybody.html' title='Where is everybody?'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQZk5e3R1B41eqRKUuoVawYq2ihdTlWuFhAYFrpsJNozgOA1M9MJg8y8ONMgLNXlgP-Snb9f6Mi7_FYUcbmn6JsRU7tn_ZT7m7qfUaX68-ff_viIuS17bVM4QSHUtvKNa5WQG8VSra8Ik/s72-c/whereiseverybody.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-8199910337417034649</id><published>2008-08-28T20:14:00.003+02:00</published><updated>2008-08-28T21:10:53.595+02:00</updated><title type='text'>Wyszedł pierwszy numer JAVA exPress!</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikFNaWOGfKZIksJEcSOjY2ydutp1Hx6TFbub0QNllAxY8PJc79_5LEHEM8Dax0wQrjWfZoTzp847QUhjDN9w9PaewM2mpy1k_IdtW6ZcSY5BxLbgmFyH8O-Q5aDQZfdr8hIy4HghP7mBY/s1600-h/express.png&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikFNaWOGfKZIksJEcSOjY2ydutp1Hx6TFbub0QNllAxY8PJc79_5LEHEM8Dax0wQrjWfZoTzp847QUhjDN9w9PaewM2mpy1k_IdtW6ZcSY5BxLbgmFyH8O-Q5aDQZfdr8hIy4HghP7mBY/s200/express.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5239647726375435746&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Wyszedł pierwszy numer JAVA exPress, jakieś kilka godzin temu, a w polskiej blogosferze wciąż cicho (nawet odziwo na &lt;a href=&quot;http://grzegorzduda.blogspot.com/&quot;&gt;blogu głównego pomysłodawcy&lt;/a&gt;), więc pozwalam sobie poinformować o wydaniu pierwszego (i mam nadzieje nie ostatniego) numeru JAVA exPress, który w postaci pdf&#39;a można za darmo sciągnąć &lt;a href=&quot;http://groups.google.pl/group/javaexpress?hl=pl&quot;&gt;stąd&lt;/a&gt;.&lt;br /&gt;Coż można powiedzieć po wstępnym przejrzeniu gazetki? Widać, że zarówno pomysłodawca (&lt;a href=&quot;http://grzegorzduda.blogspot.com/&quot;&gt;Grzegorz Duda&lt;/a&gt;) jak i autorzy (Bartek Kuczyński, Jakub Jurkiewicz, Mariusz Sieraczkiewicz, Jackiw Pospychała oraz Marek Kliś) bardzo mocno się postarali, aby pierwszy numer wypadł ciekawie. Jeśli kolejne numery utrzymają formę, zapowiada się bardzo ciekawy zin w polskim światku javowym.&lt;br /&gt;Boli tylko troszkę, że nie można takiej gazetki nigdzie kupić w formię drukowanej. Piękno przecież takich artykułów polega na tym, że można je sobie spokojnie poczytać w pociągu, samolocie czy też w domu leżąc wygodnie na kanapie. Niestesty na papierową wersję JAVA exPress trzeba będzie nam jeszcze sporo poczekać i narazie zadowolić się będzie trzeba SDJ (gdzie poziom artykułów zwykle bliżej dna niż powierzchni).</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/8199910337417034649/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/8199910337417034649' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/8199910337417034649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/8199910337417034649'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2008/08/wyszed-pierwszy-numer-java-express.html' title='Wyszedł pierwszy numer JAVA exPress!'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikFNaWOGfKZIksJEcSOjY2ydutp1Hx6TFbub0QNllAxY8PJc79_5LEHEM8Dax0wQrjWfZoTzp847QUhjDN9w9PaewM2mpy1k_IdtW6ZcSY5BxLbgmFyH8O-Q5aDQZfdr8hIy4HghP7mBY/s72-c/express.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-2948223579515908966</id><published>2008-08-27T20:14:00.007+02:00</published><updated>2009-07-27T13:10:13.295+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="how-to"/><category scheme="http://www.blogger.com/atom/ns#" term="oracle"/><title type='text'>Instalacja Oracle na Ubuntu</title><content type='html'>&lt;span style=&quot;font-weight: bold;&quot;&gt;For English press &lt;/span&gt;&lt;a href=&quot;http://paulszulc.wordpress.com/2009/05/25/installing-oracle-on-ubuntu/&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;http://paulszulc.wordpress.com/2009/05/25/installing-oracle-on-ubuntu/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/a&gt;Oracle to baza danych przez duże B i duże D. Wystarczy poczytać sobię trochę o architekturze Oracla, aby przekonać się czemu jest to jedna z najczęściej wykorzystywanych baz w biznesie. Dotychczas (na studiach :) ) wiedza o bazach danych była mi na tyle potrzebna, co założyć bazę, stworzyć strukture (tabele, widoki, indexy) i na końcu zmapować to wszystko w jakis ORM (Hibernate czy inny TopLink). Ponieważ w pracy wymagają ode mnie troszkę większej wiedzy na temat Oracla i baz danych w ogólności, postanowiłem po godzinach przyjrzeć się tej bazie u siebie na mojej lokalnej maszynie.&lt;br /&gt;Aby to uczynić należało wpierw bazę tą zainstalować, co okazało się względnie prostym zadaniem na systemie Ubuntu (obecnie w wersji 8.04). Kolejne kroki w wersji skróconej podaje poniżej:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;1. Dodać nowe repozytorium&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;1.1&lt;/span&gt; Do listy należy dodać &lt;span style=&quot;font-style: italic;&quot;&gt;deb http://oss.oracle.com/debian unstable main non-free&lt;/span&gt;. Można to zrobić wyklikując System-&gt;SoftwareSources-&gt;Third-Party Software (jak na poniższym obrazku) lub dodać wpis ręcznie do &lt;span style=&quot;font-weight: bold; font-style: italic;&quot;&gt;/etc/apt/sources.list&lt;/span&gt; - jak kto woli.&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia0WWmjwjwxxcgDCUCD2AH8wjlsTqszzYbr34WR7-Fqb9Cz1E2l28G08Fh6HhDCTprILM5ESTFgLC3UHL94SB8mWkZeJgO18SSZxAAoWWQ97DXNITX1kXvBNTfFPOuvQm6ygcMAq22zOg/s1600-h/dodanie_repo.png&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia0WWmjwjwxxcgDCUCD2AH8wjlsTqszzYbr34WR7-Fqb9Cz1E2l28G08Fh6HhDCTprILM5ESTFgLC3UHL94SB8mWkZeJgO18SSZxAAoWWQ97DXNITX1kXvBNTfFPOuvQm6ygcMAq22zOg/s320/dodanie_repo.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5236720291112120914&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;1.2&lt;/span&gt; Dodać klucz publiczny, najprościej w konsoli wpisując&lt;br /&gt;&lt;pre&gt;&lt;span style=&quot;font-style: italic; font-weight: bold;&quot;&gt;wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle  -O- | sudo apt-key add -&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;ale można oczywiście również wyklikać przez System-&gt;SoftwareSources-&gt;Authentication&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;2. Uruchomić instalację Oracla&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Wystarczy teraz już tylko standardowe:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;sudo apt-get install oracle-xe&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;i po wykonanej instalacji uruchomić program konfigurujący:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;sudo /etc/init.d/oracle-xe configure&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;gdzie odpowiada się na cztery proste pytania: o port dla Oracle Application Express (defaultowo 8080), port do połączeń z bazą danych (defaultowo 1521), hasło dla administratora (użytkownika SYSTEM) oraz określa się czy baza ma uruchamiać się wraz z uruchamianiem się systemu.&lt;br /&gt;&lt;br /&gt;I to tyle! Mamy działającą instancję Oracla. Możemy zacząć zabawę z systemem uruchamiając SQL*Plus&#39;a lub application express (http://127.0.0.1:8080/apex).</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/2948223579515908966/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/2948223579515908966' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/2948223579515908966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/2948223579515908966'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2008/08/instalacja-oracle-na-ubuntu.html' title='Instalacja Oracle na Ubuntu'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia0WWmjwjwxxcgDCUCD2AH8wjlsTqszzYbr34WR7-Fqb9Cz1E2l28G08Fh6HhDCTprILM5ESTFgLC3UHL94SB8mWkZeJgO18SSZxAAoWWQ97DXNITX1kXvBNTfFPOuvQm6ygcMAq22zOg/s72-c/dodanie_repo.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-5809660858527779178</id><published>2008-08-25T23:50:00.004+02:00</published><updated>2008-08-25T23:55:50.789+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="odkryte w boju"/><title type='text'>java.util.Date vs java.sql.Date</title><content type='html'>Natknąłem się na ciekawe rozwiązanie architektoniczne w JDBC: obiekt  java.sql.Date. Jest to obiekt, który dziedziczy bezpośrednio po java.util.Date, pozwalający nam mapować w naszych beanch pola typu Date z naszych baz danych.&lt;br /&gt;Czy wszystko jest takie piekne? Nie do końca, gdyż w naszych beanach zwykle trzymamy obiekty typu java.util.Date.&lt;br /&gt;Wyboraźmy sobie prosty przykład:&lt;br /&gt;&lt;br /&gt;Mamy klase User w postaci&lt;br /&gt;&lt;pre&gt;public class User&lt;br /&gt;{&lt;br /&gt;protected String userName;&lt;br /&gt;protected Date birthDate; // tutaj java.util.Date czyli standard&lt;br /&gt;&lt;br /&gt;//odpowiednie gettery i settery&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Posiadamy również odpowiadającą jej tabelę w bazie danych:&lt;br /&gt;&lt;br /&gt;CREATE TABLE Users (&lt;br /&gt;userName VARCHAR2(150),&lt;br /&gt;birthDate DATE );&lt;br /&gt;&lt;br /&gt;Sytuacja jak najbardziej standardowa. Teraz jeśli wyciągnięte dane z bazy (przy pomocy ResultSeta) dodamy do naszego beana:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;User u = new User();&lt;br /&gt;u.setUserName(rSet.getString(1));&lt;br /&gt;u.setBirthDate(rSet.getDate(2));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;nic się nie stanie. W prawdzie metoda User.setBirthDate oczekuję java.util.Date, a ResultSet.getDate zwraca java.sql.Date, to jednak wszystko jest w porządku, gdyż java.sql.Date dziedziczy po java.util.Date. Jaja zaczynają się, gdy informacje chcemy ponownie przekazać do bazy danych.&lt;br /&gt;Teraz gdy updateujemy jakies informacje przy pomocy jakies procedury skladowanej czy poprzez wywolanie SQL&#39;owego UPDATE, zawsze ale to zawsze poprosza nas o Date w postaci java.sql.Date. Czyli kod&lt;br /&gt;&lt;pre&gt;statement.setDate(2,user.getBirthDate());&lt;br /&gt;&lt;/pre&gt;sie po prostu nie skompiluje. Rzutowanie nic tu nie da, gdyż przykładowo poniższy kod:&lt;br /&gt;&lt;pre&gt;user.setBirthDate(new Date());&lt;br /&gt;statement.setDate(2,(java.sql.Date)user.getBirthDate()); // tu exception&lt;br /&gt;&lt;/pre&gt;się poprostu wywali przy pierwszym wywołaniu. Trzeba utworzyć explicite obiekt java.sql.Date, ale żeby nie było za prosto, nie ma żadnego konstruktora typu public Date(java.util.Date utilDate). Nie, przecież to by było zbyt proste. Zamiast tego musimy zrobic new java.sql.Date(utilDate.getTime()). Konstruktor java.sql.Date przyjmuje longa jako liczbę milisekund od roku 1970, a metoda getTime z java.util.Date taka informacje zwraca. Wszystko działa okej, ale czy na pewno to jest dobre rozwiązanie? Szczerze mówiąc, ja nie wiem. Skoro sami ludzie z Sun Microsystems mówią, że java.sql.Date to tylko &quot;thin wrapper&quot;, to po co w ogóle został wprowadzony? Czy istnieje jakiś lepszy (w sensie nie polegający na roku 1970) sposób na konwertowanie dat z java.util na java.sql? Googlałem pobieżnie, nie znalazłem. Może ktoś zna?</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/5809660858527779178/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/5809660858527779178' title='Komentarze (8)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/5809660858527779178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/5809660858527779178'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2008/08/javautildate-vs-javasqldate.html' title='java.util.Date vs java.sql.Date'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-3111200172713073760</id><published>2008-08-20T23:17:00.002+02:00</published><updated>2008-08-20T23:27:32.409+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="personalne niebanalne"/><title type='text'>Po przerwie wakacyjnej</title><content type='html'>Minał okres wakacji i laby. Po obronie pracy magisterskiej nie mogłem przez jakiś czas dojść do siebie - w czym z pewnością usilnie pomagał mi alkohol ;). Potem wyjechałem ze znajomymi na długo wyczekiwany rejs po Mazurach (długi, bo aż ponad trzy tygodniowy). No a teraz..., teraz znów wróciłem do świata żywych i czas odświeżyć wiele spraw, między innymi tego bloga :)&lt;br /&gt;&lt;br /&gt;Rozpocząłem prace w ifirma.pl, po moim długim maratonie po firmach IT we Wrocławiu. Zatrudnony jestem jako programista Java oraz PL/SQL, zatem spodziewać się można, że sporo zagadnień na blogu związanych będzie teraz z Oraclem. Obecnie w pracy rozgryzam sprawy związane z webserwisami, więc zapewne jakieś relacje z moich walk z Axis&#39;em (implementacja z Apache&#39;a) się tu pojawią.&lt;br /&gt;&lt;br /&gt;Generalnie każdego dnia czegoś nowego się uczę, nierzadko na własnych błedach. Chciałbym aby ten blog był też zapiskiem z tych moich walk i pojedynków z technologiami, tak żeby w przyszłości mógł ktoś kiedyś z tego skorzystać.&lt;br /&gt;&lt;br /&gt;Aby zatem nie przedłużać, w wielkim skrócie: I am back :)</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/3111200172713073760/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/3111200172713073760' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/3111200172713073760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/3111200172713073760'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2008/08/po-przerwie-wakacyjnej.html' title='Po przerwie wakacyjnej'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-5285648065228804814</id><published>2008-06-24T20:18:00.004+02:00</published><updated>2008-06-24T20:44:21.665+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="tools dig"/><title type='text'>Tools Dig: LiquiBase</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZF4N6w7I7Wfcj5NtK_ojICoeGoeV9ps8L1k0fr9rBWgHeqx1n3r-Nl4qOGWtpa65y-cnbVzZiy8TRN5D7HflXENM58b-j2gHMl3S4bRQWcDaO6ttBnHciVPFeth1FKJkteEiMYQ4M9sM/s1600-h/Icon_tools.png&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZF4N6w7I7Wfcj5NtK_ojICoeGoeV9ps8L1k0fr9rBWgHeqx1n3r-Nl4qOGWtpa65y-cnbVzZiy8TRN5D7HflXENM58b-j2gHMl3S4bRQWcDaO6ttBnHciVPFeth1FKJkteEiMYQ4M9sM/s200/Icon_tools.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5215520357495642690&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://paulszulc.blogspot.com/2008/06/migracje-bazodanowe-czego-w-javie-nie.html&quot;&gt;Wczoraj marudziłem&lt;/a&gt; na brak railsowych migracji w popularnych frameworkach javowych, a już dziś dzięki uprzejmości Pawła Sto (p100 :) ), poznałem bardzo ciekawe narzędzie jakim jest &lt;a href=&quot;http://www.liquibase.org/&quot;&gt;LiquiBase&lt;/a&gt;. Narzędzie to posiada większość elementów z railsowych migracji oraz jest nawet śmiem twierdzić nieco lepsze od nich (odczuć mogą to zwłaszcza teamy developerskie, gdzie jest więcej niż 4 programistów i jedno repozytorium kodu :) ).&lt;br /&gt;&lt;br /&gt;Dlatego wszem i wobec zachęcam wszystkich do zapoznania się z toolem (&lt;a href=&quot;http://www.liquibase.org/&quot;&gt;http://www.liquibase.org&lt;/a&gt;). Warto zwłaszcza zerknąć na screencasty: &lt;a href=&quot;http://www.liquibase.org/swf/overview_short/liquibase%20overview.html&quot;&gt;krótkim&lt;/a&gt; (6min) lub &lt;a href=&quot;http://www.liquibase.org/swf/overview_long/LiquiBase%20TechTalk.html&quot;&gt;dłuższym, obszerniejszym&lt;/a&gt; (30min). Omawiają starszą wersję narzędzia, ale dają ogólny taki overviewu, warto obejrzeć.&lt;br /&gt;&lt;br /&gt;Niniejszym rozpoczynam też nową mini-serię na moim blogu: Tools Dig . Często napotykam na ciekawe narzędzia w sieci. Jak zwrócił mi uwagę mój kolega, warto się takim znaleziskami dzielić z szerszą publiką, a do tego idealnie nadaje się ten blog. Co niniejszym czynię.</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/5285648065228804814/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/5285648065228804814' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/5285648065228804814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/5285648065228804814'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2008/06/tools-dig-liquibase.html' title='Tools Dig: LiquiBase'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZF4N6w7I7Wfcj5NtK_ojICoeGoeV9ps8L1k0fr9rBWgHeqx1n3r-Nl4qOGWtpa65y-cnbVzZiy8TRN5D7HflXENM58b-j2gHMl3S4bRQWcDaO6ttBnHciVPFeth1FKJkteEiMYQ4M9sM/s72-c/Icon_tools.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-8111973701798599773</id><published>2008-06-23T18:15:00.010+02:00</published><updated>2008-06-23T21:16:45.209+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="ruby on rails"/><title type='text'>Migracje bazodanowe: czego w Javie nie znajdziemy?</title><content type='html'>Czytam sobie sporo o Railsach ostatnio. Na tyle mi się framework spodobał (i język Ruby też), że chwilowo nawet myślałem o całkowitej migracji Java -&gt; Ruby &amp;amp; Rails. Ponieważ jednak firm RoR&#39;owych u nas we Wrocławiu jak na lekarstwo (w sumie tylko jedna, pracowników serdecznie pozdrawiam :) ), to ostatecznie pomysł ten zarzuciłem. Nie zmienia to faktu, że czytanie książek i blogów o Railsach sporo mi dało. Inaczej teraz trochę patrze na programowanie, jest też kilka spraw, które w frameworkach Javowych bardzo mi od tego czasu brakuje.&lt;br /&gt;Jednym z takich elementów są &lt;span style=&quot;font-weight: bold;&quot;&gt;migracje&lt;/span&gt; (ang. migrations), potężne narządzie frameworka Ruby on Rails.&lt;br /&gt;W Javie pisząc aplikacje wykorzystujące bazę danych przyzwyczailiśmy się już do frameworków tzw. mapujących. To znaczy takich, w których model biznesowy jest mocno zintegrowany z bazą danych. Boli nas trochę fakt, że gdy tworzymy aplikacje z wykorzystaniem jakiegoś narzędzia ORM&#39;owego, musimy wyspecyfikować:&lt;br /&gt;&lt;br /&gt;- pole w modelu&lt;br /&gt;- getter&lt;br /&gt;- setter&lt;br /&gt;- mapowanie w kierunku a-&gt;b&lt;br /&gt;- mapowanie w kierunku b-&gt;a&lt;br /&gt;- definicje kolumny&lt;br /&gt;&lt;br /&gt;Oczywiście nie można dramatyzować: model (a wiec odpowiednie fieldy, gettery, settery) pomoże nam stworzyć nasze ulubione IDE, a najnowsze frameworki (z wykorzystaniem adnotacji) umiejscawiają nam definicje bazodanowe w samym modelu. Wszystko robi się niby DRY (Don&#39;t Repeat Yourself), wszystko wydaje się być w jednym miejscu i wszelkie zmiany w projekcie można wprowadzać bezboleśnie. Zapominamy tutaj o jednej ważnej sprawie - &lt;span style=&quot;font-weight: bold;&quot;&gt;danych&lt;/span&gt; w bazie danych.&lt;br /&gt;&lt;br /&gt;Możemy wyobrazić sobie, że po miesiącu czy dwóch naszego developingu, powstaje aplikacja/prototyp, która zostaje wdrożona u klienta. Schemat bazy danych jest oczywiście generowany z naszego modelu na bazie produkcyjnej u klienta. Czysta, nowa, świeżutka baza wraz z aplikacją zostaje uruchomiona. My zabieramy się za kolejną iterację, a klient wdraża się w jej pierwszą wersję. W między czasie dodajemy nowe kolumny, zmieniamy nazwy tabel, łączymy pewne rzeczy w jedną całość - jesteśmy bardzo agile - nie boimy sie zmian. Przychodzimy do klienta, chcemy mu wygenerować nowa bazę a on nam mówi &quot;Hola hola, ja tu już mam pewne dane, nie chce ich tracić&quot;. Po chwili namysłu dochodzimy do wniosku, że możemy wygenerować plik SQL, w którym umieścimy wszystkie zmiany w nowej bazie danych względem tej starej (znany wszystkim DDL, czyli alter table i takie tam) i tak gotowy skrypt uruchomimy po stronie bazy produkcyjnej.&lt;br /&gt;&lt;br /&gt;Ok, rozwiązanie niby dobre. Spotkałem się z nim w praktyce, pliki takie nazywane były &quot;patchami&quot; (moim zdaniem nazwa dobra) i tworzone były dla każdej kolejnej iteracji przygotowywanej aplikacji. Trzymane wraz z kodem w repozytorium nie miały prawa zaginąć. Teraz tworząc pole String nickname w modelu User musiałem dodatkowo w patchu patch_078.sql umieszczać wpis &quot;alter table add column nickname varchar&quot;. W momencie integracji wersji deweloperskiej z produkcyjną, po wprowadzeniu zmian w kodzie uruchamiany zostawał patch i schemat bazy był aktualny z modelem. Wszystko niby fajnie, ale właśnie tu zaczynają się schody. Po pierwsze przestaje mieć pojedyńczej informacji (w tym przypadku informacji o schemacie bazodanowym) w jednym miejscu - co szybko prowadzić może do pomyłek. Druga sprawa to brak powiązania tych zmian z kodem na repozytorium. Wprowadzę zmiany w kodzie, commitne, mnie trochę czasu, update&#39;uje patch na repozytorium. Mijają cztery dni i okazuje się, że muszę cofnąć zmiany w moim modelu. Muszę PAMIĘTAĆ, że odpowiednie zmiany powinny być update&#39;owane w patchu (rollback na repozytorium mi tego nie zapewni). Ból, ból, ból i zgrzytanie zębów.&lt;br /&gt;&lt;br /&gt;O wiele ciekawiej rozwiązane jest to w Railsach. Patche (tutaj zwane migracjami) tworzone są za nas automatycznie. Taki patch zawiera nie tylko metodę updatującą schemat bazy, ale również wycofującą te zmiany. W ogólności każda migracja to klasa Ruby&#39;ego implementująca dwie metody up oraz down. Metoda up wprowadza zmiany w schemacie bazy danych, metoda down je wycofuje. Przez co uzyskujemy patch działający w dwie strony. Zestaw operacji jakie możemy wykonać jest dowolny, możemy wstawiać dane, zmieniać strukturę schematu (z użyciem predefiniowanych metod podobnych do tych które znamy z DDL, czyli create/drop table, add/remove column i tak dalej). Każda taka migracja ma przypisany swój numer porządkowy, a sam schemat trzyma informacje o swojej wersji. Jeśli zatem przykładowo mamy schemat bazy danych w wersji 004, a w czasie developingu pojawiły się dwie nowe migracje 005 oraz 006, to wywolanie komendy rake migrate spowoduje, że framework wywoła w kolejności metody up, najpierw z migracji 005, a następnie z migracji 006,a na końcu zmieni wersję schematu na 006. Jeśli kiedykolwiek trzeba będzie sie cofnąć w zmianach schematu, na przykład do wersji 004, wykonane zostaną kolejno metody down w migracji 006, a poźniej w 005. Piękna sprawa!&lt;br /&gt;&lt;br /&gt;Klasy migracji są tworzone dla modeli automatycznie, więc nie ma obawy, że do repozytorium nie zostaną przekazane razem. Wtedy cofnięcie się w ramach repozytorium do kodu z przed na przykład kilku dni nie stanowi problemu.&lt;br /&gt;&lt;br /&gt;O migracjach w Rails można by mówić wiele, fakt faktem brakuje mi czegoś takiego w frameworkach Javowych. Słyszałem, że jakieś OMR&#39;y &lt;span style=&quot;font-weight: bold;&quot;&gt;generują patche &lt;/span&gt;dla konkretnej bazy danych w oparciu o zmiany jakie zaszły w modelu. Jakie? Nie wiem, może wy mi powiecie, jestem bardzo ciekaw. Wtedy byłoby już fajnie, chociaż wciąż nie pozostawalibyśmy DRY, ale przynajmniej były to już jakiś krok w dobrym kierunku.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;Orginał tego postu wyglądał ciutkę inaczej od tego co tu przeczytałeś, ale durny siersciuch (kot) gonił muchę po mieszkaniu, przebiegł się po klawiaturze, skasował sporą część zaznaczonego tekstu, a blogspot automatycznie po kilku sekundach zapisał zmiany. 40% tekstu jest odtworzone, a więc podatne na błędy i gorsze jakościowo - nie cierpie pisać czegoś dwa razy.&lt;br /&gt;&lt;br /&gt;Z kota zrobie jutro &lt;span style=&quot;font-weight: bold;&quot;&gt;gyros.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;&lt;br /&gt;update: &lt;/span&gt;&lt;span&gt;jeśli ktoś zna jakiś framework, który rzeczywiście na podstawie schematu bazy i modelu, jest w stanie wygenerować skrypt sql ze zmianami jakie należy wprowadzić w bazie, niech da mi prosze znać na maila lub w komentarzach. W JPA szukałem i się nie doszukałem.&lt;br /&gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/8111973701798599773/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/8111973701798599773' title='Komentarze (5)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/8111973701798599773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/8111973701798599773'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2008/06/migracje-bazodanowe-czego-w-javie-nie.html' title='Migracje bazodanowe: czego w Javie nie znajdziemy?'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-5876831793362979741</id><published>2008-06-21T19:10:00.000+02:00</published><updated>2008-06-21T19:13:45.664+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="personalne niebanalne"/><title type='text'>Świat kawy</title><content type='html'>Kawa, źródło życia chyba większości programistów. Chociaż staram się ograniczać, bo by mój żołądek nie wytrzymał, to jednak poranka przed kompem nie wyobrażam sobie bez kubka gorącej kawy z mlekiem.&lt;br /&gt;&lt;br /&gt;Tym wstępem nie zaczynam jakiegoś referatu, czy innej rozprawki. Nie bójcie się o to, przynudzać nie będę. W zamian, będę się chwalił. A dokładnie będę się chwalił moją narzeczoną, która zaliczając 4 roku studiów na Architekturze Wnętrz popełniła coś takiego:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVwE7Y9M55tuziJCzBq1D3vR0RtIUERLDadIN1r1tWdfbPeeFKyNDDy6pDR2YVs7hlEPftSrNEL8WEtO2PDAsOo0aFAyBIwidOwP-B0pffRkClNVbvYaULDuCc6tFiGHqswmLWUFX6trY/s1600-h/madzia-dala-rade.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVwE7Y9M55tuziJCzBq1D3vR0RtIUERLDadIN1r1tWdfbPeeFKyNDDy6pDR2YVs7hlEPftSrNEL8WEtO2PDAsOo0aFAyBIwidOwP-B0pffRkClNVbvYaULDuCc6tFiGHqswmLWUFX6trY/s400/madzia-dala-rade.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5214382807714863122&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;(&lt;a href=&quot;http://www.digart.pl/praca/2078544/swiat_kawy.html&quot;&gt;źródło&lt;/a&gt;)&lt;/div&gt;&lt;br /&gt;Chociaż ona uważa, że nie jest to jej najlepsza praca i miewała ciekawsze, to jednak dla mnie to jest mistrzostwo (czy jak mawiała moja polonistka miczostwo). Do takiego sklepu na filiżankę kawy chętnie bym przychodził. Jest to dla mnie zupełnie inna jakość, coś znacznie ciekawszego od tego, do czego przyzwyczaiły nas centra handlowe.&lt;br /&gt;&lt;br /&gt;Może przesadzam, w końcu wszystko co wyjdzie z łap Magdy wydaje mi się zajebiste, ale osobiście uważam, że ten projekt dał radę.</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/5876831793362979741/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/5876831793362979741' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/5876831793362979741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/5876831793362979741'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2008/06/wiat-kawy.html' title='Świat kawy'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVwE7Y9M55tuziJCzBq1D3vR0RtIUERLDadIN1r1tWdfbPeeFKyNDDy6pDR2YVs7hlEPftSrNEL8WEtO2PDAsOo0aFAyBIwidOwP-B0pffRkClNVbvYaULDuCc6tFiGHqswmLWUFX6trY/s72-c/madzia-dala-rade.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-8387846762033583635</id><published>2008-06-21T13:00:00.000+02:00</published><updated>2008-06-21T13:03:14.664+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java killers"/><title type='text'>Java Killers #008</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqQ6zmWkg3LSBy5Jaqo-7Bec5-aKfFDFhjKUz3jjSaeEJkxxQqZkJ76Ak8ZMs_IwhXuQJgO5bqxhrW2jOZgeQ-bOIIQuHj05M3KJTOEb4X0eoYEj3zvTwx5QtqCDZOZUKVW_vynlGpCkQ/s1600-h/hitman.jpg&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqQ6zmWkg3LSBy5Jaqo-7Bec5-aKfFDFhjKUz3jjSaeEJkxxQqZkJ76Ak8ZMs_IwhXuQJgO5bqxhrW2jOZgeQ-bOIIQuHj05M3KJTOEb4X0eoYEj3zvTwx5QtqCDZOZUKVW_vynlGpCkQ/s200/hitman.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5214082960609506706&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Witam po dłuższej przerwie w kolejnej odsłonie cyklu Java Killers. Standardowo bez dłuższych wstępów, przejdziemy od razu do kodu, by główkować, dziwić się i przeklinać.&lt;br /&gt;&lt;br /&gt;Oto on:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class=&quot;keyword-directive&quot;&gt;package&lt;/span&gt; javakillers.part008;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;comment&quot;&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;comment&quot;&gt; * &lt;/span&gt;&lt;span class=&quot;ST0&quot;&gt;@author&lt;/span&gt; &lt;span class=&quot;comment&quot;&gt;pawel&lt;/span&gt; &lt;span class=&quot;comment&quot;&gt;zainspirowany&lt;/span&gt; &lt;span class=&quot;comment&quot;&gt;koziolekweb&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;comment&quot;&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;keyword-directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;keyword-directive&quot;&gt;class&lt;/span&gt; Main&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;keyword-directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;keyword-directive&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;keyword-directive&quot;&gt;void&lt;/span&gt; main( String[] args )&lt;br /&gt;{&lt;br /&gt; foo(&lt;span class=&quot;keyword-directive&quot;&gt;null&lt;/span&gt;);&lt;br /&gt; foo((Object)&lt;span class=&quot;keyword-directive&quot;&gt;null&lt;/span&gt;); &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;keyword-directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;keyword-directive&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;keyword-directive&quot;&gt;void&lt;/span&gt; foo(Object object )&lt;br /&gt;{  &lt;br /&gt;  System.out.print(&lt;span class=&quot;character&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;character&quot;&gt;object &lt;/span&gt;&lt;span class=&quot;character&quot;&gt;&quot;&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;span class=&quot;keyword-directive&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;keyword-directive&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;keyword-directive&quot;&gt;void&lt;/span&gt; foo(Object ... objects )&lt;br /&gt;{&lt;br /&gt;  System.out.print(&lt;span class=&quot;character&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;character&quot;&gt;objects &lt;/span&gt;&lt;span class=&quot;character&quot;&gt;&quot;&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Pytanie, jaki będzie wynik uruchomienia powyższego programu, pozostaje wciąż otwarte. Odpowiedzi do wyboru (do koloru):&lt;br /&gt;&lt;br /&gt;A) program się nie skompiluje&lt;br /&gt;B) program się skompiluje, ale wyrzuci java.lang.ClassCastException&lt;br /&gt;C) program się skompiluje, ale wyrzuci java.lang.NullPointerException&lt;br /&gt;D) program się skompiluje, uruchomi i wyświetli &quot;object object&quot;&lt;br /&gt;E) program się skompiluje, uruchomi i wyświetli &quot;objects objects&quot;&lt;br /&gt;F) program się skompiluje, uruchomi i wyświetli &quot;objects object&quot;&lt;br /&gt;G) program się skompiluje, uruchomi i wyświetli &quot;object objects&quot;&lt;br /&gt;&lt;br /&gt;Zanim przeczytasz rozwiązanie, spróbuj pomyśleć nad odpowiedzią.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiohvEmJPH6CBJcUI2rR-hzvgPhpRhTfDVumOOLWotOYwl1FjAiQx76e1nlpFOBvXzOlr5Dmml8yJaxydh9KqUvLGmKQNGBShSzR9A6k32CR8l-dvcnBzovKFXOXS92JMVqms0zI7CDWL0/s1600-h/hitman-answer.jpg&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiohvEmJPH6CBJcUI2rR-hzvgPhpRhTfDVumOOLWotOYwl1FjAiQx76e1nlpFOBvXzOlr5Dmml8yJaxydh9KqUvLGmKQNGBShSzR9A6k32CR8l-dvcnBzovKFXOXS92JMVqms0zI7CDWL0/s400/hitman-answer.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5214085269053010018&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Prawidłowa odpowiedź to &lt;span style=&quot;font-weight: bold;&quot;&gt;F) program się skompiluje, uruchomi i wyświetli &quot;objects object&quot;&lt;/span&gt;. Czemu? Żeby się dowiedzieć, musicie odwiedzić &lt;a href=&quot;http://koziolekweb.blogspot.com/&quot;&gt;blog koziołka&lt;/a&gt;, bo właśnie tam przeczytałem &lt;a href=&quot;http://koziolekweb.blogspot.com/2008/06/rzut-niczym.html&quot;&gt;post&lt;/a&gt;, który zainspirował mnie, do dzisiejszego odcinka cyklu Java Killers. Polecam!</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/8387846762033583635/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/8387846762033583635' title='Komentarze (4)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/8387846762033583635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/8387846762033583635'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2008/06/java-killers-008.html' title='Java Killers #008'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqQ6zmWkg3LSBy5Jaqo-7Bec5-aKfFDFhjKUz3jjSaeEJkxxQqZkJ76Ak8ZMs_IwhXuQJgO5bqxhrW2jOZgeQ-bOIIQuHj05M3KJTOEb4X0eoYEj3zvTwx5QtqCDZOZUKVW_vynlGpCkQ/s72-c/hitman.jpg" height="72" width="72"/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-3859007370726379299</id><published>2008-06-20T23:28:00.003+02:00</published><updated>2008-06-20T23:32:56.070+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="praca magisterska"/><title type='text'>Paradoks czasowo-przestrzenny</title><content type='html'>No i jeszcze z ciekawostek dzisiejszego dnia: dostałem informację od recenzenta, że praca magisterska jest już oceniona, po czym godzinę później dowiedziałem się od kolegi, że mój promotor mnie szuka,ponieważ moja praca magisterska jest jeszcze nie skończona...&lt;br /&gt;&lt;br /&gt;Hmm....&lt;br /&gt;&lt;br /&gt;Nie wiem do końca jak, czemu i w jaki sposób, ale jest jak jest. Mam ocenioną pracę, która podobno jeszcze nie jest skończona :) W poniedziałek czeka mnie wycieczka (hurra...) na Politechnikę, żeby sprawę wyjaśnić.&lt;br /&gt;&lt;br /&gt;Ps. Dostałem 5.0 z recenzji :)</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/3859007370726379299/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/3859007370726379299' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/3859007370726379299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/3859007370726379299'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2008/06/paradoks-czaso-przestrzenny.html' title='Paradoks czasowo-przestrzenny'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8092343615208752185.post-369785368091507200</id><published>2008-06-20T22:50:00.003+02:00</published><updated>2008-06-20T23:06:20.756+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="praca"/><title type='text'>Rozmowy rekrutacyjne - esencja cz. 2</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjssfAhuQgFO-KTADTF5FfxJ0D09k00gDizHeRPULrPCski0JQEBCPseiD1lRNmijz0hQeuYAs6i-ffS4inKsqupX27KclXH30yamxyuw97UiKYPo2gTxz7z6OjlPc1Aejcssb-2XC1rjQ/s1600-h/omg_itz_mah_dreem_job.jpg&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjssfAhuQgFO-KTADTF5FfxJ0D09k00gDizHeRPULrPCski0JQEBCPseiD1lRNmijz0hQeuYAs6i-ffS4inKsqupX27KclXH30yamxyuw97UiKYPo2gTxz7z6OjlPc1Aejcssb-2XC1rjQ/s200/omg_itz_mah_dreem_job.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5214066835807835010&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Kolejna ciekawą sprawą jest fakt, że na rozmowach rekrutacyjnych nie za wiele osób sprawdza wiedzę praktyczną. Zwykle osoba rekrutująca pyta się o poszczególne etapy kariery wypisane w CV, zadając pytania typu &quot;Co było największym osiągnięciem w firmie X&quot;, &quot;Jakie były Twoje zadania, gdy pracowałeś w Y&quot;. Udzielając odpowiedzi na nie pokazujemy rekrutującemu czy po pierwsze na prawdę tam pracowaliśmy (można być zatrudnionym jako programista, a w praktyce podawać kawę przez większość dnia). Poza tym sprawdzane jest jaki był nasz zakres kompetencji, jakie były stawiane przed nami problemy i co takiego tak na prawdę wnieśliśmy do firmy. Wszystko fajnie, z tym, że uważam, że dobry ściemniacz i lawirant, poradziłby sobie bez problemu w opowiadaniu czego on nie zrobił i jak pięknie to nie działało. Każdy może przecież upiększać i koloryzować swoje osiągnięcia. Dlatego dziwi mnie fakt, że na rozmowach o pracę nie proszono mnie o pisanie choćby kawałka kodu. A to przecież kod tak na prawdę świadczy o programiście.&lt;br /&gt;Często pojawiają się pytania z dziedziny informatyki, Javy, wzorców projektowych. I to już jest rzeczywiście fajnie, ale uważam, że to wciąż za mało i choćby kawałek kodu do napisania mówił by o wiele więcej, niż tysiące sztampowych, powtarzających się w kółko pytań. W  idealnym układzie powinno się prosić o napisanie choćby kawałka kodu, lecz nie zostawiać programisty samemu sobie, a patrzeć jak podchodzi do problemu. Ocenić logiczne myślenie, (nie)szablonowość, radzenie sobie z problemami. Żywe zadanie, żywy problem - to powinno być esencją rozmowy rekrutacyjnej. Chyba tylko w czasie jednej rozmowy o pracę poproszono mnie o napisanie kawałka kodu.&lt;br /&gt;&lt;br /&gt;Można zadać sobie pytanie - a co mnie to obchodzi, przecież to nie ja rekrutuje. Niby tak i też nie do końca. Zakładając, że idę do pracy do takiej firmy, gdzie rekrutacja była poprowadzona po łebkach, mogę się spodziewać, że do mojego zespołu trafią: lawiranci, lenie, ściemniacze, cieniasy (lub hybrydy powyższych). O atmosferze pracy świadczy team! Chce pracować z ludźmi fajnymi, ale również osobami, które coś ze sobą wnoszą, kompetentnymi.&lt;br /&gt;Oczywiście jest okres próbny, w praniu wychodzi, kto tak naprawdę się nadaję i każde kłamstewko wypowiedziane w czasie rozmowy o pracę wyjdzie na jaw. Dziwi mnie tylko fakt, że pracodawcom nie przeszkadza taki tryb. Osobiście uważam, że rekrutacja na stanowisko programisty powinna sprawdzać wiedzę kandydata rzetelnie, dokładnie i do bólu. Przynajmniej na to byłem przygotowany, a w kilku firmach nawet nie słyszałem pytań sprawdzających wiedzę, pracodawca brał wszystko na słowo. Dziwi mnie to, ale może rzeczywiście nie mnie to osądzać.&lt;br /&gt;&lt;br /&gt;Oczywiście nie powinienem też dramatyzować. Kilka firm przeprowadziło rzetelne rozmowy rekrutacyjne i jeśli kiedykolwiek miałbym usiąść po drugiej stronie stołka, być osobą zadającą pytania, na pewno korzystałbym z doświadczenia z tamtych spotkań, które uważam za naprawdę udane.</content><link rel='replies' type='application/atom+xml' href='http://paulszulc.blogspot.com/feeds/369785368091507200/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8092343615208752185/369785368091507200' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/369785368091507200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8092343615208752185/posts/default/369785368091507200'/><link rel='alternate' type='text/html' href='http://paulszulc.blogspot.com/2008/06/rozmowy-rekrutacyjne-esencja-cz-2.html' title='Rozmowy rekrutacyjne - esencja cz. 2'/><author><name>Paweł</name><uri>http://www.blogger.com/profile/07160103602401451907</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIXHZSNV_mTZiE0reEzgS0WPtFVZ5281uSWkUZXLLGC2U3VC9xK8jEn6GQHJPs5MI2rIw4Phg1-nDwEZrRPxjGjXvM7xi3qAwgdch1kUu7KDhzeZIFQV-OuxUFEVJH9Ec/s220/SNC00217.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjssfAhuQgFO-KTADTF5FfxJ0D09k00gDizHeRPULrPCski0JQEBCPseiD1lRNmijz0hQeuYAs6i-ffS4inKsqupX27KclXH30yamxyuw97UiKYPo2gTxz7z6OjlPc1Aejcssb-2XC1rjQ/s72-c/omg_itz_mah_dreem_job.jpg" height="72" width="72"/><thr:total>2</thr:total></entry></feed>