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.

Powydawałem trochę…

Powydawałem trochę oprogramowania. Hurtem:
PyXMPP 0.5
CJC 0.5
JJIGW 0.2.
Jeszcze do napisania anonsy na główną stronę JabberStudio, ale
na razie mi się nie chce ich pisać. Pewnie zaraz się okaże, że
w każdym z tych programów jest jakiś krytyczny błąd, z jakim
nie powinno się wydawać. Trudno, kolejny rilis pewnie i tak za
jakieś dwa miesiące lub pół roku, bo wcześniej nie będzie mi
się chciało.

W PyXMPP i CJC główną nowością jest obsługa rozmów grupowych,
w JJIGW poprawa stabilności i obsługa wielu sieci IRC. We
wszystkich poprawiona masa błędów i wprowadzonych nieco nowych.

A w pracy dzisiaj robię za tragarza… :-(

JJ i CIA

Napisali o mojej twórczości w Jabber Journal, ale moja
wrodzona skromność nie pozwala mi się tym chwalić. Więc się nie pochwalę
:-P

Aby moja sława nie zanikła postanowiłem też zadbać o regularne donosy do
CIA. Niestety na JabberStudio nie mam dostępu
do /CVSROOT/ i nie mogę bezpośrednio instalować commit-skryptów.
Mam jednak możliwość skierowania informacji od commita na dowolny JID lub adres
e-mail i z tej właśnie możliwości skorzystałem. Musiałem tylko napisać skrypt
do konwersji wiadomości z JS na XML zrozumiały dla CIA – niecała godzinka
roboty. Od dziś więc notowane będą moje commity nie tylko do
PLD,
ale także do:
PyXMPP,
CJC,
JJIGW
i
Transportu GG.

Obfalkać drzwi…

Gdy wychodziliśmy z Krysią na spacerek kichnąłem. Tak porządnie i w kierunku
drzwi sąsiadów. Krysię bardzo to rozśmieszyło. Zażartowałem, że obsmarkałem
drzwi sąsiadów
. Śmiała się jeszcze bardziej, powtarzając obfalkał
drzwi
. Później jej przeszło.

Gdy wracaliśmy, piętro pod naszymi drzwiami Krysia pociągnęła mnie w kierunku
drzwi, mówiąc: obfalkać drzwi!, ja na to nie obsmarkam drzwi sąsiadom,
ona: dzidzia obfalka!. Podeszła do drzwi i dmuchnęła nosem. Była bardzo
z siebie zadowolona.

A za chwilkę zabieram się za optymalizacją PyXMPP. Teraz w CJC jak napisze
/chat ktos@ i nacisnę dwa razy TAB, to ponad minutę muszę czekać aż
dostanę dwa pasujące JIDy do wyboru. Tak raczej być nie może. Myślę, że cache
JID-ów i wyników stringprep pomoże. Wcześniej muszę jednak z JID-ów
zrobić obiekty immutable i nie wiem czy dużo nie będę musiał poprawiać
(API się zmieni odrobinkę).

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.

Co by tu…

Ostatni tydzień upłynął pod znakiem Crossfire.
Pisałem już że to niebezpieczny pożeracz czasu? No to piszę.
Czas na grę został zabrany na niekorzyść telewizji oraz snu.
Czasami wyglądało to tak, jakbym się z żoną prześcigał kto później
w nocy wymięknie. Żona wygrywała, ale to pewnie dlatego, że ona nie musi
o 6:20 wstawać do roboty.

W weekend w Gliwicach była Grająca Starówka – kilka różnych
koncertów w małych uliczkach w okolicach Rynku. Wybraliśmy się tam
z Krysią i w sobotę i w niedzielę. W sobotę wracaliśmy wcześniej –
odprowadziłem dziewczyny kawałek w kierunku domu, a sam poszedłem na
GNU/Browarek (w moim przypadku GNU/Kola). W niedzielę, też długo
nie siedzieliśmy, bo Krysia zaczęła marudzić. Powodem złego humorku był
chyba balonik, który jej mama kupiła. Krysia ostatnio zwykle dostawała
baloniki napełnione powietrzem, a teraz dostała latający. Niestety nie
doceniła. Szczególnie nie podobało jej się, że balonik został do niej
przywiązany. Za którąś zmianą miejsca zaczepienia stwierdziła Bim
bam! Bim bam!
(po polsku: kur.., kur…!) i wydawało się,
że się z sytuacją pogodziła. Jednak nie do końca i trzeba było wracać.
Dopiero w połowie drogi do domu przypomniała sobie, że Gra! i że
chciałaby jednak jeszcze posłuchać, ale było już za późno.

Mimo wszystko udało mi się znaleźć też odrobinkę czasu na moje
programiki. Przepisałem od nowa obsługę rostera w PyXMPP. Zmieniłem przy
tym API (a najlepsze, że nawet je udokumentowałem), ale stare było
niewygodne, a poza tym stary kod był wolny i zupełnie niezgodny ze
standardem jeśli chodzi o traktowanie znaków Unicode (zupełnie olewał
profile stringprep). Nowy kod w CJC niczego nie popsuł, a nawet naprawił
parę błędów.

Miałem też problemy z JJIGW, które od czasu do czasu zżerało 100% CPU na
serwerze. Postanowiłem to zbadać Pythonowym profilerem. Okazało się to
niełatwe. Profiler sam z siebie olewa wątki poza głównym. Dokumentacja
i Google nie wiele mówią na ten temat, ale jakoś udało mi się odpalić
tego profilera także dla innych wątków z zapisywaniem statystyk do
innego pliku dla każdego wątku. Znowu się potwierdziło że wątki
w Pythonie są mocno niedopracowane.

Wczoraj natomiast zacząłem implementować klienta MUC w PyXMPP. Jak
dobrze pójdzie, to niedługo będzie można używać CJC wraz z JJIGW
oraz innymi implementacjami MUC i będę mógł porzucić tkabbera.

Wreszcie jakiś release, a nawet trzy

Dość tego ukrywania moich wypociń przed światem. Szczególnie że ostatnie wydanie PyXMPP
(0.3) nie działało z ostatnimi wydaniami libxml2 (>=2.6.7). Nawet w PLD Ac był taki
niedziałający zestaw. Wczoraj siadłem do kompa i wydałem kolejne wersje wszystkich moich
aktywnych Jabberowych projektów: PyXMPP
0.4
, CJC 0.4 i JJIGW 0.1. Wszystkim im jeszcze wiele
brakuje, ale używać się dają. CJC ma już nawet paru swoich wiernych użytkowników, a po
wczorajszym wydaniu już pojawił się nowy bugreport.

Dzisiaj dostałem polecenie służbowe od szefa: zainstalować
TeamSpeak na naszym serwerze gier.
Szkoda że to zamknięte binarki, ale w końcu i tak większość gierek które tam mamy
to też zamknięty soft, nawet bardziej. Serwerek zainstalowałem i zacząłem się zastanawiać
nad kupnem słuchawek z mikrofonem do zabawy z tym w domu. Ale szef nas zaskoczył i przywiózł
5 kompletów takich (niestety nie za darmo). W firmie już testowaliśmy i fajnie jest. Może
sobie kupię takie słuchaweczki, a może nie.