Monthly Archives: április 2008

Netvibes Ginger – ajánljatok tartalmat

A Netvibes Ginger változatában (melyre ma lettek átállítva Corianderről azok akik eddig nem váltottak) megváltozott a tartalmi ajánlók módja, és új kategóriák jöttek létre. Szeretném, ha a magyar rendelkezésre álló tartalmak, avagy RSS/Atom hírforrások, UWA widgetek közül a lehető legjobb válogatást kínálná a Ginger, de ehhez segítségeteket szeretném kérni, mert elég nagy valószínűséggel nem ismerek minden kategóriában minden idevágó tartalmat. Az alábbiakban összegyűjtöttem, hogy milyen kategóriák vannak. Ha bármelyik kategóriába ajánlasz akár csak 1 tartalmat is, már az is segítség.

Előbb azonban arról, hogy mit keresek. Kiegyensúlyozott, szélsőségektől mentes, minőségi tartalmakat várok (nem bulvárt), s egy olyan összeállítást ami a népszerűségi arányokat is minél jobban lefedi. Van olyan kategória amibe túl sok elemet tudnék belepakolni, és ezek megszűrése kapcsán kell a segítség, s van olyan, mely esetben jó ha egyet tudok, itt pedig továbbiak hozzáadása miatt. Azt nem tudom megígérni hogy minden ajánlott tartalom bekerül a végén a lecsóba, de igyekezni fogok jól dönteni.

Íme a kategóriák:

  • Legismertebb blogok
  • Hírek
  • Üzlet
  • Sport
  • Zene
  • Művészet és szórakoztatás
  • Technológia
  • Játék
  • Életstílus
  • Eszközök és szolgáltatások
  • Vásárlás
  • Tudomány
  • Oktatás
  • Utazás
  • Szervezetek

Hogy melyik kategóriába mi illik, azt a http://eco.netvibes.com/widgets oldalán a jobb oldali kategóriák végigkattintgatásával lehet a legjobban megítélni.

Netvibes UWA fejlesztés

A Web Konferenciás, Netvibes UWA témakörben tartott előadásom rövidesen elérhető lesz a rendezvény honlapján, de úgy döntöttem hogy egy blogbejegyzés formájában itt is részletesen közzéteszem az ott bemutatottakat. A cél egy az UWA filozófiáját, megközelítését bemutató widget elkészítése volt, melynek során mind AJAX kommunikációt (RSS tartalom lehívás), mind az előre elkészített építőelemek (fülek, lapozó), mind pedig általában egy widget fejlesztését be tudom mutatni. A végeredmény itt érhető el: Indafotó UWA widget.

Indafotó widget a Netvibes Eco oldalán

A Netvibest remélhetőleg nem kell bemutatnom ezen sorokat olvasóimnak, és az előadásom során sem tette fel senki a kezét amikor megkérdeztem, hogy be kell-e mutatnom a szolgáltatást. Annyit szeretnék elmondani mégis, hogy a közhiedelemmel ellentétben a Netvibes nem feedolvasó alkalmazás, nem a hírek, hanem a felhasználót érintő összes webes szolgáltatás egy helyre való összegyűjtésére szolgál, mintegy információs központként. És ennek csak egy része a hírek, blogbejegyzések olvasása. Ugyanígy jellemzően a többi hasonló szolgáltatás célja is az összes információ egy helyre sűrítése.

UWA widgeteket pont ezért kell készítenünk, hiszen míg a nemzetközi oldalak, alkalmazások jól le vannak fedve, addig a hazai és saját fejlesztésű szolgáltatások nyilván kevésbé. A másik fele a dolognak – amiért megéri egy widgetet leprogramozni -, az a “reklámfelület”, avagy annak lehetősége, hogy brandünkkel a felhasználó folyamatosan találkozzon saját oldalán. A widgetek RSS feedekhez történő hasonlítása több ponton is helytálló amikor valaki felteszi a “miért” kérdést.

Térjünk a tárgyra: a Netvibes UWA egy olyan widget fejlesztést megkönnyítő keretrendszer, mely ebbe a folyamatba illeszkedik. Használjon valaki Netvibes-t. iGoogle-t, Live.com-ot, Apple Dashboard-ot, Windows Vista Sidebar-t. Yahoo! Widgeteket (anno Konfabulator), Opera Widgeteket, iPhone-t, vagy akár JBoss-t, egyszeri, egy widget lefejlesztésével, jellemzően a platformok sajátosságainak ismerete nélkül célozhatjuk meg őt, ha ezt a keretrendszert használjuk.

Az UWA azért született meg, mert nem volt de-facto standard szintű megoldás erre a feladatra, jellemzően minden widget szolgáltatás, widget motor, a saját formátumát használta, a W3C ezirányú standardizálási törekvései pedig eléggé le vannak maradva. Az UWA mögött levő rendszer feladata az, hogy az elkészített widgetünket az összes több platform számára “on-the-fly” átkonvertálja, és azokon működővé tegye. Bár mindegyik támogatott platform HTML+CSS+JavaScript megoldást használ, mindegyik például más és más függvénnyel/formátummal oldja meg a(z AJAX) kommunikációt, a beállítások letárolását és hasonlókat.

