sobota, 26 grudnia 2009

JMS z ActiveMQ

Nie miałem okazji/potrzeby przyglądać się z bliska JMS. Przy okazji świąt postanowiłem sobie spojrzeć na ten temat. Byłem mocno zaskoczony, że po prostu wszystko ot tak od strzału zadziałało. Spora zasługa w prostym i przejrzystym opisie Pawła Ryznara. Prezentuje on w nim kawałek kodu wysyłający wiadomość (Producer). Poniżej jako uzupełnienie kod odbierający wiadomość (Consumer)

wtorek, 22 grudnia 2009

Generowanie CSR (certificate signing request)

Staraliście się kiedyś ogarnąć wszystkie parametry OpenSSL? Po pierwsze jest ich ogrom, a po drugie zazwyczaj korzysta się z niego (openssl) niezbyt często. Dlatego za każdym razem na nowo trzeba przebijać się przez dokumentację. Dość sympatycznym narzędziem jest generator, który pozwoli szybko przygotować polecenie za pomocą którego wygenerujemy plik CSR oraz klucz. W tym celu wchodzimy na stronę https://www.digicert.com/easy-csr/openssl.htm podajemy odpowiednie parametry... klik i już mamy gotowe polecenie.

piątek, 11 grudnia 2009

GWT 2.0

Google wydało GWT w wersji 2.0! Wiele nowości, a wśród nich chyba najbardziej oczekiwany "developer-guided code splitting". Najlepiej przeczytajcie i oglądnijcie sami.

wtorek, 8 grudnia 2009

IntelliJ IDEA 9

Jetbrains wypuścił właśnie najnowszą wersję IntelliJ IDEA oznaczoną numerem 9. Jedna z istotniejszych nowości to darmowa wersja tego środowiska - Community Edition. Jest ona co prawda trochę okrojona, ale z pewnością w niektórych projektach znajdzie zastosowanie. Jedno jest pewne stosunek jakość/cena ma rewelacyjny.

Manning Publications - Countdown to 2010

Warto spojrzeć w wolnej chwili na stronę Manning Publications. Aktualnie prowadzona jest akcja "Countdown to 2010" i codziennie są nowe promocje. Raz ciekawsze, raz mniej. Wczoraj była zniżka 50% na wszystkie książki dostępne w MEAP. Skusiłem się na Groovy in Action, Second Edition. Miłym zaskoczeniem był fakt, że dostałem również pdfa z pierwszym wydaniem tej książki :)

niedziela, 6 grudnia 2009

"Renifer Niko ratuje święta" - ostrzeżenie

Ostatnio mało o Javie, a więcej o tematach pobocznych. Dzisiaj to już w ogóle temat oderwany ale nie mogę się powstrzymać. Ostrzegam wszystkich, którzy chcieliby się wybrać z małym dzieckiem na nową bajkę - "Renifer Niko ratuje święta". Nie wiem, kto przypisał jej kategorię bez ograniczeń, ale dla tej bajki wiek powinien być ustalony na poziomie minimum 5-6 lat. Wytrzymaliśmy ok. 30 minut...

czwartek, 3 grudnia 2009

Malutkie narzędzie do prezentacji kodu

W ramach rozrywki przygotowałem mikroskopijne narzędzie, które mam nadzieję znajdzie kilku użytkowników. Mianowicie chodzi o prezentację kodów źródłowych.
Sposób użycia:
  1. Wchodzicie na stronę http://pokazkod.pl/
  2. Wybieracie język w jakim jest wasz fragment kodu.
  3. Wklejacie kod.
  4. Wciskacie przycisk "Wyślij".
Proste? :)
W wyniku tej operacji po pierwsze otrzymacie adres strony, pod którą jest widoczny kod - możecie się nim podzielić ze znajomymi, umieścić w komentarzach itd. itp. Dodatkowo możecie wykorzystać wygenerowany kod (iframe) i umieścić go na waszej stronie, blogu itp. Tutaj możecie zobaczyć jak wygląda efekt końcowy.
Jakie zalety:
  • nie planuję usuwania kodu, kiedykolwiek
  • banalna obsługa
  • łatwe umieszczanie kodu na innych stronach
Mam nadzieję, że ktoś zacznie korzystać z tego. A jeżeli tak to mam jeszcze kilka pomysłów w zanadrzu jak to rozwinąć. Czekam na ewentualne komentarze.

wtorek, 1 grudnia 2009

MySQL - 21 porad

Chyba każdy był na spotkaniu z MySQL. Polecam bardzo sympatyczny artykuł przedstawiający w przejrzysty sposób, z wieloma przykładami jak wycisnąć jeszcze więcej z tej popularnej bazy danych.

piątek, 27 listopada 2009

Dawno temu na Wykopie...

Dawno temu (22.06.2007) na Wykopie pojawił się pewien film. Lubię do niego czasami wrócić - za każdym razem muszę się go naszukać. Dlatego dzielę się nim z Wami, a przy okazji będzie mi go łatwiej znaleźć ;)

Lip Dub - Flagpole Sitta by Harvey Danger from amandalynferri on Vimeo.


Przy okazji odkryłem OpenWRT - nie wiedziałem, że z tak małego pudełka Linksysa można wykrzesać tyle możliwości. Polecam!

wtorek, 13 października 2009

Komentowanie kodu

