<?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-7005132798021120046</id><updated>2011-12-03T09:51:53.451-08:00</updated><category term='komentarze'/><category term='C++'/><category term='matematyka'/><category term='awk'/><category term='Kaczyński'/><category term='muzyka'/><category term='grafika'/><category term='java'/><category term='forex'/><category term='web'/><category term='unix'/><category term='polityka'/><category term='aplet'/><category term='telewizja'/><category term='fizyka'/><category term='JavaScript'/><category term='bash'/><category term='astronomia'/><category term='programowanie'/><title type='text'>improwizacje metatematyczne</title><subtitle type='html'>* MATEMATYKA * FOREX * PROGRAMOWANIE * MUZYKA * FIZYKA * ASTRONOMIA *</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>30</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-231012670402658448</id><published>2009-11-04T11:53:00.000-08:00</published><updated>2009-11-04T13:13:45.173-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>JavaScript jako język funkcyjny</title><content type='html'>&lt;P&gt;&lt;a href="https://developer.mozilla.org/en/A_re-introduction_to_JavaScript"&gt;JavaScript&lt;/a&gt;, język znany powszechnie jako wbudowana maszyna skryptowa przeglądarek webowych, jest kompletnie niedoceniany jako język programowania. Tymczasem jest to zgrabny i mały, ale bardzo elastyczny język dynamiczny. Obsługuje funkcje jako obiekty pierwszej klasy, domknięcia (closures) i funkcje anonimowe. To sprawia, że jest pełnoprawnym członkiem rodziny języków funkcyjnych, a ponieważ jego składnia jest prosta i zbliżona do C, posiada wielką siłę wyrazu, niektórzy zgodzą się nawet, że większą niż języki obiektowe oparte na klasach.
&lt;/P&gt;&lt;P&gt;
Sam język ani standardowa biblioteka nie posiada wielu udogodnień, ale moc wyrazu JavaScript (może należałoby pisać &lt;a href="http://www.ecmascript.org/docs.php"&gt;ECMAScript&lt;/a&gt;, ale w dalszym ciągu pozwolę sobie konsekwentnie używać tej pierwszej nazwy) jest tak duża, że potrzebne mechanizmy łatwo definiujemy.
&lt;/P&gt;&lt;P&gt;
Jako pierwszy przykład rozpatrzę iteratory.  Chcemy stworzyć obiekt pozwalający na łatwe  indeksowanie tablic, a w przyszłości będący wzorem dla ogólniejszych mechanizmów (wykorzystam go poniżek opisując implementację teoriomnogościowych zbiorów).  Nasz iterator to funkcja, która po utworzeniu ustawia się na początku sekwencji, każde jej wywołanie generuje kolejny element, a gdy sekwencja się skończy, zwraca obiekt niezdefiniowany:
&lt;/P&gt;
&lt;P&gt;
&lt;pre style="color:#000000; background-color:#ffffff; font-size:10pt; font-family:'Courier New';"&gt;
&lt;span style="color:#000000; font-weight:bold"&gt;function&lt;/span&gt; &lt;span style="color:#010181"&gt;iterator&lt;/span&gt;&lt;span style="color:#000000"&gt;(&lt;/span&gt; arr &lt;span style="color:#000000"&gt;) {&lt;/span&gt;
        &lt;span style="color:#000000; font-weight:bold"&gt;var&lt;/span&gt; index &lt;span style="color:#000000"&gt;=&lt;/span&gt; &lt;span style="color:#2928ff"&gt;0&lt;/span&gt;&lt;span style="color:#000000"&gt;;&lt;/span&gt;

        &lt;span style="color:#000000; font-weight:bold"&gt;return function&lt;/span&gt;&lt;span style="color:#000000"&gt;() {&lt;/span&gt;
                &lt;span style="color:#000000; font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#000000"&gt;(&lt;/span&gt; index &lt;span style="color:#000000"&gt;&amp;gt;=&lt;/span&gt; arr&lt;span style="color:#000000"&gt;.&lt;/span&gt;length &lt;span style="color:#000000"&gt;)&lt;/span&gt;
                        &lt;span style="color:#000000; font-weight:bold"&gt;return&lt;/span&gt; undefined&lt;span style="color:#000000"&gt;;&lt;/span&gt;
                &lt;span style="color:#000000; font-weight:bold"&gt;return&lt;/span&gt; arr&lt;span style="color:#000000"&gt;[&lt;/span&gt; index&lt;span style="color:#000000"&gt;++ ];&lt;/span&gt;
        &lt;span style="color:#000000"&gt;}&lt;/span&gt;
&lt;span style="color:#000000"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;/P&gt;&lt;P&gt;
Funkcja "iterator" jest konstruktorem iteratora, zamyka tablicę "arr" i zmienną "index" w domknięciu i tworzy funkcję używającą tych obiektów. Rezultatem wywołania funkcji "iterator" jest właśnie iterator.  Jego pierwsze wywołanie zwraca pierwszy element tablicy, kolejne wywołania zwracają kolejne elementy.  Na przykład:&lt;/P&gt;
&lt;P&gt;
&lt;pre style="color:#000000; background-color:#ffffff; font-size:10pt; font-family:'Courier New';"&gt;
&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;var&lt;/span&gt; it &lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;iterator&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;( [&lt;/span&gt;&lt;span style="color: rgb(41, 40, 255);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(41, 40, 255);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(41, 40, 255);"&gt;3&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt;&lt;span style="color: rgb(41, 40, 255);"&gt;4&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;] );&lt;/span&gt;
&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;for&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(1, 1, 129);"&gt;it&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;();&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;!=&lt;/span&gt; undefined&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt; x&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(1, 1, 129);"&gt;it&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() )&lt;/span&gt;
&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;
&lt;span style="color: rgb(1, 1, 129);"&gt;     print&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;
&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;
&lt;/PRE&gt;&lt;/P&gt;

&lt;P&gt;
Taki kod wypisze zawartość tablicy.
&lt;/P&gt;&lt;P&gt;
Tak skonstruowany iterator jest obiektem-funkcją.  Widzimy, że definicja nasza była zwięzła i przejrzysta, dzięki domknięciom i funkcjom pierwszej klasy.
&lt;/P&gt;&lt;P&gt;
Biblioteki języków obiektowych zawierają definicje różnorakich kolekcji, list, kolejek, wektorów, map itp.  Postanowiłem skonstruować na próbę zestaw funkcji i obiektów JavaScript odzwierciedlających podstawowy rachunek aksjomatycznej teorii mnogości.  Użytkownicy Javy czy STL
z pewnością nie będą pytać o celowość definiowania tak ogólnych mechanizmów.&lt;/P&gt;&lt;p&gt;
Nasze zbiory mogą zawierać dowolne elementy (w końcu po to JavaScript jest językiem o słabej typizacji, żeby z tego faktu korzystać).  Dla każdego z nich musi istnieć sposób (funkcja? metoda?) na określenie przynależności dowolnego obiektu.  Poza tym chcemy mieć możliwość wykonywania takich podstawowych operacji jak dodawanie, selekcja podzbioru (wybór elementów spełniających podany predykat), tworzenie zbioru potęgowego.  Siła programowania funkcyjnego
polega na tym, że używając kilku prostych pojęć budujemy bardziej złożone, robiąc to prawie tak, jak definiuje się je w matematyce.&lt;/p&gt;&lt;p&gt;
Załóżmy na początek, że zbiór jest reprezentowany przez funkcję przynależności. Wywołana z dowolnym argumentem powinna zwrócić wartość logiczną zdania "argument należy do tego zbioru". Używając tej konwencji definiujemy łatwo:
&lt;/p&gt;
&lt;p&gt;
1) zbiór pusty:&lt;/p&gt;
&lt;p&gt;&lt;pre style="color:#000000; background-color:#ffffff; font-size:10pt; font-family:'Courier New';"&gt;
&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;   function&lt;/span&gt;  &lt;span style="color: rgb(1, 1, 129);"&gt;empty&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() {&lt;/span&gt;
    &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return false&lt;/span&gt;
   &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;2) sumę zbiorów:&lt;/p&gt;
&lt;p&gt;&lt;pre style="color:#000000; background-color:#ffffff; font-size:10pt; font-family:'Courier New';"&gt;  &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;function&lt;/span&gt;  &lt;span style="color: rgb(1, 1, 129);"&gt;sum&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; a&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt; b &lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;
    &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return  function&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;
     &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;) ||&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;b&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;
    &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;
   &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Tutaj już użyliśmy domknięcia, na razie sprawa jest prosta i piękna.&lt;/p&gt;
&lt;p&gt; 3) podzbiór elementów spełniających predykat P:&lt;/p&gt;
&lt;p&gt;&lt;pre style="color:#000000; background-color:#ffffff; font-size:10pt; font-family:'Courier New';"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;function&lt;/span&gt;  &lt;span style="color: rgb(1, 1, 129);"&gt;subset&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; a&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt; P &lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;
    &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return  function&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;
     &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt;  &lt;span style="color: rgb(1, 1, 129);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;) &amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;P&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;
    &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;
   &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;
&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;Tu widzimy, że reprezentacja zbioru jest tożsama z predykatem, a operacja "subset" z częścią wspólną.&lt;/p&gt;&lt;p&gt;Problem pojawia się w momencie, gdy próbujemy utworzyć zbiór potęgowy. Zbiór potęgowy danego zbioru X jest to zbiór wszystkich podzbiorów zbioru X. Zbiór jest podzbiorem innego, gdy zawiera się w nim.  Zatem funkcja przynależności to zawieranie, a zatem: &lt;/p&gt;&lt;p&gt; 4) zbiór potęgowy: &lt;/p&gt;
&lt;p&gt;&lt;pre style="color:#000000; background-color:#ffffff; font-size:10pt; font-family:'Courier New';"&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;function&lt;/span&gt;  &lt;span style="color: rgb(1, 1, 129);"&gt;power&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; a &lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;
    &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return function&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;
     &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;includes&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; a&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;
    &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;
   &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Co jednak oznacza stwierdzenie, że zbiór a zawiera zbiór x ?  Oznacza to, że ich część wspólna jest równa x !&lt;p&gt;
&lt;p&gt; 5) zawieranie:&lt;/p&gt;&lt;p&gt;&lt;pre style="color:#000000; background-color:#ffffff; font-size:10pt; font-family:'Courier New';"&gt;
   &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;function&lt;/span&gt;  &lt;span style="color: rgb(1, 1, 129);"&gt;includes&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; a&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;
    &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt;  &lt;span style="color: rgb(1, 1, 129);"&gt;equals&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;subset&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; a&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;),&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;
   &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;A co oznacza równość zbiorów ?  Aby zdefiniować ten predykat musimy albo posłużyć się zawieraniem, co spowoduje nieskończoną rekursję, albo wyliczyć wszystkie elementy.  Rozszerzamy więc reprezentację zbiorów o funkcję zwracającą iterator.  Pozwoli to wyliczyć wszystkie elementy i sprawdzić ich przynależność.  Nasz zbiór jest więc dwójką składającą się z funkcji "contains" - będącej odpowiednikiem funkcji przynależności - i funkcji "iterator" zwracającej iterator ustawiony na pierwszy element zbioru, gwarantujący jednokrotne wyliczenie każdego elementu.&lt;/p&gt;
&lt;p&gt; Teraz zbiór pusty wygląda tak: &lt;/p&gt;
&lt;p&gt; 1a) Zbiór pusty: &lt;/p&gt;
&lt;pre style="color:#000000; background-color:#ffffff; font-size:10pt; font-family:'Courier New';"&gt;
&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;var&lt;/span&gt; empty &lt;span style="color: rgb(0, 0, 0);"&gt;= {&lt;/span&gt;
 contains&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() {&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return false&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;},&lt;/span&gt;
 iterator&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() {&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return function&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(){&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; undefined&lt;span style="color: rgb(0, 0, 0);"&gt;}}&lt;/span&gt;
&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;2a) Suma jest nieco bardziej skomplikowana: &lt;/p&gt;
&lt;pre style="color:#000000; background-color:#ffffff; font-size:10pt; font-family:'Courier New';"&gt;
&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;function&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;sum&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;a&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt; b&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;
 &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;
  contains&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; a&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(1, 1, 129);"&gt;contains&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;x&lt;span style="color: rgb(0, 0, 0);"&gt;) ||&lt;/span&gt; b&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(1, 1, 129);"&gt;contains&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;x&lt;span style="color: rgb(0, 0, 0);"&gt;)},&lt;/span&gt;
  iterator&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()    {&lt;/span&gt;
   &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;var&lt;/span&gt; i1 &lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt; a&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(1, 1, 129);"&gt;iterator&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;();&lt;/span&gt;
   &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;var&lt;/span&gt; i2 &lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt; b&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(1, 1, 129);"&gt;iterator&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;();&lt;/span&gt;
   &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return function&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() {&lt;/span&gt;
    &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;var&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;i1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;();&lt;/span&gt;
    &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;==&lt;/span&gt; undefined &lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;
     &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;while&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;
      &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;var&lt;/span&gt; next &lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;i2&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;();&lt;/span&gt;
      &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; next &lt;span style="color: rgb(0, 0, 0);"&gt;==&lt;/span&gt; undefined &lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; undefined&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;
      &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; a&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(1, 1, 129);"&gt;contains&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;next&lt;span style="color: rgb(0, 0, 0);"&gt;) )&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;continue&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;
      &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; next&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;
     &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;
    &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;
    &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;
     &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; x&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;
    &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;
   &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;
  &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;
 &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;
&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Komplikacja bierze się z konieczności zagwarantowania braku powtórzeń w iteratorze. Iterator sumy domyka dwa iteratory składników, wyczerpuje pierwszy, a potem używa drugiego sprawdzając, czy zwrócony element nie był już wyliczony wcześniej.&lt;/p&gt;
&lt;p&gt; 3a) podzbiór elementów spełniających predykat P: &lt;/p&gt;
&lt;pre style="color:#000000; background-color:#ffffff; font-size:10pt; font-family:'Courier New';"&gt;
&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;function&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;subset&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; a&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt; p &lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;
&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;
 &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;
  contains&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;function&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;
     &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; a&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(1, 1, 129);"&gt;contains&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;) &amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;p&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;
    &lt;span style="color: rgb(0, 0, 0);"&gt;},&lt;/span&gt;
  iterator&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;function&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;() {&lt;/span&gt;
     &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;var&lt;/span&gt; it &lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt; a&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(1, 1, 129);"&gt;iterator&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;();&lt;/span&gt;
     &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return function&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() {&lt;/span&gt;
      &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;var&lt;/span&gt; x&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;
      &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;while&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;true&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;
       x &lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;it&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;();&lt;/span&gt;
       &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;==&lt;/span&gt; undefined &lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; undefined&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;
       &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;p&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;) )&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; x&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;
      &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;
     &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;
    &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;
 &lt;span style="color: rgb(0, 0, 0);"&gt;};&lt;/span&gt;
&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;
I wreszcie sprawca zamieszania, zbiór potęgowy:&lt;/p&gt;&lt;p&gt;
4a) Zbiór potęgowy:&lt;/p&gt;
&lt;pre style="color:#000000; background-color:#ffffff; font-size:10pt; font-family:'Courier New';"&gt;
&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;function&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;power&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; a &lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;
 &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;
  contains&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;
     &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;includes&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x&lt;span style="color: rgb(0, 0, 0);"&gt;,&lt;/span&gt; a &lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;
    &lt;span style="color: rgb(0, 0, 0);"&gt;},&lt;/span&gt;
  iterator&lt;span style="color: rgb(0, 0, 0);"&gt;:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;function&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() {&lt;/span&gt;
     &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;var&lt;/span&gt; div &lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;divide&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; a &lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;
     &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; div&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;head &lt;span style="color: rgb(0, 0, 0);"&gt;==&lt;/span&gt; undefined &lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;
      &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;singleton&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; empty &lt;span style="color: rgb(0, 0, 0);"&gt;).&lt;/span&gt;&lt;span style="color: rgb(1, 1, 129);"&gt;iterator&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;();&lt;/span&gt;
     &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;var&lt;/span&gt; tail_pow &lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;power&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; div&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;tail &lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;
     &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;var&lt;/span&gt; tail_pow_iterator1 &lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt; tail_pow&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(1, 1, 129);"&gt;iterator&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;();&lt;/span&gt;
     &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;var&lt;/span&gt; tail_pow_iterator2 &lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt; tail_pow&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;span style="color: rgb(1, 1, 129);"&gt;iterator&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;();&lt;/span&gt;
     &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return function&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() {&lt;/span&gt;
      &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;var&lt;/span&gt; x&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;
      x &lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;tail_pow_iterator1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;();&lt;/span&gt;
      &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;!=&lt;/span&gt; undefined &lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;
       &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; x&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;
      x &lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;tail_pow_iterator2&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;();&lt;/span&gt;
      &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;==&lt;/span&gt; undefined &lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;
       &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; undefined&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;
      &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;sum&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; &lt;span style="color: rgb(1, 1, 129);"&gt;singleton&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt; div&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;head &lt;span style="color: rgb(0, 0, 0);"&gt;),&lt;/span&gt; x &lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;
     &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;
         &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;
 &lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;
