2013. március 27., szerda

Portolják az Unreal Engine-t JavaScript-re


Utána néztem kicsit a technológiának. C/C++ kódot eddig is lehetett JavaScript-re fordítani úgy, hogy lefordítottuk LLVM virtuális gépre, amit Emscripten-el lehet JavaScript-re fordítani. Pár alkalmazást portoltak is már így JavaScript-re. Persze ez azért jelentős teljesítmény romlást is jelent, mivel a JavaScript ugye nem natív kód.

Erre a Google megoldása a NaCl (Native Client), amivel natív kódot futtathatunk a böngészőben. Ez egy JavaScript-től teljesen független saját technológia, tehát a támogatásához külön plugin kell, illetve minden platformra külön kell fordítani (bár ha jól tudom, itt is készül LLVM-es megoldás, amit az adott platformon futtatás előtt fordítanak natív kódra).
 
A Mozilla megoldása (amit most az Unreal Engine-hez is használnak) egy asm.js nevű kiterjesztés a JavaScript-hez. Az asm.js-es kód sima JavaScript, de van benne néhány speciális változó, stb. amit az asm.js-t támogató JavaScript engine-ek jobban tudnak optimalizálni. Ezeknek a változóknak fix típusa van például, így ki lehet pl. hagyni a dinamikus változókat érintő plusz konverziókat, ellenőrzéseket, stb. illetve előre natív kódra lehet fordítani, így nem kell interpreterrel futtatni. Ennek ugye az a nagy előnye, hogy sima JavaScript, nem kell hozzá semmilyen böngésző plugin (mint az NaCl esetén), mégis natívhoz közeli sebességgel fut.

Itt még érdemes megemlíteni szerintem a Dart-ot, ami ugyancsak JavaScript-re fordítható, tehát plugin nélkül is tud futni a böngészőben, de ha a saját virtuális gépben fut, akkor az opcionális típusoknak, SIMD műveleteknek, stb. hála natív kódhoz közeli sebességgel futtathatunk kódot. Mivel a js fordítónak köszönhetően ehhez sem kell külső plugin, ezért ez sokkal inkább tekinthető az asm.js alternatívájának.  

Akármelyik technológiát is nézzük, a lényeg, hogy a webes alkalmazások lassan de biztosan kezdik teljesítményben is felvenni a versenyt a natív alkalmazásokkal.

#blog  

Reshared post from +TechCrunch
To show off what game developers can do with a modern browser & without plugins, Mozilla and Epic teamed up to port Unreal Engine 3 to the web.





Mozilla And Epic Games Bring Unreal Engine 3 To The Web, No Plugin Needed | TechCrunch
TechCrunch is a leading technology media property, dedicated to obsessively profiling startups, reviewing new Internet products, and breaking tech news.

2013. március 26., kedd

Egy nagyon jó előadás Dr

Orosz Lászlótól, ahol Dr. Egely György könyveiről beszél

Az előadás a könyvekben elkövetett hibákról szól. Érdemes megnézni mindenkinek, akit az örökmozgó téma érdekel. Az érdekessége, hogy az előadást Egely is végigülte a hallgatókkal. A végén azért van Egely-től egy ügyes odavágás, amit nem tudott a prof. jól hárítani. Azt remekül megmutatta az előadás, hogy milyen matematikai és fizikai hibákat ejtett Egely (azért Egely zsenialitása mellet szól, hogy ezeket nem mindig könnyű kiszúrni), és ezzel a célját maradéktalanul teljesítette is. Ugyanakkor arra nem kaptunk választ, hogy a jelenségek maguk léteznek-e. Valószínűleg a gyakorlat is a professzort igazolná, de ezt a kérdést valóban csak kísérletekkel lehet eldönteni, ahogyan Egely is felhozta az előadás végén. És ebben a helyzetben tényleg hibás volt a prof. hozzáállása, hogy "Nem kell elvégeznem a kísérletet, a nélkül is le tudom vezetni". A dolognak egyébként könnyen pontot lehetne tenni a végre azzal, hogy Egely-ék hozzák a jelenséget, a prof. a matekot és a fizikát. Elvégzik a mérést, és ha azt prof. magyarázni tudja az eszközkészletével, akkor neki volt igaza, ha nem, akkor Egely-ék valóban találtak valamit. 

