sobota, 31 maja 2008

Nauka Rails - 1.2.6 vs 2.0.2

Railsy mają coś w sobie! Kropka. Nikogo przekonywać nie będę. Sam widziałem po prostu kilka prezentacji, poczytałem kilka blogów, widziałem Railsy oraz Rubiego w akcji na videotutorialu, wygenerowałem sobie kilka prostych aplikacji i jestem zdeterminowany aby język Ruby oraz same Railsy poznać dokładnie.
Myślisz jak ja? Chcesz nauczyć się Railsów? Widzisz, mamy problem. Kilka miesięcy temu wyszła nowa wersja frameworka opatrzona numerkiem 2. Rails 2.0.x wprowadza trochę zmian, kilka nowości, trochę usprawnień i nie byłoby w tym nic strasznego, gdyby nie fakt, że parę rzeczy zostaje przeniesionych, inne się dewaluują, jeszcze inne całkowicie znikają. Framework nie do końca wierzy w ideę kompatybilności wstecznej. Problem jest, bo bodaj najlepsza dostępna obecnie na rynku książka "Agile. Programowanie w Rails" traktuje o Railsach w wersji 1.2.6. Początkujący programista może się zdziwić, że przykłady z pierwszych 170 stron książki w ogóle nie działają (dynamiczny scaffolding został usunięty z Railsów 2).

Pytanie pozostaje co zrobić? Na forum http://www.rubyonrails.pl temat był poruszony i większość osób zgodnie stwierdziła, że warto uczyć się Railsów z książek w wersji 1.2.6 i potem doczytać o zmianach, które zaszły w wersji drugiej. Myślę, że podejście to nie jest złe. Aby zainstalować Railsy w starszej wersji należy dodać jedną opcję więcej podczas instalacji:

gem install rails --version 1.2.6

To było proste. Jest jednak jeszcze jeden mały szczegół, o którym można zapomnieć. Tworząc nową aplikację railsową należy uwzględnić wersję. Tworząc przykładową aplikację Składnica (składnica = depot :) ) z książki "Agile. Programowanie w Rails", należy wywołać komendę rails z dodatkową opcją:

rails _1.2.6_ depot

Ja osobiście postanowiłem się uczyć Railsów z książki "Agile. Programowanie w Rails", z zainstalowanymi Railsami w wersji 2.0.2. Z większość zmian, które zaszły i o których mi wiadomo, jestem sobie w stanie poradzić:

* sqlite3 domyślną bazą danych zamiast mysql - wystarczy zainstalować sqlite3 i gotowe, nic strasznego

* brak scaffolding'u - dynamiczny scaffolding nie został tyle usunięty co przeniesiono go jako osobny plugin. Wystarczy uruchomić

script/plugin install scaffolding

aby przykład Składnica z książki APWR działał.

Zmian jest jeszcze zapewne trochę, ale myślę ze z pomocą google, poradzę sobie w trakcie napotykania problemów. Po przerobieniu APWR z pewnością przeczytam "The Ruby Way" autorstwa Obie Fernandez'a. Jedna z niewielu książek wchodząca daleko w szczegóły działania frameworka, a co ważniejsze opisującą Railsy w wersji 2.0.2.

piątek, 30 maja 2008

Instalowanie Ruby oraz Ruby on Rails na Ubuntu 8.04 Hardy Heron

Poniżej zamieszczam instrukcję instalacji języka Ruby (w wersji 1.8) oraz frameworka Ruby on Rails na najnowszej wersji Ubuntu 8.04 Hardy Heron. Podstawowa zasada (powołując się tutaj na wiki.rubyonrails.org) to instalacja Rubiego prosto z repozytorium Ubuntu, zainstalowanie gem'ów (będących repozytorium Rubiego) ze źródła, a na końcu zainstalowanie Railsów z użyciem gemów. Każda inne podejście obarczone jest jakimś problemem czy innym ryzykiem. Nie będę się wdawać w szczegóły (bo ich po prostu nie znam) i podam od razu gotowy przepis:

1. Instalacja Ruby w wersji 1.8

~$ sudo apt-get install ruby irb ri rdoc ruby1.8-dev libzlib-ruby libyaml-ruby libreadline-ruby libncurses-ruby libcurses-ruby libruby libruby-extras libfcgi-ruby1.8 build-essential libopenssl-ruby libdbm-ruby libdbi-ruby libdbd-sqlite3-ruby sqlite3 libsqlite3-dev libsqlite3-ruby libxml-ruby libxml2-dev

2. Ściągniecię i rozpakowanie źródeł, a następnie instalacja gems

~$ sudo ruby setup.rb

3. Aby mięć dostęp do komendy gem, wystarczy zwykły softlink

~$ sudo ln -s /usr/bin/gem1.8 /usr/bin/gem

4. Instlaujemy Rails'y z użyciem gems

~$ sudo gem install rails


Ot i cała magia. Tyle wystarczy aby rozpocząć swoją przygodę z Rubym i Railsami pod Ubuntu.

0 days left...

Dziś oddałem ostatni rozdział pracy magisterskiej na ręce mojej Pani Promotor. Uff... Czeka mnie teraz jeszcze cztery dni wprowadzania poprawek, zmian i sklecenie "Wstępu". Jeszcze łącznie 4 dni i po krzyku. Nie zmienia to faktu, że w końcu mogę troszkę odetchnąć i do łask (po tygodniach przerwy) wraca blog. Strona zalicza obecnie 50 wejść dziennie, co przy ostatnim braku aktualizacji cieszy mnie niezmiernie. Największą popularnością cieszy się wciąż Java Killers oraz (o dziwo?) posty o Lyx'sie - jak widać nie tylko ja doceniłem piękno tego programu:).

W każdym razie po miesiącu męczarni (nadrobieniu ostatnich 4 miesięcy pracy w ciągu zaledwie 4 tygodni) wracam do świata żywych, a wraz ze mną ten blog.

