29 maja 2013

giter8 i sbt - pierwsze kroki przy tworzeniu projektów ze Scalą

0 komentarzy
Zawsze zastanawiało mnie, jak rozpocząć pracę z językiem Scala z linii poleceń. Potrzebowałem mechanizmu, który utworzyłby mi katalog na potrzeby projektu w Scali, z odpowiednio ułożonymi podkatalogami na kody źródłowe samej aplikacji oraz jej testów.

giter8 - narzędzie tworzenia plików i katalogów na podstawie szablonów w GitHub

Był czas, kiedy żyłem w błogiej niewiedzy istnienia Scala Build Tools (sbt). Potrzebowałem narzędzia do zarządzania projektem - budowania go z pobraniem zależnych bibliotek, kompilacją, wykonaniem testów, itp. To właśnie zadanie dla sbt.

Wszystkie znaki na niebie i ziemi mówiły mi, że ostatnią rzeczą, jaką robi sbt, to utworzenie nowego projektu z właściwą strukturą katalogową. Okazało się, że sbt jest na tyle "wyrafinowane", że potrafi pracować z każdą strukturą katalogów, co w zasadzie powinno mnie cieszyć, ale przy mojej niewiedzy, tylko komplikowało sprawę. Skąd miałbym wiedzieć, jak rozłożyć pliki źródłowe aplikacji, aby było dobrze, jeśli...wszystko może być dobrze (czy właśnie nie odpowiedziałem sobie na to pytanie?)

To zapewne był powód odpalenia projektu giter8 (w skrócie g8). Już nie pamiętam, kto mi go wskazał, ale to miało być rozwiązaniem moich bolączek. I faktycznie było.

"Giter8 is a command line tool to generate files and directories from templates published on github or any other git repository. It's implemented in Scala and runs through the Simple Build Tool launcher, but it can produce output for any purpose."

Instalacja opisana jest na stronie Installation. Jej zakończenie obwieszcza uruchomienie g8.
$ g8

giter8 0.5.3
Usage: g8 [TEMPLATE] [OPTION]...
Apply specified template.

OPTIONS
    -b, --branch
        Resolves a template within a given branch
    --paramname=paramvalue
        Set given parameter value and bypass interaction.


Apply template and interactively fulfill parameters.
    g8 n8han/giter8

Or
    g8 git://github.com/n8han/giter8.git

Apply template from a remote branch
    g8 n8han/giter8 -b some-branch

Apply template from a local repo
    g8 file://path/to/the/repo

Apply given name parameter and use defaults for all others.
    g8 n8han/giter8 --name=template-test

g8 typesafehub/scala-sbt - Scala sbt template

I co teraz?

W Usage do g8, napisano: "Template repositories must reside on github and be named with the suffix .g8. We're keeping a list of templates on the wiki." I to cieszy, że komuś zależy i zebrał pomocne szablony w jednym miejscu!

Właśnie dzisiaj trafiłem na projekt Scala sbt template, który jest "A giter8 template for Scala projects using sbt."

Skoro należy do repozytorium projektów Typesafe Inc., to można założyć, że jest projektem błogosławionym przez samych twórców Scali (niekoniecznie gwarancja jakości, ale chociaż aktualności). Coś mi jednak mówi, że ostatnia zmiana "authored a year ago" nie jest specjalnie obiecująca w kontekście aktualności projektu. Ale co robić?

Odpalam g8 typesafehub/scala-sbt i korzystam wstępnie z projektu.
$ g8 typesafehub/scala-sbt

Scala Project Using sbt

organization [org.example]: pl.japila
name [Scala Project]:
scala_version [2.9.2]: 2.10.1
version [0.1-SNAPSHOT]:

Template applied in ./scala-project

jacek:~/sandbox
$ cd scala-project/
jacek:~/sandbox/scala-project
$ tree
.
├── README
├── project
│   └── ScalaProjectBuild.scala
└── src
    └── main
        └── scala
            └── pl
                └── japila
                    └── ScalaProject.scala

