piątek, 26 lutego 2010

Jboss 6.0 M2

Pojawiła się druga odsłona kolejnej wersji jboss'a. Co nowego niesie ze sobą. W skrócie servlet 3.0, Jpa 2 oraz resteasy. W sumie mi do pełni szczęścia brakuje jeszcze ejb3.1 w szczególności adnotacji @Singleton na enterprise beans.

Dzięki obsłudze servlet 3.0 oraz cdi (którego implementacja znalazła się w M1) zdecydowałem zrezygnować z google-guice w moim projekcie. Guice wykorzystuje głównie bioblioteka gwt-dispatch. Z racji tego że nie lubię korzystać ze zbyt wielu bibliotek zewnętrznych (utrudnia to maintenance) a guice był wymuszony poprzez gwt-dispatch postanowiłem napisać podobne rozwiązanie do gwt-dispatch tylko bazujące na servlet 3.0 oraz CDI. Jak będzie skończone zapewne coś o tym napisze.

Teraz natomiast chciałem napisać o czymś innym. Mianowicie zaraz po ściągnięciu i uruchomieniu M2, jboss wstał w czasie nie przekraczającym 30 sekund. Na moim sprzęcie "czysty" jboss jeszcze nigdy tak szybko nie wstawał. Pomyślałem więc że po zainstalowaniu mojej aplikacji również doświadczę przyspieszonego startu. Jakież było moje zdziwienie kiedy po deployu czas ten wydłużył się do circa 2 minut 40 sekund. Nie muszę wspominać że tak długo żaden jboss z moją aplikacją mi nie wstawał.

Problem tkwił właśnie w servlet 3.0, otóż mój ear zawiera a jakże war'a a ten w WEB-INF/lib zawiera sporo jarów. Podczas startu jboss skanuje wszystkie te jary i sprawdza czy nie ma w nich adnotacji charakterystycznych dla servlet 3.0. I to właśnie zabiera mu trochę czasu.

Teraz jeszcze nie używam servlet 3.0 więc interesuje mnie całkowite wyłaczenie skanowania w war. Aby to zrobić należy w katalogu WEB-INF umieścić plik jboss-scannning.xml o następującej treści :

<scanning xmlns="urn:jboss:scanning:1.0">
 <!-- Purpose:  Disable scanning for annotations in contained deployment. -->
 </scanning>


Oczywiście można w pełni kontrolować proces skanowania. Na razie ja wyłączam go całkowicie.

Pełny opis struktury tego pliku jest dostępny na stronach wiki jboss'a

środa, 3 lutego 2010

NKTalk - chyba trochę przesadzili

Kiedyś czytałem jakiś artykuł w blogosferze w którym przedstawiciel firmy będącej brokerem reklamowym narzekał na brak api w naszej klasie, podobnego w funkcjonalności do api facebook'a.

Brak tego api komplikuje przeprowadzanie ciekawszych niż li tylko banery lub konkurs akcji reklamowych. Można się spierać czy to dobrze czy źle. Ja tam za tym nie tęsknię. Jednakże jedno zdanie z wypowiedzi tego faceta zapamiętałem, mianowicie że Panowie z n-k czasami zachowują się jak założyciele google i uważają swoją firmę za polskiego google. Pomyślałem sobie, że pewnie trochę w tym przesady ale jak w każdej plotce jest może źdźbło prawdy.

Tyle tytułem wstępu a teraz do rzeczy. Niedawno aktywowałem z czystej ciekawości na swoim profilu w n-k ich odpowiedź na google talk, gg i inne tego typu usługi. Jakież było moje zdziwienie kiedy po aktywowaniu nktalk na dole pojawił się pasek z informacją :
Twoja przeglądarka nie obsługuje NKtalka ...
Nie byłoby w tym nic dziwnego, używam google chrome więc spodziewałem się że mogą być problemy. Zdziwiła mnie natomiast treść komunikatu.
Czyli co mam czekać aż google wyda poprawkę umożliwiającą obsługę nktalka ? Już zapewne w Mountain View powołali zespół który dniami i nocami pracuje nad obsługą nktalk naszej klasy.

