Java rendezés – avagy hogyan ne tegyük

A Java Collection könyvtára remek munka – könnyen használható, mégis sokoldalú API-t biztosít. Megfelelő listákhoz, gráfreprezentációkhoz és feltételezem, hogy még sok minden egyébhez.

Ehhez képest nem (sokkal) bonyolultabb kezelni, mint egy tömböt. Sőt, a C nyelv tömbkezeléséhez képest sokkal egyszerűbb is… 🙂

Ami nekem különösen tetszik, az a beépített rendezési lehetőségek: a Collections.sort statikus metódus használatával saját Comparator segítségével lehet rendezéseket definiálni.

A Java Collection könyvtára remek munka – könnyen használható, mégis sokoldalú API-t biztosít. Megfelelő listákhoz, gráfreprezentációkhoz és feltételezem, hogy még sok minden egyébhez.

Ehhez képest nem (sokkal) bonyolultabb kezelni, mint egy tömböt. Sőt, a C nyelv tömbkezeléséhez képest sokkal egyszerűbb is… 🙂

Ami nekem különösen tetszik, az a beépített rendezési lehetőségek: a Collections.sort statikus metódus használatával saját Comparator segítségével lehet rendezéseket definiálni.

Ezután szinte magától adódott már, hogy amikor nekem egy objektumhierarchia reprezentálására van szükségem, akkor ahhoz ezt a beépített könyvtári osztályokat használjam. Az általam használt algoritmus (most ezt nem részletezném a szükséges tömörség miatt) feltételezte, hogy a hierarchia elemeit felülről lefelé adom be (azaz mindig előbb az őst adom be, és csak utána a leszármazottakat). Miután ezt a bemenetemről nem tudtam feltételezni, ezért adódott a dolog, írjunk rá egy rendezést, saját komparátorral.

public int compare(IEntity i1, IEntity i2){
if (i1.isSubtypeOf(i2)) return -1;
else if (i2.isSubtypeOf(i1)) return 1;
else return i1.getFullyQualifiedName().compareTo(i2.getFullyQualifiedName());
}

Szép, olvasható kód, és pontosan azt írja le, amit szeretnék. Igaz? Hisz itt látszik, hogy szépen az öröklési hierarchia szerint rendezi a mezőket. Amikor ezt a kódot úgy nagyjából egy hónapja megírtam, akkor működött is – igaz, csak erőteljesen korlátozott tesztelés volt, mert ez csak egy nagyon parányi része volt a dolognak, amit csináltam, és utána pedig egy kicsit ezt a részt jegeltem.

Ehhez képest most jött a feketeleves, hogy amikor egy kicsit változott a környezet, amiben az új funkciót teszteltem, kaptam egy hatalmas nullpointer exception-t. Remek…

Némi játék után (ugyanis a futási környezet lenyelte a kivételt, és csak az üzetenet jelenítette meg, ami nullpointer exception-nél mindig “”, azaz nem látszik), kiderítettem, hogy a gondot az okozza, hogy egy objektum kapcsán próbálok hivatkozni az ősére egy saját adatszerkezetben, de ebbe az adatszerkezetbe nem került bele. Ez pedig csak úgy lehetséges, ha az eredeti rendezésnél valami miatt a leszármazott előbbre kerül, mint az őse (általában nem, de az én programomban igen).

Kíváncsi vagyok, hogy hány ember látja, hogy hol is van a probléma a fenti komparátorral, hogyan jöhet össze, hogy a beépített Java sort algoritmus is ezt a rossz eredményt adja ki…

Tökéletes magyarázatom nincs a problémára, de a hiba oka nagyjából két dolog lehet. Egyfelől a definiált komparátor csak egy részben rendezéshez ad megfelelő támpontot, másrészt a Java feltehetőleg a qsort algoritmust használja, ami nem végzi el az összehasonlítást az összes párra, így tipikusan nem hasonlít össze minden egyes elemet minden másik elemmel.

Van még egy tényező, ami a rendezési eljárást még kevésbé egyértelművé teszi, ez pedig az egymástól akár teljesen független ágak a hierarchiában. Az eredeti példáimban ezekből kevés volt, míg a példa, amin kiakadt a program, viszonylag sok, egymástól független ágat tartalmazott, ezzel jócskán megnehezítve az algoritmus munkáját.

