No więc zaczęło się... trochę przykro, bo niezaliczonym w miarę prostym egzaminem, ale to jest tak, jak się nie wierzy swojemu pierwotnemu myśleniu i pieprzy się najprostsze zadania - trochę w tę sesję przeszarżowałem z otwartością, jeżeli chodzi o rozwiązania zadań :)
Ale co robić w wakacje, czas fizycznego wysiłku i intelektualnego odpoczynku? Pracować! Ruszyła machina przygotowująca dosyć ciekawy produkt - ja uczę się aktualnie Ruby on Rails, a mój brat przygotowuje wszelkie potrzebne layout i już za około tydzień robota ruszy pełną parą. Chyba wszyscy już przypuszczają, że nie warto się nawet pytać co to konkretniej będzie, bo i tak nie odpowiemy. Mamy być to drobne zaskoczenie, może nie jakaś cudaczna rewolucja, bo nie o to nam chodzi - chcemy kolejnego przydatnego narzędzia, a ja przy tym chcę pożreć kolejne technologie, ot w ramach hobby.
Oczywiście na tym praca się nie skończy - to zrobienia mam jeszcze przynajmniej dwa serwisy, kompilator i type-checker na pracownię z Programowania i jakieś mniejsze popierdułki. Oprócz tego trzeba by się trochę przewietrzyć i po górach połazić. W każdym razie zapowiada się pracowicie, ale to jest akurat poprawne. A, jeszcze do poprawki trza się przygotować. Damy radę!
Kolejne odkrycia warte zapisania w moim internetowym pamiętniczku:
Dostałem wczoraj misję niezwykłą od brata mojego - napisać drobny skrypt do trackbackowania, a właściwie do udawania trackbacku. Rzecz niby łatwa, lekka i przyjemna - otworzyć socketa, wysłać odpowiedni komunikat, zamknąć socketa. Otóż wygląda na to, że chyba jednak nie.
Nie powiem, żebym się jakoś szczególnie przemęczał przy pisaniu skryptu, który miałby robić, to na czym mi zależy. Przeszukałem sieć w celu znalezienia specyfikacji trackback'a. I znalazłem nawet takową: oficjalna specyfikacja trackbacka. Okazuje się jednak, że w tej technologii nie jest tak przyjemnie, jak w przykładach podawanych w specyfikacji. Albo nawet nie to - specyfikacja zawiera błędy, źle pokazując użycie protokołu HTTP. Pewnie chodziło tylko o krótkie pokazanie koncepcji, jednak od dokumentów technicznych wymagałbym większej precyzji.
Po kilku godzinach spędzonych nad tym problemem wreszcie doszło do połowicznego sukcesu - udało mi się zrobić trackback na dwadzieściakilka, jednak został on rozpoznany jako anonymous i bez treści. Widocznie źle zakodowałem dwie zmienne albo nadałem za mały nagłówek Content-Length. Nie chce mi się dłużej bawić z tym problemem, szczególnie, że są już gotowe klasy do tej technologii - PHPTrackback.
A oto jak powinien wyglądać prawdziwy request do trackbacka:
POST /adres/skrypt.php?id=2331 HTTP/1.1 Host: domain.com Content-Type: application/x-www-form-urlencoded; charset=utf-8 Content-Length: 321 title=tralalaal&url=http://kot.us&blog_name=blog&excerpt=costam
Oczywiście zmienne kodowane są w kodzie urlowym (np. phpowym rawurlencode), ich znaczenia się pewnie każdy domyśli. Content-Length to nagłówek mówiący o tym, jaka długość ma treść, czyli ile znaków ma ciąg znaków ze zmiennymi (czyli ostatnia linia). Reszta jest raczej oczywista, więc opisywać tego nie będę.
Rzecz ważna - skrypt.php musi być oczywiście skryptem używanym przez dany system do wyłapywania trackbacków. Odnośniki do takich skryptów znaleźć można zazwyczaj pod notkami w blogach. Swoją drogą ciekawe dlaczego informacje o skrypcie do obsługi nie są udostępniane w metadefinicjach strony - ułatwiłoby to życie wielu blogowiczom, którzy nie musieliby szukać po całej stronie linka do trackbacków, a skrypt do wysyłki sam by znajdował takowy na danej stronie.
Wywołanie przy użyciu takiej treści pakietu HTTP powinno w przypadku sukcesu zwrócić dokument XML z error równym zero, natomiast w innym wypadku error będzie miał wartość 1. Ponoć można jeszcze w inny sposób kodować same zmienne w wywołaniu trackbacka, jednak rozwiązanie przeze mnie pokazane jest najprostsze i chyba najbardziej uniwersalne (od razu zaznaczam - autoryteterm żadnym w tej dziedzinie nie jestem).
Chciałbym na końcu przeprosić ewentualnych czytających za nadmiar słowa trackback - o technologii dowiedziałem się wczoraj i synonimów jeszcze żadnych nie poznałem :)
Ja, zakochany w formie programów Javowych, w pewnym sensie z musu zacząłem się uczyć nowego języka, zarówno dla mnie, jak i świata całego (gdyż jego historia sięga roku 2003) - Ruby. Kto kiedykolwiek robił coś w świecie Webowym zapewne ma od razu skojarzenia z RoR. W sumie nawet nic dziwnego - sam uczę się Ruby tylko i wyłącznie ze względu na ten framework.
Zatem czy jest Ruby? Ruby to obiektowy język skryptowy, podobny trochę do Perla, ponoć też do CLU (czego potwierdzić nie mogę, gdyż niestety w CLU nigdy nie robiłem). Do ważniejszych ficzerów należy chociażby garbage collector (rzecz klasyczna przy programowaniu wysokopoziomowym), przeciążanie operatorów (którego trochę mi brakuje w Javie, choć ideologicznie twórców Sunowskich rozumiem), pełna obiektowość (czyli nawet liczby są obiektami).
Bałem się, słysząc o pełnej obiektowości, że z działaniami arytmetycznymi będzie jak w Smalltalku - operatory bez priorytetów i inne równie głupie pomysły. Na szczęście moje obawy okazały się bezpodstawne.
Do innych właściwości języka należy chociażby wbudowana obsługa RegExpów, dzięki czemu bardzo łatwo jest porównywać (operatorem =~) stringi z wzorcami.
Totalnie dziwnym ideologicznie wydaje się fakt, że klasy można rozszerzać w dowolnym momencie. Mamy na przykład gotową klasę, a w połowie kodu przypomina nam się, że zapomnieliśmy dodać jedną metodę, i co? Nie musimy wracać do definicji klasy, a wystarczy, że wpiszemy ją w miejscu, w którym aktualnie się znajdujemy. Oczywiście przy dużych projektach takie kodowanie spotkałoby się z licznym fakaniem. Przy małych też byłoby głupotą, ale w każdym razie możliwość jest. Przydaje się to w innych momentach - gdy już mamy narzuconą z góry klasę, a chcemy ją rozszerzyć, to nie musimy tworzyć klasy potomnej, a wystarczy że dodamy do definicji nasze metody.
Dzisiaj zagłębiać się będę w zagadnienia bloków, iteratorów, instrukcji sterujących i czegoś tam jeszcze. Sam język wydaje się czasem perlowo-nieczytelny, jednak widać w nim jakieś jasne reguły, które wydają się być logiczne, więc zapewne po jakimś czasie czytanie kodu stanie się przyjemniejsze.