31 sierpnia 2010

Weekendowa wycieczka do Tarczku w Świętokrzyskim

2 komentarzy
Gospodarstwo Agroturystyczne - Anna i Andrzej Trepkowie
Miniony weekend spędziłem rodzinnie w Górach Świętokrzyskich we wsi Tarczek w Gospodarstwie Agroturystycznym Anny i Andrzeja Trepków. Zdecydowanie polecam.

Wyjechaliśmy w sobotni ranek, aby około 10tej zjeść śniadanie z "koszyka pyszności" z jajkami gotowanymi na twardo, bułkami, pomidorami i herbatą z termosów (była też i kawa dla zainteresowanych!). Postanowiliśmy iść na całość i poczuć klimat wycieczek rodzinnych, w których jajka na twardo grały pierwsze skrzypce. Śniadanie na świeżym powietrzu było wspaniałe!

Na miejsce dotarliśmy około południa, aby zjeść obiad, który każdemu zapadnie w pamięci na długo. Nie tylko, że zupa, drugie danie i deser, więc ilościowo ponad moje możliwości, ale smakowite, że palce lizać. Znajomi zmuszeni byli odwiesić dietę do niedzieli :)

Na miejscu był stół do tenisa stołowego na zewnątrz pod okapem i piłkarzyki, i część czasu spędziliśmy grając. Pogoda nie rozpieszczała, a wręcz zaczął padać deszcz, ale mimo to wybraliśmy się na Święty Krzyż na Łysej Górze. To już drugi raz, kiedy tam jestem, a syn był tam nawet 3 razy, ale w końcu nie chodziło o to, aby zwiedzić coś nowego, a mile spędzić czas rodzinnie i ze znajomymi, i zarzyć świeżego powietrza spacerując po ciekawej okolicy. Szkoda tylko, że padało.

Kolacja była wspaniała. Obiadu zjadłem niewiele i do tego spacer, więc danie w postaci gotowanych klopsów/kulek ziemiaczanych weszło mi w oka mgnieniu i skończyłem na bodajże 4 porcjach. To była kolacja!

Na drugi dzień zaplanowaliśmy grzybobranie. O 8:00 śniadanie i o 9tej byliśmy w lesie. Trochę zbyt wysokie runo i dużo drzew liściastych, więc początkowo byłem sceptyczny, aby cokolwiek ciekawego znaleźć. Po chwili było ciekawiej. Doszukaliśmy się sporo zajączków, trochę borowików, kurek, ale i...goryczaków. Podobno (nie jest to potwierdzone i będziemy musieli wyrzucić nasze zbiory) był też jeden szatan! Po raz pierwszy spotkałem się z takim wysypem goryczaków, a nawet sądziłem przez (dłuższy) moment, że to koźlarze, chociaż brzóz ni widu ni słychu w promieniu kilometra :) Po raz pierwszy również spotkałem się z borowikiem ceglastoporym. Jak to mówią - człowiek uczy się całe życie. Gdyby znalazł się wśród czytelników osobnik znający się na grzybach, który zechciałby podzielić się swoją wiedzą, byłbym niezmiernie wdzięczny. Zdjęcia grzybów znajdują się w galerii Grzybobranie w Tarczku (świętokrzyskie) (pomyłka w nazwie, bo zamiast Tarczyn powinno być Tarczku, ale na razie nie mogę dostać się do konta, aby to zmienić).

Wróciliśmy z grzybów około 14tej wprost na obiad. Po nim partyjka tenisa, piłkarzyki, zrobiło się zimno i mimo pogody nikomu nie chciało wracać się do domu. W końcu jednak zebraliśmy się i jeszcze po drodze zajechaliśmy do pobliskiego Bodzentyna, w którym trwał akurat jakiś festyn, a może nawet odpust (?) Jak na ostatni weekend wakacji trasa powrotna była przejezdna bez większych problemów.

Pora na zbratanie się z jakąś encyklopedią grzybów przez kolejnym wrześniowym grzybobraniem. To pewnie będzie (przed?)ostatni wypad na grzyby. Później pewnie już tylko narty, a może snowboard? Tak po prawdzie już niedługo śnieg. Na Kasprowym podobno padało (!)

A gdzie Tobie udało się spędzić weekend? Można prosić o namiary na ciekawe miejsce na weekendowy wypad, abym nie musiał zbyt długo szukać, a jednocześnie zaimponować mojej żonie znaleziskiem (do tej pory tylko jej udaje się znajdować miejsca na nasze wypady i trudno ją będzie przebić). Może nawet moglibyśmy obgadać coś Javnego na miejscu? ;-)

27 sierpnia 2010

Book review: Practical Clojure

