<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" version="2.0">

<channel>
	<title>xion.log</title>
	
	<link>http://xion.org.pl</link>
	<description>Blog Xiona o programowaniu i innych ciekawych rzeczach :)</description>
	<lastBuildDate>Tue, 27 Jul 2010 16:54:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/xion" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="xion" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>53.25</geo:lat><geo:long>21</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by/2.0/</creativeCommons:license><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><image><link>http://xion.org.pl</link><url>http://xion.org.pl/wp-content/themes/xion.log/images/rss-logo.jpg</url><title>xion.log</title></image><item>
		<title>Pylonem w zerglingi</title>
		<link>http://xion.org.pl/2010/07/27/pylonem-w-zerglingi/</link>
		<comments>http://xion.org.pl/2010/07/27/pylonem-w-zerglingi/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 16:54:20 +0000</pubDate>
		<dc:creator>Xion</dc:creator>
				<category><![CDATA[Gry]]></category>
		<category><![CDATA[Życie]]></category>
		<category><![CDATA[Starcraft 2]]></category>

		<guid isPermaLink="false">http://xion.org.pl/?p=2020</guid>
		<description><![CDATA[Doczekaliśmy się. Po kilkunastu (!) latach od wydania pierwszej części, Starcraft 2 ujrzał dzisiaj światło dzienne (w Europie). Sam oczekiwałem na tę premierę bardzo długo, mimo że nie jestem jakimś wielkim fanem oryginału, a moje umiejętności kierowania którąkolwiek z trzech ras są raczej skromne :) Od dawna tęskniłem jednak za grą niewymagającą dużą czasu, a [...]]]></description>
			<content:encoded><![CDATA[<p><img style="float:left; margin:5px" src="http://xion.org.pl/wp-content/uploads/2010/07/sc2-marine.png" alt=""/>Doczekaliśmy się. Po kilkunastu (!) latach od wydania pierwszej części, <em>Starcraft 2</em> ujrzał dzisiaj światło dzienne (w Europie). Sam oczekiwałem na tę premierę bardzo długo, mimo że nie jestem jakimś wielkim fanem oryginału, a moje umiejętności kierowania którąkolwiek z trzech ras są raczej skromne :) Od dawna tęskniłem jednak za grą niewymagającą dużą czasu, a jednocześnie nie będą jakimś &#8211; tfu, tfu &#8211; <em>casualem</em>. RTS-y świetnie w tej roli spisują.</p>
<p>Oczywiście nie znaczy to, że rzucę SC2 w kąt po rozegraniu trzech misji ;P O nie, nie ma mowy. Już teraz mogę bowiem stwierdzić, że mimo podążania za kilkoma nieco denerwującymi trendami w obecnym przemyśle gier (czyli wszechobecnymi <a href="http://xion.org.pl/2009/12/04/i-co-sie-w-tej-grze-robi/"><em>achievementami</em></a>, koniecznością rejestracji online i całymi tymi niby-facebookowymi bajerami), <em>Starcaft 2: Wings of Liberty</em> jest bardzo udaną kontynuacją jedynki.</p>
<p>Tak więc narodowy sport Korei Południowej doczekał się <em>sequela</em>, natomiast blog przynajmniej w tym miesiącu nowej notki na pewno się nie doczeka ;P</p>
<img src="http://feeds.feedburner.com/~r/xion/~4/ztNaFfspJP8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xion.org.pl/2010/07/27/pylonem-w-zerglingi/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Informacje o błędach w rezultatach funkcji</title>
		<link>http://xion.org.pl/2010/07/25/informacje-o-bledach-w-rezultatach-funkcji/</link>
		<comments>http://xion.org.pl/2010/07/25/informacje-o-bledach-w-rezultatach-funkcji/#comments</comments>
		<pubDate>Sun, 25 Jul 2010 09:34:17 +0000</pubDate>
		<dc:creator>Xion</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[błędy]]></category>
		<category><![CDATA[debugowanie]]></category>
		<category><![CDATA[funkcje]]></category>
		<category><![CDATA[rezultat funkcji]]></category>

		<guid isPermaLink="false">http://xion.org.pl/?p=2015</guid>
		<description><![CDATA[Wczoraj naciąłem się na nieprzyjemny rodzaj błędu w kodzie. Opierając się na powiedzeniu "Najciemniej pod latarnią", można by go określić jako nieprzenikniona ciemność tuż pod najjaśniejszą latarnią w całym mieście. Normalnie nikomu nie przyjdzie do głowy, by jej tam szukać. Chodzi bowiem o jakąś "oczywistość", w którą wątpienie jest nie tyle nierozsądnie, co wręcz nie [...]]]></description>
			<content:encoded><![CDATA[<p>Wczoraj naciąłem się na nieprzyjemny rodzaj błędu w kodzie. Opierając się na powiedzeniu "Najciemniej pod latarnią", można by go określić jako nieprzenikniona ciemność tuż pod najjaśniejszą latarnią w całym mieście. Normalnie nikomu nie przyjdzie do głowy, by jej tam szukać. Chodzi bowiem o jakąś "oczywistość", w którą wątpienie jest nie tyle nierozsądnie, co wręcz nie przychodzi nawet na myśl.<br />
A wszystko dlatego, że lubię prostotę - przynajmniej w takich kwestiach, jak wyniki funkcji informujące o ewentualnych błędach. Prawie zawsze są to u mnie zwykłe <code>bool</code>e, informujące jedynie o tym, czy dana operacja się powiodła lub nie. To wystarcza, bo do bardziej zaawansowanego debugowania są logi, wyjątki, asercje i inne dobrodziejstwo inwentarza. A same wywołania funkcji możemy sobie bez przeszkód umieszczać w <code>if</code>ach czy warunkach pętli.</p>
<p>Są jednak biblioteki, które "twierdzą", że taka konwencja jest niedobra i proponują inne. Pół biedy, gdy chodzi tu o coś w rodzaju typu <code>HRESULT</code>, do którego w pakiecie dostarczane są makra <code>SUCCEEDED</code> i <code>FAILED</code>. Zupełnie nie rozumiem jednak, co jest pociągającego w pisaniu np.:</p>
<div class="syntax_hilite">
<div id="cpp-2">
<div class="cpp"><span style="color: #0000ff;">int</span> sock;<br />
<span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>sock = socket<span style="color: #000000;">&#40;</span>PF_INET, SOCK_STREAM, <span style="color: #0000dd;">0</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> == -<span style="color: #0000dd;">1</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span> <span style="color: #ff0000; font-style: italic;">/* błąd */</span> <span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p>
Usprawiedliwiać się mogę jednak tym, że... no cóż, to przecież Linux ;-) Ale kiedy dostaję do ręki porządną bibliotekę z klasami, wsparciem dla STL-a i <em>CamelCase</em> w nazwach funkcji, to przecież mogę się spodziewać czegoś rozsądniejszego, prawda? Skąd może mi przyjść do głowy, że rezultat zero ma oznaczać powodzenie wykonania funkcji?!</p>
<p>Najwyraźniej jednak powinienem taką możliwość dopuszczać. Okazuje się bowiem, że nawet dobrze zaprojektowane, estetyczne API może mieć takie kwiatki. Przekonałem się o tym, próbując pobrać wartość atrybutu elementu XML, używając biblioteki <a href="http://xion.org.pl/2010/05/19/xml-w-c-proste-rozwiazanie/">TinyXML</a> i jej metody o nazwie <code>QueryStringAttribute</code>. W przypadku powodzenia zwraca ona stałą <code>TIXML_SUCCESS</code>; szkoda tylko, że jej wartością jest... zero ;P<br />
Więc zaprawdę powiadam wam: nie ufajcie żadnej funkcji, której typem zwracanym nie jest <code>bool</code>!</p>
<img src="http://feeds.feedburner.com/~r/xion/~4/jSo5Jvx60d8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xion.org.pl/2010/07/25/informacje-o-bledach-w-rezultatach-funkcji/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>le ba’urtadji be lo valsi be fi la lojban.</title>
		<link>http://xion.org.pl/2010/07/20/le-bahurtadji-be-lo-valsi-be-fi-la-lojban/</link>
		<comments>http://xion.org.pl/2010/07/20/le-bahurtadji-be-lo-valsi-be-fi-la-lojban/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 13:51:50 +0000</pubDate>
		<dc:creator>Xion</dc:creator>
				<category><![CDATA[Kultura]]></category>
		<category><![CDATA[języki]]></category>
		<category><![CDATA[lojban]]></category>

		<guid isPermaLink="false">http://xion.org.pl/?p=1986</guid>
		<description><![CDATA[Wymowa słów w lojbanie. Moje trwające już kilka miesięcy zainteresowanie lojbanem pewnie nie przetrwałoby tak długo, gdyby był on czymś w typie esperanto - a tym, jak wiemy, na pewno nie jest. Przeglądanie jego "formalnej definicji" (czyli The Lojban Reference Grammar) sprawia raczej wrażenie czytania dokumentacji języka programowania, biblioteki lub innego API. Jest to więc [...]]]></description>
			<content:encoded><![CDATA[<p><small>Wymowa słów w <a href="http://xion.org.pl/tag/lojban/">lojbanie</a>.</small></p>
<p>Moje trwające już kilka miesięcy zainteresowanie <a href="http://xion.org.pl/tag/lojban/">lojbanem</a> pewnie nie przetrwałoby tak długo, gdyby był on czymś w typie esperanto - a tym, jak wiemy, na pewno nie jest. Przeglądanie jego "formalnej definicji" (czyli <a href="http://dag.github.com/cll/"><em>The Lojban Reference Grammar</em></a>) sprawia raczej wrażenie czytania dokumentacji języka programowania, biblioteki lub innego API. Jest to więc całkiem przyjemna lektura :)<br />
Nie zapominajmy jednak, że lojban jest mimo wszystko pomyślany jako język (również) dla ludzi, i to także do - szok! horror! - mówienia. Posiada więc również określone reguły wymowy wyrazów. Są one zresztą określone bardzo dobrze, gdyż niewielki poziom ich skomplikowania nijak ma się do złożonych i nie zawsze jasnych niuansów wymowy języków naturalnych. Można to łatwo zauważyć, kiedy przyjrzymy się im z bliska.<br />
<span id="more-1986"></span><br />
Zacząć wypada od powtórzenia tego, co kiedyś napisałem w <a href="http://xion.org.pl/2010/03/11/mi-pu-facki-fi-la-lojban/">pierwszej notce</a> nt. lojbanu. Chodzi o fakt, że w języku tym obowiązuje reguła tak zwanego <strong>audio-wizualnego izomorfizmu</strong>, co jest uczoną nazwą dla jednoznacznej odpowiedniości między wypowiadanymi głoskami i ich reprezentacją w postaci liter. W lojbanie obowiązuje ona zawsze, co ma niewątpliwe zalety. Konsekwencją jest chociażby brak słów o takiej samej wymowie, lecz innej pisowni, czyli tzw. homonimów (przykłady: <em>bóg</em>/<em>Bug</em>/<em>buk</em> w języku polskim albo np. <em>ware</em>/<em>wear</em>/<em>where</em> w angielskim). Nie występuje też sytuacja odwrotna, czyli różna wymowa przy tej samej pisowni, czego przykładem są pary typu <em>lead</em> ('przewodzić' lub 'ołów'), <em>present</em> ('prezent' lub 'pokazywać'), <em>record</em> ('nagranie' lub 'nagrywać') albo <em>wind</em> ('wiatr' lub 'nakręcać') w języku angielskim.<br />
Krótko mówiąc, w lojbanie nie trzeba uczyć się wymowy poszczególnych słów - wystarczy jedynie znać sposób wypowiadania głosek; słowa są po prostu ich złożeniem. Żeby więc poprawnie mówić w tym języku, trzeba sobie jedynie przyswoić jego alfabet. Oto on:</p>
<style>.lerfu td { width: 7%; }</style>
<table width="90%" align="center" class="lerfu">
<tr>
<td>'</td>
<td>,</td>
<td>.</td>
<td>a</td>
<td>b</td>
<td>c</td>
<td>d</td>
<td>e</td>
<td>f</td>
<td>g</td>
<td>i</td>
<td>j</td>
<td>k</td>
<tr/>
<tr>
<td>l</td>
<td>m</td>
<td>n</td>
<td>o</td>
<td>p</td>
<td>r</td>
<td>s</td>
<td>t</td>
<td>u</td>
<td>v</td>
<td>x</td>
<td>y</td>
<td>z</td>
</tr>
</table>
<p>Zawiera on 26 znaków, ale nie wszystkie są literami w typowym nas sensie (dlatego używa wobec nic raczej lojbańsiego terminu <em>lerfu</em>). Niemniej większość jest, a dodatkowo ich podobieństwo do polskich odpowiedników jest całkiem spore. Reguły wymowy lojbanu przedstawiają się bowiem następująco:</p>
<ul>
<li>Samogłoskami są <em>a</em>, <em>e</em>, <em>i</em>, <em>o</em>, <em>u</em>. Można wymawiać je dokładnie tak samo jak w języku polskim.</li>
<li><em>y</em> tylko z grubsza można odnieść do polskiego &lt;y&gt; - to bynajmniej nie jest to samo. <em>y</em> to tak zwana <a href="http://en.wikipedia.org/wiki/Schwa"><strong>szwa</strong></a> - głoska, którą często nieświadomie artykułujemy, gdy chwilowo "brakuje nam słów" (co się czasem zapisuje jako "eee...."). W angielskim jej przykładem jest chociażby samogłoska między 't' i 'l' w nazwie zespołu <em>The Beatles</em>. W języku polskim szwa jako taka nie występuje, ale <a href="http://upload.wikimedia.org/wikipedia/commons/d/db/Schwa.ogg">jej wymowa</a> nie powinna stanowić żadnego problemu.</li>
<li>Spółgłoski <em>b</em>, <em>d</em>, <em>f</em>, <em>g</em>, <em>k</em>, <em>l</em>, <em>m</em>, <em>n</em>, <em>p</em>, <em>r</em>, <em>s</em>, <em>t</em>, <em>z</em> są wymawiane tak samo, jak po polsku. <em>r</em> może być dowolnie "twarde".</li>
<li>Co do pozostałych spółgłosek, rzecz ma się nieco inaczej:
<ul>
<li>przede wszystkim, <em>'</em> (apostrof) nie jest znakiem interpunkcyjnym. Jest on jak najbardziej wymawiany (!) - tak jak polskie &lt;h&gt;. Występuje on tylko między samogłoskami.</li>
<li><em>c</em> wymawiamy jak polskie &lt;sz&gt;</li>
<li><em>j</em> to &lt;ż&gt;, trochę tak jak w języku francuskim (<em>bonjour</em>)</li>
<li><em>v</em>, jak można się domyślić, to &lt;w&gt; (które jest różne od &lt;b&gt;)</li>
<li><em>x</em> to prawdopodobnie najgorsza bestia. Jego polskim odpowiednikiem jest &lt;ch&gt;, ale niestety obecnie różnica między wymową &lt;ch&gt; a &lt;h&gt; jest u większości Polaków właściwie żadna. Stąd najlepiej określić ją jako "twardsze", bardziej "charczące" &lt;h&gt;. Najczęściej podawanym przykładem tej głoski jest 'ch' w szkockim wyrazie <em>loch</em>, oznaczającym jezioro.... Oto przykład dźwiękowy: <a href="http://upload.wikimedia.org/wikipedia/commons/0/0f/Voiceless_velar_fricative.ogg">[x]</a> - życzę połamania gardła ;)</li>
</ul>
</li>
<li>Samogłoski mogą występować w parach, które wymawia się tak, jakbyśmy się spodziewali w języku polskim. Przykłady: <em>io</em> jako &lt;jo&gt;, <em>oi</em> jako &lt;oj&gt;, <em>au</em> jako &lt;ał&gt;, <em>ii</em> jako &lt;ji&gt;, itp. Wyjątkiem jest <em>ou</em> - ta para w lojbanie nie występuje.</li>
<li><em>.</em> (kropka) nie jest znakiem przestankowym, lecz pauzą. Oznaczą krótką przerwę między wypowiadanymi głoskami. Stosuje się ją zawsze, gdy słowo zaczyna się od samogłoski.</li>
<li><em>,</em> (przecinek) może rozdzielać wyrazy w obcych nazwach. Nie pełni on funkcji znaku interpunkcyjnego i zasadniczo jest rzadko spotykany.</li>
<li>Akcent pada zawsze na przedostatnią sylabę, przy czym ewentualne <em>y</em> się tu nie liczy. Mówimy więc np. <em><u>vac</u>ysai</em> ('kolacja'), a nie <em>va<u>cy</u>sai</em>.</li>
</ul>
<p>Proste, prawda? ;-) Żarty żartami, ale niech ktoś spróbuje w podobnie kompaktowej formie streścić zasady wymowy (i pisowni!) języka polskiego... Mam wrażenie, że by się to nie udało :)</p>
<p>Po dawce wiedzy teoretycznej możemy posłuchać próbek dźwiękowych mówionego lojbanu. Na <a href="http://www.lojban.org">oficjalnej stronie</a> możemy znaleźć ich <a href="http://www.lojban.org/tiki/tiki-index.php?page=Multimedia">całkiem sporo</a>. Co nieco można znaleźć też na <a href="http://www.youtube.com">Youtube</a>, aczkolwiek nie wszystkie mają znaczącą wartość poznawczą :)<br />
Jest tam jednak przynajmniej jeden świetny przykład: <em>la fanza najnimre</em>, czyli <a href="http://www.youtube.com/watch?v=ZN5PoW7_kdA&#038;"><em>The Annoying Orange</em></a> (Wkurzająca Pomarańcza) z lojbańską ścieżką dźwiękową:</p>
<p><span style='text-align:center; display: block;'><object width='425' height='350'><param name='movie' value='http://www.youtube.com/v/pqtGf7qB7J4'></param><param name='wmode' value='transparent'></param><embed src='http://www.youtube.com/v/pqtGf7qB7J4' type='application/x-shockwave-flash' wmode='transparent' width='425' height='350'></embed></object></span></p>
<img src="http://feeds.feedburner.com/~r/xion/~4/mDceCwYm6JY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xion.org.pl/2010/07/20/le-bahurtadji-be-lo-valsi-be-fi-la-lojban/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
<enclosure url="http://upload.wikimedia.org/wikipedia/commons/d/db/Schwa.ogg" length="11677" type="audio/ogg" />
<enclosure url="http://upload.wikimedia.org/wikipedia/commons/0/0f/Voiceless_velar_fricative.ogg" length="24957" type="audio/ogg" />
		</item>
		<item>
		<title>Wtyczki do programów w .NET</title>
		<link>http://xion.org.pl/2010/07/18/wtyczki-do-programow-w-net/</link>
		<comments>http://xion.org.pl/2010/07/18/wtyczki-do-programow-w-net/#comments</comments>
		<pubDate>Sun, 18 Jul 2010 10:01:26 +0000</pubDate>
		<dc:creator>Xion</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[klasy]]></category>
		<category><![CDATA[pakiety]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://xion.org.pl/?p=1997</guid>
		<description><![CDATA[Rozszerzalność od dawna jest w modzie: praktycznie żadna poważniejsza aplikacja nie obywa się bez jakiegoś systemu pluginów, czyli "wtyczek" zwiększających jej funkcjonalność. Niektóre robią to przy okazji (acz ze słusznych powodów), inne czynią z elastyczności i rozszerzalności swój główny oręż (patrz np. uniwersalne komunikatory w typie Mirandy). Wszystko to kojarzy się trochę linuksiarsko, jednakże obecnie [...]]]></description>
			<content:encoded><![CDATA[<p>Rozszerzalność od dawna jest w modzie: praktycznie żadna poważniejsza aplikacja nie obywa się bez jakiegoś systemu <em>pluginów</em>, czyli "wtyczek" zwiększających jej funkcjonalność. Niektóre robią to przy okazji (acz ze słusznych powodów), inne czynią z elastyczności i rozszerzalności swój główny oręż (patrz np. uniwersalne komunikatory w typie <a href="http://www.miranda-im.org/">Mirandy</a>). Wszystko to kojarzy się trochę linuksiarsko, jednakże obecnie także wiele programów <em>stricte</em> pod Windows zachęca (a przynajmniej umożliwia) swoich użytkownika do zakasania rękawów i zakodowania im nowych funkcji.<br />
<img style="float:left; margin:5px" src="http://xion.org.pl/wp-content/uploads/2010/07/plug.jpg" alt="" title="Wtyczka :)" />Dotyczy to także aplikacji na platformę .NET. Co więcej, sama jej natura ułatwia budowanie programów wspierających koncepcję rozszerzalności. Rzecz opiera się na pojęciu <em>assembly</em>, czyli czegoś w rodzaju pakietu (javowe skojarzenia wskazane) zawierającego kod, a więc klasy. Ze względu na to, że .NET Framework zawiera wbudowany kompilator, jest zupełnie możliwe, by nasz program udostępniał całe środowisko do pisania do niego <em>pluginów</em>, a następnie przerabiania ich na kod wykonywalny i podłączania ich do aplikacji. Nie twierdzę, że znam program, który rzeczywiście tak robi, ale przynajmniej w teorii jest to możliwe :)</p>
<p>Powszechniejsze wydaje mi się prostsze podejście, w którym <em>assembly</em> dostarcza się w postaci skompilowanej. Zazwyczaj jest to biblioteka .NET-owych, zapisana jako plik .<em>dll</em>, niemający przy tym zbyt wiele wspólnego z natywnymi czy COM-owymi DLL-ami. Wczytanie go jest bardzo proste, gdy wykorzystujemy do tego klasę <code>System.Reflection.Assembly</code>:</p>
<div class="syntax_hilite">
<div id="csharp-5">
<div class="csharp">Assembly assembly = Assembly.<span style="color: #0000FF;">LoadFrom</span><span style="color: #000000;">&#40;</span><span style="color: #808080;">"ścieżka<span style="color: #008080; font-weight: bold;">\d</span>o<span style="color: #008080; font-weight: bold;">\p</span>liku"</span><span style="color: #000000;">&#41;</span>;</div>
</div>
</div>
<p>
Wskazana jest tutaj ostrożność np. w postaci zapewnienia, że każde <em>assembly</em> ładujemy tylko raz. Najlepiej jest wyznaczyć osobny podkatalog na wtyczki do naszego programu i ładować je jednokrotnie, zapewne podczas uruchamiania samej aplikacji.</p>
<p>Gdy mamy już gotowy obiekt klasy <code>Assembly</code> (niezależnie od tego, czy skompilowaliśmy go sami czy wczytaliśmy go z gotowej binarki tak, jak powyżej), chcielibyśmy pewnie jakoś wykorzystać zawarty w nim kod. Są nim oczywiście jakieś klasy, które możemy pobrać metodą <code>GetExportedTypes</code>. Zwróci nam ona metody tablicę obiektów <code>Type</code>, czyli znanej zapewne metaklasy należącej do .NET-owego systemu refleksji. Z nimi zaś zrobić możemy... no, prawie wszystko :) Do interesujących w kontekście <em>pluginów</em> czynności należy przede wszystkim sprawdzenie, czy dana klasa implementuje jakiś ustalony przez nas interfejs "wtyczkowy", a następnie utworzenie jej obiektu:</p>
<div class="syntax_hilite">
<div id="csharp-6">
<div class="csharp">List&lt;IPlugin&gt; plugins = <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> List&lt;IPlugin&gt;<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;<br />
<span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>Type type <span style="color: #0600FF;">in</span> assembly.<span style="color: #0000FF;">GetExportedTypes</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>type.<span style="color: #0000FF;">IsClass</span> &amp;&amp; !type.<span style="color: #0000FF;">IsAbstract</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &amp;&amp; type.<span style="color: #0000FF;">GetInterface</span><span style="color: #000000;">&#40;</span><a href="http://www.google.com/search?q=typeof+msdn.microsoft.com"><span style="color: #008000;">typeof</span></a><span style="color: #000000;">&#40;</span>IPlugin<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">FullName</span><span style="color: #000000;">&#41;</span> != <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; plugins.<span style="color: #0000FF;">Add</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>IPlugin<span style="color: #000000;">&#41;</span>Activator.<span style="color: #0000FF;">CreateInstance</span><span style="color: #000000;">&#40;</span>type<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p>
Takie beztroskie, dynamiczne tworzenie obiektów z binarnego kodu wczytanego już w trakcie działania programu jest jak najbardziej możliwe i, jak widać wyżej, całkiem proste - stosujemy do tego metodę <code>CreateInstance</code> klasy o wdzięcznej nazwie <code>Activator</code>. Wymogiem jest obecność w klasie wtyczki odpowiedniego konstruktora. W powyższym kodzie zakładamy na przykład najprostszy przypadek, iż dostępna jest jego wersja bezparametrowa.</p>
<p>To w sumie wszystko, jeśli chodzi o wczytywanie. To, w jaki sposób <em>plugin</em> może rozszerzać możliwości naszej aplikacji, zależy głównie od zawartości interfejsu, który nazwałem tutaj umownie <code>IPlugin</code>. Projektując go, powinno się zadbać o jego elastyczność i prostotę, a także wziąć pod uwagę chociażby kwestie bezpieczeństwa.</p>
<img src="http://feeds.feedburner.com/~r/xion/~4/gGqY9EEwZEw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xion.org.pl/2010/07/18/wtyczki-do-programow-w-net/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Triki z PowerShellem #15 – Puff, jak gorąco!</title>
		<link>http://xion.org.pl/2010/07/13/triki-z-powershellem-15-puff-jak-goraco/</link>
		<comments>http://xion.org.pl/2010/07/13/triki-z-powershellem-15-puff-jak-goraco/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 21:03:01 +0000</pubDate>
		<dc:creator>Xion</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[procesor]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[WMI]]></category>

		<guid isPermaLink="false">http://xion.org.pl/?p=1988</guid>
		<description><![CDATA[Obecne temperatury są uciążliwe nie tylko dla nas - organizmów opartych o białka i węgiel, ale też dla naszych półprzewodnikowych, krzemowych gadżetów. Dotyczy to również komputerów oraz ich procesorów. Jak każde układy scalone, mają one tendencję do nagrzewania się - czasem nadmiernego. Dlatego dobrze jest monitorować temperaturę procesora. Istnieje oczywiście wiele gotowych aplikacji, które na [...]]]></description>
			<content:encoded><![CDATA[<p>Obecne temperatury są uciążliwe nie tylko dla nas - organizmów opartych o białka i węgiel, ale też dla naszych półprzewodnikowych, krzemowych gadżetów. Dotyczy to również komputerów oraz ich procesorów. Jak każde układy scalone, mają one tendencję do nagrzewania się - czasem nadmiernego. Dlatego dobrze jest monitorować temperaturę procesora.<br />
<img style="float:right; margin: 5px" src="http://xion.org.pl/wp-content/uploads/2010/07/sun.png" alt="" />Istnieje oczywiście wiele gotowych aplikacji, które na to pozwalają, ale przecież zawsze fajniej jest zakodować coś samemu, nieprawdaż? :) A już zupełnie świetnie jest wtedy, gdy użyjemy do tego naszego ulubionego narzędzia do administrowania systemem, czyli <a href="http://www.microsoft.com/windowsserver2003/technologies/management/powershell/default.mspx">PowerShella</a>.</p>
<p>Przy jego pomocy pobranie aktualnej temperatury procesora nie jest trudne. Posługujemy się do tego WMI - <em>Windows Management Instrumentation</em> - które to jest rozszerzeniem modelu sterowników systemu Windows, pozwalającym m.in. na monitorowanie różnego rodzaju informacji diagnostycznych. PowerShell zawiera wbudowane komendy, pozwalające na tworzenie obiektów WMI - wśród nich również takich, które udostępniają informacje na temat temperatury procesora:</p>
<div class="syntax_hilite">
<div id="csharp-8">
<div class="csharp"><span style="color: #008080;"># cpu-temp.ps1</span><br />
<span style="color: #008080;"># Pokazywanie temperatury procesora</span></p>
<p>$tzt = Get-WmiObject -<span style="color: #FF0000;">Class</span> <span style="color: #808080;">"MSAcpi_ThermalZoneTemperature"</span><br />
&nbsp; &nbsp; -<span style="color: #0600FF;">Namespace</span> <span style="color: #808080;">"root<span style="color: #008080; font-weight: bold;">\W</span>MI"</span> -ErrorAction SilentlyContinue<br />
<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>$tzt -ne $null<span style="color: #000000;">&#41;</span><br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; $rawTemp = $tzt.<span style="color: #0000FF;">CurrentTemperature</span><br />
&nbsp; &nbsp; $tempC = <span style="color: #000000;">&#40;</span>$rawTemp - <span style="color: #FF0000;">2732</span><span style="color: #000000;">&#41;</span> / <span style="color: #FF0000;">10</span><br />
&nbsp; &nbsp; <span style="color: #808080;">"Temp. procesora: "</span> + $tempC.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> + <span style="color: #808080;">" st. C"</span> | Out-Host<br />
<span style="color: #000000;">&#125;</span><br />
<span style="color: #0600FF;">else</span> <span style="color: #000000;">&#123;</span> <span style="color: #808080;">"Pomiar temperatury niemożliwy."</span> | Out-Host <span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p>
Z bliżej nieokreślonych powodów wartość temperatury podawana jest w dziesiątych częściach kelwinów, więc konieczne jest ich przeliczenie na stopnie Celsjusza. Ponadto istnieje też prawdopodobieństwo, że używana tutaj klasa WMI o nazwie <code>MSAcpi_ThermalZoneTemperature</code> nie jest dostępna na naszym komputerze - zależy to prawdopodobnie od modelu jego płyty głównej. W moim przypadku powyższy kod działał bez problemu na komputerze stacjonarnym, lecz nie na laptopie. Może to i dobrze... Mam bowiem uzasadnione przeczucie, że temperatura tamtejszego procesora wcale by mi się nie spodobała ;)</p>
<img src="http://feeds.feedburner.com/~r/xion/~4/dntH8iFLCOY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xion.org.pl/2010/07/13/triki-z-powershellem-15-puff-jak-goraco/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Znak wodny w polu tekstowym</title>
		<link>http://xion.org.pl/2010/07/10/znak-wodny-w-polu-tekstowym/</link>
		<comments>http://xion.org.pl/2010/07/10/znak-wodny-w-polu-tekstowym/#comments</comments>
		<pubDate>Sat, 10 Jul 2010 11:16:53 +0000</pubDate>
		<dc:creator>Xion</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[pole tekstowe]]></category>
		<category><![CDATA[znak wodny]]></category>

		<guid isPermaLink="false">http://xion.org.pl/?p=1971</guid>
		<description><![CDATA[Panuje obecnie moda na to, aby strony WWW jak najskuteczniejszej udawały, że nimi nie są i zamiast tego mieniły się 'aplikacjami internetowymi'. Duża w tym zasługa możliwości JavaScriptu w nowoczesnych przeglądarkach. Jeśli potrafimy przeboleć pisanie w nim, to możemy osiągnąć całkiem efektowne rezultaty. Albo takie nieco mniej imponujące, ale też zgrabne :) Do tej drugiej [...]]]></description>
			<content:encoded><![CDATA[<p>Panuje obecnie moda na to, aby strony WWW jak najskuteczniejszej udawały, że nimi nie są i zamiast tego mieniły się 'aplikacjami internetowymi'. Duża w tym zasługa możliwości JavaScriptu w nowoczesnych przeglądarkach. Jeśli potrafimy przeboleć pisanie w nim, to możemy osiągnąć całkiem efektowne rezultaty. Albo takie nieco mniej imponujące, ale też zgrabne :)<br />
<img style="float:left; margin:5px; margin-top:7px; margin-bottom:10px" src="http://xion.org.pl/wp-content/uploads/2010/07/watermark-textbox.png" alt="" title="Pole tekstowe ze znakiem wodnym" />Do tej drugiej kategorii należy efekt znany jako <em>watermark textbox</em>, niemający wbrew pozorom żadnego związku ze znakami wodnymi w obrazkach. Trik ten - z którym zapewne tutejsza większość się zetknęła - polega na wyświetlaniu nieco przyszarzonego komunikatu <strong>w</strong> polu tekstowym, który następnie znika, gdy użytkownik umieści w nim kursor. Oprócz sprawiania wrażenia, że "strona żyje", ta prosta sztuczka ma też wymiar praktyczny: pozwala oszczędzić na zbędnej etykiecie <em>textboxa</em>.</p>
<p>Chcąc "wodne" pole tekstowe umieścić na swojej stronie, możemy skorzystać z <a href="http://code.google.com/p/jquery-watermark/"> jednego z gotowych rozwiązań</a>. Wiele z nich używa <a href="http://jquery.com">jQuery</a> - darmowej biblioteki ułatwiającej pisanie w JS. Jeśli jednak nie korzystamy z niej w innych miejscach strony, to wymaganie jej obecności nie musi się nam podobać. A ponieważ <em>watermark textbox</em> jest efektem łatwym do zakodowania, spokojnie możemy napisać go własnoręcznie. Prześledźmy zatem, jak da się to zrobić.<br />
<span id="more-1971"></span><br />
Definiujemy najpierw styl naszego pola tekstowego, określający jego wygląd podczas wyświetlania wskazówki-znaku wodnego:</p>
<div class="syntax_hilite">
<div id="css-13">
<div class="css">input<span style="color: #6666ff;">.watermarkTextBox </span><span style="color: #66cc66;">&#123;</span> <span style="color: #000000; font-weight: bold;">color</span>: #808080; <span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
Szary kolor jest oczywiście tylko propozycją. Potrzebujemy w każdym razie osobnej klasy CSS, by oznaczać nią te <em>textboksy</em>, które mają wyświetlać znak wodny. Jako wskazówkę będziemy pokazywali początkową wartość pola tekstowego, czyli to co zostało fabrycznie przypisane atrybutowi <code>value</code> elementu <code>input</code>:</p>
<div class="syntax_hilite">
<div id="html-14">
<div class="html"><span style="color: #009900;"><a href="http://december.com/html/4/element/input.html"><span style="color: #000000; font-weight: bold;">&lt;input</span></a> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"text"</span> <span style="color: #000066;">size</span>=<span style="color: #ff0000;">"20"</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">"Szukaj..."</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">"watermarkTextBox"</span>/<span style="color: #000000; font-weight: bold;">&gt;</span></a></span></div>
</div>
</div>
<p>
To właściwie tyle, jeśli chodzi o statyczny HTML; resztę musimy załatwić JavaScriptem. Interesują nas dwa zdarzenia: zyskania oraz utraty <strong>fokusu</strong> przez kontrolkę. Są to odpowiednio: <code>onfocus</code> i <code>onblur</code>. (Właśnie za takie nieintuicyjne nazwy "kochamy" JavaScript ;P). W reakcji na pierwsze z nich powinniśmy ukryć nasz szary tekst i pozwolić użytkownikowi na wpisanie nowego. Jeśli jednak tego nie zrobi, to w drugim zdarzeniu wykrywamy, że <em>textbox</em> jest wciąż pusty i ponawiamy wyświetlanie znaku wodnego. Oto procedury zdarzeniowe, które wykonują te czynności:</p>
<div class="syntax_hilite">
<div id="javascript-15">
<div class="javascript"><span style="color: #003366; font-weight: bold;">function</span> onWatermarkTextBoxFocus<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">value</span> == <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">watermark</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">value</span> = <span style="color: #3366CC;">""</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">className</span> = <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">className</span>.<span style="color: #006600;">replace</span><span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">"watermarkTextBox"</span>, <span style="color: #3366CC;">""</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></p>
<p><span style="color: #003366; font-weight: bold;">function</span> onWatermarkTextBoxBlur<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">value</span>.<span style="color: #006600;">length</span> == <span style="color: #CC0000;">0</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">value</span> = <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">watermark</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">className</span> += <span style="color: #3366CC;">" watermarkTextBox"</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span></div>
</div>
</div>
<p>
Jak można zauważyć, rzecz polega na dodaniu lub usunięciu nazwy uprzednio zdefiniowanej klasy CSS z listy klas pola tekstowego. Zakładamy tutaj, że atrybut <code>watermark</code> zawiera jego etykietę, czyli znak wodny. Żeby jednak tak było, musimy go ustawić, przy okazji <del>podpinając</del> (fuj, nie lubię tego słowa) przypisując powyższe funkcje do zdarzeń kontrolki. Czynimy to podczas wczytywania strony:</p>
<div class="syntax_hilite">
<div id="javascript-16">
<div class="javascript"><span style="color: #003366; font-weight: bold;">function</span> initWatermarkTextBoxes<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> inputs = document.<span style="color: #006600;">getElementsByTagName</span><span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">"input"</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #66cc66;">&#40;</span>i = <span style="color: #CC0000;">0</span>; i &lt;inputs.<span style="color: #006600;">length</span>; ++i<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span>inputs<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>.<span style="color: #006600;">type</span> == <span style="color: #3366CC;">"text"</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &amp;&amp; inputs<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>.<span style="color: #006600;">className</span>.<span style="color: #006600;">indexOf</span><span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">"watermarkTextBox"</span><span style="color: #66cc66;">&#41;</span> != -<span style="color: #CC0000;">1</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inputs<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>.<span style="color: #006600;">watermark</span> = inputs<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>.<span style="color: #006600;">value</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inputs<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>.<span style="color: #000066;">onfocus</span> = onWatermarkTextBoxFocus;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inputs<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>.<span style="color: #000066;">onblur</span> = onWatermarkTextBoxBlur;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
<span style="color: #66cc66;">&#125;</span><br />
window.<span style="color: #000066;">onload</span> = initWatermarkTextBoxes;</div>
</div>
</div>
<p>
Przechodzimy po prostu po wszystkich tagach <code>input</code>, szukając zwykłych pól tekstowych (<code>type</code> równe </code>"text"</code>), które mają przypisaną "wodną" klasę CSS. Ustawiamy im następnie m.in. <code>watermark</code> na ich aktualną zawartość.</p>
<p>I właściwie to już wszystko. Okazuje się więc, że czasami JavaScript nie jest taki straszny ;) A jeśli chodzi o działający przykład praktyczny, to można go oglądać gdzieś nieopodal w postaci długo oczekiwanego formularza wyszukiwarki :)</p>
<p><small><em>Disclaimer</em>: rozwiązanie testowane na najnowszych wersjach dwóch najsensowniejszych przeglądarek, czyli FF3.6 i IE8. Za Opery, Safari i inne chromy nie ręczę ;P</small></p>
<img src="http://feeds.feedburner.com/~r/xion/~4/lHXgW2juUsc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xion.org.pl/2010/07/10/znak-wodny-w-polu-tekstowym/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Pętla z wyróżnionym startem</title>
		<link>http://xion.org.pl/2010/07/07/petla-z-wyroznionym-startem/</link>
		<comments>http://xion.org.pl/2010/07/07/petla-z-wyroznionym-startem/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 11:57:42 +0000</pubDate>
		<dc:creator>Xion</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[pętle]]></category>

		<guid isPermaLink="false">http://xion.org.pl/?p=1965</guid>
		<description><![CDATA[Jednym z powodów, dla których nie lubię diagramów blokowych, jest ich prymitywna notacja przedstawiania instrukcji sterujących. Jedyne, czym się tam dysponuje, to if i skok. Jak przy pomocy tylko tego można w klarowny sposób przedstawić jakikolwiek nietrywialny algorytm? To trochę tak, jakby w programowaniu używać tylko pętli nieskończonych i instrukcji break. Można to robić, oczywiście, [...]]]></description>
			<content:encoded><![CDATA[<p>Jednym z powodów, dla których nie lubię diagramów blokowych, jest ich prymitywna notacja przedstawiania instrukcji sterujących. Jedyne, czym się tam dysponuje, to <code>if</code> i skok. Jak przy pomocy tylko tego można w klarowny sposób przedstawić jakikolwiek nietrywialny algorytm? To trochę tak, jakby w programowaniu używać tylko pętli nieskończonych i instrukcji <code>break</code>.<br />
Można to robić, oczywiście, ale konsekwencje nie są zbyt ciekawe. Jeśli kryterium opuszczenia pętli jest tak skomplikowane, że trzeba je rozbić na kilka konstrukcji <code>if</code>-<code>break</code> i żadna z nich "nie zasługuje" na wyciągnięcie do warunku w samym <code>while</code>/<code>for</code>, to coś tu brzydko pachnie. Nie chciałbym być w skórze tego, kto będzie musiał później takie dzieło debugować.</p>
<p>W bardziej rozsądnych przypadkach da się uniknąć pętli nieskończonych, nawet jeśli od razu nie widać, jak można by to zrobić. I tak odkryłem na przykład, jak można to ładnie zrobić w sytuacji podobnej do poniższej:</p>
<div class="syntax_hilite">
<div id="cpp-21">
<div class="cpp">T foo;<br />
<span style="color: #0000ff;">for</span> <span style="color: #000000;">&#40;</span>;;<span style="color: #000000;">&#41;</span><br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; foo = SomeFunction<span style="color: #000000;">&#40;</span>sth<span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span>!foo.<span style="color: #00eeff;">IsOK</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> <span style="color: #0000ff;">break</span>;</p>
<p>&nbsp; &nbsp;<span style="color: #ff0000;">// (Reszta pętli, zmieniająca sth na podstawie foo)</span><br />
<span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p>
Nazywam to <strong>pętlą z wyróżnionym startem</strong>, bo typowa jej postać, która nie zawiera (pozornie) nieskończonego kręcenia się w kółko, wygląda tak:</p>
<div class="syntax_hilite">
<div id="cpp-22">
<div class="cpp"><span style="color: #0000ff;">for</span> <span style="color: #000000;">&#40;</span>T foo = SomeFunction<span style="color: #000000;">&#40;</span>sth<span style="color: #000000;">&#41;</span>; foo.<span style="color: #00eeff;">IsOK</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>; foo = SomeFunction<span style="color: #000000;">&#40;</span>sth<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span> <span style="color: #ff0000; font-style: italic;">/* Reszta pętli, jw. */</span><span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p>
Cała zabawa polega na tym, że pierwsze wywołanie <code>SomeFunction</code> może dać niepoprawną wartość w <code>foo</code>. (Może to być jakieś wyszukiwanie w pojemniku i element odpowiadający kluczowy <code>sth</code> nie został w ogóle znaleziony). Sama treść pętli nie może być wtedy wykonana, bo zdarzy się zapewne jakieś nieszczęście. Dlatego trzeba wyodrębnić to pierwsze wywołanie, i oczywiście zadbać także o kolejne. A to daje, jak widać, dublowanie kodu. Chciałoby się to zrobić lepiej.</p>
<p>I można, na szczęście. Możemy za to podziękować <em>feature</em>'owi C++, który często bywa krytykowany jako ułatwiający popełnianie błędów. Bowiem to dzięki temu, że instrukcja przypisania zwraca wartość przypisywaną, możemy to wszystko zapisać tak:</p>
<div class="syntax_hilite">
<div id="cpp-23">
<div class="cpp"><span style="color: #0000ff;">for</span> <span style="color: #000000;">&#40;</span>T foo; <span style="color: #000000;">&#40;</span>foo = SomeFunction<span style="color: #000000;">&#40;</span>sth<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>.<span style="color: #00eeff;">IsOK</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>; <span style="color: #ff0000; font-style: italic;">/* nic */</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span> <span style="color: #ff0000; font-style: italic;">/* Reszta pętli */</span> <span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p>
Zdaję sobie sprawę, że dla wielu fakt ten jest równie oczywisty jak pisanie <code>return a == b;</code> zamiast:</p>
<div class="syntax_hilite">
<div id="cpp-24">
<div class="cpp"><span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span>a == b<span style="color: #000000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span>; <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span>;</div>
</div>
</div>
<p>
ale dla niektórych taka postać pętli <code>for</code> może być zupełnie zaskakująca. Pamiętajmy, że kiedyś (prawie) każdy pisał też i takie <code>if</code>y jak powyżej ;-)</p>
<img src="http://feeds.feedburner.com/~r/xion/~4/_j7cT1xs5o0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xion.org.pl/2010/07/07/petla-z-wyroznionym-startem/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>W obronie π</title>
		<link>http://xion.org.pl/2010/07/05/w-obronie-pi/</link>
		<comments>http://xion.org.pl/2010/07/05/w-obronie-pi/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 09:32:15 +0000</pubDate>
		<dc:creator>Xion</dc:creator>
				<category><![CDATA[Matematyka]]></category>
		<category><![CDATA[liczba π]]></category>
		<category><![CDATA[programowanie grafiki]]></category>

		<guid isPermaLink="false">http://xion.org.pl/?p=1946</guid>
		<description><![CDATA[Doprawdy ciekawe pomysły można czasami znaleźć w Internecie. Na pierwszy rzut mogą wydawać się zupełnie szalone, lecz po bliższym przyjrzeniu daje się w nich zauważyć pewien sens... Ale zwykle tylko pewien, tj. niewielki :) Tak właśnie jest z ideą "nowej stałej okręgu" - liczbą (równą ), której to propozycja zawarta jest tekście o intrygującym tytule [...]]]></description>
			<content:encoded><![CDATA[<p>Doprawdy ciekawe pomysły można czasami znaleźć w Internecie. Na pierwszy rzut mogą wydawać się zupełnie szalone, lecz po bliższym przyjrzeniu daje się w nich zauważyć pewien sens... Ale zwykle tylko pewien, tj. niewielki :) Tak właśnie jest z ideą "nowej stałej okręgu" - liczbą <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-a6f317b268ae825d94f832f970af607c.gif" alt="\tau" title="\tau" style="vertical-align: 0px; border: none;"/> (równą <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-c3198a6dbef629ca31403b4ccdff3fc7.gif" alt="2\pi" title="2\pi" style="vertical-align: 0px; border: none;"/>), której to propozycja zawarta jest tekście o intrygującym tytule <a href="http://tauday.com/"><em>The Tau Manifesto</em></a>.</p>
