Author Archives: Piotr Ostrowski - Page 2

Eclipse Juno – nowa jakość IDE?

eclipse-juno-icon

Od poprzedniego wydania popularnego środowiska IDE, jakim jest Eclipse, minął trochę ponad rok. Eclipse Indigo (3.7) nie wprowadził jednak rewolucji, bo większość zmian od poprzedniej wersji to były poprawki błędów i aktualizacje modułów. Nieco lepiej działała „podpowiadaczka” (ctrl+space) i kilka innych drobiazgów, ale mimo wszystko nie odczułem jakiś większych różnic po przesiadce z Helios‚a (3.6). A jak jest tym razem?

Juno (a dokładniej 3 Juno lub Junona) – taką nazwę nosi jedna z planetoid krążących między Marsem a Jowiszem. Taką samą nazwę przyjął również nowy Eclipse. Co różni go od poprzednika? Przede wszystkim platforma. Juno oparty jest o platformę Eclipse 4.x rozwijaną już od dłuższego czasu, a obecnie noszącą numer 4.2. Ze zmian widocznych na pierwszy rzut oka przynosi ona przede wszystkim nowy, odmieniony wygląd, ale przede wszystkim zawiera szereg usprawnień, jak chociażby uniwersalną wyszukiwarkę, odłączane edytory, czy znacznie większe możliwości personalizacji poszczególnych elementów widoku.

Zmian jest jednak więcej. Jedną z ciekawszych jest nowy mechanizm Code Recommenders rozbudowujący możliwości „podpowiadaczki”. Gdy potrzebujemy jakiejś podpowiedzi, IDE sięga do bazy zawierającej najczęściej używane elementy i podpowiada nam np. sugerowane nazwy metod podając przy tym procent używalności danej metody. Oczywiście mechanizm zawiera algorytmy uczenia się, dzięki czemu powinien dostosować się do naszych nawyków i potrzeb.

Wygląda więc na to, że nowy Eclipse wprowadza nieco więcej zmian względem poprzedniej wersji, niż jego poprzednicy. Na ile okażą się przydatne, okaże się w praktyce. Mimo wszystko zawsze warto utrzymywać najnowszą wersję oprogramowania, więc zachęcam do pobierania.

Przesyłanie daty w serwisach REST (Jersey)

Error 400 Bad Request… tak potraktował mnie dziś mój rest‚owy serwis, gdy próbowałem przekazać mu parametr z datą. Próby przekazywania daty w różnych formatach na nic się nie zdały, serwis dalej zbywał mnie brzydką odpowiedzią. A wyglądał on mniej więcej tak:

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_XML)
public Response action(@FormParam("date") Date date) {
  ...
}

W rzeczywistości ma jeszcze kilka innych parametrów, ale one przechodziły bez problemu. Co ciekawe, różne źródła w internecie mówią, że „u nich działa”. Szukamy zatem przyczyny problemu.

Czytaj więcej »

Pobieranie plików z nazwami bez krzaków

Ostatnio w pracy toczę boje z serwisami REST i przy okazji tworzenia serwisu do upload‚u i download‚u plików natrafiłem na ciekawy, dawno temu utworzony przeze mnie zlepek kodu. Jako że czasami moja dawna twórczość mnie zachwyca, poniżej ten fragment zacytuję :)

public String encodeFilename(String filename, String userAgent) throws UnsupportedEncodingException {
  if (userAgent.contains("MSIE") || userAgent.contains("Opera")) {
    return URLEncoder.encode(filename, "UTF-8").replace("+", "%20");
  } else {
    return "=?UTF-8?B?" + new String(Base64.encodeBase64(filename.getBytes("UTF-8"))) + "?=";
  }
}

No i po co to komu? Ano po to, aby nadać pobieranemu plikowi nazwę z naszymi rodzimymi krzaczkami. Nie będę się zagłębiał w to, czemu tak jest, wystarczy wiedzieć, że prawie wszystkie przeglądarki nie odczytają poprawnie nazwy pliku przekazanej poprzez parametr nagłówka Content-Disposition. Co więcej, różnym przeglądarkom trzeba serwować zakodowaną nazwę pliku w nieco inny sposób.

Czytaj więcej »

Przedłużanie ważności darmowego certyfikatu StartCom

Kilka osób pytało się już mnie, co zrobić, gdy skończy się ważność certyfikatu zarejestrowanego w firmie StartCom. Otóż należy przeprowadzić od początku dokładnie taką samą procedurę, jak przy tworzeniu nowego certyfikatu. Prawdopodobnie czynność tą będziemy musieli poprzedzić również ponownym założeniem konta w serwisie StartSSL.

