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 :)