28 sierpnia 2008

Urlop w Ogrodzieńcu i okolicach

3 komentarzy
Właśnie wróciłem z niedługiego, bo bagatela 3-dniowego urlopu rodzinnego w Ogrodzieńcu, gdzie miałem możliwość zakosztowania uroków Wyżyny Krakowsko-Częstochowskiej (znanej również jako Jura Krakowsko-Częstochowska).


W drodze do Ogrodzieńca (przez Radom i Kielce) wstąpiliśmy do Zamku Chęcińskiego. Widoki pierwsza klasa. Zamek dobrze prezentuje się w drodze powrotnej do Warszawy, kiedy góruje nad drogą i widać go z daleka (zresztą w tej części droga jest prawie prosta na długości kilku kilometrów).


Kolejny dzień zaczęliśmy od wizyty na dogorywającej, jedynej w Polsce Pustyni Błędowskiej,


aby jeszcze tego samego dnia "zaliczyć" Dolinę Prądnika oraz jaskinie (groty) Nietoperzową, Ciemną oraz Łokietka (niestety na zwiedzanie Zamku Ojcowskiego oraz dzienne podziwianie Maczugi Herkulesa nie starczyło czasu).


Zjechaliśmy do Ogrodzieńca na wieczór, aby...ekhm...rano...dobrze, baardzo późnym rankiem wyruszyć na Zamek Ogrodzieniec we wsi Podzamcze. Tam udało mi się skosztować nie tylko walorów kulturalno-krajoznawczych, ale i kwasu chlebowego. Po prostu, pycha! Wizyta w pobliskim parku liniowym Adrenalina Park dopełniła szczęścia...żony z dzieciakami (ktoś musiał robić zdjęcia i filmy ;-)).


Podsumowaliśmy dzień wizytą na Górze Birów. Widoki przepiękne. Okoliczne lasy, widok na Zamek Ogrodzieniec i przenikliwa cisza (do pełni szczęścia brakowało jedynie dostępu do sieci). Tym samym mogę odhaczyć kolejny polski park narodowy - Ojcowski Park Narodowy. Okolica przepiękna i jedynym mankamentem był czas. Pogoda dopisała (co zdaje się być już normą dla urlopów rodzinnych planowanych przez moją małżonkę), więc było pięknie, pogodnie, (niekoniecznie) tanio i niedaleko. Polecam!

p.s. W międzyczasie miałem możliwość dogłębniejszego rozpoznania facelets oraz wdrożyłem RestFaces. Zacząłem również zerkać w stronę JSFTemplating jako alternatywie dla facelets, w którym znaczniki JSP są specjalnego traktowania (mowa o facelets). Więcej w kolejnych odsłonach.

23 sierpnia 2008

maven-jetty-plugin i JPA ze springowym SimpleLoadTimeWeaver

0 komentarzy
W mojej krucjacie ku stworzeniu aplikacji webowej z użyciem minimalnego zestawu uruchomieniowego, z facelets oraz maven-jetty-plugin dotarłem do momentu, w którym koniecznym stało się wykorzystanie jakiegoś rozwiązania ORM (mapującego dane relacyjne na obiektowe i vice versa). Nie będę zbyt odkrywczy, jeśli napiszę, że padło na JPA (Java Persistence API). Przypomnę, że nie mam do dyspozycji serwera aplikacyjnego Java EE 5, np. Apache Geronimo, więc postanowiłem skorzystać ze Spring Framework. Zwrócenie się ku Spring Framework było podyktowane chęcią utrzymania minimalnego zestawu uruchomieniowego, którego uruchomienie sprowadzało się do mvn clean jetty:run. Konfigurację JPA oparłem na opisanej w artykule Apache Wicket z JPA z pomocą Spring Framework i Apache Maven 2. Jedyną znaczącą zmianą w stosunku do konfiguracji z artykułu było skorzystanie ze Spring Framework 2.5.5. Ku mojemu zaskoczeniu pierwsze uruchomienie zakończyło się wyjątkiem:
 31  faceletsPU  WARN   [main] openjpa.Runtime - An error occurred while registering a ClassTransformer with PersistenceUnitInfo: 
name 'faceletsPU', root URL [file:/C:/projs/sandbox/facelets-spring/target/classes/].
The error is logged along with this warning. Load-time class transformation will not be available.
java.lang.IllegalStateException: Must start with Java agent to use InstrumentationLoadTimeWeaver. See Spring documentation.
at org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver.addTransformer(InstrumentationLoadTimeWeaver.java:88)
at org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo.addTransformer(SpringPersistenceUnitInfo.java:80)
at org.apache.openjpa.persistence.PersistenceProviderImpl.createContainerEntityManagerFactory(PersistenceProviderImpl.java:126)
at org.apache.openjpa.persistence.PersistenceProviderImpl.createContainerEntityManagerFactory(PersistenceProviderImpl.java:53)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:224)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:291)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1368)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
Rozwiązaniem okazało się zmiana atrybutu loadTimeWeaver w konfiguracji org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean na org.springframework.instrument.classloading.SimpleLoadTimeWeaver, czyli ostatecznie sekcja dotycząca konfiguracji fabryki zarządcy utrwalania w applicationContext.xml wygląda następująco:
 <bean id="entityManagerFactory" 
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="oracleDS" />
<property name="loadTimeWeaver">
<bean class="org.springframework.instrument.classloading.SimpleLoadTimeWeaver" />
</property>
</bean>
Więcej informacji o konfiguracji JPA w Spring Framework, w rozdziale 12.6 "JPA" dokumentacji The Spring Framework - Reference Documentation.

22 sierpnia 2008

Blogorrhea, konfiguracja resource-ref dla Jetty z maven-jetty-plugin oraz APINI Knowledge Base

0 komentarzy
Zatem już wiadomo - cierpię na dolegliwość zwaną Blogorrhea, która objawia się "wyjątkową aktywnością blogera publikującego w jakimś okresie dużą liczbę wpisów". Czyżbym był jedynym, który cierpi na tę dolegliwość, czyli innymi słowy doświadcza tylu ciekawostek dziennie, że ma, o czym pisać i chce mu się tym podzielić z innymi?! Nie sądzę. Dobrze jednak wiedzieć, na co się choruje i spróbować wyleczyć (jeśli uleczalne) niż cierpieć i nie móc temu zaradzić (tu, taka analogia do osób chcących, ale niemogących - chociaż może lepiej nie pisać, niż trafić do kategorii blogasków ;-)). Skąd taka cisza o tym serwisie helionica.pl? Czyżby Helion nie wierzył w cel jego popularyzacji?! Nawet w książkach z Helionu nie zauważyłem wskazania na ten serwis. Ja tam zamierzam skorzystać z tej wiedzy przy kolejnych moich artykułach. Na Helionicę natrafiłem czytając artykuł Radka Holewy Spring i wstrzykiwanie zależności między bean'ami o różnych zasięgach, w którym można znaleźć wiele polskich odpowiedników dla terminów angielskojęzycznych. Nawet znalazło się miejsce dla rusztowania aplikacyjnego jako odpowiednika framework, a sądziłem, że termin pójdzie w odstawkę. Gratuluję Radek dobrego smaku :P

