NetworkManager w KUbuntu

Dzisiaj będzie trochę o czymś innym i do tego krótko. Mam laptopa z zainstalowanym KUbuntu. Laptop ma o tyle niefajnie, że raz podłączam go pod kabelek, czasem pod WiFi sąsiada, a czasem pod swoje własne ;) Do tego łączę się z niego poprzez VPNa do sieci firmowej, ale przy okazji na komputerze przez który idzie łącze ‘kabelkowe’ też czasem odpalam drugiego VPNa. Dlaczego o tym piszę? Gdyż gdzieś w tym galimatiasie linux po prostu staje dęba i nie wie czego konkretnie używać do połączenia z internetem.

Zazwyczaj w KDE mamy takie coś jak NetworkManager. Z tym tylko, że dość często po uruchomieniu systemu klikając na ikonkę w zasobniku dostaję piękne zdalnie ‘NetworkManager disabled’. Khem. Rozwiązanie jest dość banalne, ale trzeba wiedzieć co z czym i po kolei. Dokładny opis znaleźć można pod tym linkiem. Ja tylko o tym piszę bo może komuś się przydać i oszczędzić nerwów.

Z Hudsona na Jenkinsa i niepoprawna konfiguracja

Dzisiaj na szybko – jeśli przemigruje się z Hudsona na Jenkinsa to jest wielce prawdopodobne, że ten drugi nie będzie działał poprawnie. Najczęstszą przyczyną jest brak widoczności niektórych elementów konfiguracji. By mieć pewność, że wszystko będzie ok należy wejść w konfigurację projektu i po prostu bez zmian go zapisać. Powinno styknąć.

Klaster ActiveMQ i dlaczego kolejność XMLa ma znaczenie

Jednym z elementów specyfikacji korporacyjnej Javy są Message Driven Beans, które zasadniczo wrzuca się do wora z napisem JMS (Java Message System). Jak zawsze pominę dywagacje teoretyczne co jest czym. Kiedy wezmę się za zdawanie certyfikatu biznesowego Oracla to na pewno sporo na ten temat napiszę. Dzisiaj jednak coś prostego i na szybko – zrobimy klaster brokerów ActiveMQ.

ActiveMQ jest produktem ze stajni Apache, który dostarcza funkcjonalności JMS, ale poza kontenerem JEE. Ma to swoje plusy – do obsługi JMS można oddelegować oddzielną maszynę i nie przejmować się padami serwera. Trochę łatwiej skalować prostą aplikacyjkę niż kolejne serwery aplikacyjne. W przypadku ActiveMQ nie jest również problemem stworzenie klastra brokerów, co umożliwia ciągłość działania w przypadku gdyby jeden z brokerów odmówił posłuszeństwa.

Samo ActiveMQ da się uruchomić z domyślnymi (na systemach *nixowych wystarczy nadać prawa do wykonywania plikowi activemq oraz zapisu do folderów z danymi i konfiguracją) ustawieniami i będzie to działało całkiem sprawnie. Każdy z brokerów posiada swoją nazwę, a także maszynę i port, na którym nasłuchuje. Domyślny plik konfiguracyjny wygląda nastepująco (wersja 5.5.1):