Ötletem nem volt, hogyan kellene működővé varázsolni a rendezést egy átírt komparátorral, ezért más, korábbi tanulmányokhoz nyúltam vissza: a bsz-en/algoritmuselméleten bemutatott topologikus rendezéshez nyúltam vissza. Ugyan az jóval erősebb rendezési feltétel, mint amire nekem konkrétan szükségem volna, de ezért cserébe viszonylag kevés munkával lekódolható, és nem is túlságosan lassú (jó, ez persze relatív).

Persze ennek a kódolásakor is segítségemre volt a Java Collections API, még így is kevesebb, mint 20 sor volt a teljes rendezési eljárás, amit még zárásnak beszúrok az írás végé elé.

/**
* Creates a topological ordering on the modelelements
*/
private List orderModelElements(List elementsToOrdered){

List orderedElements = new ArrayList();
while (!elementsToOrdered.isEmpty()){
//The currentLevel is needed in order to remove all the elements that
//do not have any ancestors, not only the first one
//If we delete the elements straight from the elementsToOrdered list,
//the iterator in the for cycle will not work.
List currentLevel = new ArrayList();
for (IEntity element : elementsToOrdered){
Collection ancestors = new ArrayList();
ancestors.addAll(element.getSupertypes());
ancestors.retainAll(entities);//remove all non-entities
if (ancestors!=null && orderedElements.containsAll(ancestors)){
currentLevel.add(element);
}
}
orderedElements.addAll(currentLevel);
elementsToOrdered.removeAll(currentLevel);
}
return orderedElements;
}

És hogy miért is írtam ezt így ide meg? Ennek két oka is van: egyrészt egy nagyon önző, magamat szem előtt tartó indok: ha valaki el tudja esetleg mondani nekem, hogyan kellene a komparátort kijavítani, esetleg részletesebben elmagyarázza csak, hogy miért is hasal el az a komparátor a quick sorton (ha quick sort), nagy örömmel veszem akármilyen formában a reakcióját. Másfelől pedig okulásnak is akart menni mások számára, hogy esetleg nekik ne kelljen órákat bogarászniuk egy pár ezer soros kódbázisban, hogy pontosan hogyan is adódhat az a nullpointerexception.

Aranyköpések Oasis világában

Egy saját tervezésű világban tettünk kirándulást a nyaralásunk alatt. Ez egy különleges, repülő szigetekkel és hajókkal teli világ, ihletét nagyon-nagyon sok helyről merítve. A csapat eléggé sokoldalú karakterekből lett összeválogatva, beleértve TeoZ félelfmetes sötételfét (akit Over folyamatosan félelfnek titulált 🙂 ), Over részegesnek hitt (de a gyakorlatban egyáltalán nem olyan, hanem sokkal inkább workaholic jellegű) szélvarázslóját vagy éppen Timi messziről érkezett, a civilizált kultúrát kevéssé ismerő (és tisztelő), mocsárlakó gyerekét… És akkor még nem is beszéltünk D-nee kalandvágyó nemeséről (aki egy ismeretlen kincs megkeresése érdekében szervezett expedíciót), vagy éppen az én szélvitorlásversenyzőmet, aki fogadásból ment neki a hosszú útnak, egy konzervkereskedő társaságában, és az ő reklámarcaként (ld. még “Csak a Puffin adhat erőt és mindent lebíró akaratot…”).

JK: Ez benyomást tesz rám…

Egy saját tervezésű világban tettünk kirándulást a nyaralásunk alatt. Ez egy különleges, repülő szigetekkel és hajókkal teli világ, ihletét nagyon-nagyon sok helyről merítve. A csapat eléggé sokoldalú karakterekből lett összeválogatva, beleértve TeoZ félelfmetes sötételfét (akit Over folyamatosan félelfnek titulált 🙂 ), Over részegesnek hitt (de a gyakorlatban egyáltalán nem olyan, hanem sokkal inkább workaholic jellegű) szélvarázslóját vagy éppen Timi messziről érkezett, a civilizált kultúrát kevéssé ismerő (és tisztelő), mocsárlakó gyerekét… És akkor még nem is beszéltünk D-nee kalandvágyó nemeséről (aki egy ismeretlen kincs megkeresése érdekében szervezett expedíciót), vagy éppen az én szélvitorlásversenyzőmet, aki fogadásból ment neki a hosszú útnak, egy konzervkereskedő társaságában, és az ő reklámarcaként (ld. még “Csak a Puffin adhat erőt és mindent lebíró akaratot…”).

