piątek, 6 marca 2009

Obrazek "inline" w 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:

Aby to zrobić, trzeba użyć schematu "data" zdefiniowanego w RFC 2397. Ponieważ schemat ten obsługuje kodowanie base64, można wstawić dowolną grafikę.

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 cross-side scripting 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 ...

Używając tego mechanizmu Jeff Epler zaimplementował w JavaScript funkcje służące do generowania obrazków w locie po stronie klienta.

wtorek, 17 lutego 2009

Durczok, Lis, Kaczyński, Niesiołowski i nasze emocje

Pan Kamil Durczok stał się dla nas źródłem wesołości, pozwalając się sfilmować przy pracy. Nie przebił moim zdaniem Tomasza Lisa, 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 Kamil uważa się za kogoś wyrastającego ponad poziom przeciętny, nie chciał stawać w szranki o nagrodę medialną razem z Kasią Cichopek - kimże ona jest przy nim ! Bez urazy ...

Wczoraj mogliśmy obejrzeć Tomasza Lisa w rozmowie na temat pana Czumy, a potem na innym kanale telewizyjnym pana Pospieszalskiego w dyskusji o eutanazji. I tu i tam widziałem gotujące się emocje (pogardę i wściekłość u Niesiołowskiego, gniew u Kaczyńskiego, pogardę i wściekłość u pana profesora 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. Lis stale wyciąga jakieś stare nagrania z Kaczyńskim, aby ludziom pokazać, jak agresywne są Kaczory. Nie udała mu się jednak prowokacja, kiedy gościł Kaczyńskiego u siebie - chociaż zaprezentował mu filmik z Marcinkiewiczem, nie usłyszał nic poza zapewnieniami o dobrej woli. Prezes Kaczyński zmienił front i hamuje agresję, choć pewnie mu ciężko. Za to tydzień później, Lis 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.

U Pospieszalskiego goście byli spokojni i opanowani, oprócz pana Profesora, 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 PROFESOREM. Pani redaktor też była mocno zdenerwowana.

Wszystko to nastraja mnie dość smutno - światem nie rządzi wcale rozum, wbrew temu, co się nam wmawia. Rządzą nimi EMOCJE wywoływane przez media - czytaj - MANIPULACJA. 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 Lis próbują to robić zawodowo, politycy - też, ale mam nadzieję, że przynajmniej ci, którym wierzę, robią to dla słusznych celów.

poniedziałek, 16 lutego 2009

Skrzynka z narzędziami

Podczas pracy z plikami tekstowymi często powstaje potrzeba przeprowadzenia prostej operacji w rodzaju sortowania, zmiany kolejności, sumowania itp. Zwykle odruchem jest pisanie jednolinijkowca w AWK-u albo innym ulubionym języku. Niesłusznie. Czasem lepiej jest otworzyć skrzynkę z narzędziami 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 shuf i inny, który wykonywał operację paste. Niepotrzebnie. Poniżej wymieniam kilka z tych narzędzi.

csplit:podział pliku na podstawie zawartości
cut:wybranie kolumn
join:połączenie plików wg wspólnej kolumny
paste:sklejenie plików kolumnami
shuf:mieszanie kolejności linii w pliku
split:podział pliku na równe kawałki
tac:wypisanie pliku liniami od tyłu
tr:zamiana znaków
uniq:wybranie linii powtarzających się

Warto zapoznać się z nimi - mają bogaty repertuar różnych opcji - na przykład program split może zliczać linie, albo znaki. Program paste może skleić pliki pionowo lub poziomo. Program shuf może mieszać linie, ale może też potasować swoje argumenty. I tak dalej. Skrzynka narzędziowa jest pełna !

Jednolinijkowce w AWK-u

AWK 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.

Pracując nad analizą techniczną kursów walut używam często awk-a i bash-a jako narzędzi szybkiego prototypowania i błyskawicznych kalkulacji.

Przykład: w pliku A.txt 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.

Za pomocą jednolinijkowca w AWK-u robię to tak:

awk '{s=0.1*$1+0.9*s; print s}' A.txt

Po przeczytaniu tego artykułu też będziesz to umieć.

Przykład innego typu: Chcę z pliku B.txt wybrać co dziesiątą linię:

awk '{n++; if(n>=10) {print; n=0}}' B.txt

Przykład trzeci - powiedzmy, że w pliku C.txt 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:

awk '{p+=$1; x+=$2; n++} END {print p/n, x/n}' C.txt

I tak dalej, wszysto szybko, łatwo i bezbłędnie.

AWK 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 AWK.

DZIAŁANIE AWK-a

Program w AWK-u 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 $1, $2, $3 itd.

Przykład:

awk '$1>1 {n++} END {print n}'

awk - to komenda - nazwa programu awk '$1>1 {n++} END {print n}' - to program w AWK-u, składa się z dwóch reguł: $1>1 {n++} - wzorzec $1>1 oznacza rekordy, w których wartość numeryczna pierwszego pola jest większa niż 1, akcja {n++} oznacza inkrementację zmiennej n END {print n} - wzorzec END to sztuczny wzorzec, nie dopasowywany do żadnego rekordu, skojarzona z nim akcja wykonywana jest na zakończenie programu. W tym wypadku wypisuje liczbę n.

Powyższy program liczy linie, w których pierwsza kolumna zawiera liczbę większą od 1, a następnie wypisuje wynik.

Akcje ujęte są w nawiasy {}, warunki to wyrażenia relacyjne lub specjalne symbole BEGIN lub END.

Inny przykład - pomnożenie wszystkich liczb zawartych w pliku:

awk 'BEGIN {x=1} {x*=$1} END {print x}'

Aby zmusić program do zainicjowania zmiennej jedynką został tu użyty wzorzec BEGIN. Tyle informacji wystarczy, aby rozpocząć eksperymentowanie.

niedziela, 25 stycznia 2009

Sztuka bezkontekstowa i sztuka algorytmiczna

Natknąłem się przypadkowo na interesujący program graficzny - Context Free - narzędzie służące do tworzenia algorytmicznej grafiki.

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 csound'a . 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 !

#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 < 0 ) 
                K = 0;
        else if ( d < 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 ));
        }
}

