Ultimate Excel bug

Tudom, hogy az én számból ez nem hangzik túl értékesnek, mert helyből nem szeretem túlságosan a Microsoft programjait, de ma sikeresen szembesültem az abszolút mélyponttal eddig: a Microsoft Excel a fájl helyi nevével azonosítja belül a megnyitott munkafüzeteket.

Vagy legalábbis valamikor ezt csinálhatta. Mással nem tudom megmagyarázni a zx’s diatribe mai bejegyzését. Az Excel figyelmeztette a szerzőt, hogy nem nyithat meg két azonos nevű fájlt, még ha különböző mappában is vannak.

Ez még engem is teljesen meglepett, pedig tudhatnám, hogy az élet nem fenékig tejfel.

Ami reményre ad okot, hogy a screenshot alapján Office 2003 lehet, és talán a 2007-ben nincs meg ez a bug. Ha valakinek van kedve/lehetősége, és teszteli vele, akkor kíváncsi vagyok az eredményre.

Ami viszont sok reményre nem ad okot, hogy ugyanez a probléma fennáll a Mac-es változatban is… Szánalmas.

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.