JK: Ez benyomást tesz rám…

Nemes felemelő beszédet tartott, csak egy Sugallat-varázs hatására közben folyamatosan vakarta a fejét. A beszéd végén a nemes brutális udvari ork testőre ledobja a csatabárdját, és elkezd tapsolni…
JK: A matrózok tapsolnak?
KM: Dobjunk rá.

Nyelvi problémák a félelf sötét elf és a kölyök között, nehezen értik egymást:
KM: Pár szót értesz… Mit is mondtál neki?
JK1(kölyök): Ne! Ne bántson!
JK2(sötét elf): Ezt biztos értem. A leggyakrabban hallott kifejezés.

JK: Ha ezt hallanám, abból brutális beszólás lenne.

A kalandozók értelmező szótárából: Expedíció: Az egy olyan dolog, hogy elmegyünk egy helyre, keresgélünk, nézelődünk – közbevágás – és tárgyakra mondjuk, hogy ennek egy múzeumban volna a helye…

Sötét elf a szakácshoz megy egy plot során…
JK: Meg szeretnék Önnel osztani egy ősi receptet.
NJK: Remek, szeretem az új recepteket.
JK: Most mondom, hogy ősi.

JK: Kivágom az ajtót… Nyitva van…

Mivel a kölyök potyautasként került fel a hajóra, de a sötét elf a szárnyai alá vette, ezért valahogy be kell adni a nemesnek, hogy okkal került fel a hajóra.
JK1 (sötét elf): A tanítványom…
JK2 (varázsló közbekotyog): A sötét elfeknél szokás, hogy mindig egy növendékük van…
KM (rátromfol): Mindig ketten vannak… (ed. egy mester és egy tanítvány)

A kalandozók értelmező szótárából: Lopás: objektumok észrevétlen reallokációja. (ed. Ízlés szerint kiegészíthető a hatékony és gyors jelzőkkel is, esetleg, hogy kevésbé hangozzon kocka poénnak, az objektumokat tárgyakra lehet cserélni).

A szerepjáték második bölcsessége: A játékosokra nincs veszélyesebb, mint egy unatkozó KM.

A szobába betévedt egy körülbelül két centiméter nagy lepke.

  • Nagyon meg tud vadulni.
  • Egy lepke
  • És kitépi az arcodat a nyaló szájszervével…
  • Epic fail magyarul?
  • Epikus kudarc.
  • Nem, magadba zuhansz, és melléesel.

A varázsló az ork testőrrel beszélget a kölyökről.
JK: Mit gondolsz a kölyökről?
NJK: Ügyes kölyök.
JK: Mi a véleményed róla?
NJK: Ez.

Varázsló új ruhát vett, leírja a külsejét:
JK1 (varázsló): Ilyen sárkányos-lángos…
JK2 (közbeszól): Sárkányos lángos… helyi specialitás…

JK: A varázslóm megfürdik.
KM: Ez szerintem a többieknek lelkierő(próba).

A kölyök be akar menni a javítás alatt álló kis vitorlás zárt kabinjába (a versenyzőé). A javítás miatt szerteszét voltak szerszámok.
JK (kölyök): Van-e valami, amivel kinyithatom?
KM: Hát, ha elég sokáig próbálkozol egy konzervnyitóval…

A nemes hozott magával egy kis (ed. gondolom, mocsári) sárkányt, mintegy házimacska jelleggel szerepelt a modulban. Az ajtónyitási küzdelem alatt a kis hajón hevert.
JK1 (kölyök): Megkérem a sárkányt, hogy segítsen kinyitni az egyik ajtót.
JK2 (közbeszól) : Felhasználhatod a farkát lockpickhez – ha letörik, újra kinő…

Vendégségben a szultán palotájában:
JK (varázsló): Megvizsgálom a párnákat…
KM: Mágikus csatapárna.

A varázsló és a sötét elf próbálják nevelni a kölyköt, általában kevés sikerrel… Varázsló éppen keresi őt, és megtalálja, amint a sötét elf felültette egy asztalra, és beszél vele.
JK1 (varázsló): Nicsak, ki van itt?
JK2 (kölyök): Én nem.