&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;

&lt;/pre&gt;
&lt;p&gt;
Pełne źródła tych procedur można pobrać tu: &lt;a href="http://docs.google.com/Doc?docid=0AWXmNptxQq2lZGczNmo3bjhfMGNzZDMzNWZk&amp;hl=en"&gt;sets.txt&lt;/a&gt;, tam też znajdują się pomocnicze procedury "includes" i "divide".  Ta druga posłużyła do wydzielenia jednego elementu i reszty - z dowolnego zbioru.  Dzięki temu zbiór potęgowy mógł zostać zdefiniowany rekursywnie.
&lt;/p&gt;
&lt;p&gt;
A teraz proszę popatrzeć, jak to ładnie działa:
&lt;/p&gt;
Oto wynik działania programu testowego:
&lt;pre&gt;
Zbior 4 - elementowy:
{1, 2, 3, 4}
Jego zbiór potęgowy:
{{}, {4}, {3}, {3, 4}, {2}, {2, 4}, {2, 3}, {2, 3, 4}, {1}, {1, 4}, {1, 3}, {1, 3, 4}, {1, 2}, {1, 2, 4}, {1, 2, 3}, {1, 2, 3, 4}}
Zbiór podzbiorów właściwych:
{{4}, {3}, {3, 4}, {2}, {2, 4}, {2, 3}, {2, 3, 4}, {1}, {1, 4}, {1, 3}, {1, 3, 4}, {1, 2}, {1, 2, 4}, {1, 2, 3}}
Albo:
{{4}, {3}, {3, 4}, {2}, {2, 4}, {2, 3}, {2, 3, 4}, {1}, {1, 4}, {1, 3}, {1, 3, 4}, {1, 2}, {1, 2, 4}, {1, 2, 3}}
Czy zbiór jest jednoelementowy ?
{} :  false
{1} :  true
{1, {}} :  false
Istnienie elementu o podanej wlasnosci:
{1, 2, 3, 4} , 3:  true
{1, 2, 3, 4} , 100:  false
Kwantyfikator ogólny:
Czy zbior jest dwuelementowy ?
{} :  false
{1} :  false
{{}, {1}} :  true
{1, 2, 3, 4} :  false
&lt;/pre&gt;
&lt;p&gt;
Warto zwrócić uwagę na sposób definiowania kwantyfikatorów - funkcje anonimowe (w notacji lambdapodobnej) dają możliwość nazywania zmiennych związanych pod kwantyfikatorem, więc da się tego używać bez wielkiego wysiłku. Porównawszy to z kodem, który trzebaby napisać w &lt;b&gt;C++&lt;/b&gt; używając &lt;b&gt;&amp;lt;functional&amp;gt;&lt;/b&gt; widzimy moc wyrazu &lt;b&gt;JavaScript&lt;/b&gt;.  &lt;/p&gt;&lt;p&gt;I kto dalej twierdzi, że &lt;b&gt;JavaScript&lt;/b&gt; to język do robienia animowanych buttonów w internecie ?  No kto ?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-231012670402658448?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/231012670402658448/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=231012670402658448' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/231012670402658448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/231012670402658448'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2009/11/javascript-jako-jezyk-funkcyjny.html' title='JavaScript jako język funkcyjny'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-1315811718259562161</id><published>2009-09-07T04:25:00.000-07:00</published><updated>2009-11-04T09:52:40.052-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>szablony w C++</title><content type='html'>Mechanizm szablonów w C++ umożliwia deklarowanie klas i funkcji sparametryzowanych typami lub wartościami.  Klasa w C++ wprowadza przestrzeń nazw, w której można deklarować obiekty statyczne
- daje to możliwość używania szablonów do deklarowania innych obiektów języka, nie tylko klas i funkcji - bezpośrednio nie byłoby to możliwe.

Nie można na przykład zdefiniować szablonu tablicy, o tak:
&lt;pre&gt;
template &amp;lt;class T&amp;gt;
T table[100];
&lt;/pre&gt;
Ale można uzyskać pożądany efekt w taki prosty sposób:
&lt;pre&gt;
template &amp;lt;class T&amp;gt;
class t {
        public:
        static T table[100];
};

template &amp;lt;class T&amp;gt;
T t&amp;ltT&amp;gt;::table[ 100 ];
&lt;/pre&gt;
Podobnie można postąpić z innymi kontrukcjami:

Np. wyliczenie:

&lt;pre&gt;
template &amp;lt;int N&amp;gt;
class t {
        public:
                enum en {
                        START=N,
                        STOP
                };
};
&lt;/pre&gt;

Szablonów można użyć do wielu nieoczywistych sztuczek. Oto jak można sprawdzić, czy dwa wyrażenia są tego samego typu:
&lt;pre&gt;
template &amp;lt;class T&amp;gt;
bool same_type(const T&amp;, const T&amp;) {
        return true;
}

template &amp;lt;class T1, class T2&amp;gt;
bool same_type(const T1&amp;, const T2&amp;) {
        return false;
}

int main()
{
        std::cout &lt;&lt; same_type(1, 2) &lt;&lt; '\n';
        std::cout &lt;&lt; same_type(1, 2.1) &lt;&lt; '\n';
}
&lt;/pre&gt;
Kompilator oczywiście całkowicie optymalizuje taką funkcję - zamienia ją na stałą.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-1315811718259562161?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/1315811718259562161/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=1315811718259562161' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/1315811718259562161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/1315811718259562161'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2009/09/szablony-w-c.html' title='szablony w C++'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-4761920792490964211</id><published>2009-07-24T07:32:00.000-07:00</published><updated>2009-09-06T08:23:46.134-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Unifikacja termów w C++</title><content type='html'>Jeden z moich znajomych napisał ostatnio zestaw klas w języku C++, która dzięki zastosowaniu operatora &lt;b&gt;&lt;tt&gt;()&lt;/tt&gt;&lt;/b&gt; do konstrukcji termów i operatora &lt;b&gt;&lt;tt&gt;==&lt;/tt&gt;&lt;/b&gt; do unifikacji pozwala programować w stylu Prologu w języku C++.

Do obejrzenia tu:  &lt;a href="http://symbolism.110mb.com"&gt;http://symbolism.110mb.com&lt;/a&gt;
&lt;P&gt;
Ci, którzy programują w Prologu, wiedzą, co to jest term.

Term, to wyrażenie składające się ze stałych, zmiennych i wyrażeń typu &lt;b&gt;&lt;tt&gt;f(x1, x2, ... ) &lt;/tt&gt;&lt;/b&gt; gdzie &lt;b&gt;&lt;tt&gt;f&lt;/tt&gt;&lt;/b&gt; jest nazwą funktora (symbolem) a &lt;tt&gt;&lt;b&gt;x1, x2, ...&lt;/b&gt;&lt;/tt&gt; też są termami.

Jeśli oznaczymy zmienne nazwami zaczynającymi się od dużych liter (&lt;b&gt;&lt;tt&gt;X, Y, Z &lt;/tt&gt;&lt;/b&gt; itp) a stałe innymi nazwami , liczbami itp, term może wyglądać tak:

&lt;pre&gt;
f
ala( f, f(X, Y, 10), X)
ala( 0 )
&lt;/pre&gt;

i tak dalej.

W skrócie mówiąc - unifikacja termów, to takie dopasowanie wartości zmiennych (wartości zmiennych też mają być termami) aby dwa unifikowane termy uzyskały tę samą wartość. Unifikacja może się nie udać, zmienne nie są wtedy zmieniane (mówi się też - ukonkretnione)

Jeśli oznaczymy symbolem &lt;b&gt;&lt;tt&gt;==&lt;/tt&gt;&lt;/b&gt; operację unifikacji, możemy napisać:

&lt;pre&gt;
f( X, 1 ) == f( 2, Y )                   
-&gt; zmienna X zyskuje wartość 2, Y wartość 1

f( X, g( Y, 0 ), Y ) == f( 1, Z, g( 2 )) 
-&gt; zmienna X zyskuje wartość 1, Y wartość g(2) a Z wartość g(g(2), 0)

f( X, g( 1 )) == f( 0, 2 )   -&gt; unifikacja zawodzi, zmienne pozostają wolne.
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-4761920792490964211?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/4761920792490964211/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=4761920792490964211' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/4761920792490964211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/4761920792490964211'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2009/07/unifikacja-termow-w-c.html' title='Unifikacja termów w C++'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-6378371444619223317</id><published>2009-06-06T18:00:00.000-07:00</published><updated>2009-06-06T10:00:39.133-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='forex'/><title type='text'>Spread, lewar i pipsy na rynku Forex</title><content type='html'>Wszyscy co prawda wiedzą, co oznaczają &lt;font color=brown&gt;pipsy&lt;/font&gt;, &lt;font color=green&gt;lewar&lt;/font&gt; i tym podobne pojęcia, ale może nie wszyscy potrafią wyciągać odpowiednie wnioski z tej wiedzy. Tymczasem na wyniki strategii stosowanej na rynku forex wpływa równocześnie wiele czynników: rozmiar pozycji (&lt;font color=brown&gt;pipsy&lt;/font&gt;), stosowany &lt;font color=green&gt;lewar&lt;/font&gt;, skuteczność (prawdopodobieństwo) i oczywiście spread (koszty stałe transakcji).
&lt;p&gt;
Ponieważ jest to wpływ równoczesny, sytuacja jest złożona, mimo, że w istocie chodzi tu o matematykę na szkolnym poziomie.
&lt;p&gt;
Musisz koniecznie wiedzieć, co dokładnie dzieje się gdy wykonujesz traksakcję o danych parametrach.  Wyobraź sobie, że dysponujesz kwotą 100 $, wchodzisz na rynek z &lt;font color=green&gt;lewarem&lt;/font&gt; 10, przy spreadzie &lt;font color=brown&gt;4 pipsy&lt;/font&gt;  (umawiamy się dla celów tych rozważań, że &lt;font color=brown&gt;10 pipsów&lt;/font&gt; = 1 promil) ustawiasz poziom 'take profit' na wysokości &lt;font color=brown&gt;30 pipsów&lt;/font&gt; i po kilku godzinach zgarniasz kasę.  Pytanie - ile ? Jeśli to rozumiesz i umiesz wyliczyć, to dobrze, ale spójrz niżej, zobacz, czy czegoś nie pomijasz.
&lt;p&gt;
Przy &lt;font color=green&gt;lewarze&lt;/font&gt; 10 handlujesz w rzeczywistości 1000 $, przy spreadzie 0.0004 i TP=0.003 zarabiasz 0.0026 * 1000 = 2.60 $, co daje czynnik 0.026 profitu.  W razie straty przy SL=-0.003 tracisz 0.0034 * 1000 = 3.40 $ ponieważ spread działa zawsze na niekorzyść gracza.  Dlatego zysk i strata nie są symetryczne, mimo, że ustawiliśmy poziomy TP i SL w równych odległościach.
&lt;p&gt;
Wyobraźmy sobie hipotetyczną metodologię, która dla danej pary umożliwia prognozowanie ruchy kursu o &lt;font color=brown&gt;50 pipsów&lt;/font&gt;.  Jej skuteczność niech wynosi 70 %.  Oto jak wygląda wartość porfela gracza, który wykonuje 20 transakcji stosując opartą o taką prognozę strategię przy spreadzie &lt;font color=brown&gt;4 pipsy&lt;/font&gt;, trafiając "take profit" 14 razy:

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_le2GD5kB0hs/SiqcOEyPFtI/AAAAAAAAADo/ognacisLIXc/s1600-h/chart1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 240px;" src="http://4.bp.blogspot.com/_le2GD5kB0hs/SiqcOEyPFtI/AAAAAAAAADo/ognacisLIXc/s400/chart1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5344255673445062354" /&gt;&lt;/a&gt;


W zależności od zastosowanego &lt;font color=green&gt;lewara&lt;/font&gt; gracz zarabia aż do 170 %, ale widać jasno, że &lt;font color=red&gt;&lt;span style="font-weight:bold;"&gt;LEWARA NIE MOŻNA BEZKARNIE ZWIĘKSZAĆ&lt;/span&gt;&lt;/font&gt; w nieskończoność:   w pewnym momencie następuje nasycenie profitu !  Dla &lt;font color=green&gt;lewara&lt;/font&gt; 120 obserwujemy już stratę. &lt;font color=green&gt;Lewar&lt;/font&gt; wpływa bardziej na wahania, a mniej na wynik końcowy.
&lt;p&gt;
Odpowiedzialność za taki fatalny stan rzeczy ponosi spread (czyli broker, który zgarnia całą kasę zachłannego gracza, podobnie jak krupier w kasynie). Oto jak wygląda zależność zarobku w naszej hipotetycznej sytuacji od zastosowanego &lt;font color=green&gt;lewara&lt;/font&gt; przy różnych spreadach:

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_le2GD5kB0hs/SiqdCdbL30I/AAAAAAAAADw/RrRbEKHlzE0/s1600-h/chart2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 240px;" src="http://1.bp.blogspot.com/_le2GD5kB0hs/SiqdCdbL30I/AAAAAAAAADw/RrRbEKHlzE0/s400/chart2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5344256573412466498" /&gt;&lt;/a&gt;

Słabsze strategie są jeszcze bardziej podatne na te efekty i wręcz
nie działają na dużych spreadach, mimo, że nie stosujemy &lt;font color=green&gt;lewara&lt;/font&gt;.

&lt;p&gt;
Co jeszcze warto wiedzieć ?
&lt;p&gt;
Występujące w przyrodzie spready nieprzypadkowo mają taką wielkość, że działające strategie musiałyby mieć dzielność rzędu 65% lub większą - dla wielkości pozycji przekraczającej około dziesięciokrotnie wartość spreadu.  To jest maksymalny poziom trafności, jaki można osiągnąć stosując znane metody (włączając w to sieci neuronowe, algorytmy genetyczne, filtry bayesowskie i inne metody - określane jako standardowe, choć nie są one proste).
&lt;p&gt;
Istnieje jeszcze jedna pułapka na chciwych graczy: "margin call". O tym też trzeba pamiętać.  Można po prostu stracić wszystko za jednym zamachem, jeśli przedobrzymy z &lt;font color=green&gt;lewarem&lt;/font&gt;.
&lt;p&gt;
Tak więc rację ma Oanda, twierdząc, że dla tradera to właśnie niskie spready są istotne, a nie duże &lt;font color=green&gt;lewary&lt;/font&gt;.  W warunkach bojowych &lt;font color=green&gt;lewar&lt;/font&gt; większy od 10 to lichwiarska pułapka !  Na stronach Oandy dokładnie opisane są te sprawy, ten broker stara się uczciwie informować o podstawowych regułach gry.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-6378371444619223317?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/6378371444619223317/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=6378371444619223317' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/6378371444619223317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/6378371444619223317'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2009/05/spread-lewar-i-pipsy-na-rynku-forex.html' title='Spread, lewar i pipsy na rynku Forex'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_le2GD5kB0hs/SiqcOEyPFtI/AAAAAAAAADo/ognacisLIXc/s72-c/chart1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-6039353321638440645</id><published>2009-05-28T12:04:00.000-07:00</published><updated>2009-05-29T09:54:19.495-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='matematyka'/><title type='text'>Paradoks skuteczności lekarstw</title><content type='html'>W jednym ze starych numerów &lt;a href="http://www.wiw.pl/delta/"&gt;Delty&lt;/a&gt; opisany był następujący paradoks:
&lt;P&gt;
Zbadano skuteczność dwóch lekarstw &lt;font color=red&gt;A&lt;/font&gt; i &lt;font color=green&gt;B&lt;/font&gt;.  Okazało się, że wśród kobiet wyższą skuteczność miało &lt;font color=red&gt;A&lt;/font&gt;, natomiast w całej populacji wygrywało &lt;font color=green&gt;B&lt;/font&gt;.  Nie byłoby to dziwne, gdyby nie fakt, że wśród mężczyzn również lepszym było lekarstwo &lt;font color=red&gt;A&lt;/font&gt;.  Jak to możliwe ?  Otóż badanie przeprowadzono w następujący sposób - zgłaszającemu się pacjentowi aplikowano losowo &lt;font color=red&gt;A&lt;/font&gt; lub &lt;font color=green&gt;B&lt;/font&gt;, po czym notowano wynik terapii.  

