środa, 16 marca 2011

Parsowanie plików Excela

Często zachodzi w naszym świecie potrzeba parsowania plików Excela. Jak to powiedział Sławek Sobótka,  podczas prezentacji pt. „Domain Driven Design” – Wszystko ma swoje miejsce i wszystko jest na miejscu [video 1] [video 2] w ramach WrocławJUG: „[...] ludzie biznesu traktują Excela jako notatnik”. I rzeczywiście. Dla ludzi, którzy mają styczność na codzień w pracy z tabelkami, Excel jest wygodnym i niezastąpionym narzędziem. Warto więc zaznajomić się ze sposobem odczytu danych z arkuszów kalkulacyjnych. Nie będę opisywał jak odczytywać diagramy UML’owe zapisane w Excelu (jak to przedstawił Sławek), ale pokażę poniżej proste parsowanie arkuszy kalkulacyjnych.

Szukając biblioteki javovej obsługującej wspomniane akrkusze natrafiłem najpierw na Java Excel API. Gdzieś przeczytałem, że jest ona łatwiejsza w użyciu niż inne rozwiązania i zacząłem z niej korzystać. Niestety szybko się okazało, że biblioteka słabo radzi sobie z krzaczkami (obcojęzycznymi znakami) i kontynuowałem moje poszukiwania. Natrafiłem wówczas na Apache POI.

Apache POI jest biblioteką nie tylko potrafiącą współpracować z plikami Excela, ale również innymi dokumentami Microsoft Office’a. Chcąc odczytać coś z arkusza kalkulacyjnego, musimy najpierw utworzyć obiekt typu Workbook.

Workbook wb = new HSSFWorkbook(
    new POIFSFileSystem(new FileInputStream(filename)));

Mając już taki obiekt, możemy sprawdzić z ilu zakładek składa się nasz dokument (wb.getNumberOfSheets()), pobrać wszystkie obrazki dokumentu (getAllPictures()), czcionkę z danej komórki (getFontAt(...)) i sporo innych. Aby odczytać dane z konkretnej zakładki, należy ją najpierw pobrać:

Sheet sheet = wb.getSheetAt(...);

Teraz jak już mamy obiekt typu Sheet możemy iterować po danej zakładce w następujący sposób:

for (Row row : sheet) {
    for (Cell cell : row) {
        // …
    }
}

Teraz zostaje już tylko odczytać zawartość danej komórki:

String str = cell.getStringCellValue();

Poniżej prezentuję prosty kod metody wyświetlającą zawartość całego pliku:

public static void showAll(String filename) throws IOException {
    Workbook wb = new HSSFWorkbook(
        new POIFSFileSystem(new FileInputStream(filename)));
    for(int i=0; i < wb.getNumberOfSheets(); i++) {
        Sheet sheet = wb.getSheetAt(i);
        for (Row row : sheet) {
            for (Cell cell : row) {
                String str = cell.getStringCellValue();
                System.out.println(str);
            }
        }
    }
}

Do czego używam tej biblioteki? Na przykład do internacjonalizacji aplikacji. W pliku Excela przygotowuję sobie tłumaczenia używane w tworzonej aktualnie aplikacji. Następnie puszczam taki plik przez mój mały programik, która czyta odpowiednie kolumny i generuje pliki properties. Zgodnie z tym co kiedyś mówił Marek Berkan podczas prezentacji "Automatyczne generowanie kodu" na 4Developers 2010 warto jest jak najwięcej kodu generować automatycznie. Dlatego, po za samym plikiem properties, generuję sobie również plik javowy, zawierający zdefiniowane stałe, których mogę używać w kodzie, chcąc się dostać do danego tekstu. Dzięki temu jak nazwa jakiejś właściwości się zmieni, wygeneruje się inny kod i kompilator będzie krzyczał, gdy gdzieś jeszcze używam nieaktualnej stałej. Chroni mnie to przed błędami w aplikacjach związanymi z tłumaczeniami.

Oczywiście sposobów na wykorzystanie owej biblioeki jest multum, więc zachęcam do testowania.

czwartek, 24 lutego 2011

Hamburg wrażenia po miesięcznym pobycie