Keressük az orkot a hajón:
KM: Először dobj, hogy meglátod-e az orkot!
JK1: Miért, beleolvad a környezetébe?
JK2 (közbeszól): Egy ork szobor, egy ork szobor, egy ork, egy ork szobor…

Parancsnoki szobában beszélgetés, a sötét elf navigátor szeretné kihallgatni.
JK1 (elf): Fogok egy céleszközt, és közelebb lépek a falhoz.
KM: Milyen eszközt?
JK2 (közbeszól): Sztetoszkópot.

Éjszakai játék:

  • Over! Ne aludj!
  • Nem. Kicsit álmos vagyok.

JK: Együttélésünknek egyik alapvető feltétele, hogy ne öljük meg egymás sárkányát.

JK: És egy jó harcos betartja a szagát.

JK (varázsló): Érzékelek valamit?
KM: Még nem.

KM: Találtál egy vésetet a családod címerével, és pont úgy néz ki, mint a medálod.
JK: Van medálom? Nem is tudtam.

KM: Visszamentek a hajóhoz… nem, nem volt támadás (a versenyző ott maradt őrködni, és “reménykedett”) […] Értsd már meg, hogy senki sem üldöz titeket!

JK: Persze, hogy éjszakai indulást erőltetek. Az több XP.

JK: Kipróbálom a pekingi csirkét. Csiga van benne?

JK: Jut eszembe, te mondtad, hogy át tudod hágni a nyelvi akadályokat.

Vásári forgatag a városban. Varázsló JK egy nővel járkál, és eljut a céllövöldéhez.
KM: Nyerhető itt mindenféle ajándék…
JK1 (közbeszól): Plüssmackó…
KM: Igen, olyasmi, meg játékhajó…
JK2 (ő is közbeszól): Plüsshajó?
KM (folytatja): Brook (a csónakversenyző) akciófigura…
[…] Később a téma kifejtése során kiderül, hogy a várost a várostanács vezeti.
JK3: Várostanács gyűjthető figura.
JK4: Gyűjtsd össze mind!

KM: Dobhatsz, hogy kikerülsz-e a plotline-ból.

JK1 (nemes): Beszélhetnénk nyugodtan?
JK2 (sötét elf): Én nyugodt vagyok.

Sötét elf gyermeket nevel:
JK1 (elf): Hiába dörzsölöd a kezed… 1 HP-vel is megverlek. Na jó, helyesbítek, felpofozlak. (az egész modul során egyedül a gyereknek sikerült megsebeznie a sötét elfet, neki is szinte csak véletlenül).
JK2 (közbeszól): Sötételf utolsó mondata: ejnye-bejnye.

Kölyök megszökne a hajóról, KM dobat vele, 01.
JK1 (kommentálja): Epic win.
JK2: Kiosontál a kapitány lábai között.
KM: Sőt, némi élelmiszert is loptál (az egész modul során lopni szeretett volna, de soha nem hagyták neki).
JK (versenyző, reménykedve): Konzervet?
KM: Mondom, hogy ÉLELMISZER!

Rabszolgapiacon:
NJK (kereskedő): Tanult ember (a rabszolga).
JK: Az mire jó?
NJK: Vigyázhat a gyerekre.

Gyereknevelés folytatódik:
JK (elf): Ha tőlem jobban félsz, mint a haláltól, az haladás…

JK (varázsló): Van egyfajta beszélőkéje a varázslómnak.

JK: De ne húzzuk az időt, legyen ott egy szoba.
KM: Jó. Hirtelen ott terem egy szoba.

JK1 (sötét elf): Átkapcsolok dark visionre.
JK2 (versenyző): Én fáklyát gyújtok. Én a hagyományos megoldásokat részesítem előnyben.
JK1: Én is…

KM: Ne felejtsd, nem érted a nyelvüket. Szerintem az orkét sem.
JK (nemes, közbevág): De, az orkét mindenki érti.

KM: Nem ba, ha formalizálom egy kicsit? … Ööö, illetve leegyszerűsítem.

JK (elf): Ha valaki észreveszi, hogy véres a ruhám, azt mondom, hogy disznóölésen voltam.

JK: És a foglyokkal mi lett?
KM: Jogos, pillanat.
JK: Boldogan éltek, amíg meg nem haltak.

  • Bagdadban mindig éjfél van.
  • It’s still eleven o’clock. ((c) Monkey Island)