Mało obeznany użytkownik mógłby dojść do wniosku że używa złej, przestarzałej przeglądarki. Że wina tego leży po stronie jego przeglądarki a nie tego że n-k po prostu olała silnik webkit i dlatego wyrzuca taki komunikat, którego treść można błędnie zinterpretować.

Ja doskonale rozumiem że nie sposób napisać aplikację webową na wszystkie przeglądarki dostępne na rynku ale to nie znaczy że jeśli moja aplikacja na jakiejś przeglądarce nie chodzi to znaczy że winna jest za to przeglądarka, winny takiemu stanu rzeczy jestem ja, programista i twórca aplikacji który świadomie wybrał takie a nie inne przeglądarki.

To tak jakby starać się uruchomić program z windows na linuksie i podczas próby uruchomienia program rzucałby komunikatem
Twój system operacyjny nie wspiera programu X
Czy nie wygląda to durnie ?
A nie prościej po prostu i zgodnie z prawdą napisać
NKTalk nie wspiera Twojej przeglądarki
Ale jak mniemam maczali w tym palce jacyś spece od marketingu (socjotechniki czy czego tam jeszcze), którzy uznali że tak brzmi wizerunkowo lepiej. A może to tylko zwykłe przeoczenie, literówka, czeski błąd ale mnie jakoś to razi.

wtorek, 1 grudnia 2009

Problem z mc w Ubuntu 9.10

Po aktualizacji zauwyżałem że mam problem z rozpakowywaniem archiwów zip, jar w midnight commander. Zamiast podglądu zawartości archiwum wyświetlana jest pusta wartość.

Po krótkim googlaniu znalazłem rozwiązanie.
Wystarczy w pliku /usr/share/mc/extfs/uzip zmienić wartość zmiennej $op_has_zipinfo z 0 na 1.

wtorek, 24 listopada 2009

Szybkie prototypowanie interfejsu użytkownika w przeglądarce

Ostatnio chciałem stworzyć szybko prototyp interfejsu użytkownika nowej aplikacji. Na początku przypomniałem sobie że kiedyś zainstalowałem na moim ubuntu aplikację do grafiki wektorowej Inkscape. Jednakże po półgodzinnej zabawie doszedłem do wniosku że potrzebuję prostszego narzędzia. Zapewne Inkscape przydałby się gdybym miał większe umiejętności graficzne oraz częściej potrzebował tworzyć podobne dokumenty.

Postanowiłem znaleźć jakiegoś innego narzędzia. I po krótkim wyszukiwaniu w sieci znalazłem wreszcie program który potrzebowałem, w zasadzie jest to dodatek do Firefoxa, nazywa się Pencil i jest dostępny tutaj. Obsługa tego dodatku jest trywialna, dokumenty można zapisywać w formacie xml lub jako plik png. Posiada przydatny zbiór kształtów. Brakuje może jeszcze drzewka. Ale nie można przecież mieć wszystkiego za darmo w dodatku do ściągnięcia i zainstalowania w 5 sekund.

czwartek, 19 listopada 2009

Zależności między aplikacjami jboss

Co zrobić jeśli nasze aplikacje są zależne jedna od drugiej, np. chcielibyśmy aby jedna aplikacja została deployowana dopiero kiedy zdeployowana jest inna.

Oczywiście można bawić się w zmianę w configach jboss'a, ale zamiast tego proponuję stworzyć w katalogu deploy, katalog o nazwie deploy.last i tam wrzucić aplikację która ma zostać zdeployowana jako ostatnia.

Proste a cieszy.

piątek, 13 listopada 2009

GWT i Firefox 3.5 - problem z user agent

Czasami zdarza się, że nad jakimś problemem siedzimy dosyć długo a rozwiązanie jego jest wyjątkowe proste. Niestety dzisiaj kolejny raz przytrafiła mi się przykra niespodzianka.