6 directories, 3 files
$ cat README
A sample for the Typesafe Stack (http://typesafe.com/stack).

Scala sample project using Scala and SBT.

To run and test it use SBT invoke: 'sbt run'

jacek:~/sandbox/scala-project
$ sbt run
[info] Loading project definition from /Users/jacek/sandbox/scala-project/project
[info] Updating {file:/Users/jacek/sandbox/scala-project/project/}default-9e49ab...
[info] Resolving org.scala-sbt#precompiled-2_10_0;0.12.2 ...
[info] Done updating.
[info] Compiling 1 Scala source to /Users/jacek/sandbox/scala-project/project/target/scala-2.9.2/sbt-0.12/classes...
[info] Set current project to Scala Project (in build file:/Users/jacek/sandbox/scala-project/)
[info] Updating {file:/Users/jacek/sandbox/scala-project/}scala-project...
[info] Resolving org.scala-lang#scala-library;2.10.1 ...
[info] Done updating.
[info] Compiling 1 Scala source to /Users/jacek/sandbox/scala-project/target/scala-2.10/classes...
[info] Running pl.japila.ScalaProject
Hello, Scala Project
[success] Total time: 13 s, completed May 29, 2013 10:08:54 PM
"Hello, Scala Project" oraz "success" na końcu dają mi pewne poczucie spełnienia moich oczekiwań. Mam swój pierwszy projekt w Scali z udziałem g8!

g8 kobmic/plain-scala

Jeszcze na koniec swojej wyprawy w świat uruchomienia projektów scalowych z g8 przeszukałem sieć i trafiłem na kobmic/plain-scala. Wydaje się być świeższą i bardziej kompletną alternatywą do szablonu z Typesafe.

Projekt scala-project idzie do kosza i odpalam g8 kobmic/plain-scala.
jacek:~/sandbox
$ g8 kobmic/plain-scala

Plain Scala project with scalatest and/or specs2

version [0.1.0-SNAPSHOT]:
organization [my.organization]: pl.japila
name [MyScalaProject]:

Template applied in ./myscalaproject
I już widzę miejsce do poprawy w szablonie - nazwa tworzonego projektu jest bez (ostatnio ulubionych) myślników.

Kontynuuję prace...
jacek:~/sandbox
$ cd myscalaproject
jacek:~/sandbox/myscalaproject
$ tree
.
├── build.sbt
├── project
│   └── plugins.sbt
└── src
    ├── main
    │   └── scala
    │       └── Stub.scala
    └── test
        └── scala
            ├── StubSpec.scala
            └── StubTest.scala

6 directories, 5 files
Tym razem stawiam na pisanie testów do mojego wymyśl(o)nego projektu w Scali. Stąd też powód uruchomienia sbt test.

// pół pobranego Internetu później...
jacek:~/sandbox/myscalaproject
$ sbt test
[info] Loading project definition from /Users/jacek/sandbox/myscalaproject/project
[info] Set current project to MyScalaProject (in build file:/Users/jacek/sandbox/myscalaproject/)
[info] StubTest:
[info] you description here
[info] - should do something
[info] StubSpec
[info]
[info] The 'Hello world' string should
[info] + contain 11 characters
[info] + start with 'Hello'
[info] + end with 'world'
[info]
[info]
[info] Total for specification StubSpec
[info] Finished in 27 ms
[info] 3 examples, 0 failure, 0 error
[info]
[info] Passed: : Total 4, Failed 0, Errors 0, Passed 4, Skipped 0
[success] Total time: 4 s, completed May 29, 2013 10:57:20 PM
W Usage projektu można przeczytać, że odpalenie sbt eclipse lub sbt gen-idea pozwala na łatwiejsze wczytanie projektu do ulubionego IDE. Wybieram IntelliJ IDEA.

27 maja 2013

Jak to czytanie książek zbliża - Atomic Scala w akcji

0 komentarzy
Podczas tegorocznej konferencji GeeCON w Krakowie Adrian wręczył mi książkę "Atomic Scala" Bruce Eckel i Dianne Marsh. Książka w zasadzie bardzo lekka merytorycznie i wprowadza w temat programowania w Scali przykładami. Początkowo rzadko, aby dopiero przy ostatnich atomach (termin autorów na poszczególne rozdziały) znaleźć w niej odrobinę "cięższej" wiedzy. Na pewno można się przy niej pozytywnie rozerwać.

W trakcie lotu do Stambułu, Turcja, towarzyszyła mi dzielnie. Zostało mi jeszcze kilka stron do przeczytania, więc można oczekiwać recenzji niebawem, co jednak od dzisiaj będzie kojarzyło mi się z nią nierozerwalnie, to spotkanie z...szefem zespołu, który rozważa wejście w Scalę i Play Framework - Arkadiuszem Biczem.


Jeszcze przed startem, kiedy zobaczył moją książkę, zapytał o moje zainteresowanie Scalą, aby po kilku kolejnych, rozpoznać we mnie tego "oszołoma" z bloga (którego masz przyjemność czytać). To było niewątpliwie najmilsze spotkanie w ostatnich kilku miesiącach, bo nie tylko dzielimy ze sobą podobne pasje, ale pracujemy i mieszkamy w tym samym mieście - Warszawie.

Jak to czytanie książek zbliża. I kto by pomyślał, że do momentu spotkania trochę utyskiwałem w duszy, że zapomniałem zamienić miejsca. Warto od czasu do czasu pozwolić sobie na chwilę zapomnienia, bo przypadek może sprowokować miłe zdarzenia.

Powodzenia Arek w Autonomii Kurdyjskiej! Do zobaczenia!

22 maja 2013

Czego i jak się uczyć funkcyjnej Scali - relacja z wystąpienia na deskach Warszawa JUG

4 komentarzy
To było moje pierwsze, deklarowane wystąpienie na deskach grupy Warszawa JUG, w którym kładłem nacisk na materiały i techniki poznawania nowego obszaru niż na samym obszarze. Programowanie funkcyjne i Scala były jedynie nośnikami, a nie meritum sprawy. I właśnie w chwili, kiedy ruszałem na spotkanie, na Ursynowie zerwało chmurę. Lało tak mocno, jakby ktoś się zawziął i postanowił nie wypuścić mnie z klatki (dosłownie i w przenośni). Istne oberwanie chmury. Nie zapowiadało się dobrze.

Miałem niemałe obawy, czy formuła mojego wystąpienia wpasuje się w oczekiwania uczestników. Z jednej strony utożsamiany jestem z tematami technicznymi (powstrzymam się od poprzedzenia ich "wysoko"), a z drugiej strony wiele osób pyta "Czego i jak się uczyć?". Postanowiłem spróbować swoich sił w prezentacji moich sposobów na efektywną naukę.

Przed spotkaniem miałem możliwość zamienić słowo z kilkoma, wcześniej nieznanymi mi osobami, które tylko wzmogły we mnie obawy o tematyce mojej prezentacji - bardziej zależało im na samej nauce Scali niż na metodach, które mogłyby w tym pomóc. I coś mi mówi, że niepotrzebnie się wsłuchiwałem w głos tłu...gawie...uczestników, bo tylko przysporzyło mi więcej nerwów niż pewności siebie. Bywa.

I zaczęło się!

Najpierw wystąpienie sponsora spotkania - firmy Decerto (również znani jako "Systemy informatyczne dla biznesu") - w osobie Tomka Kucharskiego. Dzięki Tomek za miłe słowa o mojej osobie i chwilę, w której mogłem ochłonąć (z komentarzy), ale tytuły, którymi mnie "obrzuciłeś", jeszcze bardziej wzbudziły we mnie niepokój.

Liczba uczestników i komentarze nie pozostawiały złudzeń, że musi być technicznie.


Nie było. A przynajmniej nie w mierze, która mogłaby zadośćuczynić oczekiwaniom publiczności. Bywa. Prezentacja na SlideShare a nagranie niebawem. Sugeruję obserwować forum Warszawa JUG.

Dziękuję Agnieszce, Michałowi, Jankowi, Stefanowi, Piotrowi, Julkowi, Pawłowi i pozostałym uczestnikom za podjęcie się trudu uatrakcyjnienia spotkania przez udział w dyskusjach podczas niego, czy po prostu podejście do mnie, aby przywitać się i zamienić słowo. Uścisk dłoni, bezcenne!(TM) Byłem zaszczycony móc Was gościć na moim spotkaniu i poznać Was wszystkich osobiście.

Komentarze dotyczące mojego wystąpienia znajdziesz na stronie spotkania na Meetupie. Zachęcam do komentowania i wyrażania swoich pozytywnych oraz krytycznych uwag. Niech kolejne, moje wystąpienia publiczne staną się lepsze (czytaj: dopasowane do oczekiwań uczestników, co niekoniecznie oznacza, że faktycznie będą lepsze :-))