0 komentarzy
Okładka książki Practical Clojure
Mojej podróży w krainę programowania funkcyjnego z Clojure ciąg dalszy. Właśnie ukończyłem spisywanie wrażeń z lektury ostatniej pozycji książkowej z wydawnictwa Apress, które rzadko zawodzi i w tym przypadku również spisało się na medal - Practical Clojure autorstwa Luke VanderHart i Stuart Sierra trafiła na półkę Biblioteki Warszawskiego JUGa. Polecam ją każdemu, kto ma chęć zasmakować Clojure i dowiedzieć się więcej nt. Software Transaction Memory i spraw współbieżności w programowaniu bezstanowym (to ta łatwiejsza strona), ale i ze skutkami ubocznymi (aka stanem).

Jedna uwaga - proszę nie sugerować się tytułem, który mógłby wskazywać, że w książce można znaleźć aspekty praktycznego użycia Clojure w naszych rozwiązaniach. Nic bardziej mylnego. Ja dałem się nabrać, ale mimo, że oczekiwania były duże i nie zostały w pełni spełnione, jestem usatysfakcjonowany możliwością poznania Clojure dokładniej. Było warto, aczkolwiek kwestia użycia Clojure praktycznie wciąż pozostaje dla mnie zagadką. Ponad 10 lat zabawy z korporacyjną Javą odcisnęło swoje piętno i trudno mi się pozbyć karbów programowania webowo-imperatywno-obiektowego.

Od razu zabieram się za The Joy of Clojure, które liczę, że rzuci więcej światła na praktyczną stronę użycia Clojure. Po niej mam w planach kolejną, czwartą (i raczej ostatnią) książkę o Clojure - Clojure in Action i albo znajdę dla niego zastosowanie, albo zarzucam temat na rzecz...F# :)

Zainteresowanych moją recenzją "Practical Clojure" zapraszam do lektury Book review: Practical Clojure.

p.s. Książka jest już wypożyczona, więc zainteresowanych jej lekturą uprasza się o kontakt za 1 miesiąc, powiedzmy październik (akurat na rozpoczęcie sezonu spotkań Warszawa JUG!).

26 sierpnia 2010

W pogoni za Clojure - w końcu się uda zastosować, tylko trochę jeszcze potrwa

1 komentarzy
Logo Clojure
Połowa dnia, a mnie od zachwytów nt. Clojure już boli głowa. Mówią, że dobrze jest poznać nowy język programowania, szczególnie jeśli wymaga zmiany myślenia i w przypadku mojego doświadczenia imperatywno-obiektowego, Clojure jako język funkcyjny (aczkolwiek jeszcze nie powiedziałbym, że i funkcjonalny) wpasowuje się idealnie. Mówią również, że jak boli, to działa, więc zaczynam odczuwać trudności podchodzenia pod górę, którą zwą Clojure.

Wczoraj do zbioru narzędzi, które należałoby rozpracować doszły conjure z hiccup oraz sandbar. Przypomnę, że krążę wokół zastosowania Clojure w aplikacjach webowych, których wokół mnie pełno i doświadczenia z korporacyjną Javą (jak zwę Java EE) nie pozwalają mi sądzić, że mogą być jeszcze inne rodzaje, jak niewebowe. Zauważam przy tym, że może niekoniecznie należałoby stosować Clojure bezpośrednio w aplikacjach webowych, a jedynie po stronie serwera, gdzieś do przetwarzania dużych ilości danych (przetwarzanie wsadowe?) w środowisku rozproszonym. Na chwilę obecną większość bibliotek/rozwiązań dla Clojure tworzonych jest na githubie, co może przyprawić o lekki ból głowy osoby przyzwyczajone do korzystania z wersji stabilnych/produkcyjnych projektów, które doczekały się co najmniej swojej własnej strony webowej. Ja do takich należę, więc korzystanie z rozwiązań z githuba traktuję raczej hobbystycznie w celach poznawczych samego Clojure, a nie ich konkretnie. Na razie działa, pewnie głównie dlatego, że są one stosunkowo małych rozmiarów, przez co niezwykle specjalizowane. Łatwo rozczytać się w kodzie, zrozumieć jego istotę i potencjalne zastosowanie w kilka minut/godzin, a to zdecydowanie mi wystarczy.

