czwartek, 15 października 2009

Prosty Web Service + prosty klient mobilny J2ME z użyciem NetBeans i GlassFish V2

Szkoła się zaczęła a razem z nią zajęcia dotyczące Web Serviców. Pierwsze laboratoria to baaardzo prosty wstęp na którym trzeba było napisać web service i do niego klienta. Jako, że trochę w tym porobiłem już to przygotowałem prezentację jak to wykonać tworząc dodatkowo klienta na urządzanie mobilne z Java ME z użyciem NetBeans oraz GlassFish.

Prezentację postanowiłem się podzielić ze wszystkimi, zapraszam ! ;)


Oczywiście jest to super prosta aplikacja ale mam nadzieje, że komuś się przyda przy rozpoczynaniu przygody z technologiami Javowymi ;-)

poniedziałek, 5 października 2009

Co nowego w Java 7 ? Część druga

Dawno dawno temu pisałem już co nowego było planowane w nowej Javie (artykuł: Co nowego w Java 7 ?). Dzisiaj zapraszam do obejrzenia wywiadu z Dannym Cowardem - głównym architektem dla aplikacji klienckich w firmie Sun. Przedstawia on pokrótce co przeszło ciężkie głosowania i dyskusje i pojawi się w nowej Javie.

Czas trwania: 24:31

Podsumowując:
Nowe słowo kluczowe module
Służyć będzie do tworzenia modułów. Docelowo ma zastąpić wykorzystywanie classpath.
Przykład:
module wazny_modul;
package com.blogspot.wookasz.java7;

class WaznaKlasa {
//...
}
Definicja modułu w pliku java:
modules wazny_modul @1.5 {
requires inny_wazny_modul @2.0;
requires jeszcze_inny_wazny_modul @1.0;
}


Switch po Stringu
To przetrwało. Przykład z poprzedniego artykułu:
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;
}


Wyłapywaniewielu typów wyjątków w jednym bloku catch.
To też przetrwało (na szczęście !)
try {
mbs.registerMBean(mbean, name);
} catch (InstanceAlreadyExistsException |
MBeanRegistrationException |
NotCompliantMBeanException e) {
logger.log(e);
throw e;
}


Wnioskowanie typu
Też przeszło:)
Map<String, List<String>> anagrams = new HashMap<String, List<String>>();

Będzie można zastąpić przez:
Map<String, List<String>> anagrams = new HashMap<>();

Elvis operator (lub Null-Safe Operator) ?:
O tym szczerze mówiąc wcześniej nie słyszałem. Często w kodzie sprawdzamy czy jakiś obiekt nie jest nullem i w zależności od tego wykonujemy inne operacje. Teraz takiego ifa będzie można zastąpić jedną instrukcją:
String s = object?.toString() ?: "nothing";
int i = intObject ?: -1;
Nie jestem tylko przekonany czy ten pierwszy zapis jest w pełni zrozumiały jak się na niego spojrzy...

NIO #2 API
I/O w nowej odsłonie!:) Co teraz dodatkowego ?
- przeszukiwanie katalogów (dość rozbudowane)
- nasłuchiwanie na zmiany w plikach
- asynchroniczność
I inne

Poza tym:
- nowości w Swingu (wywiad od 16minuty, pokazują demo)
- nowy odśmiecacz pamięci (może będzie działać ?:P)
- zmiany w bytecodzie pod kątem innych języków programowania
- zmiany w bibliotekach od kolekcji i współbieżności (przykłady)
- duuuużo rzeczy w ramach projektu Coin. Zapraszam do zapoznania się z ich stroną -> link. Długa lista nowości.

Dla osób do których jeszcze nie dotarła informacja - NIE będzie domknięć w nowej Javie! Nie skomentuje tego...

Plan wydania -> Marzec 2010

https://jdk7.dev.java.net/
http://openjdk.java.net/projects/jdk7/

wtorek, 18 sierpnia 2009

Trochę humoru z reklam

Humoru też dawno nie było! Dlatego wrzucam troszkę reklam, które są wg mnie "masterpiece" ^^





piątek, 7 sierpnia 2009

(Nie?)istniejąca ścieżka do bazy danych - błąd SQL1052N w DB2

Trwają moje przygotowania do certyfikatu DB2 Administrator, więc chyba troszkę zmienię tematykę bloga z programowania na bazy danych. Zwłaszcza, że ostatnio prawie nic nie piszę to może tym nadrobię :)

Podczas nauki zawiłej komendy CREATE DATABASE natrafiłem na dziwny błąd, gdy chciałem utworzyć bazę danych w podanej lokalizacji.
Komenda:
db2 => create database hellodb on f:\bazydb2\
zwróciła mi błąd treści:
SQL1052N  Ścieżka bazy danych "F:\bazydb2\" nie istnieje.

