Jabber GG Transport 2.0.6

Jak obiecałem tak zrobiłem. Transport GG w wersji 2.0.6 jest już dostępny. Najważniejsze zmiany to:

  • Poprawiony błąd który powodował wywrotkę transportu po otrzymaniu
    wiadomości od niezarejestrowanego użytkownika (zdalny DoS).
  • Poprawiona obsługa zmian obecności – teraz jggtrans powinien prawidłowo
    obsługiwać wiele sesji Jabbera jednego użytkownika.
  • Usprawniona obsługa statusów niedostępnych kontaktów – powinny być one
    widoczne w większości klientów.
  • Polecenie import roster zostało oznaczone jako „nie zalecane”, a w
    formularzu rejestracyjnym można wybrać pobranie listy kontaktów analogiczne
    do działania komendy get roster.
  • Anulowanie subskrypcji transportu na obecność użytkownika (wywalenie
    transportu z rostera, lub zmiana subskrypcji na „to” lub „none”) nie powoduje
    wyrejestrowania użytkownika z transportu – pozwala to na uniknięcie
    automatycznego logowania do transportu.

Wygląda na to że wersja ta działa stabilnie, a przynajmniej stabilniej od
poprzedniej. Uaktualnienie raczej zalecane, ale oczywiście „NO WARRANTY”. 😉

Hacker kontra inżynier-profesjonalista.

Mimo, że jogger nie służy do dyskusji dołącze się do wątku
zgody
i mmazura.
Zgadzam się z mmazurem. Dodałbym jeszcze coś – ja nie umiałbym pisać programu
od razu według założeń jak ma wyglądać produkt końcowy. Po prostu tego na
początku nie wiem. Oczywiście jest założony jakiś konkretny cel, ale można by go
osiągnąć na setki sposobów. Jak w parę godzin zrobię jakoś działającą
prowizorkę, to wiem co w niej jest nie tak, co należy zmienić, co dodać
i z czego zrezygnować. Czasem wiąże się to z pisaniem od nowa (nie jest to
dużo, jak już się wie jak), czasem wystarczy ulepszyć prowizorkę, a czasami
się ją po prostu porzuca – gdy okazuje się że projekt mnie przerasta, albo
uznam go za za mało ambitny czy użyteczny. To jest wolność jaką daje mi
hobbystyczne programowanie Open Source – mogę robić to co sprawia mi satysfakcję,
a z innych projektów zrezygnować. Dlatego też w pracy wolę być administratorem,
a nie programistą – daje mi to czas na programowanie jakie lubię.

Z zaczynaniem od prowizorki wiąże się jeszcze coś – nie zaczynam
„oficjalnie” projektu (np. przez założenie go na JabberStudio), póki nie mam
jeszcze jakoś działającego kodu, który nadaje się do dalszego rozwoju.
Oczywiście czasem okazuje się że poszedłem błędną ścieżką i w pewnym momencie
programu nie da się dalej rozwijać z powodu błędnych założeń – tak jest np.
z moim apingerem. Używają
tego chyba setki ludzi na całym świecie, dostaję ileś majli w sprawie jego
błędów i ograniczeń, ale żeby to poprawić musiałbym napisać to od początku.
Nie chce mi się – bo u mnie działa. Smutne, ale tak wyglądają ograniczenia
Open Source. A co do samych ograniczeń tego projektu – wynikały one głównie
z tego, że miał być to program bardzo prosty, a urósł do czegoś poważniejszego
– pierwotne założenia zostały osiągnięte, ale jak program się rozwijał, to
oczekiwania rosły. Nie wyobrażam sobie jednak, żebym miał coś zaczynać tworzyć
zakładając od razu wielki projekt – tworzenia dużych projektów nawet się nie
podejmuje. Linus też nie zaczynał pracy nad Linuksem z myślą o stworzeniu
w pełni funkcjonalnego i bardzo popularnego systemu operacyjnego na wiele
platform sprzętowych. Pierwotne założenia nie dość że różniły się od tego czym
Linux jest dzisiaj, ale w wielu miejscach były z tym sprzeczne. Ale przecież
jeden człowiek nigdy by nie zaczął pracy nad tak wielkim projektem.

