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

środa, 11 listopada 2009

Początek przygody z Google Web Toolkit

W połowie 2008 roku postanowiliśmy w naszej firmie pisać nowy projekt używając wtedy jeszcze w miarę świeżego frameworku Google Web Toolkit. Poprzedni projekt pisaliśmy używając : Seam framework, Richfaces oraz serwera aplikacji JBoss.

Niestety mieliśmy sporo problemów zwłaszcza z biblioteką Richfaces. Albo nie było w niej dostępnych komponentów które chcieliśmy wykorzystywać, co wiązało się z potrzebą pisania własnych komponentów, albo te które były nie odpowiadały do końca naszym potrzebom. Jeśli ktoś pisał własne komponenty Java Server Faces to wie jak trudno jest napisać porządny komponent zgodny w pełni ze specyfikacją. U nas dodatkowym problemem był fakt że wszystkie komponenty miały być jak najbardziej "dynamiczne" czyli w skrócie Ajax everywhere.

W związku z powyższym zaczęliśmy się rozglądać za lepszym narzędziem do pisania ajaxowych aplikacji, nasz wybór padł na Google Web Toolkit. Dlaczego właśnie ten framework, na pewno podziałała magia giganta i pewność że skoro Google używa tego frameworku w coraz większej ilości swoich aplikacji to nie zostanie on porzucony lecz będzie wspierany przez google oraz społeczność.
Google Web Toolkit ma również tą przewagę nad tradycyjnym podejściem do pisania aplikacji w Javie że pisanie aplikacji webowej wygląda podobnie jak pisanie aplikacji w Swingu. Programista jeśli tylko nie musi tworzyć własnych komponentów, nie musi znać javascript (co niewątpliwie jest największą bolączką aplikacji webowych wykorzystujących ajax), nie musi uczyć się składni plików jsf, jsp, html, wystarczy że odpali eclipse lub jakieś inne ide i może programować.

Kiedy zaczynaliśmy Google Web Toolkit był w wersji 1.5, struktura projektu była niezbyt dobrze przystosowana do aplikacji webowych, teraz na szczęście jest dużo łatwiej, przede wszystkim jest już Google Plugin for Eclipse, który wystarczy zainstalować w eclipse i można w ciągu pięciu minut rozpocząć przygodę z Google Web Toolkit. Dzięki temu pluginowi można również instalować nasze aplikacje GWT bezpośrednio w Google App Engine.

wtorek, 10 listopada 2009

Problemy z eclipse w Ubuntu 9.10

Po upgradzie systemu do wersji 9.10 (który jednak nie przebiegł tak bezproblemowo jak wszystkie dotychczasowe aktualizacje ubuntu) eclipse zachowuję się w dziwny sposób. Mianowicie klikanie w przyciski, w jakimkolwiek okienku dialogowym nie odnosi żadnego skutku. Aby rzeczywiście kliknąć należy użyć skrótu klawiaturowego, co jest oczywiście niezbyt wygodne dla osób które namiętnie korzystają z myszki.

Nie jest to spowodowane bugiem w dystrybucji, w wersji 9.10 zainstalowane jest GTK w wersji 2.18. Zmiana ta nie byłaby widoczna dla użytkowników eclipse gdyby używało ono tej bibliotek w prawidłowy sposób, błąd ten zostanie poprawiony w wersji 3.6 eclipse.

Dopóki jednak nie ukaże się ostateczna wersja eclipse proponuję używać następującego skryptu do uruchomienia eclipse i ominięcia buga :

#!/bin/bash

export GDK_NATIVE_WINDOWS=true
$HOME/dev/eclipse/eclipse

Oczywiście linię $HOME/dev/eclipse/eclipse należy zamienić na ścieżkę do właściwego pliku uruchamiającego eclipse.

piątek, 6 listopada 2009

Zestaw świetnych ikon do wykorzystania w projektach internetowych

Kiedyś poszukiwałem zestawu ikon które mógłbym wykorzystywać w moich aplikacjach webowych. Odkąd znalazłem Silk icons używam ich w praktycznie każdym nowym projekcie, niestety twórca postanowił nie rozwijać dalej tego zbioru, wielka szkoda ponieważ oprócz ikon stworzył również piękny zestaw flag.

Niestety od czasu powstania tego zbioru sporo czasu upłynęło a w IT czas szybko płynie i zbiór ten nie jest już wystarczający. Na szczęście zbiór Silk icons jest na tyle popularny, że powstał zbiór dodatkowych ikon a jest ich ponad 460 i są dostępne tutaj

środa, 4 listopada 2009

SyntaxHighlighter w blogerze

Blogger niestety nie ma w standardzie opcji kolorowania składni różnych języków programowania. Jedną z najbardziej znanych bibliotek do kolorowania składni jest SyntaxHighlighter.
Aby skonfigurować bloggera należy :
  1. Przejść do edycji szablonu html bloggera.
  2. Tuż przed tagiem </head> dodaj następujący kod :
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/> 
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPlain.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'/> 
<script language='javascript'> 
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.config.clipboardSwf='http://alexgorbatchev.com/pub/sh/current/scripts/clipboard.swf';
SyntaxHighlighter.all();

Dzięki tym dwóm prostym krokom SyntaxHiglighter jest zainstalowany. Aby tekst był kolorowany należy umieścić go między tagami <pre></pre> z odpowiednią klasą która zależna jest od typu kodu który chcemy pokolorować.

Np. kolorowanie pliku javy wymaga dodania klasy brush: java :

<pre class="brush: java">
package com.foo.server.guice;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloWorld extends HttpServlet {

private static final long serialVersionUID = 5702245225774030773L;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getWriter().println("Hello world");
super.doGet(req, resp);
}

}
</pre>

Rezultat :
package com.foo.server.guice;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloWorld extends HttpServlet {

 private static final long serialVersionUID = 5702245225774030773L;

 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException, IOException {
  resp.getWriter().println("Hello world");
  super.doGet(req, resp);
 }

}

Do wklejania kodu do bloggera można skorzystać z HTML Encoder

Ja dodałem jeszcze tuż przed linią kończącą definicję css skórki czyli ]]></b:skin>
następujący wpis
.overflow-auto {
 overflow: auto;
} 

oraz skonfigurowałem domyślne ustawienia SyntaxHighlighter'a aby dodawał tą klasę automatycznie.
SyntaxHighlighter.defaults['class-name'] = 'overflow-auto';
SyntaxHighlighter.all();
Dzięki temu jeśli kolorowana zawartość nie mieści się w szerokości kolumny (pomimo ustawienia wrap-lines na true), można zawartość przewijać suwakami.