wtorek, 29 kwietnia 2008

Java Killers #003

Dzisiejsze Java Killers krótkie i proste z pozoru. Nie będziemy deklarować klas, tworzyć złożonych pętli, definiować rzadko używanych obiektów czy używać niespotykanych metod. Dziś po prostu dodamy do siebie dwie liczby: 221 i 7. Tak po prostu, zwykła suma i nic więcej. Czy może być coś prostszego? A więc jak zwykle, żeby nie przedłużać przejdźmy od razu do kodu:


1 package javakillers.part003;
2
3 /**
4 * @author pawel
5 */
6 public class Main {
7
8 public static void main(String[] args)
9 {
10 int val = (int) (22l + 7.0);
11 System.out.println("Value: " + val);
12 }
13 }
14
15

Proste prawda? No bo chyba prościej się nie da. No więc teraz najważniejsza sprawa. Co wypisze nam na ekran ten program? Odpowiedzi do wyboru macie cztery:

A) Value: 29
B) Value: 228
C) Program się nie skompiluje
D) Program rzuci wyjątek w czasie uruchomienia

Odpowiedź to oczywiście... A) Value: 29 No co, przecież to prosta matematyka 221 + 7 = 29! A tak poważnie problem tkwi w formatowaniu. Jeśli dobrze się przyjrzymy to zobaczymy, że nasza zmienna val obliczana jest na podstawie dwóch wartości: longa 22L oraz doubla 7.0. Tak właśnie, to było 22 a nie 221. Istota problemu jest taka, że wiele czcionek w bardzo podobny sposób renderuje nam literke l oraz cyfre 1. Kilka lat temu sławna była spora afera, gdzie ktoś zarejestrował domenę pay-pa1.com zamiast pay-pal.com i rozkradł ileś tam kont użytkowników PayPal'a. Ponieważ w javie definiując longa możemy explicite pokazać, że ten nasz long to rzeczywiście long (a nie żaden tam int czy inny) poprzez dodanie literki L na końcu, napotykamy jako programiści na ten sam problem, który swojego czasu wstrząsnął społecznością PayPal'a.

Prawda jest taka, że wszystko byłoby pięknie gdybym mógł pisać tylko tak:


long someVal = 22L;


Problem pojawia się, gdyż mogę tą zmienną zdefiniować również tak:


long someVal = 22l;


Duże czy małe "eL", dla Javy nie ma różnicy. Niby taka niewinna rzecz, ale problemów może przysporzyć... oczywiście do czasu uruchomienia debugera, kiedy wszystko staje się jasne :).

Jak się przed tym uchronić? Po prostu pisać L dużymi literami lub w IDE (czy notatniku) zmienić sobie czcionkę na jakąś porządną, na przykład taki Monospaced.


Dzisiejsze Java Killers nie było może jakimś specjalnym mykiem w języku, który zadziwił nas swoją funkcjonalnością, czy też specjalną, niszczącą funkcją zaszytą gdzieś w API. Dziś było inaczej, gdyż chodziło mi bardziej o pokazanie, że dokuczliwe błędy, mogą nas zaskoczyć w najmniej oczekiwanych sytuacjach, w miejscach kodu najbardziej dla nas wydałoby się oczywistych.

Pozostaje już tylko na zakończenie odpowiedzieć na dwa pytania: czy znaliście odpowiedź oraz czy cykl JK się Wam podoba? :)

poniedziałek, 28 kwietnia 2008

O tym jak Rubin walczy z Gozzilą...

Kiedy rzucę w ether hasło "narzędzie webowe będące zarazem doskonałym bugtrackerem, issue-trackerem oraz systemem zarządzania projektem", jaka będzie pierwsza myśl, która przyjdzie Wam do głowy? Trudno mi tu zgadywać, ale czuje (i korzystam tu troszkę z mojego i moich kolegów doświadczenia), że wszyscy (a przynajmniej większość) zgodnym chórem krzykną JIRA! Ale wiecie co, ja Jiry nie lubię!

Większość z Was krzyknie, bluźnierca! I nie ma się co specjalnie tu dziwić, gdyż Jira jest narzędziem doskonale sprawdzającym się jako issue oraz bug tracker. Sam przez kilka miesięcy klepania kodu w pracy miałem z nią do czynienia, a używałem jej również przy tworzeniu pracy magisterskiej. Od dłuższego czasu uważałem, że nie ma sobie równych.
Jeśli nigdy nie używaliście Jiry, polecam obejrzeć krótki filmik przedstawiający niektóre z feature'ów dostarczonych razem z narzędziem. Video jest mocno marketingowe (w końcu ściągnięte jest bezpośrednio ze strony głównej producenta) nie mniej jednak w tym kilku minutowym filmiku, można mniej więcej zobaczyć, co Jira może nam zaproponować.

I uwierzcie mi posiadanie takiego narzędzia się opłaca. Zapewne większość z Was nie muszę do tego zbytnio przekonywać, ale jeśli ktoś nie próbował, nie bawił się, nie chciał, to zachęcam. Planowanie, raportowanie, śpiewanie, szacowanie, badanie, zgłaszanie, polepszanie.. wszystko w jednym miejscu. Narzędzie miód, ideał.

