04 stycznia 2012

Clojure finansowo

Maksym to straszny brojek się robi. Kiedykolwiek przyglądam mu się bacznie, bez względu na jego minkę, widzę w nim gościa, którego będzie nosiło. Aż boimy się z Agatą pomyśleć, co będzie, kiedy zacznie raczkować, a później chodzić. Brrr...Będzie jazda bez trzymanki (jak u Owsiaka na WOŚPie)!


Gość właśnie skończył 3 miesiące i rośnie jak na drożdżach. Zdjęcie z miarką jest z 18 grudnia i teraz jest jeszcze dłuższy! Niech rośnie w siłę, aby tatusiowi na emeryturę zarobić :)

Clojure

Jeszcze w zeszłym roku zabrałem się ponownie za Clojure i w ramach postanowień noworocznych zdecydowałem się rozpoznać możliwość wykorzystania tego języka do tworzenia aplikacji biznesowych. Wiem, że ludzie w tym coś robią i powstają systemy korporacyjne, ale ja jakoś tego nie czuję.

Jeszcze.

Siedzę od lat w Javie, głównie w jej wydaniu korporacyjnym (Java EE), i kiedykolwiek pytany o możliwości Clojure, moim ochom i echom nie ma końca. Szybko się jednak kończy, kiedy pada "A jaką aplikację możnaby w tym napisać, aby widać było zysk w porównaniu, chociażby, z Javą?". I tu mnie pot zalewa, zaczynam czkać i kończy się na mizernym "Nie wiem". Właśnie na tym chciałbym popracować w tym roku. Muszę to wiedzieć, albo pora zarzucić Clojure jako język, któremu poświęcam czas.

Czytam sobie pomalutku "The Joy of Clojure: Thinking the Clojure Way" i poszukuję odpowiedzi na nurtujące mnie odpowiedzi sensowności stosowania języka przy tworzeniu aplikacji korporacyjnych (niechby to były wyłącznie aplikacje webowe). Wiem o istnieniu Compojure, Ring i podobnych rozwiązań, ale jakoś do mnie nie przemawiają, bo...tak naprawdę w ogóle się z nimi nie zmierzyłem na dłużej niż kilka chwil. To uważam za głównego winowajcę moich trudów mentalnych wokół Clojure.

I właśnie w tym roku postanowiłem to zmienić. Albo teraz, albo nigdy.

...finansowo

Ostatnimi czasy wzięło mnie na porównywanie ofert różnych banków dotyczących lokat (głównie "antybelkowych") i rachunków oszczędnościowych (z dniowym naliczaniem odsetek). Na bankier.pl trafiłem na ofertę Deutsche Banku z kontem oszczędnościowym z kapitalizacją 8,1% (bez podatku od zysków kapitałowych przy założeniu, że nie przekroczymy 10k PLN).

To górne ograniczenie mnie zaintrygowało. Moje skromne pokłady wiedzy finansowej zostały lekko nadwyrężone, kiedy miałem policzyć, ile należy wpłacić, aby nie przekroczyć 10k w ciągu miesiąca, w którym mam do dyspozycji jeden przelew bezpłatny. Chodziło o znalezienie tej magicznej kwoty, z którą mogłem spokojnie przespać 29 nocy, aby przed 30. przelać różnicę niezbędną do "przeczekania" kolejnego miesiąca (i tak wyłącznie do 28 lutego).

Wystarczyło otworzyć Google Docs i policzyć. Można było również skorzystać z kalkulatorów różnej maści w Sieci, albo LibreOffice, ale mnie zachciało się...Clojure (później dopiero doszło do mnie, że to był przerost formy nad treścią, ale co wiem, to moje).

Chcesz spróbować samodzielnie? Nic trudnego. Przekonaj się sam(a)!

Zainstaluj lein zgodnie z dokumentacją na stronie domowej projektu. Sprowadza się to do pobrania skryptu lein i kilku drobnych systemowych ustawień.

