pt>

środa, 2 kwietnia 2014

Powracam do blogowania :) długa przerwa i dużo się wydarzyło, przygoda z .NET, fascynacja konstrukcjami językowymi dostępnymi w C# a teraz JDK8! Ale ale, wszystko po kolei - najpierw zaległe spotkanie Jinkubatora, na którym opowiadałem o Eclipse. Spotkanie składało się z dwóch części, każda z nich prowadzona przez innego prelegenta. Pierwszą część prowadził Jakub Kubryński (mam nadzieję że dobrze podlinkowałem ;) ) i opowiadał o Idei, jak IDE pomaga programować :

prezentacja Kuby


Bardzo ciekawa prelekcja, stawiająca poprzeczkę bardzo wysoko :) Przyznam że mimo że jestem fanem Eclipse to jestem pod mocnym wrażeniem możliwości Idei - w paru miejscach jest po prostu lepsza. Pierwsza część prowadzona przez Kubę była naprawdę ciekawa i miałem pewne obawy czy zdołam równie ciekawie opowiedzieć o Eclipse. Mam odczucie że się udało, zresztą, oceńcie sami :


Wiele osób pewnie poczuło się rozczarowanych gdy na wstępie powiedziałem że to Idea jest lepsza - cóż, powiedziałem jak jest. Jak by Eclipse był lepszy - nikt by nie chciał płacić niemałych pieniążków za Ideę ;) Cóż - powiedziałem jak jest ;) Nie oznacza to że Eclipse jest kiepski! Co to to to nie! W Eclipse można również przyjemnie programować, co więcej, "goły" eclipse ma już na tyle dużo pomocy że.... większość programistów i tak z nich nie korzysta... ale warto zacząć - choćby sniplety - czyli szablony kodu, warto zacząć definiować własne. Warto używać skrótów i dopasować je do własnych potrzeb lub konwencji panującej w zespole, przypisać skróty do funkcji które nie mają domyślnie przypisanych skrótów - te dwa elementy to w zasadzie klucz do sprawnego tworzenia kodu.
Ops! Rozpisałem się, a miało być krótko. Mam nadzieję że nie zniechęciłem was do obejrzenia prezentacji. Do zobaczenia w krótce!

niedziela, 22 kwietnia 2012

SQLite i szyfrowanie kolumn, pomaga MyBatis i Jasypt

    Niedawno, pisząc wieczorami dla siebie aplikacje w .NET natrafiłem na bardzo przyjemną i lekką bazę danych - SQLite. Tak mi się ta baza spodobała, że postanowiłem sprawdzić czy z poziomu Javy i JDBC uda się do niej dostać. SQLite ma jednak jedną wadę - brak szyfrowania i zabezpieczenia hasłem. Baza SQLite mieści się w jednym pliku, który nie jest w jakikolwiek sposób zabezpieczony. Jako że na codzień pracuję w firmie tworzącej oprogramowanie dla banków i policji brak szyfrowania jest dość poważną wadą nawet w bardzo prostych narzędziach jak program do fakturowania.
    Z jakiego powodu potrzebne jest szyfrowanie samych danych? Wiadomo że błędem w sztuce jest trzymanie haseł w bazie danych - co najwyżej można trzymać posolone hashe. Zaszyfrowanie całej bazy danych (pliku sqlite) również nie wydaje się być dobrym pomysłem z powodów wydajnościowych. Dlatego należy rozpatrzyć szyfrowanie poszczególnych kolumn z danymi wrażliwymi. Jako przykład podam program do faktur gdzie są dane naszych kontrahentów. Co jeśli konkurencja przekupi naszego pracownika by zgrał na dysk USB plik z bazą naszych klientów? Ten problem dotyczy wszelkich aplikacji typu standalone, gdzie przetwarzane są wrażliwe dane. Częściowo ten problem jest rozwiązany w aplikacjach typu klient-serwer lecz nie zawsze jest sens stawiania takiej infrastruktury.

środa, 11 kwietnia 2012

O LambdaJ i Guavie i mojej prelekcji na JUG

    Witam pod dłuższej przerwie. Dzisiejszy wpis będzie trochę inny niż pozostałe, dlatego iż nie będzie typowo technicznym wpisem. Przez ostatnie tygodnie, "po godzinach" przygotowywałem się do prelekcji którą wygłosiłem 03.04.2012. Dzięki mojemu osobistemu fotografowi, Annie Mazińskiej, mogę pokazać również parę zdjęć :)


poniedziałek, 20 lutego 2012

