Zaloguj się

Jog Jajcusia

xmpp:jajcus@jajcus.net

Mój jest ten kawałek Internetu…

…złe emocje i brudne buty proszę więc zostawić przed drzwiami.

PyXMPP 2

Osiem lat temu coś mi odbiło i zacząłem tworzyć PyXMPP. Wtedy jeszcze właściwie nie było XMPP (specyfikacja dopiero powstawała, RFC 3920 wydano dopiero ponad rok później), tym bardziej żadnej biblioteki XMPP dla Pythona, czy nawet jakiejkolwiek implementacji XMPP. Było jakieś jabber.py, ale mnie nie zadowalało. Zacząłem więc pisać własną bibliotekę, najpierw z myślą o serwerze, potem dla mojego klienta – CJC.

Wtedy musiałem pisać wszystko od zera, SASL, Stringprep, jakieś sensowne StartTLS, bo dostępnych implementacji nie było, albo nie nadawały się do sensownego, czy bezpośredniego użycia. Język w którym pisałem (Python 2.2) nie przypominał bardzo dzisiejszego Pythona. Testować też nie było z czym, bo właściwie żaden serwer SASL czy StartTLS nie obsługiwał (dlatego myśląc o implementacji serwera musiałem też pisać kod klienta). Myślę, że były nawet czasy, gdy moje PyXMPP było „tą jedyną sensowną” biblioteką XMPP dla Pythona.

Niestety, niektóre moje decyzje zaczęły na projekcie ciążyć. W szczególności wykorzystanie libxml2. API zupełnie „niepythonowe”, gdzie trzeba pamiętać o zwalnianiu pamięci o tym który obiekt używa pamięci przydzielonej innemu obiektowi. To sprawiało nie tylko, że kod był brzydki, ale się po prostu czasem sypał w niewyjaśnionych okolicznościach, ciekł pamięcią i średnio nadawał się do integracji z czymkolwiek innym. Dodatkowo API libxml2 używało stringów zakodowanych UTF-8, gdzie w Pythonie używałoby się raczej obiektów unicode, co wymagało ciągłych konwersji. Mimo wszystko libxml2 miało swoje zalety, szczególnie nad alternatywami dostępnymi w tamtym czasie: było szybkie, obsługiwało przestrzenie nazw XML i serializowało XML do postaci strawnej przez implementacje XMPP (ElementTree sam z siebie wciąż tego nie umie).

Mijały miesiące i lata. PyXMPP rozwijało się, najpierw szybko, potem powoli, z ewentualnymi gwałtownymi zrywami. Stary kod coraz mniej mi się podobał, ale był i działał, szkoda było dużo zmieniać. Czasem próbowałem wprowadzić jakieś nowe pomysły (np. interfejsy z Zope), z średnim skutkiem. W końcu rozwój praktycznie zamarł, z wyjątkiem drobiazgów których czasem zachciałem w CJC (np. ostatnio IPv6)…

W między czasie pojawiło się wiele implementacji XMPP, także w Pythonie. Nie tylko biblioteki ale i całe popularne klient (chociażby Gajim). Pojawił się Python 3, wyszły nowe RFC dla XMPP. PyXMPP praktycznie w ogóle się teraz nie liczy… a mnie dwa miesiące temu znowu „odbiło”…

Postanowiłem spróbować przerobić stary kod na coś nowocześniejszego. Przede wszystkim miało wylecieć `libxml2` i być zastąpione przez ElementTree. Przy okazji chciałem wyczyścić API i w ogóle poprawić jakość kodu. W starym nie tylko były jeszcze miejscami konstrukcje z Pythona 2.2 (np. '0' i '1' zamiast 'True' i 'False'), to jeszcze kiedyś miałem zwyczaj oszczędzania na spacjach, przez co kod był po prostu nieczytelny. Postanowiłem przepisać kod pod kątem Pythona 2.7 ale z myślą o obsłudze też 3.2.

Tak sobie grzebałem w tym przez ostatnie parę tygodni. W modułach które przerobiłem zmieniłem praktycznie każdą linijkę kodu. Miejscami wprowadziłem fundamentalne zmiany w całej wewnętrznej strukturze pakietu. Napisałem nowy framework pętli głównej i I/O. Wiem, wymyślanie na nowo koła, jest Twisted, ale przecież implementacje XMPP na Twisted też już są…

Powoli kod zaczął nawet być używalny… postarałem się go jakoś udokumentować, napisałem trzy przykładowe skrypty, jakiś tutorial na wiki… i wczoraj postanowiłem pokazać to światu.

Nie wiem na co liczyłem, w końcu teraz to tylko „kolejna implementacja XMPP dla pythona”… ale może komuś się przyda… może w czymś jest jednak lepsza od istniejących. No i szkoda by było, jakby mój kod pisany od 2003 roku umarł jako to brzydkie stare PyXMPP (tak, to nie jest racjonalne myślenie)…