Egy UWA widget kifejlesztése jellemzően könnyű, mivel jól dokumentált standardokra épít, avagy XHTML, CSS és JavaScript ismerete szükséges a fejlesztéshez. Ezen kívül az UWA környezet számos segítséget is kínál feed feldolgozás, kontrollok, előre létrehozott CSS osztályok segítségével. Egy UWA widget a következőképpen épül fel:

  • Egy statikus, UTF-8 kódolású XHTML fájl, ami egyben valid XML is. Ez adja a widget vázát.
  • Az XHTML alap egy specifikus Netvibes névtérrel egészül ki: xmlns:widget=“http://www.netvibes.com/ns/”
  • Meta leíró elemeket használ a szerző, widget és UWA verzió, az esetleges automatikus frissítések és egyebek leírására.
  • Speciális widget:preferences elem segítségével írhatóak le a widget beállításai.
  • A widget megjelenése CSS segítségével írható le.
  • A widget működését JavaScriptben kell leprogramozni.
  • A widget indulásakor aktuális megjelenést (jellemzően Loading… felirat) pedig a HTML body-jában kell leírni.

A cél

A célunk egy Indafotó albumokat megjelenítő widget létrehozása lesz. A beállítások között felsorolhatunk felhasználóneveket vesszővel elválasztva, s az ezekhez a felhasználókhoz tartozó legfrissebb képeket jelenítjük meg füleken. A fülek neve az adott felhasználó azonosítója, a fül tartalma pedig x darab kép lesz, mely lapozható. Ehhez az Indafotó RSS interfészét fogjuk felhasználni.

Konkrét tippeket az UWA fejlesztéssel kapcsolatosan ennek az írásnak a végén fogok megosztani, például azzal kapcsolatosan is, hogy pontosan milyen fejlesztői környezetben érdemes elkezdeni kifejleszteni egy widgetet, most viszont szeretném bemutatni azt, hogy hogyan épülhet fel, és hogyan működhet az előbb felvázolt widget.

Az első lépések

Első lépésként hozzuk létre a widget vázául szolgáló XHTML dokumentumot, és indulásként jelenítsünk megy egy fotót, alatta pedig egy tájékoztató szöveget.

A váz így fog kinézni:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:widget="http://www.netvibes.com/ns/">
<head>
<title>Indafotó</title>
<meta name="author" content="András Bártházi" />
<meta name="version" content="1.0" />
<meta name="apiVersion" content="1.0" />
<meta name="autoRefresh" content="20" />
<link rel="icon" type="image/x-icon" href="http://indafoto.hu/favicon.ico" />
<link rel="stylesheet" type="text/css" href="http://www.netvibes.com/themes/uwa/style.css" />
<script type="text/javascript" src="http://www.netvibes.com/js/UWA/load.js.php?env=Standalone"></script>
<style type="text/css">/*<![CDATA[*/
/*]]>*/</style>
<script type="text/javascript">//<![CDATA[
// ]]></script>
</head>
<body>
<p>Loading...</p>
</body>
</html>

Remélhetőleg egy a HTML-t ismerő személy számára semmilyen újdonságot nem mutattam itt most be ezzel a forráskóddal. Ami UWA specifiku, az a szerzőt, a widget verziószámát, az UWA (API) verziószámát) és az automatikus frissítési időt leíró meta elemek. A belinkelt favicon a widget ikonja lesz, a belinkelt CSS és JavaScript pedig az úgynevezett Standalone módban történő működtetésért és megjelenítésért felelős kódokat tölti be. Egy UWA widget többféle körülmények között megjelenhet, az egyik ilyen “körülmény” a Standalone mód, amikor egy web böngészőben nyitjuk meg minden direktben az UWA forrást. Ezt a két sort nem kötelező betenni, de csak nyerünk vele, ha benne lesz az oldalban.

Van egy-egy üres CSS és JavaScript kódrész is – ezekbe fogjuk írni a konkrét kódunkat. Végül, de nem utolsó sorban egy HTML BODY rész jön, amiben egyelőre egy Loading… üzenetet helyeztünk el. Ide a widget funkcióinak függvényében komolyabb HTML-t is lehet rakni, ez az a HTML rész, mely egyből megjelenik. Adott esetben olyan widgetet is készíthetünk, mely nem tartalmaz semmilyen JavaScript-et sem, hanem csak egy HTML-ből áll, például ha egy képet, Flash fájlt szeretnénk csak megjeleníteni.

Egy widget jellemzően különböző eseményeket kezel le. A legfontosabb esemény az onLoad, ez a widget betöltődésekor történik, és ennek az eseménynek a hatására kell beindítanunk a widget működését. Egy esemény lekezelése a megfelelő függvény létrehozásával történik. Indulásként a widget betöltődésekor hívjunk meg egy olyan függvényt, mely megjeleníti a kép és üzenet párost:

widget.onLoad = function() {
	Indafoto.showMessage();
}

És készítsük is el ezt a függvényt:

var Indafoto = {}; 
 
Indafoto.showMessage = function() {
	widget.body.innerHTML =
		'<p><a href="http://indafoto.hu/boogie/image/85596-84fb74c7" target="_blank">' +
		'<img src="http://img2.indafoto.hu/4/9/759_2b3bf3eee2475e03885a110e9acaab61/85596_84fb74c738fba9b5ccd963e4d9da79db_m.jpg" width="100%"/>' +
		'</a></p>' +
		'<p>A widget tartalmát a Beállítások között tudod beállítani. Az "Elemek" értékhez Indafotó felhasználók azonosítóját írhatod be, vesszővel elválasztva.</p>' +
		'<p>Például: <strong>boogie,eszpee,blumi,darthwalk,tschoppy,dtamas</strong></p>' +
		'<p>Fedezd fel az <a href="http://indafoto.hu/">Indafotót</a> további azonosítókat illetően!</p>';
}

Az első sor egy Indafoto nevű objektumot hoz létre. Célszerű az összes függvényünket egy a widget nevével megegyező objektumba pakolni, átláthatóbb, rendezettebb lesz a kód.