Jestem w trakcie lektury "Clean Code. A Handbook of Agile Software Craftsmanship". Książka zawiera ogrom wiedzy, która mogłoby się wydawać niewiele zmienia w naszym codziennym pisaniu. Jestem dopiero na jej początku (rozdział 4 - Comments), jednak już zauważyłem że na kilka spraw zaczynam spoglądać trochę inaczej.
Wszyscy, zawsze i wszędzie mówią: "komentarze muszą być wszędzie", a tu proszę:

Comments are not like Schindler's List. They are not "pure good." Indeed, comments are, at best, a necessary evil.

I dalej:

The proper use of comments is to compensate for our failure to express ourself in code. Note that I used the word failure. I meant it.


Chyba się zgodzicie, że coś w tym jest? Swoją drogą polecam książkę, a sam jestem ciekaw co dalej.

poniedziałek, 7 września 2009

Spring Security + Tomcat + Kerberos/NTLM

Jakiś czas temu wspominałem o udanym uruchomieniu autoryzacji z wykorzystaniem Kerberosa w aplikacji używającej Spring Security uruchomionej na Apache Tomcat. W tym celu wykorzystałem bibliotekę napisaną przez Dominique Guerin. Dostępna jest na tomcatspnego.codeplex.com. Na tej samej stronie znajdziecie prosty przykład współpracujący właśnie z Spring Security mojego autorstwa. W razie pytań służę pomocą.

niedziela, 6 września 2009

Moje początki z Grails

Od pewnego czasu śledziłem z zainteresowaniem wpisy Jacka Laskowskiego oraz Mateusza Mrozewskiego na temat Grails. W końcu przyszedł czas żeby samemu spojrzeć na nie z bliska :) Książkę "Begining Groovy and Grails" zmieliłem błyskawicznie. Super napisana - czyta się łatwo i przyjemnie. Do tego uwypuklone zaskakujące możliwości Grooviego oraz Grailsów przekonywały mnie, że był to dobry krok.
W końcu przyszedł czas na sprawdzenie w praktyce jak to wszystko działa. Postanowiłem przepisać na Grailsy i trochę rozbudować to co przygotowałem jakiś czas temu w PHP - http://motorowodne.zapisy.net/. Proste, a jednak pozwalające na sprawdzenie kilku rzeczy. Jestem po dłuższej chwili zabawy. Pierwsza rzecz, która mnie zatrzymała to walidator dla numeru PESEL. Skończyło się na chwilę obecną na takim kawałku kodu:


Mam wrażenie, że da się to dość mocno zwinąć. Jakieś podpowiedzi?
Kolejną rzeczą, która mi zabrała chwilę to testy jednostkowe walidatorów. Jeżeli staniecie przed tym problemem to bez lektury na temat mockForConstraintsTests nie posuniecie się dalej. To tyle na dzisiaj :)

czwartek, 6 sierpnia 2009

Kerberos. Nareszcie działa!

Ostatnio dużo czasu poświęciłem Kerberosowi. Dokładnie mówiąc celem moich prac było uruchomienie Tomcata wraz z Kerberosem w łatwy, szybki i przyjemny sposób. Po niezliczonej liczbie prób, załamań, ślepych zaułków udało mi się to uruchomić. Żeby nikt więcej nie musiał przez to przechodzić to krótko o moich doświadczeniach.
Jeżeli Tomcat pracuje na Linuksie w miarę bezproblemowo uruchomiłem Apache + mod_auth_kerb + Apache Tomcat. Mając to skonfigurowane myślałem, że jest po sprawie. Przecież Apache jest też dla Windowsa, więc przeniosę konfigurację 1:1...
Gdybym wtedy wiedział jak mocno się myliłem. Okazało się, że nikomu (albo nikt się nie pochwalił) nie udało się skompilować/uruchomić mod_auth_kerb pod Windowsem. I tu zaczęły się schody.
Na szczęście znalazłem świeżuteńki projekt tomcatspnego (autor: Dominique Guerin). O dziwo zadziało praktycznie od palca, no może z niewielkimi trudnościami.
Podsumowując, uważam że takie rozwiązanie jest (przynajmniej w moim przypadku) najlepsze:
  • serwer na Linuksie: Apache (mod_auth_kerb) + Apache Tomcat
  • serwer na Windowsie: Apache Tomcat + tomcatspnego
Mam przygotowany mały, przykładowy projekt pokazujący wykorzystanie tomcatspnego wraz ze Spring Security. Postaram się wkrótce opisać sposób konfiguracji i załączyć źródła. Będę też musiał odtworzyć procedurę konfiguracji mod_auth_kerb więc ją też z pewnością opisze. Tak więc spodziewajcie się wkrótce jeszcze dwóch postów o kerberosie :)

piątek, 31 lipca 2009

Java, wyrażenia regularne i "\"

Mamy ciąg znaków, żeby daleko nie szukać NAZWADOMENY\uzytkownik. Chcemy podzielić go względem "\". Jeżeli się wie jak to jest w miarę prosto :)
Dlaczego aż cztery "\"?
Jak pamiętamy (lub sprawdzimy w Java API) split przyjmuje jako parametr wyrażenie regularne. W wyrażeniach regularnych "\" jest znakiem "specjalnym". Dlatego:
  • \ - w Javie jest to escape character (tłumaczenia na polski nie pasują mi...)
  • \\ - mamy już naszego backslasha w wyrażeniu regularnym, ale w nim jest on właśnie escape character ;) dlatego potrzebujemy jeszcze jednego backslasha
  • \\\\ - w wyrażeniu regularnym będzie to \\ a więc \ :)