Dziękuję wszystkim za udział. Jednocześnie zachęcam do dzielenia się własnym warsztatem poznawczym, abyśmy stali się społecznością, w której rodzą się ciekawe pomysły (zamiast naśladować czy uczyć się innych). Wciąż zdecydowanie "wynalazczości" wśród nas. Wszystko pro publico bono!

p.s. Właśnie wpadłem na ciekawy pomysł prezentacji - "Poznaję Scalę rozwiązując zagadki z Project Euler". Można również pokusić się o uruchomienie prezentacji w stylu kata z pomysłami z Any practical coding dojo/kata ideas? Kto chciałby wziąć udział w takim pomyśle - jako organizator, (współ)prowadzący czy uczestnik? Ciekawym Twojej opinii.

20 maja 2013

Moje pierwsze kroki w programowaniu funkcyjnym w Scali na 115 spotkaniu Warszawa JUG

0 komentarzy
Jutro, wtorek, 21.05.2013 o godz. 18:00 w sali 3180 w budynku wydziału MIM UW na Banacha 2 odbędzie się stopiętnaste (115) spotkanie Warszawa Java User Group, na którym przedstawię temat Moje pierwsze kroki w programowaniu funkcyjnym w Scali.

Link do rejestracji i miejsca, w którym można podyskutować o spotkaniu (przed, w trakcie i po) znajduje się na stronie spotkania.

Poniżej rozwinąłem temat mojego wystąpienia, ale uważam, że użycie "moje", "pierwsze kroki" oraz "programowanie funkcyjne w Scali" mówią same za siebie i dalsza lektura to...strata czasu.

Skoro jednak nalegasz...

Kurs "Functional Programming Principles in Scala" na Coursera dobiega końca i przez ostatnie 7 tygodni intensywnie mnie absorbował. Do tego stopnia, że pozwoliłem sobie na stosunkowo regularne zarywanie nocek w poszukiwaniu rozwiązań (!) Bolało.

Po szkoleniu "Scala i programowanie funkcyjne" Grześka Balcerka wiedziałem, że nauka nowego języka Scala i jego połączenia programowania obiektowego z funkcyjnym nie będzie lekka i pewnie dlatego postanowiłem zintensyfikować wysiłki, aby po początkowych trudach, ostatecznie poczuć klimaty nowego języka. Równocześnie uzupełniałem wiedzę lekturą pisanej właśnie książki "Functional Programming in Scala" z Manning. Rzuciłem na moment programowanie funkcyjne w Clojure na rzecz Scali, aby w ten zaowalowany sposób przeprowadzić kilku śmiałków w świat...Clojure (to taki mój "tajny" plan).

Mając pewne doświadczenie z programowaniem funkcyjnym w Clojure i F#, większość problemów nie była trudna intelektualnie, ale nowa składnia oraz niektóre problemy spędzały mi sen z powiek na długie godziny. Najbardziej zaskoczył mnie brak umiejętności przejścia z programowania funkcyjnego w Clojure na idiomatyczny kod w Scali, który łączył elementy programowania funkcyjnego z obiektowym, w którym typy miały niebagatelne znaczenie (na wzór F#, co pomagało). Najpierw trzeba mi było zapomnieć o OO w Javie na rzecz Clojure, a teraz ponownie OO z FP w wykonaniu Scali. Nie było lekko.

Nowy język to nowe konstrukcje, narzędzia, sposób myślenia i pewnie kilka innych rzeczy. Swoje dokonania opisywałem względnie na bieżąco na swoich blogach, a tym razem skorzystałem z okazji, aby przedstawić moje doświadczenia na żywo. Podczas prezentacji chciałbym zademonstrować mój własny warsztat poznawczy Scali (Sublime Text 2, sbt, Scala REPL, git) oraz sposoby rozwiązywania niektórych problemów programistycznych w Scali, które miałem okazję spotkać w kursie na Coursera.

Będzie trochę slajdów. Będzie trochę programowania na żywo. I będzie w końcu kilka spostrzeżeń, którymi chciałbym zachęcić do wymiany doświadczeń między uczestnikami. Nie sądzę, aby brakowało chętnych do poznania języka Scala oraz samego paradygmatu funkcyjnego, więc dyskusji spodziewam się całkiem sporo. Taki mam plan. Przyjdź i pomóż mi go zrealizować!

16 maja 2013

Wokół Atmosphere Conference w Poznaniu

1 komentarzy

W drodze do Poznania