Podczas tworzenia aplikacji webowej z facelets w roli głównej i wspierającym Apache Maven 2, testowym środowiskiem uruchomieniowym naturalnie stał się Jetty poprzez maven-jetty-plugin. Wystarczy zdefiniować następującą sekcję plugin w pom.xml i można uruchamiać aplikację z mvn jetty:run.
 <plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.10</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<systemProperties>
<systemProperty>
<name>jetty.home</name>
<value>./src</value>
</systemProperty>
<systemProperty>
<name>java.security.auth.login.config</name>
<value>src/etc/login.conf</value>
</systemProperty>
</systemProperties>
<jettyConfig>src/etc/jetty.xml</jettyConfig>
</configuration>
</plugin>
Zmiana strony xhtml nie wymaga ponownego uruchomienia Jetty (cf. scanIntervalSeconds), ale klasy niestety już tak. Mimo wszystko możliwość testowania aplikacji w ten sposób znosi początkowe trudności konfiguracji serwera aplikacyjnego (co może stanowić nie lada wyzwanie czasowe). Owa błogość trwała do momentu, kiedy byłem zmuszony skonfigurować dostęp do bazy danych. Powiało grozą, gdyż nigdy wcześniej nie konfigurowałem Jetty, a już na pewno nie w trybie uruchamiania z poziomu wtyczki maven-jetty-plugin. Szczęśliwie strach ma wielkie oczy i konfiguracja dostępu do bazy danych, to dodanie następujących sekcji Array oraz New do pliku wskazanego przez jettyConfig dla maven-jetty-plugin w pom.xml:
 <Array id="plusConfig" type="java.lang.String">
<Item>org.mortbay.jetty.webapp.WebInfConfiguration</Item>
<Item>org.mortbay.jetty.plus.webapp.EnvConfiguration</Item>
<Item>org.mortbay.jetty.plus.webapp.Configuration</Item>
<Item>org.mortbay.jetty.webapp.JettyWebXmlConfiguration</Item>
<Item>org.mortbay.jetty.webapp.TagLibConfiguration</Item>
</Array>
<New id="facelets-webapp" class="org.mortbay.jetty.webapp.WebAppContext">
<Set name="ConfigurationClasses">
<Ref id="plusConfig" />
</Set>
</New>
<New id="faceletsDB" class="org.mortbay.jetty.plus.naming.Resource">
<Arg>jdbc/faceletsDB</Arg>
<Arg>
<New class="oracle.jdbc.pool.OracleConnectionPoolDataSource">
<Set name="URL">jdbc:oracle:thin:@localhost:1521:DEVEL</Set>
<Set name="User">jacek</Set>
<Set name="Password">laskowski</Set>
</New>
</Arg>
</New>
Oczywiście konieczne jest dodanie klas sterownika bazy danych do ścieżki klas (ang. classpath) Jetty (w moim przypadku konieczne było dodanie ojdbc14.jar dla Oracle 8.2.0.8). Dodanie biblioteki do lokalnego repozytorium mavenowego poleceniem mvn install:install-file:
 jlaskowski@work /cygdrive/c
$ mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=oracle \
-DartifactId=ojdbc14 -Dversion=9.2.0.8 -Dpackaging=jar
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'install'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO] task-segment: [install:install-file] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [install:install-file]
[INFO] Installing c:\ojdbc14.jar to C:\.m2\oracle\ojdbc14\9.2.0.8\ojdbc14-9.2.0.8.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
i następującej sekcji dependencies do plugin dla maven-jetty-plugin w pom.xml:
 <dependencies>
<dependency>
<groupId>oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>9.2.0.8</version>
</dependency>
</dependencies>
kończy pomyślnie temat widoczności klas przez Jetty. Istnieje również możliwość dodania sterownika bazodanowego jako zależności maven-jetty-plugin z kwalifikatorem zasięgu - scope - z wartością system, co zniesie konieczność jego instalacji do lokalnego repozytorium mavena.

Na koniec (a może właśnie od tego powinniśmy zacząć, aby osoba konfigurująca środowisko dla naszej aplikacji była świadoma wymagania) odnotowujemy referencję bazy danych używaną w aplikacji poprzez resource-ref w WEB-INF/web.xml:
 <resource-ref>
<res-ref-name>jdbc/faceletsDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
I tyle. Mogę kontynuować pracę z facelets i maven wzbogaconymi o dostęp do bazy Oracle. Więcej informacji o konfiguracji JNDI w dokumentacji Jetty - Using JNDI Resources with jetty6.

Dostałem na skrzynkę wskazanie na ciekawy produkt APINI Knowledge Base polskiej firmy Verax Systems (nie obawiam się podejrzeń o ukrytą kryptoreklamę, gdyż robię to całkowicie świadomię, aby promować polskie innowacje). Autor wiadomości (pracownik firmy) pisał: "Jacku, przy okazji przeszukiwania Internetu zauważyłem twój pomysł na system Knowledge Base. Mieliśmy podobny problem z gromadzeniem i wymiana informacji, a ponieważ jesteśmy firmą produkującą soft, napisaliśmy na własne potrzeby i nie tylko taki system." I dalej "Szczególnie zachęcam do zapoznania się z multimedialną prezentacją systemu tj. z krótkim filmem o podstawowych funkcjonalnościach systemu oraz o korzyściach płynących z zastosowania tego rozwiązania.". Zabrało mi to niecałe 5 minut (przy aktualnie użytkowanym, niezwykle wolnym łączu w sieci UPC) i przyznaję, że system zrobił na mnie niezwykle pozytywne wrażenie. Zastanawiałem się jak pozycjonują się względem Confluence Wiki czy MediaWiki, ale niestety nie otrzymałem odpowiedzi, więc temat otwarty. Mimo wszystko pomyślałem, że warto wypromować produkt polskiej firmy (chociaż nazwa i domena *.com wcale na to nie wskazują). Chciałbym móc napisać, że jest darmowa wersja dla społeczności javowej, ale nic o tym nie wiem. Może spróbować wykorzystać produkt do stworzenia wspomnianej bazy wiedzy javowej? Czy może lepiej pozostać przy darmowej dla niedochodowych organizacji licencji dla Confluence Wiki, albo wręcz użyć MediaWiki?

21 sierpnia 2008

"Wicket in Action" z Manning dostępny publicznie

1 komentarzy
W końcu światło dzienne ujrzała książka o Apache Wicket - Wicket in Action autorstwa jego twórców Martijn Dashorst oraz Eelco Hillenius. Wszyscy poszukujący "biblii" dla Wicketa w końcu ją mają. Członkowie Warszawa JUG również - zajrzyj do Biblioteki Warszawskiego JUGa. Zapraszam do lektury i recenzji (za co przysługują nam kolejne pozycje od wydawnictwa). Czytałem wersję MEAP (Manning Early Access Program), ale przynajmniej wizualnie książka się zmieniła, więc przyjdzie mi zapewne czytać ją ponownie.

