<?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>m1chu.eu - another devblog &#187; Webhosting</title>
	<atom:link href="http://m1chu.eu/category/ogolne/webhosting/feed/" rel="self" type="application/rss+xml" />
	<link>http://m1chu.eu</link>
	<description>we live, as we dream... alone - another devblog</description>
	<lastBuildDate>Fri, 25 Jun 2010 22:04:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Natchnienia warte uwagi &#8211; przegląd startupów #1 &#8211; maj 2010</title>
		<link>http://m1chu.eu/2010/05/31/natchnienia-warte-uwagi-przeglad-startupow-1-maj-2010/</link>
		<comments>http://m1chu.eu/2010/05/31/natchnienia-warte-uwagi-przeglad-startupow-1-maj-2010/#comments</comments>
		<pubDate>Mon, 31 May 2010 21:36:35 +0000</pubDate>
		<dc:creator>m1chu</dc:creator>
				<category><![CDATA[Natchnienia]]></category>
		<category><![CDATA[Webhosting]]></category>
		<category><![CDATA[firm]]></category>
		<category><![CDATA[kupno]]></category>
		<category><![CDATA[nauka]]></category>
		<category><![CDATA[platforma]]></category>
		<category><![CDATA[projekt]]></category>
		<category><![CDATA[przeglądarka]]></category>
		<category><![CDATA[reklama]]></category>
		<category><![CDATA[sprzedaż]]></category>
		<category><![CDATA[startup]]></category>
		<category><![CDATA[szkoła]]></category>
		<category><![CDATA[telewizja]]></category>
		<category><![CDATA[wyszukiwarka]]></category>
		<category><![CDATA[zabawa]]></category>
		<category><![CDATA[zakupy]]></category>
		<category><![CDATA[zarządzanie]]></category>

		<guid isPermaLink="false">http://m1chu.eu/?p=1800</guid>
		<description><![CDATA[
Kolejna część natchnień wartych uwagi, a pierwsza dotycząca przeglądu tegorocznych startupów. Poniżej przedstawiam 21 ciekawych i godnych uwagi pozycji&#8230;

Śledzi osoby surfujące po stronie internetowej.
Społecznościowy menedżer zadań.
Telewizyjna przeglądarka internetowa.
Video-chat z losowymi użytkownikami.
Aplikacja do zarządzania projektami.
Organizator skrzynek e-mail.
Serwis oferujący skrypt Twitteropodobny.
Pozwala na stworzenie aplikacji mobilnej.
Umożliwia znalezienie najlepszych miejsc do pracy w delegacji.
Internetowy kalendarz z możliwością współdzielenia jego [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfcG9zdF9oZWFkZXIucG5n" alt="Gotowe wyrażenia regularne" style="height: 119px;" /></p>
<p>Kolejna część natchnień wartych uwagi, a pierwsza dotycząca przeglądu tegorocznych startupów. Poniżej przedstawiam <strong>21</strong> ciekawych i godnych uwagi pozycji&#8230;</p>
<p><span id="more-1800"></span></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://ghostrec.com/"  title="Ghostrec.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMDFfZ2hvc3RyZWMucG5n" alt="Ghostrec.com" style="height: 237px;" /></a><br />Śledzi osoby surfujące po stronie internetowej.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://en.reddynote.com/"  title="Reddynote.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMDJfcmVkZHlub3RlLnBuZw==" alt="Reddynote.com" style="height: 237px;" /></a><br />Społecznościowy menedżer zadań.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://kylo.tv/"  title="Kylo.tv"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMDNfa3lsby5wbmc=" alt="Kylo.tv" style="height: 237px;" /></a><br />Telewizyjna przeglądarka internetowa.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://camchatscript.com/"  title="Camchatscript.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMDRfY2FtY2hhdC5wbmc=" alt="Camchatscript.com" style="height: 215px;" /></a><br />Video-chat z losowymi użytkownikami.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://doolphy.com/"  title="Doolphy.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMDVfZG9vbHBoeS5wbmc=" alt="Doolphy.com" style="height: 215px;" /></a><br />Aplikacja do zarządzania projektami.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://awayfind.com/"  title="Awayfind.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMDZfYXdheWZpbmQucG5n" alt="Awayfind.com" style="height: 215px;" /></a><br />Organizator skrzynek e-mail.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://twitter-script.com/"  title="Twitter-script.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMDdfdHdpdHRlcnNjcmlwdC5wbmc=" alt="Twitter-script.com" style="height: 215px;" /></a><br />Serwis oferujący skrypt Twitteropodobny.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://zerista.com/"  title="Zerista.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMDhfemVyaXN0YS5wbmc=" alt="Zerista.com" style="height: 215px;" /></a><br />Pozwala na stworzenie aplikacji mobilnej.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://worksnug.com/"  title="Worksnug.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMDlfd29ya3NudWcucG5n" alt="Worksnug.com" style="height: 215px;" /></a><br />Umożliwia znalezienie najlepszych miejsc do pracy w delegacji.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://calendarfly.com/"  title="Calendarfly.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMTBfY2FsZW5kYXJmbHkucG5n" alt="Calendarfly.com" style="height: 215px;" /></a><br />Internetowy kalendarz z możliwością współdzielenia jego pól.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://supercoolschool.com/"  title="Supercoolschool.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMTFfc3VwY3MucG5n" alt="Supercoolschool.com" style="height: 215px;" /></a><br />Kreator wirtualnej szkoły.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://football.picklive.com/"  title="Footbal.picklive.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMTJfcGlja2xpdmUucG5n" alt="Footbal.picklive.com" style="height: 215px;" /></a><br />Piłka nożna na żywo.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://strings.com/"  title="Strings.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMTNfc3RyaW5ncy5wbmc=" alt="Strings.com" style="height: 215px;" /></a><br />Usługa badająca aktywność użytkownika i na jej podstawie dobierająca odpowiednią dla niego treść.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://bizilla.com/"  title="Bizilla.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMTRfYml6aWxsYS5wbmc=" alt="Bizilla.com" style="height: 215px;" /></a><br />Sprzedaż i kupno biznesu.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://blarket.com/"  title="Blarket.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMTVfYmxhcmtldC5wbmc=" alt="Blarket.com" style="height: 215px;" /></a><br />Usługa, podobnie jak powyższa, pozwala na kupno i sprzedaż serwisów internetowych.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://tivix.pl/"  title="Tivix.pl"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMTZfdGl2aXgucG5n" alt="Tivix.pl" style="height: 215px;" /></a><br />Platforma dyskusji na temat ulubionych programów telewizyjnych.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://soluto.com/"  title="Soluto.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMTdfc29sdXRvLnBuZw==" alt="Soluto.com" style="height: 215px;" /></a><br />Aplikacja monitorująca stan komputera.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://movieclips.com/"  title="Movieclips.com"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMThfbW92aWVjbGlwcy5wbmc=" alt="Movieclips.com" style="height: 215px;" /></a><br />Serwis oferujący ulubione fragmenty filmowe.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://fablo.pl/"  title="Fablo.pl"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMTlfZmFibG8ucG5n" alt="Fablo.pl" style="height: 215px;" /></a><br />Silnik wyszukiwarki dla sklepów internetowych.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://citisniper.pl/"  title="Citysniper.pl"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMjBfY2l0eXNuaXBlci5wbmc=" alt="Citisniper.pl" style="height: 215px;" /></a><br />Platforma grupowych zakupów.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.admongo.gov/"  title="Admongo.gov"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MzBfMDVfMTBfc3RhcnR1cHM7c3RhcnR1cHNfMjFfYWRtb25nby5wbmc=" alt="Admongo.gov" style="height: 215px;" /></a><br />Nauka o reklamach w formie zabawy.</p>
]]></content:encoded>
			<wfw:commentRss>http://m1chu.eu/2010/05/31/natchnienia-warte-uwagi-przeglad-startupow-1-maj-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML 5: obsługa elementów AUDIO i VIDEO</title>
		<link>http://m1chu.eu/2010/03/19/html5-obsluga-elementow-audio-i-video/</link>
		<comments>http://m1chu.eu/2010/03/19/html5-obsluga-elementow-audio-i-video/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 21:14:33 +0000</pubDate>
		<dc:creator>m1chu</dc:creator>
				<category><![CDATA[(x)HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Webhosting]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[elementy]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html 5]]></category>
		<category><![CDATA[natywnie]]></category>
		<category><![CDATA[object]]></category>
		<category><![CDATA[opera]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[tagi]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://m1chu.eu/?p=1752</guid>
		<description><![CDATA[
Serwisów oferujących przeglądanie zasobów multimedialnych nie brakuje w sieci. Do niedawna jednak wszystkie oparte były o wykorzystanie możliwości znaczników object lub niepoprawnego embed. Problem w tym, że rozwiązania te opierały się o wtyczki firm trzecich, takie jak QuickTime, czy Flash. HTML 5 standaryzuje osadzanie plików muzycznych i filmów.

Kwestia dźwiękowa: element AUDIO
Jedna z najbardziej, od dawna [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MTlfMDNfMTBfaHRtbDVfYXVkaW9fdmlkZW87aHRtbDVfYXVkaW9fdmlkZW9fcG9zdF9oZWFkZXIucG5n" alt="HTML5: obsługa elementów AUDIO i VIDEO" style="height: 119px;" /></p>
<p>Serwisów oferujących przeglądanie zasobów multimedialnych nie brakuje w sieci. Do niedawna jednak wszystkie oparte były o wykorzystanie możliwości znaczników <code><a href="http://m1chu.eu/2008/12/14/jak-poprawnie-osadzic-flasha-w-kodzie-xhtml-strony/"  title="Jak poprawnie osadzić Flasha w kodzie (x)HTML strony?">object</a></code> lub niepoprawnego <code>embed</code>. Problem w tym, że rozwiązania te opierały się o wtyczki firm trzecich, takie jak QuickTime, czy Flash. HTML 5 standaryzuje osadzanie plików muzycznych i filmów.</p>
<p><span id="more-1752"></span></p>
<h2>Kwestia dźwiękowa: element AUDIO</h2>
<p>Jedna z najbardziej, od dawna oczekiwanych możliwości w HTML 5. Pozwala na natywne odtwarzanie utworów muzycznych w przeglądarce. Określana znacznikiem <code><a target="_blank" href="http://utnij.eu/html5_audio/"  title="Specyfikacja: audio">audio</a></code>.</p>
<p>Wg. specyfikacji może przyjmować pięć atrybutów:</p>
<ul>
<li><code><a target="_blank" href="http://utnij.eu/html5_video_autoplay/"  title="Specyfikacja: autoplay">autoplay</a></code> &#8211; określa czy odtwarzać automatycznie dźwięk, gdy zostanie on załadowany,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_video_controls/"  title="Specyfikacja: controls">controls</a></code> &#8211; określa czy wyświetlić odtwarzacz w standardowym układzie,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_video_loop/"  title="Specyfikacja: loop">loop</a></code> &#8211; określa czy powtarzać odtwarzanie,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_video_preload/"  title="Specyfikacja: preload">preload</a></code> &#8211; wyznacza, czy załadować zasobów w trakcie ładowania strony,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_src/"  title="Specyfikacja: src">src</a></code> &#8211; adres URL do pierwotnego, ładowanego źródła.</li>
</ul>
<p>Korzystając z powyższych informacji możemy otrzymać następujący przykład:</p>
<pre class="brush: xml;">&lt;!-- domyślny układ, startuje automatycznie, jedno źródło --&gt;
&lt;audio src=&quot;test.ogg&quot; controls autoplay&gt;&lt;/audio&gt;</pre>
<p>W praktyce pojawi się jednak problem, związany z implementacją różnych wersji kodeków w przeglądarkach (np. Vorbis, Advanced Audio Coding, MPEG-1 Audio Layer 3). Z tego powodu, trzeba aktualnie definiować dodatkowe zasoby w tagu <code><a target="_blank" href="http://utnij.eu/html5_source/"  title="Specyfikacja: source">source</a></code>. Obsługuje on atrybuty:</p>
<ul>
<li><code><a target="_blank" href="http://utnij.eu/html5_media/"  title="Specyfikacja: media">media</a></code> &#8211; zdefiniowanie typu zasobu. Domyślnie odpowiada wszystkim typom mediów,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_src/"  title="Specyfikacja: src">src</a></code> &#8211; adres URL do pierwotnego, ładowanego źródła,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_type/"  title="Specyfikacja: type">type</a></code> &#8211; definiuje typ zasobu, pozwalając na określenie przeglądarce, czy może odtworzyć go, bez konieczności pobierania. Musi być pod postacią prawidłowego <a target="_blank" href="http://utnij.eu/valid-mime-type/"  title="Specyfikacja: typy MIME">typu MIME</a>. Opcjonalnie, wewnątrz niego można zdefiniować parametr <code>codecs</code>, określający jak zakodowany jest zasób.</li>
</ul>
<pre class="brush: xml;">&lt;!-- domyślny układ, startuje automatycznie, wiele źródeł --&gt;
&lt;audio controls autoplay&gt;
	&lt;!-- Firefox ge 3.5, Chrome ge 3 beta, Opera ge 10.5 --&gt;
	&lt;source src=&quot;test.ogg&quot; type=&quot;audio/ogg; codecs=vorbis&quot;&gt;
	&lt;!-- Safari ge 4, Chrome ge 3 beta --&gt;
	&lt;source src=&quot;test.mp3&quot;&gt;
	&lt;!-- Opera ge 10.5, Firefox ge 3.5 --&gt;
	&lt;source src=&quot;test.wav&quot;&gt;
&lt;/audio&gt;</pre>
<p>Na wypadek niekompatybilnej przeglądarki można wewnątrz elementu <code>audio</code> wstawić alternatywną wiadomość, bądź <a href="http://m1chu.eu/2008/12/14/jak-poprawnie-osadzic-flasha-w-kodzie-xhtml-strony/"  title="Jak poprawnie osadzić Flasha w kodzie (x)HTML strony?">plik Flash</a> z autorskim odtwarzaczem.</p>
<pre class="brush: xml;">&lt;!-- domyślny układ, startuje automatycznie, wiele źródeł --&gt;
&lt;audio controls autoplay&gt;
	&lt;!-- Firefox ge 3.5, Chrome ge 3 beta, Opera ge 10.5 --&gt;
	&lt;source src=&quot;test.ogg&quot; type=&quot;audio/ogg; codecs=vorbis&quot;&gt;
	&lt;!-- Safari ge 4, Chrome ge 3 beta --&gt;
	&lt;source src=&quot;test.mp3&quot;&gt;
	&lt;!-- Opera ge 10.5, Firefox ge 3.5 --&gt;
	&lt;source src=&quot;test.wav&quot;&gt;
	&lt;!-- alternatywny wynik --&gt;
	Twoja przeglądarka nie obsługuje HTML 5.
&lt;/audio&gt;</pre>
<p>W rozwiązaniu powyższego problemu pomóc może także użycie możliwości JavaScriptu i metod/atrybutów/zdarzeń dostępnych w API. Pozwalają one na manipulację na obsługiwanych plikach. Niestety skorzystanie z możliwości obiektu <code>Audio</code> nie będzie możliwe w jakiejkolwiek wersji IE.</p>
<ul>
<li><code><a target="_blank" href="http://utnij.eu/html5_buffered/"  title="Specyfikacja: buffered">buffered</a></code> &#8211; określa ilość oraz początkowy i końcowy czas zbuforowanego zasobu,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_canplaytype/"  title="Specyfikacja: canPlayType()">canPlayType(typ_MIME)</a></code> &#8211; zwraca informacje na temat tego, czy dany typ obsługiwany jest przez klienta. Możliwe wyniki to: <em>no</em>, <em>maybe</em>, <em>probably</em>,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_currenttime/"  title="Specyfikacja: currentTime">currentTime</a></code> &#8211; pozwala na ustawienie lub pobranie aktualnego czasu odtwarzania,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_duration/"  title="Specyfikacja: duration">duration</a></code> &#8211; wyświetla czas trwania utworu. W wypadku nie załadowania go, zwraca <strong>NaN</strong> (Not a Number),</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_ended/"  title="Specyfikacja: ended">ended</a></code> &#8211; zwraca prawdę, jeżeli zakończono odtwarzanie (w przód),</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_loop/"  title="Specyfikacja: loop">loop</a></code> &#8211; wartość logiczna, pozwalająca na zapętlanie dźwięku,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_muted/"  title="Specyfikacja: muted">muted</a></code> &#8211; zwraca lub ustawia, czy kanały audio są wyciszone,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_pause/"  title="Specyfikacja: pause()">pause()</a></code> &#8211; pauzuje odtwarzanie,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_paused/"  title="Specyfikacja: paused">paused</a></code> &#8211; przetrzymuje informacje o tym, czy element jest spauzowany,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_play/"  title="Specyfikacja: play()">play()</a></code> &#8211; wznawia odtwarzanie,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_played/"  title="Specyfikacja: played">played</a></code> &#8211; przetrzymuje informacje o odtwarzanym elemencie,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_volume/"  title="Specyfikacja: volume">volume</a></code> &#8211; zwraca lub ustawia głośność dźwięku w zakresie od 0.0&#8230;0.1.</li>
</ul>
<p>Przykład:</p>
<pre class="brush: xml;">&lt;p&gt;
	&lt;button type=&quot;button&quot; onclick=&quot;stop();&quot;&gt;Stop&lt;/button&gt;
	&lt;button type=&quot;button&quot; onclick=&quot;lour();&quot;&gt;Wycisz&lt;/button&gt;
&lt;/p&gt;</pre>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
var element = document.getElementById(&quot;audio&quot;); /* pobranie elementu */
function stop() { /* funkcja zatrzymująca */
	if ( !!(element.canPlayType) != false ) {
		element.currentTime = 0; /* ustawienie czasu na początek */
		element.pause(); /* pauza */
	}
}
function lour() { /* funkcja wyciszająca */
	if ( !!(element.canPlayType) != false ) {
		element.volume = 0; /* głośność na zero */
	}
}
&lt;/script&gt;</pre>
<p>Przykład z użyciem <code>new Audio()</code>:</p>
<pre class="brush: jscript;">var obj = new Audio('');
alert(!!(obj.canPlayType));</pre>
<h2>Kwestia filmowa: element VIDEO</h2>
<p>Drugi, ważny element HTML 5. Oparty o znacznik <code><a target="_blank" href="http://utnij.eu/html5_video/"  title="Specyfikacja: video">video</a></code>. Przyjmuje te same atrybuty co <code>audio</code>, a ponadto:</p>
<ul>
<li><code><a target="_blank" href="http://utnij.eu/html5_height/"  title="Specyfikacja: height">height</a></code> &#8211; określa wysokość okna playera,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_poster/"  title="Specyfikacja: poster">poster</a></code> &#8211; adres URL alternatywnej grafiki, wyświetlanej jeżeli domyślny zasób nie będzie dostępny,</li>
<li><code><a target="_blank" href="http://utnij.eu/html5_width/"  title="Specyfikacja: width">width</a></code> &#8211; określa szerokość okna odtwarzacza.</li>
</ul>
<p>Tak oto możemy stworzyć podstawowy przykład użycia:</p>
<pre class="brush: xml;">&lt;!-- buforowanie zasobu w trakcie ładowania strony, jeden plik --&gt;
&lt;video src=&quot;test.mp4&quot; preload&gt;&lt;/video&gt;</pre>
<p>Ponownie, w praktyce, powinno się zdefiniować kilka, różnych źródeł plików, w celu obsługi odtwarzacza przez większą ilość przeglądarek.</p>
<pre class="brush: xml;">&lt;!-- domyślny układ, buforuje przy ładowaniu, wiele źródeł --&gt;
&lt;video controls preload&gt;
	&lt;!-- Firefox ge 3.5, Chrome ge 3 beta, Opera ge 10.5 --&gt;
	&lt;source src=&quot;test.ogv&quot; type=&quot;audio/ogg; codecs='theora, vorbis'&quot;&gt;
	&lt;!-- Safari ge 4, Chrome ge 3 beta --&gt;
	&lt;source src=&quot;test.mp4&quot; type=&quot;video/mp4; codecs='avc1.42E01E, mp4a.40.2'&quot;&gt;
	&lt;!-- mobilne --&gt;
	&lt;source src=&quot;video.3gp&quot; type=&quot;video/3gpp; codecs='mp4v.20.8, samr'&quot;&gt;
	&lt;!-- alternatywny wynik --&gt;
	Twoja przeglądarka nie obsługuje HTML 5.
&lt;/video&gt;</pre>
<p style="text-align: center; font-size: 10px;"><video controls style="width: 480px; height: 320px;" poster="http://farm5.static.flickr.com/4019/4447584693_278f64dba5_o.png"><source src="http://osaddict.com/files/elephantsdream-480-h264-st-aac.mov" /><source src="http://mirrorblender.top-ix.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_stereo.ogg" /><img src="http://farm5.static.flickr.com/4019/4447584693_278f64dba5_o.png" alt="Znacznik video nieobsługiwany" /></video><br />W odtwarzaczu wyświetlane są dwa filmy (Elephants Dream, Big Buck Bunny) na licencji zezwalającej na rozprowadzanie kopii w trybie online.</p>
<h2>Obróbka</h2>
<p>Zarówno w przypadku jednego, jak i drugiego elementu możemy je stylować.</p>
<pre class="brush: css;">audio, video {
	width: 480px;
	height: 320px;
}</pre>
<h2>Kompatybilność</h2>
<table class="article_table">
<thead>
<tr>
<th>Kodek (kontener)</th>
<th>Android</th>
<th>Chrome >= 3.0</th>
<th>Firefox >= 3.5</th>
<th>Iphone</th>
<th>Opera >= 10.5</th>
<th>Safari >= 4</th>
</tr>
</thead>
<tbody>
<tr>
<td class="t_sm">Theora video (Ogg/.ogv)</td>
<td>x</td>
<td>✓</td>
<td>✓</td>
<td>x</td>
<td>✓</td>
<td>x</td>
</tr>
<tr>
<td class="t_sm">Vorbis audio (Ogg/.ogg)</td>
<td>x</td>
<td>✓</td>
<td>✓</td>
<td>x</td>
<td>✓</td>
<td>x</td>
</tr>
<tr>
<td class="t_sm">H.264 video (MP4/.mp4)</td>
<td>✓</td>
<td>✓</td>
<td>x</td>
<td>✓</td>
<td>x</td>
<td>✓</td>
</tr>
<tr>
<td class="t_sm">AAC audio (MP4/.mp3)</td>
<td>✓</td>
<td>✓</td>
<td>x</td>
<td>✓</td>
<td>x</td>
<td>✓</td>
</tr>
<tr>
<td class="t_sm">WAV audio (WAV/.wav)</td>
<td>-</td>
<td>-</td>
<td>✓</td>
<td>-</td>
<td>✓</td>
<td>✓</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://m1chu.eu/2010/03/19/html5-obsluga-elementow-audio-i-video/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://osaddict.com/files/elephantsdream-480-h264-st-aac.mov" length="103636531" type="video/quicktime" />
		</item>
		<item>
		<title>Wzorzec projektowania wtyczek jQuery na bazie metod i funkcji</title>
		<link>http://m1chu.eu/2010/03/06/wzorzec-projektowania-wtyczek-jquery-na-bazie-metod-i-funkcji/</link>
		<comments>http://m1chu.eu/2010/03/06/wzorzec-projektowania-wtyczek-jquery-na-bazie-metod-i-funkcji/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 18:17:32 +0000</pubDate>
		<dc:creator>m1chu</dc:creator>
				<category><![CDATA[Webhosting]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[biblioteka]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[funkcja]]></category>
		<category><![CDATA[iteracja]]></category>
		<category><![CDATA[metoda]]></category>
		<category><![CDATA[obiekt]]></category>
		<category><![CDATA[parametryzacja]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[prototyp]]></category>
		<category><![CDATA[wtyczka]]></category>

		<guid isPermaLink="false">http://m1chu.eu/?p=1689</guid>
		<description><![CDATA[
Praca z jQuery prędzej, czy później wymusza na nas kompleksowe tworzenie rozwiązań wykonywanych po stronie użytkownika. Metody filtrujące, animacje, czy efekty na galeriach zdjęć łatwiej będzie osiągnąć i rozwijać posługując się, łączącymi się na wtyczki, mechanizmami metod i funkcji, dostępnymi w frameworku.

Metoda, a funkcja?
Podstawowa różnica pomiędzy nimi polega na tym, że operują na innych obiektach. [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDZfMDVfMTBfanF1ZXJ5X3BsdWdpbnNfcGF0dGVybjtqcXVlcnlfcGx1Z2luc19wYXR0ZXJuX3Bvc3RfaGVhZGVyLnBuZw==" alt="Wzorzec projektowania wtyczek jQuery na bazie metod i funkcji" style="height: 119px;" /></p>
<p>Praca z jQuery prędzej, czy później wymusza na nas kompleksowe tworzenie rozwiązań wykonywanych po stronie użytkownika. Metody filtrujące, animacje, czy efekty na galeriach zdjęć łatwiej będzie osiągnąć i rozwijać posługując się, łączącymi się na wtyczki, mechanizmami metod i funkcji, dostępnymi w frameworku.</p>
<p><span id="more-1689"></span></p>
<h2>Metoda, a funkcja?</h2>
<p>Podstawowa różnica pomiędzy nimi polega na tym, że operują na innych obiektach. Każda nowa metoda musi być dołączona do prototypu <code>jQuery.fn</code>, a funkcja po prostu do obiektu <code>jQuery</code>.</p>
<pre class="brush: jscript;">/* metoda */
jQuery.fn.nazwa = function() {
	[...]
};</pre>
<pre class="brush: jscript;">/* funkcja */
jQuery.nazwa = function() {
	[...]
};</pre>
<p>W praktyce powoduje to, że do metody odwołujemy się operując na jakimś elemencie, identyfikatorze, bądź na klasie znajdującej się na stronie internetowej, a w przypadku funkcji, po prostu ją wywołujemy w celu wykonania jakieś akcji.</p>
<pre class="brush: jscript;">/* wywołanie: metoda */
$(element).nazwa();</pre>
<pre class="brush: jscript;">/* wywołanie: funkcja */
var x = $.nazwa();
alert(x);</pre>
<p>Obydwie możemy parametryzować. Argumentem może być zwykła zmienna, dowolnego, obsługiwanego przez JavaScript typu lub obiekt przechowujący zbiór pól o konkretnym przeznaczeniu.</p>
<pre class="brush: jscript;">/* metoda z parametrem */
jQuery.fn.nazwa = function(options) {
	[...]
};</pre>
<pre class="brush: jscript;">/* funkcja z parametrem */
jQuery.nazwa = function(options) {
	[...]
};</pre>
<h2>Umowne zasady tworzenia pluginów</h2>
<p>Twórcy <a target="_blank" href="http://jquery.com/" >jQuery</a>, poprzez dokumentację, podpowiadają jakimi zasadami należy się kierować, aby poprawnie tworzyć wtyczki. Mianowicie:</p>
<ol>
<li>Terminologie funkcja, metoda, czy klasa są stosowanie umownie, z racji specyfiki przeznaczenia każdego z tych elementów. Fraza <strong>metoda</strong> jest w powyższym wypadku synonimem całego pojęcia wtyczki.</li>
<li>Nazwy plików powinny być formowane następująco: <strong>jquery.[nazwa_wtyczki].js</strong>. Przykładowo: <strong>jquery.nazwa.js</strong>.</li>
<li>W metodach <code>this</code> jest referencją do aktualnie przetwarzanego obiektu jQuery.</li>
<li>Powinno się dołączać wtyczkę do obiektu nadrzędnego poprzez <code>jQuery</code>, a nie <code>$</code>, co użytkownikom zwiększa pole manewru we wprowadzaniu zmian z użyciem <code>jQuery.noConflict()</code>.</li>
<li>W celu uniknięcia problemów z poprawnością kodu po jego wcześniejszej kompresji, wszelkie metody oraz funkcje powinny kończyć się znakiem średnika (<code>;</code>).</li>
<li>Użycie <code><a target="_blank" href="http://utnij.eu/6f63d2/" >.each</a></code> pozwala na bezproblemową iteracje po wszystkich elementach na których operujemy w metodzie.</li>
<li>Metoda domyślnie musi zwracać wartość.</li>
</ol>
<div class="explain">
<p><code>.each(function(indeks, element))</code> &#8211; przenosi się po każdym elemencie drzewa DOM, będących częścią obiektu jQuery, za każdym razem wykonując funkcję określoną jako parametr opisywanej metody.</p>
<p><strong>Przykład:</strong></p>
<pre class="brush: xml;">&lt;ol&gt;
	&lt;li&gt;play&lt;/li&gt;
	&lt;li&gt;the&lt;/li&gt;
	&lt;li&gt;game&lt;/li&gt;
&lt;/ol&gt;</pre>
<pre class="brush: jscript;">$('ol').each(function(i, e) {
	// e == this
	// e jest warte użycia w konkretnych zagnieżdżeniach, kiedy to this nie zawsze wskazuje na aktualnie analizowany element pętli
	$(e).html('&lt;strong&gt;' + $(this).text() + '&lt;/strong&gt;');
});</pre>
</div>
<h2>Przekazywanie parametrów w celu kontrolowania zachowań wtyczki</h2>
<p>Czym byłby plugin bez możliwości prostej parametryzacji określonych zachowań? W celu ułatwienia zrozumienia ich tworzenia postaramy się stworzyć bardzo prosty tester poprawności wpisywanych do pola danych (np. o identyfikatorze <code>#nick</code>). Sprawdzimy w nich, czy wprowadzony tekst będzie odpowiadał odpowiedniemu wzorcowi wyrażenia regularnego i będzie wystarczająco długi. Ponadto określimy do jakiego elementu zwrócić informację na wypadek niespełnienia wcześniej wymienionych kryteriów. Warto więc będzie zdefiniować na stałe wartości tych opcji oraz dać przyszłym jej użytkownikom możliwość nadpisania ich w argumentach wywoływanej metody.</p>
<div class="explain"><code>jQuery.extend([ tryb_rekursywny ,] obiekt_rozszerzany, obiekt_1_rozszerzający [, ... obiekt_n_rozszerzający])</code> &#8211; łączenie dwóch lub kilku właściwości obiektów do osobnego.
<ul>
<li><strong>tryb_rekursywny</strong> &#8211; przyjmuje wartości logiczne (true/false) w celu wykonania rekursywnego łączenia,</li>
<li><strong>obiekt_rozszerzany</strong> &#8211; element nadpisywany (w celu uniknięcia należy pozostawić puste),</li>
<li><strong>obiekt_x_rozszerzający</strong> &#8211; elementy łączone.</li>
</ul>
</div>
<p>Załóżmy więc, że nazwiemy naszą wtyczkę <strong>filtrate</strong>, a domyślne dane będziemy przetrzymywać w obiekcie <strong>defaults</strong>.</p>
<pre class="brush: jscript;">jQuery.fn.filtrate = function() {
	var defaults = {
		length:		6, // minimalna długość wprowadzanego tekstu
		regexp:		/[0-9a-z]/gi, // kryterium wprowadzanych znaków
		returnto:	'footer' // informacja o błędzie zostanie zwrócona do tego elementu
	};

	alert(defaults.regexp); // przykładowe użycie
};</pre>
<p>Za pomocą parametru <strong>options</strong> przekażemy spersonalizowane dane konfiguracyjne.</p>
<pre class="brush: jscript;">jQuery.fn.filtrate = function(options) {
	var defaults = {
			length:		6, // minimalna długość wprowadzanego tekstu
			regexp:		/[0-9a-z]/gi, // kryterium wprowadzanych znaków
			returnto:	'footer' // informacja o błędzie zostanie zwrócona do tego elementu
	}; 

	// rozszerzenie domyślnej konfiguracji
	var options = $.extend(defaults, options);

	alert(options.regexp); // przykładowe użycie
};</pre>
<p>Propozycje wywołań metody z użyciem argumentów.</p>
<pre class="brush: jscript;">$('#nick').filtrate({length: 3});
// lub
$('#nick').filtrate({
	regexp: /[0-9]/gi,
	length: 3
});</pre>
<p>Do ustawień nie ma jednak publicznego dostępu. Możemy co prawda skonfigurować je przy wywoływaniu wtyczki, ale nie bezpośrednio, np. później. W tym celu należy przenieść domyślne wartości do własności składowej metody oraz połączyć wprowadzane i predefiniowane dane bez modyfikacji tych drugich.</p>
<pre class="brush: jscript;">jQuery.fn.filtrate = function(options) {
	// rozszerzenie domyślnej konfiguracji bez jej nadpisywania (pierwszy argument pusty)
	var options = $.extend({}, $.fn.filtrate.defaults, options);

	alert(options.regexp); // przykładowe użycie
};

$.fn.filtrate.defaults = {
	length:		6, // minimalna długość wprowadzanego tekstu
	regexp:		/[0-9a-z]/gi, // kryterium wprowadzanych znaków
	returnto:	'footer' // informacja o błędzie zostanie zwrócona do tego elementu
};</pre>
<p>Zewnętrzny programista ma teraz szansę wykonania ustawień przed i po wywołaniu wtyczki, a także bez konieczności robienia tego w bloku <code>jQuery(document).ready(function() [...]);</code>.</p>
<pre class="brush: jscript;">// nadpisanie długości spoza parametru
$.fn.filtrate.defaults.length = 3;
$('#nick').filtrate({regexp: /[0-9]/gi});</pre>
<h2>Prywatne funkcje &#8211; ukrywamy poszczególne elementy</h2>
<p>Nie każda partia kodu powinna być dostępna do bezpośredniego wywołania przez użytkownika wtyczki. Przykładem może być tutaj funkcja użytkowa, stworzona stricte do celów danej metody. Aby tego dokonać, należy opleść całą definicję pluginu w funkcję zamykającą (<em>closure</em>) oraz po za samą metodą użyć standardowej formy tworzenia funkcji w JavaScript. Metodologia tworzenia funkcji w jQuery nie zda tutaj prawidłowego rezultatu. Dostęp będzie nadal publiczny.</p>
<pre class="brush: jscript;">(function($) { // start: closure
	$.fn.filtrate = function() {
		$.logs(1); // ostrzeżenie z zawartością '1'

		logs(1); // ostrzeżenie z zawartością '1'
	};		

	function logs($obj) {
    	alert($obj);
  	};

	$.logs = function($obj) {
		alert($obj);
	};
})(jQuery); // end: closure

jQuery(document).ready(function() {
	$('#nick').filtrate();

	$.logs(1); // ostrzeżenie z zawartością '1'
	logs(1); // brak dostępu do tej funkcji z zewnątrz
});</pre>
<h2>Wywoływanie funkcji oraz innych metod we wtyczce</h2>
<p>Zaistnieć może także sytuacja przeciwna do powyższej. Z różnych powodów możemy chcieć skorzystać z publicznie dostępnej metody, zaimplementowanej wewnątrz wtyczki, którą tworzymy lub z funkcji przedstawionych na początku artykułu.</p>
<pre class="brush: xml;">[...]
        &lt;footer&gt;
        	&lt;p&gt;Wpisz swój script nick&lt;/p&gt;
            &lt;p&gt;Wpisz swój a href nick&lt;/p&gt;
        &lt;/footer&gt;
[...]</pre>
<p>Mamy przykładowy zestaw paragrafów, z których będziemy chcieli wykluczyć pewny ciąg znaków. Ponieważ będziemy sprawdzać więcej elementów niż jeden, skorzystamy z wcześniej wymienionej metody iteracyjnej <code>.each()</code>, a następnie pobierzemy ich zawartości, usuniemy stosowną frazę (korzystając z osobnej funkcji/metody) i zwrócimy wynik do znacznika je zawierającego.</p>
<pre class="brush: jscript;">jQuery.fn.filtrate = function(options) {
	var defaults = {
		erase:	 	/a href/g, // tekst do usunięcia
		usemethod:	true // pomocnicze, użycie metody lub funkcji
	};
	// rozszerzenie domyślnej konfiguracji
	var options = $.extend(defaults, options);

	return this.each(function() {
		var context = $(this).html(); // pobranie zawartości elementu
		switch (options.usemethod) // dodany w celach naukowych ;]
		{
			case false:
				context = $.cleanup(context, options.erase); // wywołanie funkcji
				break;
			default:
				context = $.fn.filtrate.cleanup(context, options.erase); // wywołanie metody
				break;
		}
		$(this).html(context); // zapisanie zmodyfikowanej zawartości elementu
	});
};		

// metoda zaimplementowana we wtyczce
jQuery.fn.filtrate.cleanup = function(context, erase) {
	return context.replace(erase, ''); // usunięcie frazy z ciągu
};

// osobna funkcja
jQuery.cleanup = function(context, erase) {
	return context.replace(erase, ''); // usunięcie frazy z ciągu
};

jQuery(document).ready(function() {
	// tryb wywoływania z metody
	$('footer p').filtrate({erase: /script/g});

	// tryb wywoływania spoza metody
	return $('footer p').each(function() {
		var context = $(this).html();
		context = $.fn.filtrate.cleanup(context, /a href/g);
		context = $.cleanup(context, /script/g);
		$(this).html(context);
	});
});</pre>
<h2>Osiągamy postawiony cel</h2>
<p>Na podstawie powyższych rad możemy osiągnąć postawiony sobie cel &#8211; tester poprawności wpisywanych danych do pola typu <code>input</code>. Rozwiązanie będzie zezwalać na testowanie wielu pól naraz.</p>
<pre class="brush: xml;">[...]
    	&lt;header&gt;
			&lt;p&gt;&lt;input type=&quot;text&quot; id=&quot;nick&quot;&gt;&lt;/p&gt;
			&lt;p&gt;&lt;input type=&quot;text&quot; id=&quot;nick_second&quot;&gt;&lt;/p&gt;
        &lt;/header&gt;
[...]</pre>
<p>Wywołanie odbywać się będzie w momencie zwolnienia przycisku klawiatury.</p>
<pre class="brush: jscript;">jQuery(document).ready(function() {
	$('input').keyup(function() {
		$('input').filtrate({regexp: /[a-z]/g});
	});
});</pre>
<p>W przestrzeni funkcji zawierającej wtyczkę znajdzie się prywatna funkcja logująca akcje oraz dwie publiczne metody implementowane w pluginie. Pierwsza z nich będzie sprawdzać poprawność wpisywanego tekstu pod względem zadanego wzorca, a druga długość wprowadzonego ciągu znaków.</p>
<pre class="brush: jscript;">	// metoda testująca poprawność wpisanych znaków
	$.fn.filtrate.preg_match = function(pattern, subject) {
		var subject_splited = subject.split(''); // utworzenie tablicy znaków
		for ( i=0; i &lt; subject_splited.length; ++i ) // iteracja po każdym ze znaków
		{
			// jeżeli którykolwiek znak nie będzie odpowiadał wzorcowi metoda zwraca fałsz
			if ( subject_splited[i].match(new RegExp(pattern)) == null )
			{
				return false;
			}
		}
		return true; // wszystkie znaki są odpowiednie, prawda - jedziemy dalej ;]
	};

	// metoda porównująca długości ciągów
	$.fn.filtrate.strlen_compare = function(string, min_length) {
		var length = string.length;
		if ( length &lt; 1 ) // tekst nie został wpisany
		{
			return false;
		}
		else if ( length &lt; min_length ) // tekst krótszej długości niż wymagana
		{
			return min_length - length;
		}
		return true; // tekst odpowiedniej długości
	};

	// funkcja prywatna, logująca akcje
	function log_alerts(returnto, text)
	{
		// jeżeli nie podano tekstu do wypisania, czyścimy zawartość znacznika przetrzymującego ostrzeżenia i informacje
		if ( text == undefined )
		{
			$(returnto).html('');
			return;
		}

		// dodanie nowego akapitu z zwróconą treścią do podanego znacznika
		$('&lt;p&gt;' + text + '&lt;/p&gt;').appendTo(returnto);
	}</pre>
<p>Domyślne opcje ustawimy poza wtyczką. W niej samej, dla każdego wskazanego elementu strony, sprawdzimy najpierw warunek długości, a gdy zostanie spełniony, także zawartości.</p>
<pre class="brush: jscript;">(function($) { // start: closure
	$.fn.filtrate = function(options) {
		// rozszerzenie domyslnej konfiguracji bez jej nadpisywania (pierwszy argument pusty)
		var options = $.extend({}, $.fn.filtrate.defaults, options);

		var context, strlen_compared_result;

		// czyszczenie znacznika zawierającego informacje o stanie pól
		log_alerts(options.returnto);

		// sprawdzenie każdego elementu
		return this.each(function(i) {
			context = $(this);

			// testowanie długości
			strlen_compared_result = $.fn.filtrate.strlen_compare(context.val(), options.length);
			switch (strlen_compared_result)
			{
				case false: // w wypadku niewpisania tekstu
					// logowanie akcji
					log_alerts(options.returnto, 'Pole &lt;strong&gt;' + context.attr('id') + '&lt;/strong&gt; jest puste');
					return true;
					break;
				case true: // w wypadku odpowiedniej długości tekstu
					// puste
					break;
				default: // w wypadku za krótkiego tekstu zwracany jest: tekst + wymagana długość + ilość brakujących znaków
					log_alerts(options.returnto, 'Pole &lt;strong&gt;' + context.attr('id') + '&lt;/strong&gt; zawiera za mało znaków (minimum: ' + options.length + ' / brakuje: ' + strlen_compared_result + ')');
					return true;
					break;
			}

			// testowanie typów znaków znajdujących się w tekście
			switch ($.fn.filtrate.preg_match(options.regexp, context.val()))
			{
				case false: // w wypadku pojawienia się niedozwolonych znaków
					log_alerts(options.returnto, 'Pole &lt;strong&gt;' + context.attr('id') + '&lt;/strong&gt; zawiera niedozwolone znaki');
					return true;
					break;
				default: // w wypadku poprawnego sformowania tekstu
					log_alerts(options.returnto, 'Pole &lt;strong&gt;' + context.attr('id') + '&lt;/strong&gt; jest prawidłowo wypełnione');
					break;
			}
		});
	};

	$.fn.filtrate.defaults = {
		length:	 6, // minimalna dlugosc wprowadzanego tekstu
		regexp:	 /[0-9a-z]/gi, // kryterium wprowadzanych znaków
		returnto:   'footer' // informacja o bledzie zostanie zwrócona do tego elementu
	};

	// pozostałe dwie metody + prywatna funkcja
})(jQuery); // end: closure</pre>
<p>Przykład ten powinien przybliżyć kwestię wcześniej poruszone w artykule. Na jego podstawie udostępniłem także <a href="http://use.m1chu.eu/-jquery/plugin-and-function-development-pattern/index.html" >testową stronę</a> oraz <a href="http://get.m1chu.eu/-examples/-jquery/plugin-and-function-development-pattern/get_pafdp.php" >gotowe pliki do pobrania</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://m1chu.eu/2010/03/06/wzorzec-projektowania-wtyczek-jquery-na-bazie-metod-i-funkcji/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Natchnienia warte uwagi &#8211; strony w technologii Flash #1 &#8211; listopad 2009</title>
		<link>http://m1chu.eu/2009/11/03/natchnienia-warte-uwagi-strony-w-technologii-flash-1-listopad-2009/</link>
		<comments>http://m1chu.eu/2009/11/03/natchnienia-warte-uwagi-strony-w-technologii-flash-1-listopad-2009/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 21:57:17 +0000</pubDate>
		<dc:creator>m1chu</dc:creator>
				<category><![CDATA[Natchnienia]]></category>
		<category><![CDATA[Webhosting]]></category>
		<category><![CDATA[2advanced]]></category>
		<category><![CDATA[coca cola]]></category>
		<category><![CDATA[digaworks]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[ge]]></category>
		<category><![CDATA[imagineair]]></category>
		<category><![CDATA[strony www]]></category>
		<category><![CDATA[technologia]]></category>
		<category><![CDATA[zune]]></category>

		<guid isPermaLink="false">http://m1chu.eu/?p=1574</guid>
		<description><![CDATA[
Dobrze skonstruowany serwis internetowy bazujących na technologii Flash to nie tylko dużo pracy, ale często także oszałamiający efekt. Zbiór motywujących i wartych uwagi przedstawiam dziś w dalszej części tego wpisu.

Sarasota &#8211; v5 Design &#8211; pokaz krajobrazu z nastrojowym podkładem dźwiękowym.
Interaktywna podróż po epokach.
Modernistyczna strona web developerów.
Przykład dobrze wyglądającego portfolio graphic designera.


Przykład rozwiązania bazującego na technologii [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="iborder" src="http://images.m1chu.eu/index.php?res=MDNfMTFfMDlfZmxhc2hfcGFnZXM7Zmxhc2hfcGFnZXNfcG9zdF9oZWFkZXIucG5n" alt="Gotowe wyrażenia regularne" style="height: 119px;" /></p>
<p>Dobrze skonstruowany serwis internetowy bazujących na technologii Flash to nie tylko dużo pracy, ale często także oszałamiający efekt. Zbiór motywujących i wartych uwagi przedstawiam dziś w dalszej części tego wpisu.</p>
<p><span id="more-1574"></span></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.v5design.com/"  title="Sarasota - v5 Design"><img class="iborder" src="http://farm3.static.flickr.com/2491/3920202006_ab5ac55cd2_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Sarasota &#8211; v5 Design &#8211; pokaz krajobrazu z nastrojowym podkładem dźwiękowym.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.sensisoft.com/"  title="Sensi Soft"><img class="iborder" src="http://farm3.static.flickr.com/2626/3919422431_03947b0de6_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Interaktywna podróż po epokach.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.digaworks.com/"  title="DigaWorks"><img class="iborder" src="http://farm3.static.flickr.com/2437/3920429612_af3c907694_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Modernistyczna strona web developerów.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.arihirvonen.com/"  title="Ari's Labs"><img class="iborder" src="http://farm3.static.flickr.com/2449/3919644535_b19c0e6ee6_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Przykład dobrze wyglądającego portfolio graphic designera.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.econtent.hu/flash_version/index.html"  title="e-content solutions"><img class="iborder" src="http://farm4.static.flickr.com/3544/3919644815_be25ecff96_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.elipseagency.com/agency.html"  title="Elipse Agency"><img class="iborder" src="http://farm3.static.flickr.com/2469/3919645277_442a15e040_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.aparte-graphique.com/infographiste_freelance_webdesigner_3D.htm"  title="APARTE Graphique"><img class="iborder" src="http://farm4.static.flickr.com/3441/3920484098_c14225994f_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Przykład rozwiązania bazującego na technologii Flash z motywem w postaci użytego tła.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://ladio.ru/flash/en/index.html"  title="Ladio"><img class="iborder" src="http://farm3.static.flickr.com/2544/3920430376_2696c770fc_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Interaktywność i akcja zależna od ruchu myszki.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.theologos.gr/en.html"  title="Theologos House of Jewellery"><img class="iborder" src="http://farm3.static.flickr.com/2545/3919646651_b42203c281_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Konfiguracja wtyczki FeedSmith w panelu.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.gettheglass.com/index2.html"  title="Get the Glass!"><img class="iborder" src="http://farm4.static.flickr.com/3546/3919646809_fa6dfdec78_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://realcasual.com.ua/"  title="Real Casual"><img class="iborder" src="http://farm3.static.flickr.com/2613/3920431630_511bffbf97_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.patagonia.com/web/eu/tinshed/index.jsp?slc=en_GB&#038;sct=PT&#038;&#038;ln=241"  title="Patagonia"><img class="iborder" src="http://farm3.static.flickr.com/2588/3919646481_4e5864132f_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://ge.ecomagination.com/smartgrid/#/landing_page"  title="GE"><img class="iborder" src="http://farm3.static.flickr.com/2436/3919647299_cbbe177372_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.zunejourney.net/"  title="Zune"><img class="iborder" src="http://farm3.static.flickr.com/2557/3919647405_2d7e31a1a5_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.syfy.com/tinman/oz/"  title="Infinite OZ"><img class="iborder" src="http://farm3.static.flickr.com/2503/3920432182_9d6d1e1064_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Efekt oparty o przenoszenie użytkownika pomiędzy scenami.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://demo.northkingdom.com/ihuvudetpatoyota/index_en.html"  title="On Toyota's mind"><img class="iborder" src="http://farm3.static.flickr.com/2426/3919648127_ec295109c6_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://demo.northkingdom.com/gotmilk/planetinneed/"  title="Brittlelactica"><img class="iborder" src="http://farm3.static.flickr.com/2618/3919648287_4169948704_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Wkomponowanie w strukturę elementy filmowych.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://jan-kask.dreamhosters.com/school/imagine_air/flash.html"  title="ImagineAir"><img class="iborder" src="http://farm3.static.flickr.com/2638/3919648579_2d8663acf6_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.2advanced.com/"  title="2advanced Studios"><img class="iborder" src="http://farm3.static.flickr.com/2567/3920433388_df28bd9c75_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Klasyka tematu.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://carboncalculator.direct.gov.uk/index.html"  title="Carbon Calculator"><img class="iborder" src="http://farm3.static.flickr.com/2533/4072809943_28dcc3f881_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.nespresso.com/citiz/"  title="Nespresso - Citiz"><img class="iborder" src="http://farm3.static.flickr.com/2540/4073554652_d5ef97b00f_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.saizenmedia.com/nightwish/"  title="Saizen Media Studios"><img class="iborder" src="http://farm3.static.flickr.com/2726/4073545742_62479f2dd1_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.yodabaz.com/"  title="yodabaz"><img class="iborder" src="http://farm3.static.flickr.com/2423/4072779169_9b359fcc0e_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.gringo.nu/projects/cokelight-worldflavours/#/world"  title="Coca-Cola"><img class="iborder" src="http://farm3.static.flickr.com/2637/3920430610_17d05c6b3a_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.piotrowskimichal.com/"  title="PiotrowskiMichal.com"><img class="iborder" src="http://farm3.static.flickr.com/2452/4072886681_b8fda9fb09_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Portfolio z rodzimego rynku.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.wyburzenia.pl/"  title="Specjalistyczna Firma Wyburzeniowa"><img class="iborder" src="http://farm3.static.flickr.com/2790/4072886689_4f855a7ca6_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a><br />Strona polskiej firmy specjalizującej się w wyburzeniach.</p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.atsushiwatanabe.com/"  title="Atsushi Watanabe"><img class="iborder" src="http://farm3.static.flickr.com/2631/4072886691_3642dfcbed_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://graphicdesign.bg/"  title="Graphic Design"><img class="iborder" src="http://farm4.static.flickr.com/3480/4072886697_220bff5849_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p style="text-align: center; font-size: 10px;"><a target="_blank" href="http://www.catsper1.com/"  title="Catsper One"><img class="iborder" src="http://farm3.static.flickr.com/2598/4072886701_993f712a25_o.png" alt="Natchnienia warte uwagi - strony w technologii Flash #1" style="height: 288px;" /></a></p>
<p>Podziękowania dla <a target="_blank" href="http://dzi3ciol.com"  title="dzi3ciol.com">dzi3ciola</a> za wykonanie grafiki wstępnej.</p>
]]></content:encoded>
			<wfw:commentRss>http://m1chu.eu/2009/11/03/natchnienia-warte-uwagi-strony-w-technologii-flash-1-listopad-2009/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>15 przydatnych wyrażeń regularnych w PHP</title>
		<link>http://m1chu.eu/2009/10/13/15-przydatnych-wyrazen-regularnych-w-php/</link>
		<comments>http://m1chu.eu/2009/10/13/15-przydatnych-wyrazen-regularnych-w-php/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 20:23:51 +0000</pubDate>
		<dc:creator>m1chu</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webhosting]]></category>
		<category><![CDATA[Świat IT]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[regexp]]></category>
		<category><![CDATA[regexp.pl]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[wyrażenia regularne]]></category>
		<category><![CDATA[wzorzec]]></category>

		<guid isPermaLink="false">http://m1chu.eu/?p=1536</guid>
		<description><![CDATA[
W pewnym stadium zaawansowania wyrażenia regularne stają się potężnym narzędziem każdego programisty PHP (i nie tylko). A to dlatego, że pozwalają na wykonywanie operacji, których często nie sposób dokonać w prosty sposób przy pomocy standardowych funkcji zawartych w tym języku. Walidacja zawartości zmiennych, czy podmienianie specyficznej części ich zawartości &#8211; na to pozwalają wyrażenia regularne. [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="iborder" src="http://farm4.static.flickr.com/3478/3907357986_82e4016a34_o.png" alt="Gotowe wyrażenia regularne" style="height: 119px;" /></p>
<p>W pewnym stadium zaawansowania wyrażenia regularne stają się potężnym narzędziem każdego programisty PHP (i nie tylko). A to dlatego, że pozwalają na wykonywanie operacji, których często nie sposób dokonać w prosty sposób przy pomocy standardowych funkcji zawartych w tym języku. Walidacja zawartości zmiennych, czy podmienianie specyficznej części ich zawartości &#8211; na to pozwalają wyrażenia regularne. 15-ście przykładowych, najbardziej niezbędnych dla każdego web developera, skompletowałem w dalszej części artykułu. Do Waszej dyspozycji oddaję także prosty <a target="_blank" href="http://regexp.pl/"  title="regexp.pl - tester wyrażeń regularnych"><strong>serwis</strong></a> sprawdzający poprawność wprowadzanych wzorców.</p>
<p><span id="more-1536"></span></p>
<h2>1. Walidacja adresu e-mail opartego na hoście</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain;">/^([a-z0-9]{1})([^\s\t\.@]*)((\.[^\s\t\.@]+)*)@([a-z0-9]{1})((([a-z0-9-]*[-]{2})|([a-z0-9])*|([a-z0-9-]*[-]{1}[a-z0-9]+))*)((\.[a-z0-9](([a-z0-9-]*[-]{2})|([a-z0-9]*)|([a-z0-9-]*[-]{1}[a-z0-9]+))+)*)\.([a-z0-9]{2,6})([.]?)$/Diu</pre>
<h3>Opis:</h3>
<p>Wyrażenie ma za zadanie sprawdzać, czy wprowadzony przez użytkownika adres e-mail ma poprawną formę. Aby test zakończył się sukcesem muszą zostać spełnione następujące warunki:</p>
<ul>
<li>nazwa użytkownika musi zaczynać się od znaku litery lub cyfry, nie może zawierać spacji, tabulatorów, aty, za to mogą się znajdować w nim kropki, pod warunkiem, że nie występują jedna, po drugiej,</li>
<li>po nazwie użytkownika musi pojawiać się znak małpy,</li>
<li>domena, podobnie jak nazwa użytkownika, musi rozpoczynać się od litery, bądź cyfry, po czym do znaków dozwolonych dochodzą <strong>-</strong> oraz <strong>.</strong>, pod warunkiem, że pierwszy z wcześniej wymienionych znaków nie znajduje się na początku lub na końcu nazwy subdomeny (wyjątkiem są dwa myślniki na jej końcu odpowiadające często prefiksom <strong>xn--</strong>), a drugi nie jest poprzedzany swoim odpowiednikiem. <a target="_blank" href="http://pl.wikipedia.org/wiki/Domena_najwy%C5%BCszego_poziomu"  title="TLD - informacje">TLD</a> może mieć długość od dwóch do sześciu znaków,</li>
<li>domena może być zakończona kropką,</li>
<li>rozwiązanie nie sprawdza jak długi jest wprowadzony adres e-mail.</li>
</ul>
<h3>Strona testowa:</h3>
<p><a href="http://use.m1chu.eu/-php/-ready-made-expressions/point-email/index.php"  title="Przykład walidacji adresu e-mail">Tutaj</a>.</p>
<h3>Tekst spełniający warunki:</h3>
<p>2.a_a-d@n-do.x-d.pl</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>2.a_a-d@n-do.x-d.v-.pl (część domeny kończąca się nieprawidłowym znakiem)</p>
<h3>Uwagi:</h3>
<p>Jeżeli rozwiązanie w jakimkolwiek stopniu zawiedzie można pokusić się o użycie wyrażenia z ostatniej aktualizacji <a target="_blank" href="http://utnij.eu/f24/"  title="Zmiany w pliku logical_filters.c">pliku logical_filters.c ze źródeł PHP</a>.</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php;">$email = trim('adres@domena.pl');
if ( !preg_match('/^([a-z0-9]{1})([^\s\t\.@]*)((\.[^\s\t\.@]+)*)@([a-z0-9]{1})((([a-z0-9-]*[-]{2})|([a-z0-9])*|([a-z0-9-]*[-]{1}[a-z0-9]+))*)((\.[a-z0-9](([a-z0-9-]*[-]{2})|([a-z0-9]*)|([a-z0-9-]*[-]{1}[a-z0-9]+))+)*)\.([a-z0-9]{2,6})([.]?)$/Diu', $email) )
{
	print 'Nieprawidłowy adres e-mail';
}</pre>
<h3>Rozwiązanie oparte o <a target="_blank" href="http://pl2.php.net/filter_var"  title="Specyfikacja filter_var()">filter_var</a> (PHP >= 5.2):</h3>
<pre class="brush: php;">$email = trim('adres@domena.pl');
if ( (bool)filter_var($email, FILTER_VALIDATE_EMAIL) === false )
{
	print 'Nieprawidłowy adres e-mail';
}</pre>
<h2>2. Walidacja adresu e-mail opartego na hoście lub IPv4 serwera</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain;">/^([a-z0-9]{1})([^\s\t\.@]*)((\.[^\s\t\.@]+)*)@((([a-z0-9]{1})((([a-z0-9-]*[-]{2})|([a-z0-9])*|([a-z0-9-]*[-]{1}[a-z0-9]+))*)((\.[a-z0-9](([a-z0-9-]*[-]{2})|([a-z0-9]*)|([a-z0-9-]*[-]{1}[a-z0-9]+))+)*)\.([a-z0-9]{2,6})([.]?))|((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))$/Diu</pre>
<h3>Opis:</h3>
<p>Wyrażenie ma za zadanie sprawdzać, czy wprowadzony przez użytkownika adres e-mail ma poprawną formę. Aby test zakończył się sukcesem muszą zostać spełnione warunki z poprzedniego punktu oraz:</p>
<ul>
<li>po znaku @ musi się pojawić opisany już wcześniej prawidłowo sformowany host lub adres IPv4 serwera w postaci czterech, dziesiętnych oktetów.</li>
</ul>
<h3>Strona testowa:</h3>
<p><a href="http://use.m1chu.eu/-php/-ready-made-expressions/point-email/index.php"  title="Przykład walidacji adresu e-mail">Tutaj</a>.</p>
<h3>Tekst spełniający warunki:</h3>
<p>2.a_a-d@64.64.100.100</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>2.a_a-d@64.64.256.100 (trzeci oktet jest po za zakresem)</p>
<h3>Uwagi:</h3>
<p>Jeżeli rozwiązanie w jakimkolwiek stopniu zawiedzie można pokusić się o użycie wyrażenia z ostatniej aktualizacji <a target="_blank" href="http://utnij.eu/f24/"  title="Zmiany w pliku logical_filters.c">pliku logical_filters.c ze źródeł PHP</a>.</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php;">$email = trim('adres@85.64.100.100');
if ( !preg_match('/^([a-z0-9]{1})([^\s\t\.@]*)((\.[^\s\t\.@]+)*)@((([a-z0-9]{1})((([a-z0-9-]*[-]{2})|([a-z0-9])*|([a-z0-9-]*[-]{1}[a-z0-9]+))*)((\.[a-z0-9](([a-z0-9-]*[-]{2})|([a-z0-9]*)|([a-z0-9-]*[-]{1}[a-z0-9]+))+)*)\.([a-z0-9]{2,6})([.]?))|((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])))$/Diu', $email) )
{
	print 'Nieprawidłowy adres e-mail';
}</pre>
<h3>Rozwiązanie oparte o <a target="_blank" href="http://pl2.php.net/filter_var"  title="Specyfikacja filter_var()">filter_var</a> (PHP >= 5.2):</h3>
<pre class="brush: php;">$email = trim('adres@domena.pl');
if ( (bool)filter_var($email, FILTER_VALIDATE_EMAIL) === false )
{
	print 'Nieprawidłowy adres e-mail';
}</pre>
<h2>3. Prosta weryfikacja adresu URL</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain;">/^(http|ftp)([s]{0,1}):\/\/([a-z0-9]{1})((([a-z0-9-]*[-]{2})|([a-z0-9])*|([a-z0-9-]*[-]{1}[a-z0-9]+))*)((\.[a-z0-9](([a-z0-9-]*[-]{2})|([a-z0-9]*)|([a-z0-9-]*[-]{1}[a-z0-9]+))+)*)(\.([a-z0-9]{2,6})){0,1}((:[0-9]){0}|(:[1-9]{1}[0-9]*))\//iu</pre>
<h3>Opis:</h3>
<p>Zweryfikować, czy użytkownik wprowadził adres URL, wg wzoru:</p>
<pre class="brush: plain;">protokół://adres_serwera:port/</pre>
<ul>
<li>dozwolone protokoły: <strong>http</strong>, <strong>https</strong>, <strong>ftp</strong>, <strong>ftps</strong>,</li>
<li>adres serwera w formie serwera lokalnego, subdomen, domeny i rozszerzenia,</li>
<li>port jest opcjonalny,</li>
<li>dalsze wprowadzone dane (jak Query String) nie są sprawdzane,</li>
<li>konstrukcja jest przeznaczona do sprawdzanie adresów opartych na IPv4.</li>
</ul>
<h3>Strona testowa:</h3>
<p><a href="http://use.m1chu.eu/-php/-ready-made-expressions/point-url/index.php"  title="Przykład walidacji adresu URL">Tutaj</a>.</p>
<h3>Tekst spełniający warunki:</h3>
<p>http://m1chu.eu/</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>htt://adres.com/temp/ (nieprawidłowy schemat)</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php;">$url = trim('http://m1chu.eu');
if ( !preg_match('/^(http|ftp)([s]{0,1}):\/\/([a-z0-9]{1})((([a-z0-9-]*[-]{2})|([a-z0-9])*|([a-z0-9-]*[-]{1}[a-z0-9]+))*)((\.[a-z0-9](([a-z0-9-]*[-]{2})|([a-z0-9]*)|([a-z0-9-]*[-]{1}[a-z0-9]+))+)*)(\.([a-z0-9]{2,6})){0,1}((:[0-9]){0}|(:[1-9]{1}[0-9]*))\//iu', $url) )
{
	print 'Nieprawidłowy adres URL';
}</pre>
<h2>4. Wycinanie hosta z portem z adresu URL</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain;">/^(http|ftp)([s]{0,1}):\/\/((.*)\.[a-z0-9]{2,6}|((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5]))){0,1}((:[0-9]){0}|(:[1-9]{1}[0-9]*))\//iu</pre>
<h3>Opis:</h3>
<p>Pobrać host wraz z portem (jeżeli został podany) z URI. Pozostałe zasady są tożsame z wymienionymi w poprzednim punkcie.</p>
<h3>Strona testowa:</h3>
<p><a href="http://use.m1chu.eu/-php/-ready-made-expressions/point-extract-domain/index.php"  title="Przykład wycinania hosta z portem">Tutaj</a>.</p>
<h3>Tekst spełniający warunki:</h3>
<p>http://m1chu.eu:80/ (zwróci: m1chu.eu:80)</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>htt://adres.com/temp/ (nieprawidłowy schemat)</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php;">$url = trim('ftps://stro.eu:1000/file.exe');
if ( preg_match('/^(http|ftp)([s]{0,1}):\/\/((.*)\.[a-z0-9]{2,6}|((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5]))){0,1}((:[0-9]){0}|(:[1-9]{1}[0-9]*))\//iu', $url, $matches) )
{
	// $matches[3] - nazwa serwera z domeną lub adres IPv4
	// $matches[10] - port
	print $matches[3] . ':' . $matches[10];
}</pre>
<h2>5. Sprawdzanie adresu IP (protokół IPv4)</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain;">/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/Du</pre>
<h3>Opis:</h3>
<p>Wykryć poprawność wprowadzonego w formie dziesiętnych oktetów IP (w wersji czwartej protokołu).</p>
<h3>Strona testowa:</h3>
<p><a href="http://use.m1chu.eu/-php/-ready-made-expressions/point-ipv4/index.php"  title="Przykład walidacji adresu IPv4">Tutaj</a>.</p>
<h3>Tekst spełniający warunki:</h3>
<p>0.0.0.0</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>101.256.0.1 (drugi oktet poza zakresem)</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php;">$ipv4 = trim('192.168.0.1');
if ( !preg_match('/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/Du', $ipv4) )
{
	print 'Nieprawidłowy adres IPv4';
}</pre>
<h3>Rozwiązanie oparte o <a target="_blank" href="http://pl2.php.net/filter_var"  title="Specyfikacja filter_var()">filter_var</a> (PHP >= 5.2):</h3>
<pre class="brush: php;">$email = trim('192.168.0.1');
if ( (bool)filter_var($ipv4, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) === false )
{
	print 'Nieprawidłowy adres IPv4';
}</pre>
<h2>6. Sprawdzamy adres IP z wykluczeniem puli prywatnych adresów (protokół IPv4)</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain;">/^([1-9]{1}[1-9]{0,1}|1\d([1-6]{1}|[8-9]{1})|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-4])$/Du</pre>
<h3>Opis:</h3>
<p>Wykryć poprawność wprowadzonego IP (w wersji czwartej protokołu) z wykluczeniem części prywatnych i zastrzeżonych pul. Metoda nie dotyczy masek podsieci. Objęte wyjątki:</p>
<ul>
<li>10.0.0.0 &#8211; 10.255.255.255,</li>
<li>0.0.0.0 &#8211; 0.255.255.255,</li>
<li>255.255.255.255,</li>
<li>127.0.0.0 &#8211; 127.255.255.255.</li>
</ul>
<h3>Strona testowa:</h3>
<p><a href="http://use.m1chu.eu/-php/-ready-made-expressions/point-ipv4-noprivate/index.php"  title="Przykład walidacji adresu IPv4 z wykluczeniem puli prywatnych adresów">Tutaj</a>.</p>
<h3>Tekst spełniający warunki:</h3>
<p>192.168.0.136</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>0.0.0.0 (adres prywatny)</p>
<h3>Uwagi:</h3>
<p>Stosując funkcję ze zbioru <strong>filter_*</strong> odrzucone zostaną wszystkie zakresy adresów prywatnych i zastrzeżonych (np. 255.255.255.x).</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php;">$ipv4 = trim('68.78.205.0');
if ( !preg_match('/^([1-9]{1}[1-9]{0,1}|1\d([1-6]{1}|[8-9]{1})|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-4])$/Du', $ipv4) )
{
	print 'Nieprawidłowy adres IPv4';
}</pre>
<h3>Rozwiązanie oparte o <a target="_blank" href="http://pl2.php.net/filter_var"  title="Specyfikacja filter_var()">filter_var</a> (PHP >= 5.2):</h3>
<pre class="brush: php;">$email = trim('68.78.205.0');
if ( (bool)filter_var($ipv4, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false )
{
	print 'Nieprawidłowy adres IPv4';
}</pre>
<h2>7. Sprawdzamy adres IP (protokół <a target="_blank" href="http://pl.wikipedia.org/wiki/IPv6"  title="IPv6 - informacje">IPv6</a> i IPv4)</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain;">/^((([0-9A-Fa-f]{1,4}:){7}(([0-9A-Fa-f]{1,4})|:))|(([0-9A-Fa-f]{1,4}:){6}(:|((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})|(:[0-9A-Fa-f]{1,4})))|(([0-9A-Fa-f]{1,4}:){5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){0,1}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){0,2}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){0,3}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:)(:[0-9A-Fa-f]{1,4}){0,4}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(:(:[0-9A-Fa-f]{1,4}){0,5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})))(%.+)?$/Du</pre>
<h3>Opis:</h3>
<p>Wykryć poprawność wprowadzonego IP (w wersji szóstej i czwartej protokołu).</p>
<h3>Strona testowa:</h3>
<p><a href="http://use.m1chu.eu/-php/-ready-made-expressions/point-ipv6/index.php"  title="Przykład walidacji adresu IPv6">Tutaj</a>.</p>
<h3>Tekst spełniający warunki:</h3>
<p>fe80:0:0:0:0204:61ff:254.157.241.86</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>2001:::db8:: (błędna notacja)</p>
<h3>Uwagi:</h3>
<p>Stosując funkcję ze zbioru <strong>filter_*</strong> odrzucone zostaną wszelkie adresy <a target="_blank" href="http://pl.wikipedia.org/wiki/IPv4"  title="IPv4 - informacje">IPv4</a>. W przedstawionym wyrażeniu regularnym adresy z tej wersji są akceptowane zarówno występując samotnie, jak i w postaci sekwencji czterech ostatnich bajtów w IPv6 (np. :247.125.68.4).</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php;">$ipv6 = trim('fe80::204:61ff:fe9d:f156');
if ( !preg_match('/^((([0-9A-Fa-f]{1,4}:){7}(([0-9A-Fa-f]{1,4})|:))|(([0-9A-Fa-f]{1,4}:){6}(:|((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})|(:[0-9A-Fa-f]{1,4})))|(([0-9A-Fa-f]{1,4}:){5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){0,1}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){0,2}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){0,3}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(([0-9A-Fa-f]{1,4}:)(:[0-9A-Fa-f]{1,4}){0,4}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(:(:[0-9A-Fa-f]{1,4}){0,5}((:((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})?)|((:[0-9A-Fa-f]{1,4}){1,2})))|(((25[0-5]|2[0-4]\d|[01]?\d{1,2})(\.(25[0-5]|2[0-4]\d|[01]?\d{1,2})){3})))(%.+)?$/Du', $ipv6) )
{
	print 'Nieprawidłowy adres IPv6/IPv4';
}</pre>
<h3>Rozwiązanie oparte o <a target="_blank" href="http://pl2.php.net/filter_var"  title="Specyfikacja filter_var()">filter_var</a> (PHP >= 5.2):</h3>
<pre class="brush: php;">$ipv6 = trim('fe80::204:61ff:fe9d:f156');
if ( (bool)filter_var($ipv6, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false )
{
	print 'Nieprawidłowy adres IPv6';
}</pre>
<h2>8. Wykrywanie kolorów RGB w postaci szesnastkowej</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain;">/^#?[0-9a-f]{3}(?:[0-9a-f]{3})?$/Diu</pre>
<h3>Opis:</h3>
<p>Sprawdzić, czy wprowadzone dane są szesnastkowymi odpowiednikami zapisu kolorów modelu RGB.</p>
<h3>Strona testowa:</h3>
<p><a href="http://use.m1chu.eu/-php/-ready-made-expressions/point-hex-color/index.php"  title="Przykład wykrywania koloru w postaci szesnastkowej">Tutaj</a>.</p>
<h3>Tekst spełniający warunki:</h3>
<p>#ff0000</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>#a0hfg1 (g i h nie są znakami używanymi przy zapisie heksadecymalnym)</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php;">$hex = trim('#0F15a2');
if ( !preg_match('/^#?[0-9a-f]{3}(?:[0-9a-f]{3})?$/Diu', $hex) )
{
	print 'Nieprawidłowy kod szesnastkowy koloru!';
}</pre>
<h2>9. Proste sprawdzenie nazwy użytkownika</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain;">/^([a-z0-9]{1})([a-z0-9_-]{2,11})$/Diu</pre>
<h3>Opis:</h3>
<p>Wprowadzone dane muszą rozpoczynać się od znaku alfanumerycznego. Kolejne znaki mogą być ponadto myślnikiem lub podkreśleniem. Długość tekstu nie może być większa niż 12ście znaków.</p>
<h3>Strona testowa:</h3>
<p>Brak.</p>
<h3>Tekst spełniający warunki:</h3>
<p>m1chu</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>_nick (pierwszy znak nie jest cyfrą, ani literą)</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php;">$username = trim('m1chu');
if ( !preg_match('/^([a-z0-9]{1})([a-z0-9_-]{2,11})$/Diu', $username) )
{
	print 'Nieprawidłowa nazwa użytkownika!';
}</pre>
<h2>10. Proste sprawdzenie hasła użytkownika</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain;">/^(?=[a-z0-9_#@%\*-]*?[A-Z])(?=[a-z0-9_#@%\*-]*?[a-z])(?=[a-z0-9_#@%\*-]*?[0-9])([a-z0-9_#@%\*-]{8,24})$/Diu</pre>
<h3>Opis:</h3>
<p>Wpisane hasło użytkownika musi mieć od ośmiu, do dwudziestu czterech znaków, pośród których musi być co najmniej jedna wielka litera, jedna mała i jedna cyfra. Dodatkowo dozwolone są: <strong>_</strong>, <strong>#</strong>, <strong>@</strong>, <strong>%</strong>, <strong>*</strong> i <strong>-</strong>.</p>
<h3>Strona testowa:</h3>
<p>Brak.</p>
<h3>Tekst spełniający warunki:</h3>
<p>1xY#n6%2V</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>@1bbd2 (za krótki ciąg, brak wielkiej litery)</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php;">$password = trim('To#jEst@_haSL-o%usera*');
if ( !preg_match('/^(?=[a-z0-9_#@%\*-]*?[A-Z])(?=[a-z0-9_#@%\*-]*?[a-z])(?=[a-z0-9_#@%\*-]*?[0-9])([a-z0-9_#@%\*-]{8,24})$/Diu', $password) )
{
	print 'Nieprawidłowa nazwa użytkownika!';
}</pre>
<h2>11. Zaznaczanie frazy w tekście</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain;">/\b(fraza)\b/iu</pre>
<h3>Opis:</h3>
<p>Zamienianie podanej frazy na inną lub wystylowanie jej formy. Przydatna funkcja w wyszukiwarkach.</p>
<h3>Strona testowa:</h3>
<p>Brak.</p>
<h3>Działanie:</h3>
<p>szukana_fraza -> <strong>szukana_fraza</strong></p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php;">$text = 'Wyszukane frazy: wyrażenia, regularne, preg_match, preg_replace';
$find = 'regularne';
print preg_replace('/\b(' . $find . ')\b/iu', '&lt;strong&gt;\\1&lt;/strong&gt;', $text);</pre>
<h3>Rozwiązanie oparte o <a target="_blank" href="http://pl2.php.net/manual/en/function.str-ireplace.php"  title="Specyfikacja str_ireplace()">str_ireplace</a>:</h3>
<pre class="brush: php;">$text = 'Wyszukane frazy: wyrażenia, regularne, preg_match, preg_replace';
$find = 'regularne';
print str_ireplace($find, '&lt;strong&gt;' . $find . '&lt;/strong&gt;', $text);</pre>
<h2>12. Zamiana tekstowych emotikon na graficzne</h2>
<h3>Opis:</h3>
<p>Podmiana tekstowych uśmieszków na ich odpowiedniki graficzne. Wersja z użyciem <strong>str_ireplace</strong>.</p>
<h3>Strona testowa:</h3>
<p>Brak.</p>
<h3>Rozwiązanie oparte o wbudowaną funkcję PHP:</h3>
<pre class="brush: php;">$text_format = array(
	array(';)', ';-)', 'x)', ';]', ';-]'),
	array(':)', ':-)', '=)', ':]', ':-]'),
	array(':(', ':-(', '=(', ':[', ':-['),
	array(';(', ';-(', 'x(', ';[', ';-['),
	array(':P', ':-P', '=P'),
	array(':D', ':-D', '=D'),
	array(':*', ':-*', '=*'),
	array(':O', ':-O', '=O'),
	array(':/', ':-/', '=/')
	);

$image_format = array(
	'wink.png',
	'smile.png',
	'sad.png',
	'cry.png',
	'tongue.png',
	'bigsmile.png',
	'kiss.png',
	'surprise.png',
	'grimace.png'
	);

$text = 'To jest przykładowy tekst ;] Prawda, że fajny? :-D Pogrymasiłbym trochę =/, ale po co? :) Także do zobaczenia :*';

foreach ( $text_format as $key =&gt; $val )
{
	$text = str_ireplace($val, '&lt;img src=&quot;smiles/' . $image_format[$key] . '&quot; alt=&quot;' . $image_format[$key] . '&quot; /&gt;', $text);
}

print $text;</pre>
<h2>13. Zamiana BBCode na HTML</h2>
<h3>Wzorzec przykładowy:</h3>
<pre class="brush: plain;">/\[b\](.*?)\[\/b\]/Dius</pre>
<h3>Opis:</h3>
<p>Podmiana BBCode poprzez kod HTML. Funkcjonalność znana z forów internetowych.</p>
<h3>Strona testowa:</h3>
<p>Brak.</p>
<h3>Działanie:</h3>
<p>[i]pochylenie[/i] -> <em>pochylenie</em></p>
<h3>Uwagi:</h3>
<p>W komercyjnych projektach należy skorzystać z bardziej zaawansowanych klas do obsługi tego problemu. Pozwoli to uniknąć np. problemu z nieprawidłowym zagnieżdżeniem kilku tagów BBCode w sobie.</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php;">function bbcode2html($code) {
	$search = array(
        '/\[b\](.*?)\[\/b\]/Dius',
        '/\[i\](.*?)\[\/i\]/Dius',
        '/\[u\](.*?)\[\/u\]/Dius',
        '/\[s\](.*?)\[\/s\]/Dius',
        '/\[img\=(.*?)\](.*?)\[\/img\]/Dius',
        '/\[img\](.*?)\[\/img\]/Dius',
        '/\[url\](.*?)\[\/url\]/Dius',
        '/\[url\=(.*?)\](.*?)\[\/url\]/Dius',
        '/\[color\=(#?([a-f0-9]{6}|[a-f0-9]{3}))\](.*?)\[\/color\]/Dius',
        '/\[size\=([1-9]{1}[0-9]{0,2})(px|pt|em)\](.*?)\[\/size\]/Dius',
    	'/\[font\=([a-z0-9\s&quot;]+)\](.*?)\[\/font\]/Dius',
    );

	$replace = array(
        '&lt;strong&gt;\\1&lt;/strong&gt;',
        '&lt;em&gt;\\1&lt;/em&gt;',
        '&lt;span style=&quot;text-decoration: underline;&quot;&gt;\\1&lt;/u&gt;',
        '&lt;strike&gt;\\1&lt;/strike&gt;',
        '&lt;img src=&quot;\\2&quot; alt=&quot;\\1&quot; /&gt;',
        '&lt;img src=&quot;\\1&quot; alt=&quot;&quot; /&gt;',
        '&lt;a href=&quot;\\1&quot;&gt;\\1&lt;/a&gt;',
        '&lt;a href=&quot;\\1&quot;&gt;\\2&lt;/a&gt;',
        '&lt;span style=&quot;color: \\1;&quot;&gt;\\2&lt;/span&gt;',
        '&lt;span style=&quot;font-size: \\1\\2;&quot;&gt;\\3&lt;/span&gt;',
    	'&lt;span style=&quot;font-family: \\1;&quot;&gt;\\2&lt;/span&gt;'
    );

	return preg_replace($search, $replace, $code);
}</pre>
<h2>14. Sprawdzenie poprawności wprowadzonego kodu pocztowego</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain;">/^[0-9]{2}-?[0-9]{3}$/Du</pre>
<h3>Opis:</h3>
<p>Testowanie poprawności wpisanego kodu pocztowego (w formacie używanym w Polsce). Dozwolone są wersje z myślnikiem pomiędzy drugą i trzecią cyfrą, oraz bez niego.</p>
<h3>Strona testowa:</h3>
<p>Brak.</p>
<h3>Tekst spełniający warunki:</h3>
<p>62-150</p>
<h3>Tekst nie spełniający warunków:</h3>
<p>611-10</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php;">$postcode = '61-610';
if ( !preg_match('/^[0-9]{2}-?[0-9]{3}$/Du', $postcode) )
{
	print 'Nieprawidłowy kod pocztowy';
}</pre>
<h2>15. Operowanie na znacznikach XML/XHTML</h2>
<h3>Wzorzec:</h3>
<pre class="brush: plain;">/&lt;([a-z]+)([\s]{1}[^=]+[=]{1}[^&lt;]+)*(?:&gt;(.*)&lt;\/\1&gt;|\s+\/&gt;)/u</pre>
<h3>Opis:</h3>
<p>Sprawdzenie znaczników XML/XHTML oraz pobranie treści znajdującej się pomiędzy nimi.</p>
<h3>Strona testowa:</h3>
<p>Brak.</p>
<h3>Rozwiązanie oparte o wyrażenie regularne:</h3>
<pre class="brush: php;">$tag = '&lt;a href=&quot;http://m1chu.eu/&quot; title=&quot;m1chu.eu - another devblog&quot;&gt;m1chu.eu&lt;/a&gt; - &lt;strong&gt;another devblog&lt;/strong&gt;';
if ( !preg_match_all('/&lt;([a-z]+)([\s]{1}[^=]+[=]{1}[^&lt;]+)*(?:&gt;(.*)&lt;\/\1&gt;|\s+\/&gt;)/u', $tag, $matches, PREG_PATTERN_ORDER) )
{
	print 'Nieprawidłowa konstrukcja znacznika';
}
else {
	print_r($matches); // print_r($matches[3]) - lista treści zawieranych w tagach
}</pre>
<h2>Słowem zakończenia</h2>
<p>Starałem się jak najdokładniej sprawdzić powyższe wzorce. Nie mniej jednak, jak to zwykle bywa, mogą się w nich znaleźć błędy. Jeżeli ktoś takowe znajdzie, ma jakieś pytania, czy lepsze propozycje to proszę o komentarze pod wpisem.</p>
<p>Jak wspomniałem na wstępie, uruchomiłem serwis pozwalający na sprawdzanie wyrażeń regularnych względem podanego tekstu. Jest on aktualnie w fazie testów, więc mogą występować błędy w jego działaniu. Po zakończeniu wprowadzania poprawek baza wpisów zostanie wyczyszczona do zera. Można go testować, a w przyszłości korzystać pod dwoma adresami:</p>
<ol>
<li><a target="_blank" href="http://regexp.pl/"  title="regexp.pl - tester wyrażeń regularnych"><strong>regexp.pl</strong></a> (adres główny)</li>
<li><a href="http://regexp.m1chu.eu/"  title="regexp.pl - tester wyrażeń regularnych"><strong>regexp.m1chu.eu</strong></a> (adres alternatywny)</li>
</ol>
<p>Pod względem danych sesyjnych obydwa adresy działają niezależnie. <strong>Zapraszam do testowania i wyrażania swojego zdania na moim blogu, w komentarzach tego artykułu.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://m1chu.eu/2009/10/13/15-przydatnych-wyrazen-regularnych-w-php/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Imagine Cup 2009 &#8211; polskie finały oczami uczestników&#8230;</title>
		<link>http://m1chu.eu/2009/05/25/imagine-cup-2009-polskie-finaly-oczami-uczestnikow/</link>
		<comments>http://m1chu.eu/2009/05/25/imagine-cup-2009-polskie-finaly-oczami-uczestnikow/#comments</comments>
		<pubDate>Mon, 25 May 2009 08:34:04 +0000</pubDate>
		<dc:creator>m1chu</dc:creator>
				<category><![CDATA[Webhosting]]></category>
		<category><![CDATA[Świat IT]]></category>
		<category><![CDATA[Życie]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[finały]]></category>
		<category><![CDATA[imagine cup]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[projektowanie oprogramowania]]></category>
		<category><![CDATA[warszawa]]></category>
		<category><![CDATA[wpf]]></category>
		<category><![CDATA[xaml]]></category>

		<guid isPermaLink="false">http://m1chu.eu/?p=1413</guid>
		<description><![CDATA[
Mówi się, że pierwsze razy niekiedy bolą. Ten pomimo, że długi był w gruncie rzeczy miły, przyjemny, wręcz zabawny. Po ponad miesięcznym maratonie organizacyjno-roboczym zakończyliśmy wraz z dotarciem do punktu kulminacyjnego drogę pierwszego etapu wyprawy &#8211; finału polskiej edycji Imagine Cup 2009. I ten dziewiczy rejs, oczyma czwórki pasjonatów postaram się dzisiaj przedstawić&#8230;

Warszawa, 12 maja, [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="iborder" src="http://farm3.static.flickr.com/2033/3543329977_c77a628b27_o.png" alt="Imagine Cup 2009" style="height: 119px;" /></p>
<p>Mówi się, że pierwsze razy niekiedy bolą. Ten pomimo, że długi był w gruncie rzeczy miły, przyjemny, wręcz zabawny. Po ponad miesięcznym maratonie organizacyjno-roboczym zakończyliśmy wraz z dotarciem do punktu kulminacyjnego drogę pierwszego etapu wyprawy &#8211; finału polskiej edycji <a target="_blank" href="http://www.microsoft.com/poland/edukacja/imaginecup/"  title="Imagine Cup - strona w języku polskim"><strong>Imagine Cup 2009</strong></a>. I ten dziewiczy rejs, oczyma czwórki pasjonatów postaram się dzisiaj przedstawić&#8230;</p>
<p><span id="more-1413"></span></p>
<h2>Warszawa, 12 maja, anno Domini 2009!</h2>
<p>Siedząc pełni entuzjazmu kilka godzin w pociągu relacji Berlin &#8211; Poznań &#8211; Warszawa nie podejrzewaliśmy, że będzie to pierwszy, a zarazem ostatni dzień euforii, połączonej ze stresem związanym z wyzwaniem jakie nas czekało. Sesja plakatowa, czyli pierwsze starcie z jury, a potem możliwość prezentacji projektu na scenie głównej &#8211; takie było założenie. Przynajmniej moje. Nie żadne minimum, bo ono zostało już w naszych oczach osiągnięte. Po prostu cel&#8230;</p>
<p style="text-align: center; font-size: 10px;"><img class="iborder" src="http://farm3.static.flickr.com/2426/3549820666_7cdc457044_o.png" alt="OneStepEarth - logo" style="height: 397px;" /><br />OneStepEarth &#8211; nasze rozwiązanie pomagające w walce z nadmierną emisją dwutlenku węgla.</p>
<h2>Cofnijmy się o niespełna rok wstecz&#8230;</h2>
<p>Nie załamując rąk po tym jak w zeszłorocznej edycji z powodów terminowych pomyłek nie wystartowaliśmy, tym razem postanowiliśmy bardziej skrupulatnie przygotować się do konkursu. Skompletowaliśmy na nowo team w postaci jednej kobiety i trzech jurnych facetów. <strong>Patrycję</strong> &#8211; studentkę <strong>Uniwersytetu im. Adama Mickiewicza</strong> oraz <strong>Bartosza (Doss)</strong>, <strong>Tomasza (Tomaj)</strong> i <strong>mnie</strong> na co dzień uczęszczających na <strong>Politechnikę Poznańską</strong>. I tak oto zapoznając się z tematem tegorocznej edycji Imagine Cup zabraliśmy się do pracy, która w przyszłości miała nas kosztować dużo nerwów, potu, ale i nie mniej satysfakcji przeplatanej z odrobiną niedosytu. Kategoria <strong>Projektowania Oprogramowania</strong> stanęła przed nami otworem&#8230;</p>
<h2>Wyobraź sobie świat, w którym technologia pomaga rozwiązać najtrudniejsze problemy ludzkości</h2>
<p>Temat powyższy podparty był <a target="_blank" href="http://www.un.org/millenniumgoals/"  title="Milenijne cele rozwoju">osmioma milenijnymi celami rozwoju</a> stworzonymi przez Organizację Narodów Zjednoczonych. <strong>Zlikwidowanie problemu głodu i energii</strong>, <strong>rozwój (terytorialny) edukacji</strong>, <strong>równość płci</strong>, <strong>zdrowie dzieci</strong> i <strong>matek w ciąży</strong>, <strong>walka z HIV/AIDS</strong>, <strong>ekorozwój środowiska</strong> i <strong>światowe partnerstwo</strong> &#8211; tych fraz powinno dotyczyć rozwiązanie i chociażby pośrednio się do któregoś z nich przyczyniać.</p>
<p style="text-align: center; font-size: 10px;"><img class="iborder" src="http://farm4.static.flickr.com/3392/3561169570_658f70db28_o.png" alt="Poczucie humoru organizatorów" style="height: 300px;" /><br />Co by nie było, że organizatorzy nie mieli poczucia humoru. Nazwa sali, gdzie prezentowaliśmy się w pierwszy dzień.</p>
<p>Jak przyznali poszczególni członkowie komisji &#8211; nam się udało wstrzelić i w jeden z powyższych celów, i w samą popularność problemu który poruszaliśmy. Jakby nie patrzeć to właśnie jego dobranie zajęło nam najwięcej czasu. Na tyle długo, że zaczęliśmy go realizować dopiero po uzyskaniu wyników przejścia do drugiej rundy, gdzieś na początku lutego.</p>
<h2>Praktyka czyni mistrza!</h2>
<p>Myśleć, kombinować, puszczać wodze wyobraźni można długo. Nawet trzy, cztery miesiące &#8211; tak jak to było w naszym wypadku. I to na jeden temat. Piękna sprawa przeplatana komfortową sytuacją, prawda? Problem pojawia się dopiero wtedy, gdy trzeba zrealizować swoje fantazje. A jeszcze bardziej się on potęguje, gdy nie wszystkie scenariusze, konspekty, aspekty teoretyczne programu są opracowane i często w czasie pracy trzeba improwizować, dopóki nie otrzyma się prawidłowych źródeł, danych na których ma być oparty odpowiedni element naszego produktu.</p>
<p class="explain"><strong>Interoperacyjność</strong>, czyli w kontekście informatycznym możliwość przekazywania danych w różnej formie pomiędzy różnymi aplikacjami, platformami, czy urządzeniami.</p>
<p>Dwa miesiące ciężkiej pracy, wyszukiwania niezbędnych podstaw informacyjnych oraz przełożenie ich na nasze potrzeby, walka z interfejsem przy użyciu przede wszystkim <strong>WPF&#8217;a</strong> i w końcu implementacja naszych założeń w programie pisanym w <strong>C#</strong> z danymi kolekcjonowanymi w bazie <strong>MSSQL</strong> dały swój wymierny rezultat. Nie poszliśmy w interoperacyjność, lenistwo oraz walka z czasem (na własne życzenie) i ograniczeniami związanymi ze studiowaniem zawężały nam znacznie możliwości. Nie odbyło się jednak bez walki do samego końca. Jeszcze dwa dni przed upłynięciem terminu zdawania prac walczyliśmy z wynikami naszych wypocin tak, aby zredukować ilość błędów do niezbędnego minimum oraz, aby z jak najlepszej strony zaprezentować to co stworzyliśmy.</p>
<h2>Kiedy finały krajowe stanęły otworem&#8230;</h2>
<p>Ogarnęło mnie przede wszystkim zaskoczenie. Duże. Jestem z reguły realistą, a co za tym idzie bardzo często także pesymistą. Żyjemy przecież w Polsce. Tu nawet nie biją za darmo, bo w ramach pakietu &#8220;darmowy oklep&#8221; ukradną ci komórkę. Pomijając tę dygresję oraz falę radości jaka nas opanowała mieliśmy przed sobą jeszcze kawał, ponad tygodniowej roboty. Nie tylko technicznej, ale także marketingowej i prezentacyjnej. Na szczęście w tym ostatnim pomogli nam sami organizatorzy poprzez zaproszenie na tego typu szkolenie. Co logicznie myśląc wiązało się z kolejną, jednodniową wycieczką do Warszawy.</p>
<p style="text-align: center; font-size: 10px;"><img class="iborder" src="http://farm3.static.flickr.com/2429/3549029683_d458df24ff_o.png" alt="OneStepEarth - stoliki sesji plakatowej" style="height: 400px;" /><br />Stanowisko numer pięć &#8211; zawartość stolików sesji plakatowej.</p>
<p>Będąc już na sesji plakatowej nie sposób było nie dostrzec, że nasze stanowisko jest ciut ubogie. Dwa notebooki, ciut rekwizytów, flipchart i dwa stoliki wraz z odrobiną gastronomii. No niestety, nikt nie wpadł na to, aby brać ze sobą dodatkowy sprzęt elektroniczny, czy inne interaktywne urządzenia. Był za to plakat, ulotki, chęci, dużo stresu i wraz z każdą kolejną godziną coraz więcej zmęczenia. Sędziowie chodzili w dwu i trzyosobowych grupach, którym kolejno trzeba było wytłumaczyć problematykę i zasady działania naszego rozwiązania.</p>
<p>Jak to wygląda w praktyce? W skrócie. Większość z członków jury to biznesmeni, dyrektorzy, menedżerowie i kilka osób związanych z technicznymi stronami rozwiązań. Część nastawiona jest na biznes, część na aspekty technologiczne. Jedni z chęcią posłuchają o tym jak działa aplikacja, a inni nie zrozumieją, bądź po prostu nie chcą słuchać na czym to wszystko w praktyce polega. Dla mnie niestety jest to jeden z negatywów Imagine Cup. W finałach jego specyfika z konkursu programistycznego zmienia się w sporym stopniu w marketingowo-biznesowy. Uogólniając należy sprzedać wszystko. Program, siebie i najlepiej stanowisko które prezentujemy także :]</p>
<p style="text-align: center; font-size: 10px;"><img class="iborder" src="http://farm4.static.flickr.com/3369/3561068372_776dcea39d_o.png" alt="Imagine Cup 2009 - sesja plakatowa" style="height: 400px;" /><br />Imagine Cup 2009 &#8211; gramy na emocjach na sesji plakatowej. Jak się bawić to się bawić, prawda? ;]</p>
<p>Bardziej wyważoną i pozytywną opinię na ten temat ma za to <strong>Tomaj</strong>:<br />
<blockquote>Kilka słów o jury. Większość z nich sprawiała wrażenie prawdziwych biznesmenów. Pisząc ?prawdziwych? mam na myśli takich, którzy zachowują uśmiech na twarzy i nie dadzą po sobie poznać, że nie są zainteresowani tym, co do nich mówisz, lub, że wiedzą, że wciskasz im kompletny kit. Mam na myśli takich, którzy traktują Cię jak partnera, z którym można dobić interesu. Wyglądem i zachowaniem przystawali do zajmowanego przez siebie stanowiska. Specjalnie użyłem na początku sformułowania ?większość z nich?, bo zawsze znajdzie się czarna owca i każdy z finalistów na pewno doskonale wie o kogo chodzi ;). Okazało się również ? ku naszemu wielkiemu zaskoczeniu ? że większość jurorów znała się na programowaniu. I to całkiem nieźle! Pytania o technologie, w których wykonaliśmy nasz program trochę nas więc zaskoczyły.</p></blockquote>
<h2>Ex aequo pozycja szósta!</h2>
<p>Nam się nie udało wygrać. Zajęliśmy chlubne, <strong>szóste</strong> miejsce. Biorąc pod uwagę, że cała druga piątka takie zajęła &#8211; nie jest źle. Nie wiem, czy to z powodu, aby nie robić nikomu &#8220;przykrości&#8221;, czy po prostu dlatego, że niby walka była w miarę wyrównana. To czego jestem pewien, bo osobiście usłyszałem, to fakt, że poziom konkursu poszedł w górę. I podejrzewam, że w przyszłym roku ta tendencja będzie się utrzymywać.</p>
<blockquote><p><strong>Doss:</strong> z mojej perspektywy, mogę powiedzieć, że te wielkie projekty, wspaniałe rozwiązania i niedoścignione w geniuszu pomysły tworzą normalni ludzie, z którymi można pograć w kręgle, wypić piwo, a potem biegać bez spodni po pokoju  ;) . Owszem, poziom konkursu (przynajmniej u nas w Polsce) był wysoki, aczkolwiek za skandal uważam fakt, że nie dostaliśmy się do pierwszej piątki ;P. Widać gdzie ludzie naprawdę mają dbanie o środowisko  ;) . Żeby nie było, że przemawia przeze mnie gorycz porażki, powiem, że mój faworyt do wygrania zajął dopiero 4rte miejsce, przegrywając z konkurencją której program ma swój odpowiednik na necie w wersji 10 ;P. Niestety, nikt z jury nie sprawdził czy tamten &#8220;przełomowy&#8221; projekt nie istnieje już gdzieś w sieci&#8230;</p></blockquote>
<p>Czego możemy narcystycznie sobie pogratulować? Na pewno interfejsu wychwalanego najczęściej przez oceniające nas osoby. I tu podziękowania dla <strong>Tomaja</strong>, odwaliłeś kawał dobrej roboty. Pomimo, że dla mnie osobiście temat który chcieliśmy zrealizować rok wcześniej był bardziej &#8220;chwytliwy&#8221; pod względem wykonania to także tegoroczna problematyka emisji dwutlenku węgla której się podjęliśmy w gruncie rzeczy była na czasie i jak to stwierdził jeden z sędziów &#8220;dobrze ugruntowana w milenijnych celach&#8221;.</p>
<p>Wśród ścisłej, finałowej piątki rywalizacja była jeszcze bardziej ostra. Prezentacje były konkretne, no może prócz jednej w której zdenerwowanie zabrało ewidentnie górę nad rozwagą. Zdarza się. Pewnie dlatego, że wśród publiki siedział menedżer konkursu rangi ogólnoświatowej &#8211; Joe Wilson (który nawiasem mówiąc przeprowadził bardzo żywe podsumowanie całej edycji, typowo w amerykańskim stylu). Jeżeli chodzi o wykonanie ich pomysłów &#8211; wybraliśmy sobie prawie zgodnie w grupie domniemanego zwycięzce, nie mniej jednak realizacje i możliwości praktycznie wszystkich teamów były na tyle profesjonalne i zaawansowane, że wybór ten był niezwykle trudny. Kogo wskazywaliśmy? Nie zdradzę, nie mniej jednak nie byli to zwycięzcy wybrani przez grupę sędziów. A żeby ostatecznie choć ciut zobrazować poziom konkursu mogę dodać, że w żadnym wypadku nie było wstydem &#8220;przegrać&#8221; z taką &#8220;piątką&#8221; jakiej nie udało się pokonać w tym roku&#8230;</p>
<p style="text-align: center; font-size: 10px;"><img class="iborder" src="http://farm4.static.flickr.com/3658/3561035928_d22c06d623_o.png" alt="Joe Wilson w trakcie prezentacji" style="height: 400px;" /><br />Joe Wilson w trakcie prezentacji.</p>
<h2>Focus&#8230; focus&#8230; focus&#8230;</h2>
<p>Trzy słowa najczęściej powtarzane przez Joego w trakcie jego wystąpienia. Tłumacząc niedosłownie &#8211; &#8220;nie poddawać się, pracować, spełniać swoje cele&#8221;. Tak o to motywowali nas organizatorzy, przedstawiciele Microsoftu i Instytutu Wzornictwa Przemysłowego do dalszej pracy, do dalszego współzawodnictwa w przyszłych latach. Myślę, że skutecznie, a efekty będziemy mogli zaprezentować już&#8230; za rok :]</p>
<blockquote><p><strong>Tomaj:</strong> cały finał odbywał się w Instytucie Wzornictwa, który wywarł na mnie bardzo pozytywne wrażenie. O ile z zewnątrz wygląda on zupełnie przeciętnie, o tyle wnętrza zaprojektowane są niekonwencjonalnie, modernistycznie, troszkę w kierunku minimalistycznym, z pomysłem i ze smakiem. W różnych miejscach natknąć się można na małe ekspozycje, dzięki którym cały budynek nabiera charakteru i klimatu.</p></blockquote>
<h2>Reasumując&#8230;</h2>
<p>Zdradziliśmy i tak za dużo. Ktoś teraz może pomyśleć&#8230; &#8220;idioci, zdradzają szczegóły możliwe, że przyszłej konkurencji!&#8221;. Może i tak, może i nie. Kto nie był, a chciałby spróbować &#8211; na pewno będzie miał przez ten wpis jakiś pogląd na to jak działają te całe konkursowe trybiki. My takiej szansy i informacji nie mieliśmy. Nie zdradziliśmy żadnych bardzo ważnych konkretów, bo fakt jest taki, że doświadczenia chętni nabędą dopiero na miejscu (a i faktycznie ten krok do przodu przed &#8220;nowymi&#8221; musimy mieć ;]). Więc albo Wam się uda i się wstrzelicie z projektem, albo wrócicie z bagażem pożytecznych wiadomości i prawdopodobnie bakcylem na start w kolejnej edycji. Grunt to podejść do współzawodnictwa z uśmiechem, przymrużeniem oka, żartem &#8211; i to, zostawiając powagę w domach udało nam się chyba osiągnąć :]</p>
<blockquote><p><strong>Tomaj:</strong> atmosfera całego przedsięwzięcia pt. Imagine Cup była niezwykle przyjazna dla każdego uczestnika, widać było, że organizatorzy dołożyli wiele starań, by zapewnić wszystkim poczucie komfortu i miło spędzonego czasu. Tutaj moje ukłony w stronę osoby Piotra Kramka ? głównego koordynatora i gościa ?od wszystkiego? &#8211; dobrze poinformowany, uczynny, miły, sympatyczny, słowem: pełen profesjonalizm. Nie mogę też nie wspomnieć oczywiście o przemiłych paniach w rejestracji, które pozwalały na chwilę zapomnieć o stresie związanym z sesją plakatową.</p></blockquote>
<p>Ukłony powyższe są jak najbardziej na miejscu. Piotr &#8211; przynajmniej ze służbowego punktu widzenia to człowiek z poczuciem humoru i przede wszystkim nastawiony frontem do uczestników. Pewna przeciwwaga do obciążenia psychicznego kreowanego przez jurorów. Jak awansuje na jakieś wyższe stanowisko do przyszłego roku to miejcie, wszyscy przyszli i początkujący finaliści miejcie świadomość, że nie spotkaliście człowieka &#8220;na poziomie&#8221;, solidnie nakręcającego &#8220;ten biznes&#8221;.</p>
<p>I na koniec co dobrze zauważył <strong>Tomek</strong>:</p>
<blockquote><p> Na szczególną uwagę zasługuje również impreza zorganizowana w klubie <u>HulaKula</u> ostatniego dnia. Widać było, że naprawdę zadbali o zapewnienie rozrywki dla nas ? rezerwacja na 20 torów do kręgli, 5 stołów bilardowych, wino i piwo za damkę (co prawda na pół z wodą, ale zawsze :P), zakąski wszelkiej maści ? po prostu pyszności. Szkoda, że zamknięto nam klub godzinę przed czasem (małe niedomówienie z menadżerem klubu) ale żalu chyba nikt do nikogo nie ma (na pewno nie ja), bo bawiliśmy się przednio ;).</p></blockquote>
<p>Można tak relacjonować, opowiadać bardzo długo wchodząc to w coraz większe szczególiki. Spytacie czy warto? Warto, chociażby dlatego, że prócz pracy, presji i doświadczenia które się otrzyma na swoje barki, można także się dobrze bawić i rozluźnić. Osobiście pierwszy raz w życiu miałem okazję zagrać w kręgle i pewnie przez te wydarzenia nie będzie to ostatni ;]</p>
<blockquote><p><strong>Doss:</strong> pomijając moje drobne, wcześniejsze narzekanie, uważam, że IC jest bardzo dobrą inicjatywą, która naprawdę może zmienić świat. Nie przez to, że ktoś z nas napisze program, który niszczy połączenia w serwerach terrorystów, ale dzięki aktywowaniu ludzi (studentów &#8211; tak, to też ludzie) z całego świata &#8211; na pokazaniu im, że pomimo iż są tak młodzi, ich talent i praca (plus odrobina szczęścia) mogą okazać się wystarczające by małymi krokami budować lepszy świat.</p>
<p>Bo świat należy do nas &#8211; i to nie jest pusty frazes. Problem w tym, że tak niewielu w to wierzy, zapominamy, że tylko Ci co wierzą w to, osiągają sukcesy. Kto wie, czy w Tobie też nie siedzi osoba z potencjałem, który powali innych na kolana?</p>
<p>Moje przesłanie i lekcja z tego konkursu &#8211; wykorzystujcie swoje talenty najlepiej jak możecie, byście nigdy nie zarzucili sobie, że nawet nie spróbowaliście uczynić swojego świata lepszym.</p></blockquote>
<p>I tym miłym akcentem, wraz z symbolicznym do zobaczenia dla <a target="_blank" href="http://www.wss.pl/NewsList/1,10863.aspx"  title="Wyniki finałów">współzawodników</a> oraz jurorów, i podziękowaniem dla współpracowników uciekam w oczekiwaniu na miejmy nadzieję przyszłoroczne, kolejne, finałowe spotkanie&#8230; :]</p>
]]></content:encoded>
			<wfw:commentRss>http://m1chu.eu/2009/05/25/imagine-cup-2009-polskie-finaly-oczami-uczestnikow/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Natchnienia warte uwagi &#8211; Dema #1 &#8211; kwiecień 2009</title>
		<link>http://m1chu.eu/2009/04/19/natchnienia-warte-uwagi-dema-1-kwiecien-2009/</link>
		<comments>http://m1chu.eu/2009/04/19/natchnienia-warte-uwagi-dema-1-kwiecien-2009/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 13:26:45 +0000</pubDate>
		<dc:creator>m1chu</dc:creator>
				<category><![CDATA[Natchnienia]]></category>
		<category><![CDATA[Webhosting]]></category>
		<category><![CDATA[andromeda]]></category>
		<category><![CDATA[assembly]]></category>
		<category><![CDATA[breakpoint]]></category>
		<category><![CDATA[demo]]></category>
		<category><![CDATA[demoscena]]></category>
		<category><![CDATA[evoke]]></category>
		<category><![CDATA[farbrausch]]></category>
		<category><![CDATA[grafika]]></category>
		<category><![CDATA[grafika 2d]]></category>
		<category><![CDATA[grafika 3d]]></category>
		<category><![CDATA[inspiracja]]></category>
		<category><![CDATA[natchnienie]]></category>
		<category><![CDATA[orb]]></category>
		<category><![CDATA[plastic (.pl)]]></category>
		<category><![CDATA[pyrotech]]></category>

		<guid isPermaLink="false">http://m1chu.eu/?p=1356</guid>
		<description><![CDATA[
Są takie kierunki związane z szeroko pojętą informatyką w których trzeba mieć ponadprzeciętne umiejętności. Wymagana jest pasja, szeroka i aktualna wiedza, wyostrzone zmysły &#8211; związane z tworzeniem grafiki, dźwięku, czy optymalnego kodu. Po prostu trzeba być dobrym. Bardzo dobrym w tym co się robi.
Takie jest moje osobiste zdanie. I do takich subkultur zaliczam demoscenę oplatającą [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="iborder" src="http://farm4.static.flickr.com/3644/3452895921_8e7433b982_o.png" alt="Natchnienia warte uwagi - Dema #1" style="height: 119px;" /></p>
<p>Są takie kierunki związane z szeroko pojętą informatyką w których trzeba mieć ponadprzeciętne umiejętności. Wymagana jest pasja, szeroka i aktualna wiedza, wyostrzone zmysły &#8211; związane z tworzeniem grafiki, dźwięku, czy optymalnego kodu. Po prostu trzeba być dobrym. Bardzo dobrym w tym co się robi.</p>
<p>Takie jest moje osobiste zdanie. I do takich subkultur zaliczam <a target="_blank" href="http://pl.wikipedia.org/wiki/Demoscena"  title="Demoscena - Wiki">demoscenę</a> oplatającą rzeszę twórców m.in. intr i dem (opatrzonych w podkłady dźwiękowe, grafikę dwu- i trójwymiarową oraz najczęściej generowane drogą programowania dynamicznie efekty). Przykładowe piękno tych ostatnich postaram się Wam dziś zaprezentować w pierwszym wpisie dotyczącym &#8220;inspiracji internetu&#8221;.</p>
<p><span id="more-1356"></span></p>
<h2>fr-025: the.popular.demo wykonany przez Farbrausch</h2>
<p style="text-align: center; font-size: 10px;"><object type="application/x-shockwave-flash" width="538" height="366" data="http://www.vimeo.com/moogaloop.swf?clip_id=4132118&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=01AAEA"><param name="quality" value="best" /><param name="allowfullscreen" value="true" /><param name="scale" value="showAll" /><param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=4132118&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=01AAEA" /><img class="iborder" src="http://farm4.static.flickr.com/3608/3453214629_fbefeb0f52_o.png" alt="Dump fr-025: the.popular.demo" style="height: 366px;" /></object><br />Dump <strong>fr-025: the.popular.demo</strong>.</p>
<table>
<tbody>
<tr>
<th>Kategorie</th>
<th>Informacje</th>
</tr>
<tr>
<td>
<p>Autorzy:</p>
<p>Nazwa dema:</p>
<p>NFO:</p>
<p>Party:</p>
<p>Demo w formie wykonywalnej:</p>
<p>Dump do pobrania:</p>
</td>
<td>
<p><a target="_blank" href="http://www.farbrausch.de/"  title="Strona autorów"><strong>Farbrausch</strong></a></p>
<p><strong>fr-025: the.popular.demo</strong></p>
<p><a target="_blank" href="http://www.pouet.net/nfo.php?which=9450"  title="Plik informacyjny"><strong>pouet.net url</strong></a></p>
<p><strong>Breakpoint 2003</strong></p>
<p><a target="_blank" href="http://www.pouet.net/prod.php?which=9450"  title="Pobierz demo"><strong>pouet.net url</strong></a></p>
<p><a target="_blank" href="http://vimeo.com/4132118"  title="Pobierz dump"><strong>vimeo.com url</strong></a></p>
</td>
</tr>
</tbody>
</table>
<h2>Within Epsilon wykonany przez team Pyrotech</h2>
<p style="text-align: center; font-size: 10px;"><object type="application/x-shockwave-flash" width="538" height="366" data="http://www.vimeo.com/moogaloop.swf?clip_id=4200404&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=01AAEA"><param name="quality" value="best" /><param name="allowfullscreen" value="true" /><param name="scale" value="showAll" /><param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=4200404&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=01AAEA" /><img class="iborder" src="http://farm4.static.flickr.com/3362/3453271665_193928b4bd_o.png" alt="Dump Within Epsilon" style="height: 366px;" /></object><br />Dump <strong>Within Epsilon</strong>.</p>
<table>
<tbody>
<tr>
<th>Kategorie</th>
<th>Informacje</th>
</tr>
<tr>
<td>
<p>Autorzy:</p>
<p>Nazwa dema:</p>
<p>NFO:</p>
<p>Party:</p>
<p>Demo w formie wykonywalnej:</p>
<p>Dump do pobrania:</p>
</td>
<td>
<p><strong>Pyrotech</strong></p>
<p><strong>Within Epsilon</strong></p>
<p><strong>brak</strong></p>
<p><strong>Assembly 2008</strong></p>
<p><a target="_blank" href="http://www.pouet.net/prod.php?which=51140"  title="Pobierz demo"><strong>pouet.net url</strong></a></p>
<p><a target="_blank" href="http://vimeo.com/4200404"  title="Pobierz dump"><strong>vimeo.com url</strong></a></p>
</td>
</tr>
</tbody>
</table>
<h2>Stargazer wykonany przez grupy Orb i Andromeda</h2>
<p style="text-align: center; font-size: 10px;"><object type="application/x-shockwave-flash" width="538" height="366" data="http://www.vimeo.com/moogaloop.swf?clip_id=4209988&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=01AAEA"><param name="quality" value="best" /><param name="allowfullscreen" value="true" /><param name="scale" value="showAll" /><param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=4209988&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=01AAEA" /><img class="iborder" src="http://farm4.static.flickr.com/3605/3454128976_f8659f4c01_o.png" alt="Dump Stargazer" style="height: 366px;" /></object><br />Dump <strong>Stargazer</strong>.</p>
<table>
<tbody>
<tr>
<th>Kategorie</th>
<th>Informacje</th>
</tr>
<tr>
<td>
<p>Autorzy:</p>
<p>Nazwa dema:</p>
<p>NFO:</p>
<p>Party:</p>
<p>Demo w formie wykonywalnej:</p>
<p>Dump do pobrania:</p>
</td>
<td>
<p><a target="_blank" href="http://www.orb-demo.net/"  title="Strona autorów"><strong>Orb</strong></a> || <a target="_blank" href="http://www.andromeda.no/"  title="Strona autorów"><strong>Andromeda</strong></a></p>
<p><strong>Stargazer</strong></p>
<p><a target="_blank" href="http://pouet.net/nfo.php?which=51438"  title="Plik informacyjny"><strong>pouet.net url</strong></a></p>
<p><strong>NVScene 2008</strong></p>
<p><a target="_blank" href="http://pouet.net/prod.php?which=51438"  title="Pobierz demo"><strong>pouet.net url</strong></a></p>
<p><a target="_blank" href="http://vimeo.com/4209988"  title="Pobierz dump"><strong>vimeo.com url</strong></a></p>
</td>
</tr>
</tbody>
</table>
<h2>Lifeforce wykonany przez grupę ASD</h2>
<p style="text-align: center; font-size: 10px;"><object type="application/x-shockwave-flash" width="538" height="366" data="http://www.vimeo.com/moogaloop.swf?clip_id=4134191&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=01AAEA"><param name="quality" value="best" /><param name="allowfullscreen" value="true" /><param name="scale" value="showAll" /><param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=4134191&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=01AAEA" /><img class="iborder" src="http://farm4.static.flickr.com/3576/3454164118_e8fc603afb_o.png" alt="Dump Lifeforce" style="height: 366px;" /></object><br />Dump <strong>Lifeforce</strong>.</p>
<table>
<tbody>
<tr>
<th>Kategorie</th>
<th>Informacje</th>
</tr>
<tr>
<td>
<p>Autorzy:</p>
<p>Nazwa dema:</p>
<p>NFO:</p>
<p>Party:</p>
<p>Demo w formie wykonywalnej:</p>
<p>Dump do pobrania:</p>
</td>
<td>
<p><a target="_blank" href="http://www.asd.gr/"  title="Strona autorów"><strong>Andromeda Software Development</strong></a></p>
<p><strong>Lifeforce</strong></p>
<p><a target="_blank" href="http://www.pouet.net/nfo.php?which=31571"  title="Plik informacyjny"><strong>pouet.net url</strong></a></p>
<p><strong>Assembly 2007</strong></p>
<p><a target="_blank" href="http://www.pouet.net/prod.php?which=31571"  title="Pobierz demo"><strong>pouet.net url</strong></a></p>
<p><a target="_blank" href="http://vimeo.com/4132118"  title="Pobierz dump"><strong>vimeo.com url</strong></a></p>
</td>
</tr>
</tbody>
</table>
<h2>fr-041: debris wykonany przez team Farbrausch</h2>
<p style="text-align: center; font-size: 10px;"><object type="application/x-shockwave-flash" width="538" height="366" data="http://www.vimeo.com/moogaloop.swf?clip_id=4129664&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=01AAEA"><param name="quality" value="best" /><param name="allowfullscreen" value="true" /><param name="scale" value="showAll" /><param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=4129664&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=01AAEA" /><img class="iborder" src="http://farm4.static.flickr.com/3650/3453369179_bd87c57a88_o.png" alt="Dump fr-041: debris" style="height: 366px;" /></object><br />Dump <strong>fr-041: debris</strong>.</p>
<table>
<tbody>
<tr>
<th>Kategorie</th>
<th>Informacje</th>
</tr>
<tr>
<td>
<p>Autorzy:</p>
<p>Nazwa dema:</p>
<p>NFO:</p>
<p>Party:</p>
<p>Demo w formie wykonywalnej:</p>
<p>Dump do pobrania:</p>
</td>
<td>
<p><a target="_blank" href="http://www.farbrausch.de/"  title="Strona autorów"><strong>Farbrausch</strong></a></p>
<p><strong>fr-025: the.popular.demo</strong></p>
<p><a target="_blank" href="http://www.pouet.net/nfo.php?which=30244"  title="Plik informacyjny"><strong>pouet.net url</strong></a></p>
<p><strong>Breakpoint 2007</strong></p>
<p><a target="_blank" href="http://www.pouet.net/prod.php?which=30244"  title="Pobierz demo"><strong>pouet.net url</strong></a></p>
<p><a target="_blank" href="http://vimeo.com/4129664"  title="Pobierz dump"><strong>vimeo.com url</strong></a></p>
</td>
</tr>
</tbody>
</table>
<h2>Final Audition wykonany przez grupę Plastic (.pl) &#8211; akcent z Polski</h2>
<p style="text-align: center; font-size: 10px;"><object type="application/x-shockwave-flash" width="538" height="366" data="http://www.vimeo.com/moogaloop.swf?clip_id=4199337&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=01AAEA"><param name="quality" value="best" /><param name="allowfullscreen" value="true" /><param name="scale" value="showAll" /><param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=4199337&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=0&amp;show_portrait=0&amp;color=01AAEA" /><img class="iborder" src="http://farm4.static.flickr.com/3337/3453382285_ab851518d6_o.png" alt="Dump Final Audition" style="height: 366px;" /></object><br />Dump <strong>Final Audition</strong>.</p>
<table>
<tbody>
<tr>
<th>Kategorie</th>
<th>Informacje</th>
</tr>
<tr>
<td>
<p>Autorzy:</p>
<p>Nazwa dema:</p>
<p>NFO:</p>
<p>Party:</p>
<p>Demo w formie wykonywalnej:</p>
<p>Dump do pobrania:</p>
</td>
<td>
<p><a target="_blank" href="http://www.plastic-demo.org/"  title="Strona autorów"><strong>Plastic (.pl)</strong></a></p>
<p><strong>Final Audition</strong></p>
<p><a target="_blank" href="http://pouet.net/nfo.php?which=18766"  title="Plik informacyjny"><strong>pouet.net url</strong></a></p>
<p><strong>Evoke 2005</strong></p>
<p><a target="_blank" href="http://pouet.net/prod.php?which=18766"  title="Pobierz demo"><strong>pouet.net url</strong></a></p>
<p><a target="_blank" href="http://vimeo.com/4199337"  title="Pobierz dump"><strong>vimeo.com url</strong></a></p>
</td>
</tr>
</tbody>
</table>
<h2>Rzutem na mate&#8230;</h2>
<p>To tylko kropla w morzu dostępnych dem. Jedna z partii które pojawią się w przyszłości na blogu wśród innych, godnych uwagi aspektów wirtualnego świata. Może zainspiruje to niektórych z Was do cięższej pracy, a osiągnięcia porównywalne do tych powyżej pewnie z biegiem czasu same przyjdą&#8230; :]</p>
]]></content:encoded>
			<wfw:commentRss>http://m1chu.eu/2009/04/19/natchnienia-warte-uwagi-dema-1-kwiecien-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