Moją konferencyjną przygodę zacząłem od wyjazdu pociągiem o 17:55 do Poznania. Pustki w pociągu były przerażające. Zająłem całkowicie wolny przedział, co z jednej strony cieszy, ale biorąc pod uwagę, że przecież nie o to chodzi w funkcjonowaniu PKP, zmartwiłem się. Czyżby tak niewiele osób korzystało z tego środka lokomocji? Dlaczego? Pogoda jakby wymarzona na przejazd koleją. Najwyraźniej niekoniecznie.

Do mojego przedziału wszedł inny mężczyzna.

Pociąg ruszył bez opóźnień, co wprowadziło mnie w jeszcze bardziej pozytywnym nastrój. Jak ja lubię podróżować koleją! Jedynie niektóre wiadomości na temat jej stanu próbują zepsuć mi dobrą opinię na jej temat. Wciąż żyję, a to pozwala mi wciąż promować tę formę podróżowania - kiedykolwiek i gdziekolwiek w Polsce (oczywiście przy założeniu, że korzystam z InterCity - wybacz taka moja przypadłość "hrabioska"). W pociągu mam (zwykle) zagwarantowane - prąd i możliwość kupienia biletu w pociągu oraz czas na własne sprawy. Jedzenie też niczego sobie - narzekać nie mogę.

Moją uwagę zwróciło 26 wat przy kontakcie. Przywykłem do 230 V, więc nie omieszkałem wspomnieć o tym na głos. I tu zaczyna się przygoda z panem z przedziału.

Uwaga na głos (uprzejmie, ale z wrodzoną, dziecięcą ciekawością) zwróciła uwagę pana z przedziału, który okazała się być…około piędziesięcioletnim automatykiem z okolic Szczecina, któremu przyszło obecnie studiować sztukę w Warszawie dla zabawy! To nazywa się zapał i umiejętność wyboru. Ciekawy gość, bo w poszukiwaniu pracy rzuca go po Europie - 5 lat w UK, kilka wcześniej w Holandi, trochę w Polsce (wtedy zaczął studia w Warszawie), aby ponownie od czwartku rozpocząć pracę w Rotterdamie (Holandia). Studiowanie sztuki nie ma jakiegokolwiek celu zarobkowego, a jedynie spełnienie dawnych marzeń. Niestety, przy pracy w Holandii może to być niezwykle trudne zadanie czasowo. Skoro jednak dał radę pracować przez 5 lat od 17 do 6 rano przez 4 dni w tygodniu, to i to powinno się udać (przy trochę większym niż przeciętnym zaparciu). Czego nie robi się dla własnego, dobrego samopoczucia, nieprawdaż?!

Pogawędziliśmy dłuższą chwilę, aż do Konina, gdzie rozrzuciło nas po pociągu, bo przedział okazał się być zarezerwowany przez grupę 6 osób jadących do Niemiec. Bywa. Rodząca się znajomość została zduszona w zarodku. To był faktycznie wartościowy gość!

Żal na bok i wróciłem do mojej przygody z nauką języka Scala na Courserze. To już ostatni tydzień kursu, więc czasu niewiele, a trzeba odsłuchać nagrań, pogłówkować i zgłosić rozwiązanie zadania, który okazuje się być grą! To lubię! Gram, a wszyscy nazywają to nauką. Czegóż można więcej sobie życzyć?!

Przy okazji odsłuchiwania nagrań z kursu, uczę się (przyzwyczajam się do) posługiwania iPadem, który traktuję jako platforma multimedialna - odsłuchiwanie nagrań prezentacji z Coursera i YouTube oraz czytnik książek. Spadek od firmy, jeśli zastanawiasz się skąd pomysł na iPada zamiast tableta androidowego. Spisuje się i zaczynam dostrzegać zalety posiadania go. Zacząłem również traktować go jako zeszyt i wrażenia z prezentacji na żywo, w których uczestniczę zapisuję właśnie w notatniku na iPadzie, aby później trafiły do mojego bloga-Notatnika tutaj. Kolejny raz potwierdza się reguła, że wielu rzeczy należy się nauczyć, aby używać z ich przeznaczeniem, co początkowo nie musi być oczywiste (pomijam granie w gry, czy przeglądanie stron webowych, które są oczywistą oczywistością dla wielu, jeśli nie dla wszystkich - to zbyt banalne i za mało uzasadnione, aby kupować iPada za kilka tysięcy). Do Poznania przejrzałem wszystkie prezentacje z ostatniego modułu szkoleniowego Week 7: Lazy Evaluation. Cudnie!

Niestety, przy ogólnym, długotrwałym zmęczeniu (przez ślęczenie przed kompem całymi godzinami, wliczając to noc), skupienie się na oglądaniu nagrań (przy jadącym równomiernie pociągu i panującej ciszy wokoło) usypia i ledwo wytrzymywałem, aby nie klapnąć. Kiedy pojawił się Poznań Główny, trochę zdębiałem, prawie zamroczony walką ze snem i chęcią dotrwania do końca nagrań. Będę je i tak musiał odsłuchać ponownie, ale zgrubnie wiem, co Odersky zamierzał przedstawić i idea strumieni (Streams) w Scali kręci mnie! Pierwszy kontakt z tym typem opóźnionego wyliczania wartości miałem już przy lekturze F#… oraz Functional Programming in Scala...

Zmęczenie wygrało i na spotkanie prelegentów nie dotarłem. Padłem ze zmęczenia. Organizatorzy wybaczcie! Wierzę, że wynagrodziłem Wam moją nieobecność prezentacją na konferencji Atmosphere. Dziękuję za zaproszenie! Było warto.

11:05 - 11:45 Scaling Agile@Allegro Krzysztof Dąbrowski Allegro Group


