Choinka FX

napisane przez wiktor, 15:24 12-22-2007

Za moją namową Radek Holewa wczoraj wykonał choinkę w JavaFX :). Nie można powiedzieć o niej, że powala na kolana (sorry Radek ;)), więc obiecałem, że zrobię lepszą. Chociaż ciut lepszą. Oto wynik paru zmian w choince Radka:

Choinka w JavaFX


Poniżej znajduje się kod powyższej choinki. Możesz go szybko odpalić w JavaFX Pad. Odpal JavaFX Pad, wklej poniższy kod i choinka gotowa :).

Java Web Start - JavaFX Pad



UWAGA! Jeśli najedziesz kursorem na napis “Wesołych Świąt” to choinka się obróci ;).

package choinka;

import javafx.ui.*;
import javafx.ui.canvas.*;
import javafx.ui.filter.*;
import java.awt.Dimension;

class ChoinkaFX extends CompositeNode {
    attribute rotationValue: Number;
}

attribute ChoinkaFX.rotationValue = 0;

function ChoinkaFX.composeNode() =
Group {
    content: [Group {
        transform: bind [translate(20, 10), rotate(rotationValue, 150, 70)]
        filter: [ShapeBurst { factor: 4 }, LightFilter { diffuseColor: green }, GaussianBlur]
        content:[
        Rect {
            x: 60
            y: 240
            height: 40
            width: 40
            fill: green
            stroke: lightgreen
            strokeWidth: 5
        },
        Polygon {
            points: [10, 240, 150, 240, 80, 150]
            fill: green
            stroke: lightgreen
            strokeWidth: 5
        },
        Polygon {
            points: [10, 160, 150, 160, 80, 70]
            fill: green
            stroke: lightgreen
            strokeWidth: 5
        },
        Polygon {
            points: [10, 80, 150, 80, 80, 2]
            fill: green
            stroke: lightgreen
            strokeWidth: 5
        }]
    },
    Text {
        x: 170, y: 120
        content: "Wesołych Świąt"
        fill: maroon
        font: Font { face: VERDANA, size: 40 }
        filter: [ShadowFilter]
        onMouseEntered: operation(event) {
            rotationValue = [0..360] dur 1000;
        }
    }
    ]
};

Canvas {
    content: ChoinkaFX
    background: lightblue
    preferredSize: Dimension { width: 500, height: 300 }
}


Wesołych Świąt!

AKTUALIZACJA: Pięciosłówek wygrał konkurs na najlepszą aplikacją dla Grono

napisane przez wiktor, 22:53 12-16-2007

piecioslowek - logo


W piątek na stronach technicznego blogu grono.net opublikowano wyniki konkursu na najlepszy widget dla grona. Praca mojego autorstwa - Pięciosłówek - zdobyła pierwsze miejsce! :)

Co to jest Pięciosłówek? Prosta aplikacja, dzięki której możesz opisać swoich znajomych (z grona) w dokładnie pięciu słowach. Pyszna zabawa :). Pięciosłówek działa jako zwykła aplikacja internetowa, a także jako gadżet dla iGoogle, jako sideBar dla Firefoxa oraz jako widget dla Netvibes.

Teraz trochę techno-informacji. Aplikacja została napisana w oparciu o Ruby on Rails. Przy okazji napisałem bibliotekę RGrono, która rozmawia z API gronowym (tylko w tym zakresie, który potrzebowałem). Jak będę miał trochę czasu wolnego (tiaaa….) to dopiszę brakującą funkcjonalność i upublicznię RGrono.

AKTUALIZACJA (11-02-2008)

W zawiązku z pomówieniami dotyczącymi mojego projektu Pięciosłówek postanowiłem zamieścić krótkie oświadczenie.

Przyznaję, że kolorystyka oraz jedna grafika były wzorowane na serwisie Pownce. Jednocześnie pragną przypomnieć, że w kontekście całej aplikacji rzeczy te nie miały większego znaczenia. Podkreślam także, że Pięciosłówek nie ma nic wspólnego z pomysłami serwisu Pownce.

Ponadto pragnę poinformować, że rozmawiałem z Pownce. Poniżej przedstawiam odpowiedź:

Hi Wiktor. Thanks for contacting us about this issue. If possible, please change the graphics that are taken directly from Pownce’s interface. Otherwise, if you’d just send us something really cool from Poland, we’ll consider the whole matter closed. Cool?

Pownce Inc.
1459 18th Street, Suite 142
San Francisco, CA 94107
USA

Daniel Burka
Interface Designer, Pownce