Happy :) :P ?

poniedziałek, 19 maja 2008

Back in Black!

Właśnie, po 3 miesiącach przerwy spowodowanej wiadomo czym, wróciłem ponownie na zajęcia YMAA. Trener się zdziwił jak mnie zobaczył i tym mocniej polał niemiłosiernie, jak usłyszał powód mojej absencji. Nie mniej jednak pamiętał kim jestem, a to chyba najważniejsze ;)
A trening jak to trening. Po długiej nieobecności nic się nie pamięta, formę ma się słabą, wylewa się 6 milionów litrów potu z siebie i ogrania Cię takie wszechobecne 'ale-ja-jestem-do-dupy'... Jednak nie ma nic piękniejszego jak powrót (lub próba powrotu) do domu, człowiek jest wtedy jakiś taki zmęczony, ale i rozradowany zarazem. Idzie się może włócząc trochę nogami, ale to uczucie zajechania organizmu wysiłkiem fizycznym jest po prostu tego warte.
Świat jakiś od razu wydaje się piękniejszy i to krzesło przy biurku, które jeszcze 3 godziny wcześniej właziło Ci w dupę, nagle staje się jakieś takie wygodne, miłe i przytulne... Tak tak moi mili, nie ma nic przyjemniejszego jak powrót z treningu. Wszystkim serdecznie polecam!

niedziela, 18 maja 2008

Java Killers #006

Po dłuższej przerwie, spowodowanej moją niekończącą się walką z pracą magisterską, mam przyjemność przedstawić wam koleją odsłonę cyklu Java Killers. Jak zwykle, aby nie przedłużać, spójrzmy na poniższy kod:


5 package javakillers.part006;
6
7 /**
8 *
9 * @author pawel
10 */
11 public class Main
12 {
13 public static void main(String[] args)
14 {
15 Main m = new Main();
16 m.run();
17 }
18
19 public void run()
20 {
21 int a = 0;
22 try
23 {
24 while(a < Integer.MAX_VALUE + 1)
25 {
26 a++;
27 }
28
29 if(a >= 0)
30 {
31 System.exit(0);
32 }
33 }
34 finally
35 {
36 System.out.println("a wynosi: " + a);
37 }
38 }
39 }
40
41


I standardowe pytanie: co zwróci powyższy kod. Dziś do wyboru aż pięć możliwych odpowiedzi, z czego jak zwykle tylko jedna jest prawdziwa:

A) a wynosi: 2147483647
B) a wynosi: -2147483648
C) a wynosi: 0
D) program się zapętli i sam z siebie nie zakończy działania
E) program się zakończy, ale nic nie napisze

Zanim przeczytasz rozwiązanie, spróbuj pomyśleć nad odpowiedzią.





Prawidłowa odpowiedź to oczywiście E) program się zakończy, ale nic nie napisze. Rozwiązanie jest trywialne, jeśli znane są nam dwie cechy języka Java:

1. Integer.MAX_VALUE + 1 zwróci nam liczbę ujemną [nie wiesz czemu? sprawdź w googlach, warto wiedzieć!]
2. Wywołanie System.exit(0); powoduje natychmiastowe zabicie procesu, przez co blok finally { ... } nigdy się nie wykona, mimo, że w oficjalnym tutorialu do języka Java możemy przeczytać " The finally block always executes when the try block exits". Jak widać nie zawsze i warto mieć tego świadomość.

I to koniec na dziś! Na zakończenie pytanie jeszcze dla ambitnych: kiedy jeszcze nie wykona się blok finally { ... }? Innymi słowy co, w try {... } musi się pojawić, żeby zawartość finally { ... } nigdy się nie wykonała?

sobota, 17 maja 2008

Zostań Sun Campus Ambassadorem!

Moja przygoda ze studiami informatycznymi powoli dobiega końca, a w raz z nią kończy się moja praca w Sun Microsystems jako Sun Campus Ambassador na Politechnice Wrocławskiej. W sumie w programie tym uczestniczyłem łącznie dwa lata, byłem pierwszym campus ambassadorem w Polsce oraz jednym z pierwszych na świecie. W tym czasie udało się zorganizować dwie konferencje (Sun Technology Day na Politechnice Wrocławskiej oraz wrocławską edycję Netbeans Roadshow). Mamy na kampusie prężnie działającą grupę PWr Java User Group (140 zarejestrowanych uczestników, około 50-60 aktywnych). Grupa obok krakowskiego PLJUGa i warszawskiego WarsawJUGa jest jedną z najbardziej aktywnych w kraju.

Coż udało się zrobić wiele, można było troszkę więcej, ale nie mi już będzie dane to zmieniać. Moje studia się kończą i czas przekazać pałeczkę komuś nowemu. Jest jeszcze sporo do zrobienia: grupa na Politechnice dopiero co rozwinęła skrzydła, warto by wreszcie pociągnąć grupę OpenSolarisa, stworzyć Wrocław JUG (który działać mógłby jako bliźniacza grupa do PWr JUGa lub mógłbym z PWr JUGa wyewoluować). Netbeans Road Show miał tam swój jakiś lokalny sukces, można myśleć o kolejnych edycjach, może o zorganizowaniu innych konferencji tego typu?
Pomysłów i wyzwań jest bez liku, a przecież ktoś musi im sprostać! Myślisz, że jesteś taką osobą? Chciałbyś zostać kolejnym Sun Campus Ambassadorem na Politechnice Wrocławskiej (lub Uniwersytecie Wrocławskim)? Poprowadzić community, propagować technologie związane z Javą, Ruby'm oraz Pythonem? Poznać znane osoby ze świata Javy (na przykład Roman Strobl czy Geertjan Wielenga), dużo się uczyć, doskonale bawić i dostawać jeszcze za to wynagrodzenie?
Jeśli tak lub jeśli nie jesteś do końca przekonany, ale się zastanawiasz, w takim razie serdecznie zapraszam w najbliższą środę wieczorem (21.05.2008) na nieformalne spotkanie przy piwku, na którym poopowiadam wszystkim zainteresowanym czym dokładnie praca Campus Ambassadora jest, jakie są jej zalety, jakie minusy. Dowiecie się z jakimi obowiązkami się trzeba liczyć i na jakie wynagrodzenie (nie tylko pieniężne) można liczyć. Postaram się odpowiedzieć na wszelkie Wasze pytania. Od zainteresowanych osób zbiorę dane teleadresowe potrzebne do rozpoczęcia procesu rekrutacji.