Kontynuując moje poznawanie świata funkcyjnego dzień zacząłem od przeglądania dyskusji na grupie dyskusyjnej clojure, skąd trafiłem na temat Multiversion concurrency control. Skąd mnie tam poniosło?! Okazuje się, że Clojure STM to nic innego jak właśnie MVCC, w którym każda transakcja ma swój zrzut aktualny repozytorium danych. Świadomię napisałem "repozytorium danych", aby oddzielić temat od baz danych, które również z tego rozwiązania korzystają. I tu mnie olśniło. Właśnie MVCC sprawia, że Clojure STM to nic innego jak...baza danych. Okazuje się, że nie tylko baza danych (w sensie relacyjnej/obiektowej bazy danych), ale również Subversion opiera się na MVCC. Czyż to nie odkrywcze, jak to powiedzieliby nasi znajomi "zza wielkiego bajora" - mind-blowing (jeśli nie dla Clojure, czy wynurzeń, chociaż czytelnik pozna nowe słownictwo angielskie czytając moje wpisy :)).

Zaraz mnie wzięło na rozgłaszanie tych odkryć i posłałem kilka twittów na moim kanale @jaceklaskowski. Po chwili otrzymałem odpowiedź od @antoniovieiro:

@jaceklaskowski Yep Software Transactional Memory is similar to database transactions (with commits and rollbacks) http://tinyurl.com/dyecjo

A tam Papers and presentations about transactional memory in Haskell. Od Microsoft? A bodajże dzisiaj czytałem o zarzuceniu STM przez niego w jakimś projekcie?! F#?!

Bez względu na (bez?)sensowność rozgłaśniania swoich prywatnych poczynań na twitterze, widać, że często staje się źródłem dotarcia do ciekawych ludzi, których w przeciwnym przypadku nie byłoby nam dane spotkać (nawet wirtualnie). W ten sposób przekonuję swoich studentów podczas praktyk w IBMie, aby nagłaśniali swoje problemy - ja śledzę ich postępy, a oni otrzymują rozwiązania ze świata, dając się jednocześnie poznać jako specjaliści w danym obszarze.

Skoro przy IBM, a wciąż przy Clojure, trafiła mi się dzisiaj kolejna ciekawa sytuacja - spotkałem studenta z PJWSTK, który jest na praktykach w IBM i który również rozpoznaje to wszystko, co ja obecnie poznaję - Clojure et al. - i korzysta w projekcie przetwarzającym...rozkład jazdy autobusów w Warszawie (czy podobnie, ale sens jest ten sam). Kiedy zacząłem rozmawiać z kolegą z zespołu o MVCC i DB2, ów student (na razie zachowam jego dane na prywatny użytek) okazał się równie zainteresowany i znający tematykę, że pozwolił sobie...siebie poznać! W ten sposób mam namiary na kolegę z Warszawy zajmującego się Clojure i poznający jego zastosowanie w projektach. Możnaby powiedzieć, jaki ten świat mały, ale brzmi to tak banalnie.

W trakcie rozczytywania się w artykułach dotyczących Clojure w projektach, trafiłem na artykuł Clojure and Rails - the Secret Sauce Behind FlightCaster, w którym pojawiają się rozwiązania do tej pory nieprzystające do rozwiązań, którymi się zajmowałem. Innymi słowy, nie było mi dane ich poznać, bo za nowe, zbyt przewracające w głowie i przez to chwilowo na rozpoznaniu w zespołach projektowych, które taką aktywność w ogóle wliczają w swoją działalność (chciałbym powiedzieć, że robią tak wszystkie, ale wiem(y), jak jest, niestety). Nawiązuję do Hadoop, Cascading i Cloudera. Wygląda mi na to, że Clojure i świat języków funkcyjnych wymaga/wymusza stosowanie innych rozwiązań. Jak to idzie? Ach, już mam: "if all you have is a hammer, everything looks like a nail". W końcu nie samym OO człowiek powinien się delektować i odrobina PF nikomu jeszcze nie zaszkodziła (a tym, którym tak, wliczamy po cichu do wyjątków, ale nie wyjątkowych).

Oby poznawanie nowego nie przyprawiało Was o taki mętlik w głowie, jak mnie nagina Clojure. Nie życzę nikomu takiego bałaganu. Może się przydać How to Learn a Programming Language, a przede wszystkim How To Become A Hacker, w którym można przeczytać:

LISP is worth learning for a different reason — the profound enlightenment experience you will have when you finally get it. That experience will make you a better programmer for the rest of your days, even if you never actually use LISP itself a lot.

It's best, actually, to learn all five of Python, C/C++, Java, Perl, and LISP. Besides being the most important hacking languages, they represent very different approaches to programming, and each will educate you in valuable ways.


Ciekawym, jak Wam przychodzi poznawanie nowego. I nie pytam o nowsze, ale całkowicie nowe, odmienne. Da się? Ile trwa? Bolało? Warto było? Na rozpoczynający się sezon spotkań Warszawa JUG możecie liczyć na kilka prezentów funkcyjnych ode mnie.

25 sierpnia 2010

Programowania funkcyjnego z Clojure początki niełatwe (szczególnie mentalnie)