W ostatnim przebywam tymczasowo w Hamburgu (już miesiąc), więc już najwyższy czas aby swoje przemyślenia wyrazić, co mi się tutaj podoba, a co nie. To co na samym początku, zaraz po przyjeździe tutaj mnie zachwyciło, to możliwość legalnego, bezstresowego spożywania alkoholu w miejscach publicznych. Zaraz po zameldowaniu się w hotelu, poszedłem z kolegami na piwko, oczywiście w plener. I nawet pogoda nie przeszkadzała (przynajmniej mi), a był zimny styczeń w tym roku. Szczęściem naszym było, że znaleźliśmy otwarty sklep. Ogółem w Niemczech wszystko w Niedziele jest zamknięte. Wyjątkiem są piekarnie (zazwyczaj czynne od rana do popołudnia), muzea i inne instytucje, które muszą być otwarte. Nawet wielkie centra handlowe i budki z kebabem są pozamykane. Znaleźć sklepy czynny w Niedzielę, to naprawdę trzeba mieć szczęście. Muszę przyznać, że w Niemczech jest duża różnorodność jeśli chodzi o gatunki piwa. Jest w czym wybierać i smakują dobrze. Zazwyczaj dla każdej marki piwa są 3 gatunki: pszeniczne, porter i pils. A często jest ich więcej. Inną typową sprawą w Niemczech są drzwi do mieszkań w bloku. Nie montuje się tutaj klamek od strony zewnętrznej i aby otworzyć drzwi potrzebne są klucze. Biada temu, kto zapomni klucza wychodząc z mieszkania. Mi się raz prawie to zdarzyło (chciałem tylko światło na korytarzu zapalić), ale na szczęście zdążyłem „złapać” zamykające się drzwi. Inaczej było by po imprezie ;) Inną ciekawostką, jest pralka, która zazwyczaj znajduje się w piwnicy. Ja akurat mam małą kawalerkę i jeszcze to jakoś rozumiem, ale podobno tutaj to typowe. Dodatkowo, aby skorzystać z takiej pralki, trzeba wrzucić pieniążki do skrzynki doprowadzającej prąd. W moim przypadku jest to 1,5 Euro. Dodatkowo zazwyczaj w takiej pralni znajduje się jeszcze mechaniczna suszarka (również na pieniążki). Co ważne, to to aby wrócić do pralni przed końcem czasu wyświetlanego na urządzeniu połykającym monety. Ja za pierwszym razem tego nie wiedziałem i musiałem dodatkowe monety wrzucić, aby przywrócić zasilenie na chwilę i otworzyć drzwi od pralki. Rozumiem, że Niemcy są skąpi, że cię nie opłaca itd, ale takie rozwiązanie mi się niezbyt podoba. Kolejna sprawa to komunikacja miejska. W Hamburgu jest ona bardzo rozwinięta. Mamy tutaj U-Bahn, S-Bahn, A-Bahn (cokolwiek to jest), kolej regionalną, Metrobus(typowe autobusy), Schnellbus (szybkie połączenie z dzielnicami robotniczymi), Ellbus (dla terenów gdzie nie ma U-Bahn’a, czy S-Bahna), nocne autobusy no i ... statki miejskie. W końcu to miasto portowe (drugi w Europie pod względem wielkości port obsługujący kontenerowce). Niestety za taką sieć komunkacyjną trzeba sporo płacić. Miasto jest podzielone na sporo stref, które decydują o cenie przejazdu. Przykładowo bilet miesięczny na 2 strefy to 58 Euro. Dodatkowo trzeba mieć zdjęcie, aby taki bilet kupić. Warto o tym pamiętać przed przyjazdem tutaj. Ponadto w autobusach panuje dziwny zwyczaj / obowiązek. Codziennie po 21 i w przez całą Niedzielę, wchodzi się przednimi drzwiami i pokazuje bilet kierowcy. Czasami niektórzy wchodzą środkowymi drzwiami, ale jak będzie upierdliwy kierowca, to będzie przez mikrofon prosił aby podejść do przodu i pokazać przejazdówkę. W przeciwnym przypadku będzie stał na przystanku, aż do skutku. No i kierowcy są tutaj bardziej uprzejmi i zawsze czekają na pasażerów biegnących z daleka na autobus i otwierają im drzwi. Bilet jednonarazowy można również kupić u kierowcy. Spodobał mi się ich sprzęt. Mają niewielki terminal, który drukuje bilet i fajny automat do wydawania reszty. Są na nim przyciski, które po naciśnięciu wypluwają daną monetę do „kubeczka”, z którego bardzo łatwo i wygodnie można zabrać drobne. Również informacja, o tym gdzie autobus jedzie i gdzie się zatrzymuje jest łatwo dostępna w autobusie. Przy ważniejszych przystankach, po za słownym komunikatem po Niemiecku, jest on również po Angielsku. No i oczywiście są wyświetlacze diodowe, wypisujące nazwę następnego przystanku. Nie lecą tam przesuwające się reklamy tekstowe jak np. we Wrocławiu. Również na większości przystanków są zamontowane tablice, informujące za ile minut będzie autobus / metro. Bardzo dobre rozwiązanie i co najważniejsze działa. Nie jest to zwykły plan rozkładu jazdy, a dokładna informacja co za jaki czas przyjedzie. Nie zdażyło mi się zauważyć, aby to błędnie funkcjonowało. Kiedy doczekamy się czegoś takiego w Polsce? Nie mam pojęcia. Standard komunikacyjny jest więc tutaj wysoki. Dodatkowo niedawno instytucja zajmująca się transportem miejskim, wprowadziła ciekawą „usługę”. Jeżeli transport spóźni się więcej niż 20 minut, to oddają połowę ceny biletu. Świadczy to o wysokim standardzie tych usług. Podobna promocja w Polsce mogła by zrujnować komunikację miejską w większych miastach. Dla tych którzy nie lubią komunikacji miejskiej, jest w Hamburgu ciekawa alternatywa. Otóż w wielu punktach miasta, są stojaki z rowerami. Po wcześniejszym zarejestrowaniu się, można taki rower wypożyczyć, przejechać potrzebny kawałek i oddać go na innym „przystanku”. Podobne rozwiązanie chce wprowadzić Wrocław. Tutaj to się sprawdza i ludzie korzystają z tego. No i pierwsze pół godziny gratis :) Jest tu sporo ścieżek rowerowych, albo wydzielonych pasów na ulicy, więc jest gdzie jeździć. Co zauważyłem, to sporo osób tutaj biega dla sportu, zwłaszcza w okolicach Alster. Aż głupio mi było tamtędy ostatnio iść. Czułem się jak jakbym biegał na autostradzie pomiędzy samochodami. Największe wrażenie zrobił na mnie mężczyzna, biegający razem z wózkiem dziecięcym (taka wyższa forma spaceru). W Hamburgu jest sporo mostów. Kiedyś myślałem, ze we Wrocławiu jest dużo mostów (220 wg Wikipedii). A tu jest 2500 mostów (również wg. Wikipedii)! Tak, to więcej niż w Wenecji, Amsterdamie i Londynie razem wziętych. Naprawdę, zazwyczaj z każdego mostu widać kilka następnych i czasem są kilka metrów od siebie. Co mnie jeszcze tutaj zaskoczyło, to spora liczba b-boy’i tańczących na ulicach, zbierając przy tym drobne. Poniżej linki do YouTube’a: B-boys aus Hamburg prt. 1 B-boys aus Hamburg prt. 2 Hamburg dance show Po za b-boy’ami spotkałem na ulicy jeszcze raperów, sprzedawających swoją muzykę. Po prostu szedłem sobie ulicą i ktoś się mnie pytał czy słucham hip-hopu. Odpowiadałem że tak i w tym momencie dawali mi swoje słuchawki i puszczali swój kawałek do posłuchania. Ich płyty można również kupić w normalnych sklepach, ale widocznie nie mają dużego popytu, skoro dodatkowo rozprowadzają je tą metodą (trochę jak nielegale). Co ważne są one po niższej cenie niż w sklepie. Jedna taką płytę kupiłem i dzięki temu mam rzadką okazję posłuchania rapu z Gujany. Odnośnie zakupów, to warto sprawdzić jaką ma się kartę płatniczą, przed przyjazdem tutaj. Otóż karty Visa, nie są akceptowane we wszystkich sklepach. Pytałem jednego Niemca dlaczego, to twierdził, ze to ze względów bezpieczeństwa. Na karcie Visa (i paru innych) widnieje numer, za pomocą którego można dokonywać zakupów, jak kartą kredytową. No i jak się płaci w sklepie to ktoś może zapamiętać ten numer i użyć w niepowołanym celu. W sumie to dobre myślenie. Mi ogółem cały ten pomysł robienia zakupów jedynie za pomocą numeru karty kredytowej bez dodatkowej autoryzacji się nie podoba, ale to już osobny temat. Upewnijcie się więc najpierw, czy w danym sklepie możecie płacić swoją kartą. Na koniec jeszcze mała ciekawostka. Jest piosenka o tym, jak w Hamburgu mówi się na „do widzenia”: In Hamburg sagt man Tschüss. O ile „Tschüss”, mówione na pożegnanie, jest ogólnie znane i używane w całych Niemczech, tak na przywitanie mówi się tutaj „Moin”. Jest to tutaj bardzo popularna forma przywitania, ładnie to brzmi, a w szkołach tego nie uczą. A szkoda.