<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements. See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License. You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->
<!-- START SNIPPET: example -->
<beans
 xmlns="http://www.springframework.org/schema/beans"
 xmlns:amq="http://activemq.apache.org/schema/core"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
 http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">

 <!-- Allows us to use system properties as variables in this configuration file -->
 <bean>
 <property name="locations">
 <value>file:${activemq.base}/conf/credentials.properties</value>
 </property>
 </bean>

 <!--
 The <broker> element is used to configure the ActiveMQ broker.
 -->
 <broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.base}/data" destroyApplicationContextOnStop="true">

 <!--
 For better performances use VM cursor and small memory limit.
 For more information, see:

 http://activemq.apache.org/message-cursors.html

 Also, if your producer is "hanging", it's probably due to producer flow control.
 For more information, see:
 http://activemq.apache.org/producer-flow-control.html
 -->

 <destinationPolicy>
 <policyMap>
 <policyEntries>
 <policyEntry topic=">" producerFlowControl="true" memoryLimit="1mb">
 <pendingSubscriberPolicy>
 <vmCursor />
 </pendingSubscriberPolicy>
 </policyEntry>
 <policyEntry queue=">" producerFlowControl="true" memoryLimit="1mb">
 <!-- Use VM cursor for better latency
 For more information, see:

 http://activemq.apache.org/message-cursors.html

 <pendingQueuePolicy>
 <vmQueueCursor/>
 </pendingQueuePolicy>
 -->
 </policyEntry>
 </policyEntries>
 </policyMap>
 </destinationPolicy>

 <!--
 The managementContext is used to configure how ActiveMQ is exposed in
 JMX. By default, ActiveMQ uses the MBean server that is started by
 the JVM. For more information, see:

 http://activemq.apache.org/jmx.html
 -->
 <managementContext>
 <managementContext createConnector="false"/>
 </managementContext>

 <!--
 Configure message persistence for the broker. The default persistence
 mechanism is the KahaDB store (identified by the kahaDB tag).
 For more information, see:

 http://activemq.apache.org/persistence.html
 -->
 <persistenceAdapter>
 <kahaDB directory="${activemq.base}/data/kahadb"/>
 </persistenceAdapter>

 <!--
 The systemUsage controls the maximum amount of space the broker will
 use before slowing down producers. For more information, see:

 http://activemq.apache.org/producer-flow-control.html

 <systemUsage>
 <systemUsage>
 <memoryUsage>
 <memoryUsage limit="20 mb"/>
 </memoryUsage>
 <storeUsage>
 <storeUsage limit="1 gb"/>
 </storeUsage>
 <tempUsage>
 <tempUsage limit="100 mb"/>
 </tempUsage>
 </systemUsage>
 </systemUsage>
 -->

 <!--
 The transport connectors expose ActiveMQ over a given protocol to
 clients and other brokers. For more information, see:

 http://activemq.apache.org/configuring-transports.html
 -->
 <transportConnectors>
 <transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>
 </transportConnectors>

 </broker>

 <!--
 Enable web consoles, REST and Ajax APIs and demos

 Take a look at ${ACTIVEMQ_HOME}/conf/jetty.xml for more details
 -->
 <import resource="jetty.xml"/>

</beans>
<!-- END SNIPPET: example -->

By stworzyć klaster nie musimy się specjalnie wysilać. Wystarczy uruchomić 2 razy ActiveMQ. Można do tego użyć dokładnie tego samego kodu (lokalizacji na dysku), a użyć tylko innych plików startowych oraz konfiguracji (rzecz jasna każdy broker musi nasłuchiwać na oddzielnym porcie). U mnie rzecz była o tyle łatwiejsza, iż klaster miał być zbudowany z użyciem 2 oddzielnych maszyn. W związku z czym skopiowałem folder z całą aplikacją i konfiguracją na drugi serwer i jedynym co zmieniłem była nazwa brokera (parametr brokerName w elemencie broker).

Uruchomienie tym samym 2 oddzielnych węzłów nie było problemem – oba działały bez zastrzeżeń. Jednakże jak wspomniałem celem było stworzenie klastra brokerów. A tym samym obydwa węzły powinny widzieć siebie nawzajem.

Musimy wpierw odwiedzić też skrypty startujące AMQ i odnaleźć zmienną ACTIVEMQ_QUEUEMANAGERURL i nadać jej adres nie localhost, ale pełnej nazwy domeny – np. tcp://broker1.chlebik.pl:61616.

Potrzebna do klastra jest też zmiana elementu transportConnectors w konfiguracji brokera. U mnie wygląda on po zmianie tak:


<transportConnectors>
 <transportConnector name="openwire" uri="tcp://broker1.chlebik.pl:61616" updateClusterClients="true"
 rebalanceClusterClients="true" updateClusterClientsOnRemove="true" />
 </transportConnectors>

Uwaga! od razu ostrzegam, że przestawione domeny/porty są prezentacyjne i nie istnieją naprawdę. A jeśli już to na pewno nie są dostępne poprzez sieć ;)

Podobnie konfigurujemy (zmieniając dane) na drugim brokerze. Ich uruchomienie oddzielnie powinno się powieść bez problemu – po prostu dwie oddzielne instancje. By się zobaczyły wzajemnie musimy dodać do konfiguracji każdego z nich element o nazwie networkConnectors. W przypadku konfiguracji brokera słuchającego pod adresem tcp://broker1.chlebik.pl:61616 wyglądać będzie to tak:


<networkConnectors>
 <networkConnector uri="static:(tcp://broker2.chlebik.pl:61616)" conduitSubscriptions="false" />
</networkConnectors>

Oczywiście dla broker2 adres będzie odnosił się do broker1. I tutaj najważniejsza informacja – podana konfiguracja u mnie nie działała. Pomimo przeorania tutoriali w sieci oraz dokumentacji jakoś nikt nie wspomniał, iż plik konfiguracyjny ActiveMQ jest wrażliwy na kolejność elementów konfiguracyjnych!!! I by temat zadziałał element networkConnectors najbezpieczniej jest umieścić zaraz za elementem destinationPolicy. Dopiero wtedy przy odpaleniu drugiego brokera otrzymamy w logach coś na kształt:

2012-01-16 20:02:28,078 | INFO  | Establishing network connection from vm://broker1?async=false&network=true to tcp://broker2.chlebik.pl:61616 | org.apache.activemq.network.DiscoveryNetworkConnector | main

Lub coś podobnego do wyżej przedstawionego. Mi ten niuans zmarnował kilka godzin – mam nadzieję, że tym wpisem uchroniłem kogoś przed podobnym niebezpieczeństwem.

Co tam znów u konkurencji słychać?

Podobnie jak kawał czasu temu postanowiłem przejrzeć swoje RSSy by podzielić się z Wami ciekawymi materiałami w interesujących nas tematach. Co prawda materiały te obejmują 2 ostatnie lata (trochę zapuściłem bloga ostatnio, przepraszam), ale to na pewno nie odejmuje im wartości merytorycznej. W nowy rok dobrze jest wejść z solidną dawką wiedzy na rozruch.

Na początek linkowany już u mnie na blogu tutorial Darka Zonia wprowadzający w Spring Framework. Mój tutorial póki co stoi w miejscu zaś Darek bardzo szybko i sprawnie  stworzył kawałek niezgłego pisania.

Jak zawsze bajtów na dysku nie zasypuje Tomek Dziurko i przez ostatnie miesiące na blogu zaprezentował kilkanaście ciekawych wpisów dotyczących popularnych bibliotek i narzędzi. Przede wszystkim Tomek od zawsze popularyzuje użycie webframeworku Wicket i w związku z tym można u Niego znaleźć bardzo fajny tutorial na ten temat. Do tego ciekawym wpisem na pewno jest przedstawienie systemu kontroli wersji Mercurial – warto sprawdzić czy „konkurent” GITa może nam coś ciekawego zaoferować.

Nie jestem pewny, czy aby nie umieszczałem już linka do bardzo fajnego tutoriala o UMLu autorstwa Grześka Kukawskiego. Co ciekawe – materiał jest prezentowany w formie oddzielnych lekcji i do tego w formie krótkich filmo-prezentacji (pomysł z użyciem map myśli do prezentacji treści jest moim zdaniem bardzo dobry). Zachęcam do zapoznania się z tym kursem.

Często podczas nauki Javy brakowało mi ciekawych i przystępnych tutoriali, które opisywałyby warstwę middleware pisanego w Javie – tych wszystkich kolejek, webserwisów, wzorców integracyjnych i całej hałastry. Z wielką zatem ciekawością przeczytałem kilka wpisów na ten temat Łukasza Dywickiego.

Na koniec zostawiłem zwycięzcę mojego prywatnego konkursu o tytuł „Tytana Javowej Blogosfery” – Bartka „Koziołka” Kuczyńskiego. Na jego blogu można znaleźć tyle wartościowego materiału, że próba wyliczenia tych ciekawszych mocno rozdęłaby długość tego posta. Ja mogę polecić ze swej strony bardzo ciekawą serię o „Ekstremalnej obiektowości”.

To tyle na dziś i tak przy okazji – Szczęśliwego Nowego Roku.

Ćwiczenie w dowolnym języku programowania

Dzisiaj coś z zupełnie innej beczki. Pewnie nie raz rozpoczynaliście zabawę z nowym językiem programowania – niezależnie czy to był Groovy, Scala czy coś poza JVM - Ruby lub Pyton. Zawsze nadchodzi ten pierwszy raz, kiedy po przerobieniu tutoriala/książki/FAQ wypadałoby coś napisać, aby w praktyce przetestować sam język jak i swoją wiedzę.

W przypadku języków, które występują najczęściej w kontekście sieciowym tworzy się coś na kształt bloga, CMSa lub podobnych – prosty CRUD, konfiguracja logowania, zaciągnia zależności i tego wszystkiego. Tutaj niestety problem polega na tym, iż do pracy zaprzęgamy również dedykowany framework – Grailsy, Lifta, RoRa, Django czy co tam jeszcze nam do głowy przyjdzie. Nasz projekt działa, ale czy na pewno do końca rozumiemy język? W dzisiejszych rozwiązaniach otrzymujemy tak wiele rzeczy OOTB, że czasem nawet nie mamy okazji dowiedzieć się co działa pod spodem.