Uf...

środa, 29 lipca 2009

Przydatne narzędzia przy tworzeniu stron WWW

Natknąłem się dzisiaj na wykaz wyjątkowo ciekawych narzędzi, które się przydadzą każdemu kto od czasu do czasu musi zrobić coś większego korzystając z HTML i CSS. Te, które wydają się najbardziej przydatne z moojego punktu widzenia to:
  1. Typetester - testowanie różnych krojów i stylów tekstu. Trzy teksty obok siebie pozwalają na łatwy wybór najlepszego rozwiązania.
  2. CSS Type Set - wklejamy tekst i za pomocą wygodnego interfejsu modyfikujemy jego wygląd.
  3. HTML-ipsum - w przeciwieństwie zwykłego generatora Lorem ipsum generuje przykładowe teksty w formie: długich i krótkich akapitów, list itp. Tutaj znajdziecie wykaz innych generatorów Lorem ipsum.
Więcej narzędzi na stronie webdesigner depot. Z pewnością każdy znajdzie coś dla siebie.

niedziela, 26 lipca 2009

Mazury z dzieckiem - po urlopie

Po przerwie wróciłem turystycznie na Mazury. Dwa tygodnie na jachcie Maxus 24, który w tym miejscu chcę polecić: szybki i wygodny. Według danych może nim pływać maksymalnie 8 osób, jednak nie wyobrażam sobie tego. Po raz pierwszy wzięliśmy na pokład syna (2 lata i trochę). Trasa żeglarsko krótka (Węgorzewo - Leśna Keja (j. Boczne) - Węgorzewo), ale tym razem priorytetem była wygoda i zabawa dla dzieci.
Dla osób, które wybierają się z dziećmi chciałbym polecić dwa miejsca, które zrobiły na nas bardzo pozytywne wrażenie.
Pierwszy z nich to Ognisty Ptak. Genialny plac zabaw, tawerna którą koniecznie trzeba zobaczyć, super obsługa i dobre sanitariaty. Co najważniejsze w tym miejscu nie ma się żadnych obaw żeby dziecko biegało na bosaka, co chyba w dzisiejszych czasach jest rzadkością. Ponadto świetne zejście do wody, ratownik, oznaczone kąpielisko. Cena postoju: 15zł/jacht + 15zł/osoba dorosła. W cenie sanitariaty bez ograniczeń + 1 prysznic.


Drugie miejsce to ośrodek Stranda na wejściu do kanału Giżyckiego od strony jeziora Kisajno. Bardzo dobre jedzenie, wzorcowe sanitariaty, przyjemny plac zabaw. Koszt cumowania 20zł/jacht + 6zł/osoba dorosła. W cenie korzystanie z sanitariatów bez ograniczeń (prysznice płatne dodatkowo).


Poza tym place zabaw znaleźliśmy w Sztynorcie. W Wilkasach (AZS Wilkasy) dobre zejście do wody ale niestety śmieci, szkło, puszki na plaży nie zachęcają do zabawy. Całkowite rozczarowanie to Węgorzewo bez jakichkolwiek atrakcji dla najmłodszych oraz sanitariatami, które wyglądają tak samo jak je widziałem z 10 lat temu. Mamerki ten sam obraz, żadnego postępu. Wierzę, że kiedyś się to jednak zmieni...
Niestety urlop się skończył i czas wrócić do Javy... Przy okazji czy ma ktoś pod ręką skonfigurowane rozwiązanie Windows + Tomcat + Kerberos? Problem rozwiązałem pod Linuksem wykorzystując Apache (mod_auth_kerb) + Tomcat.

czwartek, 25 czerwca 2009

Tomcat - unieważnianie sesji podczas restartu

Unieważnianie sesji podczas restartu Tomcata mogłoby wydawać się mało istotne, ale w pewnych okolicznościach jego brak może prowadzić do zaskakujących i niechcianych efektów. Przykład?
  1. Odpalamy Tomcata,
  2. Logujemy się do aplikacji,
  3. Zatrzymujemy Tomcata,
  4. Przepinamy się na inną bazę,
  5. Odpalamy Tomcata,
  6. Otwieramy aplikację,
  7. Oooops jesteśmy zalogowani i do tego jako inny użytkownik.
Tak więc w takim przypadku dobrze jest automatycznie unieważnić wszystkie sesje podczas zatrzymywania Tomcata. Jak?

<Context docBase="...">
<Manager className="org.apache.catalina.session.StandardManager" pathname="">
</Manager>
</Context>

wtorek, 9 czerwca 2009

piątek, 29 maja 2009

GeeCON - zdjęcia

Jeżeli ktoś nie odwiedzał ostatnio strony GeeCONa to warto - pojawiły się zdjęcia. Jest ich naprawdę dużo. Są tu, tu i tu :)

piątek, 8 maja 2009

GeeCON - dzień drugi. Podsumowanie

Zakończyła się pierwsza edycja konferencji GeeCON. Drugi dzień obfitował w równie ciekawe wykłady. Tym razem na pierwszym miejscu stawiam "What's new in Java EE 6" (Antonio Goncalves). Ponadto w dalszym ciągu świetna organizacja oraz drobne problemy sprzętowe (na koniec okazało się, że rozwiązanie problemów było dość zaskakujące: laptopy marki Apple mogły działać tylko w sali nr 6 :) )
Dołączam się do podziękowań Marka i nie pozostaje nic innego jak czekać na kolejne edycje GeeCONa. A w najbliższym czasie trzeba odwiedzić stolicę (JAVArsovia).

