czwartek, 26 sierpnia 2010

Wrażenia po 8th Students’ Science Conference

Wróciłem właśnie z Ósmej Konferencji Naukowej Studentów. Moje przygotowania opisywałem na blogu kilka dni temu wpisem: Przygotowania do Konferencji Naukowej Studentów. Dzisiaj opiszę jak poszło.

Była to dla mnie wyjątkowa konferencja, ponieważ podczas niej przeprowadziłem swoją pierwszą prezentację w języku angielskim. Na miejsce dojechałem przygotowanym do tego autobusem. Znalazłem w nim kilka znajomych osób, inne zapoznałem, więc podróż minęła w miarę szybko. Na miejscu była rejestracja uczestników, torba z materiałami konferencyjnymi i przydział do pokojów. O 13.00 był obiad, o 15.00 rozpoczęcie oficjalne konferencji i chwile po 16.20 rozpocząłem swoją prezentację.

Zgodnie z tym co wcześniej juz mówiłem, miałem przygotowaną twardą podkładkę i tekst swojej prezentacji. Zostałem wyczytany przez prowadzących konferencję, wyszedłem na środek i zacząłem mówić.

Powiedziałem na początku, że jest to moja pierwsza publiczna prezentacja w języku angielskim, dlatego będę się posiłkował kartką. Trochę nie fajnie było, że musiałem się co chwila obracać się aby zmienić slajd, ale wydało mi się to lepsze niż pokazywanie człowiekowi obsługującemu komputer, kiedy ma przełączyć slajd. Na kolejnych prezentacjach jednak widziałem, że taki mechanizm się w miarę sprawdzał.

Prezentację wygłosiłem zgodnie z zaplanowanym czasem i później był czas na pytania. Trafiło mi się, że na sali był doktor, który zajmował się podobnym do mojego problemem i zasypał mnie gradem pytań - oczywiście po angielsku. Już w pewnym momencie nie wiedziałem czego on ode mnie oczekuje, więc starałem się cokolwiek odpowiedzieć, byle już to zakończyć. Po mojej prezentacji pozostałem na sali i słuchałem kolejnych prezentacji z danej sesji. W końcu mogłem odetchnąć. Znajomi mówili mi, że całkiem dobrze wypadłem i prawie nie zaglądałem w kartkę.

Po zakończeniu danej sesji podszedłem do tego doktora, który mnie męczył pytaniami aby wyjaśnić pewne sprawy. Rozmawialiśmy długi czas - na szczęście juz po polsku - i miał wiele uwag do mnie.

Po pierwsze problem który przedstawiałem - mechanizm automatycznej migracji danych z bazy relacyjnej do obiektowej - jest juz problemem znanym, starym i że właściwie nic odkrywczego, specjalnego w swoim artykule nie zrobiłem. To że nie było żadnego podobnego rozwiązania, wykorzystującego db4o nie znaczy wcale, że należy się tym zajmować. Dla mnie była to część magisterki, a głównym motorem napędowym tworzenia artykułu i prezentacji była darmowa wycieczka na Węgry. Zresztą wiele osób, z którymi rozmawiałem twierdziła podobnie.

Po drugie to na konferencje naukowe przygotowuje się artykuły, które muszą na prawdę wnosić coś nowego. Artykuły te wcześniej przechodzą przez recenzentów i każdy musi wystawić pozytywną opinię. Inaczej są odrzucane. Nasze artykuły również pewną recenzję przechodziły, ale nie było takiego sita. Ze 109 przysłanych nadesłanych artykułów doliczyłem się ponad 80 w książce z publikacjami. Artykuł powinien więc być czymś nowym. Tam gdzie kilka innych artykułów się kończy tam dopiero powinna zaczynać się twoja praca - twój artykuł.

Po trzecie powinno się rozwiązywać projekty praktyczne. To znaczy, że nie powinniśmy sami sobie wymyślać problemów do rozwiązania, aby mieć przyjemność i satysfakcję z tego, tylko powinniśmy rozwiązywać problemy praktyczne. To znaczy, takie problemy które najlepiej są zlecone przez przemysł, lub tworzą zupełnie coś nowego. Jednak takimi problemami to się zajmują doktoranci i doktorzy. My biedni studenci zazwyczaj nie dostajemy nie wiadomo jakich wyszukanych, trudnych problemów na magisterkę, bo wtedy nikt by się nie obronił w terminie. No i niestety czasami musimy rozwiązywać problemy, które niekoniecznie mają jakieś zastosowanie w rzeczywistości.

No trudno. Mimo wielu tych uwag nie załamałem się jakoś szczególnie. Najważniejsze z tego wszystkiego jest, aby wynieść jakąś naukę na przyszłość.

No dobra to tyle jeśli chodzi o początek konferencji i moje wystąpienie. Później słuchałem wystąpień innych. Pewien Węgier zrobił jakby GuitarHero ale dla prawdziwej gitary basowej. To znaczy pomiędzy gitarę a wzmacniacz podłączył swoje urządzenie, które na połowie ekranu wyświetlało jakie nuty należy grać, a obok w jakim stopniu nam to wychodzi, na podstawie przechwyconego sygnału z gitary. Ciekawy projekt, tyle że dotychczas był testowany przez autora i jego ojca :)

Wieczorem po kolacji był czas wolny. Oczywiście trzeba było się zrelaksować po ciężkim dniu. Zaczęła się więc swoista integracja ludzi i konsumpcja napojów nieodłącznie towarzyszących studentom. Udało się zorganizować muzykę i nagłośnienie w jednej ze sal konferencyjnych, czego mi trochę brakowało w kolejnych dniach.

Następnego dnia po śniadaniu byłem na kilku wystąpieniach znajomych osób. Później jednak poszedłem z Marcinem szukać bankomatu w mieście i zjechać dwa razy na zjeżdżalnii Alpine Coaster.

Po powrocie do ośrodka był obiad i wykład gościa – profesora fizyki z Politechniki Wrocławskiej – na temat najważniejszej liczby we wszechświecie. I nie chodzi o to: the answer to life, the universe and everything. Następnie kilka wystąpień wysłuchałem i trochę postanowiłem odpocząć. Wieczorem był czas wolny i wszyscy już byli po swoich wystąpieniach, więc można było się zrelaksować.

Trzeciego dnia konferencji był wyjazd do Liberca w Czechach. Nie było zorganizowanych żadnych przewodników ani innych szczątkowych informacji co właściwie można tam zobaczyć. Najpierw wiec większość wycieczki poszła na rynek. Poniżej zdjęcie ratusza autorstwa Marka.


Na rynku się rozeszliśmy w różne kierunki. Ja szedłem z małą grupką osób, ot tak przed siebie zobaczyć co jest za rogiem. W ten sposób zaszliśmy pod budynek muzeum. Jako że wstęp kosztował tylko 20 koron postanowiliśmy zwiedzić to miejsce. Nie było to żadne tematyczne muzeum tylko takie ogólne, ale w bardzo ładnym budynku. Najbardziej zapamiętałem zbroję w rozmiarze dla dziecka w wieku około 2 lat. Na koniec pamiętna sesja zdjęciowa pod budynkiem. Zdjęcie z aparatu Sylwii.