KM: Mikor csúsztunk le C kategóriába? (sok poénkodás után, hogy nyomjuk a B kategóriás kliséket)

És zárszónak egy bölcsesség: Nekiment és nem ment neki.

Amikor nem játszunk roleplayt…

Csapat:

  • Timi, a párbajhős lovagina;
  • D-nee, a mindig éhes barbárral;
  • Eversong, Kyel-pap;
  • Overander, a lútmester harcos;
  • Stampie, a játék ellenére nem piromániás tűzvarázsló
  • és végül, de nem utolsósorban TeoZ, a “jóindulatú” KM-ünk.

KM (barbárnak): Tengsz-lengsz, keresel munkát… de ahhoz fürödni is kell…

JK (barbár – felszereléséről): Van egy orrbevaló…

Csapat:

  • Timi, a párbajhős lovagina;
  • D-nee, a mindig éhes barbárral;
  • Eversong, Kyel-pap;
  • Overander, a lútmester harcos;
  • Stampie, a játék ellenére nem piromániás tűzvarázsló
  • és végül, de nem utolsósorban TeoZ, a “jóindulatú” KM-ünk.

KM (barbárnak): Tengsz-lengsz, keresel munkát… de ahhoz fürödni is kell…

JK (barbár – felszereléséről): Van egy orrbevaló…

KM (barbárnak meséli NJK magyarázatát a feladatról): Nincs Lélektanod… De ha lenne, látnád, hogy már halál ideges, hogy ötször kell elmondania, kit engedj be…

JK1 (barbár): Én a természet gyermeke vagyok, tudom, mikor van eső.
JK2 (tűzvari): Van időjóslásod?
JK1: Van.
KM: Akkor ezért nem szoktál fürdeni.

KM: Egyes helyeken még láthatók a leégésnek (ed. a városrész éghetett le máskor) nyomai.
JK(tűzvari): Nem én voltam, nem kell rám nézni.

Kyel-pap barátja súlyos mérgezést kapott, pap a jellemek eltérése miatt nem tudja meggyógyítani.
Megjegyzés: Van rá hét perced, hogy megtérítsd, és utána még kettő, hogy meggyógyítsd.

KM: Egyértelműen egy találós vers és annak a megfejtése…

KM: Egyrészt törzsvendég, másrészt törzsíró…

JK (Kyel-pap, a haldoklónak): Amikor látom, hogy kevés idő van hátra, mondom neki, hogy nyugodjon meg, dőljön hátra…

JK (lovagina, leírja külsejét): Hosszú, barna hajú…
KM: … tarkopasz és fekete ruhában (a barbár parancsa, hogy a gyanús alakokat ne engedje be, kivéve a fekete ruhás tarkopasz embereket).

Lovag próbálja a barbárt Domvik hitére téríteni, ehhez megkínálja szerencsesütivel. Barbár az összeset elveszi és felfalja egy mozdulattal.
KM: Dobj érzékeléspróbált! (dob, megvan) Nem érted, mit keres a papír a sütiben.
JK1 (barbár): Miért zavarna, jóízűen megeszem.
JK2 (lovag): Te megetted Domvik tanításait?
JK3 (Kyel-pap): Még soha nem volt ilyen közel az agyához.
JK1: Igen, finom volt […] Ki az a Domvik? […] Mindig ilyen finom sütit süt Domvik?

Rajtaütés a fogadón, mágikus fényeket eloltják, tűzvarázsló tábortűz erősségű lánggömböt idéz a levegőbe, hogy ne legyen teljesen sötét.
JK (Kyel-pap): Látom, hogy valami nem stimmel, ezért megvárom, hátha valami lesz…

KM: A következőket látod, ahonnan ülsz…
JK (Kyel-pap): Már felálltam.

KM: Ez (ed. Hatalom szava varázslat) kicsit olyan, mint amikor a pap feje fölött ott a glória…
JK (tűzvarázsló): Ezt én tudnám most eljátszani (ed. a feje mögé idézte meg a lánggömböt).

KM (érzékeléspróbát dobat, megvan): Akkor hallottad, hogy egy csóka ott feláll… (messze)

KM: Ez kiderül, ha megfogod a nyílvesszőt. Megfogod a nyílvesszőt?

KM: Nem játszunk.
JK: No roleplaying, please.