Zainteresowany/zainteresowana? Czekam zatem na Twojego maila! Wszystkie zaintrygowane osoby proszone są o napisanie do mnie na Pawel.Szulc@sun.com, celem ustalenia szczegółów. Im szybciej tym lepiej, ponieważ chciałbym zarezerwować miejsce w jakimś pubie. Wszelkie szczegóły co do czasu i miejsca spotkania będę przekazywał właśnie mailowo, dlatego wszystkich zainteresowanych, proszę o jak najszybszy kontakt.

Wszystkich serdecznie zapraszam!

środa, 7 maja 2008

Dodanie nowej klasy .cls do Lyx'a

Jeśli ktoś nie pamięta opisywałem jakiś czas temu program Lyx, służący do generowania dokumentów latexowych przy pomocy edytora bardzo zbliżonego do tego do czego zdążył nas przyzwyczaić Word czy OpenOffice Word Processor.
Dziś pokaże jak w prosty sposób dodać nową klasę latexową do programu. Wszystko w sumie zaczęło się od tego, że nie podobało mi się jak formatowana była moja praca magisterska. Zastosowałem standardową klasę book i moja praca, po wygenerowaniu pdf'a, wyglądała mniej więcej tak:


Niezadowolony wynikami poszperałem trochę sieć i znalazłem stronę, na której autor (Cezary Sobaniec) udostępnił na niej ciekawą klasę csthesis, która jak sama nazwa wskazuje przygotowana była do tworzenia informatycznych prac magisterskich.

A więc teraz pytanie jak taką klasę zainstalować? Coż przepis jest krótki:

  1. ściągnąć plik z klasą, w moim przypadku csthesis.cls i zapisać go w defaultowym katalogu latex'a (w moim przypadku był to katalog /usr/share/texmf/tex/latex/, jesli masz Ubuntu i instalowałeś Latexa przez apt-get to Twój katalog znajduje się właśnie pod tą ścieżką. Jeśli masz Windowsa, cóż radź sobie sam :). Nie wiem gdzie tam poinstalowany jest twój latex :) )
  2. ściągnąć plik z layoutem, w moim przypadku csthesis.layout i zapisać go w podkatalogu lyx'a - layouts. W moim przypadku ścieżka prowadziła do ~/lyx/layouts/
  3. w linii komend uruchomić komendę ‘texhash’
  4. przejść do lyxa, wybierać Tools > Reconfigure, po czym zrestartować program
I to tyle! Wystarczy aby cieszyć się nową klasą, która oczywiście do wyboru jest w Document->Settings->Document class. Po zmianie klasy w mojej pracy magisterskiej z book na csthesis, wygenerowany pdf wygląda teraz tak:



I nie wiem jak dla Was, ale dla mnie wygląda to o wiele lepiej.

Na końcu chciałem poruszyć jeszcze jedną sprawę. Jeśli posiadacie tylko plik z klasą (.cls), utworzenie podstawowego layout jest rzeczą szalenie prostą. Najłatwiej utworzyć nowy dokument tekstowy, wkleić poniższy tekst (zastępując xxx nazwą waszej klasy latexowej) i zapisać jako xxx.layout:

--- xxx.layout
#% Do not delete the line below; configure depends on this
# \DeclareLaTeXClass[xxx]{article (xxx)}

# Input general definitions
Input stdclass.inc

I to wszystko już na dziś. Mam nadzieję, że kogoś zainteresowałem już wcześniej programem lyx. Jeśli tak, dzisiejszy post powinien być przydatny. A teraz wracam już do mojej pracy magisterskiej, odliczanie wciąż trwa...

23 days left...

wtorek, 6 maja 2008

Java Killers #005

Witam w kolejnym cyklu z serii Java Killers, dziś sprawdzimy naszą wiedzę z zakresu prostego operatora ?. Wszyscy znamy ta konstrukcje prawda? Dla przypomnienia wygląda ona tak:

a = b ? c : d

, gdzie zależnie od wartości zmiennej b, zmienna a przyjmuje wartość c lub d. Znane? Znane! No to przejdźmy zatem do dzisiejszego przykładu:


1 package javakillers.part005;
2
3 /**
4 * @author pawel
5 */
6 public class Main
7 {
8 public static void main(String[] args)
9 {
10 Main m = new Main();
11 m.run();
12 }
13 public void run()
14 {
15 Object o = true ? new Integer(0) : new Double(0.0);
16 System.out.println("Klasa " + o.getClass().getName() + ", wartość " + o.toString());
17 }
18 }
19


Odpowiedzi standardowo do wyboru są cztery:

A) Błąd kompilacji
B) Klasa java.lang.Integer, wartość 0
C) Klasa java.lang.Double, wartość 0.0
D) Klasa java.lang.Object, wartość java.lang.Object@87816d //przy czym @87816d może mieć dowolną inną wartość

Zanim przeczytasz rozwiązanie, spróbuj pomyśleć nad odpowiedzią.



No to jak, gotowi? Otóż poprawna odpowiedź to C) Klasa java.lang.Double, wartość 0.0 . Tak tak moi mili Object o = true ? new Integer(0) : new Double(0.0) zwróci nam obiekty typu Double. Pytanie "ale czemu?" pozostaje wciąż otwarte, gdyż na logikę widzimy, że referencja powina wskazywać na obiekt typu Integer!