Ale zaraz zaraz, czy ja na początku nie wspomniałem przypadkiem, że Jiry nie lubię? No tak, z tym, że musze być tu w tym temacie troszkę, dokładniejszy. Ja Jirę lubie, nawet bardzo, poprstu nie pałam do niej miłością.
No ale czemu (ktoś może rzec), skoro Jira jest taka cudowna, piękna, pyszna i śliczna? Powód jest prosty, nie będę owijał w bawełnę i po prostu od razu wkleję screenshota z broszurki reklamującej Jirę:


Tak tak moi mili, za Jirę trzeba płacić (i to sporo) i właśnie dlatego jej nie lubię. No bo sorry, ale zdążyłem się już przyzwyczaić, że system mam za darmo, środowisko developerskie mam darmowe, języki programowania w których piszę też są for free. To samo tyczy się serwera, na którym wdrażam moje aplikacje, konta mailowego (o pojemności kilku gigabajtów), bloga i wielu inny tego typu cudów. I nagle zong! Za issue trackera mam płacić? I to jeszcze 1200 dolarów minimum? Wolne żarty...


Jakiś czas temu zrobiłem bardzo krótki research, sprawdzający czy jest coś na rynku, co by mogło z Jirą konkurować. Najczęściej natrafiałem na artykuły mówiące czemu Jira jest lepsza od Bugzilly, proste programy typu project managment oraz narzędzia dedykowane danej metodologii wytwarzania oprogramowania (taki choćby XPlanner). Konkurenta Jiry nie znalazłem. Teraz już wiem, że nie szukałem zbyt dokładnie, ale o tym za chwilkę...

Od kilku tygodni zgłębiam tajniki języka Ruby oraz frameworka Ruby on Rails. Przyznać muszę, że to właśnie RoR był moim obiektem zainteresowań z początku, do samego Ruby miałem mieszane uczucia. Teraz moje podejście się trochę zmieniło i sam język nawet do mnie przemawia. Nauka z tego taka, że do niczego nie można podchodzić z uprzedzeniami.
Wracając jednak do głównego wątku, szperając trochę po polskich forach railsowych, natknąłem się na ofertę pracy, zupełnie inną od tych standardowych do których zdążyliśmy się już przezwyczaić (młody zespół, wysokie zarobki, musisz znać Jave - czytaj bierzemy wszystko co dotkneło chociaż raz w życiu klawiatury). Jednym z elementów oferty pracy było wylistowanie projektów opensourcowych, w których pracownicy firmy biorą udział. Wyklikałem wszystkie linki (z czystej ciekawości) i w ten oto sposób poznałem Redmine.

Redmine to (cytując ze strony głównej) "flexible project management web application". Czyli innymi słowy - Jira2! Poważnie, nie oszukuję. Ma funkcjonalność Jiry ale i nie tylko. Główna strona projektu Redmine jest uruchomioną instancją redmina, więc de facto wchodząc na stronę www.redmine.org od początku widzimy ją w działaniu. Mamy znany nam z Jiry issue i bug tracker, miejsce na wiki, forum dla developerów. Osobne działy typu Roadmap (budowane na podstawie issuetrackera), Repository (pełny wgląd w repozytorium), dział newsów, autoamtycznie generowany dział Activity (można szybko zobaczyć jak wyglądają postępy prac nad danym projektem) i wiele wiele innych. Polecam po prostu wejść na stronę http://www.redmine.org i zobaczyć aplikację w działaniu.
Dołóżmy do tego bardzo ładny, przejrzysty layout, możliwość rozwoju o pluginy, wspracie dla LDAP'a, Gantt chart oraz kalendarz (menadżerowie to kochają :) ) oraz kilka innych feature'ów i na naszych oczach powstaje już naprawdę niczego sobie narzędzie, które spokojnie może zacząć konkurować z Jirą.
Redmine napisany jest w Ruby on Rails, ruszy z każdą bazą danych (tzn z większością tych znanych) na każdym systemie operacyjnym (tam gdzie uruchomimy railsy). Jest opensourcowy, wydany na licencji GNU General Public License (GPL). Kilku z programistów , tworzących redmine'a to nasi rodacy (oczywiście z Krakowa, bo to kolebka RoR'a w Polsce).

Gorąco zachęcam do korzystania z Redmina. Wiem, że firmy się raczej nie przerzucą, bo za licencję już zapłacili, wydali gro kasy na szkolenia, podpięcie Jiry pod inne systemy (na przykład Hudsona), więc im się to po prostu nie opłaca. Ale jeśli pracujesz w takiej firmie i chciałbyś mieć coś ala Jira, lecz za darmo, wtedy bez dwóch zdań polecam Redmina!

I jeszcze na koniec kilka zdań, co by sprostować:

* Można uzyskać darmową licencję Jirowską dla projektów typu opensource. Ale muszą być to naprawdę projekty tego typu. Napisanie jestem studentem, chciałbym licencje dla własnego użytku (non-profit) nie zadziała - próbowałem :)
* Nazwa Jira wywodzi się tam jakoś bezpośrednio od Gozzila (gdzieś kiedyś na necie przeczytałem)
* Nie wiem od czego wywodzi się nazwa Redmine, może ktoś z Was wie?
* Railsy są fajne :)

piątek, 25 kwietnia 2008

Hitman

Skontaktowałem się z Duńskim producentem gier Io Interactive i uzyskałem już oficjalną zgodę na wykorzystywanie rysunków z gry "Hitman" do cyklu Java Killers.
Wszystko jest już legalne ;)

czwartek, 24 kwietnia 2008

Java Killers #002