Później zakupy w miejscowym Tesco i powrót do ośrodka. Wieczorem było zakończenie i podsumowanie konferencji. Wręczono wyróżnienia i nagrody za najlepsze wystąpienia. Wieczorem było ognisko z dużą porcją jedzenia. Tylko gitary trochę brakowało.

Na następny dzień był przewidziany powrót do domu. Ja nie jechałem do samego Wrocławia, a jedynie do Jeleniej Góry, by później jechać do Kamiennej Góry. Na szczęście jedna osoba z konferencji jechała do Krzeszowa (jeszcze za kamienną) więc miałem z kim gadać w tym czasie jeszcze.

Ogółem jestem zadowolony, że wziąłem w tej konferencji udział. Zobaczyłem jak bardzo się różną od siebie konferencje np. Javowe od naukowych. Byłem zaskoczony, że ludzie się interesowali prezentacjami innych uczestników. Dużo rozmawiali po wystąpieniach i w przerwach kawowych. Sam się zainteresowałem kilkoma wystąpieniami i trochę podyskutowałem z autorami. Mimo kilku niedociągnięć uważam konferencję za udaną. Szkoda trochę że kończę już studia, chociaż kto wie co nam życie jeszcze zgotuje.

sobota, 21 sierpnia 2010

Przygotowania do Konferencji Naukowej Studentów

Dzisiaj będzie trochę nietechnicznie. To znaczy nie będę opisywał żadnej technologii tylko opowiem o moich nastrojach przed Konferencja Naukową Studentów (KNS). Ale zacznijmy od początku.

Czym jest ta konferencja? A no jest to konferencja naukowa organizowana przez Politechnikę Wrocławską dla studentów. Zazwyczaj konferencje naukowe są organizowane dla pracowników naukowych (doktorów, profesorów). Piszą oni wcześniej artykuł, który następnie przedstawiają na danej konferencji. Artykuły dotyczą zagadnień nad którymi aktualnie pracują i temat musi jakoś być powiązany z tematem konferencji. Uczestnicy przedstawiają więc swoje osiągnięcia i wymieniają się wiedzą podczas rozmowy w przerwach między wystąpieniami. Ponadto chcąc się wspinać w górę po drabinie kariery naukowej trzeba mieś jakieś tam / ileś tam publikacji naukowych.

Konferencja Naukowa Studentów jest tego typu konferencją, ale przygotowaną dla studentów. Aby ambitniejsi, lub tacy co wybierają się na doktorat, mogli mieć już w swoim dorobku coś co jest liczone jako publikacja naukowa.

W tym roku po raz pierwszy konferencja miała być przygotowana we współpracy z Óbuda University w Budapeszcie. Czyli polscy i węgierscy studenci mieli się wymieniać wiedzą i doświadczeniem. Aby wziąć udział w konferencji należało przygotować artykuł naukowy na 6 stron maks. Była ustalona formatka (czcionka, odstępy itp.) i marginesy były takie duże że nie było ciężko napisać taki artykuł. Jako że konferencja jest międzynarodowa należało przygotować artykuł w języku angielskim. Niby jakaś opłata miała być za udział w konferencji, ale zazwyczaj można sobie załatwić dofinansowanie z uczelni na taki wyjazd. Dla polskich studentów był też przewidziany autobus jadący z Polski na Budapesztu wliczony w cenę konferencji.

Tak wiec widmo niemal darmowej wycieczki na Węgry okazał się bardzo motywujący dla mnie do wzięcia udziału w tej konferencji. Nie zraził mnie angielskojęzyczny charakter konferencji, ani konieczność przygotowania wystąpienia w celu zaprezentowania artykułu. A wystąpienia publiczne mi się jakiś czas temu bardzo spodobały. Uznałem więc, że to będzie kolejne wyzwanie dla mnie.

O czym zrobiłem artykuł? A no opisałem pewien fragment tego co robie w ramach pracy magisterskiej. Wysłałem artykuł do organizatorów w wyznaczonym czasie i czekałem na rozwój sytuacji.

Po jakimś czasie dostałem wiadomość od organizatorów, że zgłoszono 109 artykułów. 102 były z Polski i 7 z Węgier. Komitet organizacyjny podjął wiec decyzję, aby konferencję zrobić w Polsce w Szklarskiej Porębie. Nie jest to to samo co Budapeszt, no ale trudno się mówi. Charakter konferencji ma być jednak zachowany, więc wystąpienie po angielsku dalej jest aktualne. Udało się załatwić dofinansowanie z uczelni aby pojechać na konferencję, więc dobra - jadę.

Konferencja zaczyna się w poniedziałek (23.08.2010). Prezentację już jakiś czas temu przygotowałem. Przykładam dużą wagę do swoich wystąpień publicznych i uważam, że odpowiednio wcześniej przygotowana prezentacja to podstawa sukcesu wystąpienia. Kilkukrotne jej przejrzenie w ciągu kilku dni, już powoli układa odpowiednie zdania w głowie, co należy przy którym slajdzie powiedzieć.

Jako że nie jestem specjalistą z języka angielskiego przygotowałem sobie dokładny tekst wystąpienia. Nie przygotowywałem tego nigdy wcześniej, więc zobaczymy jak to wyjdzie. Planuję mieć przy sobie treść mojego wystąpienia, aby czasem zerkać na kartkę i wygłaszać te trudniejsze zdania. Obok treści dodałem sobie małe obrazki odpowiadające slajdom z mojej prezentacji, abym mógł się szybko odnaleźć. Oczywiście muszę również uważać, aby nie czytać cały czas i aby kartka nie stała się barierą między mną a słuchaczami. Patrząc na rozpiskę konferencji występuję jako pierwszy więc nie będę musiał długo czekać i się dodatkowo stresować :)

Dzisiaj jeszcze wygłosiłem swoją prezentację moim współlokatorom. Dziękuje Ewie i Łukaszowi że chciało się wam mnie słuchać! Wyłapali oni moje potknięcia językowe. Wiem już nad czym muszę popracować. Dodatkowo sprawdziłem czas jaki mi ona zajmuje, gdyż na konferencji jest ograniczenie do 12 minut na prezentacje + 3 minuty na pytania. Spokojnie się mieszczę w czasie i nie powinien go przekroczyć.

Po konferencji napiszę na blogu jak mi poszło pierwsze publiczne wystąpienie w języku angielskim, jak i o samej konferencji.

Przy okazji zachęcam jeszcze do rejestracji na Java Developer’s Day 2010. Do niedzieli obowiązuje jeszcze najniższa cena więc warto się zarejestrować. Ja już to zrobiłem :)

czwartek, 12 sierpnia 2010

Podpisywanie apletu, czyli szybki sposób na aplikację osadzoną w przeglądarce

Dzisiaj opiszę pewną retrospekcję jak mi się przydarzyła jakiś czas temu. Przyszedł do mnie kolega (Kaktus) i się pyta mniej wiecej tak:

Kaktus: Ty Stachu, czy taką zwykłą aplikację okienkową napisaną w Swingu da się przenieść do appletu?
Ja: No da się.
Kaktus: A w takiej zwykłej aplikacji okienkowej da się jakoś prosto połączyć z bazą danych?
Ja: No da się.
Kaktus: No a da się więc z apletu połączyć się bezpośrednio z bazą danych?
Ja: No to to już nie koniecznie... Ale zobaczę co da się zrobić...

