Kiéltem természetfotós hajlamaimat

A hátsó kertben. Ahhoz képest jók lettek. Minden érdeklődő megtekintheti az újonnan készült [[http://flickr.com|Flickr]] fotógyűjteményemben: [[http://www.flickr.com/photos/gbalage/]]. A flickr gyűjtemény elkészítése azonban nehezebbnek bizonyult, mint a fotózás..

A hátsó kertben. Ahhoz képest jók lettek. Minden érdeklődő megtekintheti az újonnan készült [[http://flickr.com|Flickr]] fotógyűjteményemben: [[http://www.flickr.com/photos/gbalage/]]. A flickr gyűjtemény elkészítése azonban nehezebbnek bizonyult, mint a fotózás..

Alapvetően két [[http://en.wikipedia.org/wiki/Photo_sharing|képmegosztó]] szolgáltatást vizsgáltam meg: [[http://picasa.google.com|Picasa]] és [[http://flickr.com|Flickr]]. Ezek közül egyik se fogad el regisztráció helyett [[http://openid.net|OpenID]]-t, ami killer feature lett volna. A Picasa-t már próbáltam korábban, a kliens alkalmazásuk csak windows-ra van, a linuxos verzió egyszerűen egy [[http://www.winehq.org|Wine]]-osított változat. Ráadásul szerény véleményem szerint pocsék. Kvázi ömlesztve szembesít a 2004 óta készített, kb hatezer fotómmal és várja, hogy egyenként felcimkézzem őket. A Flickr, amellett, hogy csak havi feltöltési korlátot szabott meg, az általam használt [[http://www.digikam.org|digiKam]] program képes rá képeket exportálni. A gond ezzel csak annyi volt, hogy a Flickr használatához Yahoo ID kell.

Egyel több id/jelszó nem számít, rászántam magam a registrációra. Miután sikerült elfogadtatnom vele egy értelmes felhasználói nevet is (balage, gbalage, balageg, balagehun, hunbalage, stb.. és még egy pár próbálkozásom foglaltnak bizonyult) és minden szükséges adatot megadtam, szembesültem a minden regisztrációnál szokásos [[http://hu.wikipedia.org/wiki/Captcha|Captcha]] teszttel. Persze, alapesetben ez nem okoz gondot. Kivéve, ha a várt “zajos” betűk helyett egy fehér, üres részt találok:

[[http://cubussapiens.hu/node/620|]]

Csak átmeneti elmezavar, gondolnánk, ha újrapróbálkozáskor nem szembesülök ugyanazzal:

[[http://cubussapiens.hu/node/621|]]

Eltartott egy darabig, míg rájöttem, hogy az [[http://tinyurl.com/2b9sow|Adblock Plus]] vidáman kiszűrte a yahoo-s javascripteket. Kiváncsi volnék ki rakta bele az adatbázisban ezeket. Alapvetően a yahoo agyonscriptelt felhasználói felületeit ismerve nem ítélném el azonnal a tettét, de most kis gondot okozott. A probléma felfedezése után persze egyetlen kattintással fel lehet oldani a szűrést, és így minden probléma nélkül létrehozhattam a fotógyűjteményt. Tehát: [[http://www.flickr.com/photos/gbalage/|mindent]] a szemnek!

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:

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.

Java kimenet UTF-8 kódolásban – második felvonás

Ezt nem lehet megunni, újra és újra hasonló problémákba ütközök. Most kivételesen nem parancssorban kellett UTF-8 kimenetet generálnom, hanem a Java 6 beépített HTTP szerveréről a kliens felé adott generált válaszban merült fel ugyanez a probléma. A különös az volt, hogy működött, mindenféle konverzió nélkül, tehát teljesen nyugodt voltam, hogy ez a kódrészletet jól írtam meg. Órákba tellet rájönnöm, hogy ez a feltételezés hibás volt.

Ezt nem lehet megunni, újra és újra hasonló problémákba ütközök. Most kivételesen nem parancssorban kellett UTF-8 kimenetet generálnom, hanem a Java 6 beépített HTTP szerveréről a kliens felé adott generált válaszban merült fel ugyanez a probléma. A különös az volt, hogy működött, mindenféle konverzió nélkül, tehát teljesen nyugodt voltam, hogy ez a kódrészletet jól írtam meg. Órákba tellet rájönnöm, hogy ez a feltételezés hibás volt.

A problémakör egyszerű, bár érdekes. Widget-alapú AJAX-os webalkalmazást fejlesztek az önálló laboromhoz, de erről később. A lényeg az, hogy amikor a felhasználó csatlakozik a szerverhez, az egy generált HTML oldallal válaszol, és minden további feladatra JavaScript kódot küld, amit a kliens lefuttat. A javascript kódban a szövegeket előrelátóan Base64 kódolásban vittem át, így ezekkel probléma nem volt. Nem ez volt a helyzet azonban a generált HTML kóddal. Arra lettem figyelmes, hogy a webalkalmazást megváltoztatva a böngészőben nem jelenik meg semmi..

A helyzet felettébb furcsa volt, a generálás során nem merült fel hiba, sőt, a generált kimenet a szerver oldalon jó volt és az átvitel sem dobott kivételt. A kliens oldalon megérkeztek a fejléc sorai, de nem kapott kimenetet. Nem értettem a problémát, hiszen addig jó volt, és azon a részen nem változtattam. Hosszas próbálgatás és debugolás után rájöttem, hogy a hiba megjelenése erősen korrelál azzal a ténnyel, hogy a generált kimenetben szerepel-e ékezetes karakter. Ekkor merült fel bennem, hogy a probléma a kódolással van.

Tehát, a megoldás az, hogy előkeresem a [intlink id=”556″ type=”post”]korábbi cikkemet[/intlink], és az ott szereplő megoldást extrapolálom az én esetemre. Azaz, amikor a HttpExchange kimeneti adatfolyamát lekérem, egy egyszerű PrintStream helyett a következő módon wrappolom, és a böngészőt is értesítem róla, hogy milyen kódolásban kap adatot:


PrintStream out = new PrintStream(arg0.getResponseBody(),true,"UTF-8");
arg0.getResponseHeaders().add("Content-Type","text/html; charset=UTF-8");

A nagyobbik fejtörést az okozta, hogy még így se működött, a hiba ugyanaz maradt, csak annyi változott, hogy a Web dev toolbar már kijelezte az újonann beadott header sort is. Ekkor megakadt a szemem a következő soron:


arg0.sendResponseHeaders(200, text.toCharArray().length);
out.print(text);

Ezzel ugye elküldöm a kliensnek hibakódot (200 = OK), illetve a küldött tartalom hosszát. Ez automatikusan hozzáad egy “Content-Length” sort a header-ekhez. Amikor ezt írtam, jó ötletnek tünt. De! A java belső UCS kódolásában a karakterek száma nem egyezik meg a byte-ok számával a karakterlánc UTF-8 -beli kódolásában. A megoldás: a sendResponseHeaders() metódus második argumentuma legyen 0. Ez azt jelenti, hogy tetszőleges hosszúságú tartalmat küldhetünk el, a bytesorozat végét az jelzi, hogy bezárjuk a kapcsolatot.

Így tényleg működik. csak az érdekesség kedvéért egy rövid idézet a HttpExchange dokumentációjából:

"If the call to sendResponseHeaders() specified a fixed response body length, then the exact number of bytes specified in that call must be written to this stream. If too many bytes are written, then write() will throw an IOException. If too few bytes are written then the stream close() will throw an IOException. In both cases, the exchange is aborted and the underlying TCP connection closed."

Hogy mi ezzel a probléma? Csak az, hogy a dokumentáció szerint kivételt kellett volna kapnom, amikor úgy zárom le, hogy a küldött byte-ok száma nem egyezik az előre megadottal. Ez viszont nem történt meg, hanem egy furcsa, és visszakövethetetlen hibajelenségbe ütköztem. Talán gyorsabban megtalálom a hibát, ha kapok egy értelmes hibaüzenetet.

Dokumentumszerkesztés, ahogy Balage csinálja

Folytatva Stampie [[http://cubussapiens.hu/node/597|írását]], most szeretném én is a világ elé tárni az eszközök listáját, amely irodai jellegű munkáimat segíti (vagy gátolja, ez nem mindig triviális). A feladataim, melyek ilyen eszközöket követelnek, nagyjából hasonlóak, mint Stampie esetében, házi feladat dokumentációk, ritkán bemutatók egy-egy előadáshoz, illetve táblázatkezelés a pénzügyeim követésére, és néhány egyszeri számítás elvégzésére (ez alatt tipikusan a “mennyit fogok költeni karácsonyra” jellegű kalkulációkra gondolok).

Folytatva [intlink id=”597″ type=”post”]Stampie írását[/intlink], most szeretném én is a világ elé tárni az eszközök listáját, amely irodai jellegű munkáimat segíti (vagy gátolja, ez nem mindig triviális). A feladataim, melyek ilyen eszközöket követelnek, nagyjából hasonlóak, mint Stampie esetében, házi feladat dokumentációk, ritkán bemutatók egy-egy előadáshoz, illetve táblázatkezelés a pénzügyeim követésére, és néhány egyszeri számítás elvégzésére (ez alatt tipikusan a “mennyit fogok költeni karácsonyra” jellegű kalkulációkra gondolok).

Office csomagok

Linuxon nincs sok értelmesnek nevezhető alternatíva, próbálkoztam KOffice-al is, de a funkcionális gyengeségét nem ellensúlyozza a felhasználói felület egyszerűsége. Amit a jelenleg alpha állapotban lévő KOffice2-ről olvastam, a helyzet sokkal jobb lesz, de ebben az állapotban természetesen még nem alkalmas a komoly használatra.

Így jelenleg szinte kizárólagosan OpenOffice-t használok. Az általam ígényelt funkciókat tudja, a beépített PDF export meg biztosítja, hogy bárhol meg tudják tekinteni az alkotásaimat. A képletszerkesztője kifejezetten jó (tudom TeX-es kollegák most köhécselnek..), az ábrakészítője is használható, bár annál megesett, hogy káromkodva bezártam, és elővettem helyette az Inkscape-et, ami kifejezetten nem erre való, de mégis könnyebben megoldottam vele a feladatomat.

Néha felmerül olyan igény, hogy egy dokumentum jó lenne, ha interneten keresztűl megosztható lenne (megfelelő jogosultsággal, nem publikusan). Ekkor veszem elő a Google Docs nevű eszközt, amelyet az egyszerűség kedvéért Prism-ben futtatok. Ezt az eszközt 90%-ban táblázatkezelésre használtam, amivel meg vagyok elégedve, egyszerű formázásokat, és a megszokott parancsokat tudja. A dokumentumszerkesztő részét alig használtam párszor, de azt hiszem nem is fogom, egyszerűen túl keveset tud (egy képet nem sikerült rendesen beillesztenem a szöveg közé).

Egyéb eszközök

Én sajnos nem tudtam még eleget foglalkozni LaTeX-el, így ez nem szerepel a pallettámon, de DokuWiki-t előszeretettel használok. Bár jelenleg nincs összerakva erre offline rendszerem, de tervbe van véve..

Továbbá kiemelném még gyakran használt eszközként a KNotes nevezetű csodát, mely rövid emlékeztetőkre, feljegyzésekre kiválló. Támogat időzített figyelmeztetéseket, illetve opcionálisan RTF jellegű formázást is.

Körülbelül ennyi lenne. Jelenleg ezek az eszközök merülnek fel bennem hasonló feladat felmerülésekor, bár megjegyezném, ezek korántsem elégítik ki maradéktalanul az igényeimet, a közeljövőben (ahogy az időm engedi) szeretnék a témában változtatni, többek között jó lenne összerakni helyi jegyzetelésre egy wiki-t, illetve el kéne kezdenem foglalkozni LaTeX-el is.