niedziela, 28 września 2008

NetBeans day i pierwsze powakacyjne spotkanie Poznań JUG

Może najpierw zacznę od NetBeans World Tour z okazji których odbędą się spotkania w Poznaniu (25 października) oraz Gdańsku (26 października). Serdecznie zapraszam do rejestracji gdyż przedstawionych będzie wiele nowości w NetBeans 6.5 oraz pojawią się takie osobistości jak: Adam Bien, Toni Epple, Jacek Laskowski, Geertjan Wielenga. Więcej szczegółów oraz rejestracja na polskiej stronie NetBeansWordTour - www.netbeansday.pl.

A już za kilka dni, bo 1 października odbędzie się pierwsze powakacyjne spotkanie Poznańskiej Grupy Użytkowników Javy !:) Tematem będzie Visual VM, JMX i jeszcze kilka rzeczy, a przedstawi to wszystko Adam Dudczak. Spotkanie rozpocznie się o godzinie 18:00 w budynku przy ulicy Zwierzynieckiej 20 - sala nr 4. Więcej szczegółów w newsie na stronie Poznańskiego JUGa

Na oba spotkania serdecznie zapraszam !

środa, 24 września 2008

"Break" time

Trzeba pozaliczać kilka rzeczy podczas kampanii wrześniowej na uczelni, więc nie mam za bardzo czasu żeby coś napisać (chociaż kilka artów czeka w poczekalni już :P).

Na pocieszenie trochę humoru ;-)


sobota, 13 września 2008

Co nowego w Java 7 ?

Szperałem sobie ostatnio po internecie w poszukiwaniu informacji o Javie i jej rozwoju natrafiłem na blog Alexa Millera w którym opisał proponowane nowości w Java 7.
Postaram kilka z nich tutaj przybliżyć ale proszę pamiętać, że wszystko jest nieoficjalne i to tylko propozycje !

Wnioskowanie typu
Kompilator będzie wnioskować typ podczas tworzenia obiektów generycznych. Zapis:
Map<String, List<String>> anagrams = new HashMap<String, List<String>>();
może być zastąpiony przez:
Map<String, List<String>> anagrams = new HashMap<>();
Ta zmiana zdecydowanie potrzebna. Wyeliminuje te tasiemce w kodzie:)

String w konstrukcji switch
Tutaj chyba nie trzeba za wiele tłumaczyć. Wprowadzona zostanie możliwość użycia napisu przy wyborze odpowiedniego case'a. Np:
String str = "test";
switch(str) {
case "test":
System.out.println("TEST!");
break;
case "test2":
System.out.println("TEST2");
break;

default:
System.out.println("KLOPS!");
break;
}

Przeciążenie operatora dla BigDecimal
Tutaj trochę dyskusji na blogach jest. Czy w ogóle to wprowadzać, czy wprowadzić tylko dla BigDecimal, czy wprowadzić ogólnie przeciążenie operatora.
Wg mnie wprowadzenie przeciążenia operatora narobi sporo zamieszania. Java jest już bardzo rozwiniętym językiem i wprowadzenie takiego mechanizmu może więcej zaszkodzić niż pomóc. Chyba, że nie dotykać biblioteki standardowej, umożliwić dziedziczenie po wszystkich klasach z niej i niech programiści sami sobie radzą. Co oczywiście, też jest beznadziejnym podejściem do sprawy...
nie wypowiadam się;]

Właściwości dla obiektów JavaBeans
Jak w C# lub VisalBasicu, bezpośredni dostęp do właściwości beanów a nie przez gety lub sety:
public property String name;

Blok automatycznego zarządzania zasobami
To jest dobre! I bardzo proszę o wprowadzenie;] Jest propozycja by wprowadzić blok kodu po wykonaniu którego zasoby w nim użyte będą natychmiastowo usuwane. Coś żeby obejść problem bloku finally (tzn. momentu jego wykonania) a zarazem wprowadzenie możliwości usuwania kilku zasobów razem.
do (BufferedInputStream bis = ...; BufferedOutputStream bos = ...) {  
// ...
} // tutaj zmienne bis i bos zostaną usunięte z pamięci

