Jellonkowato…

Ktoś dodał komentarz do mojego dawnego wpisu o serwerze
gier
. Komentarz wyglądał tak:

XXXXXXX GG – 23 lutego 2005 18:33:29
Ma ktos Quake 2 jak tak to prosze o kontakt pod nr GG XXXXXXX prosze

No to piszę pod ten numerek, czy gościu nie chce w dziób, bo to nie tablica
ogłoszeń. Ale rozmówca nie wiedział o co chodzi, najwyraźniej nie miał z tym
nic wspólnego. W końcu zgodził się ze mną, że to jakiś idiota napisał, co
nawet swojego numerka nie umie przepisać… ech… Tym razem to chyba ja
wyszedłem na jellonka. ;-)

Blogowy nastrój…

Ostatnio jestem w jakimś takim blogowym nastroju. Nie dość, że chodzę
po różnych głupich (i mniej głupich) blogach (w czym mi PubSub.com pomaga),
po długiej przerwie napisałem parę postów, to jeszcze trochę odnowiłem mój
szablon. Nawet dodałem, poprzez brzydkiego hacka (takie są przecież
najfajniejsze ;-)), jeden ficzer, którego sam Jogger
nie daje. Co gorsza, już myślę o kolejnych…

Choroba się przenosi na kolejne pokolenie…

Krysia od czasu, do czasu się dorywa do dużego komputera. Słychać
wtedy:
— cieba odpalić dżabela!
— odpalam dżabela!
— jeszcze tylko napisie komentarz!
— zepsułam dżabela!
— piszę komentarz!

Czasem za ciągnie któregoś rodzica do dużego komputera lub laptopa i:
— tu dżabeluj!

Dziecko ma też swój putel — starą klawiaturę leżącą na stole.
Tam też dżabeluje czasem. Ostatnio robiła porządki w zabawkach i na
dnie chomika znalazła myszkę. Chyba nie potrafiła tego nazwać, ale jej
powiedziałem, że to myszka (i nic więcej). Dziecię zaraz to wzięło i
wdrapało się na swoje krzesełko przy stole:
— dzidzia podłączy myśkę tu do putela!

Plugin świra

Właśnie napisałem plugin Joggera dla swojego CJC. Oczywiście
jeszcze można wiele w nim zrobić, ale już powinno dać się wysyłać
wiadomości. A nawet nie tylko. Dla każdej wiadomości można wybrać poziom,
a przed wysłaniem jest walidowana wybranym DTD (domyślnie XHTML Strict).
A więc koniec wpisów psujących joggera! :-) Oczywiście edycja
odbywa się w edytorze wybranym przez użytkownika (domyślnie
$EDITOR lub vi, jak to w UNIXach). To będzie
pierwsza wiadomość wysłana z tego plugina na prawdziwego joggera, więc ciekawe
czy i jak dojdzie.

W przedostatnim wpisie pisałem o planowanym przejściu na
ejabberd. W kolejnym krótko napisałem, że się udało. Krótko,
bo było za wcześnie aby mówić o wielkim sukcesie no i dlatego, że nie miałem
plugina w CJC. Z dokładną oceną chciałem trochę poczekać i już chyba nadszedł
odpowiedni czas.

A więc z nowego serwerka jestem bardzo zadowolony. Większość użytkowników
chyba nawet nie zauważyła zmiany. Niektórzy wręcz założyli, że skoro dalej
wszystko działa, to znaczy, że wróciłem do starego. Po prostu działa.
Rozczarował mnie nieco interfejs administratora — zarówno z WWW jak i z
tkabbera. Okazało się, że nie da się przez to zakładać użytkowników. Trzeba z
shella za pomocą ejabberdctl albo pozwolić userom samym się
rejestrować, a tego nie chcę.

A co do tytułu wpisu… Dzisiaj byłem u psychiatry. Dostałem receptę. To już
chyba jestem oficjalnie świrem ;-). Prawdopodobnie ta wizyta to
tylko pieniądze wyrzucone w błoto, ale spróbować zawsze warto.

Porządki w kodzie i na Joggerze