Chciałbym również podkreślić, że o całej zaistniałej sytuacji dowiedziałem się przypadkowo, gdyż inicjator pomówienia nie był stanie zawiadomić mnie o swoich podejrzeniach osobiście. Warto tu również zauważyć, że wszelkie insynuacje wychodzą od osoby całkowicie anonimowej. Nie miałem żadnych możliwości kontaktu z nią, rozmowy.

Jeżeli wystąpią jakiekolwiek inne wątpliwości dotyczące mojej pracy, proszę o bezpośredni kontakt ze mną.

Poznajemy nowe języki: Scala, czyli jak wypisać elementy z listy

napisane przez wiktor, 17:39 12-12-2007

Scala. Co to za język?

  • Scala została sklasyfikowana jako język funkcyjny, obiektowy, wielo-paradygmatyczny (mam nadzieję, że dobrze tłumaczę),
  • statycznie i silnie typowany,
  • obecna implementacja bazuje na JVM, niedługo można się spodziwać implementacji na .NET,
  • tak!, Scala działa na platformie Java, więc ma dostęp do całego ekosystemu bibliotek Javy,
  • nietuzinkową postacią jest sam twórca języka Martin Odersky, który jest współautorem obecnego kompilatora Javy oraz jest współprojektantem obecnych typów generycznych w Javie,
  • jest to młody język programowania i posiada wiele ciekawych własności, o których to będę pisał w kolejnych postach,
  • więcej: Scala na Wikipedii, strona domowa Scali, wywiad z twórcą języka.

OK, wezmę na warsztat prostą czynność: wypisanie elementów z listy.
Kod w Javie byłby następujący:

JAVA:
  1. List<Integer> lista = new ArrayList<Integer>() {{
  2.    add(1); add(2); add(3); add(4);
  3. }};
  4.  
  5.  
  6. for (Integer x : lista)
  7.     System.out.println(x);
  8.  
  9. // Można też tak, ale raczej nie bym nie polegał na metodzie toString()
  10. System.out.println(lista.toString());
  11.  
  12. // lub po prostu:
  13. System.out.println(lista);

Dla odmiany w Ruby'im zrobilibyśmy to tak:

RUBY:
  1. # tutaj akurat mamy tablicę
  2. lista = %w(1, 2, 3, 4)
  3.  
  4. # żeby ładnie było to definiujmy println
  5. println = lambda { |x| puts x }
  6.  
  7. lista.each &println

Zobaczmy teraz, jak zrobilibyśmy to w Scali.

SCALA:
  1. val lista = List(1, 2, 3, 4)
  2.  
  3. lista.foreach((x: Int) => println(x))

Brzydko... idziemy dalej. Scala jest językiem funkcyjnym, który ma mechanizm currying. Opuśćmy deklarację typu i nawiasy.

SCALA:
  1. lista.foreach(x => println(x))

Nadal brzydko... idziemy dalej. Co jest argumentem metody foreach? Sygnatura metody jest następująca:

SCALA:
  1. def foreach(f: A => Unit): Unit

Na potrzebę chwili traktujmy Unit tak samo jak void. Zatem argumentem foreach jest funkcja, która przyjmuje argument A (jakiś nieustalony typ, patrz: currying) i zwraca Unit. Natomiast println jest zdefiniowany tak:

SCALA:
  1. def println(x: Any) = Console.println(x)

czyli bierze jakiś argument (nadal patrz: currying, funkcje wyższego rzędu) i zwraca Unit. Zatem typy się zgadzają. Zapiszmy to krócej:

SCALA:
  1. lista.foreach(println)

Już lepiej, ale można jeszcze lepiej :). Scala ma bardzo fajną własność, którą nigdzie wcześniej nie spotkałem. Mianowicie w Scali technicznie nie ma operatorów. Wyrażenie 1 + 2 jest tożsame z wywołaniem metody 1.+(2). Jeśli metoda przyjmuję tylko jeden parametr to można pominąć nawiasy oraz kropkę. Zatem:

SCALA:
  1. lista foreach println

Piękny zapis, nieprawdaż? :) A czy twój ulubiony język zrobi to lepiej?

Netbeans 6 już jest

napisane przez wiktor, 2:27 12-07-2007

Netbeans - świeżutki i cieplutki


Już można pobrać ze strony netbeans.org najnowszą wersję Netbeans. Tym razem w wersji 6. Jest to krok milowy dla rozwoju Netbeans, dlatego że wreszcie staje się on konkurencyjny dla Eclipse i IntelliJ IDEA. Wcześniej nie dało się go w ogóle używać. Edytor dla Javy, czyli najważniejszy jego element, był po prostu niemiłosiernie wolny. Sun słusznie postanowił wpompować w niego dużo pieniędzy i widać tego efekty.

