Debug vizualizáció Eclipse-hez

Kicsit féltem a feladattól, mikor Stampie előállt az ötletével, hogy mit adjak be házi feladatnak Nyilt Fejlesztőrendszerekre. Sőt, akkor ő is csak viccelt vele. Akkor egyikünk se gondolta volna, hogy ennyire jól fog elsülni. A néhány hetes projekt eredménye egy eclipse nézet, ami a debug folyamatban az aktuálisan elérhető változókat jeleníti meg egy gráfban. Ehhez a [[http://www.eclipse.org/gef/zest/|Zest]] keretrendszert használtam, ami egy az egyben megoldja a gráf megjelenítését, és keretrendszert ad a csomópontok automatikus elrendezéséhez. A feladat innentől csak annyi, hogy összekanalazzuk a debug folyamatból az adatokat és a megfelelő formában beleszórjuk egy Zest megjelenítőbe.

Kicsit féltem a feladattól, mikor Stampie előállt az ötletével, hogy mit adjak be házi feladatnak Nyilt Fejlesztőrendszerekre. Sőt, akkor ő is csak viccelt vele. Akkor egyikünk se gondolta volna, hogy ennyire jól fog elsülni. A néhány hetes projekt eredménye egy eclipse nézet, ami a debug folyamatban az aktuálisan elérhető változókat jeleníti meg egy gráfban. Ehhez a Zest keretrendszert használtam, ami egy az egyben megoldja a gráf megjelenítését, és keretrendszert ad a csomópontok automatikus elrendezéséhez. A feladat innentől csak annyi, hogy összekanalazzuk a debug folyamatból az adatokat és a megfelelő formában beleszórjuk egy Zest megjelenítőbe.

Sokáig nem tudtam hogy álljak neki, hetekig bogarásztam az eclipse forrását, mire megtaláltam hogyan is juthatok hozzá a megfelelő adatokhoz. A megoldás végül is egyszerűnek bizonyult. Eclipse-ben a debug folyamat diszkrét lépésekre oszlik, mint például indítás, breakpointhoz érkezés, léptetés, folyamat befejezése, stb.. Minden lépés végén triggerelődik egy esemény a folyamat állásáról, ezt kell figyelni:

[cc_java]
public class DebugContextListener implements IDebugContextListener {

public void debugContextChanged(DebugContextEvent event) {
if ((event.getFlags() & DebugContextEvent.ACTIVATED) > 0) {
contextActivated(event.getContext());
}
}

private void contextActivated(ISelection context) {
if (context instanceof StructuredSelection){
Object data = ((StructuredSelection) context).getFirstElement();
if (data instanceof IStackFrame) {
//itt megkaptuk a StackFrame-et
}else{
//véget ért a debug folyamat
}
}
}

}
[/cc_java]
A Listener-t a következő módon tudjuk beregisztrálni a rendszerbe:

[cc_java]
DebugUITools.getDebugContextManager().addDebugContextListener(new DebugContextListener(this));
[/cc_java]

A fent látható módon várhatunk a debug állapotot reprezentáló IStackFrame adatstruktúrára. A struktúra többek között tartalmazza a Variables nézetben is látható változókat. Ezeket a változókat akarjuk megjeleníteni. Érdemes leszögezni, hogy ebben a kontextusban a változók (IVariable) csak referenciák a tényleges adatokra (IValue). Tehát az értékek felelnek meg a csomópontoknak, míg a változók az éleknek. Ez alapján már igazán gyerekjáték volt az adatokat bedobálni egy Graph-ba (persze elöbb érdemes felépíteni egy modellt, amin megjelenítés elött elrendezhetünk pár hasznos műveletet, mint a gráf “lusta” megjelenítése, vagy a csomópontok szűrése). Ami további nehézséget okozott, az a Zest kritikán aluli dokumentáltsága, így többnyire csak próbálgatásokkal sikerült megértenem a működését.

Lényeg a lényegben, hogy ma (azaz már tegnap) elfogadták házi feladatként, és így terv szerint pár apró csiszolással kiadtam a 0.5.0 verziót. A projektnek létrehoztam egy oldalt a Google Code-on, onnan leszedhető a forrás is, egy telepíthető bináris csomag és további információk a projektről. Végezetűl egy kis felsorolás arról, hogy mit is tud a cucc, azaz fícsörz:

  • Változók és referenciék gráf alapú megjelenítése, a gráf automatikus elrendezése választható algoritmus alapján
  • A gráf lusta módon van megjelenítve, az egyes csomópontok gyermek-csomópontjai csak akkor jelennek meg, ha a felhasználó dupla kattintással kinyitja a csomópontot. A csomópontok hasonló módon be is zárhatóak
  • A gráf-rendező algoritmusok extension-point-on csatlakoznak a nézethez, ami lehetővé teszi, hogy bárki hozzácsatoljon egy saját, Zest-tel kompatibilis algoritmust.
  • A Zest-ben beépítetteken kívül csináltam egy szimulált hűtésen alapuló algoritmust is, ami ugyan lassú, de az esetek nagy hányadában jobb elrendezést biztosít, mint a többi.
  • Típusfüggő szűrést végzek a csomópontokon, így pl. egy ArrayList-nél csak a releváns gyermekelemek (A listában tárolt elemek) jelennek meg.
  • Természetesen a szűrők is extension-point-tal vannak csatlakoztatva, hogy ezen a ponton is tetszőlegesen kiegészíthető a cucc.

Még néhány link:

Re: Van-e különbség (Magázás és tegezés)

Azok számára, akik látják, hogy a mai kultúra miben tér el a régebbi és a modern kultúra, biztosan találkoztak a magázódás és tegeződés kérdéseivel. Úgy érezhetjük, a kérdés fontos, de a pontos miértet nehéz megfogni.

Tompika írása is ezt a kérdést feszegeti. Mi a lényeges különbség a tegeződés és a magázódás között? Erre reflektálnék itt is most. Azért itt, mert a válaszom hosszabb lenne, mint az eredeti kérdés, amivel azért a dolog hozzászólás jellegét ki lehetne hangsúlyozni. És mielőtt belefognék a dologba, szeretném felhívni a figyelmet arra, hogy az alább olvasható dolgok az én személyes véleményemet tükrözik, és a forrásmegjelölés határozottan pontatlan lesz (nincsenek előttem a források, és amikor írom, akkor nem is vagyok netközelben, hogy ott esetleg utánanézzek); ha lesz valamikor időm rá, utánajárok pontosabban.

Azok számára, akik látják, hogy a mai kultúra miben tér el a régebbi és a modern kultúra, biztosan találkoztak a magázódás és tegeződés kérdéseivel. Úgy érezhetjük, a kérdés fontos, de a pontos miértet nehéz megfogni.

Tompika írása is ezt a kérdést feszegeti. Mi a lényeges különbség a tegeződés és a magázódás között? Erre reflektálnék itt is most. Azért itt, mert a válaszom hosszabb lenne, mint az eredeti kérdés, amivel azért a dolog hozzászólás jellegét ki lehetne hangsúlyozni. És mielőtt belefognék a dologba, szeretném felhívni a figyelmet arra, hogy az alább olvasható dolgok az én személyes véleményemet tükrözik, és a forrásmegjelölés határozottan pontatlan lesz (nincsenek előttem a források, és amikor írom, akkor nem is vagyok netközelben, hogy ott esetleg utánanézzek); ha lesz valamikor időm rá, utánajárok pontosabban.

Miután ez a viselkedésünket, szocializációnkat érintő kérdés, a teljesen műszaki jellegű megközelítés használhatatlan (kár, mert leginkább ehhez értek), de azért próbálom valamelyest precízen (talán a szükségesnél precízebben) körüljárni a kérdést. Állításom nagyjából az lenne, hogy a magázódás és tegeződés megkülönböztetése alapvetően csak és kizárólag kulturális kérdés.

Manapság társadalmunk arra az elvre épül, hogy mindenki egyenlő (vagy legalábbis egyenlőnek született). Természetesen ezt lehet orwelli értelemben szemlélni (az unalomig ismert “Minden állat egyenlő, de egyes állatok egyenlőbbek a többinél.”), de most nem ez a célom. Korábban ez viszont nem volt így: az ókori Rómában a patríciusok rendje magasabb rangú volt, mint a plebs, és a középkori világra jellemző volt, hogy a papság, illetve különösen a nemesség rangja magasabb volt.

A nemesség körében mondjuk elég eszelős dolgok voltak, példákért ajánlom az érdeklődők figyelmébe Ráth-Végh István gyűjteményes műveit az emberi butaságról (alighanem pontatlanul idézem a címet, de pl. a Butaság dícsérete rémlik). Ebben szerepeltek olyan dolgok, hogy XIV. Lajos francia király mindennapjaihoz tartozott, hogy bizonyos emberek körüllengték, és ezt a lehető legnagyobb kegyként élték meg.

Magyarországon is hasonló volt a helyzet – a különböző társadalmi szerepek különböző rangokat jelentettek, és ez magával vonta (és ezek egy része csak vér szerint terjedt), és erre a két világháború között egy hihetetlenül tekintélyelvű társadalmi szerveződés épült rá (pl. enyhén szólva nem volt jellemző ellentmondani a családfőnek). Ezt parodizálta egy rövid írás (sajnos a szerzőre nem emlékszem, sem a címre, de ha úgy adódik, kikeresem). A lényege, hogy egy relatíve magas rangú ember lezuhant a szakadékba, de egy ágban megkapaszkodott. Egy másik ember elkezdte felhúzni, és közben megszólította az áldozatot, de tévesen, azt hiszem, méltóságos urat. Erre az felháborodottan felkiáltott, hogy de hát én tekintetes úr vagyok (ha jól emlékszem), és elengedte az ágat, amelyben kapaszkodott. Szörnyet halt…

Persze nem állítom, hogy minden nemes/rangos ember így viselkedett. Voltak köztük tiszteletre méltó éppúgy, mint nagykutyák (akik az erősebb kutya jogán, vagy éppen csatatéri eredményre alapulva szerezték meg címüket), mint különféle ingyenélők. De a lényeg az egészben, hogy valamiképpen tisztelettel kellett megközelíteni ezeket az embereket. Ennek a tiszteletkifejezésnek egyik formája a magázás.

Manapság már mindenki egyenlő, a korábbi tekintélyelvűség megszűnőben van (szerény véleményem szerint túlságosan is, de ez most nem tartozik ide). Éppen ez adja aktualitását a kérdésnek, hogy mi értelme van megkülönböztetni a kétféle társalgási módot.

A szokásos érv, hogy a tisztelet megadásának módja a magázás, a maga módján helytálló, de erre nem ez az egyedül lehetséges mód, és a magázva is lehetünk tiszteletlenek (szokásos példa: menjen a fenébe). A helyzet az, hogy a szándékot máshogy is ki lehet fejezni. Hogy megszüntethető-e ez a forma? Természetesen igen.

Ahogy közismert, a mai angol nem használ magázást (pedig Nagy-Britanniában nagyon komoly hagyományai vannak még a nemességnek is). Valamelyik skandináv országban pedig a király mondta meg a nemeseinek, amikor túl bonyolult lett a címek használata, hogy fejezzük be, és inkább tegeződjenek. A történet kapcsán két érdekes gondolat van: egyrészt a király a hatalmánál fogva megmondhatta a többi embernek, hogy mi a társadalmi etikett, így ez eredményesnek volt tekinthető, ugyanakkor nem követelte meg mindenkitől: azt mondta, hogy ha valaki a régi, magázós formát használja, azt ő is magázza. Így egy-két generáció alatt a helyzet megoldódott, és a magázás tulajdonképpen megszűnt.

Következtetés: a magázás nem követelmény, könnyedén megkerülhető. De ez társadalmi összhangot igényel. A munkahelyi közösségek lassan megszüntetik, a fiatalok már a boltba lépve is tegezik a fiatal eladókat, illetve fordítva. Ez persze nem jelenti, hogy azt mondom, helyből szüntessük be a megkülönböztetést. Ahhoz túl sokan vannak, akik mást szoktak meg. De hosszabb távon igenis lehetséges út, hogy egyszerűsítjük az életünket a magázás elhagyásával. De ez a jövő zenéje, jelenleg együtt kell élni ezzel a kettősséggel, és szűk körben folytathatjuk a felszámolást – ha ehhez van kedvünk. A választás rajtunk áll…

TDK – egy nagy projekt utóélete

Az elmúlt időszak egyik fontos eseménye volt az, hogy részt vettem a kari TDK konferencián. Ez azzal járt, hogy az elmúlt néhány hónapban minden ismerősömet azzal kergettem az őrületbe, hogy legtöbbet erről beszéltem velük…

Most viszont az egész véget ért, ideje számot vetni, értékelni, ami elkészült, és a tanulságokat levonni.

Az elmúlt időszak egyik fontos eseménye volt az, hogy részt vettem a kari TDK konferencián. Ez azzal járt, hogy az elmúlt néhány hónapban minden ismerősömet azzal kergettem az őrületbe, hogy legtöbbet erről beszéltem velük…

Most viszont az egész véget ért, ideje számot vetni, értékelni, ami elkészült, és a tanulságokat levonni.

Számomra ez nagy projekt volt: 4 hónap kódolás, 1 hónap dolgozatírás, és mellé még ez-az kapcsolódott (pl. prezentáció készítése). A méretre jellemző még, hogy 5000 sor Java kódot írtam (ez nagyobb, mint bármilyen projekt, aminek a fejlesztésébe belefolytam, és a többi projektet ráadásul nem is egyedül kódoltam), valamint [intlink id=”609″ type=”post”]61 oldal dokumentációt[/intlink] (szintén rekorder méret), ráadásul angolul.

Sokféle új dolgot próbáltam ki menet közben (vagy használtam nagyobb méretben, mint korábban): Eclipse alapú fejlesztés, kényszerkielégítés (CSP/CLP) vagy éppen nagy dokumentumok szerkesztése LaTeXben. És persze Java rulez:D

Ami kicsit fájdalmasabb rész, az a tanulságok levonása: sajnos sikerült a szükségesnél kicsit nagyobbat markolni, aminek az lett a vége, hogy a befejezés kicsit rohanós lett. Ráadásul bejött a szokásos problémák egyike, mármint sikerült belefutni egyes implementációs/elvi szintű problémákba, amik megkerülésére vannak ötletek, de azért még időt igényel.

Ráadásul a negyedik-ötödik hónapra a kezdeti lelkesedés is elfogyott, így a morál csökkent. Valószínűleg könnyebb lenne fenntartani a lelkesedést, ha lenne még egy ekkora állat, aki hajlandó a projekttel foglalkozni – különösebb ellentételezés nélkül – azzal sajnos nem tudok szolgálni, munka viszont van bőven… Persze álmodozni lehet.

Ami még hasonlóan fontos kérdés, hogy hasznos volt-e a befektetett energia. Na, ez az, ami jó kérdés: rövid távon kifejezetten nehéz aprópénzre váltani, amit összeszedtem (pláne, hogy a cucc még nem is 100%-os), de hosszabb távon remélhetőleg hasznosabb lesz: felhasználható diplomamunkába, esetleg cikkekhez, doktoranduszi kutatási téma alapja lehet, stb.

De legalább az a veszély nem fenyeget, hogy a projekt hirtelen véget ér. A hiányokat lehet pótolni, illetve néhány újdonságot is lehet csinálni. De addig is irány a régi grind…

Ja, és megpróbálok majd gyakrabban írni az oldalra. 🙂 Tudom, ilyet már mondtam, de próbálkozni lehet. Mások újévkor fogadnak meg mindig olyan dolgot, amit nem tartanak meg, én ezért nem ígérek semmit senkinek – elég lesz magammal elszámolnom.

Update: amit elfelejtettem, az az, hogy szeretnék köszönetet mondani mindenkinek, aki bármilyen aprósággal hozzájárult a munkához, gondolok itt azokra is, akik nem szerepelnek a dokumentáció köszönetnyilvánításában. Tényleg mindenkinek nagyon hálás vagyok.

Modelltranszformációk statikus analízise – TDK dolgozat

A beadott TDK dolgozatom – előadás is megvolt belőle. Figyelem: not for the faint hearted! Nem vállalok semmilyen felelősséget az okozott szellemi leépülésért. Viszont arra jó lehet, hogy megnézd, hogyan ne írj angolul 😀

A beadott TDK dolgozatom – előadás is megvolt belőle. Figyelem: not for the faint hearted! Nem vállalok semmilyen felelősséget az okozott szellemi leépülésért. Viszont arra jó lehet, hogy megnézd, hogyan ne írj angolul 😀

Navigáció IPAQ módra

A probléma azóta foglalkoztat, hogy szerencsé[s/tlen] felhasználója lettem egy HP Ipaq rx3715-nek. Aki [intlink id=”552″ type=”post”]olvasta[/intlink], tudja hogy volt már egy próbálkozásom lecserélni az operációs rendszert, amivel sikeresen megátkozták a kütyüt, de sajnos az a projekt befulladt, így marad a Windows Mobile 2003SE, ezen kell megoldanom a navigációt. Az integrált GPS vevő hiánya által okozott hardveres korlátot egy NAVILock bluetooth vevő oldotta fel. A problémát már csak a megfelelő program kiválasztása okozza.

Kézenfekvő megoldásként elöször Aeromap merült fel, hiszen a kütyühöz vásárláskor kaptam egy licensz kódot hozzá, ami ráadásul a honlapról letölthető újabb verziókkal is működik. Az Aeromap teljeskörű navigációt ad Magyarország területére, a legtöbb városban házszámszintű térképpel, útvonal-kereséssel és hangos irányítással. Remekül működik, amíg határon belül maradunk, Magyarország határát átlépve viszont kiesünk a nagy semmibe. Bár ritkán járok külföldön úgy, hogy térképre is lenne szükségem (mivel nem egyedül vagyok), de úgy döntöttem körülnézek más megoldások után, főleg az ingyenesen hozzáférhető szoftverek területén.

Első lépésként a Google Maps Mobile felé vetettem a tekintetem, ami a Google maps térképeit használja, amiket közvetlenül az internetről tölt le, és képes GPS alapján pozicionálni is. Apró probléma, hogy ha nincs útközben folyamatos internet kapcsolat, akkor nincs térkép se. Ráadásúl az újabb verziókban megjelent egy idegesítő bug (vagy feature?), miszerint a program csak és kizárólag GPRS vagy UMTS kapcsolattal tud az internethez csatlakozni, Wifi-n keresztűl nem hajlandó. Bár ez megkerülhető, ha az ember keres egy megfelelően régi verziót, de láthatóan ez a program nem arra lett kitalálva, amire én használnám. Az rx3715 nem telefon, nem lehet mobil hálózathoz csatlakoztatni, így nincs internetkapcsolatom út közben.

A következő állomás az Open Street Map wikije volt, ahol van egy kimerítő felsorolás a programokról, melyek elérhetővé teszik egy átlag felhasználó számára az OSM térképeket. A felsorolásban több WM program is szerepel, melyek többsége java-t igényel, így számomra nem jöhet szóba (egyelőre, megfelelő JVM-et keresni egy WM 2003 kütyüre nem egyszerű, és nem tárgya a jelen cikknek). A natív programok közül kettőt emelnék ki, melyekkel kicsit többet foglalkoztam.

A Bluemapia egy főleg hajózásra kifejlesztett program. Az érdekessége az, hogy több ingyenes térképszolgáltatóról is képes adatot gyűjteni, közöttük a fent említett OSM, a Google Maps és a Microsoft Map. Azonban sajnos internet kapcsolat nélkül ez sem működik, akkor sem, ha letöltjük a térképeket offline tárolóba.

Utoljára a TurboGPS-t néztem meg, ami alapvetően offline adatokkal dolgozik, bármilyen raszterizált képet meg lehet neki adni térképként, megadva a kép sarkainak koordináltáit, és erre képes rápozicionálni a GPS koordinátákat. Ahhoz, hogy ilyen térképeket kapjunk, használhatjuk az OSM automatizálható letöltőjét, majd a letöltött képeket át kell neveznünk a térképeket a poziciójuknak megfelelően a következő leírás alapján: http://www.turboirc.com/forum/index.php?topic=117.0.

Sajnos egyelőre a nyílt forráskódú alternatívák nem versenytársai az olyan kereskedelmi megoldásoknak, mint az Aeromap vagy az iGo, főleg Windows Mobile rendszeren. Linux alapú eszközön jobb a helyzet, bár útkeresés, illetve irányított navigáció csupán néhány projekt tervei közt szerepel, megvalósított módszert még nem láttam. Talán egyszer megoldom azt is, hogy laptopomhoz csatlakoztassam a GPS vevőt. De ez egy másik történet lesz.