Köszönet a linkkért +Krisztián Kovács -nak.

#blog  

Áltudományos mechanika - Dr. Orosz László előadása

2013. március 17., vasárnap

Az ember tragédiája mint Cloud Atlas


Az ember tragédiájából (http://hu.wikipedia.org/wiki/Az_ember_trag%C3%A9di%C3%A1ja - igen igen az a Madách féle még irodalom óráról) kicsit kiszínezve, hollywoodi köntösbe bújtatva szerintem nagyon jó Cloud Atlas szerű filmet lehetne készíteni. A szereplők (Ádám, Éva, Lucifer és pár mellékszereplő) ugyanúgy reinkarnálódnának az egyes korokon át, mint a Cloud Atlas szereplői. Ugyanúgy be lehetne csempészni kis áthatásokat az egyes idősíkok közé, bár igazából ezt nem is kell külön erőltetni, mivel a tézis-antitézis-szintézis folyam önmagában megteremti a síkok egymásra hatását. A Falanszter részt kicsit ki lehetne csicsázni egy valódi jövőbeli világgá repülő autókkal, robotokkal, miegymás. Az űr béli színt valahogy úgy magyarázni, hogy Ádám milliárdosként valami űrbázisra költözik ki, stb. Kéne rajta dolgozni, csiszolgatni kicsit a mai kor szellemének megfelelően, de szerintem zseniális lenne. Megkockáztatom, hogy sokkal jobb, mint a Cloud Atlas (ami amúgy maga sem rossz film), sokkal mélyebb történettel és mondanivalóval. Szinte fáj, hogy ez a film bizonyára nem fog elkészülni ... 

#blog   

jQuery alapok


A jQuery az egyik legelterjedtebb JavaScript programkönyvtár. Rengeteg oldal használja, és sok JavaScript keretrendszer épül rá. A követezőkben nagyon röviden azt szeretném bemutatni, hogy mi is ez a jQuery, miért jó, és mire lehet használni. A leírás olvasása alapvető HTML és CSS és JavaScript ismereteket igényel. Ezekre nem térek majd ki külön, mert nagyon elnyújtaná a bejegyzést.

Ha egy mondatban kellene meghatározni, akkor azt mondanám, hogy a jQuery olyasmi mint a CSS, csak itt nem designt rendelünk az egyes HTML elemekhez, hanem működést. Az elemek kijelöléséhez ugyanazokat a szelektorokat használhatjuk, mint CSS esetén, és az így kijelölt elemeket manipulálhatjuk, eseménykezelőket aggathatunk rájuk, lekérdezhetjük az értéküket, vagy valamilyen más működéssel láthatjuk el. Hamarosan mutatok példákat is, de gyorsan nézzük át, mik ennek az egésznek az előnyei:

- Ahogyan a CSS esetén elválik a design a HTML kódtól, ugyanúgy leválasztható a jQuery segítségével a működés is az elemekről. (Ez véleményem szerint néha hasznos, néha nem, de ebbe most ne menjünk bele.)
-  A jQuery-s működés elrejti előlünk a böngészők közötti különbséget. Amire adott esetben többféle elágaztatott JavaScript-re lenne szükség, az jQuery-ben egyetlen hívással megoldható. A jQuery egyébként (tudtommal) az összes ismert nagy böngészőt támogatja, ide értve a desktop és mobil változatokat is.
- Sok mindent sokkal egyszerűbb megoldani jQuery-ben, mint tiszta JavaScript-ben, ráadásul nagyon egyszerűen lehet hozzá új funkciókat adni pluginek formájában, és rengeteg plugin elérhető hozzá a weben. Köztük olyan komplex dolgok is, mint wysiwyg editor, adattáblák, tree komponens, miegymás.

No, akkor nézzük is, hogy megy mindez a gyakorlatban. Ha jQuery-t szeretnénk használni, akkor ugye egy script tag-el be kell hivatkozni. Ezt két módon tehetjük meg. Vagy letöltjük a jQuery aktuális változatát, és azt használjuk, vagy CDN-ről hivatkozzuk be. A CDN egy fix hely a weben, ahol az aktuális változat megtalálható. A legismertebb ilyen CDN a Google féle (http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js). Ennek az az előnye, hogy innen a böngésző egyszer letölti a JavaScript kódot, és utána cache-eli. Mivel sokan használják így a jquery-t, ezért jó esetben már valószínűleg cache-elve van a böngészőben, így mikor a mi weblapunk töltődik be, ezt már nem kell újra letölteni. Olyan baromi nagy különbség amúgy nincs a két megoldás közt, csak érdekesség.

Ha behivatkoztuk a lib-et, elkezdhetjük használni. Készítsünk egy kis HTML olalt, amin van egy gomb (button tag). Rakjunk erre egy eseménykezelőt, ami klikkelésre kiír valami üzenetet. Ez így néz ki:

$('button').click(function(){
  alert('Hello World');
})

Láthatóan nem valami bonyolult. A jQuery-re a $ fv.-el tudunk hivatkozni, aminek paramétere egy css szelektor. Ezek ugyanazok a jelölések, amit css esetén használunk az elemek kijelölésére. Tehát a $('button') jelen esetben azt jelenti, hogy minden button elem-re vonatkozzon a kijelölés. Ezt ki is próbálhatjuk. Rakjunk be még egy gombot az oldalra. Így akármelyikre gyomunk, meg fog jelenni az alert. A $ jel helyett használhatjuk a jQuery nevet is, de olyat is láttam, ahol jq-t használtak. Tehát a $('button'), a jQuery('button') és a jq('button') ugyanazt jelölik. Ha kijelöltük az elemet, akkor jöhetnek az azon végzett műveletek. Jelen esetben a click, ami egy eseménykezelőt helyez az adott elemre. Most nézzünk egy olyan példát, ahol nem eseménykezelőt rakunk az elemre, hanem valamilyen manipulációt végzünk rajta.

$('button').css('font-weight', 'bold');

Ez a sor az összes gomb font-weight tulajdonságát bold-ra állítja, tehát minden gomb felirata vastagon lesz szedve. A jQuery hívásokat láncolhatjuk is, így:

$('button').css('font-weight', 'bold').click(function() {
  alert('!!!');
})

Persze kettőnél sokkal több hívás is követheti egymást, így egész komplex működéseket egész egyszerűen írhatunk le. Ha egy eseménykezelőben az aktuális elemre akarunk hivatkozni, azt a this kulcsszóval tehetjük meg. A this ez esetben a HTML objektumot jelöli, így ha jQuery-s műveletet akarunk rajta végezni, akkor $()-be kell rakni. Erre itt egy példa:

$('button').click(function() {
  $(this).hide('slow');
});

Ez így annyit csinál, hogy ha megnyomjuk a gombot, akkor szépen animálva elrejti azt. De ez alapján elrejthetünk/megjeleníthatünk komplett formokat, stb.

Eddig ugye minden esetben a gombok mindegyikére vonatkozott az adott művelet. Ha pontosabban ki szeretnénk jelölni a célt, akkor használjuk a szokásos css szelektorokat. Adjunk az egyik gombnak egy 'gomb' class-t. Erre a $('.gomb') -al hivatkozhatunk. Így csak a 'gomb' osztályú elemekre fog hivatkozni az adott hívás. Ha egy adott elemet akarunk kijelölni, akkor adjunk neki valami id-t. Ha 'gomb' id-t adunk neki, akkor a css-hez hasonlóan $('#gomb') -al hivatkozhatunk rá. De persze mennek a bonyolultabb szelektorok is. Pl. az item class-u li elemeken belüli gomb class-u gombok, stb.

Amivel még gyakran találkozni, az a $('document').ready esemény, ami jQuery-ben az onload megfelelője. Tehát amit ide írunk, az akkor fog végrehajtódni, ha már teljesen betöltődött az oldal. Amolyan ökölszabályként elmondható, hogy érdemes a teljes jQuery kódot ebbe írni, valahogy így:

$( document ).ready(function() {
  $('button').click(function() {
    $(this).hide('slow');
  });
  ...
});

Hát, indulásnak kb. ennyi szerintem elég. Rengeteg példát találni weben, és a jQuery honlapján (http://jquery.com/). Igény esetén készülhet hasonló leírás egy egy témáról, de mivel a jQuery eszközkészlete elég szerteágazó, írjátok le, hogy pontosan melyik része érdekel, és ha azzal a résszel kapcsolatban van tapasztalat, azt szívesen leírom.

#blog   #jquery

2013. március 16., szombat

Készítettem egy ilyen kis PHP + AngularJS mintát

Van benne kis PHP, kis AngularJS, kis SQL (SQLite-al), meg egy kis JavaScript. Akit érdekel, Cloud9-en ki tudja próbálni, bele tud nézni a forrásba, esetleg igény esetén kár ki is elemezgethetjük, hogy mi mit csinál. 

Reshared post from +Laszlo Fazekas
PHP messageboard

Kíváncsi voltam, hogy lehet-e csupán +AngularJS használatával "értelmes" üzenőfalat csinálni. Végül is az eredmény egy kis (a sallangot leszámítva 1 fájl) PHP alkalmazás lett. Az üzenetek tárolására sqlite-ot használtam, a szerver oldal PHP, a kliens oldal pedig AngularJS és egy kis AngularUI (csak az animáció miatt). Akit érdekel, klónozza le Cloud9-be (itt van hozzá leírás: https://plus.google.com/115334992192871078712/posts/gxfBQsDEsp4) , és ki tudja próbálni. Ehhez ugye index.php-n nyomjunk egy Run-t, majd két böngészőfülön nyissuk meg az url-t. Ha az egyik oldalon írunk valamit, akkor az a másik oldalon is megjelenik 5mp-es frissítéssel. Nem nagy valami, de a célnak pont megfelel.

Gitub repo: git://github.com/TheBojda/php-messageboard.git

#blog   #php   #angularjs   #angularui  

PHP messageboard


Kíváncsi voltam, hogy lehet-e csupán +AngularJS használatával "értelmes" üzenőfalat csinálni. Végül is az eredmény egy kis (a sallangot leszámítva 1 fájl) PHP alkalmazás lett. Az üzenetek tárolására sqlite-ot használtam, a szerver oldal PHP, a kliens oldal pedig AngularJS és egy kis AngularUI (csak az animáció miatt). Akit érdekel, klónozza le Cloud9-be (itt van hozzá leírás: https://plus.google.com/115334992192871078712/posts/gxfBQsDEsp4) , és ki tudja próbálni. Ehhez ugye index.php-n nyomjunk egy Run-t, majd két böngészőfülön nyissuk meg az url-t. Ha az egyik oldalon írunk valamit, akkor az a másik oldalon is megjelenik 5mp-es frissítéssel. Nem nagy valami, de a célnak pont megfelel.

Gitub repo: git://github.com/TheBojda/php-messageboard.git

#blog   #php   #angularjs   #angularui  

2013. március 15., péntek

Ez nem annyira alap JavaScript, de ha valaki rendelkezik alapvető HTML és JavaScript...

Ez nem annyira alap JavaScript, de ha valaki rendelkezik alapvető HTML és JavaScript tudással (tényleg elég az alap tudás), az már csodákat tud művelni AngularJS segítségével. Ezért gondoltam, hogy érdemes ide is bepostolni.

/cc +Robert Cartman +Nádi András 

Reshared post from +Laszlo Fazekas
AngularJS (1. alapok)

Már egy ideje ígérgetem, hogy írok egy rövid bejegyzést arról, hogy mi is az AngularJS. Amikor elsőnek találkoztam vele, úgy jellemezte valaki a rendszert, hogy ilyen lenne a HTML nyelv, ha most találták volna fel. Tehát felfoghatjuk akár a jelenlegi szabvány felokosításának is.

Kicsit jobban kifejtve az AngularJS egy nagyon szépen megkonstruált MVC keretrendszer. Ez valami baromi misztikus dolognak hangzik, pedig nem az. Az MVC a Model View Controller hármas rövidítése. és mostanában tulajdonképpen szinte minden adatokat kezelő alkalmazás ezt a felépítést használja. Az MVC annyit jelent, hogy az alkalmazást három rétegre osztjuk. Az adattartalomra (model), a megjelenítésre (view), és a működésre (controller). Ezek a rétegek körkörösen hivatkoznak egymásra. Az adattartalmat (model) a view réteg jeleníti meg, ahonnan mindenféle felhasználói események hatására meghívódik valami működés (controller), ami megváltoztatja az adattartalmat, és itt körbe is ért az egész. Talán még így is ködös kicsit az egész, úgyhogy nézzünk egy példát. Egy sima todo listát, ahová új elemeket lehet felvenni, és törölni onnan (mint mondjuk egy bevásárló lista). Itt ugye az adattartalom (model) az a lista, ami a todo elemeket tartalmazza. A view az ezt megjelenítő felhasználói felület. A cotroller pedig az eseménykezelők összessége, tehát hogy mit kell csinálni hozzáadáskor, illetve elem törlésekor. Így már úgy nagyjából talán világos, hogy mi az az MVC, de hogy valósul meg ez AngularJS-ben?

AngularJS-ben a model réteget JavaScript változók adják. Ezek tárolják az adatokat. A view réteget a HTML kód adja, amit az AngularJS saját attribútumokkal egészít ki. Innen jött ugye a bejegyzés elején említett dolog, tehát hogy fel lehet fogni az AngularJS-t a HTML nyelv felokosításának is. Ezek az attribútumok rendelik össze a model-t a view-val (tehát hogy hol milyen adatot kell megjeleníteni), illetve a controllerrel (hogy milyen eseményre mit kell reagálni). A controller réteget JavaScript függvények adják, amik a model réteget adó JavaScript változókat manipulálják, és ezzel teljes is a kép.

Lássunk is pár példát. Ehhez látogassunk el a http://angularjs.org helyre, és tekerjük kicsit le az oldalt a második HTML kódig (az 'Add Some Control' címet keressük). Ez pont az a todo alkalmazás, amit a példában is említettem. Nézzük hogyan is épül fel. Kattintsunk át a todo.js fülre. Itt látunk egy TodoCtrl nevű függvényt (valójában inkább osztály, de JavaScriptben ezek összemosódnak). Ennek van egy $scope nevű paramétere. Ennek részletezésébe most annyira nem akarok belemenni, mert nagyon elnyúlna a bejegyzés, de lényeg, hogy minden változót (model), és működést leíró függvényt (controller) ehhez kell majd hozzárendelnünk. Rögtön a kód elején láthatjuk is a todos változó kezdeti értékének beállítását. Itt a todos változóba két érték kerül, az egyik egy todo elem, ami már le van zárva, a másik pedig egy még nem teljesült todo elem. Az előbbiek fényében már gondolom mindenki tudja, hogy ebben az alkalmazásban ez a todos változó a model réteg szerepét tölti be. A változón túl van még 3 függvény. Ezek képezik a controller réteget. Az addTodo egy új elemet ad a listához, az archive pedig törli a már teljesült elemeket. Hát, a remaining olyan öszvér fajta, mert igaz, hogy függvény, de igazából adatot ad vissza (pontosan azt adja vissza, hogy hány elvégzendő feladat van), amit a felületen kijelzünk, tehát inkább a model rétegbe sorolnám. Most kattintsunk át a html nézetre. Itt láthatjuk a view réteget, és az összerendeléseket, ami az AngularJS igazi ereje. A kód elején van egy ng-app attribútum. Ez minden AngularJS alkalmazás elejére kell, ez jelöli ki azt a részt, ahol a speciális attribútumokat értelmezni kell. Ebben az esetben ez a teljes html kódra vonatkozik. Aztán van két script rész, ahol behivatkozzuk az AngularJS-t magát, illetve a controller-t tartalmazó javascript állományt. Eztán jön egy ng-controller attribútum, mivel az előbb definiált controllert egy html blokkhoz rendeljük. Ha a HTML oldal olyan felépítésű, akkor megtehetjük, hogy egyes részeihez más más controller-t rendelünk, vagy ezeket akár egymásba is ágyazhatjuk, de ilyesmivel most ne bonyolítsuk az életünket. Az ng-controller-es div-en belül vannak {{ és }} jelek közti szakaszok. Ezekkel dinamikus tartalmat illeszthetünk be a HTML kódba, ráadásul nemesen egyszerű módon. Egyszerűen ha itt megadjuk egy $scope-hoz rendelt változó nevét, akkor a rendszer ide behelyettesíti annak tartalmát, illetve ugyanez történik, ha valamilyen függvény hívást írunk a jelek közé (tulajdonképpen ide bármilyen egyszerűbb JavaScript kifejezést írhatunk). Utóbbira példa a {{remining()}} rész, előbbire pedig a {{todos.length}}. Ez tehát egy módja a model bekötésének. Eztán jön egy link ng-click attribútummal. Ez egy szép példa a controller bekötésére. Leírja, hogy egy esemény hatására milyen működésnek kell életbe lépnie. Ha ugye erre a linkre kattintunk (archive), akkor az archive() függvényt kell meghívni a $scope-ból. Eztán jön egy ng-repeat rész, ami megintcsak a  model bekötésének módja. Ez végigszalad a megadott változón, és közben egy másik változó minden körben felveszi az aktuális elem értékét. Itt ugye a todos változón szaladunk végig. Minden körben generálódik egy li elem, és a todo változó felveszi az aktuális elem értékét. A li elemben találunk egy checkbox-ot, amihez ng-model-el van hozzárendelve a todo elem done változója. Míg a {{}} jelek használata egyirányú összerendelés (csak odaírja a rendszer a változó tartalmát), addig az ng-model kétirányú. Tehát egyfelől az elem a változó tartalmának megfelelően viselkedik, másfelől a változó az elem állapotának megfelelő értéket kapja. Olyan mint ha innentől a változó a HTML elem leképződése lenne, ebben az esetben a checkbox-é. Ha a változó értéke változik, változik a checkbox állapota is, illetve ha a felhasználó változtat a checkbox állapotán, akkor változik a változó értéke is. A következő span részben az elem class-ja a todo.done-tól függ. Ez az egyszerű {{}} jeles behelyettesítés. Amire érdemes felfigyelni, hogy az egész dolog teljesen real-time. Tehát mikor beklikkeljük a checkbox-ot, és megváltozik a változó értéke, akkor vele együtt minden változóhoz kötött dolog is változik. Tehát jelen esetben az elem class-a is. Ezt ki is próbálhatjuk, ha jobb oldalon a checkbox-ra kattintunk. Nem kell azzal vesződnünk, mint mondjuk jQuery esetén, hogy a bejelölés eseményre rakjunk egy eseménykezelőt, ami megváltoztatja a másik elem class-át. Ezzel sokkal rövidebb, szebb, és tisztább kódot kapunk. Végül pedig van egy ng-submit eseménykezelő, ami az add gomb megnyomására meghívja az addTodo függvényt, ami berakja az új todo elemet, aminek tartalma az előtte lévő text elemben lévő ng-model attribútumnak hála a todoText változóba kerül.  

Hát, nagyon tömören ennyit akartam írni az alapokról. Az AngularJS nagyon sok mindent tud még ezen kívül. Definiálhatunk modulokat, saját attribútumokat, kommunikálhatunk a szerverrel, stb. de ezeknek már talán érdemes új bejegyzést szentelni. 

#blog   #angularjs  


Embedded Link


AngularJS — Superheroic JavaScript MVW Framework
AngularJS is what HTML would have been, had it been designed for building web-apps. Declarative templates with data-binding, MVW, MVVM, MVC, dependency injection and great ...