Żeby zrozumieć dokładnie co stało się za naszymi plecami w czasie wykonywania kodu, należy zajrzeć do specyfikacji języka Java, a konkretnie do rozdziału '15.25 Conditional Operator ?', gdzie czytamy, że:

" (...) if the second and third operands have types that are convertible to numeric types, then (...) binary numeric promotion is applied to the operand types, and the type of the conditional expression is the promoted type of the second and third operands. Note that binary numeric promotion performs unboxing conversion and value set conversion."

Czy widzicie już zło jakie czai się za tym zdaniem? Kompilator orientuje się, że zwrócony wynik będzie zawsze typem numerycznym (Integer lub Double). W czasie działania programu dokonuje unboxingu do wartości prymitywnych, następuje promocja typu (w tym wypadku z int'a na double) i ponowny boxing do obiektu już typu Double a nie Integer!
Żeby to lepiej zobrazować, zmieńmy w naszym kodzie new Integer(0) na new Integer(1)


13 public void run()
14 {
15 Object o = true ? new Integer(1) : new Double(0.0);

Po uruchomieniu dostaniemy odpowiedź Klasa java.lang.Double, wartość 1.0. Widzicie co się dzieje?

Co ciekawe jeśli uruchomicie poniższe przykłady pod Eclipsem, wyskoczy Wam błąd kompilacji! Eclipse używa swojego własnego kompilatora (innego niż javac dostarczony z JDK), który jak tylko zobaczy Object o = true ? new Integer(1) : new Double(0.0); krzyczy "Ja nic nie wiem, ja nic nie chce, ja nic nie umiem!!!" Na innych IDE, takich jak Netbeans czy IntelliJ IDEA, kompilacja przebiega poprawnie, a wyniki działania programów są takie jak opisane powyżej.

Teraz się przyznać, ile osób znało poprawną odpowiedź? :)



poniedziałek, 5 maja 2008

Ruby on Rails na Glassfish'u

W ostatnim poście wspomniałem o możliwości uruchamiania aplikacji napisanych w Ruby on Rails na javowych serwerach aplikacji (przy pomocy JRuby) oraz idei jaka przyświeca takiej migracji. Jeśli spojrzymy sobie na preview nadchodzącego Glassfis'a V3 dowiemy się, że jedną z nowości (poza takimi oczywistościami jak wsparcie dla JEE6 :) ), będzie możliwość uruchamiania aplikacji napisanych w dynamicznych językach takich jak Groovy czy Ruby.

Ale Glassfish V3 to przecież jeszcze daleka przyszłość i pozostaje pytanie czy obecnie można wrażać już aplikacje railsowe na obecne wydanie serwera. Odpowiedź brzmi tak, na szczęście jest już możliwość uruchamiania aplikacji RoR i wsparcie dla JRuby w Glassfish'u V2. Wprawdzie jest to feature, który nie przychodzi ze standardową instalacją, ale dołączenie go do działającej instancji jest tak na prawdę kwestią kilku kliknięć.

W katalogu glassfisha uruchamiamy narzędzie updatetool, służące do aktualizowania zainstalowanych wtyczek w serwerze aplikacji

./updatecenter/bin/updatetool

W uruchomionym programie zaznaczamy zakładkę 'JRuby on Glassfish', warto zwrócić uwagę czy jest w wersji 3.0.

Klikamy Install i gotowe! Teraz w katalogu glassfisha pojawił nam się nowy folder o nazwie jruby, którego zawartość widzimy poniżej


Mamy tutaj zarówno najnowszego JRuby (jruby-1.1.1) jak i katalog z przykładami (samples). Właśnie jednym z zamieszczonych przykładów posłużymy się demonstrując działanie RoR na Glassfish'u. Wchodzimy do katalogu HelloWorldRailsApp, który jest zwykłą aplikacją railsową typu hello-world - czyli jeden kontroler "say", z akcją hello i odpowiadającym mu widokiem. Następnie tworzymy z tej aplikacji war'a przy pomocy narzędzia dostarczonego wraz z JRuby w wersji 1.1.1 o nazwie "warable":

cd jruby/samples/HelloWorldRailsApp
jruby -S warble
Tak stworzonego war'a możemy w sposób standardowy zdeployować (wdrożyć) na naszym serwerze

i już po możemy cieszyć się naszą aplikacją railsową działającą w środowisku glassfisha

I to wszystko!

Jest jeszcze tylko jedno małe ale. Ponieważ warable pakuje całego rubiego i gemy do pojedyńczego war'a (wraz z naszą aplikacją), jest to rozwiązanie dobre tylko na szybkie protypowanie czy zapoznanie się z możliwościami JRuby na Glassfishu. Na dłuższą metę warto jednak przerzucić całą zawartość jruby do katalogu glassfish/lib a deployment robić poprzez uruchamianie komendy create-shared, która w katalogu aplikacji railsowej tworzy WEB-INF/web.xml. Tak przygotowaną aplikacje można już wdrażać na serwer.

JRuby on Glassfish 3.0 dostarcza nam środowisko JRuby w wersji 1.1.1 oraz Ruby on Rails w wersji 2.0.2. Wszystko szybko, łatwo i przyjemnie, dlatego polecam spróbować.

niedziela, 4 maja 2008

Po co nam JRuby?

Kończenie pracy magisterskiej ma jedną poważną wadę - monotonię. Przez ostatnie dwa miesiące nie robiłem nic innego jak próbowałem zakończyć prace nad programem, co wciąż czynie mimo, że termin zbliża się nieubłaganie ku końcowi. Ból jest taki, że nie robi się nic innego, tylko tą pracę magisterską i taka stagnacja i marazm mogą zabić.
Dlatego postanowiłem troszkę rozerwać mój umysł czymś innym i w wolnych chwilach zacząłem przyglądać się językowi Ruby oraz framework'owi Ruby on Rails. I to właśnie prostota i przejrzystość RoR ciekawiła mnie bardziej niż sam język Ruby. W niedługim czasie jednak posmakowałem jednak samego języka i zadowoleniem musze stwierdzić, że coś w Rubym jest jednak takiego nienazwanego, że odczuwa się pewną lekkość i przyjemność w klepaniu kodu.
Jakiś czas temu pojawiła się na horyzoncie implementacja Ruby'iego napisana całkowicie w Javie. JRuby, bo o nim właśnie mowa, to produkt open source, ale powstał pod skrzydłami Sun Microsystems. Ktoś może się zastanawiać czy na prawdę potrzebujemy warstwy pośredniej w postaci maszyny wirtualnej, aby pisać aplikacje w Ruby'm? Oczywiście odpowiedź brzmi nie, nie potrzebujemy. Wykonanie programu typu przeiteruj się po kolekcji, wykonaj na elementach jakieś obliczenia, zwróć wynik, wykona się zdecydowanie szybciej w standardowym ruby niż w jruby, gdyż do tego typu zadań został stworzony właśnie interpreter ruby'ego.

Problem zaczyna się, gdy chcemy ruszyć coś większego, używając choćby Ruby on Rails jako frameworka do pisania aplikacji webowych. Jeśli czytaliście kiedyś rozmowy o Ruby on Rails, powtarzającym się bez końca tematem jest skalowalność aplikacji napisanych w frameworku. Problem wydaje się rzeka, ale z drugiej strony trudno się dziwić. Jeśli ktoś chce napisać taki powiedzmy nowej generacji serwis społecznościowy, kwestia wydajności przy dużym obciążeniu serwisu wydaje się problemem istotnym. Wtedy właśnie z pomocą może nam przyjść JRuby. Ponieważ implementacja napisana jest w 100% w Javie, możemy nasze aplikacje railsowe odpalać na serwerach aplikacji, które dotąd przeznaczone były dla rozwiązań JEE5. A te z kolei znane są właśnie ze skalowalności, o która tak bardzo drży świat enterprise. Ogólne założenie jest takie jak na rysunku poniżej


Rozwiązanie logiczne i co więcej sprawdza się na tyle, że przewiduje się, że w niedalekiej przyszłości w świecie RoR, JRuby będzie wiódł prym, powoli wygryzając rozwiązania serwerowe pure-ruby takie Mongrel. Czy będzie tak w rzeczywistości trudno powiedzieć, myślę, że sprawa jest jeszcze świeża. Jeśli jednak dołożymy do całości takie smakołyki jak możliwość zamykania logiki biznesowej w javowe obiekty EJB, które wywoływać można (zdalnie i lokalnie) z poziomu kodu ruby'ego, tworzy nam się całkiem ciekawe rozwiązanie.

O JRuby'm można poczytać na blogu Wiktora Gworka, który chyba na poważnie zajął się ewangelizacją języka. Jeśli starczy mu zapału stworzy nam niedługo cykl, będący wstępem do JRubiego, jak narazie, można poczytać pierwszy odcinek.
Jeśli tematyka kogoś interesuje, a angielski mu nie straszny, warto zajrzeć również tu, tu i tu.

No i to tyle na dziś. Wracam do pracy magisterskiej, zostało tylko 25 dni...

update: jak w prosty sposób zainstalować wsparcie dla JRuby na Glassfishu opisałem tutaj

Prawie jak na Mazurach...

Mamy już wśród znajomych taką "świecką tradycję", że w każdy długi weekend majowy wyjeżdżamy odpocząć na Mazurach. Nie zależnie od egzaminów, projektów i innych zobowiązań rodzinno-zawodowych.

W tym roku się jakoś wszystko popsuło. Zaczęło się od tego, że przerażony lekko perspektywą nieukończonej pracy magisterskiej, musiałem odpuścić wyjazd (dopuszczałem tylko kilkudniowy wypad, na zasadzie wpaść, naniuchać się powietrza i wypaść). Potem drugi skipper zwichnął nogę, wcześniej ktoś tam marudził, że rok temu padał w maju śnieg (bo w sumie padał ;) ) i wszystko jakoś rozeszło się po kościach. Wyjazd się nie odbył.