A może ktoś zna jakiś duży projekt Open Source, który odniósł sukces, a prowadzony był „profesjonalnie” (według definicji zgody)?

Starczy tego, teraz czas zająć się obiecanym wydaniem nowego transportu
GG…

Życie na zwolnieniu lekarskim

Jakoś dochodzę do siebie po środowej operacji. Wczoraj byłem w Bytomiu na
kontroli i dowiedziałem się, że wyjątkowo mało spuchłem jak na taki zabieg.
A żona i tak twierdzi że wyglądam „jak pół chomika”. Po kontroli wpadłem do
firmy oddać L4 i zrobiłem przy okazji parę pilnych rzeczy, z którymi beze mnie
by sobie nie poradzili. Problemem oczywiście wciąż było (i nadal jest) jedzenie
– obiad jadłem z 5 razy dłużej niż zwykle, a po nim byłem potwornie zmęczony
i obolały. W nocy, jakby jeden chory w rodzinie to było mało, Krysia dostała
gorączki (38.4) i zamiast spać była pełna energii. Musiałem się ewakuować do
drugiego pokoju na podłogę. Czasem jakoś znosiłem jak łaziła mi po twarzy, ale
teraz to było wykluczone.

Dzisiaj obudziłem się bardziej obolały niż wczoraj. Do pracy ani nigdzie
indziej nie musiałem iść, więc żeby się czymś zająć zabrałem się za

Transport GG
. Postanowiłem wreszcie poprawić parę błędów o które userzy mnie
od jakiegoś czasu męczą. Ale mogłem spokojnie to olać, bo najwyraźniej nikomu
bardzo na tych poprawkach nie zależało – nikt nie zgłosił żadnego z tych błędów
na JabberStudio. Przy okazji znalazłem
buga, który pozwala na bardzo prosty zdalny DoS – wywalenie transportu jedną
wiadomością. Oprócz tego poprawiłem obsługę statusów opisowych niedostępnych
użytkowników (przy okazji okazało się, że wina, przynajmniej u mnie, jest w
połowie po stronie jggtrans, a w połowie po stronie tkabbera – w obu podobno
poprawione), obsługę zmian dostępności (brana pod uwagę jest tylko dostępność
zasobu o największym priorytecie) i chyba jeszcze jakieś drobiazgi. U siebie już
to zainstalowałem, jak nic się nie wysypie to prawdopodobnie jutro będzie
release wersji 2.0.6.

Koszmar

(co bardziej wrażliwi niech lepiej ominą ten wpis)

Właśnie wróciłem ze Specjalistycznej Przychodni Stomatologicznej w Bytomiu.
W pokiereszowanych ustach mam jakiś zakrawiony wacik, którego boję się wyjąc,
pluje krwią i ze strachem czekam na moment w którym znieczulenie przestanie
działać. Ale zacznijmy od początku…

Dzisiaj rano tam pojechałem na zabieg, na który zapisałem się jakieś dwa i pół miesiąca temu.
Już wtedy mnie ostrzeżono, że mimo że jestem zapisany na 9:30, to mogę czekać
do południa, albo i dłużej. Dlatego wziąłem sobie od żony książkę do czytania
w autobusie i na miejscu. Przeczytałem prawie całą, gdy o 12:15 zaproszono mnie
na salę operacyjną. Pani poradziła zdjąć koszulkę, bo będzie mi za ciepło i dała
fartuszek „żeby mnie nie ubrudzić jak będzie trzeba kość piłować”. Pocieszające.
Potem doktor się upewnił, że chodzi o lewą ósemkę, przy okazji się dowiedziałem,
że prawa kwalifikuje się na taki sam zabieg…