Upewniłem się 2x, że dany katalog istnieje (a nawet jeśli nie to chyba powinien zostać utworzony?). Zasięgnąłem więc do helpa:
db2 => ? SQL1052N


SQL1052N Ścieżka bazy danych "<ścieżka>" nie istnieje.

Objaśnienie:

Ścieżka podana w parametrze "<ścieżka>" bieżącej komendy jest
niepoprawna. Albo nie ma ścieżki o takiej nazwie, albo ścieżka została
określona, podczas gdy zmienna rejestrowa DB2_CREATE_DB_ON_PATHS jest
wyłączona (tylko w systemie Windows).

...

I odpowiedz znaleziona. Bardzo dziwne, że nie można pod windowsem tworzyć bazy danych w dowolnym katalogu domyślnie. W dalszej części wyjaśnienia kodu błędu dotyczącym możliwych akcji znajdowało się wyjaśnienie:
*  W systemie Windows, jeśli wszystkie aplikacje, które będą się łączyły
z bazą danych, są zbudowane przy użyciu interfejsu API co najmniej w
wersji 9, wtedy można włączyć zmienną środowiskową
DB2_CREATE_DB_ON_PATHS, aby obsługiwała tę ścieżkę jako ścieżkę bazy
danych.


Ok, ale żeby możliwe było utworzenie bazy w podanej lokali należy wykonać komendę:
db2set DB2_CREATE_DB_ON_PATH=YES
A następnie po tym konieczny restart usługi zarządzającej bazami danych:
db2stop
2009-08-07 14:47:50 0 0 SQL1064N Działanie menedżera baz danych zakończyło się poprawnie.
SQL1064N Działanie menedżera baz danych zakończyło się poprawnie.

db2start
2009-08-07 14:47:56 0 0 SQL1063N Komenda DB2START została wykonana poprawnie.
SQL1063N Komenda DB2START została wykonana poprawnie.


I sprawdzamy czy można już utworzyć:
db2 => create database hellodb on f:\bazydb2
DB20000I Wykonanie komendy CREATE DATABASE zakończyło się pomyślnie.

:)

Przy okazji znalazłem błąd w pomocy DB2. W informacji o błędzie podana jest zmienna DB2_CREATE_DB_ON_PATHS, natomiast faktycznie istnieje DB2_CREATE_DB_ON_PATH. Poszukam gdzie to można zgłosić.

środa, 15 lipca 2009

NetBeans 6.7 - fail dla php ?

Od paru dni korzystam z nowego NetBeansa w moim projekcie PHP i muszę szczerze przyznać, że jestem zawiedziony i to bardzo.
Po pierwsze wydajność - hmm sorry ale jakieś wielkiej różnicy w wydajności nie dostrzegłem. Features on Demand? No pomysł szczytny ale jakoś nadal nie widzę wzrostu wydajności - co więcej, gdy np. tworze nowy projekt Java ME/C++/cokolwiek i uruchamia się komponent za obsługę danej platformy odpowiedzialny trwa to spooooro czasu. Co ciekawe dysk jakoś w tym czasie nie pracuje dopiero na jakieś 2-3 sek przed samą aktywacją coś pomuli.
Wracając do PHP co mnie zdenerwowało:
- szybkość podpowiadania składni zwolniła bardzo mocno, mój kolega z zespołu po godzinie ją wyłączył, bo do niczego się nie nadawało - mam podobne wrażenia
- podpowiadanie składni potrafiło nawet nawalać w prostych przypadkach np. brak jakichkolwiek podpowiedzi o pola/metody klasy lub dziedziczonych
- ctrl+lewy klik przestał działać dla przypadków dla których działał w wersji 6.5
I teraz to co mnie zniszczyło... po uruchomieniu projektu korzystającego z SVN i próbie updatea netbeans poinformował mnie, że nie mam klienta. Poprosiłem go (bo była taka opcja) aby sam go ściągnął i zainstalował - dostałem komunikat, że jednak go MAM! No to super ponowna próba updatea i to samo! No to postanowiłem sam ściągnąć klienta i go zainstalować. Po podpięciu go pod NetBeans ten stwierdził, że jednak mam jego za starą wersję i nie będzie z nią działać . Ok, nagrałem najnowszą dostępna (1.6.cośtam). Znowu podpinanie i.... ! Teraz NetBeans twierdzi, że wszystkie pliki z projekcie są nowe, nie działają żadne ignore na katalogach a jakiekolwiek operacje ponownego ich zakładania nie przynoszą żadnego rezultatu. Jest fajnie!
Postanowiłem wywalić projekt i ściągnąć całość od nowa z SVN. Tym razem już miarka się przebrała, bo gdy chciałem połączyć się z serwerem pasek postępu po sekundzie w nieznanych okolicznościach znikał i nic nie mogłem zrobić.
Tyle od sfrustrowanego Łukasza i jego walk z NetBeansem. Wróciłem do 6.5 gdzie wszystko działa poprawnie.
Być może ja coś skopałem, czegoś nie skonfigurowałem, jestem głupi itp. ale używam tego środowiska od ponad roku i myślałem, że jednak taka operacja nie przysporzy problemów.