Od kilku dni ze smutkiem patrze na piękną majową pogodę i żałuje, że znów nie ma mnie tam gdzieś pomiędzy Rynem a Starymi Sadami... I dziś miła niespodzianka, bo przeglądając statystyki bloga zobaczyłem, że odwiedziła mnie osoba z Giżycka! Heh, ja nie odwiedziłem Mazur, za to Mazury odwiedziły mnie :) Jak to mówią angole "for what it is worth" :)
Pozdrawiam serdecznie tą osobę kimkolwiek była, zwłaszcza, że przeklikała kilka stron mojego bloga, czyli też się u mnie podobało ;). Gratuluje wszystkim którzy mieli jaja i pomimo wszelkich zobowiązań pojechali odpoczywać w wolny weekend. Ja dałem dupy, obiecuję poprawę :).

Ps. Zdjęcie na górze z maja 2006 roku, gdzieś pomiędzy jedną szantą a browarem

Jeszcze trochę o Netbeans RoadShow Polska

Poniżej taki krótki pokaz zdjęć z tegorocznej konferencji z edycji wrocławskiej (w troszkę ciekawszej oprawie):



Może wykorzystamy to za rok jako promocje Netbeans RoadShow Polska 2009? A właśnie, czy jest tu ktoś kto może by chciał włączyć się do prac nad kolejną edycją konferencji za rok? Może warto rozszerzyć event o inne miasta? Jeśli taką osobą jesteś właśnie ty (chcesz pomóc w organizacji, promocji imprezy lub może chcesz być jednym z prelegentów) daj mi koniecznie znać. Im więcej osób do pomocy tym lepiej dla ogółu :)

sobota, 3 maja 2008

Java Killers #004