W międzyczasie padła propozycja prezentacji o Wicket w ramach łódzkiego JUGa 20. września, więc zainteresowanych zapraszam na przedyskutowanie tematu na żywo z praktykiem - Piotrem Przybylakiem. Do Łodzi w sumie niedaleko ;-)

Final Ebook Delivery *Wicket in Action*
Dear MEAP Subscriber,

Manning is pleased to announce the release of the PDF Ebook version of Wicket in Action. As part of your subscription to the Early Access version of this title, you also can download the finished PDF Ebook Edition at no extra charge.

=======================================
How to Download the PDF Ebook Edition
=======================================

Please download your early PDF Ebook from the following URL(s):

* Wicket in Action

Please be aware that your links are valid for 5 days. If your link expires, please contact Manning customer support so that we can renew your download links.

Thanks again!

Manning Publications Co.
www.manning.com

20 sierpnia 2008

Operatory . i [] w JSF 1.2 i egzamin JSF 1.1 - Basic na javaBLACKbelt

4 komentarzy
Podczas lektury książki o facelets (cf. Book review: Facelets) pojawiło się kilka przykładów konstrukcji Unified EL typu #{bean['value']}. Dla przypomnienia, Unified EL jest językiem wyrażeń wspólnym dla JSF 1.2 i JSP 2.1 (co za zbieg okoliczności z tymi numerami!). W zasadzie, to zgodnie z zapisami w specyfikacji JSF 1.2, rozdział 1.3.7 package javax.faces.el:

As of version 1.2 of this specification, all classes and interfaces in this package have been deprecated in favor of the Unified Expression Language (EL) from JSP 2.1.

Please see Chapter 5 "Expression Language and Managed Bean Facility".


Co oznacza ni mniej, ni więcej, że język wyrażeń JSF zmigrował (upodobnił się) do języka wyrażeń w JSP 2.1. Jako uzupełnienie dodam, że w rozdziale 5 Expression Language and Managed Bean Facility specyfikacji JSF 1.2 napisano:

JavaServer Faces relies on the Unified Expression Language (Unified EL, or just EL) provided by version 2.1 of the JavaServer Pages specification. The EL is described in a separate specification document delivered as part of the JSP 2.1 spec. Please consult that document for complete details about the EL.

Zaglądając do specyfikacji Expression Language Specification Version 2.1 (A component of the JavaServer Pages Specification Version 2.1), do rozdziału 1.6 Operators [] and . znalazłem to, czego nie mogłem zrozumieć podczas lektury książki Facelets:

The EL follows ECMAScript in unifying the treatment of the . and [] operators.

expr-a.identifier-b is equivalent to expr-a["identifier-b"];


I właśnie to było powodem mojego braku zrozumienia zapisów ${bean[items]} (tym razem wyrażenie JSP ze względu na użycie dolara '$' jako wyróżnika, kto - JSP vs JSF - i kiedy będzie interpretował wyrażenie) z książki. Sądziłem do tej pory, że wspomniana konstrukcja #{bean['value']} jest zarezerwowana wyłącznie dla atrybutów ziaren zarządzanych, których typem jest mapa (java.util.Map), czyli konstrukcja #{bean.localeMap.pl} jest równoznaczna z #{bean.localeMap['pl']}, gdzie bean dostarcza metody public Map getLocaleMap(). Teraz już wiem, że bean['value'] odpowiada bean.value, czyli (najczęściej) wykonaniu metody bean.getValue(). Należałoby wspomnieć, że realizacja rozwiązania wyrażenia pozostawia się w JSF obiektowi typu javax.el.ELResolver (więcej o nim w rozdziale 5.5.2 ELResolver specyfikacji JSF 1.2).

I zapewne nie pisałbym o tym, gdyby nie fakt, że znalazłem się dzisiaj na javaBLACKbelt i zachciało mi się egzaminu. Przeglądając listę egzaminów trafiłem na egzamin JSF 1.1 - Basic, który początkowo oblałem (już nie pamiętam kiedy i dlaczego, ale wprost nie mogłem uwierzyć, że wciąż jest na liście do poprawki). Dzisiaj był ten dzień, kiedy postanowiłem popróbować się z nim ponownie. I warto było! Bodajże 3. pytanie właśnie dotknęło wspomnianego tematu operatorów . i [] autorstwa Piotra Kowalskiego (!):
 #{bean.value}

is the same as

#{bean['value']}
I kiedy zobaczyłem je, od razu mnie olśniło! Odpowiedź jest...nie, nie odpowiem wprost i tak już wszystko wiadome, więc po co odkrywać Amerykę skoro dawno odkryta ;-) Teraz i Ty będziesz znał(a) odpowiedź! Może pora na podejście do JSF 1.1 - Basic? Pochwal się wynikiem i czy trafiłeś/-aś na wspomniane pytanie.

Poza tym jednym pytaniem od Piotra, dostałem jeszcze kolejne jego 4 pytania (dwa dotyczyły javax.faces.CONFIG_FILES) i muszę przyznać, że były na na prawdę wysokim poziomie. Gratulacje! Widać gość zna się na rzeczy. Na swoje jedno również trafiłem i może dlatego ostatecznie zakończyłem egzamin z wynikiem 22/ 24 = 91%. Pozostało 7 punktów do niebieskiego pasa (!), a przede mną darmowe Java SE Base API - Intermed, Java 5 New Language Features oraz XML Core - Basic.

Na koniec mojej przygody ze specyfikacją "Expression Language Specification Version 2.1" całkiem przypadkowo trafiłem na rozdział 1.17 Enums dotyczący typów wyliczeniowych (enum). Dowiedziałem się w nim o nieznanej mi wcześniej metodzie
 public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
Przykład użycia to (przykład ze specyfikacji) ${mySuit == 'Spade'}, który uruchomiłby Enum.valueOf(Suit.class, 'Spade'), który z kolei zwróciłby wartość Suit.Spade typu wyliczeniowego Suit. Nie wiem do tej pory, dlaczego zrobiła na mnie takie wrażenie, ale coś mi mówi, że kiedyś takiej metody poszukiwałem. Dodatkowo warto zapoznawać się z tego typu metodami, gdyż przyzwyczajają (= uczą obcować) z typami generycznymi (szablonowymi?), których mistrzami niewielu mogłoby się nazwać (dobrym materiałem szkoleniowym są z pewnością dwie pozycje - Java Generics FAQs - Frequently Asked Questions oraz Generics in the Java Programming Language, których całkowicie nie udało mi się jeszcze "skonsumować").

Pytanie konkursowe: W jaki sposób rozróżnia się wyrażenia JSF i JSP?

