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

<channel>
	<title>Vokiel.com</title>
	<atom:link href="http://blog.vokiel.com/feed/" rel="self" type="application/rss+xml"/>
	<link>http://blog.vokiel.com</link>
	<description>Web Developer Blog</description>
	<lastBuildDate>Sun, 12 Apr 2015 15:24:58 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.9.26</generator>
	<item>
		<title>PHPCon Poland 2012 krótkie podsumowanie</title>
		<link>http://blog.vokiel.com/phpcon-poland-2012-krotkie-podsumowanie/</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><![CDATA[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="https://s.w.org/images/core/emoji/11/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 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 href="http://www.wimgodden.be/#referrer=blog.vokiel.com">Wim Godden</a>, <a href="http://blog.feryn.eu/#referrer=blog.vokiel.com" class="broken_link">Thijs Feryn</a> oraz <a 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 href="http://www.phpcon.pl/2012/pl/agenda#referrer=blog.vokiel.com" class="broken_link">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="https://s.w.org/images/core/emoji/11/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></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="https://s.w.org/images/core/emoji/11/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" />  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 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" style="width: 310px" class="wp-caption alignright"><a 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" srcset="http://blog.vokiel.com/wp-content/uploads/2012/10/da79ae7209ac11e299b11231381b6f02_7-300x300.jpg 300w, http://blog.vokiel.com/wp-content/uploads/2012/10/da79ae7209ac11e299b11231381b6f02_7-150x150.jpg 150w, http://blog.vokiel.com/wp-content/uploads/2012/10/da79ae7209ac11e299b11231381b6f02_7.jpg 612w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">kodujemy. troche frontendu troche backendu&#8230; git commit <img src="https://s.w.org/images/core/emoji/11/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 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="https://s.w.org/images/core/emoji/11/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 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>
]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/phpcon-poland-2012-krotkie-podsumowanie/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Raspberry Pi odczyt temperatury przez nodejs</title>
		<link>http://blog.vokiel.com/raspberry-pi-odczyt-temperatury-przez-nodejs/</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><![CDATA[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; [&#8230;]]]></description>
				<content:encoded><![CDATA[<div id="attachment_1239" style="width: 250px" class="wp-caption alignright"><a 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>
<p><pre lang=&#8221;bash&#8221;>
vokiel@rpi ~$ uname -a
Linux raspberrypi 3.1.9+ #168 PREEMPT Sat Jul 14 18:56:31 BST 2012 armv6l GNU/Linux
</pre></p>
<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 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 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 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>
<p><pre lang=&#8221;bash&#8221;>wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update &amp;&amp; chmod +x /usr/bin/rpi-update</pre><br />
<pre lang=&#8221;bash&#8221;>sudo apt-get install ca-certificates</pre><br />
<pre lang=&#8221;bash&#8221;>rpi-update 240 #podział pamięci na 240MB CPU / 16MB GPU</pre></p>
<p>Podany sposób nie aktualizuje nam jądra do najnowszej dostępnej wersji, ale jest ona wystarczająca do uruchomienia 1-wire:</p>
<p><pre lang=&#8221;bash&#8221;>
vokiel@rpi ~ $ uname -a
Linux rpi 3.2.18+ #20 Mon May 28 17:27:57 EDT 2012 armv6l GNU/Linux
</pre></p>
<h2>Moduł 1-wire</h2>
<p>Wątek na forum RPi dotyczący 1-wire jest dość obszerny: <a href="http://www.raspberrypi.org/phpBB3/viewtopic.php?t=6649#referrer=blog.vokiel.com" title="Kernel patch for Dallas 1-wire interface" target="_blank" class="broken_link">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>
<p><pre lang=&#8221;bash&#8221;>vokiel@rpi ~ $ ls /sys/bus/
amba&nbsp;&nbsp;hid&nbsp;&nbsp;mmc&nbsp;&nbsp;platform&nbsp;&nbsp;scsi&nbsp;&nbsp;sdio&nbsp;&nbsp;spi&nbsp;&nbsp;usb 
</pre></p>
<p>Jak widać nie, zatem musimy dodać moduł, a następnie zrestartować Malinę</p>
<p><pre lang=&#8221;bash&#8221;>root@rpi:~# modprobe w1-gpio</pre></p>
<p>Po restarcie jest ok:</p>
<p><pre lang=&#8221;bash&#8221;>vokiel@rpi ~ $ ls /sys/bus/
amba&nbsp;&nbsp;hid&nbsp;&nbsp;mmc&nbsp;&nbsp;platform&nbsp;&nbsp;scsi&nbsp;&nbsp;sdio&nbsp;&nbsp;spi&nbsp;&nbsp;usb&nbsp;&nbsp;w1
</pre></p>
<p>Nasz termometr pojawi się w katalogu <code class=&#8221;b&#8221;>/sys/bus/w1/devices/</code> pod swoim id, np.: <code class=&#8221;b&#8221;>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" style="width: 92px" class="wp-caption alignright"><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" style="width: 96px" class="wp-caption alignright"><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" style="width: 310px" class="wp-caption alignleft"><a 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" srcset="http://blog.vokiel.com/wp-content/uploads/2012/09/RPI_DS18B20-529x450.png 529w, http://blog.vokiel.com/wp-content/uploads/2012/09/RPI_DS18B20-1024x869.png 1024w, http://blog.vokiel.com/wp-content/uploads/2012/09/RPI_DS18B20.png 1176w" sizes="(max-width: 529px) 100vw, 529px" /></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" srcset="http://blog.vokiel.com/wp-content/uploads/2012/09/rpi_temp.jpg 650w, http://blog.vokiel.com/wp-content/uploads/2012/09/rpi_temp-300x205.jpg 300w" sizes="(max-width: 650px) 100vw, 650px" /></p>
<p>Podwójna wtyczka (niebieski + szary kabelek) jest podwójna tylko dlatego, że zbrakło mi pojedynczych ;), 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 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>
<p><pre lang=&#8221;bash&#8221;>
vokiel@rpi ~ $ ls -l /sys/bus/w1/devices/
razem 0
lrwxrwxrwx 1 root root 0 wrz 16 08:16 28-00000249bf39 -&gt; ../../../devices/w1_bus_master1/28-00000249bf39
lrwxrwxrwx 1 root root 0 wrz 16 13:04 w1_bus_master1 -&gt; ../../../devices/w1_bus_master1
</pre></p>
<p>W katalogu urządzenia zobaczymy kilka plików i katalogów:</p>
<p><pre lang=&#8221;bash&#8221;>
vokiel@rpi ~ $ cd /sys/bus/w1/devices/28-00000249bf39
vokiel@rpi /sys/bus/w1/devices/28-00000249bf39 $ ls -la
razem 0
drwxr-xr-x 3 root root&nbsp;&nbsp;&nbsp;&nbsp;0 wrz 16 08:16 .
drwxr-xr-x 4 root root&nbsp;&nbsp;&nbsp;&nbsp;0 wrz 16 08:16 ..
lrwxrwxrwx 1 root root&nbsp;&nbsp;&nbsp;&nbsp;0 wrz 16 13:52 driver -&gt; ../../../bus/w1/drivers/w1_slave_driver
-r--r--r-- 1 root root 4096 wrz 16 13:52 id
-r--r--r-- 1 root root 4096 wrz 16 13:52 name
drwxr-xr-x 2 root root&nbsp;&nbsp;&nbsp;&nbsp;0 wrz 16 13:52 power
lrwxrwxrwx 1 root root&nbsp;&nbsp;&nbsp;&nbsp;0 wrz 16 13:52 subsystem -&gt; ../../../bus/w1
-rw-r--r-- 1 root root 4096 wrz 16 13:52 uevent
-r--r--r-- 1 root root 4096 wrz 16 08:16 w1_slave
</pre></p>
<p>Najważniejszy dla nas to <code class=&#8221;b&#8221;>w1_slave</code>, z którego odczytamy aktualną temperaturę. Możemy to zrobić wykorzystując po prostu program <code class=&#8221;b&#8221;>cat</code>:</p>
<p><pre lang=&#8221;bash&#8221;>
vokiel@rpi /sys/bus/w1/devices/28-00000249bf39 $ cat w1_slave 
c3 01 4b 46 7f ff 0d 10 2f : crc=2f YES
c3 01 4b 46 7f ff 0d 10 2f t=28187
</pre></p>
<p>Jak się nie trudno domyśleć, <code class=&#8221;b&#8221;>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>
<p><pre lang=&#8221;bash&#8221;>
vokiel@rpi /sys/bus/w1/devices/28-00000249bf39 $ \
&gt; cat ./w1_slave | grep t= | cut -f2 -d= | awk &#039;{print $1/1000}&#039;
28.125
</pre></p>
<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=&#8221;b&#8221;>child_process</code>, przy pomocy którego wywołamy sytemową komendę i odbierzemy wynik jej działania.</p>
<p><pre lang=&#8221;javascript&#8221;>
#!/usr/bin/node

var exec = require(&#039;child_process&#039;).exec;

var tempId = &#039;28-00000249bf39&#039;,
&nbsp;&nbsp;&nbsp;&nbsp;dispTempInterval,
&nbsp;&nbsp;&nbsp;&nbsp;dispTempIntervalClock = 10; //sec

var dispTemp = function(){
&nbsp;&nbsp;&nbsp;&nbsp;exec( &quot;cat /sys/bus/w1/devices/&quot; + tempId + &quot;/w1_slave | grep t= | cut -f2 -d= | awk &#039;{print $1/1000}&#039;&quot;, function( error, stdout, stderr ){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( error != null ){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log( &quot;Error: &quot; + error);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var temp = parseFloat(stdout).toFixed(2);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log ( &quot;Current temperature: &quot; + temp + &quot;°C&quot; );
&nbsp;&nbsp;&nbsp;&nbsp;});
}

console.log( &#039;Started node-temp&#039;);
console.log( &#039;-----------------&#039;);

/* Start interval */
dispTempInterval = setInterval( function(){
&nbsp;&nbsp;dispTemp();
}, dispTempIntervalClock*1000 );

</pre></p>
<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>
Started node-temp
-----------------
Current temperature: 22.50°C
Current temperature: 22.50°C
Current temperature: 24.19°C
</pre></p>
<p>Po drobnych modyfikacjach ( <a 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" style="width: 566px" class="wp-caption aligncenter"><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" srcset="http://blog.vokiel.com/wp-content/uploads/2012/09/rpi-node-temp_screen.jpg 556w, http://blog.vokiel.com/wp-content/uploads/2012/09/rpi-node-temp_screen-300x132.jpg 300w" sizes="(max-width: 556px) 100vw, 556px" /></a><p class="wp-caption-text">rpi-node-temp</p></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/raspberry-pi-odczyt-temperatury-przez-nodejs/feed/</wfw:commentRss>
		<slash:comments>40</slash:comments>
		</item>
		<item>
		<title>Raspberry Pi – pierwsze starcie</title>
		<link>http://blog.vokiel.com/raspberry-pi-pierwsze-starcie/</link>
		<comments>http://blog.vokiel.com/raspberry-pi-pierwsze-starcie/#comments</comments>
		<pubDate>Sat, 11 Aug 2012 19:23:30 +0000</pubDate>
		<dc:creator><![CDATA[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" style="width: 320px" class="wp-caption alignright"><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 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=&#8221;b&#8221;>A</code> i <code class=&#8221;b&#8221;>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" srcset="http://blog.vokiel.com/wp-content/uploads/2012/08/schemat.jpg 449w, http://blog.vokiel.com/wp-content/uploads/2012/08/schemat-300x221.jpg 300w" sizes="(max-width: 449px) 100vw, 449px" /></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" srcset="http://blog.vokiel.com/wp-content/uploads/2012/08/S7300801-300x225.jpg 300w, http://blog.vokiel.com/wp-content/uploads/2012/08/S7300801-1024x768.jpg 1024w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Fundacja Raspberry Pi rekomenduje dwa sklepy, które prowadzą sprzedaż międzynarodową, są to: <a href="http://downloads.element14.com/raspberryPi1.html?isRedirect=true#referrer=blog.vokiel.com" class="broken_link">Premier Farnell/Element 14</a> oraz <a 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 href="http://www.raspberrypi.org/downloads#referrer=blog.vokiel.com" class="broken_link">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=&#8221;b&#8221;>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=&#8221;b&#8221;>df -h</code>.<br />
<pre lang=&#8221;bash&#8221;>
vokiel@def ~$ df -h
System plików&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rozm. użyte dost. %uż. zamont. na
rootfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;108G&nbsp;&nbsp; 15G&nbsp;&nbsp; 93G&nbsp;&nbsp;14% /
devtmpfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3,9G&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;3,9G&nbsp;&nbsp; 0% /dev
tmpfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3,9G&nbsp;&nbsp;1,4M&nbsp;&nbsp;3,9G&nbsp;&nbsp; 1% /dev/shm
tmpfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3,9G&nbsp;&nbsp;820K&nbsp;&nbsp;3,9G&nbsp;&nbsp; 1% /run
/dev/sda2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 108G&nbsp;&nbsp; 15G&nbsp;&nbsp; 93G&nbsp;&nbsp;14% /
tmpfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3,9G&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;3,9G&nbsp;&nbsp; 0% /sys/fs/cgroup
tmpfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3,9G&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;3,9G&nbsp;&nbsp; 0% /media
/dev/sda3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 206G&nbsp;&nbsp; 69G&nbsp;&nbsp;128G&nbsp;&nbsp;35% /home
/dev/mapper/truecrypt1&nbsp;&nbsp;374G&nbsp;&nbsp;251G&nbsp;&nbsp;104G&nbsp;&nbsp;71% /media/truecrypt1
</pre>
</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=&#8221;b&#8221;>/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=&#8221;b&#8221;>umount</code>.</p>
<p><pre lang=&#8221;bash&#8221;>
vokiel@def ~$ umount /dev/sdc1
</pre></p>
<p>W tym momencie przystępujemy do faktycznego przeniesienia obrazu systemu na kartę SD, użyjemy programu <a 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>
<p><pre lang=&#8221;bash&#8221;>
vokiel@def ~$ sudo dd bs=1M if=/home/vokiel/Downloads/rpi/2012-07-15-wheezy-raspbian.img of=/dev/sdc1
</pre></p>
<p>Parametr <code class=&#8221;b&#8221;>bs</code> to rozmiar bloku w pojedynczej operacji odczytu, parametr <code class=&#8221;b&#8221;>if</code> to źródło (input file), natomiast <code class=&#8221;b&#8221;>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>
<p><pre lang=&#8221;bash&#8221;>
vokiel@def ~$ pgrep -l &#039;^dd$&#039; #sprawdzamy id procesu
vokiel@def ~$ sudo watch -n 5 kill -USR1 20326
</pre></p>
<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>
<p><pre lang=&#8221;bash&#8221;>
vokiel@def ~$ sync
</pre></p>
<p>Dostępne są też instrukcje dla systemu Windows jak i Mac OS X: <a 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" srcset="http://blog.vokiel.com/wp-content/uploads/2012/08/boot.jpg 636w, http://blog.vokiel.com/wp-content/uploads/2012/08/boot-300x181.jpg 300w" sizes="(max-width: 636px) 100vw, 636px" /></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" srcset="http://blog.vokiel.com/wp-content/uploads/2012/08/config1.jpg 660w, http://blog.vokiel.com/wp-content/uploads/2012/08/config1-300x149.jpg 300w" sizes="(max-width: 660px) 100vw, 660px" /></p>
<p>Standardowo mamy zainstalowane i skonfigurowane środowisko graficzne, uruchamiamy je poleceniem <code class=&#8221;b&#8221;>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" srcset="http://blog.vokiel.com/wp-content/uploads/2012/08/screen1.jpg 660w, http://blog.vokiel.com/wp-content/uploads/2012/08/screen1-300x180.jpg 300w" sizes="(max-width: 660px) 100vw, 660px" /></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>
<p><pre lang=&#8221;bash&#8221;>
pi@raspberrypi ~$ uname -a
Linux raspberrypi 3.1.9+ #168 PREEMPT Sat Jul 14 18:56:31 BST 2012 armv6l GNU/Linux
</pre></p>
<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>
<p><pre lang=&#8221;bash&#8221;>pi@raspberrypi ~$ sudo passwd root</pre><br />
<pre lang=&#8221;bash&#8221;>
pi@raspberrypi ~$ sudo adduser vokiel
Dodawanie użytkownika &quot;vokiel&quot;...
Dodawanie nowej grupy &quot;vokiel&quot; (1002)...
Dodawanie nowego użytkownika &quot;vokiel&quot; (1001) w grupie &quot;vokiel&quot;...
Tworzenie katalogu domowego &quot;/home/vokiel&quot;...
Kopiowanie plików z &quot;/etc/skel&quot; ...
Proszę podać nowe hasło UNIX: 
Proszę ponownie podać hasło UNIX: 
passwd: hasło zostało zmienione
Zmieniam informację o użytkowniku test
Wpisz nową wartość lub wciśnij ENTER by przyjąć wartość domyślną
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Imię i nazwisko []: Vokiel
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Numer pokoju []: 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Telefon do pracy []: 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Telefon domowy []: 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inne []: 
Czy informacja jest poprawna? [T/n] T
</pre></p>
<p>Możemy też użyć komendy <code class=&#8221;b&#8221;>useradd</code></p>
<p>Dodajemy użytkownika do sudoersów:</p>
<p><pre lang=&#8221;bash&#8221;>
pi@raspberrypi ~$ su
Hasło:
root@raspberrypi: /home/pi# echo &quot;vokiel ALL=(ALL:ALL) ALL&quot; &gt;&gt; etc/sudoers
</pre></p>
<p>Przelogowujemy się na nowe konto, następnie usuwamy użytkownika <strong>pi</strong></p>
<p><pre lang=&#8221;bash&#8221;>
vokiel@raspberrypi ~$ sudo userdel pi
</pre></p>
<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=&#8221;b&#8221;>rpi</code>. Po ustawieniu statycznego adresu mój pli konfiguracyjny wygląda następująco:</p>
<p><pre lang=&#8221;bash&#8221;>
vokiel@rpi ~ $ cat /etc/network/interfaces
auto lo
iface lo inet loopback

#iface eth0 inet dhcp #zakomentowana domyślna konfiguracja
iface eth0 inet static
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;address 192.168.1.254
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;netmask 255.255.255.0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;network 192.168.1.0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;broadcast 192.168.1.255
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gateway 192.168.1.100
</pre></p>
<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=&#8221;b&#8221;>/etc/hosts</code>. Dzięki temu będziemy mogli logować się za pomocą komendy <code class=&#8221;b&#8221;>ssh vokiel@rpi</code></p>
<p><pre lang=&#8221;bash&#8221;>
root@def /# echo &quot;192.168.1.254 rpi&quot; &gt;&gt; /etc/hosts
</pre></p>
<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=&#8221;b&#8221;>ssh-copy-id</code>:</p>
<p><pre lang=&#8221;bash&#8221;>
vokiel@def ~ $ ssh-copy-id vokiel@rpi
</pre></p>
<p>Pierwsze logowanie przy użyciu kluczy &#8211; nie trzeba podawać hasła:</p>
<p><pre lang=&#8221;bash&#8221;>
vokiel@def ~$ ssh vokiel@rpi
The authenticity of host &#039;rpi (192.168.1.254)&#039; can&#039;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 &#039;rpi,192.168.1.254&#039; (RSA) to the list of known hosts.
Linux rpi 3.1.9+ #168 PREEMPT Sat Jul 14 18:56:31 BST 2012 armv6l

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.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

Type &#039;startx&#039; to launch a graphical session

Last login: Sat Aug 11 19:20:20 2012 from def
vokiel@rpi ~ $ 
</pre></p>
<p>Jeśli lokalnie jesteśmy zalogowani na koncie o tej samej nazwie co konto zdalne, to wystarczy przy logowaniu podać nazwę hosta:</p>
<p><pre lang=&#8221;bash&#8221;>vokiel@def ~$ ssh rpi</pre></p>
<h3>Przydział pamięci</h3>
<p>Jako, że nie planuję korzystać z graficznego interfejsu, zmniejszyłem przydział pamięci dla grafiki:</p>
<p><pre lang=&#8221;bash&#8221;>
vokiel@rpi ~ $ sudo cp /boot/arm224_start.elf /boot/start.elf 
</pre></p>
<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" srcset="http://blog.vokiel.com/wp-content/uploads/2012/08/htop.jpg 397w, http://blog.vokiel.com/wp-content/uploads/2012/08/htop-300x148.jpg 300w" sizes="(max-width: 397px) 100vw, 397px" /></p>
<h3>Serwer www</h3>
<p>Debian na pokładzie, zatem instalację serwera www możemy przeprowadzić korzystając ze standardowego <code class=&#8221;b&#8221;>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=&#8221;b&#8221;>/etc/apt/sources.list</code>, następnie aktualizujemy bazy.</p>
<p><pre lang=&#8221;bash&#8221;>
vokiel@rpi ~ $ cat /etc/apt/sources.list
deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi
vokiel@rpi ~ $ sudo apt-get update
vokiel@rpi ~ $ sudo apt-get install nodejs npm
vokiel@rpi ~ $ sudo npm install nodeinfo
</pre></p>
<p>Tworzymy prosty skrypt pokazujący info o serwerze:<br />
<pre lang=&#8221;javascript&#8221;>
#!/usr/bin/node 

var http = require(&#039;http&#039;);
var os = require(&#039;os&#039;);
var url = require(&#039;url&#039;);
var serverIp = &#039;192.168.1.254&#039;;
var serverPort = &#039;8080&#039;;

function addStyle(res){
&nbsp;&nbsp;var style = &quot;&quot;;
&nbsp;&nbsp;style += &#039;&lt;style type=&quot;text/css&quot;&gt;&#039;;
&nbsp;&nbsp;style += &quot;\n body { font-size: 10px; font-family: Verdana, Arial, Tahoma; background: #fff;}&quot;;
&nbsp;&nbsp;style += &quot;\n table {collapse: collapse;} &quot;;
&nbsp;&nbsp;style += &quot;\n table thead tr th { font-weight: bold;} &quot;;
&nbsp;&nbsp;style += &quot;\n table tr td { border-bottom: 1px solid silver; vertical-align: top; padding: 5px 20px;}&quot;;
&nbsp;&nbsp;style += &quot;\n&lt;/style&gt;&quot;;

&nbsp;&nbsp;res.write(style);
}
function getRemoteAddr(req){
&nbsp;&nbsp;return req.headers[&#039;x-forwarded-for&#039;] || req.connection.remoteAddress;
}
function log(msg){
&nbsp;&nbsp;var now = new Date();&nbsp;&nbsp;
&nbsp;&nbsp;var log = now.toUTCString();
&nbsp;&nbsp;log += &quot;\t&quot; + msg;
&nbsp;&nbsp;console.log(log);
}

http.createServer(function (req, res) {
&nbsp;&nbsp;log(getRemoteAddr(req) + &quot;\t&quot; + req.headers[&#039;user-agent&#039;]);

&nbsp;&nbsp;res.writeHead(200, {&#039;Content-Type&#039;: &#039;text/html; charset=utf-8&#039;});

&nbsp;&nbsp;res.write(&#039;&lt;html&gt;&lt;title&gt;Raspberrypi nodejs server&lt;/title&gt;&lt;meta charset=utf-8&quot;&gt;&#039;);
&nbsp;&nbsp;addStyle(res);
&nbsp;&nbsp;res.write(&#039;&lt;body&gt;&#039;);

&nbsp;&nbsp;res.write(&#039;&lt;h2&gt;Client&lt;/h2&gt;&#039;);
&nbsp;&nbsp;res.write(&#039;&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;&#039;);
&nbsp;&nbsp;res.write(&#039;&lt;tr&gt;&lt;td&gt;User-agent: &lt;/td&gt;&lt;td&gt;&#039; + req.headers[&#039;user-agent&#039;] + &#039;&lt;/td&gt;&lt;/tr&gt;&#039;);
&nbsp;&nbsp;res.write(&#039;&lt;tr&gt;&lt;td&gt;IP: &lt;/td&gt;&lt;td&gt;&#039; +&nbsp;&nbsp;getRemoteAddr(req) + &#039;&lt;/td&gt;&lt;/tr&gt;&#039;);
&nbsp;&nbsp;res.write(&#039;&lt;/tbody&gt;&lt;/table&gt;&#039;);

&nbsp;&nbsp;res.write(&#039;&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;&#039;);

&nbsp;&nbsp;Object.keys(os).map(function(method) { 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( method != &#039;getNetworkInterfaces&#039; ){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res.write(&#039;&lt;tr&gt;&lt;td&gt;&#039; + method + &quot;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;&quot;+JSON.stringify(os[method]())+&#039;&lt; /pre&gt;&lt;/td&gt;&lt;/tr&gt;&#039;); 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;})
&nbsp;&nbsp;res.write(&#039;&lt;/tbody&gt;&lt;/table&gt;&#039;);
&nbsp;&nbsp;res.write(&#039;&lt;/body&gt;&lt;/html&gt;&#039;);
&nbsp;&nbsp;res.end();

}).listen(serverPort, serverIp);

log(&#039;Server running: &#039; + serverIp +&#039;:&#039;+serverPort);
</pre>
</p>
<p>Uruchamiamy i sprawdzamy wynik w przeglądarce</p>
<p><pre lang=&#8221;bash&#8221;>
vokiel@rpi ~ $ node server.js
Sat, 11 Aug 2012 18:30:10 GMT&nbsp;&nbsp; Server running: 192.168.1.254:8080
Sat, 11 Aug 2012 18:30:14 GMT&nbsp;&nbsp; 192.168.1.103&nbsp;&nbsp; Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.10.289 Version/12.00
</pre><br />
<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" srcset="http://blog.vokiel.com/wp-content/uploads/2012/08/node_www-1024x422.jpg 1024w, http://blog.vokiel.com/wp-content/uploads/2012/08/node_www-300x123.jpg 300w, http://blog.vokiel.com/wp-content/uploads/2012/08/node_www.jpg 1305w" sizes="(max-width: 1024px) 100vw, 1024px" /></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="https://s.w.org/images/core/emoji/11/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 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 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>
]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/raspberry-pi-pierwsze-starcie/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>PHPCon PL 2012 – głosowanie na agendę</title>
		<link>http://blog.vokiel.com/phpcon-pl-2012-glosowanie-na-agende/</link>
		<comments>http://blog.vokiel.com/phpcon-pl-2012-glosowanie-na-agende/#respond</comments>
		<pubDate>Thu, 19 Jul 2012 17:50:37 +0000</pubDate>
		<dc:creator><![CDATA[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 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a 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 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 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 href="http://blog.feryn.eu/#referrer=blog.vokiel.com" title="Thijs Feryn" target="_blank" class="broken_link">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 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 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>
]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/phpcon-pl-2012-glosowanie-na-agende/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordCamp Poznań 2011 – moje wystąpienie</title>
		<link>http://blog.vokiel.com/wordcamp-poznan-2011-moje-wystapienie/</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><![CDATA[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" style="width: 210px" class="wp-caption alignright"><a 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" srcset="http://blog.vokiel.com/wp-content/uploads/2011/12/bylem-speakerem.jpg 200w, http://blog.vokiel.com/wp-content/uploads/2011/12/bylem-speakerem-150x150.jpg 150w" sizes="(max-width: 200px) 100vw, 200px" /></a><p class="wp-caption-text">WordCamp Poznań 2011</p></div>
<p>Stowarzyszenie <em><a href="http://absolwencinawalizkach.pl/#referrer=blog.vokiel.com" title="ABSOLWENCI NA WALIZKACH" target="_blank">ABSOLWENCI NA WALIZKACH</a></em> w swoim <a 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>
]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/wordcamp-poznan-2011-moje-wystapienie/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Workspace czyli moje środowisko pracy</title>
		<link>http://blog.vokiel.com/workspace-czyli-moje-srodowisko-pracy/</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><![CDATA[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 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 href="http://blog.rbenkel.me/2012/03/workspace-czyli-moje-srodowisko-pracy/#referrer=blog.vokiel.com" title="Workspace czyli moje środowisko pracy" target="_blank" class="broken_link">ś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 ;). 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>&#8211; LibreOffice, na Win Office 2007 &#8211; co by nie mówić, jest to świetny program</li>
<li><strong>prezentacje</strong> &#8211; generalnie nie robię ;), ostatnio na Wordcamp&#8217;a w HTML+CSS &#8211; engine z Google, poza tym Impress lub PowerPoint <img src="https://s.w.org/images/core/emoji/11/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>
</ul>
<h3>Z rzeczy , o których Radek nie pisał:</h3>
<ul class="nice-list">
<li><strong>monitoring serwera </strong>&#8211; 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>&#8211; 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>&#8211; 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>
]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/workspace-czyli-moje-srodowisko-pracy/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>protectEmails jQuery plugin</title>
		<link>http://blog.vokiel.com/protectemails-jquery-plugin/</link>
		<comments>http://blog.vokiel.com/protectemails-jquery-plugin/#comments</comments>
		<pubDate>Sun, 29 Jan 2012 14:00:53 +0000</pubDate>
		<dc:creator><![CDATA[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" style="width: 260px" class="wp-caption alignright"><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=&#8221;b&#8221;>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=&#8221;b&#8221;>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=&#8221;b&#8221;>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>
<p><pre lang=&#8221;html4strict&#8221;>&lt;a href=&quot;mailto:info@example.com&quot;&gt;info [ at ] example.com&lt;/a&gt;</pre><br />
<pre lang=&#8221;html4strict&#8221;>&lt;a href=&quot;mailto:info@example.com&quot;&gt;info [ at ] example [dot] com&lt;/a&gt;</pre></p>
<p>Lub po prostu utrudniają życie, np.:</p>
<p><pre lang=&#8221;html4strict&#8221;>&lt;span class=&quot;email&quot;&gt;info [ at ] example [dot] com&lt;/spam&gt;</pre></p>
<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=&#8221;b&#8221;>@</code>. Chciałem też uniknąć dużego zagnieżdżania znaczników, jak w proponowanym przez niektórych rozwiązaniu:</p>
<p><pre lang=&#8221;html4strict&#8221;>&lt;a href=&quot;mailto:info@example.com&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;span class=&quot;n&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;at&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;d&quot;&gt;example.com&lt;/span&gt;
&lt;/a&gt;</pre></p>
<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>
<p><pre lang=&#8221;html4strict&#8221;>&lt;a href=&quot;mailto:info@example.com&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;span class=&quot;at&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;d&quot;&gt;example.com&lt;/span&gt;
&lt;/a&gt;</pre></p>
<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>
<p><pre lang=&#8221;html4strict&#8221;>&lt;span data-user=&quot;admin&quot; data-domain=&quot;example.com&quot; class=&quot;protect-emails&quot; /&gt;</pre><pre lang=&#8221;JavaScript&#8221;>
$(document).ready(function(){
&nbsp;&nbsp;&nbsp;&nbsp;$(&#039;span&#039;).filter(&#039;.protect-emails&#039;).protectEmails();
});
</pre></p>
<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>
<p><pre lang=&#8221;CSS&#8221;>.protect-emails:after {&nbsp;&nbsp;content: attr(data-user) &#039;@&#039; attr(data-domain); }</pre></p>
<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=&#8221;b&#8221;>content</code> wspartej wykorzystaniem <code class=&#8221;b&#8221;>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>
<p><pre lang=&#8221;html4strict&#8221;>&lt;span data-user=&quot;admin&quot; data-domain=&quot;example.com&quot; class=&quot;protect-emails&quot; /&gt;</pre><pre lang=&#8221;CSS&#8221;>
.protect-emails:after { 
&nbsp;&nbsp;&nbsp;&nbsp;content: attr(data-user) &#039;@&#039; attr(data-domain);
}
</pre></p>
<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=&#8221;b&#8221;>hover</code> czy <code class=&#8221;b&#8221;>click</code> skrypt podmienia znacznik <code class=&#8221;b&#8221;>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 ;). 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=&#8221;b&#8221;>[at]</code> na <code class=&#8221;b&#8221;>@</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" href="https://github.com/vokiel/protectEmails#referrer=blog.vokiel.com" class="source" title="Źródła">Źródła</a></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/protectemails-jquery-plugin/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Meet.js Summit 2012 Relacja</title>
		<link>http://blog.vokiel.com/meet-js-summit-2012-relacja/</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><![CDATA[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 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 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 href="http://ferrante.pl/frontend/javascript/meet-js-summit-2012/#referrer=blog.vokiel.com" title="meet.js summit 2012" target="_blank" class="broken_link">Damian Wielgosik</a> wraz z <a href="http://poznan.gtug.pl/#referrer=blog.vokiel.com" title="GTUG Poznań" target="_blank" class="broken_link">GTUG Poznań</a> oraz <a href="http://startup-it.pl/#referrer=blog.vokiel.com" title="Startup-It.pl" target="_blank" class="broken_link">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" srcset="http://blog.vokiel.com/wp-content/uploads/2012/01/meetjs_tshirts_650x228.jpg 650w, http://blog.vokiel.com/wp-content/uploads/2012/01/meetjs_tshirts_650x228-300x105.jpg 300w" sizes="(max-width: 650px) 100vw, 650px" /></p>
<p>To nie koniec, były ciastka, a do nich kawa i/lub herbata (woda dla unikających używek <img src="https://s.w.org/images/core/emoji/11/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ). 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" srcset="http://blog.vokiel.com/wp-content/uploads/2012/01/meetjs_comic_1200x925-300x231.jpg 300w, http://blog.vokiel.com/wp-content/uploads/2012/01/meetjs_comic_1200x925-1024x789.jpg 1024w, http://blog.vokiel.com/wp-content/uploads/2012/01/meetjs_comic_1200x925.jpg 1200w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Bardzo szybko zebrane prezentacje są do obejrzenia na profilu <a 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 forum.kohanaphp.pl &#8211; pzdr @mck, <a href="https://twitter.com/supernrm#referrer=blog.vokiel.com" title="supernrm" target="_blank">@nrm</a>). Był też <a href="http://chemikpil.pl/#referrer=blog.vokiel.com" title="chemikpil" target="_blank" class="broken_link">@chemikpl</a>, którego poznałem osobiście na ostatnim <a 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 href="http://blog.rbenkel.me/#referrer=blog.vokiel.com" title="Radosław Benkel" target="_blank" class="broken_link">@singlespl</a> oraz <a 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 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 href="http://ferrante.pl/frontend/javascript/meet-js-summit-2012/#referrer=blog.vokiel.com" title="meet.js summit 2012" target="_blank" class="broken_link">ferrante</a>, <a href="http://rubysfera.pl/2012/01/summit-meetjs-relacja/#referrer=blog.vokiel.com" title="Meetjs Summit – relacja" target="_blank">pavelloz</a>, <a href="http://michalbe.blogspot.com/2012/01/meetjs-summit.html#referrer=blog.vokiel.com" title="MeetJS Summit" target="_blank">michalbe</a>, <a 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 href="http://chemikpil.pl/meet-js-summit-moja-relacja/#referrer=blog.vokiel.com" title="Meet.js Summit – moja relacja" target="_blank" class="broken_link">ChemikPIL</a>
</p>
<p>Przygotowanie na najwyższym poziomie, pomimo iż cała impreza była darmowa. Jeszcze raz, wielkie brawa.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/meet-js-summit-2012-relacja/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WordCamp Poznań 2011 – relacja</title>
		<link>http://blog.vokiel.com/wordcamp-poznan-2011-relacja/</link>
		<comments>http://blog.vokiel.com/wordcamp-poznan-2011-relacja/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 11:53:13 +0000</pubDate>
		<dc:creator><![CDATA[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" style="width: 210px" class="wp-caption alignright"><a 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" srcset="http://blog.vokiel.com/wp-content/uploads/2011/12/bylem-speakerem.jpg 200w, http://blog.vokiel.com/wp-content/uploads/2011/12/bylem-speakerem-150x150.jpg 150w" sizes="(max-width: 200px) 100vw, 200px" /></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 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 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 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 href="http://www.brotherspub.pl/#referrer=blog.vokiel.com" class="broken_link">The Brothers Pub</a> było idealnym wyborem, niepowtarzalny klimat, niesamowita Orzechówka (Jurek Ty to potrafisz namówić <img src="https://s.w.org/images/core/emoji/11/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ), a te ciastka&#8230;</p>
<p>Następnego dnia wystartowaliśmy z prezentacjami. Ich przebieg możecie prześledzić w <a 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 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 href="http://chemikpil.pl/#referrer=blog.vokiel.com" class="broken_link">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 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 Pawł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 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" srcset="http://blog.vokiel.com/wp-content/uploads/2011/12/identyfikator-300x228.jpg 300w, http://blog.vokiel.com/wp-content/uploads/2011/12/identyfikator.jpg 800w" sizes="(max-width: 300px) 100vw, 300px" /></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 href="/dema/wcpoz2011/wcpoz2011.zip" class="source" title="Źródła">Źródła</a><a href="/dema/wcpoz2011/index.html" class="demo" title="Prezentacja">Prezentacja</a>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/wordcamp-poznan-2011-relacja/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Klasa PHP rozwiązująca problem przynależności punktu do wielokąta</title>
		<link>http://blog.vokiel.com/klasa-php-rozwiazujaca-problem-przynaleznosci-punktu-do-wielokata/</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><![CDATA[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 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 href="/dema/geofencing/inPolygon.class.php" class="source" title="Źródła">Źródła</a><a 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 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 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>
<p><pre lang=&#8221;php&#8221; line=&#8221;1&#8243;>
/**
 * @author Robert *Vokiel* Mikołajuk vokiel@vokiel.com http://blog.vokiel.com
 * @copyright (c) 2011 Robert Mikołajuk
 */
class inPolygon {
&nbsp;&nbsp;/**
&nbsp;&nbsp; * @var&nbsp;&nbsp;array&nbsp;&nbsp;$point&nbsp;&nbsp;Współrzędne prawdzanego punktu
&nbsp;&nbsp; */
&nbsp;&nbsp;protected $point;
&nbsp;&nbsp;/**
&nbsp;&nbsp; * @var&nbsp;&nbsp;array&nbsp;&nbsp;$raypoint&nbsp;&nbsp;Punkt końcowy półprostej od $this-&gt;point równoległej do osi OX 
&nbsp;&nbsp; */
&nbsp;&nbsp;protected $raypoint;
&nbsp;&nbsp;/**
&nbsp;&nbsp; * @var&nbsp;&nbsp;array&nbsp;&nbsp;$polygon&nbsp;&nbsp;Tablica współrzędnych punktów
&nbsp;&nbsp; */
&nbsp;&nbsp;protected $polygon;
&nbsp;&nbsp;/**
&nbsp;&nbsp; * @var&nbsp;&nbsp;int&nbsp;&nbsp;$crosses&nbsp;&nbsp;Liczba przecięć odcinków
&nbsp;&nbsp; */
&nbsp;&nbsp;protected $crosses = 0;

&nbsp;&nbsp;/**
&nbsp;&nbsp; * 
&nbsp;&nbsp; * @param array $point
&nbsp;&nbsp; * @param array $polygon
&nbsp;&nbsp; */
&nbsp;&nbsp;public function __construct($point,$polygon){
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;point = $point;
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;raypoint = array(&#039;x&#039; =&gt; ($point[&#039;x&#039;]+1), &#039;y&#039; =&gt; $point[&#039;y&#039;]); 
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;polygon = $polygon;

&nbsp;&nbsp;&nbsp;&nbsp;// jeśli ostatni element nie jest tożsamy z pierwszym, dodajemy go na końcu tablicy
&nbsp;&nbsp;&nbsp;&nbsp;if ( $this-&gt;polygon[0] != $this-&gt;polygon[count($this-&gt;polygon)-1]){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array_push($this-&gt;polygon,$this-&gt;polygon[0]); 
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;}
&nbsp;&nbsp;
&nbsp;&nbsp;/**
&nbsp;&nbsp; * Sprawdzenie czy punkt zawiera się w obszarze
&nbsp;&nbsp; * @return bool
&nbsp;&nbsp; */
&nbsp;&nbsp;public function check(){
&nbsp;&nbsp;&nbsp;&nbsp;// sprawdzenie czy punkt nie należy do jednego z boków wielokąta
&nbsp;&nbsp;&nbsp;&nbsp;for ($i=0; $i&lt;count($this-&gt;polygon); $i++){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( $this-&gt;pointCrossEdge($this-&gt;polygon[$i],$this-&gt;polygon[$i+1],$this-&gt;point) ){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;if ( $this-&gt;setRaypoint() ){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;edgeCross();
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;if ($this-&gt;crosses % 2 == 1){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;return false;
&nbsp;&nbsp;}
&nbsp;&nbsp;
&nbsp;&nbsp;/**
&nbsp;&nbsp; * Wyznaczenie punktów półprostej równoległej do osi OX
&nbsp;&nbsp; * 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
&nbsp;&nbsp; */
&nbsp;&nbsp;protected function setRaypoint(){
&nbsp;&nbsp;&nbsp;&nbsp;for ($i=0; $i&lt;count($this-&gt;polygon); $i++){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( $this-&gt;polygon[$i][&#039;x&#039;] &gt; $this-&gt;raypoint[&#039;x&#039;] ){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;raypoint[&#039;x&#039;] = $this-&gt;polygon[$i][&#039;x&#039;];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;raypoint[&#039;x&#039;] = $this-&gt;raypoint[&#039;x&#039;]+1;
&nbsp;&nbsp;&nbsp;&nbsp;return true;
&nbsp;&nbsp;}
&nbsp;&nbsp;
&nbsp;&nbsp;/**
&nbsp;&nbsp; * Wyliczenie ilości przecięć półprostej przez odcinki boków wielokąta 
&nbsp;&nbsp; * Półprosta zostaje przeprowadzona od badanego punktu w prawo, 
&nbsp;&nbsp; * aż za najbardziej wysunięty w prawo punkt wielokąta&nbsp;&nbsp;
&nbsp;&nbsp; */
&nbsp;&nbsp;protected function edgeCross() {
&nbsp;&nbsp;&nbsp;&nbsp;// wstawienie na koniec tablicy punktów wielokąta drugiego wierzchołka - dla ułatwienia obliczeń
&nbsp;&nbsp;&nbsp;&nbsp;array_push($this-&gt;polygon,$this-&gt;polygon[1]);
&nbsp;&nbsp;&nbsp;&nbsp;for ($i=1; $i&lt;(count($this-&gt;polygon)-1); $i++){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Prosta P-P1 zawiera się w boku wielokąta W($i,$i+1) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($this-&gt;pointCrossEdge($this-&gt;point, $this-&gt;raypoint, $this-&gt;polygon[ $i ]) &amp;&amp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;!$this-&gt;pointCrossEdge($this-&gt;point, $this-&gt;raypoint, $this-&gt;polygon[ ($i+1) ]) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Punkt wcześniejszy wielokątea i dalszy leżą po przeciwnej stronie prostej P-P1 - ilość przecięć: 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($this-&gt;sng( $this-&gt;det( $this-&gt;point, $this-&gt;polygon[ $i ], $this-&gt;polygon[ ($i-1) ] ) ) != 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;sng( $this-&gt;det( $this-&gt;point, $this-&gt;polygon[ $i ], $this-&gt;polygon[ ($i+1) ])) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;crosses++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else { // Prosta P-P1 nie zawiera się w boku wielokąta
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Prosta P-P1 zawiera wierzchołek W($i)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($this-&gt;pointCrossEdge( $this-&gt;point, $this-&gt;raypoint, $this-&gt;polygon[ $i ] ) &amp;&amp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;pointCrossEdge( $this-&gt;point, $this-&gt;raypoint, $this-&gt;polygon[ ($i-1) ] ) &amp;&amp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;!$this-&gt;pointCrossEdge( $this-&gt;point, $this-&gt;raypoint, $this-&gt;polygon[ ($i+1) ] )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Sprawdzenie położenia wierzhołków sąsiadujących z wierzchołkiem W($i)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($this-&gt;sng( $this-&gt;det( $this-&gt;point, array(&#039;x&#039;=&gt;($this-&gt;point[&#039;x&#039;]+1),&#039;y&#039;=&gt;$this-&gt;point[&#039;y&#039;]), $this-&gt;polygon[ ($i-1) ] ) ) !==
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;sng( $this-&gt;det( $this-&gt;point, array(&#039;x&#039;=&gt;($this-&gt;point[&#039;x&#039;]+1),&#039;y&#039;=&gt;$this-&gt;point[&#039;y&#039;]), $this-&gt;polygon[ ($i+1) ] ) )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;crosses++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Sprawdzenie czy prosta P-P1 przecina bok wilokąta W($i,$i+1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( $this-&gt;edgeCrossEdge( $this-&gt;polygon[ $i ], $this-&gt;polygon[ ($i+1) ], $this-&gt;point, $this-&gt;raypoint) &amp;&amp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(!$this-&gt;pointCrossEdge( $this-&gt;point, $this-&gt;raypoint, $this-&gt;polygon[ ($i-1) ] ) ||&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;!$this-&gt;pointCrossEdge( $this-&gt;point, $this-&gt;raypoint, $this-&gt;polygon[ ($i-2) ] ) &amp;&amp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;!$this-&gt;pointCrossEdge( $this-&gt;point, $this-&gt;raypoint, $this-&gt;polygon[ ($i-3) ] )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;) &amp;&amp; (
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;sng( $this-&gt;det( $this-&gt;point, array(&#039;x&#039;=&gt;($this-&gt;point[&#039;x&#039;]+1),&#039;y&#039;=&gt;$this-&gt;point[&#039;y&#039;]), $this-&gt;polygon[ ($i-1) ] ) ) !==
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;sng( $this-&gt;det( $this-&gt;point, array(&#039;x&#039;=&gt;($this-&gt;point[&#039;x&#039;]+1),&#039;y&#039;=&gt;$this-&gt;point[&#039;y&#039;]), $this-&gt;polygon[ ($i-2) ] ) )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;) &amp;&amp; !$this-&gt;pointCrossEdge( $this-&gt;point, $this-&gt;raypoint, $this-&gt;polygon[ ($i+1) ] )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;crosses++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;}
&nbsp;&nbsp;
&nbsp;&nbsp;/**
&nbsp;&nbsp; * 
&nbsp;&nbsp; * Sprawdzenie czy $check_point należy do odcinka ($start_point|$stop_point) 
&nbsp;&nbsp; * @param array $start_point&nbsp;&nbsp;Punkt startowy odcinka
&nbsp;&nbsp; * @param array $stop_point&nbsp;&nbsp; Punkt końcowy odcinka
&nbsp;&nbsp; * @param array $check_point&nbsp;&nbsp;Sprawdzany punkt
&nbsp;&nbsp; */
&nbsp;&nbsp;protected function pointCrossEdge($start_point,$stop_point,$check_point){
&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;det($start_point, $stop_point, $check_point) == 0 &amp;&amp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min( $start_point[&#039;x&#039;], $stop_point[&#039;x&#039;] ) &lt;= $check_point[&#039;x&#039;] &amp;&amp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$check_point[&#039;x&#039;] &lt;= max( $start_point[&#039;x&#039;], $stop_point[&#039;x&#039;] ) &amp;&amp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min ( $start_point[&#039;y&#039;], $stop_point[&#039;y&#039;] ) &lt;= $check_point[&#039;y&#039;] &amp;&amp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$check_point[&#039;y&#039;] &lt;= max( $start_point[&#039;y&#039;], $stop_point[&#039;y&#039;] );
&nbsp;&nbsp;}
&nbsp;&nbsp;
&nbsp;&nbsp;/**
&nbsp;&nbsp; * Sprawdzenie czy odcinki $start_point_1-$stop_point_1 i $start_point_2-$stop_point_2 przecinają się
&nbsp;&nbsp; * @param array $start_point_1&nbsp;&nbsp;Punkt startowy pierwszego odcinka 
&nbsp;&nbsp; * @param array $stop_point_1&nbsp;&nbsp;Punkt końcowy pierwszego odcinka 
&nbsp;&nbsp; * @param array $start_point_2&nbsp;&nbsp;Punkt startowy drugiego odcinka 
&nbsp;&nbsp; * @param array $stop_point_2&nbsp;&nbsp;Punkt końcowy drugiego odcinka 
&nbsp;&nbsp; */
&nbsp;&nbsp;protected function edgeCrossEdge($start_point_1,$stop_point_1,$start_point_2,$stop_point_2){
&nbsp;&nbsp;&nbsp;&nbsp;return ($this-&gt;sng( $this-&gt;det($start_point_1,$stop_point_1,$start_point_2) ) != $this-&gt;sng( $this-&gt;det($start_point_1,$stop_point_1,$stop_point_2) ) &amp;&amp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;sng( $this-&gt;det($start_point_2,$stop_point_2,$start_point_1) ) != $this-&gt;sng( $this-&gt;det($start_point_2,$stop_point_2,$stop_point_1) ) ||
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;pointCrossEdge($start_point_1,$stop_point_1,$start_point_2) ||
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;pointCrossEdge($start_point_1,$stop_point_1,$stop_point_2) ||
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;pointCrossEdge($start_point_2,$stop_point_2,$start_point_1) ||
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;pointCrossEdge($start_point_2,$stop_point_2,$stop_point_1)
&nbsp;&nbsp;&nbsp;&nbsp;);
&nbsp;&nbsp;}
&nbsp;&nbsp;
&nbsp;&nbsp;/**
&nbsp;&nbsp; * Wyznacznik macierzy kwadratowej stopnia 3
&nbsp;&nbsp; * @param array $start_point
&nbsp;&nbsp; * @param array $stop_point
&nbsp;&nbsp; * @param array $check_point
&nbsp;&nbsp; */
&nbsp;&nbsp;protected function det($start_point,$stop_point,$check_point){
&nbsp;&nbsp;&nbsp;&nbsp;return $start_point[&#039;x&#039;] * ( $stop_point[&#039;y&#039;] - $check_point[&#039;y&#039;] ) + $stop_point[&#039;x&#039;] * ( $check_point[&#039;y&#039;] - $start_point[&#039;y&#039;] ) + $check_point[&#039;x&#039;] * ( $start_point[&#039;y&#039;] - $stop_point[&#039;y&#039;]);
&nbsp;&nbsp;&nbsp;&nbsp;/* druga metoda
&nbsp;&nbsp;&nbsp;&nbsp;return ($start_point[&#039;x&#039;] * $stop_point[&#039;y&#039;] + $stop_point[&#039;x&#039;] * $check_point[&#039;y&#039;] + $check_point[&#039;x&#039;] * $start_point[&#039;y&#039;] - $check_point[&#039;x&#039;] * $stop_point[&#039;y&#039;] - $start_point[&#039;x&#039;] * $check_point[&#039;y&#039;] - $stop_point[&#039;x&#039;] * $start_point[&#039;y&#039;]);
&nbsp;&nbsp;&nbsp;&nbsp;*/ 
&nbsp;&nbsp;}
&nbsp;&nbsp;
&nbsp;&nbsp;/**
&nbsp;&nbsp; * Określenie znaku liczby
&nbsp;&nbsp; * @param int $x&nbsp;&nbsp;Liczba
&nbsp;&nbsp; * @return int $x
&nbsp;&nbsp; */
&nbsp;&nbsp;protected function sng($x){
&nbsp;&nbsp;&nbsp;&nbsp;if ( $x == 0 ){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;&nbsp;} else if ( $x &gt; 0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 1;
&nbsp;&nbsp;&nbsp;&nbsp;} else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;}
&nbsp;&nbsp;
}// end of inPolygon class
</pre></p>
<p>Na koniec przydałoby się napisać jakieś demo. Wkrótce się pojawi.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.vokiel.com/klasa-php-rozwiazujaca-problem-przynaleznosci-punktu-do-wielokata/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss><!--
Performance optimized by W3 Total Cache. Learn more: https://www.w3-edge.com/products/

Object Caching 104/230 objects using disk
Page Caching using disk: enhanced (Page is feed) 

Page cache debug info:
Engine:             disk: enhanced
Cache key:          blog.vokiel.com/feed/_index.html
Creation Time:      1725437386.000s
Header info:
Set-Cookie:          qtrans_cookie_test=qTranslate%20Cookie%20Test; path=/; domain=blog.vokiel.com
Last-Modified:       Sun, 12 Apr 2015 15:24:58 GMT
Link:                <http://blog.vokiel.com/wp-json/>; rel="https://api.w.org/"
Content-Type:        application/rss+xml; charset=UTF-8

Database Caching using disk (Request-wide modification query)

Served from: blog.vokiel.com @ 2024-09-04 09:09:46 by W3 Total Cache
-->