Witam w kolejnym odcinku Java Killers. Odcinek ten pojawić się miał troszkę później (jest na tyle ciekawy, że chciałem z nim poczekać do połowy maja, aż wszyscy bez wyjątku wytrzeźwieją po weekendzie majowym), ale ponieważ pojawił się na jdn.pl jego preview w komentarzach do jednego z poprzednich JK, postanowiłem umieścić go teraz, aby pozostał jeszcze jakiś element zaskoczenia. A więc, aby jak zwykle nie przedłużać wstępów, zabierzmy się do dzieła.

Dziś porównamy sobie obiekty typu Integer, ot takie najzwyklejsze ==. Przejdźmy więc do kodu:


1 package javakillers.part004;
2
3 /**
4 *
5 * @author pawel
6 */
7 public class Main
8 {
9 public static void main(String[] args)
10 {
11 Main m = new Main();
12 m.run();
13 }
14 public void run()
15 {
16 check(2, 2);
17 check(2000, 2000);
18 }
19
20 void check(Integer a,Integer b)
21 {
22 System.out.print((a==b) + " ");
23 }
24 }
25
26



Proste prawda? No więc teraz pytanie, jaka będzie odpowiedź? Standardowo 4 możliwe odpowiedzi do wyboru:

A) true true
B) false false
C) false true
D) true false




Okazuje się, że prawidłowa odpowiedź to D) true false. Ale, że co? Jak to możliwe?? Ja rozumiem A lub B ale, że D? Żeby zrozumieć czemu odpowiedź jest taka a nie inna należy zajrzeć do specyfikacji, autoboxing opisany jest w JSR-201, gdzie w rozdziale piątym czytamy:

"If the value p being boxed is true, false, a byte, a char in the range \u0000 to \u007f, or an int or short number between -128 and 127, then let r1 and r2 be the results of any two boxing conversions of p. It is always the case that r1 == r2."

Wszystko rozchodzi się o zarządzanie pamięcią. Jeśli jakąś wartość prymitywną możemy zmieścić w jednym bajcie (czyli wszystkie boolean, byte oraz char'y od \u0000 do \u007f oraz short i int w przedziale -128 do 127), wtedy boxowane obiekty znajdują się w jednym miejscu pamięci, a więc sprawdzanie ich referencji da nam zawsze true.

Miażdzące prawda?

Pytanie teraz, jak się przed tym chronić? Zasada podstawowa nakazuje przede wszystkim sprawdzanie obiektów poprzez sprawdzanie ich zawartości (używając metody equals), a nie referencji. Takie podejście uratuje Wam nie raz życie i sprawdza się nie tylko przy zabawach z obiektami typu wrapper.
Druga nauka to taka, że jak okazuje się żadna książka nigdy nie zastąpi nam do końca specyfikacji czy dokumentacji. Polecam Unixową mantrę RTFM, chociaż z drugiej strony, kto ma na to czas ;)

czwartek, 1 maja 2008

Nabijcie nas na widły!

Szukam pracy, znów... to znaczy w sumie jeszcze nie szukam, kończę pracę magisterską wciąż i tylko na niej chce się obecnie skupić (po to przecież rzuciłem ostatnią robotę), ale zaczynam rozglądać się ponownie po rynku pracy IT, patrząc jak się zmienił, próbuję ocenić jego stan obecny. Byłem na dniach pracy IT na Politechnice Wrocławskiej, odwiedziłem kilka portali pracy oraz stron społecznościowych (jdn.pl, rubyonrails.pl) i szperałem trochę po usnecie.
No i jak wygląda sytuacja na rynku? Wciąż jest dobrze, to znaczy hmm dobrze dla nas pracowników, pracodawcy też tak źle nie mają, ale głód na rynku jest wyraźny i pracę można znaleźć praktycznie od razu. Pamiętam jak kilka miesięcy temu wysłałem w niedziele wieczorem kilkanaście CV do różnych wrocławskich firm IT, a już w poniedziałek rano dzwonił do mnie człowiek z HR'u i rozmowę telefoniczną zaczął od zdania "Czy Pana oferta jest jeszcze aktualna?". Wtedy wydawało mi się to śmieszne (w sensie byłem w szoku!), zwłaszcza, że gdy dwa lata wcześniej szukałem pracy w UK w czasie wakacji, dzwoniąc do potencjalnych pracodawców na telefon z ogłoszenia, zawsze zaczynałem od zdania "Is this job offer still available?".
Dziś (stan 30 kwietnia 2008) sytuacja na rynku jest dla mnie normalna i już tak bardzo nie dziwi. Z drugiej strony zastanawiam się czy jest to rzeczywiście, aż taka idylla, jak niektórym się wydaje. To, że obecnie pracodawcy biorą do pracy "wszystko co dotknęło kiedyś klawiatury" (cytuje tutaj pozostającego anonimowym headhuntera z warszawskiej firmy IT) nie musi nam znów tworzyć aż tak różowej sytuacji. Bo biorą wszystkich, biorą ludzi kończących profile matematyczne czy fizyczne i przekwalifikują ich na programistów. A jak biorą wszystkich, to czy obchodzi ich w ogóle co umiem, co sobą reprezentuje? Po co było się tyle kształcić (poza oczywiście własną ambicją) skoro nijak mogę to teraz "sprzedać"?
Oczywiście mocno tu przesadzam, bo po pierwsze teoria polskich menedżerów, że dowolnego programistę można zastąpić skończoną liczbą studentów, powoli odchodzi do lamusa. Po drugie to co sobą reprezentuje jednoznacznie przekłada się na moje korzyści materialne. Pracodawca szybko wychwytuje w gronie nowo zatrudnionych, tą grupkę osób, która jest coś warta i wtedy pojawiają się podwyżki, premie i tak dalej. Ale czy na pewno jest to coś czego oczekujemy? Idąc do określonej pracy, nie wiem czy tak naprawdę pracodawca mnie chciał, bo akurat potrzebował takiego programisty jak ja czy też może po prostu brał "wszystko co dotknęło kiedyś klawiatury". Tworzy się sytuacja, że tak naprawdę ja nic nie wiem (trudno mi ocenić jak będzie wyglądała moja praca w tej firmie), ani pracodawca nie wie nic (z kim on ma w ogóle do czynienia).

