poniedziałek, 31 maja 2010

Lipcowy numer Software Developer's Journal

Witam!

Ostatnio pismo Software Developer's Journal zmieniło strategię wydawania nowych numerów,- zrezygnowano z płatnej, papierowej wersji na rzecz bezpłatnej, elektronicznej. Co najciekawsze - do Archiwum dodawane są kolejne numery SDJ z dawnych lat, które również są bezpłatne. Nie pozostaje nic tylko czytać i czytać :)

Czemu najnowszy numer SDJ tak mnie zainteresował? Z kilku powodów:
  1. Artykuł Marcina Lusy "Przegląd Java EE 6 - Czyli duża platforma w małym skrócie" porusza ciekawe kwestie takie jak (wspomniane również w screencast'cie Jacka Laskowskiego) konfiguracja aplikacji za pomocą adnotacji, asynchroniczne przetwarzanie zadań, nowości w EJB 3.1 i JPA 2.0
  2. "Dokąd zmierza Web. Czyli stąd do Matrixa" Marka Głowackiego opisuje w telegraficznym skrócie historię Web od 0.1 do 3.0 w bardzo przystępny sposób.
  3. Dowiedziałem się, że w SDJ publikowany jest poradnik dla osób pragnących dobrze przygotować się do certyfikatu SCJP - w lipcowym numerze ukazała się IV część serii.
  4. Pierwsza część kursu Pythona (nie wiem czemu, ale zawsze chciałem zobaczyć ten język w akcji, ale nigdy nie starczało na to czasu)

W momencie, gdy redakcja SDJ ogłosiła zmianę strategii wydawania gazety zastanawiałem się co będzie z materiałami dołączanymi na płytach? Zapewniano, że materiały będą umieszczane na stronie magazynu i tak też faktycznie się stało! Pojawiły się cztery pierwsze odcinki kursu firmy BNS IT o podstawach Javy SE i EE. Osobiście jakiś czas temu przerabiałem ten kurs (wydano jego 6 z 12 docelowych części) i choć mogłoby być lepiej (a w wielu momentach nawet powinno) to kurs uważam za świetny wstęp do JEE, dzięki któremu sam zacząłem wreszcie bawić się tą platformą :) Kurs dostępny jest pod tym adresem (400+ MB!).

Do usłyszenia!

wtorek, 25 maja 2010

Cytaty #1

Witam!

Lekko zażenowany swoim ostatnim wpisem zacząłem nadrabiać swoje braki w polskiej blogsferze. Czytając niektóre wpisy natrafiłem na dwa bardzo trafne stwierdzenia, które w gruncie rzeczy nie wymagają komentarza:

Sławomir Sobótka "W co się bawić":
"Zastanawiam się, czy nie jest przypadkiem tak, ze środowisko Javowe jest cały czas na etapie onanizmu technicznego spowodowanego zalewem mniej lub bardziej udanych narzędzi, bibliotek i frameworków, które po prostu rozpraszają uwagę od kwestii na prawdę istotnych."

Robert C. Martin (z wpisu Jakuba Nabdralika "Open Code Review"):
"Every good programmer should get used to professional code review. Bad programmers can benefit from it even better. And if you have some Prima Donnas in your team, unwilling to hear constructive critique to their code... screw them. Nobody's able to work with them anyways."

Co jakiś czas będę umieszczał na blogu znalezione cytaty z trzech powodów:
  1. Są to (według mnie) naprawdę wartościowe słowa!
  2. Ku pamięci
  3. W imię bycia lepszym bloggerem idąc w ślad za Jeffem Artwoodem :-)

Pozdrawiam i do następnego razu!

niedziela, 23 maja 2010

Pierwsze próby z JNDI i DataSource

Witam!