JK1 (tűzvarázsló): Ez a lyuk (a falban nyitott a barbár egy lyukat).
JK2 (Bong, barbár): Bong-formájú.

JK: Mennyi az idő?
KM: Négy óra (délután). Lehet, hogy vacsorára végzünk is…
JK: A karakterekkel?

JK: Ahány ház, annyi család.

JK (tűzvari, sütit evett a játékos): Pillanat, csak tele volt a pofám.

KM dob, 1.
JK1: Egy.
JK2: Ez azt jelenti, hogy egy?
KM: Igen, ez azt jelenti, hogy egy.

JK1: Lehet, hogy ennek semmi köze sincs a fogadóban történtekhez…
JK2 (tűzvari): Lehet, hogy mi ássuk ki nekik a cseresznyét…
JK3 (éhes barbár felkapja a fejét): Cseresznyét?

KM: Bérletes ajtókeret…
JK: Please insert bérlet here…

JK (tűzvarzsló, manatöltődés miatt figyeli az időt): Tényleg, mennyi idő telt el azóta, hogy utoljára kérdeztem?

KM: Egy kör alakú terembe értek, négyszögletű padlóval.

KM: Kőszobor… Márványos a textúrája.

JK (barbár): Hülyén nézek rá (tűzvarázsló, miután lángot okádva elpusztított egy márványgólemet).
JK (tűzvari): Fel sem tűnik.

A karakterek találnak egy vörös, egy kék és egy zöld kristályt egy rejtvényben, a rejtvény megoldása után a harcos elteszi RGB-kristályok címszóval.
KM: Pofám leszakad, hogy ezt is belútolta.
JK: Majd villogtatod a barátaidnak… “Mi ez? Polárszűrő.”

A szerepjátékosok törvénykönyve, első passzus: Az egyszerű dolgokra figyelj, és próbáld meg kitalálni, mit akar a KM.

KM: Akkor ott tartottunk, hogy a plot kidobta a quest itemet.

A lovag a harc közepén a lehetőséget kihasználva hátbatámadta a másik lovagot.
JK (lovag): Elrontottan. Ki kellett volna hívnom párbajra.

KM: Itt tegyük ki a The End táblát. A vége Epic Fail volt.

Modulértékelés
JK (barbár): Tudtál motiválni, adtál patkányt (enni).

Eclipse és az OSX

Az elmúlt időszakban egy kicsit összejöttek a Java-fejlesztéssel kapcsolódó dolgaim. A keretrendszer, amibe éppen fejlesztek, nemrég esett át egy elég durva refactoringon (hogy Eclipse-projekt révén a csomagnevek megfeleljenek az Eclipse elnevezési konvencióinak), és akkor közben megtették még azt is, hogy a legfrissebb változat már csak 6-os Javaval fut.

Ezzel önmagában nem is lenne baj, hiszen ez egy research projekt, nem érdemes régi technológia felett fejleszteni. Szerencsére az Apple nemrég kiadta a Java környezetének hatos változatát (igen, az Apple, és igen, csak most), annak idején már telepítettem is, de valahogy használatba nem került még. Sebaj, az Eclipse futása közben is lehet Java-t váltani. Szal beteszem az új verziót a futtatási konfigurációba, és a puskaport szárazon tartva reménykedek.

Az elmúlt időszakban egy kicsit összejöttek a Java-fejlesztéssel kapcsolódó dolgaim. A keretrendszer, amibe éppen fejlesztek, nemrég esett át egy elég durva refactoringon (hogy Eclipse-projekt révén a csomagnevek megfeleljenek az Eclipse elnevezési konvencióinak), és akkor közben megtették még azt is, hogy a legfrissebb változat már csak 6-os Javaval fut.

Ezzel önmagában nem is lenne baj, hiszen ez egy research projekt, nem érdemes régi technológia felett fejleszteni. Szerencsére az Apple nemrég kiadta a Java környezetének hatos változatát (igen, az Apple, és igen, csak most), annak idején már telepítettem is, de valahogy használatba nem került még. Sebaj, az Eclipse futása közben is lehet Java-t váltani. Szal beteszem az új verziót a futtatási konfigurációba, és a puskaport szárazon tartva reménykedek.