Nie testowałem jeszcze projektów Javowych w nowej wersji, ale w niedługim czasie to mam nadzieję nadrobię i liczę, że będzie ok.

A jakie Wy macie doświadczenia z nowym NB 6.7 ??

_
Dodam jeszcze, że pracuję na:
PC - Athlon X2 3800, 3GB RAMu, dysk 650GB SATA, win xp
oraz
Laptop - Core 2 Duo P8400, 4GB RAMu, Dysk 160GB SATA, vista
na obu te same doświadczenia.

sobota, 16 maja 2009

Proste skalowanie aplikacji z Terracotta na Poznań Java User Group - 26.05.09r.

Zapraszam wszystkich na spotkanie Poznańskiej Grupy Użytkowników Javy poświęconemu oprogramowaniu wspomagającym skalowanie aplikacji w poziomie (ang. scaling out) o nazwie Terracotta. Prelegentem będzie Krzysztof Kliś programista w firmie BS Partner.

Oto krótkie streszczenie tego co będzie można usłyszeć na miejscu:
Terracotta jest oprogramowaniem open source, które pozwala na proste skalowanie w poziomie aplikacji działających na platformie Java, bez konieczności wykorzystywania dodatkowego kodu lub zewnętrznych baz danych. Efekt taki udało się uzyskać dzięki umieszczeniu całego mechanizmu klastrowania pomiędzy maszyną wirtualną Javy a warstwą aplikacji, dzięki czemu jest ona w praktyce całkowicie przezroczysta dla programisty. W trakcie prezentacji omówiona zostanie architektura Terracotty, przedstawione przykłady jej zastosowań (wraz z utworzeniem prostego projektu w Eclipse), a także współpraca z innymi technologiami opartymi na Javie (na przykładzie JRuby). Poruszone zagadnienia obejmą ponadto doświadczenia autora w pracy z Terracottą w kontekście wydajności, zagadnienia związane z licencją Terracotta Public License, jak również informacje na temat społeczności związanej z Terracottą.

Dodam jeszcze filmik z youtube mówiący co to jest Terracotta:


Miejsce i data spotkania:
Siedziba Cognifide - Aleje Wielkopolskie 4, Poznań
Wtorek 26.05.2009, godzina 18:00
Wymagana jest rejestracja pod adresem: www.oiola.com/e/382-spotkanie-poznan-jug-260509-terracota-krzysztof-klis/

Linki:
Web λ.0 - Functional programming for the Web - blog Krzysztofa Klisia

sobota, 9 maja 2009

Podstawowe komponenty w LWUIT #part 1/2

Skoro pierwsze spotkanie z biblioteką LightWeightUserInterfaceToolkit mamy już za sobą, chciałbym dziś przybliżyć podstawowe komponenty jakimi możemy się posługiwać aby wzbogacić UI naszej aplikacji mobilnej.

Hierarchia klas w LWUIT:


Component
To klasa bazowa dla wszystkich komponentów, tylko klasy które dziedziczą po niej mogą być wyświetlane na ekranie. W ogólności nie będziemy z niej korzystać chyba, że zaczniemy pisać własne komponenty to wtedy możemy się nią zainteresować;-)

Container
Kontener to obiekt który umożliwia przechowywanie w sobie wielu innych komponentów. W tym innych kontenerów które zawierają inne komponenty, możliwość zagnieżdżania jest praktycznie nieograniczona.
Komponenty które dodajemy do kontenera trafiają na listę wg której są później wyświetlane na ekranie, jeśli nie podamy indeksu na który ma on trafić to jest domyślnie umieszczany na ostatnim miejscu.