Od wczorajszego wydania 'alpha' znalazł się tylko jeden 'obserwujący' na GitHub, jedna odpowiedź na maila na liście dyskusyjnej i 30 pobrań pakietu… No cóż, kariery tym nie robię. ;-)

5 komentarzy do wpisu „PyXMPP 2”


CJC i PyXMPP 1.0.1

Ostatnie wydanie CJC i PyXMPP było ponad trzy lata temu – w grudniu 2005 roku. Po tamtym wydaniu zacząłem poważne zmiany w API… i nigdy ich nie skończyłem, a niedokończonego dzieła wydawać nie chciałem. Potem przyszły kłopoty ze zdrowiem, pośrednio wynikłe też z mojego zaangażowania w Open Source (czyt. siedzenia całymi dniami przed kompem, świata nie widząc) i postanowiłem unikać angażowania się w kodowanie. Tak więc, planowane zmiany nigdy nie miały być dokończone.

W międzyczasie jednak w starym kodzie znajdowane były błędy, od czasu do czasu jakiś błąd poprawiłem, czasem ktoś podesłał patcha, to wrzucałem do SVN. Pojawiały się nowe wersje Pythona, czy M2Crypto, to kod dostosowywałem odpowiednio (CJC używam na co dzień, moja żona też, więc to musi działać). Właściwie, jak ktoś jeszcze używał PyXMPP albo CJC, to któryś z ostatnich snapshotów.

Ostatnio zastanawiałem się też, czy nie spróbować do CJC wreszcie dodać obsługi UTF-8. Wcześniej tego odmawiałem, bo Pythonowy moduł curses w ogóle nie ma obsługi Unicode, tylko start 8-bitowe API. I nic nie wskazuje na to, że to ktoś poprawi, ale uż jakiś czas temu jeden z użytkowników udowadniał mi, że to się jednak da zrobić, jeśli tylko moduł curses jest zlinkowany z biblioteką „libncursesw”. W PLD długo tak nie było, ale w Th już jest. To czemu by nie spróbować?

Wczoraj więc spróbowałem. Wyświetlanie UTF-8 działało bez żadnych zmian w kodzie, ale żeby wczytywać znaki Unicode z klawiatury musiałem dodać brzydkiego hacka. I w ogóle trochę obsługi klawiatury przerobić. Udało się. A skoro wreszcie się pojawiła funkcjonalność tak wyczekiwana przez użytkowników, to czemu by nie wydać nowej wersji? Resztę dnia spędziłem przygotowując paczki z PyXMPP 1.0.1 (w tym jeszcze przed wydaniem poprawiłem jednego paskudnego babola) i CJC 1.0.1. Dzisiaj wysłałem informacje o wydaniach na listy mailowe dotyczące tych produktów. No to chyba udało mi się coś wydać. :-)

Po następne wersje zapraszam za trzy lata. ;-)

Dodaj komentarz do wpisu „CJC i PyXMPP 1.0.1”


Krótko...

Transport GG przeniesiony, PyXMPP właściwie też. No i sprzęt do nowego biura też przeniesiony... ale komp się po podłączeniu nie uruchamia. Szykuje się ciekawy pierwszy dzień w nowej pracy...

8 komentarzy do wpisu „ Krótko...”


Okularków nie będzie, przenosiny w pełni

Dzisiaj wybrałem się do okulisty (przy optyku) w celu dobrania okularów. Ten mnie zbadał, próbował dobrać odpowiednie szkła... i właściwie nic to nie dawało. Na siłę okularów sprawiał sobie nie będę – to by mi mogło bardziej zaszkodzić niż pomóc. To co zaobserwowałem u okulistki podczas badań kontrolnych najprawdopodobniej było tylko złudzeniem spowodowanym powiększającym działaniem szkieł. Dzisiaj więc zamiast recepty na okulary odebrałem receptę na krople do oczu. Zresztą podobne to tych co już mam – do Starazolinu, który wychwalałem już w zeszłym roku.

W związku ze zmianą pracy (do nowej już w czwartek) przenoszę różne rzeczy. Listy dyskusyjne moich projektów (CJC, PyXMPP, Transport GG) przeniosłem na swój własny serwerek (lists.jajcus.net), a z rozpędu zabrałem się za przenoszenie do siebie reszty tych projektów z JabberStudio (które najwyraźniej umiera). To ostatnie jeszcze trochę potrwa, bo to większa robota, ale pewnie w tym tygodniu skończę – wtedy dam znać co i jak, a przede wszystkim, gdzie.