Nincs szerencsém: brutális bundle not found kivételeket kaptam, és a hiányzó bundle-ök az eclipse alap moduljai voltak. Kicsit utánaolvasgatva a témákat kiderült, hogy az a gond, hogy az Apple Java 6 megoldása csak Intel-alapú gépen fut, és ott is csak 64 biten. Pontosabban nem is ez a probléma, hanem az, hogy az SWT a Carbon GUI könyvtárat használva jeleníti meg az Eclipse GUI-t. És az Apple döntésének megfelelően a Carbon nincs meg 64 biten, csak 32-n. Azaz ebből az irányból per pillanat nincs győzelem. Fényt mindössze annyi jelent az alagút végén, hogy az SWT-sek megkezdték a Cocoa portot, és az Adobe is biztosított erre a célra egy mérnököt (az Eclipse-technológiára alapozva fejlesztőkörnyezetet akarnak építeni az ismereteim szerint). A Cocoa-port jelenlegi állása szerint csak 32 bites APIt használ a rendszer, de remélhetőleg ez hamarosan változni fog. Talán a 3.5-re meglesz.

De addig is kellene egy megoldás, mert dolgoznom kéne. Egyik ötlet, ami segíthetne, az az Eclipse on Swing projekt lehetne. A céljuk az, hogy az SWT platformfüggő hívásait Swing-alapúra cseréli. Nagyon szép, csak sajnos még az SWT 3.2-es változatánál vannak lemaradva, ami nekem nem felel meg, ugyanis a keretrendszer legalább a 3.3-as Eclipse-et igényli, ugyancsak ez a helyzet a Subversive SVN pluginnel is. Azért kipróbáltam, nem indul be vele az Eclipse Ganymede…

Másik megoldás egy másik JVM lenne, ami nem igényli a 64 bitet. Van is egy ilyen, ami a találó Soylatte névre hallgat. Feltelepítem, beállítom Eclipse JVM-nek. De ekkor kiderül, hogy itt meg az a gond, hogy X11-et használna grafikus felületként, ahogyan meg nem lehet behívni az SWT számára a Carbont…

A helyzet siralmas… Háromféle, egymástól drasztikusan eltérő megoldást kipróbálva jutottam el oda, hogy per pillanat Eclipse pluginfejlesztést nem lehet OSX-en Java 6-on végezni. Siralmas, hogy ezért kénytelen vagyok egy virtuális gépen futó Windows-t használni. Majd figyelem a változásokat, és szükség szerint alátolok valamit a rendszernek. Addig is a remény hal meg utoljára – a sör meg először…

Európa-fogyatkozás

Elég hamar kicseréltem az Eclipse 3.3 Europa integrált fejlesztői környezetemet az új verzióra. Hamarabb, mint eredetileg terveztem. Ennek annyi volt az oka, hogy letöltöttem az M6-os release-üket kipróbálásra, és amikor meghalt a rendes fejlesztői környezetem (volt 900 MB telepítve, rendes kis pluginkönyvtár :p ), úgy döntöttem, megspórolom az egész újratöltését, és inkább berakom a Ganymede-be a cuccokat.

Nem mondom, akkor még korai volt egy kicsit (de csak egy kicsit), nem volt (sokkal) nagyobb szívás ott újra összerakni a munkakörnyezetet, mint az Europa-ban lett volna. Mostanra meg már, hogy van végleges 3.4-es változat, nem mennék vissza.

Elég hamar kicseréltem az Eclipse 3.3 Europa integrált fejlesztői környezetemet az új verzióra. Hamarabb, mint eredetileg terveztem. Ennek annyi volt az oka, hogy letöltöttem az M6-os release-üket kipróbálásra, és amikor meghalt a rendes fejlesztői környezetem (volt 900 MB telepítve, rendes kis pluginkönyvtár :p ), úgy döntöttem, megspórolom az egész újratöltését, és inkább berakom a Ganymede-be a cuccokat.

Nem mondom, akkor még korai volt egy kicsit (de csak egy kicsit), nem volt (sokkal) nagyobb szívás ott újra összerakni a munkakörnyezetet, mint az Europa-ban lett volna. Mostanra meg már, hogy van végleges 3.4-es változat, nem mennék vissza.