Aplety to był taki wynalazek który rozpoczął wielką ekspansję języka Java. Na konferencji SunWorld’95 pokazano przeglądarkę internetową potrafiącą wykonywać kod wewnątrz strony WWW – coś co dzisiaj nazywamy apletem. Potem zaczęto dodawać nowe funkcjonalności do języka Java, co było widoczne w kolejnych wersjach języka. Obecnie aplety nie są masowo wykorzystywane w przemyśle (zostały wyparte przez flash’a i inne podobne technologie). Piszą o nich jednak jeszcze w książkach i wykładają na uczelniach wyższych.

Dlaczego więc piszę o apletach skoro to taki staroć? Bo za pomocą apletu możemy w stosunkowo łatwy sposób (zakładając pewną znajomość języka Java) zrobić aplikację działającą w oknie przeglądarki. Takie aplikacje czasem są wymagane na studiach, a bez porządnego wprowadzenia do framework’ów Javowych ciężko się do tego zabrać. Mamy jeszcze .NET i Visual Studio, który posiada edytor stron HTML typu przeciągnij i upuść (drag and drop). Dzięki takiemu zestawowi można również szybko coś przygotować na przeglądarkę, aby pokazać prowadzącemu na studiach w celu zaliczenia pewnego przedmiotu. Ale ja nie dzisiaj o tym.

Java od początków swojego powstawania była reklamowana jako język bezpieczny i stabilny. Nigdy więcej wycieków pamięci, nigdy więcej sprzątania po sobie i obowiązują twarde restrykcje jak chcemy zrobić coś lepszego. Z tego względu też ograniczenia apletów są bardzo duże. Działają one w piaskownicy o następujących ograniczeniach:

  • nie można pozwalać uruchamiać programów na komputerze
  • nie można komunikować się z innym serwerem niż ten z którego zostały ściągnięte
  • nie można czytać, ani zapisywać plików na komputerze użytkownika
  • nie można zbierać informacji o komputerze użytkownika (poza kilkoma podstawowymi)

Pewien czas się zastanawiałem czy będzie możliwe połączenie z bazą danych z poziomu apletu. Po pewnym czasie mnie oświeciło, jak sobie przypomniałem, że kiedyś widziałem aplet który robił czego „normalnie” nie wolno. Przypomniało mi się wtedy o podpisywaniu apletów.

Wziąłem więc jakiś mój stary projekt (Swing + JDBC + MySQL) i przerobiłem go na szybko na aplet. Pierwsze uruchomienie zgodnie z oczekiwaniami zakończyło się fiaskiem:


java.security.AccessControlException: access denied (java.security.AllPermission )
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at NewJApplet.init(NewJApplet.java:23)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Exception: java.security.AccessControlException: access denied (java.security.AllPermission )

Trzeba więc podpisać aplet. Aby szybko to zrobić w NetBeans’ie należy kliknąć prawym na nazwę projektu i przejść do właściwości.


Następnie na zakładce Web Start zaznaczamy Self-signed. Oznacza to ze aplet będzie podpisany przez nas samych.

Przybudowujemy projekt i uruchamiamy w przeglądarce. Udało się! Dostajemy ostrzeżenie czy aby na pewno chcemy uruchomić aplet:

Klikamy Run i możemy się cieszyć apletem działającym w przeglądarce i łączącym się z bazą danych za pomocą JDBC :)

Przy okazji postanowiłem sprawdzić czy można się połączyć z hostem na innym komputerze niż ten z którego został załadowany aplet. Po jakimś czasie spędzonym na konfigurowanie firewall’i i uprawnień na bazie danych w końcu się udało. Możliwe jest więc wyjście poza piaskownice i poza serwer z którego ładowaliśmy aplet :)

Chciałbym jeszcze poruszyć temat uprawnień. W Javie jest możliwe dodawanie dodatkowych uprawnień niektórym aplikacjom za pomocą plików *.policy. W przypadku apletów nie można zdefiniować takiego pliku, aby był pobierany z serwera i użyty przy uruchomieniu danego apletu. Można jedynie ręcznie edytować na lokalnym komputerze plik java.policy, ale to odradzam.

Na koniec powiem, że przygotowując ten wpis opierałem się na książce core Java 2 Podstawy. Jest w niej również ładnie opisane jak zrobić aplikację która jest równocześnie apletem i aplikacją standalone. Polecam początkującym programistom.

sobota, 31 lipca 2010

Zdałem egzamin DB2 9 Fundamentals

Wczoraj miałem okazje aby podejść do egzaminu DB2 9 Database and Application Fundamentals. Egzamin był przygotowywany przez firmę IBM we współpracy z Politechnika Wrocławską w ramach jakiś tam praktyk studenckich. W samych praktykach nie brałem udziału, ale mogłem podejść do tego egzaminu.
Ogółem wcześniej nie zajmowałem się DB2 i nic nie wiedziałem na temat ich ścieżek egzaminacyjnych. O możliwości robienia certyfikatu dowiedziałem sie od przyjaciółki (dzięki Agata) 5 dni wcześniej. No ale skoro nic nie płace, nic nie tracę więc czemu nie? Zawieszam chwilowo pracę nad projektem zwanym magisterką i biorę sie za DB2.

Dla studentów biorących udział w DB2 Academic Associate Workshop były zorganizowane 2 wykłady i ćwiczenia laboratoryjne. Na ćwiczeniach dostawało się książkę i płytę. W książce były slajdy z wykładów przeplatane ćwiczeniami do wykonania. Na płytce był obraz VMware systemu SUSE z zainstalowaną bazą danych. Co prawda wszystkich ćwiczeń na tym obrazie nie można było wykonać (wersja czegoś tam się nie zgadzała) ale w laboratorium był dostępny właściwy obraz. Zgrałem go sobie na laptopa i mogłem się później w domu bawić. Książkę i płytkę odebrałem we wtorek i miałem do piątku czas aby się przygotować do egzaminu.

Poświęciłem trochę czasu, aby zaznajomić się z książką i zawartymi w niej ćwiczeniami. W większości przypadków wiązało się to z przepisywaniem komend i obserwowaniem rezultatów. Przez niektóre ćwiczenia się szło jak burza, a przez niektóre o trochę wolniej (z powoku konieczności przepisywania długich zapytań SQLowych).

Ciekawostką i nowością dla mnie był typ kolumny przechowujący XML'e i zapytania operujące na nich. Przydało by się lepsze wytłumaczenie co i jak gdyż jest to świeży wynalazek i puki co na studiach jeszcze o tym dokładniej nie uczą. Po za omawianą książką przyglądałem się również przykładowym pytaniom i odpowiedziom. Dało mi to dużą wiedzę i wyjaśniło pewne sprawy.