Na prezentację otwierającą konferencję wybrałem Scaling Agile@Allegro Krzysztofa Dąbrowskiego z Allegro Group. Wybrałem ją z pewnymi obawami, bo raz, że temat niespecjalnie dla mnie ciekawy, a dwa, że na stronie można było znaleźć "Abstract will be published soon". Co mnie jednak najbardziej intrygowało w tej prezentacji to osoba prezentera - w końcu nie codziennie ogląda się "CIO of Allegro Group and management board member responsible for IT development and operations in the central and eastern Europe.". Od osób na stanowiskach zarządczych oczekuję elokwencji, aparycji i wiedzy. Chciałem zobaczyć na własne oczy, jak bardzo Allegro stawia na określenie swojego wizerunku na konferencjach. Zawsze wyobrażałem sobie, że skoro CIO of Allegro Group występuje, to przed wystąpieniem przeszedł cały szereg szkoleń przygotowawczych, które w połączeniu z praktyką zarządzania ludźmi będą pozytywnie oddziaływały na słuchaczy.

Raspberry Pi


Przy wejściu do budynku konferencyjnego spotkała mnie miła niespodzianka - każdy uczestnik konferencji otrzymuje...Raspberry Pi! To była bardzo miła niespodzianka. Niestety, na prezent muszę trochę poczekać, bo uczestników było więcej niż przewidywano (brawa!) i sprzętu po prostu nie starczyło (mniej braw).

Back to Krzysiek


A wracając do wystąpienia Krzyśka. Zaoszczędzę Krzyśkowi męk "wsłuchiwania" się w odgłosy z internetowego eteru - było przeciętnie. Może należałoby obniżyć oczekiwania, aby ostateczna ocena była wyższa?! W końcu ocena końcowa jest subiektywna i wyznaczana jest również przez pryzmat oczekiwań. Niższe oczekiwania być może dałyby wyższe noty, a tak…zacząłem przyglądać się wystrojowi wnętrz.

Otwarta przestrzeń i ciekawy wystrój "wnętrz" sprawiała wrażenie miejsca na hack-a-thon. Były krzesła (jak się później dowiedziałem ze względu na ich mniejsze wymaganie odnośnie miejsca) oraz pufy do siedzenia, co w połączeniu z monitorami w kilku miejscach sali wywarło na mnie bardzo pozytywne wrażenie. Podobało mi się. Duże brawa dla organizatorów za pomysł.

Jako, że miejsce wystąpienia nie było osłonięte z jednej strony, hałas z przestrzeni kulinarno-społecznej skutecznie zakłócał wsłuchiwanie się w wystąpienie. Z pewnością należałoby to wyeliminować przy kolejnej edycji.

Słówko z Brianem McCallister'em


Zaraz po wystąpieniu Krzyśka rozpocząłem poszukiwanie Brian'a McCallister'a. Nie mogłem doczekać się, aby zamienić z nim słowo. Akurat w tym momencie miał nagrywany wywiad, więc przestępując z nogi na nogę (nie?)cierpliwie czekałem.

I się doczekałem!

Brian okazał się być bardzo przenikliwym rozmówcą i nad wyraz sceptycznym. Bardzo schłodził moje zapędy do zmiany świata imperatywno-obiektowego na funkcyjny. Na moje zapytania o jego postrzeganie programowania funkcyjnego z Clojure i Scalą, prawie nie ziewnął ze znudzenia. Nie porwało go najwyraźniej, co, w połączeniu z pewną moją nieśmiałością, można zrozumieć. Kiedy dorzuciłem do tego pomysł wdrożenia kilku konstrukcji funkcyjnych do Apache TomEE, skwitował to stonowanym "A po co?" Powiedział to w takim stylu, z takim spokojem i opanowaniem, jakby mnie ktoś oblał najpierw zimną, a później gorącą wodą (w granicach rozsądku) i zostawił mnie mokrego - zdębiałem i może nawet przez moment zastygłem z otwartą buzią. Spodziewałem się (kolejny raz te oczekiwania!), że porwę go w wir dyskusji na temat wyższości jednego podejścia (obiektowego) do paradygmatu funkcyjnego, a tu…flauta. Zero jakiegokolwiek powiewu! Nawet takiego najdrobniejszego.

I tak sobie rozmawialiśmy na temat jego zainteresowań, zatrudnienia, o kilku wspólnych znajomych, o niezwykle przyjemnej atmosferze pracy w Facebooku, którą możnaby przyrównać do sławetnych czasów w Google, gdzie wszystko jest dane programiście, jeśli tylko może być bardziej produktywny bez konieczności przekonywania nieprzekonanych i nietechnicznych o potrzebach przekonanych i technicznych. Dodając do tego atmosferę "zajeb…tości" pracowników Facebooka i mamy pracodawcę marzenie - dla każdego programisty. Niestety, Brian się tam nie wybiera, bo wiązałoby się to z przenosinami, a tego nie przyjmuje do wiadomości. Ja czekam cierpliwie na otwarcie biura Facebooka w Polsce!

Rozmowa mogłaby trwać wieki i coś mi mówi, że wiele z moich pomysłów, które zapewne i tak nigdy nie dojdą do skutku, przy jego opanowaniu z marszu poszłoby do kosza. A tak pozostaje mi wierzyć, że kiedyś coś stworzę technicznie - mimo, że wszystkie znaki na ziemi i niebie mówią inaczej.

12:55 - 13:45 Lunch


Lunch smaczny. Udało mi się dołączyć do grona dwóch, nieznanych mi wcześniej panów, aby po chwili naszych ożywionych rozmów zwiększyć liczebność do 6. W takiej atmosferze o jedzeniu nie było co marzyć, bo się człowiek angażuje w dyskusje i zapomina przy tym o doświadczaniu przyjemności jedzenia. Makaron z czosnkiem pozostawił jednak miłe wspomnienia.