&lt;p&gt;
Wyniki badania były następujące:
&lt;p&gt;
Badano 32 mężczyzn, 25 mężczyznom podano lek &lt;font color=red&gt;A&lt;/font&gt;, z czego 10 wyleczono. 7 mężczyzn leczono lekiem &lt;font color=green&gt;B&lt;/font&gt;,  z czego 2 wyleczono. Skuteczność leków wynosiła więc wśród mężczyzn 40% dla &lt;font color=red&gt;A&lt;/font&gt; i 29% dla &lt;font color=green&gt;B&lt;/font&gt;. 
&lt;p&gt;
Zbadano 25 kobiet, na 11 leczonych lekiem &lt;font color=red&gt;A&lt;/font&gt; wyleczono 9, pozostałe 14 leczono podając lek &lt;font color=green&gt;B&lt;/font&gt;, wyleczono 11.  Skuteczność leku dla kobiet wyniosła więc 82% dla &lt;font color=red&gt;A&lt;/font&gt; i 79%  dla &lt;font color=green&gt;B&lt;/font&gt;. Widać, że kobiety łatwiej się leczyło, ale wśród pacjentów obu płci lepszy był lek &lt;font color=red&gt;A&lt;/font&gt;.
&lt;p&gt;
Tymczasem po zsumowaniu liczb widzimy, że skuteczność &lt;font color=red&gt;A&lt;/font&gt; w całej grupie wynosi 53%, a &lt;font color=green&gt;B&lt;/font&gt; 62% ! Co ma więc zrobić lekarz, do którego przychodzi pacjent ? Zbadać jego płeć i przepisać &lt;font color=red&gt;A&lt;/font&gt; niezależnie od wyniku tego badania, czy nie badać i przepisać &lt;font color=green&gt;B&lt;/font&gt; ? 
&lt;p&gt;
Istnieje wiele układów liczb tworzących taką sytuację. Podobne zadanie (tylko z innymi "didaskaliami") pojawiło się w &lt;a href="http://projecteuler.net/"&gt;konkursie Eulera&lt;/a&gt;, o którym już &lt;a href="http://improvita.blogspot.com/2007/07/konkursy-programistyczne.html"&gt;wcześniej tu pisałem&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-6039353321638440645?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/6039353321638440645/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=6039353321638440645' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/6039353321638440645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/6039353321638440645'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2009/05/paradoks-skutecznosci-lekarstw.html' title='Paradoks skuteczności lekarstw'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-3483792988140193650</id><published>2009-05-28T04:21:00.000-07:00</published><updated>2009-05-28T04:30:02.934-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fizyka'/><category scheme='http://www.blogger.com/atom/ns#' term='astronomia'/><category scheme='http://www.blogger.com/atom/ns#' term='matematyka'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Gdzie czytać o najnowszych osiągnięciach nauki</title><content type='html'>Gdzieś w początkach swojej przygody z internetem zetknąłem się z programem &lt;a href="http://surfraw.alioth.debian.org"&gt;surfraw&lt;/a&gt;, a w przykładowych skryptach z adresem &lt;a href="http://xxx.lanl.gov"&gt;xxx.lanl.gov&lt;/a&gt;.  Myślałem, że &lt;span style="font-weight:bold;"&gt;xxx&lt;/span&gt; wskazuje na pornografię, ale okazało się, że nie - krzywdziłem autorów. Jest to stary (ale do dziś działający) adres &lt;span style="font-weight:bold;"&gt;arXiv&lt;/span&gt; - wielkiego archiwum preprintów naukowych będącego kopalnią wiedzy o współczesnych naukach ścisłych.

Archiwum to jest miejscem gdzie naukowcy z takich dziedzin jak matematyka, fizyka, informatyka, astronomia publikują swoje prace zanim zostaną one wydrukowane na papierze. 

Niedawno natknąłem się na &lt;a href="http://www.technologyreview.com/blog/arxiv/"&gt;"The physics arXive blog"&lt;/a&gt;, którego autor &lt;span style="font-weight:bold;"&gt;codziennie&lt;/span&gt; omawia w sposób dostępny dla zainteresowanych laików jeden wybrany temat z archiwum.  

Oto zagadnienia, które podejmował ostatnio:
&lt;P&gt;
&lt;a href="http://www.technologyreview.com/blog/arxiv/23581/"&gt;"Pierwszy dowód splątania w fotosyntezie"&lt;/a&gt;&lt;br&gt;      
&lt;a href="http://www.technologyreview.com/blog/arxiv/23576/"&gt;"Jak używać pulsarów w nawigacji międzygwiezndej"&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.technologyreview.com/blog/arxiv/23570/"&gt;"Termodynamiczny limit rozmiaru mózgu"&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.technologyreview.com/blog/arxiv/23569/"&gt;"Odsłonienie sekretów ludzkiego chodu"&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.technologyreview.com/blog/arxiv/23559/"&gt;"Gdzie załamuje się zasada równoważności"&lt;/a&gt;&lt;br&gt;
...
&lt;P&gt;
Wszystkie tematy ciekawie opisane, z kolorowymi ilustracjami i z aktualnymi odnośnikami do oryginalnych prac z arXiv.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-3483792988140193650?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/3483792988140193650/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=3483792988140193650' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/3483792988140193650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/3483792988140193650'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2009/05/gdzie-czytac-o-najnowszych.html' title='Gdzie czytać o najnowszych osiągnięciach nauki'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-5051960322202159151</id><published>2009-03-17T09:55:00.000-07:00</published><updated>2009-03-17T10:03:15.145-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Nowy freshmeat</title><content type='html'>&lt;p&gt;"Świeże mięsko" jeszcze bardziej się odświeżyło - mamy nowy &lt;a href="http://freshmeat.net/articles/welcome-to-freshmeatnet-30"&gt;freshmeat 3.0&lt;/a&gt;.  Nestety niedokończony ... W starej postaci używałem takich funkcji jak wyszukiwanie wg kategorii - teraz nie mam hierarchii kategorii, mam za to modną w  Web 2.0 chmurę tagów ... czy to jest lepsze ?  Na pewno nie, czekam na resztę.
&lt;/p&gt;&lt;p&gt;
Miałem też możliwość podglądania statystyk projektu - liczbę odwiedzin, ściągnięć, współczynnik żywotności, to wszystko co pozwala szybko ocenić i wstępnie zakwalifikować nieznany program.  Mogłem też sortować wyniki wyszukiwania wg tych czynników - często to robiłem. Zamiast tego jest jakiś mikroskopijny wykres, nie wiadomo czego - stworzony przy użyciu &lt;a href="http://code.google.com/apis/chart/"&gt;google charts API&lt;/a&gt;, skądinąd przyjemnego. Ale statystyki mają wkrótce być - ponoć ulepszone.
&lt;/p&gt;&lt;p&gt;
Co gorsza, po zalogowaniu się nie potrafię znaleźć statystyk moich projektów - czy one gdzieś są ? W FAQ znalazłem sugestię, że "trzeba było testować wersję beta" - wszyscy testowali i nikt nie zgłaszał takich to a takich potrzeb.  Hmmm ... Owszem, dostałem jakieś zaproszenie, ale nie chciało mi się.  Mam jednak nadzieję, że używane przeze mnie funkcje będą tu nadal.
&lt;/p&gt;&lt;p&gt;
Poza tym nie ma nigdzie możliwości sciągnięcia całości bazy danych w formie XML - a była !  Podobno (tak piszą) jest możliwość pobrania rekordu projektu w JSon'ie - ale jak to zrobić ?  Tego nie napisali.
&lt;/p&gt;&lt;p&gt;
Z ostatniej chwili - pojawiło się wiele komentarzy - ludzie pytają o wiele spraw, w tym np o XML - poczekajmy, co się z tym dalej będzie działo ... Jak ktoś tam napisał: "koniec końców - nie jest tak źle" ...
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-5051960322202159151?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/5051960322202159151/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=5051960322202159151' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/5051960322202159151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/5051960322202159151'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2009/03/nowy-freshmeat.html' title='Nowy freshmeat'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-4498501782543991833</id><published>2009-03-06T11:52:00.000-08:00</published><updated>2009-03-06T12:14:19.877-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grafika'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Obrazek "inline" w HTML</title><content type='html'>Warto czasem pamiętać o różnych dziwnych sztuczkach.  Na przykład o wstawianiu 
grafiki bezpośrednio w tekście HTML.  Poniższy obrazek jest tu bezpośrednio 
wklejony w żródle HTML:
&lt;P&gt;

&lt;img src="data:image/jpeg;base64,
/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAKAyADASIA
AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK
U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDy7/hG
7z/nrB/30f8ACj/hG7z/AJ6wf99H/Cupori9tM8r6xM5b/hG7z/nrB/30f8ACj/hG7z/AJ6wf99H
/Cupoo9tMPrEzlv+EbvP+esH/fR/wo/4Ru8/56wf99H/AArqaKPbTD6xM5b/AIRu8/56wf8AfR/w
o/4Ru8/56wf99H/Cupoo9tMPrEzlv+EbvP8AnrB/30f8KP8AhG7z/nrB/wB9H/Cupoo9tMPrEzZ/
4Rq8/wCesH/fR/wo/wCEavP+esH/AH0f8K6mivO9vM8n6zM5b/hGrz/nrB/30f8ACj/hGrz/AJ6w
f99H/Cupoo9vMPrMzlv+EavP+esH/fR/wo/4Rq8/56wf99H/AArqaKPbzD6zM5b/AIRq8/56wf8A
fR/wo/4Rq8/56wf99H/Cupoo9vMPrMzlv+EavP8AnrB/30f8KP8AhGrz/nrB/wB9H/Cupoo9vMPr
MzxP/hE7/wD5623/AH03+FH/AAid/wD89bb/AL6b/Cuxor7P6zUPrfZROO/4RO//AOett/303+FH
/CJ3/wDz1tv++m/wrsaKPrNQPZROO/4RO/8A+ett/wB9N/hR/wAInf8A/PW2/wC+m/wrsaKPrNQP
ZROO/wCETv8A/nrbf99N/hR/wid//wA9bb/vpv8ACuxoo+s1A9lE47/hE7//AJ623/fTf4Uf8Inf
/wDPW2/76b/Cuxoo+s1A9lE3v+ETv/8Antbf99N/hR/wid//AM9rb/vpv8K7GivG+s1Dv9jE47/h
E7//AJ7W3/fTf4Uf8Inf/wDPa2/76b/Cuxoo+s1A9jE47/hE7/8A57W3/fTf4Uf8Inf/APPa2/76
b/Cuxoo+s1A9jE47/hE7/wD57W3/AH03+FH/AAid/wD89rb/AL6b/Cuxoo+s1A9jE47/AIRO/wD+
e1t/303+FH/CJ3//AD2tv++m/wAK7Gij6zUD2MTwD/hG7z/nrB/30f8ACj/hG7z/AJ6wf99H/Cup
orm9tM+Z+sTOW/4Ru8/56wf99H/Cj/hG7z/nrB/30f8ACupoo9tMPrEzlv8AhG7z/nrB/wB9H/Cj
/hG7z/nrB/30f8K6mij20w+sTOW/4Ru8/wCesH/fR/wo/wCEbvP+esH/AH0f8K6mij20w+sTOW/4
Ru8/56wf99H/AAo/4Ru8/wCesH/fR/wrqaKPbTD6xM2f+EavP+esH/fR/wAKP+EavP8AnrB/30f8
K6mivO9vM8n6zM5b/hGrz/nrB/30f8KP+EavP+esH/fR/wAK6mij28w+szOW/wCEavP+esH/AH0f
8KP+EavP+esH/fR/wrqaKPbzD6zM5b/hGrz/AJ6wf99H/Cj/AIRq8/56wf8AfR/wrqaKPbzD6zM5
b/hGrz/nrB/30f8ACj/hGrz/AJ6wf99H/Cupoo9vMPrMzxP/AIRO/wD+ett/303+FH/CJ3//AD1t
v++m/wAK7Givs/rNQ+t9lE47/hE7/wD5623/AH03+FH/AAid/wD89bb/AL6b/Cuxoo+s1A9lE47/
AIRO/wD+ett/303+FH/CJ3//AD1tv++m/wAK7Gij6zUD2UTjv+ETv/8Anrbf99N/hR/wid//AM9b
b/vpv8K7Gij6zUD2UTjv+ETv/wDnrbf99N/hR/wid/8A89bb/vpv8K7Gij6zUD2UTe/4RO//AOe1
t/303+FH/CJ3/wDz2tv++m/wrsaK8b6zUO/2MTjv+ETv/wDntbf99N/hR/wid/8A89rb/vpv8K7G
ij6zUD2MTjv+ETv/APntbf8AfTf4Uf8ACJ3/APz2tv8Avpv8K7Gij6zUD2MTjv8AhE7/AP57W3/f
Tf4Uf8Inf/8APa2/76b/AArsaKPrNQPYxOO/4RO//wCe1t/303+FH/CJ3/8Az2tv++m/wrsaKPrN
QPYxPAP+EbvP+esH/fR/wo/4Ru8/56wf99H/AArqaK5vbTPmfrEzlv8AhG7z/nrB/wB9H/Cj/hG7
z/nrB/30f8K6mij20w+sTOW/4Ru8/wCesH/fR/wo/wCEbvP+esH/AH0f8K6mij20w+sTOW/4Ru8/
56wf99H/AAo/4Ru8/wCesH/fR/wrqaKPbTD6xM5b/hG7z/nrB/30f8KP+EbvP+esH/fR/wAK6mij
20w+sTNn/hGrz/nrB/30f8KP+EavP+esH/fR/wAK6mivO9vM8n6zM5b/AIRq8/56wf8AfR/wo/4R
q8/56wf99H/Cupoo9vMPrMzlv+EavP8AnrB/30f8KP8AhGrz/nrB/wB9H/Cupoo9vMPrMzlv+Eav
P+esH/fR/wAKP+EavP8AnrB/30f8K6mij28w+szOW/4Rq8/56wf99H/Cj/hGrz/nrB/30f8ACupo
o9vMPrMz/9k=
"&gt;

&lt;p&gt;

Aby to zrobić, trzeba użyć schematu "data" zdefiniowanego
w &lt;a href="http://tools.ietf.org/html/rfc2397"&gt;RFC 2397&lt;/a&gt;.
Ponieważ schemat ten obsługuje kodowanie base64, można 
wstawić dowolną grafikę.

&lt;p&gt;

Można także wstawić zagnieżdżoną stronę HTML, tym razem już bez kodowania base64, ale 
Internet Explorer odmówi renderowania elementu "data" z "nawigowalną treścią"
- chodzi o względy bezpieczeństwa - filtry zabezpieczające różnorakie aplikacje
internetowe przed atakiem typu &lt;a href="http://pl.wikipedia.org/wiki/Cross-site_scripting"&gt;cross-side scripting&lt;/a&gt; prawdopodobnie nie rozpoznałyby 
javascriptu zagnieżdżonego w elemencie zakodowanym w "data".