W piątek był egzamin który zdawała spora ilość studentów podzielonych na kilka tur. Po załatwieniu spraw formalnych w końcu można było przystąpić do egzaminu. Na egzamin było przeznaczone 1,5h i 60 pytań. Było to w formie testu jednokrotnego wyboru i trochę pytań się powtórzyło z tych przykładowych. Ogółem było łatwo i w porównaniu z SCJP egzamin był o 2 rzędy wielkości trudniejszy (ciekaw jestem jakiej skali do wyrażenia trudności można by tu użyć). Na egzaminie z DB2 nie było pytań gdzie w dopowiedziach trzeba wybrać czy wskazany kod jest błędny czy robi cos innego. Na SCJP nie dość że kod może być błędny to jeszcze należy wskazać czy to błąd czasu wykonania czy kompilacji - dlatego m.in. uznałem że SCJP jest o 2 rzędy trudniejszy.

Jako wynik uzyskałem 61.67% przy 60% wymaganych do zdania (dwie błędne odpowiedzi więcej i bym nie zdał). Czy jestem zadowolony z wyniku? Niespecjalnie. Po pierwsze uzyskałem niski wynik (choć biorąc pod uwagę czas który miałem na naukę to fuks że zdałem).  Dużo jest jeszcze do nauczenia jeśli rzeczywiście chciałbym korzystać z tej bazy danych w przyszłości. Po drugie niespecjalnie podoba mi się idea takich masowych egzaminów. Dla studentów początkowych lat studiów może być to fajnie (WOW patrz zdałem certyfikat…). Może to również być nowe doświadczenie taki egzamin i wielki prezent od IBM’a, że zorganizował taki egzamin za darmo. Z drugiej strony taka masówka obniża wartość takiego certyfikatu (bo go ma dużo osób i nie był specjalnie trudny) i nie czyni go takim fajnym, z którego zdania można być dumnym.

Podsumowując będzie kolejny wpis w CV, ale nie był to dla mnie tak ważny (i wartościowy) egzamin jak SCJP. Trzeba teraz trochę odpocząć i wrócić do magisterki.

poniedziałek, 26 lipca 2010

Dekompilacja kodu w J2ME

Kiedyś ściągnąłem pewną aplikację (napisaną w J2ME) na mój telefon i po pewnym czasie użytkowania okazało się, że należy podać do niej kod aktywacyjny (za który oczywiście należy zapłacić). Zastanawiałem się, czy da się jakoś to ominąć i poniżej opiszę rezultaty mojej rozkminki, jak sobie z tym poradzić.

Jak wiadomo kod Javy jest kompilowany do bytecode'u, a ten uruchamiany na wirtualnej maszynie Javy (eng. Java Virtual Machine, JVM). Dzięki temu kompilujemy raz, a uruchamiamy wszędzie (tzn. tam gdzie jest Java Wirtual Machine). Ilustruje to poniższy obrazek:




Skoro kod nie jest kompilowany do natywnego kodu języka danego urządzenia, to możemy skorzystać z tak zwanej wstecznej inżynierii (ang. reverse engineering). Właściwie to każdy plik wykonywalny można zdekompilować, tylko w przypadku aplikacji pisanych nie w Javie, zazwyczaj po dekompilacji mamy odczynienia z kodem asemblerowym, a ten nie należy do przyjemnych w czytaniu. W przypadku Javy mamy trochę lepiej.

W sieci dostępnych jest kilka dekompilatorów kodu Javowego (DJ Java Decompiler  Java Decompiler  Mocha i inne). Ja posłużę się tym pierwszym. Na cele tego artykułu stworzyłem niewielką aplikację, aby pokazać jak skorzystać z możliwości wstecznej dekompilacji. Nie chciałem łamać jakiejś innej aplikacji, aby nie być posądzonym o ingerencje w nią, co pewnie się wiąże z łamaniem prawa. Z własną aplikacją mogę robić co chcę :P

Zacznijmy więc. Na początek należy zawsze uruchomić aplikację i zobaczyć czego szukamy. Jak nie chce nam sie wrzucać jej na telefon, a mamy zainstalowane Java ME platform SDK możemy odpalić ją na komputerze w ten sposób:

<Java ME platform SDK path>\bin\emulator.exe -Xdescriptor:<JAD file path>

Oczywiście należy podać odpowiednie ścieżki, gdzie mamy zainstalowane SDK i gdzie leży nasza aplikacja. W innych SDK (starszych wersjach, lub innych producentów) mogą być graficzne narzędzia umożliwiające odpalenie aplikacji J2ME na komputerze. Poniżej przedstawiam jak wygląda moja aplikacja odpalona na emulatorze:



Po lewej mamy ekran startowy (specjalnie dodałem kilka opcji, aby coś było), a po prawej ekran po wybraniu opcji "Activation". W ekranie tym należy wpisać odpowiedni kod aktywacyjny. To jest miejsce na którym nam zależy i które chcemy złamać.

Odpalamy DJ Java Decompiler. Następnie File -> Open jako typ pliku wybieramy: Java Archive Files(*.jar) i wskazujemy naszego JARa. Ukazuje nam się poniżej okno podobne do poniższego:


Wciskamy Ctrl + A aby zaznaczyć wszystkie klasy i klikamy Decompile. Wskazujemy miejsce docelowe i w pojawiającym sie komunikacie klikamy Yes i po chwili w wybranym folderze otrzymujemy wynik. Plik *.class jest plikiem otrzymanym bezpośrednio przez wypakowanie JARa (gdyz de facto to zwykłe archiwum), a w pliku *.jad mamy zdekompilowany kod. Ciekaw jestem czemu akurat takie rozszerzenie zostało wybrane przez twórców aplikacji, skoro jest ono używane w procesie instalacji aplikacji komórkowych? Można było przecież utworzyć pliki *.java.

No dobra zajrzyjmy do zdekompilowanego pliku. Kod wygląda czytelnie. Porównałem go KDiff3'em z oryginalnym kodem i po za modyfikacją importów, zmianą standardu kodowania, niewielkimi modyfikacjami i dodanymi kilkoma komentarzami kod sie zasadniczo nie różnił. Utworzyłem nowy projekt i wrzuciłem ten "odzyskany" kod i się poprawnie skompilował i poprawnie działa!

Przejdźmy do analizy kodu. Na początku ukazuje nam się konstruktor klasy (część linii pominięto i zachowano oryginalne formatowanie):




Na początku są tworzone obiekty typu Command i widzimy, że to co nas interesuje ("Activation") jest dodawane do List'y. Następnie dodawane jest okCommand i co najważniejsze wywołanie setCommandListener z przekazaniem obiektu this. Oznacza to, że nasza klasa implementuje CommandListener, do którego są kierowane zdarzenia z naszej formatki. Sprawdzamy powyżej:



Rzeczywiście. Przejdźmy więc do metody zdefiniowanej przez ten interfejs:



Na początku jest sprawdzenie czy obiekt command odpowiada naszej liście opcji. Jeśli tak, to sprawdzane jest czy była to komenda okCommand. Jeśli tak to pobierany jest index aktualnie zaznaczonej opcji i coś się dalej dzieje. Jako, że opcja "Activation" byla na 3ciej pozycji w menu (widać to na screenie), to patrzymy co się dzieje pod dwójką ;)



Wywoływana jest jakaś metoda i następnie na wyświetlaczu jest ustawiane do wyświetlenia activationForm. Dowiedzmy się więcej o tym obiekcie. Wróćmy do konstruktora:



Do activationForm dodawane są dwie kontrolki i znów CommandListener ustawiony na this. Wróćmy wiec do metody commandAction() i zjedźmy trochę niżej:



Tak ten warunek to miejsce gdzie trafia wykonanie naszej aplikacji, gdy wciśniemy Ok na activationForm. Zobaczmy co się dzieje poniżej:



Najpierw pobierany jest tekst z kontrolki, która jest odpowiedzialna za wprowadzenie kodu aktywacyjnego. Następnie sprawdzana jest długość pobranego tekstu i gdy jest ona różna od 12 to wywoływana jest metoda showBadActivationCodeMessage(). Sama nazwa juz sugeruje, że nie jest to nic dobrego. Jaki wniosek z tego? Nasz kod aktywacyjny musi mieć 12 znaków długości. Sprawdźmy co się dzieje gdy warunek ten jest spełniony:



Pobierane są kolejno 3ci 8my i 11sty znak z naszego kodu aktywacyjnego. I jeśli odpowiadają one odpowiednio literom 'A', 'B' i 'C' to odnosimy sukces.

Sprawdźmy więc. Odpalamy naszą aplikację na emulatorze (lub telefonie) i wpisujemy np.: xxxAxxxxBxxCx i prosze: Code OK. Złamaliśmy w ten sposób aplikację J2ME.

Jak widać można w prosty sposób podejrzeć kod obecny w aplikacjach J2ME. Jak sie jednak ustrzec przed tego typu ingerencją w oprogramowanie? Właściwie nie można w 100% się ustrzec przed tego typu atakami. Można jedynie utrudnić śmiałkom zadanie.

Najprostszym sposobem ochrony naszego kodu jest stosowanie tzw. obfluskacji (eng. Obfuscation). Polega ona na "upiększaniu kodu", w taki sposób, aby po dekompilacji ciężej było go odczytać. Jest kilka tego typu narzędzi na rynku. Jedno jest dołączone do Netbeansa. Jeśli mamy projekt J2ME utworzony w tym środowisku klikamy prawym przyciskiem myszy na nasz projekt i przechodzimy do Properties. Następnie klikamy na Obfluscating. Tutaj możemy juz sobie ustawić żądany poziom obfluskacji:



Klikamy OK i przebudowujemy nasz projekt. Teraz po wstecznej dekompilacji kod jest mniej czytelny, np.: pole options zmieniło nazwę na a_javax_microedition_lcdui_List_fld, a inne pola skróciły się do jednoliterowych nazw. Jest to trudniejsze w czytaniu, ale narzędzia pozwalające kolorować składnię trochę nam pomagają. Tutaj pokazuję przykład działania na prostym przykładzie i może efekt nie jest powalający. Przy dużych projektach narzędzia takie potrafią namieszać tak, że kod uzyskany za pomocą wstecznej inżynierii nie uda sie ponownie skompilować!!!

Dlaczego tak sie dzieje? Otóż to co jest dozwolone z poziomu kompilatora javy jest również dozwolone w bytecode'dzie. Jednak są pewne elementy bytecode'u, które nie są dozwolone z poziomu składni języka Java. Np. w bytecode'dzie mogą być metody o tej samej nazwie, przyjmujące te same argumenty a zwracające różną wartość! Odpowiednia metoda zostanie wywołana na podstawie typu do którego będzie rezultat przypisywany, lub jeszcze jakiś innych przesłanek. Analiza takiego kodu jest o wiele trudniejsza i bez dobrego refaktoringu nie da się obejść.

Na nasze szczęście (lub nie) klasa rozszerzająca MIDlet możne być poddana tylko częściowej obfluskacji, więc zawsze łatwo będzie nam znaleźć miejsce wejścia do programu:) Również nazwy metod dostarczanych przez javę (np. w klasie String) nie mogą być zmienione, co trochę ułatwia analizę takiego kodu.

Jak jeszcze można się bronić przed wsteczną dekompilacją? W J2ME nie ma mechanizmu ClassLoader'a, więc w ten sposób nie zabezpieczymy naszej aplikacji. Jedyne co po za obfluskacją przychodzi mi do głowy to własna implementacja odpowiednich mechanizmów zabezpieczających.

Poniżej zamieszczam jeszcze spakowany projekt, na podstawie którego prezentowałem zagadnienie. Będziecie mogli się sami pobawić i zobaczyć jak to działa.


PasswordNeed.zip (17KB)

środa, 7 lipca 2010

Wyciąganie informacji o schemacie bazy danych

Znalazłem w końcu trochę czasu, aby coś napisać na bloga. Ostatnio przeprowadzka trochę czasu z życia mi zabrała (koniec mieszkania w akademiku), przez co nie było jak pisać. Przygotowuję obecnie jakieś artykuły na bloga, ale będzie to kilkuczęściowa seria wpisów i chcę poczekać do jej ukończenia. Tymczasem opowiem o wydobywaniu metadanych (czy też metainformacji) z baz danych.

Czym są metadane? Są to "dane o danych". Innymi słowy są to informacje o sposobie przechowywania danych, ich strukturze itp. W przypadku baz danych chodzi tu o schemat bazy danych.

Tylko po co nam schemat bazy danych? Zazwyczaj jak tworzymy jakąś aplikację to bardzo dobrze znamy schemat bazy danych i na nim operujemy. Czasami jednak chcemy napisać narzędzie wspomagające prace z bazą danych, które będzie uniwersalne i działało niezależnie od schematu bazy. Może to być np. narzędzie do automatycznego generowania kodu klas persystętnych, na podstawie schematu bazy danych. O takim rozwiązaniu słyszałem na konferencji 4Developers podczas prezentacji Marka Berkana pt. Automatyczne generowanie kodu. Podobne rozwiązanie jak przedstawiane na prelekcji wykorzystuję obecnie w swoim pewnym projekcie.

Jako przykład bazy danych wykorzystam Oracle 10g XE. Chcąc się dowiedzieć, jakie tabele mamy zdefiniowane w bazie danych możemy wykorzystać następujące zapytanie:



Dostaniemy wówczas wszystkie tabele zdefiniowane przez zalogowanego użytkownika. Tabela USER_OBJECTS zawiera również wiele innych niekoniecznie dla nas ciekawych informacji o naszych tabelach.

Po pewnym czasie używania tego zapytania zauważyłem, że zaczęły pojawiać się w wynikach zapytania tabele o nazwie typu: BIN$m4Gt7PLlTv6r1dCsd2+ddA==$0. Próba uzyskania dostępu do takiej tabeli kończy się błędem ORA-00903: invalid table name. Skąd się więc bierze ta nazwa? A no z mechanizmu odzyskiwania usuniętych tabel. W Oracle mamy możliwość przywrócenia (przypadkiem) usuniętych tabel. Informacje o tych tabelach są również przechowywane w USER_OBJECTS, tylko że pod taką dziwaczną nazwą.

Chcąc się pozbyć usuniętych tabel z naszego zbioru wyników, możemy wykonać drugie zapytanie:



które zwróci nam nazwy tabel usuniętych. Wyniki wystarczy potem odfiltrować. Możemy to również scalić i wykonać w jednym zapytaniu:



Powyższe zapytania operowały na tabelach danego user'a. Chcąc dostać wszystkie tabele (wraz ze specjalnymi / systemowymi - nie wiem jak się je powinno nazwać) należy USER_OBJECTS zamienić na ALL_OBJECTS (lub DBA_OBJECTS) w powyższych zapytaniach. Tabela USER_OBJECTS jest widokiem tabeli ALL_OBJECTS - różni się tylko jedną kolumną.

Przygotowując ten artykuł znalazłem jeszcze inny, prostszy sposób na wydobycie nazw tabel w naszej bazie. Rozwiązanie poniżej:



To zapytanie zwraca tabele danego user'a. W wyniku zapytania nie ma już usuniętych tabel. Tutaj również mamy możliwość wyboru i zamiast USER_TABLES możemy użyć DBA_TABLES lub ALL_TABLES zależnie od naszych potrzeb.

No dobra, wiemy już jakie mamy tabele w bazie, czas na kolumny. O dostępnych kolumnach ich nazwach typach itp. możemy się dowiedzieć za pomocą:



Innym sposobem jest zapytanie:



jednak w tym przypadku nie dostajemy informacji o typie kolumny. Jeśli zależy nam na typie kolumny możemy użyć zapytania:



jednak znów dostaniemy (w gratisie) kolumny z tabel usuniętych. Wynik należało by więc odfiltrować.

Jeśli korzystamy z JDBC w naszej aplikacji mamy jeszcze inną możliwość. Wykonujemy dowolne zapytanie na interesującej nas tabeli (np. SELECT * FROM "NAZWA_TABELI") i otrzymujemy obiekt implementujący interfejs ResultSet. Udostępnia on metodę getMetaData(), która zwraca ResultSetMetaData. Wówczas nazwę kolumny możemy pobrać za pomocą:



Typ kolumny możemy pobrać za pomocą:



Metoda ta zwraca pełną nazwę klasy Javowej na którą może być zrzutowana dana kolumna. Tutaj co ciekawe, to to, że typy liczbowe, niezależnie czy zdefiniowane jako NUMBER(p, s), NUMBER(p), czy NUMBER w bazie Oracle, zawsze są rzutowane do typu java.math.BigDecimal. Jeśli chcemy rzutować do typów prymitywnych, musimy skorzystać z jednego powyższych zapytań i wydobyć dokładną precyzję liczby oraz odpowiednio zrzutować.

To tyle jeśli chodzi o wydobywanie metadanych z bazy Oracle. Jeśli znacie jeszcze inne, prostsze sposoby na wydobywanie informacji o tabelach i kolumnach z bazy danych to zachęcam do komentowania wpisu.

wtorek, 29 czerwca 2010

Nazwano mnie db4o Most Valued Professional

Dzisiaj miałem przyjemny poranek. Przeglądając pocztę natrafiłem na list, w którym napisano:
You have been selected as a
db4o Most Valued Professional (dVP) awardee for the year 2010
Oznacza to, że zostałem okrzyknięty tytułem db4o Most Valued Professional.
Skąd taka nagroda?
A no od dłuższego czasu piszę magisterkę, w której wykorzystuję obiektową bazę danych db4o. Produkt ten zaczynał jako inicjatywa open source i później został przejęty przez firmę Versant (która również posiada własną obiektową bazę danych, tyle że komercyjną). Db4o jest dalej rozwijane jako open source i jest budowana silna społeczność wokół tego projektu. W ramach podziękowania za zaangażowanie w tej społeczności (poprzez aktywność na forum, projekty powiązane z db4o, artykuły, tłumaczenia, blogi, itp.) około 60 osobom został przyznany tytuł: db4o Most Valued Professional. Jest on przyznawany na rok, i potem trzeba go ponowić. Ja dostałem go na 2010 rok.
Po za informacją na stronie dVP Directory 2010 i ewentualnym wpisem w CV przyznanie nagrody wiąże się z otrzymaniem gadżetów od db4o lub gratyfikacji pieniężnej. Czuję się zaszczycony tym wyróżnieniem i postaram się dopieścić aplikację, która przyniosła mi to wyróżnienie, najlepiej jak potrafię. Będę również dalej propagował ideę obiektowej bazy danych db4o.
Na zakończenie podkreślę, że nie wypełniałem żadnych formularzy, aby dostać to wyróżnienie, tylko poinformowałem koordynatora społeczności db4o, o moim projekcie i trochę na forum się udzieliłem. Cieszę się, że zostało to docenione i tym bardziej jest miło zaskoczony z tego.

Javarsovia 2010

Podroż na Javarsovie rozpocząłem w piątek z Wrocławia. Jako ze najważniejszym priorytetem przy wyborze środku transportu była cena, zdecydowałem się na podroż pociągiem, a dokładniej Tanią Linią Kolejową. Na tymczasowym dworcu we Wrocławiu wybrałem kasę, która miała najmniejsza kolejkę. Okazało się to złym wyborem, gdyż osoba przede mną (pan w średnim wieku wraz z pewną kobietą) kupował bilety do Międzyzdrojów na połowę lipca. No i oczywiście zaczęły się problemy z rezerwacją miejsc siedzących, później państwo zdecydowało się kupić kuszetki dla dzieci, ale pojawiła się kwestia, ile dzieci może być w jednej kuszetce, itd... Gdybym był w innej kolejce dawno bym już kupił bilet. Morał na przyszłość - lepiej stanąć za kimś z dużym plecakiem, bo taka osoba na pewno jest zdecydowana gdzie i jak chce jechać. Co do TLK to miałem wcześniej doświadczenia z tą linią i spodziewałem się bezprzedziałowego wagonu z plastikowymi siedzeniami. Trafiłem jednak na klasyczny wagon drugiej klasy, z lepszymi siedzeniami (tj. takimi co nie maja przerwy miedzy oparciem a zagłówkiem).

Na miejsce dojechałem z 1.5h opóźnieniem z powodu zerwania linii wysokiego napięcia gdzieś za Opolem. Pociąg przez to musiał jechać objazdem. Na miejscu czekała na mnie ciocia, która miała mnie przenocować.

Na drugi dzień na miejsce konferencji dojechałem około 9.20. Szybka rejestracja, odebranie torby gadżetów i można było się przejść po dostępnych stanowiskach wystawiających się firm sponsorskich. Do stoiska Oracle'a była długa kolejka, ponieważ rozdawali koszulki, a trzeba było wypełnić formularz z danymi o sobie. Zamiast tracić czas w tej długiej kolejce, poszedłem do sali gdzie było rozpoczęcie. Nie bylem od początku, ale chyba dużo nie straciłem. Co ciekawe, to to że jeszcze kilka dni temu sale w których odbywały się prezentacje, były ponumerowane. Na konferencji były już one ponazywane double, integer, char i boolean, stosownie do swojej wielkości :)