Ponieważ Java Killers spotkał się z bardzo pozytywnym przyjęciem, zapraszam bardzo serdecznie na kolejną odsłonę cyklu. Dziś pobawimy się klasą z pakietu java.net służącą do przechowywania url'i. Tak tak, właśnie mowa o klasie URL.

Ok a więc bez dłuższego przedłużania, spójrzmy na poniższy kod:


6 package javakillers.part002;
7
8 import java.net.MalformedURLException;
9 import java.net.URL;
10 import java.util.HashSet;
11 import java.util.Set;
12
13 /**
14 *
15 * @author pawel
16 */
17 public class Main
18 {
19 public static void main(String[] args) throws MalformedURLException
20 {
21 String[] urlNames = {
22 "http://szulce.pl",
23 "http://paulszulc.blogspot.com",
24 "http://pawel.kn.pl",
25 "http://paulszulc.blogspot.com"
26 };
27
28 Set<URL> set = new HashSet<URL>();
29
30 for (String urlName : urlNames)
31 {
32 set.add(new URL(urlName));
33 }
34
35 System.out.println("Set size: " + set.size());
36 }
37 }
38
39


Ok, więc co tu mamy? Tworzona jest tablica stringów z nazwami url'i, przy czym zauważamy, że jeden z napisów ("http://paulszulc.blogspot.com") pojawia się podwójnie. Następnie w pętli for do HashSet'a wkładane są po kolei obiekty klasy URL tworzone na podstawie wspomnianych stringów z tabeli.
Sprawa banalna, prawda? Otwarte pytanie pozostaje tylko jedno, co wypisze nam ten program po uruchomieniu?

Odpowiedzi do wyboru macie cztery:

A) Set size: 4
B) Set size: 3
C) Set size: 2
D) Set size: 1


Gotowi, a więc uwaga, odpowiedź brzmi... zależy. Wynik końcowy działania programu zależy głównie od tego czy jesteście podłączeni do Internetu czy też nie.
Jeśli macie aktywne połączenie z siecią odpowiedź brzmi C) Set size: 2, jeśli takiego połączenia nie ma, poprawna odpowiedź brzmi B) Set size: 3.

Ok, no więc jak to możliwe? Sprawa jest dość prosta, klasa URL ma totalnie skopane metody equals i hashCode. Jak przeczytamy w dokumentacji:

"Two URL objects are equal if they have the same protocol, reference equivalent hosts, have the same port number on the host, and the same file and fragment of the file."
Jak dotąd logiczne prawda, wydaje się wszystko poprawne (względnie). Dwa obiekty URL są takie same jeśli zgadzają się pod względem protokołu (http, ftp, itp.), portu (hm.. no niech będzie) oraz wskazują na tego samego hosta. Wszystko gra? No niby tak, ale czytamy dalej:

"Two hosts are considered equivalent if both host names can be resolved into the same IP addresses; else if either host name can't be resolved, the host names must be equal without regard to case; or both host names equal to null."

I tu jest właśnie pies pogrzebany. Dwa hosty uważane są za równe, jeśli wskazują na ten sam adres IP. Jeśli nie można potwierdzić adresu IP przynajmniej jednego z host'ów, wtedy brane pod uwagę są nazwy hostów (czyli robiony jest zwykły equals na stringach).

Rozwiązanie niszczące nieprawdaż? Ale klasa URL jest z nami od JDK1.0, to były początki powstawania języka. Wybaczmy jej twórcom, każdy może mieć gorszy dzień ;)

Pozostaje więc pytanie, czemu przy połączeniu do sieci poprawna odpowiedź była C) Set size: 2. Otóż okazuje się, że "http://szulce.pl" oraz "http://pawel.kn.pl" wskazują na ten sam adres IP! Teraz sprawa powinna wydawać się już prosta. Znając ogólne działanie Setów, bogatsi o wiedzę przedstawioną powyżej, powinniście rozumieć już, czemu odpowiedzi są takie a nie inne.

Zatem na koniec pozostaje pytanie, jak przed czymś takim się ustrzec. W końcu przydatność tej klasy jest dość spora, a powyższy mankament może powodować bugi w programie, które trudno wykryć. Najlepsze rozwiązanie to używać klasy URI, którą możemy używać na tej samej zasadzie co klasę URL. Jedną z różnic jest właśnie poprawne zaimplementowanie metod equals i hashCode i niespodzianki takie jak ta pokazana dziś nie wystąpią.

No to jak znaliście poprawną odpowiedź? Poprawne były w sumie dwie, więc strzelając mieliście sporą szansę trafić :)

środa, 23 kwietnia 2008

Lyx czyli LaTeX inaczej



Jest taki projekt, który przyszło mi zacząć kodować jakoś rok temu. Projekt nawet interesujący, nie mały, choć też przesadnie nie duży (obecnie już ponad dwanaście tysięcy linii kodu i wciąż rośnie), ale wyróżnia go coś od innych projektów informatycznych, z którymi zetknąłem się wcześniej.

Mianowicie:

  • gdy go zacząłem był dla mnie inspiracją, powodował ogólne poczucie samospełnienia zawodowego
  • teraz bywają dni, że ledwo mogę na niego patrzeć
  • mimo, że siedzę nad nim prawie codziennie, nikt mi za niego nie zapłaci
  • dokumentacja jest nietypowa i balansuje na pograniczu pseudonaukowych wywodów a laniu wody