Zabieg zaczął się od znieczulenia. Zaczęło działać bardzo szybko – widać coś
mocniejszego niż używa moja dentystka. W ruch poszedł skalpel – coś mi tam
pocięli. Później długo na zmianę było jakieś wiercenie, podważanie i próby
wydłubywania. Ząb wyraźnie dawał opór, a chirurga najwyraźniej to też wkurzało.
Słyszałem tylko „co za cholerna ósemka”, „ten za krótki daj dłuższy”, „może coś
szerszego”, „dawaj korzeniowce”, „teraz trzonowce” itd. itp. W tym czasem
znęcano się nad moją paszczą. Ząb i bezpośrednie okolice były znieczulone, ale
szarpanie szczęką i tak nie jest przyjemne, poza tym asystentka ciągle odciągała
mi policzek, a narzędzia zbrodni czasem trafiały na inne nie znieczulone
miejsca. Twardzielem nie jestem, więc od pewnego momentu wiłem się, trzęsłem
i jęczałem. Za to dostawałem opieprz od chirurga. Dowiedziałem się też, że to
wszystko przeze mnie, bo się upierałem na ten termin (co jest oczywiście
nieprawdą) i parę innych nieprzyjemnych rzeczy. Minimalna ulga przychodziła
tylko pani doktor (asystentka?) przytrzymywała mi głowę dociskając do swoich
piersi – przynajmniej można było pomyśleć o czymś innym 😉

Jak próby podważania i wydłubywania zęba nie dawały rezultatu, to najpierw
postanowiono przeciąć zęba. To też nie dało żadnych rezultatów (co okazało się
po kolejnych kilkunastu minutach dłubania). Potem piłowano mi kość szczęki. Też
okazało się że mam wyjątkowo grubą (i to też pewnie moja wina). W końcu udało
się tego zęba wyciągnąć (w kilku kawałka). Jeszcze tylko zszywanie i mogłem na
chwiejnych nogach opuścić salę. Wcześniej lekarz powiedział mi co mam łykać i że
po L4 mam się zgłosić jutro. Spytałem się czy to konieczne – i znowu pretensje
że co ja z Gliwic nie mogę dojechać? Że tam idę na zabieg, a na kontrolę gdzie
indziej? itp. Oczywiście kontrola tam ma sens, ale na początku była mowa tylko
o L4…

Teraz nie wiem co o tym myśleć. Lekarz nie traktował mnie miło, ale ze
strony medycznej raczej nie mam podstaw mu nic zarzucać. Zresztą trochę rozumiem
jego zdenerwowanie, szczególnie jak dopisali mu paru dodatkowych pacjentów. No
i mój przypadek też był podobno wyjątkowy. I czemu akurat mnie się musiało za to
dostać? Mam jeszcze drugą ósemkę do wyrwania i nie wiem czy iść z nią też tam,
czy gdzie indziej. W sumie tam tę godzinkę jakoś wytrzymałem i dalej wierzę że
trafiłem w ręce fachowców. Gdzie indziej może być przecież gorzej, ale może też
być i dużo lepiej. Na razie jednak nigdzie się z tym nie wybieram…

Kolejny klient Jabbera

Konkurencja nie śpi – w ekg pojawiły się podstawy obsługi Jabbera, więc i ja
postanowiłem opublikować swoje wypociny. Ze strony

projektu XMPP

można ściągnąć snapshot tej biblioteki wraz z konsolowym klientem Jabbera
– CJC. Kiedyś będzie to niezależny projekt, ale to dopiero jak PyXMPP się
ustabilizuje. Na razie CJC nadaje się jedynie do prostego czatu, ale już
daje jakiś pogląd na to, jak ja sobie to wyobrażam. Jak ktoś ma jakieś
opinie czy sugestie na ten temat, to proszę dać znać.

A jutro czeka mnie operacyjne usuwanie ósemki (zęba). Mam się tam stawić
o 9:30, ale może będę musiał czekać i do 13:00. Nawet nie chcę wiedzieć jak
to ma wyglądać i jak długo po tym nie będę mógł jeść.

(Nie)zwyczajny dzień admina