Na pierwszą prelekcje udałem się do największej sali na prezentacje Jakuba Nabrdalika, pt. Jak zapobiegać biodegradacji kodu? Prezentacja zaczęła się trochę wcześniej - gdyż jak tłumaczył autor - zazwyczaj prezentacje się przedłużają. Jakub mówił o dobrych praktykach stosowanych w jego firmie. Namawiał mocno do tego, aby jakość naszego kodu rosła. Podkreślał stosowanie TDD, refaktorkingu naszego jak i czytanego (obcego) kodu itd. Ważna jest tez motywacja zespołu i wmówienie im, że są najlepsi (choć na rożne osobowości rożnie to działa). Nie pamiętam dokładnie wszystkiego, gdyż nie miałem żadnego notatnika ani pustej kartki aby coś zapisać. Pamiętam na pewno ze prezentacja była udana i bardzo śmieszna:-)

Po prezentacji poszedłem do stoiska Oracle'a w celu wypełnienia ankiety i zgarnięcia koszulki. XLek już nie było, więc wziąłem XXLkę. Swoją drogą mogłaby być trochę dłuższa niż szersza. Spóźniłem się przez to lekko na kolejną prezentacje dotyczącą Gradle - od zera do dużego builda, Tomasza Kaczanowskiego. Prelegent pokazywał nam, że Gradle właściwie jest opakowaniem nad Antem, które ma dodatkowo sporo możliwości. Gradle zanim zacznie budowanie aplikacji, tworzy sobie acykliczny graf zależności, po to, aby nie kompilować ponownie tego, co jest aktualne. Dla kodu jest jasne, kiedy jest on aktualny. Funkcjonalność taką zapewniał już make. W przypadku generowania np. dokumentacji, możemy zdefiniować od czego ona zależy, jakie wyjście ona generuje i w ten sposób Gradle będzie śledzić, czy musi generować dokumentacje, czy nie. Ja osobiście nie miałem styczności z bardzo dużymi buildami (w sensie wielu zależności) i nie odczułem bezpośrednio problemów długiego budowania aplikacji, ale jestem jak najbardziej świadom tego problemu. Niestety Gradle nie ma jeszcze wersji 1.0, ale jak się ona pojawi to postaram się jej przyjrzeć. A i jeszcze cenna uwaga: Gradle szybciej buduje duże projekty, nie jest szybki na krótkim dystansie.

Na kolejną prezentację udałem się do sali obok, na Refaktoryzacja kodu testowego Piotra Jagielskiego. Prezentacja przede wszystkim uświadomiła mi, że nie tylko należy dbać o kod produkcyjny, ale także o kod testowy. Będę musiał się dokładniej przyjrzeć mojemu kodu testowemu w moich projektach i zadbać o jego jakość. Na prezentacji było wiele przykładów, jak doprowadzić kod testowy do tego aby był bardziej czytelny. Było przedstawionych wiele dobrych praktyk, choć większość już znalem wcześniej z innych prezentacji. Ale prelekcja i tak udana.

Po prelekcji był czas na obiad. Było parę specjałów do wyboru. Mi bardzo smakowało, jedzenie było cieple (aż mi się gorąco podczas jedzenia robiło) i było go dużo. Po obiedzie był czas na prezentacje nowego produktu firmy Azul Systems Zing. Ja jednak nie bawię się w wirtualizacje rożnych systemów, wiec nie byłem do końca tym zainteresowany.

Udałem się wiec na Projekt Voldemort: gdy relacyjna baza danych to za mało (zbyt wiele?) Tomasza Nurkiewicza. Od pewnego czasu korzystam intensywnie z obiektowej bazy danych db4o i jestem zwolennikiem inicjatywy NoSQL. Relacyjne bazy danych są mocno zakorzenione w biznesie, ale jednocześnie troch już stare (Oracle ma juz ponad 30 lat). W NoSQL chodzi o zwrócenie uwagi na to jest coś więcej, niż tylko relacyjne bazy danych na tym swiecie.

Projekt Voldemort jest swoistą persystentną HashMapą. Dla klucza obiektu, który chcemy zachować w bazie, wyliczany jest hash code i na tej podstawie jest on umieszczany w odpowiednim miejscu. Co ważniejsze, projekt ten od samego początku zakłada duży podział bazy na niezależne węzły. Domyślnie węzeł przechowuje dane których <hash code> % <liczba węzłów> = <numer partycji>. Powoduje to, że aplikacja kliencka na podstawie hash kodu, wie w którym miejscu (partycji bazy) zostanie dany obiekt zapisany. Można też w łatwy sposób zwiększać liczbę węzłów i maszyn, które obsługują dana bazę. Daje to nam niemal liniową skalowalność. Projekt wydal mi się bardzo interesujący, ale okazało się, że pod baza tak właściwie leży jakaś inna baza, np. MySQL, Berkeley DB, czy jeszcze coś innego. Spodziewałem się, że poniżej będzie jakiś wewnętrzny mechanizm ukryty, a tu inna baza danych. Projekt ten wykorzystuje więc dobrodziejstwa bazy umieszczonej poniżej. Cóż dobre i to. Przynajmniej mamy świadomość ze można inaczej.

Projekt Voldemort umożliwia również zwiększenie niezawodności poprzez zapis danych na większej ilości węzłów. Ogółem bazę Voldemort konfiguruje się za pomocą 3 liczb:
  • replication-factor - liczba węzłów na których obiekt ma być zapisywany
  • required-writes - minimalna liczba wezłów, na których powiedzie się zapis bez zgłaszania wyjątku do aplikacji klienckiej
  • required-reads - minimalna liczba węzłów, z których musi być odczytana wartość
Chodzi o to, że w danym czasie węzły mogą być różnie obciążone i nie zawsze przechowywana wartość na wszystkich węzłach jest aktualna. Projekt ten zapewnia jednak przezroczystą (niewidoczną dla klienta) synchronizację wersji, np. podczas pobierania wartości. Synchronizacja nie opiera się na zegarach systemowych (bo serwery mogą być w różnych strefach czasowych), tylko na jakiś innych nowoczesnych mechanizmach. Należy pamiętać, aby required-reads + required-writes > replication-factor (przeinaczyłem wzór, ale już poprawilem, dzięki komentarzowi Tomka Nurkiewicza). Dzięki temu zawsze otrzymamy spójne dane (o ile tego potrzebujemy).

Wszystko ładnie wygląda i na prezentacji było trochę przykładów działania tego produktu. Wiadomo, że nie jest to idealne rozwiązanie do wszystkich przypadków, ale są miejsca gdzie warto je zastosować. Przykładem wykorzystania projektu Voldemort jest strona LinkedIn. Wiadomo, nie cała strona korzysta z tego projektu tylko pewne specyficzne jej elementy.

Kolejna prezentacja na którą się udałem było "Clean Tests" by Uncle Paul, czyli jak pisać testy, żeby dobrze Ci służyły, Pawła Lipińskiego. Początkowo zapowiadało się na jakiś performance. Prelegent był ubrany w szlafrok, ręcznik i miał szczoteczkę do zębów w ustach. Po chwili pozbył się tych artefaktów, choć pod szlafrokiem nie było tego czego można się było spodziewać:) Na początku prezentacji było trochę śmiesznych slajdów, przez co prelegent zdobył sobie zainteresowanie publiki. W dalszej części wystąpienia prelegent opowiadał o najważniejszych praktykach w projekcie, posiłkując się rozdziałami książki "Clean Code" Uncle Paula. Paweł mówił, co robić aby projekt w którym pracujemy nie był nieprzyjemną praca szambonurka. Nie wiem czemu, ale po pewnym czasie się trochę wyłączyłem, ale to mogło wyniknąć z mojego zmęczenia. Na prezentacji (drugi raz w ciągu dnia) była promowana wspomniana już książka. Trzeba rozważyć możliwość zakupu tej książki.