11 komentarzy
Z programowaniem mam do czynienia od kilkunastu lat i zaczyna mi doskwierać coraz bardziej zauważalne ograniczenie mentalne wynikające właśnie z doświadczenia w programowaniu imperatywnym, począwszy od języka BASIC, później Pascal, C i C++, aby ostatecznie osiąść na Javie. W międzyczasie były jeszcze spotkania z innymi językami (nawet funkcyjnymi i logicznymi!), ale nazwijmy to szkolnym epizodem. I właśnie owe nietrwałe przyjaźnie z tymi innymi językami dają mi się teraz we znaki podczas nauki programowania funkcyjnego z Clojure.

Wciąż nie mogę znaleźć odpowiedzi na jedno pytanie, które nurtuje mnie od samego początku spotkania z programowaniem funkcyjnym w wykonaniu Clojure (i rzadko F#) - gdzie są jego zalety w aplikacjach webowych, czy trochę szerzej korporacyjnych?

Sądziłem, że odpowiedź znajdę w książce Practical Clojure, którą właśnie przeczytałem i jestem w trakcie pisania recenzji, ale niestety "Practical" to (w przypadku tej książki) synonim "Definitive Guide", albo "Complete Reference". Taki tytuł wspaniale odpowiadałby zawartości książki.

Każdego dnia staram się przeczytać choć jeden artykuł na temat Clojure i w ogóle programowania funkcyjnego, ale do tej pory jedyne aplikacje, na które trafiam odpowiadają stronie klienckiej, w której czyta się odpowiedź od serwera (w tym sensie, aplikacji na serwerze aplikacyjnym) i przetwarza odpowiednio. Tutaj pasuje mi Clojure jak ulał - zero stanu, a jedynie przekształcanie odpowiedzi przez aplikowanie serii funkcji. Jakby z definicji, wymarzone miejsce dla programowania funkcyjnego (bo jego zamierzeniem jest programowanie z użyciem funkcji jako obywateli pierwszej kategorii, gdzie składanie funkcji odpowiada składaniu znanym wszystkim z matematyki - zero skutków ubocznych, a jedynie operowanie na danych wejściowych).

Do nauki mam narzędzia napisane w Clojure z ich kodami źródłowymi - clojure, clojure-contrib, leiningen, compojure, ring, a ostatnio enlive. Gdybym miał je opisać terminami javowymi powiedziałbym, że clojure i clojure-contrib to język Java z bibliotekami, leiningen to Apache Maven, compojure to Java Servlet API, ring to kontener servletów, a enlive to szablony HTML.

Na chwilę obecną Clojure przypomina mi swego rodzaju serwer aplikacyjny, gdzie usługami są uproszczenia Clojure w kontekście programowania funkcyjnego, w którym akceptuje się skutki uboczne, czyli zmiana stanu zewnętrznego (w stosunku do funkcji), tj. Software Transactional Memory (STM) oraz leniwe struktury, czyli takie, w których wyliczanie kolejnych elementów odbywa się z opóźnieniem, na żądanie.

Kiedy dodać do tego mojego postrzeganie Clojure, w którym w stosunku do Javy ma się tak, jak facelets do JSP w JSF, czyli inna składnia do tworzenia bajtkodu, to niestety (a może stety) nie pomaga mi to w znalezieniu miejsca dla Clojure, kiedy mogę użyć Javy. Jeśli Clojure i Javę potraktować jako (meta?)język do pisania bajtkodu, to zastosowanie jednego nad drugim (w dowolnej kolejności) pozostaje kwestią gustu. Niektóre problemy same wymuszają myślenie funkcyjne, stąd oprogramowanie ich w Clojure będzie mentalnie łatwiejsze, patrz rekurencyjne wzory matematyczne. Takie myślenie się jednak lekko komplikuje, kiedy dodamy do tego rozwiązania w postaci leniwych struktur i STM. W takiej sytuacji możnaby postawić pytanie o sensowność ich użycia w składni niejavowej. Leniwe struktury i STM są częścią Clojure jako rozwiązania (zbioru API) i można ich używać z poziomu Javy bez znajomości składni samego języka Clojure (!)

Wystarczy tego dumania - głowa mnie zaraz rozboli od tego. Pora na coś praktycznego - chwila programowania funkcyjnego z Clojure. Po lekturze An Introduction to Enlive pomyślałem, aby ujawnić siłę ekspresji języka Clojure w postaci jednolinijkowca z doseq, map i partition. Co robi poniższa konstrukcja, która jest złożeniem wspomnianych, trzech funkcji? Ile pracy wymagałoby od Ciebie stworzenie podobnego rozwiązania w Javie? Odpowiedzi w komentarzach pożądane.

Uwaga, każda linia z poleceniem w Clojure rozpoczyna się od "user=>" i nie jest to jego częścią.
user=> (doseq [linia (map (fn [[h s]] (str h " (" s ")")) (partition 2 [1 2 3 4 5 6 7 8 9 0]))] (println linia))
Chyba tak będzie lepiej, co? Nawiasy mogą być bolesne, bez względu na język - Java, Clojure, itp., ale w końcu od tego mamy wsparcie narzędziowe w IDE?!
user=> (doseq
          [linia (map (fn [[h s]] (str h " (" s ")")) (partition 2 [1 2 3 4 5 6 7 8 9 0]))]
            (println linia))
Dla zainteresowanych użyczam dokumentacji każdej z użytej funkcji.
user=> *clojure-version*
{:major 1, :minor 2, :incremental 0, :qualifier ""}
user=> (doc doseq)
-------------------------
clojure.core/doseq
([seq-exprs & body])
Macro
  Repeatedly executes body (presumably for side-effects) with
  bindings and filtering as provided by "for".  Does not retain
  the head of the sequence. Returns nil.
nil
user=> (doc map)
-------------------------
clojure.core/map
([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & colls])
  Returns a lazy sequence consisting of the result of applying f to the
  set of first items of each coll, followed by applying f to the set
  of second items in each coll, until any one of the colls is
  exhausted.  Any remaining items in other colls are ignored. Function
  f should accept number-of-colls arguments.
nil
user=> (doc partition)
-------------------------
clojure.core/partition
([n coll] [n step coll] [n step pad coll])
  Returns a lazy sequence of lists of n items each, at offsets step
  apart. If step is not supplied, defaults to n, i.e. the partitions
  do not overlap. If a pad collection is supplied, use its elements as
  necessary to complete last partition upto n items. In case there are
  not enough padding elements, return a partition with less than n items.
nil

21 sierpnia 2010

Do 3 razy sztuka? A może 4? Kolejne niepowodzenie z Test 000-379: IBM WebSphere Integration Developer V6.2, Solution Development

0 komentarzy
Tego się wcale nie spodziewałem. Wręcz byłem pewien, że wynik koło 80% jest gwarantowany (!)

Po raz pierwszy, 25. czerwca podszedłem do testu egzaminacyjnego Test 000-379: IBM WebSphere Integration Developer V6.2, Solution Development i oblałem z wynikiem 54%.
Postanowiłem bardziej aktywnie przyłożyć się do kolejnego podejścia i faktycznie zabrałem się intensywniej za poznawanie narzędzia. Spędziłem kilka dłuższych chwil z nim w wolnej chwili, ale również podczas prowadzenia szkolenia Developing IBM WebSphere Process Server V6.2 Business Integration Solutions I. Wydawało się, że wszystko idzie zgodnie z planem i czułem się coraz mocniejszy w temacie. IBM WebSphere Integration Developer Information Center stał się najczęściej odwiedzaną stroną. W końcu stwierdziłem, że pora sprawdzić się i w miniony piątek, 20. sierpnia, wyszło jak wyszło - znowu oblana! :(

Co ciekawe, wynik jest dokładnie taki sam jak poprzednio - 54%. Widać nie dane mi jeszcze pochwalić się tym certyfikatem. Kiedy dodam, że test z wersji poprzedniej WID 6.1, który był pierwszym testem certyfikacyjnym w IBM, również oblałem, to będzie to już 3 podejście. Skoro przy 3 podejściach się nie dało, da się kolejnym razem. Czyżbym zbyt nonszalancko się przykładał do nauki i zbyt pochopnie odhaczał kolejne tematy jako przerobione?!

Z ciekawszych rzeczy z tych, ostatnich, 2 podejść, na moją uwagę zasłużyły tematy związane z aktywnością Receive Choice i jej elementu Timeout, prymityw Policy Resolution w mediacjach, transakcje - globalna a QoS, FanOut i FanIn, Cross Component Trace, HTM API, zadania personelu (human task) i eskalacje, API do tworzenia BO, selektor vs mediacja, 0..n i 1..1 w mediacjach, które aktywności wymuszają zmianę procesu biznesowego na długotrwały, obsługa WSDL do tworzenia importów, mapowanie obiektów biznesowych i przekształcenia (obowiązkowy XPath w Extract?) oraz kilka pytań związanych z generalized flow oraz parallel activities. Tyle udało mi się spamiętać, co do których nie mam pewności, że zostały poprawnie odpowiedziane.

Chętnie poznałbym Twoją technikę nauki, jeśli jesteś szczęśliwym posiadaczem tego certyfikatu. Ciekawym, ilu w Polsce ludzi już go posiada?

17 sierpnia 2010

Book review: RESTful Java Web Services

14 komentarzy
Okładka RESTful Java Web Services
Właśnie opublikowałem najnowszą recenzję książki RESTful Java Web Services Jose Sandoval z Packt - Book review: RESTful Java Web Services.

Miałem duże nadzieje związane z lekturą tej książki, która miała sprawić, że bez wahania będę mógł się mienić mianem znawcy tematu Web Services, ale z przykrością muszę stwierdzić, że coraz bardziej skłaniam się ku opinii, że Packt wypuszcza książki, których wartość marytoryczna jest, powiedzmy, średnia ze wskazaniem na słaba. Nie liczyłem liczby książek z Packt, które przeczytałem, ale ta pozycja zdecydowanie potwierdza tę prawidłowość. Dużo powtórzeń, kod źródłowy niezwykle trywialny, a w dodatku autor pozwala sobie na jego opis i to w różnych częściach książki powtórzony kilkukrotnie. Zdecydowanie za mało przy tytule, który mógłby wskazywać, że mamy do czynienia z encyklopedią na temat javowych usług sieciowych pisanych zgodnie z zasadami REST. Jako wprowadzenie może być, ale szkoda czasu na jej czytanie od deski do deski - wystarczy przeskoczyć do odpowiednich rozdziałów, które w danej chwili są interesujące. Jakby na pocieszenie, dzięki książce miałem po raz pierwszy możliwość posmakowania prostoty db4o. Niewiele, ale wystarczyło, aby przekonać się o jego walorach i sensowności użycia w projektach. Na pewno nie zapomnę o db4o przy nadarzającej się okazji jego wprowadzenia do projektu.

Zainteresowani całościowym spojrzeniem na wartość merytoryczną książki zapraszam do lektury mojej recenzji Book review: RESTful Java Web Services.

Kolejną książką, za którą się zabrałem, jest Practical Clojure. Muszę przyznać, że pierwszy rozdział zrobił na mnie ogromne wrażenie prostotą omawiania koncepcji, które stoją u podstaw Clojure. Bardzo zapadło mi w pamięci wyjaśnienie, dlaczego tak istotne jest, aby utrzymać niezmienność struktur danych, nawet tam, gdzie wydawałoby się, że jest nieprzystającą do problemu. Przykład z cyfrą 3, której zwiększenie o 1, to utworzenie nowej kopii z wartością 4 przemówił mi do rozsądku :) W końcu tak samo jest z bardziej złożonymi strukturami, które wbrew wspomnianej oczywistości z 3, traktujemy specjalniej i dodanie elementu niewielu wskazuje na *konieczność* utworzenia struktury-kopii z nowym nabytkiem. Wydaje się zbyt kosztowną operacją?! Proszę o argumenty popierające to myślenie? Chętnie wysłucham (a książka posłuży mi jako moje źródło odpowiedzi).

Czy u Ciebie również daje się odczuć potrzebę poznania języka funkcyjnego bardziej dokładnie i praktyczniej? U mnie zaczyna być widać objawy chorobowe przechodzące w uzależnienie. Czego i Tobie życzę! :)