Jeśli jeszcze się nie domyśliłeś z czym przyszło mi się zmierzyć, pozwól, że oświecę (ku przestrodze) - piszę obecnie moją pracę magisterską.
Samo kodowanie nie jest aż tak straszne, gdyż program sam w sobie jest ciekawy i klepanie kodu nie dostarcza zbyt wielkich cierpień - jest nawet "przyjemne", jeśli można to tak określić. Problem pojawia się z nieszczęsnym dokumentem, który stanowić ma o 6 literkach przed moim nazwiskiem (mgr inż.). Nie będę tutaj opisywał ile wewnętrznej siły musiałem zebrać w sobie, żeby się zabrać do pisania (może innym razem), opowiem za to o ciekawym narzędziu, które pomaga mi przetrwać w tym bolesnym dla mnie okresie, jakim jest pisanie pracy magisterskiej. Mowa tu o programie Lyx.

Jeśli zrobimy mały research to okaże się, że większość książek, artykułów, publikacji i innych takich pisze się w pewnym ustandaryzowanym formacie zwanym LaTeX. Piękno latexa polega na tym, iż nie formatujemy tekstu. Idea jaka stoi za latexem jest podobna do połączenia xml z xslt. Pisząc na przykład książkę, mówię, że dany fragment tekstu to paragraf, dany fragment tekstu to tytuł rozdziału a jeszcze inny fragment to na przykład cytat. Później mam odpowiednie pliki (tak zwane klasy), które formatują nam dany tekst, przy generowaniu go do na przykład do pdfa. Jedna klasa może spowodować, że paragraf będzie miał odpowiednie wcięcia, tytuł rozdziału pogrubiony a cytat napisany będzie kursywą. Nie podoba mi się wyjściowy plik? Mogę użyć innej klasy, gdzie inaczej sformatowany będzie paragraf, tytuł rozdziału będzie na przykład podkreślony a cytat wyjustowany do prawej strony. Samego tekstu nie zmieniam, podmieniam tylko klasy go formatujące.
Dodatkowo LaTeX zadba o odpowiednie numerowanie rozdziałów i podrozdziałów, automatycznie wygeneruje nam spis treści, spis tabel i rysunków, utrzyma spójność nazewnictwa rysunków, zadba o poprawne podanie bibliografii. Po prostu ideał! A więc w czym tkwi problem? Ano w tym, że pisząc dokument w jakimkolwiek edytorze latex'owym wygląda to tak:



Niezbyt zachwycająco prawda? Kiedy zabierałem się za początki pisania mojej pracy magisterskiej, byłem w stanie odrzucić wszelkie plusy jakie niósł ze sobą latex byle tylko nie babrać się w czymś takim. I kiedy już miałem otwierać nowy dokument w openoffice coś mnie tknęło i postanowiłem na wszelki wypadek zrobić searcha pod hasłem "latex" w repozytorium programów na moim Ubuntu. Wtedy właśnie poznałem Lyx'a.

Lyx jest programem, w którym piszemy dokumenty LaTeXa (przez co możemy korzystać ze wszystkich uroków tego formatu opisanych wcześniej), ale interfejs użytkownika zbliżony jest bardzo do edytorów tekstu do jakich przyzwyczaiły nas M$ Office czy OpenOffice. Zatem mamy pełen zakres udogodnień jakie daje nam LaTeX przy praktycznym zniwelowaniu jego minusów.

Oto jak wygląda Lyx w działaniu (z kawałkiem mojej pracy magisterskiej ;) )

A tak wygląda wygenerowany pdf przy zastosowaniu klasy latexowej "article-polish":


Widać bardzo ładnie. I nie musze dbać tutaj o marginesy, spis treści, bibliografię i inne takie. Wszystko to generowane jest za mnie, automatycznie dopasowując się do zmian pojawiających się w dokumencie i tak dalej. Po prostu bajka!

Dlatego jeśli w przyszłości zamierzasz pisać pracę magisterską, książkę czy cokolwiek w tym stylu, a nie chcesz męczyć się z karkołomnym LaTeX'em, gorąco polecam program Lyx. Jest darmowy (open sourcowy o ile się nie mylę) i co najważniejsze działa na wszystkich platformach (Windows, Linux, Solaris), choć nie napisano go w Javie ;) Raz jeszcze gorąco polecam.

A teraz wybaczcie, idę pisać pracę magisterską...

wtorek, 22 kwietnia 2008

...a cierpliwość - najdoskonalszy nauczyciel

Bardzo, bardzo chciałbym umieścić najnowszego posta na blogu, ale blogspot odmawia współpracy i niestety nie mogę zamieścić obrazków, będących integralną częścią nadchodzącego wpisu. Cóż zrobić, muszę uzbroić się w cierpliwość.

"Czas to najlepsza cenzura, a cierpliwość - najdoskonalszy nauczyciel"
Fryderyk Chopin

poniedziałek, 21 kwietnia 2008

Google, gdzie jest C#?