Ezután definiáljuk a függvényt, mely a widget tartalmát fogja beállítani. A kulcs a widget.body nevű változó, mely mindig azt a “div”-et tartalmazza, ami a fenti XHTML forrásban a <body> résznek felel meg, a document.body analógiát fedezhetjük itt fel. Ennek a div-ek a tartalmát esetünkben az innerHTML segítségével volt a legegyszerűbb beállítani.

Itt tartunk:

Neki is állhatunk

A következő feladat, és innen már meg sem állunk a végleges widgetig, a widget beállításainak leírása. Ehhez a fejlécbe kell tennünk egy <widget:preferences> részt (én a stíluslap elé szoktam tenni), mely ezt írja le:

<widget:preferences>
  <preference name="title" type="text" label="Cím" defaultValue="Indafotó" />
  <preference name="tabs" type="text" label="Elemek" defaultValue="" />
  <preference name="nbTitles" type="range" label="Db" defaultValue="10"
	step="1" min="1" max="30" />
</widget:preferences>

A különböző beállítási lehetőségeket itt most nem mutatom be, itt most két fajtát használtunk: a text és a range típust. Előbbi egy sima input elemet, utóbbi egy select mezőt fog megjeleníteni, esetünkben 1 és 30 közötti számokkal. Kb. így fog megjelenni – persze ez függ attól is, hogy milyen környezetben, milyen témát választottunk éppen:

Figyeljünk arra, hogy túl hosszú címet ne adjunk, hiszen lehet hogy olyan vékony lesz a widget, hogy nem fog tudni megjelenni. Ugyanez igaz a select elemek választási lehetőségeinek szövegére is.

Alakítsuk át az onLoad eseményt lekezelő részt, hogy ha már kitöltésre került az Elemek rész a beállításoknál, akkor ne a tájékoztató üzenetünk jelenjen már meg:

widget.onLoad = function() {
	if (!widget.getValue('tabs')) {
		Indafoto.showMessage();
	} else {
		Indafoto.ids = widget.getValue('tabs').split(/\s*,\s*/);
		Indafoto.initTabs();
	}
}

A beállításokat mint láthatjuk, a widget.getValue függvény segítségével tudjuk lekérdezni. Ha be van állítva már valami, akkor szétvágjuk a szöveget a vesszők mentén (lesz egy tömbünk a felhasználó azonosítókról), és ezt letároljuk egy változóba. Ezután pedig meghívjuk a fülek megjelenítéséért felelős kódrészletet.

Ami itt is van:

Indafoto.initTabs = function() {
	widget.body.innerHTML = '';
	Indafoto.tabs = new UWA.Controls.TabView({
	});
	for (var i=0; i<Indafoto.ids.length; i++) {
		Indafoto.tabs.addTab(i, {text: Indafoto.ids[i]});
	}
	Indafoto.tabs.observe("activeTabChange",
		Indafoto.onTabChange);
	Indafoto.tabs.selectTab(0);
	Indafoto.tabs.appendTo(widget.body);
}

A widget.body.innerHTML rész már ismerős lehet. A fülek létrehozása már érdekesebb, egy előre elkészített UWA kontrolt, a TabView-t fogjuk ugyanis ehhez felhasználni. Miután létrehoztunk ezt a konrolt, hozzáadunk annyi fület, amennyi azonosítót találtunk a beállítások között (a fül felirata a felhasználó azonosítója lesz), beállítjuk, hogy mi történjen ha másik fülre vált a felhasználó, kiválasztjuk az első fület, majd az egész kontrolt hozzáfűzzük a widgetünk tartalmához. A pontos paraméterezésről nem ejtenék szót, az előbb belinkelt oldalon részletes doksi olvasható róla.

Már csak az a kérdés, hogy mi történik ha fület váltunk (illetve amikor megjelenik az első fül induláskor). Erre szolgál a váltáskor meghívott onTabChange függvényünk:

Indafoto.onTabChange = function(tabId, data) {
	Indafoto.data.currentId = tabId;
	Indafoto.data.offset = 0;
	widget.setTitle(widget.getValue('title') + ": " +
		Indafoto.ids[tabId]);
	if (!widget.data[tabId]) {
		UWA.Data.getFeed("http://feed.indafoto.hu/"+Indafoto.ids[tabId]+
		  "/feed", function(data) {
			widget.data[tabId] = data;
			Indafoto.display(data);
		})
	} else {
		Indafoto.display(widget.data[tabId]);
	}
}

A függvény két paramétert kap, az első az éppen újként kiválasztott fül azonosítója, a másik pedig a fülhöz tartozó adatok. Azt kapjuk a gyakorlatban vissza, amit a fülek létrehozásakor, az addTab függvénynek átadtunk. Az offset beállítása a lapozáshoz kell, azt fogja tartalmazni, hogy hányadik elemtől kell megjelenítenünk a képeket.

Ezután a widget.setTitle segítségével beállítjuk a widget fejlécében látható címet, mely a beállításoknál megadott címből, és az aktuális fül címéből fog állni. Ha még nem töltöttük le az adatot, akkor letöltjük, majd ha megérkezett, akkor letároljuk és megjelenítjük, ha pedig már korábbi fülváltás során már letöltöttük, akkor megjelenítjük.

Az AJAX kommunikációra különböző lehetőségeink vannak, ezek közül most az előfeldolgozást is tartalmazó feed lekérést használtuk. Az UWA keretrendszer tartalmaz egy feed előfeldolgozót, ami egységes formátumra hozza az összes ismert formátumot, legyen az RSS valamelyik verziója vagy Atom formátum. Az UWA.Data.getFeed “szokásos” aszinkron módon működik, vagyis a kérést elindítja, és majd ha megjött a válasz, akkor meghív egy függvényt.