Jeśli takie podejście jest Ci znane – wówczas proponuję inną rzecz. Polecam ten link – jakiś czas temu bawiłem się akcjami (w sensie edukacyjnym – nigdy złotówki nie zainwestowałem) i próba zaprzęgnięcia komputera do dokonywania analiz danych wydawała mi się dość naturalna. Pod wspomnianym linkiem znajduje się algorytm prostego systemu na akcje – czy działa – trudno absolutnie powiedzieć przy dzisiejszej zmienności na GPW. Jednakże jako rzecz do zaimplementowania w nowym języku programowania nadaje się idealnie.

Mamy połączenie z zewnętrznymi zasobami (doczytajcie komentarze), parsowanie pliku tekstowego, rozbicie danych na struktury (listy/zbiory/mapy), pętle i wszystko co potrzebne. Podany system można rozbudowywać – zarówno o własne wariacje algorytmów, jak i o bardziej konkretne  funkcjonalności. Może dodać zapis do bazy danych? Może zapisywać dane inkrementacyjnie we własnym zakresie niż za każdym razem łączyć się po zewnętrzne dane. Dorobić interfejs webowy? Czemu nie. Wiem tylko jedno – da się poćwiczyć.

Jeśli znacie podobne fajne pomysły na ‘programistyczną piaskownicę’ to zachęcam do podzielenia się wiedzą w komentarzach.

Asynchroniczne WebServisy czyli jak przyspieszyć SOAP

Ostatnio w zakładzie dostałem do rozpoznania wolne działanie webserwisu. Problem leżał w tym, iż aplikacje klienckie były w stanie szybciej strzelać pod webserwis niż ten nadążał z procesowaniem. I zasadniczo możnaby rozpocząć szukanie winnego w kodzie gdyby nie prosty fakt, że klasy odpowiadające za webserwis walidowały tylko żądanie po czym pchały obiekt do JMS. Co tutaj można przyspieszyć?

Odpaliłem SoapUIPro i z konkretną dawką testów obciążeniowych udałem się na poszukiwanie winnego. Co się okazało – webserwis był oparty o SOAPa. To jeszcze może nie jest samo w sobie tragiczne – tragicznym natomiast okazało się to, iż pod spodem nasz request potrafił zawierać naprawdę sporą ilość XMLa. Standardowe dane dla każdego requestu to dobre 5 elementów XMLa,  zaś szóstym była lista łańcuchów tekstowych. W 90% ta lista zawierała raptem jeden element – problemem było pozostałe 10%. Wówczas lista rozrastała się do dość solidnych rozmiarów i proces przesyłania tych danych, ich marshallingu, procesowania i takich tam troszkę trwał.  Trzeba było coś z tym fantem zrobić. Przepisanie na RESTa pozostawało w dalszych planach, zaś na szybko udało mi się zorganizować jedną rzecz – wbudowaną w JAX-WS adnotację @Oneway.

 The @Oneway annotation denotes a method as a Web service one-way operation that only has an input message and no output message. Apply this annotation to methods on a client or server Service Endpoint Interface (SEI) or a server endpoint implementation class for a JavaBeans endpoint.

Dodam jeszcze tylko, że adnotowane w ten sposób metody muszą spełniać następujące kryteria:

  • muszą zwracać void
  • nie mogą rzucać wyjątków

Może to być dość ograniczające, np. kiedy rzucony wyjątek w jakiś sposób służy nam do kontroli przepływu po stronie klienta. Jednakże jeśli przy strzelaniu do usługi sieciowej stosujemy metodę fire&forget wówczas jesteśmy w domu. Brak oczekiwania na odpowiedź ze strony serwera – w przypadku przeze mnie opisywanym wstępny przyrost wydajności to około 400%. Myślę zatem, że gra jest warta świeczki.

Międzynarodowy Dzień Bloga

Podobno dzisiaj obchodzimy takie zacne święto. Z tej okazji wszystkim kolegom blogerom (no i troszkę sobie) życzę wszystkiego najlepszego – jeszcze więcej wpisów, komentarzy, odsłon, klików, kasy z reklam (jak ktoś zarabia) i w ogóle wszystkiego wszystkiego naj.

Czego używacie do testów?

To nie jest prawdziwy wpis. To pytanie, dokładnie takie jak w tytule. Czego używacie do testowania aplikacji?

Konkretnie – mam jakieś API, które zwraca różne dane w zależności od podanych parametrów (a tych potrafi trochę być). I teraz potrzebowałbym napisać kod testów, który przy każdym budowaniu Mavenem wywoła kod na 20 różnych sposobów i sprawdzi czy wyniki są poprawne (głównie sprawdzi ‘poprawność logiczną’ zwróconych danych). Czy to testy jednostkowe? Czy może integracyjne? Narzędzia, przemyślenia, porady – wszystko mile widziane.