Znacie googla? Z pewnością, bo trudno dziś wyobrazić sobie surfowanie po necie bez tej wyszukiwarki. Choć oczywiście znam przypadki osób, które zarzekają się, że nigdy nie użyją googla do wyszukiwania informacji, takich ich prywatny protest. Nie mniej jednak google to obecnie potęga internetu, jednoznacznie kojarzona z surfowaniem po sieci.
Jeśli trochę poszperać w internecie to dowiemy się ile to kasy Google wydaje miesięcznie na swoją farmę serwerów, jak przepiękne jest życie pracownika Googla oraz ile to pieniędzy wychodzi rocznie na promocje firmy. Skąd biorą kasę? Wiadomo reklamy, nic odkrywczego. Spotykamy je wszędzie, system ad-sens pozwolił rozpanoszyć się googlowskiej reklamie praktycznie w każdy zakamarek internetu. Reklama działa, bo dostosowuje się do nas (potencjalnych klientów). Na stronie o kotach znajdziemy reklamę książki o pielęgnacji tych zwierząt, nie zaś informacje o najnowszej wkrętarce firmy Józef K. Wiertarki S.A. Wszystko ukazuje się w ramach pewnego kontekstu, stąd reklama ta jest niesamowicie skuteczna. I nie ma się tu co buntować. Jeśli mam już oglądać reklamy ( i nie mam innego wyboru ), wolę oglądać reklamy, które mogą naprowadzić mnie na jakiś ciekawy dla mnie produkt.

Zatem jak bardzo rozbawił mnie jakiś czas temu widok, który ukazał się w mojej przeglądarce, kiedy próbowałem wygooglać słówko Java w mojej ulubionej wyszukiwarce.


No po prostu genialne! Google radzi: szukasz Java, z pewnością Visual Studio 2008 Ci się przyda. Ja wiem, reklama, można wszystko. Ale czy nie ma w tym jakieś granicy? No bo haalllooo, spójrzcie na ten screenshot raz jeszcze, to jest po prostu komiczne!
W telewizji, reklama zachwalająca konkretny proszek do prania, nigdy nie powie nam, że dany, konkretny produkt konkurencji jest gorszy. Usłyszymy tylko frazę "inne proszki do prania". Niby to samo, ale jakaś cienka, nie przekroczona granica istnieje.

Można mówić, taki już jest świat. Ale okazuje się ze tak naprawdę, taka już jest Polska. Kiedy przejdziemy z googla polskiego (www.google.pl) na ten amerykański (www.google.com), reklamy takiej jak ta nie zobaczymy, w ogóle! Polecam sprawdzić, jeśli nie wierzycie na słowo.
Co zatem można powiedzieć o naszej rodzimej fili Microsoftu:

  1. albo uważa nas za debili
  2. albo dział marketingu nie konsultuje wszystkich dzikich pomysłów z "górą"
A może mamy hybrydę dwóch powyższych zdań? Jakby na tą sprawę nie patrzeć, dotknięty nią jakoś aż tak nie jestem, ani zbytnio poruszony. Po prostu śmiać mi się chce i tyle :)

Tą reklamę widziałem już jakiś czas temu, ale piszę o tym teraz, gdyż wpadł mi do głowy zabójczy pomysł. A co gdyby tak pokonać M$ ich własną bronią. Jakiś czas temu głośno się zrobiło, gdy kilku liderów politycznych partii, które już w sejmie nie zasiadają, można było wygooglać pod takimi hasłami jak kretyn czy idiota. Czemu? Ileś osób zebrało się pod wspólną akcją zróbmy coś szalonego, powrzucało linki na swoje strony, pod hasłami idiota czy kretyn, które bezpośrednio wskazywały na stronę domową któregoś z polityków.
Zatem co stałoby się, gdyby zebrać kilkanaście szalonych osób z polskiej blogosfery, serwisów javowych czy innych ze świata IT i zacząć umieszczać pod hasłem C# link do strony głównej Javy, czyli http://java.sun.com/. Tak sobie myślę, że jakby kilka takich linków z hasłem C# pojawiło się na blogach, grupach dyskusyjnych czy też forach internetowych, google mógłby zacząć indeksować słówko C# z główną stroną Javy. W ten sposób mielibyśmy swój lokalny wybryk googlowy i może polski M$ w końcu zdjąłby wspomnianą na początku tego posta reklamę.

Co o tym myślicie?

piątek, 18 kwietnia 2008

Java Killers #001

Witam w pierwszym (i mam nadzieje nie ostatnim) odcinku z cyklu
Java Killers. JK to światowa organizacja, która na cel bierze sobie zbicie z tropu każdego programistę, który uważa się za Javowca. Java Killers przyjmują wiele form, spotkacie ich w http://javapuzzlers.com/ czy też na rozmowie kwalifikacyjnej o pracę. To elitarna grupa, która chce udowodnić tylko jedno - że nie znasz Javy.
Wasza broń to te posty! Poznajcie wroga lepiej teraz niż na przykład na rozmowie o pracę. W cyklu tym na światło dzienne wyjdą pytania (oraz odpowiedzi), których pewnie nie spotkacie na Sun Certificated Java Programmer. To pytania wytrącające z pantałyku, powodujące salwy śmiechu i panicznej histerii. Niemniej jednak powinny Wam również dostarczyć zabawy oraz uciechy. Mimo wszystko potraktujcie je jak najbardziej poważnie, są zabójcze...

Dostatecznie zaintrygowani? Ok, a więc bez zbędnych wstępów przejdźmy do odcinka dzisiejszego. Poznajmy dwie klasy o wdzięcznych nazwach: Foo i Bar, gdzie klasa Bar dziedziczy po Foo:

package javakillers.part001;

public class Foo
{
public int a;

public Foo()
{

a = 0;
}

public void add()
{
a = a + 10;

}

}

package javakillers.part001;

public class Bar extends Foo
{
public int a;


public Bar()
{
a = 2;
}


@Override
public void add()
{
a = a + 5;
}
}