Tak się akurat złożyło, że certyfikat na mojego bloga generowałem nieco ponad rok temu, więc kilka dni temu wygasł. Wraz z nim skończył się również okres ważności dla certyfikatu prywatnego niezbędnego do zalogowania się na stronę startssl.com – pamiętamy, że logowanie na niej odbywa się właśnie za pomocą certyfikatu, a nie loginu i hasła. Szybko przejrzałem więc FAQ i forum w poszukiwaniu informacji, jak dostać się ponownie na swoje konto. Okazało się, że nie można :) No prawie, bo jeśli założymy nowe konto podając ten sam adres email, możemy napisać do administratora serwisu, aby przeniósł dane o certyfikatach ze starego konta na te dopiero co utworzone. Tak też zrobiłem, po czym po niedługim czasie dostałem odpowiedź, abym radził sobie sam :) Na moim starym koncie nie było już w sumie żadnych ważnych certyfikatów, więc strata ze starego konta żadna. Pewnie inaczej by było, gdyby na koncie zostało coś ważnego – wtedy zapewne też konta zostałyby połączone. Mimo wszystko czuje pewien niedosyt, bo na stronie mogłoby się znaleźć nieco więcej informacji na temat odzyskiwania starego konta wraz z jakimś automatem do tego.

Zgodnie z poleceniem wygenerowałem na nowo niezbędny certyfikat. Trochę szkoda, że nie jest już podpisany imieniem i nazwiskiem, ale w tej chwili nie chce mi się szukać notariuszy, aby mnie zweryfikowali :) Taka weryfikacja również jest ważna przez rok czasu – szkoda, że tak krótko.

Tym też sposobem na blogu nie pojawia się już wkurzający komunikat o wygaśnięciu ważności certyfikatu, a ja mam spokój na kolejny rok.

Co nowego w Sencha GXT 3?

sencha-logo

Długo oczekiwana kolejna wersja Ext GWT ukazała się niedawno pod nową nazwą: Sencha GXT 3. Obsunięcie wydania było dość spore, bo jak dobrze pamiętam, pierwsze wzmianki o GXT 3 mówiły jeszcze o wakacjach 2011. Czy warto było czekać? Jakie zmiany przynosi nowa wersja? Zaraz się o tym przekonamy.

GXT 3 miało w założeniach skupić się na integracji z rozwiązaniami, które pojawiły się w GWT 2.x. Ext GWT 2 pojawiło się jeszcze za czasów GWT 1.5, gdzie takie dobrodziejstwa jak RequestFactory, UiBinder, Autobean, Code Splitting czy wiele innych, były dopiero w zamysłach twórców GWT. Ext GWT wprowadzało więc własne rozwiązania, niektóre dość ciekawe, np. wsparcie Java Beans za pomocą BeanModel’i. Z czasem jednak w GWT pojawiały się natywne mechanizmy, które rozwiązywały poszczególne problemy na nieco niższym poziomie, chociażby mechanizm Autobean, który jest silnie wykorzystywany przez GWT RequestFactory. Kod Ext GWT był jednak tak zaprojektowany, że korzystanie z nowych udogodnień było bardzo trudne albo zupełnie niemożliwe.

Czytaj więcej »

Rowerem jeździć znowu czas zacząć

Trochę późno, ale tak się złożyło, że dopiero teraz mogłem przywieźć rower do Warszawy. Jeszcze nie miałem nawet kiedy zrobić pozimowego przeglądu. A muszę, bo czasami przerzutki odmawiają posłuszeństwa i łańcuch skacze przy mocniejszych wdepnięciach. Stojak serwisowy niedługo będę miał, więc się tym zajmę, a tymczasem wybrałem się na spokojną przejażdżkę do pracy. Samochód odpocznie, a ja zaoszczędzę na paliwie i trochę się rozruszam. Same korzyści! :)

Przy okazji postanowiłem przetestować swoją Motorolę Defy i sprawdzić, jak współgra z testowaną przeze mnie kiedyś aplikacją Move! Bike Computer. Trasa zapisała się prawidłowo, wyeksportowałem więc ją do formatu kml i wrzuciłem na portal bikemap.net.
Czytaj więcej »

Integracja Shiro, Guice i GWT

shiro-logo.jpg

Jako że w związku z nadchodzącym dłuższym weekendem majowym (ręce do góry, kto nie bierze urlopu?), nastroje dziś są mocno weekendowe, będzie szybko i przyjemnie :) Poprzednio opisywałem w jaki sposób użyć Shiro w aplikacji GWT. Obecna wtedy wersja Shiro (1.1.0) nie wspierała natywnie Guice‚a, dlatego konfigurację oparliśmy na standardowych plikach shiro.ini oraz web.xml. Oczywiście wersję 1.1.0 da się zintegrować z Guice’m, co wymaga jednak użycia kilku tricków. Jeśli jesteś zainteresowany właśnie tą wersją Shiro, to w sieci można znaleźć kilka dobrych poradników.

Od jakiegoś czasu Shiro dostępne jest w wersji 1.2.0, w której to Guice jest już oficjalnie wspierany. Niestety na oficjalnej stronie Shiro nie wszystko zostało dokładnie wytłumaczone, dlatego chcę zaprezentować Ci najprostszy sposób połączenia tych dwóch framework’ów. Użyjemy do tego poprzednio stworzonej aplikacji, tak aby skupić się tylko na integracji z Guice’m. Czytaj więcej »

Jak szybko zrobić zakupy w Google Play?

google-play-logo