Urlop

Jak co roku trzeba odpocząć, stąd też wakacyjny wyjazd w góry. Piszę o tym przede wszystkim, iż nagle zacząłem dostawać tony mejli z różnymi pytaniami (fatum, czy co?). Stąd też na szybko – najbliższy tydzień i połowę kolejnego przebywam w górach i mam ograniczony czas/chęć/możliwości by odpisywać na mejle/komentarze.

Od czego zacząć naukę Javy?

Tytuł wpisu jest po części niepoprawny, jednakże dostaję co i rusz mejle z mniej więcej tak sformułowanym pytaniem. Dlatego też by nie musieć odpisywać za każdym razem na to samo, a także by nie stosować brutalnego kopiowania postanowiłem swoje przemyślenia zamieścić na blogu.

Na samym początku mała uwaga do ludzi, którzy na Javie zjedli zęby i kawałek dziąseł – proszę o zachowanie komentarzy z cyklu ‘Tak naprawdę technologia/framework XX nie jest YY, albowiem Iksiński uważa inaczej i tak naprawdę realizuje się tam wzorzec ZZZ i z całą pewnością powinno się go poznawać przed/po OOO’ dla siebie. Wpis ma za zadanie choć oględnie pokazać o co chodzi w tej masie nazw i specyfikacji – mniejsza o detale i kłótnie ‘pro-programmersów’.

Czym tak naprawdę jest Java? To wcale nie jest głupie pytanie! Czym jest Java? Językiem programowania ktoś rzeknie. I będzie miał rację. Platformą do budowania aplikacji – też przyznam mu rację (pomińmy językowe wygibasy co jest platformą, a co nie). Specyfikacją, do której potem stosują się inni? Też racja. Więc co to tak naprawdę oznacza ‘nauczyć się Javy’?

Java jako taka miała być językiem wieloplatformowym, uruchamianym na różnych systemach i urządzeniach (mottem było „Write once, run everywhere”) dzięki użyciu maszyny wirtualnej. Dlatego też na samym początku Java poszła trzema różnymi drogami:

a) przeznaczona do pisania aplikacji desktopowych. Dziś przy tendencjach do przenoszenia wszystkiego do chmurek, lekkości i mobilności rozwiązań wydaje się być to pewnym przeżytkiem. Jednakże Java dalej posiada bibliotekę Swing oraz AWT/SWT, które umożliwiają tworzenie aplikacji desktopowych uruchamianych  konkretnie na maszynach klienta. Nie wiem jak ten rynek wygląda obecnie – na pewno istnieje masa legacy-code, ale nie za bardzo jestem na bieżąco z rynkiem koderów w tych technologiach. Wiem za to na pewno, że na swoim kompie instalowałem Adobe AIR – choćby dla aplikacji do składania PITa przez internet, z tego co wiem np. Ipla dla linuxów jest w tym pisana. Czyli jakby Java tutaj oddawała pola.

b) lekka wersja przeznaczona na urządzenia mobilne (to w dużym uogólnieniu) – wersja Mobile Edition. Najczęściej kojarzona z telefonami komórkowymi, choć może i niesłusznie – bardziej chodziło o urządzenia z małą zdolnością obliczeniową. Z tego, co do mnie dociera z blogosfery wygląda na to, że jeśli chodzi o komórki to chyba też Java przegrała tę batalię (w pewnym sensie) - Objective-C dla iPhonów i pochodnych od Apple, Android bazuje na JVM, ale nie jest z nią w pełni kompatybilny, Symbian Windows Phone to rodzina C++. Trochę kiepsko.

c) wersja korporacyjna (webowa) – póki co tutaj dzieje się magia. O tej wersji piszę na blogu najwięcej. Programistów wyznających się na tej magii pracodawcy poszukują najwięcej. I o tej też Javie skupię się w dalszej części wpisu.

Zanim jednakże przejdziemy do samego webdevelopmentu poruszę kilka okolicznych zagadnień. Zaczniemy od samej Javy  jako języka programowania. Nie wiem drogi czytelniku czy posiadasz doświadczenie w tej dziedzinie. Może do tej pory kodowałeś desktopowe gierki na swoim wysłużonym blaszaku. Równie dobrze jak ja jakiś czas temu możesz pracować przy PHP czy innym Pytonie. Może jesteś frontendowcem, który musi dowiedzieć się czegoś o JSP, servletach i okolicach. Wiem jedno – nauczyć się podstaw Javy jako języka programowania nie jest zbyt trudno. Odradzałbym jednakże kanoniczną ‘Thinking in Java’ – o tym dlaczego opisałem kiedyś na blogu. Zwykłe tutoriale w internecie – taki jak choćby tutorial na stronach Oracle czy książeczki z serii ‘Core Java’ dostępne w Helionie absolutnie wystarczą.