A megjelenítésért a display nevű függvényünk fog felelni, melynek egyetlen paramétereként a beérkezett feed tartalmat adjuk át akkor is ha éppen most érkezett, akkor is ha már a cache-nek nevezhető tömbünkben már benne volt.

Ez a függvény így fog kinézni:

Indafoto.display = function(feed) {
	var tabContent = Indafoto.tabs.getTabContent(Indafoto.data.currentId);
	if (!feed) {
		tabContent.innerHTML = '<p>Nem létező azonosító, vagy egyéb hiba.</p>'
	} else {
		tabContent.innerHTML = '';
		var pager = new UWA.Controls.Pager({
			module: widget,
			limit: widget.getValue('nbTitles'),
			offset: Indafoto.data.offset,
			dataArray: feed.items
		});
		pager.onChange = function(newOffset) {
			Indafoto.data.offset = newOffset;
			Indafoto.display(widget.data[Indafoto.data.currentId]);
		}
		var feedList = widget.createElement('ul');
		var j = 0;
		for (var i = Indafoto.data.offset; i < feed.items.length; i++) {
 
			if (j++>=widget.getValue('nbTitles')) break;
 
			var item = feed.items[i];
			var li = widget.createElement('li');
			var a = widget.createElement('a');
			a.href = item.link;
			a.target = '_blank';
			a.desc = item.content.stripTags().truncate(255);
			a.onmouseover = function() {
				UWA.Utils.setTooltip(this, this.desc, 250);
			}
			var img = widget.createElement('img');
			img.src = item.enclosures[0].url;
			a.appendChild(img);
			li.appendChild(a);
			feedList.appendChild(li);
 
		}
		tabContent.appendChild(pager.getContent());
		tabContent.appendChild(feedList);
		tabContent.appendChild(pager.getContent());
	}
}

Ez az eddigi leghosszabb függvényünk, de ez sem igazán bonyolult. Az első sorában a TabView kontrol megfelelő metódusának meghívásával lekérdezzük azt a “div”-et, amibe pakolhatjuk a tartalmat. Ezután megnézzük, hogy sikerült-e megkapnunk a feed tartalmat, ha nem, akkor egy hibaüzenetet jelenítünk meg.

Az ezutáni kód három fő részből áll. Elsőként létrehozunk egy lapozásért felelős Pager kontrolt, majd felépítjük a képekből álló listát, s végül kipakoljuk ezeket a fülbe.

A Pager kontrolt szintén nem fogom most részleteiben bemutatni, jó a doksija. Beállítjuk a fő paramétereit, melyek azt mondják meg, hogy mennyi elem között kell lapozni, egy oldalra mennyi elem jut, stb., utána pedig egy függvény létrehozásával megmondjuk, hogy mi történjen mikor lapozunk.

A képek megjelenítéséhez létrehozunk egy felsorolást (ul) a widget.createElement-tel – ez a document.createElement-hez hasonló függvény -, majd végigmegyünk a feed elemein, és létrehozunk listaelemeket, azokba linkeket, és azokba képeket.

Végül a fül tartalmának elejére és végére betesszük a lapozót, közé pedig a képekből álló felsorolást.

Ezzel készen is lennénk ami a JavaScript kódot illeti, de hogy jól is nézzen ki a képekből álló felsorolás, még adjuk hozzá a következő CSS kódot a widget fejlécében:

.nv-tabContent ul,
.nv-tabContent ul li {
	display: block;
	margin: 5px;
	padding: 0;
	background: none;
}
.nv-tabContent ul li {
	background: #000;
	padding: 1px;
	float: left;
}

És már működik is a widgetünk:

Tippek és trükkök

Összegyűjtöttem pár tippet és trükköt is, melyet nem árt, ha ismerünk ha UWA widget fejlesztésére adjuk a fejünket. Íme:

  • Mindenekelőtt olvasd végig a teljes doksit, és nézzed át a fejlesztői blog bejegyzéseit, különös tekintettel az archívumra. A doksi nem hosszú, de számos további tippet és trükköt sorol fel, kitérve esetleges platform sajátosságokra is. Mindenképpen javaslom ezt a lépést, mert sokkal jobban képbe lehet jönni a lehetőségeket illetően, nem beszélve a példakódokról.
  • Az UWA widgeted különböző böngészőkben, különböző platformokon fog futni. A Netvibes oldalán “bármilyen” böngészővel használhatják, az Apple Dashboardon WebKit, Opera Widgetként Opera megjelenítő motor fogja megjeleníteni. Használj szabványos megoldásokat (XHTML, CSS, JavaScript), melyek mindegyik böngészőben, motorral működni fognak!
  • Az UWA működéséhez főként az szükséges, hogy a feldolgozóscript hozzáférjen a kódunkhoz. Ez akkor lehetséges csak, ha a kódunk valamilyen publikusan elérhető címen, egy webszerveren érhető el. Kivétel a Standalone mód, de azt nem ajánlom fejlesztésre.
  • Az UWA fejlesztést legegyszerűbb élesben végezni. Ehhez látogasd meg a Netvibes oldalát, válaszd ki a tartalom hozzáadását a felső sávból, az Esential widgeteket, majd onnan (lapozás után) az UWA widgetet. A beállítások között add meg a widgeted címét, majd kattintsd be mind a két checkbox-ot: legyen inline is a widget, és tiltsad is le a cache-t. Így a widget refresh gombjának megnyomásával mindig a legfrissebb kódod lesz meg.
  • A widget refresh gombja mindaddig újratölti az egész widgetet számodra, amíg le nem kezeled az onRefresh eseményt. Ezután a teljes oldalt kell újratöltened, ha a widget kódját újra szeretnéd tölteni. Ha már van Netvibes oldalad, hozz létre egy üres, csak a fejlesztett widgetet tartalmazó fület a fejlesztéshez.
  • Minél több dolog kerüljön bele a widgetbe, minél kevesebb információt tölts be. Így lesz gyors a widgeted.
  • Ne használj egyedi id-kat a widgeteden belül, mivel előfordulhat, hogy a widgeted több példányban jelenik megy egy ugyanazon oldalon belül, ekkor pedig ütközés léphet fel az id-kat illetően. Használj class-okat, és a widget.getElementsByClassName(‘class’)[0] formát.
  • A függvényeidet tegyed egy a widget neve alapján elnevezett objektumba, pl. var Widgetem = {}; Widgetem.display = function() {}; Widgetem.hide = function() {}; stb. Így jóval áttekinthetőbb, szebb kódot kapsz, és nem fog semmivel sem ütközni a függvény elnevezésed (ki tudja melyik platform milyen függvényeket használ…)
  • Kódolj angolul, ha segítséget kell kérned, jóval könnyebb lesz kommunikálnod, nem kell még a fordítással is foglalkozni. Jelenleg több külföldi, angolul beszélő fejlesztő van a világon, mint magyar. :)