Wywaliłem z PyXMPP wsparcie dla Pythona 2.2 i spróbowałem użyć modułu
datetime do obsługi timestampów. Okazało się, że jednak nie
rozwiązuje on moich problemów. Zapewnia interfejs do zamiany czasu
pomiędzy lokalnym a UTC, ale… tylko wtedy jak mu się poda klasy
reprezentujące odpowiednie strefy czasowe. A Python w module
datetime udostępnia jedynie abstrakcyjną klasę bazową.
Resztę trzeba sobie napisać. UTC to nie problem, ale przecież nie będę
pisał klas opisujących strefy czasowe wszystkich potencjalnych
użytkowników CJC! Jest gdzieś w sieci moduł zawierający gotowe klasy,
ale ja nie chcę dodawać kolejnej zależności, szczególnie, że przecież
w systemie już jest informacja o strefie czasowej użytkownika.

Zajrzałem do dokumentacji glibc, żeby zobaczyć jak się to w C robi. Jest
tam nawet potrzebna mi funkcja, nazywa się timegm,
ale:

*Portability note:* `mktime’ is essentially universally
available. `timegm’ is rather rare. For the most portable
conversion from a UTC broken-down time to a simple time, set the
`TZ’ environment variable to UTC, call `mktime’, then set `TZ’
back.

Fajnie, że podali przenośny sposób, ale zastosowanie jego w aplikacji
wielowątkowej to byłaby zbrodnia. A więc sposobu praktycznie nie ma.
Jednak nie będę przecież użytkownikom pokazywał czasu UTC, więc zacząłem
kombinować i nawet coś wykombinowałem: zamiana czasu UTC na lokalny
medodą kolejnych przybliżeń. Z moich testów — z czasem letnim
i zimowym z różnymi ustawieniami zmiennej $TZ
wynika że to nawet działa :-). Ciekawe jak bardzo
przekombinowałem.

Dzisiaj, nie mając wiele do roboty w pracy, urządziłem bug fixing
day
dla CJC. Poprawiłem już dwa błędy zgłoszone na JS oraz
kilka zgłoszonych przez Jabbera. Poczekam jeszcze na jakieś bugreporty
i może zrobię kolejne wydanie PyXMPP i CJC. MUC jeszcze dość
niekompletny, ale używalny, a wydać warto chociażby z powodu błędów
poprawionych w stosunku do 0.4.

Oprócz porządków w kodzie zrobiłem też porządki na Joggerze. Uzupełniłem
polecane Jogi o nowe pozycje i atrybuty title na linkach.
Usunąłem też linki erotycznie, ale nie dlatego że nagle sporządniałem
— po prostu nie chciało mi się ich uaktualniać. Poprawiłem jeszcze
ostatnią notkę — zamieniłem na w kilku
miejscach. Od dziś postaram się trzymać zasad typografii. Z poprawianiem
starszych notek byłoby za dużo roboty.

SPAM na blogu – a fe!

Przed chwilą odebrałem powiadomienie o komentarzu do mojego Joga. Ucieszyłem
się, bo dawno nikt nie wykazał zainteresowania moimi wypocinami. Radość znikła
gdy obejrzałem komentarz. Zupełnie nie dotyczył on tematu, było tylko jakieś
Super strona i URL. Co gorsza URL przekierowujący do jakiegoś sklepu
z narkotykami. Czegoś takiego tolerować nie będę. Komentarz został skasowany,
IP (z internetdsl) zablokowany, a nadużycie zgłoszone do
abuse@telekomunikacja.pl. Zresztą, może powinienem reagować (mniej brutalnie
oczywiście) już przy pierwszych, niewinnych spamach – z adresem strony o
filmach.

Działający parser i kompilowany szablon

Wczoraj udało mi się doprowadzić nowy parser strumienia w PyXMPP do działania.
Nie piszę skończyć, bo zasługuje jeszcze na wiele, głównie kosmetycznych, poprawek.
W każdym razie już CJC z libxml2 2.6.7 dzała, a to najważniejsze.

W pracy dokończyłem analizę tego nieszczęsnego machine check exception
i wyszło mi na to, że błąd został zgłoszony przez north bridge i dotyczy
kontroli ECC w pamięci. Czyli albo pamięć walnięta, albo płyta główna. Będzie trzeba
to sprawdzić i felerny sprzęt wymienić.

Potem na jogu
Marcoosa
przeczytałem o XFN i postanowiłem
użyć tego cuda u siebie. Ale że wymagałoby to poprawienia linków w dwóch plikach
(index.html i comments.html), to postanowiłem najpierw coś z
tym utrudnieniem zrobić. Więc resztę czasu w pracy, pomiędzy telefonami
klientów, spędziłem na tworzenie szablonów do szablonu i systemu kompilacji tego
do formy strawnej przez Joggera. Udało mi się – z kawałków będących well-formed
XML składane jest (XInclude, zaimplementowane w xmllint) szablony dla strony
głównej i z komentarzami. Po drodze jest wszystko walidowane – w tym celu
stworzyłem DTD do szablonów dla XHTML 1.0. Pliki źródłowe się nie walidują, bo
musiałbym zrobić jeszcze DTD uzwględniające XInclude, a docelowy nie waliduje
się, bo ma deklarację DTD dla XHTML, nie uwzględniającą tagów Joggera, poza
deklaracją waliduje się względem tego mojego Joggerowego DTD.

Dla odmiany style CSS tworzone są przy pomocy preprocesora M4. Zrezygnowałem
z używania @import do składania szablonów w przeglądarkach
czytelników, zamiast tego na Joggerze leżą już kompletne, posklejane pliki
stylów. Dzięki temu walidator przestał głupieć, a i strona ma szansę szybciej
się załadować (aby wyświetlić stronę w pełni teraz wystarczy załadować 3 pliki
zamiast 7).

Wszystko razem spięte jest przy pomocy plików Makefile dla
GNU Make Oznaczeń XFN jeszcze nie dodałem. Nie starczyło czasu…
:-)

Obiadek (schabowy z frytkami i surówką) zjadłem Pod Pierożkiem, tak
jak pisałem. I smakował mi bardziej, niż wczorajszy w Sphinksie. Do tego był
tańszy, ale odrobinę mniej.

A teraz zabiorę się za zamalowywanie pamiątek po krysinych obiadkach. Ciekawe
czy po tym ta ściana nie będzie wyglądać jeszcze gorzej…

Na razie starczy

No i zrobiłem swoje szablony. Nie jestem w pełni z nich zadowolony, ale na
razie szkoda mi więcej czasu na to marnować.

Niektórzy czytelnicy skarżą się na kolorystykę i jej małą czytelność.
Chciałem więc dla nich zrobić alternatywny styl. Okazało się jednak, że
w Joggerze się nie da :(. Nie można wrzucić dodatkowych plików *.css na
serwer, a zewnętrznych nie chcę robić. Jednak okazało się że jak ten jedyny
styl zdefiniuje się jako domyślny (default), a nie trwały
(persistent), to FireFox (polubiłem w końcu tę przeglądarkę)
pozwala łatwo wybrać pomiędzy tym stylem, a swoim domyślnym. Więc jak ktoś
niedowidzi albo ma kiepski monitor, to niech włączy FireFoxa i po kliknięciu
ikonki na dole okna wybierze Basic Theme albo co tam jest
w jego wersji językowej ;-). A wszystkim Joggerowiczom polecam dopisanie
atrybutu „title” do <link type="stylesheet"
.../>
w swoim szablonie.

Czas na własne szablony

No i w końcu i ja zacząłem robić swoje szablony dla Joggera. Szablon
dla strony głównej już właściwie gotowy, do komentarzy może zrobię jutro.
Oczywiście starałem się zrobić wszystko zgodnie ze standardami. Nie tylko
jest Valid XHTML 1.0 Strict, ale także ma np. sensowny podział
nagłówkami h1-h3. Najgorszą robotą było poprawianie wszystkich starych wpisów,
żeby całe archiwum też było poprawnym XHTMLem, ale przy okazji mogłem sobie
poprzypominać co to się w zeszłym roku działo.