13 sierpnia 2010

Dzisiaj są moje urodziny i podkastnik rusza

7 komentarzy
Dzisiaj są moje urodziny!

W takim dniu, albo przeddzień, a czasami nawet długo po nim, dostaje się mnóóóóóstwo prezentów. Wśród nich znalazłem mikrofon Sinn7 DasMic.1, którego zakup planowałem od jakiegoś czasu. To znaczy, nie planowałem zakupu tego konkretnego modelu, ale troszkę innego, a nie mając jakiegokolwiek doświadczenia w ich użytkowaniu, Sinn7 DasMic.1 odpowiada moim oczekiwaniom w 100%. Jest profesjonalny i ładnie wygląda, więc dokładnie taki, jaki sobie wymarzyłem :) Takich prezentów każdemu życzę - są dopasowane do naszych potrzeb, skrojone jakby na miarę.

Tym samym pomysł realizowania podkastów odżywa w postaci Podkastnika i będzie wypełniał lukę między kolejnymi skrinkastami (których nie ma/było wiele, ale choćby narzędziowo mam wszystko i planuję skrzętnie). Z poprzednich planów, nie zmieni się termin ich publikacji - czwartek będzie dniem, w którym należy oczekiwać jednego albo drugiego i tak na przemian, co 2 tygodnie. Jak tylko uda mi się zaangażować do projektu moje dzieciaki będzie zabawa po pachy - ja produkcja, oni postprodukcja. Są inni chętni na podjęcie się rywalizacji z...ekhm...uzupełnieniu podkasta Java.pl z udziałem Radka Holewy i Kuby Dżona? Kontakt na priv.