Idziemy dalej. Przy nauce języka z całą pewnością będziemy korzystać z IDE – czy będzie to Eclipse, czy NetBeans czy jeszcze coś innego – nie ma znaczenia. Znaczenie ma to, iż wszystkie IDE ukrywają przed użytkownikiem magię, którą czynią pod spodem – budowanie aplikacji, kompilacja i w końcu uruchomienie. W przypadku prostych aplikacji do nauki języka nie jest to jeszcze tak mocno widoczne – z całą pewnością jednak stanie się kiedy przejdziemy do prawdziwego JEE. Konkretnie na sam początek mam na myśli narzędzia budujące projekty - konkretnie zaś Anta oraz Mavena. Znajomość (choćby ogólna i dość pobieżna) tych dwóch pozwala na zrozumienie co w ogóle się dzieje z kodem kiedy klikamy ‘Compile and run’ w IDE. Do poznania tych dwóch dobrze jest odwiedzić ich strony internetowe, albo zaopatrzyć się w tę oto książeczkę, w której można znaleźć opis szeregu innych ciekawych narzędzi przeznaczonych dla Javy

Przed rozpoczęciem pisania kodu zawadzimy o jeszcze dwie rzeczy. Pierwszą z nich jest baza danych. Jeżeli przychodzisz z miejsca, gdzie klucz główny tabeli oznacza to samo co kolumnę INTEGER z auto-increment to wiedz, że jeszcze bardzo dużo nie wiesz. Absolutnie nie twierdzę, że MySQL jest zły – chodzi mi tylko o to, iż w przypadku korporacyjnych aplikacji najczęściej używa się produktów, które są traktowane jako ‘poważne’, no i mają też niebagatelne możliwości – tutaj (z mojego doświadczenia) wynika, że graczy jest tak naprawdę dwóch – Oracle oraz MSSQL. Gdzieś tam ktoś słyszał o tym, iż w użyciu jest Sybase, DB2 czy jeszcze inne wynalazki – jednakże to mniejszość – znajomość tych dwóch pierwszych (nie ekspercka, nie da się nie będąc adminem lub zawodowo programistą PL/SQL stwierdzić, że się zna te bazy). Temat jest długi, materiałów w sieci nie brakuje, książek (po polsku) również nie.  Zarówno Oracle jak i MSSQL posiadają wersje, które można za darmo pobrać i zainstalować na lokalnym kompie by się ich poduczyć. I nawet nie mówię o samym języku SQL (bo ten w podstawach jest taki sam wszędzie – w końcu po coś mamy standard ANSI), ale o takich rzeczach jak schematy, userzy, materializowane lub nie widoki, podstawy programowania bazy (PL/SQL czy T-SQL) – to się przydaje w codziennej pracy, choćby po to by wiedzieć co wpisać w konfigu cienkiego klienta.

Drugą rzeczą są serwery. W przypadku aplikacji desktopowych problemu nie ma – JVM jest odpalana na lokalnym komputerze i problemu nie ma. W przypadku JavaScriptu mamy przeglądarkę i tylko przeglądarkę. PHP czy Python wykonywane są na odpowiednio skonfigurowanym serwerze WWW  (choćby poprzez FCGI). Wszystko jest dość oczywiste. Czym innym niestety są serwery do użycia Javy – możemy je bowiem podzielić na dwie kategorie - kontenery servletów oraz serwery aplikacyjne.

a) kontener servletów - jak sama nazwa wskazuje jest to serwer (aplikacja), która pozwala na wykonywanie kodu zawartego w servletach (klasach Javy, których kod może być wywoływany przez zdalnego klienta – nie musi to być np. protokół HTTP), a także kodu, do którego servlet się odwołuje. Najpopularniejsze to Apache Tomcat oraz Jetty.

b) serwer aplikacyjny - jest to serwer (aplikacja), która jest zgodna ze specyfikajcą korporacyjnej Javy – w związku z czym poza zwykłym hostowaniem aplikacji webowych (tak samo jak kontener servletów) udostępnia masę dodatków – jak choćby obsługę kolejek (JMS), obsługę bezpieczeństwa, współdzielonych zasobów JNDI i masę masę innych rzeczy. Jednakże w związku z tym jest o wiele bardziej zasobożerny. Najpopularniejsze serwery to BEA Weblogic, JBOSS Server, Websphere oraz Glassfish.

