Monthly Archives: augusztus 2008

Cross-domain kommunikáció window.name alapon

Egyik projektemben két, nem azonos domainen levő oldal között kellett megoldanom a kommunikációt (egy oldal, és rajta egy iframe). Korábban írtam már egy lehetséges megoldásról, most úgy döntöttem, hogy egy még ismeretlen irányba megyek el, kipróbálva, hogy hogyan is működik a dolog a window.name segítségével.

A window JavaScript objektum name tulajdonságáról beszélünk, mely ezer éve jelen van minden böngészőben, bár csak mostanában sikerült felismerni, hogy ez bizony alkalmas különböző domainek közötti kommunikációra, adatcserére.

Mire jó a window.name?

Alapvetően az adott dokumentum “name” tulajdonsága egy azonosító tárolására szolgál, melynek (legfőképpen) akkor van szerepe, ha egy linknek a target tulajdonságát erre az aznosítóra állítjuk. Ezzel lehet egy linket egy másik frame-ben, iframe-ben megnyitni, vagy egy formot elküldeni.

<a href="http://barthazi.hu/" target="ajfrem"></a>
<iframe name="ajfrem" src="http://webakademia/hu/"></iframe>

Ebben a felállásban, ha a wekakademia.hu oldalon megnézzük a window.name értékét, akkor az “ajfrem” sztringet fogjuk visszakapni. Van azonban a window.name-nek van egy olyan tulajdonsága, mely semmilyen más értékre nem jellemző egy oldalon: böngészőnk bármely ablaka írni és olvasni tudja. Ez adott esetben egy komoly biztonsági rést is jelenthet, tehát csak óvatosan használjuk ezt ki!

Mire jó még a window.name?

Mielőtt nekikezdenénk az eltérő domainek közötti kommunikációnak, megosztok még egy trükköt, mely – főként webalkalmazásoknál, webszolgáltatásoknál – izgalmas lehet.

Amennyiben oldalunkra kívülről mutatnak linkek (akár “sima linkekről”, akár “akciót kiváltó linkekről” – például del.ici.us-nál egy új link hozzáadása – van szó), egy jellemző probléma lehet, hogy akár volt már korábban megnyitva egy ablak erről az oldal, akár nem, egy új ablak (fül) fog kinyílni, ezáltal egyre több ilyen alkalmazásunk lesz nyitva, ami nem mindig szerencsés.

Erre egy ugyan nem 100%-os, de jól működő megoldás lehet, ha az adott oldal betöltődésekor a window.name tulajdonságát valami egyedire (az oldal nevére) változtatjuk, a beágyazható kis badge-inket, egyéb bannereket, linkeket melyek az oldalra mutatnak, azokat pedig egy ugyanilyen értékű target tulajdonsággal látjuk el. Így a korábban már betöltött fülön fognak megnyilni ezek a linkek (vagy ha nem volt nyitva, akkor egy új fog nyílni).

Egy másik érdekes lehetőség a session kezelés, session adatok tárolása lehet, hiszen amikor új oldalt töltünk be az adott ablakba (fülre), akkor a window.name értéke nem változik. Csábító lehetőség, de igen óvatosan kell eljárnunk, hiszen adott esetben ezeket az értékeket bármilyen más oldal ki tudja olvasni. A linket már nem találom, de volt olyan trükk különben, hogy JavaScript kódokat cache-elt a window.name-ben valaki. Ezt hülyeségnek tartom. :)

Hogyan működik a window.name kereszdomaines kommunikáció?

A fentiek után gondolom mindenki érti a koncepciót: egyik dokumentum írja, a másik pedig olvassa a window.name tulajdonságot. A határait ugyan nem teszteltem, de elég nagy mennyiségű adathalmaz belefér, amire figyelnünk kell, hogy sztring alapú tulajdonságról beszélünk, tehát valamilyen módon szerializálnunk kell az átadandó objektumot, ha nem csak egy egyszerű sztringről van szó. Tömb szerű szerializációra kínál lehetőséget egy urlencode-olós megoldás, míg egy másik kiváló lehetőség a JSON használata lehet, mellyel komplex adatokat tudunk átpasszolni két domain között.

A bevezetőmben emlegetett location.hash alapú megoldással szemben, ahol a kommunikáció a weblap URL-jének # utáni részét manipulálva lehetséges, a window.name lehetővé teszi a kétirányú kommunikációt is – ami egy nagy előny lehet, ha megoldásokat keresünk.

