New major release: 0.7.0

Today I created a new release from Debug Visualisation.

The new release is called 0.7.0, as it introduces major new features:

  • Preliminary support for Filtering nodes: similar to the Logical Structures feature it is possible to define the structure, and only visualise that (e.g. in case of Lists only the content should be depicted, not the other attributes).
  • Drill in: it is possible to define a new top-level element instead of the Local Context, and hide other items.

There are also some minor updates, such as the reintroduction of the Simulated cooling layout algorithm.

On the other hand most changes are not visible in the user interface, but the revamped code should allow us to create some new features in the next service releases.

We recommend the update for everybody. Some technical information:

  • After some fighting with the update site project the category information is lost. I have no idea of the cause.
  • There is a new feature present in the update site: the Java Filter project defines filters for some items in the collections API.

Java konstruktor hívási sorrend

Rég írtam, valóban. Hogy újra rávezessem magam a kedvenc munkán kívüli elfoglaltságomhoz, most egy egyszerűbb témát vetek fel, ami mégis okozott pár kobak-koppanást az asztalon. Nevezetesen arról szándékozom írni, hogy a Java hogyan sorrendezi egy objektum inicializálásában résztvevő kódokat. Mert bizony több lehet, és nem egyértelmű a lefutási sorrend, ahogy azt a követkető kódrészlet szemlélteti:


public class AB{
public static abstract class A{
public A(){
doSomething();
}
protected abstract void doSomething();
}

public static class B extends A{
final String s = "1234";
final Object o = "1234";
public B(){
super();
}
@Override
protected void doSomething(){
System.out.println(s.getClass());
System.out.println(o.getClass());
}
}

public static void main(String[] args){
new B();
}
}

A példát igyekeztem egyszerűnek tartani, de talán megérdemel egy rövid magyarázatot: Két osztályt definiáltam, az egyik leszármazottja a másiknak. Érdekesség még, hogy az ős konstruktora kódot hív meg a leszármazottból absztrakt metóduson keresztűl. Egy “B” típusú objektum létrehozásához láthatóan három helyről kell kódot hívni: Az “A” és a “B” konstruktora, továbbá a “B” osztályban lévő, konstruktoron kívüli inicializálás. A probléma ezen három kódrészlet lefutásának sorrendje.

Első ránézésre a kóddal semmi probléma nincs azon kívül, hogy teljesen haszontalan. Mindkét mező final, így gondolnánk a konstruktor elött inicializálódnak, tehát nem okozhat problémát. Azonban a kód futtatásakor egy csinos NullPointerException kacsint vissza ránk. A futás kimenete:


class java.lang.String
Exception in thread "main" java.lang.NullPointerException
at AB$B.doSomething(AB.java:22)
at AB$A.(AB.java:8)
at AB$B.
(AB.java:17)
at AB.main(AB.java:27)

Láthatóan a B.doSomething() első sora lefut hiba nélkül, a probléma utána keletkezik. Tehát az “s” változó már létezik, az “o” viszont nem. A konstruktorok lefutásának sorrendje tehát: s=..,A(),o=..,B(). A két mező között csupán az a különbség, hogy az “s” mező típusa megegyezik a futásidejű értékének típusával. Ez meghatározza, hogy a mező a szülő osztály konstruktora előtt vagy után kap értéket. Érdemes kipróbálni, ha az “s” mező elöl kivesszük a final kulcsszót, az azt okozza, hogy az is a szülő konstruktor hívása után kap értéket. Vajon hogy határozódik meg a pontos sorrend, mitől függ, hogy hova ütemezi be a java a mezők értékadását?

Nyílván valahogy igyekszik meghatározni, hogy az adott értékadás kiértékelhető-e az osztály örökölt részének inicializálása nélkül vagy sem. Ennek tesztelésére tettem még egy kísérletet, kicsit módosítva a példát:


public class AB{
public static abstract class A{
protected String a;
public A(){
a = "abc";
doSomething();
}
protected abstract void doSomething();
}

public static class B extends A{
final String s = "1234"+a;
final Object o = "1234";
public B(){
super();
}
@Override
protected void doSomething(){
System.out.println(s.getClass());
System.out.println(o.getClass());
}
}

public static void main(String[] args){
new B();
}
}

