Lewa opalenizna

Mam problem.

Kiedy idę do pracy, przemierzam piechotą około dwóch kilometrów z grubsza na południowy zachód. O tej porze dnia i roku słońce świeci dokładnie z lewej strony. Kiedy wracam z pracy, przemierzam ten sam odcinek w przeciwną stronę; o tej porze dnia i roku słońce świeci dokładnie z lewej strony.

Widać w czym problem? Po kilku tygodniach takiego spacerowania zaczynam wyglądać trochę… dwulicowo.

Teatrzyk „Kłapouchy” przedstawia: rzeka życia

[K. był niezadowolony ze swojego życia. Poszedł więc poprosić kogoś, kogo uważał za mądrą osobę, o poradę. Mądra osoba powiedziała mu: „Żyj chwilą! Daj się ponieść rzece życia!”. K. pomyślał o tym i usiadł na ławce w parku.]

[Po jakimś czasie]

PRZYJACIELE: Hej, K.! Idziemy na imprezę, idziesz z nami?

K.: Nie mogę. Daję się ponieść rzece życia. Chcę zobaczyć dokąd mnie poniesie.

[Po jakimś czasie]

ATRAKCYJNA DZIEWCZYNA: Cześć przystojniaku, nie chciałbyś mi postawić drinka?

K.: Nie mogę. Daję się ponieść rzece życia. Chcę zobaczyć dokąd mnie poniesie.

[Po jakimś czasie]

KOLEGA Z PRACY: O, K., jak się masz? Słuchaj, jeden klient ma dla nas zamówienie, mało roboty a dobrze płaci. Co ty na to?

K.: Nie mogę. Daję się ponieść rzece życia. Chcę zobaczyć dokąd mnie poniesie.

[Po jakimś czasie]

MĄDRA OSOBA: K.! Miło cię widzieć! I jak idzie płynięcie z rzeką życia?

K.: Hm, no na razie trochę nudno, co chwila mi ktoś przeszkadza, ale już się nie mogę doczekać tego wszystkiego dobrego, o czym zawsze marzyłem!

[Kurtyna!]

Oczywiście wszelkie podobieństwo do prawdziwych zdarzeń i osób jest przypadkowe ;)

Java 8: wrażenia

Jako wielbiciel języków funkcyjnych wyczekiwałem Javy 8 z pewną dozą niecierpliwości. To jedno móc zawsze napisać coś w Haskellu, a zupełnie co innego mieć takie rzeczy jak lambdy we współczesnym COBOLu jakim jest Java – mimo wszystko póki co mogę liczyć raczej na znalezienie pracy przy programowaniu w Javie, a nie w Haskellu. Tak więc wyczekiwałem, wyczekiwałem, zapomniałem i ostatecznie premiera Javy 8 wzięła mnie z zaskoczenia. Ale gdy to nastąpiło, nie marnowałem czasu i natychmiast zacząłem się bawić nowymi zabawkami (zaniedbując trochę bieżące zadania „ważne”). W pewnym momencie doszło nawet do tego, że wyczekiwałem końca weekendu, żeby wrócić do pracy…. Ale to już przeszło. Po paru tygodniach eksperymentowania, naginania możliwości i przekraczania granic tego, co możliwe, dochodzę do wniosku, że jest nieźle, ale mogło być lepiej.

Mniej lub bardziej rozczarowujących rzeczy pewnie mógłbym wymienić więcej, ale tylko jedna z nich rzuciła mi się w oczy z wystarczającą siłą, żeby o niej napisać coś więcej, mianowicie to, że interfejsy funkcyjne nie mogą rzucać wyjątków. Może to efekt działania frakcji wyjątko-sceptyków, którzy uważają, że wyjątki (te „checked”) są pomiotem Szatana i najchętniej by je wymietli z języka ogniem i mieczem (też przechodziłem przez tę fazę, ale doświadczenia „po drugiej stronie” uświadomiły mi jednak, że błędem było myśleć, że wyjątki są błędem). Może to celowe działanie wynikające z innych pobudek, takich jak chęć uniknięcia zbędnej komplikacji interfejsów i/lub implementacji, czy też chęć uniknięcia kłopotliwych sytuacji, do których często prowadzą wyjątki jeśli się nie wie co się robi (ale i tak muszą obsługiwać choćby RuntimeException więc co za różnica?). Może było to przedyskutowane na śmierć przez te wszystkie lata, kiedy dodanie lambd było odkładane do kolejnych wersji języka, i po prostu nie zainteresowałem się wystarczająco by mi się chciało poszukać argumentacji za i przeciw. W każdym razie doprowadza mnie do szewskiej pasji, że jeśli tylko pojawia się gdzieś np. operacja wejścia-wyjścia, mam do wyboru zaniechać takich bajerów jak strumienie (te z klasy Stream, nie strumienie bajtów i znakowe), albo pisać kod brzydki jak strzępiel. Mam całe biblioteki, które rzucają określone wyjątki, i bardzo słusznie, że to robią, z którymi miałbym co zrobić? Wykastrować obsługę błędów?…

Gdyby to ode mnie zależało, interfejs Function (i analogicznie cała reszta) zamiast tak:

interface Function<U, V> {
V apply(U u);
}

Wyglądałby tak:

interface Function<U, V, E extends Throwable> {
V apply(U u) throws E;
}

…I już mogę zrobić lambdę, która wywołuje Class.forName(). O! Wiem, że w ten sposób implementacja może rzucić tylko jeden typ wyjątku, ale lepszy rydz niż nic. (BTW: Nie wiedzieliście, że można robić takie cosie z generycznymi deklaracjami wyjątków, prawda?)

Ogólne wrażenie: dobre i to.

Cała Правда

Ponoć…

„Jedyna różnica między naszą prasą a waszą jest taka, że my doskonale wiemy, że nasza kłamie”

Znalazłem dzisiaj w skrzynce na listy lokalną gazetę. Nawet się ucieszyłem, bo może, chociaż jestem trollem jaskiniowym, zaangażuję się chociaż w robienie pozorów, że interesują mnie lokalne sprawy. Na gazecie napisane było „miesięcznik informacyjny”. Dobrze. Ale następne co przeczytałem, brzmiało mniej więcej tak:

Do wyborów samorządowych pozostało N dni. Nadchodzi więc czas, by zdecydować, czy chcemy by wszystko pozostało po staremu. Czyli stara władza, stare układy i stary bałagan. Krótko mówiąc – stara beznadzieja.

A to na tle rozpadającej się rudery otoczonej stosami śmieci. Cóż, mój zapęd do zainteresowania sprawami lokalnymi skończył się na pierwszym nagłówku. Może to jakiś rekord? Bo jak mam brać poważnie miesięcznik informacyjny, który czyta się jak propagandę rodem z radzieckiej „Prawdy”, tylko że w przeciwną stronę?

„Śmiertelne zauroczenie”: wrażenia

Widzicie drodzy państwo, jestem typem osoby, która nie widziała rzeczonego filmu aż do 25. rocznicy jest premiery. Wcześniej – dlatego, że jestem trollem jaskiniowym i na dobre rzeczy trafiam przez przypadek, a nie dlatego, że są częścią otaczającej mnie kultury. Później – dlatego, że widząc polski tytuł nigdy bym go nie skojarzył z filmem godnym obejrzenia. A widząc oryginalny tytuł („Heathers”) nigdy bym go nie skojarzył z polskim tytułem. I to tyle w kwestii komentarza do wrażenia: pozytywne.