<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-24007926</id><updated>2011-11-28T01:57:39.187+01:00</updated><category term='linux'/><category term='screen'/><category term='snippet'/><category term='wiki'/><category term='wypoczynek'/><category term='konsola'/><category term='gdb'/><category term='killer'/><category term='C'/><category term='twidge'/><category term='c konsola'/><category term='wikiTranslate'/><category term='utf-8'/><category term='studia'/><category term='budzik'/><category term='zagadki'/><category term='reaktywacja'/><category term='pipe'/><category term='blog'/><category term='programowanie'/><category term='prolog'/><category term='C#'/><category term='religia'/><category term='opengl'/><category term='python'/><category term='handle'/><category term='twitter'/><category term='haskell'/><category term='skrypty'/><category term='GHC I/O'/><category term='libgmail'/><category term='ii'/><category term='screenshot'/><category term='plany'/><category term='gitit'/><category term='HAppS'/><title type='text'>Dziwne żyraf przypadki... i nie tylko</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>46</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-24007926.post-6169956326730239169</id><published>2009-08-01T15:56:00.004+02:00</published><updated>2009-08-01T16:03:09.916+02:00</updated><title type='text'>Zamykamy podwoje</title><content type='html'>Zdecydowałem o zamknięciu tego bloga, na korzyść dwóch nowych, które zamierzam otworzyć.&lt;br /&gt;&lt;br /&gt;Powodów jest kilka:&lt;br /&gt;&lt;br /&gt;1. Ten blog miesza rzeczy osobiste (głównie pierwsze wpisy) z wpisami typowo technicznymi. Osoby zainteresowane jednymi niekoniecznie będą zainteresowane drugimi, i odwrotnie.&lt;br /&gt;2. Jest on napisany po polsku, co uniemożliwia (ok, &lt;a href="http://tinyurl.com/n3xszd"&gt;utrudnia&lt;/a&gt;) wielu anglojęzycznym czytelnikom dotarcie do mojego bloga. Nie oszukujmy się, niewielu jest w Polsce programistów zainteresowanych Haskellem...&lt;br /&gt;3. Zmiana języka na angielski byłaby z kolei ciosem dla tych osób, które znają mnie osobiście i dla których czytanie o np. ostatniej wyprawie w góry jest bardziej naturalne w języku ojczystym. Tak jest mi z resztą wygodniej.&lt;br /&gt;4. Wreszcie denerwuje mnie sam blogger: jest w nim mnóstwo niedociągnięć które utrudniają codzienne użytkowanie tej platformy. Z tego względu nowe blogi będą znajdowały się na serwisie wordpress.com&lt;br /&gt;&lt;br /&gt;Bloga osobistego jeszcze nie założyłem.&lt;br /&gt;Blog techniczny dostępny jest pod adresem &lt;a href="http://mostlycode.wordpress.com"&gt;http://mostlycode.wordpress.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-6169956326730239169?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/6169956326730239169/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2009/08/zamykamy.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/6169956326730239169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/6169956326730239169'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2009/08/zamykamy.html' title='Zamykamy podwoje'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-8210397054903874488</id><published>2009-03-31T15:14:00.003+02:00</published><updated>2009-03-31T15:29:25.196+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='snippet'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='konsola'/><category scheme='http://www.blogger.com/atom/ns#' term='skrypty'/><title type='text'>Odtwarzanie muzyki z linii komend</title><content type='html'>Bardzo często zdarza mi się odtwarzać muzykę mplayerem. Jest to odtwarzacz konsolowy, co sprawia pewne kłopoty. Brakuje mu także opcji odtwarzania wszystkich utworów z danego katalogu i podkatalogów.&lt;br /&gt;&lt;br /&gt;Oto rozwiązanie tego problemu za pomocą narzędzia &lt;b&gt;find&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;$ find -type f -printf "`pwd`/%p\n" | shuf &gt; /tmp/pls &amp;&amp; mplayer -playlist /tmp/pls&lt;br /&gt;&lt;br /&gt;Kilka uwag:&lt;br /&gt;- używam komendy "shuf" aby zrandomizować listę odtwarzanych utworów. mplayer posiada opcję -shuffle, ale powoduje ona losowanie przy każdej zmianie utworu. shuf ustala jedną permutację listy, dzięki czemu można się cofnąć do odegranego już utworu&lt;br /&gt;- lista tworzona jest w /tmp/pls. Można uprościć polecenie find jeżeli zapiszemy ją w aktualnym katalogu:&lt;br /&gt;&lt;br /&gt;$ find -type f | shuf &gt; pls &amp;&amp; mplayer -playlist pls&lt;br /&gt;Ja nie chcę jednak sobie zaśmiecać katalogów playlistami.&lt;br /&gt;&lt;br /&gt;Można wreszcie nie używać pliku pomocniczego, a korzystać z przekierowania strumieni:&lt;br /&gt;&lt;br /&gt;$ find -type f | shuf | mplayer -playlist -&lt;br /&gt;&lt;br /&gt;Wtedy jednak nie można sterować mplayerem, np. zmniejszając głośność lub zmieniając utwór. W tym momencie shuf staje się zbędny.&lt;br /&gt;&lt;br /&gt;$ find -type f | mplayer -shuffle -playlist -&lt;br /&gt;&lt;br /&gt;Na dobrą sprawę możemy pominąć także parametr "-type f" który mówi find by wyświetlał jedynie pliki, a pomijał katalogi.&lt;br /&gt;&lt;br /&gt;$ find | mplayer -shuffle -playlist -&lt;br /&gt;&lt;br /&gt;W ostateczności można też słuchać plików w kolejności podawanej przez find:&lt;br /&gt;&lt;br /&gt;$ find | mplayer -playlist -&lt;br /&gt;&lt;br /&gt;I tak wygląda komenda od której zacząłem :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-8210397054903874488?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/8210397054903874488/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2009/03/odtwarzanie-muzyki-z-linii-komend.html#comment-form' title='Komentarze (8)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/8210397054903874488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/8210397054903874488'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2009/03/odtwarzanie-muzyki-z-linii-komend.html' title='Odtwarzanie muzyki z linii komend'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-6313414201050708239</id><published>2009-02-22T01:28:00.004+01:00</published><updated>2009-02-22T01:42:59.693+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>Instancja klasy Show dla funkcji</title><content type='html'>Wbrew pozorom łatwo napisać taką instancję. Nie będzie ona spełniała warunku &lt;br /&gt;&amp;gt; (read . show) == id&lt;br /&gt;ale może być użyteczna. Można ją znaleźć w przypadku GHC 6.10 w module &lt;a href="http://www.haskell.org/ghc/docs/latest/html/libraries/base/Text-Show-Functions.html"&gt;Text.Show.Functions&lt;/a&gt;. Wygląda ona tak:&lt;br /&gt;&lt;br /&gt;instance Show (a -&gt; b) where&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  showsPrec _ _ = showString "&amp;lt;function&amp;gt;"&lt;br /&gt;&lt;br /&gt;Dzisiaj wpadłem na nieco pożyteczniejszą formę. Niestety, wszystko ma swoją cenę - zadziała ona tylko dla funkcji których argumenty są elementami klasy Typeable.&lt;br /&gt;&lt;br /&gt;instance (Typeable a, Typeable b) =&gt; Show (a -&gt; b) where&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    show _ = "&amp;lt;function: " ++ show (typeOf (undefined :: a)) ++ " -&amp;gt; " ++ show (typeOf (undefined :: b)) ++ "&amp;gt;"&lt;br /&gt;&lt;br /&gt;Przykładowe działanie:&lt;br /&gt;*Main&amp;gt; print print&lt;br /&gt;Loading package syb ... linking ... done.&lt;br /&gt;&amp;lt;function: () -&amp;gt; IO ()&amp;gt;&lt;br /&gt;*Main&amp;gt; :set -Wall&lt;br /&gt;*Main&amp;gt; print print&lt;br /&gt;&lt;br /&gt;&amp;lt;interactive&amp;gt;:1:6:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    Warning: Defaulting the following constraint(s) to type `()'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;             `Show a' arising from a use of `print' at &amp;lt;interactive&amp;gt;:1:6-10&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;             `Typeable a' arising from a use of `print' at &amp;lt;interactive&amp;gt;:1:0-10&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    In the first argument of `print', namely `print'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    In a stmt of a 'do' expression: it &amp;lt;- print print&lt;br /&gt;&amp;lt;function: () -&amp;gt; IO ()&amp;gt;&lt;br /&gt;*Main&amp;gt; print putStrLn&lt;br /&gt;&amp;lt;function: [Char] -&amp;gt; IO ()&amp;gt;&lt;br /&gt;*Main&amp;gt; print id&lt;br /&gt;&lt;br /&gt;&amp;lt;interactive&amp;gt;:1:0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    Ambiguous type variable `a' in the constraint:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;      `Typeable a' arising from a use of `print' at &amp;lt;interactive&amp;gt;:1:0-7&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    Probable fix: add a type signature that fixes these type variable(s)&lt;br /&gt;*Main&amp;gt; print (id :: Int -&amp;gt; Int)&lt;br /&gt;&amp;lt;function: Int -&amp;gt; Int&amp;gt;&lt;br /&gt;*Main&amp;gt; print (undefined :: Int -&amp;gt; Int -&amp;gt; Int)&lt;br /&gt;&amp;lt;function: Int -&amp;gt; Int -&amp;gt; Int&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-6313414201050708239?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/6313414201050708239/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2009/02/instancja-klasy-show-dla-funkcji.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/6313414201050708239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/6313414201050708239'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2009/02/instancja-klasy-show-dla-funkcji.html' title='Instancja klasy Show dla funkcji'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-1505846309930577468</id><published>2009-02-11T12:47:00.004+01:00</published><updated>2009-02-11T13:03:48.543+01:00</updated><title type='text'>Rozmowa o pracę</title><content type='html'>Stanowisko: informatyk / programista.&lt;br /&gt;&lt;br /&gt;Tak, wiem, że to dość ogólne określenie. Nie mniej jednak ktokolwiek przychodzi na rozmowę kwalifikacyjną i wpisuje w CV znajomość C++ powinien oczekiwać, że poprosi się go o napisanie jakiegoś programu. Prostego. Na przykład liczącego n-ty element ciągu Fibonacciego. Prosty, banalny wręcz program.&lt;br /&gt;&lt;br /&gt;Nie oczekuję wersji jedno-dwulinijkowej w Haskellu:&lt;br /&gt;&lt;br /&gt;fib n = fibs !! n&lt;br /&gt;fibs = 0 : 1 : (zipWith (+) fibs (tail fibs)) :: [Integer]&lt;br /&gt;&lt;br /&gt;Nie oczekuję też rozwiązania powiązanego równania rekurencyjnego i napisania tej funkcji tak, by działała w czasie (praktycznie) stałym (zostawiam to zadanie czytelnikom).&lt;br /&gt;&lt;br /&gt;Oczekuję prostej definicji w C. Ba, może być nawet taka, która ma złożoność wykładniczą!&lt;br /&gt;&lt;br /&gt;int fib(int n)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   if (n==0) return 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   if (n==1) return 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   return fib(n-1) + fib(n-2);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Jak widać powyżej nie ma nawet sprawdzenia czy argument jest ujemny czy też nie. Pisanie powyższych kilku linijek przez pół godziny (i to bez powodzenia...) to strata czasu - obu stron.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-1505846309930577468?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/1505846309930577468/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2009/02/rozmowa-o-prace.html#comment-form' title='Komentarze (9)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/1505846309930577468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/1505846309930577468'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2009/02/rozmowa-o-prace.html' title='Rozmowa o pracę'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-7644007024524239814</id><published>2009-02-03T00:37:00.004+01:00</published><updated>2009-02-11T13:01:37.683+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='utf-8'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>Przetestuj, jak TWOJA przeglądarka renderuje UTF-8</title><content type='html'>A tak na prawdę to tylko krótki programik do wypisania wszystkich znaków rozpoznawanych jako litery w kodowaniu UTF-8.&lt;br /&gt;&lt;br /&gt;&gt; module Main where&lt;br /&gt;&gt; import Prelude hiding ( writeFile )&lt;br /&gt;&gt; import System.IO.UTF8 ( writeFile )-- package 'utf8-string' on Hackage&lt;br /&gt;&gt; import Data.List.Split ( splitEvery ) -- package 'split' on Hackage&lt;br /&gt;&gt; import Data.Char ( isAlpha )&lt;br /&gt;&gt; import Data.List ( intercalate )&lt;br /&gt;&gt; main = writeFile "out.html" (header ++ chars ++ footer)&lt;br /&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       where&lt;br /&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;        header = "&amp;lt;HTML&amp;gt;&amp;lt;HEAD&amp;gt;&amp;lt;META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=utf-8\"&amp;gt;&amp;lt;/HEAD&amp;gt;&amp;lt;BODY&amp;gt;"&lt;br /&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;        chars = intercalate "\n&amp;lt;br&amp;gt;" . splitEvery 40 . filter isAlpha $ [ minBound .. maxBound ]&lt;br /&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;        footer = "&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;"&lt;br /&gt;&lt;br /&gt;Przykładowy wynik działania znajduje się &lt;a href="http://173.45.236.216/~tener/utf8-chars.html"&gt;tutaj&lt;/a&gt;. Treść tego posta jest jednocześnie kodem programu - wystarczy zaznaczyć całość, skopiować i zapisać z rozszerzeniem .lhs. Zrozumie go GHC, choć do uruchomienia będą potrzebne dodatkowe pakiety (patrz kod programu).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-7644007024524239814?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/7644007024524239814/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2009/02/przetestuj-jak-twoja-przegladarka.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/7644007024524239814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/7644007024524239814'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2009/02/przetestuj-jak-twoja-przegladarka.html' title='Przetestuj, jak TWOJA przeglądarka renderuje UTF-8'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-8131124925278296201</id><published>2009-02-01T12:36:00.003+01:00</published><updated>2009-02-01T12:52:05.981+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><title type='text'>Evil macro magic</title><content type='html'>Ostatnio w zobaczyłem ciekawy fragment kodu (C++):&lt;br /&gt;&lt;br /&gt;#include "settings.hpp"&lt;br /&gt;/* evil macro magic */&lt;br /&gt;#undef _SETTINGS_HPP&lt;br /&gt;#define extern &lt;br /&gt;#include "settings.hpp"&lt;br /&gt;#undef extern&lt;br /&gt;&lt;br /&gt;Ciężko mi skomentować tak ciężkie nadużycie - które z drugiej strony jest genialne :-) Wyjaśnienie: powyższe linijki sprawiają, że wszystkie deklaracje "extern" zmiennych w "settings.hpp" stają się zwykłymi deklaracjami. Może to prowadzić do bardzo nieprzyjemnych błędów, ale zapewne czasami jest to użyteczne.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-8131124925278296201?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/8131124925278296201/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2009/02/evil-macro-magic.html#comment-form' title='Komentarze (3)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/8131124925278296201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/8131124925278296201'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2009/02/evil-macro-magic.html' title='Evil macro magic'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-2037341677825781606</id><published>2009-01-30T04:50:00.002+01:00</published><updated>2009-01-30T04:53:31.855+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><title type='text'>Ciąg Fibonacciego</title><content type='html'>Chyba najkrótsza definicja jaką widziałem:&lt;br /&gt;&lt;br /&gt;&gt; import Control.Monad.Fix&lt;br /&gt;&gt; fibs :: [Integer]&lt;br /&gt;&gt; fibs = fix ((0:) . scanl (+) 1)&lt;br /&gt;&lt;br /&gt;Haskell FTW!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-2037341677825781606?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/2037341677825781606/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2009/01/ciag-fibonacciego.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/2037341677825781606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/2037341677825781606'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2009/01/ciag-fibonacciego.html' title='Ciąg Fibonacciego'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-5051289845066534801</id><published>2009-01-07T03:19:00.005+01:00</published><updated>2009-01-07T03:40:12.211+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='screen'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='c konsola'/><category scheme='http://www.blogger.com/atom/ns#' term='gdb'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='twidge'/><category scheme='http://www.blogger.com/atom/ns#' term='killer'/><title type='text'>Zabawy z Twitterem i GDB</title><content type='html'>Dzisiaj miałem potrzebę uruchomić serwer gry Killer Mud na debuggerze gdb: wczorajsze zmiany w kodzie spowodowały, że w ciągu doby serwer 3 razy się wywalił. Ponieważ chcę mieć możliwość debugowania kodu w przypadku jakichkolwiek problemów proces zostanie zamrożony. Sesja GDB uruchomiona jest spod screen'a, dzięki czemu nie muszę być zalogowany na serwerze by program mimo wszystko działał.&lt;br /&gt;&lt;br /&gt;Tutaj jednak pojawia się problem: skąd mam wiedzieć, że program ciągle działa? Chciałbym dostawać jakieś powiadomienie w razie wystąpienia problemu. Poszperałem w paru źródłach, założyłem konto na Twitterze i ostatecznie stworzyłem taki oto plik &lt;i&gt;.gdbinit&lt;/i&gt;:&lt;br /&gt;                                                                   &lt;br /&gt;                                                                   &lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;define hook-run&lt;br /&gt;&lt;br /&gt;set logging overwrite off&lt;br /&gt;set logging file killer-gdb-log.txt&lt;br /&gt;set logging on&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;define hook-stop&lt;br /&gt;&lt;br /&gt;backtrace&lt;br /&gt;&lt;br /&gt;shell rm -rf hook-stop-log.txt&lt;br /&gt;shell tail -n 50 killer-gdb-log.txt &gt;&gt; hook-stop-log.txt&lt;br /&gt;shell echo "----------------------" &gt;&gt; hook-stop-log.txt&lt;br /&gt;shell tail -n 50 killer-run-log.txt &gt;&gt; hook-stop-log.txt&lt;br /&gt;&lt;br /&gt;shell tar -czf killer-gdb-log.txt.tgz killer-gdb-log.txt&lt;br /&gt;shell tar -czf killer-run-log.txt.tgz killer-run-log.txt&lt;br /&gt;&lt;br /&gt;shell echo | mail -a killer-gdb-log.txt.tgz -a killer-run-log.txt.tgz -q "hook-stop-log.txt" -s "killer :: gdb :: hook-stop" ADRES@MAILOWY.COM&lt;br /&gt;shell ~/tener/twidge update "killer :: gdb :: hook-stop"&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;define hook-continue&lt;br /&gt;&lt;br /&gt;shell ~/tener/twidge update "killer :: gdb :: hook-continue"&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/blockquote&gt;                                            &lt;br /&gt;&lt;br /&gt;Jak można się domyśleć, o zatrzymaniu muda wysyłane są powiadomienia na Twittera, podobnie o kontynuacji jego uruchomienia. Przy zatrzymaniu wysyłany jest także mail.&lt;br /&gt;&lt;br /&gt;Stworzenie sesji jest dość proste:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;screen&lt;br /&gt;cd ~/mud/area&lt;br /&gt;gdb ../src/rom&lt;br /&gt;run 3000 &gt;&gt; killer-run-log.txt 2&gt;&amp;1&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Teraz robimy tylko "Ctrl-a d" i mamy działającą w tle sesję GDB.&lt;br /&gt;&lt;br /&gt;Garść linków:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Screen: &lt;a href="http://en.wikipedia.org/wiki/GNU_Screen"&gt; http://en.wikipedia.org/wiki/GNU_Screen&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;GDB, manual: &lt;a href="http://www.linuxtopia.org/online_books/redhat_linux_debugging_with_gdb/index.html"&gt;http://www.linuxtopia.org/online_books/redhat_linux_debugging_with_gdb/index.html&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Twitter: &lt;a href="http://twitter.com"&gt;http://twitter.com&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Twidge, klient Twittera napisany w Haskellu: &lt;a href="http://software.complete.org/software/projects/show/twidge"&gt;http://software.complete.org/software/projects/show/twidge&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;moje konto na Twitterze: &lt;a href="http://twitter.com/tener"&gt;http://twitter.com/tener&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;konto muda na Twitterze: &lt;a href="http://twitter.com/killermud"&gt;http://twitter.com/killermud&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-5051289845066534801?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/5051289845066534801/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2009/01/zabawy-z-twitterem-i-gdb.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/5051289845066534801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/5051289845066534801'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2009/01/zabawy-z-twitterem-i-gdb.html' title='Zabawy z Twitterem i GDB'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-2740908211199148891</id><published>2008-11-23T15:06:00.003+01:00</published><updated>2008-11-23T15:30:59.960+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zagadki'/><category scheme='http://www.blogger.com/atom/ns#' term='prolog'/><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><title type='text'>Cthulhu nonogram</title><content type='html'>Na stronie &lt;i&gt;Unspeakable Vault of Doom&lt;/i&gt; http://www.macguff.fr/goomi/unspeakable/weblog.html znajduje się zagadka - nonogram:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.macguff.fr/goomi/unspeakable/WEBIMAGES/GUEST/picross_cthulhu.empty.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 600px; height: 600px;" src="http://www.macguff.fr/goomi/unspeakable/WEBIMAGES/GUEST/picross_cthulhu.empty.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Rozwiązanie jest proste - szczególnie gdy ma się program który jest w stanie to zrobić :-) Napisałem go na programowanie logiczne. Działa całkiem dobrze, rozwiązanie znajduje &lt;i&gt;bardzo&lt;/i&gt; szybko.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace; font-size: 13;"&gt;&lt;br /&gt;| ?- cthulhu(R,W), nono(R,W,O), rysuj(O).&lt;br /&gt;####################&lt;br /&gt;#####.##########..##&lt;br /&gt;#.######.####.###..#&lt;br /&gt;######.....######..#&lt;br /&gt;#####.......####..##&lt;br /&gt;##.##.......########&lt;br /&gt;####.........#####.#&lt;br /&gt;####.........#######&lt;br /&gt;...#....#....###....&lt;br /&gt;...#..#.#....###....&lt;br /&gt;.#..#.#.#....###..#.&lt;br /&gt;###.#.......###..###&lt;br /&gt;#.##.#......###.##.#&lt;br /&gt;.#.###.#....#####.#.&lt;br /&gt;.#.##...#..##.##..#.&lt;br /&gt;####..#.#..#..##.###&lt;br /&gt;#.##.##.##..#..###.#&lt;br /&gt;...#..#.#.#.#..##...&lt;br /&gt;..#.###.#.#.#..##...&lt;br /&gt;..#....#.#.##..##...&lt;br /&gt;&lt;br /&gt;O = [[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1],[1,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,0,0,1],[1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,1],[1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1],[1,1,0,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1],[1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1],[1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1],[0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0],[0,0,0,1,0,0,1,0,1,0,0,0,0,1,1,1,0,0,0,0],[0,1,0,0,1,0,1,0,1,0,0,0,0,1,1,1,0,0,1,0],[1,1,1,0,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1],[1,0,1,1,0,1,0,0,0,0,0,0,1,1,1,0,1,1,0,1],[0,1,0,1,1,1,0,1,0,0,0,0,1,1,1,1,1,0,1,0],[0,1,0,1,1,0,0,0,1,0,0,1,1,0,1,1,0,0,1,0],[1,1,1,1,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,1],[1,0,1,1,0,1,1,0,1,1,0,0,1,0,0,1,1,1,0,1],[0,0,0,1,0,0,1,0,1,0,1,0,1,0,0,1,1,0,0,0],[0,0,1,0,1,1,1,0,1,0,1,0,1,0,0,1,1,0,0,0],[0,0,1,0,0,0,0,1,0,1,0,1,1,0,0,1,1,0,0,0]]&lt;br /&gt;R = [[20],[5,10,2],[1,6,4,3,1],[6,6,1],[5,4,2],[2,2,8],[4,5,1],[4,7],[1,1,3],[1,1,1,3],[1,1,1,1,3,1],[3,1,3,3],[1,2,1,3,2,1],[1,3,1,5,1],[1,2,1,2,2,1],[4,1,1,1,2,3],[1,2,2,2,1,3,1],[1,1,1,1,1,2],[1,3,1,1,1,2],[1,1,1,2,2]]&lt;br /&gt;W = [[8,2,2],[2,5,2,3],[5,2,2,2,2],[10,6],[6,2,2,1],[1,2,2,1,1],[3,2,4],[3,1,1],[2,3,5],[3,1,1],[3,2],[4,2,1],[6,4,4],[2,11],[16],[11,7],[1,2,3,2,4],[1,3,2,2],[2,2,1,2,3],[8,2,2]] ? ;&lt;br /&gt;&lt;br /&gt;(74 ms) no&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Po przekształceniu rozwiązania na bitmapę:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://tener.videomed.com.pl/cthulhu.png"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-2740908211199148891?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/2740908211199148891/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/11/cthulhu-nonogram.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/2740908211199148891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/2740908211199148891'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/11/cthulhu-nonogram.html' title='Cthulhu nonogram'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-840130747908176261</id><published>2008-11-23T03:06:00.003+01:00</published><updated>2008-11-23T03:43:22.908+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wikiTranslate'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='wiki'/><title type='text'>Pierwsza wersja wikiTranslate - 0.0</title><content type='html'>Posiedziałem dzisiaj nieco nad wikiTranslate i stworzyłem jego pierwszą, testową wersję. Nie ma tego dużo - "wc -l *.hs" mówi o 44 linijkach. A tak na prawdę istotnych jest 16 z nich. Reszta to importy oraz moduł pomocniczy - pakiet "download-curl" nie chce się instalować na Windowsach więc napisałem mikro moduł który może go do pewnego stopnia zastąpić.&lt;br /&gt;&lt;br /&gt;Wymagane pakiety: utf8-string, xml-light, tagsoup. &lt;br /&gt;Zalecane: download-curl.&lt;br /&gt;&lt;br /&gt;Ściągnąć z &lt;a href="http://tener.videomed.com.pl/wt/"&gt;tej&lt;/a&gt; strony.&lt;br /&gt;&lt;br /&gt;Krótka instrukcja.&lt;br /&gt;&lt;br /&gt;1. Ściągamy i rozpakowujemy (wt.7z zawiera archiwa dla Linuxa i Windowsa)&lt;br /&gt;2. Uruchamiamy program w konsoli podając jako parametry słowa do przetłumaczenia&lt;br /&gt;3. Program wypisuje nam tłumaczenie na ekran&lt;br /&gt;&lt;br /&gt;Wszystko działa fajnie tylko... pewne rzeczy są na stałe zaszyte w programie:&lt;br /&gt;- język źródłowy: domyślnie polski ("pl"). Patrz "baseLanguge" w pliku wt.hs&lt;br /&gt;- języki docelowe: ustawione na sztywno są nastepujące języki:&lt;br /&gt;&gt; filterLang = ["en","it","pt","de"]&lt;br /&gt;&lt;br /&gt;Aby zmienić te stałe należy wyedytować plik wt.hs i zrekompilować program. Zakładam znajomość ghc - to jest wersja alpha więc nie osoby do których ma trafić ten post powinny potrafić sobie z tym poradzić :-)&lt;br /&gt;&lt;br /&gt;TODO w kolejności priorytetów:&lt;br /&gt;- wczytywanie języka źródłowego i języków docelowych z linii poleceń&lt;br /&gt;- lepsze radzenie sobie z UTF8 - rosyjski wychodzi beznadziejnie&lt;br /&gt;- WebUI&lt;br /&gt;- radzenie sobie ze stronami "disambiguation"&lt;br /&gt;&lt;br /&gt;Na deser wynik przykładowego zapytania&lt;br /&gt;--- cut ---&lt;br /&gt;[tener@tenserwer wikiTranslate]$ ./wt "Algorytm A*" dąb wikipedia polska wrocław "piłka nożna" "macierz odwracalna" "rachunek lambda"&lt;br /&gt;Translations for term "Algorytm A*" in language "pl"&lt;br /&gt;de A*-Algorithmus&lt;br /&gt;en A* search algorithm&lt;br /&gt;it A*&lt;br /&gt;pt Algoritmo A*&lt;br /&gt;------------------------------&lt;br /&gt;Translations for term "dÂąb" in language "pl"&lt;br /&gt;de Eichen&lt;br /&gt;en Oak&lt;br /&gt;it Quercus&lt;br /&gt;pt Carvalho&lt;br /&gt;------------------------------&lt;br /&gt;Translations for term "wikipedia" in language "pl"&lt;br /&gt;de Wikipedia&lt;br /&gt;en Wikipedia&lt;br /&gt;it Wikipedia&lt;br /&gt;pt WikipĂÂŠdia&lt;br /&gt;------------------------------&lt;br /&gt;Translations for term "polska" in language "pl"&lt;br /&gt;de Polen&lt;br /&gt;en Poland&lt;br /&gt;it Polonia&lt;br /&gt;pt PolĂÂłnia&lt;br /&gt;------------------------------&lt;br /&gt;Translations for term "wrocÂław" in language "pl"&lt;br /&gt;de Breslau&lt;br /&gt;en WrocĂ&lt;br /&gt;Âaw&lt;br /&gt;it Breslavia&lt;br /&gt;pt WrocĂ&lt;br /&gt;Âaw&lt;br /&gt;------------------------------&lt;br /&gt;Translations for term "piÂłka noÂżna" in language "pl"&lt;br /&gt;de FuĂÂball&lt;br /&gt;en Association football&lt;br /&gt;it Calcio (sport)&lt;br /&gt;pt Futebol&lt;br /&gt;------------------------------&lt;br /&gt;Translations for term "macierz odwracalna" in language "pl"&lt;br /&gt;de RegulĂÂ¤re Matrix&lt;br /&gt;en Invertible matrix&lt;br /&gt;it Matrice invertibile&lt;br /&gt;pt Matriz inversa&lt;br /&gt;------------------------------&lt;br /&gt;Translations for term "rachunek lambda" in language "pl"&lt;br /&gt;de Lambda-KalkĂÂźl&lt;br /&gt;en Lambda calculus&lt;br /&gt;it Lambda calcolo&lt;br /&gt;pt CĂÂĄlculo lambda&lt;br /&gt;------------------------------&lt;br /&gt;&lt;br /&gt;--- cut ---&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-840130747908176261?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/840130747908176261/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/11/pierwsza-wersja-wikitranslate-00.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/840130747908176261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/840130747908176261'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/11/pierwsza-wersja-wikitranslate-00.html' title='Pierwsza wersja wikiTranslate - 0.0'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-4014539567706183878</id><published>2008-11-11T23:24:00.003+01:00</published><updated>2008-11-12T00:32:29.194+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='snippet'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='pipe'/><category scheme='http://www.blogger.com/atom/ns#' term='GHC I/O'/><category scheme='http://www.blogger.com/atom/ns#' term='handle'/><title type='text'>I gdzie jest błąd?</title><content type='html'>Ostatnio na liście mailingowej &lt;a href="http://www.haskell.org/mailman/listinfo/haskell-cafe"&gt;haskell-cafe&lt;/a&gt; kilka razy padło pytanie o niedziałający z jakiegoś powodu program. W każdym z tych okazało się że problem leżał po stronie programisty :-)&lt;br /&gt;&lt;br /&gt;Zadanie jest proste: uruchamiamy pewien proces, karmimy go danymi i oczekujemy od niego odpowiedzi. Naiwny kod wygląda tak:&lt;br /&gt;&lt;br /&gt;&gt; (p_stdin, p_stdout, p_stderr, p_handle) &lt;- runInteractiveCommand jakas_komenda&lt;br /&gt;&gt; hPut p_stdin jakies_dane&lt;br /&gt;&gt; odpowiedz &lt;- hGet p_stdout&lt;br /&gt;&lt;br /&gt;Powyższy kod może, ale nie musi zadziałać. Co więcej: może raz działać dla danego programu, a raz nie działać. Prowadzi to do trudnych do debugowania i przez to irytujących błędów. Niestety: problem wynika z nieznajomości semantyki kanałów (ang. pipe - moje tłumaczenie jest chałupnicze) pomiędzy procesami. &lt;br /&gt;&lt;br /&gt;Połączenia te mają ograniczoną pojemność "bufora". Po jego zapełnieniu proces który próbuje go "przepełnić" jest usypiany, aż bufor zostanie nieco opróżniony. Jest to (całkowicie słuszny) środek zaradczy przeciwko zużyciu przez nadgorliwy proces wszelkich zasobów systemu - w przeciwnym wypadku system musiałby przechować dowolnie dużo danych które zapisał dany proces. Bufor ten może być dość niewielki, np. 300 kb.&lt;br /&gt;&lt;br /&gt;Jaki to ma związek z powyższym kodem? Ano taki, że w wyniku takiego właśnie działania kanałów kod ten powoduje często &lt;i&gt;deadlocks&lt;/i&gt; - zakleszczenia.&lt;br /&gt;&lt;br /&gt;Oto co się dzieje.&lt;br /&gt;&lt;br /&gt;Uruchamiamy wysyłanie danych do naszego procesu:&lt;br /&gt;&lt;br /&gt;&gt; hPut p_stdin jakies_dane&lt;br /&gt;&lt;br /&gt;Ale ów proces nie konsumuje ich na raz w całości. Zamiast tego zaczyna wysyłać częściowe porcje danych które wędrują do p_stdout. Wysyła ich na tyle dużo, że bufor p_stdout zapełnia się. Zostaje więc uśpiony. Aby został obudzony musimy odebrać z p_stdout porcję danych. Ale nie możemy tego zrobić - jeszcze nie skończyliśmy wysyłać mu danych na p_stdin!&lt;br /&gt;&lt;br /&gt;Rozwiązanie jest proste: należy uruchomić &lt;i&gt;wysyłanie&lt;/i&gt; danych w innym wątku:&lt;br /&gt;&gt; forkIO (hPut p_stdin jakies_dane)&lt;br /&gt;&lt;br /&gt;W tym momencie jeden wątek będzie realizował wysyłanie danych, a drugi odbieranie. Co prawda jeden z nich może zostać uśpiony (bo np. proces nie odebrał jeszcze wszystkich danych i wykonuje teraz jakieś obliczenia) ale nie spowoduje to zakleszczenia.&lt;br /&gt;&lt;br /&gt;Scenariusz może się jeszcze bardziej skomplikować, jeżeli interesuje nas równocześnie wyjście z p_stderr. W tym momencie ten kod także będzie błędny:&lt;br /&gt;&lt;br /&gt;&gt; (p_stdin, p_stdout, p_stderr, p_handle) &lt;- runInteractiveCommand jakas_komenda&lt;br /&gt;&gt; hPut p_stdin jakies_dane&lt;br /&gt;&gt; odpowiedz &lt;- hGet p_stdout&lt;br /&gt;&gt; odpowiedz_stderr &lt;- hGet p_stderr&lt;br /&gt;&lt;br /&gt;Dlaczego? Proces może zapełnić bufor p_stderr i zostać uśpiony zanim zamknie swoje standardowe wyjście (dzięki czemu wywołanie "hGet p_stdout" się skończyłoby się i zaczelibyśmy opróżniać p_stderr).&lt;br /&gt;&lt;br /&gt;Rozwiązanie w tym przypadku jest nieco bardziej skomplikowane, jednak zaczyna się tutaj pojawiać pewien schemat:&lt;br /&gt;&lt;br /&gt;&gt; (p_stdin, p_stdout, p_stderr, p_handle) &lt;- runInteractiveCommand jakas_komenda&lt;br /&gt;&gt; forkIO (hPut p_stdin jakies_dane)&lt;br /&gt;&gt; mv &lt;- newEmptyMVar :: IO (MVar String)&lt;br /&gt;&gt; forkIO (hGet p_stdout &gt;&gt;= putMVar mv)&lt;br /&gt;&gt; odpowiedz_stderr &lt;- hGet p_stderr&lt;br /&gt;&gt; odpowiedz &lt;- takeMVar mv&lt;br /&gt;&lt;br /&gt;(Dla opisu MVar przeczytaj &lt;a href="http://plonacazyrafa.blogspot.com/2008/10/prosty-szablon-wizualizacji.html"&gt;ten post&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Co się tutaj wydarzyło? To co poprzednio: dodaliśmy nowy wątek który zajmuje się obsługą wejścia/wyjścia dla dokładnie jednego uchwytu (&lt;a href="http://www.haskell.org/ghc/docs/6.10.1/html/libraries/base/System-IO.html#t%3AHandle"&gt;Handle&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Zauważmy, że w poprawnym kodzie mamy dokładnie jeden wątek dla jednego uchwytu: jeden "główny" oraz dwa utworzone przez forkIO. Jest to ogólna reguła by unikać tego typu zakleszczeń.&lt;br /&gt;&lt;br /&gt;Uważny czytelnik zauważy, że w pewnym momencie odszedłem od słowa "kanał" (pipe) na korzyść słowa "uchwyt" (handle). O ile te pierwsze występują w przypadku komunikacji między procesami - i ten przypadek rozważamy - o tyle ten typ błędu występuje ogólnie dla typu uchwytów, które w GHC wykorzystywane są dla wielu typów operacji wejścia wyjścia - w szczególności dla połączeń sieciowych. W ich przypadku również może dochodzić do tego typu błędów.&lt;br /&gt;&lt;br /&gt;W każdym z powyżej zacytowanych kawałków kodu jest czai się jeszcze jeden typ błędu, wynikający z semantyki uchwytów w GHC. Jak możemy przeczytać w dokumentacji nieużywany uchwyt jest automatycznie zamykany &lt;i&gt;przez odśmiecacz&lt;/i&gt; (GC - garbage collector). Ma to ważną implikację: nie mamy gwarancji &lt;i&gt;kiedy&lt;/i&gt; to nastąpi. Dlatego też może się zdarzyć, że otworzymy zbyt wiele plików na raz i system odmówi nam otwarcia nowych deskryptorów pliku. RTS wyrzuci nam w tym momencie wyjątek którego prawdopodobnie nie złapiemy - i nasz program zostanie zabity. Stąd ważny nawyk programistyczny: nieużywane uchwyty zamykamy tak szybko jak tylko przestają nam być potrzebne i &lt;i&gt;nie&lt;/i&gt; liczymy w tym przypadku na pomoc systemu.&lt;br /&gt;&lt;br /&gt;Dla kompletności oto poprawny (mam nadzieję...) kod:&lt;br /&gt;&lt;br /&gt;&gt; (p_stdin, p_stdout, p_stderr, p_handle) &lt;- runInteractiveCommand jakas_komenda&lt;br /&gt;&gt; forkIO (hPut p_stdin jakies_dane &gt;&gt; hClose p_stdin)&lt;br /&gt;&gt; mv &lt;- newEmptyMVar :: IO (MVar String)&lt;br /&gt;&gt; forkIO (hGet p_stdout &gt;&gt;= putMVar mv &gt;&gt; hClose p_stdout)&lt;br /&gt;&gt; odpowiedz_stderr &lt;- hGet p_stderr&lt;br /&gt;&gt; odpowiedz &lt;- takeMVar mv&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-4014539567706183878?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/4014539567706183878/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/11/i-gdzie-jest-bd.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/4014539567706183878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/4014539567706183878'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/11/i-gdzie-jest-bd.html' title='I gdzie jest błąd?'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-1109067232699962762</id><published>2008-11-09T17:05:00.003+01:00</published><updated>2008-11-09T17:32:22.013+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='plany'/><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='HAppS'/><title type='text'>I na co tu się zdecydować?</title><content type='html'>Bardzo wielu programistów robi od czasu do czasu projekty "dla siebie". Nie ma w tym nic dziwnego: jest to okazja na stworzenie czegoś ciekawego i mniej lub bardziej użytecznego. Dla mnie najgorszym ograniczeniem w realizacji tego typu projektów jest czas: nie ma go na tyle by móc rozwijać wszystkie pomysły które przyjdą mi do głowy. Aktualnie mam ich kilka:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;MusicFS: Wirtualny system plików pod FUSE, odzwierciedlający kolekcję plików muzycznych. Podobne do biblioteki multimediów z foobar2000 czy WinAmpa. Za: potencjalnie przydatny, wykorzystanie FUSE, wykorzystanie baz danych (akurat na projekt z baz). Przeciw: nie potrzebuje tego tak bardzo, bo bibliotekę mam w foobar2000.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;SnapshotFS: podobnie jak wyżej wirtualny system plików pod FUSE. Prowadzi w tle kontrolę wersji, commity wykonywane w tle przy odmontowywaniu systemu, w wybranych odstępach czasu i na rządanie wysyłane przez dbus&lt;/li&gt;&lt;br /&gt;&lt;li&gt;WikiTranslate: program tłumaczący słowa z użyciem Wikipedii. Wyszukujemy hasło spośród wpisów na zadanej wersji językowej Wikipedii a nastepnie patrzymy na linki odsyłające do wersji artykułu napisanej w innych językach. Za: teraz muszę robić ten proces ręcznie. Przeciw: dość skomplikowana heurystyka, nieprzyjemne parsowanie strony&lt;/li&gt;&lt;br /&gt;&lt;li&gt;WikiTranslate-HAppS: interfejs webowy do WikiTranslate + cache. Za: możliwość udostępnienia narzędzia szerszej publiczności. Przeciw: trzeba najpierw napisać WikiTranslate, potrzebny jest serwer na którym można by to postawić&lt;/li&gt;&lt;br /&gt;&lt;li&gt;UniNotifier: demon obserwujący wybrane strony www i feedy. Przy znaczącej modyfikacji wysyła informację. Za: bardzo przydatne. Przeciw: dla każdej strony trzebaby pisać z natury brzydki ekstraktor istotnych informacji&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;I za co mam się zabrać?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-1109067232699962762?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/1109067232699962762/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/11/i-na-co-tu-si-zdecydowa.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/1109067232699962762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/1109067232699962762'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/11/i-na-co-tu-si-zdecydowa.html' title='I na co tu się zdecydować?'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-994837643676006503</id><published>2008-11-08T23:29:00.007+01:00</published><updated>2008-11-09T19:25:39.741+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='wiki'/><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='HAppS'/><category scheme='http://www.blogger.com/atom/ns#' term='gitit'/><title type='text'>gitit - silnik wiki napisany w Haskellu</title><content type='html'>Dzisiaj na listę mailingową Haskell-Cafe trafiła &lt;a href="http://www.haskell.org/pipermail/haskell-cafe/2008-November/050336.html"&gt;wiadomość&lt;/a&gt; ogłaszająca wydanie wersji 0.2 programu o nazwie &lt;i&gt;gitit&lt;/i&gt;. Jest to silnik wiki oparty o serwer &lt;a href="http://happs.org/"&gt;HAppS&lt;/a&gt;, system kontroli wersji &lt;a href="http://pl.wikipedia.org/wiki/Git_(oprogramowanie)"&gt;git&lt;/a&gt;, i bibliotekę do konwersji formatów znacznikowych &lt;a href="http://johnmacfarlane.net/pandoc/"&gt;pandoc&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Instalacja gitit z wykorzystaniem programu &lt;a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/cabal-instal"&gt;cabal-install&lt;/a&gt; jest bardzo prosta:&lt;br /&gt;&lt;i&gt;cabal update&lt;br /&gt;cabal install pandoc -fhighlighting&lt;br /&gt;cabal install gitit&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;A potem wystarczy już uruchomić go komendą&lt;br /&gt;&lt;i&gt;gitit&lt;/i&gt;&lt;br /&gt;i połączyć się na http://localhost:5001&lt;br /&gt;&lt;br /&gt;W trakcie instalacji ściągną się i skompilują automatycznie wszystkie potrzebne moduły. Niedawno gdy próbowałem zainstalować w podobny sposób samo HAppS okazało się, że pakiet ten wymaga pakietu unix, który z oczywistych względów nie zbuduje się zbyt łatwo pod Windowsem. Próbowałem tego dokonać z wykorzystaniem Cygwina - bezskutecznie.&lt;br /&gt;&lt;br /&gt;Niestety także i teraz rozbiłem się o ten problem. Nie chciało mi się za bardzo przełączać na Linuxa tylko po to by zainstalować ten program. Na dobrą sprawę mogę przecież obejrzeć jego demo tutaj: &lt;a href="http://johnmacfarlane.net:5001/"&gt;http://johnmacfarlane.net:5001/&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Moje wrażenia? Jak na tak wczesną wersję zapowiada się całkiem ciekawie. Sprytnym posunięciem jest skorzystanie z gita do zarządzania wersjami: w końcu nie ma sensu wymyślać dwa razy koła, prawda? Chętnie zobaczę jak działać będą przyszłe wersje tej aplikacji.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-994837643676006503?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/994837643676006503/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/11/gitit-silnik-wiki-napisany-w-haskellu.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/994837643676006503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/994837643676006503'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/11/gitit-silnik-wiki-napisany-w-haskellu.html' title='gitit - silnik wiki napisany w Haskellu'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-3788496657215277262</id><published>2008-10-31T14:34:00.008+01:00</published><updated>2008-11-03T19:37:58.633+01:00</updated><title type='text'>Czy polimorfizm w C# jest za słaby?</title><content type='html'>Polimorfizm jest bardzo przydatną cechą języków, która umożliwia skrócenie pisanego kodu, zwiększenie giętkości pisanych klas czy bibliotek, zwiększenie poziomu abstrakcji pisanego kodu - co w ostatecznym rozrachunku przekłada się na zmniejszenie nakładu pracy związanego z budową programu.&lt;br /&gt;&lt;br /&gt;W C# mamy dostępne tzw. generics (&lt;a href="http://msdn.microsoft.com/en-us/library/512aeb7t(VS.80).aspx"&gt;link&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Generic_programming#Templates_in_C.2B.2B"&gt;link&lt;/a&gt;). Umożliwiają one np. tworzenie kontenerów dla obiektów dowolnego typu, podobnie jak wygląda to w C++:&lt;br /&gt;[C#, 1]&lt;br /&gt;Queue&amp;lt;int&amp;gt; kolejka_intow = new Queue&amp;lt;int&amp;gt;();&lt;br /&gt;&lt;br /&gt;Wszystko wygląda fajnie, tylko że brakuje jednej rzeczy: możliwości "zaglądania" do obiektów polimorficznych. Nie możemy na przykład napisać funkcji:&lt;br /&gt;&lt;br /&gt;public static T addGenerics&amp;lt;T&amp;gt;(T a, T b)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return a + b;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Dlaczego? Kompilator słusznie wyrzuci nam:&lt;br /&gt;Operator '+' cannot be applied to operands of type 'T' and 'T'&lt;br /&gt;&lt;br /&gt;Z drugiej strony kod:&lt;br /&gt;&lt;br /&gt;[C#, 2]&lt;br /&gt;public static void testDoWithInstance()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    doWithInstance&amp;lt;int&amp;gt;(2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    doWithInstance&amp;lt;float&amp;gt;(2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    doWithInstance&amp;lt;string&amp;gt;("aaa");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    doWithInstance&amp;lt;int[]&amp;gt;(new int[] { 1, 2, 3 });&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static void doWithInstance&amp;lt;T&amp;gt;(T inst)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    System.Console.WriteLine(string.Format("&amp;lt;&amp;lt;{0}&amp;gt;&amp;gt;", inst));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Skompiluje się i wyświetli bez zarzutu:&lt;br /&gt;&lt;br /&gt;&amp;lt;&amp;lt;2&amp;gt;&amp;gt;&lt;br /&gt;&amp;lt;&amp;lt;2&amp;gt;&amp;gt;&lt;br /&gt;&amp;lt;&amp;lt;aaa&amp;gt;&amp;gt;&lt;br /&gt;&amp;lt;&amp;lt;System.Int32[]&amp;gt;&amp;gt;&lt;br /&gt;&lt;br /&gt;Gdzie tkwi więc problem? Kod typu [2] skompiluje się, a w razie problemów (obiekt T nie może być przekształcony na napis) rzuci wyjątek. Oczywiście ktoś mógłby powiedzieć, że wszystko można jakoś wyświetlić, ale to nie jest sedno problemu. Sednem problemu jest to, że nie odkrycie czy dany obiekt obsługuje jakąś metodę odsuwamy do momentu wykonania programu. C# staje się więc w ten sposób efektywnie językiem dynamicznym.&lt;br /&gt;&lt;br /&gt;Kod typu [1] natomiast wcale się nie będzie kompilować wcale. Kompilator nie wie z góry, czy obiekt typu T można dodać do drugiego obiektu typu T, innymi słowy czy obsługują one dodawanie. Można to obejść stosując mechanizm Reflection, który umożliwia analizowanie obiektów w trakcie wykonania programu. To rozwiązanie sprowadza się więc praktycznie do tego które mamy w [2], z tym, że nie możemy po prostu zrzutować danego obiektu na typ Object. Mechanizm Reflection ma dwie zasadnicze wady:&lt;br /&gt;- jest dynamiczny, generuje wyjątki w trakcie działania programu, nie błędy kompilacji&lt;br /&gt;- używanie go jest niewygodne i wymaga pisania dużych ilości dodatkowego kodu&lt;br /&gt;&lt;br /&gt;Rozwiązaniem jest wprowadzenie kontekstów w postaci interfejsów do typów parametrycznych. Gwarantowałyby one implementację zadanych metod. Przykładowo:&lt;br /&gt;&lt;br /&gt;[C#, 3]&lt;br /&gt;public static T f&amp;lt;T implementing IPlus, IMinus&amp;gt;( T a, T b)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    return (a + a - b);&lt;br /&gt;}&lt;br /&gt;Z tego co się orientuje, nie ma jeszcze tego typu rozszerzenia w C#. A może się mylę?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-3788496657215277262?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/3788496657215277262/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/10/czy-polimorfizm-w-c-jest-za-saby.html#comment-form' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/3788496657215277262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/3788496657215277262'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/10/czy-polimorfizm-w-c-jest-za-saby.html' title='Czy polimorfizm w C# jest za słaby?'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-8171577087088967029</id><published>2008-10-25T17:41:00.005+02:00</published><updated>2008-10-25T17:50:54.883+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='snippet'/><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Wywoływanie funkcji w C z języka C#</title><content type='html'>Udało mi się, po paru próbach, dojść do takiego kodu:&lt;br /&gt;&lt;br /&gt;[C#]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  [DllImport("mytest.dll", EntryPoint="makeFFT")]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  private static extern void makeFFT_(IntPtr inputArray, IntPtr outputArray);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  public static void makeFFT(float[] inpArr, float[] outArr)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IntPtr inpArrBuf = Marshal.AllocHGlobal(sizeof(float) * inpArr.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IntPtr outArrBuf = Marshal.AllocHGlobal(sizeof(float) * outArr.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Marshal.Copy(inpArr, 0, inpArrBuf, inpArr.Length);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;makeFFT_(inpArrBuf, outArrBuf);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Marshal.Copy(outArrBuf, outArr, 0, outArr.Length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Marshal.FreeHGlobal(inpArrBuf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Marshal.FreeHGlobal(outArrBuf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  }&lt;br /&gt;&lt;br /&gt;Gdzie funkcja w C ma typ:&lt;br /&gt;[C]&lt;br /&gt;void makeFFT( float* inArr, float* outArr )&lt;br /&gt;&lt;br /&gt;Kod, choć niezbyt piękny, działa i robi to o co od niego oczekiwałem: wywołuje zawartą w bibliotece funkcję makeFFT gdzie inArr jest parametrem wejściowym, zaś outArr - wyjściowym. Zasadnicze pytanie brzmi: czy da się to zrobić krócej, bardziej elegancko?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-8171577087088967029?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/8171577087088967029/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/10/wywoywanie-funkcji-w-c-z-jzyka-c.html#comment-form' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/8171577087088967029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/8171577087088967029'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/10/wywoywanie-funkcji-w-c-z-jzyka-c.html' title='Wywoływanie funkcji w C z języka C#'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-4562122343626263474</id><published>2008-10-19T15:46:00.009+02:00</published><updated>2008-10-19T19:17:30.483+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='snippet'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><title type='text'>Prosty szablon wizualizacji</title><content type='html'>Wielu osobom wydaje się, że Haskell nie nadaje się do pisania czegokolwiek poza interpreterem innego języka :-) Nic bardziej mylnego! Jest to język ogólnego zastosowania, a przy tym jest on bardzo elegancki - znacznie bardziej niż ubogi w abstrakcje C czy zatłoczony składnią C++. No dobra, wystarczająco wkurzyłem fanów tych języków, czas zabrać się za konkrety ;-)&lt;br /&gt;&lt;br /&gt;Zbudujemy dzisiaj w Haskellu prostą aplikację wykorzystującą OpenGL. Nie chcę tutaj pokazywać tajników programowania w OpenGL, od tego są inne &lt;a href="http://nehe.gamedev.net/"&gt;strony&lt;/a&gt;. Będziemy potrzebować:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;kompilatora &lt;a href="http://www.haskell.org/ghc/"&gt;GHC&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;biblioteki &lt;a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/OpenGL-2.2.1.1"&gt;OpenGL&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;biblioteki &lt;a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/GLFW"&gt;GLFW&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Zbudowanie ich wymaga odpowiednich plików nagłówkowych, ale to jest już mniej ciekawe zagadnienie.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Nazwanie modułu&lt;/li&gt;&lt;br /&gt;Warto jest nazwać jakoś nasz program. Umieszczamy więc w pierwszej linii:&lt;br /&gt;&gt;&gt;&gt; module Main where&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Importowanie odpowiednich bibliotek.&lt;/li&gt;&lt;br /&gt;Potrzebować będziemy OpenGL i GLFW (do robienia okienek i obsługi klawiatury):&lt;br /&gt;&gt;&gt;&gt; import Graphics.Rendering.OpenGL -- lots of modules re-exported&lt;br /&gt;&gt;&gt;&gt; import Graphics.UI.GLFW  -- for window creation etc.&lt;br /&gt;&lt;br /&gt;Przydadzą się też biblioteka ułatwiająca programowanie wielowątkowe:&lt;br /&gt;&gt;&gt;&gt; import Control.Concurrent&lt;br /&gt;Biblioteka do monad też się przyda:&lt;br /&gt;&gt;&gt;&gt; import Control.Monad&lt;br /&gt;Z kolei ta biblioteka udostępnia funkcję printf, podobną do tej znanej z C:&lt;br /&gt;&gt;&gt;&gt; import Text.Printf&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Inicjalizacja GLFW&lt;/li&gt;&lt;br /&gt;Początek funkcji main może wyglądać tak:&lt;br /&gt;&gt;&gt;&gt; main = do&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;initOk &lt;- &lt;a href="http://hackage.haskell.org/packages/archive/GLFW/0.3/doc/html/Graphics-UI-GLFW.html#v%3Ainitialize"&gt;initialize&lt;/a&gt; -- [1]&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;if not inikOk then &lt;a href="http://www.haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v%3Aerror"&gt;error&lt;/a&gt; "Błąd inicjalizacji GLFW!" else return () -- [2]&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;   vmodes &lt;- get videoModes -- [3]&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;   let bestVM = last vmodes -- [4]&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;   setWindowModeOk &lt;- openWindow (videoModeToSize bestVM) [videoModeToRGBBits bestVM] FullScreen -- [5]&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;   if not setWindowModeOk then error "Nie udało się otworzyć okna" else return () -- [6]&lt;br /&gt;&lt;br /&gt;W linijce [1] próbujemy zainicjować GLFW. Funkcja ta zwraca wartość logiczną, którą sprawdzamy w [2], jeżeli nie udało się (ma ona wartość False) przerywamy działanie programu za pomocą funkcji error. Po pobraniu informacji o dostępnych rozdzielczościach ([3]) i wybraniu potencjalnie najlepszej z nich ([4]) robimy znów podobną rzecz: próbujemy otworzyć okno w tej rozdzielczości ([5]), jeżeli nam się nie powiedzie przerywamy działanie programu ([6]). Korzystamy przy tym z funkcji pomocniczych, o których opowiem za chwile.&lt;br /&gt;&lt;br /&gt;Niby działa, ale... można to napisać lepiej. &lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; main = do&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;   tryTo initialize (error "Błąd inicjalizacji GLFW!")&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;   bestVM &lt;- last `&lt;a href="http://haskell.org/hoogle/?hoogle=fmap"&gt;fmap&lt;/a&gt;` get videoModes&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;   tryTo (openWindow (videoModeToSize bestVM) [videoModeToRGBBits bestVM] FullScreen)&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;         (error "Nie udało się otworzyć okna")&lt;br /&gt;&lt;br /&gt;Co się zmieniło? Dwie rzeczy:&lt;br /&gt;- wprowadziliśmy funkcję tryTo&lt;br /&gt;- użyliśmy funkcji fmap&lt;br /&gt;Definicja funkcji tryTo jest prosta:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; tryTo :: IO Bool -&gt; IO () -&gt; IO ()&lt;br /&gt;&gt;&gt;&gt; tryTo doAction actionIfFailed = do&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;   b &lt;- doAction&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;   if not b then actionIfFailed else return ()&lt;br /&gt;&lt;br /&gt;Przy pomocy funkcji &lt;a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad.html#v:when"&gt;when&lt;/a&gt; i rezygnując z niepotrzebnego cukru syntaktycznego można tą definicje istotnie skrócić:&lt;br /&gt;&gt;&gt;&gt; tryTo doAction actionIfFailed = doAction &gt;&gt;= \b -&gt; when (not b) actionIfFailed&lt;br /&gt;Nieco nieczytelnie można to zapisać jako:&lt;br /&gt;&gt;&gt;&gt; tryTo doAction actionIfFailed = doAction &gt;&gt;= (&lt;a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v%3Aflip"&gt;flip&lt;/a&gt; &lt;a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad.html#v%3Aunless"&gt;unless&lt;/a&gt;) actionIfFailed&lt;br /&gt;Ale to już jest lekka przesada :-)&lt;br /&gt;&lt;br /&gt;Pozostaje jeszcze sprawa funkcji fmap. Pozwala ona nakarmienie funkcji argumentem pochodzącym z monady (tak na prawdę jej definicja jest nieco ogólniejsza, ale to nieistotne). Możliwa jej definicja w kontekście monad jest taka:&lt;br /&gt;&gt;&gt;&gt; fmap pureFunc monadAction = monadAction &gt;&gt;= \ v -&gt; return (pureFunc v)&lt;br /&gt;&lt;br /&gt;Dzięki tym dwóm funkcjom kod został skrócony i stał się bardziej przejrzysty. Przejdźmy więc nieco dalej.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Funkcje pomocnicze&lt;/li&gt;&lt;br /&gt;W kodzie powyżej wykorzystałem dwie funkcje o następujących definicjach:&lt;br /&gt;videoModeToSize vm = Size (fromIntegral $ videoWidth vm) (fromIntegral $ videoHeight vm)&lt;br /&gt;videoModeToRGBBits vm = DisplayRGBBits (videoRedBits vm) (videoGreenBits vm) (videoBlueBits vm)&lt;br /&gt;Są to swego rodzaju funkcje "rzutowania", czy też "ekstrakcji": z trybu wideo (vm :: &lt;a href="http://hackage.haskell.org/packages/archive/GLFW/0.3/doc/html/Graphics-UI-GLFW.html#t%3AVideoMode"&gt;VideoMode&lt;/a&gt;) otrzymujemy za pomocą pierwszej funkcji rozmiar okna, zaś za pomocą drugiej - liczbę bitów poszczególnych kolorów. Nie jest to parametr, który koniecznie musimy podać, jednak pozwala on wymusić pewne zachowanie.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Dalsze ustawianie środowiska&lt;/li&gt;&lt;br /&gt;Skoro mamy już okno, warto by nadać mu tytuł&lt;br /&gt;&gt;&gt;&gt; windowTitle $= "My first Haskell + OpenGL app"&lt;br /&gt;Co się wydażyło w tej linijce?&lt;br /&gt;Skorzystaliśmy z &lt;i&gt;funkcji&lt;/i&gt; &lt;a href="http://hackage.haskell.org/packages/archive/OpenGL/2.2.1.1/doc/html/Graphics-Rendering-OpenGL-GL-StateVar.html#v%3A%24%3D"&gt;$=&lt;/a&gt; do ustawienia parametru &lt;a href="http://hackage.haskell.org/packages/archive/GLFW/0.3/doc/html/Graphics-UI-GLFW.html#v%3AwindowTitle"&gt;windowTitle&lt;/a&gt;. Jest to funkcja implementowana przez typy należące do klasy HasSetter. W większości popularnych języków programowania (C++, C#, Delphi, Ruby...) mamy możliwość tworzenia parametrów, choć różnie się nazywa w tych językach te mechanizmy. Zasadniczo chodzi o pewien parametr klasy, który można ustawić na pewną wartość. W momencie wykonania przypisania nie jest jednak wprost zapisywana w pamięci pewna wartość, lecz wykonywana jest odpowiednia metoda klasy z argumentem będącym wartością "przypisywaną" parametrowi. Jest to mechanizm wygodny i użyteczny, o czym świadczy chociażby fakt szerokiego wsparcia w językach. W Haskellu możemy ten mechanizm zaimplementować sami i - co więcej - jest to bardzo proste. Po szczegóły odsyłam do &lt;a href="http://hackage.haskell.org/packages/archive/OpenGL/2.2.1.1/doc/html/src/Graphics-Rendering-OpenGL-GL-StateVar.html#StateVar"&gt;źródeł&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;W podobny sposób ustawimy callbacki (brrr co za słowo) do reagowania na zdarzenia środowiska:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt;  keyCallback $= myKeyCallback&lt;br /&gt;&gt;&gt;&gt;  charCallback $= myCharCallback&lt;br /&gt;&lt;br /&gt;Gdzie myKeyCallback i myCharCallback to funkcje:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; -- wywoływany przy naciśnięcu jakiegokolwiek klawisza&lt;br /&gt;&gt;&gt;&gt; myKeyCallback key Press = do&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp; case key of &lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    SpecialKey ENTER -&gt; restoreWindow&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    SpecialKey ESC -&gt; iconifyWindow&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    _ -&gt; return ()&lt;br /&gt;&gt;&gt;&gt; myKeyCallback _ _ _ = return ()&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; -- wywoływany przy naciśnięcia klawisza, któremu odpowiada jakiś znak&lt;br /&gt;&gt;&gt;&gt; myCharCallback chr st = putStrLn (printf "Znak '%c' został %s." chr (if st == Press then "naciśnięty" else "puszczony"))&lt;br /&gt;&lt;br /&gt;myKeyCallback reaguje na naciśnięcie entera i klawisza escape: jedno z nich chowa okno, drugi je pokazuje. Z kolei myCharCallback wypisuje informacje o tym, że ktoś nacisnął lub puścił jakiś klawisz któremu odpowiada pewien znak. Można zawrzeć funkcjonalność myCharCallback w myKeyCallback, ale nie byłoby to wygodne.&lt;br /&gt;&lt;br /&gt;Zmienimy jeszcze rozmiar punktu:&lt;br /&gt;&gt;&gt;&gt; pointSize $= 4.0&lt;br /&gt;&lt;br /&gt;Nieco inaczej wygląda ustawienie dwóch innych parametrów:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; enableSpecial KeyRepeat -- powtarzanie klawiszy&lt;br /&gt;&gt;&gt;&gt; enableSpecial MouseCursor -- widoczny kursor myszy&lt;br /&gt;&gt;&gt;&gt; --enableSpecial AutoPollEvent -- automatyczne pobieranie nowych eventów [*]&lt;br /&gt;&lt;br /&gt;Linia [*] jest wykomentowana, gdyż nie chcemy tak na prawdę tej funkcjonalności od GLFW. Jeżeli jest ona włączona to eventy pobierane są automatycznie przy wywołaniu funkcji &lt;a href="http://hackage.haskell.org/packages/archive/GLFW/0.3/doc/html/Graphics-UI-GLFW.html#v%3AswapBuffers"&gt;swapBuffers&lt;/a&gt;. Ponieważ czasami wyświetlamy niewiele klatek na sekundę, nasza aplikacja zachowywałaby się w takich momentach nieprzyjemnie. Zamiast tego uruchomimy w tym celu oddzielny wątek:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; &lt;a href="http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Concurrent.html#v%3AforkIO"&gt;forkIO&lt;/a&gt; (&lt;a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad.html#v%3Aforever"&gt;forever&lt;/a&gt; &lt;a href="http://hackage.haskell.org/packages/archive/GLFW/0.3/doc/html/Graphics-UI-GLFW.html#v%3ApollEvents"&gt;pollEvents&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Zostanie on automatycznie zabity przy końcu działania programu.&lt;br /&gt;&lt;br /&gt;Chcielibyśmy też ustawić jakieś opcje widoku. Nie będziemy wymyślni, wystarczy nam ortogonalny widok "2D":&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; let Size sizeX sizeY = videoModeToSize bestVM&lt;br /&gt;&gt;&gt;&gt; ortho2D 0 (fromIntegral sizeX) 0 (fromIntegral sizeY)&lt;br /&gt;&lt;br /&gt;Użycie funckji &lt;a href="http://www.haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v%3AfromIntegral"&gt;fromIntegral&lt;/a&gt; jest w paru miejscach konieczne, by zmienić typ z jednego całkowitoliczbowego na jakiś inny typ liczbowy (np. Int -&gt; Double, GLint -&gt; Int).&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Główna pętla renderingu&lt;/li&gt;&lt;br /&gt;Jesteśmy teraz gotowi na wywołanie pętli rysowania. Robi się to tak:&lt;br /&gt;&gt;&gt;&gt; mainLoop&lt;br /&gt;;-)&lt;br /&gt;&lt;br /&gt;Oczywiście musimy podać definicję mainLoop:&lt;br /&gt;&gt;&gt;&gt; mainLoop :: IO ()&lt;br /&gt;&gt;&gt;&gt; mainLoop = do&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;   (Position px py) &lt;- get mousePos&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;   clear [ColorBuffer]&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;   let gray = Color3 0.5 0.5 0.5 :: Color3 Float&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;   let myPoint = (Vertex2 (fromIntegral px) (fromIntegral py)) :: Vertex2 Float&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;   renderPrimitive Points $ color gray &gt;&gt; vertex myPoint&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;   swapBuffers&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;   mainLoop&lt;br /&gt;&lt;br /&gt;Rysujemy więc w aktualnym położeniu kursora duży (ustawiliśmy to przed chwilą) szary punkt.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;A jak stąd wyjść?&lt;/li&gt;&lt;br /&gt;Wszystko wygląda fajnie, ale czasami chcemy wyjść z programu, prawda? Aby to zrealizować wykorzystamy pewien rodzaj zmiennych - MVar - których obsługę znajdziemy w module Control.Concurrent (a dokładniej &lt;a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Control-Concurrent-MVar.html#v:MVar"&gt;tutaj&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Obiekt typu &lt;b&gt;MVar Int&lt;/b&gt; jest "pudełkiem" które może być albo puste, albo przechowywać obiekt typu Int. Stworzymy więc nową, pustą zmienną MVar która gdy zostanie zapełniona będzie sygnalizować konieczność zakończenia aplikacji. Proste, prawda?&lt;br /&gt;&lt;br /&gt;Do funkcji main dopisujemy przed wywołaniem mainLoop jedną linijkę:&lt;br /&gt;&gt;&gt;&gt; quitMVar &lt;- newEmptyMVar :: IO (MVar ())&lt;br /&gt;Teraz quitMVar będzie pudełkiem w którym może znaleść się wartość typu () - jest to typ o jednym elemencie, który także wygląda jak () - jest to krotka o zerze elementów:&lt;br /&gt;()&lt;br /&gt;-- nie ma krotek jednoelementowych: (1)&lt;br /&gt;(1,2)&lt;br /&gt;(1,2,3)&lt;br /&gt;(1,2,3,4)&lt;br /&gt;(1,2,3,4,5)&lt;br /&gt;&lt;br /&gt;Nie potrzebujemy zatrudniać tutaj typu Bool czy też Int, więc nie robimy tego.&lt;br /&gt;&lt;br /&gt;quitMVar przekazujemy teraz do zmodyfikowanych wersji myKeyCallback i mainLoop:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; keyCallback $= myKeyCallback quitMVar&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; mainLoop quitMVar&lt;br /&gt;&lt;br /&gt;Definicje te wyglądają tak:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; -- wywoływany przy naciśnięcu jakiegokolwiek klawisza&lt;br /&gt;&gt;&gt;&gt; myKeyCallback quitter key Press = do&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;  case key of &lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    SpecialKey BACKSPACE -&gt; iconifyWindow&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    SpecialKey ENTER -&gt; restoreWindow&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    SpecialKey ESC -&gt; putMVar quitter () -- umieszczamy wartość w "pudełku"&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;    _ -&gt; return ()&lt;br /&gt;&gt;&gt;&gt; myKeyCallback _ _ _ = return ()&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; mainLoop :: MVar () -&gt; IO ()&lt;br /&gt;&gt;&gt;&gt; mainLoop qMV = do&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   (Position px py) &lt;- get mousePos&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   clear [ColorBuffer]&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   let gray = Color3 0.5 0.5 0.5 :: Color3 Float&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   let myPoint = (Vertex2 (fromIntegral px) (fromIntegral py)) :: Vertex2 Float&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   renderPrimitive Points $ color gray &gt;&gt; vertex myPoint&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   swapBuffers&lt;br /&gt;&gt;&gt;&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   tryTo (not `fmap` isEmptyMVar qMV) (mainLoop qMV) -- jeżeli qMV jest pusta, to kontynuujemy&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Sprzątamy po sobie...&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;Kiedy wyszliśmy już z pętli renderingu nie zostało wiele do zrobienia. Zamykamy okno i idziemy spać:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; closeWindow&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Choć post ten wyszedł na znacznie dłuższy niż początkowo zamierzałem, sam kod jest zwarty i niewielki. Można go obejrzeć &lt;a href="http://tener.videomed.com.pl/haskell/tutorialOpenGL/tutorialOpenGL.html"&gt;tutaj&lt;/a&gt; i &lt;a href="http://hpaste.org/11299#a0"&gt;tutaj&lt;/a&gt;. Kod źródłowy dostępny do ściągnięcia &lt;a href="http://tener.videomed.com.pl/haskell/tutorialOpenGL/tutorialOpenGL.hs"&gt;tutaj.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mam nadzieję, że post wyszedł choć trochę ciekawie :-)&lt;br /&gt;&lt;br /&gt;Zadania dla czytelników:&lt;br /&gt;&lt;b&gt;Znaleźć błąd w programie - łatwo go zauważyć po jego uruchomieniu&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-4562122343626263474?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/4562122343626263474/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/10/prosty-szablon-wizualizacji.html#comment-form' title='Komentarze (5)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/4562122343626263474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/4562122343626263474'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/10/prosty-szablon-wizualizacji.html' title='Prosty szablon wizualizacji'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-775538098276241107</id><published>2008-10-18T21:56:00.004+02:00</published><updated>2008-10-18T22:08:21.621+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='snippet'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='screenshot'/><title type='text'>Haskell + OpenGL</title><content type='html'>Krótki szablon jak w Haskellu zapisać zrzut ekranu renderowanego przez OpenGL.&lt;br /&gt;Plik zapisywany jest do formatu &lt;a href="http://netpbm.sourceforge.net/doc/pam.html"&gt;PAM&lt;/a&gt;, można go potem przekonwertować do dowolnego innego formatu rastrowego, np. za pomocą narzędzia convert z pakietu &lt;a href="http://www.imagemagick.org/script/index.php"&gt;ImageMagick&lt;/a&gt;. Można też skorzystać z pakietu &lt;a href="http://netpbm.sourceforge.net/"&gt;Netpbm&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://hpaste.org/11262#a1"&gt;Link na hpaste.org&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tener.videomed.com.pl/haskell/ScreenShot.hs"&gt;Link na moim serwerku&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-775538098276241107?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/775538098276241107/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/10/haskell-opengl.html#comment-form' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/775538098276241107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/775538098276241107'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/10/haskell-opengl.html' title='Haskell + OpenGL'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-8256983824622771955</id><published>2008-07-26T23:01:00.002+02:00</published><updated>2008-07-26T23:05:08.611+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libgmail'/><category scheme='http://www.blogger.com/atom/ns#' term='wypoczynek'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>libgmail - aby zaoszczędzić klikania</title><content type='html'>Byłem dzisiaj w &lt;a href="http://pl.wikipedia.org/wiki/Rudawy_Janowickie"&gt;górach&lt;/a&gt;. Jak zwykle po takiej wyprawie przychodzi czas dzielenia się zdjęciami. Obrobiwszy co potrzeba zostało mi do wysłania 71 MB. Spakować się tego za bardzo nie da, na płytkę pakować nie opłaca się... Zdecydowałem się wysłać to wszystko mailem. Ponieważ jednak przesyłanie kilkuste plików jest mocno niepraktyczne, spakowałem wszystko w kilka archiwów po 15 MB:&lt;br /&gt;&lt;br /&gt;&gt; 7z a rudawy.7z -mx=0 -v15mb *.jpg&lt;br /&gt;&lt;br /&gt;Świetnie, mam teraz tylko 5 plików do wysłania. Kto jednak kiedyś wysyłał duże pliki przez maila doskonale wie, że wysyłają się one okropnie długo i często nie sposób jest wysłać wszystkiego na raz - trzeba cierpliwie plik po pliku ładować je na konto.&lt;br /&gt;Ale! Od czego są biblioteki? Komenda&lt;br /&gt;&lt;br /&gt;&gt; yum search gmail&lt;br /&gt;&lt;br /&gt;zdradziła mi, że Fedora oferuje między innymi następujący pakiet:&lt;br /&gt;&lt;br /&gt;&gt; python-libgmail.noarch : Library to provide access to Gmail via Python&lt;br /&gt;&lt;br /&gt;Zainstalowałem, poszperałem nieco w dokumentacji i teraz pliki radośnie wgrały się na moje konto:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; import libgmail&lt;br /&gt;&gt;&gt;&gt; import getpass&lt;br /&gt;&gt;&gt;&gt; import glob&lt;br /&gt;&gt;&gt;&gt; ga = libgmail.GmailAcount(getpass.getpass("Podaj konto"), getpass.getpass("Podaj hasło"))&lt;br /&gt;&gt;&gt;&gt; ga.login()&lt;br /&gt;&gt;&gt;&gt; _7z = glob.glob("*7z")&lt;br /&gt;&gt;&gt;&gt; _7z&lt;br /&gt;['rudawy.7z.003', 'rudawy.7z.001', 'rudawy.7z.004', 'rudawy.7z.005', 'rudawy.7z.002']&lt;br /&gt;&gt;&gt;&gt; map( lambda x: ga.storeFile( x, "rudawy" ), _7z )&lt;br /&gt;&lt;br /&gt;I po sprawie :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-8256983824622771955?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/8256983824622771955/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/07/libgmail-aby-zaoszczdzi-klikania.html#comment-form' title='Komentarze (4)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/8256983824622771955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/8256983824622771955'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/07/libgmail-aby-zaoszczdzi-klikania.html' title='libgmail - aby zaoszczędzić klikania'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-4363648891292522879</id><published>2008-07-18T22:53:00.002+02:00</published><updated>2008-07-18T23:02:08.179+02:00</updated><title type='text'>Wyrafinowany sposób na wyjątek</title><content type='html'>Właśnie drogą eksperymentu doszedłem, jak zapętlić GHC... ale tak, by się zorientował i rzucił wyjątkiem :-)&lt;br /&gt;&lt;br /&gt;Wystarczy nam taki kod:&lt;br /&gt;&lt;br /&gt;&gt; {-# OPTIONS_GHC -XRecursiveDo #-}&lt;br /&gt;&gt; &lt;br /&gt;&gt; module Main where&lt;br /&gt;&gt; &lt;br /&gt;&gt; import Control.Concurrent&lt;br /&gt;&gt; import Control.Monad.Fix&lt;br /&gt;&gt; &lt;br /&gt;&gt; loopChan :: IO (Chan ())&lt;br /&gt;&gt; loopChan = mdo chan &lt;- dupChan chan&lt;br /&gt;&gt;                return chan&lt;br /&gt;&gt; &lt;br /&gt;&gt; main = do&lt;br /&gt;&gt;   c &lt;- loopChan&lt;br /&gt;&gt;   writeChan c ()&lt;br /&gt;&lt;br /&gt;Kiedy spróbujemy go załadować do GHCi:&lt;br /&gt;&lt;br /&gt;&gt; Prelude&gt; :l loop_channel.hs&lt;br /&gt;&gt; [1 of 1] Compiling LC               ( loop_channel.hs, interpreted )&lt;br /&gt;&gt; Ok, modules loaded: LC.&lt;br /&gt;&gt; *LC&gt; :type loopChan &lt;br /&gt;&gt; loopChan :: IO (Chan ())&lt;br /&gt;&gt; *LC&gt; c &lt;- loopChan &lt;br /&gt;&gt; *** Exception: &lt;&lt;loop&gt;&gt;&lt;br /&gt;&lt;br /&gt;Lub wykonać:&lt;br /&gt;&gt; [Tener@laptener loop_chan]$ ghc --make loop_channel.hs&lt;br /&gt;&gt; [1 of 1] Compiling Main             ( loop_channel.hs, loop_channel.o )&lt;br /&gt;&gt; Linking loop_channel ...&lt;br /&gt;&gt; [Tener@laptener loop_chan]$ ./loop_channel&lt;br /&gt;&gt; loop_channel: &lt;&lt;loop&gt;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To przytrafi nam się to samo: dostajemy wyjątek &lt;a href="http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Exception.html#v%3ANonTermination"&gt;NonTermination&lt;/a&gt;. Co stanie się przy próbie uruchomienia tego kodu było dla mnie zagadką, gdy go pisałem - rzucenie tego wyjątku wydaje się być rozsądnym rozwiązaniem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-4363648891292522879?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/4363648891292522879/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/07/wyrafinowany-sposb-na-wyjtek.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/4363648891292522879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/4363648891292522879'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/07/wyrafinowany-sposb-na-wyjtek.html' title='Wyrafinowany sposób na wyjątek'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-5467694717111423018</id><published>2008-07-01T00:36:00.003+02:00</published><updated>2008-07-06T20:56:08.727+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='religia'/><title type='text'>Założenie o zamkniętości świata</title><content type='html'>Po angielsku: Closed World Assumption, w skrócie &lt;a href="http://en.wikipedia.org/wiki/Closed_World_Assumption"&gt;CWA&lt;/a&gt;. Jego treść jest prosta: "To, czego nie potrafimy udowodnić, jest fałszywe".&lt;br /&gt;&lt;br /&gt;Naukowcy wydają się być bardzo wybiórczy w stosowaniu tego założenia. Wielokrotnie odrzucano przedwcześnie teorie, które później okazywały się prawdziwe. Z drugiej strony wiele jest niepotwierdzonych teorii, które mają wielu zwolenników, choć nie ma do nich zbyt uczciwych przesłanek (patrz &lt;a href="http://xkcd.com/171/"&gt;tutaj&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Powiedziawszy to, zastanówmy się nad hipotezą:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Hipoteza:&lt;/span&gt; &lt;span style="font-style:italic;"&gt;Bóg istnieje.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Wielu naukowców ma jasno sprecyzowany pogląd na temat prawdziwości tej hipotezy. Co ciekawe, bardzo często ci z nich, którzy negują jej prawdziwość, pytają się "Jak to możliwe, by jakikolwiek naukowiec wierzył w istnienie Boga?". Ich najczęstszym argumentem za tym, że Bóg &lt;span style="font-style:italic;"&gt;nie&lt;/span&gt; istnieje jest brak dowodów na jego istnienie. Niejawnie korzystają więc oni z CWA. A należy przecież pamiętać, że jest to tylko założenie - które w prawdziwym świecie nie jest prawdziwe! Czy to dowodzi istnienia Boga? Oczywiście nie. Myślę jednak, że wyjaśniłem moje poglądy na temat "dowodów przez brak dowodów na istnienie".&lt;br /&gt;&lt;br /&gt;Osobiście uważam że Bóg istnieje i że jest Jego wolą, by przez cały okres istnienia świata nie powstał żaden &lt;span style="font-style:italic;"&gt;trwały&lt;/span&gt; dowód na Jego istnienie. (Przez trwały rozumiem tutaj taki dowód, który można powtórzyć w dowolnym momencie wobec dowolnej osoby.)&lt;br /&gt;Dlaczego? Istnienie dowodu trwałego przekreślałoby istotę wiary. Jaki jest sens wiary w coś, co można udowodnić?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-5467694717111423018?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/5467694717111423018/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/07/zaoenie-o-zamknitoci-wiata.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/5467694717111423018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/5467694717111423018'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/07/zaoenie-o-zamknitoci-wiata.html' title='Założenie o zamkniętości świata'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-5289789900225771501</id><published>2008-05-10T17:37:00.004+02:00</published><updated>2008-05-10T17:44:31.999+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zagadki'/><category scheme='http://www.blogger.com/atom/ns#' term='prolog'/><category scheme='http://www.blogger.com/atom/ns#' term='studia'/><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><title type='text'>Gra w ósemkę</title><content type='html'>Znana jest gra logiczna w "Piętnastkę" - na planszy 4x4 jedno pole jest puste, pozostałe są ponumerowane liczbami od 1 do 15. Należy wychodząc z konfiguracji początkowej dojść do ustawienia:&lt;br /&gt;&lt;br /&gt;1 | 2 | 3 | 4&lt;br /&gt;5 | 6 | 7 | 8&lt;br /&gt;9 | 10 | 11 | 12&lt;br /&gt;13 | 14 | 15 | X&lt;br /&gt;&lt;br /&gt;Zagadka jest dość trudna obliczeniowo, dlatego na pracowni z Programowania Logicznego rozwiązujemy prostszą wersję - grę w "Ósemkę", której zasady są analogiczne, lecz wszystko rozgrywa się na planszy 3x3. Jakież było moje zdziwienie, gdy okazało się, że przechodzi bardzo niekonstruktywne i krótkie rozwiązanie:&lt;br /&gt;&lt;br /&gt;osemka( _, _, _ ).&lt;br /&gt;&lt;br /&gt;A wszystko przez błąd sprawdzaczki :-)&lt;br /&gt;&lt;br /&gt;Zabieram się do pisania rozwiązania zgodnego z treścią zadania.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-5289789900225771501?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/5289789900225771501/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/05/gra-w-semk.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/5289789900225771501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/5289789900225771501'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/05/gra-w-semk.html' title='Gra w ósemkę'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-1990347069243587418</id><published>2008-04-11T15:38:00.000+02:00</published><updated>2008-04-11T15:39:43.348+02:00</updated><title type='text'>Hardware &amp; Software</title><content type='html'>Czyli po polsku sprzęt i oprogramowanie. Ostatnio, w styczniu 2008, kupiłem laptopa. Mówiąc krótko:&lt;br /&gt;Aristo Prestige 1700, GeForce 8600M GS, 2Gb RAM, Core 2 Duo 7500, 250 Gb HDD, matryca 15 cali glare.&lt;br /&gt;Zadowolony? Jak najbardziej. Korzystałem okazjonalnie z innych laptopów; w tym podoba mi się szczególnie:&lt;br /&gt;- wygodna klawiatura, co w laptopach bywa zmorą&lt;br /&gt;- wytrzymała, niewycierająca się obudowa&lt;br /&gt;- duży dysk twardy&lt;br /&gt;- niezła karta graficzna, choć nie jest to GT to i tak Wiedźmin śmiga.&lt;br /&gt;- bezawaryjna jak do tej pory praca&lt;br /&gt;- porządna (jak na moje wymagania) karta dźwiękowa&lt;br /&gt;&lt;br /&gt;Sprzęt nie jest jednak najważniejszy, o wiele więcej potęgi drzemie w oprogramowaniu.&lt;br /&gt;Systemy:&lt;br /&gt;- Fedora 8, podstawowy system&lt;br /&gt;- Windows XP Home Edition, głównie do gier i AutoCada (którego nie używam ja, tylko K., a ona robi to sporadycznie).&lt;br /&gt;&lt;br /&gt;Windowsa mam bez graficznych wodotrysków w stylu &lt;a href="http://www.crystalxp.net"&gt;CrystalXP&lt;/a&gt;. Wyłączony jest nawet domyślny motyw XP na rzecz ascetycznego, szarego z Windowsa 2000. Powód? Wszystko to blaknie i wygląda niepoważnie w porównaniu z Compizem (Vista też). W zamierzeniu ma to być system zapasowy, ale dobrze skonfigurowany. Stąd obecność interpretera pythona, cygwina, Visual Studio 2008 (&lt;a href="http://www.ii.uni.wroc.pl/cms/pl/students_affairs/MSDN.html"&gt;z MSDN'a&lt;/a&gt;), Total Commandera, Emacsa, OpenOffice'a, Firefoxa -- wszystko to skonfigurowane, gotowe do użytku i nieużywane. Bo na Linuxie jest o wiele fajniej!&lt;br /&gt;&lt;br /&gt;Fedora 8, aktualne wydanie jednej z największych dystrybucji Linuxa, w praktyce to to samo co komercyjny Red Hat (tzn. w mojej praktyce przy moich potrzebach). Korzystam z zaskakująco niewielu programów:&lt;br /&gt;- Emacs - wielofunkcyjny, programowalny edytor. Nadaje się szczególnie dobrze do Haskella, C, C++, Pythona, Prologa, ...&lt;br /&gt;- darcs - system kontroli wersji, bardzo przyjemny&lt;br /&gt;- rdiff-backup - wymagający minimalnej konfiguracji, lecz potężny program do backupów&lt;br /&gt;- xmonad - fenomenalny menadżer okien, bardzo wygodny&lt;br /&gt;- Total Commander - tak, pod &lt;a href="http://www.winehq.org/"&gt;wine'm&lt;/a&gt; chodzi :-)&lt;br /&gt;- foobar2000 - wolę go od mplayer'a czy xmms'a. Też chodzi pod wine'm.&lt;br /&gt;- Swiftfox, czyli zoptymalizowany pod konkretną architekturę Firefox&lt;br /&gt;- workrave - program ograniczający korzystanie z klawiatury i przypominający o odpoczynkach&lt;br /&gt;- narzędzia wbudowane w Linuxa, o instalację których nie muszę się troszczyć&lt;br /&gt;&lt;br /&gt;O xmonad i Emacsie wypada napisać osobne posty - już wkrótce!&lt;br /&gt;&lt;br /&gt;Tymczasem wracam do chorowania. Dopadła mnie jakaś grypa...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-1990347069243587418?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/1990347069243587418/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/04/hardware-software.html#comment-form' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/1990347069243587418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/1990347069243587418'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/04/hardware-software.html' title='Hardware &amp; Software'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-7378451802496201814</id><published>2008-04-11T01:22:00.010+02:00</published><updated>2008-04-11T02:05:23.950+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ii'/><category scheme='http://www.blogger.com/atom/ns#' term='prolog'/><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><title type='text'>Spełnialność formuł logicznych</title><content type='html'>Ogólnie rzecz biorąc problem spełnialności formuł logicznych jest bardzo złożony pod względem obliczeniowym. Przy tym naiwny algorytm który rozwiązuje ten problem jest bardzo prosty. W Prologu można go zapisać tak:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;:- op(900,fy,neg).&lt;br /&gt;:- op(1000,yfx,and).&lt;br /&gt;:- op(1010,yfx,or).&lt;br /&gt;&lt;br /&gt;sat( X ) :- eval( X, true ),!.&lt;br /&gt;&lt;br /&gt;eval( true, true ) :- !.&lt;br /&gt;eval( false, false ).&lt;br /&gt;&lt;br /&gt;eval( neg X, true ) :- eval( X, false ).&lt;br /&gt;eval( neg X, false ) :- eval( X, true ), !.&lt;br /&gt;eval( X or Y, true ) :- ( eval( X, true ) ; eval( Y, true ) ), !.&lt;br /&gt;eval( X and Y, true ) :- eval( X, true ), eval( Y, true ), !.&lt;br /&gt;&lt;br /&gt;eval( X, false ) :- eval( X, true ), !, fail.&lt;br /&gt;eval( _, false ).&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Korzystamy tutaj mocno z wbudowanego w Prolog backtrackingu. Możemy sprawdzać spełnialność formuł w stylu&lt;br /&gt;&lt;blockquote&gt;X or Y and neg (Y and X)&lt;/blockquote&gt;&lt;br /&gt;Przykładowa sesja:&lt;br /&gt;&lt;blockquote&gt;?- [sat].&lt;br /&gt;% sat compiled 0.00 sec, 2,936 bytes&lt;br /&gt;&lt;br /&gt;Yes&lt;br /&gt;?- sat( neg neg neg X ).&lt;br /&gt;&lt;br /&gt;X = false ;;&lt;br /&gt;&lt;br /&gt;No&lt;br /&gt;?- sat( neg neg neg X and neg Y).&lt;br /&gt;&lt;br /&gt;X = false,&lt;br /&gt;Y = false ;;&lt;br /&gt;&lt;br /&gt;No&lt;br /&gt;?- sat( neg neg neg X and neg Y and Z).&lt;br /&gt;&lt;br /&gt;X = false,&lt;br /&gt;Y = false,&lt;br /&gt;Z = true ;;&lt;br /&gt;&lt;br /&gt;No&lt;br /&gt;?- sat( X and neg X ).&lt;br /&gt;&lt;br /&gt;No&lt;br /&gt;?- sat( _ and neg _ ).&lt;br /&gt;&lt;br /&gt;Yes&lt;br /&gt;?- &lt;br /&gt;% halt&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Jak widać Prolog bywa zręcznym narzędziem do wyrażania pewnych algorytmów.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-7378451802496201814?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/7378451802496201814/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/04/spenialno-formu-logicznych.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/7378451802496201814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/7378451802496201814'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/04/spenialno-formu-logicznych.html' title='Spełnialność formuł logicznych'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-6612642985715770298</id><published>2008-04-10T01:41:00.008+02:00</published><updated>2008-04-10T02:24:27.141+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='prolog'/><category scheme='http://www.blogger.com/atom/ns#' term='studia'/><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><title type='text'>Prolog nie jest taki zły</title><content type='html'>W poniedziałek stoczyłem prawdziwą batalię, usiłując stworzyć poprawnie działające predykaty wyższego rzędu rekurencyjnie przechodzące po termie aż zajdzie jakiś warunek. Byłoby więc to coś w rodzaju &lt;a href="http://en.wikipedia.org/wiki/Metamorphism_(computer_science)"&gt;metamorfizmu&lt;/a&gt;. Moje wysiłki spełzły jednak na niczym, skończyłem wieczorem z funkcją:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;mapRec( Pred, Arg, OutArg ) :-&lt;br /&gt;  &amp;nbsp;&amp;nbsp;&amp;nbsp;% tworzymy nowy predykat pomocniczy&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;gensym( partial, UNIQ ),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Left =.. [ UNIQ, X, Y ],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  PartialMapRec = ( Left :- mapRec( Pred, X, Y ) ),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  asserta( PartialMapRec, Ref ),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  % rozkładamy term wejściowy&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  Arg =.. [ Comp, Op | Args ],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  map( UNIQ, Args, Args2 ), % dla termów atomowych mamy podstawę indukcji: map &amp;nbsp;&amp;nbsp;&amp;nbsp;nic nie robi na pustej liście&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  % składamy term ponownie&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  Arg2 =.. [ Comp, Op | Args2 ],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  % aplikujemy Pred i zwracamy wynik&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  F =.. [ Pred, Arg2, OutArg ],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  F,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  erase( Ref ),  % kasujemy predykat pomocniczy&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  !.&lt;br /&gt;&lt;br /&gt;mapRec( _, Arg, Arg ) :-&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  write( final ), write(' '), write( Arg ), nl,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  final( Arg ), !.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Najogólniej rzecz biorąc, nie działała ona tak jak powinna. To znaczy coś tam niby liczyła, ale źle, a co gorsze była okropnie długa (jak widać) i beznadziejna do debugowania. Ponadto wymagała ingerencji w bazę predykatów Prologa, co jest moim zdaniem brzydkie i psuje trochę wydajność. Zakończyłem nieudaną sesję programistyczną mocno zniesmaczony Prologiem, a konkretnie jego odpornością na próby metaprogramowania.&lt;br /&gt;&lt;br /&gt;Dzisiaj jednak dokopałem się do paru predykatów, które znacząco uprościły konstrukcję mapRec'a:&lt;br /&gt;&lt;blockquote&gt;mapRec( Pred, Arg, OutArg ) :-&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Arg =.. [ Comp, Op | Args ],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; maplist( mapRec( Pred ), Args, Args2 ),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Arg2 =.. [ Comp, Op | Args2 ],&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; apply( Pred, Arg2, OutArg ),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; !.&lt;br /&gt;&lt;br /&gt;mapRec( _, Arg, Arg ) :-&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; write( final ), write(' '), write( Arg ), nl,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; final( Arg ), !.&lt;/blockquote&gt;&lt;br /&gt;Nie taki Prolog straszny jak go malują :-)&lt;br /&gt;&lt;br /&gt;Bazując na poznanej wiedzy napisałem wreszcie simp'a, czyli predykat upraszczający wyrażenia arytmetyczne. Jest to jedno z zadań na &lt;a href="http://tener.videomed.com.pl/prolog/p2.pdf"&gt;pracownię z Programowania w Logice&lt;/a&gt;. Wyszedł niedługi i raczej nie ma zbyt wielu błędów :-) Leży &lt;a href="http://tener.videomed.com.pl/prolog/simp.pl_"&gt;tutaj&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Do uruchomienia potrzebny jest interpreter Prologa. Ja używam &lt;a href="http://www.swi-prolog.org/"&gt;SWI-Prologa&lt;/a&gt;, ale program powinien działać na każdym sensownym interpreterze.&lt;br /&gt;&lt;br /&gt;Dla tych którzy nie mieli nigdy doczynienia z Prologiem, oto jak wygląda przykładowa sesja:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;?- [simp].&lt;br /&gt;% simp compiled 0.00 sec, 11,264 bytes&lt;br /&gt;&lt;br /&gt;Yes&lt;br /&gt;?- simp( x-x, EXP ).&lt;br /&gt;&lt;br /&gt;EXP = 0 ;;&lt;br /&gt;&lt;br /&gt;No&lt;br /&gt;?- simp( x-x*1*2*3, EXP ).&lt;br /&gt;&lt;br /&gt;EXP = x* -5 ;;&lt;br /&gt;&lt;br /&gt;No&lt;br /&gt;?- simp( 1*2*(1+1+1)*x-x*1*2*3, EXP ).&lt;br /&gt;&lt;br /&gt;EXP = 0 ;;&lt;br /&gt;&lt;br /&gt;No&lt;br /&gt;?- simp( x*(y+z*(1+p)-p*(x-z)), EXP ).&lt;br /&gt;&lt;br /&gt;EXP = - (p* (x*x))+ (p* (x*z)*2+ (x*y+x*z)) ;;&lt;br /&gt;&lt;br /&gt;No&lt;br /&gt;?- &lt;br /&gt;% halt&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Choć Prolog bywa wkurzający, to jednak przyjemnie jest nauczyć się czegoś nowego.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-6612642985715770298?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/6612642985715770298/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/04/prolog-nie-jest-taki-zy.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/6612642985715770298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/6612642985715770298'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/04/prolog-nie-jest-taki-zy.html' title='Prolog nie jest taki zły'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-1610274014875299196</id><published>2008-04-07T23:33:00.002+02:00</published><updated>2008-04-07T23:47:46.799+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='c konsola'/><category scheme='http://www.blogger.com/atom/ns#' term='budzik'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Budzik, revisited</title><content type='html'>Kiedyś pisałem budziki w C (&lt;a href="http://plonacazyrafa.blogspot.com/2006/03/za-miesic-matura.html"&gt;tu&lt;/a&gt;, &lt;a href="http://plonacazyrafa.blogspot.com/2006/03/za-miesic-matura.html"&gt;tu&lt;/a&gt;), albo &lt;a href="http://plonacazyrafa.blogspot.com/2006/04/home-sweet-home.html"&gt;z wykorzystaniem wtyczek do foobar'a&lt;/a&gt;. Ten czas już minął! Nigdy więcej niskopoziomowego C do takich zadań.&lt;br /&gt;W międzyczasie miałem program napisany w Pythonie, ale gdzieś mi się zapodział. Nie potrzebuję go już więcej bo oto jest - Budzik 3000! Innowacyjne rozwiązanie, nie wymaga żadnej konfiguracji i jest w pełni kompatybilne z czymkolwiek posiadającym konsolę, program sleep i mplayer (np. mój Linux).&lt;br /&gt;&lt;blockquote&gt;sleep 7h 30m &amp;&amp; mplayer ~/budzik/*.mp3&lt;/blockquote&gt;&lt;br /&gt;Szybkie, dokładne i wygodne. Zostawić w &lt;a href="http://pl.wikipedia.org/wiki/Konsola_(informatyka)"&gt;konsoli&lt;/a&gt; i iść spać...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-1610274014875299196?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/1610274014875299196/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/04/budzik-revisited.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/1610274014875299196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/1610274014875299196'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/04/budzik-revisited.html' title='Budzik, revisited'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-721608068108885744</id><published>2008-04-07T22:48:00.008+02:00</published><updated>2008-04-10T02:30:36.913+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ii'/><category scheme='http://www.blogger.com/atom/ns#' term='plany'/><category scheme='http://www.blogger.com/atom/ns#' term='studia'/><title type='text'>Minus jeden, czyli co aktualnie porabiam</title><content type='html'>Studiuję aktualnie w -1, zwanym też ii, II, albo &lt;a href="http://www.ii.uni.wroc.pl/cms/"&gt;Instytutem Informatyki Uniwersytetu Wrocławskiego&lt;/a&gt;. Fajnie nie?&lt;br /&gt;&lt;br /&gt;Ano fajnie, bo wydział należy do tych wybitnie fajnych. Ficzery:&lt;br /&gt;- za wyjątkiem 8 obowiązkowych przedmiotów (po 2 przez pierwsze 4 semestry) program studiów jest układany samodzielnie przez studenta. Chcę się zapisać na przedmiot XYZ? Robię to. Chcę się z niego wypisać? Przez pierwsze dwa tygodnie semestru można to robić bez konsekwencji.&lt;br /&gt;- wysoki poziom. Serio, nie żartuję - jest się tu czego nauczyć i daje to ogromną satysfakcję. Później także dobry start na rynku pracy, ale to już szczegół :-) Kilku absolwentów pracuje nawet dla Google czy M$, inni założyli jakiś &lt;a href="http://nasza-klasa.pl"&gt;portal społecznościowy&lt;/a&gt;&lt;br /&gt;- atmosfera, nie tylko dzięki klimatyzacji w budynku. Wśród studentów panuje spora różnorodność osobowości i zawsze znajdzie się ktoś, z kim można porozmawiać.&lt;br /&gt;- mniej ważne, ale jednak: fajny, nowy budynek położony dogodnie przy Moście Grunwaldzkim.&lt;br /&gt;&lt;br /&gt;Szczęśliwie zaliczyłem pierwszy rok i jestem aktualnie na 4-tym semestrze. Nie mam nawet tak u nas popularnej poprawki z Programowania :-) Choć być może uda mi się coś wymyślić z JFiZo (Języki Formalne i &lt;i&gt;ZŁO&lt;/i&gt;żoność Obliczeniowa), którego rokrocznie zdaje jakieś 30% osób. To raczej mało, szczególnie że wiele z tych, którym się udaje, robi ten przedmiot nie po raz pierwszy. AiSD (Algorytmy i Struktury Danych) też są obiecujące w tym względzie.&lt;br /&gt;&lt;br /&gt;Przedmioty na których najlepiej się bawiłem? Będzie jakoś tak:&lt;br /&gt;1. Programowanie (Haskell rządzi!)&lt;br /&gt;2. Programowanie funkcjonalne (niefajny był tam OCaml, ale poznałem podstawy tego paradygmatu)&lt;br /&gt;3. Przetważanie Języka Naturalnego (Natural Language Processing, NLP) (program do pisanie wierszy)&lt;br /&gt;4. Kurs C (grupa zaawansowana: graficzna gra w Sudoku, gra 3D, kalkulator+wykresy 3D, znajdowanie trasy przejazdu komunikacją miejską we Wrocławiu)&lt;br /&gt;&lt;br /&gt;Na razie to tyle, stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-721608068108885744?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/721608068108885744/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/04/minus-jeden-czyli-co-aktualnie-porabiam.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/721608068108885744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/721608068108885744'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/04/minus-jeden-czyli-co-aktualnie-porabiam.html' title='Minus jeden, czyli co aktualnie porabiam'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-4225544095006306270</id><published>2008-04-07T22:16:00.004+02:00</published><updated>2008-04-07T22:47:31.546+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reaktywacja'/><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='plany'/><title type='text'>Podpalmy żyrafę na nowo!</title><content type='html'>Czyli reaktywacja bloga :-)&lt;br /&gt;&lt;br /&gt;Nosiłem się z tym zamiarem od jakiegoś czasu, z kilku powodów:&lt;br /&gt;- w moim życiu dzieje się sporo rzeczy a pamięć mam krótką;&lt;br /&gt;- fajnie podzielić się tym, co właśnie się odkryło, dowiedziało itp.&lt;br /&gt;- lubię pisać, a ostatnio nie miałem do tego wielu okazji&lt;br /&gt;- były inne powody, ale aktualnie ich nie pamiętam :-)&lt;br /&gt;&lt;br /&gt;Plan na najbliższe kilka postów:&lt;br /&gt;1. Opisać co aktualnie robię&lt;br /&gt;2. Najnowsze zmiany w sprzęcie - kupno laptopa&lt;br /&gt;3. Moja konfiguracja tegoż sprzętu&lt;br /&gt;4. Coś o xmonad&lt;br /&gt;5. Coś o workrave&lt;br /&gt;6. Wpis o zespole/projekcie Ayreon&lt;br /&gt;&lt;br /&gt;Co potem? Ha! Któż to może wiedzieć?&lt;br /&gt;&lt;br /&gt;Na razie nie zmieniam wyglądu bloga, zaktualizowałem tylko linki. Szczególnie polecam &lt;a href="http://www.xkcd.com"&gt;xkcd&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Edit: eksperymentalnie włączam reklamy. Gdyby komuś przeszkadzały, to są odpowiednie wtyczki do Firefoxa...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-4225544095006306270?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/4225544095006306270/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/04/podpalmy-yraf-na-nowo.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/4225544095006306270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/4225544095006306270'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2008/04/podpalmy-yraf-na-nowo.html' title='Podpalmy żyrafę na nowo!'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-114846951452098917</id><published>2006-05-24T13:13:00.000+02:00</published><updated>2006-05-24T13:18:34.530+02:00</updated><title type='text'>Wakacje...</title><content type='html'>Tak, tak, wakacje już się rozpoczęły! Przynajmniej dla mnie...&lt;br /&gt;&lt;br /&gt;Będzie to dla mnie, wbrew pozorom, bardzo zajęty okres, być może w większym nawet stopniu niż w trakcie roku szkolnego. Równocześnie jednak nieporównywalnie od niego przyjemniejszy.&lt;br /&gt;&lt;br /&gt;Moje plany? Wizje? Pomysły? Mam ich kilka. Mimo wszystko, po części jadę autobusem... linii "Rnd":&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.videomed.com.pl/tener/blog/random_bus.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://www.videomed.com.pl/tener/blog/random_bus.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Szerokiej drogi mat-fizy i nie tylko!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-114846951452098917?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/114846951452098917/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/05/wakacje.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114846951452098917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114846951452098917'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/05/wakacje.html' title='Wakacje...'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-114753077416035313</id><published>2006-05-13T16:29:00.000+02:00</published><updated>2006-05-13T16:32:54.180+02:00</updated><title type='text'>Mat(ura/ematyka)</title><content type='html'>Ach tak, matura z matmy. Jakoś poszło - aczkolwiek nie obyło się bez błędów. Poziom podstawowy był prosty, rozszerzony wymagał znacznie więcej energii. Swoją drogą - jestem za obowiązkową maturą z matematyki. Chociażby po to, aby obyło się bez takich przypadków liczenia 30%... ;-)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.videomed.com.pl/tener/blog/promocja.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://www.videomed.com.pl/tener/blog/promocja.jpg" border="0" alt="" /&gt;Promocja w Tesco...&lt;/a&gt;&lt;br /&gt;Tymczasem zaś - fizyka i ustny polski.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-114753077416035313?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/114753077416035313/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/05/maturaematyka.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114753077416035313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114753077416035313'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/05/maturaematyka.html' title='Mat(ura/ematyka)'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-114709735907519842</id><published>2006-05-08T16:07:00.000+02:00</published><updated>2006-05-08T16:09:19.093+02:00</updated><title type='text'>Oral</title><content type='html'>Uczyli ustna - matura z angielskiego. Przyszedłem dzisiaj na 13:00, o 15:00 byłem w domu... w sumie jedna z najprzyjemniejszych części jak sądzę :) Dostałem 20 na 20 punktów, czyli 100%... :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-114709735907519842?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/114709735907519842/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/05/oral.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114709735907519842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114709735907519842'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/05/oral.html' title='Oral'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-114675663934235808</id><published>2006-05-04T17:29:00.000+02:00</published><updated>2006-05-04T17:37:55.793+02:00</updated><title type='text'>Ciepełko</title><content type='html'>Ach, matura, matura, matura, matura, matura... &lt;br /&gt;Czekanie, arkusz, bułka, grzesiek w czekoladzie, telefon, bułka, czekanie, arkusz...&lt;br /&gt;Cóż mam powiedzieć? Zmęczyłem się tym polskim i tyle.&lt;br /&gt;&lt;br /&gt;Dwa razy pierwszy temat. Za jakiś czas pójdę oglądać film (po angielsku, ja jutro).&lt;br /&gt;&lt;br /&gt;Pozytywne jest to, że nie mam negatywnych uwag ;-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Swoją drogą to jakaś ciekawa zależność: na zewnątrz ciepełko i na maturze ciepełko.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-114675663934235808?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/114675663934235808/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/05/ciepeko.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114675663934235808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114675663934235808'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/05/ciepeko.html' title='Ciepełko'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-114598801527606313</id><published>2006-04-25T19:45:00.000+02:00</published><updated>2006-04-25T21:02:12.116+02:00</updated><title type='text'>Szkoła medialna</title><content type='html'>Zrobione dziś w szkole zdjęcia można obejrzeć w galerii na stronie:&lt;br /&gt;&lt;a href="http://www.matfiz2lo.yoyo.pl/"&gt;http://www.matfiz2lo.yoyo.pl/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sukcesywnie będę tam dodawać różne fotografie. Filmiki będę z kolei dodawał do serwisu video.google.com. Link do znalezienia na powyższej stronie.&lt;br /&gt;&lt;br /&gt;Edycja:&lt;br /&gt;&lt;br /&gt;Zapomniałem dodać, że oryginały w znacznie lepszej rozdzielczości mogę przegrać na dowolną płytkę - zajmują ok 185 Mb.&lt;br /&gt;&lt;br /&gt;Edycja(2):&lt;br /&gt;&lt;br /&gt;Warto obejrzeć także stronkę z filmikami Śliska. "Nawiedzona Szatnia","Intro","Oż!"...&lt;br /&gt;&lt;a href="http://www.dropshots.com/matfiz"&gt;www.dropshots.com/matfiz&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-114598801527606313?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/114598801527606313/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/04/szkoa-medialna.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114598801527606313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114598801527606313'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/04/szkoa-medialna.html' title='Szkoła medialna'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-114589809107063013</id><published>2006-04-24T18:31:00.000+02:00</published><updated>2006-04-24T19:01:31.130+02:00</updated><title type='text'>Już tylko miesiąc</title><content type='html'>I to bynajmniej nie do matury, lecz do jej końca. Trzeba się zacząć uczyć ;-)&lt;br /&gt;&lt;br /&gt;Nie mam czasu pisać na blogu. Może od czasu do czasu napisze coś krótkiego aby się oderwać, ale nie liczcie na jakiekolwiek dłuższe formy.&lt;br /&gt;&lt;br /&gt;Za wypełniacz niech posłużą zdjęcia.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.videomed.com.pl/tener/blog/kogut_lama3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://www.videomed.com.pl/tener/blog/kogut_lama3.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.videomed.com.pl/tener/blog/kolczyki.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://www.videomed.com.pl/tener/blog/kolczyki.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.videomed.com.pl/tener/blog/potwor.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://www.videomed.com.pl/tener/blog/potwor.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.videomed.com.pl/tener/blog/kogut_lama2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://www.videomed.com.pl/tener/blog/kogut_lama2.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.videomed.com.pl/tener/blog/kogut_lama1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://www.videomed.com.pl/tener/blog/kogut_lama1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.videomed.com.pl/tener/blog/koktajl.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://www.videomed.com.pl/tener/blog/koktajl.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Do zobaczenia po maturze :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-114589809107063013?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/114589809107063013/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/04/ju-tylko-miesic_24.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114589809107063013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114589809107063013'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/04/ju-tylko-miesic_24.html' title='Już tylko miesiąc'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-114539487066806702</id><published>2006-04-18T22:21:00.000+02:00</published><updated>2006-04-19T22:33:48.440+02:00</updated><title type='text'>Życie</title><content type='html'>Ach życie...&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;"Rozprężę szeroko ramiona,&lt;br /&gt;Nabiorę w płuca porannego wiewu,&lt;br /&gt;W ziemię się skłonię błękitnemu niebu&lt;br /&gt;I krzyknę, radośnie krzyknę :&lt;br /&gt;- Jakie to szczęście, że krew jest czerwona !"&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Ślizgając się po powierzchni realizmu dochodzę do wniosku, że najsilniej odczuwa się wiosnę gdy po sześciu zegarowych godzinach matematyki wychodzi się z kochaną osobą w słoneczny dzień. Lub też gdy spaceruje się po Parku Południowym i nie jest się sam.&lt;br /&gt;&lt;br /&gt;Wczoraj wyjechałem do Wrocławia, wróciłem dziś mniej więcej w okolicach 20:30. Przy okazji stwierdziłem po raz kolejny, że pociągi relacji Wrocław-Wałbrzych oddziałują z cząstkami &lt;span style="font-style: italic;"&gt;v&lt;/span&gt; indukując pole nasenne. Musiałem uważać żeby nie przegapić stacji...&lt;br /&gt;&lt;br /&gt;Tymczasem przymierzam się do lekkich zmian w wyglądzie strony. Czas pokaże co się z tego ziści. Z nieoficjalnych źródeł mogę przekazać, że pojawi się tu i ówdzie cząstka &lt;span style="font-style: italic;"&gt;v&lt;/span&gt; i może jakaś &lt;span style="font-style: italic;"&gt;Żyrafa Rasa (v)&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Tak, wiem, że smucicie się że już kończe ten post...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.videomed.com.pl/tener/blog/smutny_lama.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://www.videomed.com.pl/tener/blog/smutny_lama.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;"Pa!", jako rzecze Lama.&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;Ach, byłbym zapomniał. &lt;a href="http://www.macguff.fr/~goomi/unspeakable/vault163.html"&gt;Nowy Vault!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-114539487066806702?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/114539487066806702/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/04/ycie.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114539487066806702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114539487066806702'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/04/ycie.html' title='Życie'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-114514026507455579</id><published>2006-04-16T00:29:00.000+02:00</published><updated>2006-04-24T19:00:16.703+02:00</updated><title type='text'>Budzik</title><content type='html'>Dziś trochę inaczej.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;#include "time.h"&lt;br /&gt;#include "stdlib.h"&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;   int sec = 1;&lt;br /&gt;   int min = 60*sec;&lt;br /&gt;   int h = 60*min;&lt;br /&gt;   sleep(4*h+30*min);&lt;br /&gt;   system("./foobar2000.exe budzenie.fpl");&lt;br /&gt;   return 0;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Może się okazać trochę niedokładny ale trudno się mówi.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-114514026507455579?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/114514026507455579/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/04/budzik.html#comment-form' title='Komentarze (7)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114514026507455579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114514026507455579'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/04/budzik.html' title='Budzik'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-114478961183158320</id><published>2006-04-11T22:22:00.000+02:00</published><updated>2006-04-15T21:23:48.183+02:00</updated><title type='text'>Tytuł</title><content type='html'>Sądziłem, że gorszego tytułu od "Pierwszy post" wymyślić się nie da. A jednak... Nic nie przychodzi mi do głowy, więc niech tak zostanie.&lt;br /&gt;&lt;br /&gt;Na wstępie chciałbym podziękować tym wszystkim, którzy wyrazili swoją opinię w komentarzach. Bardzo się z nich cieszę :-)&lt;br /&gt;&lt;br /&gt;Jutro (choć to prawie dzisiaj) zamierzam przejść się do fotografa po zdjęcia "do dyplomu". Z tej okazji odszukałem swoje zdjęcie na komputerze; możecie je od dzisiaj obejrzeć w moim profilu. Wiem, i tak większość z Was wie jak wyglądam, ale tak na wszelki wypadek... ;-)&lt;br /&gt;&lt;br /&gt;W każdym razie jutro pojawię się w szkole na bardzo krótko, właśnie w związku z owymi wspomnianymi już zdjęciami. Muszę je do jutra donieść prof... hmm... może zamiast Ś. nazwiemy ją, dajmy na to, Żyrafą? 'Ś.' jakoś mi zbrzydło.&lt;br /&gt;&lt;br /&gt;Dla tych, którzy jeszcze nie wiedzą: pojawił się nowy Vault (link po prawej). Jest on aluzją do &lt;a href="http://en.wikisource.org/wiki/The_Music_of_Erich_Zann"&gt;tego(ang)&lt;/a&gt; opowiadania.&lt;br /&gt;&lt;br /&gt;Co jeszcze? Nie wiem. Zmęczony jestem. Wiem, marudzę...&lt;br /&gt;&lt;br /&gt;Miałem dzisiaj w nocy sen, który o dziwo nadal pamiętam. Nie potrafię sobie przypomnieć niektórych odczuć mu towarzyszących ale jest z nimi tak, jak z przyjemnością ze zjedzenia czegoś; wiem że mi smakowało, potrafię sobie przypomnieć ten smak, ale samego odczucia przyjemności już nie.&lt;br /&gt;&lt;br /&gt;Sądzę, że "materiałem stymulującym" (patrz: matury ustne z języków obcych) do snu stały się dwa opowiadania Frederika Pohla (&lt;span style="font-weight: bold;"&gt;bardzo&lt;/span&gt; podoba mi się jego styl): &lt;span style="font-style: italic;"&gt;23 słowa&lt;/span&gt; i &lt;span style="font-style: italic;"&gt;Dzień Milionowy&lt;/span&gt;. Nie chcę tutaj przytaczać ich treści, lecz w ogólnym zarysie pierwsze mówi o człowieku posiadającym zdolności nadludzkie, drugie zaś o świecie ludzi za tysiąc lat (milionowy dzień AC). Kto chce niech da znać.&lt;br /&gt;&lt;br /&gt;Zaś co do treści... mogłem poruszać się z dużą prędkością po galaktyce. Ktoś powiedział, że tak naprawdę wszystko (to znaczy inne galaktyki) jest bliżej niż wygląda, a to obłoki międzygwiezdne zakrzywiają czasoprzestrzeń tak, że wydaje się inaczej. Widziałem znajomy mi obraz galaktyki... który nagle "wyprostował" się. I wiedziałem że ten drugi jest &lt;span style="font-style: italic;"&gt;prawdziwy&lt;/span&gt;. Gdy wylądowałem w łóżku, które natenczas było jedynym sprzętem, którego byłem świadomy; było jakby miejscem na którym mogłem usiąść by obserwować dalej galaktykę, obdarowany zdolnością podobną do tej, którą posiadał pewien bohater książkowy &lt;span style="font-style:italic;"&gt;(o tej porze ciężko jest mi skojarzyć tytuł i imię postaci; na pewno był magiem, chciał zostać bogiem... jego oczy były jak klepsydry... O! Cykl powieści to "Dragonlance", ale bohatera dalej nie pamiętam)&lt;/span&gt;. Gdy spojrzałem na niebo i galaktykę (skupioną wizualnie w obszarze kilkunastu stopni, jakbym patrzył się z przestrzeni niedaleko czarnej dziury), widziałem po kolei stadia ewolucji gwiazd. Całkiem ładne to fajerwerki były.&lt;br /&gt;&lt;br /&gt;Było coś jeszcze, ale tego na pewno nie umieszczę w blogu.&lt;br /&gt;&lt;br /&gt;Dość już na dzisiaj. Przez ten sen zrobił się z tego posta prawdziwy ślimak. Patyk zasnął już na stojąco...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.videomed.com.pl/tener/blog/patyk.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://www.videomed.com.pl/tener/blog/patyk.jpg" alt="" border="0" /&gt;Dobranoc.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-114478961183158320?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/114478961183158320/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/04/tytu.html#comment-form' title='Komentarze (3)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114478961183158320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114478961183158320'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/04/tytu.html' title='Tytuł'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-114460883877722059</id><published>2006-04-09T20:30:00.000+02:00</published><updated>2006-04-11T00:38:07.786+02:00</updated><title type='text'>Home, sweet home...</title><content type='html'>Wybaczcie mi ten makaronizm (czy też może anglicyzm?) ale dopiero przed chwilą wróciłem do domu. Nie żebym żałował dzisiejszego wyjazdu do Wrocławia - wręcz przeciwnie! Jestem jedynie trochę zmęczony.&lt;br /&gt;&lt;br /&gt;Wypróbowałem dziś nowy budzik: &lt;span style="font-style: italic;"&gt;komputer+&lt;a href="http://www.foobar2000.org/"&gt;foobar2000&lt;/a&gt;(program muzyczny)+&lt;a href="http://pelit.koillismaa.fi/plugins/general.php#65"&gt;scheduler&lt;/a&gt;(wtyczka do foo)&lt;/span&gt;. Całkiem skuteczny, budzi w ciągu sekundy... przy odpowiednio ustawionej głośności ;-) Wolałem jednak obudzić się odrobinę dłużej a łagodniej. I tak zdążyłem.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.videomed.com.pl/tener/blog/soup.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://www.videomed.com.pl/tener/blog/soup.jpg" border="0" alt="" /&gt;&lt;span style="font-weight: bold;"&gt;NIE &lt;/span&gt;Pozwolę sobie w tym miejscu zaprezentować rysunku imć Koguta pt. &lt;span style="font-style: italic;"&gt;"Mała owieczka ściąga obrus".&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Nie mam nawet siły szukać niczego w zamian... wybaczcie.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Idę uczyć się na ostatni w szkole sprawdzian z matmy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-114460883877722059?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/114460883877722059/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/04/home-sweet-home.html#comment-form' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114460883877722059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114460883877722059'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/04/home-sweet-home.html' title='Home, sweet home...'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-114417596191019852</id><published>2006-04-04T20:19:00.000+02:00</published><updated>2006-04-11T00:35:58.233+02:00</updated><title type='text'>O wiośnie, maturze i kiełbasie słów kilka</title><content type='html'>Wiosna... na reszcie. Pewien ktoś :-) powiedział że działa na baterie słoneczne... Ja chyba też. Zdaje się jednak, że nie na wszystkich działa ono pozytywnie...&lt;blockquote&gt;KogHutt: (20:25)&lt;br /&gt;słyszałeś? ten z patykiem i z simkiem&lt;br /&gt;?&lt;br /&gt;Tener: (20:25)&lt;br /&gt;nie wiem&lt;br /&gt;chyba nie&lt;br /&gt;KogHutt: (20:26)&lt;br /&gt;Patyk: X powiedziała, że mnie zabije, zgadnij jak ?&lt;br /&gt;Kogut: Umrzesz z przemęczenia.&lt;br /&gt;(20:27)&lt;br /&gt;Simek: hm... jak to było...&lt;br /&gt;(20:28)&lt;br /&gt;kurde, nie pamiętam&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Zaś co do matury... dokładnie za miesiąc jest pisemny polski. Jakoś nie chce mi się wierzyć w to, jak szybko ten czas przeszedł... trochę nostalgii wkrada się w te dni.&lt;br /&gt;&lt;br /&gt;Ale cóż zrobić - teraz jest Czas Kiełbasy...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.videomed.com.pl/tener/blog/kielbasa.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 405px; height: 48px;" src="http://www.videomed.com.pl/tener/blog/kielbasa.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Tak na zakończenie link z kilkoma filmami:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://video.google.com/videosearch?q=2lo"&gt;http://video.google.com/videosearch?q=2lo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Do zobaczenia!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-114417596191019852?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/114417596191019852/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/04/o-wionie-maturze-i-kiebasie-sw-kilka.html#comment-form' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114417596191019852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114417596191019852'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/04/o-wionie-maturze-i-kiebasie-sw-kilka.html' title='O wiośnie, maturze i kiełbasie słów kilka'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-114358367211463903</id><published>2006-03-29T00:01:00.000+02:00</published><updated>2006-03-29T00:07:52.136+02:00</updated><title type='text'>Czas... czas... czas...</title><content type='html'>...nie goni nas? Chyba jednak goni. Ostatnio zaczyna mi go bardzo brakować, a przynajmniej tej części, której nie wypełnia nauka czy inne zajęcia.&lt;br /&gt;&lt;br /&gt;Wczoraj, dzis i jutro mamy rekolekcje - z tej okazji prezentuję wykonany dziś przy udziale Koguta oksymoron:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.videomed.com.pl/tener/blog/oksymoron.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://www.videomed.com.pl/tener/blog/oksymoron.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To tyle na dziś! Idę spać. Jutro sprawdzian z fizyki, pojutrze z matmy, popojutrze wyjeżdzam... a potem trzeba oddać plan prezentacji z polskiego! Argh!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-114358367211463903?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/114358367211463903/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/03/czas-czas-czas.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114358367211463903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114358367211463903'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/03/czas-czas-czas.html' title='Czas... czas... czas...'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-114332393666789171</id><published>2006-03-25T22:52:00.001+01:00</published><updated>2008-04-07T23:37:40.754+02:00</updated><title type='text'>Za miesiąc matura...</title><content type='html'>Czy za dwa. Ostatnio tracę rachubę czasu. Chyba to przez to, że dużo dzieje się w moim życiu.&lt;br /&gt;Niech komentarzem do dzisiejszego dnia będzie kod programu który napisałem wczoraj/dzisiaj.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;#include "time.h"&lt;br /&gt;#include "stdlib.h"&lt;br /&gt;#include "stdio.h"&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;    time_t czas;&lt;br /&gt;    for(;;)&lt;br /&gt;    {&lt;br /&gt;    czas = time(NULL);&lt;br /&gt;    if (czas &gt; (1143243863+16200))&lt;br /&gt;    {&lt;br /&gt;        system("./foobar2000.exe metallica.fpl");&lt;br /&gt;        break;&lt;br /&gt;    }&lt;br /&gt;    sleep(100);&lt;br /&gt;    }&lt;br /&gt;    printf("Pobudka!!! Czas: %i\n",czas);&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Jeśli się komuś chce, niech spojrzy do dokumentacji funkcji time w ANSI C i sprawdzi co oznaczają wpisane wyżej liczby. Idę spać.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-114332393666789171?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/114332393666789171/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/03/za-miesic-matura.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114332393666789171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114332393666789171'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/03/za-miesic-matura.html' title='Za miesiąc matura...'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-114304103287132658</id><published>2006-03-22T16:23:00.000+01:00</published><updated>2006-03-22T17:23:48.056+01:00</updated><title type='text'>Najgorsze jest czekanie</title><content type='html'>&lt;p class="mobile-post"&gt;I już po egzaminie...&lt;/p&gt;&lt;p class="mobile-post"&gt;Powiem Wam, że nie potrafię sobie przypomnieć, kiedy ostatni raz wpompowałem w siebie taką dawkę adrenaliny. Najpierw było jakieś 45 minut czekania na egzamin teoretyczny. Jeden błąd, nic wielkiego, jakoś poszło. Później czekałem już trochę dłużej, będzie z godzinę. Plac zdałem.&lt;/p&gt;&lt;p class="mobile-post"&gt;Potem nastąpił irytujący czas oczekiwania w niedogrzanym pomieszczeniu, przy zepsutych automatach do kawy i batoników - szczęście że miałem coś do zjedzenia. W końcu, trzęsąc się trochę ze zdenerwowania, wsiadłem do niebieskiego fiata Panda, wyposażonego w elektrycznie ustawiane lusterka, instalację gazową, egzaminatora...&lt;/p&gt;&lt;p class="mobile-post"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="mobile-post"&gt;Na następny termin jeszcze się nie umówiłem.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-114304103287132658?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/114304103287132658/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/03/najgorsze-jest-czekanie.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114304103287132658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114304103287132658'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/03/najgorsze-jest-czekanie.html' title='Najgorsze jest czekanie'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-114287565406258411</id><published>2006-03-20T17:08:00.000+01:00</published><updated>2006-03-20T18:41:49.310+01:00</updated><title type='text'>"Sex for sale"</title><content type='html'>Blog mógł przez kilka dni odpocząć od mojej natrętnej obecności. Wyjazd do Zagórza i na narty do Młodych Buków (nie znam dokładnie pisowni czeskiej a nie chcę kaleczyć) nie pozostawił mi zbyt wiele czasu, szczególnie że pozostałą jego część spędziłem z moją rodzinką. Było fajnie :-)&lt;br /&gt;&lt;br /&gt;A co do tytułu posta: dokładnie tak samo zatytułowana była nasza dzisiejsza kserówka z angielskiego... Tekst okazał się (zgodnie z przewidywaniami prof. Rutkowskiego :-) ) przysłowiowym kijem wsadzonym w mrowisko. Dyskusja zajęła nam całe dwie godziny angielskiego i jak rzadko która wznieciła niemałe emocje. Chyba największym problemem było ustalenie czy prostytucja jest szkodliwa czy nie. Moja odpowiedź jest twierdząca, lecz nie zamierzam jej tutaj uzasadniać. Dzisiejszy angielski wystarczy,  kogo nie było niech żałuje ;-P&lt;br /&gt;&lt;br /&gt;Swoją drogą, ciekawie jest obserwować, jak ludzie pod wpływem emocji tracą możliwość wyrażania najprostszych myśli i zapominają brzmienia podstawowych słówek. Ale dość już o tym.&lt;br /&gt;&lt;br /&gt;Kolejnym ciekawym doświadczeniem dnia dzisiejszego była lekcja j. polskiego. Wraz ze zmianą tematu - rozpoczęliśmy poezję lingwistyczną - niektórym osobom poprawiły się nastroje. Różnica polega moim zdaniem na tym, że o ile wcześniej wysoce abstrakcyjne intepretacje wiersza były przekazywane z obrębie ławki, o tyle teraz możemy z czystym sumieniem podzielić się z nimi z naszą profesorką całkiem celnie trafiając w klucz. Taka poezja. Wspólnie z Patykiem i wyleczonym już z tęż... to znaczy... zapalenia gardła Lamą kontynuowaliśmy dzieło śmiesznych rysunków, nawzajem pisząc w swoich zeszytach. Z kolei Kogut wykazał się swoim destruktywnym charakterem: w chwili mojej nieuwagi porwał do ręki mój ołówek i - zanim zdążyłem zareagować - złamał go. Co ciekawe, wyglądało to na akcję nieświadomą... ale to chyba typowe dla niego.&lt;br /&gt;&lt;br /&gt;Na zakończenie zamieszczam zdjęcie zrobione dziś w przerwie wspomnianego polskiego. Widnieje na nim dość zakurzona lampa wsadzona do wiaderka wraz z butelką. Zwróciła naszą uwagę ze względu na absolutny brak celu dla którego miałaby stać w kącie sali... czy też w jakimkolwiek innym miejscu. Jak mógłby spotworzyć jakiś p... :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Lampa, która jest i butelka która jest jak lampa"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;stoi&lt;br /&gt;&lt;div style="text-align: center;"&gt;po co?&lt;br /&gt;&lt;div style="text-align: right;"&gt;co?&lt;br /&gt;&lt;div style="text-align: center;"&gt;wi&lt;span style="font-weight: bold;"&gt;adder&lt;/span&gt;ko.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;br /&gt;.Cin op&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.videomed.home.pl/tener/blog/lampa.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://www.videomed.home.pl/tener/blog/lampa.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Aha, jeszcze jedna rzecz. Byłoby mi miło przeczytać Wasze komentarze.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-114287565406258411?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/114287565406258411/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/03/sex-for-sale.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114287565406258411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114287565406258411'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/03/sex-for-sale.html' title='&quot;Sex for sale&quot;'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-114251774666233990</id><published>2006-03-16T14:58:00.000+01:00</published><updated>2006-03-16T15:02:26.676+01:00</updated><title type='text'>Armia wzywa!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.videomed.home.pl/tener/blog/polish_army.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://www.videomed.home.pl/tener/blog/polish_army.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Nie wiem jak Wy, ale ja bardzo nie lubię chadzać do wszelkiej maści urzędów. Dziś przyszło mi, niestety, przyjść do badania na komisję rekrutacyjną. Dostałem "A" i mam przed sobą perspektywę 6 tygodni wyciętych z życiorysu (dziś były to na szczęście jedynie 3 godziny) po 3 roku studiów. Co za kraj...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-114251774666233990?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/114251774666233990/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/03/armia-wzywa.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114251774666233990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114251774666233990'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/03/armia-wzywa.html' title='Armia wzywa!'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-114244127495198763</id><published>2006-03-15T17:44:00.000+01:00</published><updated>2006-03-15T17:50:48.000+01:00</updated><title type='text'>Mroczna fizyka</title><content type='html'>Wiele osób twierdzi że sylwetka przechadzającego się nowego fizyka jest... mroczna. Sami oceńcie... zdjęcie zrobione od tyłu, aby nie przerazić wrażliwych czytelników ;-)&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.videomed.home.pl/tener/blog/fizyk.jpg"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://www.videomed.home.pl/tener/blog/fizyk.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-114244127495198763?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/114244127495198763/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/03/mroczna-fizyka.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114244127495198763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114244127495198763'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/03/mroczna-fizyka.html' title='Mroczna fizyka'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-114236095409204498</id><published>2006-03-14T19:05:00.000+01:00</published><updated>2006-03-17T19:20:51.003+01:00</updated><title type='text'>Żyrafa... płonąca!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.videomed.home.pl/tener/blog/zyrafa2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://www.videomed.home.pl/tener/blog/zyrafa2.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;... bo jaka by miała być inna ;-) ?&lt;br /&gt;&lt;br /&gt;Niestety nie potrafie jej narysować zbyt dobrze. Cóż, rysunek wymaga lat ćwiczeń, a tych nie mam za sobą.&lt;br /&gt;&lt;br /&gt;Ta narysowana jest w zeszycie do polskiego :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-114236095409204498?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/114236095409204498/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/03/yrafa-ponca.html#comment-form' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114236095409204498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114236095409204498'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/03/yrafa-ponca.html' title='Żyrafa... płonąca!'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24007926.post-114228509008080676</id><published>2006-03-13T21:55:00.000+01:00</published><updated>2006-03-13T22:38:14.900+01:00</updated><title type='text'>Pierwszy post</title><content type='html'>Tytuł tego posta jest, zaiste, niewymyślny. Jednakże ponieważ nic innego nie przychodzi mi  głowy, taki tytuł pozostanie... Niech będzie ten post pewnym wprowadzeniem do całości bloga.&lt;br /&gt;&lt;br /&gt;Od pewnego czasu nosiłem się z zamiarem utworzenia czegoś w stylu pamiętnika. Jako że papier uważam za raczej nietrwały środek przenoszenia informacji (a na pewno łatwo jest go zgubić...) więc od początku stawiałem na zapis elektroniczny. Jeżeli ktoś jest ciekaw jak doszedłem do Bloggera niech śmiało pyta. Większość chyba nie bardzo.&lt;br /&gt;&lt;br /&gt;Cóż znajdzie się w tym blogu? Muszę ostrzec, że niektóre moje posty mogą okazać się &lt;span style="font-weight: bold;"&gt;mało zrozumiałe&lt;/span&gt;. Zdażać się też będzie, że niektóre z nich będą &lt;span style="font-weight: bold;"&gt;niezrozumiałe&lt;/span&gt;.  Liczę się także z tym, że niektóre będą &lt;span style="font-weight: bold;"&gt;rozumiane nieprawidłowo. &lt;/span&gt;Dlatego proszę nie wysuwać pochopnych wniosków i raczej skontaktować się z autorem niż z prokuraturą... czy też zakładem psychiatrycznym ;-)&lt;br /&gt;&lt;br /&gt;Mam zamiar opisywać w blogu różne rzeczy, czasami zamieszczać linki do programów, zdjęcia... zobaczycie sami.&lt;br /&gt;&lt;br /&gt;Zapraszam :-)&lt;br /&gt;&lt;br /&gt;Autor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24007926-114228509008080676?l=plonacazyrafa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plonacazyrafa.blogspot.com/feeds/114228509008080676/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/03/pierwszy-post.html#comment-form' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114228509008080676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24007926/posts/default/114228509008080676'/><link rel='alternate' type='text/html' href='http://plonacazyrafa.blogspot.com/2006/03/pierwszy-post.html' title='Pierwszy post'/><author><name>Tener</name><uri>http://www.blogger.com/profile/06657309948578892831</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