19 sierpnia 2008

Dyskusje o znaczeniu facelets

0 komentarzy
Ugrzązłem w rozwoju wtyczki Geronimo NetBeans Plugin i testowaniu (nie)doskonałości rozwojowej wersji NetBeans 6.5, więc powiało orzeźwieniem (auć, początkowo napisałem przez 'ż'!), kiedy przeglądając listę dyskusyjną pl.comp.lang.java natrafiłem na zamierzchły już wątek JSF-facelets a pozycjonowanie i bezposredni URL, w którym Michał odpytywał Brzeziego o znaczenie facelets w świecie aplikacji JSF, szczególnie w kontekście istnienia JBoss Seam, JSF 1.2, Unified EL oraz JSTL 1.2. Nie długo trwało, kiedy trafiłem na bardzo podobną dyskusję tyle, że dotyczyła JSF Templating oraz facelets (mimo wyraźnego porównania różnych rozwiązań, wciąż dotyczyła sensu istnienia facelets) - Facelets vs. JSF Templating. To właśnie ten wątek "zmusił" mnie do pobrania specyfikacji JSR-314 JavaServer Faces 2.0, w której naocznie przekonałem się o znaczeniu facelets w rozwoju JSF 2.0 (patrz rozdział Integration with Facelets jako równouprawnionego do Integration with JSP, acz wyjątkowo skromnego w treści):

As of version 2 of this specification, JavaServer Faces implementations must support (although JSF-based applications need not utilize) using Facelets as the page description language for JSF pages.

This chapter is a place holder for the Facelets specification. Currently it is a scratch pad for spec assertions that apply to Facelets features that are not yet implemented in the current Facelets implementation.