Form
Formularz jest klasą reprezentującą okna w programie. Składa się on z 3 części: paska tytułowego, zawartości okna oraz paska menu. Jak to wygląda przedstawia obrazek obok.
Jeśli chodzi o pasek tytułowy to wg mnie jest on trochę ograniczony ponieważ możemy na niego wrzucać tylko tekst, no ale gdyby było inaczej to może inaczej też by się nazywał ;P Zawartość okna to nasze pole gdzie wrzucamy jakiekolwiek komponenty potrzebujemy. Możemy je rozmieszczać za pomocą różnych układów (layouts) ale o nich znacznie więcej w innej części tutoriala.
Pasek menu zawiera pozycje pomocne przy sterowaniu aplikacją, jeśli jest ich więcej niż dwie to będzie nam się wyświetlać menu wyboru. Przycisku na tym pasku tworzy się poprzez dodanie do obiektu formularza obiektów typu Command.
Form udostępnia nam dwa konstruktory. Jeden jest bez bezparametrowy, a drugi posiada parametr typu String który jest tekstem na pasku tytułowym. Formularz wyświetlamy za pomocą metody Form.show();.
API tej klasy jest dość bogate i jego znajomość jest podstawą z którą trzeba się zapoznać.

Label
Label to po prostu komponent który wyświetla tekst i/lub obrazek. Należy pamiętać by używać go tylko w tym wypadku! Gdyby istniała potrzeba jakieś interaktywności to lepszym wyborem byłoby skorzystanie z klasy Button.
Dla zawartości etykiety możemy definiować wyrównania - domyślnym jest LEFT, ale poza nim jest jeszcze CENTER i RIGHT. Ponadto jeśli dodany jest zarówno tekst jak i obrazek to możemy wyrównać tekst względem obrazka mamy do dyspozycji pozycje: TOP, BOTTOM, LEFT, RIGHT. A wykonujemy to za pomocą metody: setTextPosition(Label.TOP);.
Może mały przykład:
Form form = new Form("Label in action!");
// utworzenie obrazka
Image image = Image.createImage("/picture.png");

Label label = new Label(image);
label.setText("Hello Label !!");
label.setAlignment(Label.CENTER);
label.setTextPosition(Label.BOTTOM);

// dodanie labela do formularza
form.addComponent(label);
// wyświetlenie
form.show();
Button
Przyciski wywołują dla nas jakieś akcje. Podobnie jak Label może składać się z ikony i teksty (przecież jest to klasa rozszerzająca Label^^). Do przycisku możemy podpiąć dwa rodzaje "słuchaczy" (nie lubię tej nazwy, zna ktoś może jakąś lepsza polską ?;), na aktywowanie (FocusListener) oraz akcje (ActionListener). Ponieważ drugi przypadek jest częstszy w użyciu to posłużę się nim jako przykładem. Może od razu podam przykład który wyjaśni działanie tego mechanizmu:
Button coolButton = new Button("Great button!");
coolButton.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent arg0) {
// instrukcje w tej metodzie zostaną wywołane po wciśnięciu przycisku
}
});
Można też utworzyć osobne klasy implementujące ten interfejs i podać je jako parametr. Zależy jakie kto rozwiązanie lubi i jak długa jest metoda obsługi zdarzenia.

RadioButton
To element dobrze nam znany chociażby z HTMLa. Jest to element który może posiadać dwa stany wybrany oraz nie wybrany. Stan taki może posiadać tylko jeden radio button w obrębie grupy o której za chwilę. Jeśli chodzi o zasady tworzenia oraz przypisywania obsługi zdarzeń to są one identyczne jak w przypadku przycisku.

ButtonGroup
Ta użyteczna klasa w sumie nie powinna zostać nazwana komponentem a bardziej takim zarządcą grupy komponentów. Jej funkcją jest grupowanie jakiegoś zbioru przycisków, żeby np. przypilnować, że został zaznaczony tylko jeden RadioButton.
Przykład działania:
// tworzenie przycisków
RadioButton radio1 = new RadioButton("RadioButton1");
radio1.setSelected(true); // niech jeden będzie zaznaczony domyślnie
RadioButton radio2 = new RadioButton("RadioButton2");
RadioButton radio3 = new RadioButton("RadioButton3");
RadioButton radio4 = new RadioButton("RadioButton4");

// tworzenie grupy oraz dodawanie do niej przycisków
ButtonGroup group = new ButtonGroup();
group.add(radio1);
group.add(radio2);
group.add(radio3);
group.add(radio4);

/**
* Jakieś operacje
*/

// pobranie indeksu który przycisk jest zaznaczony
int index = group.getSelectedIndex();
// pobranie zaznaczonego przycisku
RadioButton radioSelected = group.getRadioButton(index);
Gdy mamy indeks zaznaczonego przycisku to później można sobie zrobić jakiegoś switcha i wykonać odpowiednie akcje. Należy tylko pamiętać o tym by nie zmieniać kolejności ich dodawania do grupy, bo wg tego są one indeksowane.

To koniec części pierwszej o komponentach w LWUIT. W następnym wpisie z tej serii omówię CheckBox, ComboBox, TextArea oraz TabbedPane.

Zapraszam do komentowania !

_
Źródła obrazków oraz linki:
[1] https://lwuit.dev.java.net/
[2] http://lwuit.blogspot.com/