A jak spreparować taki obrazek ?  Po prostu użyć polecenia "base64" dostępnego 
w uniksie, a także w bibliotekach różnych języków ...

&lt;p&gt;
Używając tego mechanizmu &lt;a href="http://emergent.unpythonic.net/index.cgi/bio"&gt;Jeff Epler&lt;/a&gt; zaimplementował w JavaScript
&lt;a href="http://emergent.unpythonic.net/index.cgi/software/01126462511-glif"&gt;funkcje służące do generowania obrazków&lt;/a&gt; w locie po stronie klienta.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-4498501782543991833?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/4498501782543991833/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=4498501782543991833' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/4498501782543991833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/4498501782543991833'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2009/03/image.html' title='Obrazek &quot;inline&quot; w HTML'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-7197410215426953796</id><published>2009-02-17T07:41:00.000-08:00</published><updated>2009-02-17T07:50:10.348-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='telewizja'/><category scheme='http://www.blogger.com/atom/ns#' term='polityka'/><category scheme='http://www.blogger.com/atom/ns#' term='Kaczyński'/><category scheme='http://www.blogger.com/atom/ns#' term='komentarze'/><title type='text'>Durczok, Lis, Kaczyński, Niesiołowski i nasze emocje</title><content type='html'>&lt;p&gt;
Pan &lt;span style="font-weight:bold;"&gt;Kamil Durczok&lt;/span&gt; stał się dla nas źródłem wesołości, pozwalając się sfilmować przy pracy.  Nie przebił moim zdaniem &lt;span style="font-weight:bold;"&gt;Tomasza Lisa&lt;/span&gt;, który uraczył nas jakiś czas temu jeszcze dłuższym potokiem błota wylewanego na współpracowników.  Nie dziwi mnie to ani nie gorszy, wolę co prawda ludzi kulturalnych, ale pogodziłem się z tym, że takich jest mało na świeczniku.  Ale przecież pan &lt;span style="font-weight:bold;"&gt;Kamil&lt;/span&gt; uważa się za kogoś wyrastającego ponad poziom przeciętny, nie chciał stawać w szranki o nagrodę medialną razem z &lt;span style="font-weight:bold;"&gt;Kasią Cichopek&lt;/span&gt; - kimże ona jest przy nim !  Bez urazy ...
&lt;/p&gt;&lt;p&gt;
Wczoraj mogliśmy obejrzeć &lt;span style="font-weight:bold;"&gt;Tomasza Lisa&lt;/span&gt; w rozmowie na temat pana &lt;span style="font-weight:bold;"&gt;Czumy&lt;/span&gt;, a potem na innym kanale telewizyjnym pana &lt;span style="font-weight:bold;"&gt;Pospieszalskiego&lt;/span&gt; w dyskusji o eutanazji.  I tu i tam widziałem gotujące się emocje (pogardę i wściekłość u &lt;span style="font-weight:bold;"&gt;Niesiołowskiego&lt;/span&gt;, gniew u &lt;span style="font-weight:bold;"&gt;Kaczyńskiego&lt;/span&gt;, pogardę i wściekłość u pana &lt;span style="font-weight:bold;"&gt;profesora&lt;/span&gt; bioetyka, którego nazwiska nie zapamiętałem - przepraszam).  W ogóle wszędzie pełno obrażania, dokuczliwych złośliwości i jadu.  &lt;span style="font-weight:bold;"&gt;Lis&lt;/span&gt; stale wyciąga jakieś stare nagrania z &lt;span style="font-weight:bold;"&gt;Kaczyńskim&lt;/span&gt;, aby ludziom pokazać, jak agresywne są Kaczory.  Nie udała mu się jednak prowokacja, kiedy gościł &lt;span style="font-weight:bold;"&gt;Kaczyńskiego&lt;/span&gt; u siebie - chociaż zaprezentował mu filmik z &lt;span style="font-weight:bold;"&gt;Marcinkiewiczem&lt;/span&gt;, nie usłyszał nic poza zapewnieniami o dobrej woli.  Prezes &lt;span style="font-weight:bold;"&gt;Kaczyński&lt;/span&gt; zmienił front i hamuje agresję, choć pewnie mu ciężko.  Za to tydzień później, &lt;span style="font-weight:bold;"&gt;Lis&lt;/span&gt; razem z nowym gościem wspólnie szydzili z nieobecnego prezesa bez umiaru.  Uśmiechali się pogardliwie pod nosem wymieniając porozumiewawcze spojrzenia wspominając jego wpadki i litując nad jego poziomem.
&lt;/p&gt;&lt;p&gt;
U &lt;span style="font-weight:bold;"&gt;Pospieszalskiego&lt;/span&gt; goście byli spokojni i opanowani, oprócz pana &lt;span style="font-weight:bold;"&gt;Profesora&lt;/span&gt;, którego nazwiska nie pamiętam - wojującego ateisty, który bardzo się sam zdenerwował z tego powodu, że połowa ludzkości wierzy w duszę.  Odniosłem wrażenie, że złościł się po prostu dlatego, że nie okazano mu należnego respektu - pani redaktor, z którą rozmawiał, ośmieliła się go krytykować.  Upomniał ją, że winna mu szacunek, jako, że jest &lt;span style="font-weight:bold;"&gt;PROFESOREM&lt;/span&gt;.  Pani redaktor też była mocno zdenerwowana.
&lt;/p&gt;&lt;p&gt;
Wszystko to nastraja mnie dość smutno - światem nie rządzi wcale rozum, wbrew temu, co się nam wmawia.  Rządzą nimi &lt;span style="font-weight:bold;"&gt;EMOCJE&lt;/span&gt; wywoływane przez media - czytaj - &lt;span style="font-weight:bold;font-color:red;"&gt;MANIPULACJA&lt;/span&gt;.  Na szczęście chyba nie zawsze skuteczna - drugie na szczęście - zdecentralizowana ...  Kto wywoła odpowiednie emocje w odpowiednim kontekscie, przeciąga wyborcę (czytelnika? konsumenta?) na swoją stronę.  Ludzie tacy jak &lt;span style="font-weight:bold;"&gt;Lis&lt;/span&gt; próbują to robić zawodowo, politycy - też, ale mam nadzieję, że przynajmniej ci, którym wierzę, robią to dla słusznych celów.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-7197410215426953796?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/7197410215426953796/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=7197410215426953796' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/7197410215426953796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/7197410215426953796'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2009/02/durczok-lis-kaczynski-niesioowski-i.html' title='Durczok, Lis, Kaczyński, Niesiołowski i nasze emocje'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-6899071828503951179</id><published>2009-02-16T12:06:00.000-08:00</published><updated>2009-02-16T12:31:31.674-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><title type='text'>Skrzynka z narzędziami</title><content type='html'>Podczas pracy z plikami tekstowymi często powstaje potrzeba przeprowadzenia prostej operacji w rodzaju sortowania, zmiany kolejności, sumowania itp.  Zwykle odruchem jest pisanie &lt;span style="font-weight:bold;"&gt;&lt;a href="http://improvita.blogspot.com/2009/02/jednolinijkowce-w-awk-u.html"&gt;jednolinijkowca&lt;/a&gt;&lt;/span&gt; w &lt;span style="font-weight:bold;"&gt;AWK-u&lt;/span&gt; albo innym ulubionym języku.  Niesłusznie.  Czasem lepiej jest otworzyć &lt;span style="font-weight:bold;"&gt;skrzynkę z narzędziami&lt;/span&gt; i poszukać gotowca.  W Unix-ie mamy mnóstwo małych gotowych programów.  Zdarzyło mi się napisać program, który robił to, co &lt;span style="font-weight:bold;"&gt;shuf&lt;/span&gt; i inny, który wykonywał operację &lt;span style="font-weight:bold;"&gt;paste&lt;/span&gt;. Niepotrzebnie.  Poniżej wymieniam kilka z tych narzędzi.
&lt;p&gt;
&lt;span style="font-weight:bold;"&gt;csplit&lt;/span&gt;:podział pliku na podstawie zawartości&lt;br&gt;
&lt;span style="font-weight:bold;"&gt;cut&lt;/span&gt;:wybranie kolumn&lt;br&gt;
&lt;span style="font-weight:bold;"&gt;join&lt;/span&gt;:połączenie plików wg wspólnej kolumny&lt;br&gt;
&lt;span style="font-weight:bold;"&gt;paste&lt;/span&gt;:sklejenie plików kolumnami&lt;br&gt;
&lt;span style="font-weight:bold;"&gt;shuf&lt;/span&gt;:mieszanie kolejności linii w pliku&lt;br&gt;
&lt;span style="font-weight:bold;"&gt;split&lt;/span&gt;:podział pliku na równe kawałki&lt;br&gt;
&lt;span style="font-weight:bold;"&gt;tac&lt;/span&gt;:wypisanie pliku liniami od tyłu&lt;br&gt;
&lt;span style="font-weight:bold;"&gt;tr&lt;/span&gt;:zamiana znaków&lt;br&gt;
&lt;span style="font-weight:bold;"&gt;uniq&lt;/span&gt;:wybranie linii powtarzających się&lt;br&gt;
&lt;/p&gt;
Warto zapoznać się z nimi - mają bogaty repertuar różnych opcji - na przykład program &lt;span style="font-weight:bold;"&gt;split&lt;/span&gt; może zliczać linie, albo znaki. Program &lt;span style="font-weight:bold;"&gt;paste&lt;/span&gt; może skleić pliki pionowo lub poziomo. Program &lt;span style="font-weight:bold;"&gt;shuf&lt;/span&gt; może mieszać linie, ale może też potasować swoje argumenty.  I tak dalej.  Skrzynka narzędziowa jest pełna !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-6899071828503951179?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/6899071828503951179/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=6899071828503951179' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/6899071828503951179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/6899071828503951179'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2009/02/skrzynka-z-narzedziami.html' title='Skrzynka z narzędziami'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-8567137694567651161</id><published>2009-02-16T11:39:00.000-08:00</published><updated>2009-02-16T11:53:32.204-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='awk'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><title type='text'>Jednolinijkowce w AWK-u</title><content type='html'>&lt;p&gt;
&lt;span style="font-weight:bold;"&gt;AWK&lt;/span&gt; jest językiem programowania nadającym się wybitnie do tworzenia jednolinijkowców. "Jednolinijkowiec" to skrypt napisany ad-hoc, bez edytora, od razu w linii komend.  Często mieści się w jednej linii - stąd nazwa.
&lt;/p&gt;&lt;p&gt;
Pracując nad analizą techniczną kursów walut używam często &lt;span style="font-weight:bold;"&gt;awk-a&lt;/span&gt; i &lt;span style="font-weight:bold;"&gt;bash-a&lt;/span&gt; jako narzędzi szybkiego prototypowania i błyskawicznych  kalkulacji.
&lt;/p&gt;&lt;p&gt;
Przykład:  w pliku &lt;span style="font-style:italic;"&gt;A.txt&lt;/span&gt; mam dane w postaci tekstowej, każda linijka zawiera jedną liczbę - wartość kursu w danym punkcie.  Chcę obliczyć średnią wykładniczą z dziesięciu okresów. 
&lt;/p&gt;&lt;p&gt;
Za pomocą jednolinijkowca w &lt;span style="font-weight:bold;"&gt;AWK-u&lt;/span&gt; robię to tak:
&lt;PRE&gt;
&lt;span style="font-weight:bold;"&gt;awk '{s=0.1*$1+0.9*s; print s}' A.txt&lt;/span&gt;
&lt;/PRE&gt;
&lt;/p&gt;&lt;p&gt;
Po przeczytaniu tego artykułu też będziesz to umieć.
&lt;/p&gt;&lt;p&gt;
Przykład innego typu:

Chcę z pliku &lt;span style="font-style:italic;"&gt;B.txt&lt;/span&gt; wybrać co dziesiątą linię:
&lt;pre&gt;
&lt;span style="font-weight:bold;"&gt;awk '{n++; if(n&gt;=10) {print; n=0}}' B.txt&lt;/span&gt;
&lt;/pre&gt;
&lt;/p&gt;&lt;p&gt;
Przykład trzeci - powiedzmy, że w pliku &lt;span style="font-style:italic;"&gt;C.txt&lt;/span&gt; mam dwie kolumny z wartościami liczbowymi.  Chcę obliczyć średnią wartość liczb w obu kolumnach.  Posługuję się więc jednolinijkowcem, który tworzę w locie:
&lt;/p&gt;&lt;p&gt;
&lt;pre&gt;
&lt;span style="font-weight:bold;"&gt;awk '{p+=$1; x+=$2; n++} END {print p/n, x/n}' C.txt&lt;/span&gt;
&lt;/pre&gt;
&lt;/p&gt;&lt;p&gt;
I tak dalej, wszysto szybko, łatwo i bezbłędnie.

&lt;/p&gt;&lt;p&gt;
&lt;span style="font-weight:bold;"&gt;AWK&lt;/span&gt; jest genialnie dostosowany do takich celów - ma kilka konstrukcji składniowych, kilka funkcji i kilka reguł, które trzeba poznać, podręcznik mieści się w jednym manualu systemowym, a możliwości są ogromne.  Nie ma obiektów, klas, wyjątków ani modułów, ale robi to, co potrzebne.  Aby sobie to uzmysłowić, wystarczy zrozumieć, jak działa &lt;span style="font-weight:bold;"&gt;AWK&lt;/span&gt;.
&lt;/p&gt;&lt;p&gt;
&lt;span style="font-weight:bold;"&gt;DZIAŁANIE AWK-a&lt;/span&gt;
&lt;/p&gt;&lt;p&gt;

Program w &lt;span style="font-weight:bold;"&gt;AWK-u&lt;/span&gt; to lista reguł.  Każda reguła to wzorzec i akcja.  Program czyta dane rekord po rekordzie, znajduje pierwszy wzorzec, który może być dopasowany do rekordu i wykonuje skojarzoną z nim akcję.  Rekord dzieli się na pola, oznaczane w akcjach i wzorcach symbolami &lt;span style="font-weight:bold;"&gt;$1, $2, $3&lt;/span&gt; itd.  
&lt;/p&gt;&lt;p&gt;
Przykład:
&lt;pre&gt;
&lt;span style="font-weight:bold;"&gt;awk '$1&gt;1 {n++} END {print n}'&lt;/span&gt;
&lt;/pre&gt;
&lt;/p&gt;&lt;p&gt;
&lt;span style="font-weight:bold;"&gt;awk&lt;/span&gt; - to komenda - nazwa programu &lt;span style="font-weight:bold;"&gt;awk&lt;/span&gt;
&lt;span style="font-weight:bold;"&gt;'$1&gt;1 {n++} END {print n}'&lt;/span&gt; - to program w &lt;span style="font-weight:bold;"&gt;AWK-u&lt;/span&gt;, składa się z dwóch reguł:
&lt;span style="font-weight:bold;"&gt;$1&gt;1 {n++}&lt;/span&gt;     - wzorzec $1&gt;1 oznacza rekordy, w których wartość numeryczna pierwszego pola jest większa niż 1, akcja &lt;span style="font-weight:bold;"&gt;{n++}&lt;/span&gt; oznacza inkrementację zmiennej n
&lt;span style="font-weight:bold;"&gt;END {print n}&lt;/span&gt;    - wzorzec &lt;span style="font-weight:bold;"&gt;END&lt;/span&gt; to sztuczny wzorzec, nie dopasowywany do żadnego rekordu, skojarzona z nim akcja wykonywana jest na zakończenie programu.  W tym wypadku wypisuje liczbę n.
&lt;/p&gt;&lt;p&gt;
Powyższy program liczy linie, w których pierwsza kolumna zawiera liczbę większą od 1, a następnie wypisuje wynik.
&lt;/p&gt;&lt;p&gt;
Akcje ujęte są w nawiasy &lt;span style="font-weight:bold;"&gt;{}&lt;/span&gt;, warunki to wyrażenia relacyjne lub specjalne symbole &lt;span style="font-weight:bold;"&gt;BEGIN&lt;/span&gt; lub &lt;span style="font-weight:bold;"&gt;END&lt;/span&gt;.
&lt;/p&gt;&lt;p&gt;
Inny przykład - pomnożenie wszystkich liczb zawartych w pliku:
&lt;pre&gt;
&lt;span style="font-weight:bold;"&gt;awk 'BEGIN {x=1} {x*=$1} END {print x}'&lt;/span&gt;
&lt;/pre&gt;
&lt;/p&gt;&lt;p&gt;
Aby zmusić program do zainicjowania zmiennej jedynką został tu użyty wzorzec &lt;span style="font-weight:bold;"&gt;BEGIN&lt;/span&gt;.

