Pokazywanie postów oznaczonych etykietą Eclipse Ganymede. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą Eclipse Ganymede. Pokaż wszystkie posty

niedziela, 31 sierpnia 2008

koszulka Eclipse, bug naprawiony

Stało się...
Eclipse 3.4.0 ujrzał światło dzienne, a Ganymede Around the World Contest dobiegł końca. Wziąłem udział w tym konkursie, co na szczęście nie umknęło uwadze organizatorów, o czym przekonałem się odbierając przesyłkę:


Niby emka, ale jakaś duża. Przynajmniej nie zrobiona w Chinach a w Kanadzie.

Jakby tego było mało, zgłoszony przeze mnie błąd został już naprawiony. Dołączony zostanie prawdopodobnie do wersji 3.4.1 środowiska.
Poprawiony błąd i koszulka. Chyba warto brać udział w konkursach spod stajni Eclipse.

środa, 25 czerwca 2008

Ganymede, bugi i tag <pre />

No to doczekaliśmy się finalnego wydania najnowszego Eclipsa 3.4.0 Ganymede.


Co ma nowego nie do końca wiem, ale ma jakieś cieplejsze logo i nie zamula po starcie. W wersji 3.3.x świeżo po starcie IDE i kliknięciu w jakiekolwiek menu miałem 10 sekundową przerwę. Teraz mogę od razu zabierać się do pracy.

Zabieram się zatem do pracy, w której nigdy nie byłem znawcą HTMLa. Jeżeli w ogóle mogłem uchodzić za jakiegokolwiek znawcę, to chyba tylko tenisa stołowego i piłkarzyków również stołowych, czym się zresztą w pracy nie zajmuję. Niemniej coś tam o HTMLu wiedziałem i wraz z upływem czasu nabierałem przeświadczenia, że HTML mnie już niczym nie zaskoczy...
Tym większe było moje zdziwienie, kiedy to zabrałem się do pisania bloga i wklejania doń kawałków kodu java, xml czy jakiegokolwiek innego. Kod ulegał po prostu spłaszczeniu, mniej więcej tak:


public static void main(String[] args){
System.out.println("ole");
}


Tak nie może być... Krótkie spojrzenie na blogi z listy Top Trendy nie pozostawiło wątpliwości. Można sobie z tym poradzić. Uruchomienie FireBuga poskutkowało odkryciem nieznanego mi znacznika HTML <pre />.

Rzut okiem na dokumentację HTMLa nie pozostawia wątpliwości. To jest to, czego szukałem:
The pre element defines preformatted text. The text enclosed in the pre element usually preserves spaces and line breaks. The text renders in a fixed-pitch font.
Umieszczam powyższy fragment wewnątrz znaczcnika <pre />

public static void main(String[] args){
System.out.println("ole");
}


Od razu lepiej.

Ale, żeby nie było za dobrze... Nowy Eclipse to nowe bugi. Dziś odkryłem znikające zamknięte projekty ze zbiorów roboczych (workking set). Brzmi trochę jak niezidentyfikowany obiekt latający... ale do rzeczy.

Jeżeli w zbierze roboczym mam projekty zamknięte i otwarte (a zazwyczaj tak jest)


przystąpię do edycji zawartości zbioru (Edit Active Working Set... z menu widoku Package Explorer...) i dodam nowe zamknięte projekty


to po kliknięciu przycisku Finish) stare zamknięte projekty znikają ze zbioru.


Projekt aima-java zniknął. Zostały tylko te świeżo dodane. Nieładnie...

niedziela, 15 czerwca 2008

dekompilacja kodu Java w locie i w Eclipsie

Dzisiaj kontynuuję moje przygody z najnowszym Eclipse Ganymede. Zainstaluję do niego wtyczkę (w końcu to Eclipse) która mam nadzieję rozwiąże przynajmniej część moich problemów z brakującymi źródłami zewnętrznych bibliotek. O ile źródła wielu z nich, jak np. Spring są łatwe do znalezienia, o tyle żeby znaleźć źródła JavaMail musiałem się kiedyś nieźle na pocić. Czasami nie mam na to czasu ani ochoty, a jakieś źródła fajnie zobaczyć.
Stąd mój zwrot w kierunku dekompilacji kodu i programu Jad - the fast JAva Decompiler do którego istnieje wtyczka JadClipse przeznaczona dla środowiska Eclipse. Kod po dekompilacji zawsze będzie gorszy niż pierwotny kod źródłowy. Nie będzie komentarzy ani adnotacji ale lepszy rydz niż nic.
Zatem do dzieła.
Pobieram Jad 1.5.8e for Linux on Intel platform
rozpakowuję do katalogu /opt/jad i nadaję prawa do wykonania pliku jad
mateusz@mateusz-laptop:~$ chmod +x /opt/jad/jad

krótki sprawdzian, czy działa:

mateusz@mateusz-laptop:~$ /opt/jad/jad
/opt/jad/jad: error while loading shared libraries: libstdc++-libc6.2-2.so.3: cannot open shared object file: No such file or directory

