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

<channel>
	<title>flegblog</title>
	<atom:link href="http://blog.fl9.eu/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.fl9.eu</link>
	<description>calm like a bomb</description>
	<lastBuildDate>Wed, 14 Sep 2011 16:14:15 +0000</lastBuildDate>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>BOSH: Korzystamy z komunikatora nawet zza (prawie) najtwardszych firewalli</title>
		<link>http://blog.fl9.eu/2011/09/14/bosh/</link>
		<comments>http://blog.fl9.eu/2011/09/14/bosh/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 16:14:15 +0000</pubDate>
		<dc:creator>flegmatyk</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Komputery]]></category>
		<category><![CDATA[atlas]]></category>
		<category><![CDATA[xmpp]]></category>

		<guid isPermaLink="false">http://blog.fl9.eu/?p=1375</guid>
		<description><![CDATA[Zdarzyło Ci się kiedyś tak, że korzystałeś(aś) z internetu w miejscu, gdzie wszystko poza stronami internetowymi (http i https) było zablokowane? Istnieje proste rozwiązanie tego problemu, które pojawiło się wraz z pewną funkcjonalnością XMPP, a mianowicie BOSH. Mówiąc w skrócie, technologia ta pozwala na komunikację z serwerami XMPP korzystając tylko i wyłącznie z protokołu HTTP(S), [...]]]></description>
			<content:encoded><![CDATA[<p>Zdarzyło Ci się kiedyś tak, że korzystałeś(aś) z internetu w miejscu, gdzie wszystko poza stronami internetowymi (<code>http</code> i <code>https</code>) było zablokowane? Istnieje proste rozwiązanie tego problemu, które pojawiło się wraz z pewną funkcjonalnością XMPP, a mianowicie <a href="http://en.wikipedia.org/wiki/BOSH">BOSH</a>. Mówiąc w skrócie, technologia ta pozwala na komunikację z serwerami XMPP korzystając tylko i wyłącznie z protokołu HTTP(S), tego samego, którego używa się do przeglądania stron internetowych. Daje nam to dwie możliwości:</p>
<ul>
<li>Tworzenie dziwacznych komunikatorów internetowych w przeglądarkach, jak Google Talk w GMailu, Facebook Chat czy komunikator NaszoKlasowy; do tego grona zalicza się również nieużywany przez nikogo w najbliższej przyszłości <a href="https://candy.atlas.fl9.eu/">atlasowy candy</a>,</li>
<li>Oszukiwanie wszelkiej maści firewalli, które po zaszyfrowaniu transmisji SSLem (https) nie mogą rozróżnić normalnego przeglądania stron internetowych i korzystania z takiego komunikatora (oczywiście, można zablokować domeny itp, ale na to już nic się nie poradzi).</li>
</ul>
<p>
<span id="more-1375"></span></p>
<h2>Obsługa BOSH w Gajimie</h2>
<p>Podobno Pidgin również obsługuje BOSH, jednak jedynym klientem, który udało mi się zmusić do działania z BOSH, był <a href="http://gajim.org/">Gajim</a>. Konfigurację omówię na przykładzie kont atlasowych (chociażby tych na <a href="http://atlas.fl9.eu/news/2">xmpp.fl9.eu</a>), ale w przypadku innych serwerów wygląda to analogicznie &#8211; wystarczy zmienić <code>BOSH Url</code>.</p>
<p>Wchodzimy w konfigurację kont w Gajimie, wybieramy odpowiednie konto i przechodzimy na zakładkę <strong>Połączenie</strong>. Tam najbardziej interesuje nas <strong>Proxy</strong> &#8211; aby dodać nowe klikamy na <strong>Zarządzaj&#8230;</strong>.</p>
<p><a href="http://zsyp.fl9.eu/blog/2011/09/bosh1.png"><img src="http://zsyp.fl9.eu/blog/2011/09/bosh1-300x184.png" alt="" title="bosh1" width="300" height="184" class="aligncenter size-medium wp-image-1378" /></a></p>
<p>W nowootwartym oknie klikamy na <strong>Dodaj</strong>, aby dodać nowy serwer Proxy, nazwę wpisujemy dowolną, jako typ wybieramy BOSH i wypełniamy odpowiednim adresem pole <strong>BOSH URL</strong>. W przypadku kont atlasowych będzie to <code>http<b>s</b>://candy.atlas.fl9.eu/http-bind/</code>. Obsługiwane jest tylko HTTPS, bo łączenie się z komunikatorem poprzez nieszyfrowane HTTP to IMHO czysta głupota, ale niektóre serwery mogą na to pozwalać. Certyfikat serwera jest niepodpisany, ale znając jego fingerprinty (SHA-256: <code>DD 18 9C 96 EA 84 1E 76 8F 9B 0B E3 D6 3F D2 BA 99 30 75 86 83 5E F4 FC 93 2A 04 DB 5A BC E7 16</code>, SHA-1: <code>BE 12 8F 2E D1 58 07 B1 2E 00 DC 02 2F A9 D0 A6 32 47 AC 26</code>) możemy być praktycznie pewni jego autentyczności.</p>
<p><a href="http://zsyp.fl9.eu/blog/2011/09/bosh2.png"><img src="http://zsyp.fl9.eu/blog/2011/09/bosh2-300x214.png" alt="" title="bosh2" width="300" height="214" class="aligncenter size-medium wp-image-1379" /></a></p>
<p>Zamykamy okno Zarządzania Profilami Proxy i w zakładce Połączenie jako Proxy wybieramy stworzone przed chwilą połączenie poprzez BOSH. Od tej pory Gajim będzie łączył się tylko i wyłącznie za pośrednictwem wybranego adresu URL.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fl9.eu/2011/09/14/bosh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problem z liczbami zmiennoprzecinkowymi w avr-gcc</title>
		<link>http://blog.fl9.eu/2011/04/02/problem-z-liczbami-zmiennoprzecinkowymi-w-avr-gcc/</link>
		<comments>http://blog.fl9.eu/2011/04/02/problem-z-liczbami-zmiennoprzecinkowymi-w-avr-gcc/#comments</comments>
		<pubDate>Sat, 02 Apr 2011 14:52:42 +0000</pubDate>
		<dc:creator>flegmatyk</dc:creator>
				<category><![CDATA[Techniczne]]></category>
		<category><![CDATA[atmega]]></category>
		<category><![CDATA[avr-gcc]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[floating]]></category>
		<category><![CDATA[linker]]></category>
		<category><![CDATA[problem]]></category>

		<guid isPermaLink="false">http://blog.fl9.eu/?p=1344</guid>
		<description><![CDATA[Natrafiając na następujący problem podczas kompilacji swojego kodu na Atmegę przy użyciu zmiennego przecinka (ja akurat używałem instrukcji atof): Rozwiązaniem jest dodanie parametru -lm jako ostatniego parametru linkera. Mój przykładowy plik Makefile, w którym poradziłem sobie z tym problemem: Podkreśliłem linię, w której należało dodać ów parametr.]]></description>
			<content:encoded><![CDATA[<p>Natrafiając na następujący problem podczas kompilacji swojego kodu na Atmegę przy użyciu zmiennego przecinka (ja akurat używałem instrukcji <code>atof</code>):</p>
<pre class="brush: plain; light: true; title: ; notranslate">/opt/cross/avr/lib/gcc/avr/4.3.3/../../../../avr/lib/avr5/libc.a(cmpsf2.o):../../../libm/fplib/cmpsf2.S:58: multiple definition of `__ltsf2'
/opt/cross/avr/lib/gcc/avr/4.3.3/avr5/libgcc.a(_lt_sf.o):/usr/src/packages/BUILD/build/avr/avr5/libgcc/../../.././gcc/fp-bit.c:1287: first defined here
/opt/cross/avr/lib/gcc/avr/4.3.3/../../../../avr/lib/avr5/libc.a(floatsisf.o):../../../libm/fplib/floatsisf.S:46: multiple definition of `__floatsisf'
/opt/cross/avr/lib/gcc/avr/4.3.3/avr5/libgcc.a(_si_to_sf.o):/usr/src/packages/BUILD/build/avr/avr5/libgcc/../../.././gcc/fp-bit.c:1349: first defined here</pre>
<p>Rozwiązaniem jest dodanie parametru <code>-lm</code> jako <strong>ostatniego</strong> parametru linkera.</p>
<p>Mój przykładowy plik <code>Makefile</code>, w którym poradziłem sobie z tym problemem:</p>
<pre class="brush: plain; highlight: [17]; title: ; notranslate">FILE=gps
MCU=atmega328p
CFLAGS=-g -mmcu=$(MCU) -Wall -Wstrict-prototypes -Os -mcall-prologues -lm
PORT=/dev/ttyUSB0
DUDEOPTS=-c arduino -p m328p -P $(PORT) -b 57600

all: $(FILE).hex

help:
	@echo &quot;Wpisz \&quot;make\&quot;, aby zbudować program (stworzyć plik .hex).&quot;
	@echo &quot;Wpisz \&quot;make load\&quot;, aby wrzucić program do mikrokontrolera.&quot;
	@echo &quot;Wpisz \&quot;make clean\&quot;, aby wyczyścić pliki.&quot;	

$(FILE).hex : $(FILE).out
	avr-objcopy -R .eeprom -O ihex $(FILE).out $(FILE).hex
$(FILE).out : $(FILE).o
	avr-gcc $(CFLAGS) -o $(FILE).out -Wl,-Map,$(FILE).map $(FILE).o -lm
$(FILE).o : $(FILE).c
	avr-gcc $(CFLAGS) -Os -c $(FILE).c 

load: $(FILE).hex
	stty -F $(PORT) hupcl
	avrdude $(DUDEOPTS) -e -U flash:w:$(FILE).hex

clean:
	rm -f *.o *.map *.out *.hex</pre>
<p>Podkreśliłem linię, w której należało dodać ów parametr.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fl9.eu/2011/04/02/problem-z-liczbami-zmiennoprzecinkowymi-w-avr-gcc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BASH: Znajdowanie wszystkich dowiązań twardych do pliku w podanym drzewie katalogów</title>
		<link>http://blog.fl9.eu/2011/03/22/bash-znajdowanie-wszystkich-dowi%c4%85za%c5%84-twardych-do-pliku-w-podanym-drzewie-katalog%c3%b3w/</link>
		<comments>http://blog.fl9.eu/2011/03/22/bash-znajdowanie-wszystkich-dowi%c4%85za%c5%84-twardych-do-pliku-w-podanym-drzewie-katalog%c3%b3w/#comments</comments>
		<pubDate>Tue, 22 Mar 2011 18:14:30 +0000</pubDate>
		<dc:creator>flegmatyk</dc:creator>
				<category><![CDATA[Komputery]]></category>
		<category><![CDATA[Techniczne]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[skrypt]]></category>

		<guid isPermaLink="false">http://blog.fl9.eu/?p=1324</guid>
		<description><![CDATA[Pytanie: Jak znaleźć wszystkie dowiązania twarde do tego samego pliku w podanym drzewie katalogów i coś z nimi zrobić (policzyć, zamienić na dowiązania symboliczne, usunąć, cokolwiek)? Należy użyć polecenia find. Pojawiają się jednak problemy: Można w find użyć -links +1, aby znaleźć wszystkie pliki, których licznik dowiązań twardych ma wartość większą niż 1 (wiedząc, że [...]]]></description>
			<content:encoded><![CDATA[<p>Pytanie: Jak znaleźć wszystkie dowiązania twarde do tego samego pliku w podanym drzewie katalogów i coś z nimi zrobić (policzyć, zamienić na dowiązania symboliczne, usunąć, cokolwiek)? Należy użyć polecenia <code>find</code>. Pojawiają się jednak problemy:</p>
<ul>
<li>Można w <code>find</code> użyć <code>-links +1</code>, aby znaleźć wszystkie pliki, których licznik dowiązań twardych ma wartość większą niż 1 (wiedząc, że każdy plik w *niksie to tak naprawdę jest dowiązanie twarde do jakiegoś <i>inode</i> szukamy takich plików, przy których tych dowiązań twardych jest więcej niż jedno), ale to zwróci również pliki, do których dowiązania znajdują się <em>poza</em> wskazanym drzewem katalogów.</li>
<li>Można również znaleźć wszystkie takie pliki, a następnie wewnątrz pętli <code>while</code> wywołać kolejny raz <code>find</code> z parametrem <code>-samefile</code>. Jednak to powoduje przeszukanie całego drzewa katalogów wraz z każdą iteracją pętli, a więc jeśli mamy duże drzewo, to czas operacji może być naprawdę <strong>długi</strong>.</li>
</ul>
<p><p>Rozwiązanie? Trzeba znaleźć wszystkie pliki regularne (<code>-type f</code>) do których istnieje ponad jedno dowiązanie twarde (<code>-links +1</code>). Wszystko dobrze, ale normalne wywołanie <code>find</code> w ten sposób zwróci nam wszystkei takie pliki w dość losowej kolejności. Do osiągnięcia naszego celu potrzebowaliśmy, aby były mniej-więcej posortowane &#8211; aby wszystkie dowiązania do jednego pliku były obok siebie. Jak to osiągnąć? <code>find</code> potrafi wypluwać dane nie tylko w prosty sposób, poprzez <code>-print</code>, ale również trochę bardziej potężny przy pomocy <code>-printf</code>. Wiemy również, że każde dowiązanie symboliczne wskazujące na ten sam plik musi mieć ustawiony ten sam numer <i>inode</i>. Tak więc, korzystając z <code>-printf "%i %p\n"</code> wypiszemy sobie wszystkie dowiązania wraz z ich numerami inode na przedzie, a następnie przy pomocy <code>sort</code> posortujemy tak, aby wszystkie dowiązania do jednego <i>inode</i> znalazły się obok siebie.</p>
<p>Kod prezentuje się mniej więcej następująco:</p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/bash
find $1 -type f -links +1 -printf &quot;%i %p\n&quot; | sort | while read a
do
    # w zmiennej $a mamy obecnie przetwarzaną linię
    inode=`echo $a | cut -d' ' -f1`
    path=`echo $a | cut -d' ' -f2`
done
</pre>
<p>Teraz, jeśli obecny <code>$inode</code> różni się od tego, który znajdował się w poprzedniej iteracji pętli, to możemy być pewni, że już więcej na dowiązanie do poprzedniego pliku nie natrafimy. Tak więc wystarczy coś wykombinować, np. zmienne globalne przechowujące ostatnio znaleziony inode, i wszystko gra.</p>
<h1>Dlaczego <code>while</code> a nie <code>for</code>?</h1>
<p>Różnica jest prosta, ale ważna. W przypadku takiej pętli:</p>
<pre class="brush: bash; title: ; notranslate">
for i in *
do
    # coś robimy
done
</pre>
<p>cała zawartość <code>*</code> ląduje w wierszu poleceń. To się może wydawać drobnostką, ale jeśli jest tego <em>bardzo</em> dużo, to może się posypać &#8211; w końcu maksymalna długość polecenia w linii komend jest ograniczona. Spójrzmy teraz na konstrukcję z <code>while</code>:</p>
<pre class="brush: bash; title: ; notranslate">
find $1 -print | while read zmienna
do
    # coś robimy
done
</pre>
<p>Wygląda trochę bardziej skomplikowanie, ale zaleta jest znaczna. Mianowicie, tutaj wynik działania polecenia <code>find</code> nie ląduje w linii poleceń, ale idzie za pośrednictwem potoku do polecenia <code>while</code>, które przekazuje każdą otrzymaną w ten sposób linię do polecenia <code>read</code>. Wiemy, że potok może mieć praktycznie nieskończoną długość, więc tutaj problemu takiego, jak w przypadku <code>for</code> nie ma.</p>
<h1>Zobacz też:</h1>
<p>
<ul>
<li><a href="http://manpages.debian.net/cgi-bin/man.cgi?query=FIND&#038;sektion=1&#038;apropos=0&#038;manpath=Debian+6.0+squeeze&#038;locale=pl">Strona podręcznika dla <code>find</code></a></li>
<li><a href="http://manpages.debian.net/cgi-bin/man.cgi?query=cut&#038;apropos=0&#038;sektion=1&#038;manpath=Debian+6.0+squeeze&#038;format=html&#038;locale=pl">Strona podręcznika dla <code>cut</code></a></li>
<li><a href="http://manpages.debian.net/cgi-bin/man.cgi?query=sort&#038;apropos=0&#038;sektion=1&#038;manpath=Debian+6.0+squeeze&#038;format=html&#038;locale=pl">Strona podręcznika dla <code>sort</code></a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.fl9.eu/2011/03/22/bash-znajdowanie-wszystkich-dowi%c4%85za%c5%84-twardych-do-pliku-w-podanym-drzewie-katalog%c3%b3w/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Zapisy na Edukacja.CL, krok po kroku</title>
		<link>http://blog.fl9.eu/2011/02/15/zapisy-na-edukacjacl-krok-po-kroku/</link>
		<comments>http://blog.fl9.eu/2011/02/15/zapisy-na-edukacjacl-krok-po-kroku/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 13:25:07 +0000</pubDate>
		<dc:creator>flegmatyk</dc:creator>
				<category><![CDATA[Bez kategorii]]></category>
		<category><![CDATA[Edukacla.CL]]></category>
		<category><![CDATA[PWr]]></category>

		<guid isPermaLink="false">http://blog.fl9.eu/?p=1287</guid>
		<description><![CDATA[Najpierw należy kliknąć przycisk Zapisy. Dla własnego bezpieczeństwa należy bacznie zwracać uwagę na pasek adresu. Informacja &#8222;Dokument: 0%&#8221; informuje użytkownika, że wszystko idzie w dobrym kierunku. Jeśli wyświetla się krócej niż 10 minut może to oznaczać, że do systemu włamali się hackerzy i system działa nieprawidłowo &#8211; należy wtedy natychmiast odłączyć komputer z gniazdka sieciowego [...]]]></description>
			<content:encoded><![CDATA[<p>Najpierw należy kliknąć przycisk Zapisy.<br />
<a href="http://zsyp.fl9.eu/blog/2011/02/educl.jpg"><img src="http://zsyp.fl9.eu/blog/2011/02/educl-300x58.jpg" alt="" title="Edukacja CL - przycisk Zapisz" width="300" height="58" class="aligncenter size-medium wp-image-1288" /></a><br />
Dla własnego bezpieczeństwa należy bacznie zwracać uwagę na pasek adresu.<br />
<a href="http://zsyp.fl9.eu/blog/2011/02/educl2.jpg"><img src="http://zsyp.fl9.eu/blog/2011/02/educl2-300x17.jpg" alt="" title="Edukacja CL - Pasek adresu" width="300" height="17" class="aligncenter size-medium wp-image-1293" /></a><br />
Informacja &#8222;Dokument: 0%&#8221; informuje użytkownika, że wszystko idzie w dobrym kierunku. Jeśli wyświetla się krócej niż 10 minut może to oznaczać, że do systemu włamali się hackerzy i system działa nieprawidłowo &#8211; należy wtedy natychmiast odłączyć komputer z gniazdka sieciowego aby uniknąć dalszych zniszczeń.</p>
<p>Po odczekaniu powinien pojawić się komunikat o prawidłowym działaniu systemu Edukacja. Informuje on o tym, że wszystkie procedury są wykonywane zgodnie z planem.<br />
<a href="http://zsyp.fl9.eu/blog/2011/02/educl3.jpeg"><img src="http://zsyp.fl9.eu/blog/2011/02/educl3-300x250.jpg" alt="" title="Edukacja CL - Połączenie przerwane przez serwer" width="300" height="250" class="aligncenter size-medium wp-image-1296" /></a></p>
<p>Następnie naszym oczom ukazuje się komunikat zapewniający, że operatorzy czuwają i konserwują system na bieżąco, a więc możemy spać spokojnie i bez obaw używać systemu, ponieważ wiemy, że znajduje się pod czujnym okien specjalistów.<br /><a href="http://zsyp.fl9.eu/blog/2011/02/educl4.jpeg"><img src="http://zsyp.fl9.eu/blog/2011/02/educl4-300x250.jpg" alt="" title="Edukacja CL - Przerwa techniczna" width="300" height="250" class="aligncenter size-medium wp-image-1297" /></a></p>
<p>Po chwili konserwacja zostaje wykonana (wiadomo, godzina 13:00 w dzień zapisów to najlepszy moment na wykonywanie konserwacji, ponieważ można natychmiast sprawdzić, czy dokonane poprawki dobrze znoszą wysokie natężenie ruchu), a my możemy się zalogować.<br /><a href="http://zsyp.fl9.eu/blog/2011/02/educl5.jpeg"><img src="http://zsyp.fl9.eu/blog/2011/02/educl5-300x139.jpg" alt="" title="Edukacja CL - logowanie" width="300" height="139" class="aligncenter size-medium wp-image-1298" /></a><br />
Należy jednak uważać &#8211; ze względów bezpieczeństwa użytkownik, który przez dłuższy czas nie wykonuje żadnej operacji w systemie zostaje automatycznie wylogowany z systemu. Dlatego też, jeśli dłużej niż 1ns nie będziemy wykonywać żadnej operacji pokaże nam się następujący komunikat:<br />
<a href="http://zsyp.fl9.eu/blog/2011/02/educl6.jpeg"><img src="http://zsyp.fl9.eu/blog/2011/02/educl6-300x130.jpg" alt="" title="Edukacja CL - Sesja wygasła" width="300" height="130" class="aligncenter size-medium wp-image-1299" /></a></p>
<p>Warto zwrócić uwagę na pełną transparentność systemu Edukacja.CL. Niektóre systemy po prostu zwracają komunikat o błędzie, natomiast EduCL gra w otwarte karty i nie ukrywa niczego przed użytkownikiem:<br />
<a href="http://zsyp.fl9.eu/blog/2011/02/educl7.jpeg"><img src="http://zsyp.fl9.eu/blog/2011/02/educl7-300x252.jpg" alt="" title="Gadatliwa Edukacja CL" width="300" height="252" class="aligncenter size-medium wp-image-1300" /></a><br />
Po chwili jednak sie powstrzymuje i nie zasypuje użytkowników tyloma informacjami, pokazując jedynie esencję problemu:<br />
<a href="http://zsyp.fl9.eu/blog/2011/02/educl8.jpeg"><img src="http://zsyp.fl9.eu/blog/2011/02/educl8-300x141.jpg" alt="" title="Można też powiedzieć, że po prostu daje już sobie spokój i idzie na fajkę." width="300" height="141" class="aligncenter size-medium wp-image-1301" /></a></p>
<p>Po chwili jesteśmy w stanie zapisać się na pewną ilość przedmiotów, choć możliwe, że w trakcie zapisów będziemy musieli powtórzyć całą opisaną tu procedurę od początku. Nie ma się co martwić, ponieważ tak naprawdę wszystko jest&#8230;<br />
<a href="http://zsyp.fl9.eu/blog/2011/02/educl9.jpeg"><img src="http://zsyp.fl9.eu/blog/2011/02/educl9-300x252.jpg" alt="" title="Edukacja CL - OK" width="300" height="252" class="aligncenter size-medium wp-image-1302" /></a></p>
<p>Przepraszam za skriny w jpg, ale w gorączce chwili i przypływie adrenaliny nie zwróciłem na to uwagi, a KSnapshot uznał, że domyślnie będzie zapisywał w tym formacie.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fl9.eu/2011/02/15/zapisy-na-edukacjacl-krok-po-kroku/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Bully (2006)</title>
		<link>http://blog.fl9.eu/2011/02/14/bully-2006/</link>
		<comments>http://blog.fl9.eu/2011/02/14/bully-2006/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 13:43:55 +0000</pubDate>
		<dc:creator>flegmatyk</dc:creator>
				<category><![CDATA[Gry]]></category>
		<category><![CDATA[Recenzje]]></category>

		<guid isPermaLink="false">http://blog.fl9.eu/?p=1279</guid>
		<description><![CDATA[Witamy w Akademii Bullworth, jedynej takiej szkole z internatem. Tylko tutaj znajdziesz nauczycieli specjalizujących się w różnych dziedzinach - łapówkarstwie, alkoholiźmie, biciu lub uwodzeniu uczniów. Twoje dziecko będzie mogło spożywać pełnowartościowe posiłki pełne błonnika, witamin i popiołu papierosowego. Tutaj nauczy się prawdziwego życia, gdzie zwycięża większy i silniejszy. Odetchnie pełną piersią atmosferą szkolnej ławki, gdzie gnębienie słabszych należy do wieloletniej tradycji. Bezpieczeństwo jest zapewnione przez grupę Prefektów, którzy każdą oznakę niesubordynacji natychmiast zdławią butem w zarodku. Witamy w Akademii Bullworth, najgoszej szkole z internatem w Nowej Anglii.]]></description>
			<content:encoded><![CDATA[<p>Witamy w Akademii Bullworth, jedynej takiej szkole z internatem. Tylko tutaj znajdziesz nauczycieli specjalizujących się w różnych dziedzinach &#8211; łapówkarstwie, alkoholiźmie, biciu lub uwodzeniu uczniów. Twoje dziecko będzie mogło spożywać pełnowartościowe posiłki pełne błonnika, witamin i popiołu papierosowego. Tutaj nauczy się prawdziwego życia, gdzie zwycięża większy i silniejszy. Odetchnie pełną piersią atmosferą szkolnej ławki, gdzie gnębienie słabszych należy do wieloletniej tradycji. Bezpieczeństwo jest zapewnione przez grupę Prefektów, którzy każdą oznakę niesubordynacji natychmiast zdławią butem w zarodku. Witamy w Akademii Bullworth, najgoszej szkole z internatem w Nowej Anglii.</p>
<p>Grę tę kupiłem w okolicy Bożego Narodzenia na wyprzedaży Steam. Jeśli ktoś o niej nie słyszał, podpowiem, kto jest producentem &#8211; <b>Rockstar</b>. Ten sam, który utrzymuje poziom serii GTA. Co więcej, Bully jest grą opartą na tym samym silniku, co GTA z serii III. Z tą różnicą, że dzieje się w szkole, a głównym bohaterem jest piętnastolatek. Co za tym idzie, nie mamy do dyspozycji prawdziwych broni, a przeciwnicy nie giną, a jedynie &#8222;odpadają&#8221;. Czy to jest jakiś problem? Ani trochę.</p>
<p>Walka jest wciągająca i daje dużo zabawy. Zamiast zwykłych broni mamy procę, superprocę, petardy, jajka, proszek na swędzenie, smródbombę, karabin na kartofle&#8230; Brzmi to dziwnie, ale gra się naprawdę wyśmienicie (zwłaszcza superprocą, która jest wyposażona w&#8230; lunetę snajperską). Co więcej, możemy walczyć tym, co znajdziemy na ziemi. Kij bejzbolowy, cegłówka, linijka? Cokolwiek. Walka bynajmniej nie jest trudna, więc nie ma co oczekiwać wyzwań, ale daje naprawdę dużo frajdy (wspomniałem, że można nauczyć sie combosów?). Pod koniec każdej potyczki gracz ma możliwość zadrwić z przeciwnika &#8211; nic to nie daje, poza satysfakcją wykręcenia ręki denerwującemu przeciwnikowi.</p>
<p>Jeśli ktoś grał w GTA, to nie zawiedzie się na Bully. Dużo misji pobocznych, dodatkowe misje od przechodniów, zbieranie kart do gry i gumer recepturek, dodatkowe &#8222;domki&#8221;, w których po odblokowaniu można zapisywać grę. Zróżnicowane pojazdy &#8211; od deskorolki, poprzez różne rodzaje rowerów, traktorek-kosiarkę do trawy, na skuterach kończąc. Mamy całe wesołe miasteczko wraz z atrakcjami do dyspozycji. No i &#8222;gangi&#8221; &#8211; grupy uczniów (nerdzi, bogaczki, sportowcy itd), którzy w zależności od postępów w grze są pozytywnie bądź negatywnie nastawieni w stosunku do gracza. Są też zróżnicowane placówki w mieście, które mamy do dyspozycji &#8211; szkoła, ryneczek, osiedle domków jednorodzinnych, slumsy, park industrialny, a nawet&#8230; zakład dla umysłowo chorych.</p>
<p>Misje są zróżnicowane, i można je wykonywać tak samo, jak w GTA &#8211; niektóre można pominąć, a każdą rozpoczynamy w odpowiednich miejscach. Ponadto należy uczęszczać na lekcje &#8211; ucieczka z lekcji powoduje wzrost poziomu poszukiwań (do momentu zakończenia zajęć o odpowiedniej godzinie). Lekcji nie trzeba kończyć z pozytywną oceną, ale warto, ponieważ osiągamy przez to wymierne korzyści. Większość lekcji polega na wykonywaniu poleceń na ekranie (tak, jak skakanie samochodem w niektórych misjach San Andreas, kojarzą się od razu gry takie, jak Dance Dance Revolution), choć niektóre są zdecydowanie inne. Nie będę ich tutaj opisywał, ale z pewnością można stwierdzić, że zajęcia lekcyjne nie są nudne. Każdy przedmiot składa się z pięciu zajęć, po zaliczeniu których nie trzeba już na ów przedmiot uczęszczać &#8211; ominięcie zajęć nie skutkuje podwyższonym poziomem poszukiwań.</p>
<h2>Wady gry</h2>
<p>Ta gra to konwersja z PlayStation, trzeba to powiedzieć głośno i wyraźnie. W związku z tym gra na klawiaturze jest o wiele mniej przyjemna niż na kontrolerze &#8211; na szczęście kupiłem sobie za 20pln w Saturnie na promocji joypada z dwoma analogami (które są potrzebne do gry). Podpinam go, zaczynam grać&#8230; i nic, gra go nie wykrywa. Co się okazuje? Gra wymaga <i>kontrolera od XBox 360</i>. Jaki jest tego powód? Żaden, ponieważ praktycznie te kontrolery nie dają niczego, czego moja tania podróba kontrolera z PS2 nie daje, poza inaczej ułożonymi przyciskami. Można użyć <a href="http://code.google.com/p/x360ce/">emulatora kontrolerów x360</a>, który działa, i przy pomocy którego grałem. Fakt, nie jest to najstabilniejsze rozwiązanie na świecie &#8211; gra wywala się przy wychodzeniu do początkowego menu, co jednak nie ma wpływu na rozgrywkę, jeśli gra się długimi posiedzeniami i nie próbuje się wczytywać gry podczas grania. Wywalanie się gry w trakcie wychodzenia również nie przeszkadza, ale czuję się, jakbym grał w źle krakowanego pirata. No ale cóż, lepsze to, niż klawiatura.</p>
<p>No i, jak to zwykle przy konwersjach bywa, gra nie jest najlepiej zoptymalizowana. Działa wolno, potrafi przyciąć na moim (wiekowym) sprzęcie, ale na nowszych maszynach nie powinno być żadnych problemów.</p>
<h2>Soundtrack</h2>
<p>Muzyka w grze jest bardzo przyjemna. Zmienia się w zależności od pory dnia, pory roku (wspomniałem, że wygląd otoczenia zmienia się w zależności od pory roku?), czynności lub rodzaju misji. Instrumentalne melodyjki wpadają w ucho, i nie przeszkadza fakt, że są zapętlone. Nie, poważnie, o ile muzyki tej nie nagrałbym sobie do samochodu (tak, jak muzykę z GTA4 nagrałem), to do tej gry jest dobrana <i>idealnie</i>.</p>
<h2>Podsumowanie</h2>
<p>Rockstar ponownie stanął na wysokości zadania. Polecam tę grę, zwłaszcza, że w sklepach można ją wyhaczyć za ~30pln w Ekstra Klasyce. Kilka godzin dobrej zabawy, pełnej żartów, typowo Rockstarowego humoru (przykład &#8211; pocałunek od dziewczyny daje bonusowe punkty zdrowia &#8211; pamiętasz, co dawało takie punkty w GTA III?), pościgów rowerowych, strzelanin z procy i różnego rodzaju misji, które pasują tylko do gry tego rodzaju, lecz dają tak wiele radości z gry, że tego po prostu nie można przegapić.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fl9.eu/2011/02/14/bully-2006/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>SDL Joystick</title>
		<link>http://blog.fl9.eu/2010/12/13/sdl-joystick/</link>
		<comments>http://blog.fl9.eu/2010/12/13/sdl-joystick/#comments</comments>
		<pubDate>Mon, 13 Dec 2010 13:59:24 +0000</pubDate>
		<dc:creator>flegmatyk</dc:creator>
				<category><![CDATA[Techniczne]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[Joystick]]></category>
		<category><![CDATA[SDL]]></category>

		<guid isPermaLink="false">http://blog.fl9.eu/?p=1235</guid>
		<description><![CDATA[SDL jest dość przyjemną biblioteką. Jest wieloplatformowa (i to naprawdę wieloplatformowa, obsługuje mnóstwo dziwnych platform jak i te normalniejsze, oszczędzając programiście wiele pracy) i prosta w obsłudze. Za zadanie miałem napisać obsługę dżojstika &#8211; wypisanie listy dostępnych urządzeń tego typu w systemie i obsłużenie dżojstika. Na początku myślałem o zrobieniu tego w typowo linuksowy sposób, [...]]]></description>
			<content:encoded><![CDATA[<p>SDL jest dość przyjemną biblioteką. Jest wieloplatformowa (i to <i>naprawdę</i> wieloplatformowa, <a href="http://gpf.dcemu.co.uk/ndsSDL.shtml">obsługuje</a> <a href="http://koti.mbnet.fi/mertama/sdl.html">mnóstwo</a> <a href="http://code.google.com/p/iphone-sdl-1-3/">dziwnych</a> <a href="http://jiggawatt.org/badc0de/android/index.html">platform</a> jak i te normalniejsze, oszczędzając programiście wiele pracy) i prosta w obsłudze. Za zadanie miałem napisać obsługę dżojstika &#8211; wypisanie listy dostępnych urządzeń tego typu w systemie i obsłużenie dżojstika. Na początku myślałem o zrobieniu tego <a href="http://archives.seul.org/linuxgames/Aug-1999/msg00107.html">w typowo linuksowy sposób</a>, jednak po chwili w internecie okazało się, że SDL nie tylko potrafi ułatwić mi pracę, ale jeszcze sprawi, że kod będzie (przynajmniej w założeniu, nie testowałem poza Linuksem) działał wszędzie.</p>
<p><span id="more-1235"></span></p>
<p>Kod znajduje się poniżej, a tutaj ja postaram się opisać po kolei, co się dzieje.</p>
<p><strong>Linia 5</strong> inicjalizuje SDL. Można zamiast <code>SDL_INIT_EVERYTHING</code> użyć <code>SDL_INIT_JOYSTICK</code>, jednak obsługa zdarzeń wymaga inicjalizacji podsystemu wideo, a więc postanowiłem inicjalizować wszystko.</p>
<p>W liniach <strong>8 i 9</strong> pobieramy liczbę dżojstików w systemie za pomocą funkcji <code>SDL_NumJoysticks()</code>, a następnie wyświetlamy nazwę każdego za pomocą funkcji <code>SDL_JoystickName(i)</code>, gdzie parametrem jest numer dżojstika. Linii tej nie podświetlałem, bo w sumie nie ma tam nic ciekawego.</p>
<p>W <strong>linii 18</strong> włączamy tryb zdarzeń w obsłudze dżojstika. O co chodzi? Sprawa jest w sumie prosta. Normalnie można dżojstik obsłużyć <i>na chama</i>, wywołując nieskończoną pętlę, w każdej iteracji aktualizując stan dżojstika i robiąc z tym co trzeba. Takie rozwiązanie ma jednak kilka wad:</p>
<ul>
<li>Trzeba samemu sprawdzać, czy coś się wydarzyło na dżojstiku</li>
<li>Trzeba samodzielnie odświeżać stan dżojstika za pomocą funkcji <code>SDL_JoystickUpdate()</code></li>
<li>Marnujemy zasoby komputera, nie robiąc nic poza sprawdzaniem, czy coś nowego się nie wydarzyło</li>
</ul>
<p>O wiele lepszym rozwiązaniem jest system oparty na <i>Zdarzeniach</i> (ang. <i>Event</i>). Jak to działa? Również możemy wykorzystać nieskończoną pętlę (chociaż możemy też sprawdzać, czy mamy jeszcze jakieś zdarzenie do obsłużenia, to nie będziemy się tym tutaj zajmować). Róznica polega jednak na tym, że w tym wypadku wywołanie funkcji <code>SDL_WaitEvent()</code> powoduje uśpienie programu do momentu otrzymania zdarzenia. Po otrzymaniu zdarzenia (którego źródłem może być nie tylko dżojstik, ale i np. klawiatura, ale my włączyliśmy jedynie dżojstik) za pomocą switcha obsługujemy zdarzenie &#8211; w tym wypadku jedynie ruch osi dżojstika. W podobny sposób można obsłużyć <a href="http://www.libsdl.org/docs/html/sdljoybuttonevent.html">przyciski na dżojstiku</a>, jednak jako, że urządzenie, którym dysponuję przycisków nie posiada, to tego nie zaimplementowałem.</p>
<p>
<pre class="brush: cpp; highlight: [5,18]; title: ; notranslate">#include &lt;iostream&gt;
#include &lt;SDL/SDL.h&gt;

int main(int argc, char **argv) {
    if (SDL_Init(SDL_INIT_EVERYTHING) == -1) {
      std::cerr &lt;&lt; &quot;SDL nie inicjalizuje się&quot;;
      return 1;
    }

    // Wypisujemy nazwy wszystkich dżojstików w systemie
    for (int i=0;i&lt;SDL_NumJoysticks();i++) {
      std::cout &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; SDL_JoystickName(i) &lt;&lt; std::endl;
    }

    // Otwieramy dżojstik
    SDL_Joystick *joy = SDL_JoystickOpen(0);

    SDL_JoystickEventState(SDL_ENABLE);

    SDL_Event event;

    while (true) {
      SDL_WaitEvent(&amp;event);  // Czekamy na zdarzenie od dżojstika
      switch (event.type) {
        case SDL_JOYAXISMOTION:  // Ruch osią dżojstika
          std::cout &lt;&lt; &quot;axis: &quot; &lt;&lt; event.jaxis.axis
            &lt;&lt; &quot; val: &quot; &lt;&lt; event.jaxis.value &lt;&lt; std::endl;
        default:
          break;
      }
    }

    // Zamykamy dżojstik
    if (SDL_JoystickOpened(0))
      SDL_JoystickClose(joy);
    return 0;
}</pre>
</p>
<p>Jak widać, sprawa jest bardzo prosta &#8211; pozostaje jedynie dorobienie praktycznej funkcjonalności do naszego programu. Więcej informacji o obsłudze dżojstika można znaleźć w <a href="http://www.libsdl.org/docs/html/joystick.html">dokumentacji SDL</a>, tam też znajdują się przykładowe kody źródłowe. Oczywiście, obsługę zdarzeń najlepiej byłoby wykonać na osobnym wątku, aby nasza aplikacja nie usypiała się całkowicie co chwilę, ale to również wybiega poza ramy tego, co chciałem tutaj przedstawić.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fl9.eu/2010/12/13/sdl-joystick/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zima</title>
		<link>http://blog.fl9.eu/2010/12/05/zima/</link>
		<comments>http://blog.fl9.eu/2010/12/05/zima/#comments</comments>
		<pubDate>Sun, 05 Dec 2010 11:58:30 +0000</pubDate>
		<dc:creator>flegmatyk</dc:creator>
				<category><![CDATA[Pic]]></category>
		<category><![CDATA[Oleśnica]]></category>
		<category><![CDATA[Zdjęcia]]></category>
		<category><![CDATA[Zima]]></category>

		<guid isPermaLink="false">http://blog.fl9.eu/?p=1218</guid>
		<description><![CDATA[<p>Wybrałem się z aparatem na dwór i zrobiłem kilka zdjeć.</p>]]></description>
			<content:encoded><![CDATA[<p>Wybrałem się z aparatem na dwór i zrobiłem kilka zdjeć.</p>
<p>Zaśnieżona ulica Wileńska. Trzeba przyznać, że w tym roku zima <i>nie</i> zaskoczyła drogowców, i pługi całkiem sprawnie odśnieżały i posypywały piaskiem większość dróg w Oleśnicy.<br />
<a rel="attachment wp-att-1219" href="http://blog.fl9.eu/2010/12/05/zima/droga/"><img class="aligncenter size-medium wp-image-1219" title="Wileńska" src="http://zsyp.fl9.eu/blog/2010/12/droga-300x199.jpg" alt="Zaśnieżona ulica Wileńska" width="300" height="199" /></a></p>
<p>Na rynku &#8211; budki. Nie wiem tylko, czy jarmark odbył się wczoraj (bo wczoraj też jakieś stały, i nawet ludzie się przy nich kręcili), czy też może zacznie się później.<br />
<a rel="attachment wp-att-1222" href="http://blog.fl9.eu/2010/12/05/zima/rynek/"><img class="aligncenter size-medium wp-image-1222" title="Stoiska na rynku" src="http://zsyp.fl9.eu/blog/2010/12/rynek-300x199.jpg" alt="Rynek w Oleśnicy z rozstawionymi budkami jarmarcznymi" width="300" height="199" /></a></p>
<p>Niektórzy dzielnie kibicują zimie w urozmaicaniu nam życia.<br />
<a href="http://blog.fl9.eu/2010/12/05/zima/zimo/" rel="attachment wp-att-1224"><img src="http://zsyp.fl9.eu/blog/2010/12/zimo-300x199.jpg" alt="Zimo, napierdalaj" title="Zimo" width="300" height="199" class="aligncenter size-medium wp-image-1224" /></a></p>
<p>Parking, w przypadku którego nikt nie zadaje sobie trudu odśnieżania, zamienia się w plac zabaw dla kierowców. Nie ma tam ludzi ani aut, a sam parking jest na tyle duży, że można na nim bezpiecznie potrenować panowanie nad samochodem.<br />
<a href="http://blog.fl9.eu/2010/12/05/zima/parking/" rel="attachment wp-att-1220"><img src="http://zsyp.fl9.eu/blog/2010/12/parking-300x199.jpg" alt="Zaśnieżony parking" title="Plac zabaw dla samochodów" width="300" height="199" class="aligncenter size-medium wp-image-1220" /></a></p>
<p>Szron na przedniej szybie samochodu, od wewnątrz. Na początku jazdy trzeba w jednej ręce trzymać skrobaczkę. Na zdjęciu widać efekt ~15-20 minut jazdy, więc trochę już stopniało. Takie są uroki starszych samochodów.<br />
<a href="http://blog.fl9.eu/2010/12/05/zima/szron/" rel="attachment wp-att-1223"><img src="http://zsyp.fl9.eu/blog/2010/12/szron-300x199.jpg" alt="Szron na przedniej szybie samochodu. Od wewnątrz." title="Szron na szybie" width="300" height="199" class="aligncenter size-medium wp-image-1223" /></a></p>
<p>Płyn do mycia szyb, który przez zapomnienie przeleżał mrozy w schowku. Niby z alkoholem, ale producent nigdzie nie obiecuje, że płyn będzie mrozoodporny.<br />
<a href="http://blog.fl9.eu/2010/12/05/zima/plyn/" rel="attachment wp-att-1221"><img src="http://zsyp.fl9.eu/blog/2010/12/plyn-300x199.jpg" alt="Zamarznięty płyn do mycia szyb" title="Płyn do mycia szyb" width="300" height="199" class="aligncenter size-medium wp-image-1221" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fl9.eu/2010/12/05/zima/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bluetooth z BluetoothAPIs.h</title>
		<link>http://blog.fl9.eu/2010/10/28/bluetooth-z-bluetoothapis-h/</link>
		<comments>http://blog.fl9.eu/2010/10/28/bluetooth-z-bluetoothapis-h/#comments</comments>
		<pubDate>Thu, 28 Oct 2010 21:06:07 +0000</pubDate>
		<dc:creator>flegmatyk</dc:creator>
				<category><![CDATA[Bluetooth]]></category>
		<category><![CDATA[bluetoothapis.h]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[peryferia]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.fl9.eu/?p=1197</guid>
		<description><![CDATA[Nie ma tutaj wiele do gadania, obsługa Bluetooth z poziomu Windowsa jest dość nieprzyjemna dla osób, które wcześniej niewiele miały wspólnego z programowaniem dla tego systemu &#8211; w tym i dla mnie. Jeśli więc mamy dowolność w wyborze wykorzystywanej przez nas technologii, polecam rodzinę .net albo Javę &#8211; .net wypróbowałem i było łatwo i przyjemnie, [...]]]></description>
			<content:encoded><![CDATA[<p>Nie ma tutaj wiele do gadania, obsługa Bluetooth z poziomu Windowsa jest <em>dość nieprzyjemna</em> dla osób, które wcześniej niewiele miały wspólnego z programowaniem dla tego systemu &#8211; w tym i dla mnie. Jeśli więc mamy dowolność w wyborze wykorzystywanej przez nas technologii, polecam <a href="http://32feet.codeplex.com/">rodzinę .net</a> albo <a href="http://bluecove.org/">Javę</a> &#8211; .net wypróbowałem i było łatwo i przyjemnie, ale Java kusi lepszą przenośnością.</p>
<p>Mój kod oparłem na <a href="http://www.dreamincode.net/code/snippet2051.htm">przykładowym kodzie znalezionym w internecie</a>. Dopisałem do niego co nieco, utknąłem przy próbie wysyłania czegokolwiek &#8211; gniazdko WinSock, które próbowałem tworzyć, było błędne, a ja nie miałem czasu prowadzić dochodzenia, czemu tak się dzieje ;) Jeśli wiesz, chętnie usłyszę w komentarzach i poprawię. Na razie jednak podzielę się tym, co mam.</p>
<p><span id="more-1197"></span></p>
<p>Kod znajduje się na samym dole, podświetliłem tam linie, o których mówię. Na początku definiujemy kilka struktur, które są potrzebne do działania windowsowym funkcjom. Na ich temat nie ma się co rozpisywać, ponieważ wszystko znajdziemy w <a href="http://msdn.microsoft.com/en-us/library/aa362930(v=VS.85).aspx">dokumentacji Microsoftu</a> (mała rada &#8211; jeśli zechce wam się sciągać ich przykładowy kod, to przestrzegam &#8211; i tak niewiele pomaga, przynajmniej mi nie pomógł).</p>
<p>Linia <strong>62</strong> &#8211; funkcja <code>BluetoothFindFirstRadio</code> robi dokładnie to, co mówi jej nazwa &#8211; znajduje pierwszy adapter w systemie i zwraca obiekt <code>HBLUETOOTH_RADIO_FIND</code>, będący czymś w rodzaju identyfikatora wyszukiwania adapterów. Jeśli nie ma żadnego adaptera w systemie, to funkcja zwraca <code>null</code>, co później sprawdzamy. W pętli zaczynającej się od linii <strong>71</strong> dodajemy znaleziony adapter do wektora adapterów. Do działania pętli wykorzystujemy fakt, że <code>BluetoothFindNextRadio</code> zwraca fałsz, jeśli nie znajdzie więcej adapterów, a jeśli znajdzie, to zwraca prawdę, a element, na który wskazuje drugi argument, zostaje wypełniony danymi o znalezionym adapterze &#8211; tak samo, jak w przypadku funkcji znajdującej pierwszy adapter.</p>
<p>W linii <strong>91</strong> ustawiamy w strukturze zawierającej konfigurację skanowania otoczenia to, którym adapterem chcemy skanować. Dalej sposób wyszukiwania urządzeń w pobliżu odbywa się w sposób analogiczny, co wyszukiwanie adapterów.</p>
<p>W linii <strong>124</strong> parujemy się z urządzeniem. Funkcja ta jest o tyle miła, że wyświetla Windowsowe okienko parowania, pytające o PIN i co tylko &#8211; tak więc nic poza tym nie musimy robić. Po zakończeniu tej funkcji telefon i komputer będzie sparowany… albo i nie. W każdym bądź razie, próbowaliśmy.</p>
<p>W linii <strong>127</strong> tworzymy nowe gniazdo WinSock, przystosowane do komunikacji poprzez Bluetooth. I tutaj zaczynają się schody &#8211; następujące po tym sprawdzanie poprawności socketa zawsze przerywa pracę programu. <strong>Tutaj właśnie leży główny błąd w moim kodzie.</strong> Kilka linijek niżej widzimy ustawianie adresu urządzenia docelowego i próbę wysyłania danych w tamtym kierunku, jednak nie miałem okazji sprawdzić, na ile to jest poprawne.</p>
<p>Linie <strong>152</strong> i <strong>155</strong> zamykają wyszukiwanie adapterów i urządzeń w pobliżu. Nie zapominajmy pozostawić po sobie porządku ;) Nie jestem pewien, czy nie powinno się zamykać wyszukiwania <strong>zaraz po dokonaniu owego przeszukiwania</strong> &#8211; spróbujcie, jeśli nie spowoduje to błędu, to to byłby lepszy sposób. Ja nie spróbuję, bo jestem zbyt leniwy, żeby odpalać teraz Windowsa i sprawdzać.</p>
<p>Aby zobaczyć źródło, kliknij poniżej na <code>show source</code> &#8211; uznałem, że lepiej napisać, bo średnio rzuca się w oczy.</p>
<pre class="brush: cpp; collapse: true; highlight: [62,71,91,124,127,152,155]; light: false; title: ; toolbar: true; notranslate">#include &quot;stdafx.h&quot;

#include &lt;Ws2bth.h&gt;
#include &lt;BluetoothAPIs.h&gt;
#include &lt;Bthsdpdef.h&gt;
#include &lt;stdio.h&gt;
#include &lt;WinSock2.h&gt;
#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;bthdef.h&gt;

#include &lt;vector&gt;

#pragma comment(lib, &quot;Irprops.lib&quot;)

BLUETOOTH_FIND_RADIO_PARAMS m_bt_find_radio = {
  sizeof(BLUETOOTH_FIND_RADIO_PARAMS)
};

BLUETOOTH_RADIO_INFO m_bt_info = {
  sizeof(BLUETOOTH_RADIO_INFO),
  0,
};

BLUETOOTH_DEVICE_SEARCH_PARAMS m_search_params = {
  sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS),
  1,
  0,
  1,
  1,
  1,
  15,
  NULL
};

BLUETOOTH_DEVICE_INFO m_device_info = {
  sizeof(BLUETOOTH_DEVICE_INFO),
  0,
};

HANDLE m_radio = NULL;
HBLUETOOTH_RADIO_FIND m_bt = NULL;
HBLUETOOTH_DEVICE_FIND m_bt_dev = NULL;

// lista znalezionych adapterów
std::vector&lt;HANDLE&gt; radios;

// lista znalezionych urządzeń
std::vector&lt;BLUETOOTH_DEVICE_INFO&gt; devices;

int wmain(int argc, wchar_t **args) {
	unsigned int j=MAXINT; // numer urządzenia, które będziemy parować
	BLUETOOTH_DEVICE_INFO wybrane; // wybrane urządzenie, z którym chcemy się łączyć
	SOCKET sck;
	SOCKADDR_BTH sadr;
	char inc[20];

	wprintf(L&quot;Szukanie adapterow Bluetooth...\n&quot;);

	// znajdujemy pierwszy adapter bluetooth
	m_bt = BluetoothFindFirstRadio(&amp;m_bt_find_radio, &amp;m_radio);

	// jeśli m_bt to null, to system nie znalazł żadnych adapterów Bluetooth.
	if (m_bt == NULL) {
		wprintf(L&quot;Nie znaleziono adapterow Bluetooth&quot;);
		return 1;
	}

	// dodajemy znaleziony adapter do listy
	do {
		// dodajemy ten adapter do listy znalezionych adapterów
		radios.push_back(m_radio);
		// jeśli znaleźliśmy kolejny adapter, to również dodajmy go do listy
	} while (BluetoothFindNextRadio(&amp;m_bt_find_radio, &amp;m_radio));

	// Przestajemy szukać adapterów Bluetoot

	// wyświetlmy listę
	for (unsigned int i=0;i&lt;radios.size();i++) {
		BluetoothGetRadioInfo(m_radio,&amp;m_bt_info);
		wprintf(L&quot;Adapter nr. %d:\r\n&quot;, i);
		wprintf(L&quot;\tNazwa:\t\t%s\r\n&quot;, m_bt_info.szName);
		wprintf(L&quot;\tMAC\t\t%02x:%02x:%02x:%02x:%02x:%02x\r\n&quot;, m_bt_info.address.rgBytes[1], m_bt_info.address.rgBytes[0], m_bt_info.address.rgBytes[2], m_bt_info.address.rgBytes[3], m_bt_info.address.rgBytes[4], m_bt_info.address.rgBytes[5]);
		wprintf(L&quot;\tKlasa:\t\t0x%08x\r\n&quot;, m_bt_info.ulClassofDevice);
		wprintf(L&quot;\tProducent:\t0x%04x\r\n&quot;, m_bt_info.manufacturer);
	}

	// zakładamy na razie, że wybrany został zerowy adapter
	// ustawmy więc w opcjach wyszukiwania ten właśnie adapter
	m_search_params.hRadio = radios[0];

	// zaczynamy szukać urządzeń dostępnych poprzez bluetooth
	wprintf(L&quot;\nSzukam urzadzen widocznych poprzez Bluetooth...\n\n&quot;);
	m_bt_dev = BluetoothFindFirstDevice(&amp;m_search_params, &amp;m_device_info);

	//BluetoothSelectDevices(*m_search_params);

	do {
		devices.push_back(m_device_info);
	} while(BluetoothFindNextDevice(m_bt_dev,&amp;m_device_info));

	// wyświetlmy te urządzenia
	for (unsigned int i=0;i&lt;devices.size();i++) {
		m_device_info = devices[i];
		wprintf(L&quot;Urzadzenie %d:\r\n&quot;, i);
		wprintf(L&quot;\tNazwa:\t\t%s\r\n&quot;, m_device_info.szName);
		wprintf(L&quot;\tMAC:\t\t%02x:%02x:%02x:%02x:%02x:%02x\r\n&quot;, m_device_info.Address.rgBytes[1], m_device_info.Address.rgBytes[0], m_device_info.Address.rgBytes[2], m_device_info.Address.rgBytes[3], m_device_info.Address.rgBytes[4], m_device_info.Address.rgBytes[5]);
		wprintf(L&quot;\tKlasa:\t\t0x%08x\r\n&quot;, m_device_info.ulClassofDevice);
		wprintf(L&quot;\tPolaczony:\t%s\r\n&quot;, m_device_info.fConnected ? L&quot;tak&quot; : L&quot;nie&quot;);
		wprintf(L&quot;\tParowany:\t%s\r\n&quot;, m_device_info.fAuthenticated ? L&quot;tak&quot; : L&quot;nie&quot;);
		wprintf(L&quot;\tPamietany:\t%s\r\n&quot;, m_device_info.fRemembered ? L&quot;tak&quot; : L&quot;nie&quot;);
	}

	// wybierzmy urządzenie, z którym będziemy się parować
	do {
		printf(&quot;Z ktorym urzadzeniem parowac? (nr) &quot;);
		scanf_s(&quot;%u&quot;,&amp;j); // pobieramy numer urządzenia do parowania
	} while (j &gt; devices.size());

	wybrane = devices[j];

	// parujmy urządzenia
	BluetoothAuthenticateDevice(NULL,radios[0],&amp;wybrane,NULL,MITMProtectionNotRequired);

	// łączymy się z wybranym urządzeniem
	sck = socket(AF_BTH,SOCK_STREAM,BTHPROTO_RFCOMM);

	if (sck == INVALID_SOCKET) {
		printf(&quot;Blad przy tworzeniu gniazda&quot;);
		BluetoothFindDeviceClose(m_bt_dev);
		BluetoothFindRadioClose(m_bt);
		system(&quot;pause&quot;);
		return 2;
	}

	sadr.addressFamily = AF_BTH;
	sadr.btAddr = wybrane.Address.ullLong;

	// dokonujemy połączenia
	connect(sck,(SOCKADDR *) &amp;sadr,sizeof(sadr));

	send(sck,OBEX_CONNECT,sizeof(OBEX_CONNECT),0);
	recv(sck,&amp;(inc[0]),25,0);

	printf(&quot;%s&quot;,inc);

	// zamykamy gnizado
	closesocket(sck);

	// Przestajemy szukać urządzeń Bluetooth
	BluetoothFindDeviceClose(m_bt_dev);

	// Przestajemy szukać adapterów Bluetooth
	BluetoothFindRadioClose(m_bt);

	system(&quot;pause&quot;);
	return 0;
}</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fl9.eu/2010/10/28/bluetooth-z-bluetoothapis-h/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Notowanie na komputerze</title>
		<link>http://blog.fl9.eu/2010/10/23/notowanie-na-komputerze/</link>
		<comments>http://blog.fl9.eu/2010/10/23/notowanie-na-komputerze/#comments</comments>
		<pubDate>Sat, 23 Oct 2010 10:57:49 +0000</pubDate>
		<dc:creator>flegmatyk</dc:creator>
				<category><![CDATA[Komputery]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[vimwiki]]></category>
		<category><![CDATA[wiki]]></category>

		<guid isPermaLink="false">http://blog.fl9.eu/?p=1165</guid>
		<description><![CDATA[Używasz komputera do notowania wykładów lub sporządzania notatek ze spotkań? Ten tekst może Cię zainteresować. Odkryłem ostatnio dość prosty sposób na to, aby za pomocą Vima naprawdę wygodnie tworzyć swoje wiki, wraz z odnośnikami pomiędzy stronami, formatowaniem, i eksportem do HTML wyglądającym w ten sposób. I jeszcze coś dla osób, który słysząc &#8222;vim&#8221; powoli sięgają [...]]]></description>
			<content:encoded><![CDATA[<p>Używasz komputera do notowania wykładów lub sporządzania notatek ze spotkań? Ten tekst może Cię zainteresować. Odkryłem ostatnio dość prosty sposób na to, aby za pomocą Vima naprawdę wygodnie tworzyć swoje wiki, wraz z odnośnikami pomiędzy stronami, formatowaniem, i eksportem do HTML wyglądającym <a href="http://dl.dropbox.com/u/255644/wiki/index.html">w ten sposób</a>. I jeszcze coś dla osób, który słysząc &#8222;vim&#8221; powoli sięgają po myszkę, aby zamknąć kartę: <strong>To nie jest trudne!</strong> Opowiem zaraz, od początku do końca, jak się z tego korzysta. Dodatkowo proponuję używać narzędzia gvim, w paczce dla windowsa dostępne domyslnie, w Linuksie zwykle dostępne w repozytoriach, które jest graficzną wersją vima, posiadającą menu, pasek narzędzi i generalnie ułatwiającą start.</p>
<p><span id="more-1165"></span></p>
<h1>Instalacja</h1>
<p><a href="http://code.google.com/p/vimwiki/">Vimwiki</a> jest dostępny jako tzw. vimball, ja jednak preferuję zwykłe rozpakowanie archiwum w moim <code>~/.vim/</code>. Pobieramy archiwum <code>vimwiki-x.zip</code> ze <a href="http://code.google.com/p/vimwiki/downloads/list">strony pobierania vimwiki</a> i rozpakowujemy w <code>~/.vim/</code>. I już po instalacji.</p>
<h1>Konfiguracja</h1>
<p>Domyślna konfiguracja jest dobra i teoretycznie nie trzeba nic zmieniać, ja jednak chciałem, żeby pliki z wiki były zapisywane w moim katalogu Dropboksa. Otwieramy więc plik <code>~/.vimrc</code> i dodajemy następującą linię:</p>
<blockquote><p>let g:vimwiki_list = [{'path': '~/Dropbox/wiki/', 'path_html': '~/Dropbox/Public/wiki/'}]</p>
</blockquote>
<p>Co oznaczają poszczególne elementy?</p>
<ul>
<li><strong>path</strong> &#8211; ścieżka do plików wiki</li>
<li><strong>path_html</strong> &#8211; ścieżka do katalogu, gdzie mają pojawić się wygenerowane pliki html</li>
</ul>
<h1>Krótki kurs vimowania</h1>
<p>Otwieramy <code>gvim</code>, upewniamy sie, że jesteśmy w trybie normalnym, a nie trybie wprowadzania. Powinniśmy widzieć <a href="http://zsyp.fl9.eu/blog/2010/10/vim-normal.png">coś takiego</a>. Dla porównania, vim w trybie wprowadzania wygląda <a href="http://zsyp.fl9.eu/blog/2010/10/vim-input.png">w ten sposób.</a> Różnica jest subtelna, ale ważna. W trybie normalnym wprowadzane są komendy, a w trybie wprowadzania piszemy tekst &#8211; najprawdopodobniej najwięcej czasu będziesz spędzał w trybue wprowadzania, ponieważ wtedy vim zachowuje się jak zwykły edytor tekstu. Oto, co powinieneś/powinnaś wiedzieć o zabawie w vimie:</p>
<ol>
<li>Przechodzisz do trybu wpisywania naciskając klawisz <code>i</code> na klawiaturze. Małe <code>i</code>. Spowoduje to edycję tekstu od znaku, na którym obecnie znajduje się kursor. Zamiast <code>i</code> możesz wcisnąć <code>a</code>, a rozpoczniesz edycję za znakiem, na którym znajduje się kursor. Jeśli bardzo chcesz, to możesz nacisnąć duże litery &#8211; <code>I</code> rozpocznie edycję na początku linii, a <code>A</code> rozpocznie edycję na końcu linii, ale myślę, że na razie nie musisz zaprzątać sobie tym głowy.</li>
<li>Wychodzisz z trybu wprowadzania do trybu normalnego klawiszem <code>ESC</code>.
<li>
<li>W trybie normalnym musisz znać dwie komendy: wyjście i zapisanie pliku. Komendę poprzedzasz dwukropkiem, czyli znakiem <code>:</code>. Tak więc, w trybie normalnym:
<ul>
<li><code>:w</code> (jak <strong>w</strong>rite) zapisuje plik</li>
<li><code>:q</code> (jak <strong>q</strong>uit) wychodzi z programu &#8211; jeśli chcemy wyjść bez zapisywania, należy wymusić to poprzez wykrzyknik, czyli wpisać <code>:q!</code></li>
</ul>
</ol>
<p>Posiadając te informacje jesteśmy już w stanie wygodnie pisać w vimie. Polecić mogę jeszcze tylko <a href="http://jakilinux.org/programy/vim/">prostą sciągawkę z vima</a> i <a href="http://wiki.fl9.eu/stuff/config/vimrc">mój plik konfiguracyjny vimrc</a>, dzięki któremu można bez problemu używać myszki w gvimie, mieć podświetlanie składni itp.</p>
<h1>Zaczynamy notować</h1>
<p>Będąc w trybie normalnym wpisz <code>\ww</code>, aby przejść do strony głównej swojego nowego wiki. Teraz naciśnij <code>i</code>, aby przejść do trybu wpisywania, i piszesz. Wypróbujmy więc formatowanie owego wiki &#8211; spróbuj przepisać to, co ja poniżej:<br />
<a href="http://blog.fl9.eu/2010/10/23/notowanie-na-komputerze/vimwiki-syntax/" rel="attachment wp-att-1179"><img src="http://zsyp.fl9.eu/blog/2010/10/vimwiki-syntax.png" alt="" title="vimwiki-syntax" width="580" height="524" class="aligncenter size-full wp-image-1179" /></a><br />
Wynik tego kodu wygląda <a href="http://dl.dropbox.com/u/255644/wiki/syntax.html">w ten sposób</a>. Jeśli nie widzisz kolorowania składni, upewnij się, czy w pliku <code>.vimrc</code> masz <a href="http://code.google.com/p/vimwiki/wiki/Prerequisites">wszystkie wymagane ustawienia</a>. Kolejny raz polecam <a href="http://wiki.fl9.eu/stuff/config/vimrc">mój plik <code>.vimrc</code></a>. Po skończonej edycji zapisz plik naciskając <code>ESC</code> i wpisując <code>:w</code>, potwierdzając polecenie klawiszem <code>Enter</code>.</p>
<p>Najważniejszą funkcją w wiki są odnośniki pomiędzy stronami. My tworzymy je wpisując <code>[[Tytuł strony]]</code>, albo po prostu wpisując coś przy użyciu <a href="http://pl.wikipedia.org/wiki/CamelCase">CamelCase</a>, czyli np <code>TytułStrony</code>. Zauważysz, że po wpisaniu takiego odnośnika zmieni kolor na czerwony. Oznacza to, że strona docelowa nie została jeszcze utworzona. Klawiszem <code>ESC</code> wyjdź z trybu wpisywania do trybu normalnego, najedź kursorem na odnośnik i naciśnij <code>Enter</code>. Bum, przeniosło Cię na nową, pustą stronę! Powpisuj coś i zapisz ją. Jak teraz wrócić do strony głównej wiki? Będąc w trybie normalnym naciśnij <code>Backspace</code>. Zauważysz pewnie, że kolor odnośnika zmienił się z czerwonego na inny, informując Cię, że dana strona istnieje.</p>
<h1>Eksport wiki do HTML</h1>
<p>Chociaż eksport do HTML jest zbędny &#8211; wszystkie nasze informacje są zapisane w wygodnych do odczytu plikach tekstowych &#8211; czasem chcielibyśmy podzielić się naszymi notatkami z innymi. W tym celu możemy skorzystać z dwóch komend generujących pliki html:</p>
<ul>
<li><strong><code>:VimwikiAll2HTML</code></strong> &#8211; eksportuje wszystkie zapisane strony wiki do HTML</li>
<li><strong><code>:Vimwiki2HTML</code></strong> &#8211; eksportuje obecną stronę do HTML (pamiętaj o zapisaniu zmian!)</li>
</ul>
<p>Pliki te są zapisywane są w katalogu, który ustawiliśmy w <code>vimrc</code> pod hasłem <code>path_html</code>.</p>
<p>Mam nadzieję, że ten poradnik trochę przekona was do vima. Jest to bardzo wygodny edytor tekstu, i choć na początek wydaje się dość skomplikowany, to są to tylko pozory. Szczerze mówiąc, ten wpis został napisany w vimie, ponieważ jest to po prostu o wiele wygodniejsze, niż pisanie w edytorze wbudowanym w przeglądarkę. Nie opisałem tutaj wszystkich możliwości Vimwiki, a jedynie podstawy. Można, przykładowo, za jego pomocą prowadzić dziennik.</p>
<p>A wy jak wykorzystujecie Vimwiki? Jeśli ten poradnik się przydał, nie zapomnij napisać w komentarzu, co tworzysz za jego pomocą!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fl9.eu/2010/10/23/notowanie-na-komputerze/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Komentarze na YouTube</title>
		<link>http://blog.fl9.eu/2010/10/16/komentarze-na-youtube/</link>
		<comments>http://blog.fl9.eu/2010/10/16/komentarze-na-youtube/#comments</comments>
		<pubDate>Sat, 16 Oct 2010 09:04:32 +0000</pubDate>
		<dc:creator>flegmatyk</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://blog.fl9.eu/?p=1157</guid>
		<description><![CDATA[Zacznijmy więc kolejny wpis o tzw. &#8222;dupie maryni&#8221; i rzeczach, o których wszyscy wiedzą :D Mianowicie, wczoraj w trakcie radosnego marnowania czasu wylądowałem na YouTube oglądając pościgi policyjne. Moim błędem było zjechanie trochę niżej na stronie i zerknięcie w komentarze. Co znalazłem? Pościg za Daewoo Tico. Kierowca był pijany. Opinia użytkownika: Kobieta społeczniak! po co [...]]]></description>
			<content:encoded><![CDATA[<p>Zacznijmy więc kolejny wpis o tzw. &#8222;dupie maryni&#8221; i rzeczach, o których wszyscy wiedzą :D Mianowicie, wczoraj w trakcie radosnego marnowania czasu wylądowałem na YouTube oglądając pościgi policyjne. Moim błędem było zjechanie trochę niżej na stronie i zerknięcie w komentarze. Co znalazłem?</p>
<p><span id="more-1157"></span></p>
<p><a href="http://www.youtube.com/watch?v=895DWd96XtE">Pościg za Daewoo Tico.</a> Kierowca był pijany. Opinia użytkownika:</p>
<blockquote><p>Kobieta społeczniak! po co sie ludzie wpierdalają w nie swoje sprawy!﻿</p></blockquote>
<p><a href="http://www.youtube.com/watch?v=Kl3JLIB9zaA">Pijany motocyklista ucieka 220km/h przed policją</a>. Nie ma nawet prawa jazdy.</p>
<blockquote><p>jp na 100%! koleś umie jeździć to sobie przyświrował dla żartu, a potem się﻿ kulturalnie zatrzymał, a pijany pewnie wcale niebył nawet, tylko mu﻿ przybili:)</p></blockquote>
<blockquote><p>prze huj﻿ szacun dla﻿ goscia &#8230;.</p></blockquote>
<blockquote><p>po co go gonią debile ,﻿ spokojnie by dojechał do domu﻿ i tyle.</p></blockquote>
<p>A to tylko dwa wybrane filmiki. Pocieszam się tym, że autorami takich bzdur mogą być chyba tylko gimnazjaliści&#8230; co niestety nie znaczy, że nie mogą kierować pojazdami. Ale nic nie możemy na to poradzić.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fl9.eu/2010/10/16/komentarze-na-youtube/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