Większość IDE skonfigurowanych do pracy z Javą lub Javą EE przy instalacji pyta o jednoczesne zainstalowanie kontenera lub całego serwera ( np. NetBeans może nam zainstalować Glassfisha). Przy rozpoczynaniu przygody z Javą EE jest to dobra opcja – taka instalacja ma tę zaletę (przynajmniej powinna mieć), że działa po kliknięciu w IDE. Nie bawimy się w konfigurację, tworzenie domen i ustawianie źródeł danych – serwerek po prostu działa, a my możemy pisać kod. No właśnie, kod.

Podstawą do działania Javy w środowisku internetowym jest technologia servletów i w pewnym sensie automatycznie wiązana z nią technologia JavaServerPages (od obsługi widoku). Jest to realizacja wzorca MVC – servlet sprawuje w tym przypadku funkcję kontrolera, zaś strony (pliki) JSP są naszym widokiem. Dla zrozumienia podstaw tej technologii (poza tutorialami w internecie) najbardziej nadaje się książeczka z serii ‘Head First’. Zasadniczo niewiele więcej trzeba o tym pisać – poza tym, iż tworzenie kodu za pomocą czystych servletów i JSP to trochę hardkor i najczęściej dziś do tego stosuje się konkretne frameworki webowe. Co to jest framework? Ano jest to zbiór klas/bibliotek/pakietów, które czynią tworzenie aplikacji internetowych znacznie łatwiejszym. Za najbardziej kanoniczny ( w sensie pochodzenia, nie zastosowań czy znaczenia) uważa się JavaServerFaces - był to framework stworzony przez firmę Sun Microsystems (twórcę języka Java). Problem z nim był taki, iż miał dość pokręcony model przetwarzania requestów, potrzebne też były różne hacki na poprawne renderowanie widoku i masę różnych rzeczy. Jakiś czas temu pojawiła się druga wersja tego frameworku, do zabawy z nią można zapoznać się książeczką dostępną po polsku. Mimo szeregu zmian nie jest to jednakże często polecane rozwiązanie. O wiele bardziej zaawansowanym narzędziem jest webframework o nazwie SEAM. Bazuje on w podstawach na JSF, jednakże posiada masę dodatkowych ficzerów, które naprawdę wydają się być przydatne. Niestety nie miałem okazji przysiąść na dłużej z tym frameworkiem. Wiem jednakże na pewno, iż posiada świetnie wyglądającą dokumentację dostępną na oficjalnej stronie frameworka. Podobnym do powyższych jest również webframework Struts – jego pierwsze wersje pojawiły się naprawdę dawno temu – w związku z czym jego konstrukcja potrafiła cokolwiek odstraszyć. Druga wersja frameworka, która pojawiła się nie tak dawno temu skonstruowana jest o wiele lepiej – choć dalej nie bez zastrzeżeń.

To co wymieniłem powyżej to najbardziej popularne (moim zdaniem i jest to subiektywne odczucie) webframeworki w naszym kraju. I tutaj uwaga! To są frameworki, które częściowo wchodzą również w warstwę widoku. Mówiąc krótko – najczęściej widok to po prostu pliki JSP, wzbogacone o masę ekstra tagów, które umożliwiają rendering ciekawszych kontrolek. Jednakże istnieje możliwość zastąpienia tej części bardziej wyrafinowanymi możliwościami – ostatnio w tej roli (głównie przynajmniej z tego co widzę po ogłoszeniach o pracę) zaczyna dominować produkt od Googla – GoogleWebToolkit. Jest to biblioteka, która umożliwia tworzenie mocno zAJAXowanych aplikacji, które jednakże powstają tylko i wyłącznie z użyciem Javy. Cały kod JavaScriptu jest generowany za pomocą kodu pisanego w Javie, jednakże programista ma docelowo nie przejmować się istnieniem przeglądarki, standardów i różnic w silnikach JavaScriptu. Z moich pobieżnych zabaw z GWT skojarzenie z pisaniem w ActionScripcie nasuwa się samo. Tworzymy kontrolki, umieszczamy na stronie i to docelowo ma działać. Ostatnimi czasy więcej słyszy się o produkcie opartym na GWT o nazwie Vaadin, a najbardziej chyba dobrym miejscem by rozpocząć przygodę z tym rozwiązaniem jest strona Kozioła. Oprócz tychże mamy też szereg innych ciekawych projektów, jednakże jest ich tyle, że aż głowa mała – nie będę wskazywał konkretnych przykładów (no dobra - Richfaces dla przykładu), które ułatwiają tworzenie GUI – tutaj jednakże trzeba wybrać samemu rozwiązania, które nam podpasują.