Do mojego wystąpienia pozostało niewiele ponad godzinę, więc pożegnałem rozmówców i udałem się na bok, aby w zadumie przygotowywać się psychicznie do wydarzenia. Musiałem ochłonąć, szczególnie, że wystąpienie planowałem poprowadzić po angielsku, a ożywione rozmowy prowadziłem po polsku, co sądziłem, że może mieć znaczenie na ostateczny wynik. Trzeba było spauzować.

14:45 - 15:35 Ja(cek Laskowski) z Functional web development with Git(Hub), Heroku and Clojure



"Experience a web application development with git as a source control management tool (on GitHub) as well as a deployment tool to a cloud (Heroku) and Clojure as a functional programming language." było zajawką mojego wystąpienia. I kto by pomyślał, że Clojure będzie najbardziej oczekiwanym obszarem mojego wystąpienia?! Ja do tej grupy niestety nie należałem.

Jak to w takich sytuacjach bywa, po wcześniejszym uśpieniu laptopa, okazało się, że niekontrolowane powtykanie dodatkowych urządzeń - odbiornika USB do pilota oraz projektora - zawiesiło system i wymusiło konieczność restartu (!) Masakra. Zawsze tak jest.

W trakcie restartu na sali pojawił się Andrzej Targosz z pytaniem o język wykładowy. Odpowiedziałem dyplomatycznie, że planowałem angielski, ale jeśli na sali będą wyłącznie sami polacy, przełączę się na polski. I w tym momencie nadszedł Paul Hammond, a później jeszcze dołączył do nas Muharem Hrnjadovic z Rackspace i pozostaliśmy przy angielskim.

Do prezentacji wrzuciłem kilka nowych sztuczek, które zebrałem podczas ostatniego spotkania Warszawa JUG z panami +Jakub Nabrdalik, +Paweł Cesar Sanjuan Szklarz oraz Paweł Sidoryk. Pokazali mi, co powinienem użyć w mojej prezentacji - strona wizualna i werbalna - oraz wręcz przeciwnie - czego nie powinienem.

Najbardziej zapadł mi w głowie Kuba Nabrdalik, który wyróżniał się w tym trzyosobowym tłumie prezenterskim (wrażenia ze spotkania niebawem). On w zasadzie wykreował moje zachowania podczas mojego wystąpienia na Atmosphere. Dzięki Kuba! Nie wyobrażasz sobie jak Twoje zachowanie inicjowało wyobrażenia dla mojego wystąpienia na Atmosphere. Jak tak dalej pójdzie, będę musiał poprosić Cię o dalsze rady prezenterskie, tak dobrze Ci idzie. Gratulacje (wykładniczego) rozwoju w trudnej dziedzinie prezenterskiej!

Po primo, baczniej przyjrzałem się stronie wizualnej slajdów. Nie mają one być podporą wystąpienia - czarnobiałą serią treści, którą trzeba czytać i czytać, aby nic nie wyciągnąć dla siebie, ale kolorowymi kartkami komiksu, który ma zawierać wyłącznie tyle treści, ile należałoby zapisać w swoim notatniku oraz, albo przede wszystkim,…bawić! Duża porcja humoru jeszcze nikomu nie zaszkodziła, a nie miejmy złudzeń - co można zrobić w 50 minut?! Później po prezentacji dowiedziałem się, że wiele :-)

Na pewno prezentacja ma przywoływać pozytywne skojarzenia i pozostawiać słuchacza w dobrym nastroju. Wciąż uważam, że moje slajdy są za mało różnobarwne i niewiele w nich zdjęć i rysunków, ale już nabrałem przekonania, że powinienem ich mieć więcej (krok ku doskonałości prezenterskiej). Kolejne, moje wystąpienia - Scala na Warszawa JUG oraz Clojure i Scala na JEEConf pozwolą mi na dalsze usprawnienie warsztatu praktycznie.

Idąc śladami Jakuba Kubryńskiego (współorganizatora konferencji Confitura 2013) dobrałem inną czcionkę z Google Fonts. Kiedy zobaczyłem tą wybraną nie sposób było mi się jej oprzeć i natychmiast użyłem jej w mojej prezentacji w Keynote (przypominam, że pracuję na MacOS X). Efekt bombowy, a z zielenią w tle podwójnie bombowy! Byłem z siebie zadowolony ponad miarę i chociaż ten aspekt zauroczenia publiczności miałem z głowy. Wiedziałem, że jeśli gdziekolwiek polegnę, to na utrzymaniu czasu lub angielskim. Obie rzeczy do opanowania, więc niepokój nie był specjalnie duży.

Moja prezentacja nie miała za zadania wprowadzić słuchaczy do świata programowania funkcyjnego z Clojure czy stanowić platformę edukacyjną do git'a, GitHuba czy Heroku. Postawiłem przed sobą cel prezentacji jako podsumowanie dotychczasowych dokonań poznawczych w aspekcie użycia ich trzech do zbudowania aplikacji webowej, która odbiegała architektonicznie od dotychczasowego modelu Java EE. Jakoś tak przyszło mi związać się z GitHub, Heroku i Clojure, bez specjalnego wskazania, że są to najlepsze "zabawki" na rynku. Taki miał być przekaz.

Z moich rozmów z uczestnikami wyłoniła się prezentacja niezbyt techniczna (to odpowiada mojemu wyobrażeniu), której część o GitHubie (którego znała prawie cała sala) powinna zostać przeniesiona do części Clojure (którego znało niewielu). Okazało się, że większość z zapytanych osób oczekiwało większego przekazu merytorycznego o Clojure! Mój plan tego nie zakładał, więc nie powinienem być zmartwiony ocenami, ale szkoda, że nie wykorzystałem okazji do promocji tego języka. Bardzo żałuję, że za mało poświęciłem czasu Clojure, który założyłem, że może nie zainteresować wielu, ale w połączeniu z całym środowiskiem - GitHub + Heroku - zachęci kilku śmiałków. Okazało się, że się myliłem i trzeba było więcej o Heroku, a najwięcej o Clojure.

