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…

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

jggtrans ma błędy, PyXML ssie, a ja udzielam wywiadów…

Zaraz po wydaniu transportu GG okazało się, że jednak nie zawsze wysyła
<presence/> poprawnie – tzn. z zasobem „GG”. Przez to czasami kontakty GG
są widoczne podwójnie i nie znikają wtedy kiedy trzeba… Czyli niedługo 2.0.5.

PyXML jest tak wooolneeee, że dzisiaj pół dnia spędziłem na szukaniu
alternatywy, bo z taką szybkością działania jabgraph właściwie traci sens.
Oczywiście niepotrzebnie narobiłem pakietów do PLD z dziwnymi parserami,
bo ta przecież już był libxml2, także w postaci modułu do pythona. Zacząłem
więc przerabiać jabgraph z API DOM na API libxml2 – na razie zrobiłem jedynie
wczytywanie pliku konfiguracyjnego ale już witać dużą poprawę.

Udzieliłem też wywiadu – poważnie to brzmi :). Pytania (z błędami
ortograficznymi) zostały wysłane na listę dyskusyjną i „osoby upoważnione”,
czyli „ważne persony” miały na nie odpowiedzieć. Mnie też przypadł ten zaszczyt,
stąd wzmianka w blogu :). Trzeba przyznać, że same pytania były merytorycznie
OK – jestem ciekaw jak odpowiedzą pozostałe „persony”.

Jeszcze ciekawostka – jak zrobiłem sobie ikonki do transportów w tkabberze.
Umieściłem następujący fragment w ~/.tkabber/config.tcl:

proc postload {} {

	# ... inne ustawienia
    set roster::show_only_online 1
    set roster::show_transport_icons 1
    set roster::show_transport_user_icons 1
    set roster::roster(cached_category_and_subtype,jit.jabber.bnet.pl) {service icq}
    set roster::roster(cached_category_and_subtype,headlines.jabber.bnet.pl) {service rss}
    set roster::roster(cached_category_and_subtype,gg.jabber.bnet.pl) {service x-gadugadu}

    global serviceicon
    set serviceicon(x-gadugadu,available)   [Bitmap::get [pixmap services gg_online.xpm]]
    set serviceicon(x-gadugadu,chat)        [Bitmap::get [pixmap services gg_chat.xpm]]
    set serviceicon(x-gadugadu,away)        [Bitmap::get [pixmap services gg_away.xpm]]
    set serviceicon(x-gadugadu,xa)          [Bitmap::get [pixmap services gg_xa.xpm]]
    set serviceicon(x-gadugadu,dnd)         [Bitmap::get [pixmap services gg_dnd.xpm]]
    set serviceicon(x-gadugadu,unavailable) [Bitmap::get [pixmap services gg_offline.xpm]]
}

Ikonki przerobiłem z pakietu ikonek dla Psi jaki znalazłem w „plikowni”.
IMHO mogłoby to być zrobione lepiej – ale tak też jakoś działa. Może podyskutuję
jeszcze z autorami tkabbera na ten temat.

Jabber GG Transport 2.0.4

Wreszcie udało mi się przywrócić transportowi poprawną stabilność,
poprawić inne znane mi błędy i wydać bestię w wersji 2.0.4.

Podstawowe zmiany:

  • Wszyscy użytkownicy GG widoczni są z zasobem „GG”.
  • Formularze wyszukiwania i rejestracji zostały zmienione tak, by
    były kompatybilne ze wszelkimi implementacjami JEP-4, w szczególności
    z JAJCem (ciekawe czy się udało).
  • Dodana została obsługa Jabberowej niewidzialności. Potrzebne do
    tego jest odpowiednie wsparcie ze strony klienta i czasem wymaga
    gimnastyki od użytkownika. Np. w tkabberze po wybraniu statusu
    „invisible” należy ponownie zalogować się do transportu.
  • Poprawiłem też obsługę statystyk – wszystkie mogą być odczytane
    jednocześnie. Wcześniej problemu nie zauważyłem, bo tkabber zawsze
    czyta pojedynczo, ale jabgraph żąda wszystkich informacji na raz.

Pierwsza z tych zmian powoduje pewne ogłupienie klientów Jabbera
zalogowanych podczas upgrade’u. Niektóre kontakty mogą być widoczne
podwójne, a niektóre jako dostępne, mimo że dostępne nie są. Po
wylogowaniu się z Jabbera (nie transportu) i ponownym zalogowaniu
wszytko powinno wrócić do normy.

Jutro wracam do prac nad jabgraphem. Ale on się straszni muli…
Nawet psyco nie pomaga. Ale trudno, w końcu to tylko taki „proof of
concept”.

Postępy, postępy…

Wreszcie transport GG na moim serwerze się nie wywala – mmazur znalazł
błąd, którego sam nie mogłem dostrzec. A błąd był bardzo głupi.
Zostały jeszcze jakieś drobiazgi do poprawienia i będzie można wydać
wersję 2.0.4.

Jabgraph już też chodzi i rysuje wykresiki dla mojego transportu,
a dzięki wczorajszej poprawce na wykresie uptime’u nie ma kompromitującej
„piły”. Lada dzień na jabberstudio będą dostępne pliki pierwszego
release (w CVS już są) oraz demo na WWW.