Teraz już tylko kilka chwil i siedzisz w Clojure po pachy.
jacek:~/sandbox
$ lein new clojure-finansowo
Created new project in: /Users/jacek/sandbox/clojure-finansowo
Look over project.clj and start coding in clojure_finansowo/core.clj
jacek:~/sandbox
$ cd clojure-finansowo/
jacek:~/sandbox/clojure-finansowo
$ lein repl
Copying 1 file to /Users/jacek/sandbox/clojure-finansowo/lib
REPL started; server listening on localhost port 25483
user=> 
I jesteś w REPL - interaktywnej powłoce Clojure. Skorzystaj z poniższego skryptu, aby wyliczyć ILE trzeba włożyć, aby nie przekroczyć magicznego 10k w miesiącu, w którym masz jeden przelew darmowy (wliczając przelew na rachunek spoza banku).
; zakładam 366 dni w roku 2012 i kapitalizację w dni wolne (niesprawdzone)
(defn interest-rate-per-day [interest-rate-per-year]
     (/ (* interest-rate-per-year 0.01) 366))

; funkcja pomocnicza do wyliczenia zysku (niewykorzystywana)
(defn interest [present-value interest-rate]
     (- (* present-value (inc interest-rate)) present-value))

(defn future-value [present-value interest-rate periods]
     (* present-value (Math/pow (inc (interest-rate-per-day interest-rate)) periods)))

(defn max-present-value [limit interest-rate periods]
     (/ limit (Math/pow (inc (interest-rate-per-day interest-rate)) periods)))

(max-present-value 10000 8.1 31)
Nie jest to cudo programowania w Clojure, ale nie miało takim być. Służyło jedynie odświeżeniu moich znajomości z Clojure i uważam, że ten cel został w pełni zrealizowany. Przede wszystkim, zrealizowałem swój własny cel biznesowy (a właściwie finansowy, ale przecież to to samo).

Czy nazwy funkcji odpowiadają zamierzeniom autora (patrząc oczyma czytelnika)? Czy zrobił(a)byś to inaczej? Daj się namówić na podzielenie się kilkoma usprawnieniami, aby biedną duszyczkę jackową uchować od ogni piekielnych :)