Fajnym podsumowaniem mojego wystąpienia była rozmowa z +Mateusz Harasymczuk, który zwrócił uwagę na ciekawą rzecz - skoro GitHub i Heroku zostały użyte przeze mnie wyłącznie ze względu na bezobsługową pracę (kilka kliknięć i temat z głowy), to tyle samo czasu powinienem poświęcić na ich przedstawienie. Po co rozwodzić się nad czymś, co tego nie wymaga. Samo się broni. To była złota uwaga! Dziękuję Mateusz!

Ku mojemu zaskoczeniu, oczekiwania względem mojej prezentacji oscylowały wokół Clojure i zabrakło dwóch-trzech slajdów z przykładowym kodem źródłowym, który robiłby więcej niż przysłowiowy Hello World. Ciekawą uwagą była również ta odnośnie koloru zielonego jako tła do prezentacji - nigdy więcej! Podobnież jest to kolor źle dopasowujący się do różnych monitorów i przez to słabo wypadający jako tło slajdów. Szczęśliwie mój ulubiony kolor - niebieski - został zaaprobowany przez speca od prezentacji jako możliwy (z ciemnymi - czarnym - lub jasnymi jako preferowanymi). Muszę jeszcze podszlifować angielski i wyrzucić nieśmieszne historyjki, i będzie cacy!


Epilog


Dziękuję organizatorom za umożliwienie mi szlifowania moich umiejętności prezenterskich oraz za wspaniałe prezenty. Poniżej z Andrzejem i modelem promu kosmicznego. W końcu to Atmosphere!


Konferencja Atmosphere była wartościową platformą poznawczą - społecznościowo i prezentersko. Do zobaczenia!

09 maja 2013

Funkcyjny maj na Coursera, Atmosphere Conference, GeeCON, Warszawa JUG oraz JEEConf

6 komentarzy
Z tygodnia na tydzień zadania w szkoleniu Functional Programming Principles in Scala w serwisie szkoleniowym Coursera stają się boleśnie trudniejsze. Coraz częściej przekraczają moje możliwości intelektualne i cierpi moja dusza (ego) oraz ciało (z powodu przeciągającego się niedostatku snu).

Ale się nie poddaję! Dam radę i ostatnie wyniki są obiecujące - już gwarantują, że za zadanie z tygodnia 6 o anagramach, w którym należy wyznaczyć wszystkie anagramy podanego zdania, otrzymam co najmniej 8,46 na 10 możliwych. Została już tylko jedna funkcja do implementacji i będę w domu. Może nawet wcześniej w łóżku!