Jednym ze sposobów przyspieszenia kompilacji projektu GWT jest obniżenie ilości permutacji. Można to osiągnąć poprzez kompilowanie kodu tylko dla wybranych przeglądarek (w idealnym świecie dla jednej) oraz kompilowanie tylko dla jednego języka.
Mój plik modułu dotychczas wyglądał tak :
<set-property name="user.agent" value="gecko,safari">
<!-- 
 <extend-property name="locale" values="pl" />
--> 

Czyli kompilowałem tylko dla domyślnego języka, natomiast wynik kompilacji chciałem oglądać w Google Chrome. Oczywiście większość osób używa Firefoksa i zapewne wystarczy im ustawić user.agent na gecko, (dzięki temu osiągną ilość permutacji równą 1). Ja na co dzień używam Chrome i dlatego dodatkowa permutacja mi nie przeszkodziła. Wartość gecko musiałem zostawić gdyż na linuksie w hosted mode odpalany jest jakaś archaiczna Mozilla. Z Hosted Mode oczywiście nie chciałem zrezygnować. Dzięki temu mogłem pracować w hosted mode a wyniki kompilacji oglądać zarówno w Chrome jak i Firefox.

Tak było do dzisiaj, wprowadzałem ostatnio sporo zmian do systemu (przejście między innymi na mvp oraz użycie gin) i chciałem po kompilacji zobaczyć jak aplikacja pracuje w Firefoksie, niestety aplikacja nie ładowała się.  Na początku oczywiście zacząłem dociekać czy żadna z wprowadzonych ostatnio zmian nie ma wpływu na taki stan rzeczy. Najdziwniejsze natomiast było to że w hosted mode działała poprawnie, podobnie w Chrome a tylko w Firefoxie nie działała. Odpaliłem więc Firebuga i znalazłem w zakładce sieć informacje że Firefoks próbuje ściągnąć plik z servera z końcówką unknown, wtedy było jasne że nie może ściągnąc pliku *****.cache.html, ba dla tego user agenta nie ma takiego pliku skompilowanego.
Zajrzałem więc do UserAgent.gwt.xml w źródłach gwt i okazało się że dla silnika gecko są dwa ustawienia gecko i gecko1_8. Wystarczyło że dodałem w konfiguracji mojego modułu gecko1_8 i mogłem zobaczyć działanie aplikacji w Firefoksie.

A dlaczego te wszystkie kłopoty otóż podczas aktualizacji Ubuntu do wersji 9.10 (Karmic Koala) aktualizowany jest również Firefox do wersji 3.5. A on działa na silniku gecko 1.9.1 w związku z tym dlatego należy ustawić gecko1_8 bo oznacza on wszystkie silniki od silnika gecko 1.8 wzwyż.

Teraz jak sprawdziłem jak działa pod Firefoksem wróciłem do ustawień user.agent=gecko,safari i cieszę się tylko dwoma permutacjami. Pozostaje tylko czekać na gwt w wersji 2.0 w której to zaimplementowano Out of Process Hosted Mode i nie będę musiał nawet kompilować do gecko aby używać hosted mode.

czwartek, 12 listopada 2009

Google Web Toolkit - wzorce projektowe, biblioteki komponentów

Zaczynając pracę nad nowym projektem warto zastanowić się na samym początku jakie wzorce projektowe będziemy wykorzystywać w tymże projekcie oraz jakich użyjemy zewnętrznych biobliotek. Kiedy zacząłem pisać aplikacje w GWT, po przyjrzeniu się komponentom które są dostarczane wraz z toolkitem doszedłem do wniosku że aby osiągnąć cel który sobie postawiliśmy, musielibyśmy sporo komponentów bądź używając terminologii GWT widgetów napisać sami.
Nie mieliśmy na to ani czasu ani potrzebnych zasobów zarówno osobowych jak i finansowych (ja sam natomiast miałem już dość pisania w javascript, kiedy to w poprzednim projekcie musieliśmy sporo komponentów jsf napisać sami) w związku z tym postanowiliśmy poszukać gotowej biblioteki komponentów. Wtedy wybór był tylko pomiędzy czystym GWT, widgetami z GWT IncubatorGWT Ext oraz Ext GWT.