Dynamiczne tworzenie obiektów w GWT + MVP4G

    GWT jest dość udanym produktem, jednak ma swoje ograniczenia - głównie w dziedzinie refleksji. Najbardziej przydatną cechą jest tworzenie nowych obiektów oraz wnioskowanie typów obiektów. O ile w stosunku do drugiego problemu sprawę, w większości przypadków, rozwiązuje java generics to rozwiązanie pierwszego problemu za pomocą GWT.create(<class literal>) jest mocno ogranczone. Szczególnie bolesny staje się ten problem w aplikacjach gdzie część obiektów jest tworzonych z łańcuchów znaków - np pochodzących z formularzy które są generowane na podstawie klasy obiektów. Prosty scenariusz przewiduje iż chcemy wyświetlić w tabeli obiekty z bazy danych - tu z pomocą przychodzi MyBatis umożliwiający  mapowanie rekordów na obiekty, ale pojawia się wymaganie wprowadzania nowych rekordów przez generowaną formatkę (nikomu nie będzie się chciało pisać 50 formularzy dla każdej klasy osobno - nie uwierzę!). Formatka zawiera etykietowane pola/comboboxy/slidery - jednak zwracać potrafi tylko zestawy typów prymitywnych. Dla ułatwienia formatka zwraca jedynie tablicę stringów, by nowy "rekord" umieścić w tabelce (CellTable jest parametryzowana typem i wymaga obiektów) musimy uzyskać obiekt. Wiemy jakiej klasy chcemy mieć owy obiekt - pierwszą myślą jest stworzenie nowego obiektu za pomocą konstruktora bezparametrowego a następnie ustalenie pól tego  obiektu. Naturalnym rozwiązaniem wydaje się zastosowanie GWT.create( class clazz) - tu czeka nas niemiła niespodzianka - metoda ta przyjuje jedynie literały klas. Nie zadziała w momencie gdy parametrem jest obiekt Class<T>! Krótkie poszukiwania naprowadziły mnie na trop dwóch bibliotek GWT Reflection oraz GWT ENT. Pierwszy projekt niestety już od dłuższego czasu nie jest rozwijany, drugi wydawał się rokować większe nadzieje - niestety w połączeniu z GWT 2.4 owa biblioteka powoduje błędy, rozwiązaniem okazało się wrócenie do GWT wersji 2.2 - kompletnie nieakceptowalne rozwiązanie! Kolejne poszukiwania doprowadziły mnie do wniosku że trzeba samodzielnie wygenerować klasę fabrykującą obiekty, na rozwiązanie naprowadził mnie temat na stackOverflow oraz jednego z jugowiczów (dzięki Michał!).
    Plan działania jest stosunkowo prosty. Należy oznaczyć klasy, których obiekty mają być tworzone za pomocą interfejsu, który dosłownie nic nie robi, służy jedynie jako znacznik. Następnie należy stworzyć interfejs z jedyną metodą - instantiate(Class<T> clazz) i napisać klasę-generator, która będzie generowała klasę implementującą ten interfejs. Na koniec należy zmodyfikować deskryptor projektu *.gwt.xml. Tyle teorii - pora na częśćpraktyczną.

czwartek, 9 lutego 2012

GUAVA - integrujemy z GWT i MVP4G

    W poprzednim poście przedstawiłem sposób na szybkie i efektywne tworzenie aplikacji webowych dzięki tandemowi GWT i MVP4G. Jednak arsenał wspomagający jest o wiele większy. Kolejną rzeczą, którą chętnie by widział developer są generyczne operacje na kolekcjach. Parę miesięcy temu miałem okazję skorzystać z LambdaJ przy okazji poprzedniego projektu, chciałem skorzystać z tej biblioteki dla celów obecnego projektu opartego właśnie na GWT i MVP4G (oraz MyBatis). Niestety, spotkało mnie przykre rozczarowanie - LambaJ korzysta z aop'a i refleksji, co skutecznie uniemożliwia współpracę z GWT - na co również wskazuje  JRE Emulation Reference. Jakakolwiek próba użycia LambdaJ kończyła się wyjątkami. To zachęciło mnie to do zapoznania się z niejako zamiennikiem dla LambdaJ - z bibliotekami Google GUAVA.

środa, 1 lutego 2012

GWT + MVP4G - wzorzec w praktyce

    Dzisiejszy wpis, mój pierwszy na blogu, nie będzie dotyczył niczego dziwnego. Będzie niejako przygotowaniem dla kolejnego wpisu. Zaprezentuję połączenie GWT oraz frameworku MVP4G co samo w sobie nie jest niczym niezwykłym, aczkolwiek jest to konfiguracja bardzo owocna. 
Dlaczego warto łączyć GWT z innymi frameworkami? Otóż surowe GWT nie ułatwia szybkiego tworzenia większych aplikacji. Sami twórcy GWT polecają stosowanie wzorca MVP (Model View Presenter), jednak nie dostarczają implementacji, gdyż to co jest proponowane w oficjalnym tutorialu dla GWT woła o pomstę do Nieba! Wystarczy spojrzeć na hierarchię klas :