"I can't find the format file `latex.fmt'"

Temat zaskakujący ale za dużo poświęciłem na niego czasu aby nie opisać. Zaznaczam, że jestem totalnym amatorem jeżeli chodzi o LaTeX'a.
Ostatnio po aktualizacji MikTeX'a miałem problem z pakietem polski. Problem objawiał się komunikatem o problemie z:  \selecthyphenation{polish}. Niestety nie udało mi się znaleźć rozwiązania (jeżeli ktoś zna proszę o komentarz) i postanowiłem spróbować użyc TeX Live. Jednak i tutaj pojawił się problem objawiający się komunikatem jak w tytule.
Rozwiązanie jest proste i mam nadzieję, że komuś się przyda.  Należy wykonać dwa polecenia:


fmtutil-sys -all
mktexlsr

czwartek, 7 maja 2009

GeeCON dzień pierwszy

Podsumowująć krótko, a nawet bardzo krótko:
  • świetna organizacja,
  • strzał w 10-tkę z lokalizacją (Multikino),
  • dobrze dobrane i ciekawe ścieżki
  • drobne problemy sprzętowe
Zobaczymy co przyniesie jutrzejszy dzień. Jak narazie dla mnie naciekawsze prezentacja: Václav Pech - "Practical Groovy".

niedziela, 3 maja 2009

Po długim weekendzie

Świetna pogoda sprawiła, że udało mi się przetrwać praktycznie cały długi weekend bez otwierania komputera :)  Dzięki temu udało odkryłem jak z telefonu z Symbianem i wifi zrobić access pointa - zamiast laptopa do sieci podpiąłem się korzystając z ipoda i kiepskiego górskiego połączenia przez telefon komórkowy. Jakby ktoś był w podobnej sytuacji to taką możliwość daje JoikuSpot. Dostępne są dwie wersje darmowa oraz premium. Więcej szczegółów na stronie.
Ponadto skończyłem lekturę Wicket in Action tak więc postaram się w najbliższych dniach podzielić wiedzą z kolejnych rozdziałów.

piątek, 24 kwietnia 2009

ANT i UTF-8

Ostatnio spotkałem się z dziwnym problemem. Projekt skompilowany w IntelliJ IDEA - wszystko ok. Odpalam Ant'a - kompilacja przebiega pomyślnie, ale po odpaleniu aplikacji zaczynają się problemy z polskimi znaczkami. Rozwiązanie dość proste ale trochę się naszukałem ;)
Wystarczy przy wywołaniu kompilacji (tag <javac>) dodać kolejny atrybut encoding="UTF-8". Proste, ale potrafi napsuć krwi.

środa, 22 kwietnia 2009

Apache 2.2 + Apache Tomcat + ErrorDocument

Opis sytuacji:
Serwer Apache HTTP Server z przodu, za nim Apache Tomcat 6.0.18. Wszystko połączone ze sobą za pomocą mod_jk.

Problem:
W przypadku braku połączenia z Tomcatem należy wyświetlić ładny komunikat o tymczasowych problemach i próbować odświeżyć stronę co 10 sekund w celu sprawdzenia czy Tomcat nie jest ponownie dostępny.

Rozwiązanie:
Mogłoby się wydawać, że banalne. W pliku konfiguracyjny Apache HTTP ustalenie ErrorDocument i po sprawie. Niestety nie do końca tak jest.
Ale od początku. Musimy przekazać do strony obsługującej stronę błędu parametry. Odpada nam więc wykorzystanie ErrorDocument w postaci bezwględnego adresu. Jak więc to zrobić?
  1. Przygotujemy alias /error wskazujący na katalog /var/www/error

    <Directory "/var/www/error">
    AllowOverride None
    Order allow,deny
    Allow from all
    </Directory>

    Alias /error /var/www/error



  2. W katalogu /var/www/error tworzymy plik 503.php o następującej zawartości

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" >
    <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <meta http-equiv="Refresh" CONTENT="10; URL=http://<?php echo $_SERVER['HTTP_HOST'];?>">
    <title>Serwer Tomcat tymczasowo niedostępny - proszę czekać</title>
    <style type="text/css" media="all">
    h1
    {
    color: red;
    }
    </style>
    </head>
    <body>
    <h1>Serwer Tomcat tymczasowo niedostępny - proszę czekać</h1>
    </body>
    </html>



  3. Musimy poinformować serwer http żeby pliki *.php nie były przekazywane do Tomcata. Jest to kluczowa rzecz, z którą miałem największy problem.

    SetEnvIf Request_URI "/*.php" no-jk



  4. Pozostało już tylko wskazać dokument, który ma być wywoływane w przypadku błędu 503.

    ErrorDocument 503 /error/503.php


środa, 8 kwietnia 2009

Rozdział 3. Budujemy pierwszą aplikację (część I)

W rozdziale trzecim zostały zebrane wszystkie informacje w całość. Autorzy budują prostą aplikację, której zadaniem jest sprzedaż różnego rodzaju serów (jeden z autorów książki jest Duńczykiem i w rozdziale drugim twierdził, że jest ich miłośnikiem...). Tak jak zostało to wspomniane w poprzednich rozdziałach każda aplikacja musi mieć główną klasę rozszerzającą WebApplication. Zwraca ona stronę główną w metodzie:

public Class getHomePage()
{
return Index.class; // klasa reprezentująca stronę główną
}

W rozdziale szczególna uwaga została skupiona na wyświetlaniu różnego rodzaju list. W Wicket jest to zadziwiająco przyjemne. Zacznijmy od prostej listy bez stronnicowania. Stworzymy plik Index.html i klasę z nim związaną Index. Najpierw trochę kodu:
Index.html


<div wicket:id="books">
<h3 wicket:id="title">Tytuł książki</h3>
<p wicket:id="autor">Autor</p>
<p wicket:id="cena">Cena</p>
<a wicket:id="dodaj" href="#">do koszyka</a>
</div>
<wicket-remove>
<div wicket:id="books">
<h3 wicket:id="title">Tytuł książki</h3>
<p wicket:id="autor">Autor</p>
<p wicket:id="cena">Cena</p>
<a wicket:id="dodaj" href="#">do koszyka</a>
</div>
</wicket-remove>
A teraz trochę magii i Wicket na podstawie powyższego kodu stworzy ładną listę :)
Index:


public class Index extends WebPage {
public Index() {
add(new ListView("books",BookStoreApplication.get().getBooks()){
protected void populateItem(ListItem listItem) {
Book book = (Book) listItem.getModelObject();
listItem.add(new Label("tytul", book.getTitle()));
listItem.add(new Label("autor", book.getAuthor()));
listItem.add(new Label("cena", ""+book.getPrice()));
listItem.add(new Link("dodaj",listItem.getModel()){
public void onClick() {
Book selectedBook = (Book) getModelObject();
//teraz możemy dodać książkę np. do koszyka w sesji
}
});
}
});

Oczywiście należy się trochę wyjaśnień. Skąd wziąć listę książek? Oczywiście z bazy, ale można też np. w celach testowych w klasie aplikacji stworzyć sobie zwykłą listę. Do klasy tej mamy dostęp z poziomu wszystkich stron można więc umieścić w niej np. referencję do DAO. Ponadto w kodzie HTML da się zauważyć nowy znacznik . Kod umieszczony w tym tagu zostanie usunięty. Służy on tylko i wyłącznie do lepszej prezentacji widoku. Myślę, że reszta powinna być w miarę jasna.
W kolejnej części relacji z rozdziału trzeciego znajdzie się kilka informacji na temat wykorzystania formularzy oraz zastosowania stronnicowanych list.

poniedziałek, 6 kwietnia 2009

Rozdział 2. Dużo szczegółów na temat wnętrzności Wicket

Rozdział drugi skupia się na zasadach działania Wicketa oraz założeniach jakie zostały przyjęte w trackie jego tworzenia. Rozdział ten, według autorów, można pominąć i wrócić do niego w miarę potrzeb. Sprawdźmy jednak, czy aby nie starają się ukryć czegoś ciekawego...
Za obsługę żądań w Wicket odpowiedzialne są 3 klasy: Application, Session i Request. Nie ma nic zaskakującego w przypadku Application - ot, każda aplikacja ma dokładnie jej jedną instancję, ale już dla Session Wicket ma ciekawą funkcjonalność. Mianowicie, nie jesteśmy już skazani na pamiętanie poszczególnych wartości w mapie dostarczanej przez HttpSession. Teraz mamy specjalizowane obiekty, które mogą być przechowywane w sesji. Wygląda to mniej więcej tak:

public class MySession extends WebSession {

private User user;

public static MySession get() {
return (MySession) Session.get();
}

public MySession(Request request) {
super(request);
}

public synchronized User getUser() {
return user;
}

public synchronized boolean isAuthenticated() {
return (user != null);
}

public synchronized void setUser(User user) {
this.user = user;
}
}

Warto zwrócić uwagę na to, że wszystkie metody są synchronized - sesje nie są "thread-safe".
When using Wicket, you typically never need to deal with the raw HttpServlet-
Request or Response objects; this holds true even when you’re dealing with custom
sessions.
Ponadto zostały omówione elementy takie jak SessionStore (odpowiedzialny za przechowywanie informacji o sesji oraz śledzenie historii przeglądanych przez użytkownika stron), Request, Response, RequestCycle, RequestCycleProcessor, RequestTarget. Nie staram się narazie zgłębić co poniektóre z nich tak naprawdę robią - myślę, że przyjdzie na to pora w dalszych rozdziałach jak przyjdzie do kodowania.
W kolejnym podrozdziale omówione zostały komponenty w Wicket. Podsumowując, Wicket daje możliwość stworzenia własnych komponentów. Każdy taki komponent musi dziedziczyć po Component, posiadać model oraz sposób prezentacji. Autorzy podają kilka cech komponentów:
  • Są niezależne i samowystarczalne - jeżeli chcemy użyć jakiegokolwiek komponentu wystarczy go umieścić na stronie. Inne komponenty nie muszą wiedzieć nic na jego temat.
  • Nadają się do ponowego użycia.
  • Można je stworzyć wykorzystując czystą Javę.
  • Żeby je wykorzystać również możemy posłużyć się tylko i wyłącznie językiem Java.
W dalszej części autorzy zagłębiają się w zagadnienia związane z łączeniem widoku (markup) z klasami oraz zagnieżdzaniem komponentów na stronie. Myślę, że temat ten sam wyjaśni się w miarę zdobywania wiedzy z kolejnych rozdziałów. Ewentualnie powrócę do tego podrozdziału później.
Jednym z ostatnich tematów poruszanych w rozdziale 2 są rozważania na temat rozdzielenia logiki i prezentacji. Wicket wymusza na nas takie podejście. Używając Wicketa nie ma prawa dojść do sytuacji, w której w widoku mamy pętle, instrukcje warunkowe itp. Autorzy wymieniają wiele zalet tego podejścia, ale najważniejszy chyba jest fakt, że tak naprawdę wiadomo gdzie tej logiki szukać. Ponadto takie podejście daje większe szanse na ponowne użycie kodu. Poza tym nie wiem jak Wy, ale ja nigdy nie przepadałem za specyficzną formą np. JSP.
Dalej zostały omówione zagadnienia związane z modelem, które szczerze mówiąc pominąłem oraz interfejs IBehavior pozwalający na dodawanie zachowań do komponentów. Dzięki temu jeżeli chcemy stworzyć link służący do usunięcia pozycji koszyka, który po kliknięciu wyświetli komunikat potwierdzający ten fakt, wcale nie musimy tworzyć nowej klasy dziedziczącej po Link i dodającej tę funkcjonalność. Właśnie w tym celu można dodać nowe zachowanie dla wybranego komponentu.
Podsumowując rozdział drugi to bardzo duża dawka wiedzy teoretycznej, która dla osoby zaczynającej przygodę z Wicket może być ciężkastrawna. Myślę, że w miarę poznawania kolejnych rozdziałów wiele zagadnień będzie się wyjaśniało.
Przekartowałem rozdział 3 - długi, dużo kodu i wygląda interesująco. Wkrótce relacja.

niedziela, 5 kwietnia 2009

"Wicket in Action" - rozdział 1. Co to jest Wicket?

Zgodnie z zapowiedzią relacja z rozdziału pierwszego "Wicket in Action". Wyprzedzając fakty, mam wrażenie, że wybór Wicketa do poznania był dobrym strzałem. Brakowało mi czegoś tak przyjemnego. Ale po kolei...
W rozdziale pierwszym autorzy (Martin Dashorst i Eelco Hillenius) przedstawiają krótko historię tego rozwiązania oraz definiują jego miejsce i przeznaczenie na rynku szkieletów. Mówiąc wprost, Wicket stanowi pomost pomiędzy HTMLem, a starą dobrą Javą po stronie serwera, a jego głównym zadaniem jest zarządzanie stanem aplikacji.

We can break it into three parts: just Java, just HTML, and meaningful abstractions.
Tworząc Twoją nową aplikację internetową logikę i sposób zachowania zakodujesz wykorzystując Javę, widok stanowi praktycznie czysty HTML, a ponadto dla elementów często spotykanych na stronach WWW Wicket dostarcza odpowiednich komponentów.
Ponadto w rozdziale pierwszym przedstawionych jest kilka przykładów, które dają wyobrażenie o działaniu Wicket'a. Standardowa "aplikacja" - Hello World (odsyłam do tutoriala na stronie Apache Wicket) oraz dwa krótkie przykłady pokazujące wykorzystanie komponentów Label, Link oraz przeplecenie tego wszystkiego z AJAXem.
Podsumowując, poniżej przedstawiam mały przykład, którego zadaniem jest wyświetlenie dwóch linków:
  • link 1: zliczający ilość kliknięć w niego
  • link 2: przenoszący nas do strony "HelloWorld"
W pierwszej kolejności stwórzmy klasy odpowiedzialne za poszczególne strony. Klasę: LinkPage - odpowiedzialną za główną stronę, na której wyświetlone są linki oraz klasę SecondPage - odpowiedzialną za wyświetlenie strony po kliknięciu drugiego linku. Strona ta wyświetli komunikat Hello World, ale wykorzystując komponent Label.
Do dzieła!
Klasa LinkPage:

package com.blogspot.matecki.ch01;

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.model.PropertyModel;


public class LinkPage extends WebPage {

private int counter = 0;

public LinkPage() {
add(new Link("link1"){
public void onClick() {
counter++;
}
});

add(new Link("link2"){
public void onClick() {
setResponsePage(new SecondPage());
}
});
add(new Label("lCounter", new PropertyModel(this,"counter")));
}
}

Klasa SecondPage:



package com.blogspot.matecki.ch01;

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;

public class SecondPage extends WebPage {
public SecondPage() {
add(new Label("label", "Hello World!"));
}
}

Mamy już klasy odpowiedzialne za poszczególne strony. Brakuje jeszcze klasy reprezentującej całą aplikację. Oto i ona:


package com.blogspot.matecki.ch01;

import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.Page;

public class HelloWorldApplication extends WebApplication {
public Class getHomePage() {
return LinkPage.class;
}
}

Zgodnie z filozofią Wicketa każdej klasie reprezentującej stronę odpowiada plik HTML o dokładnie takiej samej nazwie znajdujący się w tej samej paczce. Odpowiedzialny on jest za widok. Stwórzmy więc dwa pliki SecondPage.html i LinkPage.html.
SecondPage.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
</head>
<body>
<h1 wicket:id="label">Tutaj wstaw tekst</h1>
</body>
</html>

LinkPage.html:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
</head>
<body>
<a href="#" wicket:id="link1">This link</a> has been clicked
<span wicket:id="lCounter">123</span> times. Go to <a href="#" wicket:id="link2">second page</a>.
</body>
</html>

Co tu jest ciekawego? Zwróć uwagę na element wicket:id jest on ściśle powiązany z identyfikatorami w klasach odpowiedzialnych za poszczególne strony. Ponadto klasy odpowiedzialne za strony rozszerzają WebPage, a klasa reprezentująca aplikację rozszerza WebApplication. Jeszcze tylko odpowiednie wpisy do web.xml i możemy próbować to uruchomić.
WEB.XML:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<display-name>Wicket Examples</display-name>
<filter>
<filter-name>HelloWorldApplication</filter-name>
<filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
<init-param>
<param-name>applicationClassName</param-name>
<param-value>com.blogspot.matecki.ch01.HelloWorldApplication</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>HelloWorldApplication</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

Podsumowując. Rozdział pierwszy zapoznaje nas z założeniami rządzącymi światem Wicket i pozwala (prawie) zbudować coś działającego. Do ściągnięcia projekt w IntelliJ IDEA z działającą "aplikacją" na podstawie powyższych kodów źródłowych.
Jak Wam się podoba ta forma relacji?

sobota, 4 kwietnia 2009

"The Productive Programmer" - relacja

Jestem właśnie po lekturze książki "The Productive Programmer". W trakcie wystąpienia na konferencji 4Developers Neal Ford, autor książki, prezentował wybrane informacje zawarte w pierwszej części (Mechanics).
Książka obfita w różnego rodzaju dobre rady, przykłady, anegdoty, opowieści. Książkę przyjemnie i szybko się czyta, a i sporo rzeczy można się z niej dowiedzieć. Jednym słowem - polecam!
W tej chwili biorę się za "Wicket in Action". Postanowiłem przetestować metodę Jacka na utrwalenie zdobytej wiedzy poprzez relacje z poszczególnych rozdziałów na blogu. Tak więc na dniach możecie spodziewać się pierwszych wpisów poświęconyh Wicketowi. Mam nadzieję, że uda mi się wytrwać w postanowieniu ;)

piątek, 20 marca 2009

IntelliJ IDEA Blog

Po dość długiej ciszy na blogu IntelliJ IDEA ostatnio ruch, że hej - codziennie po kilka postów. Wśród nich informacje na temat tego co będzie w kolejnej wersji Intellij IDEA (kod: Maia) oraz przykłady wykorzystania ciekawych, choć często ukrytych funkcji IDEA. Zachęcam więc do śledzenia http://blogs.jetbrains.com/idea/

poniedziałek, 9 marca 2009

Pomocne narzędzia

Neal Ford w trakcie swojej prezentacji na konferencji 4Developers przedstawił kilka ciekawych narzędzi. Wśród nich te, które zacząłem używać i muszę przyznać zaczynam się do nich przyzwyczajać. Tak więc polecam:
CLCL - maluteńka aplikacja obsługująca wieloelementowy schowek. Błyskawicznie człowiek się do niej przyzwyczaja. Nie mogę sobie przypomnieć jak mogłem tak długo męczyć się z tradycyjnym, jednoelementowym schowkiem :) [strona WWW narzędzia CLCL]
Command Prompt - kolejny przyjemny dodatek. Powłoka poleceń bezpośrednio w Eksploratorze [strona WWW projektu].
I na koniec przyjemna wtyczka do IntelliJ IDEA - Key promoter. W przypadku stwierdzenia, że operację którą właśnie wykonaliśmy myszką można wykonać za pomocą odpowiedniego skrótu klawiszowego, informuje jaki to skrót i ile razy wyklikaliśmy go myszką. Dzięki niej błyskawicznie opanujecie skróty klawiszowe w IntelliJ IDEA [strona WWW wtyczki].