Wspomniałem, że dzisiaj są moje urodziny, więc jest to idealny moment na nagranie pierwszego podkastu. Ich ideą będzie rozmowa z bardzo fajnymi ludkami z naszej sceny javowej (a może nawet ze sceny zagranicznej?), które uświetnią podkasty swoimi pasjami, trafnością dowcipu i doświadczeniem. Jeśli będzie dużo Javy, tym lepiej dla nich, ale nie jest to warunek konieczny (a tym bardziej dostateczny!).

Skoro mam już swoje urodziny, więc wykorzystam je na zaproszenie samego siebie na zerowy odcinek podkastu. Będzie to taki prezent od samego siebie i aby nie testować na gościach, potestuję na sobie, jak sprawdza się nagrywanie z nowiuteńkim mikrofonem. Wybaczcie, jeśli brzmi to conajmniej nonszalancko. Jak to mówią wielcy naszej sceny javowej (bodajże Grzesiek Duda, Radek Holewa albo Michał Margiel - link wielce pożądany, jeśli ktoś ma pod ręką, gdzie tego użyto i ja osobiście stawiam na Margiela) parafrazując Władysława Sikorę: "Chwal się sam – bo zaczną chwalić cię inni, którzy się gówno znają", bo "Kiedy nie ma się czym chwalić, potrzebny jest kozioł ofiarny", a szkoda byłoby nim zostać :)