i tu klops, nie działa... Niespełnione zależności, czyli coś co w Linuksie lubię najbardziej.
Wkładam gogle, martwa cisza. W Ubuntu 8.04 nikt się nie chwali, że to rozwiązał. Ja się pochwalę. Pobieram i instaluję paczkę libstdc++2.10-glibc2.2 dla Ubuntu 7.10. O dziwo zainstalowała się bez przeszkód. Sprawdzam czy działa Jad:
mateusz@mateusz-laptop:~$ /opt/jad/jad
Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov (kpdus@yahoo.com).
Usage: jad [option(s)] <filename(s)>
Options: -a - generate JVM instructions as comments (annotate)
-af - output fully qualified names when annotating
-b - generate redundant braces (braces)
-clear - clear all prefixes, including the default ones
-d <dir> - directory for output files
-dead - try to decompile dead parts of code (if there are any)
-dis - disassembler only (disassembler)
-f - generate fully qualified names (fullnames)
-ff - output fields before methods (fieldsfirst)
-i - print default initializers for fields (definits)
-l<num> - split strings into pieces of max <num> chars (splitstr)
-lnc - output original line numbers as comments (lnc)
-lradix<num>- display long integers using the specified radix
-nl - split strings on newline characters (splitstr)
-noconv - don't convert Java identifiers into valid ones (noconv)
-nocast - don't generate auxiliary casts
-noclass - don't convert .class operators
-nocode - don't generate the source code for methods
-noctor - suppress the empty constructors
-nodos - turn off check for class files written in DOS mode
-nofd - don't disambiguate fields with the same names (nofldis)
-noinner - turn off the support of inner classes
-nolvt - ignore Local Variable Table entries (nolvt)
-nonlb - don't insert a newline before opening brace (nonlb)
-o - overwrite output files without confirmation
-p - send all output to STDOUT (for piping)
-pa <pfx>- prefix for all packages in generated source files
-pc <pfx>- prefix for classes with numerical names (default: _cls)
-pe <pfx>- prefix for unused exception names (default: _ex)
-pf <pfx>- prefix for fields with numerical names (default: _fld)
-pi<num> - pack imports into one line using .* (packimports)
-pl <pfx>- prefix for locals with numerical names (default: _lcl)
-pm <pfx>- prefix for methods with numerical names (default: _mth)
-pp <pfx>- prefix for method parms with numerical names (default:_prm)
-pv<num> - pack fields with the same types into one line (packfields)
-r - restore package directory structure
-radix<num>- display integers using the specified radix (8, 10, or 16)
-s <ext> - output file extension (default: .jad)
-safe - generate additional casts to disambiguate methods/fields
-space - output space between keyword (if, while, etc) and expression
-stat - show the total number of processed classes/methods/fields
-t<num> - use <num> spaces for indentation (default: 4)
-t - use tabs instead of spaces for indentation
-v - show method names while decompiling

Teraz lepiej.
Otwieram Eclipse a w nim ostatnio stworzony projekt aquarium.
Przechodzę do klasy InfoController. Klikam myszką na nazwę interfejsu Controller i naciskam klawisz F3



Source not found czyli źródła niepodpięte.
Czas zainstalować wtyczkę JadClipse. Pobieram jadclipse3.3 i kopiuję do katalogu plugins Eclipse Ganymede. Restart IDE.
W menu Window/Preferences... pojawiła się pozycja Java/JadClipse czyli wtyczka wydaje się, że działa. Wskazuję położenie pliku wykonywalnego jad na /opt/jad/jad


Ponownie naciskam F3 kiedy mam zaznaczoną nazwę interfejsu InfoController.


Widzę kod, czyli działa. Przechodzę dalej do klasy ModelAndView


No, pełen sukces.

poniedziałek, 9 czerwca 2008

Eclipse Ganymede i kompilowanie javy do kodu natywnego

Czołem!

Zapewne zauważyłeś na kilku blogach wysyp wpisów o nowej wersji środowiska Eclipse Ganymede. Dzieje się tak dla tego, że jesteśmy łasi na koszulki, które Eclipse obiecuje w konkursie Ganymede Around the World Contest. Nie inaczej jest ze mną. Zobaczymy, co z tego wyjdzie.

Tak więc dziś postanowiłem się zmierzyć z tematem, który czasami pojawia się na łamach grupy dyskusyjnej pl.comp.lang.java i który zawsze uważałem za ślepą uliczkę rozwoju tego języka. Chodzi o kompilację kodu źródłowego Javy do kodu natywnego systemu operacyjnego.

Plusy tego rozwiązania:
- nie potrzeba JRE
- wyższa wydajność

Minusy takiego rozwiązania:
- brak przenośności
- niższa wydajność

O ile brak konieczności instalacji JRE jak i tracona przenośność są raczej bezsprzeczne o tyle do rozstrzygnięcia pozostaje kwestia wydajności, którą się dzisiaj zajmę.

Kod źródłowy będę pisał oczywiście przy pomocy najnowszego Eclipse Ganymede. Uruchamiał i kompilował będę javą 1.6. Kompilację do kodu natywnego przeprowadzę z wykorzystaniem gcj 4.2.3.