niedziela, 8 marca 2009

Po konferencji 4Developers

W ostatnią sobotę odbyła się konferencja 4Developers. Szersze relacje zamieścił Jacek Laskowski oraz Marek Kliś. Do przerwy świetne prezentacje Adam Biena (EJB 3.1 - Killing The Top Eleven Myths, Tales and Biases), Neala Forda (The Productive Programmer: Mechanics) oraz prezentacje, które przynajmniej dla mnie były trochę mniej interesujące, aczkolwiek ciekawe: Flex and Java Integration (Corneliu Vasile Creanga) oraz Sun Spot (Paweł Bachara).
Po przerwie - Java Underground (rewelacja) oraz niezwykle ciekawy i dobrze poprowadzony wykład sponsorowany (Tomasz Skutnik - Wielojęzykowość w aplikacjach J2EE). Po tej serii wykładów opuszczamy z Markiem ścieżkę Java żeby posłuchać co nieco na temat Scali w wykonaniu Teda Newarda. Na koniec prezentacja Jacka Laskowskiego pt.: Zwinne i lekkie aplikacje webowe w Javie z Groovy, Grails i Project Zero, którą poprowadził z niezwykłym rozmachem :)
Pozostało losowanie dodatkowych upominków, które również odbyło się z odpowiednim rozmachem ;) (dziękuję Jackowi za wylosowanie) i można wracać.
Na A4 śnieżyca godna stycznia, a nie marca. Na szczęście GeeCon jest w maju :)