Oto więc daje Wam jeszcze gorący, świeżo nagrany podkast, w którym JA...cek Laskowski testuje swój mikrofonowy prezent - Jacek Laskowski testuje.

Do nagrania skorzystałem z oprogramowania Garage Band po lekturze samouczka Nikity Titow Garage Band, w której opisuje program i użycie go do nagrywania podkastów. Jakby stworzony na zamówienie, na moje urodziny.

Nie byłbym jednak usatysfakcjonowany, abym nie dał Wam czegoś od siebie. Jeśli kogokolwiek interesuje, ile już żyje taki Jacek (i nie ma dostępu do FB czy Skype!), mam dla niego małą zagadkę umysłową:

Liczba moich lat jest liczbą pierwszą. Kolejność cyfr jest odwrotna do dwóch ostatnich cyfr roku urodzenia. W zapisie rzymskim zapisywana jest za pomocą 3 symboli, w systemie dwójkowym...dwoma (cóż za odkrycie, ale mogłoby w końcu i jedną) i odstęp zerami między jedynkami rośnie arytmetycznie, ósemkowo zapis zawiera cyfry następujące po sobie. Gdyby dodać do siebie liczbę moich lat i dwie ostatnie cyfry roku urodzenia wyszłaby liczba zapisana dwójkowo, która dziesiętnie jest jedną z ich cyfr.

Teraz już wiadomo, że mit o nieżyjących dinozaurach jest mocno przereklamowany :-)

I jeszcze jedno. Dostałem wiadomość z wydawnictwa Packt Publishing odnośnie napisania nietuzinkowej książki nt. NetBeans IDE. Ja nie wchodzę w temat, bo chciałbym zająć się innym tematem książkowym, więc ten zostawiam zainteresowanym.

Packt Publishing is planning to expand its range of NetBeans books and is currently inviting book ideas and potential authors.

This doesn't require any past writing experience. All that you need to write a Netbeans book for Packt is an expert subject knowledge, a passion to share it with others and an ability to communicate clearly in English.

So, if you love NetBeans and fancy writing a book send your book ideas to author@packtpub.com. If you don't have a book idea and are simply interested in writing a book, Packt is still keen to hear from you. Send some details about your work experience with NetBeans and any past writing experience you may have.

More details about this opportunity are available at :
http://authors.packtpub.com/content/packt-invites-netbeans-experts-write-new-set-books

09 sierpnia 2010

Kozino odwiedzone, Bratysława, Zadar, Sibenik, Wenecja, Padwa, Vicenza i Praga również - urlopu koniec, pracy początek

11 komentarzy
I po urlopie. Wszystko zaczęło się 23 lipca, aby skończyć się minionego piątku. Plan obejmował podróż samochodem do Kozino w Chorwacji, gdzie przez tydzień mieliśmy cieszyć się słońcem, kąpielą w morzu i opalaniem, później kilka dni w
Wenecji i miast pobliskich - Padwa i Vicenza, aby zatrzymać się na chwilę w Pradze (Czechy). Ach, i zanim trafiliśmy do Chorwacji, zatrzymaliśmy się na nocleg w Bratysławie (Słowacja). Dokładnie jak na poniższej mapce.
Mapka przejazdu wakacyjnego
Bardziej zależało nam, aby cieszyć się wspólnym wyjazdem niż próbą dotarcia na miejsce "w jednym rzucie", np. w ciągu jednego dnia. Poza moją, 4-osobową familią, byli jeszcze znajomi (3 osoby) i jeszcze inni znajomi (kolejne 3), co już dawało 10tkę z Warszawy. Na trasie "zjeżdżaliśmy się" z inną, 4-osobową rodziną i jeszcze inną trójką. Razem było nas 17 osób w 5 samochodach! I gdyby ktoś sądził, że da się takim zespołem zarządzać, to niech zapomni o tym w wakacje.