sobota, 19 lutego 2011

Kilka porad na temat MIDP Visual Design w Netbeans'ie

Dzisiaj chciałbym opowiedzieć o kilku sztuczkach, w MIDP Visual Design, który jest dostępny w Netbeans’ie. Tak wiem, że technologia J2ME (czy też JME) jest już trochę przestarzała, gdyż teraz mamy Androidy iPhone’y, BlackBery, Windows 7 i inne ciekawsze cuda na kiju ;) Zamierzam jednak jeszcze kilka postów o j2me na blogu opublikować, ot tak dla potomności.

Z opcji MIDP Visual Design możemy skorzystać tworząc nowy projekt z grupy „Java ME” typu „Mobile Application” w NetBeans’ie. Wystarczy nie odznaczać (gdyż domyślnie jest zaznaczony) CheckBox’a „Create Hello MIDlet”.


Można również do istniejącego projektu dodać Visual MIDlet i uzyskamy podobny efekt.

Narzędzie pozwala nam w prosty sposób zbudować menu użytkownika, przechodzenie pomiędzy ekranami itp. Mamy ładny podgląd gdzie z danego miejsca możemy się przemieścić, czyli widzimy przepływ aplikacji (menu). Należy pamiętać, że generowane menu oparte jest na komponentach wysokopoziomowych (tych dziedziczących z klasy Screen). Przykładowy screen jak może taki przepływ wyglądać poniżej.


Oczywiście w ten sposób nie zrobimy całej aplikacji. Mamy możliwość dodawania kodu w pewnych miejscach i większość rzeczy można wyklikać. Generalnie narzędzie świetnie się nadaje do prototypowania, gdy na szybko trzeba coś pokazać. Nie widzę jednak przeciw wskazań, do użycia tego również na produkcji. Generowany kod jest całkiem dobry. Poniżej kilka wskazówek, związanych z tym oto narzędziem:

1. Możemy wybrać w jaki sposób poszczególne komponenty są inicjowane. Po wybraniu danego Screena w oknie Properties widzimy dostępne opcje. Po za zmianą wyświetlanego tekstu i innych właściwości, możemy wybrać czy mają być Lazy Initialized czy nie.


Proponuję każdemu sprawdzić, jaki kod zostaje wygenerowany przy zmianie tego komponentu. W małych aplikacjach może to nie mieć wielkiego znaczenia, czy komponent jest lazy czy nie, ale te duże / ciężkie komponenty (lub rzadko używane) powinny być leniwie inicjowane. Oczywiście część komponentów może być inicjowana tak, a druga inaczej.

2. Możemy również zmienić sposób generowania logiki, odpowiedzialnej za przechodzenie pomiędzy kolejnymi ekranami. Domyślnie to, która opcja z menu została wybrana, sprawdzane jest na podstawie etykiety (label’ki) przypisanej do danego elementu ekranu. Przykład poniżej:

public void mainMenuAction() {
    // enter pre-action user code here
    String __selectedString = getMainMenu().getString(getMainMenu().getSelectedIndex());
    if (__selectedString != null) {
        if (__selectedString.equals(“Etykieta”)) {
            // ...

Włączając opcję “Index Based Switch” powyższy kod zostanie przekształcony w coś takiego:

public void mainMenuAction() {
    // enter pre-action user code here
    switch (getMainMenu().getSelectedIndex()) {
        case 0:
            // ...

Zachowanie to może mieć znaczenie wówczas, gdy chcemy wprowadzić internacjonalizację do naszej aplikacji i podmianę tekstów na elementach „w locie”. W drugim przypadku logika aplikacji w żaden sposób nie zależy od przypisanej etykiety w danym komponencie, a jedynie na jego położeniu. Po takim zabiegu podmiana tekstów jest prostsza.

3. Odnośnie internacjonalizacji, to w większości kontrolek mamy możliwość podmiany wyświetlanego na niej tekstu (dziedziczymy z klasy Displayable metodę setTitle()). Problem jest jednak z obiektami typu Command, które są immutable, gdyż nie posiadają metod modyfikujących ich stan. Można za to skorzystać z następującej sztuczki: usunąć z danego ekranu istniejące obiekty Command, utworzyć je na nowo i podpiąć. Przykład poniżej:

getSettingsMenuList().removeCommand(getBackCommand());
backCommand = null;
getSettingsMenuList().addCommand(getBackCommand ());

W pierwszej linii usuwamy obecną powiązaną komendę z danym ekranem. W drugiej linii zerujemy referencję do obiektu zwracanego przed getBackCommand(). Na koniec tworzymy obiekt na nowo (wywolanie getBackCommand()) i przypisujemy nową komendę do żądanego elementu. Korzystamy tutaj z faktu, że dana komenda jest leniwie inicjowana i po wejściu w metodę  getBackCommand(), zostanie ona na nowo utworzona.

4. Generalnie często początkujący programiści zderzający się z MIDP Visual Design wkurzają się, że nie mogą tu wszystkiego zrobić czego chcą. Według mnie wszystko da się wyklikać (w zakresie oferowanym przez edytor), ewentualnie dopisując niewielkie kawałki kodu w miejscach, w których edytor nam na to pozwala. Na prawdę nie znalazłem niczego, w czym by edytor mnie ograniczał.

Jednakże chcąc się pozbyć wsparcia ze strony MIDP Visual Design można wykonać pewien trick. Usuwając z dysku plik .vmd i wszystkie komentarze, generowane przez edytor, z pliku .java. Oczywiście musimy zrobić to w innym edytorze tekstowym, a nie pod NetBeans’em. Nie będziemy mogli również wrócić do poprzedniego stanu, ani więcej zobaczyć przepływu aplikacji dla naszego kodu.

Usunięcie komentarzy (przynajmniej część) z pliku z kodem, jest równie ważne jak usunięcie pliku *.vmd. W przypadku usunięcia tylko tego pliku możemy napotkać na problemy z otwarciem projektu pod NetBeans’em.

Poniżej początki komentarzy dodawanych przez NetBeans’a:

//<editor-fold
//</editor-fold
//GEN-LINE
//GEN-BEGIN
//GEN-END

To tyle na dzisiaj. Zachęcam do korzystania z tego edytora. Jak było coś niejasne to piszcie!

niedziela, 9 stycznia 2011

Co najbardziej boli przy poznawaniu nowych technologii?

Chciałbym się w poniższym wpisie podzielić swoimi przemyśleniami na temat tego, co sprawia, że siadając do poznawania nowej technologii, bardzo często tracimy dużo czasu nad jakąś „pierdołą”. Ostatnio musiałem / chciałem napisać sobie coś w JavaScript. Miał to być pewien gadżet na bloga, gdyż brakowało mi pewnej funkcjonalności na blogerze. Nigdy wcześniej nie korzystałem z JavaScript i nie znałem podstaw, ani dokładniejszych założeń języka. Jako że nie było to zajęcie na dłużej, postanowiłem szybko znaleźć jakieś rozwiązanie, zaimplementować, potestować, zastosować i zapomnieć. Nie chciałem więc się mocno w ten język zagłębiać.

Poszedłem, więc do Empika w poszukiwaniu natchnienia. Znalazłem pierwszą lepszą książkę do JS i zacząłem przeglądać. No dobra mamy zmienne, pętle, operacje matematyczne, możemy zmieniać widoczność elementów na stronie, modyfikować ich style, itd. Po szybkim rozeznaniu i konsultacji z ziomkiem bawiącym się kiedyś tym językiem, przystąpiłem do pracy.

Po niedługim czasie pierwsza wersja skryptu zaczęła już działać. Przy testowaniu jednak zauważyłem, że dla pewnych danych wejściowych coś nie działa. Przyczyną tego stanu było dynamiczne typowanie które powodowało, że operacje matematyczne wykonywały się na liczbach zmiennoprzecinkowych (a nie na wartościach całkowitoliczbowych jak oczekiwałem). Po usunięciu tego problemu dalej jednak coś nie grało.

Okazało się że JavaScript domyślnie przy konwersji float -> int zaokrągla liczby do najbliższej, a nie bierze części całkowitej. Konieczne okazało się zastosowanie funkcji Math.floor(), aby było po mojemu.

Problem miałem jeszcze, po dodaniu skryptu do bloga, bo w FireFox'ie nie chciało działać. Znalazłem wtedy w tej przeglądarce ciekawą opcję „Konsola błędów” w menu „Narzędzia”. Dzięki temu szybko dowiedziałem się o co chodzi i po szybkiej podpowiedzi od ziomka poprawiłem skrypt.

Moje pytanie brzmi co sprawiło, że napotkałem na takie problemy? Otóż brak wiedzy na temat podstaw języka JavaScript. Nie wiedziałem, że domyślnie operacje liczbowe dokonywane są na typach zmiennoprzecinkowych, że zaokrąglanie liczb jest do najbliższej i jeszcze parę innych drobiazgów. Są to niby drobnostki, ale powodują one, że nasz kod robi coś innego niż się spodziewamy. Sporo czasu poświęciłem, aby dojść do tego, dlaczego mój kod działa tak a nie inaczej. Takie drobnostki / szczegóły / detale przy używaniu języka, którego się nie zna, prowadzą do dużej straty czasu na szukanie błędu i rozwiązania.

Z podobną sytuacją spotkałem się już wielokrotnie. Np. tablice w Matlabie są numerowane od jedynki, co dla wieloletnich programistów C\C++, Javy początkowo irytuje. Przypomina mi się również sytuacja znajomego, który jest fanem C#, a musiał coś w Javie zrobić. Pytał mnie się: „Dlaczego kolekcje nie działają mu tak, ja sie tego z dokumentacji spodziewa? Przeciążył przecież metodę equals()”. Od razu zapytałem, czy przeciążył też metodę hashCode(), gdyż znałem kontrakt jaki obowiązuje te dwie metody i wiedziałem jak działają kolekcje. Sytuacja od razu stała sie jasna.

Jaka z tych przemyśleń nauka na przyszłość? Niewielkie niuanse pomiędzy poszczególnymi językami programowania bardzo dają się we znaki. Warto dlatego, zanim co kol wiek w danym języku napiszemy, poczytać trochę o podstawach i założeniach danego języka. Z drugiej strony długo szukając rozwiązania jakiejś drobnostki, albo się zniechęcimy do danego języka, albo zapamiętamy o co chodziło na bardzo długo.

czwartek, 23 grudnia 2010

Db4o jak zacząć?


W tym poście opowiem jak zacząć swoją przygodę z db4o. Nie będę pisał kolejnego tutoriala na ten temat, gdyż zostało to już niejednokrotnie zrobione. Skupię się raczej na przygotowaniu środowiska, pokazaniu przydatnych narzędzi i odesłaniu do ciekawych artykułów. Zaczynajmy.

Chcąc się bawić z db4o musimy na początek wybrać wersję z której będziemy korzystać. Ja na co dzień korzystam z wersji 7.4 określanej jako Stable. Mamy jeszcze wersje 7.12 (określaną jako Production) i 8.0 (Development). Podstawowe funkcjonalności powinny być takie same, ale z tego co kojarzę to poszczególne wersje różnią się pewnymi bardziej zaawansowanymi mechanizmami.

Chcąc więc skorzystać z db4o należy podpiąć odpowiedniego JAR’a pod projekt. Możemy takowego bezpośrednio ściągnąć ze strony producenta: db4o for Java, version 7.4.155.14653 ZIP W tym pliku, katalogu lib mamy min. dostępne odpowiednie wersje JAR’ów przygotowane dla różnych wersji Javy:

  • db4o-7.4.155.14653-java1.1.jar
  • db4o-7.4.155.14653-java1.2.jar
  • db4o-7.4.155.14653-java5.jar

Ja oczywiście korzystam z wersji dla Javy 5. Jeżeli korzystamy z mavena, to musimy dodać następujący wpis:


  
    db4o
    http://source.db4o.com/maven/
  



  com.db4o
  db4o-java5
  7.4-SNAPSHOT


Teraz już możemy się bawić. Na początek polecam przejście tutoriala: doc\tutorial\db4o-7.4-tutorial.pdf z archiwum ściągniętego wraz z db4o. Pokazuje on za pomocą przykładów funkcjonalności db4o. Nie ma tu jakiś wielkich teorii jak całość działa, tylko raczej ukazanie funkcjonalności za pomocą przykładu i krótkiego komentarza. Budowana jest w nim aplikacja odnosząca się do wyścigów F1 i w kolejnych rozdziałach przedstawia kolejne dostępne funkcjonalności.

W tutorialu tym brakuje pokazanego kodu klasy Util. Musimy więc sami stworzyć sobie taką klasę w naszym projekcie, lub zastąpić wszelkie wywołania Util.DB4OFILENAME nazwą pliku w którym będzie przechowywana nasza baza danych. Ewentualnie skorzystać z kodu dostępnego w tym samym katalogu co tutorial.

Znalazłem nawet niemalże tłumaczenie tego tutoriala na polski. Fakt faktem nie dotyczy on najnowszej wersji, a jedynie 6.3. Kiedyś przeczytałem to całkiem dokładnie i było nie było to najgorsze tłumaczenie. Można się na nim opierać. Czasami są wywoływane w tym „tutorialu" metody, które są obecnie @deprecated, ale poza tym jest całkiem ok. Opisywane tłumaczenie jest zawarte w pracy magisterskiej Pawła Protasia pt. Pomost pomiędzy SBQL a Db4o.

Jeżeli chcielibyśmy stworzyć prostego CRUD’a z wykorzystaniem db4o i JSP polecam artykuł z 8mego numeru Java exPress  pt.: DB4O - Obiektowa baza danych. Autorem artykułu jest Paweł Cegła, który również na swoim blogu pisze o db4o.

To tyle na początek jeśli chodzi o chęć zrozumienia działania samej bazy db4o. Chcąc tworzyć już bardziej skomplikowane, wielowątkowe aplikacje, powinniśmy zapoznać się z klasą Db4oUtil. Pierwszy raz znalazłem ją na blogu Space Program we wpisie: Db4oUtil (aka. The Easiest Way to Get Started With Db4o). Kopia tej klasy (troszkę zmodyfikowana) znajduje się również na stronie db4o: Db4oUtil (aka. The Easiest Way to Get Started With Db4o). Podaje obydwa linki, gdyż jakiś czas temu strona db4o przechodziła renowacje i wówczas wiele linków nie działało.

Db4oUtil jest thread safe i proste w użyciu. Ja akurat zazwyczaj korzystam ze zmodyfikowanej przez mnie wersji tego pliku w zależności od aktualnych potrzeb projektowych. Schemat użytkowania jest podany w przytoczonych artykułach.

Mamy jeszcze do dyspozycji oczywiście dokumentację javadoc. Miejscami nie jest ona „wylewna”, ale na pewno warto ją podpiąć pod ulubione IDE. Jest jeszcze Reference Documentation (doc\reference\db4o-reference-java.pdf), ale to już jest ponad 1000 stron w pdf’ie i początkowo odradzam. Dopiero jak czegoś nie znajdziemy w tutorialu, ani w javadoc to można tego szukać w dokumentacji referencyjnej.

Na koniec chciałbym polecić narzędzie ObjectManagerEnterprise (OME). Jest to aplikacja służąca do podglądu bazy db4o (nawet jak nie wiemy jakie klasy tam siedzą). Narzędzie jest dystrybuowane razem z biblioteką db4o. Działa ono jako wtyczka do Visual Studio (w przypadku gdy korzystamy z wersji db4o dla C#) lub Eclipse (w przypadku gdy korzystamy z wersji Javowej). Jest jeszcze rozszerzenie dla Netbeans’a: db4o-netbeans, ale jest ono już nie rozwijane od 3ch lat i z nowym NB nie współpracuje (a szkoda).

OME wywodzi się bezpośrednio z projektu db4o Object Manager działającego jako aplikacja standalone. Jednak i ten projekt nie jest już rozwijany i nie wspiera nowszych wersji db4o.

Jeszcze mogę polecić własną prezentację pt.: Inicjatywa NoSQL na przykładzie db4o, którą miałem ostatnio okazję prezentować w ramach WrocJUG. Więcej o samej prezentacji w poprzednim wpisie: Wrażenia po pierwszej mojej prezentacji w ramach Wrocław Java User Group.

To chyba na tyle co mógłbym polecić na początek, jeśli ktoś chciałby się pobawić db4o. Wszelkie komentarze z interesującymi linkami na temat db4o mile widziane.

sobota, 18 grudnia 2010

Wrażenia po pierwszej mojej prezentacji w ramach Wrocław Java User Group


We wrotek (14.12.2010) miałem przyjemność prowadzić prezentację w ramach Wrocław Java User Group (WrocJUG). Było to moje pierwsze wystąpienie na tym poziomie trudności. Wielokrotnie prowadziłem prezentacje w ramach koła naukowego ISA^2 czy PWrJUG, ale na WrocJUG jest trochę inaczej. O ile studenci w miarę wierzą w to co się do nich mówi, to na WrocJUG padają już trudne pytania i byle odpowiedź jest tu niewystarczająca. Tutaj trzeba mieć większą wiedzę i mocne argumenty, aby przekonać do siebie słuchaczy.

Mój temat prezentacji to: Inicjatywa NoSQL na przykładzie db4oDb4o zajmuję się już od jakiegoś czasu, a zaczynałem od studenckiego projektu, później była magisterka i kilka małych projekcików dla własnych celów. O rozwiązaniach NoSQL miałem okazję trochę posłuchać w ramach polskich konferencji. Prezentacją chciałem trochę przybliżyć i rozpropagować te obydwie rzeczy we Wrocławiu.

Do samej prezentacji przygotowywałem się dość długi czas. Już podczas wakacji miałem pierwsze pomysły, jakie triki mogę wykorzystać w prezentacji, aby widownię trochę rozbawić i zmusić do dyskusji. Samą prelekcję musiałem trochę odwlec w czasie, gdyż chciałem się najpierw obronić, a dopiero potem przemówić na WrocJUG. Jak już zgłosiłem gotowość do prezentowania, to trzeba było jeszcze chwilę poczekać na wolną salę (spotkania nie są regularne, więc nie mamy jej na stałe zarezerwowanej).

Jak poszła prezentacja? Po prelekcji zgarnąłem kilka pozytywnych opinii, z czego się cieszę. Zależało mi na tym, aby zmusić widownię do dyskusji, co mi się udało. Padało tyle pytań, że całe wystąpienie przeciągnęło się do 2 godzin i 15 minut! Udało mi się ponadto poprowadzić prezentację na luzie i sala często się śmiała.

Czy udało mi się przekonać uczestników do korzystania z db4o? Chyba nie do końca. Jeżeli przedstawił bym produkt, który ma funkcjonalność zbliżoną do obecnych komercyjnych, relacyjnych baz danych, to wtedy może tak. Db4o jednak ma troszkę inne przeznaczenie (małe i średnie projekty, aplikacje standalone) niż duże relacyjne kombajny, przechowujące ogromne ilości danych.

Podczas prezentacji dało się odczuć, jak bardzo jesteśmy zakorzenieni w relacyjnym modelu danych i jak ciężko jest nam się odnaleźć w nowym środowisku. Znamy bardzo dobrze programowanie obiektowe, ale ciężko nam jest sobie wyobrazić, aby przechowywać dane w postaci obiektów. Bardzo też się przyzwyczailiśmy do innych możliwości jakie oferuje nam relacyjna baza danych i nie chcemy z nich tak łatwo rezygnować.

Uwagi jakie zebrałem na temat samej prezentacji:

  • Nie wszystko było czytelne na slajdach, np. czarny tekst na czerwonym tle na jednym z obrazków. Wynikało to trochę z wypalenia się lampy rzutnika. Z drugiej strony chciałem zachować kolorystyke stosowaną w dokumentacji db4o.
  • Nie zawsze udawało mi się ładnie złamać linię kodu na slajdach. No niestety miałem trochę „tasiemcowate” warunki w if-ach, a nie chciałem czcionki w kodzie pomniejszać, ze względu na pogorszenie widoczności.
  • Ładniej również kod uruchamiany można było dopracować, np. nie tworzyć metod statycznych. Wynikło to trochę z mojego lenistwa, gdyż chciałem aby wszystko co ciekawe w danym przykładzie, działo się w metodzie main(). Niektórzy jednak oceniają programistę po jego kodzie i niezaspecjalnie na tym polu wypadłem. Trzeba się poprawić na przyszłość! Na przykład zamiast pokazywać kolejne możliwości w metodzie main(), można przygotować testy uczące (chyba tak to się nazywa). Chodzi mi o testy, które piszemy dla siebie, gdy chcemy poznać działanie nowej biblioteki. W ten sposób sprawdzamy, czy dobrze zrozumieliśmy dokumentację.
  • Zamiast używać SVN’a można by kopiować odpowiednie pliki projektów z uprzednio przygotowanych katalogów. Nie chciałem tworzyć kodu na żywo, gdyż bardzo dobrze wiem, że to ciężkie zajęcie pisać kod i jednocześnie opowiadać o nim, a najczęściej i tak wychodzi, że o czymś zapominamy i nie działa. Zaczyna się wtedy desperackie poszukiwanie przyczyny, a publika się zaczyna nudzić. Dlatego postanowiłem skorzystać z SVN’a i przełączać się pomiędzy kolejnymi rewizjami kodu. Z widowni słyszałem szmery, że to fajny pomysł, ale rzeczywiście kopiowanie pliku mogło by być trochę szybsze.
  • Mało wiedziałem o komercyjnym zastosowaniu db4o i jakie sprawia problemy. No cóż nie mam komercyjnego doświadczenia z db4o, ani informacji jak to się sprawdza na produkcji.
  • Odpalanie prostych przykładów kodu nie zawsze jest potrzebne.
  • Warto zainstalować program typu ZoomIt, aby jakby coś nie było czytelne, można było powiększyć ekran.
  • Brakowało mi trochę takiej aplikacji, która wyświetlała by slajdy w trybie prezentacji. Tzn. abym na ekranie laptopa widział aktualny slajd i następny, a na rzutniku był tylko aktualny slajd wyświetlany. Z tego co mi wiadomo to pakiet MS Office i OpenOffice mają taką funkcjonalność, ale niestety one nie obsługują pdf'ów. Jakby ktoś znał taką aplikację proszę o info.

Więcej uwag nie pamiętam, jak mi się cos przypomni to dopiszę :)

czwartek, 11 listopada 2010

Zostałem magistrem inżynierem


W środę (10.11.2010) stałem się magistrem inżynierem. Po co o tym tutaj piszę? Aby trochę podsumować ostatni okres mojego życia i aby kiedyś do tego postu powrócić i zobaczyć co się zmieniło. Ale od początku.

Moje studiowanie troszkę się przedłużyło. Generalnie starałem się zawsze pracować regularnie i intensywnie (zwłaszcza nad magisterką), jednak na początku czerwca stwierdziłem, że mogę się nie wyrobić z zakończeniem aplikacji i redakcją pracy. Do tego jeszcze się rozchorowałem i nie byłem w stanie nad tym siedzieć. No dobra, to przekładam obronę na wrzesień – nic się przecież przez to nie stanie.

Czy było to dobre posunięcie? Teraz na pewno bym tak nie zrobił. Trochę za ambitnie podszedłem do magisterki i jak bym miał taką pisać drugi raz, zrobił bym byle działało i oddałbym ją w terminie. Może nie była by ona najwyższej jakości, ale na magisterkę nie robi się niewiadomo jakich odkrywczych rzeczy.  Od tego są doktoraty. No i magisterka nie jest niewiadomo jak dokładnie sprawdzana i weryfikowana.

Druga sprawa to załatwianie formalności związanych z obroną. Indeks w dziekanacie leżał ponad 3 tygodnie i był weryfikowany, czy czasem nie oszukiwałem podczas studiów. Nie dość, że oceny z każdego przedmiotu lądują w kilku miejscach (indeks, karta zaliczeń, protokół, różne systemy informatyczne) to teraz na koniec  trzeba to wszystko sprawdzić , czy się oceny zgadzają.  No i to niestety trwa, nawet jak się nie miało „ciekawego” przebiegu studiów. Przez te formalności (czy jak kto woli proces biznesowy) nie zdążyłem we wrześniu z obroną (mimo dotrzymania wszelkich terminów).

Dalej było załatwianie kolejnych formalności: druk pracy w kilku egzemplarzach w tym archiwalna „przywiązana naturalnym sznurkiem do teczki” i ponumerowana ołówkiem (SIC!), przepisanie całego indeksu do arkusza kalkulacyjnego (mimo obecności tych ocen w innych systemach informatycznych) i wiele innych. Na co komu to, to nie wiem. Większość tej makulatury i tak po jakimś czasie pójdzie do spalenia (wskazuje na to chociażby ten naturalny sznurek).

No dobra w końcu zebrało się kilkunastu chętnych do obrony i w listopadzie w końcu zrobili termin. Jak wyglądała sama obrona? Już miałem wchodzić na salę, laptop odpalony na prezentacji, a tu komisja stwierdza, że robi sobie przerwę… No i kolejna godzinka czekania.

Sama obrona poszła szybko (około 20 min). Byłem bombardowany pytaniami w trakcie prezentacji i podczas odpowiadania na wylosowane pytania. Trafiłem na takie które średnio umiałem, ale wybrnąłem i obroniłem się na 5,0. Praca magisterska również oceniona była na 5,0 ale średnia ze studiów zaważyła na tym, że na koniec wyszło 4,5. Szkoda, że tutaj zaangażowanie w kołach naukowych się nie liczy bo by na pewno wyszło lepiej. No cóż, i tak z tych ocen można być dumnym.

Jak wyglądał czas przed obroną (a raczej w oczekiwaniu na termin obrony)? Mi to przypominało trochę siedzenie na gwoździach. Załatwianie formalności, czekanie na termin, opracowywanie pytań… Jak dla mnie był to straszny okres wyczekiwania, w którym ciężko było sobie sensownie czas zorganizować, bo mogli nagle zadzwonić i powiedzieć, że za kilka dni obrona. Teraz mam nadzieję, że skoro już jestem po, to coś więcej się na blogu technicznego pojawi.

Czy dostrzegam jakieś pozytywy przeniesienia obrony na późniejszy termin? Tak, drugi raz bym tak nie zrobił i mniej ambitnie bym podszedł do magisterki. Z drugiej strony, gdybym chciał się bronić w pierwszym terminie, nie mógłby uczestniczyć w najlepszej konferencji Javowej w jakiej było mi dane dotychczas uczestniczyć. Oczywiście myślę tutaj o Javarsovi. Zamiast uczestniczyć w prelekcjach, zarywałbym nocki kończąc w pocie czoła magisterkę. A znając prawa Murphy'ego pewnie i tak coś przed końcem by się sypło. No i nie wiem czy bym blog zaczął pisać…

Czas pokaże co było dobre.