<?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>Nexik</title>
	<atom:link href="http://nexik.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://nexik.net</link>
	<description>Tomasz Ślązok</description>
	<lastBuildDate>Sun, 06 Jun 2010 18:43:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Dependency Injection</title>
		<link>http://nexik.net/dependency-injection/</link>
		<comments>http://nexik.net/dependency-injection/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 15:05:03 +0000</pubDate>
		<dc:creator>nexik</dc:creator>
				<category><![CDATA[Języki]]></category>
		<category><![CDATA[KohanaPHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Środowiska]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[Dependency Injection]]></category>
		<category><![CDATA[Refactoring]]></category>

		<guid isPermaLink="false">http://nexik.net/?p=1118</guid>
		<description><![CDATA[Dependency Injection czyli wstrzykiwanie zależności to ostatnio bardzo modna technika tworzenia elastycznego kodu. <br/>Niektórzy marudzą, że jest to tylko chwytliwa nazwa dla prostej metody poprawiającej jakość kodu. Jakby nie było wstrzykiwanie jest warte dogłębnego poznania.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/06/dependency_injection.jpg"><img class="size-large wp-image-1119    aligncenter" title="dependency_injection" src="http://nexik.net/wp-content/uploads/2010/06/dependency_injection-500x640.jpg" alt="" width="500" height="640" /><br />
</a>Źródło: <a href="http://www.flickr.com/photos/urban-spaceman/">Urban-Spaceman</a></p>
<p style="text-align: left;">Dependency Injection czyli wstrzykiwanie zależności to ostatnio bardzo modna technika tworzenia elastycznego kodu. Niektórzy marudzą, że jest to tylko chwytliwa nazwa dla prostej metody poprawiającej jakość kodu. Jakby nie było wstrzykiwanie jest warte dogłębnego poznania.</p>
<p style="text-align: left;">Ostatnio pisze dużo kodu pobierającego dane z bazy. Osoby piszące metody wykonujące kod SQL mają dwa podejścia. Pierwszym jest tworzenie dużej liczby parametrów.</p>
<p style="text-align: left;">
<pre class="brush: php">
public function get_products_by_category($category_id, $order_by, $order_desc, $limit, $offset);
</pre>
</p>
<p style="text-align: left;">Proste, jednak trzeba wpisywać za każdym razem wszystkie parametry. Oczywiście można to zapisać w postaci domyślnych wartości:</p>
<p style="text-align: left;">
<pre class="brush: php">
public function get_products_by_category($category_id, $order_by =&#039;price&#039;, $order_desc=&#039;DESC&#039;, $limit=10, $offset=0);
</pre>
</p>
<p style="text-align: left;">Niestety jeżeli chcemy pobrać kolejnych 10 produktów musimy podać wszystkie parametry, pomimo że poprzednie pozostają domyślne. Rozwiązaniem jest drugie podejście czyli upakowanie wszystkich <strong>dodatkowych</strong> parametrów w jeden.</p>
<p style="text-align: left;">
<pre class="brush: php">
public function get_products_by_category($category_id, $options=null);
</pre>
</p>
<p style="text-align: left;">Ustawiłem zmienną $options domyślnie na null ponieważ nie zawsze chcemy coś zmieniać, czasami defaultowe zapytanie nam wystarcza. Do działania potrzebujemy wewnątrz kilka dodatkowych linii kodu. oto przykład z wersją zmiennej $options jako tablica:</p>
<p style="text-align: left;">
<pre class="brush: php">
public function get_products_by_category($category_id, $options=array())
{
  if(array_key_exists(&#039;limit&#039;, $options))
    $limit = $options[&#039;limit&#039;];
  else
    $limit = 10;

  // [...]

  $this-&gt;db
    -&gt;from(&#039;products&#039;)
    -&gt;where(&#039;category_id&#039;, $category_id)
    -&gt;orderby($orderby, $direction)
    -&gt;limit($limit, $offset);
  return $this-&gt;db-&gt;get();
}
</pre>
</p>
<p style="text-align: left;">Niestety przy wielu takich metodach duplikuje się kod :( Tutaj przychodzi z pomocą Dependency Injection. Oto metoda która ustala limity dla zapytania a pobiera 2 parametry refernecje do obiektu Database oraz tablice opcji do ustawienia.</p>
<p style="text-align: left;">
<pre class="brush: php">
public function get_products_by_category($category_id, $options=array())
{
  $this-&gt;set_limit($this-&gt;db, $options);

  $this-&gt;db
    -&gt;from(&#039;products&#039;)
    -&gt;where(&#039;category_id&#039;, $category_id);

  return $this-&gt;db-&gt;get();
}

protected function set_limit($db, $options)
{
    if(array_key_exists(&#039;limit&#039;, $options))
        $limit = $options[&#039;limit&#039;];
    else
        $limit = $this-&gt;default_limit;

    if(array_key_exists(&#039;offset&#039;, $options))
        $offset = $options[&#039;offset&#039;];
    else
        $offset = $this-&gt;default_offset;

    $db-&gt;limit($limit, $offset);
}
</pre>
</p>
<p>Przy większej liczbie metod do ustalania parametrów można na końcu każdej z nich dodać return $db aby umożliwić tzw. chaining dla metod. Jak pisałem DI nie jest niczym odkrywczym. Nazwanie tej techniki chwytliwą nazwą Dependency Injection powoduje że programiści o niej dłużej pamiętają, tworzać tym samym lepszy kod.</p>
<p>P.S. to jest wstęp do DI. Temat jest naprawdę szeroki, warto się nim zainteresować. Daje duże możliwości dzięki takim mechanizmom (już trochę bardziej zaawansowanymi) jak DI Container.</p>
]]></content:encoded>
			<wfw:commentRss>http://nexik.net/dependency-injection/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Jeszcze wydajniejsze witryny internetowe</title>
		<link>http://nexik.net/jeszcze-wydajniejsze-witryny-internetowe/</link>
		<comments>http://nexik.net/jeszcze-wydajniejsze-witryny-internetowe/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 20:08:11 +0000</pubDate>
		<dc:creator>nexik</dc:creator>
				<category><![CDATA[Książki]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Java Script]]></category>
		<category><![CDATA[Optymalizacja]]></category>

		<guid isPermaLink="false">http://nexik.net/?p=1111</guid>
		<description><![CDATA[
Właśnie skończyłem czytać książkę &#8220;Jeszcze wydajniejsze witryny internetowe Przyspieszanie działania serwisów WWW&#8221; autorstwa Steve Souders i mam mieszane uczucia. Książka traktuje raczej o detalach pewnych technikach optymalizacji witryn internetowych w specyficznych przypadkach niż o optymalizacji jako całościowa strategia budowania aplikacji www.

Książka w głównej mierze dotyczy pisania wydajnego kodu Java Script oraz umieszczania go w odpowiedni [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align:center;"><img src="http://nexik.net/wp-content/uploads/2010/06/jewywi.jpg" alt="Jeszcze wydajniejsze witryny internetowe okładka" /></p>
<p>Właśnie skończyłem czytać książkę &#8220;Jeszcze wydajniejsze witryny internetowe Przyspieszanie działania serwisów WWW&#8221; autorstwa Steve Souders i mam mieszane uczucia. Książka traktuje raczej o detalach pewnych technikach optymalizacji witryn internetowych w specyficznych przypadkach niż o optymalizacji jako całościowa strategia budowania aplikacji www.</p>
<p><span id="more-1111"></span></p>
<p>Książka w głównej mierze dotyczy pisania wydajnego kodu Java Script oraz umieszczania go w odpowiedni sposób aby nie spowalniał ładowania się witryny. Zamiast pokazać najczęściej wykorzystywaną technikę ładowania bibliotek JS pokazane są wszelkie możliwe rozwiązania. Co gorsze wszystkie te rozwiązania są analizowane dogłębnie pokazując ich &#8220;zalety&#8221; powodując że czytelnik pod koniec do końca nie jest pewny które techniki są dobre a które gorsze :(</p>
<p>Autor ma ogromną wiedzę na temat optymalizacji kodu Java Script i sam tylko rozdział &#8220;Pisanie wydajnego kodu JavaScript&#8221; jest wart kupienia książki. Znajdziecie tu nie tylko ogólne triki jak przyszpieszyć kod java script ale także przykłady jakie funkcje JS są wydajniejsze w jakich przeglądarkach. Szczególnie warto poczytać o case&#8217;ach dotyczących przeglądarek IE.</p>
<p>Moją ulubioną częścią ksiązki są rozdziały na temat grafiki &#8211; wreszcie jakieś kompletne źródło wiedzy jak optmalizowac grafikę dla internetu &#8211; oraz optymalizacji stylów CSS. Miałem kilkuminutowy wielki LOL jak przeczytałem że przeglądarki interpretują selektory CSS nie od lewej do prawej tylko od prawej do lewej. Tak więc selektor <strong>#lista > li</strong> jest wolniejszym selektorem niż <strong>.li-listy</strong>. W książce autor proponuje aby twórcy kodu CSS nie uzywali selektorów dla tagów, dzieci czy potomków, a zamiast tego tworzy specjalne idiki i klasy.</p>
<p>Na końcu jest dostępna lista ciekawych programów pomocnych przy optymalizacji stron www. Książka bardzo dobra jednak jest kierowana do osób które mają już doświadczenie w temacie. Dla noobów zdecydowanie odradzam.</p>
]]></content:encoded>
			<wfw:commentRss>http://nexik.net/jeszcze-wydajniejsze-witryny-internetowe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jak powinna wyglądać nauka w szkołach?</title>
		<link>http://nexik.net/jak-powinna-wygladac-nauka-w-szkolach/</link>
		<comments>http://nexik.net/jak-powinna-wygladac-nauka-w-szkolach/#comments</comments>
		<pubDate>Sun, 23 May 2010 21:29:11 +0000</pubDate>
		<dc:creator>nexik</dc:creator>
				<category><![CDATA[HydePark]]></category>
		<category><![CDATA[Nauka]]></category>
		<category><![CDATA[Carl Sagan]]></category>
		<category><![CDATA[Muzyka]]></category>
		<category><![CDATA[Richard Dawkins]]></category>
		<category><![CDATA[Science]]></category>
		<category><![CDATA[SymphonyOfScience]]></category>

		<guid isPermaLink="false">http://nexik.net/?p=1096</guid>
		<description><![CDATA[2 przykłady jak poważną wiedzę można przekazać w dość przyjaznej formie dla młodego pokolenia]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="size-full wp-image-1097  aligncenter" title="science" src="http://nexik.net/wp-content/uploads/2010/05/science.jpg" alt="" width="500" height="473" /><br />
<strong>Źródło:</strong> <a href="http://www.flickr.com/photos/pesotum/">D.B. Blass</a></p>
<p>Narzeka się na młodzież, że się nie uczy i w ogóle jest bee. Co jednak nauczyciele robią by zaszczepić bakcyla do szeroko pojętej nauki? Nic!!! Dzieci uczy się bezmyślnego używania wzorów zamiast pokazać piękno natury i jej praw. </p>
<p>Można inaczej? Oczywiście, że można :) Oto 2 przykłady jak poważną wiedzę można przekazać w dość przyjaznej formie dla młodego pokolenia:</p>
<p><object width="500" height="306"><param name="movie" value="http://www.youtube.com/v/9Cd36WJ79z4&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/9Cd36WJ79z4&#038;fs=1" type="application/x-shockwave-flash" width="500" height="306" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><object width="500" height="306"><param name="movie" value="http://www.youtube.com/v/hOLAGYmUQV0&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/hOLAGYmUQV0&#038;fs=1" type="application/x-shockwave-flash" width="500" height="306" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Więcej na <a href="http://www.symphonyofscience.com/">http://www.symphonyofscience.com/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://nexik.net/jak-powinna-wygladac-nauka-w-szkolach/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS #1 Border-Radius oraz Box Shadow</title>
		<link>http://nexik.net/css-1-border-radius-box-shadow/</link>
		<comments>http://nexik.net/css-1-border-radius-box-shadow/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 21:22:55 +0000</pubDate>
		<dc:creator>nexik</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[border-radius]]></category>
		<category><![CDATA[box-shadow]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[semantyczny kod]]></category>

		<guid isPermaLink="false">http://nexik.net/?p=1071</guid>
		<description><![CDATA[W ostatnim projekcie grafik wymyślił sobie główną nawigację za pomocą "buttonów" z zaokrąglonymi rogami oraz dodatkowym efektem w postaci cienia dla buttona. Ponieważ grafik jest jednocześnie klientem postanowiłem nie iść na zbyt duży kompromis i nie pisać dziwnego kodu i postarać się stworzyć w miarę semantyczny kod HTML.]]></description>
			<content:encoded><![CDATA[<p style="text-align:center"><img src="http://nexik.net/wp-content/uploads/2010/04/27305092_daf1152350.jpg" alt="" title="Shadow" width="333" height="500" class="aligncenter size-full wp-image-1082" /><br/>Zdjęcie: <a href="http://www.flickr.com/photos/gaspi/27305092/">Gaspi</a> Licencja: <a href="http://creativecommons.org/licenses/by-nc-nd/2.0/deed.en">CC</a></p>
<p>W ostatnim projekcie grafik wymyślił sobie główną nawigację za pomocą &#8220;buttonów&#8221; z zaokrąglonymi rogami oraz dodatkowym efektem w postaci cienia dla buttona. Ponieważ grafik jest jednocześnie klientem postanowiłem nie iść na zbyt duży kompromis i nie pisać dziwnego kodu i postarać się stworzyć w miarę semantyczny kod HTML.</p>
<p>Idea jest prosta, menu jest pewnego rodzaju nieuporządkowaną listą <strong>ul</strong> w której elementy <strong>li</strong> posiadają element linku <strong>a</strong>. Kod powinien wyglądać następująco:</p>
<pre class="brush: html">
&lt;nav&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=#&gt;Anchor Text&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=#&gt;Anchor Text&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
</pre>
<p>W pierwszej iteracji grafik chciał bym zamienił ten kod na:</p>
<pre class="brush: html">
&lt;nav&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=#&gt;
      &lt;span class=&quot;before_a&quot;&gt;&lt;/span&gt;Anchor Text&lt;span class=&quot;after_a&quot;&gt;&lt;/span&gt;
    &lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=#&gt;
      &lt;span class=&quot;before_a&quot;&gt;&lt;/span&gt;Anchor Text&lt;span class=&quot;after_a&quot;&gt;&lt;/span&gt;
    &lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
</pre>
<p>Plan rozwiązuje problem wizualny, ponieważ dodatkowe klasy mają dwa różne background&#8217;y symulując zaokrąglone rogi oraz cień. Niestety takie rozwiązanie jest błędne ponieważ wprowadza ona warstwę prezentacji CSS do struktury dokumentu HTML. </p>
<p>Zaproponowałem wariant 1 z nowymi funkcjami CSS dostępnymi w współczesnych przeglądarkach. Na drugą iterację poszedł do dzieła border-radius oraz box-shadow, jednak IE nie wspiera żadnego z tych genialnych udoskonaleń z CSS3 :( Po długich przemyśleniach z klientem doszedłem do kompromisu:</p>
<ul>
<li>Rogi w buttonach są zaokrąglone minimalnie &#8211; 1px</li>
<li>Zmiana buttona z zaokrąglonymi rogami na zwykły prostokąt pod IE jest akceptowana</li>
<li>Shadow do buttona musi być w wszystkich przeglądarkach.</li>
</ul>
<p>Ten kompromis pozwolił mi na stworzenie kodu bez mieszania struktury dokumentu z warstwą prezentacji. Następujący kod rozwiązuje problem:</p>
<pre class="brush: css">
ul.menu &gt; li {
    background: #292929;
    border-radius: 4px;
    -moz-border-radius: 4px;
    -webkit-border-radius: 4px;
    display:block;
    float: left;
    height: 37px;
}

ul.menu &gt; li &gt; a {
    background: #000;
    border-radius: 4px;
    -moz-border-radius: 4px;
    -webkit-border-radius: 4px;
    display:block;
    height: 16px;
    margin: 0 1px 0 0;
    padding: 10px;
}
</pre>
<p>Stworzyłem dwa elementy o podobnych rozmiarach. Pierwszy <strong>li</strong> ma kolor tła #292929 i jest o 1px wyższy od elementu <strong>a</strong>. Dodatkowo element a ma margines 1px z prawej. Dzięki takiemu &#8220;trickowi&#8221; element będzie zakryty elementem a oprócz 1px z prawej oraz 1px z dołu. </p>
<p>Element <strong>li</strong> wizualnie robi za shadow dla elementu <strong>a</strong>. Wynik prac wygląda następująco(u góry wersja w współczesnych przeglądarkach, poniżej w IE):</p>
<p style="text-align:center"><img src="http://nexik.net/wp-content/uploads/2010/04/box-shadow.png" alt="" title="box-shadow" width="479" height="141" class="aligncenter size-full wp-image-1078" /></p>
<p>Shadow minimalny, można wogle go przegapić tak samo jak same zaokrąglenie, ale grafik tak chciał ;p Niestety <strong>box-shadow</strong> będzie musiał poczekać zanim uda mi się jakiegoś klienta na niego namówić :(</p>
]]></content:encoded>
			<wfw:commentRss>http://nexik.net/css-1-border-radius-box-shadow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>10 Sposobów na PHPUnit z KohanaPHP</title>
		<link>http://nexik.net/10-sposobow-na-phpunit-z-kohanaphp/</link>
		<comments>http://nexik.net/10-sposobow-na-phpunit-z-kohanaphp/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 21:34:00 +0000</pubDate>
		<dc:creator>nexik</dc:creator>
				<category><![CDATA[KohanaPHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHPUnit]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[DRY]]></category>
		<category><![CDATA[KohanaPHP v3]]></category>
		<category><![CDATA[Netbeans]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://nexik.net/?p=984</guid>
		<description><![CDATA[Test Drive Development to bardzo potężne narzędzie szczególnie w dużych projektach, gdzie dodanie nowej kolumny w tabeli zmienia całkowicie logikę aplikacji. Artykuł pokazuje podstawy TDD w PHP przy użyciu PHPUnit oraz frameworka Kohana w wersji 3.x]]></description>
			<content:encoded><![CDATA[<p>PHP zawsze był językiem który w oczach programistów innych języków był i jest traktowany jako zabawka niż poważne narzędzie do tworzenia aplikacji rozmiarów enterprise. PHP na początku nie był najlepszym językiem to prawda, ale od wersji 5.0 uzyskał w miarę sensowne OOP.</p>
<p>Od piątej wersji aplikacje w PHP wreszcie mogły być pisane &#8220;profesjonalnie&#8221;. Niestety etykietka kiepskiego języka pozostała z powodu jego użytkowników, którzy piszą kod według starych, złych nawyków i kod ten później sprzedają jako PHP w wersji 5.x :(</p>
<p>Aby zmienić to programiści muszą zmienić swoje paradygmaty na programowanie zwinne &#8211; <strong>Agile</strong> &#8211; oraz programowanie zorientowane na testy &#8211; <strong>TDD</strong>. W tym poście spróbuje pokazać kilka sposób jak wdrożyć taki styl pisania w projektach opartych na frameworku Kohana w wersji 3.0</p>
<h2>1. Instalacja PHPUnit</h2>
<p>Aby zainstalować PHPUnit wystarczą  dwa polecenia w konsoli:</p>
<pre class="brush: c">
pear channel-discover pear.phpunit.de
pear install phpunit/PHPUnit
</pre>
<p>Oczywiście żeby zadziałały musimy mieć w systemie zainstalowanego interpreter <strong>PHP</strong> oraz system zarządzania bibliotekami do PHP &#8211; <strong>PEAR</strong>. Jeżeli nie maq tego w naszym systemie można skorzystać z gotowego rozwiązania jakim jest pakiet <a href="http://www.apachefriends.org/en/xampp.html">XAMPP</a></p>
<h2>2. Konfiguracja PHPUnit w Netbeans</h2>
<p><strong>Netbeans</strong> ma wbudowaną współpracę z PHPUnit. Jednak aby się cieszyć współpracą PHPUnit z Netbeans musimy skonfigurować parę opcji aby Netbeans wiedziało gdzie ma szukać PHPUnit.</p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/04/netbeans-options.jpg"><img class="size-large wp-image-989  aligncenter" title="netbeans options" src="http://nexik.net/wp-content/uploads/2010/04/netbeans-options-500x427.jpg" alt="" width="500" height="427" /></a></p>
<p>Pierwszym krokiem jest podanie ścieżki do interpretera PHP. Wybieramy <strong>Tools -&gt; Options</strong> i poajwia nam się okienko Options które jest pokazane na obrazku powyżej. Należy zaznaczyć zakładkę z logo PHP i  zakładce General w polu <strong>PHP 5 Interpreter</strong> wpisujemy ścieżkę do pliku <strong>php.exe</strong></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/04/netbeans-phpunit-script.jpg"><img class="size-large wp-image-993  aligncenter" title="netbeans-phpunit-script" src="http://nexik.net/wp-content/uploads/2010/04/netbeans-phpunit-script-500x427.jpg" alt="" width="500" height="427" /></a></p>
<p style="text-align: left;">W drugim kroku podobnie jak wcześniej podajemy ścieżke do pliku, jednym tym razem do pliku <strong>phpunit.bat</strong>. Aby to zrobić zmieniamy zakładkę na <strong>Unit Testing </strong>i wpisujemy ścieżkę do pliku w polu <strong>PHPUnit script.</strong></p>
<p style="text-align: left;">W trzecim i ostatnim kroku wracamy do zakładki General i klikamy w przycisk <strong>Add Folder</strong>. Pojawi nam się przeglądarka katalogów. Znajdujemy katalog z biblioteką PHPUnit i go dodajemy do listy <strong>Global Include Path</strong>.<strong> </strong></p>
<p style="text-align: left;">Netbeans jest gotowy do pracy z podejściem <strong>TDD &#8211; Test Driven Development</strong>.</p>
<h2>3. Połączenie PHPUnit z KohanaPHP v3</h2>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/04/netbeans-kohana-project.jpg"><img class="size-large wp-image-994  aligncenter" title="netbeans-kohana-project" src="http://nexik.net/wp-content/uploads/2010/04/netbeans-kohana-project-500x427.jpg" alt="" width="500" height="427" /></a></p>
<p style="text-align: left;">Obrazek prezentuje typową strukturę projektu <strong>Kohana v3</strong>. Jedyne co dodałem to katalog <strong>tests/</strong> w katalogu <strong>application/</strong>. W katalogu tym będziemy przechowywać wszystkie pliki potrzebne do testowania. Aby rozpocząć pracę musimy powiedzieć Netbeans  o naszym katalogu z testami in spe. Naciskamy kombinacje <strong>Alt+F6</strong> lub menu wybieramy <strong>Run-&gt; Test Project (nazwa_projektu)</strong>.</p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/04/netbeans-phpunit_directory.jpg"><img class="size-full wp-image-995  aligncenter" title="netbeans-phpunit_directory" src="http://nexik.net/wp-content/uploads/2010/04/netbeans-phpunit_directory.jpg" alt="" width="497" height="186" /></a></p>
<p style="text-align: left;">Powinno pojawić się okienko <strong>Select a directory for PHPUnit</strong>. Wybieramy nasz wcześniej stworzony katalog do testów. Netbeans podzieli nasz projekt na dwie części <strong>Source Files</strong> oraz <strong>Test Files</strong>. W Test Files musimy stworzyć plik konfiguracyjny XML &#8211; sic!</p>
<p style="text-align: left;">Tworzymy więc nowy plik XML o nazwie phpunit.xml</p>
<pre class="brush: xml">
&lt;phpunit bootstrap=&quot;bootstrap.php&quot; colors=&quot;true&quot;&gt;
    &lt;testsuite name=&quot;ApplicationTestSuite&quot;&gt;
        &lt;directory&gt;./classes&lt;/directory&gt;
    &lt;/testsuite&gt;
    &lt;filter&gt;
        &lt;whitelist&gt;
            &lt;directory suffix=&quot;.php&quot;&gt;../tests&lt;/directory&gt;
            &lt;exclude&gt;
                &lt;directory suffix=&quot;*&quot;&gt;../cache&lt;/directory&gt;
                &lt;directory suffix=&quot;*&quot;&gt;../config&lt;/directory&gt;
                &lt;directory suffix=&quot;*&quot;&gt;../logs&lt;/directory&gt;
                &lt;directory suffix=&quot;.php&quot;&gt;../views&lt;/directory&gt;
                &lt;file&gt;../bootstrap.php&lt;/file&gt;
            &lt;/exclude&gt;
        &lt;/whitelist&gt;
    &lt;/filter&gt;
&lt;/phpunit&gt;
</pre>
<p>W pliku podajemy katalog w którym będą znajdować się nasze testy &#8211; linijka 3. Katalog ten należy stworzyć w <strong>Test Files</strong>. Następnie podajemy listę katalogów i plików które mają być ignorowane podczas wykonywania testów &#8211; linijki od 8 do 14.</p>
<p>Gdy plik konfiguracyjny jest gotowy to pora stworzyć plik <strong>bootstrap.php</strong> w Test Files. Będzie on odpalany na początku procesu testującego i przygotowywał środowisko do ich odpalenia.</p>
<pre class="brush: php">
require_once &#039;PHPUnit/Framework.php&#039;;

error_reporting(E_ALL | E_STRICT);
ini_set(&#039;display_errors&#039;, &#039;On&#039;);

$application = &#039;../&#039;;
$modules = &#039;../../modules&#039;;
$system = &#039;../../system&#039;;

define(&#039;EXT&#039;, &#039;.php&#039;);
define(&#039;DOCROOT&#039;, realpath(dirname(__FILE__) . DIRECTORY_SEPARATOR . &#039;../../..&#039;).DIRECTORY_SEPARATOR);

if ( ! is_dir($application) AND is_dir(DOCROOT.$application))
    $application = DOCROOT.$application;

if ( ! is_dir($modules) AND is_dir(DOCROOT.$modules))
    $modules = DOCROOT.$modules;

if ( ! is_dir($system) AND is_dir(DOCROOT.$system))
    $system = DOCROOT.$system;

define(&#039;APPPATH&#039;, realpath($application).DIRECTORY_SEPARATOR);
define(&#039;MODPATH&#039;, realpath($modules).DIRECTORY_SEPARATOR);
define(&#039;SYSPATH&#039;, realpath($system).DIRECTORY_SEPARATOR);
define(&#039;WEBPATH&#039;, &#039;http://icomet.local/&#039;);

unset($application, $modules, $system);

require SYSPATH.&#039;base&#039;.EXT;
require SYSPATH.&#039;classes/kohana/core&#039;.EXT;

if (is_file(APPPATH.&#039;classes/kohana&#039;.EXT))
    require APPPATH.&#039;classes/kohana&#039;.EXT;
else
    require SYSPATH.&#039;classes/kohana&#039;.EXT;

require APPPATH.&#039;test_bootstrap&#039;.EXT;
</pre>
<p>Jest to w głównej mierze kopia  pliku index.php dostarczanego do Frameworka KohanaPHP. Istotna zmiana ma miejsce 37 gdzie nazwę pliku <strong>bootstrap</strong> zamieniłem na <strong>test_bootstrap</strong>. </p>
<p>Jest to spowodowane tym że chcemy by cały framework się odpalił, ale nie chcemy aby wynik aplikacji nie był wyświetlony na wyjściu. Dlatego robi kopie Kohanowego bootstrap i wywalamy wyświetlanie ostatnie linijki odpowiedzialne za wyświetlanie response. </p>
<p>Finalnie kod <strong>test_bootstrap.php</strong> powinien wyglądać mniej więcej tak:</p>
<pre class="brush: php">
date_default_timezone_set(&#039;Europe/Warsaw&#039;);
setlocale(LC_ALL, &#039;en_US.utf-8&#039;);
spl_autoload_register(array(&#039;Kohana&#039;, &#039;auto_load&#039;));

ini_set(&#039;unserialize_callback_func&#039;, &#039;spl_autoload_call&#039;);

Kohana::init(array(
    &#039;base_url&#039;      =&gt; &#039;/projectname/&#039;,
    &#039;index_file&#039;    =&gt; &#039;index.php&#039;,
    &#039;charset&#039;       =&gt; &#039;utf-8&#039;,
    &#039;cache_dir&#039;     =&gt; APPPATH.&#039;/cache&#039;,
    &#039;errors&#039;        =&gt; TRUE,
    &#039;profile&#039;       =&gt; TRUE,
    &#039;caching&#039;       =&gt; FALSE
));

Kohana::$log-&gt;attach(new Kohana_Log_File(APPPATH.&#039;logs&#039;));

Kohana::$config-&gt;attach(new Kohana_Config_File);
Kohana::modules(array(
    &#039;database&#039;      =&gt; MODPATH.&#039;database&#039;,   // Database access
    &#039;my&#039;        =&gt; MODPATH.&#039;my&#039;,
));

Route::set(&#039;default&#039;, &#039;(&lt;controller&gt;(/&lt;action&gt;(/&lt;id&gt;)))&#039;)
    -&gt;defaults(array(
            &#039;controller&#039; =&gt; &#039;welcome&#039;,
            &#039;action&#039;     =&gt; &#039;index&#039;,
    )
);
</pre>
<p>Gotowe :)</p>
<h2>4. Pierwszy test</h2>
<p>Przed poważnym testowaniem należy przetestować skrypt do testowania :) Zrobimy to tworząc prosty test. W Test Files tworzymy katalog <strong>classes/</strong> a w nim plik <strong>BasicTest.php</strong></p>
<pre class="brush: php">
class BasicTest extends PHPUnit_Framework_TestCase
{
    public function test_assert_true()
    {
        $this-&gt;assertTrue(true);
    }
}
</pre>
<p>Test jest banalny :) sprawdzamy czy <strong>true</strong> jest równe <strong>true</strong> :) Jeżeli wszystko poszło dobrze to powinniśmy po wciśnięciu Alt+F6 otrzymać wynik </p>
<pre class="brush: c">
PHPUnit 3.4.11 by Sebastian Bergmann.
.
Time: 1 second, Memory: 4.50Mb
[30;42m[2KOK (1 test, 1 assertion)
[0m[2K
</pre>
<h2>5. Testowanie bazy danych</h2>
<p>Zanim przejdę do bardziej zaawansowanych przykładów TDD chcę pokazać moje podejście do tworzenia modeli  w frameworku KohanaPHP. W podstawowej wersji każdy model powinien składać się z dwóch klas:</p>
<ul>
<li>Klasy bramki (<strong>gateway</strong>) dostępu do modelu</li>
<li>Klasy modelu</li>
</ul>
<p>Oczywiście moja architektura bazuje na module database, więc trzeba się upewnić że w katalogu application/config/ znajduję się plik database.php z wpisanymi dwoma wartościami:</p>
<pre class="brush: php">
return array(
    &#039;default&#039; =&gt; array(
        &#039;type&#039;       =&gt; &#039;mysql&#039;,
        &#039;connection&#039; =&gt; array(
            &#039;hostname&#039;   =&gt; &#039;localhost&#039;,
            &#039;username&#039;   =&gt; &#039;root&#039;,
            &#039;password&#039;   =&gt; &#039;&#039;,
            &#039;persistent&#039; =&gt; FALSE,
            &#039;database&#039;   =&gt; &#039;projekt_development&#039;
        ),
        &#039;table_prefix&#039; =&gt; &#039;&#039;,
        &#039;charset&#039;      =&gt; &#039;utf8&#039;,
        &#039;caching&#039;      =&gt; FALSE,
        &#039;profiling&#039;    =&gt; FALSE,
    ),
    &#039;test&#039; =&gt; array(
        &#039;type&#039;       =&gt; &#039;mysql&#039;,
        &#039;connection&#039; =&gt; array(
            &#039;hostname&#039;   =&gt; &#039;localhost&#039;,
            &#039;username&#039;   =&gt; &#039;root&#039;,
            &#039;password&#039;   =&gt; &#039;&#039;,
            &#039;persistent&#039; =&gt; FALSE,
            &#039;database&#039;   =&gt; &#039;projekt_test&#039;,
        ),
        &#039;table_prefix&#039; =&gt; &#039;&#039;,
        &#039;charset&#039;      =&gt; &#039;utf8&#039;,
        &#039;caching&#039;      =&gt; FALSE,
        &#039;profiling&#039;    =&gt; FALSE,
    ),
);
</pre>
<p>Aby nie powielać kodu zbudowałem klasę <strong>Model_Gateway</strong> po której będą dziedziczyć wszystkie inne bramki do modeli.</p>
<pre class="brush: php">
class Model_Gateway
{
    public $db;

    public function  __construct() {}
    public function set_db($database_schema) {}

}
</pre>
<p>Jednak zanim klasa zostanie zaimplementowana, przygotujemy testy do niej :)  Tworzymy nową klasę testów <strong>Model_GatewayTest</strong> w Test Files <strong>classes/model/GatewayTest.php</strong>.</p>
<pre class="brush: php">
class Model_GatewayTest extends PHPUnit_Framework_TestCase
{
    protected $gateway;

    public function setUp()
    {
        parent::setUp();

        $this-&gt;gateway = new Model_Gateway();
    }

    public function test_get_db()
    {
        $this-&gt;assertType(&#039;Database&#039;, $this-&gt;gateway-&gt;db, &#039;$database object must be instance of Database class&#039;);

        $this-&gt;assertEquals(&#039;default&#039;, $this-&gt;gateway-&gt;db-&gt;__toString(), &#039;database_schema should be equal to &quot;default&quot;&#039;);
    }

    public function test_set_db()
    {
        $this-&gt;gateway-&gt;set_db(&#039;test&#039;);

        $this-&gt;assertType(&#039;Database&#039;, $this-&gt;gateway-&gt;db, &#039;$database object must be instance of Database class&#039;);

        $this-&gt;assertEquals(&#039;test&#039;, $this-&gt;gateway-&gt;db-&gt;__toString(), &#039;database_schema should be equal to &quot;test&quot;&#039;);
    }
}
</pre>
<p>Jest tutaj użyta specjalna metoda setUp, która jest odpalana przed każdym testem, przygotowując środowisko do testowania. Mamy dwa proste testy. Pora napisać kod który te testy przejdzie pomyślnie.</p>
<pre class="brush: php">
class Model_Gateway
{
    public $db;

    public function  __construct()
    {
        $this-&gt;set_db(&#039;default&#039;);
    }

    public function set_db($database_schema)
    {
        $this-&gt;db = Database::instance($database_schema);
    }
}
</pre>
<p>Teraz jak uruchomimy testy to otrzymamy wynik pozytywny :)</p>
<h2>6. Osobna baza dla testow</h2>
<p>Kolejnym krokiem jest stworzenie systemu automatycznego kopiowania struktury bazy development do bazy test, aby przed każdym testem baza była czyszczona. Do tego celu napisałem klasę <strong>TDD_AbstractTestCase</strong> i umieściłem ją w <strong>modules/my/TDD/ AbstractTestCase.php</strong></p>
<pre class="brush: php">
class TDD_AbstractTestCase extends PHPUnit_Framework_TestCase
{
    protected $db_test_layer;

    public function setUp()
    {
        $this-&gt;db_test_layer = new TDD_Database_Layer();

        $this-&gt;db_test_layer-&gt;copy_db();
    }
}
</pre>
<p>Klasa jest prosta. Wyszystkie klasy testów będą ją rozszerzać aby zachować zasadę <strong>DRY</strong> (Don't Repeat Yourself). Jednak żeby działała potrzebna jest jeszcze jedna klasa odpowiedzialna za warstwę testowej bazy danych. </p>
<p>Klasa <strong>TDD_Database_Layer</strong> znajdować powinna się w <strong>modules/my/TDD/database/ layer.php</strong></p>
<pre class="brush: php">
class TDD_Database_Layer
{
    /**
     * Kopiuje strukture bazy zrodlowej do bazy docelowej.
     * Parametry sa kluczami z tablicy w kohanowskiej konfiguracji bazy danych
     *
     * UWAGA:
     * Baza docelowa jest najpierw czyszczona
     *
     * @param string $db_schema_source
     * @param string $db_schema_destination
     */
    public function copy_db($db_schema_source = &#039;default&#039;, $db_schema_destination = &#039;test&#039;)
    {
        $this-&gt;drop_db($db_schema_destination);
        $this-&gt;create_db($db_schema_destination);

        $sqls_to_create_table = $this-&gt;get_sql_create_tables($db_schema_source);

        foreach ($sqls_to_create_table as $sql)
        {
            Database::instance($db_schema_destination)-&gt;query(Database::INSERT, $sql, false);
        }
    }

    protected function drop_db($db_schema)
    {
        $database = $this-&gt;get_db_name($db_schema);
        Database::instance()-&gt;query(Database::DELETE, &#039;DROP DATABASE &#039; . $database, false);
    }

    protected function create_db($db_schema)
    {
        $database = $this-&gt;get_db_name($db_schema);
        Database::instance()-&gt;query(Database::INSERT, &#039;CREATE DATABASE &#039; . $database, false);
    }

    protected function get_sql_create_tables($db_schema = &#039;default&#039;)
    {
        $tables = $this-&gt;get_tables($db_schema);
        $sqls_to_create_table = array();

        foreach ($tables as $table)
        {
            $sql_to_crate_table_result = Database::instance()-&gt;query(Database::SELECT, &#039;SHOW CREATE TABLE &#039; . $table, false);
            $sqls_to_create_table[] = $sql_to_crate_table_result-&gt;get(&#039;Create Table&#039;);
            $sqls_to_create_table[] = &#039;ALTER TABLE `&#039;.$table.&#039;` AUTO_INCREMENT=1&#039;;
        }

        return $sqls_to_create_table;
    }

    protected function get_tables($db_schema = &#039;default&#039;)
    {
        return Database::instance($db_schema)-&gt;list_tables();
    }

    protected function get_db_name($db_schema)
    {
        $database_config = Kohana_Config::instance()-&gt;load(&#039;database&#039;)-&gt;get($db_schema);

        return $database_config[&#039;connection&#039;][&#039;database&#039;];
    }
}
</pre>
<p>Wygląda na skąplikowane ale ważna jest tylko metoda <strong>copy_db()</strong>. Jest to jedyna metoda publiczna. Metoda ta kopiuje strukturę tabel wewnątrz bazy źródłowej (<strong>$db_schema_source</strong>) do bazy decolowej (<strong>$db_schema_destination</strong>). Baza docelowa przed wykonaniem kopii jest czyszczona, więc należy uważać funkcji z wielką uwagą.</p>
<h2>7. Testowanie bramki do modelu</h2>
<p>Ok jak wszystko jest już gotowe pora zabrać się za poważne kodowanie. Stworzymy bramkę do tabeli users w bazie danych. Struktura tej tabeli jest następująca:</p>
<pre class="brush: sql">
CREATE TABLE `users` (
	`user_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`user_name` VARCHAR(50) NOT NULL,
	`user_email` VARCHAR(150) NOT NULL,
	`add_date` INT(10) UNSIGNED NOT NULL DEFAULT &#039;0&#039;,
	`edit_date` INT(10) UNSIGNED NULL DEFAULT &#039;0&#039;,
	PRIMARY KEY (`user_id`),
	UNIQUE INDEX `user_name` (`user_name`),
	UNIQUE INDEX `user_email` (`user_email`)
)
ENGINE=InnoDB;
</pre>
<p>Tworzymy ją w bazie z schematu default. w bazie testowej zostanie ona stworzona automatycznie dzięki wcześniejszemu skryptowi. Powiem nawet więcej :). Jeżeli zmienicie jej strukturę w bazie <strong>default</strong> to automatycznie testy zmienią także strukturę tabeli w bazie <strong>test</strong>.</p>
<p>Wracamy do bramki jej celem będzie implementacja następujących metod:</p>
<pre class="brush: php">
class Model_Gateway_User extends Model_Gateway
{
    private $table = &#039;users&#039;;

    public function add_user($user) {}
    public function find_user_by_id($user_id) {}
    public function find_all_users() {}
    public function update_user($user, $user_id) {}
    public function delete_user($user_id) {}

}
</pre>
<p>Pora napisać testy do tych funkcjonalności. Tworzymy nową klasę testów: Model_Gateway_UserTest:</p>
<pre class="brush: php">
class Model_Gateway_UserTest extends TDD_AbstractTestCase
{
    private $gateway_user;
    private $fixtures;

    public function setUp()
    {
        parent::setUp();

        $this-&gt;gateway_user = new Model_Gateway_User();
        $this-&gt;fixtures = array(
            &#039;user_1&#039; =&gt; array(
                &#039;user_name&#039;  =&gt; &#039;Jan&#039;,
                &#039;user_email&#039; =&gt; &#039;jan@kowalski.pl&#039;,
                &#039;add_date&#039;   =&gt; time(),
                &#039;edit_date&#039;  =&gt; NULL
            ),
            &#039;user_2&#039; =&gt; array(
                &#039;user_name&#039;  =&gt; &#039;Jas&#039;,
                &#039;user_email&#039; =&gt; &#039;jas@kowalski.pl&#039;,
                &#039;add_date&#039;   =&gt; time(),
                &#039;edit_date&#039;  =&gt; NULL
            ),
            &#039;user_3&#039; =&gt; array(
                &#039;user_name&#039;  =&gt; &#039;Adam&#039;,
                &#039;user_email&#039; =&gt; &#039;adam@kowalski.pl&#039;,
                &#039;add_date&#039;   =&gt; time(),
                &#039;edit_date&#039;  =&gt; NULL
            ),
        );

        $this-&gt;gateway_user-&gt;set_db(&#039;test&#039;);
    }

    public function test_find_user_by_id()
    {
        $this-&gt;gateway_user-&gt;add_user($this-&gt;fixtures[&#039;user_1&#039;]);
        $user_name = $this-&gt;fixtures[&#039;user_1&#039;][&#039;user_name&#039;];

        $user = $this-&gt;gateway_user-&gt;find_user_by_id(1);

        $this-&gt;assertEquals(1, $user-&gt;user_id, &#039;user_id should be 1. Given: &#039;.$user-&gt;user_id);
        $this-&gt;assertEquals($user_name, $user-&gt;user_name, &#039;user_name should be &#039;.$user_name.&#039; Given &#039;.$user-&gt;user_name);
    }

    public function test_find_all_users()
    {
        $this-&gt;gateway_user-&gt;add_user($this-&gt;fixtures[&#039;user_1&#039;]);
        $this-&gt;gateway_user-&gt;add_user($this-&gt;fixtures[&#039;user_2&#039;]);
        $this-&gt;gateway_user-&gt;add_user($this-&gt;fixtures[&#039;user_3&#039;]);

        $users = $this-&gt;gateway_user-&gt;find_all_users();

        $this-&gt;assertEquals(3, $users-&gt;count(), &#039;Number of users should be 3&#039;);
    }

    public function test_update_user()
    {
        $this-&gt;gateway_user-&gt;add_user($this-&gt;fixtures[&#039;user_1&#039;]);
        $update = array(&#039;user_name&#039; =&gt; &#039;Tomek&#039;);

        $this-&gt;gateway_user-&gt;update_user($update, 1);
        $user = $this-&gt;gateway_user-&gt;find_user_by_id(1);

        $this-&gt;assertEquals($update[&#039;user_name&#039;], $user-&gt;user_name);
    }

    public function test_delete_user()
    {
        $this-&gt;gateway_user-&gt;add_user($this-&gt;fixtures[&#039;user_1&#039;]);
        $this-&gt;gateway_user-&gt;add_user($this-&gt;fixtures[&#039;user_2&#039;]);
        $this-&gt;gateway_user-&gt;add_user($this-&gt;fixtures[&#039;user_3&#039;]);

        $users = $this-&gt;gateway_user-&gt;find_all_users();

        $this-&gt;assertEquals(3, $users-&gt;count(), &#039;Number of users should be 3&#039;);

        $this-&gt;gateway_user-&gt;delete_user(1);
        $users = $this-&gt;gateway_user-&gt;find_all_users();

        $this-&gt;assertEquals(2, $users-&gt;count(), &#039;Number of users should be 2&#039;);
    }
}
</pre>
<p>Kod testu wymaga refactoringu, ale o tym punkcie 8. Teraz pora napisać kod który te testy przejdzie.</p>
<pre class="brush: php">
class Model_Gateway_User extends Model_Gateway
{
    private $table = &#039;users&#039;;

    public function add_user($user)
    {
        if(is_array($user))
        {
            $columns = array_keys($user);
            $values = array_values($user);
        }

        $sql = DB::insert($this-&gt;table)-&gt;columns($columns)-&gt;values($values);
        $result = $this-&gt;db-&gt;query(Database::INSERT, $sql, false);
        $insert_id = $result[0];

        return $insert_id;
    }

    public function find_user_by_id($user_id)
    {
        $sql = DB::select()-&gt;from($this-&gt;table)-&gt;where(&#039;user_id&#039;, &#039;=&#039;, $user_id);
        $result = $this-&gt;db-&gt;query(Database::SELECT, $sql, true);

        return $result-&gt;current();
    }

    public function find_all_users()
    {
        $sql = DB::select()-&gt;from($this-&gt;table);
        $result = $this-&gt;db-&gt;query(Database::SELECT, $sql, true);

        return $result;
    }

    public function update_user($user, $user_id)
    {
        $sql = DB::update($this-&gt;table)-&gt;set($user)-&gt;where(&#039;user_id&#039;, &#039;=&#039;, $user_id);
        $result = $this-&gt;db-&gt;query(Database::UPDATE, $sql, false);

        return $result;
    }

    public function delete_user($user_id)
    {
        $sql = DB::delete($this-&gt;table)-&gt;where(&#039;user_id&#039;, &#039;=&#039;, $user_id);
        $result = $this-&gt;db-&gt;query(Database::DELETE, $sql, false);

        return $result;
    }
}
</pre>
<p>Oczywiście kod testów jak i kodu który je przechodzi można poprawić. Co dokładnie? Na pewno zauważyliście że fragmenty kodu testów się powtarzają. Głównie dotyczy to kodu który dodaje nowe rekordy do bazy. Najlepiej zamienić powtarzający się kod na prywatną metodę i wykonać ją przed każdym testem, czyli w metodzie <strong>setUp()</strong>. O tym traktuje kolejny punkt.</p>
<h2>8. Refactoring</h2>
<p>Główną zaletą TDD jest <strong>brak obaw przed zmianą kodu</strong>. Jeżeli zmienimy kod i przejdzie on następnie testy to wiemy że nadal wszystko działa. Takie podejście do tworzenia kodu zachęca programistów do refactoringu, czyli poprawy jakości kodu. Jakość kodu to jego czytelność oraz wydajność. </p>
<p>Dzięki TDD możemy zmienić algorytmy odpowiedzialne za logikę biznesową bez obawy że coś zepsujemy dopóki kod przejdzie testy. Trzeba pamiętać że testy to nie święte krowy, które się napisze raz i potem się ich nie dotyka. </p>
<p>Testy powinny odzwierciedlać zmiany w aplikacji. <strong>Testy powinny być nieformalną dokumentacją co aplikacja ma robić.</strong> Jeżeli aplikacja będzie się zmieniać należy przepisać testy do nowych wymagań. Spowoduje to że aplikacja która wcześniej przechodziła testy, tym razem się wysypie. Będziemy musieli przepisać kod aplikacji pod nowe testy. Gdy już to nam się uda będziemy pewni że wszystko działa tak jak powinno.</p>
<p>TDD umożliwia poprawę czytelności kodu, ale same testy też należy pisać z zastosowań wszystkich zasad tworzenia czystego kodu. Jeżeli testy będą pisane tylko po to by były to programiści nie będą ich rozumieć do końca i będą się bać ich zmieniać, co spowoduje że staną się bezwartościowe. </p>
<p>W <strong>punkcie 7</strong> pisałem że testy potrzebują małego rafactoringu aby stały się czytelniejsze. Pora na poprawkę:</p>
<pre class="brush: php">
class Model_Gateway_UserTest extends TDD_AbstractTestCase
{
    private $gateway_user;
    private $fixtures;

    public function setUp()
    {
        parent::setUp();

        $this-&gt;gateway_user = new Model_Gateway_User();
        $this-&gt;fixtures = array(
            &#039;user_1&#039; =&gt; array(
                &#039;user_name&#039;  =&gt; &#039;Jan&#039;,
                &#039;user_email&#039; =&gt; &#039;jan@kowalski.pl&#039;,
                &#039;add_date&#039;   =&gt; time(),
                &#039;edit_date&#039;  =&gt; NULL
            ),
            &#039;user_2&#039; =&gt; array(
                &#039;user_name&#039;  =&gt; &#039;Jas&#039;,
                &#039;user_email&#039; =&gt; &#039;jas@kowalski.pl&#039;,
                &#039;add_date&#039;   =&gt; time(),
                &#039;edit_date&#039;  =&gt; NULL
            ),
            &#039;user_3&#039; =&gt; array(
                &#039;user_name&#039;  =&gt; &#039;Adam&#039;,
                &#039;user_email&#039; =&gt; &#039;adam@kowalski.pl&#039;,
                &#039;add_date&#039;   =&gt; time(),
                &#039;edit_date&#039;  =&gt; NULL
            ),
        );

        $this-&gt;gateway_user-&gt;set_db(&#039;test&#039;);
        $this-&gt;set_fixtures();
    }

    private function set_fixtures()
    {
        $this-&gt;gateway_user-&gt;add_user($this-&gt;fixtures[&#039;user_1&#039;]);
        $this-&gt;gateway_user-&gt;add_user($this-&gt;fixtures[&#039;user_2&#039;]);
        $this-&gt;gateway_user-&gt;add_user($this-&gt;fixtures[&#039;user_3&#039;]);
    }

    public function test_find_user_by_id()
    {
        $user_name = $this-&gt;fixtures[&#039;user_1&#039;][&#039;user_name&#039;];

        $user = $this-&gt;gateway_user-&gt;find_user_by_id(1);

        $this-&gt;assertEquals(1, $user-&gt;user_id, &#039;user_id should be 1. Given: &#039;.$user-&gt;user_id);
        $this-&gt;assertEquals($user_name, $user-&gt;user_name, &#039;user_name should be &#039;.$user_name.&#039; Given &#039;.$user-&gt;user_name);
    }

    public function test_find_all_users()
    {
        $users = $this-&gt;gateway_user-&gt;find_all_users();

        $this-&gt;assertEquals(3, $users-&gt;count(), &#039;Number of users should be 3&#039;);
    }

    public function test_update_user()
    {
        $update = array(&#039;user_name&#039; =&gt; &#039;Tomek&#039;);

        $this-&gt;gateway_user-&gt;update_user($update, 1);
        $user = $this-&gt;gateway_user-&gt;find_user_by_id(1);

        $this-&gt;assertEquals($update[&#039;user_name&#039;], $user-&gt;user_name);
    }

    public function test_delete_user()
    {
        $users = $this-&gt;gateway_user-&gt;find_all_users();

        $this-&gt;assertEquals(3, $users-&gt;count(), &#039;Number of users should be 3&#039;);

        $this-&gt;gateway_user-&gt;delete_user(1);
        $users = $this-&gt;gateway_user-&gt;find_all_users();

        $this-&gt;assertEquals(2, $users-&gt;count(), &#039;Number of users should be 2&#039;);
    }
}
</pre>
<h2>9. Nowa funkcjonalność w aplikacji</h2>
<p>Ok jak już mamy w miarę czysty kod testów, pora przyjrzeć się metodzie <strong>add_user($user)</strong> oraz <strong>update_user($user, $user_id)</strong>. Metody te nie sprawdzają czy zmienna $user posiada odpowiednie pary <strong>kolumna => wartosc</strong> które odpowiadają rzeczywistym parom z tabeli users w bazie danych. Pora napisać odpowiednie testy które opiszą takie sytuacje wykorzystania kodu.</p>
<pre class="brush: php">
class Model_Gateway_User extends Model_Gateway
{
    //[...]

    public function test_add_user_with_extra_data()
    {
        $add_user = array(
            &#039;user_name&#039;  =&gt; &#039;Andrzej&#039;,
            &#039;user_email&#039; =&gt; &#039;andrzej@kowalski.pl&#039;,
            &#039;add_date&#039;   =&gt; time(),
            &#039;edit_date&#039;  =&gt; NULL,
            &#039;extra&#039;      =&gt; &#039;extra_data&#039;
        );

        $user_id = $this-&gt;gateway_user-&gt;add_user($add_user);
        $user = $this-&gt;gateway_user-&gt;find_user_by_id($user_id);

        $this-&gt;assertObjectNotHasAttribute(&#039;extra&#039;, $user);
    }

    public function test_add_user_without_full_data()
    {
        $add_user = array(
            &#039;user_name&#039;  =&gt; &#039;Andrzej&#039;,
            &#039;user_email&#039; =&gt; &#039;andrzej@kowalski.pl&#039;,
        );

        $user_id = $this-&gt;gateway_user-&gt;add_user($add_user);
        $user = $this-&gt;gateway_user-&gt;find_user_by_id($user_id);

        $this-&gt;assertAttributeGreaterThan(0, &#039;add_date&#039;, $user);
        $this-&gt;assertEquals(0, $user-&gt;edit_date);
    }

    //[...]
}
</pre>
<p>Jeżeli teraz uruchomimy testy, okaże się że niestety nasz kod ich nie spełnia :( Pora to naprawić. Najpierw się upewnimy że przed dodaniem usera jest ustawiona wartość add_date na aktualny timestamp. Dzięki temu przy dodawaniu będzie to automatycznie generowane i programista będzie miał o jeden problem mniej na głowie :)</p>
<pre class="brush: php">
class Model_Gateway_User extends Model_Gateway
{
    protected $table = &#039;users&#039;;

    public function add_user($user)
    {
        if(is_array($user))
        {
            $user = $this-&gt;set_user_default_data($user);
            $user = $this-&gt;filter_insert_data($this-&gt;table, $user);

            $columns = array_keys($user);
            $values = array_values($user);
        }

        $sql = DB::insert($this-&gt;table)-&gt;columns($columns)-&gt;values($values);
        $result = $this-&gt;db-&gt;query(Database::INSERT, $sql, false);
        $insert_id = $result[0];

        return $insert_id;
    }

    //[...]

    private function set_user_default_data($user)
    {
        if(is_array($user))
        {
            if(!array_key_exists(&#039;add_date&#039;, $user))
                $user[&#039;add_date&#039;] = time();
        }

        return $user;
    }
}
</pre>
<p>Dodane zostały dwie funkcje set_user_default_data($user) oraz filter_insert_data($this->table, $user). Pierwsza została już zaimplementowana, jednak druga będzie wykorzystywana również w innych bramkach do modeli więc należy ją dodać do klasy Model_Gateway:</p>
<pre class="brush: php">
class Model_Gateway
{
    public $db;

    protected $table;

    //[...]    

    protected function filter_insert_data($table, $insert_data)
    {
        $columns = $this-&gt;db-&gt;list_columns($table);
        $filtered_insert_data = array();

        foreach($columns as $column)
        {
            if(array_key_exists($column, $insert_data))
            {
                $filtered_insert_data[$column] = $insert_data[$column];
            }
        }

        return $filtered_insert_data;
    }
}
</pre>
<p>Teraz testy zakończą się powodzeniem. Jak widać TDD nie tylko umożliwia poprawę kodu jego refactoring ale również dodanie nowych funkcjonalność do aplikacji jest mnie stresowe. Teraz gdy klient będzie chciał nowej funkcji bez problemu możesz ją dodać nie bojąc się że ta zmiana stworzy jakiś nowy bug :)</p>
<h2>10. To dopiero początek :)</h2>
<p>TDD to bardzo potężne narzędzie szczególnie w dużych projektach, gdzie dodanie nowej kolumny w tabeli zmiana całkowicie logikę aplikacji. To co pokazałem to lekki wstęp do tego co może TDD. Zachęcam do pogłębienia wiedzy w tym temacie bo naprawdę warto.</p>
<p>Na koniec 3 prawa TDD:</p>
<ul>
<li><strong>Zasada 1.</strong> Nie wolno pisać kodu produkcyjnego, jeżeli nie ma napisanych testów które ten kod mogłyby pokryć.</li>
<li><strong>Zasada 2</strong>. Nie piszemy więcej testów jednostkowych niż wymaga do tego oblanie testu głównego. Błąd kompilacji jest równoznaczny z oblaniem testu.</li>
<li><strong>Zasada 3.</strong> Piszemy kod który te testy przejdzie pomyślnie i wracamy do zasady 1.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://nexik.net/10-sposobow-na-phpunit-z-kohanaphp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Head First Design Paterns</title>
		<link>http://nexik.net/head-first-design-paterns/</link>
		<comments>http://nexik.net/head-first-design-paterns/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 20:59:25 +0000</pubDate>
		<dc:creator>nexik</dc:creator>
				<category><![CDATA[Książki]]></category>
		<category><![CDATA[Programowanie]]></category>

		<guid isPermaLink="false">http://nexik.net/?p=953</guid>
		<description><![CDATA[Właśnie skończyłem po długich bojach czytanie biblii na temat wzorców projektowych "Head First Design Patterns" w polskiej edycji wydanej przez <a href="http://helion.pl/ksiazki/hfdepa.htm">Helion</a> autorstwa Erica Freemana, Eisabeth Freeman, Kathy Sierra, Bert Bates. Książka napisana w bardzo przyjemny sposób z dozą humoru i genialnych rysunków.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/03/head_first_design_patterns_cover.jpg"><img class="size-full wp-image-954  aligncenter" title="Head First Design Patterns" src="http://nexik.net/wp-content/uploads/2010/03/head_first_design_patterns_cover.jpg" alt="" width="432" height="500" /></a></p>
<p>Skończyłem po długich bojach czytanie biblii na temat wzorców projektowych <em>&#8220;Head First Design Patterns&#8221;</em> w polskiej edycji wydanej przez <a href="http://helion.pl/ksiazki/hfdepa.htm">Helion</a>.</p>
<p>Książka napisana w bardzo przyjemny sposób z dozą humoru i genialnych rysunków. Na początku wydaję się, że książkę się przeczyta raz dwa bo jest bardzo zabawna i prosta w odbiorze. Nic bardziej mylnego. Książka ma pokaźną dawkę wiedzy i nie tak łatwo ją opanować w parę dni. Szczególnie że wiedza ta dotyczy bardzo trudnego tematu jakim są <strong>wzorce projektowe</strong>.</p>
<p>Od czasu jak pierwszy raz przeczytałem książkę <em>&#8220;Wzorce projektowe &#8211; Analiza kodu sposobem na ich poznanie&#8221;</em> to stałem się ich wielkim zwolennikiem. Niestety moja pierwsza lektura była opatrzona przykładami z dość ciężkim kodem Java. Był to rok 2006, a ja ledwo znałem <em>OOP</em> w <em>PHP</em> i ciężko było zrozumieć mi niektóre aspekty (tak serio to większość z nich :P).</p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/03/decorator_1241345605.jpg"><img class="size-full wp-image-957  aligncenter" title="Decorator" src="http://nexik.net/wp-content/uploads/2010/03/decorator_1241345605.jpg" alt="" width="300" height="442" /></a></p>
<p>Moja przygoda z wzorcami na dobre rozpoczęła się dopiero po pracy z <em>Zend Framework</em> który w sobie ma wiele zaimplementowanych różnych wzorców projektowych. Nie tylko same jądro tego frameworka jest wypełnione wzorcami. Niektóre biblioteki <em>ZF</em> wymagają znajomości wzorców na pewnym poziomie zaawansowanie. </p>
<p>Przykładem może być <em>Zend_Form</em>, system do tworzenia formularzy który sprawia wiele problemów phpowym noobom i zniechęca wiele osób do <em>ZF</em>. Wszystko jest spowodowane zastosowania wzorca projektowego Dekorator i sposób w jaki można dekorować wszystkie elementy formularza.</p>
<p>Ogólnie o wzorcach w <em>PHP</em> bardzo mało się pisze :( Wiekszość książek z tej dziedziny jest pisana dla programistów <em>Java</em> lub języków z rodziny <em>&#8220;C&#8221;</em>. Bez doświadczenia w tych językach ciężko zrozumieć dość abstrakcyjne pojęcia z dziedziny wzorców projektowych.</p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/03/Autumn_bridge_by_KARRR.jpg"><img class="size-large wp-image-964" title="Pomost" src="http://nexik.net/wp-content/uploads/2010/03/Autumn_bridge_by_KARRR-500x500.jpg" alt="" width="500" height="500" /></a><br />
<a href="http://karrr.deviantart.com/art/Autumn-bridge-137007560">Autumn bridge</a> autorstwa <a href="http://karrr.deviantart.com/">~KARRR</a></p>
<p>Na szczęście Head First Design Patterns stworzył pomost do wiedzy dla biednych programistów PHP. Książka nie jest pisana w czystym języku Java, ale w pseudo języku Java, który jest wstanie zrozumieć każdy kto zna OOP w jakimkolwiek języku i dzięki temu może dojrzeć piękno wzorców. Książka przedstawia podstawowe wzorce takie jak Fabryka, Dekorator, Strategia czy Obserwator.</p>
<p>Wzorce są wyjaśnione bardzo prostym językiem z prostymi przykładami, czasami wydaje mi się że zbyt prostymi ;p Prawdziwa perełka jest jednak na końcu książki gdzie za pomocą połączenia poznanych wcześniej wzorców powstaje nowy, a jednocześnie jeden z najpopularniejszych wzorców na świecie <em>MVC</em>, czyli <em>Model View Controller</em> a następnie jego odmiana dla aplikacji WWW czyli <em>Model 2</em>.</p>
<p>Ogólnie bardzo dobra książka dla ludzi, którzy ledwo co słyszeli o samych wzorcach i chcieliby się dowiedzieć czegoś więcej. Dla bardziej zaawansowanych może trochę przynudzać ale i tak warto ją przeczytać. Książka oprócz usystematyzowania wiedzy dostarczy kilkunastogodzinnego ROTFLa :) Polecam.</p>
]]></content:encoded>
			<wfw:commentRss>http://nexik.net/head-first-design-paterns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Netbeans 6.9 M1</title>
		<link>http://nexik.net/netbeans-6-9-m1/</link>
		<comments>http://nexik.net/netbeans-6-9-m1/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 05:37:22 +0000</pubDate>
		<dc:creator>nexik</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Milestone]]></category>
		<category><![CDATA[Netbeans]]></category>
		<category><![CDATA[Standardy kodowania]]></category>

		<guid isPermaLink="false">http://nexik.net/?p=789</guid>
		<description><![CDATA[Po achach i ochach nad Netbeans 6.8, zrobiło się gorąco w internecie na temat kierunku rozwoju Netbeans. Oczywiście mnie interesuje tylko część PHP, więc byłem ciekaw co jeszcze można dodać do IDE dla PHP]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/Screenshot-Starting-NetBeans-IDE.png"><img class="size-full wp-image-790  aligncenter" title="Screenshot-Starting NetBeans IDE" src="http://nexik.net/wp-content/uploads/2010/02/Screenshot-Starting-NetBeans-IDE.png" alt="" width="487" height="314" /></a></p>
<p>Po achach i ochach nad Netbeans 6.8, zrobiło się gorąco w internecie na temat kierunku rozwoju Netbeans. Oczywiście mnie interesuje tylko część PHP, więc byłem ciekaw co jeszcze można dodać do IDE dla PHP. Już w w wersji 6.8 mieliśmy dobry refactoring, genialne podpowiadanie składni z okienkiem PHPDoc (Eclipse też to ma, ale tam okienko z PHPDoc jest tak małe że nie da się z tego nic wyczytać przy dłuższej dokumentacji). Połączenia z bazami danych z podpowiadaniem <strong>zapytań SQL</strong>, wsparcie <strong>PHPUnit</strong>, <strong>Symfony Framework</strong> czy obsługi różnych <strong>API</strong>, m.in. twittera to już funkcje z płatnych i drogich platform koderskich.</p>
<p style="text-align: center;"><img class="aligncenter size-large wp-image-794" title="3352116829_314f672fbb_b" src="http://nexik.net/wp-content/uploads/2010/02/3352116829_314f672fbb_b-500x375.jpg" alt="" width="500" height="375" /></p>
<p>W 6.9 natomiast drużyna pracująca nad IDE wprowadziła nowe funkcje o których nie wiedziałem że się przydadzą do momentu aż ich nie zobaczyłem :) Ale najpierw o czymś co jest najczęściej podawane jako killer feature w 6.9 czyli wsparcie do <strong>Zend Framework</strong>. Bardzo fajne i intuicyjne GUI dla Zend_Tool. Niestety w w wersji 1 kamienia milowego nie działa dla projektów już istniejących, udało mi się załadować wsparcie tylko do nowych projektów.</p>
<p>Mimo, że bardzo lubie Zend Framework to większe wrażenie zrobiło na mnie ulepszenia w podpowiadaniu składni a dokładnie z wzbogaceniem bibliotek PHPDoc do Wyjątków, Iteratorów czy rozszerzeń takich jak mysqli. Ostatnią rzeczą jaką zauważyłem  w nowej wersji są ustalenia formatowania kodu.</p>
<p>Teraz można ustalić gdzie mają być nawiasy klamrowe (tzn w tej samej linii czy następnej), jakie mają być w cięcia przy listowaniu elementów tablic. Najbardziej użyteczna funkcja to chya jednak wcięć przy kontynuacji(tzn. jak mają wyglądać wcięcia przy wykonywaniu poleceń łańców, często wykorzystywanych przy wzorcu projektowym <strong>Fabryka</strong>) Opcji jest naprawdę multum, oto lista opcji dotyczących wolnych linii w różnych miejscach oraz poniżej liczbę spacji:</p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/blank_lines.jpg"><img class="aligncenter size-large wp-image-791" title="blank_lines" src="http://nexik.net/wp-content/uploads/2010/02/blank_lines-500x424.jpg" alt="" width="500" height="424" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/spaces.jpg"><img class="aligncenter size-large wp-image-792" title="spaces" src="http://nexik.net/wp-content/uploads/2010/02/spaces-500x424.jpg" alt="" width="500" height="424" /></a></p>
<p>Teraz już nie ma mowy że w zespole ktoś powie że nie dostosował się do zasad formatowania w grupie, ponieważ tak a nie inaczej IDE generuje mu kod. Prawdziwy raj dla maniaków standardów kodowania.</p>
]]></content:encoded>
			<wfw:commentRss>http://nexik.net/netbeans-6-9-m1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>50 Najlepszych Tapet Final Fantasy</title>
		<link>http://nexik.net/xx-najlepszych-tapet-final-fantasy/</link>
		<comments>http://nexik.net/xx-najlepszych-tapet-final-fantasy/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 06:00:45 +0000</pubDate>
		<dc:creator>nexik</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[Final Fantasy]]></category>
		<category><![CDATA[Pulpit]]></category>
		<category><![CDATA[Square Enix]]></category>
		<category><![CDATA[Tapety]]></category>

		<guid isPermaLink="false">http://nexik.net/?p=722</guid>
		<description><![CDATA[
Final Fantasy to jedna z najpopularniejszych gier RPG na konsole. Uwielbiam tę serię za to, że każda kolejna edycja to całkowicie inny świat a jednocześnie genialny klimat pozostaje :) Poniżej lista najlepszych według mnie tapet z gier Final Fantasy.
















































]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/tifa.jpg"><img class="aligncenter size-full wp-image-724" title="tifa" src="http://nexik.net/wp-content/uploads/2010/02/tifa.jpg" alt="" width="480" height="731" /></a></p>
<p>Final Fantasy to jedna z najpopularniejszych gier RPG na konsole. Uwielbiam tę serię za to, że każda kolejna edycja to całkowicie inny świat a jednocześnie genialny klimat pozostaje :) Poniżej lista najlepszych według mnie tapet z gier Final Fantasy.</p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/4008-Final-Fantasy-1-uqriv.jpg"><img class="size-large wp-image-726  aligncenter" title="4008-Final-Fantasy-1-uqriv" src="http://nexik.net/wp-content/uploads/2010/02/4008-Final-Fantasy-1-uqriv-500x375.jpg" alt="" width="500" height="375" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/4013-Final-Fantasy-1-blqjn.jpg"><img class="size-large wp-image-727  aligncenter" title="4013-Final-Fantasy-1-blqjn" src="http://nexik.net/wp-content/uploads/2010/02/4013-Final-Fantasy-1-blqjn-500x375.jpg" alt="" width="500" height="375" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/4037-Final-Fantasy-3-skfyp.jpg"><img class="size-large wp-image-729  aligncenter" title="4037-Final-Fantasy-3-skfyp" src="http://nexik.net/wp-content/uploads/2010/02/4037-Final-Fantasy-3-skfyp-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/4041-Final-Fantasy-3-qnquh.jpg"><img class="size-large wp-image-730  aligncenter" title="4041-Final-Fantasy-3-qnquh" src="http://nexik.net/wp-content/uploads/2010/02/4041-Final-Fantasy-3-qnquh-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/1225-final-fantasy7-007-qcxev.jpg"><img class="size-large wp-image-731    aligncenter" title="1225-final-fantasy7-007-qcxev" src="http://nexik.net/wp-content/uploads/2010/02/1225-final-fantasy7-007-qcxev-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/1239-final-fantasy7-021-ibjri.jpg"><img class="size-large wp-image-732    aligncenter" title="1239-final-fantasy7-021-ibjri" src="http://nexik.net/wp-content/uploads/2010/02/1239-final-fantasy7-021-ibjri-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/1297-final-fantasy8-029-atayz.jpg"><img class="size-large wp-image-734    aligncenter" title="1297-final-fantasy8-029-atayz" src="http://nexik.net/wp-content/uploads/2010/02/1297-final-fantasy8-029-atayz-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/1313-final-fantasy8-045-zntun.jpg"><img class="size-large wp-image-735  aligncenter" title="1313-final-fantasy8-045-zntun" src="http://nexik.net/wp-content/uploads/2010/02/1313-final-fantasy8-045-zntun-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/3984-Final-Fantasy-8-jvqom.jpg"><img class="size-large wp-image-736  aligncenter" title="3984-Final-Fantasy-8-jvqom" src="http://nexik.net/wp-content/uploads/2010/02/3984-Final-Fantasy-8-jvqom-500x375.jpg" alt="" width="500" height="375" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/1318-final-fantasy8-050-otido.jpg"><img class="size-large wp-image-737  aligncenter" title="1318-final-fantasy8-050-otido" src="http://nexik.net/wp-content/uploads/2010/02/1318-final-fantasy8-050-otido-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/1314-final-fantasy8-046-rokhm.jpg"><img class="size-large wp-image-738  aligncenter" title="1314-final-fantasy8-046-rokhm" src="http://nexik.net/wp-content/uploads/2010/02/1314-final-fantasy8-046-rokhm-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/1317-final-fantasy8-049-mqieq.jpg"><img class="size-large wp-image-739  aligncenter" title="1317-final-fantasy8-049-mqieq" src="http://nexik.net/wp-content/uploads/2010/02/1317-final-fantasy8-049-mqieq-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/1359-final-fantasy9-038-skqnn.jpg"><img class="size-large wp-image-742  aligncenter" title="1359-final-fantasy9-038-skqnn" src="http://nexik.net/wp-content/uploads/2010/02/1359-final-fantasy9-038-skqnn-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/1360-final-fantasy9-039-wyaxq.jpg"><img class="size-large wp-image-743  aligncenter" title="1360-final-fantasy9-039-wyaxq" src="http://nexik.net/wp-content/uploads/2010/02/1360-final-fantasy9-039-wyaxq-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/1361-final-fantasy9-040-ieaso.jpg"><img class="size-large wp-image-744  aligncenter" title="1361-final-fantasy9-040-ieaso" src="http://nexik.net/wp-content/uploads/2010/02/1361-final-fantasy9-040-ieaso-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/1362-final-fantasy9-041-olnnj.jpg"><img class="size-large wp-image-745  aligncenter" title="1362-final-fantasy9-041-olnnj" src="http://nexik.net/wp-content/uploads/2010/02/1362-final-fantasy9-041-olnnj-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/1363-final-fantasy9-042-ysezv.jpg"><img class="size-large wp-image-746  aligncenter" title="1363-final-fantasy9-042-ysezv" src="http://nexik.net/wp-content/uploads/2010/02/1363-final-fantasy9-042-ysezv-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/1364-final-fantasy9-043-wuavh.jpg"><img class="aligncenter size-large wp-image-747" title="1364-final-fantasy9-043-wuavh" src="http://nexik.net/wp-content/uploads/2010/02/1364-final-fantasy9-043-wuavh-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/1365-final-fantasy9-044-cuzwt.jpg"><img class="size-large wp-image-748  aligncenter" title="1365-final-fantasy9-044-cuzwt" src="http://nexik.net/wp-content/uploads/2010/02/1365-final-fantasy9-044-cuzwt-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/1366-final-fantasy9-045-qohlj.jpg"><img class="size-large wp-image-749  aligncenter" title="1366-final-fantasy9-045-qohlj" src="http://nexik.net/wp-content/uploads/2010/02/1366-final-fantasy9-045-qohlj-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/4055-Final-Fantasy-7-Dirge-of-Cerberus-fwwhf.jpg"><img class="aligncenter size-large wp-image-752" title="4055-Final-Fantasy-7-Dirge-of-Cerberus-fwwhf" src="http://nexik.net/wp-content/uploads/2010/02/4055-Final-Fantasy-7-Dirge-of-Cerberus-fwwhf-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/4061-Final-Fantasy-7-Dirge-of-Cerberus-sowbh.jpg"><img class="aligncenter size-large wp-image-753" title="4061-Final-Fantasy-7-Dirge-of-Cerberus-sowbh" src="http://nexik.net/wp-content/uploads/2010/02/4061-Final-Fantasy-7-Dirge-of-Cerberus-sowbh-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/final-fantasy.jpg"><img class="aligncenter size-large wp-image-754" title="final-fantasy" src="http://nexik.net/wp-content/uploads/2010/02/final-fantasy-500x400.jpg" alt="" width="500" height="400" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/final-fantasy-7-crisis-core-cloud-strife-6973625-1024-768.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/final-fantasy-7-crisis-core-cloud-strife-6973625-1024-768-500x400.jpg" alt="" title="final-fantasy-7-crisis-core-cloud-strife-6973625-1024-768" width="500" height="400" class="aligncenter size-large wp-image-755" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/griffin-1-2.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/griffin-1-2-500x375.jpg" alt="" title="griffin-1-2" width="500" height="375" class="aligncenter size-large wp-image-756" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/Konachan.com-32077-final_fantasy-final_fantasy_vii-final_fantasy_vii_advent_children-tifa_lockhart.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/Konachan.com-32077-final_fantasy-final_fantasy_vii-final_fantasy_vii_advent_children-tifa_lockhart-500x400.jpg" alt="" title="Konachan.com---32077-final_fantasy-final_fantasy_vii-final_fantasy_vii_advent_children-tifa_lockhart" width="500" height="400" class="aligncenter size-large wp-image-757" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/sephiroth-by-selena.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/sephiroth-by-selena-500x400.jpg" alt="" title="sephiroth-by-selena" width="500" height="400" class="aligncenter size-large wp-image-758" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/sis-179-.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/sis-179--500x400.jpg" alt="" title="sis--179-" width="500" height="400" class="aligncenter size-large wp-image-759" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/3NyxEtienne-1-2.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/3NyxEtienne-1-2-500x375.jpg" alt="" title="3NyxEtienne-1-2" width="500" height="375" class="aligncenter size-large wp-image-760" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/1172-final-fantasy10-006-oqwpw.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/1172-final-fantasy10-006-oqwpw-500x400.jpg" alt="" title="1172-final-fantasy10-006-oqwpw" width="500" height="400" class="aligncenter size-large wp-image-761" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/1185-final-fantasy10-021-lqanh.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/1185-final-fantasy10-021-lqanh-500x400.jpg" alt="" title="1185-final-fantasy10-021-lqanh" width="500" height="400" class="aligncenter size-large wp-image-762" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/suwandi-1-2.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/suwandi-1-2-500x375.jpg" alt="" title="suwandi-1-2" width="500" height="375" class="aligncenter size-large wp-image-763" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/wall749.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/wall749-500x400.jpg" alt="" title="wall749" width="500" height="400" class="aligncenter size-large wp-image-764" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/4067-Final-Fantasy-X-2-zlozx.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/4067-Final-Fantasy-X-2-zlozx-500x375.jpg" alt="" title="4067-Final-Fantasy-X-2-zlozx" width="500" height="375" class="aligncenter size-large wp-image-765" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/4070-Final-Fantasy-X-2-ifzgi.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/4070-Final-Fantasy-X-2-ifzgi-500x375.jpg" alt="" title="4070-Final-Fantasy-X-2-ifzgi" width="500" height="375" class="aligncenter size-large wp-image-766" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/4078-Final-Fantasy-X-2-zufkn1.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/4078-Final-Fantasy-X-2-zufkn1-500x375.jpg" alt="" title="4078-Final-Fantasy-X-2-zufkn" width="500" height="375" class="aligncenter size-large wp-image-770" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/Happy-Valentines-Day.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/Happy-Valentines-Day-500x400.jpg" alt="" title="Happy-Valentines-Day" width="500" height="400" class="aligncenter size-large wp-image-771" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/yuna_anime_style.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/yuna_anime_style-500x400.jpg" alt="" title="yuna_anime_style" width="500" height="400" class="aligncenter size-large wp-image-772" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/lionheartace-1-2.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/lionheartace-1-2-500x375.jpg" alt="" title="lionheartace-1-2" width="500" height="375" class="aligncenter size-large wp-image-773" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/4096-Final-Fantasy-12-gyzgm.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/4096-Final-Fantasy-12-gyzgm-500x400.jpg" alt="" title="4096-Final-Fantasy-12-gyzgm" width="500" height="400" class="aligncenter size-large wp-image-774" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/4098-Final-Fantasy-12-sqnsh.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/4098-Final-Fantasy-12-sqnsh-500x400.jpg" alt="" title="4098-Final-Fantasy-12-sqnsh" width="500" height="400" class="aligncenter size-large wp-image-775" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/4188-Final-Fantasy-13-qwles.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/4188-Final-Fantasy-13-qwles-500x400.jpg" alt="" title="4188-Final-Fantasy-13-qwles" width="500" height="400" class="aligncenter size-large wp-image-776" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/4192-Final-Fantasy-13-sjdrq.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/4192-Final-Fantasy-13-sjdrq-500x375.jpg" alt="" title="4192-Final-Fantasy-13-sjdrq" width="500" height="375" class="aligncenter size-large wp-image-777" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/FFIIIX.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/FFIIIX-500x400.jpg" alt="" title="FFIIIX" width="500" height="400" class="aligncenter size-large wp-image-778" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/Final-fanatasy-13-1280x800.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/Final-fanatasy-13-1280x800-500x400.jpg" alt="" title="Final-fanatasy-13--1280x800" width="500" height="400" class="aligncenter size-large wp-image-779" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/Fang_1280x1024_v1.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/Fang_1280x1024_v1-500x400.jpg" alt="" title="Fang_1280x1024_v1" width="500" height="400" class="aligncenter size-large wp-image-780" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/FFXIII_Wallpaper4_1280x1024_UK.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/FFXIII_Wallpaper4_1280x1024_UK-500x400.jpg" alt="" title="FFXIII_Wallpaper4_1280x1024_UK" width="500" height="400" class="aligncenter size-large wp-image-781" /></a></p>
<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/Vanille_1600x1200_02_v2.jpg"><img src="http://nexik.net/wp-content/uploads/2010/02/Vanille_1600x1200_02_v2-500x375.jpg" alt="" title="Vanille_1600x1200_02_v2" width="500" height="375" class="aligncenter size-large wp-image-782" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://nexik.net/xx-najlepszych-tapet-final-fantasy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TOP 5 skórek do Launchy</title>
		<link>http://nexik.net/top-5-skorek-do-launchy/</link>
		<comments>http://nexik.net/top-5-skorek-do-launchy/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 16:05:24 +0000</pubDate>
		<dc:creator>nexik</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[Launchy]]></category>
		<category><![CDATA[Skórki]]></category>

		<guid isPermaLink="false">http://nexik.net/?p=695</guid>
		<description><![CDATA[Launchy to program do szybkiego uruchamiania aplikacji w systemie Windows. Jest on znacznie lepszy i wydajniejszy od starego Menu Start. Prezentuje liste 5 pięknych skórek do programu Launchy.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://nexik.net/wp-content/uploads/2010/02/1.jpg"><img class="size-full wp-image-697  aligncenter" title="1" src="http://nexik.net/wp-content/uploads/2010/02/1.jpg" alt="" width="510" height="322" /></a></p>
<p style="text-align: left;">Launchy to program do szybkiego uruchamiania aplikacji w systemie Windows. Jest on znacznie lepszy i wydajniejszy od starego Menu Start. Poniżej lista według mnie najlepszych skórek dla Launchy:</p>
<h3><a href="http://greemer.deviantart.com/art/Panda-Skin-124699443">1. Panda Skin</a></h3>
<p style="text-align:center"><a href="http://greemer.deviantart.com/art/Panda-Skin-124699443"><img src="http://nexik.net/wp-content/uploads/2010/02/Panda_Skin_by_greemer-e1266094101319.jpg" alt="" title="Panda_Skin_by_greemer" width="450" height="230" class="aligncenter size-full wp-image-707" /></a></p>
<p>Najbardziej kreatywna skórka dla Launchy którą widziałem. Ikonki aplikacji pojawiają się w chmurce a sama Panda jest poprostu cool:)</p>
<h3><a href="http://greemer.deviantart.com/art/Cat-Launchy-Skin-123667144">2. Cat Launchy Skin</a></h3>
<p style="text-align:center"><a href="http://greemer.deviantart.com/art/Cat-Launchy-Skin-123667144"><img class="aligncenter size-full wp-image-698" title="Cat_Launchy_Skin_by_greemer" src="http://nexik.net/wp-content/uploads/2010/02/Cat_Launchy_Skin_by_greemer-e1266087199506.jpg" alt="" width="450" height="128" class="aligncenter"/></a></p>
<p>Do domyślnej skorki został dodany kotek :) Niby nic wielkiego a znacznie ożywia cały system. Dla miłośników kotów skórka z kategorii <strong>muszę to mieć</strong>.</p>
<h3><a href="http://kabuquejoe.deviantart.com/art/Fuzion-Skin-114701369">3. Fuzion Skin</a></h3>
<p style="text-align:center"><a href="http://kabuquejoe.deviantart.com/art/Fuzion-Skin-114701369"><img src="http://nexik.net/wp-content/uploads/2010/02/fuzion.jpg" alt="" title="fuzion" width="450" height="192" class="aligncenter size-full wp-image-712" /></a></p>
<p>Bardzo fajna skórka. Aktualnie z niej korzystam w domu. Jest trochę większa od innych, dlatego Launchy w tej skórce jest umiejscowiony u mnie na środku pulpitu (normalnie na dole pulpitu). Bardzo fajna, polecam!</p>
<h3><a href="hhttp://gocom.deviantart.com/art/LaunchyOlivia-101280265">4. Launchy Olivia</a></h3>
<p style="text-align:center"><a href="http://gocom.deviantart.com/art/LaunchyOlivia-101280265"><img src="http://nexik.net/wp-content/uploads/2010/02/LaunchyOlivia_by_Gocom-e1266093330873.png" alt="" title="LaunchyOlivia_by_Gocom" width="450" height="179" class="aligncenter size-full wp-image-704" /></a></p>
<p>Olivia jest jedną z tych dość surowych ale ładnie się prezentujących skórek. Pasuje do schludnie wyglądając pulpitów. W przypadku jednak kreatywnych ludzi jest trochę odpychająca.</p>
<h3><a href="http://celldrifter.deviantart.com/art/WMP10-Remix-Launchy-2-Skin-77938058">5. WMP10 Remix Launchy 2 Skin</a></h3>
<p style="text-align:center"><a href="http://gocom.deviantart.com/art/LaunchyOlivia-101280265"><img src="http://nexik.net/wp-content/uploads/2010/02/WMP10_Remix_Launchy_2_Skin_by_celldrifter-e1266093732347.jpg" alt="" title="WMP10_Remix_Launchy_2_Skin_by_celldrifter" width="450" height="233" class="aligncenter size-full wp-image-705" /></a></p>
<p>Lubisz nowego Windows Media Player 10? To wtedy skórka może ci się spodobać. Dla wszystkich maniaków Microsoftu;p</p>
]]></content:encoded>
			<wfw:commentRss>http://nexik.net/top-5-skorek-do-launchy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Buzz</title>
		<link>http://nexik.net/google-buzz/</link>
		<comments>http://nexik.net/google-buzz/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 20:53:03 +0000</pubDate>
		<dc:creator>nexik</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Google Buzz]]></category>
		<category><![CDATA[Google Chrome]]></category>
		<category><![CDATA[Social]]></category>
		<category><![CDATA[Społeczność]]></category>

		<guid isPermaLink="false">http://nexik.net/?p=679</guid>
		<description><![CDATA[Kilka dni temu Google wypuściło nowy produkt pod nazwą Google Buzz. Jest to w skrócie połączenie Gmaila z Twitterem ;p Z buzza można skorzystać przechodząc na stronę <a href="http://buzz.google.com/">http://buzz.google.com/</a> gdzie czeka nas krotki 2 minutowy filmik zachęcający do skorzystania z Google Buzz:]]></description>
			<content:encoded><![CDATA[<p><a href="http://nexik.net/wp-content/uploads/2010/02/googlebuzz_608.jpg"><img class="aligncenter size-full wp-image-678" title="googlebuzz_608" src="http://nexik.net/wp-content/uploads/2010/02/googlebuzz_608.jpg" alt="" width="500" height="267" /></a></p>
<p>Kilka dni temu Google wypuściło nowy produkt pod nazwą Google Buzz. Jest to w skrócie połączenie Gmaila z Twitterem ;p Jeżeli masz godzinkę wolnego zachęcam do wysłuchania konferencji z uruchomienia Google Buzz:</p>
<p><object width="500" height="315"><param name="movie" value="http://www.youtube-nocookie.com/v/JuThg91-4Nw&#038;hl=pl_PL&#038;fs=1&#038;rel=0&#038;hd=1&#038;border=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/JuThg91-4Nw&#038;hl=pl_PL&#038;fs=1&#038;rel=0&#038;hd=1&#038;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="315"></embed></object></p>
<p>Z buzza można skorzystać przechodząc na stronę <a href="http://buzz.google.com/">http://buzz.google.com/</a> gdzie czeka nas krotki 2 minutowy filmik zachęcający do skorzystania z Google Buzz:</p>
<p><object width="500" height="315"><param name="movie" value="http://www.youtube-nocookie.com/v/yi50KlsCBio&#038;hl=pl_PL&#038;fs=1&#038;rel=0&#038;hd=1&#038;border=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/yi50KlsCBio&#038;hl=pl_PL&#038;fs=1&#038;rel=0&#038;hd=1&#038;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="315"></embed></object></p>
<h3>Buzzowe dodatki do przeglądarek</h3>
<h4><a href="https://chrome.google.com/extensions/detail/fmmaomnifgiheomcnmiginicjpkdngok">Google Buzz Dla Google Chrome</a></h4>
<p style="text-align:center"><img src="http://nexik.net/wp-content/uploads/2010/02/buzz_chrome.jpg" alt="" title="buzz_chrome" width="383" height="657" class="aligncenter size-full wp-image-685" /></p>
<h4><a href="https://addons.mozilla.org/en-US/firefox/addon/75917">Buzz It Dla Mozilla Firefox</a></h4>
<p style="text-align:center"><img src="http://nexik.net/wp-content/uploads/2010/02/buzz_it.png" alt="" title="buzz_it" width="200" height="150" class="aligncenter size-full wp-image-691" /></p>
<h3>Tips &#038; Tricks do Google Buzz</h3>
<p>W Google Buzz są dostępne wszystkie skróty klawiszowe z Gmaila. Tak więc aby przejść do następnego buzza wystarczy kliknąć <strong>n</strong> (next) a do poprzedniej <strong>p</strong> (previous). Jeżeli jednak nie interesuje nas jakiś buzz, to poprostu po zaznaczeniu wybieramy klawisz <strong>m</strong> (muted). Taki buzz się nie pojawi się nam w naszym kanale.</p>
<p>Google Buzz ląduje defaultowo w naszej skrzydce odbiorczej, niestety gdy bedziemy podążać za dużą listą osób które bazzują nasza skrzynka może się zapchać, a tego nie chcemy dlatego najlepiej stworzyć filtr. Podczas tworzenia filtru wybieramy zasadę <strong>zawiera słowa</strong> i wpisujemy <strong>label:buzz</strong>. Klikamy dalej i wybieramy <strong>pomiń folder Odebrane (Archiwizuj)</strong>. Gotowe :)</p>
<p>Jak wam się znudzi Buzz to na dole gmaila jest link wyłącz buzz.</p>
]]></content:encoded>
			<wfw:commentRss>http://nexik.net/google-buzz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