Brakuje mi najbardziej, aby z kimś pogadać na temat programowania funkcyjnego w Scali, ale nie odpuszczam również Clojure (i rzadziej F#). Język zaczyna mieć mniejsze znaczenie, bo zależy mi najbardziej na pełnym przyswojeniu myślenia funkcyjnego. Scala, Clojure czy F# to jedynie zestaw słów, którymi mogę wyrazić "zdania" funkcyjne.

I w nadchodzący poniedziałek, 13 maja, pojawię się w Poznaniu na konferencji Atmosphere Conference 2013 z tematem Functional web development with Git(Hub), Heroku and Clojure. Temat niespecjalnie rozwijany od ostatniego mojego wystąpienia z nim podczas łódzkiej konferencji Przyszłość w IT (właśnie przez "wtopienie" ze Scalą na Courserze). Wierzę jednak, że wiedza z alternatywnego języka Scala wzbogaci tę o Clojure, co sprawi, że poziom merytoryczny wystąpienia będzie wysoki. Ciekawym komentarzy po.

Z Poznania udaję się 15 maja do Krakowa na GeeCON 2013, w trakcie którego zamierzam kontynuować mój rozwój w kontekście programowania funkcyjnego. Poza udziałem w kilku prezentacjach o Scali i Clojure, dzięki uprzejmości organizatorów poprowadzę panel dyskusyjny Functional Programming - radical thinking shift and step towards clearer and reliable software. Kiedyś już uczestniczyłem w panelu jako mówca (z twórcą Spring Framework - Rod'em Johnson'em, James'em Strachan'em oraz Ted'em Neward'em w roli moderatora), a teraz przyszło mi się zmierzyć z trudniejszą rolą - moderowaniem panelu z udziałem znawców tematu programowania funkcyjnego. To 17 maja. Liczę na pomoc, bo animowanie dyskusji bez zainteresowania nią wśród uczestników może być kolejnym (majowym) wyzwaniem.

Później na chwilę wracam do Warszawy, aby 21 maja wystąpić na deskach grupy Warszawa JUG z tematem Moje pierwsze kroki w programowaniu funkcyjnym w Scali. Nie widzę go jeszcze opublikowanego na stronie grupy, ale wstępnie mam akceptację grupy organizatorów cyklicznych spotkań, więc spodziewam się ogłoszenia niebawem. Zachęcam do udziału, bo liczę na aktywny udział obu stron - prowadzącego oraz słuchaczy - co powinno wyjść na dobre każdemu. Na pewno pomoże w zrozumieniu chociażby kilku problemów funkcyjnych, z którymi borykałem się podczas kursu Odersky'ego na Coursera, warsztatów Grześka Balcerka oraz lektury Functional Programming in Scala.

A pod koniec tygodnia, 24 i 25 maja, pojawię się w Kijowie na konferencji JEECOnf. Tam zdobędę się na wystąpienie o Clojure (Introduction to web application development in Clojure) i Scali (Introduction to functional programming in Scala). Jednocześnie o obu językach? Tego jeszcze nie było w moim wykonaniu! Nie mogłem odmówić sobie spróbowania, bo okazja do bezpośredniej wymiany doświadczeń nie zdarza się często. Będzie z pewnością bogato merytorycznie, bo w końcu będę mógł podjąć się wyjaśnienia pewnych problemów programistycznych przez pryzmat języków Java, Clojure, a teraz i Scala. Ciekawym, kiedy do mojego repertuaru dołączy F#?!

Do zobaczenia!

06 maja 2013

Zliczyć krotność liter w ciągu znaków w Scali

11 komentarzy
Przyszło mi spędzać coraz więcej czasu ze Scalą ze względu na coraz trudniejsze zadania w szkoleniu Functional Programming Principles in Scala i tym razem trafiłem na ciekawy problem programistyczny, którego rozwiązanie dalekie jestbyło od doskonałości. Coś mi mówiło, że można ładniej, a na pewno skromniej (w sensie "w bardziej zwartej postaci").

Załóżmy, że mamy nieuporządkowaną listę par znak-krotność (typu List[(Char, Int)]), w której można znaleźć pary dla tych samych liter, np.
val l = List(('a',2), ('b',1), ('a',1), ('c',1), ('c', 3), ('e',3))
Jak miałaby wyglądać funkcja, która przyjmuje listę, np. l powyżej, i "normalizuje" ją do postaci uszeregowanego (leksykograficznie) ciągu par, w których na drugiej pozycji jest suma wszystkich krotności dla danego znaku.

Przy założeniu powyższej listy l otrzymalibyśmy wynik:
List((a,3), (b,1), (c,4), (e,3))
Początkowo napisałem takiego potworka, który nie tylko, że nie wyglądał, ale i posiadał błąd (patrz ostatni map z l.length):
(l groupBy { case (c, _) => c }).toList map (e => e._2) map (l => (l.head._1, l.length)) sorted
Obrzydlistwo!

Moje neurony nadawały na zwiększonej częstotliwości, kiedy ślęczałem nad tym problemem, a ostateczny wynik o mało co nie zrzucił mnie z krzesła! Przede wszystkim był mój i dodatkowo działał!

Nie podam jeszcze rozwiązania, aby nie psuć zabawy. Podpowiem, że w moim rozwiązaniu nie zabrakło miejsca dla groupBy, map, funkcji anonimowych z case oraz sum i sorted. W sumie 76 znaków, co wciąż nie zachwyca skromnością. A jak u Ciebie?

01 maja 2013

Confitura 2013 i programowanie funkcyjne na JVM w Scali i Clojure

6 komentarzy
Coś ostatnio nie mogę opanować mojego harmonogramu. Spóźnień jakby więcej. Dobrze chociaż, że jedynym pokrzywdzonym jestem wyłącznie ja sam.

Najpierw niedotrzymałem terminu zgłaszania rozwiązań zadań z Huffman Coding (Week 4: Types and Pattern Matching) w kursie Functional Programming Principles in Scala na Coursera, co kosztowało mnie stratę 4 punktów (po 2 za każdy dzień zwłoki).

Teraz ominęła mnie przyjemność zgłoszenia tematu na nadchodzącą konferencję Confitura 2013. Termin właśnie upłynął wczoraj o północy, a pamiętam, jak "zmóżdżałem się" nad tematem wokół programowania funkcyjnego na JVM ze Scalą i Clojure, aby zawalony bieżącymi sprawami przegapić najważniejsze.

Zamiast biadolić, pomyślałem sobie, aby zamienić wpadkę na sukces (podobno wystarczy jedynie zmienić postrzeganie, czasami kryteria oceny) i zaproponować coś ala wykład w postaci skrinkastów (=filmów instruktażowych) na YouTube lub vimeo (wciąż nie mogę zdecydować się na wybór tej jednej platformy do nagrań).

Jako, że Scala całkowicie zawłaszczyła mój czas, który zadeklarowałem na naukę programowania funkcyjnego na JVM, pomyślałem, że napiszę na tym blogu, aby wybadać zainteresowanie tym językiem jako medium do nauki tego paradygmatu, któremu najwyraźniej wciąż brakuje materiału w postaci nagrań w języku polskim.

Grzegorz Balcerek odwalił kawał roboty w postaci stworzenia szkolenia „Scala i programowanie funkcyjne”, które gorąco polecam. Poświęciłem mu 2 weekendy i uważam je za wartościowe.

Jest również portal Scala.net.pl z hiperaktywnym +Tomasz Nurkiewicz (któremu trudno dotrzymać kroku także na StackOverflow), na którym można również "spotkać" Grześka, więc można śmiało założyć, że materiału pisanego jest cała masa.

Wciąż jednak brakuje mi nagrań o Scali, Clojure, F# czy innych języków funkcyjnych na JVM i poza nią po polsku z twarzą nagrywanego, które ociepliłyby nagranie. Brakuje mi krótkich filmików instruktażowych, jak również dyskusji (tutaj również nadmienię brak jakichkolwiek polskich podkastów). Uważam, że jest to miejsce zaniedbane u nas i można bez większych problemów potraktować to jako własną niszę twórczą.

Czy faktycznie tak jest? Czy nagrania w postaci filmów (krótko- i długometrażowych) czy podkastów po polsku są "w cenie"? Są chętni na odsłuchiwanie takich produktów? Jak często? Jakie długie? Jaka tematyka (wokół programowania funkcyjnego oczywiście)? Inne?

Niech ta aktywność będzie rekompensatą mojego braku zgłoszenia tematu i ewentualnie udziału jako prelegent na Confiturze 2013.