Linkgyűjtemény

Pár link, melyek segíthetnek a fejlesztés során:

Ginger újdonságok

A Ginger még regeteg mindent fog hozni az UWA kapcsán, de már most elérhető két újdonság:

  • widget.readOnly – ha publikus oldalon jelenik meg a widget, akkor igaz az értéke, különben hamis – publikus oldalon másképp viselkedő widget készíthető segítségével
  • widget.addStar – bármilyen link + szöveg pár hozzáadható a Netvibes hírfolyamhoz is – a Ginger szociális újdonságai kapcsán

Ezeken kívül is készülünk az OpenSocial-lal, és egyéb meglepetésekkel.

Összefoglalás

Nem lett rövid olvasnivaló amit a fentiekben összeszedtem, illetve az előadásomban előadtam, főként akkor, ha még utána is olvasol a lehetőségeknek. Remélem hasznos információkkal bírtam szolgálni, és több magyar UWA widget fog készülni a jövőben.

Web Konferencia 2008 – beszámoló

Kezdem a lényeggel: eddigi legszuperebb Web Konferenciám volt az idei. Jó előadásokat láttam, sikeres előadást tartottam, és valószínűleg az is közrejátszott, hogy idén nem folytam bele annyira a szervezésbe (bár a helyszínen lelkesen keresgéltem a badge-eket a bejáratnál az érkezőknek), így nyugisabb volt a nap ilyen szempontból is. És az előadásom is maradéktalanul elkészült előző éjjel.


A kép a tavalyi Web Konferenciáról származik (Copyright Balogh Tibor), én csak összefirkáltam.

Bert Bos előadásával kezdtem (From level 2 to level 3: advanced layout in CSS), ami jó választásnak bizonyult. Bert Bos rövid bemutatkozójából is kiderül, hogy a W3C szervezésében egy olyan személy látogatott el a konferenciára, aki fontos szerepet tölt be a szabványok alakításában:

Dr. Bert Bos holds a degree in Mathematics (University of Groningen, The Netherlands) and a PhD on Graphic User Interfaces (ditto). He is the co-inventor of CSS (Cascading Style Sheets) and has been a member of several working groups for standardization of Web technologies, including HTML and XML. Currently, he is the chairman of the W3C working group on CSS and W3C Activity Lead for W3C’s MathML working group. He is editor of several (draft) standards related to CSS and MathML.

Az előadó mondjuk úgy, hogy egy kicsit unalmasan, de számomra új nézőpontokat, rendszerezést adva mutatta be a CSS 2 szabvány jelenleg a layoutra vontakozó részeit, illetve amiről az előadása szólt, a CSS 3 idevágó moduljait. A legérdekesebb és sokmindent más nézőpontba helyező megállapítása az volt számomra, hogy mind a jelenleg érvényben levő CSS szabvány bizony 1 oszlopos megjelenítésre lett kitalálva. Az összes többi alkalmazása gányolás (ezt nem ő mondta). Azt sokszor és sok helyen elmondtam már én is, hogy a táblázatok nem layoutra vannak, de végiggondolva a lehetőségeket, a float-os megoldásokról is elmondható, hogy nem az igaziak (azzal együtt, hogy legalább HTML szinten tisztába van rakva a kód).

A CSS 3-nak több modulja is érkezik, mely a layout-tal fog foglalkozni, ezek nem csak bemutatásra kerültek, hanem a lehetőségek adta mértékhez képest megvitatásra is a kérdés-válasz szekcióban – és ez volt a másik fele az előadásnak, amiért érdemes volt ott lenni. Bert tényleg kiváncsi volt a visszajelzésekre, és úgy érezhettük mindannyian, hogy beleszólhatunk a jövő CSS szabványának alakításába (ezt persze a W3C-s levlistákra feliratkozva is lehet). Külön öröm volt számomra, hogy nem volt hülye kérdés a végén, illetve a terem teljesen tele volt.

Farkas István volt a következő előadó, ő a Hackerek reggelije nevet adta az előadásának, és a különböző webes sebezhetőségekkel foglalkozott. Az előadás több szempontból is érdekes volt a számomra. Az egyik, hogy István pár éve a kollegám volt, míg mi PHP-t fejlesztettünk, ő üzemeltette azt, és sokszor húzta a száját és akadt ki (jogosan) bizonyos megoldásokon, melyeket egyedül a határidő és a helyzet indokolt. Jó volt viszonthallani ezeket a szempontokat. A másik, hogy az egyik nemrégiben indult hazai szolgáltatást pont pár napja néztem át XSS problémákat illetően, és István tudott több új lehetőséget is mondani. Az előadása egy kicsit nehezen pörgött fel, de aztán belejött, és úgy érzem jól sikerült. Érdekes, hogy én is ezzel a témával (jóval lightosabban) kezdtem annó a Web Konferenciák elődjéül szolgáló PHP Konferenciás múltamat. Ez az előadás is “teltházas” volt.