Dzisiaj walczyłem jeszcze z dwie godziny z przenoszeniem kontaktów ze starego telefonu komórkowego (firmowego) na mój własny, prywatny. Ta marna namiastka IrDA/OBEX w moim Samsungu nie ułatwiała sprawy, ale stary laptop z IRDA, Multisync, trochę Pythona, trochę ręcznego grzebania w plikach wizytówek (bez tego, przy próbie importu czterech z moich kontaktów telefon się po prostu rebootował) i jakoś się udało. BTW: jak ktoś ma mój stary numer, a chciałby aktualny, to niech się do mnie zgłosi.

Z przenosin czeka mnie jeszcze wyniesienie swoich fizycznych zabawek (talerz, słuchawki, puszka na herbatę, kalendarz z gołymi babami itp.) ze starej roboty i zaniesienie sprzętu (komputer, monitor, telefony) do nowej. Z mniej materialnych rzeczy – posprzątanie po sobie na serwerach w starej firmie (wszelkie konta, aliasy, skrypty itp. zabawki) i podczepienie się do nowej (też se będę musiał jakiegoś majla założyć). System niby sobie już na nowym kompie zainstalowałem, ale nie pamiętam w jakim jest stanie... więc może jeszcze to mi trochę czasu zająć... a pracodawca pewnie będzie chciał już pierwszego dnia widzieć wyniki... ;-)

7 komentarzy do wpisu „ Okularków nie będzie, przenosiny w pełni”


Ufff... CJC 1.0.0 i PyXMPP 1.0.0 już są.

Ufff... wydałem CJC 1.0.0 i PyXMPP 1.0.0. Nie znoszę wydawać nowych wersji! Nie dość, że wypada najpierw wszystko doprowadzić do porządku, to jeszcze trzeba się wysilić na jakieś announcement do JabberStudio itp. A jeszcze JabberStudio jest spieprzone i np. nie przyjmuje wersji 1.0.0, więc nowe pliki oznaczone są jako wersja 0.1. pyxmpp-1.0.0.tar.gz jest w serwisie umieszczony dwa razy — myślałem, że się po prostu pomyliłem i jak go wpiszę od nowa (edycja poprzedniego wpisu nie pomagała), to zadziała. Nie zadziałało, a już wydanego pliku skasować nie można... super. I jeszcze mnie czeka jakieś ogłoszenie na listy... wrrr... Wręcz się kodować odechciewa.

Numer wersji 1.0.0 nie oznacza wcale, że to nagle jakieś super stabilne oprogramowanie. Po prostu uznałem, że nie będę latami ciągnął numeracji ułamkowej. Poprzednie wersje (0.5) zostały wydane ponad rok temu, mają straszne braki i nie działają z nowym Pythonem i libxml2. Ale ludzi wciąż to ściągali, bo nowszego oficjalnego wydania nie było. No to już jest. Pewnie od jutra (dzisiaj nie, bo dzisiaj miałbym jeszcze czas coś poprawić) sypną się bugreporty... pewnie pełno jest paskudnych błędów, które tylko u mnie jakimś trafem się nie objawiły. Poprawi się w wersji 1.0.1... tylko kiedy będę miał czas ją wydać? Na Wielkanoc? ;-)

Ech... coś niezbyt optymistycznie mi to ogłoszenie wyszło...

5 komentarzy do wpisu „ Ufff... CJC 1.0.0 i PyXMPP 1.0.0 już są.”


Opieka nad projektem...

Jakiś czas temu dostałem łatę na JJIGW dodającą obsługę subskrypcji obecności użytkowników IRCa. Rzecz fajna, przydatna, aczkolwiek z powodu specyfiki IRCa (zmieniające się nicki), ciężka do zaimplementowania.

Dzisiaj wreszcie znalazłem czas, żeby przejrzeć tego patcha. I nie spodobał mi się. Parę rzeczy psuł (łamiąc specyfikację XMPP i MUC), parę innych robił nia tak jakbym chciał. Ale zawierał też pewne poprawki mojego kodu. Najbardziej dokuczyły mi: brak dokumentacji dodanego kodu i coding style. Ale tego nie śmiałem się za bardzo czepiać — mój kod JJIGW sam z siebie jest kompletnie pozbawiony dokumentacji, a i śliczny nie jest.

Napisałem swoje uwagi do autora patcha. W sumie, nawet jakby nie chciał tego poprawić, to bym patcha nałożył. Ręcznie, w większości po swojemu, ale dodałbym te zmiany. Jednak gotowy kod, to zawsze coś. Szkoda, że rzadko dostaję gotowe ulepszenia do moich projektów. No, ale cóż. Sam sobie też jestem winien — komu się chce grzebać w zawiłym i nieudokumentowanym kodzie? Z drugiej strony, jakbym się uparł, żeby wszystko udokumentować, to ten kod by pewnie w ogóle nie powstał — zabawa mogłaby przestać być zabawna. Dobrze, że przynajmniej API PyXMPP jakoś udokumentowałem.

3 komentarze do wpisu „ Opieka nad projektem...”