Ez a kód is szépen elszáll, méghozzá a B.doSomething() első sorában! Azaz, az explicit hivatkozás egy szülő objektum-beli elemre azt eredményezi, hogy a mező értékadását a szülő konstruktor utánra ütemezi. Elég intelligensnek tűnik a dolog, de mégis beleütközik az ember, mert másra számít.

Persze elkerülhető a dolog ha a konstruktorból hívott absztrakt metódusokat anti-pattern-nek kiáltjuk ki, bár gyakran jól jön. Mégis pontosan mi határozza meg a sorrendet, és lehet-e befolyásolni valahogyan? Van valaki aki nálam sikeresebben guglizott?

Web usability kérdés

Nemrég olvastam Krugtól a Don’t make me think (magyarul Ne törd a fejem címen elérhető). Nekem határozottan tetszett, noha  egy Szoftverergonómia kurzus után sok újat nem mondott.

A könyv példákon mutatja meg, hogy mit is jelent a használhatóság a weblapok tervezése közben, nagyon olvasmányos módon, sokféle példával. Kifejezetten dícsérte például az Amazont (amivel személy szerint kevés használat után egyet kell, hogy értsek, jól megtervezték).

Hogy miért is jutott eszembe? Mert egy fárasztó nap után apukám ismét szembesített a magyar web egy igazi gyöngyszemével. Január óta havi program, hogy apukámnak gondja van a villanyóraállás bejelentésével. Korábban telefonon próbálkozott, de ott kb. 50 jegynyi értelmetlen számsort újra és újra betölteni finoman szólva is kellemetlen feladat.

Természetes ötlet, hogy akkor használjuk az internetes kitöltést. Ma megnéztem, hogy apukám hogy csinálja. A Firefox kezdőoldalán a google-be beírja, hogy elmu.hu (ez is megér egy misét, de ezen tegyük túl magunkat), majd pár kattintáson és rövid időn belül a keresett oldalra kerül.