czwartek, 5 marca 2009

RMI - początek

Poświęciłem ostatnio trochę czasu na rozpoznanie tematu RMI (ang. Remote Method Invocation). W pierwszej kolejności - Google. Jest trochę stron, ale żadna nie omawia od początku co, gdzie i jak, a napisany kod delikatnie mówiąc nie działa.
Krok drugi - "Thinking in Java". W indeksie tylko dwie strony(!), ale pojawia się cenna wskazówka: "Omówienie RMI można znaleźć w książce Thinking in Enterprise Java". Bruce Eckel ma może talent do usypiania przy dłuższej lekturze, ale jak trzeba znaleźć coś konkretnego sprawdza się znakomicie. Swoją drogą ciekawe dlaczego nie skończył książki "Thinking in Enterprise Java"?
To co zostało napisane tradycyjnie dostępne jest do pobrania. Przykłady i wskazówki zawarte w tym miejscu doskonale się sprawdziły i bez większych problemów wszystko wystartowało.
Jeżeli ktoś ma dalej problemy to proszę o komentarz - postaram się krótko opisać jak rozpocząć pracę z RMI w IntelliJ IDEA.

wtorek, 3 marca 2009

Spring Security i NTLM cz. 2

Okazało się, że sposób opisany w moim poprzednim poście nie sprawdza się w przypadku NTLMv2. Udało się odpalić logowanie z wykorzystaniem NTLMv2 i Spring Security korzystając z JCIFS 1.3.3 i niestety płatnej biblioteki Jespa. Co ciekawe biblioteka jest w tej chwili w wersji beta i nie jest sprzedawana. Wersja testowa działa przez 60 dni dla nieograniczonej liczby użytkowników, a po przekroczeniu tego okresu obsługuje tylko do 25 użytkowników.

