<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));

var pageTracker = _gat._getTracker("UA-6416398-1");
pageTracker._trackPageview();
</description><title>labs.prasa.sk</title><generator>Tumblr (3.0; @labs-prasa-sk)</generator><link>http://labs.prasa.sk/</link><item><title>Nepoužívané triedy smrdia</title><description>&lt;p&gt;Stovky tried, desiatky mených priestorov, triedy s podobným menom, niekoľkokrát prepísané triedy a nahradené novými. Manažmentom zrušené celé časti aplikácií hnijúce na miestach, ktoré developeri zďaleka obchádzajú? Je čas opäť upratať ten bordel v projekte.&lt;/p&gt;

&lt;p&gt;Začnime s nepoužívanými triedami. Ako ich zistiť? PMD je na túto úlohu prikrátke — vie zistiť len nepoužívané privátne funkcie.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://flexamphetamine.blogspot.com/2010/02/finding-unused-classes-with-mxmlc.html"&gt;Jono Spiro&lt;/a&gt;, chalan ktorý kedysi pracoval na mxml kompilátore, navrhuje použiť nedokumentovaný parameter kompilatora &lt;code&gt;--keep-generated-signatures&lt;/code&gt; spolu s &lt;code&gt;-incremental&lt;/code&gt; parametrom. Tato kombinácia vygeneruje signatúry všetkých tried do adresára &lt;code&gt;generated-signatures&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Signatúry sú súbory (*.sig) vytvorené z verejných tried, ktoré obsahujú zoznam funkcií, atribútov, importov, metadát atď. a ktoré môžu mať závislosti na iných triedach. 
Ak sa teda signatúra pre niektorú z tried nevygeneruje, trieda sa nepoužíva. Rozdielom zoznamu signatúr a zoznamu tried budú nepoužívané triedy:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;import os, fnmatch

def find_files(path, patterns=(".txt",)):
    found = []

    for root, dirs, files in os.walk(path):
        for pattern in patterns:
            for filename in fnmatch.filter(files, pattern):
                relative_path = root.split(path)[1]
                found.append(os.path.join(relative_path, filename))

    return found

def find_unused_classes():

    all_sources = find_files(r'e:\path\to\src\\', ('*.as','*.mxml'))
    sources = (file.replace(os.sep, '_') for file in all_sources)
    signatures = find_files(r'e:\path\to\src\generated-signatures\\', ('*.sig',))

    diff = []

    for source in sources:
        splitted = source.split('.')
        transformed = splitted[0]

        if splitted[1] == 'mxml':
            transformed += '-generated.sig'
        else:
            transformed += '.sig'

        if transformed not in signatures:
            print '', source
            diff.append(source)

    return diff

garbage = find_unused_classes()
&lt;/code&gt;&lt;/pre&gt;</description><link>http://labs.prasa.sk/post/4256970551</link><guid>http://labs.prasa.sk/post/4256970551</guid><pubDate>Fri, 01 Apr 2011 14:26:54 +0200</pubDate><category>as3</category><category>classes</category><category>unused</category><category>python</category><dc:creator>pink-fu</dc:creator></item><item><title>Integračné peklo</title><description>&lt;p&gt;Pripájam pár slajdov prezentovaných na &lt;a href="http://goo.gl/pnXZV"&gt;novembrovom stretnutí AUG&lt;/a&gt;. Vtipnú as3 aplikáciu (&lt;a href="http://smileapp.googlecode.com/"&gt;SmileApp&lt;/a&gt;) sme  priamo počas prednášky úspešne nasadili na &lt;a href="http://hudson.sinusgear.com/job/smileapp/"&gt;hudsona&lt;/a&gt;.&lt;/p&gt;

&lt;iframe src="https://docs.google.com/present/embed?id=dhst7965_237c95jsgfq" frameborder="0" width="410" height="342"&gt;&lt;/iframe&gt;</description><link>http://labs.prasa.sk/post/1717652797</link><guid>http://labs.prasa.sk/post/1717652797</guid><pubDate>Sun, 28 Nov 2010 21:17:45 +0100</pubDate><category>as3</category><category>ci</category><category>hudson</category><category>flash</category><dc:creator>pink-fu</dc:creator></item><item><title>Adobe UG Slovakia, meeting - 25.11.2010 - 17:00</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_lbvbvg6KqR1qe34upo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Adobe UG Slovakia, meeting - 25.11.2010 - 17:00&lt;/p&gt;</description><link>http://labs.prasa.sk/post/1570643694</link><guid>http://labs.prasa.sk/post/1570643694</guid><pubDate>Sun, 14 Nov 2010 10:33:14 +0100</pubDate><category>skaug</category><category>adobe</category><category>meeting</category><dc:creator>pink-fu</dc:creator></item><item><title>CPD, Copy Paste Detector</title><description>&lt;p&gt;&lt;a href="http://labs.prasa.sk/view/pmd-project-mess-detector/"&gt;Predošlý článok&lt;/a&gt; obsahoval krátke zhrnutie nástroja na detekciu špiny v kóde. Project Mess Detector (PMD) detekuje rôzne druhy špiny, od malej, cez stredne veľkú až po hrubú špinu. Jeho kolega Copy Paste Detector (CPD) je tiež kus dobrého nástroja. CPD detekuje duplicitný kód &lt;a href="http://pmd.sourceforge.net/cpd.html"&gt;[1]&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Čo je to duplicitný kód?&lt;/h2&gt;

&lt;p&gt;Úsek kódu, ktorého výskyt v množine zdrojového kódu je väčší ako jedna nazývame duplicitný kód. Názory sa rôznia &lt;a href="http://www.codinghorror.com/blog/2009/04/a-modest-proposal-for-the-copy-and-paste-school-of-code-reuse.html"&gt;[2]&lt;/a&gt; avšak vo všeobecnosti sa duplicitný kód považuje za nežiadúci &lt;a href="http://en.wikipedia.org/wiki/Code_smell"&gt;[3]&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;copy paste code means copy paste bugs&lt;br/&gt;
  neznámy autor&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;Ako vzniká duplicitný kód?&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Copy_and_paste_programming"&gt;Copy and paste programming&lt;/a&gt; - spôsob programovania, ktorý za sebou zanecháva často sa opakujúci kus kódu vytvorený technikou Copy/Paste. &lt;/li&gt;
&lt;li&gt;Vývojár nezávisle a nič netušiac napíše kód podobný tomu, ktorý už niekde v zdrojovom kóde  existuje.&lt;/li&gt;
&lt;li&gt;Plagiátorstvo, kedy sa kód kopíruje bez autorovho súhlasu &lt;a href="http://en.wikipedia.org/wiki/Duplicate_code"&gt;[4]&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Aké sú dôsledky?&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Zrozumiteľnosť kódu:&lt;/strong&gt; kopírovanie zvyčajne vytvára dlhé, opakujúce sa úseky kódu, ktoré sa líšia pár riadkami alebo len pár znakmi. Pochopiť takýto kód je časovo a kapacitne náročnejšie.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maskovanie skutočného účelu:&lt;/strong&gt; opakovanie prevažne identických častí kódu skrýva rozdiely medzi nimi a teda ich skutočný účel. Často sa rozdiel nachádza napr. len v hodnote parametra.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Údržba kódu:&lt;/strong&gt; každý duplikát musí byť aktualizovaný zvlášť, čo má za následok zvýšenie výdavkov za udržiavanie softvéru. Pri najlepšom, čas údržby kódu a testovania je vynásobený počtom duplikátov. V najhoršom prípade prehliadneme niektoré duplikáty a chyby ktoré by mali byť opravené hnijú na svojich miestach mesiace až roky &lt;a href="http://en.wikipedia.org/wiki/Duplicate_code"&gt;[4]&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;duplicitný kód = cesta do pekiel&lt;br/&gt;&lt;a href="http://georgik.sinusgear.com/"&gt;Juraj Michálek&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;FlexCPD&lt;/h2&gt;

&lt;p&gt;Copy/Paste detektor a FlexPMD slovník tvoria spolu nástroj FlexCPD určený na detekciu duplicitného as/mxml kódu. FlexCPD sa podobne ako FlexPMD spúšťa cez príkazový riadok, ako Ant target, Maven alebo priamo z IDE (Eclipse) &lt;a href="http://opensource.adobe.com/wiki/display/flexpmd/FlexCPD"&gt;[5]&lt;/a&gt;. FlexPMD a FlexCPD tvoria skvelú dvojku pri pátraní po menej kvalitnom či duplicitnom kóde.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9ro1hkaQ81qzrj2t.png" alt="Spustenie FlexCPD z IDE."/&gt;&lt;em&gt;Spustenie FlexCPD z IDE.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Výstupom FlexCPD je XML súbor interpretovaný či už cez IDE alebo pomocou nástroja kontinuálnej integrácie.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9ro1zpnbq1qzrj2t.png" alt="Výsledky vyhľadávania duplicitného kódu."/&gt;&lt;em&gt;Výsledky vyhľadávania duplicitného kódu.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9ro2lZM301qzrj2t.png" alt="Historický report duplicitného kódu pomocou kontinuálnej integrácie"/&gt;&lt;em&gt;Historický report duplicitného kódu pomocou kontinuálnej integrácie (hudson)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Citácie:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;[1] &lt;a href="http://pmd.sourceforge.net/cpd.html"&gt;http://pmd.sourceforge.net/cpd.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[2] &lt;a href="http://www.codinghorror.com/blog/2009/04/a-modest-proposal-for-the-copy-and-paste-school-of-code-reuse.html"&gt;http://www.codinghorror.com/blog/2009/04/a-modest-proposal-for-the-copy-and-paste-school-of-code-reuse.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[3] &lt;a href="http://en.wikipedia.org/wiki/Code_smell"&gt;http://en.wikipedia.org/wiki/Code_smell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[4] &lt;a href="http://en.wikipedia.org/wiki/Duplicate_code"&gt;http://en.wikipedia.org/wiki/Duplicate_code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[5] &lt;a href="http://opensource.adobe.com/wiki/display/flexpmd/FlexCPD"&gt;http://opensource.adobe.com/wiki/display/flexpmd/FlexCPD&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Literatúra:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Copy_and_paste_programming"&gt;http://en.wikipedia.org/wiki/Copy_and_paste_programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.secretgeek.net/open_code_sharing.asp"&gt;http://www.secretgeek.net/open_code_sharing.asp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codinghorror.com/blog/2007/03/curlys-law-do-one-thing.html"&gt;http://www.codinghorror.com/blog/2007/03/curlys-law-do-one-thing.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Pre fajnšmekrov:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;The Karp-Rabin string matching algorithm, &lt;a href="http://www.itl.nist.gov/div897/sqg/dads/HTML/karpRabin.html."&gt;http://www.itl.nist.gov/div897/sqg/dads/HTML/karpRabin.html.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>http://labs.prasa.sk/post/1241178422</link><guid>http://labs.prasa.sk/post/1241178422</guid><pubDate>Thu, 09 Sep 2010 11:33:00 +0200</pubDate><category>flash</category><category>flex</category><category>air</category><dc:creator>pink-fu</dc:creator></item><item><title>PMD = Project Mess Detector</title><description>&lt;p&gt;Napísať a udržiavať kus softvéru je náročná úloha. Každý vývojár zvykne mimovoľne robiť chyby. Zvyčajne sú to malé preklepy, ktoré odchytí kompilér, avšak ostatné chyby možu ostať neodhalené až do momentu nasadenia aplikácie v produkčnom prostredí. Okrem následkov zlyhania aplikácie, softvérové defekty nesú so sebou aj podstatné finančné náklady na svoje odstránenie. Jednou z možností ako predísť defektom je včas ich odhaliť.&lt;/p&gt;

&lt;p&gt;PMD je nástroj, ktorý skenuje zdrojový kód a hľadá v ňom možné problémy ako:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;nevhodný dizajn - prázdne &lt;em&gt;try—catch—finaly/switch&lt;/em&gt; bloky …&lt;/li&gt;
&lt;li&gt;mŕtvy kód - nepoužívané lokálne premenné, parametre a privátne metódy …&lt;/li&gt;
&lt;li&gt;neoptimálny kód - nové inštancie v slučkách …&lt;/li&gt;
&lt;li&gt;prekomplikované výrazy - nepotrebné &lt;em&gt;if&lt;/em&gt; výrazy, vnorené &lt;em&gt;for&lt;/em&gt; cykly …&lt;/li&gt;
&lt;li&gt;duplicitný kód - copy-paste kód znamená copy-paste bugs&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;
  &lt;p&gt;Podľa tvorcov PMD skratka nemá žiadny &lt;a href="http://pmd.sourceforge.net/meaning.html"&gt;význam&lt;/a&gt;, ale minimálne jedna výstižná sa nájde: “Project Mess Detector”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;Prečo používať PMD?&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;S PMD dokážeme posúdiť kvalitu kódu na základe jednoduchých pravidiel.  Ako povedal &lt;a href="http://en.wikiquote.org/wiki/Tom_DeMarco"&gt;Tom DeMarco&lt;/a&gt;, “nevieme kontrolovať to čo nevieme merať”. &lt;/li&gt;
&lt;li&gt;Nielen junior vývojári majú svoje drobné “zlozvyky”. PMD včas odhalí nevhodný dizajn kódu a pomože nám túto úlohu zautomatizovať.&lt;/li&gt;
&lt;li&gt;PMD vie či vývojári dodržiavajú interné code guidelines a dohodnuté štandardy.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;FlexPMD&lt;/h2&gt;