Dodając do tego niedawno zakończoną lekturę książki Facelets Roberta Swarra (O'Reilly, March 2007), której moją recenzję można znaleźć w Book review: Facelets nie mogłem oprzeć się pokusie zdabania tematu i znalezienia odpowiedzi na pytanie, czy wciąż warto zajmować się facelets. W zasadzie to sama wzmianka w specyfikacji JSF 2.0 odpowiada na to pytanie, ale pytanie o znaczenie facelets było w kontekście obecnych technologii webowych, gdzie wciąż króluje JSF 1.2 ze wsparciem JBoss Seam (albo odwrotnie).

Pierwsza strona projektu facelets opisuje go jako Facelets is a view technology that focuses on building JSF component trees. Hmmm, pewnie nie bardzo zrozumiałe dla nowicjuszy jsfowych, więc z pomocą może przyjść dokumentacja facelets - Facelets - JavaServer Faces View Definition Framework, a szczególnie rozdział Chapter 6. Facelets Architecture - (a za nią i wspomniana książka Facelets), gdzie jego obszar działania przedstawiony jest jako:

Facelets is founded on simple principles and the API is a solid reflection of it. The framework is focused on one specific task, and that's tree creation and content interweaving-- taking an XHTML or XML document and using it as instructions to populate a tree of UIComponents. That's it.

A technicznie, sprowadza się do zarejestrowania nowego JSF ViewHandler - com.sun.facelets.FaceletViewHandler w faces-config.xml i cały świat facelets stoi otworem. Od tej pory zamiast JSP jako technologii wizualizacji interfejsu użytkownika korzystamy z XHTML, więc znaczniki JSP, które do tej pory były stosowane idą w odstawkę, a na ich miejsce należy odszukać odpowiedników faceletowych (patrz Why can't I use {JSP Tag library name here} with Facelets?). Można oczywiście stosować facelets i JSP w pojedyńczej aplikacji webowej (patrz How do I use Facelets and JSP in the same application?), więc nic straconego. facelets jest również podstawowym budowniczym widoku w JBoss Seam, więc i na tej podstawie możnaby wysnuć pewne podejrzenia o niebagatelnym znaczeniu facelets.

Ja jednak wciąż nie mogę uporać się ze znacznikami jpivot, które są dla mnie kluczowym elementem w obecnym projekcie. Powodem dla wdrożenia facelets w projekcie było przede wszystkim wsparcie dla tworzenia szablonów, dzięki którym mógłbym podzielić stronę na cześci - nagłówek, stopka, lewy/prawy panel, środek i całkowicie zapomnieć o JSF-owym f:subview i różnych temupodobnych technikach włączania podstron znanych z JSP (ala jsp:include). Książka Facelets uspokoiła mnie, że nie jestem stracony i użycie znaczników JSP dla jpivot będzie możliwe, ale wciąż zastanawiam się, jakie należy podjąć kroki, aby aplikację uruchomić wespół z jpivot i facelets. Początkowo próbowałem się z JBoss Seam, ale zdaje się, że na chwilę obecną wystarczy duet facelets oraz jpivot. Jeszcze rozważam, ile faktycznie mogę poświęcić czasu na rozwiązywanie potencjalnych błędów (kiedy wtyczka GNP czeka). A jak u Was wygląda użycie facelets? Jest dla niego miejsce?

Zagadka na koniec. Właśnie na nią wpadłem i nie mogłem kryć jej dla siebie. Do czego służy poniższa komenda?
 jlaskowski@work /cygdrive/c/apps/netbeans-nightly
$ cmd /C start netbeans-trunk-nightly-200808190201.zip
Zamiast wykonywać kilka czynności, teraz mogę "załatwić" to jedną.

13 sierpnia 2008

Geronimo NetBeans Plugin bogatszy oraz NetBeans IDE 6.5 Beta

0 komentarzy
Nie powiem, żeby było lekko. Rozwój wtyczki Geronimo NetBeans Plugin (GNP) postępuje, ale idzie jak po przysłowiowej grudzie. Dzisiaj miałem przyjemność rozpoznać w jaki sposób NetBeans współpracuje z wtyczkami dla serwerów aplikacyjnych w kontekście kontekstów aplikacji webowych (powtórzenie zamierzone).

Podczas tworzenia aplikacji webowej wybieramy związany z nią serwer aplikacyjny.

Wybór serwera aplikacyjnego to między innymi związanie bibliotek Java EE dostarczanych przez serwer z projektem. Po prostu programista aplikacji nie musi dbać o ich definiowanie każdorazowo przy jej tworzeniu. Można potraktować związanie serwera z projektem jako definicję bibliotek projektowych oraz środowiska uruchomieniowego (które wyznacza, co można w IDE). Takie podejście nie jest niczym nadzwyczajnym w IDE, czy to będzie NetBeans, czy Eclipse, czy IntelliJ IDEA czy...tutaj nazwa Twojego ulubionego IDE.

Jedną z bolączek ostatnich dni podczas rozwoju wtyczki GNP był brak definicji kontekstu aplikacji webowej. Podczas definiowania projektu aplikacji pole Context Path było wypełnione, ale już po jej stworzeniu we właściwościach projektu było puste (!)

Rozwiązaniem okazało się zdefiniowanie klasy realizującej interfejs org.netbeans.modules.j2ee.deployment.plugins.spi.config.ContextRootConfiguration i stworzenie jej egzemplarzy przez fabrykę realizującą interfejs org.netbeans.modules.j2ee.deployment.plugins.spi.config.ModuleConfigurationFactory, a wskazaną przez plik konfiguracyjny wtyczki - layer.xml (plik jest wskazany przez klucz OpenIDE-Module-Layer w META-INF/MANIFEST.MF). Wystarczyło trochę poszperać w javadoc oraz kodach źródłowych wtyczek do GlassFisha, JBossa i WebSphere Application Server, i wszystko stało się jasne. Jestem bliżej pełnego uruchomienia aplikacji webowej na Geronimo z poziomu NetBeans. Już się nie mogę doczekać. Muszę się jeszcze uzbroić w cierpliwość.

Dzisiejszy dzień jest również świętem dla projektu NetBeans, który opublikował wersję beta NetBeans IDE 6.5 Beta. A w nim:

NetBeans.org is proud to announce the availability of NetBeans IDE 6.5 Beta!

* Download Now
* Learn More
* Tutorials & Documentation

NetBeans IDE 6.5 Beta introduces several new features, including a robust IDE for PHP, JavaScript debugging for Firefox and IE, and support for Groovy and Grails. This release also includes a number of enhancements for Java, Ruby and Rails, and C/C++ development. Java feature highlights include: built-in support for Hibernate, Eclipse project import, and compile on save.


Jest tego trochę, więc zainteresowanych skróceniem czasu w projektach na żmudnym konfigurowaniu szkieletów aplikacyjnych, samych aplikacji i zarządzaniu serwerami aplikacyjnymi zachęcam do popróbowania się z NetBeans IDE 6.5 Beta (skoro jest to wersja BETA należy uważać jakie projekty poddamy próbie - warto zabezpieczyć się zapisując projekt w systemie kontroli wersji, aby nie było niespodzianek).

Dla żyjących na ostrzu technologicznego noża może się przydać odpowiedź na pytanie Which daily build is this equivalent to?:

None.
Beta clone has been created on August 4th. Only imported bug fixes were fixed in the clone - http://www.netbeans.org/issues/buglist.cgi?issue_type=DEFECT&resolution=FIXED&keywords=65_HR_FIX

And the Beta was built from this Beta clone, of course. Therefore it is like build from August 4th + bugfixes + branding.
The daily builds are different. Fixing of issues continues. There were 647 bugs fixed in the trunk from the 8/4 - http://www.netbeans.org/issues/buglist.cgi?issue_type=DEFECT&chfield=resolution&chfieldfrom=2008-08-04&chfieldto=Now&chfieldvalue=FIXED


Znalezione w archiwum grupy dyskusyjnej NetBeans users.

11 sierpnia 2008

Klawiszologia NetBeans ponownie, OSGi na JDD 2008 w Krakowie oraz NetBeans Debugger board

4 komentarzy
Każdego dnia uczestnicząc w pracach NetBeans IDE 6.5 Community Acceptance Testing program (NetCAT) mam możliwość poznawania kolejnych skrótów klawiszowych (pewnie łatwiej byłoby przejrzeć po prostu Keyboard Shortcuts Card dostępne pod głównym menu Help, ale poznawanie przez NetCAT traktuję jako efekt uboczny i nie chcę psuć sobie zabawy). Dzisiaj trafiłem na dwa skróty dotyczące operacji na pojedyńczej linii w edytorze Java - Alt+Shift + Up/Down oraz Ctrl+Shift + Up/Down. Pierwszy z nich - Alt+Shift + Up/Down - przenosi linię, na której znajduje się kursor w górę/dół, natomiast drugi - Ctrl+Shift + Up/Down - kopiuje aktualną linię na górze/dole. Z pewnością istnieją dla nich odpowiedniki eclipsowe, ale niestety nie znam ich, a chciałbym. Kto zlituje się nade mną i pozwoli mi je poznać?

Miałem wstrzymać się z ogłoszeniem tej wiadomości, aż do momentu sfinalizowania programu mojego wystąpienia na tegorocznej edycji Java Developer Day 2008 16 października w Krakowie, ale skoro już podano to do publicznej wiadomości, nie pozostaje mi nic innego, jak zaprosić czytelników Notatnika na mój wykład "Wprowadzenie do OSGi (z Apache Felix, Spring Dynamic Modules (aka Spring-OSGi) oraz GlassFish v3 i IBM WebSphere AS 6.1)", w którym przedstawię czym jest specyfikacja OSGi, jej implementacje oraz środowiska oparte o nią. Postaram się również odpowiedzieć na pytania związane z OSGi, do których zadawania gorąco zapraszam. Organizatorzy JDD przyjęli moją propozycję wystąpienia, co zawsze traktuję jako wyróżnienie. Jeśli chcesz poczuć, co mam na myśli zostało niewiele czasu, aby skorzystać z ceny promocyjnej na konferencję (15 sierpnia upływa kolejna zniżka!). Pora zaplanować 16 października i skorzystać z promocji. Rejestracja trwa.

Dzisiaj dostałem wiadomość do skrzynki o rozpoczęciu programu sprawdzenia użyteczności NetBeans Debugger. Peter Pis w Welcome on NetBeans Debugger board napisał:

Let me welcome you on NetBeans Debugger board. This is the first notification email from interest@debugger.netbeans.org mailing list that confirms you're the NetBeans Debugger Contributor. All details about this program can be found:

http://wiki.netbeans.org/NetBeansDebuggerContributors

Task 1:
Your first task is testing of redesign of multi threaded debugging that has been recently integrated into the standard distribution of the NetBeans IDE 6.5. We are also looking forward to your feedback.

The new multi threaded debugging feature set for NetBeans IDE 6.5 has already been finalized, so the main task for now is multi-threaded debugging testing and quality.

Debugger testing will be launched together with the release of NetBeans IDE 6.5 Beta. Time schedule for the first Debugger Contributor task can be found:

http://qa.netbeans.org/processes/cat/65/index.html


Jeśli jesteś zainteresowany/-a uczestniczeniem w programie zapraszam do grupy - wystarczy "send a blank e-mail to interest-subscribe@debugger.netbeans.org". Na każdego czekają liczne wyróżnienia i nagrody, wliczając:

* direct reporting issues into the IssueZilla via Exception Reporter
* new features and UI specification reviews, evaluation of prototypes
* influence on nominating issues that should be integrated into Patch
updates
* influence on nominating issues that should be fixed before releases
* closer cooperation and keeping in touch with development
* T-shirts


Rozumiem, że może nie być zbyt interesujące ocenianie pracy z NetBeans Debugger, ale posiadanie T-shirt'a jest po prostu obowiązkowe na jesień 2008 ;-)

10 sierpnia 2008

Book review: Facelets

0 komentarzy
Zastanawiam się, skąd mi się to bierze, że nie mogę oprzeć się pokusie gromadzenia kolejnych książek, mimo, że mam ich już wystarczająco wiele, aby wypełnić nimi kolejne tygodnie, a nawet miesiące. Zdaje się, że jedynym wytłumaczeniem to jakaś nieodparta żądza posiadania, która w połączeniu z fikcyjnym brakiem czasu na ich czytanie tylko potęguje problem. Piszę fikcyjnym brakiem czasu, gdyż już wielokrotnie doświadczyłem sytuacji, gdzie rozwiązanie problemu zajmowało kilka godzin/dni/miesięcy, a wystarczyło po prostu zajrzeć do dokumentacji bądź przeczytać książkę i...zaoszczędzić wiele brakującego czasu. Okazuje się również, że "obsłużenie" 100-stronicowej książki o facelets może być dla niejednego niezwykłym wyzwaniem. Dla mnie było, bo wciąż walczyłem ze sobą, aby oprzeć się pokusie i nie zasiąść przed komputerem, i zamiast czytać programować. Szczęśliwie stało się tak, że wytrwałem i veni vidi vici! ;-)

Coś mnie tknęło, aby zabrać się za przeczytanie innej książki związanej z JSF, po tym jak zmęczyła mnie książka o tworzeniu kontrolek i rendererów JSF (o niej niebawem, kiedy w końcu dotrę do wymarzonego końca). Tym razem "na tapetę" poszła książka Facelets autorstwa Roberta Swarra z O'Reilly (March 2007). Z nieukrywaną przyjemnością czytałem ją bez wytchnienia, aż do jej zakończenia, co z zaskoczeniem ukończyłem w kilka godzin. Książkę otrzymałem w ramach serii recenzji grupy Warszawa JUG i trochę już na mnie czekała. Teraz stwierdzam, że nie warto było odkładać jej lektury na nieokreślone później. Książka jest warta kilku godzin, bo wiedzy zdecydowanie przybyło po jej lekturze. Projekt facelets jest niewielki, więc niejeden może zdziwić się, cóż zajęło autorowi aż 100 stron, aby go przedstawić, ale okazuje się, że moja niewielka wiedza o tym projekcie zdecydowanie wzrosła po lekturze książki i nie znalazłem strony, która nie byłaby potrzebna. Coś było w tej książce, co przyciągało (pewnie owe 100 stron, co w książkach informatycznych zdaje się być wyjątkiem), acz długo trwało zanim się za nią zabrałem. Teraz widzę, że wiele traciłem i facelets staje się moim podstawowym szkieletem aplikacyjnym w kolejnych projektach JSF. W połączeniu z ajax4jsf zdaje się być wymarzoną parą na kolejne dni projektowe. Z pewnością znajdzie się kilka słów w Notatniku o nich, a wszystko za sprawą książki. Warto było pochylić się nad nią. Polecam!

Zainteresowanych angielskojęzyczną recenzją zapraszam do lektury Book review: Facelets (ze względu na wymogi wydawnictwa recenzja jest w języku angielskim).

06 sierpnia 2008

Skróty klawiszowe w NetBeans, Geronimo 2.1.2, wolatylność i demo Hibernate Support in the NetBeans IDE

11 komentarzy
Ostatnie dni spędzam ślęcząc godzinami nad rozwojem wtyczki NetBeans dla Geronimo (GNbP - Geronimo NetBeans Plugin) i każdy dzień to jakaś "ciekawostka". Piszę w cudzysłowiu, bo praca z zarządcami klas (ang. classloader) w NetBeans to jak praca z Ajaxem normalnie "czystym relaksem" (prawdopodobnie w każdym bardziej złożonym środowisku miałbym podobne problemy, więc nie spodziewałbym się wielu ułatwień w tym obszarze, np. w Eclipse czy IntelliJ IDEA). A że nie stworzyłem sobie żadnych testów, to klepię wciąż to samo sprawdzając, czy tym razem jest lepiej. W końcu jest lepiej. Udało mi się w końcu przejść pomyślnie krok uruchomienia i zatrzymania Geronimo oraz dzisiaj uruchomiłem pierwszą aplikację webową (!) Jest jeszcze problem z automatycznym uruchomieniem przeglądarki ze względu na błąd związany z niezdefiniowaną zmienną ${url.client}, ale sama aplikacja jest już poprawnie uruchomiona. Kolejny kamień milowy zaliczony. Jeśli jesteś zainteresowany/-a kodami zapraszam do pobrania projektu z repozytorium SVN - http://svn.apache.org/repos/asf/geronimo/sandbox/geronimo-netbeans-plugin. Chętnie popracowałbym w parze, albo w ogóle w grupie równie zdeterminowanych co i ja (projekt rozpocząłem bodajże 1,5 roku temu, a postępy mierne!) ;-)

Tak sobie siedzę przed tym NetBeans i tak się złożyło, że w zasadzie Eclipse'a nie widziałem już dawno (poza jego komercyjnymi odpowiednikami, jak RAD czy WID). Czym więcej człowiek siedzi w wybranym IDE tym bardziej korci go próbowanie się z dostępnymi skrótami klawiszowymi. W którymś momencie spróbowałem skrótu psvm + TAB i jakie było moje zdumienie, kiedy w klasie pojawił się szablon metody main:
 public static void main(String[] args) {
}
Teraz już łatwo zrozumieć skąd ten skrót - psvm - public static void main. Nigdy nie udało mi się namierzyć tego w Eclipse (przyznaję, że nie poświęciłem temu wiele czasu, więc zapewne stąd nadal brak odpowiedzi). Plus dla NetBeans. Edytor javowy zawsze był domeną Eclipse, ale tym razem NetBeans rulez.

Tak sobie przeglądam kodu źródłowe wtyczek dla GF, WAS, WLS i JBAS w NetBeans i natrafiłem na taką konstrukcję (zmodyfikowaną na potrzeby wtyczki GNbP):
 static {
java.util.logging.Logger.getLogger("org.apache.geronimo.netbeans").setLevel(java.util.logging.Level.FINEST);
java.util.logging.Logger.getLogger("org.apache.geronimo.deployment.plugin.factories").setLevel(java.util.logging.Level.FINEST);
}
Bardzo spodobała mi się owa sztuczka, która polegająca na statycznej konfiguracji poziomu odnotowywanych zdarzeń aplikacji. W ten sposób zapominam o konfiguracji za pomocą jakiegoś tam pliku, gdzieś tam (świadomie podkreślam moją tymczasową niewiedzę, co musiałbym ustawić i gdzie). Po prostu mam gwarancję, że uruchomienie klasy zawierającej ten blok statyczny zapewni mi odpowiedni poziom komunikatów. Trudno mi znaleźć więcej zalet niż chwilowa niewiedza, gdzie umieścić odpowiedni plik konfiguracyjny, ale co tu dużo ukrywać, zachwyciłem się tą konstrukcją. Pewnie nie udałoby mi się odeprzeć zarzutu o braku możliwości zmiany bez kompilacji, co w dobie dynamicznych konfiguracji "w locie" (= w trakcie wykonywania aplikacji) jest nie do przecenienia, ale efekt zachwytu jest. Pomyślałem, aby odnotować tą ciekawostkę. Może się później przyda ponownie i już będę wiedział, gdzie jej szukać.

Kontynuując moją batalię z zawiłościami bardziej zaawansowanej pracy w środowisku NetBeans IDE 6.5 (przypominam, że wciąż w wersji rozwojowej) natrafiłem na kolejny skrót klawiszowy Ctrl+Shift+I, który, w przeciwieństwie do Alt+Shift+I, obsługuje dodanie brakujących importów w całej klasie/interfejsie bez konieczności ustawienia kursora na podkreślonym typie. Napotkałem również Ctrl + F12, czyli eclipsowe Ctrl+O, który otwiera widok na składowe - pola i metody - edytowanego typu (=klasa lub interfejs). A na koniec, już rozochocony moimi znaleziskami, postanowiłem sprawdzić skrót fore + TAB (wstawia szablon pętli for po Enumeration). Działa! I jest również w Eclipse, podobnie jak fori. Ciekawym, ilu z Was korzysta z takich udogodnień w swoim wybranym IDE. I ile z nich jest całkowicie nieintuicyjnych? Nie mogłem wyjść z podziwu, kiedy zobaczyłem z jakim niedowierzaniem i zdumieniem są przyjmowane te i inne sztuczki przez osobę całkowicie niezaznajomioną z nimi, a która dopiero rozpoczynała swoją działalność z Eclipse IDE. Po prostu nie mogła nadziwić się, że tak można (!) Zobaczyć rozradowaną minę kolegi...bezcenne! ;-)