Wybrane najważniejsze rzeczy w Netbeans 6:

  • Nowy, szybszy, bardziej inteligenty edytor dla Javy - wreszcie! Netbeansa wcześniej po prostu się nie dało używać do kodowania w Javie. Był wolny, wolny i jeszcze raz wolny. Obecna szybkość dorównuje Eclipse'owi i IntelliJ. W sumie nie powinniśmy się tym ekscytować, bo w innych środowiskach zintegrowanych była to norma.
  • Wsparcie dla trybu pełnoekranowego (Alt-Shift-Enter lub Command-Shift-Enter na Maku). Mała rzecz a cieszy.
  • Ulepszony diff - czyli kolejne wreszcie! Netbeans małymi kroczkami dogania konkurencję.
    Netbeans diff screenshot
  • Kopiowanie z IntelliJ IDEA, wystarczy zobaczyć poniższe zrzuty ekranu:
    netbeans-generate.png intellij-idea-generate.png
    Netbeans 6 IntelliJ IDEA 7

    Tak, tak... w Netbeans znajdziemy więcej takich rodzynków. To w IntelliJ IDEA znajdziemy innowacyjne pomysły i to ona jest najbardziej zaawansowanym środowiskiem zintegrowanym. Dlatego też uważam, że zapożyczanie pomysłów w Netbeans (można na to patrzeć jako kopiowanie) jest w porządku, bo napędza rynek środowisk zintegrowanych.

  • Ulepszony edytor dla Swinga i Swing Application Framework - Matisse (edytor GUI) od samego początku nie miał sobie równych. Netbeans jest obecnie najlepszym narzędziem dla programistów Swinga. Dlatego cieszy fakt, że jest on nadal udoskonalany. Dodatkowo wsparcie dla Swing Application Framework (zapewnia infrastrukturę dla małych aplikacji Swingowych) i Beans Binding (najogólniej: zapewnia synchronizację pomiędzy właściwościami obiektów) wskazuje, że Sun'owi naprawdę zależy na pobudzeniu Javy dla zastosowań klienckich/desktopowych.
    Netbeans GUI builder
  • ...ale nadal trzeba mieć osobno zainstalowane Subversion i wskazać ścieżkę do niego, żeby z niego korzystać. Nie rozumiem, czemu to jest takie trudne, żeby svn był wbudowany w Netbeans. Przecież w innych IDE jest to od dłuższego czasu standardem.
  • Ostatnie i najważniejsze wg mnie. Rewelacyjny edytor dla Ruby'iego i Ruby on Rails. Najważniejsze jego własności to proste refaktoryzacje, naprawdę dobre uzupełnianie kodu, debugger, szablony kodów (ang. Live Code Templates) i podpowiedzi. Warto go wypróbować.
    netbeans ruby, ruby on rails

PS. Brawo dla Jacka Laskowskiego, który jest najaktywniejszym członkiem grupy NetBeans IDE 6.0 Community Acceptance Testing program (NetCAT).

Notatki z warsztatu “JRuby on Rails”

napisane przez wiktor, 22:01 11-18-2007

Dziękuje wszystkim, którzy pojawili się na mojej prezentacji/warsztacie podczas WarsJava. Była ona na prawdę udana, a dyskusja po prezentacji trwała ponad pół godziny! Dziękuje jeszcze raz wszytkim za obecność. Udostępniam poniżej slajdy z prezentacji (poniżej), kod aplikacji stworzonej podczas warsztatu oraz życzenie załączam moje notatki/scenariusz prezentacji.

Warsztaty Javowe: JRuby on Rails, czyli łączenie Javy i Rubiego

napisane przez wiktor, 15:53 11-13-2007

Duke + Ruby + Rails = Java ;)

Już w najbliższą sobotę o godzinie 11:00 będę dawał prezentację "JRuby on Rails, czyli łączenie Javy i Rubiego" na WarsJava - I Warszawskie Warsztaty Javowe organizowane przez Warszawa JUG. Warsztaty będą miały miejsce na MIMUWie. I co najważniejsze: WSTĘP WOLNY :).

Podczas warsztatów pokażę:

  • jak stworzyć prostą aplikację w Ruby on Rails,
  • jak korzystać z kodu Javy z poziomu Ruby'iego,
  • jak korzystać ze sterowników JDBC do łączenia się z bazą danych,
  • jak integrować stworzoną aplikacją z istniejącą aplikacją JEE (JMS, serwer aplikacji JBoss),
  • jak wdrażać aplikacje oparte o Ruby on Rails.