Tyle informacji wystarczy, aby rozpocząć eksperymentowanie.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-8567137694567651161?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/8567137694567651161/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=8567137694567651161' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/8567137694567651161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/8567137694567651161'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2009/02/jednolinijkowce-w-awk-u.html' title='Jednolinijkowce w AWK-u'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-5421021236692360736</id><published>2009-01-25T05:32:00.000-08:00</published><updated>2009-01-25T06:16:39.058-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grafika'/><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><title type='text'>Sztuka bezkontekstowa i sztuka algorytmiczna</title><content type='html'>&lt;p&gt;
Natknąłem się przypadkowo na interesujący program 
graficzny - &lt;a href="http://www.contextfreeart.org"&gt; Context Free &lt;/a&gt; - narzędzie służące do tworzenia algorytmicznej grafiki.  
&lt;/p&gt;
&lt;p&gt;
&lt;table&gt;&lt;tr&gt;&lt;td&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_le2GD5kB0hs/SXxxR_O4WRI/AAAAAAAAACc/VtGQL5XUwZY/s1600-h/cf4.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://2.bp.blogspot.com/_le2GD5kB0hs/SXxxR_O4WRI/AAAAAAAAACc/VtGQL5XUwZY/s400/cf4.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5295231815726422290" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_le2GD5kB0hs/SXxxRzaJoeI/AAAAAAAAACU/2wRQBrtGfsg/s1600-h/cf3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://3.bp.blogspot.com/_le2GD5kB0hs/SXxxRzaJoeI/AAAAAAAAACU/2wRQBrtGfsg/s400/cf3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5295231812552466914" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_le2GD5kB0hs/SXxxRg6_0HI/AAAAAAAAACM/IdaXW8VhLOw/s1600-h/cf2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://4.bp.blogspot.com/_le2GD5kB0hs/SXxxRg6_0HI/AAAAAAAAACM/IdaXW8VhLOw/s400/cf2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5295231807589961842" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_le2GD5kB0hs/SXxxRvtyUaI/AAAAAAAAACE/y8km7z_G--g/s1600-h/cf1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://3.bp.blogspot.com/_le2GD5kB0hs/SXxxRvtyUaI/AAAAAAAAACE/y8km7z_G--g/s400/cf1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5295231811561083298" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
Używa się go w niestandardowy sposób, mianowicie nie rysuje się nic na ekranie, ani na kartce - zamiast tego zadaniem artysty jest stworzenie opisu grafiki w specjalnym języku programowania.

Pomysł ten jest krewniakiem idei muzyki algorytmicznej, o której pisałem przy okazji omawiania &lt;a href="http://improvita.blogspot.com/2007/07/csound.html"&gt; csound'a &lt;/a&gt;.

Przypomniałem sobie o swoich starych eksperymentach z tworzeniem algorytmicznej grafiki bezpośrednio w języku C: oto wizerunek "tęczowej planety" i fragment kodu programu, który go narysował.  Dość złożony obraz powstaje w wyniku działania tak prostej funkcji !
&lt;/p&gt;
&lt;p&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_le2GD5kB0hs/SXxyNlAJDMI/AAAAAAAAACk/0qtoRseuqis/s1600-h/planeta.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 210px;" src="http://2.bp.blogspot.com/_le2GD5kB0hs/SXxyNlAJDMI/AAAAAAAAACk/0qtoRseuqis/s320/planeta.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5295232839477431490" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;PRE&gt;
#define tfi(x) (0.5*(x+1))

float calc_color( float x, float y, int rgb )
{
        float d, K;

        d = (x-0.4) * (y-0.3) - 0.04;

        if ( d &lt; 0 ) 
                K = 0;
        else if ( d &lt; 0.03 ) {
                K = 1 - (0.03 - d)/0.03;
        }
        else
                K = 1;

        switch ( rgb ) {
                case 0:
                        return K * tfi(sin( 41 * x*y ));
                case 1:
                        return K * tfi(cos( 13 * x ));
                default:
                        return K * tfi(cos( 28 * y ));
        }
}
&lt;/PRE&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-5421021236692360736?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/5421021236692360736/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=5421021236692360736' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/5421021236692360736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/5421021236692360736'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2009/01/sztuka-bezkontekstowa-i-sztuka.html' title='Sztuka bezkontekstowa i sztuka algorytmiczna'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_le2GD5kB0hs/SXxxR_O4WRI/AAAAAAAAACc/VtGQL5XUwZY/s72-c/cf4.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-271397604664286898</id><published>2009-01-12T10:43:00.000-08:00</published><updated>2009-01-12T12:49:54.337-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='forex'/><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><title type='text'>Więc czy da się przewidywać kursy walut na forexie ?</title><content type='html'>Dane historyczne są dostępne w sieci, wyposażmy się więc w jakieś narzędzie (dla mnie najwygodniejszy jest &lt;font color="red"&gt; &lt;a href="http://www.gnu.org/software/bash/bash.html"&gt;bash&lt;/a&gt; &lt;/font&gt; i &lt;font color="red"&gt;awk&lt;/font&gt;, ale równie dobrze może być to Excel) i popróbujmy prostych eksperymentów.

Badając dane pary EURCHF z ostatnich kilku lat (moje dane były pobrane z rosyjskiego portalu  forexite, próbkowane z rozdzielczością minutową) widzimy, że każdy ruch w jedną
stronę poprzedza ruch w przeciwną stronę - ta obserwacja jest słuszna z dość dużym prawdopodobieństwem !  Prawdopodobieństwo to wynosi około &lt;font color="red"&gt;62 % &lt;/font&gt; dla danych minutowych.  Dla danych próbkowanych 2 razy rzadziej analogiczna wielkość to &lt;font color="red"&gt;59 % &lt;/font&gt;

Ogólnie rzecz biorąc, im dłuższe okresy badamy, tym ta korelacja (albo ściślej rzecz ujmując - antykorelacja) jest słabsza.

Przybliżone wielkości prawdopodobieństwa "odbicia" dla pary EURCHF w zależności od długości ruchu przedstawia zestawienie:
&lt;pre&gt;
 1    0.622234
 2    0.595226
 5    0.570834
10    0.557971
20    0.543762
60    0.538403
&lt;/pre&gt;
Widzimy, że dla długich okresów badana wielkość upodabnia się do danych losowych, dla których  oczywiście prawdopodobieństwo to wynosi 50 %.  

Podobieństwo dotyczy oczywiście tylko tego jednego aspektu, należy pamiętać, że nasz eksperyment jest zbyt prosty, żeby w ogólności rozstrzygnąć o charakterze badanego procesu.

Czy można jednak jakoś wykorzystać te zależności ?

Okazuje się, że nie, że to za mało.

Średnia względna wielkość ruchu ceny w zależności od wielkości kroku w badanych okresach wygląda tak:
&lt;pre&gt;
 1      0.000158347
 2      0.000164155
 5      0.00024643
10      0.000328186
20      0.000444261
60      0.000738944
&lt;/pre&gt;

Zakładając, że broker zabiera nam 1 pips prowizji w postaci spread'u, co stanowi około 0.000066 wartości pozycji, mamy następujący średni profit na tak zaprognozowanej transakcji:
&lt;pre&gt;
 1     -2.72892e-05
 2     -3.47364e-05
 5     -3.10888e-05
10     -2.79495e-05
20     -2.71165e-05
60     -9.24467e-06
&lt;/pre&gt;
Profit jest ujemny dla każdego z badanych przedziałów, co więcej, widać, że w zakresie małych ruchów jest prawie stały, spread równoważy prawie zysk związany z przewidywalnością ruchu, a więc można uznać, że jest to przewidywalność &lt;font color="red"&gt;NIEZNACZĄCA&lt;/font&gt;, niwelowana przez prowizje.

Nie powinniśmy jednak się poddawać !

Wykryty przez nas autentyczny fakt, polegający na &lt;font color="red"&gt;MOŻLIWOŚCI&lt;/font&gt; przewidywania ruchów cen, którą można &lt;font color="red"&gt;EKSPERYMENTALNIE UDOWODNIĆ&lt;/font&gt; powinien nas zachęcić do dalszych samodzielnych badań.

W kolejnych odcinkach postaram się opisać, do czego ja doszedłem, w jaki sposób, a także jak używałem &lt;font color="red"&gt;awk'a&lt;/font&gt; i &lt;a href="http://en.wikipedia.org/wiki/One-liner_program"&gt;jednolinijkowców&lt;/a&gt; do &lt;font color="red"&gt;super ekstremalnie szybkiego programowania&lt;/font&gt; i obliczania różnych statystyk i prawdopodobieństw.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-271397604664286898?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/271397604664286898/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=271397604664286898' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/271397604664286898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/271397604664286898'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2009/01/wic-czy-da-si-przewidywa-kursy-walut-na.html' title='Więc czy da się przewidywać kursy walut na forexie ?'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-2892912889030421143</id><published>2009-01-02T11:03:00.000-08:00</published><updated>2009-01-02T12:54:53.259-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='forex'/><title type='text'>Handel walutami - czy trendy istnieją</title><content type='html'>Od paru lat, na skutek upowszechnienia internetowych platform transakcyjnych, handel walutami na rynku międzynarodowym dostępny jest dla każdego, kto jest podłączony do sieci.  FOREX zyskuje coraz większą popularność w kręgach domorosłych spekulantów ze względu na niskie koszty transakcji (rzędu &lt;font color="red"&gt;0.01 % &lt;/font&gt; !) i dostępne wysokie lewary (nawet do&lt;font color="red"&gt; 200 x &lt;/font&gt; ).  Każdy, kto chce rozpocząć przygodę z forexem powinien jednak najpierw zapoznać się ze specyfiką tego rynku, w przeciwnym razie szybko straci wszystkie zainwestowane środki.  W tym artykule chcę pokazać, jak złudne są nasze przekonania co do natury kursów walut.  &lt;font color="red"&gt; Obalę mit o wyraźnych trendach &lt;/font&gt; , które rzekomo widoczne są gołym okiem na wykresach kursów.  

Poniżej przedstawiam wykres notowania pary EUR/USD na przestrzeni kilku lat:

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_le2GD5kB0hs/SV5pujSY9fI/AAAAAAAAABI/v_wx6WZOzDU/s1600-h/EURUSD_1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand" src="http://3.bp.blogspot.com/_le2GD5kB0hs/SV5pujSY9fI/AAAAAAAAABI/v_wx6WZOzDU/s400/EURUSD_1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5286779261046814194" /&gt;&lt;/a&gt;

Końcowe załamanie to objaw obecnego kryzysu funansowego, który przerwał &lt;font color="red"&gt; wyraźny trend rosnący &lt;/font&gt; Euro w stosunku do dolara amerykańskiego.  Każdy widzi ten trend, a ja teraz pokażę, że to złudzenie.

W tym celu wygeneruję sztuczne dane i pokażę ich wykresy.  Poniżej przedstawiam pięć zestawów danych całkowicie losowych.  Program generujący startuje z jedynki i losowo mnoży ją lub dzieli przez tę samą wartość (krok) równą 1.001.  Skrypt, który wygenerował te dane wygląda tak:

&lt;pre&gt;
awk 'BEGIN { x=1; p=1.001; 
     for (i=0; i&lt;27783; i++) { 
        if (rand() &lt; 0.5) x *= p; else x /= p; print x }
     }'
&lt;/pre&gt;

27783 to liczba punktów pierwotnego wykresu - chcę uzyskać dane tej samej długości.  Oto, co uzyskuję:

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_le2GD5kB0hs/SV5vbUebWjI/AAAAAAAAABQ/eiGkGFEFeLw/s1600-h/fake1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 271px;" src="http://1.bp.blogspot.com/_le2GD5kB0hs/SV5vbUebWjI/AAAAAAAAABQ/eiGkGFEFeLw/s400/fake1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5286785527723022898" /&gt;&lt;/a&gt;

Wygenerowany wykres również zawiera &lt;font color="red"&gt; wyraźny trend &lt;/font&gt;.  Jedyne wyjaśnienie tego faktu to przypadek, albo złudzenie.  Wygenerujmy więc kolejne cztery przebiegi czasowe i obejrzyjmy:


&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_le2GD5kB0hs/SV5xg9jwj5I/AAAAAAAAABY/YOxjqU_wS7A/s1600-h/fake2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 268px;" src="http://4.bp.blogspot.com/_le2GD5kB0hs/SV5xg9jwj5I/AAAAAAAAABY/YOxjqU_wS7A/s400/fake2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5286787823673839506" /&gt;&lt;/a&gt;


&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_le2GD5kB0hs/SV5yHp93w9I/AAAAAAAAABg/Gm-5A5LfA2I/s1600-h/fake3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 267px;" src="http://2.bp.blogspot.com/_le2GD5kB0hs/SV5yHp93w9I/AAAAAAAAABg/Gm-5A5LfA2I/s400/fake3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5286788488429552594" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_le2GD5kB0hs/SV5zJPeTB2I/AAAAAAAAABw/1pXlnMIy-Mw/s1600-h/fake5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 267px;" src="http://4.bp.blogspot.com/_le2GD5kB0hs/SV5zJPeTB2I/AAAAAAAAABw/1pXlnMIy-Mw/s400/fake5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5286789615189165922" /&gt;&lt;/a&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_le2GD5kB0hs/SV5zIwt1BLI/AAAAAAAAABo/FtZVLL1VQoM/s1600-h/fake4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:left;cursor:pointer; cursor:hand;width: 400px; height: 268px;" src="http://1.bp.blogspot.com/_le2GD5kB0hs/SV5zIwt1BLI/AAAAAAAAABo/FtZVLL1VQoM/s400/fake4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5286789606932808882" /&gt;&lt;/a&gt;

Oprócz być może pierwszego z powyższych czterech &lt;font color="red"&gt; sztucznie wygenerowanych &lt;/font&gt; wykresów, wszystkie posiadają odcniki &lt;font color="red"&gt; wyraźnego trendu &lt;/font&gt;.  
Tłumaczy się to tym, że umysł ludzki cechuje skłonność do dopatrywania się porządku nawet tam, gdzie go wcale nie ma.  Czy więc &lt;font color="red"&gt; dane finansowe &lt;/font&gt;, takie jak notowania &lt;font color="red"&gt; FOREXU &lt;/font&gt; czy giełdy, są nieprzewidywalnymi ciągami losowymi ?  Czy więc cała &lt;font color="red"&gt; analiza techniczna &lt;/font&gt; jest równoważna próbom znalezienia &lt;font color="red"&gt; systemu wygrywania w totolotka &lt;/font&gt; ?  Nawiasem mówiąc są tacy, którzy wierzą w systemy totolotka i nawet tacy, którzy je sprzedają !