Przez pierwsze 2-3 dni w Kozino było stosunkowo słonecznie. Później pogoda się załamała i my również. W dzień padało i było pochmurnie, ale przynajmniej wieczorem można było pozwiedzać okolicę. Wjechaliśmy do Ninu, Zadaru, Sibenika i poniosło nas jeszcze do Parku Narodowego Paklenica. Przepiękne miejsca i te autostrady. Kasa szła pełnym strumieniem! Tyle prżene lignije nie zjadłem jeszcze nigdy. Szły na okrągło.

Po tygodniu, w deszczowej atmosferze, wyjechaliśmy do Wenecji, a dokładniej do Campingu Village Jolly. Miejsce doskonałe, aby spędzić kilka dni, pozwiedzać okolicę i jeszcze pokąpać się w basenie, co przy palącym słońcu było doskonałym uzupełnieniem naszych deszczowych dni w Chorwacji. Kto chciał taplał się w słońcu, a kto chciał mógł w basenie. Słodka woda i palące słońce dopełniło naszego szczęścia. Bajera! Popołudniami zajeżdżaliśmy do Wenecji, wcześniej w Padwie i Vicenza. Miasta warte bezsprzecznie odwiedzenia. Tam zajadaliśmy się pizzą i makaronami. Lody i kawa też były. Niestety nie miałem możliwości skosztowaniach ichniejszego tiramisu. Jakoś nie dane nam było tego znaleźć.

Powrót zaplanowaliśmy przez czeską Pragę. To, co zobaczyłem w Pradze, przerosło moje najśmielsze oczekiwania. Słyszałem, że warto być w Pradze, ale sam pobyt w komplekcie zamkowym na wzgórzu zajął nam 2 godziny i dane nam było jedynie "przelecieć" przez 2 kościoły i wejść na wieżę. Bilet na 9 zabytków "skonsumowaliśmy" 2-ma :( Już mi się chce tam wracać, ale zanim tam trafię obowiązkowo przeczytam przynajmniej jeden przewodnik. Bez tego, to jak smakować potraw nie widząc ich. Smak jest, ale do pełni szczęścia brakuje. Pozwiedzaliśmy, pojeżdziliśmy i powrót.

A powrót był nie mniej ciekawy, bo przypadkiem trafiliśmy do magicznego miejsca Hotelu-Zameczku pod hradem w Starym Jicinie. Z zewnątrz nie wygląda tak imponująco jak w środku. Jedliśmy przy okrągłym stole na 11 osoób w samej baszcie! Obok była sala zbudowana z wkomponowaną pieczarą. Niezapomniane wrażenia - wzrokowe, kulinarne i...finansowe :-)

W piątek około 1:30 byliśmy z powrotem w swoich domach.

W międzyczasie udało mi się przeczytać Rework, Osiąganie celów. 10 zasad skutecznego działania i częściowo (wciąż w trakcie czytania) Linchpin: Are You Indispensable?. W zasadzie każda z nich daje nowe spojrzenie na wykonywane przez nas (często rutynowo) aktywności, więc wszystkie polecam. Takie je polecano i teraz ja się przyłączam do tego grona. Było warto. Ich recenzji pewnie nie będzie, bo...było minęło.

Naładowanym urlopem i książkami, wypoczętym bardzo, więc pora zabrać się do pracy. Pamiętam, jakby przez mgłę, że zaplanowałem sobie kilka rzeczy zaraz po powrocie, ale "zczyściło" mnie mocno i konia z rzędem temu, kto przypomniałby mi, co to dokładnie było. Na pewno pora wrócić do tematu skrinkastów. Właśnie zaktualizowałem IBM WebSphere Application Server V8.0 Beta do czerwcowej wersji. Pora wyjawić rozwiązanie sekretu z niedziałającym servletem z adnotacją @WebServlet (patrz Skrinkast o Java EE 6 z @WebServlet, NetBeans IDE 6.9 i IBM WebSphere AS V8 w HD 720p na YouTube) i wprowadzić w świat EJB 3.1 i CDI. To takie moje obiecanki-cacanki.

A czy Ty miałeś swój urlop? Gdzie?