W powyższych wywodach nie wymieniłem jednego magicznego słowa – Spring. Albowiem ten framework (a może to biblioteka?) jest tak naprawdę nie tylko frameworkiem, ale też zupełnie nowym podejściem do tworzenia aplikacji webowych. Spring bowiem rozwiązywał problemy, które pojawiły się w czasach, kiedy Java była niesamowicie kobylasta, a fajne tagi w JSF naprawdę były szczytem innowacji. Spring jest rozwiązaniem, które realizuje wzorzec Dependency Injection / Inversion of Control (nie wchodzę w dywagacje co jest elementem czego i takie tam – na uniwerkach mogą bo mają czas i za to im płacą).  Co oznacza nie tylko ułatwienie tworzenia obiektów, zachowania czystości kodu oraz skalowalności, ale też wpływa tak naprawdę na wszystko. Wiem, że powyższe zdania wyglądają jak marketingowy bełkot, ale naprawdę nie potrafię w skrócie opisać Springa i całej jego zajebistości. Wiem tylko, że ostatnio dość często piszą/dzwonią do mnie rekruterzy i tak naprawdę z frameworków wymagają tylko tego Springa – ewentualnie z jego bardzo fajnym dodatkiem – Spring MVC, gdyż tak naprawdę dzięki temu combo nic więcej już nie potrzeba. No prawie…

Tym, co jest potrzebne to jakiś sposób implementacji logiki biznesowej, co jest dość często automatycznie powiązane z dostępem do bazy danych. Wiem, że to może dość radykalne stwierdzenie, ale nie piszę tu rozprawy doktorskiej – piszę do ‘wanna be Java programmer’. Zatem przyjmijmy na razie, że rzecz jest w dostępie do bazy danych. I tutaj mamy dwie możliwości:

a) JDBC - technologia stara jak świat, ale dalej dość mocno użytkowana. Dlaczego? Albowiem jest prosta do bólu i nie wymaga zaznajamiania się z ORMem, pisaniem masy XMLa, albo wpisywania masy adnotacji do kodu. Po prostu działa. Do swego działania wystarczy dostarczyć bibliotekę ze sterownikiem dla konkretnej bazy danych i piszemy kod. Jest również najbliższym do pisania czystego SQLa (w sumie to jest pisanie czystego SQLa tylko opakowanego w obsługę połączenia i wyjątków). Zawsze czysto, zawsze sucho i zawsze pewnie.

b) ORM - bazy danych obecnie używane w 99% to bazy relacyjne. Ergo – obiektowe języki programowania nie za bardzo do nich przystają – musimy napisać kod, który jakoś zamieni te proste rekordy z bazy na piękne obiekty z ich metodami dostępowymi, modyfikatorami dostępu oraz polimorfizmem. I tutaj ludzie wymyślili coś takiego jak ORM - Object Relational Mapping. Standardem stworzonym przez firmę Sun jest Java Persistence API, w skrócie JPA. W obecnej wersji jest to tak naprawdę synergia pomiędzy rozwiązaniami zaimplementowanymi uprzednio w najbardziej popularnym rozwiązaniu – Hibernate. Bibliotekę tę wymienia się zasadniczo w każdym ogłoszeniu o pracę, zatem jeśli chcesz zostać koderem Javy - poznanie Hibernate (a przez to i w dużej mierze JPA) jest po prostu warunkiem koniecznym. Co jest w ORMach niefajne? Konieczność klepania XMLa – choć ostatnio o wiele szybciej i wygodniej osiąga się cel poprzez adnotacje. Często jednak mam wrażenie, że kiedy przychodzi do czegoś bardziej skomplikowanego trzeba (mimo opakowania w np. criteria API Hibernate) wklepać fizycznie ‘SELECT * FROM’ i nic się z tym nie da zrobić.

Co nam teraz zostało? W sumie masa innych rzeczy, które jednakże na pewno dla ‘wannabe programersów’ znajdują się na bardzo wysokim poziomie. Wróć, może źle napisałem. Odległym poziomie – brzmi bardziej prawdziwie. Wymienię tylko nazwy – pisać już mi się nie chce, a kto chce znajdzie sobie informacje w Wiki i na pewno wujek Google dopomoże. Mamy zatem JMS, JMX, JaaS,  ESB, WebServices (SOA), BPM, UML, ufff - zapewniam też, że możnaby tak jeszcze długo.

Powodzenia życzę ;)