Na dzień przed moim urlopem zakończyłem lekturę książki Spring Enterprise Recipes: A Problem-Solution Approach, którą otrzymałem od wydawnictwa Apress jeszcze w zeszłym roku.
Długo trwało zanim przekonałem się do jej lektury i pewnie tylko za sprawą ostatnich moich warsztaty dotyczących Spring Framework i Hibernate dałem się na nią namówić. I (chyba) nie żałuję (aczkolwiek w moich ustach nie brzmi to najbardziej wiarygodnie, gdyż rzadko udaje mi się przyznać do popełnionych pomyłek). Znalazłem w niej kilka ciekawostek i odświeżyłem ogólną wiedzę nt. Springa, ale żeby zaraz ją rekomendować, to niekoniecznie. Na pewno nie jest dla osób, które chciałyby przestudiować działanie Spring i jego integracji z innymi projektami. Tutaj prawdopodobnie poleciłbym inną książkę (brakuje mi dobrego typu jednak). Ta jest dobra, kiedy już wiemy, o co chodzi w Springu i albo odświeżamy wiedzę, albo uzupełniamy ją o integracje, z których nie dane nam było skorzystać produkcyjnie. Dzięki tej książce poznałem kilka sztuczek i z łatwością poradziłem sobie z warsztatami. Czyta się ją stosunkowo szybko, bo podejście typu "problem, rozwiązanie, omówienie" czyni z tej książki swego rodzaju encyklopedię, którą da się przeczytać zakładając, że nie przekracza odpowiedniego poziomu stron. Książka "Spring Enterprise Recipes" ma ich 450, więc w drodze do pracy i po niej można zmierzyć się z nią bez większego wysiłku. Rozdział w kwadrans to nie jest zbyt karkołomne założenie, szczególnie jeśli omawiany aspekt Springa jest nam dobrze znany i większość stron to kod źródłowy, albo wycinek z pliku XMLowego.
Zainteresowanych angielską wersją recenzji zapraszam do mojego Wiki - Book review: Spring Enterprise Recipes: A Problem-Solution Approach, a samą lekturą do Biblioteki Warszawskiego JUGa.
W końcu upragnione wakacje! Bawcie się dobrze.
22 lipca 2010
21 lipca 2010
Clojure REPL z JLine zaiste przyjaźniejsze
devmac:clojure jacek$ java -cp clojure.jar clojure.main Clojure 1.2.0-beta1 user=>Przeglądając dzisiaj grupę użytkowników Clojure zauważyłem, że kilka osób podało sposób uruchamiania Clojure REPL z JLine. Od teraz poprzednie polecenie wygląda nieznacznie inaczej, ale różnica jest niebagatelna - można modyfikować polecenia i działa ich historia!
devmac:clojure jacek$ java -cp ~/apps/jars/jline.jar:clojure.jar jline.ConsoleRunner clojure.main Clojure 1.2.0-beta1 user=>Z tą zmianą, można korzystać z kursora góra/dół/lewo/prawo i modyfikować dowolnie polecenia.
Wystarczyło dodać niewielką bibliotekę, a nauka Clojure staje się bardziej przyjazna dla nowicjuszy. Spróbuj, a doświadczysz niezapomnianego (i nieczęsto spotykanego) uczucia wszechogarniającego szczęścia. Zaiste niezwykłe.
19 lipca 2010
Clojure w aplikacji webowej Java EE 6 z Eclipse Helios, Apache Maven i Apache Tomcat
Ufff, udało się! Ależ radości przyniosło mi uruchomienie aplikacji webowej Java EE 6 z logiką napisaną w...Clojure! A później to spisywanie - tego najbardziej nie lubię, kiedy każdy szczegół ma znaczenie i trzeba przerabiać materiał kilkakrotnie. Chciałoby się to po prostu nagrać, zamiast spisywać (ale to po urlopie).
Właśnie ukończyłem prace nad nowym artykułem w moim Wiki - Clojure w aplikacji webowej Java EE 6 z Eclipse Helios, Apache Maven i Apache Tomcat, który przedstawia moje ostatnie doświadczenia z "produkcyjnym" wykorzystaniem Clojure z JEE6. Do całości dorzuciłem jeszcze integrację Eclipse Helios z Apache Maven (przez wtyczkę m2eclipse) i counterclockwise do obsługi Clojure. Powinno się podobać.
Nie przeciągając dłużej (i bez zbytniego zachwalania treści artykułu :-)) wierzę, że każdy znajdzie tam coś dla siebie. Niektórzy poznają Eclipse i jego środowisko (aż dwie wtyczki użyte), niektórzy samo uruchomienie aplikacji JEE6, a inni Clojure z Javą. Zapraszam do lektury i komentowania.
Jeszcze jutro recenzja książki o Springu i w nadchodzący czwartek znikam na długooczekiwany urlop. Jeszcze tylko 2 dni!
Właśnie ukończyłem prace nad nowym artykułem w moim Wiki - Clojure w aplikacji webowej Java EE 6 z Eclipse Helios, Apache Maven i Apache Tomcat, który przedstawia moje ostatnie doświadczenia z "produkcyjnym" wykorzystaniem Clojure z JEE6. Do całości dorzuciłem jeszcze integrację Eclipse Helios z Apache Maven (przez wtyczkę m2eclipse) i counterclockwise do obsługi Clojure. Powinno się podobać.
Nie przeciągając dłużej (i bez zbytniego zachwalania treści artykułu :-)) wierzę, że każdy znajdzie tam coś dla siebie. Niektórzy poznają Eclipse i jego środowisko (aż dwie wtyczki użyte), niektórzy samo uruchomienie aplikacji JEE6, a inni Clojure z Javą. Zapraszam do lektury i komentowania.
Jeszcze jutro recenzja książki o Springu i w nadchodzący czwartek znikam na długooczekiwany urlop. Jeszcze tylko 2 dni!
15 lipca 2010
Google Guice i JSR-330 Dependency Injection for Java
W Recenzja "Dependency Injection, Design patterns using Spring and Guice" z Manning pisałem o moim zachwycie Google Guice. Okazało się, że jest to jedno z tych rozwiązań, którego istnienia nie doceniałem, a gdyby zapytać mnie o cechy wyróżniające go od innych, podobnych jemu, z pewnością nie potrafiłbym wskazać tych, które mogłyby sprawić, że stanie się właściwym rozwiązaniem w projekcie. Obecna moja znajomość Guice sprowadza się do umiejętności wymówienia jego nazwy i opisania jako kontener DI (ang. dependency injection). Niewiele.
Po tej książce, potrzebowałem bliższego, bardziej praktycznego spotkania z Guice. Kiedykolwiek myślę o kontenerze DI, na myśl przychodzi Spring Framework (czasami, ale baaaardzo rzadko, takie egzotyczne rozwiązania jako HiveMind, PicoContainer, może nawet JBoss Seam, Apache XBean czy dawno zapomniany Avalon). Moje ostatnie dokonania na gruncie Spring Framework w postaci warsztatu i po nim następujących artykułów (patrz Tworzenie samodzielnej aplikacji ze Spring Framework i Hibernate w NetBeans IDE 6.9) trochę mnie zmęczyły i kiedykolwiek zabierałem się za kolejną konfigurację w XMLu, wspominałem stare, dobre czasy z serwerem aplikacyjnym Java EE. Ktoś mógłby wspomnieć o możliwości konfiguracji Springa przez adnotacje, ale jakby tego nie ująć, każdorazowe spotkanie ze Springem zawsze u mnie kończy się jednak na XMLu. Brrr...
Kiedy zabrałem się za poznawanie specyfikacji Java EE 6, zacząłem od JSR 299: Contexts and Dependency Injection for the Java EE platform (w skrócie CDI). Tam naczytałem się o wielu innych specyfikacjach i czego mi brakowało, to jego użycia poza serwerem aplikacyjnym JEE6. W końcu jakoś się udało i nawet spisałem moje doświadczenia w artykule Contexts and Dependency Injection (CDI) praktycznie - zestawienie środowiska z JBoss Weld, Arquillian i Apache Maven 2. Należy jednak zwrócić uwagę na słowo "jakoś", bo ono oddaje klimat tego artykułu - CDI w obecnym kształcie jest możliwe do uruchomienia poza serwerem aplikacyjnym, ale jego główne użycie jest właśnie w ramach serwera (chociażby JSF2). Nie pasowało mi tu stworzenie kolejnej specyfikacji JSR-330 Dependency Injection for Java. Możnaby powiedzieć, że DI to CDI, ale coś je jednak musi różnić, skoro obie istnieją pod parasolem JEE6. I różnią się - zespołem pracującym nad nimi :-) Przy CDI pracował Gavin King (JBoss Seam, Hibernate), a przy DI pracowali Bob Lee (Guice) i Rod Johnson (współtwórca Spring Framework). To może tłumaczyć pojawienie się obu, zamiast stworzenia jednej właściw(sz)ej.
Ostatnio zasugerowano mi, aby sprawdzić wsparcie CDI przez Springa i przez myśl przeszło mi, aby się tym zająć, ale zamiast CDI skończyło się na JSR330 DI. Zacząłem od dokumentacji pakietu javax.inject. To właśnie wtedy stwierdziłem, aby zamiast Springa, zbadać Guice.
Po javadoc wzięło mnie na lekturę Dependency injection with Guice, który okazał się bardzo przystępny merytorycznie, wciąż jednak stosunkowo krótki, aby się nie znużyć jedynie czytaniem. Później przyszła pora na Google Guice :: Getting Started i Google Guice :: Spring Comparison. Z nimi i wcześniejszą lekturą książki Dependency Injection - Design patterns using Spring and Guice byłem gotów do wstępnych testów, tym razem z IntelliJ IDEA.
Zacznijmy od końca - od uruchomienia Guice i pobrania kompletnego obiektu z już wstrzelonymi zależnościami.
Ostatnim, aczkolwiek najważniejszym elementem aplikacji korzystającej z Guice, jest wykorzystanie adnotacji @com.google.inject.Inject, która oznacza miejsca podlegające mechanizmowi wstrzeliwania zależności (stąd też nazwa dla specyfikacji JSR 330 DI - atInject). Poniższa klasa prezentuje adnotację @Inject w akcji.
p.s. W ostatniej klasie EnglishPolishDictionaryService popełniłem błąd związany z niepoprawnym użyciem wstrzeliwania zależności (oferowanym przez Guice, ale to nie ma w tym przypadku znaczenia). Sama aplikacja działa, ale właściwe użycie DI powinno odpowiadać zasadzie Inject only direct dependencies. Przykład obrazuje, ile jeszcze przede mną nauki, aby tę całą tajemną wiedzę przyswoić.
Po tej książce, potrzebowałem bliższego, bardziej praktycznego spotkania z Guice. Kiedykolwiek myślę o kontenerze DI, na myśl przychodzi Spring Framework (czasami, ale baaaardzo rzadko, takie egzotyczne rozwiązania jako HiveMind, PicoContainer, może nawet JBoss Seam, Apache XBean czy dawno zapomniany Avalon). Moje ostatnie dokonania na gruncie Spring Framework w postaci warsztatu i po nim następujących artykułów (patrz Tworzenie samodzielnej aplikacji ze Spring Framework i Hibernate w NetBeans IDE 6.9) trochę mnie zmęczyły i kiedykolwiek zabierałem się za kolejną konfigurację w XMLu, wspominałem stare, dobre czasy z serwerem aplikacyjnym Java EE. Ktoś mógłby wspomnieć o możliwości konfiguracji Springa przez adnotacje, ale jakby tego nie ująć, każdorazowe spotkanie ze Springem zawsze u mnie kończy się jednak na XMLu. Brrr...
Kiedy zabrałem się za poznawanie specyfikacji Java EE 6, zacząłem od JSR 299: Contexts and Dependency Injection for the Java EE platform (w skrócie CDI). Tam naczytałem się o wielu innych specyfikacjach i czego mi brakowało, to jego użycia poza serwerem aplikacyjnym JEE6. W końcu jakoś się udało i nawet spisałem moje doświadczenia w artykule Contexts and Dependency Injection (CDI) praktycznie - zestawienie środowiska z JBoss Weld, Arquillian i Apache Maven 2. Należy jednak zwrócić uwagę na słowo "jakoś", bo ono oddaje klimat tego artykułu - CDI w obecnym kształcie jest możliwe do uruchomienia poza serwerem aplikacyjnym, ale jego główne użycie jest właśnie w ramach serwera (chociażby JSF2). Nie pasowało mi tu stworzenie kolejnej specyfikacji JSR-330 Dependency Injection for Java. Możnaby powiedzieć, że DI to CDI, ale coś je jednak musi różnić, skoro obie istnieją pod parasolem JEE6. I różnią się - zespołem pracującym nad nimi :-) Przy CDI pracował Gavin King (JBoss Seam, Hibernate), a przy DI pracowali Bob Lee (Guice) i Rod Johnson (współtwórca Spring Framework). To może tłumaczyć pojawienie się obu, zamiast stworzenia jednej właściw(sz)ej.
Ostatnio zasugerowano mi, aby sprawdzić wsparcie CDI przez Springa i przez myśl przeszło mi, aby się tym zająć, ale zamiast CDI skończyło się na JSR330 DI. Zacząłem od dokumentacji pakietu javax.inject. To właśnie wtedy stwierdziłem, aby zamiast Springa, zbadać Guice.
Po javadoc wzięło mnie na lekturę Dependency injection with Guice, który okazał się bardzo przystępny merytorycznie, wciąż jednak stosunkowo krótki, aby się nie znużyć jedynie czytaniem. Później przyszła pora na Google Guice :: Getting Started i Google Guice :: Spring Comparison. Z nimi i wcześniejszą lekturą książki Dependency Injection - Design patterns using Spring and Guice byłem gotów do wstępnych testów, tym razem z IntelliJ IDEA.
Zacznijmy od końca - od uruchomienia Guice i pobrania kompletnego obiektu z już wstrzelonymi zależnościami.
package pl.jaceklaskowski.javaee.di;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class Main {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new DictionaryModule());
EnglishPolishDictionaryService dictionaryService = injector.getInstance(EnglishPolishDictionaryService.class);
System.out.println(dictionaryService.translate("turn out"));
}
}Konfigurację Guice realizuje się przez moduły - klasy javowe, w których przypisujemy interfejsy do ich implementacji, typów, które będą przedmiotem wstrzeliwania zależności.package pl.jaceklaskowski.javaee.di;
import com.google.inject.AbstractModule;
public class DictionaryModule extends AbstractModule {
@Override
protected void configure() {
bind(VocabularyProvider.class).to(EnglishVocabularyProvider.class);
}
}Każdy moduł rozszerza klasę com.google.inject.AbstractModule. To w module konfigurujemy Guice na potrzeby naszej aplikacji, gdzie następuje przypisanie co będzie przypisane gdzie za pomocą konstrukcji bind([GDZIE]).to([CO]).in([OBSZAR])W powyższym przykładzie, jakiekolwiek wystąpienie zmiennej typu VocabularyProvider zostanie zainicjowane zmienną typu EnglishVocabularyProvider, domyślnie jako singleton.
Ostatnim, aczkolwiek najważniejszym elementem aplikacji korzystającej z Guice, jest wykorzystanie adnotacji @com.google.inject.Inject, która oznacza miejsca podlegające mechanizmowi wstrzeliwania zależności (stąd też nazwa dla specyfikacji JSR 330 DI - atInject). Poniższa klasa prezentuje adnotację @Inject w akcji.
package pl.jaceklaskowski.javaee.di;
import com.google.inject.Inject;
import java.util.Locale;
import java.util.Map;
public class EnglishPolishDictionaryService implements DictionaryService {
private final Map<String, String> vocabulary;
@Inject
EnglishPolishDictionaryService(VocabularyProvider vocabularyProvider) {
this.vocabulary = vocabularyProvider.provideVocabularyFor(Locale.ENGLISH);
}
public String translate(String word) {
return "[PL]" + word;
}
}Każde wystąpienie @Inject jest miejscem, gdzie nastąpi wstrzelenie zależności przez Guice. Czy to konstruktor (którego wszystkie parametry podlegają wstrzeliwaniu przez Guice), czy metoda (o dowolnej nazwie i sygnaturze), czy pole instancji, wszystkie te miejsca są inicjowane przez Guice.p.s. W ostatniej klasie EnglishPolishDictionaryService popełniłem błąd związany z niepoprawnym użyciem wstrzeliwania zależności (oferowanym przez Guice, ale to nie ma w tym przypadku znaczenia). Sama aplikacja działa, ale właściwe użycie DI powinno odpowiadać zasadzie Inject only direct dependencies. Przykład obrazuje, ile jeszcze przede mną nauki, aby tę całą tajemną wiedzę przyswoić.
14 lipca 2010
Tworzenie samodzielnej aplikacji ze Spring Framework i Hibernate w NetBeans IDE 6.9
Właśnie ukończyłem prace nad kolejnym, trzecim i ostatnim artykułem Tworzenie samodzielnej aplikacji ze Spring Framework i Hibernate w NetBeans IDE 6.9, który wprowadza czytelnika w arkana integracji Spring Framework z Hibernate (albo odwrotnie), aby tym samym pozwolić mi na przeprowadzenie warsztatów w bardziej składny sposób - z użyciem materiałów, które są dostępne publicznie, dla każdego. Są to bardzo wprowadzające artykuły przygotowane specjalnie dla początkujących w temacie. Bardziej zaawansowani użytkownicy tandemu Spring + Hibernate pewnie nie znajdą w nich wiele pożytecznego. Uwagi i sugestie mile widziane, a zainteresowanych warsztatami uprasza się o kontakt na priv.
Sama idea warsztatów wypływała już kilkakrotnie i zawsze problemem było właśnie przygotowanie materiałów i działających przykładów. Tradycyjnie jak co roku, Warszawa JUG organizuje konferencję warsztatową Warsjava w okolicach października/listopada i w tym roku zamarzyło mi się, aby być przygotowanym, a może nawet poprowadzić warsztaty płatne?! Jest kilku zainteresowanych pomysłem i teraz przyszło mi realizować jej część merytoryczną. Zainteresowany? Zainteresowana?
W serii warsztatowej o Spring i Hibernate, przez ostatnie tygodnie stworzyłem zapowiadane trzy artykuły:
Muszę przyznać, że NetBeans 6.9 dał mi się tak we znaki (przede wszystkim ciągłe błędy z odświeżaniem zawartości w projekcie), że nie tylko, że musiałem zaktualizować go do najnowszej, rozwojowej wersji z wczorajszego dnia (co niestety zniszczyło mi wszystkie dodatki jakie przychodzą z wersjami produkcyjnymi w temacie integracji NB z systemem operacyjnym, czyli ikonę startową), ale coraz częściej pojawia mi się myśl, aby go całkowicie zakopać i już więcej nie oglądać. Stał się tak toporny w swojej obsłudze projektów, że zwykłe zamykanie/otwieranie projektów prowadziło często do tak kuriozalnych sytuacji, jak oznaczenie niektórych jako nie-NetBeans-owych! A były w nim tworzone! Gdyby nie fakt, że NetBeans i Java EE "w jednym stali domu", to już dawno zapomniałbym o istnieniu NetBeans. Rozważam przejście na Eclipse, albo IDEA. Skłaniam się ku IDEA, ale nie wszyscy ją mają i artykuły byłyby mocno zawężone pod względem grupy odbiorczej. Sugestie?
Tym samym wracam do mojej wcześniejszej aktywności wokół specyfikacji JSR 299: Contexts and Dependency Injection for the Java EE platform. Celem jest stworzenie podobnego zestawu artykułów, aby możliwe było wprowadzenia nowicjusza w tajniki CDI. Pomysły, sugestie, uwagi mile widziane. Jeśli chcesz przeczytać coś interesującego, daj mi poznać swoje potrzeby, a *może* uda mi się je spełnić?! Ku uciesze obu stron ;-)
Sama idea warsztatów wypływała już kilkakrotnie i zawsze problemem było właśnie przygotowanie materiałów i działających przykładów. Tradycyjnie jak co roku, Warszawa JUG organizuje konferencję warsztatową Warsjava w okolicach października/listopada i w tym roku zamarzyło mi się, aby być przygotowanym, a może nawet poprowadzić warsztaty płatne?! Jest kilku zainteresowanych pomysłem i teraz przyszło mi realizować jej część merytoryczną. Zainteresowany? Zainteresowana?
W serii warsztatowej o Spring i Hibernate, przez ostatnie tygodnie stworzyłem zapowiadane trzy artykuły:
- Tworzenie samodzielnej aplikacji ze Spring Framework w NetBeans IDE 6.9
- Tworzenie samodzielnej aplikacji z Hibernate w NetBeans IDE 6.9
- Tworzenie samodzielnej aplikacji ze Spring Framework i Hibernate w NetBeans IDE 6.9
W ten sposób zamknąłem pewien rozdział w mojej działalności edukacyjnej związanej ze wspomnianymi produktami - Spring i Hibernate, które wykorzystałem do stworzenia samodzielnych aplikacji w środowisku NetBeans IDE 6.9. Trochę mnie to integrowanie znużyło i coraz bardziej tęskno mi do pełniejszego środowiska serwera aplikacyjnego JEE6.
Muszę przyznać, że NetBeans 6.9 dał mi się tak we znaki (przede wszystkim ciągłe błędy z odświeżaniem zawartości w projekcie), że nie tylko, że musiałem zaktualizować go do najnowszej, rozwojowej wersji z wczorajszego dnia (co niestety zniszczyło mi wszystkie dodatki jakie przychodzą z wersjami produkcyjnymi w temacie integracji NB z systemem operacyjnym, czyli ikonę startową), ale coraz częściej pojawia mi się myśl, aby go całkowicie zakopać i już więcej nie oglądać. Stał się tak toporny w swojej obsłudze projektów, że zwykłe zamykanie/otwieranie projektów prowadziło często do tak kuriozalnych sytuacji, jak oznaczenie niektórych jako nie-NetBeans-owych! A były w nim tworzone! Gdyby nie fakt, że NetBeans i Java EE "w jednym stali domu", to już dawno zapomniałbym o istnieniu NetBeans. Rozważam przejście na Eclipse, albo IDEA. Skłaniam się ku IDEA, ale nie wszyscy ją mają i artykuły byłyby mocno zawężone pod względem grupy odbiorczej. Sugestie?
Tym samym wracam do mojej wcześniejszej aktywności wokół specyfikacji JSR 299: Contexts and Dependency Injection for the Java EE platform. Celem jest stworzenie podobnego zestawu artykułów, aby możliwe było wprowadzenia nowicjusza w tajniki CDI. Pomysły, sugestie, uwagi mile widziane. Jeśli chcesz przeczytać coś interesującego, daj mi poznać swoje potrzeby, a *może* uda mi się je spełnić?! Ku uciesze obu stron ;-)
09 lipca 2010
Clojure ponownie na tapecie - jest nowa książka, jest oferta projektu, pozostaje zestawić IDE
Jest wiele języków funkcyjnych (na myśl przychodzą chociażby Lisp czy Haskell) i niemało z nich doczekało się odpowiedników działających na wirtualnej maszynie Javy. Mnie zainteresował jeden - Clojure. I trudno powiedzieć dlaczego, ale ma to coś, co sprawia, że mimo moich trudności w myśleniu funkcyjnym, chce mi się go nauczyć. Na razie moje "chce" nie wyszło poza ramy faktycznego "chce", więc jedynie od czasu do czasu coś tam sobie poczytam, czy skrobnę.
Tydzień przed Javarsovią 2010 w księgarniach pojawiła się nowa pozycja o tym języku - Practical Clojure od Apressu. Pamiętam ten dzień, kiedy publikując recenzję na Amazonie zobaczyłem, że ta książka już jest. Postanowiłem ją zdobyć i napisałem do wydawnictwa. Jeszcze tego samego dnia, otrzymałem odpowiedź:
Hey Jacek,
You got it, where would you like the book to be shipped?
Simon Yu
Apress | friends of ED
Public Relations Assistant
Apress
I już ją mam u siebie. Część mojej duszy odpowiedzialna za posiadanie jest już usatysfakcjonowana :]
2 dni temu dostałem wiadomość:
Witaj,
widzialem ze interesujesz sie Clojure, a wlasnie chcialbym zaczac pisac projekt w tym jezyku, tylko szukam kogos kto moglby mi pomoc (oczywiscie nie charytatywnie). Czy masz czas i checi?
Pozdrawiam,
Wojtek
Stwierdziłem, że prośba dotyczy nauki języka, więc bez wahania odpowiedziałem:
Cześć Wojtku,
Czas i chęci to nie problem, bo tego mam wystarczająco wiele, aby się podzielić, jednakże w tym konkretnym przypadku na niewiele by się to zdało - sam poznaję Clojure, a największym problemem nie jest sam język, ale funkcyjne myślenie, którego mi brakuje. Jak widzisz, nie mogę tym samym pomóc Ci, bo składnia języka to prosta sprawa do nauki, jak mniemam.
Jacek
Kilka kolejnych maili i wiedziałem, jak bardzo się myliłem, sądząc, że moja rola miałaby sprowadzić się do roli nauczyciela. Okazało się, że temat dotyczy projektu, który miałby być realizowany z udziałem Clojure i Vaadina:
Jestem w trakcie tworzenia softu do komunikacji w firmie - taki basecamp na sterydach. W tej chwili mam to napisane w Pythonie/Django i jQuery ale rozwazam przejscie na Clojure i Vaadin. Tyle ze zanim sie na to zdecyduje to musze tego Vaadina potestowac (na dniach to pewnie zrobie) no i znalezc kogos kto bedzie mogl pisac ze mna bo chce to zakonczyc w sensownym czasie i wypuscic na rynek (juz mam w paru krajach dograna dystrybucje itp). Jest na to budzet, nie jakis kosmiczny ale jest, no i mozna mowic tez o opcjach na akcje przy dluzszej wspolpracy.
Interesujące, co? Czekam na wymagania funkcjonalne i wtedy okaże się, gdzie byłaby rola dla Clojure i mnie. Gdyby projekt wypalił, byłbym w pierwszym rzędzie, aby się do niego przyłączyć. To byłby mój pierwszy funkcyjny projekt z Clojure. Super!
I znowu myślami przy Clojure, więc rozejrzałem się po grupie dyskusyjnej użytkowników Clojure, aby rozeznać się, jak to teraz stan rozwoju Clojure wygląda. Jakby na żądanie, Sebastian "pedro" Pietrowski pisał o wydaniu Compojure 0.4.0 w swoich podsumowaniach tygodnia - Pedro Newsletter 08.07.2010, więc od razu pobrałem go do przejrzenia kodów źródłowych (nota bene, fajne są te tygodniówki od Pedro - już kilkukrotnie okazały się nieocenione w rozeznaniu się, co nowego w okolicy). Nie tak dawno pobrałem nową wersję Eclipse Helios (3.6), więc postanowiłem dograć do niego wtyczkę Counterclockwise, która udostępnia obsługę Clojure w Eclipse. Instalacja jest niezwykle trywialna - wystarczy wskazać na repozytorium z wtyczką i tyle. Więcej w Getting Started with Eclipse and Counterclockwise.
Jest możliwość stworzenia nowego projektu z Clojure, są edytory z podświetlaniem składni i jest możliwość uruchamiania programów w Clojure REPL. W zasadzie jest wszystko, aby zacząć swoją przygodę ze światem programowania funkcyjnego z Clojure i Javą.
A pamiętam, jak opierałem się nauce programowania funkcyjnego na studiach. Teraz miałbym prościej...
Tydzień przed Javarsovią 2010 w księgarniach pojawiła się nowa pozycja o tym języku - Practical Clojure od Apressu. Pamiętam ten dzień, kiedy publikując recenzję na Amazonie zobaczyłem, że ta książka już jest. Postanowiłem ją zdobyć i napisałem do wydawnictwa. Jeszcze tego samego dnia, otrzymałem odpowiedź:
Hey Jacek,
You got it, where would you like the book to be shipped?
Simon Yu
Apress | friends of ED
Public Relations Assistant
Apress
I już ją mam u siebie. Część mojej duszy odpowiedzialna za posiadanie jest już usatysfakcjonowana :]
2 dni temu dostałem wiadomość:
Witaj,
widzialem ze interesujesz sie Clojure, a wlasnie chcialbym zaczac pisac projekt w tym jezyku, tylko szukam kogos kto moglby mi pomoc (oczywiscie nie charytatywnie). Czy masz czas i checi?
Pozdrawiam,
Wojtek
Stwierdziłem, że prośba dotyczy nauki języka, więc bez wahania odpowiedziałem:
Cześć Wojtku,
Czas i chęci to nie problem, bo tego mam wystarczająco wiele, aby się podzielić, jednakże w tym konkretnym przypadku na niewiele by się to zdało - sam poznaję Clojure, a największym problemem nie jest sam język, ale funkcyjne myślenie, którego mi brakuje. Jak widzisz, nie mogę tym samym pomóc Ci, bo składnia języka to prosta sprawa do nauki, jak mniemam.
Jacek
Kilka kolejnych maili i wiedziałem, jak bardzo się myliłem, sądząc, że moja rola miałaby sprowadzić się do roli nauczyciela. Okazało się, że temat dotyczy projektu, który miałby być realizowany z udziałem Clojure i Vaadina:
Jestem w trakcie tworzenia softu do komunikacji w firmie - taki basecamp na sterydach. W tej chwili mam to napisane w Pythonie/Django i jQuery ale rozwazam przejscie na Clojure i Vaadin. Tyle ze zanim sie na to zdecyduje to musze tego Vaadina potestowac (na dniach to pewnie zrobie) no i znalezc kogos kto bedzie mogl pisac ze mna bo chce to zakonczyc w sensownym czasie i wypuscic na rynek (juz mam w paru krajach dograna dystrybucje itp). Jest na to budzet, nie jakis kosmiczny ale jest, no i mozna mowic tez o opcjach na akcje przy dluzszej wspolpracy.
Interesujące, co? Czekam na wymagania funkcjonalne i wtedy okaże się, gdzie byłaby rola dla Clojure i mnie. Gdyby projekt wypalił, byłbym w pierwszym rzędzie, aby się do niego przyłączyć. To byłby mój pierwszy funkcyjny projekt z Clojure. Super!
I znowu myślami przy Clojure, więc rozejrzałem się po grupie dyskusyjnej użytkowników Clojure, aby rozeznać się, jak to teraz stan rozwoju Clojure wygląda. Jakby na żądanie, Sebastian "pedro" Pietrowski pisał o wydaniu Compojure 0.4.0 w swoich podsumowaniach tygodnia - Pedro Newsletter 08.07.2010, więc od razu pobrałem go do przejrzenia kodów źródłowych (nota bene, fajne są te tygodniówki od Pedro - już kilkukrotnie okazały się nieocenione w rozeznaniu się, co nowego w okolicy). Nie tak dawno pobrałem nową wersję Eclipse Helios (3.6), więc postanowiłem dograć do niego wtyczkę Counterclockwise, która udostępnia obsługę Clojure w Eclipse. Instalacja jest niezwykle trywialna - wystarczy wskazać na repozytorium z wtyczką i tyle. Więcej w Getting Started with Eclipse and Counterclockwise.
Jest możliwość stworzenia nowego projektu z Clojure, są edytory z podświetlaniem składni i jest możliwość uruchamiania programów w Clojure REPL. W zasadzie jest wszystko, aby zacząć swoją przygodę ze światem programowania funkcyjnego z Clojure i Javą.
A pamiętam, jak opierałem się nauce programowania funkcyjnego na studiach. Teraz miałbym prościej...
08 lipca 2010
Mnogość przeglądarek przyprawia mnie o ból głowy - Safari Reader warty uwagi
Ostatnimi czasy zauważam u siebie swego rodzaju znużenie mnogością przeglądarek i niemożnością wyboru tej jednej, uniwersalnej, która byłaby złożeniem wszystkich potrzebnych funkcjonalności. Nie mogąc zdecydować się na tą jedną, skaczę pomiędzy wszystkimi i zaczynam mieć problemy z zarządzaniem nimi (szczególnie zakładkami). Kiedyś powiedziano mi, że podobnie jest z moją stabilnością techniczną, która objawia się ciągłym skakaniem po technologiach (aczkolwiek wciąż w ramach wirtualnej maszyny Javy), ale to akurat mnie cieszy.
Jestem od wieków użytkownikiem Firefoksa. Każdy go zna i każdy wie, że ma swoje dobre i złe strony. Do dobrych zaliczyłbym całą masę wtyczek, z których i tak nie korzystam, ale wiem, że wtyczki, kiedy potrzebuję, to są - chociażby Greasemonkey czy Firebug.
Pracowałem z Firefoksem od wieków i zdążył mnie do siebie przyzwyczaić na tyle, że kiedy pojawił się Google Chrome nie wzruszyło mnie to wcale. Aż do momentu, kiedy zobaczyłem u Grzegorza Białka skróty na pulpicie, które były niczym innym, jak skrótami do odpowiednich stron webowych, np. Facebook, które uruchomione w ramach Chrome wyglądały jak typowe aplikacje dektopowe. To było niesamowicie poruszające doświadczenie, które uświadomiło mi jak niewiele trzeba, aby potraktować przeglądarkę jako medium dotarcia do aplikacji webowych w Sieci. To może wydawać się trudne do zrozumienia, biorąc pod uwagę, że tworzenie aplikacji webowych Java EE jest moim zajęciem numer 1, ale zawsze, kiedy z nich korzystałem najpierw miałem obraz przeglądarki, aby później zobaczyć samą aplikację. Teraz było inaczej - przeglądarki było niewiele, a dodatki w JavaScripcie (jquery) w Facebooku zmieniły moje postrzeganie, co jest obecnie możliwe i jak niewiele dzieli aplikacje desktopowe od aplikacji webowych. Spodobało mi się to na tyle, że jedynie dla tej cechy, postanowiłem przenieść się na Chrome. Długo trwało zanim całkowicie zrezygnowałem z Firefoksa (i wciąż jeszcze z niego korzystam), ale pierwszy krok zrobiłem - domyślną przeglądarką stał się Chrome.
Kiedy 1.stycznia 2010 roku przeniosłem się na MacOS X Snow Leopard na firmowym MacBook Pro (tutaj ukłony dla osób decyzyjnych w mojej firmie - nazwa znana redakcji, które zdecydowały się na ten krok i pozwoliły mi cieszyć się jego owocami - posiadaniem własnego Maca) pojawiła się kolejna przeglądarka - Apple Safari. Była domyślną przeglądarką w MacOS i przez moment nawet mi się podobała, ale tylko krótki moment. Próbowałem przełączyć się z moich przyzwyczajeń firefoksowo-chromowych na Safari, ale było ciężko. Przeglądarka różniła się od poprzedników, aż w końcu uległem pokusie i przesiadłem się na...Firefoksa (!) I znowu na starych śmieciach, aczkolwiek w odwodzie miałem zainstalowane Safari i Chrome.
Ostatnimi czasy dużo się mówiło o porównaniach wydajnościowych przeglądarek i z nowym wydaniem Chrome wszyscy wskazywali na niego, jako tego, który jest najszybszy (oczywiście większość newsów szła od samego producenta - Google). Uległem ponownie i przesiadłem się na Chrome. I świat znowu wydał się przyjemniejszy. Moje korzystanie z przeglądarki sprowadza się do regularnego odwiedzania GMail, GReader, Bloggera i wielu blogów, serwisów społeczościowych, ale niewiele w tym tworzenia aplikacji z interfejsem użytkownika pisanym w JavaScripcie, który musiałbym optymalizować, więc należę do typowej grupy odbiorców przeglądarek. Ulegam też reklamom dosyć często (Agata twierdzi, że nawet za często i kiedy tylko ktoś sensownie i pewnie mówi, szybko mnie ma). Chrome pozwalał mi nawet na edycję tekstu moich wpisów na blogu ze skrótami klawiszowymi - Cmd+B znowu dało mi możliwość wytłuszczania (co w Firefoksie jedynie otwierało mi przeglądarkę zakładek).
Praca z Chrome była przyjemna i spełniała moje oczekiwania (poza irytującym zaznaczaniem tekstu bez pierwszej litery, tj. przy zaznaczaniu muszę kursor myszki przesunąć o pół znaku w lewo, abym zaznaczył dokładnie tekst, który mnie interesuje). Kiedy pojawiła się wersja Safari 5, temat wyboru przeglądarki znowu wrócił - Safari oferuje "obdzieranie ze skóry" stron, co pozwala na łatwiejsze czytanie zawartości. Owa cecha, nazywana Safari Reader, aktywuje się samoczynnie i w pasku adresu pojawia się ikona Reader, kiedy Safari potrafi pokazać jedynie treść artykułu bez okalających reklam. Nie wiem dlaczego dzisiaj, ale skoro pracuję na Macu i Safari się samo zaktualizowało do nowszej wersji, więc nic nie stało na przeszkodzie, aby spróbować tej cechy na własnej skórze. Spróbowałem na swoim blogu http://jaceklaskowski.pl i nic. Zero ikonki do uruchomienia Safari Reader. Spróbowałem na moim Wiki http://jaceklaskowski.pl/wiki i też nic. Zacząłem szukać informacji na ten temat i poza lakoniczną informacją na oficjalnej stronie produktu, że jest i aktywuje się automatycznie...na niektórych stronach. Hmmm, próbuję http://www.infoq.com, bo tam znajdę wiele artykułów i reklamy. Wszedłem na stronę artykułu o CDI (JSD-299) - Dependency Injection in Java EE 6 Provides Unified EJB and JSF Programming Model i moim oczom ukazała się owa magiczna ikonka Reader!
Wciskając przycisk Reader albo wciskając kombinację klawiszy Cmd+Shift+R, Safari przechodzi w tryb, który wyrzuca niepotrzebne "rozpraszacze" i pozostawia jedynie czytaną treść.
Bajecznie! I znowu jestem na Safari.
Jestem od wieków użytkownikiem Firefoksa. Każdy go zna i każdy wie, że ma swoje dobre i złe strony. Do dobrych zaliczyłbym całą masę wtyczek, z których i tak nie korzystam, ale wiem, że wtyczki, kiedy potrzebuję, to są - chociażby Greasemonkey czy Firebug.Pracowałem z Firefoksem od wieków i zdążył mnie do siebie przyzwyczaić na tyle, że kiedy pojawił się Google Chrome nie wzruszyło mnie to wcale. Aż do momentu, kiedy zobaczyłem u Grzegorza Białka skróty na pulpicie, które były niczym innym, jak skrótami do odpowiednich stron webowych, np. Facebook, które uruchomione w ramach Chrome wyglądały jak typowe aplikacje dektopowe. To było niesamowicie poruszające doświadczenie, które uświadomiło mi jak niewiele trzeba, aby potraktować przeglądarkę jako medium dotarcia do aplikacji webowych w Sieci. To może wydawać się trudne do zrozumienia, biorąc pod uwagę, że tworzenie aplikacji webowych Java EE jest moim zajęciem numer 1, ale zawsze, kiedy z nich korzystałem najpierw miałem obraz przeglądarki, aby później zobaczyć samą aplikację. Teraz było inaczej - przeglądarki było niewiele, a dodatki w JavaScripcie (jquery) w Facebooku zmieniły moje postrzeganie, co jest obecnie możliwe i jak niewiele dzieli aplikacje desktopowe od aplikacji webowych. Spodobało mi się to na tyle, że jedynie dla tej cechy, postanowiłem przenieść się na Chrome. Długo trwało zanim całkowicie zrezygnowałem z Firefoksa (i wciąż jeszcze z niego korzystam), ale pierwszy krok zrobiłem - domyślną przeglądarką stał się Chrome.
Kiedy 1.stycznia 2010 roku przeniosłem się na MacOS X Snow Leopard na firmowym MacBook Pro (tutaj ukłony dla osób decyzyjnych w mojej firmie - nazwa znana redakcji, które zdecydowały się na ten krok i pozwoliły mi cieszyć się jego owocami - posiadaniem własnego Maca) pojawiła się kolejna przeglądarka - Apple Safari. Była domyślną przeglądarką w MacOS i przez moment nawet mi się podobała, ale tylko krótki moment. Próbowałem przełączyć się z moich przyzwyczajeń firefoksowo-chromowych na Safari, ale było ciężko. Przeglądarka różniła się od poprzedników, aż w końcu uległem pokusie i przesiadłem się na...Firefoksa (!) I znowu na starych śmieciach, aczkolwiek w odwodzie miałem zainstalowane Safari i Chrome.
Ostatnimi czasy dużo się mówiło o porównaniach wydajnościowych przeglądarek i z nowym wydaniem Chrome wszyscy wskazywali na niego, jako tego, który jest najszybszy (oczywiście większość newsów szła od samego producenta - Google). Uległem ponownie i przesiadłem się na Chrome. I świat znowu wydał się przyjemniejszy. Moje korzystanie z przeglądarki sprowadza się do regularnego odwiedzania GMail, GReader, Bloggera i wielu blogów, serwisów społeczościowych, ale niewiele w tym tworzenia aplikacji z interfejsem użytkownika pisanym w JavaScripcie, który musiałbym optymalizować, więc należę do typowej grupy odbiorców przeglądarek. Ulegam też reklamom dosyć często (Agata twierdzi, że nawet za często i kiedy tylko ktoś sensownie i pewnie mówi, szybko mnie ma). Chrome pozwalał mi nawet na edycję tekstu moich wpisów na blogu ze skrótami klawiszowymi - Cmd+B znowu dało mi możliwość wytłuszczania (co w Firefoksie jedynie otwierało mi przeglądarkę zakładek).
Praca z Chrome była przyjemna i spełniała moje oczekiwania (poza irytującym zaznaczaniem tekstu bez pierwszej litery, tj. przy zaznaczaniu muszę kursor myszki przesunąć o pół znaku w lewo, abym zaznaczył dokładnie tekst, który mnie interesuje). Kiedy pojawiła się wersja Safari 5, temat wyboru przeglądarki znowu wrócił - Safari oferuje "obdzieranie ze skóry" stron, co pozwala na łatwiejsze czytanie zawartości. Owa cecha, nazywana Safari Reader, aktywuje się samoczynnie i w pasku adresu pojawia się ikona Reader, kiedy Safari potrafi pokazać jedynie treść artykułu bez okalających reklam. Nie wiem dlaczego dzisiaj, ale skoro pracuję na Macu i Safari się samo zaktualizowało do nowszej wersji, więc nic nie stało na przeszkodzie, aby spróbować tej cechy na własnej skórze. Spróbowałem na swoim blogu http://jaceklaskowski.pl i nic. Zero ikonki do uruchomienia Safari Reader. Spróbowałem na moim Wiki http://jaceklaskowski.pl/wiki i też nic. Zacząłem szukać informacji na ten temat i poza lakoniczną informacją na oficjalnej stronie produktu, że jest i aktywuje się automatycznie...na niektórych stronach. Hmmm, próbuję http://www.infoq.com, bo tam znajdę wiele artykułów i reklamy. Wszedłem na stronę artykułu o CDI (JSD-299) - Dependency Injection in Java EE 6 Provides Unified EJB and JSF Programming Model i moim oczom ukazała się owa magiczna ikonka Reader!Wciskając przycisk Reader albo wciskając kombinację klawiszy Cmd+Shift+R, Safari przechodzi w tryb, który wyrzuca niepotrzebne "rozpraszacze" i pozostawia jedynie czytaną treść.
Bajecznie! I znowu jestem na Safari.
Subskrybuj:
Posty (Atom)