niedziela, 15 lutego 2009

Hibernate i zbyt dużo połączeń

Zupełnie przez przypadek przy przesiadce z C3P0 na DBCP (swoją drogą dlaczego ComboPooledDataSource z C3P0 jest klasą final?) zauważyłem, że w ogromnym tempie przybywa połączeń z bazą. Ogromnym tzn. zazwyczaj 1 nowe połączenie na każdy request. Zachowanie to prowadzi błyskawicznie do wyczerpania puli (pool exhaust).
Rozwiązanie problemu jest banalne ale dość ciężkie do znalezienia. Kluczowe jest ustawienie właściwości hibernate.connection.release_mode na auto.

niedziela, 8 lutego 2009

Kurs na patent sternika motorowodnego

Dzisiaj trochę nietypowo. Osoby chętne do oderwania się od klawiatury, przynajmniej w weekend, zachęcam do udziału w kursie na patent sternika motorowodnego. Ci co go posiadają mogą zawsze uzyskać uprawnienia starszego sternika motorowodnego :)
Wszystkie szczegóły na http://motorowodne.zapisy.net/

sobota, 7 lutego 2009

GWT 1.6 Milestone 1!

Scott Blum ogłosił opublikowanie GWT 1.6 Milestone 1. Oprócz zmian w strukturze projektu (dokument opisujący zmiany) wprowadzono szereg innych interesujących modyfikacji. Pokrótce:
  • wymiana Tomcata na Jetty w trybie HostedMode
  • LazyPanel - dzięki niemu możesz tworzyć fragmenty aplikacji dopiero w momencie pierwszego użycia
Szczegółowy opis zmian w ogłoszeniu Scotta.

piątek, 30 stycznia 2009

FFMPEG - Kompresja do WMV

Ostatnio miałem potrzebę skonwertowania pewnych filmów do formatu wmv. Niestety ffmpeg nie działał tak jakbym się tego spodziewał (pewnie źle go używałem...). Dużo czasu poświęciłem na znalezienie takich parametrów, aby stworzony plik wmv otwierał się w m.in. Windows Media Player. Znalazłem! I się nimi podzielę... jak zwykle żeby samemu mieć na przyszłość ;) A więc uwaga:

środa, 7 stycznia 2009

Spring Security i NTLM

Swego czasu walczyłem intensywnie żeby uruchomić "autologowanie" do aplikacji WWW w oparciu o Active Directory. W tym celu należy wykorzystać możliwości jakie dostarcza NTLM. W sieci znalazłem dobry opis jak to zrobić... I napotkałem na problem.  Na forum długo nikt nie odpowiadał, jednak odkryłem że wyjątek jest rzucany tylko w przypadku wykorzystania najnowszej wersji JCIFS. Wykorzystanie wersji 1.1.11 rozwiązało wszystkie problemy.
Dlaczego o tym piszę? Ostatnio w tym samym wątku pojawiło się pytanie do mnie, jak rozwiązałem ten problem. Szczerze mówiąc, nie mogłem sobie przypomnieć co zrobiłem... Mam nadzieję, że dzięki temu wpisowi nie zapomnę o tym, a może komuś te informacje się przydadzą?

sobota, 3 stycznia 2009

GWTEventService

Dzisiaj w serwisie onGWT (polecam!) pojawiła się informacja, która dość mocno mnie zaintrygowała. Krótki rzut oka na Google Code i wygląda, że mam rację.
  • Encapsulation of the client-server communication
  • High-level API with listeners and events
  • Only one open connection for event listening
  • Reduction of server calls
  • Reduction of connection peaks
  • Events are returned directly when the event has occurred (instead of polling)
  • Events are bundled to reduce server calls
  • Based on the GWT-RPC mechanism
  • Automatic timeout recognition and handling
  • Extensible architecture
To brzmi naprawdę obiecująco. Ktoś już tego używał? Jak się sprawuje? Postaram się przetestować w najbliższym tygodniu i z pewnością podzielę się spostrzeżeniami.