Te dwie ostatnie wydają się być do siebie bardzo zbliżone. I tak rzeczywiście jest przynajmniej jeśli chodzi o wygląd GUI. Również nazwa tych bibliotek jest zbliżona. Otóż GWT Ext bazuje na bibliotece Ext JS, jest ona w zasadzie wrapperem tej bioblioteki, nie jest to zgodne w pełni ze specyfikacją GWT. Kod javascript jest w zewnętrznych plikach js. Jednakże takie podejście umożliwiło bardzo szybko zbudować potężny zbiór komponentów. Z kolei Ext GWT jest produktem firmowanym przez producenta biblioteki Ext JS, jednakże w odróżnieniu od GWT Ext jest to biblioteka natywnych komponentów GWT. Z Ext JS łączy ją podobny interfejs użytkownika oraz funkcjonalność komponentów.

Niestety ilość dostępnych komponentów nie jest tak duża jak w przypadku Ext JS, co jest zrozumiałe, programiści musieli napisać każdy komponent praktycznie od zera, wzorując się na funkcjonalności i wyglądzie Ext JS, które powstaje już od dobrych paru lat i trochę chyba jeszcze wody w Wiśle upłynie zanim Ext GWT osiągnie funkcjonalność Ext JS.
Producent Ext JS decydując się na rozpoczęcie prac nad własnymi komponetami GWT zmienił licencję Ext JS, uniemożliwiając praktycznie dalszy rozwój GWT Ext, w chwili obecnej bazuje on na wersji 2.0.2 Ext JS, a ostatni opublikowana wersja pochodzi z grudnia 2008 roku.
Z powodu zmiany licencji twórca GWT Ext rozpoczął prace nad Smart GWT, która opiera się na bibliotece javascript Smart Client.

My wybierając bibliotekę mieliśmy wybór między GWT IncubatorGWT Ext oraz Ext GWTSmart GWT jeszcze wtedy nie było dostępne. Wybór padł więc Ext GWT głównie ze względu na przekonanie że firma która wyprodukowała tak świetny produkt jak Ext JS, również z Ext GWT nas nie zawiedzie. Drugim powodem był fakt że rozwój GWT Ext został wstrzymany, ze względu na zmianę licencji Ext JS.

W chwili obecnej nie mamy możliwości zmiany biblioteki, prace są zbyt zaawansowane jednakże gdybym stanął przed ponownym wyborem przyjrzałbym się bliżej Smart GWT.

Główne zarzuty do Ext GWT to :
  • brak wsparcia dla wzorca Model-View-Presenter, (głównie w postaci wprowadzenia własnego wzorca Model-View-Controller, Dispatchera oraz braku implementacji podstawowych interfejsów np. HasValue, HasClickHandlers etc)
  • słaba dokumentacja zwłaszcza uparcie forsowanego rozwiązania MVC
Plusy natomiast to :
  • dwa rodzaje licencji GPL i komercyjna
  • natywne widgety GWT, brak zależności od zewnętrznych blibliotek javascript
  • niewygórowana cena
  • stabilne działanie
  • bardzo dobre wsparcie
  • obecne komponenty są stabilne i bardzo seksi
Ostatni argument wydaje się być śmieszny ale żyjemy w takich czasach kiedy sprzedaje się produkt który nie tylko ma funkcjonalność spełniającą nasze oczekiwania ale również wygląda nowocześnie i elegancko. W tym względzie w moim subiektywnym odczuciu Ext GWT nadal ma dużą przewagą nad Smart GWT.

Jak widać w minusach wymieniłem głównie kłopoty z MVC, przynajmniej w naszym projekcie który jest złożony z wielu modułów, model mvc nie sprawdza się zbyt dobrze. Dlatego szukaliśmy jakiegoś lepszego wzorca programowania i oczywiście z pomocą przyszło google, które na tegorocznej konferencji Google I/O przedstawiło wzorzec Model-View-Presenter który postanowiliśmy wdrożyć w naszej aplikacji. Dla zainteresowanych bardzo ciekawy film prezentujący MVP