I w ten magiczny sposób dochodzimy do sedna sprawy. Wielkiej, ogromnej niewiadomej, jak panuje na naszym rynku. Spójrzmy tylko na oferty pracy. Niby taki głód, a każda jest kopią poprzedniej. To się po prostu robi zabawne czytając po raz kolejny jedną i tą samą ofertę. Zabawne było dla mnie do tego stopnia, że prototypowałem podręczną aplikację cenną dla każdego pracodawcy na rynku IT. Typowy use case korzystania z takiej aplikacji wyglądałby następująco:


Wypełniamy kilka podstawowych informacji o naszej firmie "Lambada Uhahah Software". Wiadomo jesteśmy wiodącą firmą na rynku (żaden tam startup), liderem w swojej branży, a że nie prowadzimy ousourcingu szukamy pracowników do pracy w oddziale naszej firmy.

Wymagania, cóż, oczywiście zaznaczamy każdą technologię używaną w naszym projekcie. Nie ważne, że mamy designerów, administratorów i programistów, nowy kandydat powinien znać wszystkiego po trochu. Potem jeszcze zaznaczyć kilka standardowych checkboxów (nie zapomnieć o studentach!!) i jesteśmy prawie gotowi.

Wynagordzenie oferujemy oczywiście godziwe, dzięki Bogu nie musimy podawać jakie. Poza tym zespół jest młody (ludzi po trzydziestce pakujemy w worki foliowe), ambitny, inteligentny i cały czas rozwija się zawodowo.
Na końcu klikamy przycisk generuj i po chwili naszym oczom pojawia się piękna oferta pracy, którą możemy spotkać praktycznie wszędzie!

Ktoś może zadać pytanie "No ok, ale czemu to jest aż TAKIE złe?". Odpowiedź jest prosta, ponownie jedna wielka niewiadoma. Czytam oferty pracy i w sumie każda jest taka sama, mógłbym dowolnie podmienić nazwy pracodawcy w ofertach i nie wiem czy ktokolwiek (włącznie działem kadr) by się nie zorientował. Więc jak ja mam teraz cokolwiek wybierać? Skoro jest taki głód na rynku, czemu te oferty nie wykrztuszą z siebie coś więcej? Monotonia jest tak wszechobecna, że napisanie w nagłówku "AAAAAAAAAAAAAAAAAAA maaaatkkooo, developerów szukamy!" już by jakoś tą ofertę wyróżniło. Jak ja, jako przyszły pracownik mam zobaczyć, co fajnego jest w tej mojej potencjalnej przyszłej pracy, co ją wyróżnia wśród innych, skoro oferta pracy mówi mi wyraźnie, że nie wyróżnia jej nic?
A przecież taka sytuacja jest nie korzystna dla obu stron!
Ja poświęcę swój czas przychodząc na rozmowę, dowiem się w końcu szczegółów, których na ofercie pracy nie było i okaże się, że to jednak praca nie dla mnie, albo pracodawca dojdzie do wniosku, że ja jestem zbyt słaby, żeby pracować w jego firmie. Obaj straciliśmy niepotrzebnie czas, pracodawca dodatkowo pieniądze, bo przecież proces rekrutacji kosztuje. A przecież można naprawdę inaczej. Ostatnio przeglądając portal workingwithrails.com, natknąłem się na taką ofertę pracy. Na sam początek czytam:

Tired of people questioning Rails scalability? We're one of the largest Rails clusters in the world and with your help, in the next few months, we intend to make it the world's largest.

A FEW STATS:
300M page views/month
2500 MySQL QPS


Na dobry początek wystarcza, żeby mnie zaciekawić. Po prostu przykuwa mój wzrok. Potem jeszcze zwykłe dane dotyczące oferty, ale napisane w sposób ciekawy, który czasami wręcz bawi

We are looking to hire at least 4 rockstar Ruby/Rails engineers in the very near future, like yesterday.

I na prawdę, aż chce się człowiekowi tam pracować!

Kolejną kwestią jest sprawa oferowanego wynagrodzenia. Temat po prostu tabu. Miałem okazję czytać na forum rubyonrails.pl bardzo ciekawą dyskusję na ten temat, która pozwoliła mi uświadomić sobie kilka spraw i pewną opinie w tej kwestii wyrobić.
O ile na zachodzie podawanie widełek płacowych przez pracodawców (choćby bardzo szerokich) jest normą, o tyle u nas w Polsce jest to fikcja - zjawisko na tyle nie spotykane, że jak już się jakaś tego typu oferta zjawi, to Discovery Channel wysyła całą ekipę, żeby filmować ten ewenement. Jeśli spojrzymy na to ze strony pracodawcy, spróbujemy wczuć się w jego skórę, wydawać by się mogło z pozoru, że rzeczywiście widełki mogą przysporzyć sporo kłopotów:

* Widełki to fikcja, istnieje w nich tylko wideł, czyli wartość graniczna. Nadaniel pisze:

Zalozmy, ze firma wycenia taka osobe na 4-7 tys. Wyobraz sobie teraz, ze przychodzi kandydat do takiej firmy, po przeczytaniu ogloszenia (z widelkami) i firma pyta go - ile chce zarabiac? Wszyscy wiemy co powie - 7 tys. Jezeli firma wycenia go na 5 tys. to z pracownikiem sie nie dogada - wszyscy na tym straca. Z drugiej strony - jezeli firma powie kandydatowi, ze wycenia go na 5 tys, a on wie, ze maksymalna stawka wynosila 7 tys. - bedzie sie targowal albo poczuje sie niedowartosciowany.
* Pracownik musi mieć wymierną wartość, co przy startupach może być problemem. Z bardzo obszernego wpisu Bartosza czytamy:
Firmy w fazie start-up mają ograniczony dostęp do kapitału i nie mogą pozwalać sobie na opłacanie kadr, które na siebie nie zarabiają. Taki pracownik musi zarobić na siebie i dołożyć swoją cegiełkę do utrzymania firmy. Ich rentowność może być różna - jest zmienna w czasie. Często płaci im się minimalną kwotę za jaką będą skłonni pracować, zakładając, że zostanie to zrekompensowane, kiedy firma odniesie rynkowy sukces. Że docelowo wynagrodzenia pójdą w górę.
* Poufność informacji, że niby wszystko tajne. Cytując znów Bartosza:
Poufność informacji, tak w wymiarze wewnętrznym (bo może się wydać, że nowemu pracownikowi proponujemy na starcie więcej niż ma stary członek załogi), jak i zewnętrznym (konkurencyjność płacowa, wizerunek).
I w sumie myślę właśnie, że tu jest pies pogrzebany. Ale nie w takim aspekcie do końca jak to przedstawił Bartek. Pamiętam jak pół roku temu kolega poszedł do pracy i równocześnie niemalże w pracy tej zaczął pracować inny chłopak. O ile mój kolega wynegocjował sobie normalne warunki (znając sytuację na rynku, wiedział o jaką pensję może walczyć) o tyle ten drugi chłopak rozgarnięty w temacie był mniej i przyszedł do firmy z prośbą o przyjęcie go na praktyki. Ostatecznie obaj (zarówno mój kumpel jak i ten chłopak) pracowali nad jednym projektem, na zbliżonych wymaganiach, przy czym mój kolega dostawał za to wynagrodzenie, a tamten chłopak pracował na darmowych praktykach przez trzy miesiące. Sprawa oczywiście wyszła przy piwie i była niezła chryja. Na wspomnianej dyskusji na forum, można poczytać o większej ilości tego typu przypadków.
Pytanie pozostaje otwarte, czy jest naprawdę aż tak źle? Nie dostajemy w ofertach pracy widełek z powodu zwykłej pazerności pracodawców? Zaoferuję 2k, chcieliście płacić 5k, ale nic nie powiecie? Mam nadzieję, że wspomniana przeze mnie sytuacja jest tylko ewenementem, ale z drugiej strony, czasami się zastanawiam czytając coś takiego:

Ostatnio rozmawiałem z kolegą, który pracował w pewnej krakowskiej firmie. W momencie gdy dostał ofertę z innej firmy, ta poprzednia była w stanie mu zaoferować 50% (sic!) podwyżkę, chociaż do tej pory nie chcieli mu dać jakiejkolwiek.
Ale załóżmy, że pracodawca nie jest z gruntu zły :) Nie uwzględnia widełek płacowych, bo uważa, że ogranicza mu to pole manewru, negocjacji płacowych w czasie rekrutacji. Wiąże ręce i generalnie jest bleee. Pytanie pozostaje tylko otwarte, czy rzeczywiście tak jest? Przecież,gdyby widełki były takie złe, już dawno nie widzielibyśmy ich w ofertach pracy z UK.

Trzeba zrozumieć pracodawce, nie chce mieć związanych rąk, nie chce przepłacić za programistę. Ale z drugiej strony, nas potencjalnych pracowników, zwykle i tak interesują górne granice widełek, dlatego te dolne można ustawić dowolnie nisko. Wtedy przy negocjacji płac, pracodawca ma dużą swobodę negocjacyjną, płaca jest skorelowana z umiejętnościami potencjalnego pracownika. Idąc na rozmowę o pracę, gdzie widełki podane były 3k - 7k, a pracodawca oferuje mi 3.5k sprawa jest jasna. Po pierwsze wiem, że ok, może jeszcze nie jestem tak dobry, aby dostać te 7k, ale wraz z doświadczeniem w tej danej firmie taka płaca jest możliwa, dwa sam wiedziałem jakie były widełki, idąc na rozmowę, wiedziałem, że mogłem się też i 3k spodziewać.
I tym sposobem wracamy do początku dyskusji. Nikt w takim układzie nie traci czasu i pieniędzy. Ja idąc na rozmowę, wiem konkretnie ile mogę dostać. Nie będzie sytuacji, że spędzam na rozmowie kwalifikacyjnej 2 godziny, żeby na końcu z racji niezadowalających warunków płacowych, zrezygnować. Pracodawca z drugiej strony wie, że osoby które pojawią się na rekrutacji, wiedzą czego się mogą spodziewać. Nie będzie niespodzianek, zaskoczenia. W czasie rozmowy można skupić się na weryfikacji wiedzy potencjalnego pracownika, sprawy finansowe są (przynajmniej w małym stopniu) ustalone. To się po prostu wszystkim opłaca!

Podsumowując chciałem zaznaczyć, że ja się nie chce wypowiadać autorytarnie. Sam firmy (przynajmniej jeszcze ;) ) nie prowadzę, moje doświadczenie na rynku IT jest wciąż małe. Z jakiegoś jednak względu te oferty pracy na zachodzie mogą wyglądać ciekawiej, coś powoduje, że tamtejsi pracodawcy określają widełki płacowe. Coś jest na rzeczy!
Powyższe moje wywody, to tylko pewna próba ogarnięcia tego wszystkiego. Może za rok będę moje przemyślenia weryfikować, bogatszy o nową wiedzę. Wiem jedno, od czasu dyskusji na rubyonrails.pl, pracodawcy RoR coraz częściej zaczynają podawać widełki cenowe. Rails'y wyznaczają można powiedzieć pewne nowe trendy, ścieżki w świecie IT (choć w Polsce wciąż topornie ;) ). Może u nas lokalnie przyczynią się też do zmiany podejścia ze strony pracodawców? Czas pokaże.