A kivitelezés során a legkomolyabb kihívást az jelentette számomra, hogy valahogy hozzájussak a window objektumhoz. Egy oldal, és egy benne levő iframe megoldásnál két lehetőség van ugye, az egyik, hogy az oldal window.name-jén keresztül történik a kommunikáció, a másik pedig hogy az iframe-én keresztül. Ez utóbbi tűnik célszerűnek, tehát a kérdés, hogy hogyan lehet ezt az objektumot megtalálni.

Az érdekes válasz az az, hogy nincs rá szabványos (DOM) megoldás. A legjobb, működő megoldás a frames objektum használata (amivel utoljára akkor találkoztam, amikor még Netscape-re dolgoztam) lehet. Ennél számmal és a frame name tulajdonságával is hivatkozhatunk a frame-ekre, iframe-ekre, Safari alatt a névvel hivatkozás furcsán viselkedett, így szimplán így használtam:

var iframe = frames[0];
if (iframe && iframe.name) {...}

A kommunikáció igen bonyolult protokollját úgy oldottam meg, hogy az iframe betöltődését a name tulajdonságát folyamatos kiolvasással ellenőriztem, s ha egy “READY” jelent meg benne, akkor tudtam, hogy készen áll az iframe az adatok fogadására. Az iframe-ben is ráállítottam egy függvényt setInterval-lal a window.name figyelésére, s ha kapott egy üzenetet és feldolgozta azt, akkor az üzenet törlése után “READY” beállításával tudta visszajelezni, hogy készen áll a következő feladatra.

Alapvetően egész jól, látványosan használatónak tűnik a window.name, rossz tapasztalatom nem igazán volt vele.

Miért hackelünk?

A window.name alapú megoldás – bármilyen irányból nézzük is -, bizony hackelés. Felmerülhet a kérdés, hogy miért nem használunk más eszközt, valami olyat, ami szebben és jobban képes működni. A válasz az, hogy azért, mert ilyen eszköz nincs. A válasz kiegészítése, hogy viszont készül, sőt, egyes böngészőkben már most elérhető.

Éppen vonaton ülök viszonylag korlátos netezési lehetőségekkel, így hirtelen fejből nem emlékszem hogy mely böngészők implementálták már a lehetőséget, de az IE8 és még egy másik (Safari) böngésző rémlik fel szemeim előtt.

Viszont egy ideig ezek még nem lesznek elterjedt böngészők, így ha valamit ma kell megcsinálni úgy, hogy minél több böngészőben működjön, akkor nem tudjuk megoldani, csak hackeléssel – a window.name pedig minden elterjedt, a JavaScriptet értő böngészőben működik.

JavaScript doksi magyarul

Megjöttem az egyhetes bringatúráról, és szembesültem vele, hogy nem lett kevesebb az elolvasandók száma, sőt. Egy már régóta felfedezett, de az olvasási soromban megbúvó gyöngyszemet szeretnék most ajánlani, ráadásul magyarul. Egy e-könyvről van szó, Szabó Attila tolmácsolásában olvashatunk a JavaScript mélyebb lehetőségeiről. Ha már nem tudom végigolvasni, legalább feljegyzem ide a blogba.

Attilával  valahogy elkerültük egymást a weben, csak a Weblaborról ismerem futólag ha minden igaz. Nagyon jó anyagot hozott össze a témában, melyet bátran merek ajánlani a JavaScript iránt érdeklődőknek, főként azoknak, akik a JavaScriptet buta nyelvnek tartják. Kimerítő írása főként a JavaScript OOP-vel kapcsolatos lehetőségeivel foglalkozik, de kitér a láthatóságra, memóriaszivárgásra, és ad több trükköt is JavaScript programozáshoz.

Sokat panaszkodom, hogy magyar nyelven ritkák a mélyebb szakmai anyagok, ezért is örültem meg ennek az írásnak. A mostani álláskeresésem során azt láttam, hogy kifejezetten van kereslet itthon is igazán jó JavaScript programozóra, és elég nehéz olyat találni, aki például kenné-vágná az Attila által említett témakört – így csak javasolni tudom az ezirányú specializálódást, hiszen mind Magyarországon, mind pedig külföldön jól fizető állásokra lehet találni ebben a témában.

Mire figyeljünk a sitebuild során?

Amikor egy weblapot rakunk össze HTML-ben, nem árt kismillió dologra figyelnünk. Másképpen szólva egyre: adjunk ki minőséget a kezeink közül. Hogy mi a minőség, mire kell figyelni, na ezt már nem ilyen egyszerű meghatározni, de legalább van egy jó listánk. Nagyon fontos, hogy ezeket az elemeket nem utólag kell leellenőrizni, hanem folyamatosan az oldal felépítése közben.