Wszystko wydaje się być proste i intuicyjne prawda? Klasa Bar nadpisuje metodę add z klasy Foo, dodatkowo sama w konstruktorze inicjalizuje zmienną a. Zatem pytanie brzmi, co zwróci poniższy kod:

public static void main(String[] args)
{
Foo f = new Bar();
f.add();
System.out.println("a = " + f.a);
System.out.println("a w Bar = " + ((Bar)f).getA());
}

Odpowiedzi do wyboru macie cztery:

A) a = 0
B) a = 7
C) a = 5
D) a = 12





Ok, gotowi? A więc prawidłowa odpowiedź to:


A) a = 0


Zadacie pewnie pytanie "Że co proszę?" Poprawna odpowiedź wydaję się każda, tylko nie zero. Przecież wywołujemy metode add() i niezależnie czy wywołana zostanie metoda z klasy Foo czy nadpisująca ją metoda z klasy Bar, zawsze zmienna a ma dodaną do siebie jakąś wartość (10 lub 5). Zatem czemu wynik końcowy zero?

Diabeł jak zwykle tkwi w szczegółach. Tworząc w klasie Bar ponownie zmienną a

public class Bar extends Foo
{
public int a;

...

ukrywamy zmienną a z klasy Foo. W kodzie klasy Bar mamy de facto dwie zmienne a. Ponieważ tylko do jednej możemy się odwołać, domyślnie jest to zmienna, która zdeklarowana była ostatnia. Innymi słowy tracimy bezpośredni dostęp do zmiennej a, którą odziedziczyliśmy po klasie Foo.
Teraz już wszystko wydawać powinno się jasne. W konstruktorze klasa Bar inicjaliuzję tą drugą zmienną a do wartości 2. Wywołanie metody add powoduje uruchomienie kodu

a = a + 5;

a zatem wartość zmiennej a w obiekcie klasy Bar przyjmuje wartość 7. Zauważamy, że wartość a z klasy Foo zostaje wciąż niezmieniona, a poniważ jest polem publicznym i mamy do niej pełny dostęp, kod

System.out.println("a = " + f.a);

drukuje wartość 'a = 0' (zwróćmy uwagę na fakt, że deklaracja obiektu new Bar wygląda następująco: Foo f = new Bar();).

Zatem pozostaje pytanie jak się przed tym bronić? Dwie ważne sprawy:

  • Nie używać zmiennych publicznych
Generalnie jest to całkowite pogwałcenie zasady enkapsulacji, co jak widać może mieć poważne konsekwancje.
  • Nie używać nazw zmiennych z klas nadrzędnych
Użycie w deklaracji zmiennej nazwy innej zmiennej, odziedziczonej od rodzica, przysłania tą oryginalną zmienną. Dobre środowisko developerskie powinno wykryć tą zależność i powiadomić w warningach o zaistniałej sytuacji.
Nie mniej nie powinniśmy w 100% polegać na IDE, dlatego zawsze warto zwrócić szczególną uwagę przy nadawaniu nazw zmiennym naszej klasy.

I to już koniec na dziś odcinka z serii Java Killers. Znaliście poprawną odpowiedź?

środa, 16 kwietnia 2008

Netbeans RoadShow Polska wrażenia (cz. 2)

13:35

Kilka minut po wpół do drugiej rozpocząłem moją prezentację. Zgodnie z przewidywaniami pierwszy slajd wprowadził słuchaczy w lekkie osłupienie. "Usenet, the dark side" - o co temu kolesiowi chodzi i jak to się w ogóle ma do aplikacji czasu rzeczywistego? Chwile później wszystko się oczywiście wyjaśniło i z pozoru szalony wstęp okazał się mieć logiczną strukturę. Mam jednak wrażenie, że z całego wstępu najbardziej zapamiętano Arka, który (troszkę przeze mnie zmuszony ;) ) przyznał się, że na drugim roku zażegnywał się, że nie dotknie Javy nawet patykiem. Poza gromkimi brawami, Arek dostal czerwonych wypieków na twarzy oraz ... oficjalną koszulkę Netbeans Day, więc chyba zawiedziony jednak nie był.

Reszta prezentacji poszła równie gładko i została raczej dobrze przyjęta (z tego co usłyszałem na przerwie oraz dzień po konferencji).
Poniżej zamieszczam filmik z mojej prezentacji :) Jest to początek mojego przemówienia, głos jeszcze lekko zachrypnięty, a ja wciąż lekko poddenerwowany, więc moim zdaniem wyszło kiepsko (mam nadzieje, że później zaprezentowałem się troszkę lepiej :) ). Ale Magda mówi mi, żebym już bzdur nie gadał i zamieszczał (jedyny z resztą jaki jest) film z konferencji i już się nad tym więcej nie rozwodził. A więc bez dłuższego przedłużania, przedstawiam wstęp z mojej prezentacji:



14:30

Tuż po mojej prezentacji głos zabrał Brad Schmidt, który w swojej krótkiej (10 minutowej) prezentacji, wprowadził słuchaczy w świat Netbeans Community. Tuż po nim mównice ponownie
zajął Roman przedstawiając potęgę Netbeans'owego profilera.



15:30 - 15:40

Po prezentacji Romana mieliśmy krótką przerwę kawową. Nie byłoby w niej nic nadzwyczajnego, gdyby nie fakt "zadziwiającego" zachowania niektórych ludzi. Wystawiliśmy na poczęstunek napoje i wafle Princessa, dla każdego po jednym. Jak bardzo zdziwił mnie fakt wygłodniałych ludzi rzucających się na wafle, biorących trzy na raz, wracających, biorących kolejnych pięc... Ja rozumiem, nie karmią w akademikach, ale 'dżizas'....

