<?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>blog by Hellix</title>
	<atom:link href="http://bloghellix.pl/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://bloghellix.pl</link>
	<description>Programowanie Adobe Flex, Php itd. To co tutaj znajdziecie ;)</description>
	<lastBuildDate>Mon, 09 Aug 2010 07:33:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Małe sukcesy</title>
		<link>http://bloghellix.pl/?p=915</link>
		<comments>http://bloghellix.pl/?p=915#comments</comments>
		<pubDate>Sun, 08 Aug 2010 18:18:50 +0000</pubDate>
		<dc:creator>hellix</dc:creator>
				<category><![CDATA[Moje wpisy]]></category>

		<guid isPermaLink="false">http://bloghellix.pl/?p=915</guid>
		<description><![CDATA[Letnie upały źle wpływają na zakamarek mojej głowy, który odpowiada za me blogowe poczynania. :) W kwestii programowania nie mogę narzekać na brak zajęć w ostatnim czasie udało mi się zakończyć pracę nad moim portfolio. Na codzień raczej niewiele zajmuję się bezpośrednio kodowaniem stron od początku do końca, więc nie obyło się bez pomocy bardziej [...]]]></description>
			<content:encoded><![CDATA[<p class="text">Letnie upały źle wpływają na zakamarek mojej głowy, który odpowiada za me blogowe poczynania. :) W kwestii programowania nie mogę narzekać na brak zajęć w ostatnim czasie udało mi się zakończyć pracę nad moim portfolio. Na codzień raczej niewiele zajmuję się bezpośrednio kodowaniem stron od początku do końca, więc nie obyło się bez pomocy bardziej doświadczonych kolegów. ;) Jest w nim jak narazie niewiele prac, umieściłem tylko te, które moim zdaniem były najbardziej pracochłonne.</p>
