<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Vokiel.com</title>
	
	<link>http://blog.vokiel.com</link>
	<description>Web Developer Blog</description>
	<lastBuildDate>Sun, 24 Mar 2013 19:37:27 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/BlogVokielCom" /><feedburner:info uri="blogvokielcom" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>PHPCon Poland 2012 krótkie podsumowanie</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/6a_xhRxIMY0/</link>
		<comments>http://blog.vokiel.com/phpcon-poland-2012-krotkie-podsumowanie/#comments</comments>
		<pubDate>Thu, 11 Oct 2012 23:30:40 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[konferencja]]></category>
		<category><![CDATA[phpcon]]></category>
		<category><![CDATA[planetaphp]]></category>

		<guid isPermaLink="false">http://blog.vokiel.com/?p=1282</guid>
		<description><![CDATA[Doskonała okazja do poznania nowych ludzi z branży, odświeżenia kontaktów, zobaczenia na żywo ludzi znanych tylko z internetowych nicków. Tegoroczna konferencja PHPCon Poland 2012.]]></description>
				<content:encoded><![CDATA[<p class="alignright"><img src="http://blog.vokiel.com/wp-content/uploads/2012/10/phpcon2012_logo.png" alt="PHPCon PL 2012" title="phpcon2012_logo" width="173" height="44" class="alignright size-full wp-image-1295" /></p>
<p>Chciałem zrobić wpis zaraz po powrocie, ale byłem zbyt wyczerpany <img src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Chwila moment i już dwa tygodnie minęły od tegorocznego spotkania PHPCon Poland. </p>
<p>Podobnie jak w latach ubiegłych, spotkanie odbyło się w Hotelu „Przedwiośnie” w Mąchocicach Kapitulnych koło Kielc (btw jeszcze raz wielkie dzięki Łukasz za podwózkę!). Tym razem jednak termin wrześniowy (28 &#8211; 30 września) zamiast październikowego z drugiej edycji. Moim zdaniem dobry wybór &#8211; bez problemu dało się wytrzymać na sobotnim grillu kilka godzin w jednej bluzie (w przeciwieństwie do ubiegłego roku).</p>
<p>Ponownie ilość chętnych przewyższyła możliwości pojemnościowe, rejestracja została zakończona przed czasem &#8211; już w połowie sierpnia</p>
<p><span id="more-1282"></span></p>
<h2>Agenda</h2>
<p>W tym roku, wzorem lat ubiegłych, także pojawili się zagraniczni prelegenci: <a rel="nofollow" target="_blank" href="http://www.wimgodden.be/#referrer=blog.vokiel.com">Wim Godden</a>, <a rel="nofollow" target="_blank" href="http://blog.feryn.eu/#referrer=blog.vokiel.com">Thijs Feryn</a> oraz <a rel="nofollow" target="_blank" href="http://about.me/JeffreyAMcGuire#referrer=blog.vokiel.com">Jeffrey A. &#8222;jam&#8221; McGuire</a>. Nie zabrakło też bardzo dobrych prezenterów z Polski, pełna agenda dostępna jest <a rel="nofollow" target="_blank" href="http://www.phpcon.pl/2012/pl/agenda#referrer=blog.vokiel.com">na stronie</a>.
</p>
<p>Szczególną rzeczą, o której warto wspomnieć było głosowanie na prelekcje. Każdy z zalogowanych użytkowników mógł oddać głoś na wybrane przez siebie propozycje, a przez to mieć wpływ na to, co pojawiło się na finalnej wersji wystąpień. Moim zdaniem umożliwienie odbiorcom aktywnego uczestnictwa w wyborze tematów to świetny pomysł. Doskonale pokazuje ideę tego spotkania &#8211; zlotu sympatyków i entuzjastów <abbr title="PHP: Hypertext Preprocessor">PHP</abbr>, zorientowanego na odbiorców.</p>
<h2>Organizacja</h2>
<p>Jestem pełen podziwu dla organizatorów. Na prawdę należą im się słowa uznania. Niska cena, a taka duża konferencja, tyle prezentacji, do tego w pełne wyżywienie w cenie biletu, zakwaterowanie i jeszcze starczyło na gadżety! Co więcej &#8211; nawet na piwko od organizatorów na grillu <img src='http://blog.vokiel.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Wi-fi działało, na prawdę. Na innych konferencjach albo prawie nie działa, albo od razu wiadomo, że nie będzie (bo uczestnicy będą siedzieć z nosami w laptopach zamiast słuchać prezentacji). Nie to, że pojechałem tam na darmowy interent <img src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />   czasem dobrze mieć sygnał żeby coś ćwierknąć (chociaż Twitter nie był tam zbyt popularny).</p>
<p>Całość wystąpień nagrywana, kamera na statywie &#8211; z bardzo ciekawym obciążnikiem stabilizującym. Prezenterzy z mikrofonami zakładanymi za ucho &#8211; duży plus za uwolnienie im rąk, live coding staje się od razu łatwiejszy. Były nawet próby podawania mikrofonu zadającym pytania na koniec wystąpień &#8211; niestety nie zawsze udane. Tutaj mała uwaga do prezenterów &#8211; powtarzajcie zadane pytanie. Dzięki temu reszta sali usłyszy o co ktoś pytał, a później całość znajdzie się na nagraniu.</p>
<p>Rejestracja użytkowników przebiegała sprawnie &#8211; przynajmniej nas (może dlatego, że byliśmy jednymi z pierwszych&#8230;).</p>
<p>Na początku brakowało mi wywieszonej agendy gdzieś na drzwiach, korytarzu, jednak dość szybko ktoś zauważył ten brak i został on wypełniony.</p>
<p>Event dodany w <a rel="nofollow" target="_blank" href="http://joind.in/event/view/974#referrer=blog.vokiel.com">Joind.in</a> &#8211; zachęcam do ocen, komentarzy. Zapewne prelegenci chcą usłyszeć dobre słowo o swoich wystąpieniach, a także uwagi, co powinni poprawić.</p>
<h2>Wrażenia</h2>
<div id="attachment_1305" class="wp-caption alignright" style="width: 310px"><a rel="nofollow" target="_blank" href="https://twitter.com/supernrm/status/251784270614499328#referrer=blog.vokiel.com"><img src="http://blog.vokiel.com/wp-content/uploads/2012/10/da79ae7209ac11e299b11231381b6f02_7-300x300.jpg" alt="kodujemy. troche frontendu troche backendu... git commit ;) by @supernrm" title="da79ae7209ac11e299b11231381b6f02_7" width="300" height="300" class="size-medium wp-image-1305" /></a><p class="wp-caption-text">kodujemy. troche frontendu troche backendu&#8230; git commit <img src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  by @supernrm</p></div>
<p>Te spotkania są niesamowite! Do historii przejdą dyskusje do 6 nad ranem, trzecie piętro, zestawione fotele i pewne wyroby % produkcji znanej tylko wtajemniczonym.</p>
<p>Niewątpliwie przyczyną doskonałej integracji uczestników jest lokalizacja, a szczególnie to, że całość odbywała się w jednym miejscu. Na większości konferencji, na których byłem, zwykle było tak, że same prezentacje odbywają się w jednej lokalizacji, uczestnicy nocują rozlokowani są w hotelach po całym mieście, a impreza odbywa się jeszcze gdzieś indziej. Powoduje to problem z zebraniem wszystkich, integracją, czy nawet samym uczestnictwem niektórych osób w nieformalnych podsumowaniach dnia. Tutaj czegoś takiego nie było &#8211; całość odbywała się w jednym hotelu: wystąpienia, posiłki i rozmowy przy piwku. Wszyscy wspólnie, razem &#8211; jedna wielka rodzina Soprano.</p>
<p>Ciekawe co będzie w przyszłym roku&#8230; Ze względu na tak ogromne zainteresowanie konferencja ma zostać przeniesiona w inne miejsce &#8211; mam nadzieje, że nadal będzie to jeden wielki hotel.</p>
<p>Moim zdaniem to jest ogromna moc tych spotkań &#8211; dyskusje z ludźmi z branży. Jeden z ważniejszych argumentów za tym, aby taką konferencję odwiedzić osobiście. Możliwość poznania sposobów w jaki inni radzą sobie z pewnymi problemami. Przedyskutowania rozwiązań, porozmawiania z ludźmi mądrzejszymi, bardziej doświadczonymi. Wymiana doświadczeń, poznawanie innych rozwiązań, innego sposobu patrzenia na tematy.</p>
<p>Oczywiście same prelekcje też są ważne <img src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Bardzo często dodają zapału do pracy, pokazują nowe rzeczy, o których się nie wiedziało, albo wypracowane przez innych rozwiązania. Jednak prezentacje można zawsze obejrzeć później, są dostępne &#8211; nawet wraz z nagraniami i podcastami.</p>
<p>Rozmów kuluarowych nie da się ściągnąć z netu, trzeba być osobiście.</p>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/6a_xhRxIMY0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/phpcon-poland-2012-krotkie-podsumowanie/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.vokiel.com/phpcon-poland-2012-krotkie-podsumowanie/</feedburner:origLink></item>
		<item>
		<title>Raspberry Pi odczyt temperatury przez nodejs</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/ii-C0bXg9RQ/</link>
		<comments>http://blog.vokiel.com/raspberry-pi-odczyt-temperatury-przez-nodejs/#comments</comments>
		<pubDate>Sun, 16 Sep 2012 15:41:21 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[linux tools]]></category>
		<category><![CDATA[nodejs]]></category>
		<category><![CDATA[raspberry pi]]></category>

		<guid isPermaLink="false">http://blog.vokiel.com/?p=1232</guid>
		<description><![CDATA[W poprzednim wpisie dotyczącym Raspberry Pi pokazałem co należy zrobić aby uruchomić na nim system oraz mini-server www w postaci prostego skryptu nodejs. RPi nie jest tylko miniaturową wersją zwykłego komputera, na którym można testować aplikacje czy strony www. Do tego można przecież użyć VM (przy tym przydzielić więcej zasobów). Malina ma coś więcej &#8211; [...]]]></description>
				<content:encoded><![CDATA[<div id="attachment_1239" class="wp-caption alignright" style="width: 250px"><a rel="nofollow" target="_blank" href="http://raspberrypi.org#referrer=blog.vokiel.com"><img src="http://blog.vokiel.com/wp-content/uploads/2012/09/Raspi_Colour_R_240x289.png" alt="" title="Raspi_Colour_R_240x289" width="240" height="289" class="size-full wp-image-1239" /></a><p class="wp-caption-text">http://raspberrypi.org</p></div>
<p>W <a href="http://blog.vokiel.com/raspberry-pi-pierwsze-starcie" title="Raspberry Pi – pierwsze starcie">poprzednim wpisie</a> dotyczącym Raspberry Pi pokazałem co należy zrobić aby uruchomić na nim system oraz mini-server www w postaci prostego skryptu nodejs.</p>
<p>RPi nie jest tylko miniaturową wersją zwykłego komputera, na którym można testować aplikacje czy strony www. Do tego można przecież użyć VM (przy tym przydzielić więcej zasobów). Malina ma coś więcej &#8211; wbudowany port rozszerzeń <abbr title="General Purpose Input/Output">GPIO</abbr>, za pomocą którego możemy wchodzić w interakcje z zewnętrznymi urządzeniami elektronicznymi. Począwszy od prostego świecenia diodami LED, przez odczytywanie wartości z urządzeń aż po bardziej zaawansowane możliwości sterowania.</p>
<p>W tym wpisie pokażę jedną z możliwości &#8211; odczyt temperatury z czujnika 1-wire Dallas 18B20.</p>
<p><span id="more-1232"></span></p>
<h2>Aktualizacja systemu</h2>
</p>
<p>Niestety, w dostępnym w lipcu obrazie Debiana nie było modułu 1-wire, jądro było w wersji 3.1.9.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>rpi ~$ <span style="color: #c20cb9; font-weight: bold;">uname</span> <span style="color: #660033;">-a</span>
Linux raspberrypi 3.1.9+ <span style="color: #666666; font-style: italic;">#168 PREEMPT Sat Jul 14 18:56:31 BST 2012 armv6l GNU/Linux</span></pre></td></tr></table></div>

<p>Prace przy RPi ciągle trwają, zatem nowe aktualizacje, dodatki pojawiają się bardzo często. W związku z tym potrzebna jest aktualizacja systemu. Dostępnych jest wiele instrukcji, m.in.: <a rel="nofollow" target="_blank" href="http://elinux.org/RPi_Kernel_Compilation#referrer=blog.vokiel.com" title="http://elinux.org/RPi_Kernel_Compilation" target="_blank">http://elinux.org/RPi_Kernel_Compilation</a>, <a rel="nofollow" target="_blank" href="http://www.bootc.net/projects/raspberry-pi-kernel/#referrer=blog.vokiel.com" title="http://www.bootc.net/projects/raspberry-pi-kernel/" target="_blank">http://www.bootc.net/projects/raspberry-pi-kernel/</a>. Najłatwiejszą wersją (jeśli nie chcecie sami kompilować jądra) jest <a rel="nofollow" target="_blank" href="https://github.com/Hexxeh/rpi-update#referrer=blog.vokiel.com" title="Hexxeh’s easy updater tool" target="_blank">Hexxeh’s easy updater tool</a>, którego użycie sprowadza się do trzech komend:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>goo.gl<span style="color: #000000; font-weight: bold;">/</span>1BOfJ <span style="color: #660033;">-O</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>rpi-update <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #c20cb9; font-weight: bold;">chmod</span> +x <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>rpi-update</pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> ca-certificates</pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">rpi-update <span style="color: #000000;">240</span> <span style="color: #666666; font-style: italic;">#podział pamięci na 240MB CPU / 16MB GPU</span></pre></td></tr></table></div>

<p>Podany sposób nie aktualizuje nam jądra do najnowszej dostępnej wersji, ale jest ona wystarczająca do uruchomienia 1-wire:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>rpi ~ $ <span style="color: #c20cb9; font-weight: bold;">uname</span> <span style="color: #660033;">-a</span>
Linux rpi 3.2.18+ <span style="color: #666666; font-style: italic;">#20 Mon May 28 17:27:57 EDT 2012 armv6l GNU/Linux</span></pre></td></tr></table></div>

<h2>Moduł 1-wire</h2>
<p>Wątek na forum RPi dotyczący 1-wire jest dość obszerny: <a rel="nofollow" target="_blank" href="http://www.raspberrypi.org/phpBB3/viewtopic.php?t=6649#referrer=blog.vokiel.com" title="Kernel patch for Dallas 1-wire interface" target="_blank">http://www.raspberrypi.org/phpBB3/viewtopic.php?t=6649</a>, ważne jest dla nas jedno &#8211; włączenie modułu jądra.</p>
<p>Sprawdźmy najpierw, czy mamy widoczne urządzenie w1 (1-wire):</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>rpi ~ $ <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>bus<span style="color: #000000; font-weight: bold;">/</span>
amba  hid  mmc  platform  scsi  sdio  spi  usb</pre></td></tr></table></div>

<p>Jak widać nie, zatem musimy dodać moduł, a następnie zrestartować Malinę</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">root@rpi:~# </span>modprobe w1-gpio</pre></td></tr></table></div>

<p>Po restarcie jest ok:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>rpi ~ $ <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>bus<span style="color: #000000; font-weight: bold;">/</span>
amba  hid  mmc  platform  scsi  sdio  spi  usb  w1</pre></td></tr></table></div>

<p>Nasz termometr pojawi się w katalogu <code class="b">/sys/bus/w1/devices/</code> pod swoim id, np.: <code class="b">28-00000249bf39</code>. Ale aby to się stało, musimy zabrać się za małe lutowanie.</p>
<h2>Elektronika</h2>
<p><div id="attachment_1251" class="wp-caption alignright" style="width: 92px"><img src="http://blog.vokiel.com/wp-content/uploads/2012/09/Ds18b20_01.jpg" alt="" title="Ds18b20_01" width="82" height="354" class="size-full wp-image-1251" /><p class="wp-caption-text">Dallas 18B20</p></div><div id="attachment_1252" class="wp-caption alignright" style="width: 96px"><img src="http://blog.vokiel.com/wp-content/uploads/2012/09/ds18b20_200_p11.jpg" alt="" title="ds18b20_200_p1" width="86" height="136" class="size-full wp-image-1252" /><p class="wp-caption-text">Dallas 18B20</p></div></p>
<p>Na zdjęciu obok widać jak wygląda Dallas 18B20. Jest bardzo mały i poręczny, pasuje do miniaturyzacji samego RPi.</p>
<p>Obok zdjęcia widać schemat oznaczenia nóżek: 0V (GND), DQ, V+ &#8211; masa, sygnał, zasilanie. Potrzebujemy jeszcze rezystora o oporności 4,7k&Omega;, który wstawiamy pomiędzy nóżki 2-3.</p>
<p>Przykładowy schemat: (<small>Dla pewności podłączenia sprawdzajcie datasheet producenta.</small>)</p>
<div id="attachment_1256" class="wp-caption alignleft" style="width: 310px"><a rel="nofollow" target="_blank" href="http://nathan.chantrell.net/#referrer=blog.vokiel.com"><img src="http://blog.vokiel.com/wp-content/uploads/2012/09/DS18B20_Connection.jpg" alt="" title="DS18B20_Connection" width="300" height="263" class="size-full wp-image-1256" /></a><p class="wp-caption-text">http://nathan.chantrell.net/</p></div>
<p class="clear">Do ukończenia zestawu potrzebne będą jeszcze kabelki. Dobrym źródłem może być stary pc, z którego możemy wymonotować taśmy łączące przedni panel z płytą główną. Zaletą takich kabli są gotowe końcówki, które możemy od razu podpinać do pinów GPIO. Przydadzą się jeszcze rurki termokurczliwe, żeby całość nie wyglądała tak tragicznie jak u mnie &#8211; izolowanie za pomocą taśmy.</p>
<p><a href="http://blog.vokiel.com/wp-content/uploads/2012/09/RPI_DS18B20.png"><img src="http://blog.vokiel.com/wp-content/uploads/2012/09/RPI_DS18B20-529x450.png" alt="RPI_DS18B20" width="529" height="450" class="aligncenter size-medium wp-image-1329" /></a></p>
<p>Jako, że nie jest to blog elektronika, nie będę tu przedstawiał procesu lutowania, w zasadzie nie jest on skomplikowany, ani nawet interesujący. Gotowy zestaw po podłączeniu wygląda następująco:</p>
<p><img src="http://blog.vokiel.com/wp-content/uploads/2012/09/rpi_temp.jpg" alt="" title="RPi temp" width="650" height="445" class="aligncenter size-full wp-image-1259" /></p>
<p>Podwójna wtyczka (niebieski + szary kabelek) jest podwójna tylko dlatego, że zbrakło mi pojedynczych <img src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> , siwy kabelek jest w tym przypadku niepotrzebny.</p>
<h2>Odczyt temperatury</h2>
<p>Domyślnie w1-wire dla RPi działa na GPIO4 (pin 7) &#8211; niebieski kabelek na zdjęciu powyżej. Proponuję zapoznać się z układem pinów i ich oznaczeniami, wygodny schemat dostępny jest na stronie <a rel="nofollow" target="_blank" href="http://www.raspberrypi-spy.co.uk/2012/06/simple-guide-to-the-rpi-gpio-header-and-pins/#referrer=blog.vokiel.com" title="Simple Guide to the RPi GPIO Header and Pins" target="_blank">http://www.raspberrypi-spy.co.uk/2012/06/simple-guide-to-the-rpi-gpio-header-and-pins/</a>. Widoczny na zdjęciu biały kabelek podpięty jest do P1 &#8211; zasilanie 3,3V, czarny z tyłu to GND.</p>
<p>Jeśli wszystko zostało podpięte poprawnie, powinniśmy zobaczyć urządzenie w systemie:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>rpi ~ $ <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span> <span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>bus<span style="color: #000000; font-weight: bold;">/</span>w1<span style="color: #000000; font-weight: bold;">/</span>devices<span style="color: #000000; font-weight: bold;">/</span>
razem <span style="color: #000000;">0</span>
lrwxrwxrwx <span style="color: #000000;">1</span> root root <span style="color: #000000;">0</span> wrz <span style="color: #000000;">16</span> 08:<span style="color: #000000;">16</span> <span style="color: #000000;">28</span>-00000249bf39 -<span style="color: #000000; font-weight: bold;">&gt;</span> ..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>devices<span style="color: #000000; font-weight: bold;">/</span>w1_bus_master1<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">28</span>-00000249bf39
lrwxrwxrwx <span style="color: #000000;">1</span> root root <span style="color: #000000;">0</span> wrz <span style="color: #000000;">16</span> <span style="color: #000000;">13</span>:04 w1_bus_master1 -<span style="color: #000000; font-weight: bold;">&gt;</span> ..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>devices<span style="color: #000000; font-weight: bold;">/</span>w1_bus_master1</pre></td></tr></table></div>

<p>W katalogu urządzenia zobaczymy kilka plików i katalogów:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>rpi ~ $ <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>bus<span style="color: #000000; font-weight: bold;">/</span>w1<span style="color: #000000; font-weight: bold;">/</span>devices<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">28</span>-00000249bf39
vokiel<span style="color: #000000; font-weight: bold;">@</span>rpi <span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>bus<span style="color: #000000; font-weight: bold;">/</span>w1<span style="color: #000000; font-weight: bold;">/</span>devices<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">28</span>-00000249bf39 $ <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-la</span>
razem <span style="color: #000000;">0</span>
drwxr-xr-x <span style="color: #000000;">3</span> root root    <span style="color: #000000;">0</span> wrz <span style="color: #000000;">16</span> 08:<span style="color: #000000;">16</span> .
drwxr-xr-x <span style="color: #000000;">4</span> root root    <span style="color: #000000;">0</span> wrz <span style="color: #000000;">16</span> 08:<span style="color: #000000;">16</span> ..
lrwxrwxrwx <span style="color: #000000;">1</span> root root    <span style="color: #000000;">0</span> wrz <span style="color: #000000;">16</span> <span style="color: #000000;">13</span>:<span style="color: #000000;">52</span> driver -<span style="color: #000000; font-weight: bold;">&gt;</span> ..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>bus<span style="color: #000000; font-weight: bold;">/</span>w1<span style="color: #000000; font-weight: bold;">/</span>drivers<span style="color: #000000; font-weight: bold;">/</span>w1_slave_driver
<span style="color: #660033;">-r--r--r--</span> <span style="color: #000000;">1</span> root root <span style="color: #000000;">4096</span> wrz <span style="color: #000000;">16</span> <span style="color: #000000;">13</span>:<span style="color: #000000;">52</span> <span style="color: #c20cb9; font-weight: bold;">id</span>
<span style="color: #660033;">-r--r--r--</span> <span style="color: #000000;">1</span> root root <span style="color: #000000;">4096</span> wrz <span style="color: #000000;">16</span> <span style="color: #000000;">13</span>:<span style="color: #000000;">52</span> name
drwxr-xr-x <span style="color: #000000;">2</span> root root    <span style="color: #000000;">0</span> wrz <span style="color: #000000;">16</span> <span style="color: #000000;">13</span>:<span style="color: #000000;">52</span> power
lrwxrwxrwx <span style="color: #000000;">1</span> root root    <span style="color: #000000;">0</span> wrz <span style="color: #000000;">16</span> <span style="color: #000000;">13</span>:<span style="color: #000000;">52</span> subsystem -<span style="color: #000000; font-weight: bold;">&gt;</span> ..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>bus<span style="color: #000000; font-weight: bold;">/</span>w1
<span style="color: #660033;">-rw-r--r--</span> <span style="color: #000000;">1</span> root root <span style="color: #000000;">4096</span> wrz <span style="color: #000000;">16</span> <span style="color: #000000;">13</span>:<span style="color: #000000;">52</span> uevent
<span style="color: #660033;">-r--r--r--</span> <span style="color: #000000;">1</span> root root <span style="color: #000000;">4096</span> wrz <span style="color: #000000;">16</span> 08:<span style="color: #000000;">16</span> w1_slave</pre></td></tr></table></div>

<p>Najważniejszy dla nas to <code class="b">w1_slave</code>, z którego odczytamy aktualną temperaturę. Możemy to zrobić wykorzystując po prostu program <code class="b">cat</code>:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>rpi <span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>bus<span style="color: #000000; font-weight: bold;">/</span>w1<span style="color: #000000; font-weight: bold;">/</span>devices<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">28</span>-00000249bf39 $ <span style="color: #c20cb9; font-weight: bold;">cat</span> w1_slave 
c3 01 4b <span style="color: #000000;">46</span> 7f ff 0d <span style="color: #000000;">10</span> 2f : <span style="color: #007800;">crc</span>=2f YES
c3 01 4b <span style="color: #000000;">46</span> 7f ff 0d <span style="color: #000000;">10</span> 2f <span style="color: #007800;">t</span>=<span style="color: #000000;">28187</span></pre></td></tr></table></div>

<p>Jak się nie trudno domyśleć, <code class="b">t=28187</code> to aktualna temperatura z czujnika (28.187 &#176;C). Oczywiście ta postać nie bardzo nadaje się do dalszego użycia. Sposobów na pobranie temperatury w bardziej czytelnym formacie jest tyle ilu programistów, mój wygląda następująco: </p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>rpi <span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>bus<span style="color: #000000; font-weight: bold;">/</span>w1<span style="color: #000000; font-weight: bold;">/</span>devices<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">28</span>-00000249bf39 $ \
<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #c20cb9; font-weight: bold;">cat</span> .<span style="color: #000000; font-weight: bold;">/</span>w1_slave <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #007800;">t</span>= <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">cut</span> <span style="color: #660033;">-f2</span> <span style="color: #660033;">-d</span>= <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{print $1/1000}'</span>
<span style="color: #000000;">28.125</span></pre></td></tr></table></div>

<h2>Node</h2>
<p>Skoro potrafimy już odczytywac temperaturę z czujnika, czas najwyższy połączyć to z nodejs.</p>
<p>Na początek przyda nam się moduł <code class="b">child_process</code>, przy pomocy którego wywołamy sytemową komendę i odbierzemy wynik jej działania.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">#<span style="color: #339933;">!/</span>usr<span style="color: #339933;">/</span>bin<span style="color: #339933;">/</span>node
&nbsp;
<span style="color: #000066; font-weight: bold;">var</span> exec <span style="color: #339933;">=</span> require<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'child_process'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">exec</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">var</span> tempId <span style="color: #339933;">=</span> <span style="color: #3366CC;">'28-00000249bf39'</span><span style="color: #339933;">,</span>
    dispTempInterval<span style="color: #339933;">,</span>
    dispTempIntervalClock <span style="color: #339933;">=</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//sec</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">var</span> dispTemp <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    exec<span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">&quot;cat /sys/bus/w1/devices/&quot;</span> <span style="color: #339933;">+</span> tempId <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;/w1_slave | grep t= | cut -f2 -d= | awk '{print $1/1000}'&quot;</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> error<span style="color: #339933;">,</span> stdout<span style="color: #339933;">,</span> stderr <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> error <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
          console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">&quot;Error: &quot;</span> <span style="color: #339933;">+</span> error<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000066; font-weight: bold;">var</span> temp <span style="color: #339933;">=</span> parseFloat<span style="color: #009900;">&#40;</span>stdout<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toFixed</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        console.<span style="color: #660066;">log</span> <span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">&quot;Current temperature: &quot;</span> <span style="color: #339933;">+</span> temp <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;°C&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'Started node-temp'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'-----------------'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">/* Start interval */</span>
dispTempInterval <span style="color: #339933;">=</span> setInterval<span style="color: #009900;">&#40;</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  dispTemp<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> dispTempIntervalClock<span style="color: #339933;">*</span><span style="color: #CC0000;">1000</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Uruchamiamy skrypt i co 10 sekund otrzymujemy aktulane odczyty temperatury, które możemy zapisać w bazie danych i zrobić z nich ładny wykres.</p>
<p><pre><pre>
Started node-temp
-----------------
Current temperature: 22.50°C
Current temperature: 22.50°C
Current temperature: 24.19°C
</pre></pre></p>
<p>Po drobnych modyfikacjach ( <a rel="nofollow" target="_blank" href="https://github.com/vokiel/rpi-node-temp#referrer=blog.vokiel.com" title="rpi-node-temp" target="_blank">github &#8211; rpi-node-temp</a> ) efekt wygląda troszeczkę lepiej. Dodałem jeden próg, który oddziela &#8222;bezpieczną&#8221; temperaturę od krytycznej i odpowiednio sygnalizuje to kolorem. Przyłożenie termometru do czipa pokazuje efekt kolorów: </p>
<div id="attachment_1265" class="wp-caption aligncenter" style="width: 566px"><a href="http://blog.vokiel.com/wp-content/uploads/2012/09/rpi-node-temp_screen.jpg"><img src="http://blog.vokiel.com/wp-content/uploads/2012/09/rpi-node-temp_screen.jpg" alt="" title="rpi-node-temp_screen" width="556" height="245" class="size-full wp-image-1265" /></a><p class="wp-caption-text">rpi-node-temp</p></div>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/ii-C0bXg9RQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/raspberry-pi-odczyt-temperatury-przez-nodejs/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		<feedburner:origLink>http://blog.vokiel.com/raspberry-pi-odczyt-temperatury-przez-nodejs/</feedburner:origLink></item>
		<item>
		<title>Raspberry Pi – pierwsze starcie</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/5M_saAuy2po/</link>
		<comments>http://blog.vokiel.com/raspberry-pi-pierwsze-starcie/#comments</comments>
		<pubDate>Sat, 11 Aug 2012 19:23:30 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[linux tools]]></category>
		<category><![CDATA[raspberry pi]]></category>

		<guid isPermaLink="false">http://blog.vokiel.com/?p=1148</guid>
		<description><![CDATA[Raspberry Pi to pełnowartościowa, małowymiarowa platforma komputerowa oparta na procesorze ARM.]]></description>
				<content:encoded><![CDATA[<p><div id="attachment_1151" class="wp-caption alignright" style="width: 320px"><img src="http://blog.vokiel.com/wp-content/uploads/2012/08/rpi.jpg" width="300" height="174" class="size-full wp-image-1130" /><p class="wp-caption-text">Raspberry Pi</p></div> <strong>Raspberry Pi</strong> to pełnowartościowa, małowymiarowa platforma komputerowa oparta na procesorze ARM. Została stworzona przez <a rel="nofollow" target="_blank" href="http://www.raspberrypi.org/#referrer=blog.vokiel.com" title="Raspbery Pi" target="_blank">Raspberry Pi Foundation</a>. RPi jest &#8222;komputerem&#8221; wielkości karty kredytowej, posiada złącza USB, HDMI, RJ45, czytnik kart SD. Założeniem fundacji była budowa całkiem wydajnego zestawu przy maksymalnie niskich kosztach, docelowo RPi w wersji B miało kosztować $35.</p>
<p>Stworzono dwie wersje: <code class="b">A</code> i <code class="b">B</code>. Różnica między nimi to tylko: ilość portów USB (A &#8211; 1xUSB, B &#8211; 2xUSB), oraz brak RJ45 w przypadku modelu A. W chwili obecnej można zamówić tylko model B. Z racji swojej oryginalnej nazwy urządzenie funkcjonuje często pod potoczną nazwą <em>&#8222;Malina&#8221;</em></p>
<p><span id="more-1148"></span></p>
<h2>Specyfikacja</h2>
<p>Urządzenie oparte jest na układzie <strong>Broadcom BCM2835 SoC</strong>, w skład którego wchodzi procesor, procesor graficzny oraz pamięć RAM:</p>
<ul class="nice-list">
<li>ARM1176JZF-S 700 MHz</li>
<li>VideoCore IV GPU (1080p, h.264/MPEG-4)</li>
<li>256MB RAM</li>
</ul>
<p>Poza tym mamy do dyspozycji szereg portów i złącz: </p>
<p><img src="http://blog.vokiel.com/wp-content/uploads/2012/08/schemat.jpg" alt="" title="schemat" width="449" height="331" class="alignright size-full wp-image-1186" /></p>
<ul class="nice-list">
<li>2 x USB 2.0</li>
<li>HDMI, RJ45</li>
<li>czytnik SD / MMC / SDIO</li>
<li>Composite RCA</li>
<li>wyjście audio &#8211; 3,5mm jack</li>
</ul>
<p><span>Złącza:</span></p>
<ul class="nice-list">
<li>GPIO</li>
<li>UART</li>
<li>szyna I²C </li>
<li>szyna SPI</li>
</ul>
<p>Do zasilania tego urządzenia należy zaopatrzyć się w zasilacz 5V (końcówka MicroUSB), minimum 700mA. Pobór prądu jak można się łatwo domyśleć jest bardzo niski &#8211; około 2W.</p>
<h2>Koszt i zamówienie</h2>
<p><a href="http://blog.vokiel.com/wp-content/uploads/2012/08/S7300801.jpg"><img src="http://blog.vokiel.com/wp-content/uploads/2012/08/S7300801-300x225.jpg" alt="" title="rpi2" width="300" height="225" class="alignright size-medium wp-image-1212" /></a></p>
<p>Fundacja Raspberry Pi rekomenduje dwa sklepy, które prowadzą sprzedaż międzynarodową, są to: <a rel="nofollow" target="_blank" href="http://downloads.element14.com/raspberryPi1.html?isRedirect=true#referrer=blog.vokiel.com">Premier Farnell/Element 14</a> oraz <a rel="nofollow" target="_blank" href="http://pl.rs-online.com/web/generalDisplay.html?id=raspberrypi&#038;cm_mmc=Offline-Referral-_-Electronics-_-RaspberryPi-201203-_-World-Selector-Page">RS Components</a>. </p>
<p>W moim przypadku, koszt zamówienia wraz z przesyłką wyniósł około 160zł brutto za sztukę (przy zamówieniu czterech sztuk).</p>
<p>Niektórych to zmartwi, ale w przesyłce będzie tylko samo Raspberry Pi, nie ma karty SD, a nawet zasilacza. Każde rozszerzenie należy kupić we własnym zakresie, a może być tego sporo: karta pamięci, zasilacz, myszka, klawiatura, kabel HDMI, kabel sieciowy, hub USB z zewnętrznym zasilaniem, karta WiFi na USB, dysk USB lub pendrive itd.</p>
<h2>Szybki start</h2>
<p>Malina jest dość popularnym rozwiązaniem w swoim segmencie, nie jest oczywiście jedynym. W związku z dużą popularnością w sieci znajdziemy multum informacji, porad, przykładów zastosowań, programów. Punktem startowym jest pobranie systemu operacyjnego, są specjalnie przygotowane przez samą fundację dostępne na stronie <a rel="nofollow" target="_blank" href="http://www.raspberrypi.org/downloads#referrer=blog.vokiel.com">http://www.raspberrypi.org/downloads</a>. Jako, że moim głównym systemem jest Fedora, postanowiłem pobawić się Debianem, w związku z tym pobrałem obraz <code class="b">Raspbian “wheezy”</code>. Prędkość pobierania torrenta oraz ilość udostępniających osób tylko potwierdza dużą popularność.</p>
<h3>Przygotowanie karty</h3>
<p>Po pobraniu obrazu należy go przenieść na kartę pamięci. W pierwszej kolejności, przed podłączeniem karty sprawdzamy listę urządzeń, np za pomocą <code class="b">df -h</code>.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>def ~$ <span style="color: #c20cb9; font-weight: bold;">df</span> <span style="color: #660033;">-h</span>
System plikó<span style="color: #c20cb9; font-weight: bold;">w</span>          rozm. użyte dost. <span style="color: #000000; font-weight: bold;">%</span>uż. zamont. na
rootfs                  108G   15G   93G  <span style="color: #000000;">14</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #000000; font-weight: bold;">/</span>
devtmpfs                <span style="color: #000000;">3</span>,9G     <span style="color: #000000;">0</span>  <span style="color: #000000;">3</span>,9G   <span style="color: #000000;">0</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #000000; font-weight: bold;">/</span>dev
tmpfs                   <span style="color: #000000;">3</span>,9G  <span style="color: #000000;">1</span>,4M  <span style="color: #000000;">3</span>,9G   <span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>shm
tmpfs                   <span style="color: #000000;">3</span>,9G  820K  <span style="color: #000000;">3</span>,9G   <span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #000000; font-weight: bold;">/</span>run
<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sda2               108G   15G   93G  <span style="color: #000000;">14</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #000000; font-weight: bold;">/</span>
tmpfs                   <span style="color: #000000;">3</span>,9G     <span style="color: #000000;">0</span>  <span style="color: #000000;">3</span>,9G   <span style="color: #000000;">0</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #000000; font-weight: bold;">/</span>sys<span style="color: #000000; font-weight: bold;">/</span>fs<span style="color: #000000; font-weight: bold;">/</span>cgroup
tmpfs                   <span style="color: #000000;">3</span>,9G     <span style="color: #000000;">0</span>  <span style="color: #000000;">3</span>,9G   <span style="color: #000000;">0</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #000000; font-weight: bold;">/</span>media
<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sda3               206G   69G  128G  <span style="color: #000000;">35</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #000000; font-weight: bold;">/</span>home
<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>truecrypt1  374G  251G  104G  <span style="color: #000000;">71</span><span style="color: #000000; font-weight: bold;">%</span> <span style="color: #000000; font-weight: bold;">/</span>media<span style="color: #000000; font-weight: bold;">/</span>truecrypt1</pre></td></tr></table></div>

</p>
<p>Następnie podłączamy kartę i ponownie wywołujemy polecenie df, nowy wpis na liście wskazuje na naszą kartę pamięci, w moim przypadku było to <code class="b">/dev/sdc1</code>, które pojawiło się na końcu poprzedniej listy. </p>
<p>Karta pamięci może posiadać kilka partycji, wtedy każda z nich pokaże się osobno. Gdy już znamy lokalizację karty odmontowujemy ją korzystając z polecnia <code class="b">umount</code>.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>def ~$ <span style="color: #c20cb9; font-weight: bold;">umount</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdc1</pre></td></tr></table></div>

<p>W tym momencie przystępujemy do faktycznego przeniesienia obrazu systemu na kartę SD, użyjemy programu <a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Dd_(Unix)" title="Dd">dd</a> &#8211; służącym do niskopoziomowego kopiowania i konwersji surowych danych. Należy zwrócić szczególną uwagę na właściwe podanie parametrów, w przypadku pomyłki możemy nadpisać, a przez to stracić ważne dane. Składnia w moim przypadku wyglądała następująco:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>def ~$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">dd</span> <span style="color: #007800;">bs</span>=1M <span style="color: #007800;">if</span>=<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>vokiel<span style="color: #000000; font-weight: bold;">/</span>Downloads<span style="color: #000000; font-weight: bold;">/</span>rpi<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2012</span>-07-<span style="color: #000000;">15</span>-wheezy-raspbian.img <span style="color: #007800;">of</span>=<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sdc1</pre></td></tr></table></div>

<p>Parametr <code class="b">bs</code> to rozmiar bloku w pojedynczej operacji odczytu, parametr <code class="b">if</code> to źródło (input file), natomiast <code class="b">of</code> to cel (output file). Wykonanie tego polecenia zajmie chwilę &#8211; 1,8GB danych do przeniesienia na kartę, dużo zależy od jej prędkości zapisu.</p>
<p>Niestety program <em>dd</em> domyślnie nie wyświetla żadnego postępu, przez co oczekiwanie bez widocznych postępów jest irytujące. Aby podejrzeć jak sobie radzi skorzystamy z drugiej konsoli, w której wyszukamy proces <em>dd</em>, a następnie za pomocą polecenia <em>kill</em> spowodujemy, że dd zacznie odpowiadać:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>def ~$ pgrep <span style="color: #660033;">-l</span> <span style="color: #ff0000;">'^dd$'</span> <span style="color: #666666; font-style: italic;">#sprawdzamy id procesu</span>
vokiel<span style="color: #000000; font-weight: bold;">@</span>def ~$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">watch</span> <span style="color: #660033;">-n</span> <span style="color: #000000;">5</span> <span style="color: #c20cb9; font-weight: bold;">kill</span> <span style="color: #660033;">-USR1</span> <span style="color: #000000;">20326</span></pre></td></tr></table></div>

<p>W konsoli, w której uruchomiliśmy program <em>dd</em> powinniśmy zacząć otrzymywać informacje o postępach.</p>
<p>Po zakończeniu kopiowania dobrze jest zrobić synchronizację dysku z pamięcią, dzięki temu będziemy mieli pewność, że dane zostały fizycznie zapisane na karcie. Do tego celu służy program <em>sync</em>:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>def ~$ <span style="color: #c20cb9; font-weight: bold;">sync</span></pre></td></tr></table></div>

<p>Dostępne są też instrukcje dla systemu Windows jak i Mac OS X: <a rel="nofollow" target="_blank" href="http://elinux.org/RPi_Easy_SD_Card_Setup#referrer=blog.vokiel.com">RPi Easy SD Card Setup</a></p>
<h3>Pierwsze uruchomienie</h3>
</p>
<p>Przygotowaną kartę pamięci wkładamy do czytnika RPi, myszka, klawiatura, monitor, na koniec podłączamy zasilanie (u mnie świetnie się sprawdza ładowarka od Nokii &#8211; 5V, 1200mA). Malina nie ma włącznika, zatem włączenie/wyłączenie odbywa się odpowiednio poprzez podłączenie/odłączenie zasilania. Po podłączeniu na ekranie pojawia się coś zbliżonego do tego:</p>
<p><img src="http://blog.vokiel.com/wp-content/uploads/2012/08/boot.jpg" alt="" title="boot" width="636" height="384" class="alignright size-full wp-image-1177" /></p>
<p>Następnie pojawia się możliwość zalogowania do systemu. Domyślny login i hasło dostępne są na stronie pobierania, dla Debiana &#8222;Wheezy&#8221; to <strong>pi</strong> z hasłem: <strong>raspberry</strong>. Konto root nie ma hasła, zatem po zalogowaniu do systemu należy zmienić te dla pi (lub dodać nowe konto) oraz ustawić hasło superużytkownika.</p>
<p>Przy pierwszym uruchomieniu pojawia się możliwość dokonania wstępnej konfiguracji systemu: </p>
<p><img src="http://blog.vokiel.com/wp-content/uploads/2012/08/config1.jpg" alt="" title="config" width="660" height="328" class="alignright size-full wp-image-1182" /></p>
<p>Standardowo mamy zainstalowane i skonfigurowane środowisko graficzne, uruchamiamy je poleceniem <code class="b">startx</code><br />
<img src="http://blog.vokiel.com/wp-content/uploads/2012/08/screen1.jpg" alt="" title="screen" width="660" height="397" class="alignright size-full wp-image-1184" /></p>
<p>W taki oto sposób mamy działający komputer ze środowiskiem graficznym. Niestety szybkość działania i responsywność nie jest na najwyższym poziomie. Jednak jak na taką cenę oraz koszty użytkowania (bardzo niski pobór prądu) i przy takiej miniaturyzacji otrzymujemy na prawdę wiele. Z pewnością nie zastąpi nam desktopa/notebooka, ale jako dodatkowe narzędzie może zdziałać wiele.</p>
<h3>Początkowa konfiguracja</h3>
<p>Jako, że jest to blog webdeveloperski, to RPi w pierwszej konfiguracji zostało przetestowane pod kątem serwera www. Aby ułatwić sobie pracę skonfigurujmy system.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">pi<span style="color: #000000; font-weight: bold;">@</span>raspberrypi ~$ <span style="color: #c20cb9; font-weight: bold;">uname</span> <span style="color: #660033;">-a</span>
Linux raspberrypi 3.1.9+ <span style="color: #666666; font-style: italic;">#168 PREEMPT Sat Jul 14 18:56:31 BST 2012 armv6l GNU/Linux</span></pre></td></tr></table></div>

<p>W pierwszej kolejności ustawiamy hasło konta root, a następnie dodajemy swojego użytkownika i usuwamy domyślnego pi (lub przynajmniej zmieniamy mu hasło).</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">pi<span style="color: #000000; font-weight: bold;">@</span>raspberrypi ~$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">passwd</span> root</pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">pi<span style="color: #000000; font-weight: bold;">@</span>raspberrypi ~$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> adduser vokiel
Dodawanie użytkownika <span style="color: #ff0000;">&quot;vokiel&quot;</span>...
Dodawanie nowej grupy <span style="color: #ff0000;">&quot;vokiel&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">1002</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>...
Dodawanie nowego użytkownika <span style="color: #ff0000;">&quot;vokiel&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">1001</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #c20cb9; font-weight: bold;">w</span> grupie <span style="color: #ff0000;">&quot;vokiel&quot;</span>...
Tworzenie katalogu domowego <span style="color: #ff0000;">&quot;/home/vokiel&quot;</span>...
Kopiowanie plikó<span style="color: #c20cb9; font-weight: bold;">w</span> z <span style="color: #ff0000;">&quot;/etc/skel&quot;</span> ...
Proszę podać nowe hasło UNIX: 
Proszę ponownie podać hasło UNIX: 
passwd: hasło zostało zmienione
Zmieniam informację o użytkowniku <span style="color: #7a0874; font-weight: bold;">test</span>
Wpisz nową wartość lub wciśnij ENTER by przyjąć wartość domyś<span style="color: #c20cb9; font-weight: bold;">ln</span>ą
        Imię i nazwisko <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: Vokiel
        Numer pokoju <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: 
        Telefon <span style="color: #000000; font-weight: bold;">do</span> pracy <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: 
        Telefon domowy <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: 
        Inne <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>: 
Czy informacja jest poprawna? <span style="color: #7a0874; font-weight: bold;">&#91;</span>T<span style="color: #000000; font-weight: bold;">/</span>n<span style="color: #7a0874; font-weight: bold;">&#93;</span> T</pre></td></tr></table></div>

<p>Możemy też użyć komendy <code class="b">useradd</code></p>
<p>Dodajemy użytkownika do sudoersów:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">pi<span style="color: #000000; font-weight: bold;">@</span>raspberrypi ~$ <span style="color: #c20cb9; font-weight: bold;">su</span>
Hasło:
root<span style="color: #000000; font-weight: bold;">@</span>raspberrypi: <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>pi<span style="color: #666666; font-style: italic;"># echo &quot;vokiel ALL=(ALL:ALL) ALL&quot; &gt;&gt; etc/sudoers</span></pre></td></tr></table></div>

<p>Przelogowujemy się na nowe konto, następnie usuwamy użytkownika <strong>pi</strong></p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>raspberrypi ~$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> userdel pi</pre></td></tr></table></div>

<p>Następnie konfigurujemy adres IP. Najwygodniejszy jest stały, który możemy ustawić np poprzez router &#8211; rezerwacja IP lub ustawiając w systemie RPi. Wybrałem drugą opcję, dzięki czemu połączenie sieciowe startuje szybciej &#8211; nie musi czekać na przydzielenie adresu z DHCP. Przy okazji zmieniłem też nazwę hosta na <code class="b">rpi</code>. Po ustawieniu statycznego adresu mój pli konfiguracyjny wygląda następująco:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>rpi ~ $ <span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>network<span style="color: #000000; font-weight: bold;">/</span>interfaces
auto lo
iface lo inet loopback
&nbsp;
<span style="color: #666666; font-style: italic;">#iface eth0 inet dhcp #zakomentowana domyślna konfiguracja</span>
iface eth0 inet static
        address 192.168.1.254
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.100</pre></td></tr></table></div>

<p>Dzięki temu, możemy wyłączyć RPi, odpiąć monitor, klawiaturę, myszkę i podpiąć gdzieś koło routera, a resztę prac wykonywać zdalnie przy pomocy ssh (demon domyślnie uruchomiony).</p>
<p>Aby logowanie na zdalną maszynę z naszego komputera przebiegało sprawniej dodajemy IP Maliny do listy <code class="b">/etc/hosts</code>. Dzięki temu będziemy mogli logować się za pomocą komendy <code class="b">ssh vokiel@rpi</code></p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">root<span style="color: #000000; font-weight: bold;">@</span>def <span style="color: #000000; font-weight: bold;">/</span><span style="color: #666666; font-style: italic;"># echo &quot;192.168.1.254 rpi&quot; &gt;&gt; /etc/hosts</span></pre></td></tr></table></div>

<p>Aby nie było trzeba wpisywać hasła przy każdym logowaniu, możemy posłużyć się kluczami. Kopiujemy swój za pomocą <code class="b">ssh-copy-id</code>:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>def ~ $ ssh-copy-id vokiel<span style="color: #000000; font-weight: bold;">@</span>rpi</pre></td></tr></table></div>

<p>Pierwsze logowanie przy użyciu kluczy &#8211; nie trzeba podawać hasła:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>def ~$ <span style="color: #c20cb9; font-weight: bold;">ssh</span> vokiel<span style="color: #000000; font-weight: bold;">@</span>rpi
The authenticity of host <span style="color: #ff0000;">'rpi (192.168.1.254)'</span> can<span style="color: #ff0000;">'t be established.
RSA key fingerprint is aa:1a:25:1e:d7:fd:d9:03:73:65:5c:74:ef:9f:1d:62.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '</span>rpi,192.168.1.254<span style="color: #ff0000;">' (RSA) to the list of known hosts.
Linux rpi 3.1.9+ #168 PREEMPT Sat Jul 14 18:56:31 BST 2012 armv6l
&nbsp;
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
&nbsp;
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
&nbsp;
Type '</span>startx<span style="color: #ff0000;">' to launch a graphical session
&nbsp;
Last login: Sat Aug 11 19:20:20 2012 from def
vokiel@rpi ~ $</span></pre></td></tr></table></div>

<p>Jeśli lokalnie jesteśmy zalogowani na koncie o tej samej nazwie co konto zdalne, to wystarczy przy logowaniu podać nazwę hosta:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>def ~$ <span style="color: #c20cb9; font-weight: bold;">ssh</span> rpi</pre></td></tr></table></div>

<h3>Przydział pamięci</h3>
<p>Jako, że nie planuję korzystać z graficznego interfejsu, zmniejszyłem przydział pamięci dla grafiki:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>rpi ~ $ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #000000; font-weight: bold;">/</span>boot<span style="color: #000000; font-weight: bold;">/</span>arm224_start.elf <span style="color: #000000; font-weight: bold;">/</span>boot<span style="color: #000000; font-weight: bold;">/</span>start.elf</pre></td></tr></table></div>

<p>Po restarcie widzimy, że dostępnej pamięci jest trochę więcej (a i użytej nie tak dużo): </p>
<p><img src="http://blog.vokiel.com/wp-content/uploads/2012/08/htop.jpg" alt="" title="htop" width="397" height="197" class="aligncenter size-full wp-image-1202" /></p>
<h3>Serwer www</h3>
<p>Debian na pokładzie, zatem instalację serwera www możemy przeprowadzić korzystając ze standardowego <code class="b">apt-get install</code>. Oczywiście, możemy też pokusić się o kompilację, co w przypadku ograniczonych możliwości RPi ma duży sens. Niestety kompilacja nodejs w moim przypadku trwała ponad 2 godziny, aby na koniec rzucić błędem. Ponieważ chciałem jak najszybciej uruchomić pierwszy skrypt, skorzystałem z pakietów.</p>
<p>Sprawdzamy źródła w <code class="b">/etc/apt/sources.list</code>, następnie aktualizujemy bazy.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>rpi ~ $ <span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>apt<span style="color: #000000; font-weight: bold;">/</span>sources.list
deb http:<span style="color: #000000; font-weight: bold;">//</span>mirrordirector.raspbian.org<span style="color: #000000; font-weight: bold;">/</span>raspbian<span style="color: #000000; font-weight: bold;">/</span> wheezy main contrib non-free rpi
vokiel<span style="color: #000000; font-weight: bold;">@</span>rpi ~ $ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get update</span>
vokiel<span style="color: #000000; font-weight: bold;">@</span>rpi ~ $ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> nodejs npm
vokiel<span style="color: #000000; font-weight: bold;">@</span>rpi ~ $ <span style="color: #c20cb9; font-weight: bold;">sudo</span> npm <span style="color: #c20cb9; font-weight: bold;">install</span> nodeinfo</pre></td></tr></table></div>

<p>Tworzymy prosty skrypt pokazujący info o serwerze:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">#<span style="color: #339933;">!/</span>usr<span style="color: #339933;">/</span>bin<span style="color: #339933;">/</span>node 
&nbsp;
<span style="color: #000066; font-weight: bold;">var</span> http <span style="color: #339933;">=</span> require<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'http'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">var</span> os <span style="color: #339933;">=</span> require<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'os'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">var</span> url <span style="color: #339933;">=</span> require<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'url'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">var</span> serverIp <span style="color: #339933;">=</span> <span style="color: #3366CC;">'192.168.1.254'</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">var</span> serverPort <span style="color: #339933;">=</span> <span style="color: #3366CC;">'8080'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">function</span> addStyle<span style="color: #009900;">&#40;</span>res<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">var</span> style <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">;</span>
  style <span style="color: #339933;">+=</span> <span style="color: #3366CC;">'&lt;style type=&quot;text/css&quot;&gt;'</span><span style="color: #339933;">;</span>
  style <span style="color: #339933;">+=</span> <span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\n</span> body { font-size: 10px; font-family: Verdana, Arial, Tahoma; background: #fff;}&quot;</span><span style="color: #339933;">;</span>
  style <span style="color: #339933;">+=</span> <span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\n</span> table {collapse: collapse;} &quot;</span><span style="color: #339933;">;</span>
  style <span style="color: #339933;">+=</span> <span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\n</span> table thead tr th { font-weight: bold;} &quot;</span><span style="color: #339933;">;</span>
  style <span style="color: #339933;">+=</span> <span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\n</span> table tr td { border-bottom: 1px solid silver; vertical-align: top; padding: 5px 20px;}&quot;</span><span style="color: #339933;">;</span>
  style <span style="color: #339933;">+=</span> <span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&lt;/style&gt;&quot;</span><span style="color: #339933;">;</span>
&nbsp;
  res.<span style="color: #660066;">write</span><span style="color: #009900;">&#40;</span>style<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000066; font-weight: bold;">function</span> getRemoteAddr<span style="color: #009900;">&#40;</span>req<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">return</span> req.<span style="color: #660066;">headers</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'x-forwarded-for'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">||</span> req.<span style="color: #660066;">connection</span>.<span style="color: #660066;">remoteAddress</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000066; font-weight: bold;">function</span> log<span style="color: #009900;">&#40;</span>msg<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">var</span> now <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">new</span> <span style="">Date</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  
  <span style="color: #000066; font-weight: bold;">var</span> log <span style="color: #339933;">=</span> now.<span style="color: #660066;">toUTCString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  log <span style="color: #339933;">+=</span> <span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span> <span style="color: #339933;">+</span> msg<span style="color: #339933;">;</span>
  console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>log<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
http.<span style="color: #660066;">createServer</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>req<span style="color: #339933;">,</span> res<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  log<span style="color: #009900;">&#40;</span>getRemoteAddr<span style="color: #009900;">&#40;</span>req<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span> <span style="color: #339933;">+</span> req.<span style="color: #660066;">headers</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'user-agent'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  res.<span style="color: #660066;">writeHead</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">200</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'Content-Type'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'text/html; charset=utf-8'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  res.<span style="color: #660066;">write</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;html&gt;&lt;title&gt;Raspberrypi nodejs server&lt;/title&gt;&lt;meta charset=utf-8&quot;&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  addStyle<span style="color: #009900;">&#40;</span>res<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  res.<span style="color: #660066;">write</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;body&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  res.<span style="color: #660066;">write</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;h2&gt;Client&lt;/h2&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  res.<span style="color: #660066;">write</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;var&lt;/th&gt;&lt;th&gt;value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  res.<span style="color: #660066;">write</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;tr&gt;&lt;td&gt;User-agent: &lt;/td&gt;&lt;td&gt;'</span> <span style="color: #339933;">+</span> req.<span style="color: #660066;">headers</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'user-agent'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&lt;/td&gt;&lt;/tr&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  res.<span style="color: #660066;">write</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;tr&gt;&lt;td&gt;IP: &lt;/td&gt;&lt;td&gt;'</span> <span style="color: #339933;">+</span>  getRemoteAddr<span style="color: #009900;">&#40;</span>req<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&lt;/td&gt;&lt;/tr&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  res.<span style="color: #660066;">write</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;/tbody&gt;&lt;/table&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  res.<span style="color: #660066;">write</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;h2&gt;Server&lt;/h2&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;var&lt;/th&gt;&lt;th&gt;value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="">Object</span>.<span style="color: #660066;">keys</span><span style="color: #009900;">&#40;</span>os<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">map</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>method<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> method <span style="color: #339933;">!=</span> <span style="color: #3366CC;">'getNetworkInterfaces'</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                 res.<span style="color: #660066;">write</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;tr&gt;&lt;td&gt;'</span> <span style="color: #339933;">+</span> method <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&quot;</span><span style="color: #339933;">+</span>JSON.<span style="color: #660066;">stringify</span><span style="color: #009900;">&#40;</span>os<span style="color: #009900;">&#91;</span>method<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #3366CC;">'&lt; /pre&gt;&lt;/td&gt;&lt;/tr&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
        <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
  res.<span style="color: #660066;">write</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;/tbody&gt;&lt;/table&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  res.<span style="color: #660066;">write</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;/body&gt;&lt;/html&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  res.<span style="color: #660066;">end</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">listen</span><span style="color: #009900;">&#40;</span>serverPort<span style="color: #339933;">,</span> serverIp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
log<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Server running: '</span> <span style="color: #339933;">+</span> serverIp <span style="color: #339933;">+</span><span style="color: #3366CC;">':'</span><span style="color: #339933;">+</span>serverPort<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</p>
<p>Uruchamiamy i sprawdzamy wynik w przeglądarce</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">vokiel<span style="color: #000000; font-weight: bold;">@</span>rpi ~ $ node server.js
Sat, <span style="color: #000000;">11</span> Aug <span style="color: #000000;">2012</span> <span style="color: #000000;">18</span>:<span style="color: #000000;">30</span>:<span style="color: #000000;">10</span> GMT   Server running: 192.168.1.254:<span style="color: #000000;">8080</span>
Sat, <span style="color: #000000;">11</span> Aug <span style="color: #000000;">2012</span> <span style="color: #000000;">18</span>:<span style="color: #000000;">30</span>:<span style="color: #000000;">14</span> GMT   192.168.1.103   Opera<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">9.80</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>X11; Linux x86_64; U; pl<span style="color: #7a0874; font-weight: bold;">&#41;</span> Presto<span style="color: #000000; font-weight: bold;">/</span>2.10.289 Version<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">12.00</span></pre></td></tr></table></div>

<p><a href="http://blog.vokiel.com/wp-content/uploads/2012/08/node_www.jpg"><img src="http://blog.vokiel.com/wp-content/uploads/2012/08/node_www-1024x422.jpg" alt="" width="660" class="aligncenter size-large wp-image-1208" /></a></p>
<p>Voila! Działający serwer www, pobierający mniej niż 2W prądu. Wystarczy przekierować port na r0outerze i mamy własnego, taniego vps&#8217;a <img src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  jeśli mamy stały IP, to już całkiem bajka. </p>
<p>Przy ciągłej pracy, pod dużym obciążeniem RPi zaczyna się wyczuwalnie grzać, ale wystarczy mały radiator, aby temperatura spadła do akceptowalnego poziomu.</p>
<h2>Podsumowanie</h2>
<p>RPi to bardzo ciekawe rozwiązanie, z dnia na dzień powstają nowe pomysły na jego wykorzystanie. Skupia przy osbie dużą społeczność, która jest bardzo aktywna. Do dyspozycji mamy blogi, fora, a nawet dedykowany miesięcznik <strong>&#8222;The MagPi issue&#8221;</strong>. Na głównej stronie <a rel="nofollow" target="_blank" href="http://www.raspberrypi.org/#referrer=blog.vokiel.com">raspberrypi.org</a> pojawia się szereg infromacji o projekcie, nowości, przykłady zastosowań etc. Na dzień dzisiejszy RPi jest wykorzystywany na wiele sposobów, ciągle pojawiają się nowe. Jedne idą bardziej w kierunku automatyki, inne oprogramowania, multimediów. Popularność projektu powoduje, że powstają dedykowane RPi porty różnych aplikacji, dzięki temu można wycisnąć z Maliny jeszcze więcej.</p>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/5M_saAuy2po" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/raspberry-pi-pierwsze-starcie/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.vokiel.com/raspberry-pi-pierwsze-starcie/</feedburner:origLink></item>
		<item>
		<title>PHPCon PL 2012 – głosowanie na agendę</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/Vfccglnf5CQ/</link>
		<comments>http://blog.vokiel.com/phpcon-pl-2012-glosowanie-na-agende/#comments</comments>
		<pubDate>Thu, 19 Jul 2012 17:50:37 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[phpcon]]></category>
		<category><![CDATA[pl]]></category>
		<category><![CDATA[planetaphp]]></category>

		<guid isPermaLink="false">http://blog.vokiel.com/?p=1128</guid>
		<description><![CDATA[Rusza kolejna (trzecia) edycja ogólnopolskiej konferencji entuzjastów PHP. Tak samo jak w przypadku poprzednich edycji, organizatorem jest zarząd stowarzyszenia Polska Grupa Użytkowników Linuxa (PLUG). Spotkanie odbędzie się w ostatni weekend września &#8211; w hotelu „Przedwiośnie”, w Mąchocicach Kapitulnych (kapitalna nazwa) koło Kielc. PHPCon Poland 2012 Tegoroczna konferencja objęta została sponsoringiem firmy MegiTeam, swój wkład potwierdzili [...]]]></description>
				<content:encoded><![CDATA[<p><a rel="nofollow" target="_blank" href="http://blog.vokiel.com/wp-content/uploads/2012/07/logo.png"><img src="http://blog.vokiel.com/wp-content/uploads/2012/07/logo.png" alt="phpcon2012-logo" title="phpcon2012-logo" width="173" height="44" class="alignright size-full wp-image-1130" /></a> Rusza kolejna (trzecia) edycja ogólnopolskiej konferencji entuzjastów PHP. Tak samo jak w przypadku poprzednich edycji, organizatorem jest zarząd stowarzyszenia <a href="http://www.linux.org.pl/#referrer=blog.vokiel.com">Polska Grupa Użytkowników Linuxa (PLUG)</a>. Spotkanie odbędzie się w ostatni weekend września &#8211; w hotelu „Przedwiośnie”, w Mąchocicach Kapitulnych (kapitalna nazwa) koło Kielc.<br />
<span id="more-1128"></span></p>
<h2>PHPCon Poland 2012</h2>
<p>Tegoroczna konferencja objęta została sponsoringiem firmy <strong>MegiTeam</strong>, swój wkład potwierdzili też <strong>Microsoft</strong> oraz <strong>Mentax</strong>. Impreza pod medialnym patronatem serwisów <strong>php.pl</strong>, <strong>OSWorld</strong>, <strong>OSNews</strong>, <strong>7thguard.net</strong> oraz <strong>webhosting.pl</strong>. A od teraz, też <strong><a href="http://blog.vokiel.com/phpcon-pl-2012-glosowanie-na-agende" title="Vokiel.com" target="_blank">blog.Vokiel.com</a></strong>.</p>
<p>Co nam przyniesie tegoroczna edycja? Przede wszystkim bardzo istotną zmianę &#8211; uczestnicy mają po raz pierwszy realny wpływ na agendę. To właśnie głosy uczestników zadecydują o tym kogo i z czym będzie można usłyszeć podczas konferencji.  </p>
<p>Na agendę (poszczególne prelekcje) można głosować na stronie <a rel="nofollow" target="_blank" href="http://www.phpcon.pl/agenda#referrer=blog.vokiel.com" title="Agenda">www.phpcon.pl/agenda</a>. W chwili tworzenia tego wpisu dostępnyc jest 29 propozycji &#8211; jest o co walczyć, bo w programie spotkania ma szansę pojawić się ich tylko kilkanaście. Prelekcje zostaną dobrane na podstawie liczby oddanych głosów w rankingu, rozpiętość jest już dość znaczna &#8211; od <strong>7</strong> do <strong>39</strong> głosów. </p>
<p>Warto wspomnieć o gościach specjalnych, w tym roku są to:</p>
<ul class="nice-list">
<li><a rel="nofollow" target="_blank" href="http://www.wimgodden.be/#referrer=blog.vokiel.com" title="Wim Godden" target="_blank">Wim Godden</a>, który ma w swoim dorobku pracę dla takich projektów jak choćby PHPAdsNew, a w tej chwili zajmuje się skalowalnością i HA.
</li>
<li><a rel="nofollow" target="_blank" href="http://blog.feryn.eu/#referrer=blog.vokiel.com" title="Thijs Feryn" target="_blank">Thijs Feryn</a> – organizator konferencji PHPBenelux oraz ewangelista odpowiedzialny za kontakty społecznościowe z belgijskiego Combella – firmy hostującej m.in. joind.in.
</li>
<li><a rel="nofollow" target="_blank" href="https://twitter.com/HornCologne#referrer=blog.vokiel.com" title="Jam MacGuire" target="_blank">Jam McGuire</a> – drupalista duszą i ciałem, pracujący dla niemieckiej firmy Aquia i reprezentujący Drupala, gdy tylko nadarzy się okazja.
</li>
</ul>
<h3>Czas i miejsce</h3>
<p>PHPCon 2012 odbędzie się w dniach 28 &#8211; 30 września 2012 r w miejscowości Mąchocice Kapitulne (rejon Gór Świętokrzyskich). Miejscem wystąpień będzie położony niedaleko Kielc <a rel="nofollow" target="_blank" href="http://www.hotelprzedwiosnie.pl/#referrer=blog.vokiel.com">Hotel Przedwiośnie ***</a>.</p>
<p>Do tych co wybierają się na PHP Con 2012 &#8211; do zobaczenia we wrześniu!</p>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/Vfccglnf5CQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/phpcon-pl-2012-glosowanie-na-agende/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.vokiel.com/phpcon-pl-2012-glosowanie-na-agende/</feedburner:origLink></item>
		<item>
		<title>WordCamp Poznań 2011 – moje wystąpienie</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/XZCYfGL98Gw/</link>
		<comments>http://blog.vokiel.com/wordcamp-poznan-2011-moje-wystapienie/#comments</comments>
		<pubDate>Tue, 08 May 2012 18:58:05 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[konferencja]]></category>
		<category><![CDATA[wtyczki]]></category>

		<guid isPermaLink="false">http://blog.vokiel.com/?p=1117</guid>
		<description><![CDATA[Stowarzyszenie „ABSOLWENCI NA WALIZKACH” w swoim kanale na Youtube.com umieściło nowe nagrania z zeszłorocznego WordCamp’a. W tej serii znalazło się też moje wystąpienie: Tworzenie wtyczek – oszczędzaj swój czas]]></description>
				<content:encoded><![CDATA[<div id="attachment_996" class="wp-caption alignright" style="width: 210px"><a rel="nofollow" target="_blank" href="http://2011.poznan.wordcamp.org/prelegenci/#robert-mikolajuk"><img src="http://blog.vokiel.com/wp-content/uploads/2011/12/bylem-speakerem.jpg" alt="" title="WordCamp Poznań 2011" width="200" height="200" class="size-full wp-image-996" /></a><p class="wp-caption-text">WordCamp Poznań 2011</p></div>
<p>Stowarzyszenie <em><a rel="nofollow" target="_blank" href="http://absolwencinawalizkach.pl/#referrer=blog.vokiel.com" title="ABSOLWENCI NA WALIZKACH" target="_blank">ABSOLWENCI NA WALIZKACH</a></em> w swoim <a rel="nofollow" target="_blank" href="http://www.youtube.com/user/absolwenciwsieci#referrer=blog.vokiel.com" title="ABSOLWENCI NA WALIZKACH" target="_blank">kanale na Youtube.com</a> umieściło nowe nagrania z zeszłorocznego WordCamp&#8217;a. To już druga seria nagrań z tej konferencji, w tej pojawiło się także moje wystąpienie. W pierwszej serii pojawiły się prezentacje czterech prelegentów: Arek Stęplowski, Michał Maćkowiak, Maciej Kuchnik, Magdalena Bród. Druga okazała się trochę bardziej rozbudowana: Szymon Skulimowski, Marcin Wolak, Marcin Pietrzak, Bartosz Bilicki, Paweł Pela oraz Robert Mikołajuk.</p>
<p>Zapraszam do zapoznania się z <a href="http://blog.vokiel.com/wordcamp-poznan-2011-relacja" title="WordCamp Poznań 2011 – relacja" target="_blank">moją relacją </a>z tego wydarzenia, a także do obejrzenia nagrań z wielu ciekawych wystąpień.</p>
<p><span id="more-1117"></span></p>
<h2>Moje wystąpienie</h2>
<p>Tematem mojej prezentacji było tworzenie wtyczek, główne punkty to m.in:</p>
<ul class="nice-list">
<li>Wstęp o WordPress i o sile wtyczek</li>
<li>Podstawy wtyczek</li>
<li>Organizacja pracy, zasady tworzenia, podstawowe błędy</li>
<li>Praktyczny przykład tworzenia wtyczki od podstaw</li>
<li>Integracja z panelem administracyjnym</li>
</ul>
<h2>Moje wystąpienia (playlista)</h2>
<h2>
<iframe width="640" height="360" src="http://www.youtube.com/embed/videoseries?list=PLEBC20EAE4D52D430&amp;hl=pl_PL" frameborder="0" allowfullscreen></iframe></h2>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/XZCYfGL98Gw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/wordcamp-poznan-2011-moje-wystapienie/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.vokiel.com/wordcamp-poznan-2011-moje-wystapienie/</feedburner:origLink></item>
		<item>
		<title>Workspace czyli moje środowisko pracy</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/May2UfGmJDk/</link>
		<comments>http://blog.vokiel.com/workspace-czyli-moje-srodowisko-pracy/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 16:17:44 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[XYZ]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.vokiel.com/?p=1092</guid>
		<description><![CDATA[Miesiąc temu Radek Benkel na swoim blogu popełnił ciekawy wpis o własnym środowisku pracy. Kontynuując temat publikuję opis swojego, pod tym samym tytułem.]]></description>
				<content:encoded><![CDATA[<p><img src="http://blog.vokiel.com/wp-content/uploads/2012/04/logo-300x83.jpg" alt="vokiel.com-logotyp" width="300" height="83" class="alignright size-medium wp-image-1108" style="padding:15px;"/> Miesiąc temu <a rel="nofollow" target="_blank" href="http://www.twitter.com/singlespl#referrer=blog.vokiel.com" title="singlespl" target="_blank">Radek Benkel</a> na swoim blogu popełnił ciekawy wpis o własnym <a rel="nofollow" target="_blank" href="http://blog.rbenkel.me/2012/03/workspace-czyli-moje-srodowisko-pracy/#referrer=blog.vokiel.com" title="Workspace czyli moje środowisko pracy" target="_blank">środowisku pracy</a>. Kontynuując temat publikuję opis swojego, pod tym samym tytułem. Taka wymiana doświadczeń zwykle jest bardzo ciekawa, pozwala poznać czyjeś techniki, programy, przyzwyczajenia, które mogą okazać się lepsze od naszych. W dużej mierze skorzystam z podziału Radka, dzięki temu czytelnikom będzie łatwiej porównywać takie zestawienia.<br />
<span id="more-1092"></span></p>
<h2>Hardware</h2>
<p>Ze sprzętem zawsze mam problem, bo podchodzę do wyboru bardzo pragmatycznie. Porównuję konfiguracje, parametry, nadaje im wagi, wybieram konkretny model w wyniku długotrwałych porównań. Tak też było ostatnim razem, ważna była wielkość matrycy, i7 ze wsparciem dla AES i wirtualizacji, szybki dysk, niska cena <img src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Excel w ruch i voila, wybrałem ASUS&#8217;a:<br />
<strong>ASUS X43S</strong>: <em>14&#8243;, i7-2670QM, 2,26GHz, 8GB RAM, 750 GB SATA 7200 obr., Radeon HD 6730M 2048 MB DDR3 (pamieć własna).</em><br />
Dlaczego nie Apple? Nie chcę zaczynać flame, ale jakoś nie czuję, żeby MacOSX był wart 3 000zł.</p>
<p>W zestawie myszka bezprzewodowa Logitech M525 oraz monitor Philips Brilliance 225PL &#8211; z możliwością ustawienia w <em>&#8222;trzech wymiarach&#8221;</em>, bez dodatkowej klawiatury &#8211; brak miejsca na biurku, ale już nie tak długo ulegnie to zmianie.</p>
<p>Do tego stary laptop ma Win7 x64 do testów pod Windowsem.</p>
<p>Telefon &#8211; Nokia e52. Smartfony jakoś mnie nie przekonują, z założenia telefon ma służyć do dzwonienia i pisania sms. Ten ma jeszcze bardzo dobrą nawigację, Opera mobile do szybkiego sprawdzenia czegoś na necie (Wi-Fi), putty w razie konieczności nagłej interwencji na serwerze,  czytnik kodów QR, własna appka typu ToDoList (html+javascript). Możliwości duże, telefon mały, bateria trzyma do dwóch tygodni.</p>
<h2>Software</h2>
<ul class="nice-list">
<li><strong>system operacyjny</strong> &#8211; Linux Fedora 16, poprzednio Windows 7 oraz Linux Mint, wcześniej jeszcze czysty Debian. Debian nadal stoi na VM, jeden Mint na najstarszym Laptopie.</li>
<li><strong>application stack</strong> &#8211; PHP 5.3, Apache2, MySQL &#8211; HeidiSQL (wine) &#8211; tak jak zauważył Radek Heidi jest po prostu świetne, czasem jeszcze MySQL Workbench</li>
<li><strong>framework</strong> &#8211; Kohana</li>
<li><strong>IDE</strong> &#8211; Eclipse, jakoś NetBeans nie przypadł mi do gustu, przyzwyczajenie wygrywa, PHPStorm w testach trial&#8217;a wypadło bardzo dobrze, prawdopodobnie niedługo kupię</li>
<li><strong>edytor tekstowy</strong> &#8211; genialny, niezastąpiony Notepad++, w konsoli nano</li>
<li><strong>IM</strong> &#8211; Pidgin, z kilkoma wtyczkami jest na prawdę przyjazny, poza XMPP obsługuje też Twitter&#8217;a, IRC&#8217;a, no i Gadu-Gadu, do tego Skype &#8211; ten linuxowy jest taki świetnie minimalistyczny, o niebo przyjaźniejszy niż na Win</li>
<li><strong>launcher</strong> &#8211; po prostu ALT+F2</li>
<li><strong>przeglądarka</strong> &#8211; główna Opera &#8211; subiektywnie od dawien-dawna jest najwygodniejsza do codziennej pracy, poza tym wiadomo: Firefox, Chrome, Krusader, IE8 na VM z WinXP, IE9 na drugim laptopie z Win7</li>
<li><strong>terminal</strong> &#8211; standardowy z ustawionymi kolorami, bash</li>
<li><strong>menadżer pakietów</strong> &#8211; yum oraz apper</li>
<li><strong>VM</strong> &#8211; VirtualBox, chociaż powoli rozglądam się za alternatywą, bo VBox potrafi być irytujący</li>
<li><strong>FTP</strong> &#8211; FileZilla, Krusader, w niektórych przypadkach SSHFS</li>
<li><strong>mail</strong> &#8211; Thunderbird, dla niektórych kont webowy GMail, wcześniej TheBat</li>
<li><strong>muzyka</strong> &#8211; Amarok, ale brakuje mi prostego Winampa czy ALSong</li>
<li><strong>video</strong> &#8211; VLC, MPlayer, najbardziej przywiązany byłem do SubEdit&#8217;a oraz Media Player Classic</li>
<li><strong>pakiet biurowy </strong>- LibreOffice, na Win Office 2007 &#8211; co by nie mówić, jest to świetny program</li>
<li><strong>prezentacje</strong> &#8211; generalnie nie robię <img src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> , ostatnio na Wordcamp&#8217;a w HTML+CSS &#8211; engine z Google, poza tym Impress lub PowerPoint <img src='http://blog.vokiel.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </li>
</ul>
<h3>Z rzeczy , o których Radek nie pisał:</h3>
<ul class="nice-list">
<li><strong>monitoring serwera </strong>- munin, phpmemcached. Dodatkowo jeśli mogę to tu podpiąc &#8211; conky rysujący najważniejsze rzeczy na bieżąco</li>
<li><strong>zarządzanie projektami</strong> &#8211; repozytorium git i svn, spięte razem z Redmine</li>
<li><strong>manager plików </strong>- krusader lub mc, na Win &#8211; TotalCommander. Nie wyobrażam sobie pracy pomiędzy okienkami</li>
<li><strong>grafika</strong> &#8211; Photoshop, FastStone Image Viewer, Gwenview</li>
<li><strong>rss</strong> &#8211; czytnik Google, wcześniej w Operze</li>
<li><strong>snippets</strong> &#8211; JCC (jCodeCollector), opisowe &#8211; Gnote</li>
<li><strong>ważne dane </strong>- TrueCrypt</li>
</ul>
<h2>Podsumowanie</h2>
<p>Jeśli chcecie poznać jakieś szczegóły, sposoby pracy czy interesuje Was coś więcej &#8211; piszcie śmiało w komentarzach.<br />
Przekazuję piłeczkę dalej, kto następny chętny do opisania swojego środowiska pracy?</p>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/May2UfGmJDk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/workspace-czyli-moje-srodowisko-pracy/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.vokiel.com/workspace-czyli-moje-srodowisko-pracy/</feedburner:origLink></item>
		<item>
		<title>protectEmails jQuery plugin</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/j-TcvqDzxm4/</link>
		<comments>http://blog.vokiel.com/protectemails-jquery-plugin/#comments</comments>
		<pubDate>Sun, 29 Jan 2012 14:00:53 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[planetaphp]]></category>
		<category><![CDATA[spam]]></category>

		<guid isPermaLink="false">http://blog.vokiel.com/?p=1047</guid>
		<description><![CDATA[Wtyczka do jQuery dająca ochronę przed spam-botami. Dwuetapowe działanie - chroni przed botami, nawet przy wyłączonym JavaScript.]]></description>
				<content:encoded><![CDATA[<div id="attachment_1080" class="wp-caption alignright" style="width: 260px"><img src="http://blog.vokiel.com/wp-content/uploads/2012/01/nospam.jpg" alt="" title="nospam" width="250" height="200" class="size-full wp-image-1080" /><p class="wp-caption-text">src: http://http.cdnlayer.com</p></div>
<p>Ochrona własnego adresu poczty elektronicznej stała się &#8222;oczywistą oczywistością&#8221;. Niezliczone spam-boty przeczesują Internet w poszukiwaniu adresów email, które później zalewane są falą niechcianej poczty. Niestety często jesteśmy zmuszeni udostępnić swój adres. Wpisany zwykłym tekstem, a tym bardziej dodany do linku z <code class="b">mailto</code> stanie się bardzo szybko łupem spamerów. O ile na formę upublicznienia adresu w obcych serwisach zwykle nie mamy wpływu, o tyle mamy w przypadku własnych. Jako, że potrzeba jest matką wynalazku, postanowiłem stworzyć własne rozwiązanie. Połączenie CSS i JavaScript przyniosło oczekiwany skutek.</p>
<p><span id="more-1047"></span></p>
<h2>Założenia protectEmails</h2>
<p>Tworząc założenia starałem się patrzeć na problem możliwie z wielu stron. Najważniejszymi punktami są:</p>
<ol class="nice-list">
<li>Czytelność dla użytkownika końcowego</li>
<li>Ochrona przed podstawowymi mechanizmami spam-botów</li>
<li>Łatwość modyfikacji wyglądu</li>
<li>Prostota w stosowaniu</li>
</ol>
<h3>Czytelność dla użytkownika końcowego</h3>
<p>Przede wszystkim chciałem uniknąć rozwiązań typu <code class="b">info [at] example.com</code>, które poza tym, że już dawno nie chronią przed botami, to dodatkowo są męczące dla użytkowników. Wszystkie odmiany tego rozwiązania charakteryzują się tą samą trudnością w pozyskaniu maila przez odwiedzającego stronę &#8211; podmiana fragmentów, łatwość pomyłki. Tworząc swoje rozwiązanie, chciałem, aby adres email był widoczny w zwykłej formie, po prostu jako <code class="b">info@example.com</code>.</p>
<p>Dodatkowo, uważam, że ważne jest też zachowanie standardowej funkcjonalności linku, który otwiera domyślny program pocztowy klienta.</p>
<h3>Ochrona przed podstawowymi mechanizmami spam-botów</h3>
<p>Rozwiązanie musi być w jakiś sposób unikatowe, tak aby standardowe funkcje spamerów nie były w stanie takiego adresu wyłuskać. Oczywiście, nie da się zabezpieczyć w 100%, zawsze znajdzie się ktoś, kto napisze dedykowane rozwiązanie. Jednak dużą część automatów można wyeliminować.</p>
<p>Poszukując gotowych rozwiązań spotkałem się z dużą ilością pseudo-zabezpieczeń. Nie dość, że utrudniają one życie użytkownikom, to dodatkowo wystawiają adresy na pastwę botów, np.:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;mailto:info@example.com&quot;</span>&gt;</span>info [ at ] example.com<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span></pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;mailto:info@example.com&quot;</span>&gt;</span>info [ at ] example [dot] com<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span></pre></td></tr></table></div>

<p>Lub po prostu utrudniają życie, np.:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;email&quot;</span>&gt;</span>info [ at ] example [dot] com<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span>spam&gt;</span></pre></td></tr></table></div>

<p>W przypadku powyższego istnieją rozwiązania oparte na JavaScript, które na podstawie klasy modyfikują znacznik span, przerabiając go na klikalny adres email. Jest to dość dobre rozwiązanie z jednym mankamentem &#8211; adres jest czytelny dla botów.</p>
<h3>Łatwość modyfikacji wyglądu</h3>
<p>Oczywiście chroniony adres musi być w pełni modyfikowalny przy pomocy CSS, zatem odpadają dziwne rozwiązania oparte na obrazkach zamiast znaku <code class="b">@</code>. Chciałem też uniknąć dużego zagnieżdżania znaczników, jak w proponowanym przez niektórych rozwiązaniu:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;mailto:info@example.com&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;n&quot;</span>&gt;</span>info<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;at&quot;</span>&gt;</span>@<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;d&quot;</span>&gt;</span>example.com<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span></pre></td></tr></table></div>

<p>Czy modyfikacji powyższego, poprzez zamianę kolejności znaczników i taką modyfikację CSS, aby elementy zostały ustawione w odpowiedniej kolejności:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;mailto:info@example.com&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;at&quot;</span>&gt;</span>@<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;n&quot;</span>&gt;</span>info<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;d&quot;</span>&gt;</span>example.com<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span></pre></td></tr></table></div>

<h3>Prostota w stosowaniu</h3>
<p>Wraz z wzrostem bezpieczeństwa zwykle rośnie też poziom skomplikowania, co niestety, przekłada się na utrudnienia w stosowaniu. Niestety te rozwiązanie nie zadziała w powiązaniu ze standardowymi edytorami WYSIWYG. Oczywiście nic nie stoi na przeszkodzie, aby dopisać odpowiednie modyfikacje.</p>
<p>W obecnej wersji wstawienie zabezpieczonego adresu email sprowadza się w zasadzie do dwóch zadań: wpisanie znacznika z adresem oraz podpięcia pluginu (oczywiście pamiętając do dołączeniu biblioteki jQuery):</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> data-user<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;admin&quot;</span> data-domain<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;example.com&quot;</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;protect-emails&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'span'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">filter</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.protect-emails'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">protectEmails</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Chcąc uniezależnić się od JavaScript lub zachować jedynie podstawową funkcjonalność, należy też załączyć odpowiedni fragment CSS (domyślnie plugin dodaje go sam):</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.protect-emails</span><span style="color: #3333ff;">:after </span><span style="color: #00AA00;">&#123;</span>  <span style="color: #000000; font-weight: bold;">content</span><span style="color: #00AA00;">:</span> attr<span style="color: #00AA00;">&#40;</span>data-user<span style="color: #00AA00;">&#41;</span> <span style="color: #ff0000;">'@'</span> attr<span style="color: #00AA00;">&#40;</span>data-domain<span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<h2>Zasada działania</h2>
<p>Pierwsza część rozwiązania skupia się na zaprezentowaniu adresu użytkownikowi, nawet jeśli JavaScript jest wyłączony. Dzieje się to za pomocą prostego zabiegu wykorzystującego CSS, a dokładnie właściwości <code class="b">content</code> wspartej wykorzystaniem <code class="b">attr</code></p>
<p>Dzięki ustawieniu odpowiedniego ostylowania, element html, który domyślnie nic nie wyświetla, pokazuje użytkownikowi poprawnie wyglądający email:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> data-user<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;admin&quot;</span> data-domain<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;example.com&quot;</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;protect-emails&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="code"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.protect-emails</span><span style="color: #3333ff;">:after </span><span style="color: #00AA00;">&#123;</span> 
    <span style="color: #000000; font-weight: bold;">content</span><span style="color: #00AA00;">:</span> attr<span style="color: #00AA00;">&#40;</span>data-user<span style="color: #00AA00;">&#41;</span> <span style="color: #ff0000;">'@'</span> attr<span style="color: #00AA00;">&#40;</span>data-domain<span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p><strong>Przykład 1:</strong></p>
<p><iframe style="width: 100%; height: 80px" src="http://jsfiddle.net/vokiel/xHJ8d/1/embedded/result,html,css/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<p>Kolejnym elementem jest dodanie &#8222;klikalności&#8221;. Jest to już rozwiązanie oparte na JavaScript. Nie ma tu czego opisywać, po prostu dla wybranej akcji <code class="b">hover</code> czy <code class="b">click</code> skrypt podmienia znacznik <code class="b">span</code>.</p>
<p><strong>Przykład 2:</strong></p>
<p><iframe style="width: 100%; height: 80px" src="http://jsfiddle.net/vokiel/Sj6kB/embedded/result,js,html,css/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<h2>Korzyści</h2>
<ul class="nice-list">
<li>Niewątpliwie największą korzyścią jest ukrycie adresu email przed botami, przynajmniej do czasu, stworzenia dedykowanego rozwiązania <img src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Nawet jeśli takie powstanie, wtyczkę można łatwo przerobić pod własne unikalne rozwiążanie.</li>
<li>Zachowuje się pierwotną funkcjonalność.</li>
<li>Adres jest czytelny dla użytkowników nawet w przypadku wyłączonego JavaScript. Można go skopiować, wkleić w programie pocztowym, nie trzeba przepisywać <code class="b">[at]</code> na <code class="b">@</code></li>
<li>Dwuetapowe zabezpieczenie może być wykorzystane tylko w części, zapewniając podstawowy poziom ochrony.</li>
</ul>
<div class="source_demo_container"> <a rel="nofollow" target="_blank" rel="nofollow" target="_blank" href="https://github.com/vokiel/protectEmails#referrer=blog.vokiel.com" class="source" title="Źródła">Źródła</a></div>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/j-TcvqDzxm4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/protectemails-jquery-plugin/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://blog.vokiel.com/protectemails-jquery-plugin/</feedburner:origLink></item>
		<item>
		<title>Meet.js Summit 2012 Relacja</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/vnXuLR2J5m4/</link>
		<comments>http://blog.vokiel.com/meet-js-summit-2012-relacja/#comments</comments>
		<pubDate>Sat, 21 Jan 2012 16:22:33 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[konferencja]]></category>
		<category><![CDATA[planetaphp]]></category>

		<guid isPermaLink="false">http://blog.vokiel.com/?p=1016</guid>
		<description><![CDATA[Poznań, 14 stycznia 2012 r – konferencja meet.js summit, która była niejako podsumowaniem lokalnych spotkań meet.js. Są to niekomercyjne meetup’y front-endowców, na których prezentowane są prelekcje na tematy webowe (front-endowe), jts HTML, JS, CSS.]]></description>
				<content:encoded><![CDATA[<p><img src="http://blog.vokiel.com/wp-content/uploads/2012/01/summit.meet_.js_logo.jpg" alt="meet.js summit logo"  width="279" height="121" class="alignright size-full wp-image-1017" /></p>
<p>Poznań, 14 stycznia 2012 r &#8211; konferencja <a rel="nofollow" target="_blank" href="http://summit.meetjs.pl/#referrer=blog.vokiel.com" title="meet.js Summit" target="_blank">meet.js summit</a>, choć minął już tydzień od tego wydarzenia, ja wciąż jestem pod wrażeniem. Konferencja była niejako podsumowaniem lokalnych spotkań <strong><a rel="nofollow" target="_blank" href="http://meetjs.pl/#referrer=blog.vokiel.com" title="meet.js" target="_blank">meet.js</a></strong>. Są to niekomercyjne meetup&#8217;y front-endowców, na których prezentowane są prelekcje na tematy webowe (front-endowe), jts HTML, JS, CSS.</p>
<p><span id="more-1016"></span></p>
<h2>Organizacja</h2>
<p>Konferencję zorganizowali <a rel="nofollow" target="_blank" href="http://ferrante.pl/frontend/javascript/meet-js-summit-2012/#referrer=blog.vokiel.com" title="meet.js summit 2012" target="_blank">Damian Wielgosik</a> wraz z <a rel="nofollow" target="_blank" href="http://poznan.gtug.pl/#referrer=blog.vokiel.com" title="GTUG Poznań" target="_blank">GTUG Poznań</a> oraz <a rel="nofollow" target="_blank" href="http://startup-it.pl/#referrer=blog.vokiel.com" title="Startup-It.pl" target="_blank">Startup-It.pl</a>. Obsługa uczestników  przebiegała szybko i sprawnie, technicy pod ręką, wszyscy chętni do pomocy. Chylę czoła za jakość organizacji tego darmowego(!) eventu.</p>
<p><strong>Miejsce</strong>: Centrum Wykładowe Politechnki Poznańskiej &#8211; duży, przestronny, nowoczesny budynek, sale wykładowe, sporo wolnego miejsca na korytarzach. Dzięki temu prezentacje na były łatwiejsze w odbiorze, a duża przestrzeń na korytarzach spokojnie pomieściła te ponad 250 osób. Nawet podczas przerw kawowych czy lunchu.</p>
<p><strong>Gadżety</strong>: dużym zaskoczeniem była duża ilość gadżetów i nagród. Sponsorzy spisali się świetnie. Były naklejki meet.js i Front-Trends, smycze od Mozilli oraz Allegro Group, zniżki 10€ na konferencję Front-Trends 2012. Poza tym do zgarnięcia były kubki i koszulki Google, naklejki HTML5, koszulki Mozilli, Nodejitsu i HTML5, pendrive&#8217;y i smycze Nokii. Każdy dostał koszulkę, przy tym wartym wspomnienia jest, że można było zaprojektować własną lub zaproponować tekst do chmurki z komiksu. Wykazując się taką inwencją brało się udział w konkursie, w którym główną nagrodą był iPod!</p>
<p><img src="http://blog.vokiel.com/wp-content/uploads/2012/01/meetjs_tshirts_650x228.jpg" alt="" title="meetjs t-shirts" width="650" height="228" class="aligncenter size-full wp-image-1026" /></p>
<p>To nie koniec, były ciastka, a do nich kawa i/lub herbata (woda dla unikających używek <img src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ). Był też lunch (3 dania do wyboru), tak jak reszta &#8211; darmowy. Po całodniowej konferencji nastąpiło zasłużone afterparty (dzięki Cognifide), na którym każdy z uczestników otrzymał kupony do wykorzystania w barze.</p>
<h2>Przebieg i prezentacje</h2>
<p>Całość rozpoczęła się od 10 rano (rejestracja od 9) a zakończyła następnego dnia w godzinach porannych w Alcatraz Club. Prezentacje były przeplatane z przerwami kawowymi oraz lunch&#8217;em. Był zatem czas na zmianę sali oraz przygotowanie dawki kofeiny.</p>
<p>Z racji dużej liczby prezentacji (18) całość została podzielona na 2 ścieżki. Osobiście nie przepadam za takimi rozwiązaniami bo czasem jest bardzo trudno się zdecydować, którą prelekcję wybrać. Z tego względu nie uczestniczyłem we wszystkich w których bym chciał. Na szczęście całość wystąpień była nagrywana, zatem jest szansa, że zobaczę te, które niestety ominąłem.</p>
<p>Prelekcje były różne, na różnym poziomie przygotowania merytorycznego i technicznego oraz językowego (wszystkie po angielsku). Niektórzy wypadli świetnie, inni nieco gorzej.</p>
<p>Po tygodniu, mocno w pamięci zostały prezentacje, m.in: </p>
<ul>
<li><strong>Marek Stępień</strong>: The Web is Open. Let&#8217;s keep it that way &#8211; ciekawie o inicjatywie Open Web</li>
<li><strong>Andrzej Mazur</strong>: CSS4 and the future of CSS &#8211; o nowinkach w przyszłych specyfikacjach CSS</li>
<li><strong>Kamil Trebunia</strong>: Game design patterns &#8211; live coding (oparty na revertach commitów), plus świetne komentarze <em>Now we have more time to enjoy the children dying.</em>, <em>Dying is something you can subscribe to</em></li>
<li><strong>Lukas Nowacki</strong>: Team building and development practices &#8211; o ulepszaniu programowania w stylu Tarantino jak przystało na prawdziwych <em>reservoir devs</em></li>
<li><strong>Aleksander Dąbrowski</strong>: Write once &#8211; use twice (Back &#038; Front) &#8211; o nie duplikowaniu, o nieduplikowaniu kodu</li>
<li><strong>Zef Hemel</strong>: Avoiding JavaScript Pitfalls Through Tree Hugging &#8211; o przytulaniu się do drzewa</li>
<li><strong>Bartosz Szopka</strong>: CSS 3D Transforms &#8211; za pomocą CSS 3D transforms &#8211; impress.js jest na prawdę <em>impressive</em></li>
<li><strong>Patrick H. Lauke</strong>: HTML5 multimedia &#8211; browser-native video, audio and canvas &#8211; o audio i viedeo  z niesamowitymi demami z wykorzystaniem kamery internetowej, elementu video i <a href="http://blog.vokiel.com/kategoria/javascript" title="JavaScript">JavaScript</a></li>
</ul>
<h2>Podsumowanie</h2>
<p><a href="http://blog.vokiel.com/wp-content/uploads/2012/01/meetjs_comic_1200x925.jpg"><img src="http://blog.vokiel.com/wp-content/uploads/2012/01/meetjs_comic_1200x925-300x231.jpg" alt="" title="meetjs t-shirt comic" width="300" height="231" class="alignright size-medium wp-image-1028" /></a></p>
<p>Bardzo szybko zebrane prezentacje są do obejrzenia na profilu <a rel="nofollow" target="_blank" href="https://plus.google.com/u/0/110191013153077917985/posts/5U4XmoQkQeR#referrer=blog.vokiel.com" title="All #meetjs summit slides gathered in one place" target="_blank">G+ GTUG&#8217;a</a>, z niecierpliwością czekam na nagrania.</p>
<p>Świetna impreza, miła atmosfera, sporo znajomych osób. Oczywiście była reprezentacja <a rel="nofollow" target="_blank" href="http://forum.kohanaphp.pl#referrer=blog.vokiel.com" title="FORUM Polskiego Supportu KOHANA Framework" target="_blank">forum.kohanaphp.pl</a> &#8211; pzdr <a rel="nofollow" target="_blank" href="http://mck.blip.pl/#referrer=blog.vokiel.com" title="mck" target="_blank">@mck</a>, <a rel="nofollow" target="_blank" href="https://twitter.com/supernrm#referrer=blog.vokiel.com" title="supernrm" target="_blank">@nrm</a>). Był też <a rel="nofollow" target="_blank" href="http://chemikpil.pl/#referrer=blog.vokiel.com" title="chemikpil" target="_blank">@chemikpl</a>, którego poznałem osobiście na ostatnim <a rel="nofollow" target="_blank" href="http://blog.vokiel.com/wordcamp-poznan-2011-relacja" title="WordCamp Poznań 2011 – relacja">WordCamp&#8217;ie</a> i inni. Kolejny raz pojawiły się okazje do osobistego poznania tych, których kojarzyło się z neta, pozdr <a href="http://wookieb.pl/#referrer=blog.vokiel.com" title="Łukasz Kużyński" target="_blank">@wokiebpl</a>, <a rel="nofollow" target="_blank" href="http://blog.rbenkel.me/#referrer=blog.vokiel.com" title="Radosław Benkel" target="_blank">@singlespl</a> oraz <a rel="nofollow" target="_blank" href="http://blog.end3r.com/187/relacja-z-meet-js-summit-z-punktu-widzenia-prelegenta/#referrer=blog.vokiel.com" title="Andrzej Mazur" target="_blank">@end3r</a>.</p>
<p>Inne relacje: <a rel="nofollow" target="_blank" href="http://blog.end3r.com/187/relacja-z-meet-js-summit-z-punktu-widzenia-prelegenta/#referrer=blog.vokiel.com" title="Relacja z meet.js Summit z punktu widzenia prelegenta" target="_blank">end3r</a>, <a rel="nofollow" target="_blank" href="http://ferrante.pl/frontend/javascript/meet-js-summit-2012/#referrer=blog.vokiel.com" title="meet.js summit 2012" target="_blank">ferrante</a>, <a rel="nofollow" target="_blank" href="http://rubysfera.pl/2012/01/summit-meetjs-relacja/#referrer=blog.vokiel.com" title="Meetjs Summit – relacja" target="_blank">pavelloz</a>, <a rel="nofollow" target="_blank" href="http://michalbe.blogspot.com/2012/01/meetjs-summit.html#referrer=blog.vokiel.com" title="MeetJS Summit" target="_blank">michalbe</a>, <a rel="nofollow" target="_blank" href="http://jportal.pl/relacja-z-meetjs-summit-w-poznaniu.html#referrer=blog.vokiel.com" title="Relacja z meetJS summit w Poznaniu" target="_blank">jPortal.pl</a>, <a rel="nofollow" target="_blank" href="http://chemikpil.pl/meet-js-summit-moja-relacja/#referrer=blog.vokiel.com" title="Meet.js Summit – moja relacja" target="_blank">ChemikPIL</a>
</p>
<p>Przygotowanie na najwyższym poziomie, pomimo iż cała impreza była darmowa. Jeszcze raz, wielkie brawa.</p>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/vnXuLR2J5m4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/meet-js-summit-2012-relacja/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.vokiel.com/meet-js-summit-2012-relacja/</feedburner:origLink></item>
		<item>
		<title>WordCamp Poznań 2011 – relacja</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/kOOJ3306I3w/</link>
		<comments>http://blog.vokiel.com/wordcamp-poznan-2011-relacja/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 11:53:13 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[konferencja]]></category>
		<category><![CDATA[wtyczki]]></category>

		<guid isPermaLink="false">http://blog.vokiel.com/?p=995</guid>
		<description><![CDATA[W dniach 9-10 grudnia w Poznaniu odbyła się kolejna konferencja z serii WordCamp. Tym razem, uczestniczyłem w konferencji jako prelegent.]]></description>
				<content:encoded><![CDATA[<div id="attachment_996" class="wp-caption alignright" style="width: 210px"><a rel="nofollow" target="_blank" href="http://2011.poznan.wordcamp.org/prelegenci/#robert-mikolajuk"><img src="http://blog.vokiel.com/wp-content/uploads/2011/12/bylem-speakerem.jpg" alt="" title="WordCamp Poznań 2011" width="200" height="200" class="size-full wp-image-996" /></a><p class="wp-caption-text">WordCamp Poznań 2011</p></div>
<p>W dniach 9-10 grudnia w Poznaniu odbyła się kolejna konferencja z serii <strong>WordCamp</strong>. Jak sama nazwa wskazuje jest to konferencja poświęcona WordPressowi. WordCampy są organizowane na całym świecie przez użytkowników WordPressa i dla użytkowników WordPressa. Poznańska edycja była organizowana przy aprobacie <a rel="nofollow" target="_blank" href="http://central.wordcamp.org/#referrer=blog.vokiel.com" title="WordCamp Central">WordCamp Central</a> co niosło ze sobą kilka korzyści, ale też ogrom więcej pracy, z czym dzielnie poradził sobie <a rel="nofollow" target="_blank" href="https://twitter.com/ludwiczakpawel#referrer=blog.vokiel.com">Paweł</a>. Grono zainteresowanych było bardzo duże. Tematy prelekcji zróżnicowane, każdy mógł znaleźć coś dla siebie.</p>
<p>Tym razem, uczestniczyłem w konferencji jako prelegent. W długiej, nudnej, mocno technicznej prezentacji opowiedziałem o tworzeniu wtyczek: <a rel="nofollow" target="_blank" href="http://2011.poznan.wordcamp.org/session/tworzenie-wtyczek/#referrer=blog.vokiel.com">Tworzenie wtyczek &#8211; oszczędzaj swój czas</a> <small>(o tym w dalszej części)</small>.</p>
<p>
<span id="more-995"></span></p>
<h2>Organizacja</h2>
</p>
<p>Organizacyjnie event przygotowany był świetnie. Biorąc pod uwagę cenę wejściówki (40zł) poziom przerósł moje oczekiwania. Był pakiet dla każdego uczestnika, poza tym kawa, herbata, ciastka, woda i soki. Oczywiście nie zabrakło niespodzianek &#8211; pizza każdego dnia, RedBulle i middle-party w klubie Charyzma &#8211; gdzie Paweł przekazał uczestnikom multum kuponów na alko w barze.</p>
<p>Technicznie też było dobrze, jeden projektor trochę niedomagał, ale były dwa, więc to nie był żaden problem, nagłośnienie w porządku, baterie w mikrofonach wymieniane na bieżąco. Jako, że całość odbywała się na uczelnianej sali wykładowej warunki do prezentacji były bardzo dobre.</p>
<p>Nie obyło się bez losowania nagród w postaci książek, zniżek (99%), licencji na wtyczki.</p>
<h2>Przebieg</h2>
<p>Impreza rozpoczęła się właściwie w czwartek od preparty, dzięki której mogliśmy się dobrze zintegrować. <a rel="nofollow" target="_blank" href="http://www.brotherspub.pl/#referrer=blog.vokiel.com">The Brothers Pub</a> było idealnym wyborem, niepowtarzalny klimat, niesamowita Orzechówka (Jurek Ty to potrafisz namówić <img src='http://blog.vokiel.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ), a te ciastka&#8230;</p>
<p>Następnego dnia wystartowaliśmy z prezentacjami. Ich przebieg możecie prześledzić w <a rel="nofollow" target="_blank" href="http://2011.poznan.wordcamp.org/agenda/#referrer=blog.vokiel.com">Agendzie</a>. Prelekcje były różne, na różnym poziomie, skierowane do różnych odbiorców, na pewno każdy znalazł taką, która go zainteresowała.</p>
<p>Przerwy po każdym wykładzie dawały szansę omówienia tematu na świeżo, dopytania się o szczegóły, wymiany poglądów.</p>
<p>Po zakończeniu pierwszego dnia przyszedł czas na relaks i zabawę w świetnym gronie w klubie Charyzma. Nauczeni doświadczeniem, nie mogliśmy zakończyć wieczoru bez Orzechówki.</p>
<p>Następnego dnia, pomimo tego, że zaplanowaną godzina rozpoczęcia była 10, z racji bardzo udanego wieczoru nie była możliwa do zrealizowania. Na szczęście większość dała radę dotrzeć na 10:30, zatem udało się rozpocząć bez większych opóźnień.</p>
<h2>Prezentacje</h2>
<p>Wśród wielu interesujących prezentacji kilka szczególnie zwróciło moją uwagę. Ciekawa prezentacja <a rel="nofollow" target="_blank" href="http://arek.bibliotekarz.com#referrer=blog.vokiel.com">Arka </a> <strong>Informacja Rulez!</strong>, która natchnęła mnie kilkoma pomysłami na wtyczki (jeśli jeszcze nie istnieją). Bardzo podobała mi się prezentacja <a rel="nofollow" target="_blank" href="http://chemikpil.pl/#referrer=blog.vokiel.com">Michała</a> o błędach <abbr title="Hyper-Text Markup Language v5">HTML5</abbr>, wyróżniała się profesjonalnym przygotowaniem i przeprowadzeniem, przy okazji dała mi motywację, aby wreszcie przepisać swojego bloga na html5. Ogromny zestaw wtyczek przedstawiła <a rel="nofollow" target="_blank" href="http://seonaobcasach.pl/wordcamp-2011-relacja/#referrer=blog.vokiel.com">Magda</a> w swojej prezentacji o optymalizacji i pozycjonowaniu (czekam na slajdy). Na koniec dnia praktyczne informacje przedstawione w dwóch prezentacjach: o szablonach-dzieciach oraz o frameworkach w WordPress dały wiedzę o tym jak pracować wydajniej i szybciej.</p>
<p>Drugiego dnia najbardziej do gustu przypadła mi prezentacja <a rel="nofollow" target="_blank" href="http://paulpela.com/#referrer=blog.vokiel.com" class="broken_link">Pawła </a>o zarabianiu na WordPressie. Dużo praktycznej, popartej doświadczeniem wiedzy o pracy freelancera i młodego przedsiębiorcy. Świetnie przeprowadzona, bardzo motywująca. Bartek przypomniał o tym, że strona oparta na WordPress to nie tylko unikalny front-end, ale także mocno kastomizowany panel administracyjny. Dobrym dopełnieniem mojej prezentacji było wystąpienie <a rel="nofollow" target="_blank" href="http://optart.pl/#referrer=blog.vokiel.com">Konrada</a> o lukach bezpieczeństwa.</p>
<h2>Moje wystąpnie</h2>
<p><a href="http://blog.vokiel.com/wp-content/uploads/2011/12/identyfikator.jpg"><img src="http://blog.vokiel.com/wp-content/uploads/2011/12/identyfikator-300x228.jpg" alt="" title="wordcamp-identyfikator" width="300" height="228" class="alignright size-medium wp-image-1001" /></a></p>
<p>Tematem mojej prezentacji było tworzenie wtyczek. W planie prezentacji był krótki wstęp o samym WordPress, o tym, że to właśnie system wtyczek jest jedną z głównych przyczyn jego funkcjonalności. Następnie pokazałem czym są wtyczki oraz na czym się opierają. Przed stworzeniem pierwszej wtyczki zaprezentowałem kilka ważnych rzeczy z zakresu organizacji pracy nad wtyczkami, zasad tworzenia, kilka zdań o podstawowych błędach. Dalej, pokazałem jak tworzyć wtyczki od podstaw, przechodząc przez najprostszą aktywność, aż do bardziej zaawansowanych integracji wtyczki z WordPressem. Pokazałem jak zaszczepić wtyczkę w kilku miejscach admin-panelu (kokpit, adminbar, menu, contextual help). Pokazałem jak obsłużyć bazę danych oraz system ustawień. Na koniec, po połączeniu wszystkich elementów, powstała dedykowana konferencji wtyczka.</p>
<p>Mam nadzieję, że prezentacja była ciekawa, interesująca. Czekam na komentarze, opinie, propozycje usprawnień.</p>
<p>Oczywiście udostępniam całą prezentację wraz z poszczególnymi etapami tworzenia wtyczki. Samą prezentację najlepiej przeglądać korzystając z przeglądarki wspierającej CSS3, w innych działanie może nie być do końca takie, jak powinno.</p>
<div class="source_demo_container">
<a rel="nofollow" target="_blank" href="/dema/wcpoz2011/wcpoz2011.zip" class="source" title="Źródła">Źródła</a><a rel="nofollow" target="_blank" href="/dema/wcpoz2011/index.html" class="demo" title="Prezentacja">Prezentacja</a>
</div>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/kOOJ3306I3w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/wordcamp-poznan-2011-relacja/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		<feedburner:origLink>http://blog.vokiel.com/wordcamp-poznan-2011-relacja/</feedburner:origLink></item>
		<item>
		<title>Klasa PHP rozwiązująca problem przynależności punktu do wielokąta</title>
		<link>http://feedproxy.google.com/~r/BlogVokielCom/~3/cC6YBOdu8mc/</link>
		<comments>http://blog.vokiel.com/klasa-php-rozwiazujaca-problem-przynaleznosci-punktu-do-wielokata/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 18:55:45 +0000</pubDate>
		<dc:creator>Vokiel</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[geofencing]]></category>
		<category><![CDATA[planetaphp]]></category>

		<guid isPermaLink="false">http://blog.vokiel.com/?p=965</guid>
		<description><![CDATA[W poprzednim wpisie: Problem przynależności punktu do obszaru wielokąta omówiłem sposoby na sprawdzenie, czy dany punkt należy do obszaru wielokąta rozpiętego na punktach. W tym wpisie przedstawię gotowe rozwiązanie zaimplementowane w PHP.]]></description>
				<content:encoded><![CDATA[<p><img src="http://blog.vokiel.com/wp-content/uploads/2011/09/polygon_classphp-150x150.png" alt="Polygon.class.php" title="Polygon.class.php" width="150" height="150" class="alignright size-thumbnail wp-image-972" /><br />
W poprzednim wpisie: <a rel="nofollow" target="_blank" href="/problem-przynaleznosci-punktu-do-obszaru-wielokata">Problem przynależności punktu do obszaru wielokąta</a> omówiłem sposoby na sprawdzenie, czy dany punkt należy do obszaru wielokąta rozpiętego na punktach. W tym wpisie przedstawię gotowe rozwiązanie zaimplementowane w PHP.<br />
Problem nie jest zbyt rozległy, zatem rozwiązaniem będzie tylko jedna klasa, oraz krótki przykład pokazujący jak z niej korzystać. Do tego jakieś małe demo.<br />
<span id="more-965"></span></p>
<div class="source_demo_container">
<a rel="nofollow" target="_blank" href="/dema/geofencing/inPolygon.class.php" class="source" title="Źródła">Źródła</a><a rel="nofollow" target="_blank" href="/dema/geofencing/" class="demo" title="Demo">Demo</a>
</div>
<h2>Test przecięć</h2>
<p>Do wykonania testu przecięć potrzebna będzie tablica ze współrzędnymi badanego punktu, oraz tablica współrzędnych (podanych w kolejności) wierzchołków wielokąta. Tablice te przekażemy w konstruktorze.<br />
Ważną rzeczą jest sprawdzenie czy ostatni i pierwszy element tablicy wierzchołków jest taki sam, czyli czy figura się zamyka. Jeśli nie to w konstruktorze uzupełniamy tablicę kopię pierwszego elementu.</p>
<p>Kolejnym etapem jest sprawdzenie czy punkt należy do do jednego z boków wielokąta.<br />
Jeśli powyższe sprawdzenie się nie powiedzie rozpoczynamy właściwą część, tj. sprawdzenie przecięć. W tym celu tworzymy półprostą, tutaj równoległą do osi OX, rozpoczynającą się w sprawdzanym przez nas punkcie, a kończącą się w dowolnym punkcie poza ostatnim punktem wielokąta (najbardziej wysuniętym w kierunku grotu osi OX). </p>
<p>Po utworzeniu półprostej przechodzimy do właściwego badania przecięć. W pierwszej kolejności pod młotek idzie sprawdzenie zawierania się półprostej w jednym z boków wielokąta (rys. 3, rys. 4 <a rel="nofollow" target="_blank" href="/problem-przynaleznosci-punktu-do-obszaru-wielokata">w poprzednim wpisie</a>). Aby to sprawdzić musimy przetestować czy kolejne 2 punkty wielokąta należą do tej półprostej. Jeśli tak się zdarzy to sprawdzamy, z którym przypadkiem mamy do czynienia (czy punkty leżą po tej samej, czy po przeciwnych stronach półprostej). Jeśli po przeciwnej &#8211; zwiększamy licznik przecięć.</p>
<p>Jeśli półprosta nie zawiera się w boku wielokąta trzeba sprawdzić czy przypadkiem nie przecina jego wierzchołka. Aby to osiągnąć sprawdzamy czy wierzchołek zawiera się w półprostej a zarazem czy poprzedni i następny już nie. Jeśli sprawdzanie się powiedzie to pozostaje rozpoznać, z którą wersją mamy do czynienia (rys. 5, rys. 6 <a rel="nofollow" target="_blank" href="/problem-przynaleznosci-punktu-do-obszaru-wielokata">w poprzednim wpisie</a>). W zależności od wyniku, albo zwiększamy licznik przecięć, albo nie. Jeśli natomiast warunek zawierania się wierzchołka nie zostanie spełniony sprawdzamy czy bok wielokąta przecina półprostą, a zarazem poprzedni wierzchołek jej nie przecina, jak również następny.</p>
<h2>inPolygon.class.php</h2>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/**
 * @author Robert *Vokiel* Mikołajuk vokiel@vokiel.com http://blog.vokiel.com
 * @copyright (c) 2011 Robert Mikołajuk
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> inPolygon <span style="color: #009900;">&#123;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * @var	array	$point	Współrzędne prawdzanego punktu
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$point</span><span style="color: #339933;">;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * @var	array	$raypoint	Punkt końcowy półprostej od $this-&gt;point równoległej do osi OX 
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$raypoint</span><span style="color: #339933;">;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * @var	array	$polygon	Tablica współrzędnych punktów
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$polygon</span><span style="color: #339933;">;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * @var	int	$crosses	Liczba przecięć odcinków
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$crosses</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * 
	 * @param array $point
	 * @param array $polygon
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$point</span><span style="color: #339933;">,</span><span style="color: #000088;">$polygon</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$point</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'x'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'y'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$polygon</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// jeśli ostatni element nie jest tożsamy z pierwszym, dodajemy go na końcu tablicy</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #990000;">array_push</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Sprawdzenie czy punkt zawiera się w obszarze
	 * @return bool
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> check<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// sprawdzenie czy punkt nie należy do jednego z boków wielokąta</span>
		<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">&lt;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setRaypoint</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">edgeCross</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">crosses</span> <span style="color: #339933;">%</span> <span style="color: #cc66cc;">2</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Wyznaczenie punktów półprostej równoległej do osi OX
	 * Współrzędna X punktu P1 musi być większa od największej wpsółrzędnej X wśród wszystkich wierzchołków wielokąta
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> setRaypoint<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">&lt;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Wyliczenie ilości przecięć półprostej przez odcinki boków wielokąta 
	 * Półprosta zostaje przeprowadzona od badanego punktu w prawo, 
	 * aż za najbardziej wysunięty w prawo punkt wielokąta  
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> edgeCross<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// wstawienie na koniec tablicy punktów wielokąta drugiego wierzchołka - dla ułatwienia obliczeń</span>
		<span style="color: #990000;">array_push</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">&lt;</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// Prosta P-P1 zawiera się w boku wielokąta W($i,$i+1) </span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$i</span> <span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span>
				<span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> 
			<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #666666; font-style: italic;">// Punkt wcześniejszy wielokątea i dalszy leżą po przeciwnej stronie prostej P-P1 - ilość przecięć: 1</span>
				<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$i</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> 
					<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$i</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> 
				<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
					<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">crosses</span><span style="color: #339933;">++;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// Prosta P-P1 nie zawiera się w boku wielokąta</span>
				<span style="color: #666666; font-style: italic;">// Prosta P-P1 zawiera wierzchołek W($i)</span>
				<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$i</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span>
					<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span>
					<span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span>
				<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
					<span style="color: #666666; font-style: italic;">// Sprawdzenie położenia wierzhołków sąsiadujących z wierzchołkiem W($i)</span>
					<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'x'</span><span style="color: #339933;">=&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'y'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">!==</span>
						<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'x'</span><span style="color: #339933;">=&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'y'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
					<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
						<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">crosses</span><span style="color: #339933;">++;</span>
					<span style="color: #009900;">&#125;</span>
				<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #666666; font-style: italic;">// Sprawdzenie czy prosta P-P1 przecina bok wilokąta W($i,$i+1)</span>
					<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">edgeCrossEdge</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #000088;">$i</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span>
						<span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span>  
							<span style="color: #009900;">&#40;</span>
								<span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span>
								<span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span>
							<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>
								<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'x'</span><span style="color: #339933;">=&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'y'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">!==</span>
								<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'x'</span><span style="color: #339933;">=&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'y'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
							<span style="color: #009900;">&#41;</span>
						<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">raypoint</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">polygon</span><span style="color: #009900;">&#91;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span>
					<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
						<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">crosses</span><span style="color: #339933;">++;</span>
					<span style="color: #009900;">&#125;</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * 
	 * Sprawdzenie czy $check_point należy do odcinka ($start_point|$stop_point) 
	 * @param array $start_point	Punkt startowy odcinka
	 * @param array $stop_point 	Punkt końcowy odcinka
	 * @param array $check_point	Sprawdzany punkt
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> pointCrossEdge<span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point</span><span style="color: #339933;">,</span><span style="color: #000088;">$check_point</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$stop_point</span><span style="color: #339933;">,</span> <span style="color: #000088;">$check_point</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">&amp;&amp;</span>
			<span style="color: #990000;">min</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$start_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$stop_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$check_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&amp;&amp;</span>
			<span style="color: #000088;">$check_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #990000;">max</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$start_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$stop_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span>
			<span style="color: #990000;">min</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$start_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$stop_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$check_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&amp;&amp;</span>
			<span style="color: #000088;">$check_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #990000;">max</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$start_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$stop_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Sprawdzenie czy odcinki $start_point_1-$stop_point_1 i $start_point_2-$stop_point_2 przecinają się
	 * @param array $start_point_1	Punkt startowy pierwszego odcinka 
	 * @param array $stop_point_1	Punkt końcowy pierwszego odcinka 
	 * @param array $start_point_2	Punkt startowy drugiego odcinka 
	 * @param array $stop_point_2	Punkt końcowy drugiego odcinka 
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> edgeCrossEdge<span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$start_point_2</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$start_point_2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> 
				<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point_2</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_2</span><span style="color: #339933;">,</span><span style="color: #000088;">$start_point_1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sng</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">det</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point_2</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_2</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span>
				<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$start_point_2</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span>
				<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_1</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_2</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span>
				<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point_2</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_2</span><span style="color: #339933;">,</span><span style="color: #000088;">$start_point_1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span>
				<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pointCrossEdge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point_2</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_2</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point_1</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Wyznacznik macierzy kwadratowej stopnia 3
	 * @param array $start_point
	 * @param array $stop_point
	 * @param array $check_point
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> det<span style="color: #009900;">&#40;</span><span style="color: #000088;">$start_point</span><span style="color: #339933;">,</span><span style="color: #000088;">$stop_point</span><span style="color: #339933;">,</span><span style="color: #000088;">$check_point</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$start_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$stop_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$check_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$stop_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$check_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$start_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$check_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'x'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$start_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$stop_point</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'y'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;">/* druga metoda
		return ($start_point['x'] * $stop_point['y'] + $stop_point['x'] * $check_point['y'] + $check_point['x'] * $start_point['y'] - $check_point['x'] * $stop_point['y'] - $start_point['x'] * $check_point['y'] - $stop_point['x'] * $start_point['y']);
		*/</span> 
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Określenie znaku liczby
	 * @param int $x	Liczba
	 * @return int $x
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> sng<span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$x</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$x</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">// end of inPolygon class</span></pre></td></tr></table></div>

<p>Na koniec przydałoby się napisać jakieś demo. Wkrótce się pojawi.</p>
<img src="http://feeds.feedburner.com/~r/BlogVokielCom/~4/cC6YBOdu8mc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/klasa-php-rozwiazujaca-problem-przynaleznosci-punktu-do-wielokata/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://blog.vokiel.com/klasa-php-rozwiazujaca-problem-przynaleznosci-punktu-do-wielokata/</feedburner:origLink></item>
	<media:rating>nonadult</media:rating></channel>
</rss><!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced

 Served from: blog.vokiel.com @ 2013-04-24 19:26:04 by W3 Total Cache -->