Krysia też robi postępy: dzisiaj postawiła swoje pierwsze kroczki
„bez trzymanki”.

A teraz… na rybki! 🙂

PyXML nie taki straszny

Jednak PyXML ma wszystko co trzeba… z wyjątkiem dokumentacji. Okazało się
że można dokument wczytać jako obiekt DOM, jednocześnie go walidując. Przy
okazji znalazłem parę innych przydatnych mi funkcji. Ale to wszystko dopiero po
przejrzeniu źródeł, bo dokumentacja okazała się do niczego :-(.

Grzebię się w tym XMLu, żeby napisać programik do rysowania wykresików ze
statystyk Jabberowych otrzymywanych za pomocą protokołu
JEP-39. Transport
GG oczywiście ten protokół obsługuje, więc przynajmniej do niego będzie
można jabgrapha zastosować. Jabgraph już prawie skończony, poprosiłem
już o odpowiedni projekt na JabberStudio i, jeśli nic mi nie pokrzyżuje
planów, lada dzień powinien być dostępny do ściągnięcia.

Tymczasem transport GG po ostatnich poprawkach ciągle strasznie
niestabilny, a ja nie mogę znaleźć błędu który to powoduje –
użytkownicy jabber.bnet.pl niedługo gotowi będą mnie zlinczować.

Koszmar XML w pythonie o raz inne duperele

Chciałem wczytać plik XML, zwalidować go zgodnie z pewnym DTD,
przetwarzać poprzez API DOM i wypluć uzupełniony. Nic specjalnego. To co
jest załączone w pythonie (minidom) ani nie waliduje, ani nie potrafi
ładnie wypluć (taki pretty-print z wcięciami itd.). Jest też PyXML. Ma
kompletny DOM, z PrettyPrint oraz parser walidujący – można użyć
albo jednego, albo drugiego. Dwa razy tego samego pliku
parsować nie mam zamiaru – walidację sobie odpuściłem. Do tego doszedł
jeszcze jabber.py z własnym parserem i niby-DOMem. 😦 A mogłoby być tak
pięknie – python to wspaniały język, tylko coś porządnej biblioteki
dorobić się nie może.

Transport GG po ostatnich przeróbkach mi się wywala. Ale oczywiście
nigdy pod gdb. To znaczy raz mi się wywalił pod gdb i jeden głupi błąd
poprawiłem, ale wywala się nadal.

Córeczka właśnie się drze z krzesła. Nie mam pojęcia jak na nie
wlazła… Wcześniej przeglądała (z bardzo mądrą miną) „Układy
półprzewodnikowe” Tietze’a i Schenka. Czy nie za szybko ona nam
dorośleje (przypominam ma roczek).

Znalazłem dzisiaj też coś dla wszystkich co się uważają (tak jak ja)
za nerdów i/lub geeków. Przeczytajcie kto to:
nerd
i geek.
Szczególnie pierwsze znaczenie (w obu przypadkach) oraz trzecie (w
przypadku geeka) jest ciekawe 🙂 .

Problemy z browsingiem i nowy jggtrans

Wczoraj dopisałem obsługę JEP-11 (browse) do SMS-transportu. Dzisiaj smoku mi
napisał, że to nie działa. Okazało się, że z Psi rzeczywiście nie bardzo. Ale
Psi obsługuje to browse, tak jak serwer jabbera – wyszło na to że jabberd też
nie obsługuje JEP-11 zgodnie ze specyfikacją. Później sprawdziłem jeszcze swój
transport GG – też niezgodny ze standardem. Zacząłem więc poprawiać…

Patch na jabberd-1.4.x jest dostępny tutaj.
Należy też pamiętać o poprawieniu sekcji <browse/> pliku jabber.xml.

Nowy transport GG (oprócz poprawienia browse ma ulepszoną obsługę proxy)
można znaleźć tam gdzie zwykle.

Co by tu napisać…

W tej chwili mam pół gęby zdrętwiałe – resztki znieczulenia po wizycie u dentystki. Póki mi nie przejdzie, wolę nic nie jeść, bo sobie język i wargi pogryzę.

Wcześniej zaspany siedziałem w pracy. Oprócz standardowego resetowania głupich modemów i odbieranie telefonów od ….. klientów, trochę podziałałem w tematyce Jabbera. Zrobiłem upgrade jabberd na swoim serwerze – teraz zawiera wszystkie moje ostatnie patche. Zainstalowałem też transport SMS – przy okazji znalazłem w nim dwa błędy i pomogłem Smoku (Smokowi?) je poprawić. Zdążyłem się też zdenerwować „internacjonalizacją” perlowego modułu XML:Stream. Na szczęście aktualna wersja ma już normalną obsługę Unicode.

Przedwczoraj (w niedzielę) Bluszcz zwrócił mi uwagę na problem ze zmianą hasła na serwerze Jabbera (jabberd-1.4.x), gdy rejestracja jest zablokowana. Wczoraj prawie cały dzień z tym walczyliśmy (jednym patchem o mało nie „zabiłem” jabberpl.org), ale w końcu udało się znaleźć rozwiązanie.