Jako admin ostatnio raczej się obijałem. Zajmowałem się jedynie programowaniem
Jabbera i ostatnio zacząłem się zastanawiać nad tym, że wszystko działa, nic
nie pada i właściwie to nic lepszego do roboty nie mam (poza odebraniem paru
telefonów od klientów i wysłaniem do nich serwisu). Dzisiaj miał być kolejny
taki dzień – spędzony nad pracami CJC, ale…

Jak tylko przyszedłem do pracy szef mnie poinformował, że jakiś klient dzwoni,
że mu poczta nie działa. Szybko okazało się, że mnie też nie działa – jak ma
działać, jak nasz główny serwer pocztowy padł. O drugiej w nocy postanowił sobie
zrobić przerwę. Akurat temu serwerowi taki niewyjaśniony pad zdarzył się chyba
pierwszy raz od jakiś dwóch lat. Nie odpowiadał nawet na Magic-SysRq przez
konsolę szeregową (później się okazało że to nie serwer, ale nowy minicom,
w którym znowu zmieniły się skróty klawiszowe), więc poszedłem do serwerowni (na
centralę TPSA), gdzie jeszcze na konsoli widniał piękny Ooops z kernel panikiem.
Po restarcie wszystko ruszyło bez problemu, więc mogłem wrócić do pisania CJC…

Okazało się że dzisiaj wreszcie było wszystko gotowe do podłączenia kolejnej
sieci (a właściwie podzielenia istniejącej). Kumpel zrobił nowego VLANa
i system zawisł (tym razem w innej maszynie). To akurat się zdarzało czasem. Po
reboocie VLAN działał już poprawnie, ale dhcpd przywitał nas komunikatem
„eth2.60: not found”. Wszystko inne widziało ten interfejs. Po chwilach zabawy
z ifup/ifdown itp. dhcpd przestał też widzieć „eth2.59”, „eth2.58” i „eth2.21”,
a w końcu zawisła częściowo obsługa sieci. Pomyślałem, że to dobra okazja, żeby
wreszcie zrobić upgrade kernela, bo miałem jeszcze jakieś stare 2.4.19. Po
restarcie (twardym bo przy tym zwisie nie dało się czysto położyć systemu)
musiałem poczekać aż fsck poprawi root filesystem. Na / miałem wciąż ext2 więc
uznałem że to też można od razu zmienić na ext3. Poprawiłem fstab,
przegenerowałem initrd, ale chyba nie zrobiłem „tune2fs” jak należy i po
restarcie system nie umiał zamontować /. Po starcie z zapasowego wpisu w lilo
niby system wstał, ale VLANy nie wstawały – pomyślałem, że do nowego kernela
potrzeba nowego pakietu vlan. Więc odpalam poldka, a ten mi „poldek.conf:
input/output error”. Plik niby był w /etc, ale nie można było go nawet skasować,
a co dopiero przeczytać. fsck niby coś poprawiał, ale nic nie poprawił. Po
którejś próbie straciło się jeszcze /etc/inittab, /etc/rc.d i parę innych,
bez śladu nawet w /lost+found. Robiło się wesoło. Jednak się nie poddałem (w
końcu gdzieś jeszcze mam backupy) i zrobiłem ten ext3. System nawet z tego
wystartował, a kolejny fsck (teraz pracujący na ext3) wywalił błędny
poldek.conf, a zgubione pliki wkleił do /lost+found. Wszystko wróciło do normy,
upgrade kernela się udał. Nawet VLANy działały jak trzeba (wcześniej nie działały
prawdopodobnie do tego, że zmieniła mi się nazwa modułu do sieciówki). Nadszedł
czas spróbowania dhcpd…

Jak odpaliłem wcześniej w single, to ruszył. Później w działającym systemie już
nie: „eth2.60: not found”. Pozostało zajrzeć do źródeł. Szybko znalazłem
odpowiednią funkcję w common/discover.c. Okazało się, że dhcpd na listę
interfejsów przeznacza bufor o wielkości 2048 bajtów, a przy ponad 50
interfejsach to nie wystarczało. Zmieniłem na 65536, przekompilowałem…
i działa 🙂 Od razu zmianę wrzuciłem do CVS PLD, może jeszcze komuś się przyda.