15:45

Przedostatnie wystąpienie poprowadził Marek Kliś o Platformie w Netbeans. Dla mnie prezentacja naprawdę ciekawa, zabrakło tylko trochę wstępu dla osób nie obeznanych z tematem.








17:00

O piątej z lekkim opóźnieniem wystartował Radek Holewa. Miało być o Visual Web Development w Netbeans, skończyło się na Java FX, ponieważ Radka laptop odmówił współpracy z rzutnikiem i w ten piękny sposób poszły się rypać wszystkie skrzętnie przygotowywane przykład.
Prezentacja o JavaFx moim zdaniem była ciekawa, chociaż uboga o brak przykładów, cierpiała na tym dotkliwie.


O 18:00 zakończyliśmy oficjalnie edycję wrocławską Netbeans RoadShow Polska, kończąc tym samym trzy dniowy cykl konferencji. Impreza mam nadziej udana, ciekaw jestem jednak Waszych opinii, komentarzy i wrażeń. Komentujcie na blogu, piszcie mi maila, każda uwaga jest dla mnie (jako organizatora i prelegenta) bardzo cenna. Dlatego raz jeszcze gorąco zachęcam do komentowania!

Opis edycji Krakowskiej i Warszawskiej łatwo znajdziecie na blogu Jacka Laskowskiego pod adresem http://www.jaceklaskowski.pl

Poniżej kilka dodatkowych zdjęć z konferencji:


wtorek, 15 kwietnia 2008

Netbeans RoadShow Polska wrażenia (cz. 1)

W miniony weekend odbył się cykl lokalnych konferencji wchodzących w skład Netbeans RoadShow Polska, będącego częścią światowego tournee Netbeans World Tour. W dniach 11 - 13 kwietnia w trzech największych miastach Polski (w kontekście IT oczywiście) - Krakowie (11.04), Warszawie (12.04) i Wrocławiu (13.04) - można było wzbogacić swoją wiedzę z zakresu środowiska developerskiego Netbeans IDE. Miałem zaszczyt być organizatorem wrocławskiej edycji oraz sprawować pieczę na częścią techniczną konferencji.

Zaorganizowanie takiej imprezy nie jest aż takim wyzwaniem jak się na początku spodziewałem. Największym problem jest oczywiście koordynacja zadań, ale dzięki pewnej decentralizacji (każdy lokalny JUG był odpowiedzialny za edycję w swoim mieście) mogłem skupić w pełni swoje siły przerobowe na wrocławskiej części, która zamykała 13 kwietnia trzy dniowy cykl imprez.

Poniżej krótki log z całego dnia imprezy:

08:45

Przyjeżdżam pod hotel gdzie zatrzymał się Roman Strobl i Karol Harezlak. Chłopacy rozweseleni od początkowych godzin porannych, mimo, że za nimi już ponad 1000km przejechanych samochodem ( a dobrze wiemy, że podróż po polskich drogach nie zawsze należy do przyjemności). Zapakowałem ich do mojego auta i ruszyliśmy w kierunku uczelni.

09:00

Było jeszcze półtorej godziny do oficjalnego startu imprezy, jak pojawiliśmy się w sali 10A budynku D20 Politechniki Wrocławskiej. Niby super wcześnie, ale nauczony doświadczeniem zeszłorocznym (na organizowanych SunTech Days nie chciał ruszyć nam rzutnik) wolałem pojawić się wcześniej. Ku mojemu wielkiemu zaskoczeniu prawo Murphy'ego zostało złamane i o dziwo wszystko działało - oświetlenie, internet, rzutnik, audio. Była 9:20 a my byliśmy gotowi zacząć.

Spodziewałem się, że godzina czasu do rozpoczęcia konferencji będzie się dłużyć w nieskończoność, lecz nic bardziej mylnego, kiedy w towarzystwie ma się Romana i Karola. Bardzo szybko firmowy laptop stał się centrum rozrywki: podpięty do rzutnika i systemu audio zapewnił nam 50 minut kinowych wrażeń. Pierwsze osoby, które przychodziły o godzinie 10:00, kończyły z nami oglądać serial, który w tym czasie leciał na ekranie.
Roman jednak stwierdził, że "enough is enough" i kilka minut po dziesiątej wrzucił już na ekran oficjalne logo naszej konferencji.

10:30

Oficjalne rozpoczęcie, na sali jakieś 80 osób, co marnie się prezentuje względem ilości osób zapisanych na event. Później się okazało, że chyba 10 rano to jednak zbyt wczesna godzina jak na pobudkę niedzielną dla Wrocławian, gdyż w czasie wykładu pojawiło się jeszcze parę osób i szacować mogę, że łącznie na konferencji było coś ponad 100 uczestników.

Po oficjalnym rozpoczęciu, które trwało może 2 min (ale cóż mogłem więcej powiedzieć, jak zwykłe "dzień-do-bry"), głos zabrał Roman i rozpoczął swoją prezentację "New & Cool". Prezentacja według słuchaczy wypadła znakomicie (choć moim zdaniem widziałem już lepsze wystąpienia Romana, ale może się po prostu przyzwyczaiłem). Wędrówka po featureach Netbeansa, pokazanie możliwości nowego edytora, wprowadzonego w wersji szóstej, zrobiły swoje. Teraz, dwa dni po konferencji, wiem przynajmniej o dwóch osobach poważnie myślących o przerzuceniu się z Eclipsa na Netbeansa. Obaj zgodnie twierdzą, że w dużym stopniu przekonała ich właśnie prezentacja Romana.