A 44 pontból álló listát csak ajánlani tudom, egy jó áttekintést ad. Egy mondatot kiemelnék: az oldal kódja legyen könnyed, tiszta, CSS alapú, hozzáférhető, használható és keresőbarát.

Összefoglalva egy kicsit a lista mondanivalóját, mindenképpen azt tudom javasolni eddigi tapasztalataim alapján is, hogy egy üres vázból induljunk ki, aholis a fejlécben egy az általunk választott, jól validálható DOCTYPE szerepel, használjunk UTF-8 kódolást és ezt a HTML kód elején jelöljük is (ki lehet küldeni HTTP fejlécben is), majd a kódot igyekezzünk átláthatóan tördelni (mind a HTML-t, mind a CSS-t). Lehetőség szerint ne használjunk se inline CSS-t (style tulajdonság), se inline JavaScriptet (script elem). Fejlesztés közben ellenőrizzük mind a HTML, mind pedig a CSS kódot – így az elgépelések is elég jól kijönnek. Ennek kapcsán célszerű a különböző hack-eket minimumra csökkenteni, vagy olyan megoldást választani, ami a validátort nem zavarja.

Az induláskor illik több dolgot eldönteni, például hogy mennyi energiát fordítunk a különböző böngészők támogatására, milyen szinten támogatjuk azokat, milyen szinten támogatjuk a vak, csökkent látóképességű, egyéb problémákkal küzdő felhasználókat, hogy mi a célunk a keresőoptimalizálás kapcsán, s hogy melyik HTML szabványt válasszuk.

A fentiek figyelembe vétele tapasztalataim szerint több ponton is segít az oldal élete folyamán. Egy a validátor szerint kevés hibát tartalmazó oldalban gyorsan és hatékonyan meg tudjuk találni az elgépeléseket ha hozzáfejlesztünk, jellemzően tömör, jól szkinezhető (alternatív megjelenések) oldalt kapunk, mely gyorsabban töltődik be, és a karbantartás is könnyebb, gazdaságosabb lesz.

A lista nem csak felsorolja az egyes elemeket, de 1-1 mondatban meg is magyarázza azokat, illetve további olvasnivalót is kínál a témában.

Au revoir Netvibes, avagy keressünk melót

Úgy alakult hogy a Netvibes Párizsba csoportosítja át a fejlesztőket, én meg hát nem kifejezetten egy párizsi srác vagyok, így szép lassan elválnak útjaink (konkrétan még van vagy két hónap hátra). Ennek kapcsán aktuális lett új kihívások és egyben jövedelemforrás után nézni, melynek a publikus részeit megosztanám, hátha mást is érdekel, illetve mert hátha kapok tippeket, ajánlatokat is.

Ami az eddigi pályámat illeti, az eddigi munkásságom során jellemzően felváltva dolgoztam cégnél irodában, és szabadúszóként itthonról. Cégnél dolgozva is vittem saját bizniszeimet takaréklángra állítva, kiadva másoknak a munkákat, hogy ne maradhassak hoppon, hogy ha kiesik egy nagyobb meló, akkor is nyugiban alhassak. Eddigiekben ez elég jól be is vált. A Netvibesnál dolgozva annyi változott, hogy cégnél, de itthonról dolgoztam, de ettől függetlenül maradt a cégnél dolgozós felállás.

Jelenleg tehát két fő irány van mint lehetőség: az egyik hogy dolgozok megint szabadúszóként, a másik pedig hogy egy újabb cég után nézek, ahol el tudok helyezkedni. Van egy erős múltam és jók a referenciáim, így annyira nem kell aggódnom, de kíváncsian várom, hogy végül hol fogok kikötni. Az egyetlen “gondot” igazából az okozza, hogy vettünk egy házat, így a tartalékaim erősen lenullázódtak, és ez irányban további jelentősebb kiadások is várhatóak (nagyon komoly felújítás). Emiatt a céges irány tűnik célszerűnek. Szóval most meló keresésben vagyok.

“Trükkök”