Wywołania łancuchowe
To jest dość ciekawe. Metody zwracające void będą w niektórych przypadkach zwracać this przez co będą możliwe takie wywołania:
class Micky {
public void scream() { // ... }
public void waveHand() { // ... }
public void talk(String text) { // ... }
}

Micky micky = new Micky();
micky.scream().waveHand().talk("Hello, world!");
Ale szczerze to nie sądze aby to wprowadzono ;-)

Ulepszony blok catch
Nareszcie! Oby to wprowadzono ! Pewnie wielu z Was denerwowały tasiemce bloków catch w stylu:
try {
mbs.registerMBean(mbean, name);
} catch (InstanceAlreadyExistsException e) {
System.err.println(e);
} catch (MBeanRegistrationException e) {
System.err.println(e);
} catch (NotCompliantMBeanException e) {
System.err.println(e);
}
Teraz to będzie mogło być zastąpione taką konstrukcją:
try {
mbs.registerMBean(mbean, name);
} catch (InstanceAlreadyExistsException | 
MBeanRegistrationException |
NotCompliantMBeanException e) {
System.err.println(e);
}
Po prostu rozdzielamy typy wyjątków operatorem | i obsługujemy wszystkie w jednakowy sposób.

Domknięcia
To chyba największy bonus językowy. Jak widać coraz więcej jezyków zaczyna obsługiwać takie konstrukcje. Jeśli chodzi o jakieś szczegółowe informacje to niestety nic nie zostało jeszcze postanowione. Społeczność Javy ciągle spiera się w jakiej postaci mają zostać one wprowadzone. Zaciekawionych tematem zachęcam do przeczytania tego artykułu

To by był taki zarys nowości w jakie mogą się pojawić w Java 7. Osoby bardziej zainteresowane tematem zachęcam do poczytania artykułów do których linki pojawiły się w poście ;-)
Rozwojowe wersje JDK 7 można pobrać ze strony https://jdk7.dev.java.net/.
Blog poświęcony Java 7: java7.tumblr.com/

UPDATE
Napisałem kolejną część przygód Javy 7 z nowymi informacjami co udało się przepchnąć do standardu -> Co nowego w Java 7 ? Część druga.

UPDATE 2
I kolejna część: Co nowego w Java 7 ? Część trzecia - będą domknięcia !

UPDATE 3
I ostatnia: (Prawdopodobnie ostatnie) Podsumowanie nowości w Java 7

czwartek, 11 września 2008

wtorek, 9 września 2008

Filtrowanie i sotrowanie danych w RMS

Jakiś czas temu pisałem o RMS w J2ME wspominałem tam, że przeglądając zbiór obiektem typu RecordEnumeration możemy filtrować dane oraz je sortować. Dzisiaj trochę więcej o tym napiszę.
Najpierw przypomnijmy sobie jak pozyskać obiekt RecordEnumerate. Dokonujemy tego poprzez wykonanie metody enumerateRecords na obiekcie reprezentującym zbiór rekordów. Metoda ta posiada 3 parametry (kolejno):
- RecordFilter - filtr
- RecordComparator - obiekt do sortowania rekordów
- boolean - parametr czy uwzględniać zmiany w zbiorze (omawiałem wcześniej).

No to zaczniemy od filtrowania...
RecordFilter - pod tą nazwą kryję się interfejs postaci:
public interface RecordFilter {
boolean matches(byte[] candidate);
}

Klasy implementujące ten interfejs muszą posiadać tylko jedną metodę matches testującą czy dany element może należeć do zbioru wynikowego. Metoda zwraca true gdy element spełnia podane warunki lub false w przeciwnym wypadku. Na tej podstawie stwierdzane jest czy dodać go do zbioru wynikowego czy nie.
Dla przykładu napiszmy klase, która będzie przepuszczać tylko liczby większe od zera:
import javax.microedition.rms.RecordFilter;

/**
*
* @author -WooKasZ-
*/
public class PositiveFilter implements RecordFilter {
public boolean matches(byte[] candidate) {
// zakładamy, że rekordy są 4 bajtowe i zawierają liczbę typu int
return Integer.parseInt(new String(candidate)) > 0; // bleee można to ładniej zrobić ?
}
}


Sortowanie.
RecordComparator to także interfejs o następującej definicji:
public interface RecordComparator {
int compare(byte[] rec1, byte[] rec2);
}

Metoda compare porównuje dwa elementy i stwierdza czy rec1 jest większy, mniejszy lub równy. Oczywiście metoda porównywania musi zostać zaimplementowana przez programistę. Dozwolone są następujące wartości zwracane:
- RecordComparator.EQUIVALENT - wartości równe
- RecordComparator.FOLLOWS - pierwszy parametr jest większy od drugiego
- RecordComparator.PRECEDES -pierwszy parametr jest mniejszy od drugiego

Przykład (sortowanie liczb):
import javax.microedition.rms.RecordComparator;

/**
*
* @author -WooKasZ-
*/
public class SortComparator implements RecordComparator {
public int compare(byte[] rec1, byte[] rec2) {
int first = Integer.parseInt(new String(rec1));
int second = Integer.parseInt(new String(rec2));

if (first == second)
return RecordComparator.EQUIVALENT;

if (first > second)
return RecordComparator.FOLLOWS;

return RecordComparator.PRECEDES;
}
}


To wszystko! Możemy za pomocą tych dwu typów klas wybierać tylko dane które nam są potrzebne i układać je w odpowiedniej kolejności.

niedziela, 7 września 2008

kombinacja UNION i ORDER BY w Firebird

Dziś miałem problem z kombinacją UNION i ORDER BY w bazie danych Firebird.
Zupełnie nie rozumiałem dlaczego występuje błąd i zapytanie postaci (tylko przykład):
SELECT
TABELA1.KOLUMNA
FROM
TABELA1
WHERE
TABELA1.INNA_KOLUMNA > 10
UNION
SELECT
TABELA1.KOLUMNA
FROM
TABELA1
WHERE
TABELA1.INNA_KOLUMNA < 50
ORDER BY TABELA1.KOLUMNA

zwraca mi błąd:
Invalid command invalid ORDER BY clause

Poszperałem po google i okazało się, że w kombinacji UNION z ORDER BY nie można używać nazw kolumn bezpośrednio tylko trzeba podać numer wg której z kolei kolumny wynikowej ma być posortowana tabela.
Czyli poprawne zapytanie ma postać:
SELECT
TABELA1.KOLUMNA
FROM
TABELA1
WHERE
TABELA1.INNA_KOLUMNA > 10
UNION
SELECT
TABELA1.KOLUMNA
FROM
TABELA1
WHERE
TABELA1.INNA_KOLUMNA < 50
ORDER BY 1

Nie wiem dlaczego tak jest, nie wnikałem. Ale warto wiedzieć, gdyż czasem UNION się przydaje ;)