Sunday, May 31, 2009

JavaFX is statically typed. Scala is statically typed.

Sometimes people are suprised when they read or hear that Scala and JavaFX are statically typed languages. Probably it is because in this languages you can declare variables without explicitly telling the type, like this:
//It looks exactly the same in JavaFX and Scala
var a = "string";
No type is given, yet compiler knows a is String (at compile time). How does it know? Well, we just assigned value of type String to it, didn't we? When declaring some variable and immediately assigning value to it, you don't have to add type to the declaration.

Saturday, May 23, 2009

Be careful binding to functions in JavaFX

In JavaFX (I'll call it JFX from now) there is possibility to bind variables. You can bind variable to another variable:
var src = 4;
def dst = bind src;
println(dst);
src = 42;
println(dst);
it'll print:
4
42
Maybe you noticed I used var for one variable and def for another. It could be as well var in both cases. Bind makes dst is updated every time it is read. Here we bound variable to another variable, but we can bind it to any expression:
var factor = 3;
var multiplier = 3;
def dst = bind getValue(multiplier);
println(dst);
multiplier = 5;
println(dst);

function getValue(p:Integer) {
 p * factor;
}
What it gives us?
9
15
Still everything is quite clear, isn't it? First value of dsc is 3*3, which is 9, than multiplier is changed and we get 5 * 3, which is 15. Let's now change factor, not multiplier:
var factor = 3;
var multiplier = 3;
def dst = bind getValue(multiplier);
println(dst);
factor = 5;
println(dst);

function getValue(p:Integer) {
 p * factor;
}
And we get:
9
9
Now this is wrong! First we want 3*3 which is 9, so it is ok, but then we change factor and expect 3*5, which is 15, but we still get 9. What's up? Well, dsc is bound to function. JFX remembers our function was called last time with parameter 3, and returned 9. Second time (second read of dst) it is also called with parameter 3, so JFX doesn't call it again, but just gives us cached value. But there is something we can do about it, and it is the bound keyword:
var factor = 3;
var multiplier = 3;
def dst = bind getValue(multiplier);
println(dst);
factor = 5;
println(dst);

bound function getValue(p:Integer) {
 p * factor;
}
And now it prints:
9
15
Just as expected. bound keyword makes JFX analyse the function and checks which variables can affect return value. In this case it can recoginze return value is dependent not only on input parameter, but also on factor variable, so when variable changes, JFX calls the function again even if the parameter doesn't change. Now consider a little different code:
var factor = 3;
var multiplier = 3;
def dst = bind getValue(multiplier);
println(dst);
Thread.currentThread().sleep(5);
multiplier = 5;
println(dst);
Thread.currentThread().sleep(5);
println(dst);

function getValue(p:Integer) {
 System.currentTimeMillis();
}
Note that function is not bound again. sleep(5) is there to make sure two calls won't happen in the same millisecond. So it can give us:
1243112189488
1243112189496
1243112189496
(of course you'll get different values if running it at different time) First is number of milliseconds, second is again proper number of milliseconds, because function parameter value has changed and JFX called function again, and then second value is repeated, because parameter value didn't change and function return value is taken from cache. But what happens when we'll use bound? Let's see:
var factor = 3;
var multiplier = 3;
def dst = bind getValue(multiplier);
println(dst);
Thread.currentThread().sleep(5);
multiplier = 5;
println(dst);
Thread.currentThread().sleep(5);
println(dst);

bound function getValue(p:Integer) {
 System.currentTimeMillis();
}
And we get:
1243112415228
1243112415228
1243112415228
What? All three values are the same? So adding bound even made things worse! How is it possible? Well, bound makes JFX not only can recognize which variables affect return values, but also which function parameters doesn't affect it. So now JFX is aware that p doesn't affect return value of the function and it calls the function only on the first time. Then it takes value from cache, regardless parameter has changed or not. Conclusion: Be careful when using functions for binding variables. Be extremely careful when using functions dealing with current time (or better just don't do it ;)).

Friday, May 22, 2009

JavaFX for linux

There is no official release of JavaFX for linux. Yet you can use it thanks to Silveira Neto. Here is his blog entry with plugins for Netbeans.

All you need to do is download the plugins, extract and install in Netbeans 6.5.x (doesn't work on 6.7 beta). You also need java 1.6 update 13.

Sunday, May 17, 2009

Key promoter for Eclipse

Did you ever miss key promoter in Eclipse? I did. Fortunately I found one: Mousefeed

Whenever you do some action with your mouse, and there is keyboard shortcut for this action, the shortcut is displayed:

English from now on

Z tych samych przyczyn co Paweł Szulc, przechodzę na angielski. Mam nadzieję, że nie ubędzie mi przez to czytelników.

Monday, May 11, 2009

GeeCON - wrażenia (jak najbardziej pozytywne)

Ostatnio (7-8 maja) byłem na konferencji GeeCON w Krakowie. Rewelacja! Prawdę mówiąc, nigdy nie byłem na tak dużej i tak dobrej konferencji. Poziom prelegentów naprawdę wysoki, organizacyjnie także wszystko super.

Osobiście najbardziej podobała mi się prezentacja Bruno Bossoli "SOLID design principles". Temat bardzo ważny, widać że ludziom brakuje takiej wiedzy, a jednak niewiele można o tym znaleźć. Może dlatego, że nie tak łatwo o tym napisać, nie jest to taka konkretna wiedza jak "jak zrobić X w technologii Y". Bruno wyłożył ją ze swobodą i humorem. Kilka razy sala wybuchała śmiechem, jak na dobrej komedii :)

Wrażenie zrobiła na mnie także Java FX pokazana przez Adama Biena. Muszę się bliżej zainteresować tym językiem.

Prezentacja o Scali była chyba przewidziana dla trochę innego audytorium. Odniosłem wrażenie, że Luc Duponcheel to naukowiec, zajmujący się problematyką języków programowania na codzień i znający je od podszewki, przez co wszystko wydaje mu się banalnie proste. Dla słuchaczy jednak takie nie było. Mimo wszystko utwierdzam się w przekonaniu, że trzeba się tym językiem zainteresować bliżej.

Miško Hevery przedstawił kilka ciekawych problemów dotyczących testowania. Dowiedziałem się m.in., że TDD jest jak seks - jeśli nie sprawia Ci przyjemności, znaczy że źle to robisz ;) Poznałem też ciekawe narzędzie, którego chciałbym zacząć używać w firmie w której pracuję. Mianowicie testability-explorer - narzędzie pokazujące na ile kod jest "testowalny". Tak się składa, że testowalność kodu przekłada się na jego dobry design, więc jest to istotna metryka.

O Groovym co nieco już wiedziałem. Właściwie to uczyłem się Ruby'ego, ale okazało się, że Groovy jest jego kalką :) Nie wiedziałem natomiast, że kompilator Groovy'ego akceptuje składnię Javy. Oznacza to, że możemy klasę w Javie zamienić na klasę w Groovym (przez zmianę rozszerzenia pliku lub skopiowanie jego zawartości) i stosować składnię Groovy'ego tylko tam gdzie chcemy, stopniowo. Widziałem też, że ludzie, którzy wcześniej nie widzieli Groovy'ego/Ruby'ego, byli zachwyceni :) Fakt, skrócenie 6 linii kodu do jednej robi wrażenie :)

Kolejne narzędzie, które chętnie wypróbowałbym w firmie to Gradle. Z tym jednak nie będzie już tak łatwo, bo nie da się tego "dołożyć" do istniejących struktur. Jeśli budujemy projekt mavenem, to zastosowanie Gradle'a wiązałoby się z całkowitą rezygnacją z mavena, a to nie będzie proste. Tym niemniej narzędzie jest warte zainteresowania. Może da się je wykorzystać przy jakimś nowym projekcie jak się pojawi.

Nie wspomniałem jeszcze o szkoleniu. W ramach konferencji można było po promocyjnej cenie (naprawdę niskiej - 100zł) wziąć udział w szkoleniu. Ja wybrałem szkolenie z Web Services, choć teraz trochę żałuję że nie z Java FX. Cóż, pozostają książki i internet.

Nie mogę także nie pochwalić się pierwszym certyfikatem z Javy - BE-004. Jest to certyfikat potwierdzający udział w "Java Beer Advanced Training" :)

Pozostaje mi podziękować jeszcze raz organizatorom za świetną konferencję. Było naprawdę super, kto nie był ma czego żałować.