Ostatnia prelekcja na jakiej bylem było wystąpienie Jarosława Pałki pt. Jeden rozmiar nie dla wszystkich, czyli NoSQL w środowisku Java. Prelegent na początku pytał kto nie lubi SQL'a. Zgłosiło się niewiele osób. Świadczy to o wielkim zakorzenieniu się relacyjnych baz danych w biznesie i tego że my programiści przyzwyczailiśmy się do używania SQL'a. Jarosław wspominał, że reprezentuje tą druga stronę mocy (jest managerem zespołu) przez co dużo czyta. Twierdzi on, że my programisci również powinniśmy dużo czytać (nie tylko kod) i poszerzać swoje horyzonty.

Po krótkim wstępie mieliśmy prawo wyboru o czym będzie dalej prezentacja. Można było wybrać o Neo4j, CouchDB i chyba Berkeley DB (de facto produkt kupiony przez Oracle'a). Wybrano tą pierwszą opcje. Neo4j jest przykładem bazy danych stworzonej do przechowywania grafów. Przechowuje ona wierzchołki krawędzie i inne zdefiniowane przez nas informacje skojarzone z tymi elementami. Ogólnie minimalna funkcjonalność jaką zapewnia ta baza danych to przechowywanie grafu i jego przegląd zupełny. Jak chcemy trochę więcej podziałać na tym grafie, to musimy dołączyć dodatkową paczkę, która np. realizuje algorytm Dijkstry. Jest kilka takich niewielkich opcjonalnych paczek dostępnych dla tego projektu i dzięki temu dołączamy tylko to co jest nam potrzebne. Chętnie bym jeszcze o innych tych wynalazkach posłuchał, ale ograniczenia czasowe na to nie pozwolily.

Po tej prezentacji było już tylko zakończenie konferencji, losowanie nagród i zaproszeń na imprezę organizacyjną. Nic, po za kuponami zniżkowymi od wydawnictwa Helion, mi nie przypadło:-(
Podsumowując konferencja i tak mi się podobała. Poruszane tematy były interesujące i godne poświęcenia słonecznej soboty na nie. Brakowało mi może kartki, na której mógłbym zrobić szczegółowe notatki, ale po za tym wszystko ok. Nie żałuje czasu poświęconego na konferencje i w przyszłym roku będę się bardziej starał aby przekonać kogoś znajomego aby jechał ze mną.

P.S. Moja notatka w całości (po za ostateczna korektą) poswstała na telefonie komórkowym. Nie chciało mi się ze sobą laptopa targać, gdzyż zbytnio nie był mi potrzebny. Wiedziałem jednak, że bedę miał trochę czasu wolnego po konferencji wracając do domu, wiec wcześniej przygotowałem sobie aplikacje j2me typu notatnik, który zapisywał mi tego posta na karcie zewnętrznej w moim telefonie. Dzięki temu mogłem to łatwo później na komputerze zgrać, a i pisało się całkiem przyjemnie z racji posiadania dotykowego telefonu z klawiatura qwerty:-) Niestety pisanie bez stosowana polskich znaków spowodowało, że musiałem dużo czasu na korektę poświęcić. Muszę trochę dopracować całość.

piątek, 25 czerwca 2010

Blog Pierwszy wpis

Pierwszy wpis.

Witam wszystkich. Przez długi czas się zbierałem do tego aby zacząć blogować. Wiele myślałem czy jest mi to potrzebne, czy nie zabierze mi to za dużo czasu, czy komuś się to przyda. Zdecydowałem się zacząć pisać, ponieważ powoli kończę studia (muszę tylko magisterkę dokończyć), trzeba znaleźć nowe miejsce zamieszkania, rozejrzeć się za pracą i w ogóle zacząć "prawdziwe" (nie wiem czy to najlepsze określenie, ale mam nadzieję że trafne) życie. Zbliża się koniec mojego beztroskiego życia studenckiego i najwyższy czas zacząć się w pełni samemu utrzymywać.

Przez okres studiów zawsze starałem się pomagać znajomym, kolegom, koleżankom i innym, gdy mieli jakiś problem, a ja znałem rozwiązanie. Lubię tłumaczyć innym pewne zagadnienia, czerpiąc samemu z tego pewną przyjemność (swoista misja dydaktyczna). Działałem intensywnie w kołach naukowych (szczególnie mocno w jednym z nich), a także uczęszczałem na spotkania PWrJUG i WrocJUG. Swoiste budowanie społeczności wokół języka Java, jak i zaangażowanie innych ludzi przygotowujących różne prezentacje, wygłaszając je - właściwie bezinteresownie (bez żadnych profitów) - było bardzo inspirujące. Jako, że jak już wspomniałem czas moich studiów zbliża się ku końcowi, postanowiłem nie przerywać swojej chęci nauczania i dzielenie się wiedzą, tak więc otwieram tego bloga.

Ponadto chciałbym zostawić po sobie jakiś... Wiadomo wszyscy umrzemy, ale dzięki blogowi może ktoś w przyszłości będzie to czytał :) Pewnie za kilkanaście lat już nikt nie będzie używał tych technologi które będę starał się tu opisywać (wiadomo, kiedyś przyjdzie nowsze, lepsze, wyprze stare), ale jak ktoś komuś za karę będzie kazał to robić to moje wpisy się (mam nadzieję) przydadzą.

O czym będzie?

Blog jest (będzie) typowo techniczny. Moje główne kręgi zainteresowania to Java, bazy danych i sprawy z tym związane.

Do kogo jest skierowany?

Blog kieruję do do polskiej społeczności Javowej, tej zaawansowanej jak i mniej. Mam nadzieję że również studenci znajdą coś dla siebie i sowimi wpisami nie jednemu pomogę :)

Jaki język?

Postanawiam pisać po Polsku. Wielu znamienitych bloggerów dowiodło, że można pisać po Polsku i jest im z tym dobrze. Mam tu na myśli Jacka Laskowskiego, Mariusza Lipińskiego (autora polskiego kursu do SCJP http://www.getscjp.pl/) i wielu jeszcze innych, których wpisy czytam regularnie. Niby język angielski jest bardziej przeznaczony dla programistów, ale ktoś kto dobrze zna ten język bez problemu poradzi sobie z anglojęzyczną dokumentacją. Ponadto angielskich tekstów jest znacznie więcej i zawsze można coś znaleźć. Jednak podczas nauki nowych rzeczy warto coś na początek w rodzimym języku poczytać, co będę się starał realizować.

No nic, jutro konferencja Javarsovia na którą się wybieram i pewnie drugi wpis będzie właśnie o tym. Ale mam nadzieję, że typowo programistyczne wpisy będą na blogu przeważały bardziej nad tymi co aktualnie w trawie piszczy.