Ami a leghasznosabb újdonság számomra, az a megújult csomagkezelő. Egyrészt az az előnye, hogy nem kell előre eldönteni, hogy én most új csomagot akarok telepíteni, vagy a meglevő csomagokon akarok valamit módosítani (korábban idegesítő volt, amikor a rossz menüpontra kattintottam, és egy percig várhattam, amíg megnézte, hogy mit lehet csinálni), ugyanis két almenüpont helyett egy közös dialógusablakból lehet változtatni két fül között – ezek a fülek tartalmazzák a korábbi funkcionalitást. Legalábbis nagyrészt.

Ami úgy tűnik számomra, hogy hiányzik, az a korábbi változatban Select required nevű gomb a telepítendő csomagok választásánál. Lehet, hogy már nincs rá szükség, mert automatikusan bejelöli (nem vagyok benne egészen biztos, ezért ezt nem merem elítélni). Amiben biztosabb vagyok, az a csomagok eltávolítása. Ezt még egyáltalán nem sikerült az új verzióban véghezvinni.

Ami viszont roppant hasznos új funkcionalitás, az a dropin mappa koncepciója. Ez egy kijelölt mappa, amibe ha bedobunk letöltött csomagokat, akkor azokat a csomagkezelő látja, és a függőségeivel együtt telepíthetőek. Ez nagyon hasznos lehet akkor, ha valami olyan projektet akarunk telepíteni, ami valami miatt nem szerepel az Eclipse csomagkezelőben.

Egy másik apró változás, amivel találkoztam, az az Eclipse pluginek (illetve RAP programok) fejlesztésekor jött elő: bizonyos fájlokat megnyitva az Eclipse nem jön rá, hogy én egy megadott futtatási konfigurációval akarom futtatni egy automatikus futtatás parancs kiadásakor, hanem kézzel kell megjelölni. Az Europaban erre nem találtam alternatív megoldást, de a Ganymede sokkal kevésbé idegesítő. A problémát ugyen nem oldották meg, de legalább megkerülték: első futtatáskor lehet, hogy ki kell választanom a futtatási konfigurációt, de utána megjegyzi, és nyugodtan futtatja úgy is.

Az Eclipse 3.4 lesz Ubuntuhoz is – az Europa nem volt, mert valami ütközött az SWT-ben és az Ubuntuban, és ezt csak az új verzióra javították ki; ezért is van az, hogy még az LTS kiadásban is csak a két éves 3.2 (Callisto) került be. Nem tudom, hogy végül is kijavították-e, mert per pillanat nincs lehetőségem ezt ellenőrizni, de valamikor majd ezt is meg lehet tenni. Ez a probléma egyébként akkor merült fel, amikor Balage a leírásom alapján telepíteni próbálta az [[PHP debug Eclipse PDT-ben|Eclipse PDT-t debuggerrel]].

Apropó PHP debugger: a PDT projekt nincs szinkronizálva az Eclipse kiadásokkal, ebből még nincs hivatalosan kiadott verzió (sem pedig update site). De a dropin megoldás segítségével könnyen telepíthető a rendszerbe, és utána minden gond nélkül megy. A php debugger is szépen megy.

Viszont még egy negatívumról is írnék: az SWT widget-készlet még mindig Carbon-alapú OSX alatt, ami nem jó hír. Java 6-tal nem megy, mert az OSX-en kötelezően 64 bites, míg a Carbon 32. De szerencsére már elkezdődött a Cocoa-alapú változat fejlesztése, ha minden jól megy, a következő kiadásba már be is kerülhet. Ha ez tényleg így lesz, akkor lehet, hogy megint kiadás előtt fogok váltani. De ez majd kiderül. 🙂

Szóval egy hasznos új változatról van szó, nagyon forradalmi változás nincs benne, de megfelelő továbbfejlesztése a népszerű IDE-nek. Úgy gondolom, tele lehet még az előzőekhez hasonló apró változtatásokkal, de ezek felismeréséhez nem használtam eleget a korábbi változatokat, ezért nem kívánok most róla írni. Majd esetleg máskor. Mindenesetre bárki számára javaslom a verziófrissítést, ha nincs túlságosan előrehaladott állapotban egy projektjében, mert akkor kellemetlen lehet a váltás. De érdemesnek érdemes szerintem, nem sok helyen van inkompatibilitás a következő verziókkal. Az egyedüli gond az lehet, ha valami szükséges plugin nem érhető el az új változatban.

De ha valakinek nincs valami nagyon különleges igénye, akkor nyugodtan lehet frissíteni, szépen megy az új Ganymede is.