Ezeket az előadásokat láttam, a többi időt inkább beszélgetéssel töltöttem, majd megnézem a prezentációk anyagát később. Témájában érdekesnek ígérkezett a mikroformátumokról, az Ext JS-ről és a Rhino-ról szóló, de ezek valószínűleg inkább az alapozást, figyelemfelkeltést, mint a gyakorlati tapasztalatok átadását szolgálták.

Az előadásomról egy külön bejegyzést fogok írni majd valamikor a héten, de a visszajelzések alapján jól sikerült, annak ellenére (?) hogy egy elég tömény anyagot nyomtam le, s kifejezetten programozóknak szánt, a Netvibes és az UWA lehetőségeivel általában tisztában levő előadást raktam össze. Ezúttal kb. félig volt a terem (50-100 fő) amit jó eredménynek értékelek a téma specifikussága kapcsán. A kérdések érdekesek és jók voltak a végén, ebből is remélhetőleg sokan okulhattunk. Gyorsan átnyálazva a papíros kérdőíves visszajelzéseket csupa 4-es és 5-ös értékelést kaptam (5-ös skálán), ami eddigi konferenciáim alapján a legjobb eredmény. Annak az egy főnek, aki 2-est adott, innen üzenem hogy nem értem miért tette. :)

Szép volt, jó volt.

IndaFotó Netvibes UWA widget előzetes

Lassan befejezem a widgetet, melynek a fejlesztését be fogom mutatni a holnapi konferencián. Twitteren felmerült, hogy az Inda/Index fizet-e a fejlesztésért: de nem, ez most nem egy szponzorált widget lesz, hanem a szolgáltatásuk, és annak megújulása kapcsán úgy gondoltam, hogy megérdemelnek ennyi reklámot. Íme két képernyőkép:

Részletek tehát holnap!

Webkonf + UWA + IndaFotó

Holnap Web Konferencia, lassan elkészül a Netvibes UWA-t gyakorlati szempontból bemutató előadásom is, melynek keretében egy IndaFotó widget összeállítását fogom bemutatni.

A tavalyi Web Konferencián, a Meetupon és egyéb platformokon is beszéltem arról, hogy miért jó lehetőség egy cégnek widgeteket fejleszteni, megjelenni a Netvibes Ecosystemen, és egyéb hasonló katalógusokban, a felhasználók információs szolgáltatásainak részeként – illetve tavaly az UWA rendszer alapjait is bemutattam már. Az idei elődás keretében az UWA rendszer filozófiáját szeretném bemutatni egy összetettebb IndaFotós widget kifejlesztése kapcsán.

Last minute kéréseket szívesen fogadok hogy mi, illetve mi ne kerüljön bele az előadásba, igyekszem az információ beszerzésétől, feldolgozásán, átalakításán keresztül a megjelenítéséig, és a widget működtetéséig a főbb dolgokra kitérni, és időt hagyni a kérdésekre is.

Webadmin rövidhírek

Webadmin jellegű rövidhíreink következnek.

MySQL 5.1 Load Balancer

A MySQL hamarosan megjelenő 5.1-es verziója load balancerrel érkezik. Bár jelenleg még csak olvasásra képes eszközről van szó, az irány ígéretes. A fejlesztés abból a szempontból is érdekes, hogy a MySQL Proxyra épül.

10.000 szerver a FaceBook infrastruktúrájában

Az InsideFacebook szerint 10.000 feletti számú szerver szolgálja ki a FaceBook oldalait. Konkrétan:

  • 1800 db MySQL szerver
  • 10.000 db webszerver
  • 805 db memcached szerver

Elég impresszív számok, ezek után az iwiw szervereinek számán ne csodálkozzunk.

Lassan teljesen nyílt forrású lesz a Java

A Yahoo News ír róla, miszerint a Sun a Java további részeit is nyílt forrásúvá teszi. Ez azt fogja jelenteni, hogy a Linux disztribúciók alapból fogják tudni szállítani, a Java futtatására képes gépek (mind a szerver, mind pedig az asztali masinák terén) még nagyobb teret nyernek. Nem tudom, hogy a nyílt forrásnak köszönheti-e a Java, de egyre inkább érett, és a magamfajta scriptnyelv fan számára is elfogadható nyelvvé alakult át az utóbbi időben.

JavaScript és Flash, a két jóbarát

Bár a webfejlesztői körök modern irányzatában népszerűnek mondható az a vélemény, hogy a Flash rossz, a JavaScript jó, sokkal jobb az a megközelítés, mely szerint mind a kettőnek megvan a saját helye, funkciója. Van, amikor együtt, kéz a kézben a leghatékonyabbak. Ezeket a helyzeteket próbáltam meg összeszedni.

Videó és zene

A mai de-facto standard a videólejátszás és zenelejátszás terén a Flash lett. Bár a Silverlight próbál szorongatni, de azért ma még elég kevés jele van annak, hogy ez bármilyen módon sikeres lenne. A Flash jellemzően ezen a téren önálló életet él, de ez nem mindig lesz így, illetve nem mindig célszerű így: a YouTube is lehetővé tette például azt, hogy JavaScriptből vezérelhessük a videólejátszóját, illetve akár kis láthatatlan Flash elemeket használhatunk zenelejátszásra JavaScriptből vezérelve. Kérdésként felmerülhet, hogy miért jó, ha JavaScriptből vezéreljük a videó és/vagy zenelejátszást, a válasz pedig kb. az lehet, hogy így az oldal más részeivel könnyen együttműködő, a webkettes világba jobban illeszkedő Flash objektumot használhatunk.

