30 stycznia 2013

Społecznościowy rozwój oprogramowania z GitHub, Travis, Heroku i Clojure już w najbliższą sobotę w Łodzi

1 komentarzy
Baczni obserwatorzy z łatwością zauważą moje zachwycenie platformą GitHub i pomysłem społecznościowego podejścia do wytwarzania oprogramowania. Mnie to wciągnęło na dobre i każdy pomysł natychmiast pcham na GitHub'a. Lista otwartych projektów rośnie, podobnie jak mój zachwyt możliwościami. Wprost nie mogę oprzeć się udziałowi w pracach i wręcz rzuciłbym wszystko, aby na dobre zanurzyć się w budowanie oprogramowania na GitHubie. Z Clojure programowanie stało się ponownie przyjemne, a GitHub tylko podsyca apetyt (albo to po prostu wymówka, że wcześniej się po prostu nie chciało - nieważne).

I właśnie powody tego zachwytu chciałbym przedstawić w najbliższą sobotę, 2 lutego, w Łodzi podczas imprezy Przyszłość w IT.

Zaczynam równo o 14:50 z trzema innymi wykładami - Marka Defecińskiego "Krótki przewodnik po referencjach", Marcina Zajkowskiego "Mobile first! - responsywne strony WWW" oraz Tomasza Wiśniewskiego "Microsoft – przyszłość IT zaczęła się już wczoraj". Jakoś nie mogę uwierzyć w przyszłość IT wokół Microsoftu (poza ich językiem F#, którego najbliższym odpowiednikiem na JVM mogłaby być Scala, której z kolei niestety wiele jeszcze brakuje, aby to porównanie było fair), więc to można sobie darować. Zostaje wykluczyć pozostałe dwa wykłady z Markiem i Marcinem, i tu obawiam się, że sam miałbym kłopot, co wybrać. Jeśli referencje dotyczą pakietu java.lang.ref, to sugeruję jednak udział w Marka wystąpieniu. O Marcinie nie mogę nic powiedzieć, więc wybór trudny.

Skołowani powinni losować między mną a Markiem :-) Zapraszam!

28 stycznia 2013

Praktyczne wprowadzenie do OSGi i Enterprise OSGi

0 komentarzy
5 lutego podczas spotkania grupy Warszawa JUG będę miał przyjemność zaprezentować Enterprise OSGi w akcji.

Będzie to niepowtarzalna okazja zobaczyć mnie na deskach WJUGa (które trochę zaniedbywałem w 2012), bo dostęp do nich został mocno ograniczony przez duże zainteresowanie potencjalnych prelegentów. Stąd też niemała u mnie trema, aby spotkanie odbyło się w ciekawej formie. Liczę, że dobre noty pozwolą mi na kolejne publiczne wystąpienia na spotkaniach WJUGa.

Podczas spotkania przedstawię rolę Enterprise OSGi, które zrodziło się, aby połączyć dobrodziejstwa Spring Framework (a właściwie Dependency Injection) z OSGi na potrzeby użycia w środowisku Java EE. I właśnie w ten sposób ten slajd masz już z głowy (więc możesz przyjść 5 minut później).

Brakującym ogniwem w zrozumieniu istoty Enterprise OSGi jest zobaczyć to w działaniu. I to jest właśnie rola tej prezentacji - praktycznie o Enterprise OSGi z WebSphere Liberty Profile.

Nie planuję starać się o miano eksperta w temacie. Nie planuję przekonywać kogokolwiek, że znam Enterprise OSGi na wskroś, co sprawi, że odpowiem na większośc pytań. Nie planuję nawet omówić wszystkiego, co kryje się w Enterprise OSGi. Chcę, aby było krótko i na temat, a to już samo w sobie sprawia, że będzie to dla mnie nielada wyzwanie. Po co jeszcze komplikować sprawę?! Przedstawię aktualny stan wiedzy, który starałem się budować przez ostatnie kilka lat z podsumowaniami w postaci artykułów na moim Wiki w kategorii OSGi.

Odmówię sobie przyjemności budowania aplikacji na żywo, a raczej pokuszę się o współpracę z gitowymi etykietami, aby dostać kolejne wersje i je spokojnie omawiać. Liczę na współpracę Keynote oraz publiczności.

A skoro jesteśmy przy publiczności, to czy jest coś, co szczególnie intryguje Cię w kontekście Enterprise OSGi? Chętnie przygotuję materiał dedykowany. Muszę tylko poznać problem, który możesz opisać w komentarzu. Gorąco zachęcam do aktywniejszego udziału.