Ostatecznie byłem z siebie zadowolony, a nawet stwierdziłem że tego mi było
trzeba. Czasem lubię sobie poadminować, byle nie za często 🙂

CJC

Jak już wspominałem chciałem napisać serwer XMPP (Jabbera) w pythonie. W tym
celu zacząłem pisać bibliotekę PyXMPP. Biblioteka miała nadawać się zarówno
dla serwera jak i klienta, więc musiałem napisać jakiś przykład (i zarazem
test) zastosowania PyXMPP w kliencie Jabbera. No i zacząłem tworzyć CJC
(Console/Curses Jabber Client). Na razie robi niewiele, ale w głowie utworzył
mi się zarys w pełni funkcjonalnego klienta o interfejsie podobnym do irssi
i modułowej budowie. Co więcej zarys ten jest znacznie wyraźniejszy niż
serwera który miałem pisać. Coś mi się widzi, że zamiast serwera napiszę
klienta. Oczywiście jeżeli cokolwiek uda mi się dokończyć 🙂

Dawno mnie tu nie było…

Dawno nie pisałem, bo bardzo mnie wciągnęło pisanie tego PyXMPP. Idzie
znacznie wolniej niż myślałem, ale jestem zadowolony z tej pracy. Mam
ambicję napisać to tak, żeby było 100% XMPP compliant, ale też zgodne
z ze „starym Jabberem”. Właściwie to co napisałem już można wykorzystać
do tworzenia klienta Jabbera, czy prostych serwisów.

Na standards-jig@jabber.org wielu narzekało, że SASL to za duże wymaganie
dla „małych klientów”. Nie zgadzam się z nimi – zrobiłem autentykację PLAIN
i DIGEST-MD5 w pythonie praktycznie od zera i wielki problem to nie był.
Gorzej jest z profilami stringprep (wymagania odnośnie nazwy użytkownika
i zasobu). Przez weekend walczyłem z normalizacją Unicode 3.2.0 (co było tym
trudniejsze, że unidata w Pythonie to tylko 3.0.0) i prawie działa – nawet
dekompozycja i kompozycja sylab HANGUL (cokolwiek by to nie było), ale mam
jeszcze jakieś problemy z porządkiem kanonicznym. Myślę że dzisiaj to
naprawię, a może i całe stringprep uda mi się zrobić. Odpowiednie moduliki
są dosyć spore – zawierają parę tabel wydłubanych z Unicode Character
Database.

A z innej beczki: w sobotę byłem z żoną na Matrix Reloaded (dzidzia została
u dziadków). Skoro wszyscy o tym filmie tutaj piszą to i ja napiszę. IMHO
całkiem niezły. Nie spodziewałem się niczego ambitnego i byłem zadowolony
z tego co zobaczyłem. Może po prostu jestem wystarczająco rąbnięty, żeby to
oglądać – nie było dla mnie problemem traktowanie części postaci jako procesy
w systemie operacyjnym. Miałem tylko wątpliwości, czy agent Smith to wirus
dołączający się do aktywnych procesów, czy zwykła fork-bomba 🙂 Zgodnie
z poleceniami odczytanymi z ogłoszeń na ścianach kina przeczekałem napisy,
żeby zobaczyć zapowiedź kolejnej części. Zapowiedzi widziałem lepsze, ale same
napisy końcowe mnie zainteresowały. Lista płac olbrzymia i chyba samych
„system administrators” było ze 20. W sumie poadministrowałbym sobie taką
farmą serwerów co to liczyła 🙂