Vágólap hozzáférés

Míg elvileg lehetőségünk van az operációs rendszer vágólapjának elérésére JavaScriptből, addig pl. a Firefox fejlesztői már rájöttek, hogy annak kiolvasása és akár írása is kellemetlen, s nem túl biztonságos lehet – minden böngészőnél vagy máshogy van ez a lehetőség, vagy pedig nem is lehetséges. A Flash szabadon tudja írni a vágólapot – esetünkben ez egy előnye -, így a böngésző típusától függetlenül használhatjuk erre a célra. S hogy mikor jó, ha a vágólapot írjuk? Példakódok vágólapra másolásánál, egy widget (akár videólejátszó, akár más) beágyazó kódjának másolásánál, vagy pedig akkor, ha egy megosztani kívánt URL-t szeretnénk a vágólapra juttatni.

Feltöltés

Szinte hihetetlen, de még mindig ott tartunk, hogy nem lehetséges a böngészőkben a HTML korlátai miatt egyszerre több fájlt a szerver felé kiválasztani, majd feltölteni egy lépésben. Ekkor jöhet jól a Flash segítsége, mely haladt a korral, és megoldható mind a több fájl kiválasztása, mind pedig ezeknek a szerverre juttatása. JavaScriptből aztán kijelezhetjük azt is, hogy hol tart a feltöltés, illetve a feltöltés végeztével is hajthatunk végre különböző feladatokat.

Perzisztens adattárolás

Míg erre már kezdenek megjelenni a különböző lehetőségek a böngészőkben (lásd Google Gears), addig a legegységesebb megoldást még mindig a Flash tudja nyújtani ezen a téren, bár itt nem korlátlan adatmennyiséget tárolhatunk. Számos oldalnál jól jöhet – például az offline is használható alkalmazások ilyenek – ha helyben, a gépen tárolunk le információkat, beállításokat. Ha a cookie méret már nem elég, akkor jöhet jól a Flash lehetősége.

Grafikonok, egyéb ábrák, kijelzők

Bár ma már SVG/Canvas/CSS/képek segítségével is elég sok minden megoldható, ha valami igazán szépet, dinamikusat és gyorsat szeretnénk, akkor jól jöhet a Flash, mint megjelenítő eszköz. Több grafikon megjelenítő könyvtár is elérhető manapság, melyek hasznosak lehetnek számunkra ezen a téren, és van amelyik támogatja a dinamikus JavaScript manipulációt is, mely segítségével AJAX útján frissen érkező adatokat is dinamikusan tudunk megjeleníteni.

Fotószerkesztés

Bár úgy gondolom, hogy a komplex fotó/kép manipulálásra még nem igazán jó eszköz a böngésző, azért számos kisebb feladatot meg lehet ma már korrektül oldalni akár JavaScript, akár Flash segítségével.

Kommunikáció

A JavaScript a dinamikus kommunikációt iletően alapvetően az AJAX, avagy az XMLHttpRequest lehetőségét kínálja. A Flash ezzel szemben bővebb funkcionaltással bír a kommunikáció területén is, melyek kiegészíthetik, vagy hatékonyabbá tehetik a szerver oldallal történő adatváltást.

Összefoglalás

Ha valamilyen alkalmazási területet kihagytam, szívesen veszem a kiegészítést. Úgy látom, hogy a fenti esetek nagy részénél a Flash behozása az oldalba kényelmesebbé, hatékonyabbá teheti egy oldal használatát, és mivel Flash ma már szinte mindenhol van (főként azoknál, akik fejlettebb alkalmazások használatára igényt tartanak), bátran használhatjuk is azt.

Hírfigyelő – elindult végre

Tegnapi nap folyamán elindult a Hírfigyelő, melyet a legegyszerűbb úgy jellemezni, hogy egy Netvibes klón. Az oldalnak igen-igen kalandos története van (pl. hogy régebbi állapotát a Netvibes jelentkezésemkor használtam fel referenciaként…), de most nem erről szeretnék szót ejteni, hanem arról, hogy mit tud a jelenlegi változat.

A Hírfigyelő jelenlegi állapotában egy olyan hír/feed olvasó alkalmazás, mely dobozok kihelyezésével, akár több fülre szervezésével teszi lehetővé napi híradagunk áttekintését. Bár az oldal még több sebből vérzik (számos kisebb-nagyobb hiba van az oldalon, melyek jelen pillanatban legalább kényelmetlenné teszik a használatot), sikerült egy jól átlátható designnal kijönni, az alap funkciók egyszerűen érhetőek el. A konkrét hibákat most nem kezdem el felsorolni, ezek remélhetőleg előbb-utóbb javításra kerülnek.

Pozitívum az OPML importálás lehetősége, az előre összeállított fülek (nincs Webakadémia! :) ) és az oldal által már ismert források felajánlása amikor elkezdem gépelni egy feed URL-jét. A feedolvasó designmentességét illetően vannak gondjaim, de a feedek közti váltási lehetőség a kenyérmorzsa navigációval szintén jól sikerült. Amit fájlalok, azok az olyan alap funkciók, melyek már elvárhatóak lennének egy ilyen oldaltól 2008-ban, gondolok itt arra, hogy egy adott feed-nél beállítható legyen a megjelenített elemek száma, hogy átírható legyen egy doboz címe, hogy átírható legyen egy feed URL a dobozban. Szintén elég nagy hiányosság az, hogy a dobozokat nem lehet a fülek között ráncigálni – ha rossz fülre vettem fel egy dobozt véletlenül, akkor semmilyen módszer nincs azt áthelyezni. Az a trükk sem segít, hogy fogom és kimásolom a feed URL-jét, mert nem lehet elérni ezt az információt.