Zapraszam!

Gmail już dostępny poprzez protokół IMAP

napisane przez wiktor, 22:18 10-24-2007

Gmail + IMAP

Trzeba głośno powiedzieć: "wreszcie!". Tak, od dzisiaj Gmail dostępny jest także poprzez protokół IMAP. Oficjalny wpis na blogu Gmaila jest tutaj, a wszystkie pytania dotyczące używania są tutaj.

Dlaczego ta informacja w ogóle jest istotna i co z niej wynika?

  • Nie musisz się martwić o synchronizację poczty, jeśli używasz wielu urządzeń (komórka, laptop, komputer w pracy, w domu), a także poprzez WWW jak i inne klienty pocztowe (np. Outlook, Thunderbird).
  • Jeśli ktoś lubi używać zwykłych klientów pocztowych to nie musi używać połączenia POP3 i pozostawiać emaile na serwerze, bo kiedyś może będzie także chciał sprawdzić pocztę poprzez WWW.
  • Poprzez IMAP nie trzeba ściągać wszystkich wiadomości z serwera.
  • Google apps for your domain staje się bardzo kuszącym, tanim rozwiązaniem dla firm.
  • Dużo pracowników Google posiada iPhone'y i nie chcą ciągle używać interfejsu webowego ;).

Code-review, czyli przegląd kodu

napisane przez wiktor, 17:53 10-22-2007

Dzisiaj na seminarium magisterskim na MIMUWie przedstawiłem temat mojej pracy magisterskiej. Oto jej tytuł:

  • po polsku: "System wspomagający przegląd kodu w rozproszonych zespołach programistycznych",
  • po angielsku: "Code review system for distributed developer teams".

Poniżej możesz przeczytać opis pracy magisterskiej oraz obejrzeć slajdy z prezentacji:

czytaj dalej »

Sprytne testowanie modelu w Ruby on Rails

napisane przez wiktor, 20:09 10-10-2007

Załóżmy, że mamy jakiś model w Ruby on Rails, np. User, który składa się z takich pól jak name, middlename, surname, sex oraz birthday. Oczywiście trzeba także dopisać jakaś walidację tego modelu. Wówczas nasz model będzie wyglądać następująco:

RUBY:
  1. class User < ActiveRecord::Base
  2.  
  3.     validates_presence_of :name, :middlename, :surname, :sex, :birthday  
  4.  
  5. end

Zakładam, że jestem uczciwy względem siebie i chce przetestować, czy walidacje działają poprawnie. Zaczynam więc pisać test:

RUBY:
  1. class UserTest <Test::Unit::TestCase
  2.   fixtures :users
  3.  
  4.   def test_validation_name
  5.       u = users('user1')
  6.  
  7.       u.name = ''
  8.       assert !u.valid?
  9.       assert u.errors.invalid?("name")
  10.  
  11.       u.name = nil
  12.       assert !u.valid?
  13.       assert u.errors.invalid?("name")
  14.  
  15.   end
  16.  
  17.   # ...i tak dalej... nudny w sumie kod....
  18. end

Ale przecież możemy skorzystać z dynamicznej natury Ruby'iego i wstrzyknąć wygenerowane wcześniej metody. Poniżej widać, jak to zrobić:
czytaj dalej »

Po co nam Java? Czyli o tym, co znaczy słowo enterprise, o JVM i o muCommanderze

napisane przez wiktor, 0:16 10-05-2007

"Po co nam ta Java?", "Ale po co ją stosować, jak w Ruby on Rails mogę to samo zrobić szybciej (czytaj: być bardziej wydajnym)?" - takie pytania koledzy stawiają mi coraz częściej. Odpowiadanie na nie nie jest zadaniem prostym. Przekonanie osoby negatywnie nastawionej, że Java może spokojnie, nie wadząc nikomu żyć w informatycznym ekosystemie - baaaa - nawet uzupełniać go, graniczy z cudem.

Oczywiście nie jestem w stanie dać pełnej odpowiedzi na pytanie "Po co nam Java?". Nawet do tego nie pretenduję. Poruszę tylko trzy zagadnienia, które będą świadczyć, że jednak po coś nam ta Java jest potrzebna:

  • zastosowania typu enterprise,
  • przenośność platformy Javy (ang. cross-platform), o której się często zapomina (na przykładzie muCommandera),
  • maszyna wirtualna Javy, czyli JVM.

czytaj dalej »

« Poprzedni - Następny »


Wiktor Gworek Nazywam się Wiktor Gworek i jestem gospodarzem tego bloga.
Przeczytaj więcej o mnie »