Najpierw zainstaluję gcj. Mam Ubuntu, więc wystarczy:
mateusz@mateusz-laptop:~$ sudo apt-get install gcj

sprawdzenie co mam zainstalowane:

mateusz@mateusz-laptop:~$ java -version
java version "1.6.0_06"
Java(TM) SE Runtime Environment (build 1.6.0_06-b02)
Java HotSpot(TM) Server VM (build 10.0-b22, mixed mode)
mateusz@mateusz-laptop:~$ gcj --version
gcj (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu6)
Copyright (C) 2007 Free Software Foundation, Inc.
To jest wolne/otwarte oprogramowanie; zobacz kod źródłowy aby zapoznać sie
z warunkami kopiowania. Nie ma ŻADNEJ gwarancji; nawet na MOŻLIWOŚĆ SPRZEDAŻY
ani na ODPOWIEDNIŚĆ DO KONKRETNEGO CELU.

Pobieram też Eclipse Ganymede.
Przed uruchomieniem tworzę skrót w pasku szybkiego uruchamiania i tu niespodzianka... W archiwum eclipse-jee-ganymede-RC2-linux-gtk.tar.gz Nie ma ikonki Eclipse, albo ja nie umiem jej znaleźć. Posłużę się ikonką eclipse.xpm z wersji 3.3 tego środowiska.

Odpalam Eclipse:



Niespodzianka numer 2:



Eclipse chce wysyłać informacje o moich wtyczkach. Przez chwile czuję się jak na Windowsie, po czym zaznaczam opcję, żeby nic nie wysyłał.
Tworzę projekt native i klasę pl.matt.gcj.TestClass


package pl.matt.gcj;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
* @author mateusz
*
*/
public class TestClass {

/**
* @param args
*/
public static void main(String[] args) {
long start = System.currentTimeMillis();
List list = new ArrayList();
for (byte i = 0; i < 300; i++) {
list.add(list.size());
if (list.size() > 10000000) {
break;
}
}

Collections.shuffle(list);
double avg = 0;

for (Integer integer : list) {
avg += (double)integer/list.size();
}

long stop = System.currentTimeMillis();
System.out.println(stop-start + " ms.");
}

}

Do listy wstawiam 10000001 elementów. Listę mieszam i liczę średnią. Używam automatycznej konwersji int do Integer (autoboxng). GCJ podobno radzi sobie z kodem źródłowym zgodnym z Javą 1.5. Zobaczymy.
Kompiluję kod za pomocą gcj:

mateusz@mateusz-laptop:~/priv/workspace/native/src$ gcj -o /tmp/gcj/a.out pl/matt/gcj/TestClass.java
/usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status

rzut okiem na FAQ GCJ i już wiem, że trzeba podać położenie metody main()

mateusz@mateusz-laptop:~/priv/workspace/native/src$ gcj --main=pl.matt.gcj.TestClass
-o /tmp/gcj/a.out pl/matt/gcj/TestClass.java

poszło... Został utworzony plik /tmp/gcj/a.out
Czas na testy. Ponieważ czas wykonywania programu w Javie nie uwzględnia czasu uruchomienia samej wirtualnej maszyny Java, tworzę 2 proste skrypty w BASHu:
a.sh który 5 razy uruchomi plik zawierający kod natywny a.out

mateusz@mateusz-laptop:/tmp/gcj$ cat a.sh
#!/bin/bash
START=$(date +%s)
./a.out
./a.out
./a.out
./a.out
./a.out
STOP=$(date +%s)
let T=$STOP-$START
echo $T " sekund"

oraz j.sh, który uruchomi TestClass za pomocą VM Java.

mateusz@mateusz-laptop:/tmp/gcj$ cat j.sh
#!/bin/bash
START=$(date +%s)
java pl.matt.gcj.TestClass
java pl.matt.gcj.TestClass
java pl.matt.gcj.TestClass
java pl.matt.gcj.TestClass
java pl.matt.gcj.TestClass
STOP=$(date +%s)
let T=$STOP-$START
echo $T " sekund"

Testy nie pozostawiają wątpliwości:

mateusz@mateusz-laptop:/tmp/gcj$ ./a.sh
8630 ms.
8299 ms.
8290 ms.
8380 ms.
8321 ms.
43 sekund
mateusz@mateusz-laptop:/tmp/gcj$ ./j.sh
5671 ms.
5824 ms.
5913 ms.
5906 ms.
5823 ms.
29 sekund

Co ciekawe czas uruchomienia wirtualnej maszyny Java jest praktycznie pomijalny.
Reasumując:

Plusy kompilowania aplikacji Java do kodu natywnego
- nie potrzeba JRE

Minusy takiego rozwiązania:
- brak przenośności
- niższa wydajność

A może ty stosujesz na co dzień kompilację programów napisanych w języku Java do kodu natywnego? Jeżeli tak, napisz dlaczego i jakie są tego zalety, których nie widzę.