Ostatnio wspominałem, że zacząłem swoją zabawę z Java Enterprise Edition. Aplikacja, którą piszę ma za zadanie komunikację z bazą danych i wyświetlać z niej wyniki. Nie było by problemu, gdybym w czasie tworzenia aplikacji korzystał z jednej bazy, a tak korzystam z trzech - lokalnej, na wirtualnym serwerze oraz znajdującej się na serwerach uczelnianych. Z początku po prostu zmieniałem parametry przy połączeniu via JDBC, ale takie rozwiązanie mnie nie satysfakcjonowało. Poczytałem trochę, popytałem i dowiedziałem się, że idealnym rozwiązaniem było by JNDI + DataSource. W sieci można znaleźć sporo informacji na ten temat (szczególnie w kontekście Springa, którym zajmę się dopiero za dłuższy czas), ale ja szukałem totalnego minimum i świadomości jak to działa. Z pomocą przyszedł Paweł Cegła, który pokazał mi praktyczne zastosowanie JNDI i DS w projekcie. Teraz krótko (za Pawła zgodą) opiszę jak najprościej i najszybciej skonfigurować naszą aplikację, aby uzyskać dostęp do bazy danych, a w przypadku zmian parametrów ograniczało się to zaledwie do edycji jednego pliku.

Na początek tworzymy nowy projekt: File -> New -> Dynamic Web Project. Ja nadałem projektowi nazwę "JNDI_and_DS" i moja konfiguracja wygląda następująco:

Po stworzeniu projektu ma on następującą strukturę:

Dane konfiguracyjne aplikacji webowej umieszczamy w katalogu WebContent -> META-INF. Należy w nim utworzyć plik XML i nazwać go dokładnie context.xml:

Konfiguracja kontekstu aplikacji (bo o nim mowa) w najprostszej postaci wygląda następująco:

Jak widać składa się na nią kilka elementów:
  1. całość jest zawarta między znacznikami Context z parametrem path określającym ścieżkę (tzw. context path) do naszej aplikacji (należy pamiętać o znaku '/'!)
  2. pojedynczy zasób jest określony w obrębie znaczników Resource i posiada liczne atrybuty:
  • name - na podstawie tej nazwy będziemy wyszukiwać naszą konfigurację w kontekście aplikacji
  • auth - tu do wyboru mamy "Application" lub "Container". Ta druga opcja wskazuje, że w imieniu naszej aplikacji to kontener, w którym jest uruchamiana będzie zarządzał połączeniami z bazą danych i całym DataSource
  • type - ty wpisujemy jakiego typu zasób będziemy pobierać z kontekstu aplikacji odwołując się do jego nazwy (my chcemy DataSource, więc wpisujemy javax.sql.DataSource)
  • maxActive - maksymalna ilość połączeń w obrębie DataSource z bazą danych. Musi zgadzać się z konfiguracją samej bazy danych
  • maxIdle - maksymalna ilość tzw. uśpionych połączeń. Temat omówię w dalszej części posta
  • maxWait - ilość czasu (w ms), jaką maksymalnie aplikacja oczekiwać będzie na odpowiedź serwera baz dancyh
  • username - nazwa użytkownika w systemie baz danych
  • password - hasło wyżej wymienionego użytkownika
  • driverClassName - pełna ścieżka do pliku sterownika, za pomocą którego będzie wykonywane połączenie (ja korzystam z biblioteki JDBC i bazy MySQL, więc sterownik ten znajduje się w com.mysql.jdbc.Driver)
  • url - ścieżka dostępu do naszej bazy danych (wraz z jej nazwą)

Jeśli wypełnimy poprawnie wszystkie te pola, możemy przystąpić do napisania servletu, który za pomocą DataSource będzie komunikować się z naszą bazą danych. Ja przyjąłem wariant, w którym stworzyłem servlet, z którego będą dziedziczyć wszystkie servlety współpracujące z bazą danych, więc sam obiekt DataSource jest polem tejże klasy, a w metodzie init wyszukuję w kontekście aplikacji DataSource. Jak to mówią - raz a porządnie :)

Wygląda to mniej więcej tak:


public void init(ServletConfig config) throws ServletException {
super.init();

try {
InitialContext context = new InitialContext();
dataSource = (DataSource) context
.lookup("java:/comp/env/jdbc/JNDI_and_DS");
} catch (NamingException e) {
throw new ServletException("Problem z JNDI i DS");
}
}