Wczoraj miałem znowu okazję wykazać się jako tatuś. Krysia nie chciała spać,
po półtorej godziny cycania żona miała już dosyć, a ja przejąłem ryczącego
dzidziusia. Takiej nieszczęśliwej jej jeszcze nie widziałem. Nie pomagało
noszenie, mówienie, kołysanie itp. Dopiero jak z nią poszedłem do łazienki,
to przed lustrem nieco się uspokoiła. Ale ile można tak w łazience stać…
Na szczęście w pokoju też się znalazło lusterko. Trochę pochlipała z lusterkiem
w objęciach, potem położyła się mi na brzuchu – widać było że wreszcie będzie
chciała spać. Jak już trochę przysnęła przeniosłem ją do łóżeczka. Obudziła
się, ale to że ją położyłem w łóżeczku bardzo się jej spodobało. Popełniłem
błąd przykrywając ją – rozkopywanie kocyka uznała za najlepszą zabawę. Potem
się powoli uspokajała, trochę pośpiewała pod nosem i zasnęła. Z odkrytymi
nóżkami – trudno. Ważne że się udało i to bez cycusia.

Odchudzania ciąg dalszy oraz problemy z transportem GG

Po wczorajszych 50 „brzuszkach” dziś rano udało mi się zrobić tylko
1 (słownie: „jeden”). Z pompkami nieco lepiej – 7. Jak tak dalej pójdzie to
niedługo mniej się będę ruszał niż zanim postanowiłem się odchudzać 🙂

Nie polecam używać transportu GG ze snapshotami libgadu. Niby obsługuje
wtedy TLS, ale też wywala się znacznie częściej. Z libgadu-1.0 wydaje się
pracować nie mniej stabilnie niż poprzednie wersje.

Mój moduł pyxmpp (moduł obsługi XMPP do python) zaczyna być już całkiem
użyteczny. Nawet już przeportowałem część jabgraph pod to. Teraz już nie mam
żadnych wątpliwości, że jabber.py ssie. Może niedługo ruszy pisanie właściwego
serwera (to głównie na jego potrzeby powstaje pyxmpp). Zastanawiam się czy
zakładać już nowy projekt na JabberStudio. Mam wątpliwości, bo obecne pyxmpp
wymaga spatchowanego libxml2 (oryginalne nie bardzo się nadaje do obsługi
strumieni XML).

Nowy transport i odchudzanie

Wczoraj dostałem informację, że jggtrans nie kompiluje się z nowym libgadu.
Dzisiaj to zbadałem i poprawiłem. Przy okazji dorobiłem obsługę połączeń TLS
do serwerów GG (wymagany jest w miarę nowy snapshot libgadu). Wcześniej
poprawiłem jeden błąd z powiadamianiem o obecności (nie zawsze był używany zasób
„GG”), a dzisiaj dodatkowo cofnąłem zmianę powodującą generowanie błędu zamiast
informacji o niedostępności – na razie chyba żaden klient nie jest na to
przygotowany.

No więc Jabber GG Transport, wersja 2.0.5 już jest. Źródła do ściągnięcia
można znaleźć tam gdzie zwykle.

A ja ostatnio z przerażeniem stwierdziłem, że mi brzucho rośnie. Przerażenie
spotęgował oczywiście blog
AlchemyXa
. Wszystkiemu oczywiście winne są: mój siedzący tryb życia oraz
drugie śniadanka w pracy (takie śniadanko to np.: dwie bułki z szynką,
opakowanie katarzynek i Prince Polo). No więc postanowiłem się odchudzać…

Dzisiaj poranek zacząłem od 50 brzuszków i 25 pompek (docelowo 100 i 50 co
rano), a na drugie śniadanie zjadłem dwie małe bułeczki (i cztery duże
plasterkami szynki). Ciekawe ile wytrwam… 🙂 Dobrze byłoby trochę na rowerze
pojeździć, ale nie wiem czy uda mi się (albo raczej czy będzie mi się chciało)
doprowadzić starą Gazelę do używalności. Idealnie byłoby jeździć na rowerze do
pracy (15 kilometrów w jedną stronę), ale to chyba dla mnie za dużo. Szczególnie
że po każdej takiej jeździe wypadałoby wejść pod prysznic, a przynajmniej się
przebrać. No i nie wiadomo czy rower to przeżyje i ile razy po drodze trzebaby
go naprawiać.