21 kwietnia 2009

Oracle kupuje Sun Microsystems

Producent baz danych Oracle kupuje firmę Sun Microsystems! Wartość transakcji to około 7,4 mld USD. Tym samym Oracle przejmuje wszystkie prawa do języka programowania Java, bazy danych MySQL, systemu operacyjnego Solaris oraz pakietu biurowego OpenOffice. Się porobiło. Ciekawe czy i jak wpłynie to na nasze, developerów życie.

10 kwietnia 2009

SCJP - Tokenizacja tekstu

Tokenizacja to proces w wyniku którego monolityczny tekst zostaje podzielony na ciąg pojedynczych tokenów. Tokeny to ciągi znaków ograniczone ustalonymi separatorami takimi jak spacje czy przecinki, aczkolwiek separatorem może być dowolny ciąg który da się opisać w postaci wyrażenia regularnego. Najbardziej elementarny algorytm tokenizacji w Javie implementuje metoda split(…) z klasy String. Metoda ta dokonuje podziału tekstu reprezentowanego przez obiekt dla którego została wywołana używając separatora opisanego wyrażeniem regularnym przekazanym jako argument wywołania. Przykład poniżej:
public void tokenize() {
String[] tokens = "dowolny tekst do tokenizacji".split("\\s");

for(String token : tokens)
System.out.println(token);
}

Wyrażenie regularne \s (które musimy zapisać jako \\s) oznacza biały znak (ang. whitespace character), tj. spacje, tabulacje, znaki nowej linii itd. Uruchomienie powyższej metody spowoduje więc wyświetlenie napisu:
dowolny
tekst
do
tokenizacji

Bardziej wyrafinowanych mechanizmów tokenizacji dostarcza klasa Scanner z pakietu java.util. Zasadnicza różnica w stosunku do metody split(…) polega na tym, że tokenizowany tekst jest przetwarzany stopniowo, w miarę potrzeby, i proces może być w dowolnej chwili zaniechany. Skanerem posługujemy się jak iteratorem. Klasa Scanner implementuje interfejs java.util.Iterator więc de facto jest ona iteratorem; pewnym szczególnym rodzajem iteratora, dzięki któremu możemy iterować po kolejnych tokenach przetwarzanego tekstu. Obiekt skanera tworzymy z użyciem jednego z kilku konstruktorów, z czego interesującymi dla nas są trzy pokazane poniżej:
public Scanner(String source)

public Scanner(File source) throws FileNotFoundException

public Scanner(InputStream source)

Identyczna funkcjonalnie metoda jak pokazana w pierwszym przykładzie, tyle że zaimplementowana przy użyciu skanera mogłaby więc wyglądać następująco:
public void tokenize() {
Iterator scanner = new Scanner("dowolny tekst do tokenizacji");

while (scanner.hasNext())
System.out.println(scanner.next());
}

W powyższym przykładzie nie określono separatora i w takim wypadku skaner używa separatora domyślnego jakim są białe znaki; stąd równoważność funkcjonalna z przykładem używającym metody split(…). Aby ustawić separator – opisany jako wyrażenie regularne – należy użyć metody useDelimiter(…) co pokazano poniżej:
public void tokenize() {
Scanner scanner = new Scanner("dowolny tekst do tokenizacji");

scanner.useDelimiter("\\s");

while (scanner.hasNext())
System.out.println(scanner.next());
}

Oprócz metod hasNext() i next() pochodzących z interfejsu Iterator, które zwracają wartości typu String, klasa Scanner implementuje metody hasNextInt() i nextInt(), hasNextBoolean() i nextBoolean() itd. dla pozostałych typów prostych. Przy użyciu tych metod możemy w łatwy sposób zaimplementować np. funkcję sumującą liczby naturalne występujące w danym tekście:
public int sum() {
Scanner scanner = new Scanner("a 1 b 2 c 3 d e f");

int sum = 0;

while (scanner.hasNext()) {
if (scanner.hasNextInt()) {
sum += scanner.nextInt();
} else {
System.out.println("nie int: " + scanner.next());
}
}

return sum;
}

6 kwietnia 2009

Moja prezentacja o GIu na JAVArsovii 2009

Kolejna edycja JAVArsovii - JAVArsovia 2009 - już wkrótce; wszystko wskazuje na to, że 4-tego lipca. Trwają poszukiwania sponsorów, patronów medialnych i... prelegentów. Chcesz wystąpić na konferencji? Wystarczy wysłać swoje zgłoszenie na adres c4p@javarsovia.pl i poczekać chwile na akceptacje tematu. No, chyba że temat się nie spodoba i akceptacji nie będzie:) Chętnych na pewno nie zabraknie, więc pewnie trzeba się z tym liczyć. Ja w każdym razie się zgłaszam - właśnie wysłałem swoje zgłoszenie z tematem "TIBCO GI – Interfejs użytkownika dla architektury SOA". Oto jego treść:

TIBCO General Interface to projekt open-source, na licencji BSD, dostarczający bibliotek i narzędzi do implementacji aplikacji klasy RIA. GI to z jednej strony biblioteka klas JavaScript umożliwiająca stworzenie profesjonalnej aplikacji typu AJAX bez konieczności użycia serwera aplikacyjnego czy nawet kontenera serwletów; a z drugiej strony zaawansowane, dedykowane środowisko programistyczne - TIBCO General Interface Builder. Oferta bez precedensu. GI jest rozwiązaniem wszechstronnym i elastycznym, ale ze względu na zaawansowane wsparcie dla wywołań usług sieciowych szczególnie predysponowane do zaistnienia w architekturach typu SOA.

Prezentacja ma na celu zainspirować do bliższego przyjrzenia się rozwiązaniu TIBCO. GIa i prezentację o nim dedykuje i polecam zwłaszcza tym, dla których interfejs użytkownika nie jest pępkiem świata; dla pragmatyków, którzy wiedzą że najważniejsze jest nie widoczne dla oczu, ale że zarazem przeważnie właśnie to co widać decyduje o efekcie końcowym i ostatecznej ocenie naszej pracy.

Prezentację poprowadzi Mariusz Lipiński – Inżynier Oprogramowania, pasjonat technologii, IT i Javy w szczególności. Magister Informatyki, absolwent Wydziału Matematyki, Informatyki i Mechaniki Uniwersytetu Warszawskiego. Członek Warszawskiej Grupy Użytkowników Technologii Java (Warszawa JUG), współorganizator konferencji JAVArsovia 2008. Mariusz zatrudniony jest obecnie jako Architekt SOA w jednej z największych polskich spółek. Swoje przemyślenia o tematyce IT publikuje na blogu pod adresem www.mariuszlipinski.pl.

12 marca 2009

TIBCO General Interface – Warstwa widoku dla SOA

O projekcie TIBCO GI dowiedziałem się kilka dni temu. Początkowo sceptyczny w końcu postanowiłem spróbować i przekonać się ile to jest warte. Przedrostek TIBCO mógłby sugerować że chodzi o produkt komercyjny, ale nie tym razem; GI dostępny jest na licencji BSD. Zasadniczo rzecz ujmując GI to biblioteka DHTML (JavaScript + HTML) służąca do budowy aplikacji klasy RIA. Biblioteka sama w sobie jest dosyć niezła, tzn. bogata w dobrze wykonane, ładne i funkcjonalne komponenty typu AJAXowego, ale to dopiero początek zalet. To co mnie w GI zachwyciło to IDE, tj. TIBCO General Interface Builder. Przyznam, że nigdy jeszcze czegoś takiego nie widziałem (może mało widziałem) – IDE wykonane jako aplikacja WWW! Tych którzy chcieli by ewentualnie w tym momencie zakończyć lekturę artykułu – zgorszeni – uspokajam! Jest to naprawdę kawał świetnej roboty… nie, nie pracuje dla TIBCO:) Zacząć przygodę z GIem jest niezwykle łatwo. Wystarczy ze strony General Interface Developer Center pobrać dystrybucję w postaci pliku ZIP, rozpakować i uruchomić GI Builder otwierając w przeglądarce plik GI_Builder.html. Nie trzeba żadnego serwera aplikacyjnego ani nawet serwera WWW. GI Builder to aplikacja DHTML. Zachęcam do przejrzenia filmików dostępnych na stronach Developer Center aby zorientować się jak to wygląda. Dla tych którzy nie poczują dopóki sami nie spróbują przygotowano krótki kurs (ang. tutorial) w którym opisano krok po kroku jak zbudować prostą aplikację opartą na wywołaniu usługi sieciowej (ang. web service). To jest właśnie to co mnie w GIu urzekło najbardziej – łatwość z jaką możemy wywoływać usługi sieciowe i prezentować użytkownikowi wyniki tych wywołań. Poniżej ilustracja pokazująca jak takie wywołanie się definiuje.


Na koniec jeszcze uzasadnienie dla tytułu dzisiejszego artykułu. Dlaczego napisałem, że TIBCO General Interface to warstwa widoku dla SOA? Ano dlatego że uważam że świetnie nadaje się do budowania małych aplikacji wspierających interakcje użytkowników z procesami (poprzez usługi) ale do budowy większych aplikacji monolitycznych już nie koniecznie. Wyobraźmy sobie, że jednym z kroków procesu biznesowego w firmie dla której implementujemy rozwiązanie jest weryfikacja pewnych danych w drodze kontaktu z klientem. Wszystko czego potrzebujemy to formatka która wyświetli listę takich zadań – zadań weryfikacji danych – oraz formatka ze szczegółami pojedynczej sprawy i guzikami odpowiadającymi możliwym wynikom weryfikacji. Oczywiście wspomnianą listę i szczegóły sprawy pobieramy wywołując usługę sieciową. W taki sam sposób zapisujemy wynik weryfikacji.