Dziwne może wydawać się może, że szukamy referencji do DataSource (metoda lookup) pod inną nazwą niż ustawiliśmy w konfifuracji. Otóż na serwerze Tomcat 6, kontekst aplikacji znajduje się pod adresem "java:/comp/env/". Niestety jest to inna ścieżka na różnych serwerach aplikacji.

Do pełni szczęścia brakuje nam już tylko dodanie biblioteki MySQL Connector/J (wersja JDBC ze sterownikiem do baz danych MySQL) do katalogu lib w katalogu, w którym znajduje się serwer Tomcat 6 i już!

W przypadku aplikacji napisanej przeze mnie (link do projektu Eclipse zamieściłem na końcu posta) poprawna konfiguracja i uruchomienie aplikacji objawia się takim komunikatem:

Cały czas wspominam o DataSource, ale wciąż nie wytłumaczyłem co to tak naprawdę jest. Otóż jest to obiekt, który w naszym imieniu przechowuje pulę połączeń (tzw. connection pooling) oraz pomaga w procesie transakcji. W przypadku naszej prostej aplikacji daje nam to ten komfort, że jesteśmy w stanie określić wszystkie parametry związane z połączeniami oraz dochodzi element związany z wydajnością. W momencie kiedy kontener tworzy obiekt DataSource, przypisuje mu kilka tzw. uśpionych połączeń (idle connections). Dzięki temu, kiedy nasza aplikacja chce połączyć się z bazą danych, połączenie nie jest tworzone (a jest to proces dosyć czasochłonny, szczególnie w MySQL'u), a jedynie pobierane z puli i udostępniane. Kiedy kończymy pracę z danym połączeniem wraca ono do puli i czeka na ponowne użycie.

A teraz kilka linków:

Mam nadzieję, że wpis się komuś przyda :) Zachęcam do komentowania i do usłyszenia w kolejnym poście!

sobota, 15 maja 2010

Wrażenia z infoShare 2010

Witam.

Nie udało mi się pojechać na tegorocznego GeeCON'a, więc udałem się jak w zeszłym roku na darmową konferencję o tematyce IT, która miała miejsce 13-14 maja, a która jest organizowana na Wydziale Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej - infoShare 2010.

Zacznę dosyć nietypowo, bo od podsumowania plusów i minusów:
+ podzielenie prelekcji na dwie ścieżki - miękką i twardą
+ świetni prelegenci (np. Sławomir Sobótka z firmy Bottega, czy Marek Sokołowski z Oracle)
+ pyszny dzik (i nie tylko) w sopockim klubie Atelier :)
- brak gadżetów (ani nawet notatnika i długopisu do robienia notatek)
- niedobra kawa (i brak Red Bulla)
- brak weryfikacji przy rejestracji

A teraz po kolei, od początku...

Dzień 1 - konferencja
Tutaj niewiele uda mi się napisać. Zajęcia na uczelni i inne obowiązki skutecznie uniemożliwiły mi przybycie na dłużej niż na zarejestrowanie. W drodze na konferencję zachodziłem w głowę w którym budynku odbędzie się konferencja, gdyż w przeciwieństwie do zeszłego roku nie rozwieszono żadnych plakatów ani wskazówek (może poza 2 w samym budynku) gdzie należy się udać. Intuicja mnie nie zawiodła, ale z tego co się dowiedziałem niejedna osoba udała się do starego gmachu. Przy rejestracji zdziwiło mnie kilka rzeczy. Pierwsza to fakt, że poza powiedzeniem swojego nazwiska nie musiałem nic robić. Nie było żadnej listy, żadnego sprawdzenia dokumentu tożsamości - każdy mógł podejść i zabrać tak naprawdę jakikolwiek identyfikator, jeśli tylko zdążył przeczytać z niego nazwisko... Oprócz identyfikatora otrzymałem plan konferencji i... nic więcej! Nawet o ankietę musiałem ubiegać się następnego dnia, gdyż wydrukowano ich za mało.