Oldal közepén link, hogy Mérőállás bejelentése. Rákattint (elvégre ezt akarja csinálni). Ki látja, hogy mi volt a gond az oldallal? (Élőben látható itt 2009. 09. 01. este: http://ugyfelkapu.elmu.hu/meroallas_rogzites )

A mérőállás bejelentő oldal - Bejelentkezés szükséges
A mérőállás bejelentő oldal - Bejelentkezés szükséges

A helyes megfejtést hozzászólásban várom. További minősítést majd akkor adok az oldalról, ha már lenyugodtam.

MSN probléma Adiumban

Na, most gondban vagyok. Frissítettem Adium 1.4 bétára, mert kerestem Twitter klienst, és jónak/logikusnak tűnt az Adiumot használni erre (is).

Csakhogy megjött a béta9. Mondják, hogy MSN-szempontból security módosítás volt benne. Ami viszont nem volt szép, hogy azóta MSNen nem kapak meg üzeneteket. Rendszeresen. Az Adium fejlesztőit többen is értesítettük, szóval lehet reménykedni.

Mindenesetre aki a hiba javításáig üzenni akar nekem, lehetőség szerint Google Talk/Jabberen vagy Skype-on tegye – azok pöccre mennek. Az MSN-nél nem vállalok felelősséget azért, hogy nem kapom meg az üzenetet. Előre is bocs mindenkitől. Jelzek, ha elvileg javítva.

Vissza Oasisba – ártatlan bociszemekkel

Idén nyáron folytattuk oasisi kalandozásainkat tavalyról. A karakterek a régiek (és a mesélő is :D), elvégre nem fejeztük be a játékot. Visszatért TeoZ epic sötét elfe, Timi majdnem két anyával rendelkező mocsárlakója, a nem szót részekre bontó nemes D-nee megformázásában, a helyenként értetlenkedő légvarázsló Overtől, és Eversong továbbra is mesélt. Ja, és a legfontosabbat majdnem kihagytam, természetesen az én vitorlásversenyzőm is visszatért, viszont leadta a Puffint (“dögvész pusztít majd a lakatlan szigeten”). 😀

JK (varázsló): Látom, a karakterem jóban van veled. Remélem, az érzés kölcsönös.

JK (versenyző – a konzervkereskedőről): Hogy tudja ezt eladni?
JK (sötét elf): Honnan tudjam, én egy egyszerű gyilkos vagyok.

JK (D-nee): Ártatlan bociszemekkel nézek a KM-re.

Nemes minősíti a sötét elfet:
JK: Epic sötét elf. Ő tudja.

JK: Érzem, hogy nyúlnak a statjaim.

KM megtartja egy másik hajó kapitányának bemutatkozását.
NJK: Charles Higgins vagyok, és üdvözlöm csodálatos hajónkon… amit nem neveztünk el.

Bemutatkozik a nemes:
JK: Az összes nevem… ööö… hmmm…

JK: Nemes célunk…
JK: … hogy megtaláljuk a legendás artifactot és megmentsük a világot.

KM: A (hajó)konyha jó hely… ott hűsölnek.

A kölyök most már nagyjából beszéli a nyelvet, ezért többen nevelik.
JK (nemes): A NEM szó melyik részét nem érted?
JK (kölyök): Ezt a szót nem tanították meg nekem.

Órarendegyeztetés
JK (varázsló): Akkor kétszer háromnegyed óra tizenöt perc pihenővel.
JK (kölyök): Tizenöt perc pihenővel??? Az sok!

JK (varázsló): Van még két varázslatom… szikrazápor és savfelhő…
JK (én, felfigyelek): Mi van??? Cipőzápor???

JK: Majd a mesélő elintézi, hogy játékos ne haljon meg.
KM: Játékos nem is fog.

Hatalmas robaj hallatszik az erdőben (szerk. lezuhant egy hatalmas légi hajó nem messze tőlük).
JK (nemes): Hallottátok ezt?

KM ceruzákkal szemlélteti a térben, hogyan haladnak a repülő hajók: 3 dimenziós kombat szkrín.

Lezuhant hajón NJK-t segítségért küldjük.
NJK: Kéne egy kis segítség, hogy odataláljak.
JK (sötét elf): Ön a leggyengébb láncszem.

A kölyök odavezet a csapathoz egy másik NJK-t a lezuhant hajóról.
KM: Timi karaktere hozott egy új embert a csapatba. HR-es. (Szerk.: jó, hogy nem a politikai kapcsolat lett felidézve. Akkor aznapra vége lett volna a játéknak. 😀)

JK (sötét elf): Kifejezem ezirányú aggodalmamat…

Mindenki bemondja, hogy a következő légiharcban milyen szerepet vállalna:
JK (nemes): Mesterien tudom az emberek kezébe a megfelelő fegyvert adni.

JK: Ez a verébbel ágyúra kategória…

Nemes meglepve tapasztalja, hogy érti és beszéli a bennszülött madáremberek nyelvét. Mások is.
JK (varázsló): Te érted?
JK (nemes): Én sem értem.

A karakterem bátyja emberáldozó törzs fogságába kerül. KM-től azt tudjuk meg, hogy pár napon belül jön az áldozat.
JK: Ha ma támadunk, akkor ma lesz az áldozat.

JK: Ennyi embert nem tudok legyőzni. Egyesével lehet?

JK: Bemegyek és megpróbálok hallgatni a hatodik érzékemre, ami nincs számszerűsítve.

Légi harc, elfoglaltuk az ellenséges hajót.
JK (nemes): Lootoltunk egy hajót.

Teljesítettük a modult, még elvarrjuk a szálakat (de nem úgy azért, mint [intlink id=”15″ type=”post”]pár éve a boszorkánymesterrel[/intlink]):

JK: A hercegnő meghal tífuszban… (gondolkoztunk, hogy hogyan kellene elrendezni politikai bonyodalmak nélkül).

Kölyök jutalma:
JK (nemes): Rádobok egy láda pénzt… Hogy érezze a pénz súlyát.

Pár hónappal később a kölyök hazajut a mocsárba.
JK (kölyök): Anyám meghalt a szülésnél.
KM: Jó, hogy mondod, majdnem bemeséltem neked egyet.

Modul értékelése:
Nekem tetszett… de néha nem annyira.