<p>Postulat zastąpienia liczby <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-4f08e3dba63dc6d40b22952c7a9dac6d.gif" alt="\pi" title="\pi" style="vertical-align: 0px; border: none;"/> - chyba najbardziej znanej stałej, występującej w matematyce, fizyce, grafice komputerowej i generalnie każdej dziedzinie wiedzy, mającej cokolwiek wspólnego z liczeniem czegokolwiek - wygląda zrazu na zupełnie szalony. Tym niemniej <em>Manifest Tau</em> zawiera naprawdę sporo argumentów przemawiających za tezą, że jednak <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-a6f317b268ae825d94f832f970af607c.gif" alt="\tau" title="\tau" style="vertical-align: 0px; border: none;"/> jest bardziej użyteczną liczbą i lepiej spełnia funkcję "stałej okręgu" niż jej połówka, czyli <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-4f08e3dba63dc6d40b22952c7a9dac6d.gif" alt="\pi" title="\pi" style="vertical-align: 0px; border: none;"/>. Ich podsumowanie wygląda mniej więcej tak:</p>
<ol>
<li>Definicja <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-4f08e3dba63dc6d40b22952c7a9dac6d.gif" alt="\pi" title="\pi" style="vertical-align: 0px; border: none;"/> jest nienaturalna, bo wykorzystuje pojęcie średnicy okręgu zamiast jego promienia. Promień jest tu lepszy w tym sensie, że okrąg można zdefiniować jako zbiór punktów w równej odległości od swojego środka - odległości równej właśnie promieniowi.</li>
<li><img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-4f08e3dba63dc6d40b22952c7a9dac6d.gif" alt="\pi" title="\pi" style="vertical-align: 0px; border: none;"/> we wzorach matematycznych występuje często z czynnikiem 2 - na tyle często, że można stwierdzić, iż właśnie <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-c3198a6dbef629ca31403b4ccdff3fc7.gif" alt="2\pi" title="2\pi" style="vertical-align: 0px; border: none;"/> jest ważniejszą wartością niż samo <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-4f08e3dba63dc6d40b22952c7a9dac6d.gif" alt="\pi" title="\pi" style="vertical-align: 0px; border: none;"/>.</li>
<li>Standardowa miara kątów płaskich w radianach przypisuje <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-c3198a6dbef629ca31403b4ccdff3fc7.gif" alt="2\pi" title="2\pi" style="vertical-align: 0px; border: none;"/> kątowi pełnemu, czyli kątowi jednego obrotu po okręgu. Przy użyciu <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-a6f317b268ae825d94f832f970af607c.gif" alt="\tau" title="\tau" style="vertical-align: 0px; border: none;"/> kąt ten wyraża się jako <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-df25fac2108e5570b3564fb09fb30ec8.gif" alt="1\tau" title="1\tau" style="vertical-align: -1px; border: none;"/>, co wydaje się znacznie bardziej intuicyjne. Łatwiej jest też podobno wytłumaczyć, że np. ćwiartka okręgu to <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-3647dc184901b3ad134ff555024108f3.gif" alt="\tau/4" title="\tau/4" style="vertical-align: -5px; border: none;"/>, a nie <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-d97ed75815d5454312793e69228fd04f.gif" alt="\pi/2" title="\pi/2" style="vertical-align: -5px; border: none;"/>.</li>
<li>Słynna tożsamość Eulera (&nbsp;<img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-66d24771ec114e071c1c13223f816869.gif" alt="e^{i\pi}+1=0" title="e^{i\pi}+1=0" style="vertical-align: -1px; border: none;"/>&nbsp;), łącząca pięć ważnych stałych matematycznych, ma też swój odpowiednik w postaci wykorzystującej <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-a6f317b268ae825d94f832f970af607c.gif" alt="\tau" title="\tau" style="vertical-align: 0px; border: none;"/>: <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-c5e02d4cbb8dd74f06d05ed99aa7b7fa.gif" alt="e^{i\tau}=1+0" title="e^{i\tau}=1+0" style="vertical-align: -1px; border: none;"/>.</li>
<li>Wzór na pole koła (&nbsp;<img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-6666716ddb469e1a10b4dedf9a566dcb.gif" alt="\pi r^2" title="\pi r^2" style="vertical-align: 0px; border: none;"/>&nbsp;), w którym występuje <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-4f08e3dba63dc6d40b22952c7a9dac6d.gif" alt="\pi" title="\pi" style="vertical-align: 0px; border: none;"/> z czynnikiem 1, po przepisaniu na <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-cfca336522393c2052f578eecb7384f7.gif" alt="\frac{1}{2}\tau r^2" title="\frac{1}{2}\tau r^2" style="vertical-align: -6px; border: none;"/> staje się podobny do niektórych wzorów fizycznych (zwanych tutaj formami kwadratowymi), jak np. <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-9f19a1e103464156bf296d9e8cd7aadd.gif" alt="\frac{1}{2}gt^2" title="\frac{1}{2}gt^2" style="vertical-align: -6px; border: none;"/> czy <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-5f6a292a60d11ac93192fece04c53090.gif" alt="\frac{1}{2}mv^2" title="\frac{1}{2}mv^2" style="vertical-align: -6px; border: none;"/>.</li>
</ol>
<p>W <a href="http://tauday.com/">oryginalnym artykule</a> argumenty te przedstawione są rzecz jasna w sposób znacznie bardziej pomysłowy, elokwentny i trącący przekazywaniem "oczywistej oczywistości", że się tak kolokwialnie wyrażę :) Trąci też jednak nadmiernym zamiłowaniem do numerologii i przywiązywaniem wagi to takich rzeczy jak czynnik przy jakiejś stałej w tym czy innym wzorze. Lecz nawet jeśli przyjmiemy tę konwencję, to znalezienie przekonujących kontrargumentów wcale nie jest trudne.<br />
<span id="more-1946"></span><br />
Rzekoma nienaturalność definicji <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-4f08e3dba63dc6d40b22952c7a9dac6d.gif" alt="\pi" title="\pi" style="vertical-align: 0px; border: none;"/> wynika głównie z tego, że z niewiadomych przyczyn przyczepiliśmy się do pojęcia okręgu, ignorując istnienie innej figury geometrycznej: <strong>koła</strong>, czyli okręgu wraz z jego wnętrzem. Koło zaś możemy łatwo zdefiniować jako zbiór punktów odległych co najwyżej o jakieś <em>d</em>, gdzie to <em>d</em> to właśnie średnica. Jeśli jednak bardziej odpowiada nam promień, to też nie ma problemu. Oto <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-6ad84c11be90bb993f5ca88f8922b454.gif" alt="\pi=P/r^2" title="\pi=P/r^2" style="vertical-align: -5px; border: none;"/>; iloraz pola koła i kwadratu jego promienia to właśnie <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-4f08e3dba63dc6d40b22952c7a9dac6d.gif" alt="\pi" title="\pi" style="vertical-align: 0px; border: none;"/>.<br />
Wszechobecność <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-4f08e3dba63dc6d40b22952c7a9dac6d.gif" alt="\pi" title="\pi" style="vertical-align: 0px; border: none;"/> z czynnikiem 2 w wielu wzorach też jest raczej pozorna, bo zależy głównie od tego, na które wzory akurat patrzymy :) Istnieje bowiem <a href="http://en.wikipedia.org/wiki/List_of_formulas_involving_%CF%80">całe mnóstwo przykładów</a> - zarówno matematycznych, jak i fizycznych - na występowanie <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-4f08e3dba63dc6d40b22952c7a9dac6d.gif" alt="\pi" title="\pi" style="vertical-align: 0px; border: none;"/> z innymi czynnikami. Są to chociażby pole powierzchni (&nbsp;<img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-6f5466a198d438d844c1cdbad2d80828.gif" alt="4\pi r^2" title="4\pi r^2" style="vertical-align: -1px; border: none;"/>&nbsp;) i objętość (&nbsp;<img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-901b9b3e6b899ce6984630a2196ded1d.gif" alt="\frac{4}{3}\pi r^3" title="\frac{4}{3}\pi r^3" style="vertical-align: -6px; border: none;"/>&nbsp;) kuli, <a href="http://en.wikipedia.org/wiki/Coulomb%27s_law">prawo Coulomba</a> (&nbsp;<img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-46f2e8fce4bc6e5771726ddc20615d45.gif" alt="F=\frac{\left|q_1 q_2\right|}{4\pi \epsilon_0 r^2}" title="F=\frac{\left|q_1 q_2\right|}{4\pi \epsilon_0 r^2}" style="vertical-align: -9px; border: none;"/>&nbsp;), <a href="http://en.wikipedia.org/wiki/Cosmological_constant">stała kosmologiczna</a> (&nbsp;<img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-7d2fc87f9f75cda7da284e23c8433b82.gif" alt="\Lambda=\rho\frac{8\pi G}{3c^2}" title="\Lambda=\rho\frac{8\pi G}{3c^2}" style="vertical-align: -7px; border: none;"/>&nbsp;) czy też <a href="http://en.wikipedia.org/wiki/Uncertainty_principle">zasada nieoznaczności</a>&nbsp;(&nbsp;<img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-c0d8f9971d7981a19c3f34bd33124192.gif" alt="\Delta x \Delta p \ge \frac{h}{4\pi}" title="\Delta x \Delta p \ge \frac{h}{4\pi}" style="vertical-align: -6px; border: none;"/> w wersji dla pozycji i pędu). Nie ma więc specjalnych powodów by twierdzić, że użycie <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-a6f317b268ae825d94f832f970af607c.gif" alt="\tau" title="\tau" style="vertical-align: 0px; border: none;"/> w znaczący sposób uprościłoby te formuły.</p>
<p><img style="float:left; margin:5px" src="http://xion.org.pl/wp-content/uploads/2010/07/pi-angles.png" alt="" title="Kąty na okręgu wg pi" />Ponadto spora liczba wystąpień <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-c3198a6dbef629ca31403b4ccdff3fc7.gif" alt="2\pi" title="2\pi" style="vertical-align: 0px; border: none;"/> związana jest z tym, że taka jest właśnie miara kąta pełnego - co jest zresztą kolejnym argumentem przeciwko poczciwej ludolfinie. Pomijając fakt użycia specyficznych dla języka angielskiego sztuczek słownych (przypisanie <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-a6f317b268ae825d94f832f970af607c.gif" alt="\tau" title="\tau" style="vertical-align: 0px; border: none;"/> wyrazowi <em>turn</em>, czyli obrót), wprowadzenie <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-a6f317b268ae825d94f832f970af607c.gif" alt="\tau" title="\tau" style="vertical-align: 0px; border: none;"/> w zastępstwie <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-4f08e3dba63dc6d40b22952c7a9dac6d.gif" alt="\pi" title="\pi" style="vertical-align: 0px; border: none;"/> sprawiłoby przecież, że nagle suma miar kątów w trójkącie i każdym innym nieparzysto-<em>n</em>-kącie stanie się "brzydka", bo równa <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-c8761e0bcca4a0c707c1f414225b7817.gif" alt="\frac{(n-3)\tau}{2}" title="\frac{(n-3)\tau}{2}" style="vertical-align: -6px; border: none;"/>. Podobny argument o okresie funkcji sinus i cosinus (oba równe <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-5773b10512b44ab6703c42b799a13eaa.gif" alt="\tau=2\pi" title="\tau=2\pi" style="vertical-align: 0px; border: none;"/>) da się zripostować analogicznym stwierdzeniem dla tangensa i cotagensa, dla których wynosi on okrągłe <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-4f08e3dba63dc6d40b22952c7a9dac6d.gif" alt="\pi" title="\pi" style="vertical-align: 0px; border: none;"/>.<br />
O tożsamości Eulera w postaci <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-c5e02d4cbb8dd74f06d05ed99aa7b7fa.gif" alt="e^{i\tau}=1+0" title="e^{i\tau}=1+0" style="vertical-align: -1px; border: none;"/> trudno natomiast powiedzieć cokolwiek innego niż 'naciągana' - zwłaszcza, że jej odpowiednik z <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-4f08e3dba63dc6d40b22952c7a9dac6d.gif" alt="\pi" title="\pi" style="vertical-align: 0px; border: none;"/> należy do niezwykle powszechnych w matematyce równań o zerowej prawej stronie. Jednak to nic w porównaniu z rzekomym uzasadnieniem, dlaczego <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-cfca336522393c2052f578eecb7384f7.gif" alt="\frac{1}{2}\tau r^2" title="\frac{1}{2}\tau r^2" style="vertical-align: -6px; border: none;"/> jest lepsze od <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-6666716ddb469e1a10b4dedf9a566dcb.gif" alt="\pi r^2" title="\pi r^2" style="vertical-align: 0px; border: none;"/> jako wzór na powierzchnię koła. Porównanie do formuł fizycznych w rodzaju wzoru na energię kinetyczną (&nbsp;<img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-5f6a292a60d11ac93192fece04c53090.gif" alt="\frac{1}{2}mv^2" title="\frac{1}{2}mv^2" style="vertical-align: -6px; border: none;"/>&nbsp;) wydaje się z miejsca przekonujące, o ile tylko zapomnimy o pewnym istotnym szczególe. Otóż wielkości fizyczne mają jednostki (tutaj: kilogramy, metry i sekundy) i to od definicji tych jednostek zależy między innymi to, jakie współczynniki wystąpią w formułach takich, jak powyższa. Wystarczyłoby zamienić odważnik w Sevres na dwukrotnie cięższy (zmieniając definicję kilograma), by nasz wzór na energię kinetyczną stracił czynnik <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-93b05c90d14a117ba52da1d743a43ab1.gif" alt="\frac{1}{2}" title="\frac{1}{2}" style="vertical-align: -6px; border: none;"/>. Podobnej "wady" nie ma oczywiście ani <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-6666716ddb469e1a10b4dedf9a566dcb.gif" alt="\pi r^2" title="\pi r^2" style="vertical-align: 0px; border: none;"/>, ani żaden inny wzór geometryczny, bo nie występują w nich działania na wielkościach różnych wymiarów, więc są one niezależne od używanych jednostek.</p>
<p>Wniosek końcowy jest więc taki, że pogłoski o rychłej śmierci <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-4f08e3dba63dc6d40b22952c7a9dac6d.gif" alt="\pi" title="\pi" style="vertical-align: 0px; border: none;"/> są zdecydowanie przesadzone :) <em>Manifest Tau</em> może więc stanowić co najwyżej przykład "kreatywnej matematyki" - analogicznej do sławetnej 'kreatywnej księgowości' - oraz dość osobliwego sposobu postrzegania elegancji w matematycznych formułach. Tym niemniej samego <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-a6f317b268ae825d94f832f970af607c.gif" alt="\tau" title="\tau" style="vertical-align: 0px; border: none;"/> nie powinno się od razu spisywać na straty, bo w przynajmniej jednej dziedzinie stała ta może być faktycznie lepsza od liczby <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-4f08e3dba63dc6d40b22952c7a9dac6d.gif" alt="\pi" title="\pi" style="vertical-align: 0px; border: none;"/>.<br />
<img style="float:right; margin:5px" src="http://xion.org.pl/wp-content/uploads/2010/07/tauism.png" alt="" title="Kąty na okręgu wg tau" />Gdzie? Ano spieszę z odpowiedzią, że w... grafice komputerowej, a dokładniej w tych miejscach, gdzie dokonujemy przekształceń obiektów za pomocą obrotów. Trudno zaprzeczyć temu, że wyrażanie kątów za pomocą <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-a6f317b268ae825d94f832f970af607c.gif" alt="\tau" title="\tau" style="vertical-align: 0px; border: none;"/> jest w tej sytuacji o wiele wygodniejsze niż przy pomocy <img src="http://xion.org.pl/wp-content/ql-cache/quicklatex-4f08e3dba63dc6d40b22952c7a9dac6d.gif" alt="\pi" title="\pi" style="vertical-align: 0px; border: none;"/>. Trudniej też o pomyłkę w pisaniu:</p>
<div class="syntax_hilite">
<div id="cpp-28">
<div class="cpp">D3DXMatrixRotationX <span style="color: #000000;">&#40;</span>&amp;rot, TAU / <span style="color: #0000dd;">2</span><span style="color: #000000;">&#41;</span>;</div>
</div>
</div>
<p>
zamiast:</p>
<div class="syntax_hilite">
<div id="cpp-29">
<div class="cpp">D3DXMatrixRotationX <span style="color: #000000;">&#40;</span>&amp;rot, D3DX_PI<span style="color: #000000;">&#41;</span>;</div>
</div>
</div>
<p>
gdy naszą intencją był <strong>pół</strong>obrót wokół osi X. Definiując więc sobie taką oto stałą:</p>
<div class="syntax_hilite">
<div id="cpp-30">
<div class="cpp"><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">float</span> TAU = <span style="color: #0000dd;">6</span>.2831853072f;</div>
</div>
</div>
<p>
możemy z tej matematycznej zabawy wynieść wymierną, koderską korzyść :)</p>
<img src="http://feeds.feedburner.com/~r/xion/~4/IzlMkoyf0dU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xion.org.pl/2010/07/05/w-obronie-pi/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Split</title>
		<link>http://xion.org.pl/2010/07/02/split/</link>
		<comments>http://xion.org.pl/2010/07/02/split/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 15:44:58 +0000</pubDate>
		<dc:creator>Xion</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[łańcuchy znaków]]></category>

		<guid isPermaLink="false">http://xion.org.pl/?p=1942</guid>
		<description><![CDATA[Tytuł dzisiejszej notki nie ma nic wspólnego z miejscowością wypoczynkową na południu Chorwacji, chociaż pewnie obecne temperatury nasuwają takie skojarzenia :) Zamiast tego chodzi o split łańcucha znaków, czyli bardzo często potrzebną w praktyce operację na stringach. Danymi dla niej są najczęściej dwa napisy, zaś wynikiem jest tablica podciągów pierwszego z nich, powstała poprzez podzielenie [...]]]></description>
			<content:encoded><![CDATA[<p>Tytuł dzisiejszej notki nie ma nic wspólnego z <a href="http://en.wikipedia.org/wiki/Split_%28city%29">miejscowością wypoczynkową na południu Chorwacji</a>, chociaż pewnie obecne temperatury nasuwają takie skojarzenia :) Zamiast tego chodzi o <em>split</em> łańcucha znaków, czyli bardzo często potrzebną w praktyce operację na <em>stringach</em>.<br />
Danymi dla niej są najczęściej dwa napisy, zaś wynikiem jest tablica podciągów pierwszego z nich, powstała poprzez podzielenie go względem wystąpień drugiego (tzw. separatora). Ponieważ jak zwykle przykład będzie mówił najwięcej, niniejszym podaję nawet kilka:</p>
<div class="syntax_hilite">
<div id="code-33">
<div class="code">Split<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"Ala ma kota"</span>, <span style="color:#CC0000;">" "</span><span style="color:#006600; font-weight:bold;">&#41;</span> == <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#CC0000;">"Ala"</span>, <span style="color:#CC0000;">"ma"</span>, <span style="color:#CC0000;">"kota"</span> <span style="color:#006600; font-weight:bold;">&#125;</span>;<br />
Split<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"1, 2, 3, 4"</span>, <span style="color:#CC0000;">","</span><span style="color:#006600; font-weight:bold;">&#41;</span> == <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#CC0000;">"1"</span>, <span style="color:#CC0000;">" 2"</span>, <span style="color:#CC0000;">" 3"</span>, <span style="color:#CC0000;">"4"</span> <span style="color:#006600; font-weight:bold;">&#125;</span>;<br />
Split<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"&lt;point x='23' y='14' z='-3' /&gt;"</span>, <span style="color:#CC0000;">" "</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; == <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#CC0000;">"&lt;point"</span>, <span style="color:#CC0000;">"x='23'"</span>, <span style="color:#CC0000;">"y='14'"</span>, <span style="color:#CC0000;">"z='-3'"</span>, <span style="color:#CC0000;">"/&gt;"</span> <span style="color:#006600; font-weight:bold;">&#125;</span></div>
</div>
</div>
<p>
Zwłaszcza ostatni pokazuje, że <em>split</em> jest rzeczywiście użyteczną funkcją, mogącą ułatwiać parsowanie formatów tekstowych (zwłaszcza, jeśli daje się ją zastosować wielokrotnie). Warto więc mieć takową w swoim języku/bibliotece. Jak więc przedstawia się jej dostępność na różnych platformach?</p>
<p>Tradycyjnie w .NET i Javie jest dobrze, a nawet lepiej. W obu przypadkach funkcja (a właściwie metoda) <code>Split</code>/<code>split</code> klasy <code>String</code> dodaje nawet trochę więcej możliwości niż to opisałem wyżej. I tak w .NET można podać więcej niż jeden oddzielacz, natomiast w Javie domyślnie może być nim również wyrażenie regularne.<br />
Niektóre języki skryptowe i skryptopodobne też mają się w tym względnie całkiem dobrze. W Pythonie jest metoda <code>split</code> w klasie napisu, natomiast PHP ma funkcję <a href="http://php.net/manual/en/function.explode.php"><code>explode</code></a>, która mimo innej nazwy działa bardzo podobnie.</p>
<p>Ale nie wszędzie funkcja typu <em>split</em> jest od razu dostępna; niekiedy trzeba ją sobie samemu napisać. Przykładem języka, gdzie może być to koniecznie, jest Lua oraz - jakżeby inaczej - C++ :) Ze względu na użyteczność <em>split</em>a często znajdowałem się w sytuacji, gdzie konieczne/wygodne było jego napisanie. Po kilku(nastu?) takich przypadkach doszedłem wreszcie do czegoś podobnego do poniższego kodu:</p>
<div class="syntax_hilite">
<div id="cpp-34">
<div class="cpp"><span style="color: #0000ff;">typedef</span> std::<span style="color: #00eeff;">vector</span>&lt;std::<span style="color: #00eeff;">string</span>&gt; StringArray;<br />
StringArray Split<span style="color: #000000;">&#40;</span><span style="color: #0000ff;">const</span> std::<span style="color: #00eeff;">string</span>&amp; text, <span style="color: #0000ff;">const</span> std::<span style="color: #00eeff;">string</span>&amp; delim<span style="color: #000000;">&#41;</span><br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; StringArray res;<br />
&nbsp; &nbsp; <span style="color: #0000ff;">if</span> <span style="color: #000000;">&#40;</span>delim.<span style="color: #00eeff;">empty</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>&nbsp; <span style="color: #000000;">&#123;</span> res.<span style="color: #00eeff;">push_back</span><span style="color: #000000;">&#40;</span>text<span style="color: #000000;">&#41;</span>; <span style="color: #0000ff;">return</span> res; <span style="color: #000000;">&#125;</span></p>
<p>&nbsp; &nbsp; std::<span style="color: #00eeff;">string</span>::<span style="color: #00eeff;">size_type</span> i = <span style="color: #0000dd;">0</span>, j;<br />
&nbsp; &nbsp; <span style="color: #0000ff;">while</span> <span style="color: #000000;">&#40;</span>i &lt;text.<span style="color: #00eeff;">length</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &amp;&amp; <span style="color: #000000;">&#40;</span>j = text.<span style="color: #00eeff;">find</span><span style="color: #000000;">&#40;</span>delim, i<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> != std::<span style="color: #00eeff;">string</span>::<span style="color: #00eeff;">npos</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; res.<span style="color: #00eeff;">push_back</span> <span style="color: #000000;">&#40;</span>text.<span style="color: #00eeff;">substr</span><span style="color: #000000;">&#40;</span>i, j - i<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; i = j + delim.<span style="color: #00eeff;">length</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
&nbsp; &nbsp; res.<span style="color: #00eeff;">push_back</span> <span style="color: #000000;">&#40;</span>text.<span style="color: #00eeff;">substr</span><span style="color: #000000;">&#40;</span>i<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span style="color: #0000ff;">return</span> res;<br />
<span style="color: #000000;">&#125;</span></div>
</div>
</div>
<p>
Na koniec zwrócę jeszcze uwagę na to, że czasami trzeba ostrożnie postępować z rezultatem <em>splitu</em>. Zdecydowana większość wersji tej operacji dopuszcza, by w wynikowej tablicy występowały puste ciągi. Odpowiadają one kilku kolejnym wystąpieniom separatora lub jego obecnością na początku bądź końcu ciągu. Jeśli nie są one nam potrzebne (a rzadko są), to należy je zignorować lub usunąć.</p>
<img src="http://feeds.feedburner.com/~r/xion/~4/dqy6TWZ7RgU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xion.org.pl/2010/07/02/split/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Prosty menedżer zasobów?…</title>
		<link>http://xion.org.pl/2010/06/28/prosty-menedzer-zasobow/</link>
		<comments>http://xion.org.pl/2010/06/28/prosty-menedzer-zasobow/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 16:09:12 +0000</pubDate>
		<dc:creator>Xion</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Przemyślenia]]></category>
		<category><![CDATA[DirectX]]></category>
		<category><![CDATA[menedżer zasobów]]></category>
		<category><![CDATA[programowanie gier]]></category>
		<category><![CDATA[zasoby]]></category>

		<guid isPermaLink="false">http://xion.org.pl/?p=1931</guid>
		<description><![CDATA[Silnikologia (przynajmniej ta warsztatowa) ma swoje dziwnostki. Za jedną z nich uważam przykładanie zbyt dużego znaczenia do tych podsystemów engine'u gry, które są zdecydowanie mniej ważne niż silnik graficzny czy fizyczny. Podpadają pod to (między innymi): mechanizmy logowania, VFS-y (wirtualne systemy plików), kod odpowiedzialny za wczytywanie i zapisywanie opcji konfiguracyjnych, itp. Blisko szczytu tej listy [...]]]></description>
			<content:encoded><![CDATA[<p>Silnikologia (przynajmniej ta <a href="http://gamedev.pl">warsztatowa</a>) ma swoje dziwnostki. Za jedną z nich uważam przykładanie zbyt dużego znaczenia do tych podsystemów <em>engine</em>'u gry, które są zdecydowanie mniej ważne niż silnik graficzny czy fizyczny. Podpadają pod to (między innymi): mechanizmy logowania, VFS-y (wirtualne systemy plików), kod odpowiedzialny za wczytywanie i zapisywanie opcji konfiguracyjnych, itp. Blisko szczytu tej listy znajduje się też podsystem, o którym chcę napisać dzisiaj kilka słów. Chodzi mianowicie o <strong>menedżer zasobów</strong> (<em>resource manager</em>).</p>
<p>Pod tą nazwą kryję się obiekt, którego zadaniem jest - jak nazwa zresztą wskazuje - zarządzanie różnego rodzaju zasobami gry, gdzie pod pojęciem 'zasobu' kryje się zwykle jakiś element jej <em>contentu</em>: model, tekstura, próbka dźwiękowa, czcionka, shader... Menedżer ma za zadanie udostępniać odwołania do tych zasobów elementom silnika/gry, które ich potrzebują. To jest jego główny, nadrzędny cel.<br />
Tu jednak dochodzimy do małego paradoksu. Jeśli bowiem jest to <strong>jedyne</strong> przeznaczenie modułu od zarządzania zasobami, to tak naprawdę mogłoby go w ogóle nie być!... W praktyce jego istnienie usprawiedliwia przynajmniej jeden z poniższych powodów:</p>
<ul>
<li>jednoczesne załadowanie wszystkich zasobów gry czy nawet pojedynczego etapu/krainy/lokacji/itp. nie jest możliwe z uwagi na ograniczony rozmiar pamięci</li>
<li>ładowanie zasobów trwa na tyle długo, że rozsądne jest wydzielenie tego procesu do osobnego wątku</li>
<li>kompatybilność z DirectX w wersjach poniżej 9Ex wymaga obsługi zjawiska utraty urządzenia, a więc ponownego wczytania zasobów umieszczonych w pamięci karty graficznej</li>
<li>między poszczególnymi zasobami występują zależności, które nie pozwalają na łatwe określenie prawidłowej kolejności ich zwalniania</li>
</ul>
<p>Tego rodzaju wymagania rzeczywiście można rozsądnie zrealizować dopiero wówczas, gdy w logiczny sposób wydzielimy z kodu część, która za kontrolę zasobów będzie odpowiadać. Jeśli jednak żadna z powyższych sytuacji nie aplikuje się do nas, nie ma żadnego powodu, by zabierać się za tworzenie modułu zarządzania zasobami tylko dlatego, że "przecież zasoby gdzieś muszą być". Coś takiego jak 'prosty menedżer zasobów' to oksymoron: jeśli faktycznie może być prosty, to najpewniej znaczy, iż jest zbędny. No, chyba że pod tym pojęciem rozumiemy też coś, co w praktyce da się zredukować do:</p>
<div class="syntax_hilite">
<div id="cpp-36">
<div class="cpp">Texture* sprites<span style="color: #000000;">&#91;</span>SPRITES_COUNT<span style="color: #000000;">&#93;</span>;<br />
Sound* sounds<span style="color: #000000;">&#91;</span>SOUNDS_COUNT<span style="color: #000000;">&#93;</span>;</div>
</div>
</div>
<p>
W takim przypadku powinniśmy zadbać przede wszystkich o to, by nasz Menedżer Zasobów (<em>caps intended</em>) dobrze współpracował z Modułem Wyświetlania Życia Gracza, że o Silniku Od Pauzy<sup>TM</sup> nie wspomnę ;P</p>
<img src="http://feeds.feedburner.com/~r/xion/~4/DsoGRJeLu_k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xion.org.pl/2010/06/28/prosty-menedzer-zasobow/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