Dzień 1 - integracja
O godzinie 20:00 w sopockim klubie Atelier rozpoczynała się impreza integracyjna. Zjawiłem się z dwójką znajomych skuszeni wizją kolacji z dzika :) Od praktycznie samego początku serwowano dania na ciepło, zimno, zakąski - każde z dań, którego próbowałem naprawdę mi smakowały. Nie było niestety muzyki przez dłuższy czas, co było trochę dziwnym uczuciem. Strasznie spodobała mi się reakcja pań, które siedziały naprzeciwko nas, gdy na salę wniesiono dzika - Żałuję, że nie miałem już wtedy wyjętego aparatu :D Skłamałbym, gdybym napisał, że mi nie smakowało i to bardzo :) Z uwagi na masę roboty musiałem dosyć wcześnie wyjść, ale i tak uznaję wieczór za bardzo udany. Dzięki chłopaki!

Dzień 2 - ścieżka twarda
Dzień drugi zacząłem od prelekcji Sławomira Sobótki pt. "Software Craftsmanship - Język wzorców projektowych językiem profesjonalistów.". Niestety prelekcja okazała się powtórką z 4Developers (miałem nadzieję, na choć drobne rozszerzenie treści lub może pójście trochę inną drogą), nawet żarty były te same ;) Co najciekawsze Sławek jest tak świetnym prelegentem, że ani przez chwilę nie byłem znudzony, wręcz przeciwnie. Wiele rzeczy utrwaliło mi się w głowie, do kilku wreszcie po przemyśleniu się przekonałem (o czym mam nadzieję niedługo napiszę na blogu). Bardzo dobra prelekcja, z której jestem bardzo zadowolony.

Po prelekcji o rzemiośle przyszedł czas na wystąpienie przedstawiciela firmy Oracle - Marka Sokołowskiego, który wygłosił wykład na temat "Świat danych poza bazą". Byłem wprost zachwycony prezentacją! Od samego początku mnóstwo przykładów, analogii, krótki wyjaśnień pojęć i technologii. Ale to, co najbardziej rzuciło mi się w oczy, to sposób, w jaki Marek przedstawiał swój temat. Gdy robił ruch ręką w prawo - publika patrzyła w prawo, gdy w lewo - publiczność zwracała głowy w lewo. Ciągła gestykulacja, nienaganna dykcja, pasja - w skrócie rewelacja. Dodać trzeba, że temat został tak przystępnie przedstawiony, że nawet osoba, która nie pracowała w życiu zawodowym lub akademickim z bazami danych bez problemu zrozumiała by ideę prezentacji. Dla mnie #1 konferencji! :)

Po Oracle było już tylko gorzej. Prezentacja IBM pt. "Od krosna Jacquarda do architektury hybrydowej - architektura systemów wczoraj i dziś." Piotra Pietrzaka okazała się w znacznej części (jak nie większości) reklamą sponsora. Przez to zachwalanie firmy IBM prezenterowi pozostało bardzo mało czasu na konkretne informacje, które chciał nam, słuchaczom, przekazać, co spowodowało niepotrzebny pośpiech, skracanie myśli i ogólny chaos. Czegoś takiego spodziewałbym się na sesji plakatowej, a nie na technicznej prelekcji...

Największe nadzieje dnia wiązałem z wykładem na temat sieci semantycznych, który okazał się moim osobistym największym rozczarowaniem dnia. Widać było, że prelegent ma spore doświadczenie w temacie, wie co przekazać. Czego zabrakło? Może lepszego sposobu przekazania wiedzy? Przez całą prezentację miałem wrażenie jakbym siedział na wykładzie na uczelni, miało to posmak akademicki. Było dużo ogólników, ciężko było wyłapać co z tego jest najważniejsze, co prelegent chce przekazać. Po tym wykładzie byłem już tak wymęczony, że postanowiłem nie zostawać na "Nowości w Silverlight 4" i po oddaniu ankiety pojechałem do domu.

Pomimo kilku większych (z mojego punktu widzenia) potknięć udział w konferencji uważam za udany. Nawet jeśli czasem z jakiejś prezentacji nie wyniosłem konkretnych nowych informacji, to zawsze tworzyły się nowe pomysły, przemyślenia, wnioski. Jestem ciekaw co (i czy w ogóle) organizatorzy przygotują na przyszły rok :) Poniżej kilka (dosłownie) fotek z konferencji i imprezy:


A skoro jesteśmy już w temacie zdjęć z konferencji - w czwartek ukazał się album zdjęć z konferencji GeeCON, która odbywała się w tym tygodniu w Poznaniu. Album jest dostępny pod tym adresem: http://picasaweb.google.com/geecon.org/GeeCON2010

Pozdrawiam i do następnego razu!

niedziela, 9 maja 2010

Eclipse SQL Explorer - Instalacja i konfiguracja

Witam.

Od jakiegoś czasu zacząłem prace nad aplikacją w JEE, której główną funkcją ma być komunikacja z bazą danych. Z powodu prostoty instalacji i zarządzania serwerem jak i bazami danych (oraz malutkim doświadczeniem) zdecydowałem się na MySQL Community Server w wersji 5. Przez pewien czas wszystko było dobrze, ale w pewnym momencie przełączanie się między narzędziami do obsługi bazą danych, a Eclipsem stało się męczące (szczególnie, że w domyśle baza będzie znajdować się na wirtualnym serwerze), więc postanowiłem poszukać jakiegoś rozwiązania. Po kilku chwilach spędzonych z wujkiem Google wybrałem plugin do Eclipse - SQL Explorer. Dzisiaj skoncentruje się na jego instalacji (w wersji plugin, gdyż SQL Explorer występuje również w wersji niezależnej aplikacji) oraz konfiguracji pod kątem baz MySQL. A więc zaczynamy!

Pierwsze co musimy zrobić to zainstalować plugin. Są dwie możliwości - poprzez repozytorium na SourceForge lub z archiwum. Wybrałem tą pierwszą, gdyż z archiwum miałem niemałe problemy. W Eclipse wybieramy z menu Help -> Install New Software:

W oknie Install klikamy na Add i wprowadzamy następujące dane:

Wybieramy Eclipse SQL Explorer i klikamy Next. Akceptujemy warunki licencji i klikamy Finish. W trakcie instalacji naszym oczom ukaże się poniższy komunikat:

Klikamy OK i zaznaczamy, że ufamy certyfikatowi Eclipse.org Foundation .Czekamy do końca instalacji, która powinna zakończyć się komunikatem:

Zgadzamy się klikając na Yes i czekamy aż Eclipse ponownie się uruchomi. Po ponownym uruchomieniu się naszego IDE wybieramy nową perspektywę - SQL Explorer (widoczną jedynie, gdy instalacja przejdzie pomyślnie):

Naszym oczom ukaże się coś takiego:

Przechodzimy do Window -> Preferences -> SQL Explorer i wybieramy JDBC Drivers:


Na tym etapie dostępny jest jedynie sterownik ogólny JDBC ODBC Brigde. Wybieramy z listy MySQL Driver i klikamy Edit. Z zakładce Extra Class Path klikamy na Add JARs... i wybieramy MySQL Connector/J (do ściągnięcia ze strony MySQL.com). W polu Driver Class Name wpisujemy ścieżkę do sterownika, czyli com.mysql.jdbc.Driver. Powinno to wyglądać następująco:

Po kliknięciu OK na liście sterowników MySQL powinien teraz mieć status dostępnego (ptaszek po lewej od nazwy), więc zaznaczamy go i klikamy na Set Default, a potem OK, aby zamknąć okno Preferences. W oknie Connections klikamy na ikonę Create New Connection Profile, gdzie zamiast wpisujemy adres naszej bazy danych (u mnie jest to localhost), w miejscu numer portu, na którym nasłuchuje nasz serwer (standardowo jest to 3306), a w miejsce nazwę bazy danych, z którą chcemy się połączyć. Okno powinno wyglądać podobnie do tego:

Klikamy OK i z listy rozwijanej naszego połączenia wybieramy naszego użytkownika. Klikamy na Connect po czym ukazuje nam się okno zalogowania do bazy:

Wprowadzamy hasło i klikamy OK. Jeśli wszystko pójdzie dobrze naszym oczom powinien ukazać się mniej więcej taki widok:

Gotowe! Teraz nie pozostaje nic innego jak wracać do właściwej pracy :) W dalszych postach postaram się opisać korzystanie z SQL Explorer. Zachęcam do komentowania i wyrażania swojego zdania :)

Do następnego razu!