<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>23D &#187; AIR</title>
	<atom:link href="http://23d.cz/blog/tag/air/feed/" rel="self" type="application/rss+xml" />
	<link>http://23d.cz</link>
	<description>Just another 23d.cz weblog</description>
	<lastBuildDate>Tue, 31 Aug 2010 11:45:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PMD = Project Mess Detector</title>
		<link>http://labs.prasa.sk/view/pmd-project-mess-detector/</link>
		<comments>http://labs.prasa.sk/view/pmd-project-mess-detector/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 20:24:50 +0000</pubDate>
		<dc:creator>Michal Gron</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">tag:labs.prasa.sk,2010:/2.22</guid>
		<description><![CDATA[
        	<p>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ť.</p>
      ]]></description>
			<content:encoded><![CDATA[
        	<p><span class="caps">PMD</span> je nástroj, ktorý skenuje zdrojový kód a hľadá v ňom možné problémy ako:
	<ul>
		<li>nevhodný dizajn &#8211; prázdne <em>try&#8212;catch&#8212;finaly/switch</em> bloky &#8230;</li>
		<li>mŕtvy kód &#8211; nepoužívané lokálne premenné, parametre a privátne metódy &#8230;</li>
		<li>neoptimálny kód &#8211; nové inštancie v slučkách &#8230;</li>
		<li>prekomplikované výrazy &#8211; nepotrebné <em>if</em> výrazy, vnorené <em>for</em> cykly &#8230;</li>
		<li>duplicitný kód &#8211; copy-paste kód znamená copy-paste bugs</li>
	</ul></p>

	<blockquote>
		<p>Podľa tvorcov <span class="caps">PMD</span> skratka nemá žiadny <a href="http://pmd.sourceforge.net/meaning.html">význam</a>, ale minimálne jedna výstižná sa nájde: “Project Mess Detector”.</p>
	</blockquote>

	<h2>Prečo používať <span class="caps">PMD</span>?</h2>

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

	<h2>FlexPMD</h2>

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

	<p><a href="http://labs.prasa.sk/images/uploads/flexpmd_eclipse_plugin.png" onclick="window.open('http://labs.prasa.sk/images/uploads/flexpmd_eclipse_plugin.png','popup','width=1087,height=706,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://labs.prasa.sk/images/uploads/flexpmd_eclipse_plugin_thumb.png" style="border: 0;" alt="image" width="650" height="418" /></a></p>

	<p style="text-align:center;"><em>priamo v Eclipse prostredí,</em></p>

	<p><a href="http://labs.prasa.sk/images/uploads/flexpmd_hudson.png" onclick="window.open('http://labs.prasa.sk/images/uploads/flexpmd_hudson.png','popup','width=928,height=878,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://labs.prasa.sk/images/uploads/flexpmd_hudson_thumb.png" style="border: 0;" alt="image" width="650" height="614" /></a></p>

	<p style="text-align:center;"><em>v Hudson-e</em></p>

	<p><a href="http://labs.prasa.sk/images/uploads/flexpmd_viewer.png" onclick="window.open('http://labs.prasa.sk/images/uploads/flexpmd_viewer.png','popup','width=1019,height=853,scrollbars=no,resizable=yes,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://labs.prasa.sk/images/uploads/flexpmd_viewer_thumb.png" style="border: 0;" alt="image" width="650" height="542" /></a></p>

	<p style="text-align:center;"><em>alebo v prehliadači (<a href="http://opensource.adobe.com/svn/opensource/flexpmd/bin/flex-pmd-violations-viewer.html">http://opensource.adobe.com/svn/opensource/flexpmd/bin/flex-pmd-violations-viewer.html</a>).</em></p>

	<h2>Best practices</h2>

	<h3>Zvoľte si pravidlá, ktoré vám vyhovujú</h3>

	<p>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: <a href="http://opensource.adobe.com/svn/opensource/flexpmd/bin/flex-pmd-ruleset-creator.html">http://opensource.adobe.com/svn/opensource/flexpmd/bin/flex-pmd-ruleset-creator.html</a>.</p>

	<h3>Používajte <span class="caps">IDE</span> plugin</h3>

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

	<h3>Nesnažte sa dosiahnúť 0 výnimiek</h3>

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

	<h2>Literatúra:</h2>

	<ol>
		<li><span class="caps">PMD</span>, <a href="http://pmd.sourceforge.net/">http://pmd.sourceforge.net/</a></li>
		<li>FlexPMD, Adobe, <a href="http://opensource.adobe.com/wiki/display/flexpmd/FlexPMD">http://opensource.adobe.com/wiki/display/flexpmd/FlexPMD</a></li>
		<li>Hudson, <a href="http://hudson-ci.org/">http://hudson-ci.org/</a></li>
		<li>Improving Project Quality with <span class="caps">PMD</span>, Tom Wheeler, <a href="http://jnb.ociweb.com/jnb/jnbJun2004.html">http://jnb.ociweb.com/jnb/jnbJun2004.html</a></li>
	</ol> 
      ]]></content:encoded>
			<wfw:commentRss>http://labs.prasa.sk/view/pmd-project-mess-detector/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jednotné nastavenia mxmlc kompilátora</title>
		<link>http://labs.prasa.sk/view/jednotne-nastavenia-mxmlc-kompilatora/</link>
		<comments>http://labs.prasa.sk/view/jednotne-nastavenia-mxmlc-kompilatora/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 08:51:22 +0000</pubDate>
		<dc:creator>Michal Gron</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">tag:labs.prasa.sk,2010:/2.21</guid>
		<description><![CDATA[
        	<p>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.</p>
      ]]></description>
			<content:encoded><![CDATA[
        	<p>Kedysi moje nastavenie vyzeralo nejako takto:</p>

<div class="codeblock"><code><span style="color: #000000">
<span style="color: #006600">-</span><span style="color: #0000CC">locale&nbsp;en_US&nbsp;</span>
</span>
</code></div>

	<p>Po čase sa rozrástlo na:</p>

<div class="codeblock"><code><span style="color: #000000">
<span style="color: #006600">-</span><span style="color: #0000CC">locale&nbsp;en_US&nbsp;</span><span style="color: #006600">-</span><span style="color: #0000CC">keep</span><span style="color: #006600">-</span><span style="color: #0000CC">generated</span><span style="color: #006600">-</span><span style="color: #0000CC">actionscript&nbsp;</span><span style="color: #006600">-</span><span style="color: #0000CC">incremental&nbsp;</span><span style="color: #006600">-</span><span style="color: #0000CC">optimize</span><span style="color: #006600">=</span><span style="color: #0000CC">false&nbsp;<br /></span><span style="color: #006600">-</span><span style="color: #0000CC">keep</span><span style="color: #006600">-</span><span style="color: #0000CC">as3</span><span style="color: #006600">-</span><span style="color: #0000CC">metadata</span><span style="color: #006600">+=</span><span style="color: #0000CC">Collaborative</span><span style="color: #006600">,</span><span style="color: #0000CC">Keywords&nbsp;<br /></span><span style="color: #006600">-</span><span style="color: #0000CC">define</span><span style="color: #006600">=</span><span style="color: #0000CC">APPLICATION</span><span style="color: #006600">::</span><span style="color: #0000CC">debug</span><span style="color: #006600">,</span><span style="color: #0000CC">true&nbsp;</span><span style="color: #006600">-</span><span style="color: #0000CC">define</span><span style="color: #006600">=</span><span style="color: #0000CC">APPLICATION</span><span style="color: #006600">::</span><span style="color: #0000CC">release</span><span style="color: #006600">,</span><span style="color: #0000CC">false&nbsp;</span>
</span>
</code></div>

	<p>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 &#8230;). Pri najlepšom je to pár hodín roboty.</p>

	<p>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 <a href="http://en.wikipedia.org/wiki/Don&#39;t_repeat_yourself"><span class="caps">DRY</span></a>.</p>

	<p>1. 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ť. <br />
<div class="codeblock"><code><span style="color: #000000">
<span style="color: #0000CC">&lt;?xml&nbsp;version</span><span style="color: #006600">=</span><span style="color: #CC0000">"1.0"</span><span style="color: #0000CC">?&gt;<br /></span><span style="color: #006600">&lt;</span><span style="color: #0000CC">flex</span><span style="color: #006600">-</span><span style="color: #0000CC">config</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">compiler</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">define</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">name</span><span style="color: #006600">&gt;</span><span style="color: #0000CC">APPLICATION</span><span style="color: #006600">::</span><span style="color: #0000CC">debug</span><span style="color: #006600">&lt;/</span><span style="color: #0000CC">name</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">value</span><span style="color: #006600">&gt;</span><span style="color: #0000CC">false</span><span style="color: #006600">&lt;/</span><span style="color: #0000CC">value</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #0000CC">define</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">define</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">name</span><span style="color: #006600">&gt;</span><span style="color: #0000CC">APPLICATION</span><span style="color: #006600">::</span><span style="color: #0000CC">release</span><span style="color: #006600">&lt;/</span><span style="color: #0000CC">name</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">value</span><span style="color: #006600">&gt;</span><span style="color: #0000CC">true</span><span style="color: #006600">&lt;/</span><span style="color: #0000CC">value</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #0000CC">define</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">keep</span><span style="color: #006600">-</span><span style="color: #0000CC">as3</span><span style="color: #006600">-</span><span style="color: #0000CC">metadata</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">name</span><span style="color: #006600">&gt;</span><span style="color: #0000CC">Bindable</span><span style="color: #006600">&lt;/</span><span style="color: #0000CC">name</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">name</span><span style="color: #006600">&gt;</span><span style="color: #0000CC">Managed</span><span style="color: #006600">&lt;/</span><span style="color: #0000CC">name</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">name</span><span style="color: #006600">&gt;</span><span style="color: #0000CC">ChangeEvent</span><span style="color: #006600">&lt;/</span><span style="color: #0000CC">name</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">name</span><span style="color: #006600">&gt;</span><span style="color: #0000CC">NonCommittingChangeEvent</span><span style="color: #006600">&lt;/</span><span style="color: #0000CC">name</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">name</span><span style="color: #006600">&gt;</span><span style="color: #0000CC">Transient</span><span style="color: #006600">&lt;/</span><span style="color: #0000CC">name</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">name</span><span style="color: #006600">&gt;</span><span style="color: #0000CC">Collaborative</span><span style="color: #006600">&lt;/</span><span style="color: #0000CC">name</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">name</span><span style="color: #006600">&gt;</span><span style="color: #0000CC">Keywords</span><span style="color: #006600">&lt;/</span><span style="color: #0000CC">name</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #0000CC">keep</span><span style="color: #006600">-</span><span style="color: #0000CC">as3</span><span style="color: #006600">-</span><span style="color: #0000CC">metadata</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">keep</span><span style="color: #006600">-</span><span style="color: #0000CC">generated</span><span style="color: #006600">-</span><span style="color: #0000CC">actionscript</span><span style="color: #006600">&gt;</span><span style="color: #0000CC">true</span><span style="color: #006600">&lt;/</span><span style="color: #0000CC">keep</span><span style="color: #006600">-</span><span style="color: #0000CC">generated</span><span style="color: #006600">-</span><span style="color: #0000CC">actionscript</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">optimize</span><span style="color: #006600">&gt;</span><span style="color: #0000CC">false</span><span style="color: #006600">&lt;/</span><span style="color: #0000CC">optimize</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">incremental</span><span style="color: #006600">&gt;</span><span style="color: #0000CC">true</span><span style="color: #006600">&lt;/</span><span style="color: #0000CC">incremental</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #0000CC">compiler</span><span style="color: #006600">&gt;<br />&lt;/</span><span style="color: #0000CC">flex</span><span style="color: #006600">-</span><span style="color: #0000CC">config</span><span style="color: #006600">&gt;&nbsp;</span>
</span>
</code></div></p>

	<p>2. 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:<br />
<div class="codeblock"><code><span style="color: #000000">
<span style="color: #006600">-</span><span style="color: #0000CC">load</span><span style="color: #006600">-</span><span style="color: #0000CC">config</span><span style="color: #006600">+=</span><span style="color: #0000CC">app</span><span style="color: #006600">-</span><span style="color: #0000CC">config</span><span style="color: #006600">.</span><span style="color: #0000CC">xml&nbsp;</span>
</span>
</code></div></p>

	<p>3. Pri budúcej zmene kompilačných argumentov stačí editovať xml súbor a zmeny rozdistribuovať cez svn.</p>

	<p>Literatúra:
	<ol>
		<li>Xavi Beumala (Technical Architect, Adobe), Streamlining your Flex project environment, <a href="http://www.adobe.com/devnet/flex/articles/flex_streamline_project_environment_print.html">http://www.adobe.com/devnet/flex/articles/flex_streamline_project_environment_print.html</a></li>
	</ol></p> 
      ]]></content:encoded>
			<wfw:commentRss>http://labs.prasa.sk/view/jednotne-nastavenia-mxmlc-kompilatora/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Transparentní okna v AIRové aplikaci s Flex SDK 4</title>
		<link>http://www.viktorbezdek.cz/2009/11/transparentni-okna-v-airove-aplikaci-s-flex-sdk-4/</link>
		<comments>http://www.viktorbezdek.cz/2009/11/transparentni-okna-v-airove-aplikaci-s-flex-sdk-4/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 10:00:39 +0000</pubDate>
		<dc:creator>Viktor Bezděk</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[flex sdk 4]]></category>
		<category><![CDATA[opaque]]></category>
		<category><![CDATA[průhledné okno]]></category>
		<category><![CDATA[transparent]]></category>

		<guid isPermaLink="false">http://www.viktorbezdek.cz/?p=129</guid>
		<description><![CDATA[Dnes jsem potřeboval vytvořit AIRovou miniaplikaci, která má vlastní chrome, jenže WindowedApplication (respektive Window/NativeWindow) ve Flex SDK 4 nemá property backgroundAlpha. Jak tedy na transparentní pozadí?
Řešení není nijak závratně složité. Nejdříve je třeba nastavit v AIR Application Descriptoru hodnotu systemChrome na none a transparent na true. Tohle se nijak neliší od předchozí verze SDK. Stejně [...]]]></description>
			<content:encoded><![CDATA[<p>Dnes jsem potřeboval vytvořit AIRovou miniaplikaci, která má vlastní chrome, jenže WindowedApplication (respektive Window/NativeWindow) ve Flex SDK 4 nemá property backgroundAlpha. Jak tedy na transparentní pozadí?<span id="more-129"></span></p>
<p>Řešení není nijak závratně složité. Nejdříve je třeba nastavit v AIR Application Descriptoru hodnotu <em>systemChrome<strong> </strong></em>na <em>none </em>a <em>transparent</em> na <em>true</em>. Tohle se nijak neliší od předchozí verze SDK. Stejně jako dříve je třeba nastavit v tagu <em>WindowedApplication<strong> </strong></em>několik hodnot:</p>
<ul>
<li><em>type</em> na <em>NativeWindowType.LIGHTWEIGHT</em></li>
<li><em>systemChrome </em>na<em> NativeWindowSystemChrome.NONE</em></li>
<li><em>transparent </em>na<em> true</em></li>
<li><em>showStatusBar </em>na<em> false</em></li>
<li><em>showTitleBar </em>na<em> false</em></li>
<li><em>opaqueBackground </em>na<em> null</em></li>
</ul>
<p>Poté je třeba vytvořit nový skin pro komponentu <em>WindowedApplication</em> nejjednodušší řešení je udelat si kopii defaultního skinu a z ní odmazat pozadí, které tam mít nechceme. Výsledný skinClass pak vypadá zhruba takto:</p>
<pre>&lt;s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
    alpha.disabledGroup="0.5" &gt;

    &lt;fx:Metadata&gt;
      [HostComponent("Object")]
    &lt;/fx:Metadata&gt;

    &lt;fx:Script&gt;
        static private const exclusions:Array = ["backgroundRect", "bgFill", "contentGroup", "statusText"];
        override public function get colorizeExclusions():Array {return exclusions;}
    &lt;/fx:Script&gt;

     &lt;s:states&gt;
        &lt;s:State name="normal" /&gt;
        &lt;s:State name="disabled" stateGroups="disabledGroup" /&gt;
        &lt;s:State name="normalInactive" stateGroups="inactiveGroup" /&gt;
        &lt;s:State name="disabledInactive" stateGroups="disabledGroup, inactiveGroup" /&gt;
    &lt;/s:states&gt;

    &lt;!-- layer 2: content + status bar --&gt;
    &lt;s:Group left="0" right="0" top="0" bottom="0" minHeight="24" minWidth="0" &gt;
        &lt;s:layout&gt;
            &lt;s:VerticalLayout gap="0"/&gt;
        &lt;/s:layout&gt;

        &lt;!-- content --&gt;
        &lt;s:Group id="contentGroup" width="100%" height="100%" minHeight="0" minWidth="0"/&gt;

        &lt;!-- status bar --&gt;
        &lt;s:Group id="statusBar" width="100%" minHeight="24" &gt;
            &lt;!-- status text --&gt;
            &lt;s:SimpleText id="statusText" top="2" bottom="2" left="10" right="10" verticalAlign="middle"
                fontSize="10" color="0x585858" width="100%" truncation="1" /&gt;
        &lt;/s:Group&gt;
    &lt;/s:Group&gt;

&lt;/s:SparkSkin&gt;</pre>
<p>Tento vytvořený skin pak předejte WindowedApplication a vše je hotové.</p>
<p><strong>Připomínám, že tento článek je psaný v době, kdy je Flex SDK 4 ve verzi beta 2. Ve finální verzi se může leccos změnit.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.viktorbezdek.cz/2009/11/transparentni-okna-v-airove-aplikaci-s-flex-sdk-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Betaverze Adobe Flash Player 10.1 a AIR 2.0 na Labs ke stažení</title>
		<link>http://michalmetlicka.cz/2009/11/17/betaverze-adobe-flash-player-10-1-a-air-2-0-na-labs-ke-stazeni/</link>
		<comments>http://michalmetlicka.cz/2009/11/17/betaverze-adobe-flash-player-10-1-a-air-2-0-na-labs-ke-stazeni/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 10:22:02 +0000</pubDate>
		<dc:creator>Michal Metlička</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Obecné]]></category>

		<guid isPermaLink="false">http://michalmetlicka.cz/?p=485</guid>
		<description><![CDATA[Na Adobe Max 2009 v Los Angeles jsme představili připravované verze Flash Player 10.1 a Adobe AIR 2. Nyní konečně můžeme tyto verze poskytnout na testování i našim uživatelům a hlavně vývojářům.
Jedná se o nesmírně významnou verzi pro Adobe. Flash Player 10.1 je první verze, která podporuje nejenom všechny tři hlavní operační systémy (je to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=michalmetlicka.cz&#38;blog=1580625&#38;post=485&#38;subd=michalmetlicka&#38;ref=&#38;feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Na Adobe Max 2009 v Los Angeles jsme představili připravované verze Flash Player 10.1 a Adobe AIR 2. Nyní konečně můžeme tyto verze poskytnout na testování i našim uživatelům a hlavně vývojářům.</p>
<p>Jedná se o nesmírně významnou verzi pro Adobe. Flash Player 10.1 je první verze, která podporuje nejenom všechny tři hlavní operační systémy (je to poprvé, co uvádíme všechny 3 verze zcela simultánně), ale hlavně v rámci Open Screen Project budeme spolu s našimi partnery postupně uvádět FP 10.1 i pro mobilní telefony a další zařízení.</p>
<h3>Co je v Flash Player 10.1 a AIR 2.0 nového?</h3>
<ul>
<li>Podpora multi-touch a gest</li>
<li>Global error handler (umožňuje jednotně zpravovat a řešit všechny chyby vznikající při běhu aplikace)</li>
<li>Lokální přístup k mikrofonu (můžete nahrávat znuk z mikrofonu, aniž byste jej museli nejprve odesílat na server)</li>
<li>Podpora hardwarového dekódování videa ve formátu H.264 na platformách Windows, mobilních zařízeních nebo přenosných počítačích netbook.</li>
</ul>
<h3>Další novinky specifické pro AIR:</h3>
<ul>
<li>Native process API (umožňuje aplikacím v AIR 2.0 komunikovat s jinými aplikacemi na počítači uživatele)</li>
<li>Mass Storage Device Detection (AIR 2.0 aplikace může přímo púřistupovat k datům uloženým na USB klíčence nebo na vaší videokameře)</li>
<li>Open document API (AIR aplikace má přístup k informacím o tom, jaká aplikace je přiřazena danému typu souboru a může tuto aplikaci vyvolat)</li>
<li>Vylepšená podpora sockets (rozšířené možnosti pro P2P aplikace)</li>
<li>Nová verze WebKit, která obsahuje rychlejší zpracování JavaScriptu a podporuje HTML5 a CSS3</li>
</ul>
<p>Chcete-li vědět více o novinkách, které tyto produkty přináší, podívejte se na stránky s funkcemi a vlastnostmi na Adobe Labs (<a href="http://labs.adobe.com/wiki/index.php/AIR_2:Release_Notes#New_Features_in_AIR_2"><strong>AIR 2.0</strong></a>, F<a href="http://labs.adobe.com/technologies/flashplayer10/features.html"><strong>lash Player 10.1</strong></a>). Také doporučuji další weby s informacemi: <strong><a href="http://tv.adobe.com/show/max-2009-develop/">Adobe TV</a></strong>, případně <strong><a href="http://blogs.adobe.com/cantrell/">Blog Christiana Cantrella</a></strong> (Product Managera AIR 2.0)</p>
<p>Nové betaverze se snaží zachovat maximální kompatibilitu z předchozími verzemi, ale vzhledem k tomu že se jedná o betaverze &#8211; mohou občas nastat potíže. Betaverze si můžete stáhnout zde:</p>
<p><strong><a href="http://">Adobe AIR2</a></strong></p>
<p><strong><a href="http://labs.adobe.com/downloads/flashplayer10.html">Adobe Flash Player 10.1</a></strong></p>
Posted in Adobe, Flash, Obecné Tagged: Adobe, AIR, Flash <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/michalmetlicka.wordpress.com/485/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/michalmetlicka.wordpress.com/485/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/michalmetlicka.wordpress.com/485/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/michalmetlicka.wordpress.com/485/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/michalmetlicka.wordpress.com/485/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/michalmetlicka.wordpress.com/485/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/michalmetlicka.wordpress.com/485/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/michalmetlicka.wordpress.com/485/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/michalmetlicka.wordpress.com/485/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/michalmetlicka.wordpress.com/485/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=michalmetlicka.cz&blog=1580625&post=485&subd=michalmetlicka&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://michalmetlicka.cz/2009/11/17/betaverze-adobe-flash-player-10-1-a-air-2-0-na-labs-ke-stazeni/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Soutěž s Adobe User Group Czech o software od Adobe za $2100 – pravidla, podmínky a zadání</title>
		<link>http://www.viktorbezdek.cz/2009/10/soutez-s-adobe-user-group-czech-o-software-od-adobe-za-2100-pravidla-podminky-a-zadani/</link>
		<comments>http://www.viktorbezdek.cz/2009/10/soutez-s-adobe-user-group-czech-o-software-od-adobe-za-2100-pravidla-podminky-a-zadani/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 06:15:04 +0000</pubDate>
		<dc:creator>Viktor Bezděk</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[AUG]]></category>
		<category><![CDATA[Events/Conferences]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[soutěž]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.viktorbezdek.cz/?p=105</guid>
		<description><![CDATA[Na včerejším UG meetingu byla vyhlášena soutěz o software od Adobe za $2100. V tomto článku naleznete podrobné informace o tom, jak se soutěže zůčastnit, co se může, co se naopak nesmí a jaká jsou pravidla. Zadání je natolik volné, že se může zůčastnit téměř každý, nemeškejte tedy a ukažte co ve vás je!
Témata soutěže
Nemohli [...]]]></description>
			<content:encoded><![CDATA[<p>Na včerejším UG meetingu byla vyhlášena soutěz o software od Adobe za $2100. V tomto článku naleznete podrobné informace o tom, jak se soutěže zůčastnit, co se může, co se naopak nesmí a jaká jsou pravidla. Zadání je natolik volné, že se může zůčastnit téměř každý, nemeškejte tedy a ukažte co ve vás je!<span id="more-105"></span></p>
<h3>Témata soutěže</h3>
<p>Nemohli jsme se rozhodnout pro jedno konkrétní téma, tak jsme jich připravili hned několik,  abyste si mohli vybrat to, které vám nejvíce sedne.</p>
<ul>
<li><strong>Tutoriál</strong>
<ul>
<li>Může být na jakékoli téma. Jedinou podmínkou je, že musí být určený na technologie Adobe z kategorie Flash Platform. V úvahu tedy připadá Flash, Flex, Flash Catalyst, Pixel Bender apod. Samozřejmé je, že tutoriál může využívat více těchto technologií. Není přípustné, aby tutoriál byl kopie něčeho co už je na internetu.</li>
</ul>
</li>
<li><strong>Vizualizace dat či zvuku ve Flash Playeru</strong>
<ul>
<li>Nemyslím, že je třeba cokoli dodávat. Snad jen, že je možné využívat OpenSource frameworky, ale není přípustné modifikovat již existující vizualizaci. Pro zařazení do soutěže je nutné dát k dispozici světu zdrojové kódy.</li>
</ul>
</li>
<li><strong>Nejpůsobivější AIR aplikace</strong>
<ul>
<li>Autorem aplikace musíte být výhradně vy. Lze používat jakékoli frameworky. Není přípustné používat cizí kód, nebo prezentovat aplikaci vytvořenou podle tutoriálu. Pro zařazení do soutěže je nutné dát k dispozici světu zdrojové kódy.</li>
</ul>
</li>
<li><strong>Nejpůsobivější Facebook aplikace</strong>
<ul>
<li>Autorem aplikace musíte být výhradně vy. Lze používat jakékoli frameworky. Není přípustné používat cizí kód, nebo prezentovat aplikaci vytvořenou podle tutoriálu. Pro zařazení do soutěže je nutné dát k dispozici světu zdrojové kódy.</li>
</ul>
</li>
<li><strong>Nejpůsobivější RTMP aplikace</strong>
<ul>
<li>Autorem aplikace musíte být výhradně vy. Lze používat jakékoli frameworky. Není přípustné používat cizí kód, nebo prezentovat aplikaci vytvořenou podle tutoriálu. Pro zařazení do soutěže je nutné dát k dispozici světu zdrojové kódy.</li>
</ul>
</li>
</ul>
<p><em>Po skončení soutěže zdrojové kódy umístíme na Google Code, kde budou zdarma k dispozici každému zájemci.</em></p>
<h3>Pravidla</h3>
<ul>
<li>Zúčastnit se může každý člen Adobe UG Czech. Pokud členem nejste, můžete se jím snadno stát.</li>
</ul>
<h3>Jak bude probíhat výběr vítěze</h3>
<ul>
<li><strong>Každý zůčastněný musí svou práci odevzdat do 31.12.2009</strong></li>
<li>Ze všech odevzdaných prací vedení UG vybere 1-2 práce z každé kategorie. Jejich autory informujeme o nominaci.</li>
<li>Tyto práce se budou prezentovat na lednovém UG meetingu &#8211; pokud autor práce nebude na UG meetingu přítomen, je automaticky diskvalifikován.</li>
<li>Účastníci UG meetingu budou hlasovat, která z prací je nejlepší.</li>
<li>Autor práce s nejvíce hlasy se stane vítězem soutěže.</li>
</ul>
<h3>Výhra</h3>
<ul>
<li>Výhrou je, jak již bylo několikrát zmíněno, jeden kus software od Adobe dle vlastního výběru v maximální hodnotě $2100</li>
<li>Nemůže se jednat o enterprise software (Flash Media Server, Connect Pro &#8230;)</li>
<li>Nemůže se jednat o upgrade (např. na Master Collection)</li>
<li>Výherci bude dodán emailem odkaz na stažení software a licenční číslo. Není možné dodat boxovanou verzi.</li>
</ul>
<p>Hotové příspěvky posílejte na  můj e-mail <strong><em>ja (zavinac) viktorbezdek (tecka) cz</em></strong>.</p>
<p>Budeme se těšit s čím příjdete.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.viktorbezdek.cz/2009/10/soutez-s-adobe-user-group-czech-o-software-od-adobe-za-2100-pravidla-podminky-a-zadani/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Začíname s Picasa Web API</title>
		<link>http://labs.prasa.sk/view/zaciname-s-picasa-web-api/</link>
		<comments>http://labs.prasa.sk/view/zaciname-s-picasa-web-api/#comments</comments>
		<pubDate>Sun, 22 Mar 2009 18:13:15 +0000</pubDate>
		<dc:creator>Michal Gron</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Picasa]]></category>

		<guid isPermaLink="false">tag:labs.prasa.sk,2009:/2.14</guid>
		<description><![CDATA[
        Nedávno sa mi prisnilo silné slovné spojenie <i>skutková podstata</i>. 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.
      ]]></description>
			<content:encoded><![CDATA[
        <h2>Čo je to Picasa Web Albums Data API?</h2>
Pod týmto označením sa skrýva rozhranie, ktoré umožňuje integrovať službu <a href="http://picasaweb.google.com/" title="Picasa Web Albums">Picasa Web Albums</a> (ď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í.

<p>Niektoré z mála vecí, ktoré využívajú PWA Data API:</p>
<ul><li>Aplikácie na jednoduché uploadovanie obrázkov zo zariadení, desktopových aplikácií a ostatných webových služieb</li>
<li>Mobilný klienti na prezeranie a uploadovanie obrázkov do PWA</li>
<li>Integrácia PWA s blogovacími nástrojmi k jednoduchému zdielaniu obrázkov na vašich blogoch</li>
<li>Digitálne foto rámiky</li>
<li>&hellip;</li></ul>

<p>Pre stručný prehľad je k dispozícii video:</p>
<p align="center"><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/hgadtxgXZ_k&hl=cs&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/hgadtxgXZ_k&hl=cs&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>

<p>Domovská stránka PWA Data API: <a href="http://code.google.com/apis/picasaweb/">http://code.google.com/apis/picasaweb/</a></p>

<h2>A čo je to Picasa Flash API?</h2>
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.

<p>Domovská stránka Picasa Flash API: <a href="http://code.google.com/p/picasaflashapi/">http://code.google.com/p/picasaflashapi/</a></p>

<h2>Aký je teda rozdiel?</h2>
<ul><li>Picasa Web Albums Data API je rozhranie k službe Picasa Web Albums od Google.</li>
<li>Picasa Flash API je Flash/Flex knižnica.</li>
<li>Pomocou Picasa Flash API posielate requesty z Flash Player-a na Picasa Web Albums Data API rozhranie.</li>
<li>Picasa Web Albums Data API žije na serverovej strane Google, Picasa Flash API beží u klienta.</li></ul>

<h2>Ako s tým súvisí Picasa?</h2>
Výborná otázka. <a href="http://picasa.google.com/" title="Picasa">Picasa</a> 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.

<h2>Prezeranie a vyhľadávanie</h2>
Poďme si to hneď všetko vyskúšať :).
Každý url request smerom na PWA má nasledovnú schému: <p><i>http://&lt;api_url&gt;/&lt;collection_type&gt;/&lt;projection_type&gt;/&lt;context&gt;?&lt;parameters&gt;</i></p>

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

<h3>1. Adresa Picasa Web Albums Data API:</h3>
<p>Môžeme použiť adresu "<i>http://picasaweb.google.com/data</i>" alebo jej alias "<i>http://photos.googleapis.com/data</i>". 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é <a href="http://code.google.com/intl/sk/apis/picasaweb/reference.html#Flash" title="tu">tu</a>. A keďže crossdomain.xml súbor sa nachádza na <i>http://photos.googleapis.com/data/crossdomain.xml</i>, 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 <a href="http://picasaweb.google.com/data">http://picasaweb.google.com/data</a> a PWA nám vráti aj naše vlastné privátne albumy.</p>

<h3>2. Collection type:</h3>
<p>Keďže PFA je read-only, budeme používať iba "<i>/feed</i>". Collection type "<i>/media</i>" by sme využili pri zápise dát z klienta smerom na server, napríklad pri aktualizácii alebo pri odovzdávaní fotografií.</p>

<h3>3. Projection type:</h3>
<p>Máme opať niekoľko možností. V prípade, že použijeme "<i>/base</i>", 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 "<i>/api</i>". Ak by nám Google v budúcnosti umožnil zapisovať do PWA z Flash Player-a, Projection type "<i>/api</i>" je nato pripravené (read-write).</p>

<h3>4. Context:</h3>
<p>Posledná prísada je hodnota, ktorá definuje aké zdroje chceme na PWA používať. Podľa tohto kontextu rozdeľujeme requesty na:
<ul><li>User-based feed: <i>/user/&lt;userid&gt;</i></li>
<li>Contacts-based feed: <i>/user/&lt;userid&gt;/contacts</i></li>
<li>Album-based feed: <i>/user/&lt;userid&gt;/albumid/&lt;albumid&gt;</i></li>
<li>Photo-based feed: <i>/user/&lt;userid&gt;/albumid/&lt;albumid&gt;/photoid/&lt;photoid&gt;</i></li>
<li>Community search feed: <i>/all</i></li>
<li>Featured photos feed: <i>/featured</i></li></ul></p>

<p>Po správnom zmiešaní ingrediencií pre zoznam albumov užívateľa dostaneme nasledovné url: <a href="http://photos.googleapis.com/data/feed/api/user/thisispinkfu">http://photos.googleapis.com/data/feed/api/user/thisispinkfu</a></p>

<p>PWA nám odpovie nasledovne (skrátene kvôli prehľadnosti):</p>
<div class="codeblock"><code><span style="color: #000000">
<span style="color: #006600">&lt;</span><span style="color: #0000CC">feed&nbsp;</span><span style="color: #006600">...&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">id</span><span style="color: #006600">&gt;</span><span style="color: #0000CC">http</span><span style="color: #006600">:</span><span style="color: #FF9900">//photos.googleapis.com/data/feed/api/user/thisispinkfu&lt;/id&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #006600">&lt;</span><span style="color: #0000CC">title</span><span style="color: #006600">&gt;</span><span style="color: #0000CC">thisispinkfu</span><span style="color: #006600">&lt;/</span><span style="color: #0000CC">title</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;...<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">entry</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">id</span><span style="color: #006600">&gt;</span><span style="color: #0000CC">http</span><span style="color: #006600">:</span><span style="color: #FF9900">//photos.googleapis.com/data/entry/api/user/thisispinkfu/albumid/5296410852174025857&lt;/id&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #006600">...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">category&nbsp;scheme</span><span style="color: #006600">=</span><span style="color: #CC0000">"http://schemas.google.com/g/2005#kind"&nbsp;</span><span style="color: #0000CC">term</span><span style="color: #006600">=</span><span style="color: #CC0000">"http://schemas.google.com/photos/2007#album"</span><span style="color: #006600">/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">title</span><span style="color: #006600">&gt;</span><span style="color: #0000CC">Pinholes</span><span style="color: #006600">&lt;/</span><span style="color: #0000CC">title</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">summary</span><span style="color: #006600">&gt;</span><span style="color: #0000CC">Sharan&nbsp;STD</span><span style="color: #006600">-</span><span style="color: #0000CC">35&nbsp;</span><span style="color: #006600">and&nbsp;</span><span style="color: #0000CC">Diana&nbsp;pinholes</span><span style="color: #006600">&lt;/</span><span style="color: #0000CC">summary</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #0000CC">entry</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span><span style="color: #0000CC">entry</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;...<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span><span style="color: #0000CC">entry</span><span style="color: #006600">&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;...<br />&lt;/</span><span style="color: #0000CC">feed</span><span style="color: #006600">&gt;&nbsp;</span>
</span>
</code></div>
Albumy sa vracajú späť v <i>&lt;entry&gt;</i> elementoch, kde každý <i>&lt;entry&gt;</i> element obsahuje metadáta k albumu ako napr. počet fotografií v albume, náhľad albumu, názov atď...

<p>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 :)</p>

<p>Zoznam albumov by sme pomocou PFA získali nasledovne:</p>
<div class="codeblock"><code><span style="color: #000000">
<span style="color: #FF9900">//&nbsp;vytvorime&nbsp;instanciu&nbsp;servisu<br /></span><span style="color: #006600">var&nbsp;</span><span style="color: #0000CC">service&nbsp;</span><span style="color: #006600">:&nbsp;</span><span style="color: #0000CC">PicasaService&nbsp;</span><span style="color: #006600">=&nbsp;new&nbsp;</span><span style="color: #0000CC">PicasaService</span><span style="color: #006600">();<br /><br /></span><span style="color: #FF9900">//&nbsp;zavolame&nbsp;servisnu&nbsp;metodu,&nbsp;ktora&nbsp;vrati&nbsp;responder<br />//&nbsp;responder&nbsp;vysle&nbsp;pri&nbsp;uspesnej&nbsp;odpovedi&nbsp;z&nbsp;PWA&nbsp;data&nbsp;event<br /></span><span style="color: #006600">var&nbsp;</span><span style="color: #0000CC">responder&nbsp;</span><span style="color: #006600">:&nbsp;</span><span style="color: #0000CC">PicasaResponder&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">service</span><span style="color: #006600">.</span><span style="color: #0000CC">albums</span><span style="color: #006600">.list(</span><span style="color: #CC0000">"thisispinkfu"</span><span style="color: #006600">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">responder</span><span style="color: #006600">.</span><span style="color: #0000CC">addEventListener</span><span style="color: #006600">(</span><span style="color: #0000CC">PicasaDataEvent</span><span style="color: #006600">.</span><span style="color: #0000CC">DATA</span><span style="color: #006600">,&nbsp;</span><span style="color: #0000CC">onGetAlbumsComplete</span><span style="color: #006600">);<br /><br /></span><span style="color: #FF9900">//&nbsp;po&nbsp;uspesnej&nbsp;odpovedi<br /></span><span style="color: #006600">function&nbsp;</span><span style="color: #0000CC">onGetAlbumsComplete</span><span style="color: #006600">(</span><span style="color: #0000CC">evt&nbsp;</span><span style="color: #006600">:&nbsp;</span><span style="color: #0000CC">PicasaDataEvent</span><span style="color: #006600">)&nbsp;:&nbsp;</span><span style="color: #0000CC">void<br />&#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #006600">var&nbsp;</span><span style="color: #0000CC">item&nbsp;</span><span style="color: #006600">:&nbsp;</span><span style="color: #0000CC">AlbumEntry</span><span style="color: #006600">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF9900">//&nbsp;prejdeme&nbsp;vsetky&nbsp;&lt;entry&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #006600">for(var&nbsp;</span><span style="color: #0000CC">a&nbsp;</span><span style="color: #006600">:&nbsp;</span><span style="color: #0000CC">int&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">0</span><span style="color: #006600">;&nbsp;</span><span style="color: #0000CC">a&nbsp;</span><span style="color: #006600">&lt;&nbsp;</span><span style="color: #0000CC">evt</span><span style="color: #006600">.</span><span style="color: #0000CC">data</span><span style="color: #006600">.</span><span style="color: #0000CC">entries</span><span style="color: #006600">.</span><span style="color: #0000CC">length</span><span style="color: #006600">;&nbsp;</span><span style="color: #0000CC">a</span><span style="color: #006600">++)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">&#123;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item&nbsp;</span><span style="color: #006600">=&nbsp;</span><span style="color: #0000CC">evt</span><span style="color: #006600">.</span><span style="color: #0000CC">data</span><span style="color: #006600">.</span><span style="color: #0000CC">entries&#91;a&#93;&nbsp;</span><span style="color: #006600">as&nbsp;</span><span style="color: #0000CC">AlbumEntry</span><span style="color: #006600">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF9900">//&nbsp;a&nbsp;vypiseme&nbsp;nazov&nbsp;albumy&nbsp;a&nbsp;jeho&nbsp;linku&nbsp;na&nbsp;picasaweb&nbsp;stranku<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">trace</span><span style="color: #006600">(</span><span style="color: #0000CC">item</span><span style="color: #006600">.</span><span style="color: #0000CC">title</span><span style="color: #006600">.</span><span style="color: #0000CC">value&nbsp;</span><span style="color: #006600">+&nbsp;</span><span style="color: #CC0000">"&nbsp;("&nbsp;</span><span style="color: #006600">+&nbsp;</span><span style="color: #0000CC">item</span><span style="color: #006600">.</span><span style="color: #0000CC">links&#91;1&#93;</span><span style="color: #006600">.</span><span style="color: #0000CC">href&nbsp;</span><span style="color: #006600">+&nbsp;</span><span style="color: #CC0000">")"</span><span style="color: #006600">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000CC">&#125;<br />&#125;&nbsp;</span>
</span>
</code></div>

Výstupom z funkcie je zoznam albumov s ich názvom a priamou linkou na picasaweb stránku:
<div class="codeblock"><code><span style="color: #000000">
<span style="color: #006600">(</span><span style="color: #0000CC">GET</span><span style="color: #006600">)&nbsp;</span><span style="color: #0000CC">http</span><span style="color: #006600">:</span><span style="color: #FF9900">//photos.googleapis.com/data/feed/api/user/thisispinkfu<br /></span><span style="color: #0000CC">Pinholes&nbsp;</span><span style="color: #006600">(</span><span style="color: #0000CC">http</span><span style="color: #006600">:</span><span style="color: #FF9900">//picasaweb.google.com/thisispinkfu/Pinholes)<br /></span><span style="color: #0000CC">Redscale&nbsp;</span><span style="color: #006600">(</span><span style="color: #0000CC">http</span><span style="color: #006600">:</span><span style="color: #FF9900">//picasaweb.google.com/thisispinkfu/Redscale)<br /></span><span style="color: #0000CC">Stockholm&nbsp;</span><span style="color: #006600">(</span><span style="color: #0000CC">http</span><span style="color: #006600">:</span><span style="color: #FF9900">//picasaweb.google.com/thisispinkfu/Stockholm)<br /></span><span style="color: #0000CC">Instants&nbsp;</span><span style="color: #006600">(</span><span style="color: #0000CC">http</span><span style="color: #006600">:</span><span style="color: #FF9900">//picasaweb.google.com/thisispinkfu/Instants)<br /></span><span style="color: #006600">...&nbsp;</span>
</span>
</code></div>

Ďalšími možnosti PWA je napríklad:
<ul><li>vyhľadávanie obrázkov s v komunite na základe query a napr. tagov</li>
<li>použitie geografických hraníc pre obmedzenie výsledkov vyhľadávania na určitú zemepisnú oblasť</li>
<li>limitovanie vyhľadávania na "obľúbené" fotografie</li>
<li>&hellip;</li></ul>

<p>V stručnosti sme si spravili prehľad čo je to <a href="http://code.google.com/apis/picasaweb/" title="Picasa Web Albums Data API">Picasa Web Albums Data API</a>, čo je to <a href="http://code.google.com/p/picasaflashapi/" title="Picasa Flash API">Picasa Flash API</a>, načrtli sme ich možnosti a obmedzenia a vytvorili krátky príklad, ako získať zoznam všetkých albumov od <a href="http://picasaweb.google.com/" title="Picasaweb">Picasaweb</a> používateľa.</p>

<p>Nakoniec už len krátky odkaz na nádherný screen saver, ktorý využíva Picasa Flash API:<br/> <a href="http://www.inspirit.ru/exchange/ascii_saver/">http://www.inspirit.ru/exchange/ascii_saver/</a></p> 
      ]]></content:encoded>
			<wfw:commentRss>http://labs.prasa.sk/view/zaciname-s-picasa-web-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Redesignovaný blog Toma Krchy – FlashRealtime.com</title>
		<link>http://michalmetlicka.cz/2009/03/07/redesignovany-blog-toma-krchy-flashrealtimecom/</link>
		<comments>http://michalmetlicka.cz/2009/03/07/redesignovany-blog-toma-krchy-flashrealtimecom/#comments</comments>
		<pubDate>Sat, 07 Mar 2009 21:26:23 +0000</pubDate>
		<dc:creator>Michal Metlička</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Jiné blogy]]></category>

		<guid isPermaLink="false">http://michalmetlicka.cz/?p=456</guid>
		<description><![CDATA[Vzhledem k mé dlouhé absenci budou možná mé příspěvky pro některé z vás trochu neaktuální, ale stejně chci postupně psát o událostech, které v posledních měsících proběhly a stojí za upozornění.
Tomáš Krcha je platformním evangelistou Adobe Systems a má na starosti rozvoj developerské platformy Flash, Flex, AIR a souvisejících technologií. Na jeho blog Flashrealtime.com už [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=michalmetlicka.cz&#38;blog=1580625&#38;post=456&#38;subd=michalmetlicka&#38;ref=&#38;feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><img class="alignleft size-full wp-image-457" style="border:0 none;margin-bottom:5px;margin-left:0;margin-right:10px;" title="FlashRealtime.com" src="http://michalmetlicka.files.wordpress.com/2009/03/logo.jpg?w=195&#038;h=109" alt="FlashRealtime.com" width="195" height="109" />Vzhledem k mé dlouhé absenci budou možná mé příspěvky pro některé z vás trochu neaktuální, ale stejně chci postupně psát o událostech, které v posledních měsících proběhly a stojí za upozornění.</p>
<p>Tomáš Krcha je platformním evangelistou Adobe Systems a má na starosti rozvoj developerské platformy Flash, Flex, AIR a souvisejících technologií. Na jeho blog <strong><a href="http://flashrealtime.com">Flashrealtime.com</a></strong> už odkazuji nějakou dobu, ale mezitím došlo k jeho významnému redesignu (nový design je podle mně skvělý a stojí z zhlédnutí). Tom píše o zajímavých novinkách, lidech a projektech a zaměřuje se hlavně na komunitu vývojářů. Tom patří do týmu, který má na starosti celou Evropu, takže je celkem logické, že blog přešel postupně do angličtiny.</p>
<p>Další možností je sledovat portál <a href="http://flashplatform.cz"><strong>Flashplatform.cz</strong></a>, který agreguje články řady významných českých vývojářů, kteří využívají technologie Adobe.</p>
Posted in Adobe, Flash, Jiné blogy Tagged: Adobe, AIR, Flash, Flex <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/michalmetlicka.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/michalmetlicka.wordpress.com/456/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/michalmetlicka.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/michalmetlicka.wordpress.com/456/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/michalmetlicka.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/michalmetlicka.wordpress.com/456/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/michalmetlicka.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/michalmetlicka.wordpress.com/456/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/michalmetlicka.wordpress.com/456/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/michalmetlicka.wordpress.com/456/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=michalmetlicka.cz&blog=1580625&post=456&subd=michalmetlicka&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://michalmetlicka.cz/2009/03/07/redesignovany-blog-toma-krchy-flashrealtimecom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex Live Event</title>
		<link>http://labs.prasa.sk/view/flex-live-event/</link>
		<comments>http://labs.prasa.sk/view/flex-live-event/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 10:00:22 +0000</pubDate>
		<dc:creator>Michal Gron</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">tag:labs.prasa.sk,2009:/2.13</guid>
		<description><![CDATA[
        Slovakia Flex User Group (<a href="http://groups.adobe.com/groups/ae581116ba/summary" title="Slovakia FUG">Slovakia FUG</a>) organizuje druhé otvorené stretnutie s názvom &#8220;Flex Live Event&#8221;.<br />Stretneme sa 5-teho marca 2009 o 15:30 na FEI STU v BC 150-ke.
      ]]></description>
			<content:encoded><![CDATA[
        <p>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).</p>
<p>Všetci sú srdečne pozvaní, registrácia na toto podujatie nie je potrebná.</p>
<p>Viac informácií sa nachádza na stránke <a href="http://groups.adobe.com/posts/1b20d93b5f" title="Slovakia FUG">Slovakia FUG</a></p>
<p>&nbsp;</p>
<p><a  href="http://www.google.com/calendar/event?action=TEMPLATE&amp;tmeid=azg5bW0zaWtocnVqazdrc2xtcWl1bGoxZ2MgbWljaGFsLmdyb25AbQ&amp;tmsrc=bWljaGFsLmdyb25AZ21haWwuY29t"><img border=0 src="http://www.google.com/calendar/images/ext/gc_button1_en.gif"></a></p>
<p>
<iframe width="660" 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"></iframe><br /><small><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">View Larger Map</a></small></p> 
      ]]></content:encoded>
			<wfw:commentRss>http://labs.prasa.sk/view/flex-live-event/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Logování ve Flexu II.</title>
		<link>http://www.tyglobee.cz/?p=21</link>
		<comments>http://www.tyglobee.cz/?p=21#comments</comments>
		<pubDate>Sat, 06 Dec 2008 14:30:30 +0000</pubDate>
		<dc:creator>tygl</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.tyglobee.cz/?p=21</guid>
		<description><![CDATA[Minule (Logovani ve flexu) byla popsána tvorba a princip logovacího API Flexu. Dnes navážu pokračováním v tomto tématu, konkrétně půjde o vytvoření vlastního Log Targetu. Vlastní Log Target umožňuje přizpůsobení výstupu z Logerru k obrazu svému, což je dnešním cílem.

Než bude ukázána praktická část vytvoření a práce s vlastním Log Targetem, bylo by dobré popsat [...]]]></description>
			<content:encoded><![CDATA[<p>Minule (<a href="http://www.tyglobee.cz/?p=9">Logovani ve flexu</a>) byla popsána tvorba a princip logovacího API Flexu. Dnes navážu pokračováním v tomto tématu, konkrétně půjde o vytvoření vlastního Log Targetu. Vlastní Log Target umožňuje přizpůsobení výstupu z Logerru k obrazu svému, což je dnešním cílem.</p>
<p><span id="more-21"></span></p>
<p>Než bude ukázána praktická část vytvoření a práce s vlastním Log Targetem, bylo by dobré popsat princip spoluprace mezi Loggerem a Log Targetem.</p>
<p>Zprávy, které odesíláme pomocí metod poskytovaných Loggerem (<em>debug(), info(), error(), &#8230;</em>), jsou &#8220;vysílány&#8221; jako Event událost, konkrétně LogEvent. Aby Log Target tyto zprávy mohl přijímat, musí nastavit na daném Loggeru listener na událost LogEvent.LOG. Nastavení listeneru na tuto událost probíhá automaticky a odchycená událost je předána do metody <em>logEvent( event:LogEvent )</em>, která přijatou událost zpracuje, zformátuje a odešle na výstup.</p>
<p>Máme tento kód:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3 actionscript3" style="font-family:monospace;"><span style="color: #6699cc; font-weight: bold;">var</span> logTarget<span style="color: #000000; font-weight: bold;">:</span>ILoggingTarget = <span style="color: #0033ff; font-weight: bold;">new</span> TraceTarget<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
logTarget.includeLevel = <span style="color: #0033ff; font-weight: bold;">true</span>;
logTarget.includeDate = <span style="color: #0033ff; font-weight: bold;">true</span>;
<span style="color: #009900;">// .....</span>
logTarget.<span style="color: #004993;">filters</span> = <span style="color: #000000;">&#91;</span><span style="color: #990000;">&quot;my.class.foo.*&quot;</span><span style="color: #000000;">&#93;</span>;
&nbsp;
<span style="color: #009900;">// samotna registrace Log Targetu do spravce loggeru</span>
Log.addTarget<span style="color: #000000;">&#40;</span> logTarget <span style="color: #000000;">&#41;</span>;</pre></div></div>

<p>Při zavolání <em>Log.addTarget()</em> dojde k registraci zadaného Log Targetu. Metoda <em>addTarget() </em>zjistí, jaké kategorie zpráv bude registrovaný Log Target přijímat. Správce Loggerů projde filtry (<em>logTarget.filters = ["mu.class.foo.*"]</em> ) právě registrovaného Log Targetu a porovnává je s registrem kategorií Loggerů. Pokud najde Logger, který poskytuje zprávy jež Log Target chce, zavolá Log Target a předá mu informaci o nalezeném Loggeru. Log Target na předaném loggeru nastaví výše zmíněný listener na událost LogEvent.LOG. Od této chvíle Log Target přijímá zprávy odesílané daným Loggerem.</p>
<h2>Vlastní Log Target</h2>
<p>Flex poskytuje tyto vestavěné Log Targety:</p>
<ul>
<li>TraceTarget - vhodný pro základní logování, jako výstup je použita trace() konzole.</li>
<li>MiniDebugTarget - umožnuje přesměrovat výstup do jiného SWF souboru, pomocí LocalConnection.</li>
<li>LineFormattedTarget - základní Log Target, který nikam neposílá výstup a je často používán jako &#8220;taťka&#8221; pro vlastní loggery.</li>
</ul>
<p><em>LineFormattedTarget</em> je základním stavebním kamenem při tvorbě vlastního Log Targetu. Poskytuje základní metody, potřebné pro logování událostí. Sám o sobě vychází z třídy <em>AbstractTarget</em>, která definuje základní metody pro správu a příjem událostí z Loggerů. Rozdíl mezi nimi je ten, že <em>LineFormattedTarget </em>definuje metodu, pro základní formtováný výstup, čímž nám práci ulehčí. Kdežto <em>AbstractTarget </em>žádný výstup nedefinuje a je nutné si výstup formátovat osobně.</p>
<p>Na samotném začátku, při vytváření vlastního Log Targetu, stojíme před rozhodnutím z jaké třídy vycházet. Chceme-li pouze využít možnosti ukládání zpráv do souboru, popř. odesílání pomocí LCDS tak doporučuji vycházet z třídy <em>LineFormattedTarget</em>, protože pak stačí implementovat metodu <em>internalLog()</em>, která provádí samotný formátovaný výstup a přesměrovat na libovolný výstup.</p>
<p>Pokud však máme nároky vyšší, např. chci mít vlastní vlastní výstupní formát (např. datum, čas, aj.) tak již doporučuji sáhnout po metodě <em>AbstractTarget</em>. Bylo by možné použít<em> </em>i <em>LineFormattedTarget</em>, ale bylo by nutné implementovat nejméně dvě metody, jednu navíc z mx_internal namespace. <em>LineFormattedTarget</em> přijme událost do metody <em>logEvent</em>, zformátuje a zavolá metodu <em>internalLog()</em>, která provede samotné odeslání na výstup.</p>
<h3>Ukázka použití <em>LineFormattedTarget</em></h3>
<h4>Zadání problému:</h4>
<p>Mějme AIR aplikaci a zprávy o jejím běhu chceme zaznamenávat do zadaného souboru.</p>
<h4>Řešení:</h4>
<p>Pro tento případ se hodí použití třídy <em>LineFormattedTarget</em>, protože nemáme žádné požadavky na formát zprávy a je tedy možné použít výchozí formátování.</p>
<p>Naše třída bude vypadat např. takto:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3 actionscript3" style="font-family:monospace;"><span style="color: #9900cc; font-weight: bold;">package</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0033ff; font-weight: bold;">import</span> flash.filesystem.File;
    <span style="color: #0033ff; font-weight: bold;">import</span> flash.filesystem.FileMode;
    <span style="color: #0033ff; font-weight: bold;">import</span> flash.filesystem.FileStream;
&nbsp;
    <span style="color: #0033ff; font-weight: bold;">import</span> mx.core.mx_internal;
    <span style="color: #0033ff; font-weight: bold;">import</span> mx.logging.targets.LineFormattedTarget;
&nbsp;
    use <span style="color: #004993;">namespace</span> mx_internal;
&nbsp;
    <span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #9900cc; font-weight: bold;">class</span> CustomLogger extends LineFormattedTarget
    <span style="color: #000000;">&#123;</span>
       <span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">var</span> _file<span style="color: #000000; font-weight: bold;">:</span>File;
       <span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">var</span> _fileStream<span style="color: #000000; font-weight: bold;">:</span>FileStream;
&nbsp;
    	<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> CustomLogger<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    	<span style="color: #000000;">&#123;</span>
            <span style="color: #0033ff; font-weight: bold;">super</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
            <span style="color: #009900;">// chceme logovat dotohoto souboru, musime jej tedy otevrit pro zapis</span>
	    _file = <span style="color: #0033ff; font-weight: bold;">new</span> File<span style="color: #000000;">&#40;</span> <span style="color: #990000;">&quot;C:<span style="">\\</span>flexLog<span style="">\\</span>log.txt&quot;</span> <span style="color: #000000;">&#41;</span>;
            _fileStream = <span style="color: #0033ff; font-weight: bold;">new</span> FileStream<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
            _fileStream.<span style="color: #004993;">open</span><span style="color: #000000;">&#40;</span> _file, FileMode.APPEND<span style="color: #000000;">&#41;</span>;
    	<span style="color: #000000;">&#125;</span>
&nbsp;
    	override mx_internal <span style="color: #339966; font-weight: bold;">function</span> internalLog<span style="color: #000000;">&#40;</span><span style="color: #004993;">message</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
    	<span style="color: #000000;">&#123;</span>
            <span style="color: #009900;">// prijatou zpravu zapisujeme do souboru</span>
            _fileStream.<span style="color: #004993;">writeMultiByte</span><span style="color: #000000;">&#40;</span> <span style="color: #004993;">message</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;<span style="">\n</span>&quot;</span>, <span style="color: #990000;">'iso-8859-1'</span> <span style="color: #000000;">&#41;</span>;
    	<span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Výstup v log souboru bude asi takovýto:</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">12/6/2008 13:58:37.293 [DEBUG] my.class.logger.Main Button click
12/6/2008 13:58:37.421 [DEBUG] my.class.logger.Main Button click
12/6/2008 13:58:47.852 [DEBUG] my.class.logger.Main Button click</pre></div></div>

<p>Tímto jsme vytvořili vlastní Log Target, který si ponechává všechny možnosti nastavení a zároveň se nemusíme starat o formátování zprávy.</p>
<h3>Ukázka použití <em>AbstractTarget</em></h3>
<h4>Problém:</h4>
<p>Mějme stejné zadání z předchozí ukázky, avšak tentokrát je požadavek na formát zprávy. Zprávu je nutné zapisovat ve formátu <em>&#8220;DATE|TIME|LEVEL|CATEGORY@MESSAGE</em>&#8220;, protože log zprávy budou následně zpracovány jiným softwarem. Zároveň je nutné, aby byl vytvořen jedinečný soubor pro každé spuštění aplikace.</p>
<h4>Řešení:</h4>
<p>V tomto případě bude lepší jako základ použít třídu <em>AbstractTarget</em>, protože máme daný přesný formát zprávy a zároveň je nutné implementovat i vlastní metodu prozápis.</p>
<p>Třída bude vypadat např. takto:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3 actionscript3" style="font-family:monospace;"><span style="color: #9900cc; font-weight: bold;">package</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0033ff; font-weight: bold;">import</span> flash.filesystem.File;
    <span style="color: #0033ff; font-weight: bold;">import</span> flash.filesystem.FileMode;
    <span style="color: #0033ff; font-weight: bold;">import</span> flash.filesystem.FileStream;
&nbsp;
    <span style="color: #0033ff; font-weight: bold;">import</span> mx.logging.AbstractTarget;
    <span style="color: #0033ff; font-weight: bold;">import</span> mx.logging.ILogger;
    <span style="color: #0033ff; font-weight: bold;">import</span> mx.logging.LogEvent;
&nbsp;
    <span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #9900cc; font-weight: bold;">class</span> CustomLogger2 extends AbstractTarget
    <span style="color: #000000;">&#123;</span>
       <span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">var</span> _file<span style="color: #000000; font-weight: bold;">:</span>File;
       <span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">var</span> _fileStream<span style="color: #000000; font-weight: bold;">:</span>FileStream;
&nbsp;
    	<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> CustomLogger2<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    	<span style="color: #000000;">&#123;</span>
            <span style="color: #0033ff; font-weight: bold;">super</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
	    _file = <span style="color: #0033ff; font-weight: bold;">new</span> File<span style="color: #000000;">&#40;</span> <span style="color: #990000;">&quot;C:<span style="">\\</span>flexLog<span style="">\\</span>log.txt&quot;</span> <span style="color: #000000;">&#41;</span>;
            _fileStream = <span style="color: #0033ff; font-weight: bold;">new</span> FileStream<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
            _fileStream.<span style="color: #004993;">open</span><span style="color: #000000;">&#40;</span> _file, FileMode.APPEND<span style="color: #000000;">&#41;</span>;
    	<span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #3f5fbf;">/**
         * metoda, ktera zpracovava prijate LogEvent udalosti
         */</span>
    	override <span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> logEvent<span style="color: #000000;">&#40;</span>event<span style="color: #000000; font-weight: bold;">:</span>LogEvent<span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
    	<span style="color: #000000;">&#123;</span>
    	    <span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">date</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Date</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Date</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
    	    <span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">message</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span> = <span style="color: #990000;">&quot;&quot;</span>;
&nbsp;
    	    <span style="color: #009900;">// vlozime datum</span>
    	    <span style="color: #004993;">message</span> <span style="color: #000000; font-weight: bold;">+</span>= <span style="color: #004993;">Number</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">date</span>.<span style="color: #004993;">getMonth</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #000000; font-weight:bold;">1</span><span style="color: #000000;">&#41;</span>.<span style="color: #004993;">toString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;.&quot;</span> <span style="color: #000000; font-weight: bold;">+</span>
                       <span style="color: #004993;">date</span>.<span style="color: #004993;">getDate</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #004993;">toString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;.&quot;</span> <span style="color: #000000; font-weight: bold;">+</span>
                       <span style="color: #004993;">date</span>.<span style="color: #004993;">getFullYear</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #004993;">toString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
            <span style="color: #009900;">// separator</span>
            <span style="color: #004993;">message</span> <span style="color: #000000; font-weight: bold;">+</span>= <span style="color: #990000;">&quot;|&quot;</span>;
&nbsp;
            <span style="color: #009900;">// vlozime cas</span>
            <span style="color: #004993;">message</span> <span style="color: #000000; font-weight: bold;">+</span>= padTime<span style="color: #000000;">&#40;</span><span style="color: #004993;">date</span>.<span style="color: #004993;">getHours</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;:&quot;</span> <span style="color: #000000; font-weight: bold;">+</span>
                        padTime<span style="color: #000000;">&#40;</span><span style="color: #004993;">date</span>.<span style="color: #004993;">getMinutes</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;:&quot;</span> <span style="color: #000000; font-weight: bold;">+</span>
                        padTime<span style="color: #000000;">&#40;</span><span style="color: #004993;">date</span>.<span style="color: #004993;">getSeconds</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;.&quot;</span> <span style="color: #000000; font-weight: bold;">+</span>
                        padTime<span style="color: #000000;">&#40;</span><span style="color: #004993;">date</span>.<span style="color: #004993;">getMilliseconds</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, <span style="color: #0033ff; font-weight: bold;">true</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #009900;">//separator</span>
            <span style="color: #004993;">message</span> <span style="color: #000000; font-weight: bold;">+</span>= <span style="color: #990000;">&quot;|&quot;</span>;   
&nbsp;
            <span style="color: #009900;">// vlozime uroven</span>
            <span style="color: #004993;">message</span> <span style="color: #000000; font-weight: bold;">+</span>= LogEvent.getLevelString<span style="color: #000000;">&#40;</span> event.<span style="color: #004993;">level</span> <span style="color: #000000;">&#41;</span>;
&nbsp;
            <span style="color: #009900;">// separator</span>
            <span style="color: #004993;">message</span> <span style="color: #000000; font-weight: bold;">+</span>= <span style="color: #990000;">&quot;|&quot;</span>;
&nbsp;
            <span style="color: #009900;">// vlozime kategorii loggeru, ktery poslal zpravu</span>
            <span style="color: #004993;">message</span> <span style="color: #000000; font-weight: bold;">+</span>= ILogger<span style="color: #000000;">&#40;</span> event.<span style="color: #004993;">target</span> <span style="color: #000000;">&#41;</span>.category;
&nbsp;
            <span style="color: #009900;">// separator</span>
            <span style="color: #004993;">message</span> <span style="color: #000000; font-weight: bold;">+</span>= <span style="color: #990000;">&quot;@&quot;</span>;
&nbsp;
            <span style="color: #009900;">// vlozime obsah prijate zpravy</span>
            <span style="color: #004993;">message</span> <span style="color: #000000; font-weight: bold;">+</span>= event.<span style="color: #004993;">message</span>;
&nbsp;
            <span style="color: #009900;">// zapiseme zformatovanou zpravu do souboru</span>
            <span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span> <span style="color: #004993;">message</span> <span style="color: #000000;">&#41;</span>;
    	<span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #3f5fbf;">/**
         * metoda prevzata z LineFormattedTarget, upravuje zobrazeni vterin
         */</span>
        <span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> padTime<span style="color: #000000;">&#40;</span>num<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Number</span>, millis<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Boolean</span> = <span style="color: #0033ff; font-weight: bold;">false</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>millis<span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>num <span style="color: #000000; font-weight: bold;">&amp;</span>lt; <span style="color: #000000; font-weight:bold;">10</span><span style="color: #000000;">&#41;</span>
                    <span style="color: #0033ff; font-weight: bold;">return</span> <span style="color: #990000;">&quot;00&quot;</span> <span style="color: #000000; font-weight: bold;">+</span> num.<span style="color: #004993;">toString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
                <span style="color: #0033ff; font-weight: bold;">else</span> <span style="color: #0033ff; font-weight: bold;">if</span> <span style="color: #000000;">&#40;</span>num <span style="color: #000000; font-weight: bold;">&amp;</span>lt; <span style="color: #000000; font-weight:bold;">100</span><span style="color: #000000;">&#41;</span>
                    <span style="color: #0033ff; font-weight: bold;">return</span> <span style="color: #990000;">&quot;0&quot;</span> <span style="color: #000000; font-weight: bold;">+</span> num.<span style="color: #004993;">toString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
                <span style="color: #0033ff; font-weight: bold;">else</span>
                    <span style="color: #0033ff; font-weight: bold;">return</span> num.<span style="color: #004993;">toString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0033ff; font-weight: bold;">else</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0033ff; font-weight: bold;">return</span> num <span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000; font-weight:bold;">9</span> <span style="color: #000000; font-weight: bold;">?</span> num.<span style="color: #004993;">toString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #990000;">&quot;0&quot;</span> <span style="color: #000000; font-weight: bold;">+</span> num.<span style="color: #004993;">toString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #3f5fbf;">/**
         * metoda zajisti vytvoreni jedinecneho jmena souboru
         * (pro jednoduchost neresi jakekoli konflikty, ktere by mohly
         * vzniknout, pokud by se aplikace spustila 2x v ten samy cas)
         */</span>
        <span style="color: #0033ff; font-weight: bold;">private</span> static <span style="color: #339966; font-weight: bold;">function</span> _createLogName<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">date</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Date</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Date</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
            <span style="color: #0033ff; font-weight: bold;">return</span> <span style="color: #990000;">'log_'</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #004993;">date</span>.<span style="color: #004993;">getTime</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">'.log'</span>;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #3f5fbf;">/**
         * metoda zapisuje zpravu do log souboru
         */</span>
        <span style="color: #0033ff; font-weight: bold;">protected</span> <span style="color: #339966; font-weight: bold;">function</span> <span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span> <span style="color: #004993;">message</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span> <span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
        <span style="color: #000000;">&#123;</span>
            _fileStream.<span style="color: #004993;">writeMultiByte</span><span style="color: #000000;">&#40;</span> <span style="color: #004993;">message</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">&quot;<span style="">\n</span>&quot;</span>, <span style="color: #990000;">&quot;iso-8859-1&quot;</span> <span style="color: #000000;">&#41;</span>;
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Výstup v log souboru bude vypadat asi takto:</p>

<div class="wp_syntax"><div class="code"><pre class="text text" style="font-family:monospace;">12.6.2008|14:50:51.069|DEBUG|my.class.logger.Main@Button click
12.6.2008|14:50:51.359|DEBUG|my.class.logger.Main@Button click</pre></div></div>

<p>Vytvořili jsme tedy Log Target, ktery zaznamenavá zprávy dle zadání.</p>
<h2>Závěr</h2>
<p>Možností jak logovat je spousta, snažil jsem se (snad úspěšně) popsat jak využít kvalitního logovacího API, které poskutuje Flex. Log Targety nejsou omezené pouze na zápis do souboru, lze taktéž data rozesílat pomocí LCDS Messaging protokolů, popř. pomocí DataServices zapisovat do databáze. Možností je spousta a je těžké je všechny obsáhnout, ale i tak doufám, že jsem poskytl základní návod, jak správně logovat.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tyglobee.cz/?p=21/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Logování ve Flexu</title>
		<link>http://www.tyglobee.cz/?p=9</link>
		<comments>http://www.tyglobee.cz/?p=9#comments</comments>
		<pubDate>Mon, 01 Dec 2008 12:30:37 +0000</pubDate>
		<dc:creator>tygl</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://www.tyglobee.cz/?p=9</guid>
		<description><![CDATA[Osobně považuji logování v aplikaci za jednu z nejdůležitějších funkcí. Logování jednotlivých akcí zpřehlední jednoduché &#8220;debugování&#8221;, popř. dokáže odhalit špatnou posloupnost akcí. Ve flashi, kde je asynchronní volání na denním pořádku se to může stát hned.

Dříve jsem si na logování napsal vlastní třídu, jednalo se o klasický singleton, který měl pár metod, které byly převážně [...]]]></description>
			<content:encoded><![CDATA[<p>Osobně považuji logování v aplikaci za jednu z nejdůležitějších funkcí. Logování jednotlivých akcí zpřehlední jednoduché &#8220;debugování&#8221;, popř. dokáže odhalit špatnou posloupnost akcí. Ve flashi, kde je asynchronní volání na denním pořádku se to může stát hned.</p>
<p><span id="more-9"></span></p>
<p>Dříve jsem si na logování napsal vlastní třídu, jednalo se o klasický singleton, který měl pár metod, které byly převážně statické. Stěžejní metodou byla metoda &#8220;log( msg:String, level:LoggerLevelEvent )&#8221;. Z popisu je jasné, že se předávaly dva parametry. Prvním byl text zprávy, druhým úroveň, která říkala, zda jde o zprávu debug, info, error, aj. Výstup byl prováděn na klasický trace output nebo do souboru, popř. obojí. Taktéž bylo možné zprávy filtrovat, protože jsem si zavedl konvenci, že na začátku každé zprávy byl název třídy, která zprávu posílala.</p>
<p>Vše fungovalo krásně, až do chvíle kdy jsem přišel na to, že jsem vynalezl kolo. Po pozdějším zjištění, hodně šišaté kolo. Místo, abych se nejdříve koukl do manuálu jsem si za par minutách napsal něco, co je už napsáno bylo. Řeč je o balíčku &#8220;mx.logging.*&#8221;. Jo, objevil jsem ameriku.</p>
<h2>mx.logging.*</h2>
<p>Nebudu zde citovat manuál balíčku <a href="http://livedocs.adobe.com/flex/3/langref/mx/logging/package-detail.html" onclick="pageTracker._trackPageview('/outgoing/livedocs.adobe.com/flex/3/langref/mx/logging/package-detail.html?referer=');">mx.logging.*</a>. Zároveň také neřeknu nic nového, co by nebylo popsáno v manuálu, konkrétně kapitola: <a href="http://livedocs.adobe.com/flex/3/html/help.html?content=logging_09.html" onclick="pageTracker._trackPageview('/outgoing/livedocs.adobe.com/flex/3/html/help.html?content=logging_09.html&amp;referer=');">Using the logging API</a>.</p>
<p>Stručně řečeno. Logování se dělí na tři části: &#8220;Logger -&gt; Log Target -&gt; Log Destination&#8221;. Flex jako takový logovací API nevyužívá, vyjímku tvoří pouze třídy: mx.rpc.*, mx.messaging.*, mx.data.* , které pomocí tohoto API zasílají informace o své činnosti.</p>
<h3><strong>Logger</strong></h3>
<p>Logger je v podstatě singleton, který poskytuje metody pro logování v danné kategorii. Veškeré Loggery jsou soustředěny a spravovány jednou třídou, konkrétně jde o třídu <a href="http://livedocs.adobe.com/flex/3/langref/mx/logging/Log.html" onclick="pageTracker._trackPageview('/outgoing/livedocs.adobe.com/flex/3/langref/mx/logging/Log.html?referer=');">mx.logging.Log</a>. Tato třída poskytuje rozhraní na jejich vytváření a taktéž poskytuje metody na registraci &#8220;Log targetů&#8221;.</p>
<p>Chci-li získat Logger, pro vlastní kategorii, tak to vypadá asi takto:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3 actionscript3" style="font-family:monospace;"><span style="color: #009900;">// definice balíčku a třídy my.class.foo.Bar</span>
<span style="color: #009900;">// ....</span>
<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">var</span> _log<span style="color: #000000; font-weight: bold;">:</span>ILogger = Log.getLogger<span style="color: #000000;">&#40;</span><span style="color: #990000;">'myCategory'</span><span style="color: #000000;">&#41;</span>;
<span style="color: #009900;">//....</span></pre></div></div>

<p><em>Log.getLogger(&#8217;myCategory&#8217;) </em>provede vytvoření zadané kategorie <em>myCategory</em>. Jako název lze volit libovolný textový řetězec, ale je dobré držet nějaký standard. Je doporučeno kategorii zadávat jako plný název třídy, napr.: my.class.foo.Bar. Na základě názvu kategorie můžeme následně logované zprávy filtrovat.</p>
<p>Mám li vytvořený logger, mohu začít zasílat zprávy, např. takto:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3 actionscript3" style="font-family:monospace;"><span style="color: #009900;">// definice balíčku a třídy</span>
<span style="color: #009900;">// ....</span>
<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">var</span> _log<span style="color: #000000; font-weight: bold;">:</span>ILogger = Log.getLogger<span style="color: #000000;">&#40;</span><span style="color: #990000;">'my.class.foo.Bar'</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> Bar<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
  _log.debug<span style="color: #000000;">&#40;</span><span style="color: #990000;">'In constructor.'</span><span style="color: #000000;">&#41;</span>;
  initClass<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> initClass<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
  _log.<span style="color: #004993;">info</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">'InitClass'</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> doLogEvent<span style="color: #000000;">&#40;</span> eventName<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span> <span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
  _log.<span style="color: #004993;">log</span><span style="color: #000000;">&#40;</span>LogEventLevel.DEBUG, <span style="color: #990000;">&quot;some info from event {0}&quot;</span>, eventName <span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> doError<span style="color: #000000;">&#40;</span> errorMsg<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span>, partName<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span> <span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
<span style="color: #000000;">&#123;</span>
   <span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span> Log.isError<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
     _log.<span style="color: #004993;">error</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">&quot;Oou, we have a problem. Message: '{0}' from part: '{1}' &quot;</span>, errorMsg, partName <span style="color: #000000;">&#41;</span>;
   <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
<span style="color: #009900;">//....</span></pre></div></div>

<p>Jak je vidět, Logger poskytuje 5 základních metod a jednu obecnou metodu log(), která poskytuje možnost logovat zprávy i na vlastní úrovni.</p>
<ul>
<li>info( message:String, &#8230;rest ) - odpovídá zprávě na úrovni  LogEventLevel.INFO</li>
<li>debug( message:String, &#8230;rest ) - odpovídá zprávě na úrovni  LogEventLevel.DEBUG</li>
<li>warn( message:String, &#8230;rest ) - odpovídá zprávě na úrovni  LogEventLevel.WARN</li>
<li>error( message:String, &#8230;rest ) - odpovídá zprávě na úrovni  LogEventLevel.ERROR</li>
<li>fatal( message:String, &#8230;rest ) - odpovídá zprávě na úrovni  LogEventLevel.FATAL</li>
<li>log( level:Int, message:String, &#8230;rest )</li>
</ul>
<p>Všechny poskytované metody umožnují ve zprávách nahrazování parametrů, tj. pomocí syntaxe {x}, kde x je pořadové číslo dodatečného parametru (<em>&#8230;rest</em>).</p>
<p>V metodě <em>doError()</em> je použita další vlastnost třídy Log. Použitá konstrukce zajistí to, že zpráva bude do loggeru odeslána pouze za předpokladu, že je úrověn přijímaných zpráv vyžží než úroveň danné zprávy. K dispozici jsou metody na zjištění všech stavů: isInfo(), isDebug(), isError(), isFatal(), isWarn().</p>
<h3>Log Target</h3>
<p>Zjednodušeně a ve zkratce řečeno, je to v příjemce zpráv z loggerů. Z vestavěných Log Targetů je nejpoužívanější <a href="http://livedocs.adobe.com/flex/3/langref/mx/logging/targets/TraceTarget.html" onclick="pageTracker._trackPageview('/outgoing/livedocs.adobe.com/flex/3/langref/mx/logging/targets/TraceTarget.html?referer=');">TraceTarget</a>, ktery jako výstup používá stejnou konzoli jako příkaz trace(). Dále pak máme k dispozici MiniDebugTarget a LineFormattedTarget (nejlepší taťka pro psaní vlastních log targetů).</p>
<p>Každý Log Target umožnuje filtrovat přijímané zprávy pomocí vlastnosti <em>filters</em>, která jako hodnotu přijímá pole textových řetězců, které specifikují kategorie, které daný Log Target chce. Složitě řečeno, ale příklad vysvětlí.</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3 actionscript3" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&amp;</span>lt;<span style="color: #000000; font-weight: bold;">?</span>xml <span style="color: #004993;">version</span>=<span style="color: #990000;">&quot;1.0&quot;</span> encoding=<span style="color: #990000;">&quot;utf-8&quot;</span><span style="color: #000000; font-weight: bold;">?&amp;</span>gt;
<span style="color: #000000; font-weight: bold;">&amp;</span>lt;mx<span style="color: #000000; font-weight: bold;">:</span>WindowedApplication xmlns<span style="color: #000000; font-weight: bold;">:</span>mx=<span style="color: #990000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> layout=<span style="color: #990000;">&quot;absolute&quot;</span>
 creationComplete=<span style="color: #990000;">&quot;init()&quot;</span><span style="color: #000000; font-weight: bold;">&amp;</span>gt;
 <span style="color: #000000; font-weight: bold;">&amp;</span>lt;mx<span style="color: #000000; font-weight: bold;">:</span>Script<span style="color: #000000; font-weight: bold;">&amp;</span>gt;
  <span style="color: #000000; font-weight: bold;">&amp;</span>lt;<span style="color: #000000; font-weight: bold;">!</span><span style="color: #000000;">&#91;</span>CDATA<span style="color: #000000;">&#91;</span>
   <span style="color: #009900;">//  .... imports ...</span>
&nbsp;
   <span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> <span style="color: #004993;">init</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
   <span style="color: #000000;">&#123;</span>
    <span style="color: #6699cc; font-weight: bold;">var</span> logTarget<span style="color: #000000; font-weight: bold;">:</span>ILoggingTarget = <span style="color: #0033ff; font-weight: bold;">new</span> TraceTarget<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
    <span style="color: #009900;">// chci přijímat pouze zprávy z těchto kategorií</span>
    logTarget.<span style="color: #004993;">filters</span> = <span style="color: #000000;">&#91;</span><span style="color: #990000;">&quot;my.class.foo.*&quot;</span>, <span style="color: #990000;">&quot;mx.rpc.*&quot;</span> <span style="color: #000000;">&#93;</span>;
&nbsp;
    <span style="color: #009900;">// Vlastnost level určuje maximální úrověn přijímaných zpráv</span>
    <span style="color: #009900;">// Posloupnost úrovní je takováto (číslo vedle názvu vyjadřuje hodnotu úrovně):</span>
    <span style="color: #009900;">// LogEventLevel.FATAL (1000)</span>
    <span style="color: #009900;">// LogEventLevel.ERROR (8)</span>
    <span style="color: #009900;">// LogEventLevel.WARN (6)</span>
    <span style="color: #009900;">// LogEventLevel.INFO (4)</span>
    <span style="color: #009900;">// LogEventLevel.DEBUG (2)</span>
    <span style="color: #009900;">// LogEventLevel.ALL (0)</span>
    <span style="color: #009900;">//</span>
    <span style="color: #009900;">// Zprávy jsou přijímány od zadané úrovně nahoru, tj. pokud zadám:</span>
    <span style="color: #009900;">// logTarget.level = LogEventLevel.WARN</span>
    <span style="color: #009900;">// bude target přijímat pouze zprávy typu WARN, ERROR, FATAL</span>
    <span style="color: #009900;">//</span>
    <span style="color: #009900;">// V tomto případě chci přijímat všechny druhy zpráv</span>
    logTarget.<span style="color: #004993;">level</span> = LogEventLevel.ALL;
&nbsp;
    <span style="color: #009900;">// jak budou jednotlivé položky odděleny, napr: datum : errorLevel : errorMessage</span>
    logTarget.fieldSeparator = <span style="color: #990000;">&quot; : &quot;</span>;
&nbsp;
    <span style="color: #009900;">// ve zprávě chci zahrnout nazev ktergorie, ze které zpráva přišla</span>
    logTarget.includeCategory = <span style="color: #0033ff; font-weight: bold;">true</span>;
&nbsp;
    <span style="color: #009900;">// ve zprávě chci vidět datum a čas vzniku zprávy</span>
    logTarget.includeTime = <span style="color: #0033ff; font-weight: bold;">true</span>;
    logTarget.includeDate = <span style="color: #0033ff; font-weight: bold;">true</span>;
&nbsp;
    <span style="color: #009900;">// ve zprávě chci vidět úroveň zprávy</span>
    logTarget.includeLevel = <span style="color: #0033ff; font-weight: bold;">true</span>;
&nbsp;
    <span style="color: #009900;">// zaregistrujeme logTarget do seznamu Loggerů</span>
    Log.addTarget<span style="color: #000000;">&#40;</span> logTarget <span style="color: #000000;">&#41;</span>;
&nbsp;
    <span style="color: #6699cc; font-weight: bold;">var</span> myBar<span style="color: #000000; font-weight: bold;">:</span>Bar= <span style="color: #0033ff; font-weight: bold;">new</span> Bar<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
    myBar.doLogEvent<span style="color: #000000;">&#40;</span> <span style="color: #990000;">&quot;myClass&quot;</span> <span style="color: #000000;">&#41;</span>;
    myBar.doError<span style="color: #000000;">&#40;</span> <span style="color: #990000;">&quot;myClass&quot;</span>, <span style="color: #990000;">&quot;first&quot;</span> <span style="color: #000000;">&#41;</span>;
   <span style="color: #000000;">&#125;</span>
&nbsp;
  <span style="color: #000000;">&#93;</span><span style="color: #000000;">&#93;</span><span style="color: #000000; font-weight: bold;">&amp;</span>gt;
  <span style="color: #000000; font-weight: bold;">&amp;</span>lt;<span style="color: #000000; font-weight: bold;">/</span>mx<span style="color: #000000; font-weight: bold;">:</span>Script<span style="color: #000000; font-weight: bold;">&amp;</span>gt;
<span style="color: #000000; font-weight: bold;">&amp;</span>lt;<span style="color: #000000; font-weight: bold;">/</span>mx<span style="color: #000000; font-weight: bold;">:</span>WindowedApplication<span style="color: #000000; font-weight: bold;">&amp;</span>gt;</pre></div></div>

<p>Výstup do konzole bude např. takovýto:</p>

<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:monospace;">12/1/2008 : [DEBUG] : my.class.foo.Bar : In constructor.
12/1/2008 : [INFO] : my.class.foo.Bar : InitClass
12/1/2008 : [DEBUG] : my.class.foo.Bar : Some info from event LogEvent
12/1/2008 : [ERROR] : my.class.foo.Bar : Oou, we have a problem. Message: 'LogEvent' from part: 'LogEventLevel'</pre></div></div>

<h3>Log Destination</h3>
<p>Poslední část je nejjednodušší. Pouze určuje, kam má Log Target odeslat formátovaný výstup přijaté zprávy. Může to být soubor, SharedObject, databáze, prostě cokoli. Toto je již v režii daného Log Targetu.</p>
<h3>Závěrem</h3>
<p>Nepopsal jsem zde úplně všechny možnosti logovacího API, ale jako základ by to mohlo stačit. Největší výhodu tohoto přístupu jsem si však nechal na později, konkrétně jde o vytvoření vlastního Log Targetu. Doufám, že popis byl srozumitelný a snad se to bude někomu hodit.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tyglobee.cz/?p=9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