<p class="text">Kilka miesięcy temu w swojej pracy zacząłem wykorzystywać nowy framework <a href="http://blog.szemraj.eu/tequila">Tequila</a>, <a href="http://blog.szemraj.eu/about">główny pomysłodawca</a> oparł jego działanie na bazie już istniejących rozwiązań <a href="http://puremvc.org/">PureMVC</a> oraz <a href="http://code.google.com/p/fabrication/">Fabrication</a>. Twórca Fabrication zaprzestał pracy nad jego rozwojem &#8211; Rafałowi udało się z nim skontaktować i obecnie to on jest głównym programistą czuwającym nad rozbudową tego popularnego frameworka. Jak się można było spodziewać wszelkie dobrodziejstawa, które stworzył w Tequil-i zostały całkowicie przeniesione do Fabrication (lista dobrodziejstw <a href="http://code.google.com/p/fabrication/wiki/TableOfContents">tu</a>) :). Od samego początku śledziłem oraz starałem się wykorzystywać przeniesione z Tequili do Fabrication usprawnienia. Zaowocowało to tym że Rafał postanowił dodać mnie do projektu Fabrication. :)</p>
<p class="specText">Za co mu bardzo dziękuję! Mam nadzieję, że uda mi się wnieść coś dobrego do tworzonych przez niego rozwiązań.</p>
]]></content:encoded>
			<wfw:commentRss>http://bloghellix.pl/?feed=rss2&amp;p=915</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SystemTrayIcon i DoubleClick w Adobe Air</title>
		<link>http://bloghellix.pl/?p=825</link>
		<comments>http://bloghellix.pl/?p=825#comments</comments>
		<pubDate>Sun, 11 Jul 2010 17:10:36 +0000</pubDate>
		<dc:creator>hellix</dc:creator>
				<category><![CDATA[Moje wpisy]]></category>

		<guid isPermaLink="false">http://bloghellix.pl/?p=825</guid>
		<description><![CDATA[Niedawno rozpocząłem pracę nad aplikacją w adobe air. Jedną z niewielkich funkcjonalności była minimalizacja aplikacji do postaci ikonki w tray-u, oraz przywrócenie jej okna po dwukrotnym kliknięciu. Sam proces wczytania oraz minimalizacji nie stanowił problemu, ale ponowne pokazanie okna po dwukrotnym kliknięciu w ikonę niestety sprawiło mi nieco trudności. Załadowana ikona w tray-u reprezentowana jest [...]]]></description>
			<content:encoded><![CDATA[<p class="text">Niedawno rozpocząłem pracę nad aplikacją w adobe air. Jedną z niewielkich funkcjonalności była minimalizacja aplikacji do postaci ikonki w tray-u, oraz przywrócenie jej okna po dwukrotnym kliknięciu. Sam proces wczytania oraz minimalizacji nie stanowił problemu, ale ponowne pokazanie okna po dwukrotnym kliknięciu w ikonę niestety sprawiło mi nieco trudności.</p>
<p class="text">Załadowana ikona w tray-u reprezentowana jest przez klasę <a href="http://livedocs.adobe.com/flex/3/langref/flash/desktop/SystemTrayIcon.html#methodSummary">SystemTrayIcon</a>, która udostępnia szereg zdarzeń, niestety wśród nich brakuje obsługi podwójnego kliknięcia. Do opisywanej sytuacji pasuję przysłowie &#34;Jak się nie ma co się lubi, to się lubi co się ma&#34;<br />
- innymi słowy postanowiłem wykorzystać to co mam dostępne czyli pojedyncze kliknięcie. ;)</p>
<p class="specText">Klasa zdarzenia &#34;DoubleClick&#34; dla mojej ikonki:</p>
<pre class="brush: as3">
public class ExtendedSystemTrayIconEvent extends ScreenMouseEvent
{
	 public static const DOUBLE_CLICK:String = &quot;doubleClick&quot;;

	 public function ExtendedSystemTrayIconEvent(type:String, bubbles:Boolean=false,
						   cancelable:Boolean=false, screenX:Number=undefined,
						   screenY:Number=undefined, ctrlKey:Boolean=false,
					    altKey:Boolean=false, shiftKey:Boolean=false,
						   buttonDown:Boolean=false, commandKey:Boolean=false,
						   controlKey:Boolean=false)
	 {
		   super(type, bubbles, cancelable, screenX, screenY,
		   ctrlKey, altKey, shiftKey, buttonDown, commandKey, controlKey);
	 }
}
</pre>
<p class="specText">Klasa dostarczająca obsługę zdarzenia:</p>
<pre class="brush: as3">
[Event(name=&quot;doubleClick&quot;, type=&quot;ExtendedSystemTrayIconEvent&quot;]
/**
*SystemTrayIcon DoubleClick
*This class provide double click on tray icon
*
* @author Piotr Zarzycki
*
*/
public class SystemTrayIconWraper extends EventDispatcher
{
   private var _systemTrayIcon:SystemTrayIcon;
   private var _clickCounter:int = 0;
   private var _timer:Timer;

   public function SystemTrayIconWraper(systemTrayIcon:SystemTrayIcon)
   {
		   _systemTrayIcon = systemTrayIcon;
		   _timer = new Timer(1000, 1);
		   _timer.addEventListener(TimerEvent.TIMER_COMPLETE,
                            onTimeComplete);

		   _systemTrayIcon.addEventListener(ScreenMouseEvent.CLICK,
                            onClickTrayIcon);
   }

   public function onClickTrayIcon(event:ScreenMouseEvent):void
   {
		   if (!_timer.running)
		   {
			   _timer.start();
		   }
		   _clickCounter++;
		   if (_clickCounter &gt; 1)
		   {
			      _systemTrayIcon.dispatchEvent(
              new ExtendedSystemTrayIconEvent(&quot;doubleClick&quot;,
                     event.bubbles, event.cancelable, event.screenX,
                     event.screenY, event.ctrlKey, event.altKey,
                     event.shiftKey, event.buttonDown, event.commandKey,
                     event.controlKey));

			      _clickCounter = 0;
		   }
   }

   override public function addEventListener(type:String, listener:Function,
                                   useCapture:Boolean=false, priority:int=0,
                                   useWeakReference:Boolean=false):void
   {
		      _systemTrayIcon.addEventListener(type, listener, useCapture, priority,
                                          useWeakReference);
   }

   private function onTimeComplete(event:TimerEvent):void
   {
		   _clickCounter = 0;
		   _timer.reset();
   }
}
</pre>
<p class="text">Klasa &#34;SystemTrayIconWraper&#34; dziedziczy po klasie &#34;EventDispatcher&#34;, obsługuję zdarzenie &#34;CLICK&#34; dla obiektu SystemTrayIcon dostarczonego w jej konstruktorze oraz inicjalizuję klasę &#34;Timer&#34; wartością 1 sekundy. Dodatkowo w jej wnętrzu tworzę zmienną przechowującą ilość kliknięć na ikonkę tray-a &#8211; wartość większa niż jeden oznacza podwójny klik. Przy pierwszy klik-u zostaje uruchomiony timer i zwiększony licznik kliknięć. Jeżeli w ciągu sekundy nie nastąpi kolejne kliknięcie licznik i timer są resetowane.</p>
<p class="text">Na koniec pozostaje pytanie &#8211; Dlaczego zabrakło obsługi właśnie tego zdarzenia w klasie SystemTrayIcon?</p>
<p class="editText">EDIT (08-08-2010): Do powyższego rozwiązania wkradł się niewielki błąd &#8211; jest to dość późna edycja, ale wcześniej brak chęci i czasu na blogowe poczynania. W metodzie &#8222;onClickTrayIcon&#8221; wywołanie event-a &#8222;doubleClick&#8221; odbywa się na instancji obiektu &#8222;SystemTrayIcon&#8221;. Przesłonięta została także metoda &#8222;addEventListener&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://bloghellix.pl/?feed=rss2&amp;p=825</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Błąd &#8222;Variable number of arguments is not supported for services&#8221;</title>
		<link>http://bloghellix.pl/?p=719</link>
		<comments>http://bloghellix.pl/?p=719#comments</comments>
		<pubDate>Sun, 20 Jun 2010 18:22:20 +0000</pubDate>
		<dc:creator>hellix</dc:creator>
				<category><![CDATA[Moje wpisy]]></category>
		<category><![CDATA[Errors]]></category>

		<guid isPermaLink="false">http://bloghellix.pl/?p=719</guid>
		<description><![CDATA[W programowaniu dość istotną kwestią jest komentowanie kodu, mam na tym punkcie lekkiego fioła.;) Tworząc funkcję w serwisie udostępniającym dane jak zawsze przystąpiłem do ob-komentowania parametrów i opisania samego działania funkcji. /** * Test function * * @param string $name * @param string $surname * @return array */ public function testFunction($name, $surname) { return $name.' [...]]]></description>
			<content:encoded><![CDATA[<p class="text">
W programowaniu dość istotną kwestią jest komentowanie kodu, mam na tym punkcie lekkiego fioła.;) Tworząc funkcję w serwisie udostępniającym dane jak zawsze przystąpiłem do ob-komentowania parametrów i opisania samego działania funkcji.
</p>
<pre class="brush: php">
/**
 * Test function
 *
 * @param string $name
 * @param string $surname
 * @return array
 */
 public function testFunction($name, $surname)
 {
      return $name.' '.$surname;
 }
</pre>
<p class="text">
Po całym rytuale komentowania doszedłem do wniosku, że nie będzie mi potrzebny jeden z parametrów. Radośnie usunąłem go, po czym przystąpiłem do sprawdzenia działania funkcji w ZAmfBrowser otrzymałem błąd o sygnaturze:
</p>
<p class="specText">
PHP Fatal error:  Uncaught exception &#8216;Zend_Server_Reflection_Exception&#8217; with message &#8216;Variable number of arguments is not supported for services (except optional parameters). Number of function arguments must correspond to actual number of arguments described in a docblock.&#8217;
</p>
<p class="text">
Dość długo zastanawiałem się, co jest nie tak, a to, dlatego, że w pośpiechu zwróciłem uwagę tylko na pierwsze zdanie &#8211; drugie z kolei mówi mi o wiele więcej.
</p>
<p class="specText">
Ilość argumentów funkcji musi odpowiadać ilości argumentów opisanych<br />
w docblock-u.
</p>
<p class="text">
Jednak na to wszystko zwrócił mi uwagę kolega z pracy, który zerknął na mój kod. Morał z całego &#34;zajścia&#34;:
</p>
<ul class="listUl">
<li>
        Analizuj błędy w całości, bo może ich rozwiązanie kryje się na samym końcu opisu otrzymanego wyjątku
    </li>
<li>
        Czasami warto aby ktoś spojrzał na Twój kod &#34;świeżym&#34; okiem, to może przynieść nie tylko rozwiązanie, ale niejednokrotnie poprawę funkcjonalności
    </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://bloghellix.pl/?feed=rss2&amp;p=719</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dostęp do itemrenderer-ów w Spark DataGroup</title>
		<link>http://bloghellix.pl/?p=700</link>
		<comments>http://bloghellix.pl/?p=700#comments</comments>
		<pubDate>Wed, 09 Jun 2010 17:49:51 +0000</pubDate>
		<dc:creator>hellix</dc:creator>
				<category><![CDATA[Moje wpisy]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://bloghellix.pl/?p=700</guid>
		<description><![CDATA[Czwarta odsłona Flex SDK przyniosła ze sobą nowe rodzaje kontenerów ułatwiających rozmieszczanie komponentów w aplikacjach flex-owych. Jednym z nich jest DataGroup. Nie chcę tutaj opisywać możliwości kontenera tylko przedstawić sposób w jaki uzyskałem dostęp do utworzonych w moim DataGroup itemrenderer-ów. Mój itemrenderer wyświetla imię i nazwisko na podstawie danych zawartych w obiekcie &#34;PersonVo&#34;. Klasa PersonVo. [...]]]></description>
			<content:encoded><![CDATA[<p class="text">
Czwarta odsłona Flex SDK przyniosła ze sobą nowe rodzaje <a href="http://help.adobe.com/en_US/flex/using/WSDBFD90D1-A0A5-40e2-BEEE-14ECBE82F83B.html">kontenerów</a> ułatwiających rozmieszczanie komponentów w aplikacjach flex-owych. Jednym z nich jest DataGroup. Nie chcę tutaj opisywać możliwości kontenera tylko przedstawić sposób w jaki uzyskałem dostęp do utworzonych w moim DataGroup itemrenderer-ów.
</p>
<p class="text">
Mój itemrenderer wyświetla imię i nazwisko na podstawie danych zawartych w obiekcie &#34;PersonVo&#34;.
</p>
<p class="specText">
Klasa PersonVo.
</p>
<pre class="brush: as3">
public dynamic class PersonVo
{
		public var firstName:String;
		public var surname:String;

		public function PersonVo(firstName:String = null,
					surname:String = null)
		{
			this.firstName = firstName;
			this.surname =surname;
		}
}
</pre>
<p class="specText">
Kod itemrenderer-a
</p>
<pre class="brush: xml">
&lt;s:ItemRenderer xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot;
		xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot;
		xmlns:mx=&quot;library://ns.adobe.com/flex/mx&quot;
		autoDrawBackground=&quot;true&quot;&gt;
	&lt;s:HGroup gap=&quot;5&quot;
			  height=&quot;100%&quot;&gt;
		&lt;s:Label id=&quot;firstName&quot;
			 text=&quot;{data.firstName}&quot;/&gt;
		&lt;s:Label id=&quot;surname&quot;
			 text=&quot;{data.surname}&quot;/&gt;
	&lt;/s:HGroup&gt;
&lt;/s:ItemRenderer&gt;
</pre>
<p class="text">
Dostęp do każdego utworzonego obiektu itemrenderera uzyskuję rejestrując metodę dla zdarzenia &#34;rendererAdd&#34;. W jej argumencie zostaje dostarczony obiekt &#34;event&#34; typu &#34;RendererExistenceEvent&#34;, który to zawiera instancję itemrenderera. Wszystkie obiekty itemrenderer-ów umieszczam w tablicy i udostępniam na zewnątrz kontenera DataGroup poprzez publiczną właściwość.
</p>
<p class="specText">
DataGroup z przechowanymi obiektami itemrenderer-ów.
</p>
<pre class="brush: xml">
&lt;s:DataGroup xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot;
	        xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot;
	        xmlns:mx=&quot;library://ns.adobe.com/flex/mx&quot;
                   itemRenderer=&quot;dgControls.DgControlRenderer&quot;
	        rendererAdd=&quot;onRendererAdd(event)&quot;&gt;
	&lt;fx:Script&gt;
		&lt;![CDATA[
			import spark.events.RendererExistenceEvent;
			private var _itemRenderers:Array = [];

			/**
			 * Array of itemrenderers
			 * */
			public function get itemRenderers():Array
			{
				return _itemRenderers;
			}

			/**
			 * Add renderer to array
			 * */
			protected function onRendererAdd(event:RendererExistenceEvent):void
			{
				_itemRenderers.push(event.renderer);
			}
		]]&gt;
	&lt;/fx:Script&gt;
&lt;/s:DataGroup&gt;
</pre>
<p class="text">
Do dataprovidera kontenera DataGroup dostaczyłem następującą tablicę oraz przeprowadziłem prostą iterację wraz ze zmianą właściwości wewnątrz itemrenderera. W zasadzie było to dość proste, ale czy to jedyne rozwiązanie? ;)
</p>
<p class="specText">
Tablica elementów &#34;dataProvidera&#34; w DataGroup.
</p>
<pre class="brush: as3">
var dpDataGroup:ArrayCollection = new ArrayCollection([
						new PersonVo(&quot;Piotr&quot;, &quot;Zarzycki&quot;),
						new PersonVo(&quot;Marian&quot;, &quot;Zakrzewski&quot;),
						new PersonVo(&quot;Damian&quot;, &quot;Zarzycki&quot;)
					]);
</pre>
<p class="specText">
Zmiana właściwości obiektów itemrenderer-ów.
</p>
<pre class="brush: as3">
var count:int = dg.itemRenderers.length;

for(var i:int = 0; i &lt; count; i++)
{
					var dgRenderer:DgControlRenderer = dg.itemRenderers[i];
					dgRenderer.firstName.text = &quot;Ola&quot;;
					dgRenderer.surname.text = &quot;O.&quot;;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://bloghellix.pl/?feed=rss2&amp;p=700</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FlexPaginator Released! ;)</title>
		<link>http://bloghellix.pl/?p=667</link>
		<comments>http://bloghellix.pl/?p=667#comments</comments>
		<pubDate>Tue, 18 May 2010 20:41:52 +0000</pubDate>
		<dc:creator>hellix</dc:creator>
				<category><![CDATA[Moje wpisy]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[FlexPaginator]]></category>

		<guid isPermaLink="false">http://bloghellix.pl/?p=667</guid>
		<description><![CDATA[var flashvars = {}; var params = {}; var attributes = { salign: "ct" }; attributes.id = "flashPg"; swfobject.embedSWF("http://bloghellix.pl/project-file/flash/paginator/TestProject.swf", "flashPg", "500", "150", "9.0.0", false, flashvars, params, attributes); Chyba każdy programista zetknął się z problemem paginacji czy to na tworzonej przez siebie stronie internetowej, czy też(jak w moim przypadku) w aplikacji flex-owej. W rozwiązaniach tworzonych w [...]]]></description>
			<content:encoded><![CDATA[<p><script type="text/javascript">
 var flashvars = {};
 var params = {};
 var attributes = {
   salign: "ct"
 };
 attributes.id = "flashPg";
 swfobject.embedSWF("http://bloghellix.pl/project-file/flash/paginator/TestProject.swf", "flashPg", "500", "150", "9.0.0", false, flashvars, params, attributes);
</script></p>
<p class="text">Chyba każdy programista zetknął się z problemem paginacji czy to na tworzonej przez siebie stronie internetowej, czy też(jak w moim przypadku) w aplikacji flex-owej.<br />
W rozwiązaniach tworzonych w pracy zazwyczaj duże ilości danych prezentowałem za pomocą kontrolki DataGrid w połączeniu z paginatorem udostępnionym pod adresem &#8211; <a href="http://www.darklump.co.uk/blog/?p=112">link</a>. Jednak wciąż rosnąca ich ilość szybko sprawiła, że wygrzebana w czeluściach internetu kontrolka przestała spełniać oczekiwania. Postanowiłem zmierzyć się z paginacją i stworzyć samodzielnie komponent, który znacznie ułatwił by, a w szczególności przyśpieszył poruszanie się po tysiącach stron udostępnianych danych. Właściwie żeby być szczerym do rozpoczęcia pracy nad kontrolką zachęcił mnie <a href="http://blog.redliquid.pl/">Redliquid</a>, a jej obecny wygląd-funkcjonalność jest w 100% jego pomysłem. :) Zaprezentowany flex-paginator jest zbudowany jeszcze na bazie kontrolek udostępnianych we Flex-ie 3 &#8211; planuję jednak jego dalszy rozwój, a więc poprawę wszelkich znalezionych błędów ;), a przy odrobinie większej ilości wolnego czasu przepisanie całości z wykorzystaniem dobrodziejstw Flex-a 4.</p>
<p class="text">Diabeł tkwi w szczegółach, a więc poniżej prezentuję opis kilku najważniejszych opcji FlexPaginator-a.</p>
<p class="specText">Do pliku swc paginatora niezbędne jest dołączenie pliku css o nazwie StyleButtons.css, który odpowiada za wygląd wszystkich przycisków. Najważniejsze właściwości paginatora, które powinny zostać ustawione <br/>w kodzie ActionScript lub po stronie mxml-a to:</p>
<ul class="listUl">
<li>totaItems &#8211; ilość wszystkich elementów</li>
<li>itemsPerPage &#8211; ilość elementów wyświetlanych na stronie</li>
<li>pageToDisplay &#8211; ilość wyświetlonych przycisków z numerami stron &#8211; ustawienie parzystej liczby wyświetlanych stron, skutkuję zamianę jej na nieparzystą ich ilość (takie &#8222;zachowanie&#8221; wynika z działania paginatora)</li>
</ul>
<p class="specText">Opcjonalna jest natomiast właściwość:</p>
<ul class="listUl">
<li>selectedPage &#8211; numer zaznaczonej strony, po utworzeniu kontrolki domyślnie zostaje zanaczona środkowa strona/przycisk spośród aktualnie wyświetlonych.</li>
</ul>
<p class="specText">Moja kontrolka paginacji zawiera przyciski umożliwiające odpowiednio:</p>
<ul class="listUl">
<li>skok o jedną stronę do przodu lub do tyłu</li>
<li>skok o wybraną ilość stron &#8211; wartości w wyświetlonym menu są wygenerowane automatycznie, ta para przycisków pojawia się tylko w przypadku gdy całkowita ilość stron przekracza 50.</li>
<li>skok na koniec i początek.</li>
</ul>
<p class="text">Dodatkowo obsługa zdarzenia &#8222;selectedPageChanged&#8221; daje możliwość odczytu aktualnie zaznaczonej strony. Wygenerowany paginator wyświetla nieparzystą liczbę stron,<br />
a aktualnie zanaczony numer strony jest podkreślony</p>
<p class="specText">Przykładowy kod z zaznaczoną stroną nr 3 oraz plik css odpowiadający za poniższy wygląd paginatora pod <a href="http://bloghellix.pl//project-file/flash/paginator/srcview/index.html">linkiem</a></p>
<div id="flashPg"></div>
<p class="text">Wszelkiego rodzaju błędy, sugestię co mogę poprawić lub co zrobiłem tragicznie proszę zgłaszać na <a href="https://code.google.com/p/flexpaginator/">code-google</a> (gdzie udostępnie kod projektu oraz plik swc &#8211; zakładka Download) lub w komentarzach pod tym czy też kolejnymi wpisami dotyczącymi FlexPaginator-a. ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://bloghellix.pl/?feed=rss2&amp;p=667</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DataGrid z pogrubioną zawartością wierszy</title>
		<link>http://bloghellix.pl/?p=615</link>
		<comments>http://bloghellix.pl/?p=615#comments</comments>
		<pubDate>Mon, 26 Apr 2010 20:39:36 +0000</pubDate>
		<dc:creator>hellix</dc:creator>
				<category><![CDATA[Moje wpisy]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://bloghellix.pl/?p=615</guid>
		<description><![CDATA[var flashvars = {}; var params = {}; var attributes = { salign: "ct" }; attributes.id = "flashDg"; swfobject.embedSWF("http://bloghellix.pl/project-file/flash/DgBoldColumns/DataGridWithBoldRows.swf", "flashDg", "450", "200", "9.0.0", false, flashvars, params, attributes); Podczas pracy nad pewną funkcjonalnością musiałem pogrubić zawartość wybranych wierszy w datagrid-zie. &#8222;Decyzja&#8221; o pogrubieniu zawartości danego wiersza miała być zawarta w każdym pojedyńczym obiekcie dostarczonym do datagrid-a [...]]]></description>
			<content:encoded><![CDATA[<p><script type="text/javascript">
 var flashvars = {};
 var params = {};
 var attributes = {
   salign: "ct"
 };
 attributes.id = "flashDg";
 swfobject.embedSWF("http://bloghellix.pl/project-file/flash/DgBoldColumns/DataGridWithBoldRows.swf", "flashDg", "450", "200", "9.0.0", false, flashvars, params, attributes);
</script> </p>
<p class="text">
Podczas pracy nad pewną funkcjonalnością musiałem pogrubić zawartość wybranych wierszy w datagrid-zie. &#8222;Decyzja&#8221; o pogrubieniu zawartości danego wiersza miała być zawarta w każdym pojedyńczym obiekcie dostarczonym do datagrid-a w postaci tablicy (Array). Wewnątrz takiego obiektu zawarta zostanie właściwość &#8222;mówiąca&#8221; o pogrubieniu.
</p>
<p class="text">
Przykładowa klasa zawierająca informację każdego wiersza w datagrid-zie mogła by wyglądać następnująco (właściwość &#8222;isSpecial&#8221; decyduję o pogrubieniu):
</p>
<pre class="brush: as3">
public dynamic class PersonVo
{
		public var name:String;
		public var surname:String;
		public var email:String;

  /**
		 * If this property is true, row in DataGrid is bold
		 *
		 * @var Boolean
		 * */
		public var isSpecial:Boolean;

		private var _date:Date;

		/**
		 * Get formatted date
		 *
		 * @retrun String
		 * */
		public function get dateStr():String
		{
			var dateFormatter:DateFormatter = new DateFormatter();
			dateFormatter.formatString = &quot;DD-MM-YYYY&quot;;

			return dateFormatter.format(_date);
		}

		public function set dateStr(value:String):void
		{
			_date = DateFormatter.parseDateString(value);
		}

		public function PersonVo(name:String = null, surname:String = null,
					date:Date = null, email:String = null, isSpecial:Boolean = false)
		{
			this.name = name;
			this.surname = surname;
			this._date = date;
			this.email = email;
			this.isSpecial = isSpecial;
		}
}
</pre>
<p class="text">
Następnie należy utworzyć DataGrid-a wraz z kolumnami wyświetlającymi informację, którymi jesteśmy zainteresowani oraz itemrenderer w którym obsłużone zostanie pogrubienie poszczególnych wierszy. Kod mojego przykładowego datagrid-a zawiera kolumnę &#8222;Imię i nazwisko&#8221; łączącą dwie właściwości z klasy PersonVo za pomocą funkcji anonimowej, email oraz sformatowaną datę urodzenia.
</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:DataGrid xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot;
				 xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot;
				 xmlns:mx=&quot;library://ns.adobe.com/flex/mx&quot;
				 itemRenderer=&quot;{new ClassFactory(DGItemRenderer)}&quot;&gt;
	&lt;mx:columns&gt;
		&lt;!--This simple anonymous function in DataGridColumn concatenates two string: name and surname from value object--&gt;
		&lt;mx:DataGridColumn headerText=&quot;Imię i Nazwisko&quot;
		labelFunction=&quot;{function(personVo:PersonVo,
									dgColumn:DataGridColumn):String
						{return personVo.name + ' ' + personVo.surname; }}&quot;
						   width=&quot;200&quot;/&gt;
		&lt;mx:DataGridColumn headerText=&quot;Email&quot;
						   dataField=&quot;email&quot;
						   width=&quot;250&quot;/&gt;
		&lt;mx:DataGridColumn headerText=&quot;Data urodzenia&quot;
						   dataField=&quot;dateStr&quot;
						   width=&quot;120&quot;/&gt;
	&lt;/mx:columns&gt;
	&lt;fx:Script&gt;
		&lt;![CDATA[
			import dataGridItermRenderers.DGItemRenderer;
			import vo.PersonVo;
		]]&gt;
	&lt;/fx:Script&gt;
&lt;/mx:DataGrid&gt;
</pre>
<p class="text">
Najważniejsza część całej zabawy-jest klasa itemrenderera zawierająca przesłoniętą właściwość &#8222;data&#8221;. W jej wnętrzu sprawdzany jest typ dostarczonej wartości ponieważ podczas tworzenia DataGrida przekazywane są do niej obiekty poszczególnych kolumn, którymi nie byłem zainteresowany.  W dalszej kolejności właściwość wykonuję się przy wypełnieniu każdej komórki poszczególnych kolumn co jak widać daję możliwość sterowania wyglądem ich zawartości poprzez ręczne ustawienie styli.
</p>
<pre class="brush: as3">
public class DGItemRenderer extends DataGridItemRenderer
{
		public function DGItemRenderer()
		{
			super();
		}

		/**
		 * Property is execute on each column in each row
		 *
		 * @param PersonVo|Object value Object using in item renderer
		 */
		override public function set data(value:Object):void
		{
			if (value is PersonVo &amp;&amp; value)
			{
				//In this property i check if PersonVo is special
				//When isSpecial == true i bold cell in this column
				var boldValue:String = (PersonVo)(value).isSpecial == true ? &quot;bold&quot; : &quot;normal&quot;;
				setStyle(&quot;fontWeight&quot;, boldValue);
			}
			super.data = value;
		}
}
</pre>
<p class="text">
Wynikiem tych zabiegów są oczekiwane pogrubione zawartości wierszy w DataGridzie. <a href="http://bloghellix.pl/project-file/flash/DgBoldColumns/srcview/index.html">link</a>
</p>
<div id="flashDg" style="padding: 0 10px;"></div>
]]></content:encoded>
			<wfw:commentRss>http://bloghellix.pl/?feed=rss2&amp;p=615</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dlaczego używam eclipse w wersji 3.3</title>
		<link>http://bloghellix.pl/?p=544</link>
		<comments>http://bloghellix.pl/?p=544#comments</comments>
		<pubDate>Mon, 22 Mar 2010 17:07:38 +0000</pubDate>
		<dc:creator>hellix</dc:creator>
				<category><![CDATA[Moje wpisy]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[Praca]]></category>

		<guid isPermaLink="false">http://bloghellix.pl/?p=544</guid>
		<description><![CDATA[Środowisko eclipse wykorzystuję do programowania w języku php &#8211; Zend Framework. Od ponad pół roku jest to niezmiennie leciwa już wersja 3.3. Dlaczego nie zmieniłem jej na nowszą np. 3.5? Skłoniły mnie do tego zaledwie dwie jakże istotne dla mnie kwestie. Zastrzegam jednak, że być może to co tutaj zaprezentuję wynika z mojej niewiedzy związanej [...]]]></description>
			<content:encoded><![CDATA[<p class="text">
Środowisko eclipse wykorzystuję do programowania w języku php &#8211; Zend Framework. Od ponad pół roku jest to niezmiennie leciwa już wersja 3.3. Dlaczego nie zmieniłem jej na nowszą np. 3.5? Skłoniły mnie do tego zaledwie dwie jakże istotne dla mnie kwestie. Zastrzegam jednak, że być może to co tutaj zaprezentuję wynika z mojej niewiedzy związanej z eclipse, liczę więc na ewentualny &#8222;odzew&#8221;. :)
</p>
<p class="text">
Rozważmy następujące kody dwóch przykładowych klas:
</p>
<pre class="brush: php">
class SampleClass
{
	public function __construct()
	{

	}

	/**
	 * Przykladowa funkcja
	 *
	 * @param String $str Obiekt string
	 * @param array $arr Obiekt array
	 * @param String|array $obj Obiekt mieszany
	 *
	 * @return array
	 */
	public function myFunction($str, $arr, $obj)
	{
		return array('str' =&gt; $str, 'arr' =&gt; $arr, 'obj' =&gt; $obj);
	}
}

class MyClass
{
	/**
	 * Przykladowa klasa
	 *
	 * @var SampleClass
	 */
	private $_sampleClass;

	public function __construct()
	{
		$this-&gt;_sampleClass = new SampleClass();
		$this-&gt;_sampleClass-&gt;myFunction('str', array('arr' =&gt; 'dd'), 'str2');
	}
}
</pre>
<p class="text">
W zasadzie nic nadzwyczajnego. W jednej klasie przykładowa metoda, w drugiej natomiast utworzenie instancji klasy oraz wywołanie metody &#8222;myFunction&#8221;. Wszystko opatrzone w odpowiednie komentarze.
</p>
<p class="specText">
Dwa powody dla których nie zrezygnuję ze starego poczciwego eclipse 3.3:
</p>
<p class="specText">
Powód I:
</p>
<p class="text">
       Podczas korzystania z utworzonej wcześniej instancji klasy wywołanie metody sprowadza się do wpisania strzałki tuż po nazwie obiektu. Taka operacja skutkuję piękną chmurką prezentującą listę metod czy też zmiennych danej klasy.
</p>
<p class="text">
Eclipse w wersji 3.5 &#8222;wypluwa&#8221; owe podpowiedzi niezwykle wolno Od momentu pojawienia się strzałki do chwili &#8222;wyplucia&#8221; listy metod i zmiennych mija katastrofalnie dużo czasu!!!! Osobiście piszę bardzo szybko na klawiaturze przez co jakiekolwiek opóźnienie w pojawieniu się podpowiedzi jest niezwykle irytujące. Żadnych efektów poprawiających powyższy stan rzeczy nie przynosi ustawienie opóźnienia autoaktywacji na 1 czy też 0 milisekund w opcjach znajdujących się: Window->Preferences->PHP->Editor-CodeAssist.
</p>
<p class="text">
Całkowicie inaczej wygląda to w Eclipse 3.3. Tam niemal każde &#8222;strzałkowe&#8221; odwołanie powoduję natychmiastową podpowiedz.
</p>
<p class="specText">
Powód II:
</p>
<p class="text">
Poniżej przedstawiam szereg screenów ukazujących proces wywołania metody &#8222;myFunction&#8221; z klasy &#8222;SampleClass&#8221; w eclipse 3.3 oraz 3.5.
</p>
<div style="float: left; position: relative;">
<div style="float: left; padding: 10px 65px;">
<p class="specText">
Eclipse 3.5:
</p>
<p><a class="shutterset_" href='http://bloghellix.pl/wp-content/gallery/wpis_21_03_2010/wywolanie_metody_3_5.jpg' title='Wywołanie metody eclipse 3.5'><img src='http://bloghellix.pl/wp-content/gallery/wpis_21_03_2010/thumbs/thumbs_wywolanie_metody_3_5.jpg' alt='wywolanie_metody_3_5' class='ngg-singlepic ngg-center' /></a></p>
</div>
<div style="float: left; padding: 10px 65px;">
<p class="specText">
Eclipse 3.3:
</p>
<p><a class="shutterset_" href='http://bloghellix.pl/wp-content/gallery/wpis_21_03_2010/wywolanie_metody_3_3.jpg' title='Wywołanie metody eclipse 3.3'><img src='http://bloghellix.pl/wp-content/gallery/wpis_21_03_2010/thumbs/thumbs_wywolanie_metody_3_3.jpg' alt='wywolanie_metody_3_3' class='ngg-singlepic ngg-center' /></a></p>
</div>
<div style="float: left; padding: 10px 65px; margin-bottom: 20px;">
<p><a class="shutterset_" href='http://bloghellix.pl/wp-content/gallery/wpis_21_03_2010/uzupelnienie_arg_3_5.jpg' title='Uzupełnienie wartości argumentów eclipse 3.5'><img src='http://bloghellix.pl/wp-content/gallery/wpis_21_03_2010/thumbs/thumbs_uzupelnienie_arg_3_5.jpg' alt='uzupelnienie_arg_3_5' class='ngg-singlepic ngg-center' /></a></p>
</div>
<div style="float: left; padding: 10px 65px; margin-bottom: 20px;">
<p><a class="shutterset_" href='http://bloghellix.pl/wp-content/gallery/wpis_21_03_2010/uzupelnienie_arg_3_3.jpg' title='Uzupełnienie wartości argumentów eclipse 3.3'><img src='http://bloghellix.pl/wp-content/gallery/wpis_21_03_2010/thumbs/thumbs_uzupelnienie_arg_3_3.jpg' alt='uzupelnienie_arg_3_3' class='ngg-singlepic ngg-center' /></a></p>
</div>
</div>
<p class="text">
Faktem jest, że język php nie jest językiem silnie typowanym, więc teoretycznie każda przekazywana wartość do metody &#8222;myFunction&#8221; może być dowolnego typu. O ile w obu omawianych przeze mnie wersjach eclipse, chmurki zawierające opis metody i parametrów wyglądają identycznie o tyle już sam proces uzupełniania wartościami argumentów funkcji jest nieco inny. Eclipse 3.3 także na tym etapie sugeruję jakiego typu powinny być wartości parametrów przekazywane do metody. Niestety zabrakło tego w nowszym wydaniu i od dawna nic się w tej kwestii nie zmienia.
</p>
<p class="text">
Być może eclipse 3.5 gdzieś w swoim gąszczu ustawień konfiguracyjnych zawiera opcję, które pozwalają zrównać tą wersję w wygodzie użytkowania do eclipse 3.3 niestety jak dotąd nie było mi dane ich odnaleźć. Ubolewam nad tym faktem ponieważ niektóre najnowsze wersję wykorzystywanych przeze mnie eclipsowych pluginów odmawiają już współpracy z wersją 3.3.
</p>
<p class="text">
Szybkość oraz wygoda jaką ze sobą niosą powyższe opcję sprawia, że wciąż kurczowo trzymam się eclipse 3.3.</p>
]]></content:encoded>
			<wfw:commentRss>http://bloghellix.pl/?feed=rss2&amp;p=544</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Błąd podczas uruchamiania Eclipse &quot;JVM terminated. Exit code=13&quot;</title>
		<link>http://bloghellix.pl/?p=537</link>
		<comments>http://bloghellix.pl/?p=537#comments</comments>
		<pubDate>Sat, 13 Mar 2010 21:37:19 +0000</pubDate>
		<dc:creator>hellix</dc:creator>
				<category><![CDATA[Moje wpisy]]></category>
		<category><![CDATA[Errors]]></category>

		<guid isPermaLink="false">http://bloghellix.pl/?p=537</guid>
		<description><![CDATA[Ściągnąłem Eclipse w wersji 3.3 następnie rozpakowałem archiwum do folderu o nazwie &#8222;eclipse 3.3&#8243;. Podczas pierwszego uruchomienia otrzymałem dość interesujące &#8222;powitanie&#8221; &#8211; widoczne na screen-ie poniżej. Okazuję się, że problem stanowiła tutaj nazwa folderu w którym umieściłem eclipse &#8211; jej zmiana przyniosła porządany efekt. Trywialne, ale dłuższą chwilę zajęło mi dotarcie do rozwiązania. :)]]></description>
			<content:encoded><![CDATA[<p class="text">
Ściągnąłem Eclipse w wersji 3.3 następnie rozpakowałem archiwum do folderu o nazwie &#8222;eclipse 3.3&#8243;. Podczas pierwszego uruchomienia otrzymałem dość interesujące &#8222;powitanie&#8221; &#8211; widoczne na screen-ie poniżej.
</p>
<p><img src='http://bloghellix.pl/wp-content/gallery/rozne/eclipse_error.jpg' alt='JVM terminated. Exit code=13' class='ngg-singlepic ngg-center' /></p>
<p class="text">
Okazuję się, że problem stanowiła tutaj nazwa folderu w którym umieściłem eclipse &#8211; jej zmiana przyniosła porządany efekt. Trywialne, ale dłuższą chwilę zajęło mi dotarcie do rozwiązania. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://bloghellix.pl/?feed=rss2&amp;p=537</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Generowanie pliku csv na podstawie tabeli w bazie danych</title>
		<link>http://bloghellix.pl/?p=528</link>
		<comments>http://bloghellix.pl/?p=528#comments</comments>
		<pubDate>Wed, 10 Mar 2010 22:07:34 +0000</pubDate>
		<dc:creator>hellix</dc:creator>
				<category><![CDATA[Moje wpisy]]></category>
		<category><![CDATA[SQL ;)]]></category>

		<guid isPermaLink="false">http://bloghellix.pl/?p=528</guid>
		<description><![CDATA[Format CSV jest prostym sposobem przechowywania danych w pliku tekstowym. Polega na zapisie kolejnych wartości wierszy pobranych z arkusza kalkulacyjnego bądź z bazy danych odzielając je określonym separatorem (najczęściej jest to przecinek bądź średnik). Wygenerowany plik CSV często zawiera w pierwszym wierszu nazwy kolumn. MySql dzięki funkcji &#8222;Concat_Ws&#8221; pomaga w trywialny sposób zwrócić dane sformatowane [...]]]></description>
			<content:encoded><![CDATA[<p class="text">
Format CSV jest prostym sposobem przechowywania danych w pliku tekstowym. Polega na zapisie kolejnych wartości wierszy pobranych z arkusza kalkulacyjnego bądź z bazy danych odzielając je określonym separatorem (najczęściej jest to przecinek bądź średnik). Wygenerowany plik CSV często zawiera w pierwszym wierszu nazwy kolumn. MySql dzięki funkcji &#8222;Concat_Ws&#8221; pomaga w trywialny sposób zwrócić dane sformatowane dane do postaci pliku csv.
</p>
<p class="specText">
Utworzyłem tabelę &#8222;person&#8221; której strukturę wraz z przykładowymi danymi prezentuję poniżej:
</p>
<p><img src='http://bloghellix.pl/wp-content/gallery/wpis_10-03-2010/tabelprzyklad.jpg' alt='Tabela do wygenerowania pliku csv' class='ngg-singlepic ngg-center' /></p>
<p class="text">
Oczekiwana postać pliku to &#8211; linia pierwsza reprezentująca nazwy kolumn, kolejne linie zawierające pobrane dane jako separator zostanie użytyh przecinek.
</p>
<p class="specText">
Zapytanie formatujące dane:
</p>
<pre class="brush: sql">
SELECT CONCAT_WS(',', name, surname, age) AS 'Imię, Nazwisko, Wiek' FROM person
</pre>
<p class="text">
Funkcja &#8222;Concat_Ws&#8221; jako jeden z argumentów przyjmuje separator którym oddzieli zwracane wyniki. Nazwa kolumny w zapytaniu jest odpowiednikiem pierwszego wiersza<br />
z pliku csv.
</p>
<p class="specText">
Wynik zapytania:
</p>
<p><img src='http://bloghellix.pl/wp-content/gallery/wpis_10-03-2010/wynikzapytania.jpg' alt='Wynik zapytania' class='ngg-singlepic ngg-center' /></p>
<p class="text">
Wewnątrz skryptu tworzącego csv wystarczy już tylko przeiterować po otrzymanych wynikach zapisując je do oczekiwanego pliku. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://bloghellix.pl/?feed=rss2&amp;p=528</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Porównywanie dat w ActionScript</title>
		<link>http://bloghellix.pl/?p=503</link>
		<comments>http://bloghellix.pl/?p=503#comments</comments>
		<pubDate>Sun, 28 Feb 2010 17:09:06 +0000</pubDate>
		<dc:creator>hellix</dc:creator>
				<category><![CDATA[Moje wpisy]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://bloghellix.pl/?p=503</guid>
		<description><![CDATA[Implementując pewną funkcjonalność stanąłem przed prostym problemem porównania dwóch dat. W ActionScript do tego celu służy klasa ObjectUtil, a w niej metoda compareDate. public static function dateCompare(a:Date, b:Date):int { if (a == null &#38;&#38; b == null) return 0; if (a == null) return 1; if (b == null) return -1; var na:Number = a.getTime(); [...]]]></description>
			<content:encoded><![CDATA[<p class="text">
Implementując pewną funkcjonalność stanąłem przed prostym problemem porównania dwóch dat. W ActionScript do tego celu służy klasa ObjectUtil, <br />a w niej metoda compareDate.
</p>
<pre class="brush: as3">
public static function dateCompare(a:Date, b:Date):int
{
				if (a == null &amp;&amp; b == null)
					return 0;

				if (a == null)
					return 1;

				if (b == null)
					return -1;

				var na:Number = a.getTime();
				var nb:Number = b.getTime();

				if (na &lt; nb)
					return -1;

				if (na &gt; nb)
					return 1;

				return 0;
}
</pre>
<p class="text">
Jam można zauwazyć wewnątrz metody daty porównywane są na podstawie zwróconej ilości milisekund od roku 1970 metodą getTime. Potrzebowałem jednak czegoś bardziej specyficznego, mianowicie chciałem porównać daty pomijając przy tym czas (godziny, minuty itd.). Utworzyłem w tym celu nową metodę w której trzeci parametr określa taką możliwość.
</p>
<pre class="brush: as3">
public function compareDate(a:Date, b:Date, compareWithTime:Boolean=false):int
{
				var aa:Date;
				var bb:Date;

				if (a == null &amp;&amp; b == null)
				{
						return 0;
				}

				if (a == null)
				{
						return 1;
				}

				if (b == null)
				{
						return -1;
				}

				if (compareWithTime)
				{
						return ObjectUtil.dateCompare(a, b);
				}
				else
				{
						//porownanie bez czasu
						//tworze nowe obiekty dat wylaczajac przy tym czas
						aa = new Date(a.fullYear, a.getMonth(), a.getDate());
						bb = new Date(b.fullYear, b.getMonth(), b.getDate());

						return ObjectUtil.dateCompare(aa, bb);
				}
}
</pre>
<p class="text">
Przeprowadziłem test dla dwóch dat i otrzymałem następujące wyniki:
</p>
<pre class="brush: as3">
var dOne:Date = new Date(2010, 2, 20, 12, 12, 12);
var dTwo:Date = new Date(2010, 2, 20, 12, 11, 12);

var resultOne:int = compareDate(dOne, dTwo, false);
var resultTwo:int = compareDate(dOne, dTwo, true);

//resultOne = 0; dOne = dTwo
//resultTwo = 1; dOne &gt; dTwo
</pre>
]]></content:encoded>
			<wfw:commentRss>http://bloghellix.pl/?feed=rss2&amp;p=503</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