11:35

Po wystąpieniu Romana i pięciominutowej przerwie głos zabrał Karol Harezlak wprowadzając słuchaczy w świat mobility w Netbeans. Publiczność w dużym stopniu obeznana w temacie, a że Karol jest nie tylko ewangelistą Netbeansa, ale również programistą Mobility Pack, prezentacja była rzeczowa i naprawdę bardzo ciekawa.

W połowie musiałem wyjść, żeby zamówić pizze dla prelegentów, przez co część prezentacji mnie niestety ominęła.

12:30 - 13 :30

Przerwa obiadowa. W między czasie na sale konferencyjną docierają Radek Holewa i Brad Schmidt, którzy z samego rana jechali z Krakowa. Idę po zamówione trzy duże pizze, żeby na miejscu dowiedzieć się, że przygotowali tylko dwie a o trzeciej zapomnieli. Pani menadżer pizzerii bierze sobie jednak za punkt honoru dbanie o dobre imię restauracji, na moich oczach zakasa rękawy i po 10 minutach mamy gotową trzecią pizzę.

Pizze były dobre i chyba wszystkim smakowały, niby nic w tym nienormalnego, ale trzeba wziąć pod uwagę fakt, że co niektórzy już trzeci dzień z rzędu jedli pepperoni na obiad. Jednak pracownikom Sun nic nie jest straszne, a Roman wręcz był szczęśliwy, podsumowując "It's pizza, it's always good".

Ciąg dalszy nastąpi...

Falstart...

Hmm..... Cóż nigdybym się nie spodziewał, że post "zaczynam bloga" może przynieść taką falę odzewu. Może nie przesadzajmy, nie trzeba tego odrazu nazywać falą, ale kilka osób wyraziło zdziwienie, niezadowolenie, ponure pomruki, szok i momentami złość oraz frustrację, faktem, że blog pisany jest po angielsku. No a jak już piszą do Ciebie Jacek Laskowski czy Radek Holewa oraz koledzy z roku, to sprawę należy potraktować poważnie.
Prawda jest taka, że od dłuższego czasu zbierałem się za rozpoczęcie bloga i głównym powodem, dla którego nie mogłem wziąć się za siebie był właśnie wybór: pisać po angielsku czy po polsku. Z jednej strony językiem natywnym naszego świata IT jest przecież angielski z drugiej strony znam sporo osób z branży, których znajomość angielskiego ogranicza się do dokumentacji technicznej.

No i tak bijąc się z myślami trwałem przez kilka tygodni, aż do czasu Netbeans RoadShow Polska. Na edycji wrocławskiej pojawiło się około 100 osób i jakoś nikt nie robił problemu, że Roman czy Brad prowadzili swoje prezentację w pełni po angielsku. Dla wszystkich wydawało się to naturalne, nie było większych problemów przy zadawaniu pytań. Po prostu uczestnicy znali język!
Blog traktuję jako formę ekspresji (lub jak kto woli duchowego ekshibicjonizmu), ale również jako formę samokształcenia się. Dziś napiszę jakiś post, jutro ktoś go przeczyta i dojdzie do wniosku, że to totalna bzdura. Swoją opinie wyrazi dosadnie w komentarzach i nawiąże się między nami dyskusja. I nie ważne jest kto w tej dyskusji będzie mieć ostatecznie rację, ważne, że ja wyjdę z niej bogatszy o nową wiedzę czy doświadczenie. Dlatego ważne jest dla mnie, aby blog ten mógł dotrzeć do jak największego grona czytelników. Netbeans RoadShow przekonał mnie, że polski świat IT po angielsku rozmawia i jak ktoś chce, to umie. Doszedłem więc do wniosku, że pisać mogę po angielsku, powiększający tym samym mój docelowy "target" o cały anglojęzyczny świat.

Tym samym powstał niewinny, pierwszy post "Blog the beginning", który wywołał wspomnianą już falę (hmm fala to wciąż za mocne słowo, nazwijmy ją 'falką' ;) ) kontrowersji. Wymieniłem maile z Jackiem Laskowskim, pobluzgaliśmy sobie z Radkiem Holewą na gadu-gady (my już tak mamy :) ), pogadałem z kolegami i doszedłem do wniosku, że ok, niech będzie blog pisany będzie po polsku. I nie traktujmy tego jako mój brak konsekwencji czy łatwość ulegania wpływom otoczenia (choć przyznaje, jestem na nie podatny). Ostatecznie przekonał mnie fakt, że w języku polskim będę mógł przekazać treść w ciekawszej formie. Poza tym, dopóki mieszkam w Polsce, warto jednak inwestować w język ojczysty - nazwijmy to takim moim prywatnym patriotyzmem :)

A więc bez zbędnego ględzenia już i przekonywania, po jednodniowym falstarcie miło mi (ponownie) zainaugurować mój blog.

poniedziałek, 14 kwietnia 2008

Blog the beginning

Well, they are saying everything has its start and so this blog is no exception, thus I am creating this first entry of my blog to be the official start. Right now from here on there is no going back, I will have to blog :)

What this blog will be about? Well we shall see eventually, probably Java related some sort geeky blog, but time will show. I don't want to define anything at the beginning. So
without further ado I present you My BLOG!