W środowiskach akademickich do niedawna panowało przekonanie o &lt;font color="red"&gt; efektywności rynków &lt;/font&gt; i co za tym idzie o niemożliwości przewidywania kursów.  Od ostatnich kilku (czy też kilkunastu) lat pojawiają się jednak prace (znajdziemy je względnie łatwo używając &lt;a href="http://scholar.google.com/"&gt; http://scholar.google.com &lt;/a&gt;) dostarczające solidnych argumentów zwolennikom analizy technicznej.  

Jedno jest pewne :  dzisiejszy &lt;span style="font-style:italic;"&gt;trader&lt;/span&gt; nie obejdzie się bez komputera, podstawowej umiejętności programowania i podstawowej znajomości statystyki matematycznej.  

O swoich dokonaniach na polu &lt;font color="red"&gt; handlu FOREXOWEGO &lt;/font&gt; - o próbach znalezienia solidnych teoretycznych podstaw do praktycznego zarabiania pieniędzy - postaram się napisać w kolejnych postach.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-2892912889030421143?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/2892912889030421143/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=2892912889030421143' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/2892912889030421143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/2892912889030421143'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2009/01/handel-walutami-czy-trendy-istniej.html' title='Handel walutami - czy trendy istnieją'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_le2GD5kB0hs/SV5pujSY9fI/AAAAAAAAABI/v_wx6WZOzDU/s72-c/EURUSD_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-8479031216254296171</id><published>2008-10-01T11:44:00.000-07:00</published><updated>2008-10-01T11:56:05.415-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><title type='text'>Post Scriptum i PostScript</title><content type='html'>Mój dobry znajomy opublikował niedawno nowe narzędzie do generowania PostScriptu. Jest to proceduralny język programowania o składni zbliżonej do C, tłumaczony bezpośrednio na PostScript - nazywa się &lt;a href="http://preps.110mb.com/postscriptum/index.html"&gt;Post Scriptum&lt;/a&gt;.  Angielskie słowo "postscript" znaczy to samo, co łacińskie (czy też międzynarodowe) - "post scriptum".

Aby zrozumieć możliwe zastosowania Post Scriptum, należy po pierwsze wiedzieć jak działa i czym jest PostScript.  Potocznie traktowany jako format plików graficznych, w rzeczywistości PostScript jest językiem programowania wysokiego poziomu, stworzonym jako język opisu strony  &lt;a href="http://en.wikipedia.org/wiki/Page_description_language"&gt;(page description language)&lt;/a&gt;, ale będącym pełnym językiem programowania.  

PostScript jest idealny do generowania maszynowego, niezbyt jednak nadaje się do użycia ręcznego. Problemem jest przede wszystkim składnia języka, oparta na odwrotnej notacji polskiej &lt;a href="http://en.wikipedia.org/wiki/Reverse_Polish_notation"&gt;(Reverse Polish notation)&lt;/a&gt; pozbawiona nawiasów.  Predestynuje ona PostScript do generowania automatycznego, ale praktycznie uniemożliwia żywemu programiście szybkie czytanie złożonego kodu.

Oto przykład:

Wyrażenie w Post Scriptum, zrozumiałe dla każdego programisty:
&lt;PRE&gt;
if (x[1] &gt; 2*y) 
    x[1]=y-1; 
else 
    x[1] += 1;
&lt;/PRE&gt;

zapisane w PostScripcie wygląda na przykład tak:

&lt;PRE&gt;
x 1 get 2 y mul gt{
   x 1 y 1 sub put
}
{
   x 1 x 1 get 1 add put
} ifelse
&lt;/PRE&gt;

Na tym poziomie da się to jeszcze czytać przy odrobinie wprawy, ale już widzimy różnicę - musimy się trochę skupić.  W bardziej złożonych programach wyszukanie błędu jest mozolne i naprawdę można tego uniknąć używając Post Scriptum.

Taka beznawiasowa składnia nazywana jest postfiksową - tak nazywa się zapis, w którym argumenty stoją przed operatorami - stąd chyba zresztą wzięła się nazwa PostScriptu.  Autor Post Scriptum celnie zauważył, że składnia ta jest jedynym elementem języka, który powstrzymuje programistów od masowego bezpośredniego używania PostScriptu.  Pozostałe elementy języka, takie jak zarządzanie pamięcią, system typów, czy wreszczie rozbudowany system graficzny, stanowiący &lt;span style="font-style:italic;"&gt;clue&lt;/span&gt; PostScriptu, są wygodne, przemyślane i dopracowane - można powiedzieć, że aż chciałoby się ich używać, gdyby nie ten język ...

Wniosek był jeden: trzeba stworzyć język, który będzie miał klasyczną składnię, a tłumaczony będzie na PostScript. Tak powstało &lt;a href="http://preps.110mb.com/postscriptum/index.html"&gt;Post Scriptum&lt;/a&gt;.  Podobnie powstał język C - w wyniku znużenia zawiłościami kodu assemblerowego.  Ale można w C zakodować prawie wszystko to, co w asemblerze.  Podobnie w naszym nowym języku - program w Post Scriptum może być funkcjonalnie równoważny dowolnemu programowi w PostScripcie.

Nowy język posiada klasyczne konstrukcje sterujące: pętle, instrukcje "if", funkcje. Obsługuje typy danych PostScriptu: słowniki (odpowiedniki paskalowych rekordów, struktur C, czy PHP-owych hashów), stringi i oczywiście liczby stało- i zmiennoprzecinkowe.  Operatory PostScriptu udokumentowane bardzo dokładnie w "PostScript Language Reference Manual" firmy Adobe) są wywoływane bezpośrednio jak każda inna funkcja, dzięki czemu Post Scriptum daje dostęp do całej 
graficznej maszynerii PostScriptu.  Możliwe jest też włączanie kodu napisanego w PostScripcie bezpośrednio do programu w Post Scriptum.

Na etapie kompilacji można dołączać fragmenty kodu (klasyczna dyrektywa "include") jak i gotowe fragmenty PostScriptu (dyrektywa "import").  

Autor poprzedził pracę nad tym językiem poszukiwaniami gotowego rozwiązania tego typu i - o dziwo - nie znalazł. W dalszych planach, o ile mi wiadomo, jest wsparcie dla kontroli typów (obecnie język jest polimorficzny, jak PostScript), kontrola prototypów funkcji i inne feature'y wspierające szybkie tworzenie i debugowanie kodu.  

Życzę autorowi dalszego zapału i zachęcam wszystkich do odwiedzenia &lt;a href="http://preps.110mb.com/postscriptum/index.html"&gt;strony "Post Scriptum"&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-8479031216254296171?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/8479031216254296171/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=8479031216254296171' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/8479031216254296171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/8479031216254296171'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2008/10/post-scriptum-i-postscript.html' title='Post Scriptum i PostScript'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-8438686044436999205</id><published>2008-06-19T01:25:00.001-07:00</published><updated>2008-06-19T08:48:34.759-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><title type='text'>Najprostsze pliki graficzne</title><content type='html'>Trzy formaty plik&amp;#243;w graficznych: PPM, PGM i PBM (portable pixmap, portable graymap, portable bitmap) wsp&amp;#243;lnie określane popularnie jako &amp;quot;portable anymap&amp;quot; stanowią w zamyśle autor&amp;#243;w &amp;quot;wsp&amp;#243;lny mianownik&amp;quot; format&amp;#243;w graficznych, format prosty i oczywisty, pozwalający na wymianę danych graficznych pomiędzy systemami i programami.  Format zdefiniowany w latach 80-tych i używany do dziś.&lt;p&gt;Wszystkie trzy oparte są na wsp&amp;#243;lnej zasadzie:  plik zawiera nagł&amp;#243;wek z koniecznymi danymi (rozmar, typ) i prostokątną macierz pixeli.  Pixel określa kolor w postaci składowych RGB (dla pixmap PPM), stopień szarości (dla greymap) lub jednobitową wartość biało-czarną (dla bitmap). Format zdefiniowano w wariancie binarnym i tekstowym.  W przyrodzie występują z rozszerzeniem .ppm, .pbm i .pgm, ale także .pnm (Portable aNyMap).&lt;p&gt;Dalszym rozwinięciem tego formatu jest PAM, występujący tylko w formie binarnej, pozwalający na dalsze rozszerzenia, kanał alfa itp.&lt;p&gt;W Twoim Unixie znajdziesz mn&amp;#243;stwo program&amp;#243;w - narzędzi zawierających w nazwie ciąg znak&amp;#243;w ppm, pnm, pgm itp.  Oto rezultat komendy &amp;quot;apropos pnm&amp;quot; na komputerze, na kt&amp;#243;rym piszę ten artykuł  (pierwszy fragment) :&lt;pre&gt;
anytopnm (1)         - attempt to convert an unknown type of image file to a portable anymap
bmptopnm (1)         - convert a BMP file into a portable anymap
calibrate_ppa (8)    - pnm2ppa calibration tool
fiascotopnm (1)      - Convert compressed FIASCO image to PGM, or PPM
fitstopnm (1)        - convert a FITS file into a portable anymap
gemtopnm (1)         - convert a GEM .img file into a portable anymap
giftopnm (1)         - convert a GIF file into a portable anymap
jpegtopnm (1)        - convert JPEG/JFIF file to portable pixmap or graymap
palmtopnm (1)        - convert a Palm pixmap into a portable anymap
pamdeinterlace (1)   - remove ever other row from a PAM/PNM image
pamfile (1)          - describe a Netpbm (PAM or PNM) file
pamstretch (1)       - scale up a PNM or PAM image by interpolating
between pixels&lt;br&gt;pamstretch-gen (1)   - use pamstretch and pnmscale to scale by non-integer values
pngtopnm (1)         - convert a Portable Network Graphics file into portable anymap
pnm2ppa (1)          - convert portable anymap (PNM) images to HP&amp;#39;s&lt;br&gt;PPA printer format.
pnmalias (1)         - antialias a portable anyumap.
pnmarith (1)         - perform arithmetic on two portable anymaps
pnmcat (1)           - concatenate portable anymaps
pnmcolormap (1)      - create quantization color map for a portable anymap
pnmcomp (1)          - composite (overlay) two portable anymap files together
pnmconvol (1)        - general MxN convolution on a portable anymap
pnmcrop (1)          - crop a portable anymap
pnmcut (1)           - cut a rectangle out of a portable anymap
pnmdepth (1)         - change the maxval in a portable anymap
pnmenlarge (1)       - read a portable anymap and enlarge it N times
pnmfile (1)          - describe a portable anymap
pnmflip (1)          - perform one or more flip operations on a portable anymap
pnmgamma (1)         - perform gamma correction on a portable anymap
pnmhisteq (1)        - histogram equalise a portable anymap
pnmhistmap (1)       - draw a histogram for a PGM or PPM file
pnmindex (1)         - build a visual index of a bunch of anymaps
pnminterp (1)        - scale up a PNM or PAM image by interpolating between pixels
pnminterp-gen (1)    - use pamstretch and pnmscale to scale by non-integer values
pnminvert (1)        - invert a portable anymap
pnmmargin (1)        - add a border to a portable anymap
pnmmontage (1)       - create a montage of portable anymaps
pnmnlfilt (1)        - non-linear filters: smooth, alpha trim mean, optimal estimation smoothing, edge enhancement.&lt;/pre&gt;
.......&lt;p&gt;Biorąc pod uwagę, że każdy taki plik można zamienić na postać tekstową, kt&amp;#243;rą łatwo przetwarzać przy użyciu narzędzi typu awk/perl/bash/sed, mamy w ręce pełną bibliotekę graficzną ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-8438686044436999205?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/8438686044436999205/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=8438686044436999205' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/8438686044436999205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/8438686044436999205'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2008/06/najprostsze-pliki-graficzne.html' title='Najprostsze pliki graficzne'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-1791436310121549061</id><published>2008-06-17T07:44:00.001-07:00</published><updated>2008-06-17T07:51:51.419-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='matematyka'/><title type='text'>Nagroda Wolframa przyznana pół roku temu</title><content type='html'>Wszedłem niedawno przypadkowo na strony Wolframa - nagroda Wolframa, 25000 dolar&amp;#243;w, została przyznana w zeszłym roku: &lt;a href="http://blog.wolfram.com/2007/10/24/the-prize-is-won-the-simplest-universal-turing-machine-is-proved"&gt; Maszyna jest uniwersalna ! &lt;/a&gt; Młody anglik rozwikłał problem, gdyż uważał go za niezłą zagadkę. Początkowo sądził, że maszyna, o kt&amp;#243;rej mowa w treści problemu, jest zbyt prosta. Sądził, że zdoła pokazać jej nieuniwersalność.  Gdy jednak przyjrzał jej się bliżej, ujrzał złożoność, kt&amp;#243;ra dała podłoże do zbudowania maszyny uniwersalnej.

Można mu pozazdrościć, zwłaszcza, że po przekartkowaniu dowodu ma się wrażenie, że jest on w zasięgu możliwości zrozumienia, a więc i skonstruowania, matematyka-amatora.  Wolfram pisze, że nagroda ta jest miłym sposobem wydania dwudziestu pięciu tysięcy ...

Wolfram sądzi, że wszystko jest obliczeniami ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-1791436310121549061?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/1791436310121549061/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=1791436310121549061' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/1791436310121549061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/1791436310121549061'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2008/06/nagroda-wolframa-przyznana-p-roku-temu.html' title='Nagroda Wolframa przyznana pół roku temu'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-8426902989176288735</id><published>2008-06-16T08:09:00.001-07:00</published><updated>2008-06-16T08:45:35.173-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><title type='text'>OOA/OOD i Air Traffic Control</title><content type='html'>Metoda obiektowa projektowania i analizy software'u ma w opinii zwolennik&amp;#243;w wprowadzić dyscyplinę i porządek do procesu tworzenia oprogramowania.  W rzeczywistości wydaje się być jednak za mało ścisła.  W klasycznych książkach Coada i Yourdona i na wykładach w uczelniach technicznych, kt&amp;#243;re opierają się na tej obiektowej tradycji proponuje się poszukiwanie klas i obiekt&amp;#243;w w fizycznej rzeczywistości i odwzorowanie ich w projekcie.  Zawsze mnie to dziwiło, jakim cudem struktura rzeczywistości ma się tak prosto przenieść na strukturę programu.  Ma to sens, owszem, ale tylko w symulacji komputerowej. Należy zawsze pamiętać o tym, że obiekty w programie to odwzorowanie naszej wiedzy, a nie stanu rzeczywistego obiektu.  I tak, na przykład, w programie używanym w aptece, owszem, mamy obiekt klasy &lt;span style="font-weight:bold;"&gt;&amp;quot;pacjent&amp;quot;&lt;/span&gt; a także &lt;span style="font-weight:bold;"&gt;&amp;quot;lekarstwo&amp;quot;&lt;/span&gt;, ale nie będzie metody &lt;span style="font-weight:bold;"&gt;"pacjent.zażyj( lekarstwo )"&lt;/span&gt;, bo to tylko w rzeczywistości pacjenci zażywają lekarstwa.  W komputerze nie.&lt;p&gt;W książce Coada i Yourdona autorzy posługują się przykładem wziętym z życia:  systemem kontroli ruchu powietrznego.  Pełno tam tras, radar&amp;#243;w i samolot&amp;#243;w.  Kiedy to czytałem, nie wiedziałem, dlaczego akurat te radary są takie ważne.  Potem, parę lat p&amp;#243;źniej, przypadkowo natrafiłem na klasyczną unixową grę tekstową &lt;a href="http://linux.die.net/man/6/atc"&gt; atc. &lt;/a&gt; 

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_le2GD5kB0hs/SFaII6vDY8I/AAAAAAAAAA0/1MlTOzMfnqQ/s1600-h/ATC.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_le2GD5kB0hs/SFaII6vDY8I/AAAAAAAAAA0/1MlTOzMfnqQ/s400/ATC.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5212503305514869698" /&gt;&lt;/a&gt;

Był to prosty symulator konsoli radaru kontrolera ruchu powietrznego.  Na ekranie powyżej widzimy, jak to działa.  Właśnie w mój obszar wleciały dwa samoloty: b7 i A7. A7 zmierza w stronę wyjścia E1, a b7 w stronę E4 (widzimy ten "plan lotu" w tabelce po prawej).  Oba znajdują się na wysokości 7 tys. stóp (oznacza to siódemka w symbolu samolotu).  Należy, wydając odpowiednie komendy dotyczące kierunku ruchu i wysokości lotu doprowadzić wszystkie samoloty do ich przeznaczenia i nie dopuścić do zderzenia.  Po kilkunastu minutach konsola radaru zawiera kilka lub kilkanaście samolotów, a człowiek jest znużony z powodu ciągłego napięcia.