&lt;p&gt;FlexPMD je klon PMD určený pre ActionScript 3 a MXML. Okrem všeobecných PMD pravidiel obsahuje pravidlá špecifické pre Flex SDK, Cairngorm, AsDocs, MXML, Bindings, CSS, Events atď.
FlexPMD sa dá spustiť napríklad z príkazovej riadky, Ant skriptu, Eclipse, z Mac OSX Automator alebo Maven-om (&lt;a href="http://opensource.adobe.com/wiki/display/flexpmd/How+to+invoke+FlexPMD"&gt;http://opensource.adobe.com/wiki/display/flexpmd/How+to+invoke+FlexPMD&lt;/a&gt;).
Výsledný report s porušeniami pravidiel (súbor vo formáte XML) sa dá interpretovať viacerými spôsobmi (&lt;a href="http://opensource.adobe.com/wiki/display/flexpmd/How+to+interpret+results"&gt;http://opensource.adobe.com/wiki/display/flexpmd/How+to+interpret+results&lt;/a&gt;):&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9rnrqZnjs1qzrj2t.png" alt=""/&gt;&lt;em&gt;priamo v Eclipse prostredí,&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9rns64Hd01qzrj2t.png" alt=""/&gt;&lt;em&gt;v Hudson-e&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9rnsjZ3bf1qzrj2t.png" alt=""/&gt;&lt;em&gt;alebo v prehliadači (&lt;a href="http://opensource.adobe.com/svn/opensource/flexpmd/bin/flex-pmd-violations-viewer.html"&gt;http://opensource.adobe.com/svn/opensource/flexpmd/bin/flex-pmd-violations-viewer.html&lt;/a&gt;).&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;Best practices&lt;/h2&gt;

&lt;h3&gt;Zvoľte si pravidlá, ktoré vám vyhovujú&lt;/h3&gt;

&lt;p&gt;Povolenie všetkých pravidiel spôsobí vytvorenie obrovského reportu, z ktorého veľké množstvo porušení aj tak nebude dôležitých. Prehrabávanie sa tisíckami riadkov reportu pre pár výnimiek asi čoskoro prestane baviť. Začnite s bežnými kategóriami pravidiel a neskôr pridávajte ďalšie. Šikovný nástroj od Adobe vypľuje naklikaný RuleSet: &lt;a href="http://opensource.adobe.com/svn/opensource/flexpmd/bin/flex-pmd-ruleset-creator.html."&gt;http://opensource.adobe.com/svn/opensource/flexpmd/bin/flex-pmd-ruleset-creator.html.&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Používajte IDE plugin&lt;/h3&gt;

&lt;p&gt;Používať PMD v IDE je príjemnešie ako prepínať medzi HTML reportom a IDE tam a späť. Vo väčšine IDE, klik na výnimku v reporte spôsobí skok na konkrétny problémový riadok v kóde.&lt;/p&gt;

&lt;h3&gt;Nesnažte sa dosiahnúť 0 výnimiek&lt;/h3&gt;

&lt;p&gt;Snahou nie je dosiahnúť prázdny report, ten má len Chuck Norris. Vždy budú existovať v projekte výnimky, ktoré pravidlá porušia.&lt;/p&gt;

&lt;h2&gt;Literatúra:&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;PMD, &lt;a href="http://pmd.sourceforge.net/"&gt;http://pmd.sourceforge.net/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;FlexPMD, Adobe, &lt;a href="http://opensource.adobe.com/wiki/display/flexpmd/FlexPMD"&gt;http://opensource.adobe.com/wiki/display/flexpmd/FlexPMD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hudson, &lt;a href="http://hudson-ci.org/"&gt;http://hudson-ci.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Improving Project Quality with PMD, Tom Wheeler, &lt;a href="http://jnb.ociweb.com/jnb/jnbJun2004.html"&gt;http://jnb.ociweb.com/jnb/jnbJun2004.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>http://labs.prasa.sk/post/1230309169</link><guid>http://labs.prasa.sk/post/1230309169</guid><pubDate>Wed, 04 Aug 2010 22:24:00 +0200</pubDate><category>flash</category><category>flex</category><category>air</category><category>hudson</category><category>pmd</category><dc:creator>pink-fu</dc:creator></item><item><title>Jednotné nastavenia mxmlc kompilátora</title><description>&lt;p&gt;Nastaviť mxmlc kompilátor pri novom projekte na prvý krát správne sa mi ešte nikdy nepodarilo. Vždy chýbal nejaký parameter alebo som jeho hodnotu zle zapísal.&lt;/p&gt;

&lt;p&gt;Kedysi moje nastavenie vyzeralo nejako takto:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-locale en_US&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Po čase sa rozrástlo na:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-locale en_US -keep-generated-actionscript -incremental -optimize=false 
-keep-as3-metadata+=Collaborative,Keywords 
-define=APPLICATION::debug,true -define=APPLICATION::release,false
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vynásobím si počet zmien za rok krát počet vývojových strojov, prirátam jeden integračný server a dostanem desiatky úprav kompilačných argumentov, desiatky duplicitných informácií, ktoré sú roztrúsené po celom development department. Každá ďalšia zmena mi pripomína, že musím napísať e-mail s oznamom o zmene, že na polovici strojov to budem musieť prísť upraviť osobne a ešte sa prihlásiť na server, nájsť všetky miesta v ant-ových skriptoch kde sa nastavujú ďalšie kompilačné parametre (unit-testy, mapy pokrytia …). Pri najlepšom je to pár hodín roboty.&lt;/p&gt;

&lt;p&gt;Našťastie sa to celé dá spríjemniť na jeden jediný svn commit a v budúcnosti už nemusíme nastavovať každý stroj zvlášť, základné nastavenia mxmlc budú konzistentné a my ostaneme &lt;a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself"&gt;DRY&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;Vytvoríme app-config.xml. Súbor kopíruje štruktúru východzieho konfiguračného súboru sdk/3.5.0.12683a/frameworks/flex-config.xml avšak nemusí byť kompletný a stačí ak bude obsahovať len nastavenia, ktoré chceme zmeniť. &lt;/li&gt;
&lt;/ol&gt;&lt;pre style="color:black;background:white;"&gt;&lt;i&gt;&lt;&lt;/i&gt;flex&lt;i&gt;-&lt;/i&gt;config&lt;i&gt;&gt;&lt;/i&gt;
    &lt;i&gt;&lt;&lt;/i&gt;compiler&lt;i&gt;&gt;&lt;/i&gt;
        &lt;i&gt;&lt;&lt;/i&gt;define&lt;i&gt;&gt;&lt;/i&gt;
            &lt;i&gt;&lt;&lt;/i&gt;name&lt;i&gt;&gt;&lt;/i&gt;APPLICATION&lt;i&gt;:&lt;/i&gt;&lt;i&gt;:&lt;/i&gt;debug&lt;i&gt;&lt;&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;name&lt;i&gt;&gt;&lt;/i&gt;
            &lt;i&gt;&lt;&lt;/i&gt;value&lt;i&gt;&gt;&lt;/i&gt;false&lt;i&gt;&lt;&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;value&lt;i&gt;&gt;&lt;/i&gt;
        &lt;i&gt;&lt;&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;define&lt;i&gt;&gt;&lt;/i&gt;
        &lt;i&gt;&lt;&lt;/i&gt;define&lt;i&gt;&gt;&lt;/i&gt;
            &lt;i&gt;&lt;&lt;/i&gt;name&lt;i&gt;&gt;&lt;/i&gt;APPLICATION&lt;i&gt;:&lt;/i&gt;&lt;i&gt;:&lt;/i&gt;release&lt;i&gt;&lt;&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;name&lt;i&gt;&gt;&lt;/i&gt;
            &lt;i&gt;&lt;&lt;/i&gt;value&lt;i&gt;&gt;&lt;/i&gt;true&lt;i&gt;&lt;&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;value&lt;i&gt;&gt;&lt;/i&gt;
        &lt;i&gt;&lt;&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;define&lt;i&gt;&gt;&lt;/i&gt;
        &lt;i&gt;&lt;&lt;/i&gt;keep&lt;i&gt;-&lt;/i&gt;as3&lt;i&gt;-&lt;/i&gt;metadata&lt;i&gt;&gt;&lt;/i&gt;
            &lt;i&gt;&lt;&lt;/i&gt;name&lt;i&gt;&gt;&lt;/i&gt;Bindable&lt;i&gt;&lt;&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;name&lt;i&gt;&gt;&lt;/i&gt;
            &lt;i&gt;&lt;&lt;/i&gt;name&lt;i&gt;&gt;&lt;/i&gt;Managed&lt;i&gt;&lt;&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;name&lt;i&gt;&gt;&lt;/i&gt;
            &lt;i&gt;&lt;&lt;/i&gt;name&lt;i&gt;&gt;&lt;/i&gt;ChangeEvent&lt;i&gt;&lt;&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;name&lt;i&gt;&gt;&lt;/i&gt;
            &lt;i&gt;&lt;&lt;/i&gt;name&lt;i&gt;&gt;&lt;/i&gt;NonCommittingChangeEvent&lt;i&gt;&lt;&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;name&lt;i&gt;&gt;&lt;/i&gt;
            &lt;i&gt;&lt;&lt;/i&gt;name&lt;i&gt;&gt;&lt;/i&gt;Transient&lt;i&gt;&lt;&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;name&lt;i&gt;&gt;&lt;/i&gt;
            &lt;i&gt;&lt;&lt;/i&gt;name&lt;i&gt;&gt;&lt;/i&gt;Collaborative&lt;i&gt;&lt;&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;name&lt;i&gt;&gt;&lt;/i&gt;
            &lt;i&gt;&lt;&lt;/i&gt;name&lt;i&gt;&gt;&lt;/i&gt;Keywords&lt;i&gt;&lt;&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;name&lt;i&gt;&gt;&lt;/i&gt;
        &lt;i&gt;&lt;&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;keep&lt;i&gt;-&lt;/i&gt;as3&lt;i&gt;-&lt;/i&gt;metadata&lt;i&gt;&gt;&lt;/i&gt;
        &lt;i&gt;&lt;&lt;/i&gt;keep&lt;i&gt;-&lt;/i&gt;generated&lt;i&gt;-&lt;/i&gt;actionscript&lt;i&gt;&gt;&lt;/i&gt;true&lt;i&gt;&lt;&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;keep&lt;i&gt;-&lt;/i&gt;generated&lt;i&gt;-&lt;/i&gt;actionscript&lt;i&gt;&gt;&lt;/i&gt;
        &lt;i&gt;&lt;&lt;/i&gt;optimize&lt;i&gt;&gt;&lt;/i&gt;false&lt;i&gt;&lt;&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;optimize&lt;i&gt;&gt;&lt;/i&gt;
        &lt;i&gt;&lt;&lt;/i&gt;incremental&lt;i&gt;&gt;&lt;/i&gt;true&lt;i&gt;&lt;&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;incremental&lt;i&gt;&gt;&lt;/i&gt;
    &lt;i&gt;&lt;&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;compiler&lt;i&gt;&gt;&lt;/i&gt;
&lt;i&gt;&lt;&lt;/i&gt;&lt;i&gt;/&lt;/i&gt;flex&lt;i&gt;-&lt;/i&gt;config&lt;i&gt;&gt;&lt;/i&gt;
&lt;/pre&gt;

&lt;ol&gt;&lt;li&gt;&lt;p&gt;Necháme si prejsť mráz po chrbte a posledný krát nastavíme na všetkých strojoch kompilačné argumenty vývojového prostredia:&lt;br/&gt;&lt;code&gt;-load-config+=app-config.xml&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pri budúcej zmene kompilačných argumentov stačí editovať xml súbor a zmeny rozdistribuovať cez svn.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;h2&gt;Literatúra:&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;Xavi Beumala (Technical Architect, Adobe), Streamlining your Flex project environment, &lt;a href="http://www.adobe.com/devnet/flex/articles/flex_streamline_project_environment_print.html"&gt;http://www.adobe.com/devnet/flex/articles/flex_streamline_project_environment_print.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>http://labs.prasa.sk/post/1230261014</link><guid>http://labs.prasa.sk/post/1230261014</guid><pubDate>Fri, 30 Jul 2010 10:51:00 +0200</pubDate><category>flex</category><category>air</category><dc:creator>pink-fu</dc:creator></item><item><title>Flash/Flex Builder shortcuts</title><description>&lt;p&gt;Holly Schinsky &lt;a href="http://devgirl.wordpress.com/2010/07/26/flash-builder-4-shortcuts-and-tips/"&gt;zverejnila na svojom blogu&lt;/a&gt; skvelý zoznam skratiek a typov pre urýchlenie práce s Flash Builderom. Keďže čas sú peniaze, pridávam ďalšie urýchlovače. Niektoré z nich fungujú aj pre Flex Builder 3. V priloženom PDF sa nachádzajú verzie skratiek pre Mac aj Windows. Stačí &lt;em&gt;vytlačiť&lt;/em&gt; na A4, preložiť na polovicu a &lt;em&gt;prilepiť&lt;/em&gt; na monitor.&lt;/p&gt;

&lt;iframe width="500" height="660" frameborder="0" src="http://spreadsheets.google.com/pub?key=0AuSL7LQJ2S0QdHRrMDM1RHR1VXJvbllsSW0yejBSYlE&amp;single=true&amp;gid=0&amp;range=A2%3AB35&amp;output=html&amp;widget=true"&gt;&lt;/iframe&gt;

&lt;p&gt;Tlačená forma:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://spreadsheets.google.com/pub?key=0AuSL7LQJ2S0QdHRrMDM1RHR1VXJvbllsSW0yejBSYlE&amp;single=true&amp;gid=0&amp;output=pdf"&gt;stiahnúť PDF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;vytlačiť na A4&lt;/li&gt;
&lt;li&gt;preložiť na polovicu&lt;/li&gt;
&lt;li&gt;prilepiť na monitor&lt;/li&gt;
&lt;/ul&gt;</description><link>http://labs.prasa.sk/post/1230243794</link><guid>http://labs.prasa.sk/post/1230243794</guid><pubDate>Tue, 27 Jul 2010 16:27:00 +0200</pubDate><category>flash builder</category><dc:creator>pink-fu</dc:creator></item><item><title>Kontinuálna integrácia Flex/AIR projektov</title><description>&lt;p&gt;Na &lt;a href="http://labs.prasa.sk/view/adobe-user-group-slovakia-stretnutie-25.-marec-2010/" title="posledné stretnutie AUG Slovakia"&gt;poslednom stretnutí&lt;/a&gt; AUG Slovakia sme sa medzi iným rozprávali aj o postupoch, možnostiach a výhodách kontinuálnej integrácie Flex a AIR projektov.&lt;/p&gt;

&lt;iframe src="https://docs.google.com/present/embed?id=dhst7965_214cfwbbsgm" frameborder="0" width="410" height="342"&gt;&lt;/iframe&gt;

&lt;p&gt;Spoločnosť &lt;a href="http://www.sinusgear.com"&gt;sinusgear.com&lt;/a&gt; poskytla &lt;a href="https://hudson.sinusgear.com/"&gt;vzorovému projektu&lt;/a&gt; hosting a bezkonkurenčnú podporu.&lt;/p&gt;</description><link>http://labs.prasa.sk/post/1230228904</link><guid>http://labs.prasa.sk/post/1230228904</guid><pubDate>Thu, 01 Apr 2010 09:41:00 +0200</pubDate><category>personal</category><category>ci</category><category>hudson</category><dc:creator>pink-fu</dc:creator></item><item><title>Adobe User Group Slovakia Stretnutie - 25. Marec, 2010</title><description>&lt;p&gt;Stretnutie zamerane na Adobe Flash Platform (Flash/Flex/AIR) a novinky v tejto oblasti, ktore na nas Adobe chysta v nasledujucich tyzdnoch a mesiacoch: Flash Player 10.1, AIR 2.0, Flex 4, Flash Builder 4, atd.&lt;/p&gt;

&lt;p&gt;Čas: 25. Marec, 2010 od 18:00 do 20:00&lt;br/&gt;
Miesto: Galvaniho 17/A, Bratislava&lt;/p&gt;

&lt;p&gt;Viac na stránke AUG Slovakia: &lt;a href="http://groups.adobe.com/posts/980dd04221"&gt;http://groups.adobe.com/posts/980dd04221&lt;/a&gt;&lt;/p&gt;</description><link>http://labs.prasa.sk/post/1230219497</link><guid>http://labs.prasa.sk/post/1230219497</guid><pubDate>Wed, 24 Mar 2010 14:43:00 +0100</pubDate><category>personal</category><dc:creator>pink-fu</dc:creator></item><item><title>Začíname s Picasa Web API (II)</title><description>&lt;p&gt;V tejto časti si povieme bližšie o knižnici Picasa Flash API, ako ju použiť vo Flash-ových projektoch a ukážeme si krátky príklad slideshow otagovaných obrázkov z vášho Picasa Web účtu.&lt;/p&gt;

&lt;p&gt;V prvej časti seriálu o &lt;a href="/view/zaciname-s-picasa-web-api/"&gt;Picasa Web API&lt;/a&gt; sme si priblížili pojmy &lt;em&gt;služba Picasa Web Albums&lt;/em&gt; a jej &lt;em&gt;rozhranie Picasa Web Albums Data API&lt;/em&gt;. Povedali sme si čo je to &lt;em&gt;Picasa Flash API&lt;/em&gt; a kde takéto API zohnať, čo všetko treba spraviť pre úspešný response zo strany Picasa Web API a ako nám to Picasa Flash API umožní dosiahnúť v kratšom čase a s menšou námahou.&lt;/p&gt;

&lt;h2&gt;Stiahnúť&lt;/h2&gt;

&lt;p&gt;Najčerstvejšia verzia Picasa Flash API sa vždy nachádza v svn. Zo zdrojových súborov je pre každú významnú revíziu vytvorená swc knižnica, ktorá sa dá stiahnúť na adrese &lt;a href="http://code.google.com/p/picasaflashapi/downloads/list"&gt;http://code.google.com/p/picasaflashapi/downloads/list&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Nainštalovať&lt;/h2&gt;

&lt;p&gt;Použitie knižnice sa líši od Flash verzie. Pre &lt;strong&gt;Flash CS3&lt;/strong&gt;, treba knižnicu skopírovať do “Components” zložky:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;V systéme Windows: C:\Program Files\Adobe\Adobe Flash CS3\language\Configuration\Components&lt;/li&gt;
&lt;li&gt;Pre Mac: /Applications/Adobe Flash CS3/Configuration/Components&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Po nakopírovaní knižnice do zložky ju vo Flash CS3 stačí presunúť z Components okna do Library a triedy budú k dispozícii.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flash CS4&lt;/strong&gt; je inteligentnejší a dovoľuje nám zadefinovať knižnicu v záložke Library Path v Publish Settings nasledovne:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9rkz1yTT61qzrj2t.png" alt="Flash CS4 Publish Settings."/&gt;&lt;/p&gt;

&lt;p&gt;Hotovo. Knižnica je vo Flash-i.&lt;/p&gt;

&lt;h2&gt;Použiť&lt;/h2&gt;

&lt;p&gt;Našou nasledujúcou úlohou bude vytvoriť jednoduchú aplikáciu, ktorá bude zobrazovať množinu fotografií umiestnených a označkovaných v Picasa Web galérii. Zobrazovanie fotografií by malo byť manuálne a automatické. Ak je k dispozícii názov fotografie, chceme ho zobraziť tiež. To aké fotografie chceme zobrazovať by sa malo dať definovať cez FlashVars aby sme mohli aplikáciu použiť na viacerých miestach s rôznymi značkami.&lt;/p&gt;

&lt;p&gt;Užívateľské rozhranie je na vás. Ja som použil štandardné Flash komponenty. &lt;code&gt;UILoader&lt;/code&gt; v tandeme s &lt;code&gt;ProgressBar&lt;/code&gt;-om bola pre mňa najrýchlejšia možnosť ako dostať do aplikácie obrázok s feedback-om sťahovaných dát. Dva Illustrator-om naskinované &lt;code&gt;Button&lt;/code&gt;-y slúžia ako “Play” a “Next”. Pre názov obrázku som použil klasický &lt;code&gt;TextField&lt;/code&gt; s embednutým písmom.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9rkzn9g1z1qzrj2t.png" alt="Flash CS3 Scene with components."/&gt;&lt;/p&gt;

&lt;p&gt;Kvôli prehľadnosti uvediem len časti kódu týkajúce sa dát.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var service : PicasaService = new PicasaService();
    service.imgmax = "400";`
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vytvoríme inštanciu Picasa služby s tým, že maximálna veľkosť obrázkov, ktoré budeme ďalej načítavať bude 400 pixelov. Všetky dostupné vlastnosti služby a ich hodnoty nájdete v &lt;a href="http://labs.prasa.sk/repo/docs/picasaflashapi/sk/prasa/webapis/picasa/PicasaService.html#imgmax"&gt;asdoc&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var loader : UILoader;
var entries : Array;
var responder : PicasaResponder = service.albums.list_by_tag(fv.user || "thisispinkfu", fv.tag || "diana");
    responder.addEventListener(PicasaDataEvent.DATA, serviceComplete_Handler, false, 0, true);
    responder.addEventListener(ErrorEvent.ERROR, serviceError_Handler, false, 0, true);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Zadefinujeme pole “entries”, ktoré bude naplnené po úspešnej odpovedi a v prípade, že odpoveď obsahuje jeden a viac obrázkov. Volanie metódy &lt;code&gt;list_by_tag(username, tag)&lt;/code&gt; na službe nám vráti objekt typu &lt;a href="http://labs.prasa.sk/repo/docs/picasaflashapi/sk/prasa/webapis/picasa/PicasaResponder.html"&gt;PicasaResponder&lt;/a&gt;, ktorý vysiela servisné udalosti.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function serviceComplete_Handler(evt : PicasaDataEvent) : void
{
    // naplnime entires
    entries = evt.data.entries.concat([]);

    if(entries.length &gt; 0)
    {
         // spustime tahanie obrazkov
         loadNextEntry();
    } 
    else
    {
         // nemame ziadne obrazky (neexistujuci tag alebo uzivatel)
         cmp_label.text = "Zero entries...";
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ak dostaneme úspešnú odpoveď z Picasa Web Data API, naplníme pole entries objektmi, ktoré pre nás automaticky vytvorí Picasa Flash API. Ak sa v poli nachádza aspoň jeden objekt, zavoláme funkciu &lt;code&gt;loadNextEntry()&lt;/code&gt;. V opačnom prípade nastala zrejme chyba, resp. značka, ktorú sme uviedli vo volaní metódy &lt;code&gt;list_by_tag&lt;/code&gt; neexistuje, resp. žiadny obrázok v našej galérii nebol označkovaný.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function serviceError_Handler(evt : ErrorEvent) : void
{
    cmp_label.text = "Error: " + evt.text;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ak služba nedostala úspešnú odpoveď, napr. zadaný užívateľ neexistuje, zobrazíme feedback o chybe.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function loadNextEntry(evt : Event = null) : void
{
    var url : String = entries[entry].media.content.url;// url obrazku
    var lbl : String = entries[entry].summary; // nazov obrazku 

    cmp_label.text = lbl != null ? lbl : ""; // cmp_label je text field

    // vytvorime instanciu UILoader-a a pridame na Stage
    loader = new UILoader();
    loader.width = 400;
    loader.height = 400;
    loader.addEventListener(Event.COMPLETE, imageComplete_Handler, false, 0, true);
    loader.addEventListener(IOErrorEvent.IO_ERROR, imageError_Handler, false, 0, true);
    loaders.addChild(loader);

    // spustime cucanie
    loader.load(new URLRequest(url));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Funkcia &lt;code&gt;loadNextEntry&lt;/code&gt; nahrá ďalší obrázok v poradí. Extrahuje adresu obrázka a jeho názov z objektu v poli entries, vytvorí novú inštanciu triedy &lt;code&gt;UILoader&lt;/code&gt; a zapíše “complete” a “ioError” event listenery.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function imageComplete_Handler(evt : Event) : void
{
    // spustime napr. timer
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Po úspešnom stiahnutí obrázka sa zavolá funkcia &lt;code&gt;imageComplete_Handler&lt;/code&gt;, do ktorej umiestnime napríklad prezentačný kód, ktorý spustí slideshow.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function imageError_Handler(evt : IOErrorEvent) : void
{
    cmp_label.text = "Error: " + evt.text;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;V prípade, že nastala chyba pri sťahovaní obrázka, zavolá sa funkcia &lt;code&gt;imageError_Handler&lt;/code&gt;, ktorá zobrazí feedback o chybe.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function get fv() : Object
{
    return Object(LoaderInfo(this.loaderInfo).parameters);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Helper funkcia &lt;code&gt;fv()&lt;/code&gt; vracia objekt s FlashVars. Umožňuje nám opýtať sa napr. na hodnotu premennej user definovanej cez flashVars v html &lt;object/&gt; alebo &lt;embed/&gt; tagu.&lt;/p&gt;

&lt;h2&gt;Nasadiť&lt;/h2&gt;

&lt;p&gt;Výsledok bude vyzerať približne takto:
&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="400" height="400" id="embed_sample" align="middle"&gt;
    &lt;param name="allowScriptAccess" value="sameDomain"&gt;&lt;param name="allowFullScreen" value="false"&gt;&lt;param name="movie" value="http://picasaflashapi.googlecode.com/svn/trunk/docs/tutorials/Flash_Slideshow/bin/Flash_Slideshow_CS4.swf"&gt;&lt;param name="quality" value="high"&gt;&lt;param name="bgcolor" value="#ffffff"&gt;&lt;param name="flashvars" value="tag=slideshowsample&amp;user=thisispinkfu"&gt;&lt;embed src="http://picasaflashapi.googlecode.com/svn/trunk/docs/tutorials/Flash_Slideshow/bin/Flash_Slideshow_CS4.swf" flashvars="tag=slideshowsample&amp;user=thisispinkfu" quality="high" bgcolor="#ffffff" width="400" height="400" name="embed_sample" align="middle" allowscriptaccess="sameDomain" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;

&lt;p&gt;Zdrojové súbory (Flash CS4) môžte stiahnuť z &lt;a href="http://picasaflashapi.googlecode.com/svn/trunk/docs/tutorials/Flash_Slideshow/zip/Flash_Slideshow.zip"&gt;http://picasaflashapi.googlecode.com/svn/trunk/docs/tutorials/Flash_Slideshow/zip/Flash_Slideshow.zip&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Kam ďalej&lt;/h2&gt;

&lt;p&gt;V tejto časti seriálu o knižnici PicasaFlashApi a spol. sme si ukázali ako jednoducho zobraziť otagované obrázky vo Flash aplikácii. Na pozadí jedného volania funkcie &lt;code&gt;service.albums.list_by_tag(user, tag)&lt;/code&gt; nám knižnica PicasaFlashAPI poskladala request, odoslala, čakala na odpoveď druhej strany, preparsovala a vyhodnotila odpoveď a nakoniec vrátila pole objektov. S PicasaFlashAPI je možné toho spraviť oveľa viac a dokonca ešte jednoduchšie, o tom však neskôr.&lt;/p&gt;

&lt;p&gt;Linky na ďalšie zdroje:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/picasaflashapi/downloads/list"&gt;PicasaFlashApi swc knižnice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/picasa-mate/"&gt;PicasaFlashApi pre Mate framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://labs.prasa.sk/repo/docs/picasaflashapi/"&gt;PicasaFlashApi asdoc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/picasaflashapi/issues/list"&gt;PicasaFlashApi Issue Tracker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/intl/en/apis/picasaweb/reference.html"&gt;Picasa Web Data API - referenčná príručka&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>http://labs.prasa.sk/post/1230210715</link><guid>http://labs.prasa.sk/post/1230210715</guid><pubDate>Tue, 07 Jul 2009 10:46:00 +0200</pubDate><category>flash</category><category>picasa</category><dc:creator>pink-fu</dc:creator></item><item><title>Google AuthSub a Picasa Web Data API crossdomain.xml</title><description>&lt;p&gt;Je viac ako rok potom, kedy do gdata-issues pribudla žiadosť o pridanie crossdomain.xml pre Google Accounts (&lt;a href="http://code.google.com/p/gdata-issues/issues/detail?id=406"&gt;http://code.google.com/p/gdata-issues/issues/detail?id=406&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Od apríla tohto roku som mal možnosť ako člen &lt;a href="http://groups.google.com/group/authsub-trusted-testers"&gt;http://groups.google.com/group/authsub-trusted-testers&lt;/a&gt; skupiny testovať a ladiť AuthSub autentifikáciu cez Flash Player. Mesiac sme komunikovali, testovali a reportovali problémy. Výsledkom je crossdomain.xml pre Google Accounts &lt;a href="http://accounts.googleapis.com/crossdomain.xml"&gt;http://accounts.googleapis.com/crossdomain.xml&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Juch. Zhrniem výsledky do krátkej ukážky Google Accounts AuthSub autentifikácie:&lt;/p&gt;

&lt;h2&gt;1. Načítať crossdomain.xml&lt;/h2&gt;

&lt;p&gt;Explicitne musíme povoliť odosielanie requestov na Google Accounts API
&lt;code&gt;Security.loadPolicyFile("https://accounts.googleapis.com/crossdomain.xml");&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;2. Prejsť na stránku “Žiadosť o prístup”&lt;/h2&gt;

&lt;p&gt;Nasleduje autentifikácia cez prehliadač na strane Google&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// create a request to get the token
var variables : URLVariables = new URLVariables();
    variables["scope"] = "http://photos.googleapis.com/data";
    variables["session"] = "1";
    variables["secure"] = "0";
    variables["hd"] = "default";
    variables["next"] = "http://www.prasa.sk/authsub/index.html";

var request: URLRequest = new URLRequest("https://www.google.com/accounts/AuthSubRequest");
    request.data =  variables;

navigateToURL(request, "_top");
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;3. Google vráti prehliadač späť …&lt;/h2&gt;

&lt;p&gt;… na našu aplikáciu spolu aj s tokenom. Token sa dá z adresy načítať napríklad cez &lt;code&gt;ExternalInterface.call()&lt;/code&gt;
&lt;code&gt;&lt;a href="http://www.prasa.sk/authsub/index.html?token=CK-...-ezGBg"&gt;http://www.prasa.sk/authsub/index.html?token=CK-...-ezGBg&lt;/a&gt;&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;4. Načítať long-lived session token&lt;/h2&gt;

&lt;p&gt;Nasledovným volaním vymeníme single-use token za long-lived session token, ktorý možeme použiť na authorizovaný request služieb Google (napr. Picasa Web Data API):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;private function getAuthSubSessionToken() : void
{
    // create request to get the session token
    var request : URLRequest = new URLRequest();
        request.url = "https://accounts.googleapis.com/accounts/AuthSubSessionToken";
        request.method = URLRequestMethod.POST;            // we need to use POST method because the headers are NOT sent
        request.data = new URLVariables("test=variable");    // some test varialbe to get the headers working
        // create request headers
        request.requestHeaders.push(new URLRequestHeader("Authorization","AuthSub token=\""+token+"\""));
        request.requestHeaders.push(new URLRequestHeader("Content-type","application/x-www-form-urlencoded"));

    var loader : URLLoader = new URLLoader();
        loader.addEventListener(Event.COMPLETE, loader_result);

    try
    {
        loader.load(request);
    } 
    catch(e : Error)
    {
        throw new Error(e);
    }
}

public function loader_result(evt : Event) : void
{
    var loader : URLLoader = URLLoader(evt.target);
    sessionToken = new URLVariables(loader.data).Token; // store our session token in a instance variable
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Novinkou v crossdomain.xml aktualizáciách od Google je aj Picasa Web Data API. Do &lt;a href="http://photos.googleapis.com/data/crossdomain.xml"&gt;crossdomain.xml&lt;/a&gt; súboru pribudla Authorization hlavička a keďže vlastné hlavičky sa nedajú z Flash Player-a poslať ináč ako POST requestom, pribudla aj X-HTTP-Method-Override hlavička pre simuláciu napr. GET requestov. S takýmto crossdomain.xml súborom a long-lived session tokenom už konečne vieme načítať napríklad zoznam privátnych Picasa Web albumov.&lt;/p&gt;

&lt;h2&gt;1. Explicitne načítať crossdomain.xml&lt;/h2&gt;

&lt;p&gt;Explicitne musíme povoliť odosielanie requestov na Picasa Web Data API
&lt;code&gt;Security.loadPolicyFile("http://photos.googleapis.com/data/crossdomain.xml");&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;2. Odoslať žiadosť …&lt;/h2&gt;

&lt;p&gt;… spolu s autorizačným tokenom v hlavičke&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;private function getPrivateAlbums() : void
{
    // create request to get the session token
    var request : URLRequest = new URLRequest();
        request.url = "http://photos.googleapis.com/data/feed/api/user/default?access=private";
        request.method = URLRequestMethod.POST;            // we need to use POST method because the headers are NOT sent
        request.data = new URLVariables("test=variable");    // some test varialbe to get the headers working
        // create request headers
        request.requestHeaders.push(new URLRequestHeader("Authorization","AuthSub token=\"" + sessionToken + "\""));
        request.requestHeaders.push(new URLRequestHeader("X-HTTP-Method-Override", "GET"));
        request.requestHeaders.push(new URLRequestHeader("Content-type","application/atom+xml"));

    var loader : URLLoader = new URLLoader();
        loader.addEventListener(Event.COMPLETE, privateLoader_result);

    try
    {
        loader.load(request);
    } 
    catch(e : Error)
    {
        throw new Error(e);
    }
}

public function privateLoader_result(evt : Event) : void
{
    var atom_ns : Namespace = new Namespace("http://www.w3.org/2005/Atom");
    var loader : URLLoader = URLLoader(evt.target); 
    var data : XML = new XML(loader.data);

    for each(var album : XML in data.atom_ns::entry)
    {
        trace(album.atom_ns::title.text(), album.atom_ns::summary.text());
    }        
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Funkčnú aplikáciu hladajte na &lt;a href="http://www.prasa.sk/authsub"&gt;http://www.prasa.sk/authsub&lt;/a&gt; (view-source enabled).&lt;/p&gt;

&lt;p&gt;Po dlhom čase sme sa nakoniec dočkali. Som zvedavý na nové aplikácie a možnosti. 
Má niekto chuť napísať gdata client library v as3?&lt;/p&gt;</description><link>http://labs.prasa.sk/post/1230024698</link><guid>http://labs.prasa.sk/post/1230024698</guid><pubDate>Fri, 19 Jun 2009 00:00:00 +0200</pubDate><category>flash</category><category>picasa</category><dc:creator>pink-fu</dc:creator></item><item><title>Začíname s Picasa Web API</title><description>&lt;p&gt;Nedávno sa mi prisnilo silné slovné spojenie &lt;em&gt;skutková podstata&lt;/em&gt;. Rozmýšľajúc nad jeho významom mi napadol tento blog. Jeden celý dlhý rok bol naložený vo formaldehyde. Počas hybernácie blogu som pozabudol nato, aký bol dôvod jeho vzniku. A práve skutková podstata mi pripomenula, že Picasa Web Albums a súvisiaca Flash/Flex knižnica bola tá pohnútka. Aby som začal túto skutkovú podstatu napĺňať, skúsim spraviť prvý krok a rozbehnúť sa niekam. Kam dobehneme sám ešte neviem. Dúfam len, že to nebude šprint na 100 metrov, ale poriadny maratón.&lt;/p&gt;

&lt;h2&gt;Čo je to Picasa Web Albums Data API?&lt;/h2&gt;

&lt;p&gt;Pod týmto označením sa skrýva rozhranie, ktoré umožňuje integrovať službu &lt;a href="http://picasaweb.google.com/" title="Picasa Web Albums"&gt;Picasa Web Albums&lt;/a&gt; (ďalej len PWA) do vašich webov a aplikácií. Rozhranie umožňuje vytvárať albumy, zasielať a sťahovať obrázky, komentáre k obrázkom a tisíc ďalších vecí.&lt;/p&gt;

&lt;p&gt;Niektoré z mála vecí, ktoré využívajú PWA Data API:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Aplikácie na jednoduché uploadovanie obrázkov zo zariadení, desktopových aplikácií a ostatných webových služieb&lt;/li&gt;
&lt;li&gt;Mobilný klienti na prezeranie a uploadovanie obrázkov do PWA&lt;/li&gt;
&lt;li&gt;Integrácia PWA s blogovacími nástrojmi k jednoduchému zdielaniu obrázkov na vašich blogoch&lt;/li&gt;
&lt;li&gt;Digitálne foto rámiky&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Pre stručný prehľad je k dispozícii video:
&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/hgadtxgXZ_k&amp;hl=cs&amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/hgadtxgXZ_k&amp;hl=cs&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;

&lt;p&gt;Domovská stránka PWA Data API: &lt;a href="http://code.google.com/apis/picasaweb/"&gt;http://code.google.com/apis/picasaweb/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;A čo je to Picasa Flash API?&lt;/h2&gt;

&lt;p&gt;Pod týmto názvom sa skrýva klientské rozhranie, ktoré umožňuje čo najjednoduchšie pristupovať priamo k PWA pomocou Flash Player-a. Picasa Flash API (ďalej len PFA) je read-only Actionscript 3 rozhranie k Picasa Web Albums. Umožňuje listovať v používateľských albumoch, obrázkoch, komentároch, tagoch alebo vyhľadávať obrázky v Picasa komunite.&lt;/p&gt;

&lt;p&gt;Domovská stránka Picasa Flash API: &lt;a href="http://code.google.com/p/picasaflashapi/"&gt;http://code.google.com/p/picasaflashapi/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Aký je teda rozdiel?&lt;/h2&gt;

&lt;ul&gt;&lt;li&gt;Picasa Web Albums Data API je rozhranie k službe Picasa Web Albums od Google.&lt;/li&gt;
&lt;li&gt;Picasa Flash API je Flash/Flex knižnica.&lt;/li&gt;
&lt;li&gt;Pomocou Picasa Flash API posielate requesty z Flash Player-a na Picasa Web Albums Data API rozhranie.&lt;/li&gt;
&lt;li&gt;Picasa Web Albums Data API žije na serverovej strane Google, Picasa Flash API beží u klienta.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Ako s tým súvisí Picasa?&lt;/h2&gt;

&lt;p&gt;Výborná otázka. &lt;a href="http://picasa.google.com/" title="Picasa"&gt;Picasa&lt;/a&gt; je desktopový klient pre Mac, Linux alebo Windows. Picasa slúži na jednoduchú a rýchlu organizáciu, úpravu a odovzdávanie vašich fotografií na web. Áno, Picasa je tiež len klient (a naviac výkonný), ktorý okrem iných vlastností, možností a funkcií taktiež využíva Picasa Web Albums Data API napr. k odovzdávaniu obrázkov na web.&lt;/p&gt;

&lt;h2&gt;Prezeranie a vyhľadávanie&lt;/h2&gt;

&lt;p&gt;Poďme si to hneď všetko vyskúšať :).
Každý url request smerom na PWA má nasledovnú schému:&lt;/p&gt;

&lt;p&gt;&lt;i&gt;http://&lt;api_url&gt;/&lt;collection_type&gt;/&lt;projection_type&gt;/&lt;context&gt;?&lt;parameters&gt;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Začnime s jednoduchým receptom - zoznamom používateľových albumov. Nato aby sme získali tento zoznam potrebujeme nasledovné ingrediencie:&lt;/p&gt;

&lt;h3&gt;1. Adresa Picasa Web Albums Data API:&lt;/h3&gt;

&lt;p&gt;Môžeme použiť adresu “&lt;i&gt;&lt;a href="http://picasaweb.google.com/data"&gt;http://picasaweb.google.com/data&lt;/a&gt;&lt;/i&gt;” alebo jej alias “&lt;i&gt;&lt;a href="http://photos.googleapis.com/data"&gt;http://photos.googleapis.com/data&lt;/a&gt;&lt;/i&gt;”. Ja radšej používam tú druhú. Dôvodom je crossdomain.xml súbor, ktorý musí byť načítaný do Flash Player-a pred akýmkoľvek iným requestom smerom na PWA (knižnica to spraví automaticky za vás). Týmto si zabezpečíme, že PWA neodmietne našeho klienta a Flash Player spracuje PWA odpoveď. Viac k tejto téme je popísané &lt;a href="http://code.google.com/intl/sk/apis/picasaweb/reference.html#Flash"&gt;tu&lt;/a&gt;. A keďže crossdomain.xml súbor sa nachádza na &lt;i&gt;&lt;a href="http://photos.googleapis.com/data/crossdomain.xml"&gt;http://photos.googleapis.com/data/crossdomain.xml&lt;/a&gt;&lt;/i&gt;, používam radšej ten druhý tvar. Ak by sme pristupovali k PWA cez prvú adresu, môžeme listovať pomocou PFA aj privátne albumy v prípade, že sme prihlásený cez browser do google účtu, pretože koláčik obsahuje adresu &lt;a href="http://picasaweb.google.com/data"&gt;http://picasaweb.google.com/data&lt;/a&gt; a PWA nám vráti aj naše vlastné privátne albumy.&lt;/p&gt;

&lt;h3&gt;2. Collection type:&lt;/h3&gt;

&lt;p&gt;Keďže PFA je read-only, budeme používať iba “&lt;i&gt;/feed&lt;/i&gt;”. Collection type “&lt;i&gt;/media&lt;/i&gt;” by sme využili pri zápise dát z klienta smerom na server, napríklad pri aktualizácii alebo pri odovzdávaní fotografií.&lt;/p&gt;

&lt;h3&gt;3. Projection type:&lt;/h3&gt;

&lt;p&gt;Máme opať niekoľko možností. V prípade, že použijeme “&lt;i&gt;/base&lt;/i&gt;”, odpoveď z PWA bude základný Atom feed bez akýchkoľvek rozširujúcich elementov. Tento typ projekcie je read-only. My však chceme dostať z PWA aj dodatočné informácie o fotografiách ako napr. ich veľkosť, adresy náhľadov atď. a preto budeme používať Projection type “&lt;i&gt;/api&lt;/i&gt;”. Ak by nám Google v budúcnosti umožnil zapisovať do PWA z Flash Player-a, Projection type “&lt;i&gt;/api&lt;/i&gt;” je nato pripravené (read-write).&lt;/p&gt;

&lt;h3&gt;4. Context:&lt;/h3&gt;

&lt;p&gt;Posledná prísada je hodnota, ktorá definuje aké zdroje chceme na PWA používať. Podľa tohto kontextu rozdeľujeme requesty na:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;User-based feed: &lt;em&gt;/user/&lt;userid&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Contacts-based feed: &lt;em&gt;/user/&lt;userid&gt;/contacts&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Album-based feed: &lt;em&gt;/user/&lt;userid&gt;/albumid/&lt;albumid&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Photo-based feed: &lt;em&gt;/user/&lt;userid&gt;/albumid/&lt;albumid&gt;/photoid/&lt;photoid&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Community search feed: &lt;em&gt;/all&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Featured photos feed: &lt;em&gt;/featured&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Po správnom zmiešaní ingrediencií pre zoznam albumov užívateľa dostaneme nasledovné url: &lt;a href="http://photos.googleapis.com/data/feed/api/user/thisispinkfu"&gt;http://photos.googleapis.com/data/feed/api/user/thisispinkfu&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PWA nám odpovie nasledovne (skrátene kvôli prehľadnosti):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;feed ...&gt;
    &lt;id&gt;http://photos.googleapis.com/data/feed/api/user/thisispinkfu&lt;/id&gt;
    &lt;title&gt;thisispinkfu&lt;/title&gt;
    ...
    &lt;entry&gt;
            &lt;id&gt;http://photos.googleapis.com/data/entry/api/user/thisispinkfu/albumid/5296410852174025857&lt;/id&gt;
        ...
        &lt;category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/photos/2007#album"/&gt;
        &lt;title&gt;Pinholes&lt;/title&gt;
        &lt;summary&gt;Sharan STD-35 and Diana pinholes&lt;/summary&gt;
        .
        .
        .
    &lt;/entry&gt;
    &lt;entry&gt;
    ...
    &lt;/entry&gt;
    ...
&lt;/feed&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Albumy sa vracajú späť v &lt;em&gt;&lt;entry&gt;&lt;/em&gt; elementoch, kde každý &lt;em&gt;&lt;entry&gt;&lt;/em&gt; element obsahuje metadáta k albumu ako napr. počet fotografií v albume, náhľad albumu, názov atď…&lt;/p&gt;

&lt;p&gt;Aby ste nemuseli pracne vytvárať url requesty na PWA a následne parsovať štrúdle odpovedí, pomôže vám Picasa Flash API, ktorá za vás request vytvorí, sparsuje odpoveď a vráti ju zabalenú v pekne otypovanom objekte :)&lt;/p&gt;

&lt;p&gt;Zoznam albumov by sme pomocou PFA získali nasledovne:
    // vytvorime instanciu servisu
    var service : PicasaService = new PicasaService();&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// zavolame servisnu metodu, ktora vrati responder
// responder vysle pri uspesnej odpovedi z PWA data event
var responder : PicasaResponder = service.albums.list("thisispinkfu");
    responder.addEventListener(PicasaDataEvent.DATA, onGetAlbumsComplete);

// po uspesnej odpovedi
function onGetAlbumsComplete(evt : PicasaDataEvent) : void
{
    var item : AlbumEntry;

    // prejdeme vsetky &lt;entry&gt;
    for(var a : int = 0; a &lt; evt.data.entries.length; a++)
    {
        item = evt.data.entries[a] as AlbumEntry;
        // a vypiseme nazov albumy a jeho linku na picasaweb stranku
        trace(item.title.value + " (" + item.links[1].href + ")");
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Výstupom z funkcie je zoznam albumov s ich názvom a priamou linkou na picasaweb stránku:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(GET) &lt;a href="http://photos.googleapis.com/data/feed/api/user/thisispinkfu"&gt;http://photos.googleapis.com/data/feed/api/user/thisispinkfu&lt;/a&gt;
Pinholes (&lt;a href="http://picasaweb.google.com/thisispinkfu/Pinholes"&gt;http://picasaweb.google.com/thisispinkfu/Pinholes&lt;/a&gt;)
Redscale (&lt;a href="http://picasaweb.google.com/thisispinkfu/Redscale"&gt;http://picasaweb.google.com/thisispinkfu/Redscale&lt;/a&gt;)
Stockholm (&lt;a href="http://picasaweb.google.com/thisispinkfu/Stockholm"&gt;http://picasaweb.google.com/thisispinkfu/Stockholm&lt;/a&gt;)
Instants (&lt;a href="http://picasaweb.google.com/thisispinkfu/Instants"&gt;http://picasaweb.google.com/thisispinkfu/Instants&lt;/a&gt;)
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ďalšími možnosti PWA je napríklad:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;vyhľadávanie obrázkov s v komunite na základe query a napr. tagov&lt;/li&gt;
&lt;li&gt;použitie geografických hraníc pre obmedzenie výsledkov vyhľadávania na určitú zemepisnú oblasť&lt;/li&gt;
&lt;li&gt;limitovanie vyhľadávania na “obľúbené” fotografie&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;V stručnosti sme si spravili prehľad čo je to &lt;a href="http://code.google.com/apis/picasaweb/" title="Picasa Web Albums Data API"&gt;Picasa Web Albums Data API&lt;/a&gt;, čo je to &lt;a href="http://code.google.com/p/picasaflashapi/" title="Picasa Flash API"&gt;Picasa Flash API&lt;/a&gt;, načrtli sme ich možnosti a obmedzenia a vytvorili krátky príklad, ako získať zoznam všetkých albumov od &lt;a href="http://picasaweb.google.com/" title="Picasaweb"&gt;Picasaweb&lt;/a&gt; používateľa.&lt;/p&gt;

&lt;p&gt;Nakoniec už len krátky odkaz na nádherný screen saver, ktorý využíva Picasa Flash API: &lt;a href="http://www.inspirit.ru/exchange/ascii_saver/"&gt;http://www.inspirit.ru/exchange/ascii_saver/&lt;/a&gt;&lt;/p&gt;</description><link>http://labs.prasa.sk/post/1229972192</link><guid>http://labs.prasa.sk/post/1229972192</guid><pubDate>Sun, 22 Mar 2009 20:13:00 +0100</pubDate><category>flash</category><category>flex</category><category>air</category><category>picasa</category><dc:creator>pink-fu</dc:creator></item><item><title>Flex Live Event</title><description>&lt;p&gt;Slovakia Flex User Group (&lt;a href="http://groups.adobe.com/groups/ae581116ba/summary"&gt;Slovakia FUG&lt;/a&gt;) organizuje druhé otvorené stretnutie s názvom “Flex Live Event”.
Stretneme sa 5-teho marca 2009 o 15:30 na FEI STU v BC 150-ke.&lt;/p&gt;

&lt;p&gt;Počas dvoch hodín prebehnú krátke prezentácie na tému od Flash Lite cez Flex, AIR až po Data Services. Prezentácie sú orientované ako pre začiatočníkov, tak aj pokročilých používateľov so zameraním na konkrétne využitie v praxi (best practices, case studies).&lt;/p&gt;

&lt;p&gt;Všetci sú srdečne pozvaní, registrácia na toto podujatie nie je potrebná.
Viac informácií sa nachádza na stránke &lt;a href="http://groups.adobe.com/posts/1b20d93b5f"&gt;Slovakia FUG&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.google.com/calendar/event?action=TEMPLATE&amp;tmeid=azg5bW0zaWtocnVqazdrc2xtcWl1bGoxZ2MgbWljaGFsLmdyb25AbQ&amp;tmsrc=bWljaGFsLmdyb25AZ21haWwuY29t"&gt;&lt;img border="0" src="http://www.google.com/calendar/images/ext/gc_button1_en.gif"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;iframe width="500" height="425" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps/ms?hl=en&amp;ie=UTF8&amp;s=AARTsJrIa6EzHnGD56KRFNfqC1OpKhoK0Q&amp;msa=0&amp;msid=101563460387488167093.000463bbbfbc610799e29&amp;ll=48.156582,17.072668&amp;spn=0.024334,0.056648&amp;z=14&amp;output=embed"&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;br/&gt;&lt;small&gt;&lt;a href="http://maps.google.com/maps/ms?hl=en&amp;ie=UTF8&amp;msa=0&amp;msid=101563460387488167093.000463bbbfbc610799e29&amp;ll=48.156582,17.072668&amp;spn=0.024334,0.056648&amp;z=14&amp;source=embed" style="color:#0000FF;text-align:left"&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;</description><link>http://labs.prasa.sk/post/1229887452</link><guid>http://labs.prasa.sk/post/1229887452</guid><pubDate>Wed, 25 Feb 2009 12:00:00 +0100</pubDate><category>flash</category><category>flex</category><category>air</category><dc:creator>pink-fu</dc:creator></item><item><title>Creating New Components in Flex 3 and Beyond @ MAX 2008</title><description>&lt;p&gt;&lt;em&gt;Speakers: Matt Chotin&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Túto prednášku som síce nemal v pláne, ale keďže prednáška “&lt;a href="http://k.prasa.sk/doc/labs/sean_christmann_optimizing_air_final.pdf"&gt;Optimizing Adobe AIR for Code Execution, Memory, and Rendering&lt;/a&gt;” bola zrušená, táto padla vhod. Prednáška sa z dvoch tretín venovala Flex 3 komponentom a zvyšná tretina Gumbo komponentom.&lt;/p&gt;

&lt;h2&gt;Slovník&lt;/h2&gt;

&lt;h3&gt;Životný cyklus Flex komponentu&lt;/h3&gt;

&lt;p&gt;Životný cyklus Flex komponentu je mechanizmus, ktorý Flex framework využíva na vytvorenie, správu a zánik komponentov a je navrhnutý tak aby z Flash Player-a vyťažil čo najviac.&lt;/p&gt;

&lt;h3&gt;Halo&lt;/h3&gt;

&lt;p&gt;Halo je komponentová architektúra použitá pre Flex 3 (framework) a skoršie verzie.&lt;/p&gt;

&lt;h3&gt;Gumbo/Spark&lt;/h3&gt;

&lt;p&gt;Gumbo je pracovné označenie novej verzie Flex (framework) a Flex Builder-a. Spark je označenie pre komponentovú a skinning architektúru použitú v Gumbo.&lt;/p&gt;

&lt;p&gt;Spark je rozšírením Halo architektúry.&lt;/p&gt;

&lt;h3&gt;Parts/Časti&lt;/h3&gt;

&lt;p&gt;Väčšina komponentov sa skladá z menších prvkov, ktoré nazývame Parts/časti. Ak si predstavíme napríklad Scrollbar, tak jeho časťami v tom najjednoduchšom prípade sú thumb a track (posuvník a plocha pod ním). Tieto časti tvoria deti komponentu. Teda nielen kontajnery ako ich poznáme z Flexu ale aj komponenty môžu mať deti.&lt;/p&gt;

&lt;h2&gt;Vzory Halo architektúry&lt;/h2&gt;

&lt;p&gt;Koncepty použité v Halo architektúre, sú dôležité pre porozumenie benefitov, ktoré ponúka Spark.&lt;/p&gt;

&lt;p&gt;Halo architektúra využíva &lt;em&gt;Invalidation/Validation model&lt;/em&gt;. Je to model, ktorý zabezpečuje agregáciu zmien a oddialenie práce do optimálneho času. Znamená to asi toľko, že ak nastavím nejaký parameter komponentu, napr. pozícia tlačidiel video prehrávača, tak zmeny sa neudejú okamžite, ale sú odložené dovtedy, kým nenastane vhodný čas. To ktorý čas to je a kedy nastane (Validation) sa dočítame neskôr v tomto článku.&lt;/p&gt;

&lt;p&gt;Ďalším vzorom je &lt;strong&gt;Event Interaction Model&lt;/strong&gt;. Vo Flex-e je všetko o eventoch (udalostiach), čokoľvek čo robíte je riadené udalosťami. Či je to už enterFrame udalosť prichádzajúca s posuvom hlavy prehrávača na každú jednu snímku, sieťová udalosť prichádzajúca s dátami zo servera alebo ako odozva interakcie užívateľa. Udalosť je informáciou, že sa v komponente niečo má stať alebo sa už stalo.&lt;/p&gt;

&lt;p&gt;Komponent sa skladá z častí. Tieto časti majú byť konfigurovateľné a parametrizovateľné, ako napr. štýl komponentu, pozícia ovládacích prvkov atď. Dobrým príkladom je aj prispôsobenie zoznamov (List). Bola by teda škoda ak by programátor bol nútený pre prispôsobenie bunky zoznamu dediť triedu komponentu a prepisovať jej metódy. Preto by mali komponenty ponúkať parametre ako &lt;em&gt;itemRenderers&lt;/em&gt; a &lt;em&gt;factories&lt;/em&gt; a umožniť tak vložiť svoj vlastný look-and-feel bunky listu. Takýto model nazývame &lt;em&gt;kompozícia&lt;/em&gt; — umožní vyskladať a prispôsobiť si komponent na svoj vlastný obraz.&lt;/p&gt;

&lt;p&gt;Životný cyklus komponentu je rozdelený do troch častí.&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;&lt;em&gt;Inicializácia&lt;/em&gt; (Initialization)

&lt;ol&gt;&lt;li&gt;&lt;a href="#construction"&gt;Konštrukcia&lt;/a&gt; (Construction)&lt;/li&gt;
&lt;li&gt;&lt;a href="#configuration"&gt;Konfigurácia&lt;/a&gt;, (Configuration)&lt;/li&gt;
&lt;li&gt;&lt;a href="#attachment"&gt;Pripojenie&lt;/a&gt;, (Attachment)&lt;/li&gt;
&lt;li&gt;&lt;a href="#initialization-initialization"&gt;Inicializácia&lt;/a&gt;, (Initialization)&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#updating"&gt;&lt;em&gt;Aktualizácia&lt;/em&gt;&lt;/a&gt; (Updating)

&lt;ol&gt;&lt;li&gt;Komponent odpovedá na zmeny pomocou &lt;a href="#updating-model"&gt;Invalidation/Validation modelu&lt;/a&gt; &lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#destruction"&gt;&lt;em&gt;Zánik&lt;/em&gt;&lt;/a&gt; (Destruction)

&lt;ol&gt;&lt;li&gt;Zíde z očí, zíde z mysle&lt;/li&gt;
&lt;li&gt;Odpojenie, Detachment&lt;/li&gt;
&lt;li&gt;&lt;a href="#destruction-weak"&gt;Garbage collection&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;h2&gt;&lt;a id="construction" name="construction"&gt; &lt;/a&gt;1.1 Konštrukcia/Construction&lt;/h2&gt;

&lt;p&gt;Je to čas, kedy sa rozhodnete, že váš komponent potrebuje existovať. Prvé dôležité rozhodnutie bude, z čoho bude váš komponent odvodený, z ktorej triedy bude dediť. Najnižšia trieda v hierarchii, z ktorej možno vo Flexe dediť komponenty je trieda &lt;strong&gt;UIComponent&lt;/strong&gt;. Obsahuje tie najzákladnejšie vlastnosti a metódy pre Flex komponenty.&lt;/p&gt;

&lt;p&gt;V ďalšom na čo by ste mali myslieť je, čo sa stane keď sa komponent inicializuje (instanciuje). Bude vytvorený cez ActionScript pomocou new operátora, alebo bude vytvorený cez MXML? Ak má byť požiadavka aby bol komponent vytváraný cez MXML, &lt;strong&gt;nemal by konštruktor obsahovať žiadne povinné atribúty&lt;/strong&gt;. Je možné použiť voliteľné argumenty ale ako Matt spomenul best practice Flex SDK komponentov je čo najväčší možný počet bez-argumentových konštruktorov.&lt;/p&gt;

&lt;p&gt;V konštruktore by sa malo odohrávať čo najmenej práce. Je možné pridávať napríklad event listenery (na vlastný komponent) ako &lt;code&gt;FlexEvent.CREATION_COMPLETE&lt;/code&gt;, MouseEvent-y, ktoré bude komponent handlovať, inicializovať konštanty a podobne.&lt;/p&gt;

&lt;h2&gt;&lt;a id="configuration" name="configuration"&gt; &lt;/a&gt;1.2 Konfigurácia/Configuration&lt;/h2&gt;

&lt;p&gt;Vlastnosti komponentov sú v tejto fáze nastavené interne a čakajú na neskoršie spracovanie, tzn. že hodnoty vlastností sú nastavené ešte predtým než sú do komponentu pridané akékoľvek časti (deti). Vlastnosti teda musia predpokladať, že časti komponentov ešte nemusia existovať. Prakticky sa hodnoty vlastností len uložia (do storage premenných) a spracujú sa neskôr, akonáhle budú deti komponentu existovať.
Príkladom takejto konfigurácie môže byť vlastnosť source video prehrávača. Setter pre source uloží hodnoty do premenných a oddiali ďalšiu prácu na vhodný čas. Časť video prehrávača, ktorá zobrazuje video, nemusi v čase, keď setter ukladá hodnoty existovať.&lt;/p&gt;

&lt;h2&gt;&lt;a id="attachment" name="attachment"&gt; &lt;/a&gt;1.3 Pripojenie/Attachment&lt;/h2&gt;

&lt;p&gt;Je to fáza, kedy je komponent pridaný do display listu. Každý vizuálny objekt, ktorý má byť zobrazený sa stáva dieťaťom display listu niekde v jeho stromovej štruktúre. Komponent je do tejto hierarchie pridaný cez &lt;code&gt;addChild()&lt;/code&gt; metódu jeho rodiča. &lt;strong&gt;Bez pripojenia do display listu sa životný cyklus komponentu zastaví&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;&lt;a id="initialization-initialization" name="initialization-initialization"&gt; &lt;/a&gt;1.4 Inicializácia/Initialization&lt;/h2&gt;

&lt;p&gt;Poslednou fázou prvej časti životného cyklu komponentu je inicializácia. V tejto fáze sa začína prvý Invalidation/Validation cyklus.&lt;/p&gt;

&lt;p&gt;Počas inicializácie prebehne 5 akcií: 
1. vyšle sa &lt;strong&gt;preinitialize&lt;/strong&gt; udalosť - hovorí o tom, že komponent bol vytvorený (alias konštruktora ak používate markup), vlastnosti boli nastavené a komponent bol pridaný do display listu (má nastavenú parent vlastnosť resp. má rodiča)
1. zavolá sa &lt;strong&gt;createChildren()&lt;/strong&gt; metóda - je to metóda, v ktorej sa fyzicky vytvárajú časti komponentu
1. vyšle sa &lt;strong&gt;initialize&lt;/strong&gt; udalosť - akonáhle boli vytvorené časti komponentu, vyšle sa initialize event
1. nastane prvý kompletný &lt;strong&gt;Invalidation/Validation cyklus&lt;/strong&gt;
1. vyšle sa &lt;strong&gt;creationComplete&lt;/strong&gt; udalosť&lt;/p&gt;

&lt;p&gt;Celá logika komponentu by mala začať fungovať až na &lt;code&gt;FlexEvent.CREATION_COMPLETE&lt;/code&gt; event. Preinitialize a initialize udalosti by mali byť určené na spúšťanie základných konfiguračných a špecifických inicializačných procesov vo vašom komponente.&lt;/p&gt;

&lt;h3&gt;Metóda createChildren()&lt;/h3&gt;

&lt;p&gt;Metóda, kde komponent vytvára svoje časti, ktoré sú vyžadované počas celého životného cyklu komponentu. Príkladom môže byť display video prehrávača. Display by mal byť viditeľný vždy, na rozdiel napríklad od ovládacích prvkov video prehrávača, ktoré môžu byť voliteľné.&lt;/p&gt;

&lt;p&gt;Ak komponent obsahuje dynamicky vytvárané časti, ktoré sa majú zobrazovať napríklad na základe nejakej udalosti alebo vlastnosti, tieto časti sa v &lt;code&gt;createChildren()&lt;/code&gt; metóde nevytvárajú a namiesto toho sa použije napríklad &lt;code&gt;commitProperties()&lt;/code&gt; metóda. Vytváranie dynamických častí komponentu neskôr odľahčuje túto metódu.&lt;/p&gt;

&lt;p&gt;Niektoré pravidlá Halo architektúry:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;UIComponent môže obsahovať čokoľvek (Sprites, Shapes, MovieClips, Video …)&lt;/li&gt;
&lt;li&gt;UIComponent musí mať rodiča UIComponent&lt;/li&gt;
&lt;li&gt;Container môže obsahovať iba UIComponent-y (pridanie napr. Sprite vyhodí runtime exception)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Po &lt;code&gt;createChildren()&lt;/code&gt; nasleduje initialize udalosť a prvý a plný Invalidation/Validation cyklus.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Invalidation&lt;/strong&gt; je fáza, ktorá je popísaná troma metódami:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;invalidateProperties()&lt;/li&gt;
&lt;li&gt;invalidateSize()&lt;/li&gt;
&lt;li&gt;invalidateDisplayList()&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Validation&lt;/strong&gt; je fáza, ktorá je popísaná nasledujúcimi metódami:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;commitProperties()&lt;/li&gt;
&lt;li&gt;measure()&lt;/li&gt;
&lt;li&gt;updateDisplayList()&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Volanie invalidačných metóda zabezpečí vývojár a volanie validačných metód zabezpečuje framework, v žiadnom prípade vývojár. Volanie &lt;code&gt;invalidateProperties()&lt;/code&gt; volá &lt;code&gt;commitProperties()&lt;/code&gt;, volanie &lt;code&gt;invalidateSize()&lt;/code&gt; volá &lt;code&gt;measure()&lt;/code&gt; a volanie &lt;code&gt;invalidateDisplayList()&lt;/code&gt; zabezpečí volanie &lt;code&gt;updateDisplayList()&lt;/code&gt; v správny čas. Poradie volania validačných metód zodpovedá poradiu v zozname vyššie.&lt;/p&gt;

&lt;p&gt;Po tomto cykle je odoslaná creationComplete udalosť a prvá fáza životného cyklu komponentu (Inicializácia) je ukončená.&lt;/p&gt;

&lt;h2&gt;&lt;a id="updating" name="updating"&gt; &lt;/a&gt;2.1 Aktualizácia/Updating&lt;/h2&gt;

&lt;p&gt;Komponent bol vytvorený, žije svoj príbeh a potrebuje vedieť ako sa aktualizovať. To pre neho zabezpečuje fáza 2.&lt;/p&gt;

&lt;p&gt;Aktualizácie nastávajú vtedy ak užívateľ pracuje s komponentom alebo ak iné časti kódu volajú/nastavujú metódy/vlastnosti komponentu. Pre odozvu na zmeny by mal komponent využívať Invalidation/Validation model. Dôvodov je viac.&lt;/p&gt;

&lt;p&gt;Jeden z najzásadnejších, si vyžaduje minimálne znalosti fungovania Flash Player-a. Flash ako taký pracuje so snímkami/frames. Flash aplikácie môžu pracovať na 12 snímkov za sekundu, animácie 24-25 snímkov za sekundu atď (extrémne nízky alebo vysoký frame rate je už iná debata). Horná hranica snímkov za sekundu sa dá vo Flash Player-i jednoducho nastaviť a väčšinou je vždy rešpektovaná, avšak &lt;strong&gt;určite nie je rešpektovaná ako spodná hranica,&lt;/strong&gt; a to z dôvodu ako funguje Flash Player elastic racetrack - dráha ktorú prejde Flash Player pri jednom snímku.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9rficVIXE1qzrj2t.png" alt=""/&gt;
(autor: &lt;a href="http://www.craftymind.com/2008/04/18/updated-elastic-racetrack-for-flash-9-and-avm2/" title="Sean Christmann"&gt;Sean Christmann&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Predstavme si, že sa po dráhe pohybujeme v smere hodinových ručičiek a začiatok dráhy je naspodu. Flash Player je od prírody jedno vláknový (single thread) a všetko čo vie robiť je spúšťať kód alebo renderovať, čiže delí svoj čas na dve časti. 
V prvej polovici spúšťa kopec kódu, dokončí spúšťanie a v druhej polovici dráhy začne renderovať. Renderovanie nemáme pod kontrolou, riadi ho Flash Player. Rendering je odpoveďou na to, čo sme spravili v našom kóde v predošlej polovici dráhy.&lt;/p&gt;

&lt;h3&gt;Heavy code execution&lt;/h3&gt;

&lt;p&gt;Čo sa však stane ak spúšťanie nášho kódu zaberie dlhý čas? Keďže Flash Player je single thread, nepovie počkaj-počkaj, musím renderovať, ale nechá nás dokončiť všetok kód. Ak modrá časť dráhy je príliš veľká, nastane moment výnimky na Script Limit a Flash Player vyhlási, že spúšťanie kódu trvalo príliš dlho. To je signálom, že robíme niečo zle a musíme časť spúšťaného kódu odložiť na neskôr.&lt;/p&gt;

&lt;h3&gt;Heavy rendering&lt;/h3&gt;

&lt;p&gt;Ak máme v display liste veľké množstvo display objektov, dráha sa predlžuje v rendering časti. To môžeme jedine ovplyvniť tým, že sa zamyslíme nad tým, prečo máme toľko vecí v display liste a snažíme sa ich zredukovať :)&lt;/p&gt;

&lt;p&gt;Životný cyklus Flex komponentu je postavený na základoch tohto frame modelu. Invalidation/validation proces profituje z elastic racetrack modelu a snaží sa spraviť si svoju prácu čo najefektívnejším spôsobom.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9rfjz20BA1qzrj2t.png" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;Opäť začíname na dráhe od spodu a v smere hodinových ručičiek. Kód je spustený až sa dostane cez celú modrú čiaru až na koniec. Počas tohto času (Invalidation) možeme v komponente zmeniť ľubovoľne veľa vlastností, zavolať ľubovoľne veľa metód, ale snažíme sa oddialiť prácu súvisiacu s renderovaním až na úplný koniec (Validation). Je to z toho dôvodu, že render prebehne len raz -  Flash Player sa nedá prinútiť aby renderoval viac krát za snímku alebo skôr.&lt;/p&gt;

&lt;p&gt;Toto je základný Invalidation/Validation model. 
Komponenty sedia v aplikácii, sú šťastné, čakajú na aktualizáciu. Niečo sa stane, prebehne aktualizácia. Počas aktualizačného procesu voláme invalidačné invalidateNiečo() metódy a na konci cyklu prebehne validácia. Po nej začne Flash Player renderovať.
&lt;a id="updating-model" name="updating-model"&gt; &lt;/a&gt;
Invalidation/Validation model je rozdelený do troch fáz:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;Aktualizácia vlastností komponentu: &lt;code&gt;invalidateProperties()&lt;/code&gt; -&gt; &lt;code&gt;commitProperties()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Aktualizácia veľkosti and rozmerov: &lt;code&gt;invalidateSize()&lt;/code&gt; -&gt; &lt;code&gt;measure()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Aktualizácia pozície a kreslených objektov: &lt;code&gt;invalidateDisplayList()&lt;/code&gt; -&gt; &lt;code&gt;updateDisplayList()&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;h3&gt;1. commitProperties()&lt;/h3&gt;

&lt;p&gt;Metóda zabezpečuje manažment vlastností (properties) komponentu. Ak sa zmení v komponente čokoľvek čo ovplyvní vlastnosti komponentu, zavoláme &lt;code&gt;invalidateProperties()&lt;/code&gt; aby sme komponent označili ako zmenený (dirty) a následne vo Validation fáze sa zavolá &lt;code&gt;commitProperties()&lt;/code&gt;. Táto metóda je volaná pred &lt;code&gt;measure()&lt;/code&gt; a &lt;code&gt;updateDisplayList()&lt;/code&gt; metódami.&lt;/p&gt;

&lt;p&gt;Flex Framework využíva na handlovanie vlasností vzor, ktorý nastavuje “dirty” príznaky a storage premenné. Modrú časť elastic racetrack sa snažíme udržať tenkú a rýchlu, ako je to len možné. “Dirty” príznaky nám umožnia filtrovať prácu v komponente na takú, ktorá skutočne musí byť vykonaná, čiže sa odstráni opakovanie spúšťania kódu.&lt;/p&gt;

&lt;p&gt;Metoda &lt;code&gt;commitProperties()&lt;/code&gt; poskytuje je skvelý čas na add/remove detí, ktoré NIE sú vyžadované počas celého životného cyklu komponentu. Všetky dynamické časti, ktoré sa majú pridať alebo ubrať na základe zmeny vlastností sa pridávajú a uberajú práve v &lt;code&gt;commitProperties()&lt;/code&gt; na rozdiel od statických častí, ktoré sú vytvárané v &lt;code&gt;createChildren()&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// ...
// default hodnota
private var _volume : Number = 4;
// dirty flag
private var volumenChanged : Boolean;
[Bindable("volumeChanged")]
public function get volume() : Number
{
    return _volume;
}

public function set volume(value : Number) : void
{
    // iba v pripade ak sa hodnota lisi od uz nastavenej
    if(_volume != value)
    {
        // nastav
        _volume = value;
        // oznac ako dirty
        volumeChanged = true;
        // invaliduj
        invalidateProperties();
        // dispatch bindable event
        dispatchEvent(new Event("volumeChanged"));
    }
}

// invalidateProperties zavola ...
override protected function commitProperties() : void
{
    // vzdy volame super, aby sa aj nas rodic dozvedel o validacii
    super.commitProperties();

    // ak je premenna dirty
    if(volumeChanged)
    {
        // validuj
        _soundTransform.volume = _volume/10;
        netStream.soundTransform = _soundTransform;
        volumeTrack.value = _volume;
        // nezabudni vycistit dirty priznak!!!
        volumeChanged = false;
    }

    // ...

}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;2. measure()&lt;/h3&gt;

&lt;p&gt;Metóda &lt;code&gt;measure()&lt;/code&gt; je volaná vo fáze validácie a je určená zmene veľkosti komponentu, resp. jej prepočítaniu. Je to čas, kedy komponent vypočíta svoju prirodzenú veľkosť, založenú na obsahu a layout pravidlách. Je to veľkosť, ktorú komponent preferuje mať. Využíva informácie o veľkosti svojich detí, layout pravidlá, layout contstrains atď. nato aby zistil svoju požadovanú veľkosť.&lt;/p&gt;

&lt;p&gt;Meranie veľkosti prebieha &lt;strong&gt;zospodu nahor&lt;/strong&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;mx:Application&gt;
    &lt;mx:HBox&gt;
        &lt;mx:Button/&gt;
    &lt;/mx:HBox&gt;
&lt;/mx:Application&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Button povie svojmu rodičovi (HBox) aký veľký chce byť. V ďalšom povie HBox svojmu rodičovi (Application) aký veľký chce byť. Keďže &lt;code&gt;measure()&lt;/code&gt; prebieha odspodu navrch, nie je nutné volať &lt;code&gt;measure()&lt;/code&gt; na každom dieťati zvlášť, pretože v čase ako sa volá &lt;code&gt;measure()&lt;/code&gt; na komponente, &lt;code&gt;measure()&lt;/code&gt; dieťaťa bola už dávno zavolaná.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Measure is kind of curious piece.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Framework optimalizuje volania &lt;code&gt;measure()&lt;/code&gt; na tie najnutnejšie. Povedzme, že máme nastavenú explicitnú veľkosť komponentu - &lt;code&gt;measure()&lt;/code&gt; sa nikdy nezavolá, pretože frameworku postačuje explicitné nastavenie veľkosti nato aby určil aký veľký komponent má byť. &lt;code&gt;measure()&lt;/code&gt; sa tiež nemusí zavolať ak sa použivajú iné layout pravidlá, layout constrains a podobne.&lt;/p&gt;

&lt;p&gt;Pre nás ako tvorcov komponentov to znamená - &lt;strong&gt;nikdy nedávať závislý kód do measure() metódy&lt;/strong&gt;, pretože sa môže ľahko stať, že sa metóda nikdy nezavolá.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;measure()&lt;/code&gt; metóda nastavuje štyri vlastnosti:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;code&gt;measureWidth&lt;/code&gt;, &lt;code&gt;measureHeight&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;measureMinWidth&lt;/code&gt;, &lt;code&gt;measureMinHeight&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;override protected function measure() : void
{
    // nezabudnime volat super()
    super.measure();&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var placement : String = getStyle('controlBarPlacement');

if(!placement)
{
    placement = "bottom";
}

var bm : EdgeMetrics  = borderMetrics;

if(placement == "bottom" || placement == "top")
{
    measuredWidth = Math.max(video.width, controlBar.getExplicitOrMeasuredWidth()) + bm.left;
    measuredHeight = bm.top + video.height + controlBar.getExplicitOrMeasuredHeight();
} else if(placement == "left" || placement == "right")
{
    measuredWidth = controlBar.getExplicitOrMeasuredWidth() + video.width;
    measuredHeight = Math.max(controlBar.getExplicitOrMeasuredHeight(), video.height) + bm.top;
}

// bezne je nastavit minima na zmerane hodnoty
measuredMinWidth = measuredWidth;
measuredMinHeight = measuredHeight;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;}&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;code&gt;getExplicitOrMeasuredWidth/Height()&lt;/code&gt; sa volá na UIComponente pre zistenie jeho veľkosti, pretože môže byť nastavená explicitne alebo ju bude treba predtým než sa vráti zmerať.&lt;/p&gt;

&lt;h3&gt;3. updateDisplayList()&lt;/h3&gt;

&lt;p&gt;Ak skončila validačná &lt;code&gt;measure()&lt;/code&gt; metóda, prechádzame na ďalšiu validačnú metódu &lt;code&gt;updateDisplayList()&lt;/code&gt;. Účelom tejto metódy, je rozloženie obsahu komponentu a dodatočné kreslenie, inými slovami - ideme ukladať a dokreslovať deti.&lt;/p&gt;

&lt;p&gt;Rozloženie a nastavenie pozície častí komponentu prebieha naopak ako ich meranie - &lt;strong&gt;Zhora nadol&lt;/strong&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;mx:Application&gt;
    &lt;mx:HBox&gt;
        &lt;mx:Button /&gt;
    &lt;/mx:HBox&gt;
&lt;/mx:Application&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Funguje to asi tak, že Application umiestni svoje deti (HBox) a HBox umiestni svoje deti (Button).  V metóde &lt;code&gt;updateDisplayList()&lt;/code&gt; je treba umiestniť a veľkostne prispôsobiť každú jednu časť komponentu.&lt;/p&gt;

&lt;p&gt;Platia tu isté pravidlá:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;ak dieťa, ktoré idem zväčšiť/zmenšiť a/alebo umiestniť je UIComponent, použijem  &lt;code&gt;setActualSize()&lt;/code&gt; pre zmenu veľkosti a &lt;code&gt;move()&lt;/code&gt; pre zmenu pozície. Je to z toho dôvodu, že keď nastavujeme width, height, x a y na UIComponent-e, tak sa dispatčujú move a resize eventy, ktoré sú postupne zachytené a vykonané za sebou. Namiesto toho sa používajú tieto dve metódy, ktoré agregujú move a/alebo resize eventy a vysielajú ich naraz.&lt;/li&gt;
&lt;li&gt;ak dieťa nie je UIComponent, nastavujeme &lt;code&gt;width&lt;/code&gt;, &lt;code&gt;height&lt;/code&gt;, &lt;code&gt;x&lt;/code&gt; a &lt;code&gt;y&lt;/code&gt; priamo cez vlastnosti.&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;
  &lt;p&gt;“updateDisplayList() je ideálne miesto pre použitie Flash Player Drawing API.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;Style support&lt;/h2&gt;

&lt;p&gt;Podpora štýlov je pripravená priamo v UIComponent-e. Našou požiadavkou je, aby sme užívateľovi nášho komponentu umožnili inline zmenu štýlov a vlastností súvisiacich so štýlmi. Na to aby sme mohli nastaviť štýl inline v MXML ako atribút, je nutné zadefinovať metadáta pre komponent, ktoré dekorujú triedu a dajú kompileru a IDE informácie o tomto štýle:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[Style(name="textSelectedColor", type="uint", format="Color", inherit="yes")]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Default hodnotu stýlu nastavíme priamo v komponente alebo v default.css súbore. Štýly sa môžu meniť run-time. Ak chceme komponent začleniť do run-time styling mechanizmu, musíme prepisať &lt;code&gt;styleChanged()&lt;/code&gt; metódu a zadefinovať, ako má komponent reagovať na zmenu štýlu. Táto metóda skontroluje, ktorý štýl sa zmenil a nastaví správnu invalidáciu.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;override public function styleChanged(styleProp : String) : void
{
    super.styleChanged(styleProp);

    if(styleProp == "controlBarPlacement")
    {
        invalidateSize();
        invalidateDisplayList();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;Hint&lt;/em&gt;:
Aké vlastnosti komponentu naprogramovať ako štýl?:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;ak daná zamýšlaná vlastnosť má viac dočinenia s prezentáciou, mal by to byť štýl,&lt;/li&gt;
&lt;li&gt;ak máme konštantu, ktorá má dočinenia s prezentáciou, mal by to byť štýl.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Udalosti vo Flex-e&lt;/h2&gt;

&lt;p&gt;Každý komponent by mal byť schopný počúvať na a vysielať udalosti. Ak potrebujeme mať udalosť nastaviteľnú a dostupnú inline z MXML, musíme opäť použiť metadáta pre event:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[Event(name="ready", type="mx.events.VideoEvent")]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Metadáta hovoria o tom, ako sa udalosť, ktorá je vysielaná volá a taktiež aký ma typ. Výhodou je používať vlastné triedy udalostí rozšírené napríklad od mx.events.Event. V takejto triede možeme ďalej definovať statické premenné ako názvy udalostí a tým dosiahnúť compile-time kontrolu na typy eventov. Pomocou rozšírených event tried vieme definovať ďalšie dodatočné informácie/vlastnosti vhodné pre event handlery.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hint&lt;/em&gt;: používajte desktriptívne názvy udalostí.&lt;/p&gt;

&lt;h2&gt;&lt;a id="destruction" name="destruction"&gt; &lt;/a&gt;3. Destroying the component!&lt;/h2&gt;

&lt;p&gt;Príde čas kedy aj váš komponent bude zapísaný do čiernej kroniky. Prvá vec, ktorá sa vykoná je detachment, alebo odparentovanie :) Komponent sa odstráni z display listu cez &lt;code&gt;removeChild()&lt;/code&gt; volanie. To spôsobí, že komponent nie je validovaný alebo prekreslovaný resp. Invalidation/Validation a draw metódy nefungujú! 
&lt;code&gt;removeChild()&lt;/code&gt; vracia referenciu na odstránený dokument, ktorú môžeme uschovať pre jeho reinkarnáciu (komponent nebude odstránený z pamäti cez garbage collector) ako napr. adopcia iným rodičom alebo niečo ako znovu-vytvorenie. Takýto spôsob znovu-využívania komponentov je oveľa lacnejší ako vytvorenie kompletne nového komponentu. Flex framework je plný takýchto príkladov (viď Datagrid).
&lt;a id="destruction-weak" name="destruction-weak"&gt; &lt;/a&gt;
O kompletné odstránenie komponentu z pamäti sa stará Garbage Collector (gc). Gc zoberie spolu so sebou do večných lovíšť celý komponent len v prípade, že sa na komponent neviažu žiadne referencie. Takýmito referenciami sa myslia napríklad event listenery, dictionaries (slovniky) alebo Timers.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hint&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;používajte parameter &lt;code&gt;useWeakReferences&lt;/code&gt; s hodnotou “true” pre &lt;code&gt;addEventListener&lt;/code&gt; metódu, potom ak jediná referencia na objekt je event listener samotný, tak bude objekt bude vymazaný z pamäte.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;code&gt;this.addEventListener(FlexEvent.CREATION_COMPLETE, creationComplete_Handler, false, 0, true);&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;takisto pre Dictionary plati, že slovníky môžu byť vytvorené s parametrom &lt;code&gt;useWeakReferences&lt;/code&gt;, potom ak jediná referencia na objekt je kľúč slovnika tak bude vymazaný z pamäte.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;code&gt;dict = new Dictionary(true);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Touto vetou končí aj popis životného cyklu komponentu vytvoreného na Halo architektúre.&lt;/p&gt;

&lt;h2&gt;Z Halo do Spark&lt;/h2&gt;

&lt;p&gt;Ako sme povedali na začiatku, komponentová architektúra Halo používa nasledovné vzory:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Invalidation/Validation Model&lt;/li&gt;
&lt;li&gt;Event Driven Interaction Model&lt;/li&gt;
&lt;li&gt;Composition&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Tieto vzory stále existujú v komponentovej architektúre Spark. Spark však pridáva svoje vlastné vzory. Jeden z nich je “&lt;strong&gt;separácia komponentovej logiky od jej vizuálu&lt;/strong&gt;”.&lt;/p&gt;

&lt;p&gt;Komponenty majú vlastnú “triedu komponentu”, v ktorej je zadefinovaná logika a funkcionalita celého komponentu, ktorá nemá nič spoločné s vizuálom komponentu. V tejto triede neexistuje žiadna logika, ktorá diktuje vizuál a look-and-feel komponentu. Namiesto toho má komponent pridelenú “skin triedu”, ktorá obsahuje všetky informácie pre layout a look-and-feel komponentu - čokoľvek vizuálne sa nachádza v tejto “skin triede”.
Tieto dve triedy navzájom komunikujú, ale sú od seba galvanicky oddelené. Trieda komponentu je napisaná v čistom ActionScript-e, a skin trieda je napisané v MXML.&lt;/p&gt;

&lt;p&gt;Ďalšou vlastnosťou okrem toho, že logika je od prezentácie úplne separovaná je kompozícia funkcionality. V Halo ak mal napríklad List komponent List single selection, mal aj multiple selection. Keď sme multiple selection nepotrebovali, nemali sme možnosť ju odstrániť z komponentu, iba vypnúť (resp. nezapnúť). Spark to vnima celkom ináč. List komponent má single seleciton vloženú “by default” a ak by sme chceli použiť multiple selection, tak by sme si ju museli osobitne pridať do komponentu. To umožňuje postaviť komponent na mieru, tak aby bol dostatočne malý a rýchly.&lt;/p&gt;

&lt;p&gt;Vzor, ktorý je vraj pravdepodobne najdôležitejším vzorom v Spark je “&lt;strong&gt;dizajnér-developer&lt;/strong&gt;” kontrakt udržiavaný cez dáta, časti a stavy (data, parts, states) komponentu.
Dáta, časti a stavy sú nám už viac menej jasné, jedine dodať, že stavy ako boli definované v Halo sa používajú rovnako aj teraz avšak všade tam, kde to je možné. Predstavme si napríklad tlačidlo, ktoré môže mať up-state, down-state a over-state. To všetko sa deje v triede komponentu (component class) a táto trieda je zodpovedná za to, že nastaví skin triedu (skin class) do požadovaného stavu, takže je jednoduché editovať vizuál komponentu v jeho jednotlivych stavoch. Komponent sa nestará o to ako sám vyzerá, pretože za všetko je zodpovedná skin trieda a takisto skin trieda sa zase nemusí odvolávať na žiadny kód v komponente aby zmenila svoj vizuál a layout.&lt;/p&gt;

&lt;h2&gt;Switchujeme na Gumbo&lt;/h2&gt;

&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Posaďte sa a popremýšlajte&lt;/strong&gt; - pre mňa vždy najdôležitejšia časť kódovania. Zalejem si kávu, vyhodím zvyšky slaniny z klávesnice a premyslím si čo je základnou funkcionalitou môjho komponentu, čo je dôvodom jeho života - to bude to, čo vložíme do našej komponentovej triedy. Ostatné vlastnosti, možnosti a funkcionality budú nabaľované na triedu neskôr. Napríklad pre video prehrávač platí, že jeho základnou funkcionalitou je prehrávanie videa, resp. video display. Ak niekto bude chcieť play button, bude mať play button ako dodatočnú funkcionalitu.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Spíšte časti&lt;/em&gt; (deti) &lt;em&gt;skinu&lt;/em&gt; - treba identifikovať všetky časti skinu, tak aby sa dali v ďalej upravovať. Rozdelíme skin na dve časti:

&lt;ol&gt;&lt;li&gt;prvá čast obsahuje skutočne potrebné časti, ktoré budu existovať po celý život komponentu (napr. video display)&lt;/li&gt;
&lt;li&gt;druhá čast obsahuje voliteľné časti ako napríklad play button, pause buton, volume slider a ostatné ovládacie prvky, ktoré sú dynamické a môžu existovať len určitú dobu&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pridajte Spark-špecifický kód&lt;/strong&gt; - ako prvé si zvolím správnu základnú triedu od ktorej budem dediť. Gumbo obsahuje množstvo nových tried, ktoré majú zapúzdrené nové funkcionality. Implementujte &lt;code&gt;partAdded()&lt;/code&gt; a &lt;code&gt;partRemoved()&lt;/code&gt; metódy, ktoré sú kľúčové metódy životného cyklu komponentu. Tieto metódy sú volané práve vtedy, keď sú časti komponentu pridávané alebo uberané. Tieto metódy handlujú vytváranie častí, pridávanie a odoberanie event listenerov a pod.
V ďalšom je nutné dohodnúť sa na správnych stavoch. Ak viem, že môj komponent bude obsahovať viac stavov ako tie čo zdelil od rodičovskej triedy, identifikujem ich a dopíšem.
Následne vytvoríme skins, to je kreatívna časť, kedy deklaratívne píšeme naše skin triedy, v hojnej miere aplikujeme markup a nové MXML graphics tagy. MXML graphics je množina tagov uvedená v Gumbo, ktoré obalujú renderovacie možnosti Flash Player-a. Sú to Graphics tags a Graphics primitives ako &lt;Rect&gt;, &lt;Fills&gt;, &lt;Stroke&gt;, Blend módy a všetky tie nádherné veci, ktoré Player dokáže.
Takže máme komponent triedu, máme skin triedu, ako ich galvanicky previažem? - jednoducho, cez css.&lt;/li&gt;
&lt;li&gt;Ak ste si mysleli, že už nič zaújimavšie vás nečaká, tak v tento krok je prekvapenie - &lt;strong&gt;vyhodíme kopec kódu&lt;/strong&gt; :) V Gumbo svete, nepotrebujem viac &lt;code&gt;createChildren()&lt;/code&gt;, pretože metódy &lt;code&gt;partAdded()&lt;/code&gt; a &lt;code&gt;partRemoved()&lt;/code&gt; handlujú tvorbu a zrušenie častí komponentu. &lt;code&gt;measure()&lt;/code&gt; a &lt;code&gt;updateDisplayList()&lt;/code&gt; sú nám na dve veci, pretože od teraz všetko handluje skin. Skin meria ako veľký chce byť, skin umiestňuje svoje časti.&lt;/li&gt;
&lt;/ol&gt;&lt;h2&gt;Zhrnutie&lt;/h2&gt;

&lt;p&gt;Od prednášky som očakával veľa, a veľa som aj dostal. Autorka prezentácie, dala k dispozícii &lt;a href="http://iamdeepa.com/blog/?p=39"&gt;zdrojové kódy&lt;/a&gt; z prednášky a taktiež je k dispozícii aj &lt;a href="http://tv.adobe.com/#vi+f15384v1002"&gt;záznam prednášky&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Flash Player Elastic Track - Learn it, love it, live it - dôležitý koncept, s ktorým je nutné sa skamarátiť. Snažíme sa udržať dráhu čo najokrúhlejšiu a čo najkratšiu. Ako to dosiahneme? Využijeme Invalidation/Validation model (all the cool kids doing it). Komponent dokáže byť s týmto modelom rýchlejší a chytrejší. Najlepšiu referenciu kódu životného cyklu komponentov máte priamo pred sebou - kód Flex framework-u.&lt;/p&gt;

&lt;p&gt;Zdroje:
&lt;a href="http://iamdeepa.com/blog/?p=39"&gt;http://iamdeepa.com/blog/?p=39&lt;/a&gt;
&lt;a href="http://tv.adobe.com/#vi+f15384v1002"&gt;http://tv.adobe.com/#vi+f15384v1002&lt;/a&gt;
&lt;a href="http://opensource.adobe.com/wiki/display/flexsdk/Gumbo"&gt;http://opensource.adobe.com/wiki/display/flexsdk/Gumbo&lt;/a&gt;
&lt;a href="http://opensource.adobe.com/wiki/display/flexsdk/Gumbo+Component+Architecture"&gt;http://opensource.adobe.com/wiki/display/flexsdk/Gumbo+Component+Architecture&lt;/a&gt;&lt;/p&gt;</description><link>http://labs.prasa.sk/post/1223506524</link><guid>http://labs.prasa.sk/post/1223506524</guid><pubDate>Tue, 16 Dec 2008 01:59:00 +0100</pubDate><category>flex</category><dc:creator>pink-fu</dc:creator></item><item><title>Introducing to Thermo and Next Generation of Flex @ MAX 2008</title><description>&lt;p&gt;&lt;i&gt;Speakers: Ryan Stewart, Steven Heintz&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Po Opening General Session to bola prvá prednáška, ktorú som absolvoval. Ubehol rok od prezentácii Thermo na MAX 2007 a ja som bol zvedavý ako ďaleko Thermo resp. dnes už Flash Catalyst je a kedy si ho budem môcť skúsiť naživo.&lt;/p&gt;

&lt;h2&gt;FXG ako univerzálny formát&lt;/h2&gt;

&lt;p&gt;Špecifikácia FXG (1.0) popisuje univerzálny grafický XML formát pre Flash Platform-u. FXG obsahuje vysoko-úrovňové grafické a textové objekty, ktoré sa využívajú na vytvorenie, združenie, transfomáciu a vizuálnu modifikáciu základných vektorových a rastrových tvarov. Renderovací model FXG sa približuje renderovaciemu modelu Flash Player-a 10 a ponúka všetky grafické možnosti Flash Platform-i spolu s podporou pre budúce možnosti Flash Player-a.&lt;/p&gt;

&lt;p&gt;FXG ako podmnožina MXML definuje výmenný formát pre Flash Catalyst. FXG je podporovaný v Creative Suite 4 a to Photoshop, Illustrator a Fireworks CS4.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Zdroj: &lt;a href="http://opensource.adobe.com/wiki/display/flexsdk/FXG+1.0+Specification"&gt;http://opensource.adobe.com/wiki/display/flexsdk/FXG+1.0+Specification&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;

&lt;h2&gt;Flash Catalyst&lt;/h2&gt;

&lt;p&gt;Flash Catalyst je to, čo sme všetci predtým poznali ako Thermo. Je to nový profesionálny dizajnérsky nástroj na tvorbu vzhľadu aplikácií a interaktívneho obsahu bez nutnosti programovania, čo môže siahať od interaktívnych reklám, cez produktové príručky a portfóliá až po užívateľské rozhrania pre aplikácie. Flash Catalyst umožňuje dizajnérom začať pri statických kompozíciách vytvorených v Adobe Photoshop CS4, Illustrator CS4 alebo Fireworks CS4 a skonvertovať vytvorenú predlohu do aplikácie s interaktívnom obsahom.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Zdroj: &lt;a href="http://labs.adobe.com/technologies/flashcatalyst/"&gt;http://labs.adobe.com/technologies/flashcatalyst/&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Myšlienka, ktorá sa skrýva za Catalyst-om je orientovaná na dizajnérov a umožňuje im vytvoriť skôr kompletné zážitky ako len “témy” a “skiny” v spolupráci paralelne s vývojármi.&lt;/p&gt;

&lt;p&gt;Preview verzia Flash Catalyst (Mac verzia) bola dostupná na Adobe MAX 2008 pre všetkých a bola distribuovaná na jednom DVD spolu s Gumbo-m (Mac aj Win verzia).&lt;/p&gt;

&lt;p&gt;Ryan Stewart po krátkom úvode spravil malé demo. Vychádzal z dizajnu vytvoreného vo Photoshop-e, ktorý ako *.psd importoval do Catalyst-u.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9mo443KNu1qzrj2t.jpg" alt=""/&gt;
Catalyst umožňuje import aj z aplikácií ako Adobe Illustrator alebo Adobe Fireworks.&lt;/p&gt;

&lt;p&gt;Počas importu *.psd dizajnu do aplikácie sa na pozadí generuje “well formed” kód v *.fxg formáte. Pridávanie stavov, prechodov a efektov je veľmi jednoduché vďaka dizajn módu.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9mo3iP9c81qzrj2t.jpg" alt=""/&gt;
Časová os umožňuje presne nastaviť dĺžku trvania prechodov v čase pomocou drag-n-drop.&lt;/p&gt;

&lt;p&gt;Ryan nakoniec vytvoril jednoduchý interaktívny element, kde cez dva kliky nadefinoval onClick akciu, ktorá nastaví run-time stav aplikácie. Nakoniec otvoril uloženú aplikáciu v novom Gumbo-vi, bohužial renderovanie v dizajn móde máličko zlyhalo.&lt;/p&gt;

&lt;p&gt;Snažil som sa vytvoriť si jednoduchú slideshow aplikáciu cez Catalyst a Gumbo. Dizajn som vytvoril cez Photoshop a následne importoval do Catalyst-u. Výsledok nebol moc uspokojivý, poloha objektov bola odlišná od originálu, väčšinou sa prvky nachádzali na pozícii 0, 0. Niektoré vektorové vrstvy boli úplne rozbité, bolo nutné ich rasterizovať vo Photoshop-e pred importom. Konverzia objektov na interaktívne elementy prebiehala hladko. Avšak pri náhľade projektu sa mi compiler ohlásil asi s 30-timi chybami. Na dnes som to nechal tak, ale v testovaní budem pokračovať :)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Edit:&lt;/em&gt; Chyba zrejme nebude v podkladoch ako som sa domnieval. Použil som pre import podklady z &lt;a href="http://thermoteamblog.com/"&gt;http://thermoteamblog.com/&lt;/a&gt; a aplikácia sa zachovala rovnako — objekty sú posunuté, rozbité a nepoužiteľné. Skúsim sa obrátiť na Thermo Team o pomoc, dúfam že sa problém vyrieši. Nerád by som odkladal zamýšlané články až k oficiálnemu vydaniu :)&lt;/p&gt;

&lt;h2&gt;Gumbo a Spark&lt;/h2&gt;

&lt;p&gt;Gumbo je názov pre novú verziu Flex Builder-a a Spark je označenie skin a komponentovej architektúry použitej pre Gumbo. Zásadnou novinkou je okrem nových vlastností samozrejme  vyššie popísané FXG, ktoré obsahuje základné grafické a textové elementy, skupinové elementy a možnosti základných transformácií. FXG obsahuje tagy pre tvorbu základných tvarov ako napr. &lt;rect&gt;, &lt;ellipse&gt; a &lt;path&gt;, tagy a atribúty pre výplne a obrysy týchto základných tvarov s rôznymi farbami, prechodmi alebo rastrami ako aj podporu pre filtre, masky, priehladnosti a blend módy na FXG elementoch.&lt;/path&gt;&lt;/ellipse&gt;&lt;/rect&gt;&lt;/p&gt;

&lt;p&gt;Heidi Bauer-Williams z Flex Builder tímu predstavila ďalšie zásadné novinky pre Gumbo.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9mo2iZO5R1qzrj2t.jpg" alt=""/&gt;&lt;em&gt;Package explorer&lt;/em&gt; — zlepšuje prehladnosť štruktúry kódu a umožňuje dokonca zobraziť už aj štruktúru swc knižníc&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9mo1zmIBj1qzrj2t.jpg" alt=""/&gt;&lt;em&gt;Templates&lt;/em&gt; — možnosť vytvorenia šablón pre rôzne typy súborov&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9mo1jfF3a1qzrj2t.jpg" alt=""/&gt;&lt;em&gt;Zobrazovanie ASDoc dokumentácie v tooltipoch&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9mo0gicPS1qzrj2t.jpg" alt=""/&gt;&lt;em&gt;Automatické generovanie getter-ov/setter-ov&lt;/em&gt; pre akúkoľvek premmennú v triede&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9mo03TqCx1qzrj2t.jpg" alt=""/&gt;&lt;em&gt;Automatické generovanie event handlerov&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9mnzp9M981qzrj2t.jpg" alt=""/&gt;&lt;em&gt;Skok na riadok&lt;/em&gt; v debugger-i po dosiahnutí breakpoint-u&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9mnz2XzXN1qzrj2t.jpg" alt=""/&gt;&lt;em&gt;Výskyt breakpoint-ov na základe podmienok&lt;/em&gt; — vhodné napr. pre debugging slučiek&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Network monitor&lt;/em&gt; — sledovanie sieťového trafiku z/do aplikácie, podpora HTTP a AMF protokolu. (bez náhľadu)&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9mny2zoXK1qzrj2t.jpg" alt=""/&gt;&lt;em&gt;Move refactoring&lt;/em&gt; — refaktoring na základe presunu v rámci package štruktúry. Konečne, lebo väčšinou si zvyknem umiestnenie triedy rozmyslieť vtedy, keď je takmer celá trieda dopísaná a dvakrát podedená.&lt;/p&gt;

&lt;p&gt;Bola zvýšená rýchlosť compiler-a ako aj znížená spotreba pamäte celej aplikácie. Bola pridaná podpora pre FlexUnit a jednoduchá integrácia PixelBender efektov.&lt;/p&gt;

&lt;p&gt;Práca s Flex Builderom je opäť o niečo jednoduchšia a príjemnejšia, avšak stále je čo zlepšovať. Závery si nedovolím robiť, pretože aplikácia nie je finálna a Adobe môže ešte všeličím prekvapiť. Koniec koncov, opísané “nové feature” sú bežnou vecou konkurenčných nástrojov. Dúfam len, že Adobe sa ich bude snažiť predbehnúť :)&lt;/p&gt;</description><link>http://labs.prasa.sk/post/1223363389</link><guid>http://labs.prasa.sk/post/1223363389</guid><pubDate>Mon, 08 Dec 2008 22:50:00 +0100</pubDate><category>personal</category><category>catalyst</category><category>thermo</category><category>spark</category><dc:creator>pink-fu</dc:creator></item><item><title>Ciao Italia</title><description>&lt;p&gt;Niektoré veci sa dejú úplne náhodne a sú o to príjemnejšie, že prídu práve vtedy, keď to nečakáte. Počul som z rozprávania o Adobe MAX udalosti, že sa tam dejú veľké veci, len som tomu nevenoval veľkú pozornosť lebo sa nedúfal, že raz sa takejto udalosti zúčastním aj ja sám.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://flashrealtime.com/" title="Tome"&gt;Tom&lt;/a&gt; vystrelil z motyky, môj &lt;a href="http://www.uptime.at" title="zamestnávateľ"&gt;zamestnávateľ&lt;/a&gt; to odobril a ani som sa nenazdal a 30-teho Novembra, deň pred Adobe MAX 2008 bol tu. Ďakujem!&lt;/p&gt;

&lt;p&gt;Šesť ráno. Vstávame Michal. Kávička, raňajky u &lt;a href="http://www.kvenda.com" title="Daša je kvenda.com"&gt;Dašky&lt;/a&gt;, hopsa šupsa na letisko, ešte že to bratislavské nie je hodinu ďaleko. Na checkin som prišiel posledný, s hŕstkou nevyspaných talianov prechádzam cez rentgen. Akurát pristálo naše lietadlo, dofúkajú gumy a fičíme. Sedím nakonci lietadla, vedľa dievka žmolí sáček, v duchu ju počujem modliť sa aby nešplechlo vedľa.&lt;/p&gt;

&lt;p&gt;Pristávame v Bergamo, u hipíka kupujem return ticket na Mailand central station. Hodinka a sme tam. Vyhodili nás priamo za hlavnou stanicou. Očkom idem kuknúť ako to tam vnútri vyzerá. Napodiv stanica nie je ošťatá, nevidím žiadnych pľuvajúcich počerných pred vchodom, nič čo by sa dalo porovnať s bratislavskou hlavnou stanicou. Vnútri to vyzerá ako iný svet, kilometrové stropy, milión ľudí, tristo koľají, v strede točiaci sa bilboard baťa. Idem do preč. Smer Via Mac Mahon. Po hodinovej prechádzke nachádzam hotel. Vnútri jeden Ind ako recepčná a majiteľ v ošúchanej žltej bunde. Majiteľ ani slovo po anglicky, a Ind mi lámane vysvetlil že mám počkať, “d rum iz klining”.&lt;/p&gt;

&lt;p&gt;Počkám, pravda. Chalaň spravil kávičku, a po otázke či majú internet access začal koktať. Leták píše, že v lobby by mal aspoň jeden byť. Problém je, že tu nemajú lobby. Pol hodinka a som na izbe. Skúsim wifi, nie, wifi tu nebýva. Sranda začala keď som chcel použiť elektrickú zásuvku. Nie, zásuvka sa nedá použiť. Tri dierky pod sebou, ktoré boli užšie ako vidlica od nabíjačky. Skúsil som silnejšie pritlačiť, že reku možno prejde cez ten plast. Nie, neprešlo. Pobalil som sa a odišiel na registráciu. Na recepcii som ešte spomenul svoj problém so zástrčkou, ukázal som mu koncovku a chalaň bez slova vytiahol redukciu, usmial sa, ja som sa usmial ešte viac.&lt;/p&gt;

&lt;p&gt;Milano Convention Centre je čo by kameňom dohodil. Reklamných predmetov mám plný batoh, je pol tretej a vyrážam do mesta pozrieť kam chodia celebrity. Po hodinke som prišiel k Duomo. Čierny pouličný predavač zo Senegalu mi núti cvernové náramky.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Aj tag jú maj bradr, for Afrika, and jú giv mí som many”. Podávam mu dve eurá, nech mám pokoj, nie nestačí. “Tú? Jú giv mí fajf, aj ken čejnďz jú”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ruku nato a idem do preč, smer la scala. Pred ňou ešte väčšia šóra ako pred Duomo. Fakt dlhá. Stmieva sa. Fičím na hotel. Cestou Crispy McBacon v čínskom mekdonalde. Pekný deň za nami.&lt;/p&gt;</description><link>http://labs.prasa.sk/post/1223275076</link><guid>http://labs.prasa.sk/post/1223275076</guid><pubDate>Sun, 07 Dec 2008 17:17:00 +0100</pubDate><category>personal</category><dc:creator>pink-fu</dc:creator></item><item><title>Hello Flex World</title><description>&lt;p&gt;Úvodník k poznámkovému bloku. Počiatočné fakty a fikcie. Prvá časť 356 dielnej argentínsko-brazílskej telenovely. Vitajte.&lt;/p&gt;

&lt;p&gt;Ahoj! Volám sa &lt;a href="http://www.linkedin.com/in/michalgron" title="Michal Gron, LinkedIn profil"&gt;Michal Gron&lt;/a&gt;. Som absolvent Fakulty elektrotechniky a informatiky STU v Bratislave v odbore Elektronika so špecializáciou na Mikroelektroniku.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l9mmikaKUz1qzrj2t.jpg" alt=""/&gt;&lt;/p&gt;

&lt;p&gt;Počas štúdia na Katedre Mikroelektroniky som spolupracoval na vývoji komplexného elektronického vzdelávacieho prostredia určeného pre študentov so špecializáciou na elektronické systémy.&lt;/p&gt;

&lt;p&gt;Od roku 2006 do roku 2008 som pôsobil v spoločnosti &lt;a href="http://www.e-learnmedia.sk" title="e-learnmedia, s.r.o."&gt;e-learnmedia, s.r.o.&lt;/a&gt; na vývoji elektronického vzdelávacieho obsahu.
Od roku 2008 pracujem ako Flex/AIR developer v spoločnosti &lt;a href="http://www.uptime.at/" title="uptime Slovakia, spol. s r.o."&gt;uptime Slovakia, spol. s r.o.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Toto miesto slúži na moje postrehy, nápady a poznámky z Flex/AIR sveta, poznámky z riešení Flex a AIR špecifických problémov súvisiacich s mojou pracovnou náplňou a taktiež poznámky z mojich osobných open-source projektov ako napr. &lt;a href="http://picasaflashapi.googlecode.com/" title="PicasaFlashAPI"&gt;PicasaFlashAPI&lt;/a&gt;. Dúfam, že tieto poznámky niekomu pomôžu, niekoho pobavia a že nikoho neurazia. Frekvencia bude skôr nižšia a nepravidelná :).&lt;/p&gt;</description><link>http://labs.prasa.sk/post/1221410510</link><guid>http://labs.prasa.sk/post/1221410510</guid><pubDate>Wed, 22 Oct 2008 13:50:00 +0200</pubDate><category>flex</category><category>personal</category><dc:creator>pink-fu</dc:creator></item></channel></rss>