Hiányosságként élem meg a fülek helyben történő átnevezhetőségét (a kis prompt ablak 2008-ban már nem trendi), ikonok hozzárendelhetőségét, a fülek számának jelzés nélküli korlátozását. Ha van OPML importja az oldalnak, akkor illendő lenne az OPML exportálást is megoldani. További hiányosságokat a jelen verzióval kapcsolatosan nem igazán tudok felsorolni, mert annyira le lett egyszerűsítve a koncepció, hogy ennek keretében hirtelen más nem hiányzik.

Az oldalon jelenleg csak és kizárólag feedolvasó dobozok kaptak helyet. Ez várhatóan változni fog rövidtávon, és lehetőség lesz saját dobozok lefejlesztésére is külső fejlesztők által, mely a tervek szerint nagyon egyszerűre lesz véve. Az oldal üzemeltetése szempontjából nagyon fontos szempont lehet, hogy mennyire sikerül az egyszerűség megtartása melett a sebességet, terhelhetőséget, biztonságot is megvalósítani – és természetesen tovább fejleszteni új funkciókat bevezetve. A biztonságot illetően már most vannak óriási hiányosságok, reméljük lassan de biztosan ezek is ki lesznek küszöbölve.

Kérdés persze, hogy mennyire van létjogosultsága ma egy ilyen jellegű magyar oldalnak, hogy ha a külföldi megoldások (mint a mintául szolgáló Netvibes) nagyságrendekkel előrébb vannak a felhasználói tábort, funkciókat, lehetőségeket, biztonságot és nem utolsó sorban erőforrásokat (nem 1 fő fejlesztő, hanem 20; több nagyságrenddel nagyobb pénzügyi lehetőségek) illetően. És hozzá kell tenni, hogy jön az IndaStart is, így nem csak külföldi, hanem hazai konkurenciája is lesz az oldalnak, várhatóan nem is akármilyen. Ezzel együtt az alapok jónak tűnnek (és most nem csak a kódra gondolok), sok-sok szorgalommal, munkával azért a helyzet nem reménytelen.

Feedolvasók aránya

Nemrégiben álltam át a Feedburnerre a feed tartalmak kiszolgálását illetően (elvileg akik a régi feed URLekre vannak feliratkozva, ők is az új feed tartalmat kapják), így van már pár napja statisztikám arról, hogy mekkora az egyes feedolvasók aránya a Webakadémián. A dolog azért is aktuális, mivel az Index/Inda hamarosan előáll a saját feedolvasójával IndaStart néven, így egy hónap múlva érdekes lesz megint ránézni hogy mi a helyzet (remélhetőleg mérhető lesz a dolog). Nálad milyen arányú a Netvibes és a Google?

A Google jellemzően az iGoogle és a Google Reader, a Netvibes pedig csak a Netvibes oldalt mutatja: 46%-ot visz el a Google, 36%-ot a Netvibes, a maradék pedig a többi feedolvasóra marad. Az arány persze változik nap-mint-nap, de jellemzően 10% a különbség a kettő szolgáltató között. Az egyéb feedolvasók közül nem nagyon emelkedik ki egy sem.

Update: Teljesen megfelejtkeztem a Hírfigyelőről mint potenciális indulóról – a Hírfigyelő is elindult a napokban.

Firefox 2 – a legnépszerűbb böngésző

A HUP.hu híre szerint Magyarország legnépszerűbb böngészőváltozata a Firefox 2.0, ezzel maga mögé szorítva az Internet Explorer 6-ot (a Firefox összességében még nem szorította maga mögé az Internet Explorer összes változatát, de nem ez a lényeg). Bár a hír a Gemius S. A. felmérésén alapul mely nem feltétlenül fedi le jól a valódi magyar helyzetet, illetve mint tudjuk nem az átlag számít, hanem egy adott oldal látogatói, a hír több szempontból is fontos.

Firefox rulez

Büszkén dobogtatja meg az ember szívét, hogy Magyarország ezzel világelső. Régebben követtem az ezirányú statisztikákat, és bár mindig is jó helyen voltunk (talán harmadik-negyedik), de sohasem voltunk az elsők. A helyzetet úgy gondolom hogy a különböző hazai híroldalaknak is köszönhetjük, ők is számos felhasználóhoz juttatták el az alternatív böngészők hírét. Külön köszönet illeti Tímár Andrást is, akinek nevéhez a Firefox honosítása fűződik, valószínűleg a magyarul megszólaló böngésző is sokat segített az eltejedtségben.

A HUP.hu híre is beszámol róla: a helyzet jó, az Internet Explorer bár csökönyösen tartja magát a Microsoft hihetetlenül rossz szoftverpolitikájának köszönhetően, látszik hogy elég erősen kihalásra van ítélve, és a Firefox is tovább fogja növelni a részesedését (ami azért jó, mert egy a szabványokat illetően gyors fejlődésen áteső böngészőről beszélünk). Az Internet Explorer 8 már egy kiegyenlített böngészőpiacra fog érkezni, mely remélhetőleg további fejlesztésre, a szabványokhoz minél jobban igazodásra fogja a Microsoftot a továbbiakban is kényszeríteni. Személy szerint remélem, hogy az IE6-nak innentől már csak az igen meredek lejtő maradt. A Firefox 3.0 pedig jön, jön, jön!