Ponieważ sterowanie wyimaginowanymi samolotami jest bardzo zajmujące, postarałem się o zdobycie bardziej rozbudowanych, graficznych program&amp;#243;w, w końcu zacząłem używać darmowego symulatora firmy&lt;a href="http://www.xavius.com"&gt; Xavius. &lt;/a&gt;Prawdę m&amp;#243;wiąc ze wszystkich gier komputerowych, jakie miałem w życiu poznać (c&amp;#243;ż poznałem ich niewiele w porównaniu z moimi kolegami) ten rodzaj wciągnął mnie  najbardziej.  I siedząc godzinami w najwyższym napięciu nad sektorem powietrznym Chicago lub Los Angeles powoli uzyskiwałem wgląd w hierarchię klas Coada i Yourdona dotyczącą dziedziny ruchu powietrznego.  Jedno jest pewne:  aby zobaczyć te klasy, trzeba choć  trochę poznać tematykę, kt&amp;#243;rej dotyczy dany projekt.

Prymitywna gra atc(6) okazała się bardzo zbliżona w charakterze do tych złożonych.  Najwidoczniej jej autor wykonał kawał dobrej analizy obiektowej ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-8426902989176288735?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/8426902989176288735/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=8426902989176288735' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/8426902989176288735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/8426902989176288735'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2008/06/ooaood-i-air-traffic-control.html' title='OOA/OOD i Air Traffic Control'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_le2GD5kB0hs/SFaII6vDY8I/AAAAAAAAAA0/1MlTOzMfnqQ/s72-c/ATC.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-6479044039292112873</id><published>2008-06-09T08:48:00.001-07:00</published><updated>2008-06-09T08:54:47.261-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='matematyka'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Milion dolarów nagrody</title><content type='html'>Kolejna ciekawa okazja zdobycia dużych pieniędzy w drodze konkursu to &lt;a href="http://www.netflixprize.com"&gt;Netflix Prize&lt;/a&gt;.  Tym razem chodzi o sztuczną inteligencję, algorytmy uczące i data-mining.  Firma Netflix, największy online&amp;#39;owy serwis z filmami DVD oferuje tak wielką nagrodę za opracowanie algorytmu rozpoznawania upodobań użytkownik&amp;#243;w, kt&amp;#243;ry pobiłby algorytmy dotychczas stosowane w ich serwisie.  Suma jest tak duża, a zadanie tak prosto sformułowane, że warto zapoznać się z zasadami tego konkursu.&lt;p&gt;Wyobraźmy sobie bazę danych obejmującą filmy i preferencje użytkownik&amp;#243;w.  Każdy użytkownik ocenia niekt&amp;#243;re filmy w pewnej skali, my dysponujemy ocenami, a naszym zadaniem jest przewidzieć ocenę, kt&amp;#243;rej brak w bazie.  Jeśli trudno sobie wyobrazić, jak się to robi, wystarczy sobie uświadomić, że istnieją grupy użytkownik&amp;#243;w o podobnych gustach (np. mężczyźni inaczej oceniają pewne filmy niż kobiety) a także zbiory podobnych film&amp;#243;w (gatunki, rodzaje, filmy danego reżysera).  W rzeczywistości efektywne algorytmy tego typu opierają się na badaniu struktury zbioru ocen, a nie na explicite podanych atrybutach, ale w przypadku nagrody Netflix dysponujemy pewnym ograniczonym zbiorem danych dodatkowych (tytuły, daty) i jak najbardziej można z nich korzystać.&lt;p&gt;Jeśli ktoś zdecyduje się zmierzyć z problemem, powinien pobrać dane testowe z internetu i rozpocząć eksperymenty.  Co ciekawe, można zapoznać się z wynikami pośrednimi, ponieważ regulamin konkursu jest tak skonstruowany, że zachęca do ich publikowania (po prostu ufundowano nagrody pośrednie).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-6479044039292112873?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/6479044039292112873/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=6479044039292112873' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/6479044039292112873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/6479044039292112873'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2008/06/milion-dolarw-nagrody.html' title='Milion dolarów nagrody'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-8417792198838578211</id><published>2008-06-05T09:51:00.001-07:00</published><updated>2008-06-05T10:09:33.454-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fizyka'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><title type='text'>Widzenie barwne i Unix</title><content type='html'>Widzenie barwne człowieka oparte jest na trzech r&amp;#243;żnych typach kom&amp;#243;rek światłoczułych, czułych odpowiednio na światło czerwone, zielone i niebieskie, dlatego każde wrażenie barwne może być wywołane za pomocą bodźc&amp;#243;w tr&amp;#243;jkolorowych wymieszanych w odpowiednich proporcjach.  Kolor ż&amp;#243;łty widzimy, gdy pobudzimy oko mieszaniną barwy zielonej i czerwonej, ale identyczny kolor spostrzegamy gdy pobudzimy oko monochromatycznym światłem ż&amp;#243;łtym.  Nie ma tu analogii do słyszenia dźwięk&amp;#243;w:  człowiek odr&amp;#243;żnia wielodźwięki od dźwięk&amp;#243;w prostych, ponadto nie jest wrażliwy na wysokość dźwięku, a raczej na ich r&amp;#243;żnicę.&lt;p&gt; Znalazłem gdzieś w sieci obrazek mający przedstawiać widmo światła białego:&lt;p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_le2GD5kB0hs/SEgaWfnmxHI/AAAAAAAAAAU/ILtBHFO-8ro/s1600-h/pasek.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_le2GD5kB0hs/SEgaWfnmxHI/AAAAAAAAAAU/ILtBHFO-8ro/s320/pasek.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5208441942801040498" /&gt;&lt;/a&gt;


&lt;br&gt;Postanowiłem zbadać, jak został skonstruowany z trzech barw&lt;br&gt;składowych.  Tęcza powinna składać się z barw prostych o zmieniającej się płynnie długości.  Grafika komputerowa to - wiadomo - mieszanina trzech barw prostych o r&amp;#243;żnym natężeniu w r&amp;#243;żnych punktach - coś całkiem innego niż oryginalny pierwowz&amp;#243;r.  Gdyby istniała istota zdolna do widzenia absolutnego barw, bez trudu rozpoznałaby oszustwo. Ja potrzebowałem do tego kilku narzędzi uniksowych.&lt;p&gt; Po pierwsze rozkompresowałem obrazek przy użyciu djpeg:&lt;p&gt; 
&lt;pre&gt;
$ djpeg pasek.jpg &amp;gt; pasek.ppm
&lt;/pre&gt;
&lt;p&gt; Następnie przekonwertowałem plik na format tekstowego ppm&amp;#39;a, aby łatwiej mi było go dalej przetwarzać:&lt;p&gt; 
&lt;pre&gt;
$ pnmnoraw pasek.ppm &amp;gt; pasek.txt
&lt;/pre&gt;
Szybki rzut oka do pliku:&lt;p&gt; 
&lt;pre&gt;$ head pasek.txt
P3
600 66
255
254 0 0
254 0 0
254 0 0  
254 0 0  
253 1 0  
&lt;/pre&gt;
.... &lt;br&gt;
&lt;p&gt; Mamy 600 pikseli szerokości.&lt;p&gt; 
Teraz zamieniam trochę porządek, żeby mieć jeden piksel w jednym wierszu:
&lt;pre&gt;
$ awk &amp;#39;{
&amp;gt;         S=&amp;quot;&amp;quot;;
&amp;gt;         for (i=1; i&amp;lt;=NF; i++) {
&amp;gt;                 S=S&amp;quot; &amp;quot;$i;
&amp;gt;                 if (i % 3 == 0) {
&amp;gt;                         print S;
&amp;gt;                         S=&amp;quot;&amp;quot;;
&amp;gt;                 }
&amp;gt;         }
&amp;gt; }&amp;#39; pasek.txt &amp;gt; pasek.x

$ head pasek.x
254 0 0
254 0 0
254 0 0
254 0 0
&lt;/pre&gt;
.... &lt;br&gt;

Dobrze idzie, teraz wezmę jeden rządek i narysuję wykres nasycenia trzech barw:
&lt;pre&gt; 
$ head -n 600 pasek.x &amp;gt; pasek3
$ gnuplot
gnuplot&amp;gt; plot &amp;#39;pasek3&amp;#39; using 1 with lines, &amp;#39;pasek3&amp;#39; using 2 with&lt;br&gt;lines, &amp;#39;pasek3&amp;#39; using 3 with lines
&lt;/pre&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_le2GD5kB0hs/SEgdNvnmxII/AAAAAAAAAAc/553zDq6FE30/s1600-h/wykres1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_le2GD5kB0hs/SEgdNvnmxII/AAAAAAAAAAc/553zDq6FE30/s320/wykres1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5208445091012068482" /&gt;&lt;/a&gt;

Pięknie, widać, co zrobił autor tego rysunku:  wygenerował go automatycznie używając kawałk&amp;#243;w liniowych funkcji !&lt;p&gt; Jeszcze tylko wykonałem zrzut ekranu i zamieniłem go na jpg, żeby umieścić wykres w blogu:
&lt;pre&gt; 
$ xwd
$ xwdtopnm pasek.xwd &amp;gt; pasek3.ppm
xwdtopnm: writing PPM file
$ cjpeg pasek3.ppm &amp;gt; wykres1.jpg
&lt;/pre&gt; 
Gotowe.&lt;br&gt; Ciekawe, jakbym to zrobił w Windowsach ...&lt;p&gt; Ciekawostką jest fakt, że gnuplot do oznaczania kolejnych linii używa kolor&amp;#243;w właśnie w kolejności&lt;br&gt;czerwony, zielony, niebieski.&lt;br&gt; Inną ciekawostką jest czerwony składnik po prawej stronie widma -&lt;br&gt;tam, gdzie mamy mocny fiolet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-8417792198838578211?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/8417792198838578211/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=8417792198838578211' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/8417792198838578211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/8417792198838578211'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2008/06/widzenie-barwne-i-unix.html' title='Widzenie barwne i Unix'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_le2GD5kB0hs/SEgaWfnmxHI/AAAAAAAAAAU/ILtBHFO-8ro/s72-c/pasek.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-4283735787877704491</id><published>2008-06-05T07:31:00.000-07:00</published><updated>2008-06-05T07:38:15.099-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='astronomia'/><title type='text'>Phoenix cd</title><content type='html'>Wczoraj lądownik Phoenix przestał odbierać sygnały z orbitera "Odyseja", który do tej pory służył jako przekaźnik sygnału na odcinku Ziemia - Mars. Powodem było nieoczekiwane wejście orbitera w  tryb bezpieczny. W trybie tym przestają działać mniej istotne funkcje, a do takich projektanci zaliczyli komunikację z lądownikiem.  Nie wiadomo dlaczego przekaźnik wszedł w tryb bezpieczny, ale spodziewamy się, że wyjdzie z niego za parę dni.

W takiej sytuacji Phoenix wykonuje rozkazy, które otrzymał uprzednio, w danym momencie oznacza to, że będzie kontynuował robienie zdjęć w celu skompletowania 360-stopniowej pełnokolorowej panoramy wysokiej rozdzielczości.  Jeśli będziemy mieli trochę szczęścia, zobaczymy może na horyzoncie  majaczące niewyraźnie sylwetki marsjańskich osiedli ...

Tymczasem naukowcy rozważają użycie jako przekaźnika MRO (Mars Reconnaissance Orbiter) który jest także przystosowany do tego celu i był już w ten sposób używany, ale miał ostatnio problemy z radiem.

W próbkach pyłu marsjańskiego, które Phoenix zdążył już pobrać za pomocą swojej kopareczki, widać  jakąś białą substancję, na razie nie wiadomo, co to.   Spekuluje się, że to lód, albo sól.

Na Marsie znajduje się w tej chwili ponad osiem ton sprzętu wysłanego przez ludzi. Najlepiej sprawują się amerykańskie łaziki, które działają już nieprzerwanie kilka lat, choć były obliczone na miesiące.  Inne państwa też wysłały tam &lt;a href="http://en.wikipedia.org/wiki/List_of_artificial_objects_on_Mars"&gt; kosmiczne roboty &lt;/a&gt; , ale wszystkie zagraniczne rozbiły się lub zepsuły ...  Amerykanie rządzą na Marsie.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-4283735787877704491?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/4283735787877704491/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=4283735787877704491' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/4283735787877704491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/4283735787877704491'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2008/06/wczoraj-ldownik-phoenix-przesta-odbiera.html' title='Phoenix cd'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-2291665236270782922</id><published>2008-06-03T08:40:00.000-07:00</published><updated>2008-06-03T08:55:21.886-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='astronomia'/><title type='text'>Phoenix</title><content type='html'>Kolejny amerykański robot wylądował na Marsie.  &lt;a href="http://phoenix.lpl.arizona.edu"&gt;Ta misja&lt;/a&gt; różni się od poprzednich - użyto statycznego lądownika, a nie autonomicznego łazika-włóczęgi.  Wynika to z celów misji, trzeba będzie wiercić, potrzeba dużo sprzętu.  Naukowcy chcą poszukać wody.  Chodzi o to, że woda będzie bardzo potrzebna ludziom, gdy tam się znajdą, a także o to, że wciąż wierzymy, że życie w kosmosie rozwija się w wodzie.  Owszem, woda ma bardzo wiele właściwości sprzyjających życiu, jakie znamy, ale czy nie jesteśmy zbyt antropocentryczni w naszym rozumieniu życia w ogóle ? ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-2291665236270782922?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/2291665236270782922/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=2291665236270782922' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/2291665236270782922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/2291665236270782922'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2008/06/phoenix.html' title='Phoenix'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-2579030962375242847</id><published>2007-07-23T14:28:00.001-07:00</published><updated>2008-06-05T08:44:03.641-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='astronomia'/><category scheme='http://www.blogger.com/atom/ns#' term='muzyka'/><title type='text'>Pluton</title><content type='html'>Na początku XX wieku Gustav Holst napisał "Planety", suitę koncertową o wyraźnie astrologicznym programie, która zyskała sobie dużą popularność i wielu miłośników.  Autor muzycznej rubryki w &lt;a href="http://postepy.camk.edu.pl"&gt;Uranii&lt;/a&gt; nazwał je pozycją obowiązkową dla astronoma-melomana.  Podobno John Wiliams zapytany, czy wzorował się na "Marsie" Holsta pisząc muzykę do "Star Wars" miał odpowiedzieć, że nie wzorował się, ale jest dumny z takiego przypuszczenia ...
&lt;p&gt;
W 1930 roku odkryto kolejną planetę - Pluton - ale Holst nie dopisał kolejnej części, choć był do tego nakłaniamy.  Kilku innych kompozytorów to zrobiło, ale historia w pewnym sensie przyznała Holstowi rację - w 2006 roku &lt;a href="http://www.iau.org/"&gt;Międzynarodowa Unia Astronomiczna&lt;/a&gt;, chcąc uporządkować nazewnictwo orzekła, że Pluton jest tylko "planetą karłowatą".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-2579030962375242847?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/2579030962375242847/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=2579030962375242847' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/2579030962375242847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/2579030962375242847'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2007/07/pluton.html' title='Pluton'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-3350501684494253798</id><published>2007-07-20T13:42:00.000-07:00</published><updated>2007-07-23T13:11:57.158-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='matematyka'/><title type='text'>nagroda Wolframa</title><content type='html'>W maju 2007 &lt;a href="http://www.stephenwolfram.com/about-sw"&gt;Stephen Wolfram&lt;/a&gt; ufundował &lt;a href="http://www.wolframscience.com/prizes/tm23"&gt;nagrodę&lt;/a&gt; w wysokości 25000 $ dla osoby, która będzie w stanie rozsztrzygnąć problem, czy pewna prosta maszyna Turinga o dwóch stanach i trójsymbolowym alfabecie jest uniwersalna. Dla tych, którzy potrzebują pieniędzy, opisuję dalej pojęcia potrzebne do zdefiniowania problemu - są dość proste. Poniżej rzeczona maszyna zapisana graficznymi symbolami Wolframa:
&lt;p&gt;
&lt;a href="http://www.wolframscience.com/prizes/tm23"&gt;&lt;img  src="http://www.wolframscience.com/prizes/tm23/images/turing_machine.gif" /&gt;&lt;/a&gt;
&lt;a href="http://www.wolframscience.com/prizes/tm23"&gt;
&lt;/a&gt;
&lt;p&gt;
Maszyna Turinga jest abstrakcyjnym modelem obliczeń stworzonym dla celów teoretycznych przez Alana Turinga w 1936 roku. Składa się ona z nieskończenie długiej taśmy podzielonej na komórki, głowicy pisząco-czytającej, wskaźnika stanu, który może wskazywać jeden z kilku stanów, oraz tabelki reguł. Maszyna pracuje wg ścisłego przepisu, przy czym jej praca podzielona jest na kolejno następujące po sobie kroki. W każdym kroku maszyna czyta symbol z komórki znajdującej się właśnie w polu widzenia głowicy, w tabelce odszukuje regułę na podstawie aktualnego stanu i przeczytanego symbolu i wykonuje określoną w tej regule akcję. Akcją może być zapisanie nowego symbolu i przesunięcie głowicy o jedną komórkę w lewo lub w prawo.
&lt;p&gt;
Oczywiście istnieje wiele maszyn Turinga: różnią się liczbą stanów, alfabetem symboli i zawartością tabeli reguł. Co jest jednak najciekawsze, co udowodnił Alan Turing, możliwe jest stworzenie Maszyny Uniwersalnej, która potrafi symulować każdą inną maszynę Turinga, zapisaną w odpowiedni sposób symbolicznie na jej taśmie. Taka uniwersalna maszyna została wielokrotnie &lt;a href="http://en.wikipedia.org/wiki/Universal_Turing_machine"&gt;jawnie zapisana&lt;/a&gt;, jest to względnie proste zadanie. Można także udowodnić, że wszelkie mechaniczne obliczenia da się zrealizować za pomocą maszyny Turinga - jest to więc mocne narzędzie badawcze - jeżeli udowodnimy, że jakiś system obliczeniowy jest zdolny symulować Uniwersalną Maszynę Turinga, możemy mieć pewność, że potrafi on wykonać wszystkie obliczenia, które potrafimy formalnie zapisać - tak, jak komputer.
&lt;p&gt;
Do dziś nie wiadomo, jaka najmniejsza maszyna Turinga może być maszyną uniwersalną. Wolfram znalazł dwustanową maszynę o alfabecie pięcioznakowym, ale nie uduwodnił, że jest najmniejsza wśród Maszyn Uniwersalnych. Co więcej, znalazł lepszą kandydatkę, ale nie potrafi rozstrzygnąć, czy jest Uniwersalna. I stąd nagroda - każdy może zgarnąć tę pulę !
&lt;p&gt;
Dobrymi kandydatami do nagrody mogą być na przykład autorzy i entuzjaści ezoterycznych języków programowania - często posługują się tym aparatem pojęciowym, aby wykazać, że ich języki są "Turing-kompletne". Chcąc przystąpić do konkursu, warto przejrzeć &lt;a href="http://www.wolframscience.com/"&gt;New Kind Of Science&lt;/a&gt;, ale także prace hobbystów - polecam &lt;a href="http://esolangs.org/wiki/Main_Page"&gt;ich wiki&lt;/a&gt;. Jeżeli ktoś dziwi się "po co to wszystko", niech pomyśli o tych pieniądzach ;-) Albo niech pomyśli o Johnie von Neumannie, który w wyniku tego typu teoretycznych rozważań wpadł na pomysł budowy &lt;a href="http://lecture.eingang.org/edvac.html"&gt;maszyny liczącej&lt;/a&gt;, czyli komputera, którego zapewne właśnie używamy - ja - pisząc te słowa - Ty - czytając je.
&lt;p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-3350501684494253798?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/3350501684494253798/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=3350501684494253798' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/3350501684494253798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/3350501684494253798'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2007/07/nagroda-wolframa.html' title='nagroda Wolframa'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-8998140061627380938</id><published>2007-07-15T04:44:00.000-07:00</published><updated>2007-07-15T05:02:30.372-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='matematyka'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>konkursy programistyczne</title><content type='html'>W sieci można wiele konkursów programistycznych, w tym mniej lub bardziej ambitne konkursy matematyczne.  Jeden z ciekawszych , to konkurs &lt;a href="http://www.recmath.org/contest/"&gt;Ala Zimmermana&lt;/a&gt;, który nie tylko funduje kilkusetdolarowe nagrody, ale także zapewnia rozrywkę umysłową i rywalizację na wysokim poziomie.  Zadania, które proponuje to różnego rodzaju problemy optymalizacyjne, czy kombinatoryczne, często wymagające napisania sprytnego programu i poświęcenia wiele dni procesora na obliczenia.  Uczestnicy wysyłają swoje rozwiązania (wyniki obliczeń, nie programy), a na stronie konkursu można śledzić swoją pozycję w rankingu,  W pewnej chwili konkurs dobiega końca i najlepszy zgarnia kasę.