Amit viszonylag gyorsan megléptem (hmm, a törülköző megszorongatása :D után…), az az volt, hogy szóltam a közelebbi ismerőseimnek hogy ez a helyzet, illetve bevetettem az összes “webkettes” irányt, ami eszembe jutott. Ennek kapcsán kiírtam Twitterre a dolgot, felvettem egy halom ismerőst LinkedIn-en (végre rendbe tettem), illetve Pulse-on, mert az még jól jöhet. Az utóbbi két irányba “spammelés” még hátra van, de egyelőre kivárok. További hasonló lépés volt a Skype-on, és a Netvibes-on történő státusz beállítás, miszerint nyitott vagyok munkák iránt. Ezt abszolút eredményesnek minősítem, többen is megkérdezték, hogy mi a helyzet.

Vezető nagycégek

A Netvibes mellett Európában nagy cégként szóba jöhettek még mint lehetőség: Google, Yahoo!, Opera, MySQL, Drupal/Acquia (mások?). A Microsoft szóba se jött. A MySQL-t eleve kizárnám, mert annyira nem hoznak lázba az ezzel kapcsolatos lehetőségek, sem MySQL adminként/tanácsadóként nem szeretnék dolgozni, sem a MySQL weboldala nem hordoz olyan hatalmas kihívásokat, melyekkel meg szeretnék küzdeni (így meg se néztem, vannak-e nyitott pozíciók). Drupal irányba léptem egy bátortalant, de egyelőre nem szeretnének bővülni JavaScript irányba, így ez nem volt járható út. A Yahoo! helyzete viszonylag bizonytalan, illetve most nem is kerestek olyan fejlesztőt, ami illett volna a profilomba (távmunkában nem tudom, hogy lehet-e náluk fejleszteni). Az Operát illetően úgy tűnik hogy náluk sincs távmunka lehetőség (mondjuk ami érdekes lehet: cseheknél van irodájuk érdekesnek tűnő melóval), kivéve talán Web Evangelist témakörben ami érdekes lenne. De ez egyrészt nagyon sok utazással jár, másrészt pedig perfekt angolnak kéne hozzá lenni, emiatt elvetettem. Végül, de nem utolsó sorban felmerült a Google, de náluk sincsen távmunka lehetőség, illetve a felvételinél erősen az algoritmikus gondolkodást helyezik az előtérbe, én meg abból “kicsit” kiestem, nem akarok a különböző algoritmusokból felkészülni. Dobtam még egy e-mailt az amerikai WordPress-nek, de nem válaszoltak, illetve náluk főként supportos meló lett volna.

Fejlesztőcégek

Rengeteg amerikai, és több nagyságrenddel kevesebb brit céget találtam, ahol az engem legfőképp érdeklő JavaScript vonalon lenne meló. A briteket átböngésztem, de nem találtam olyan érdekes távmunka lehetőséget, mely érdekelne. Magyar cégeket egyelőre nem találtam amik szóba jöhettek volna (itt nem követelmény a távmunka). Ha valaki tud nyitott pozíciót akár itthon, akár külföldön, ne kíméljen. Mondjuk sok céget eleve kizártam jövedelem szempontból.

Európai startupok

Belőlük nincsen sok, konkrétan nem találtam egy olyat sem amit nem ismertem volna korábbról. Egyelőre korábbi ismerettségek merültek fel konkrét lehetőségként – mind a két esetben magyar székhellyel, érdekes kihívásokal. Mellesleg a végén még örülni fogok hogy váltok. :) Itt az a kérdés, hogy konkrétan mi a munka, és hogy ehhez milyen terheltség, jövedelem társul. Ez a hetekben kiderül, és majd dönteni fogok tudni.

Külföld

Ha Párizsba vagy Angliába költöznék, sokkal több lehetőségem lenne.

Párizsban nagyon drága az ingatlanpiac (akár a bérlet, akár a vétel) és annyira nem is tetszett a hely, nem tudom milyen szórakozási lehetőségek vannak. Konkrétan standup comedy-t láttam, de abból egy szót se értenék, meg főként bulikról tudok még. Párizsi kiruccanáskor olyan igazán érdekes lehetőségeket a kollegák sem tudtam ajánlani (múzeumok megvoltak).

Anglia sokkal izgalmasabb lehetőség, szeretem az országot, és ajánlani is tudom. Londonban ott a kismillió színház a mindenféle musicalekkel, és még talán a standup comedy előadásokat is megérteném talán. Az ingatlanpiac itt sem túl barátságos, de itt legalább egyéb dolgok motiválnának. Ez az irány akár még reális is lehetne, de egyrész itthon a család, másrészt pedig az új ház is.

Tovább

Ha kiderül hogy melyik lesz a nyerő cég, jelentkezem. :)