Ja się zabawiam wtyczką GNbP, a tu proszę Apache Geronimo v2.1.2 - Released:

Apache Geronimo v2.1.2 have passed 100% SUN's Java Enterprise Edition 5.0 Certification Test Suite. Refer to Apache Geronimo v2.1.2 Release Notes for further details.

The Apache Geronimo project is pleased to announce the new v2.1.2 release. This release is primarily a maintenance upgrade that pulls together fixes not only for Geronimo but also other key components included in the server. Improvements have been made in the administrative console, GShell command line processing, messages, and numerous other areas. Details of the fixes included can be seen in the Release Notes. Many issues have also been resolved in newer versions of core components that have been included in this Geronimo release. Geronimo v2.1.2 component upgrades include Tomcat 6.0.16, CXF 2.0.8, JavaMail 1.5, MyFaces 1.2.3, WADI 2.0, and Yoko 1.0 among others.


Pierwszym zaskoczeniem był rozmiar paczki, gdzie poprzedni geronimo-jetty6-javaee5-2.1.1-bin.tar.gz to 71,2MB a geronimo-jetty6-javaee5-2.1.2-bin.tar.gz to 68,8MB. Czyżby Geronimo skorzystał z jakieś diety odchudzającej?! Oby nie okazało się, że w tym odchudzaniu zabrakło jakieś funkcjonalności. Okazuje się, że można dodać nowe (patrz Geronimo 2.1.2 Release Notes) i ostatecznie zmniejszyć rozmiar paczki dystrybucyjnej.