16 stycznia 2013

Zmiany w Java EE 6 w javax.servlet.http.HttpServletRequest - metody login oraz logout

8 komentarzy
Kolejny dzień na StackOverflow i lista do rozpoznania zaczyna niebezpiecznie przybierać na wadze - pojawiają się m.in. zadania związane z rozpoznaniem zmian w Java EE 6. Okazuje się, że przespałem kilka i kiedy trafiłem na How to redirect to request page after basic athentication on websphere nie mogłem uwierzyć własnym oczom - metoda javax.servlet.http.HttpServletRequest.login(java.lang.String username, java.lang.String password) throws ServletException istnieje?! Byłem bliski odpowiedzi, w której niemalże zjechałbym pytającego, jak w ogóle ta metoda mogła mu przyjść do głowy, której nazwa była zaskakująco znajoma - pewnie jedna z bardziej popularnych nazw dla metody, której zadaniem jest...tak dokładnie...uwierzytelnienie użytkownika. Jest również logout i kilka innych oznaczonych Since: Servlet 3.0.

Czy istnieje sposób, aby otrzymać listę wszystkich metod oznaczonych Since: Servlet 3.0 w Javadoc?

Do rozpoznania tematu korzystam bezpośrednio ze specyfikacji JSR-315 Java Servlet 3.0 i zacznę od dwóch nowych metod w javax.servlet.http.HttpServletRequest - login and logout. Specyfikacja poświęca im osobny rozdział 13.10 Login and Logout (strona 162).

Instancja HttpServletRequest jest nam (programistom) dana w trakcie obsługi żądania przez kontener. Zawiera informacje z nagłówka (ang. header) i treści (ang. body) żądania HTTP. Parametry są typu String, a wraz z wartościami tworzą zbiór par (parametr, wartość) - mapę. Jak mi to doskonale wpasowuje się w programowanie z funkcyjnym Clojure, w którym struktury są niezmienne (jak HttpServletRequest) i dostęp do nich jest jakby przyjemniejszy (wybacz, nie mogłem się oprzeć, aby tego tutaj nie wtrącić).

Ciekawostka: Dla danego parametru może istnieć wiele wartości, w postaci tablicy. Dostęp do nich odbywa się za pomocą getParameterValues. Istnieje również getParameter, który zwraca pojedynczą wartość. Pytanie certyfikacyjne mogłoby być: "Który w stosunku do tablicy zwracanej przez getParameterValues?" Pierwszy z pewnością, ale czy pierwszy jest pojęciem trwałym i wielokrotne wykonanie getParameter zawsze zwróci tą samą wartość? Specyfikacja (strona 43) wymusza, aby był to pierwszy element tablicy zwracanej przez getParameterValues i zawsze ten sam. Kolejność wyznaczana jest przez "query string", aby dołączyć do nich te z treści żądania (strona 44).

Ciekawostek cd: Pliki w META-INF/resources w pliku JAR są dostępne jedynie w sytuacji, kiedy kontener rozpakował je przy wywołaniu metody ServletContext.getRealPath() (strona 48). Nie wiedziałem o istnieniu tego specjalnego katalogu (!)

Wracając do HttpServletRequest, login i logout.

Przy obsłudze żądania serwer aplikacyjny określa tożsamość nadawcy. Jest ona niezmienna, aż do momentu poprawnego wywołania metod authenticate, login lub logout na tym żądaniu (strona 162). Metody getUserPrincipal() oraz getRemoteUser() zwrócą null dla sytuacji, w których nadawca żądania nie został uwierzytelniony (strona 163). Później jeszcze pojawia się metoda getAuthType, która również zwróci null.

Serwer (w postaci kontenera servletów/webowego) może stworzyć sesję HTTP na potrzeby utrzymywania stanu uwierzytelnienia użytkownika. Jeśli utworzy ją programista przed uwierzytelnieniem użytkownika, to po poprawnym uwierzytelnieniu sesja musi być taka sama jak przed (strona 163). W ten sposób możliwe jest utrzymanie informacji w pojedynczej sesji przed, w trakcie i po uwierzytelnieniu nadawcy (użytkownika).

W javadoc dla HttpServletRequest.html#login(java.lang.String, java.lang.String) można przeczytać:

Wywołanie metody login uruchamia proces uwierzytelnienia zgodnie z konfiguracją ServletContext (cóż za magia, a pewnie chodzi o konfigurację aplikacji webowej przez web.xml czy adnotacje). Metoda nie spowoduje rzucenia wyjątkiem ServletException, jeśli mechanizm uwierzytelniający wspiera sprawdzenie pary (login, hasło), nadawca nie został jeszcze określony - wszystkie metody getUserPrincipal, getRemoteUser oraz getAuthType zwracają null oraz para (login, hasło) jest poprawna.
Poprawne wykonanie metody sprawia, że metody getUserPrincipal, getRemoteUser oraz getAuthType zwracają wartość nie-null, tj. dane nadawcy.

Proste i przyjemne, co? Za wyjątkiem konfiguracji bezpieczeństwa, tj. uwierzytelnienia i autoryzacji przez kontener, co wcale nie musi być zadaniem trywialnym. Mimo uproszczeń w konfiguracji w serwerach aplikacyjnych, to wciąż niezbyt popularny aspekt zarządzania nimi.

Ja skorzystam z przykładu uruchomionego na IBM WebSphere Application Server 8.5.0.1.
package pl.japila.javaee6;

import java.io.IOException;
import java.io.PrintWriter;
import java.security.Principal;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private final String HTML_BR = "<b r>"; // for Blogger only
    
    private void displayCredentials(PrintWriter out, HttpServletRequest request) {
        Principal principal = request.getUserPrincipal();
        String user = request.getRemoteUser();
        out.printf("Principal: %s%s", principal, HTML_BR);
        out.printf("User: %s%s", user, HTML_BR);
        out.printf("AuthType: %s%s", request.getAuthType(), HTML_BR);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.printf("

Step 1. nulls only (no user authenticated)

"); displayCredentials(out, request); out.printf("

Step 2. Exception for jacek/password (no user 'jacek' available)

"); try { request.login("jacek", "password"); } catch (ServletException expected) { out.printf("Exception (expected): %s%s", expected, HTML_BR); } displayCredentials(out, request); out.printf("

Step 3. Authentication of admin/admin..."); try { request.login("admin", "admin"); } catch (ServletException unexpected) { out.printf("FAILED

"); out.printf("Exception (UNexpected): %s%s", unexpected, HTML_BR); } out.printf("SUCCESS"); displayCredentials(out, request); out.printf("

Step 4. Logging out..."); try { request.logout(); } catch (ServletException unexpected) { out.printf("FAILED

"); out.printf("Exception (UNexpected): %s%s", unexpected, HTML_BR); } out.printf("SUCCESS"); displayCredentials(out, request); } }
Wykonanie powyższego servletu, jakkolwiek poprawne od strony użytkownika, to w dzienniku można zauważyć wyjątek SECJ0369E: Authentication failed when using LTPA. The exception is com.ibm.websphere.wim.exception.PasswordCheckFailedException: CWWIM4537E No principal is found from the 'jacek' principal name. Stąd opakowanie wywołania request.login("jacek", "password") dla nieistniejącego użytkownika w blok try-catch.

15 stycznia 2013

Konferencyjna inauguracja roku 2013 w Łodzi na Przyszłość w IT

0 komentarzy
Ze strony IT-Supreme: "Firma IT-Supreme specjalizuje się w kompleksowym organizowaniu szkoleń, konferencji oraz targów pracy dla doświadczonych specjalistów.", co odczytuję jako bezpośrednia konkurencja dla Proidei - fundacji stojącej za konferencjami typu JDD oraz 4 Developers. Dodając do tego konferencje organizowane przez członków JUGów (nazwy i nazwiska pominę jako nazbyt oczywiste) rok 2013 zapowiada się niezwykle ciekawie konferencyjnie.

Wstęp należy czytać nie inaczej jak: "Jeśli trafiłeś na ciekawą rzecz podczas projektu i chciał(a)byś się tym pochwalić szerszej publiczności, to będzie okazja. Nie jedna, ale kilka. Trzeba jednak się zastanowić, przygotować i zgłosić temat."

Artur z IT-Supreme skontaktował się jakiś czas temu w sprawie mojego wystąpienia na konferencji "Przyszłość w IT" 2 lutego w Łodzi w hotelu Holiday Inn (ul. Piotrkowska 229/231) i z pewną dozą nieśmiałości (związanej jedynie z potencjalnym obłożeniem projektowym) zdecydowałem się zainaugurować sezon konferencyjny w 2013 z całkowicie nową prezentacją "Social development with Github, Travis, Heroku and Clojure".

Temat społecznościowego udziału w projektach trochę mnie wciągnął, szczególnie przez ostatnie 4 tygodnie urlopowe, i pomyślałem, że mógłbym "sprzedać" trochę wiedzy praktycznej, jak to tam bywa tak sobie kodować z użyciem "narzędzi" typu Github, Travis, Heroku oraz Clojure.

Jakoś tak mi przyszło korzystać ze wszystkich tych narzędzi podczas rozwoju projektu librarian-clojure, które możnaby śmiało określić nowoczesnymi - jest społecznościowe repozytorium kodów źródłowych Github z rozproszonym systemem wersjonowania kodów źródłowych - Gitem na pierwszym planie, jest system ciągłej integracji Travis-CI, jest chmura w postaci Heroku, aby podsumować całość językiem funkcyjnym na JVM - Clojure. Brakuje jedynie czegoś, co możnaby nazwać "Big Data" i miałbym komplet stosownie do roku 2013. Jak się pojawią użytkownicy w aplikacji, będzie i Big Data!

Doświadczenie w posługiwaniu się tymi narzędziami nabierałem przez ostatnie miesiące z różną intensywnością i przyznam szczerze, że mógłbym rzucić robotę na rzecz dalszego studiowania wymienionych narzędzi. Wciągnęło mnie i chce mi się programować każdego dnia! Kod pozostawia wiele do życzenia i git commit oraz push idzie ze zmianami, które śmiało możnaby wykorzystać na szkoleniu "Jak NIE pisać oprogramowania", ale skoro postępy są, dług technologiczny odnotowuję w Issues i w końcu dołączył nowy członek do projektu, więc jest git! Niech się wstydzą Ci, co widzą! :-)

Zapraszam do udziału w mojej prezentacji tematu społecznościowego rozwoju oprogramowania w Łodzi. Podzielę się doświadczeniami i z przyjemnością wprowadzę w arkana posługiwania się wspomnianymi narzędziami. Jak napisał organizator: "Dla uczestników wstęp na imprezę jest bezpłatny. Wystarczy się zarejestrować przez stronę http://it-s.com.pl/formularz-dla-ucze-2-ii-2013-lodz/". Spotkajmy się i pogadajmy o ciekawych rzeczach!

10 stycznia 2013

Po spotkaniu Warszawa JUG o metaprogramowaniu w Javie

12 komentarzy
Nowy rok i nowe postanowienia, co? A skoro o tym, to z pewnym spóźnieniem...

Wszystkiego najlepszego w Nowym Roku 2013! Jedynie ciekawych projektów w 2013 bez Project Maruderów!

Chyba niektórzy postanowili odświeżyć znajomości i wiedzę w nowym roku, bo ostatnie, wczorajsze spotkanie Warszawa JUG przyciągnęło bagatela ponad 70 osób! Mnie osobiście poraziło, kiedy zobaczyłem ten tłum.


Kamera też była, nagranie jest, więc niebawem powinno pojawić się w sieci. +Paweł Cesar Sanjuan Szklarz już nad tym pracuje.

Temat spotkania szumny - Metaprogramowanie w Javie - i tutaj doszukiwałem się odpowiedzi, skąd się wzięło tylu ludzi. Niektórzy wspomnieli również doskonałą zapowiedź jako możliwy powód: "Ten wykład to absolutny "must" dla wszystkich developerów związanych z Javą (i w ogóle JVM)."

Mnie przyciągnął do spotkania cglib, z którym miałem już wcześniej do czynienia, a nawet swego czasu byłem wielkim fanem rozgryzienia tematu dynamicznego generowania bajtkodu (również z asm), w czym pomagał mi dzielnie +Piotr Kobzda. Stare to czasy i postanowiłem odświeżyć temat.

Zawiodłem się niestety i uważam wczorajsze spotkanie w dużej mierze za stracone (!)

Poza tym, na spotkanie szedłem również, aby wybadać skąd u +Wojciech Erbetowski stwierdzenie nt. makr:

"Zgadzam się, nie ma makr w Javie (i bardzo dobrze), to może urągać metaprogramowaniu w Javie."

które założyłem, że zrodziło się po (nieprzyjemnych?) doświadczeniach z makrami w C i, zupełnie niezrozumiale, niekorzystnie rzutuje na makra w Clojure, z którymi C i Clojure dzielą jedynie nazwę. Byłem dosłownie wściekły (nie, nie tak wściekły, jak dosłownie możnaby to odczytać), kiedy przeczytałem to zdanie i miałem trochę żalu do Wojtka za jego...nonszalancję i nieznajomość tematu w językach alternatywnych do Javy.

Z drugiej strony, właśnie to zdanie i kilka innych w tym wątku sprawiło, że odnotowałem zadanie opisania makr w Clojure na tym blogu, aby przybliżyć go szerszej publiczności i spróbować wyjaśnić wiele niedomówień i nieprawdziwych tez. Wojtek, +Irek Matysiewicz z "W Javie nie można dodawać nowych konstrukcji do języka (np. w Scali można dzięki pluginom a w Clojure podobno dzięki makrom)." oraz Waldek Kot z "Skoro przytaczane tu przykłady języków z "dobrym" metaprogramowaniem (Ruby, Groovy i JavaScript - dodałbym tu pewnie jeszcze Clojure, czyli Lisp) mają swoje implementacje na JVM, to widać, że bytecode Java jest co najmniej "wystarczający"." uzasadnili potrzebę wprowadzenia do makr w Clojure. I to im się chwali!

Na plus spotkania dałbym tematykę oraz liczbę uczestników. I na tym niestety poprzestałbym.

Przez pierwsze 45 minut doświadczyłem "biegania" po wielu, często nieprzystających tematach, co mało brakowało, aby zakończyło się niemałą zadyszką. Trudno było znaleźć punkt zaczepienia i zacząłem się lekko nudzić.

Wojtek to człowiek, którego wszędzie pełno i rozumiem jego chęć podzielenia się wszystkim, począwszy od decyzji związanych z działalnością grupy Warszawa JUG, a skończywszy na jego zaskoczeniach przy tworzeniu RoboSpocka. Dodając do tego ochy i echy w temacie metaprogramowania w Javie i mamy niezły bigos.

Przy RoboSpocku należą się słowa pochwały za "udział" +Polidea we wczorajszym spotkaniu. Przemek przedstawił firmę i zachęcał do bliższego zapoznania się z nią. Peany na jej temat przywoływały mi na myśl konkurencję +SoftwareMill i TouK. Jeszcze stosunkowo niewiele jest firm, którym zależy na prospołecznościowym wizerunku i udzielają się bezpośrednio (wsparcie konferencji, spotkań Warszawa JUG) czy pośrednio (pracownicy są organizatorami konferencji, spotkań JUGów i często występują jako prelegenci na konferencjach) w budowanie lokalnych społeczności javowych. Ostatnio znaczenie nabrało dla mnie istnienie firmy i jej pracowników na Githubie, w czym również Polidea nie odstaje. Gratulacje!

Na minus prezentacji Wojtka przywołałbym "czytanie" ze smartfona. Pewnie gadżet miał wspierać i przypominać o agendzie, a sądzę, że ostatecznie przeszkadzał. Za mało naturalne było to wystąpienie, a z głową w smartfonie trudno było nawiązać kontakt wzrokowy. Próbowałem!

Później na scenie pojawił się +Maciej Jankowski z biblioteką CGLib. Merytorycznie dosyć ciekawie, ale zabrakło kilku sztuczek prezenerskich, aby mnie porwać i w pełni zaangażować w prezentację. Nudziłem się. Kod był, ale obaj panowie kilkukrotnie pozwolili mi sądzić, że jest w nim wciąż stosunkowo wiele nieznanego i zdumione miny pojawiły się kilkukrotnie. Pewnie niemniej zdumieni byli sami uczestnicy.

No i ten para-polski język! Czy mógłby prosić o zaprzestanie korzystania z "kastomizować" na rzecz "dopasowywać" lub malowniczo "kroić na miarę"?

Po Macieju na deskach ponownie zawitał Wojtek z Plastic. Zaczął doskonale, szczególnie, że pora (dobiegała 20:00) prosiła o podobne wejście - padł dowcip, który spróbuję sparafrazować:

"Wiele rozwiązań jest fajnych, a dołączone przykłady sprawiają, że szczęka opada. Nie można tego powiedzieć o Plastic'u!"

Cudo wejście! Od razu się poderwałem i...tyle. Było kilka przykładów z samego repo Plastic'a, ale chaos dał się poznać bliżej i skończyliśmy kwadrans później. Czasowo doskonale, merytorycznie niekoniecznie. Wyniosłem ze spotkania, że ten Plastic to nie dla mnie.

Możnaby odczytywać ten wpis jako negujący sensowność wczorajszego spotkania, ale nie takie jest moje zamierzenie. Bez solidnego treningu nie ma solidnych wyników, a właśnie temu ma służyć grupa Warszawa JUG. Wystąpienia na deskach WJUGa mają być przygotowaniem do wystąpień przed większą publiką podczas konferencji i pamiętając "tylko ten się nie myli, kto nic nie robi" należy czytać ten wpis z wyłącznie przyjacielskim nastawieniem (inne jest niedopuszczalne!)

Do następnego!