Jeśli ktoś interesuje się matematyką, zwłaszcza dziedzinami takimi jak teoria liczb albo matematyka dyskretna, polecam &lt;a href="http://projecteuler.net/"&gt;"Project Euler"&lt;/a&gt;. W tym konkursie nie ma nagrody pieniężnej, ale za to zadania są częściej publikowane i chyba łatwiejsze.  Tu po wysłaniu rozwiązania za pomocą formularza (podobnie jak w konkursie Zimmermanna wysyłamy tylko odpowiedź, nie program) od razu uaktualniana jest lista z rankingiem i widzimy, w jakim miejscu peletonu się znajdujemy.

W obu tych konkursach nie ma żadnych warunków co do używanych narzędzi, liczy się tylko rozwiązanie problemu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-8998140061627380938?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/8998140061627380938/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=8998140061627380938' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/8998140061627380938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/8998140061627380938'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2007/07/konkursy-programistyczne.html' title='konkursy programistyczne'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-565497801836314634</id><published>2007-07-09T14:10:00.000-07:00</published><updated>2007-07-09T14:38:31.680-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='matematyka'/><title type='text'>lazy K</title><content type='html'>Unlambda opiera się na rachunku kombinatorów SKI, który jest rachunkiem lambda pozbawionym zmiennych - stąd nazwa. Dodatkowo autor dołożył kilka nadmiarowych mechanizmów, w tym "call with current continuation", znane niektórym z Guile. Zrobił to celowo, na złość, zresztą przyznaje się do tego, chciał jeszcze bardziej zaciemnić obraz tego, co robi program w jego języku. Warto przejrzeć &lt;a href="http://www.madore.org/%7Edavid/computers/callcc.html"&gt;jego artykuł&lt;/a&gt; na ten temat. Konstrukacja ta robi czary-mary ze stanem obliczeń, w sposób dużo bardziej tajemniczy niż setjmp(3) z C albo throw/catch z C++.

Inaczej autor &lt;a href="http://homepages.cwi.nl/%7Etromp/cl/lazy-k.html"&gt;"lazy K"&lt;/a&gt; - ten uprościł wszystko maksymalnie i zostawił tylko operatory ("kombinatory") S, K, I.  Zresztą i tak był rozrzutny - przecież I może być wyrażone jako (S K K) - &lt;a href="http://c2.com/cgi/wiki?EssAndKayCombinators"&gt;zobacz tu&lt;/a&gt;.   Ale &lt;a href="http://homepages.nyu.edu/%7Ecb125"&gt;Chris Baker  &lt;/a&gt;był jeszcze bardziej radykalny i stworzył &lt;a href="http://ling.ucsd.edu/%7Ebarker/Iota"&gt;język&lt;/a&gt;, który ma tylko dwa symbole i nadal jest kompletny.

Czemu to służy ? Tylko teoretycznym badaniom. Albo artystycznej zabawie - dla niektórych język programowania też jest dziełem sztuki .......&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-565497801836314634?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/565497801836314634/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=565497801836314634' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/565497801836314634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/565497801836314634'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2007/07/lazy-k.html' title='lazy K'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-6401650043436389365</id><published>2007-07-06T15:04:00.000-07:00</published><updated>2007-07-06T15:21:35.500-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='fizyka'/><category scheme='http://www.blogger.com/atom/ns#' term='aplet'/><title type='text'>SODA constructor</title><content type='html'>Tak wygląda skonstruowany w &lt;a href="http://3.bp.blogspot.com/_le2GD5kB0hs/Ro69fWyVjqI/AAAAAAAAAAM/V5yb7Jv8b9s/s1600-h/millipede.gif"&gt;&lt;img id="BLOGGER_PHOTO_ID_5084209375738171042" style="FLOAT: left; MARGIN: 12pt; WIDTH: 43px; CURSOR: hand; HEIGHT: 53px" height="50" alt="" src="http://3.bp.blogspot.com/_le2GD5kB0hs/Ro69fWyVjqI/AAAAAAAAAAM/V5yb7Jv8b9s/s320/millipede.gif" width="117" border="0" /&gt;&lt;/a&gt;aplecie &lt;a href="http://www.sodaplay.com/constructor/index.htm"&gt;SODA&lt;/a&gt; stwór robakopodobny, który umie chodzić ! Składa się ze sprężynek (to te czarne krechy) poruszających się w rytm fal nerwowych, których częstotliwość i fazę można ustawiać w ww aplecie wg uznania. Stworki takie mogą pełzać, dreptać, kiwać się i nawet można urządzać ich wyścigi. A fizyka całości jest bardzo prosta: sprężynki, grawitacja i tarcie. Całość w przestrzeni dwuwymiarowej. &lt;a href="http://www.sw3d.net/"&gt;Trójwymiarowa wersja konstruktora&lt;/a&gt; nie jest już tak łatwa w użyciu, ale za to efekty są niesamowite - te wszystkie ośmiornice i kosmiczne potwory są jak prawdziwe !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-6401650043436389365?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/6401650043436389365/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=6401650043436389365' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/6401650043436389365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/6401650043436389365'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2007/07/soda-constructor.html' title='SODA constructor'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_le2GD5kB0hs/Ro69fWyVjqI/AAAAAAAAAAM/V5yb7Jv8b9s/s72-c/millipede.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-7798595894148013526</id><published>2007-07-06T10:40:00.000-07:00</published><updated>2007-07-06T15:41:20.955-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><title type='text'>TargetWriter</title><content type='html'>Jak napisać generator tekstu oparty na szablonach ? Nie trzeba go pisać - istnieje i jest bardzo znany, to &lt;a href="http://www.gnu.org/software/bash/"&gt;BASH&lt;/a&gt;.

Wystarczy napisać kilka funkcji i korzystając z mechanizmów basha można generować dowolny tekst. Tak powstał &lt;a href="http://exoprog.110mb.com/wt"&gt;WriteTarget,&lt;/a&gt; generator oparty na bashu.

A tak wygląda próbka kodu:

&lt;pre class="example"&gt;# the template &lt;b&gt;&lt;i&gt;hello.tpl&lt;/i&gt;&lt;/b&gt;:
cat &amp;lt;&amp;lt;END_OF_FILE
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
     &amp;lt;title&amp;gt; &lt;span style="color:blue;"&gt;$(target &lt;span style="color:red;"&gt;MAIN_TITLE&lt;/span&gt;)&lt;/span&gt; &amp;lt;/title&amp;gt;

&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
     &amp;lt;h1&amp;gt; &lt;span style="color:blue;"&gt;$(target &lt;span style="color:red;"&gt;MAIN_TITLE&lt;/span&gt;)&lt;/span&gt; &amp;lt;h1&amp;gt;
     &lt;span style="color:blue;"&gt;$(target &lt;span style="color:red;"&gt;TEXT&lt;/span&gt;)&lt;/span&gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;  
END_OF_FILE 

# the text file:
. ./hello.tpl

write &lt;span style="color:red;"&gt;MAIN_TITLE&lt;/span&gt;  &lt;span style="color:green;"&gt;H E L L O&lt;/span&gt;
write &lt;span style="color:red;"&gt;TEXT&lt;/span&gt; &lt;span style="color:green;"&gt;Hello world !&lt;/span&gt;
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-7798595894148013526?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/7798595894148013526/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=7798595894148013526' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/7798595894148013526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/7798595894148013526'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2007/07/targetwriter.html' title='TargetWriter'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-1057925777534231871</id><published>2007-07-06T10:25:00.000-07:00</published><updated>2007-07-06T15:40:49.103-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><title type='text'>unlambda</title><content type='html'>Język programowania, który nie posiada pętli, instrukcji warunkowej, zmiennych, nie posiada właściwie nic, tylko jednoargumentowe funkcje. Funkcja przyjmuje jeden argument, jednoargumentową funkcję i zwraca także jednoargumentową funkcję. To nie LISP, to &lt;a href="http://www.madore.org/~david/programs/unlambda/"&gt;UNLAMBDA&lt;/a&gt;.

Funkcja stała - zwraca zawsze to samo.
Funkcja "przeźroczysta", albo identycznościowa - zwraca zawsze swój argument.
I konstruktor - funkcja, która pozwala tworzyć kolejne ....

To wystarcza, aby pisać kompletne w sensie maszyny &lt;a href="http://www.turing.org.uk/turing/"&gt;Turinga&lt;/a&gt; programy.

A tak wygląda program w tym języku:

&lt;pre class="example"&gt;
```s``s``sii`ki
  `k.*``s``s`ks
 ``s`k`s`ks``s``s`ks``s`k`s`kr``s`k`sikk
  `k``s`ksk
&lt;/pre&gt;



Czytać się tego nie da ....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-1057925777534231871?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/1057925777534231871/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=1057925777534231871' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/1057925777534231871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/1057925777534231871'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2007/07/unlambda.html' title='unlambda'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7005132798021120046.post-6229915105063361772</id><published>2007-07-06T09:54:00.000-07:00</published><updated>2007-07-11T08:31:05.622-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='muzyka'/><title type='text'>csound</title><content type='html'>Czym assembler dla programisty, tym dla muzyka komputerowego jest &lt;a href="http://www.csounds.com/"&gt;csound&lt;/a&gt;. Jest to program wywodzący się ze starej unixowej tradycji końca ubiegłego wieku, więc trudny w użyciu, ale baaaaardzo potężny.  Jak &lt;a href="http://www.povray.org/"&gt;Povray&lt;/a&gt; w grafice 3D, csound służy do off-line'owego renderowania utworu.  Może jednak także służyć jako real-time'owy syntezator - podłączamy go wtedy do naszego kontrolera MIDI i gramy.

A tak wygląda kawałek utworu napisany w języku csound'a:


&lt;pre class="example"&gt;
t 0 90

i100 0 205 .05 1.5 1.7
i101 0 205 .2 2.1 2 .25
i102 0 205 .3 2 2.2 .15 .175
i103 0 205

Dur Root Amp Shape Pat Acc Env Filter Pan Wet
;1 2 3 4 5 6 7 8 9 10 11 12
i1 0 4 6.04 15000 2 100 81 50 56 20 1
i1 + . . . . 101 . . . . .
i1 + . 5.04 . . 100 . . . . .
i1 + . . . . 101 . . . . .
i1 + . 6.04 . 2 100 . . . . .
i1 + . . . . 101 . . . . .
i1 + . 5.04 . . 100 . . . . .
&lt;/pre&gt;




A tak wygląda opis instrumentów w tym języku (orchestra file) :

&lt;pre class="example"&gt;
instr 3
kpan      =         p6
i1        =         p5*3

k1        oscil     i1, 1/p3, 10             ; ADSR
a2        oscil     k1, p4, 11               ; SINE

       outs      a2*kpan,a2*(1-kpan)

garvbsig  =         garvbsig+(a2*.1)

       endin
&lt;/pre&gt;


To oczywiście tylko próbka - prawdziwy program jest o wiele dłuższy ...
Jeśli chcesz posłuchać, co może powstać z takich matrixowych cyferek, posłuchaj
&lt;a href="http://bumpermusic.blogspot.com/2005/07/csound-internet-concerts.html"&gt;np. tu.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7005132798021120046-6229915105063361772?l=improvita.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://improvita.blogspot.com/feeds/6229915105063361772/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7005132798021120046&amp;postID=6229915105063361772' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/6229915105063361772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7005132798021120046/posts/default/6229915105063361772'/><link rel='alternate' type='text/html' href='http://improvita.blogspot.com/2007/07/csound.html' title='csound'/><author><name>Marc</name><uri>http://www.blogger.com/profile/18262754548595715492</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_le2GD5kB0hs/SZMXVufSl-I/AAAAAAAAACw/QTGEQQeLmR8/S220/imava.jpg'/></author><thr:total>0</thr:total></entry></feed>