9 komentarzy:

  1. W temacie lokat bankowych: polecam adres getinonline.pl; oprocentowanie co prawda niższe niż w DB, ale za to nie traci się cennego czasu w banku, można otworzyć wiele lokat jednocześnie, cały czas pojawiają się nowe promocje, no i mają bardzo wygodny i intuicyjny interfejs webowy.

    OdpowiedzUsuń
  2. Dzięki za radę Unknown, ale mam lepsze rozwiązanie na ulokowanie nadwyżek - IdeaBank. Zdecydowanie lepsze oprocentowanie, bodaj teraz 8,5% na 5 m-cy (i obsługa jak w GO - ta sama grupa).

    OdpowiedzUsuń
  3. Jak dla mnie ten lispowy kod strasznie nieczytelny jest. Zeza dostaję od tych nawiasów ;) Aczkolwiek może to kwestia przyzwyczajenia.

    OdpowiedzUsuń
  4. Tak, to pewnie kwestia przyzwyczajenia. Rozumiem Cię świetnie, bo sam doświadczam tego zezowania, kiedykolwiek widzę te nawiasy. Mogą przytłoczyć człowieka.

    Jest na to rozwiązanie - kolorowanie. Bodajże nazywają to tęczowym, gdzie każda para nawiasów ma swój kolor, co ułatwia znacznie czytanie. Zawsze to rozwiązanie na bolączki związane z brakiem czytelności kodu.

    Upewnię się, że kolejne wpisy z Clojure będą kolorowane jakoś. W końcu szkoda byłoby, abyś zniechęcił się do Clojure tylko dlatego, że nawiasy przyprawiają Cię o zeza :-)

    p.s. Masz świadomość, że liczba nawiasów w Twojej aplikacji jest pewnie równa, a może nawet większa niż w odpowiadającym jej kodzie w Clojure? Podaj jakąś metodę, którą moglibyśmy sprawdzić - dla mnie to było nie lada odkrycie (co nie zmienia faktu, że to grupowanie nawiasów może wykończyć w Clojure, czy innym języku lispopodobnym).

    OdpowiedzUsuń
  5. @Jacek Olszak: http://www.thejach.com/imgs/lisp_parens.png (-:

    @Jacek Laskowski: Prosto i przejrzyście.

    OdpowiedzUsuń
  6. Jacek zaintrygowało mnie Twoje spostrzeżenie dotyczące podobnej liczby nawiasów w Lispie i innym języku imperatywnym (bo o to chodziło?). Napisałem więc kod pierwszej funkcji w Javie:

    double interestRatePerDay(double interestRatePerYear) {
    return interestRatePerYear * 0.01 / 366;
    }

    Wychodzi 4 nawiasy vs 8 nawiasów w Clojure. Oczywiście to są tylko liczby nie mające większego sensu. Być może w innej sytuacji byłoby więcej nawiasów w Javie. Tak jak powiedziałem wcześniej - pewnie po ciągłym patrzeniu w kod Lispowy w końcu bym się do niego przyzwyczaił i zobaczył jego ukryte piękno. Co do tego kolorowania składni, o którym mówisz to jest to całkiem ciekawy pomysł :)

    Daniel, bardzo dobry obrazek - trochę propagandowy jednak jest w nim sporo prawdy :)

    OdpowiedzUsuń
  7. Akurat ten przykład jest wyjątkiem nie regułą :) A tak po prawdzie, to zacznę używać Gist do kolorowania i jeszcze się nie poddawaj z zezowaniem, bo od następnego posta o Clojure koniec z nim. Z góry dziękuję za wytrwałość i chęć przekonania się o możliwościach Clojure (niekoniecznie wyższości nad innymi językami - na tym mi kompletnie nie zależy, więc możesz od razu o tym zapomnieć :)).

    OdpowiedzUsuń
  8. Witam,
    Jako lokata to nadwyżki lepiej lokować w czymś innym niż w walutę (złoto, ziemia, dzieci :)

    A może spojrzeć na inny język - scala? Z nim można pisać poważne systemy (lift, akka actors itp)
    Pozycja na start Martina Oderskiego i spółki (recenzji nie trzeba :)
    "Programming in Scala"

    Pozdrawiam
    Andrzej

    OdpowiedzUsuń
  9. Cześć katborek!

    Jesteś kolejną osobą, która próbuje namówić mnie na Scalę, ale zwykłem w takiej sytuacji odpowiadać nie teraz. Noworoczne postanowienia postanowiłem tym razem spełnić przynajmniej w zakresie poznania programowania funkcyjnego z Clojure. W końcu muszę rozkminić, czym jest PF i Clojure, i gdzie mogę to zastosować, aby zamiast Javy móc go zaproponować.

    Zgadzam się, że Scala ma swoje miejsce w naszej branży, ale różnice między Javą a Scalą są niewielkie, a mój umysł potrzebuje prawdziwej zmiany i Clojure daje mi to. Nie tylko, że więcej w nim nawiasów z notacją prefiksową, ale (prawie) czyste programowanie funkcyjne. Obie rzeczy sprawiają, że trudno szukać w Scali odpowiednich dużych zmian, które mogłyby sprawić, że ich poznanie będzie wymagało ode mnie zdecydowanego zaangażowania, aby poznać język.

    A tak przy okazji, zapraszam Cię na g+, gdzie kształtuje się grupa osób, które wspólnie zamierzają przestudiować Scalę i jej zastosowania vs Clojure. W grupie jest już Radek, Bartek i Rafał. Zajrzyj do mojego profilu i znajdziesz dyskusję nt. temat. W ten sposób zamierzam poznać ten język.

    OdpowiedzUsuń