2009. augusztus 31., hétfő

Google Map Buddy

Utazni jó. Az utazás azzal jár, hogy az ember olyan helyenek van, ahol máskor nem.
Ilyenkor az ember hajlamos eltévedni, amit ugyan utólag el lehet mesélni a haveroknak egy sör mellett mindenki nagy megelégedésére, de akkor és ott nem mindig lélekmeglengető élmény.
Ezen a problémán segít a térkép. Jó esetben csak bepötyögi az ember valami kütyübe, hogy maps.google.com, és már ott is van előtte a kívánt térkép. Néha ez az út viszont nem járható (nem vittél kütyüt magaddal, lemerült, drága a roamingos adatkapcsolat) - ez esetben vagy veszel papírtérképet jó pénzért, vagy előrelátóan még otthon a Google Maps-ből screenshotokat csinálsz, valami képmanipuláló programban levagdosod a sallangot, és megpróbálod összeillesztgetni.

Ha ez utóbbi nem ismeretlen tevékenység számodra, akkor a Google Map Buddy-t neked találták ki. Ez egy egyszerű, kicsi, ingyenes szoftver, ami képes a Google térképen kijelölt területről, megadott zoom faktorral az összes kis térkép-darabot letölteni, majd egyetlen nagy képpé összefűzni.
Ezt akár ki is nyomtathatod, vagy laptopon / PDA-n offline nézheted.

Persze az igazi online térképekhez képest ez is csak félmegoldás (keresni pl. nem lehet benne, és célszerű több verziót is csinálni különböző zoom faktorokkal), de még mindig messze kényelmesebb, mint a layereket tologatni a PhotoShopban.

2009. augusztus 28., péntek

SenseNet 6.0 Beta 4.1 released

Röviddel a Beta 4 után kijött a Sense/Net 6.0 Beta 4.1 - ez egy hibajavító kiadás, a Beta 4 funkciókészletével, annak néhány apróbb hibája nélkül. Letölthető a szokásos helyről, a http://sensenet.codeplex.com/-ról.
További infó a Sense/Net 6.0 Wikin, kérdéseket, bugreportokat a fórumba várunk!

2009. augusztus 27., csütörtök

TargetInvocationException eliminálás

Adott egy ilyen osztályunk:

class SomeClass
{
    public void SomeMethod()
    {
        int a = 0;
        int b = 1 / a;
    }
}
Ez sok mindent nem csinál, egy metódusa van, az is hülyeség, nullával próbál osztani.
Van hozzá egy ilyen kódunk:
var someClass = new SomeClass();
someClass.SomeMethod();
Ez meg meghívja azt a metódust. Eddig nem nagy mágia, szépen megkapjuk a magunk DivideByZeroException-jét.

De mi történik, ha valami miatt - jelen példában erre nem sok okunk van, de real-life sok lehet - nem a "hagyományos" módon, hanem reflection-nel, invokálással hívjuk a metódust?

var someClass = new SomeClass();
var methodInfo = typeof(SomeClass).GetMethod("SomeMethod", BindingFlags.Instance | BindingFlags.Public);

methodInfo.Invoke(someClass, null);
Az kiderül, hogy nullával való osztás problematikájára az invokált hívás se megoldás, viszont lényegesen cifrább kivételt kapunk: egy System.Reflection.TargetInvocationException-t, amibe ugyan be van csomagolva a DivideByZero is, de első látásra elég ilyesztő.

A TargetInvocationException néha lehet hasznos információ, de a saját tapasztalat azt mutatja, hogy inkább idegesítő. Az igazi hiba, a root cause nem ez, hanem a nullával osztás. A TargetInvocationException példányunk InnerException propertyjén keresztül viszont mindig elérhetjük az eredeti, hibát okozó kivételpéldányt. Nosza, invokáljunk így:

try
{
    methodInfo.Invoke(someClass, null);
}
catch (TargetInvocationException tiex)
{
    throw tiex.InnerException;
}
Visszakaptuk a DivideByZerót, sallangok nélkül, hurrá!