No właśnie, do tej pory jakoś moja Motorola Defy żyła bez płatnych aplikacji i dobrze jej z tym było. A było tak przede wszystkim przez to, że wiele gier i aplikacji wydawana jest w obu w pełni funkcjonalnych wersjach: jednej darmowej z reklamami i drugiej płatnej bez reklam. Z wyskakującymi tu i ówdzie reklamami jakoś da się żyć, jeśli tylko w zamian dostajemy niezbędną dla nas funkcjonalność. Gorzej, jeśli wersja darmowa nie spełnia wymagań, wtedy po prostu szukałem jakiegoś zamiennika.

Od jakiegoś czasu przewijało mi się jednak kilka płatnych tytułów, które kosztują niewiele (cena oscylująca w granicach kilku PLN) i które nabyłbym bez zastanowienia. Nie mogłem jednak tego zrobić, bo nie dorobiłem się jeszcze normalnej karty kredytowej (pewnie z lenistwa :)). Wczorajszego wieczoru coś mnie jednak tknęło, aby zobaczyć czy da się taką kartę załatwić od ręki, tak abym jeszcze przed końcem dnia nabył możliwość kupna aplikacji w Google Play. Karta mogła być czysto wirtualna, bo nie potrzebuje płacić nią w fizycznych sklepach. Gdyby mi się nie udało, pewnie zostawiłbym temat znowu na najbliższe kilka miesięcy, na szczęście jednak sprawy potoczyły się inaczej.

Czytaj więcej »

Jak pogodzić maven’a z maven’em? (m2e vs maven-eclipse-plugin)

maven-logo

W projektach opartych o Maven‚a często do integracji ze środowiskiem Eclipse używany jest plugin maven-eclipse-plugin. Za pomocą tego pluginu spod konsoli można wygenerować wszystkie niezbędne pliki projektu wymagane przez IDE. Z drugiej strony Eclipse musi zostać wyposażony w plugin do integracji z Maven’em, dzięki czemu będzie poprawnie rozpoznawał zależności, zapewni graficzne wsparcie edycji plików *.pom i dołoży klika innych przydatnych rzeczy. Wybór nie jest tu duży i zazwyczaj pada na wtyczkę m2eclipse (oprócz tego dostępny jest jeszcze Eclipse IAM).

Załóżmy więc, że wygenerowaliśmy pliki projektu za pomocą polecenia mvn eclipse:eclipse. Jeśli spróbujemy zaimportować taki projekt w IDE, z pewnością zauważymy, że m2eclipse nie jest w stanie poprawnie rozpoznawać zależności projektu. Gdy podejrzymy w edytorze tekstu plik .project, zobaczymy tam komentarz, który jednoznacznie wskazuje na problem:

NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.

Jak zatem przerobić taki projekt, aby był poprawnie rozpoznawany przez m2eclipse? Wystarczy kilka drobnych zmian w plikach .project i .classpath. Czytaj więcej »

Apache Shiro – uwierzytelnić lepiej?

shiro-logo.jpg

Jakiś czas temu opisywałem, jak szybko zaimplementować uwierzytelnianie w aplikacji GWT przy pomocy JAAS’a. Wtedy byłem trochę zafascynowany tym ostatnim i nie dostrzegałem wielu jego wad. Prosty moduł uwierzytelniania (mniej więcej taki, jaki wtedy stworzyliśmy) nie przysparza jeszcze większych trudności, jednak każde dodatkowe wymagania sprawiły, że JAAS coraz bardziej zaczął mnie zniechęcać. Nie twierdzę, że jest zły, tylko jego silna integracja z mechanizmami serwerów aplikacji sprawia, że aplikacja staje się mało przenaszalna i praktycznie przed każdym wdrożeniem na inny serwer moduł logowania trzeba implementować od nowa. Najgorsze w tym wszystkim jest to, że niektóre serwery udostępniają łatwe i przyjazne API do rozszerzania funkcjonalności uwierzytelniania, a inne z kolei utrudniają bądź wręcz to uniemożliwiają. Jeśli wiemy, że nasza aplikacja od początku do końca będzie współpracować z jednym tylko serwerem – problem znika, nie mniej i tak się namęczymy z implementacją kilku rzeczy.

Użerając się wciąż z JAAS’em w końcu postanowiłem spróbować czegoś innego. Padło na Apache Shiro – framework ułatwiający implementację uwierzytelniania, autoryzacji, szyfrowania i zarządzania sesjami w aplikacjach Java. Shiro wywodzi się ze starej biblioteki JSecurity i obecnie jest aktywnie rozwijane przez wielu deweloperów. Może być użyte w zwykłych aplikacjach Java oraz aplikacjach webowych, a mocna modularyzacja kodu pozwala na łatwe podstawianie swoich implementacji do tego co potrzebujemy. Przy okazji zawiera też wiele podstawowych metod uwierzytelniania, z których można skorzystać praktycznie od razu. Dodatkowo jeśli nasza aplikacja musi obsługiwać mechanizmy serwerowe, w Shiro można napisać własną implementację modułu logowania JAAS.

Czytaj więcej »