Wspominałem już o mojej analizie kodu źródłowego wtyczek NetBeans dla innych serwerów aplikacyjnych. Lektura źródeł zawsze kończy się dla mnie jakąś niespodzianką. Nikt nie mówi, że musi być ona przyjemna, ale tym razem była. Okazuje się, że raczej rzadko stosowana acz kluczowa klasa java.lang.ClassLoader udostępnia statyczną metodę getSystemClassLoader(), która zwraca systemowego zarządcę klas, który jest nadrzędny dla wszystkich nowych zarządców klas. Jest to zazwyczaj zarządca odpowiedzialny za uruchomienie aplikacji. W typowych aplikacjach desktopowych będzie to również zarządca dostępny przez Thread.currentThread().getContextClassLoader(). Co mnie jednak zdumiło w całym tym skomplikowanym świecie zarządców klas to możliwość nadpisania domyślnego zarządcy przez zmienną java.system.class.loader. Niby nic nadzwyczajnego, ale możliwość zdefiniowania własnego rozszerzenia środowiska uruchomieniowego naszych aplikacji javowych daje większe możliwości niż jego nieznajomość. Nawet jak nie wiadomo po co, to warto wiedzieć. A nuż się przyda. Największe jednak zdumienie wywołał fakt, że jest to statyczna metoda, której istnienia w ogóle nie byłem świadom. W zasadzie zaleca się korzystanie z Thread.currentThread().getContextClassLoader() do dynamicznego ładowania klas (co jest szeroko stosowane np. w OSGi), więc wiedza zdaje się być nikłej wartości praktycznej. A może komuś jednak udało się skorzystać z tej metody, albo wręcz z tej zmiennej środowiskowej? Koniecznie się tym należy pochwalić tu i teraz.

Na koniec chciałbym wyrazić swoją dezaprobatę na szastanie naszym językiem we wszystkie możliwe strony i bezkrytycznym naśladowaniem "wyuzdanych" tłumaczeń. Kilka przykładów z szerokiego świata javowego. Nie, nie wspomnę o kontrowersyjnym ziarnie jako odpowiedniku bean, czy szkielecie aplikacyjnym lub rusztowaniu, czy ostatni hit sezonu - stelażu - dla framework, ale o kilku bardziej wyuzdanych. Zacznijmy od customize. Ile to razy wokół mnie pada termin "kastomizacja". Czy nie można po prostu użyć słowa dopaso(wy)wanie?! Czyż nie ładniej brzmi i na pewno wyjaśnia co autor miał na myśli. Pewnie niejeden z nas przez moment miał zawrót głowy od "kastomizacja" czy "kastomizowalny", ale po chwili samemu rozpoczął krucjatę "kastomizacji". Proponuję zaprzestać jego używania raz na zawsze. Zgoda?

Kolejnym kandydatem na ustrzelenie, to nieszczęsne - zaadresowanie problemu jako odpowiednik angielskiej frazy address an issue, czyli obsłużyć problem. Wystarczy więc obsłużyć problem tłumaczeń, aby dopasować jeden język do drugiego i już jesteśmy bardziej rozumiani. W tym samym tonie miałem ostatnio okazję wysłuchania wypowiedzi szefa pewnego TFI na P w TVN CNBC (gość pod krawatem wyprasowany na kanty, gdzie się dało), który użył słowa, które wręcz zdusiło mnie za gardło - wolatylność. Po prostu odjęło mi mowę. Dopiero zaczynam moje potyczki ekonomiczne, ale jeśli mam doświadczać tej nowomowy znanej mi poniekąd z informatyki, to zapewne powinienem zacząć się przyzwyczajać do takich kwiatków? Pewnie Cię zaintrygowało czytelniku cóż może znaczyć owo słowo, więc zapraszam do wspaniałego wyjaśnienia słowa wolatylność w Wademekum LESZCZA !! ( Z PARKIETU). Autor wyjaśnił słowo nad wyraz wspaniale:

WOLATYLNOŚĆ (od ang. volatility) nowomowa ANALI, którzy chcą pokazać, ze obracają się w nie byle jakim towarzystwie. Normalny człowiek powie po prostu zmienność.

ANALe to analitycy rynków kapitałowych. Potrafią przyłożyć, nieprawdaż? W ten sposób zamiast zapraszać odstraszają. Czyż nie doświadczamy tego również i w naszej polskiej rzeczywistości programistycznej, z owymi frameworkami i beanami? Zgoda, szkielet aplikacyjny czy ziarno nie poprawia za bardzo sprawy, ale można liczyć na pewne skojarzenia u rozmówcy, niezaznajomionego z obowiązującą nomenklaturą. Właśnie o to chodzi. Niekoniecznie musi to wyjaśniać temat dokładnie, a wystarczy, aby sugerował znaczenie.

Na zakończenie dla spragnionych wsparcia Hibernate w NetBeans ciekawe demo Hibernate Support in the NetBeans IDE. Nie jest to bardzo wyrafinowane demo, ale pokazuje jak w prosty sposób można szybko stworzyć prototyp aplikacji wizualnie (trochę kodowania też jest, więc nie ma obawy, jeszcze nas nie pozwalniają po wdrożeniu NetBeans IDE w firmach). Pora wygodnie się rozsiąść, założyć ręce za głowę i włączyć prezentację. Warto chociażby dla samej nauki języka i trudnej sztuki prezentacji (jednoczesne kodowanie i mówienie nie należy do łatwych zadań). Zastanawiam się jakim powodzeniem cieszą się takie krótkie filmy-demo w porównaniu z artykułami ze zrzutami ekranów. Lepsze? Gorsze? Mam wrażenie, że ich odbiór jest przyjemniejszy, ale nie można ich wydrukować, i przeczytać w autobusie/metrze, więc jest trochę wad. Jeśli mniej niż zalet, to może warto wdrożyć taką formę prezentacji w Notatniku? Miłego oglądania!

01 sierpnia 2008

Urlop na Roztoczu oraz wtyczka NetBeans dla Geronimo

5 komentarzy
"Każdy ma swój urlop, miałem i ja - na Roztoczu" mógłbym parafrazować słowa pewnej reklamy. Tak, to prawda. Po długim ślęczeniu przed komputerem w końcu nadeszła pora na wymarzony urlop. Żona zafundowała mi rodzinny wyjazd na kilka dni na Lubelszczyznę, a dokładnie na Roztocze w Roztoczańskim Parku Narodowym we wsi Rudka k/Zwierzyńca.

Pierwszy dzień - terenu rozpoznanie. Drugi dzień - od rana kajakiem spływanie (Wieprzem). Trzeciego - spływu kontynuowanie. W międzyczasie wizyta w Zamościu, w którym rodzinie obiecałem wizytę na zamku, który...nie istnieje! Skąd ja wziąłem to przekonanie o zamku?! Sądziłem, że w Zamościu jest zamek, bo to takie historyczne miasto, a tu nic, zero zamków. Mimo wszystko warto było. Odwiedziliśmy bar mleczny przy Rynku Głównym, w którym jedzenie było przepyszne, a na samym Rynku pyszne gofry. W wolnej chwili wylegiwanie na plaży nad jeziorem "Stawy Echo" w samym Parku, przy stanowisku Konika Polskiego. Wszystko okraszone piwem Zwierzyniec za bagatela 4PLN za 0,5L w knajpie (!) Trudno się dziwić skoro browar piwa Zwierzyniec to właśnie miasto Zwierzyniec. Pogoda dopisała, więc wyjazd, mimo, że jedynie 5-dniowy, udał się wspaniale. Bez dostępu do komputera, braku telewizora, ze spaniem po 9 godzin i ciągle na dworze można niesamowicie wypocząć. Polecam! Jako podsumowanie wspaniałego miejsca na wypoczynek niech wystarczy (niewyraźne) zdjęcie z miejscowej lodziarni.

Potrafią rozbawić człowieka, nieprawdaż?! Po drodze na Roztocze (z Warszawy) przejeżdża się przez miasto chrząszcza - Szczebrzeszyn. Teraz, nie tylko potrafię wskazać kolejny Park Narodowy, ale i wiem, gdzie ów słynny Szczebrzeszyn leży. Jako ciekawostkę pobytu w zajeździe "W Starym Kinie" w Rudce codzienny brak Javy rekompensowało mi śniadanie z Mocha Java na ścianie.

Chyba jestem skazany na Javę.

W drodze powrotnej zawitaliśmy do Karczmy "Bida", która mimo swojej nazwy serwowała smakowite dania w porcjach znacząco przewyższających nasze oczekiwania. Przyzwyczajeni do typowych rozmiarów potraw w przydrożnych karczmach trzeba było widzieć nasze miny, kiedy na deser zamówiliśmy placki ziemniaczane i naleśniki, a podano nam zestawy obiadowe. Jedzenie pyszne i to w okazałych ilościach.

Po powrocie przejrzenie poczty, a tam ciekawostka związana z NetBeans IDE 6.5. Co jakiś czas NetBeans 6.5 (w fazie rozwojowej) zaskakuje. A to wsparcie dla nowych typów projektów, a to znaczna poprawa wyświetlania struktury katalogowej projektów podczas ich importu/otwarcia/itp., a tu jeszcze...wsparcie Apache Geronimo przez NetBeans IDE za pomocą wtyczki Geronimo 2 Application Server. Nikt się nie chwalił, nikt nie napisał, niedobrze. Taka funkcjonalność, a tak niewiele reklamy. Czyżby autorowi nie zależało na sprawdzeniu wtyczki w ogólnym użyciu?

Jeszcze nie próbowałem się z nią, ale może ktoś z Was już to zrobił?! Jakie wrażenia? Warto się jej przyjrzeć? Jaka wersja Apache Geronimo jest wspierana? Podobno rozwojowa wersja 2.2 nie jest.

p.s. W trakcie urlopu udało mi się zebrać w sobie i przeczytałem książkę "Bogaty Ojciec, Biedny Ojciec" Roberta T. Kiyosaki'ego. Książka przedstawia prawdy oczywiste na temat naszego podejścia do pieniędzy i pracy, która jest ich głównym źródłem, w bardzo nietypowy sposób. Nawet, jeśli wciąż liczysz, że praca jest dla Ciebie wszystkim, a ZUS zapewni Ci dostatek, warto zapoznać się z nią. Teraz wszędzie wokół mnie widzę tylko pasywa ;-) Pora zabrać się za stronę aktywów. Sugestie mile widziane.