poniedziałek, 12 stycznia 2009

Więc czy da się przewidywać kursy walut na forexie ?

Dane historyczne są dostępne w sieci, wyposażmy się więc w jakieś narzędzie (dla mnie najwygodniejszy jest bash i awk, 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 62 % dla danych minutowych. Dla danych próbkowanych 2 razy rzadziej analogiczna wielkość to 59 % 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:
 1    0.622234
 2    0.595226
 5    0.570834
10    0.557971
20    0.543762
60    0.538403
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:
 1      0.000158347
 2      0.000164155
 5      0.00024643
10      0.000328186
20      0.000444261
60      0.000738944
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:
 1     -2.72892e-05
 2     -3.47364e-05
 5     -3.10888e-05
10     -2.79495e-05
20     -2.71165e-05
60     -9.24467e-06
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ść NIEZNACZĄCA, niwelowana przez prowizje. Nie powinniśmy jednak się poddawać ! Wykryty przez nas autentyczny fakt, polegający na MOŻLIWOŚCI przewidywania ruchów cen, którą można EKSPERYMENTALNIE UDOWODNIĆ 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 awk'a i jednolinijkowców do super ekstremalnie szybkiego programowania i obliczania różnych statystyk i prawdopodobieństw.

piątek, 2 stycznia 2009

Handel walutami - czy trendy istnieją

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 0.01 % !) i dostępne wysokie lewary (nawet do 200 x ). 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. Obalę mit o wyraźnych trendach , które rzekomo widoczne są gołym okiem na wykresach kursów. Poniżej przedstawiam wykres notowania pary EUR/USD na przestrzeni kilku lat: Końcowe załamanie to objaw obecnego kryzysu funansowego, który przerwał wyraźny trend rosnący 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:
awk 'BEGIN { x=1; p=1.001; 
     for (i=0; i<27783; i++) { 
        if (rand() < 0.5) x *= p; else x /= p; print x }
     }'
27783 to liczba punktów pierwotnego wykresu - chcę uzyskać dane tej samej długości. Oto, co uzyskuję: Wygenerowany wykres również zawiera wyraźny trend . Jedyne wyjaśnienie tego faktu to przypadek, albo złudzenie. Wygenerujmy więc kolejne cztery przebiegi czasowe i obejrzyjmy: Oprócz być może pierwszego z powyższych czterech sztucznie wygenerowanych wykresów, wszystkie posiadają odcniki wyraźnego trendu . 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 dane finansowe , takie jak notowania FOREXU czy giełdy, są nieprzewidywalnymi ciągami losowymi ? Czy więc cała analiza techniczna jest równoważna próbom znalezienia systemu wygrywania w totolotka ? 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 efektywności rynków 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 http://scholar.google.com ) dostarczające solidnych argumentów zwolennikom analizy technicznej. Jedno jest pewne : dzisiejszy trader nie obejdzie się bez komputera, podstawowej umiejętności programowania i podstawowej znajomości statystyki matematycznej. O swoich dokonaniach na polu handlu FOREXOWEGO - o próbach znalezienia solidnych teoretycznych podstaw do praktycznego zarabiania pieniędzy - postaram się napisać w kolejnych postach.