Mix-ins

Gdy w CJC użyłem osobnej klasy (nazwijmy ją A) do
rozszerzenia funkcjonalności innej klasy (B), ale tak, że to
B dziedziczyło po A, to myślałem że stosuję jakiś dziwny,
brudny trik dla własnej wygody. Później czytając dokumentację do
pylinta spotkałem się z określeniem mix-in class, nie
wiedziałem co to jest, ale tak jakoś mi się skojarzyło z tym co zrobiłem w
CJC.

Teraz coś podobnego chcę zrobić w PyXMPP, aby podzielić
jeden wielki moduł pyxmpp.stream na mniejsze kawałki.
Przypomniałem sobie o mix-in class i wrzuciłem to w Google. Okazało się,
że miałem rację. Dowiedziałem, że to znana technika programowania
obiektowego, która wcale nie jest zła. Znalazłem nawet artykuł o tym jak używać mix-ins w
Pythonie
. Rzeczywiście Python bardzo ułatwia stosowanie tej techniki.

No to teraz, gdy się podszkoliłem, mogę z czystym sumieniem wziąć się za
wydzielanie StreamSASLMixIn i StreamTLSMixIn.
:-)

Czy Python nie jest piękny?

Podczas dłubania w jednym skrypcie wyszło mi coś takiego (no tam było trochę czytelniej,
na potrzeby Joggera upiększyłem:

x=[x for x in x if x]

Każdy Pythonowiec od razu zrozumie, że ta instrukcja usuwa puste
(None, "", 0, itp.) elementy z listy
:-). Wiem, w Perlu dałoby się jeszcze mniej czytelnie, pewnie krócej
i na 100 różnych sposobów, ale na pewno nie tak ładnie ;-)

Oczywiście nie polecam takiego programowania — wypadałoby przynajmniej
zmienić jedno x na coś innego.

Czyszczenie PyXMPP

Najwyraźniej jest jakieś zainteresowanie moją pythonową biblioteką
XMPP. Ludzie (przynajmniej paru) chcą tego używać, ale wielu od razu się
zniechęca brakiem dokumentacji, inni po próbach zrozumienia o co w tym biega.
Nie dziwię się — kod zamotany jak rzadko, a dokumentacji praktycznie brak.
Bardziej dziwię się ludziom takim jak pete, czy Zgoda, którzy tego używają i nawet mnie
z tego powodu nie męczą. Jednak uznałem, że trzeba coś z tym zrobić…

Więc od paru dni zamiast dodawać nowe ficzery do CJC, poprawiać
w nim bugi, czy implementacje protokołów w PyXMPP to ślęczę nad kodem PyXMPP
i, terroryzowany przez pylinta czyszczę kod,
co jakiś czas robiąc: cvs commit -m "cleaning up...". Przy jakiś
czas coś psuję głupimi literówkami, albo zamierzonymi zmianami w API PyXMPP
(sorry developerzy), np. zamiana nazwy parametru konstruktora klasy Stanza
z type na typ, bo ta pierwsza nazwa zakrywała nazwę wbudowanej
funkcji. Jak już wspominałem większość marudzenia pylinta dotyczy braku
docstringów, a więc je dodawałem na bieżąco. Oczywiście nie
"", ale w miarę konkretną dokumentację, która się może jakiemuś
developerowi przydać. I tu wkracza Epydoc

Normalnie do przetwarzania dokumentacji w pythonie służy narzędzie
pydoc. Jednak jest ono głupie, bo traktuje docstringi jako
czysty tekst, bez formatowania czy hyperlinków. Taka dokumentacja jest mało
czytelna i niewygodna. Już jakiś czas temu szukałem informacji na temat
robienia porządnej dokumentacji do kodu Pythona i dowiedziałem się, że the
right way
to jest (lub raczej będzie) używanie w docstringsch reStructuredText.
Narzędzi do przetwarzania tego wtedy nie znalazłem (słabo szukałem, albo
jeszcze nie było), znalazłem tylko docutils które, między innymi,
takim narzędziem mają się stać, ale na razie umieją tylko parsować
reStructuredText i konwertować to do mądrzejszych formatów.
Mimo braku narzędzia do obróbki tego jednak już wtedy postanowiłem
reStructuredText używać. I nawet użyłem w tych skrawkach
dokumentacji które zdążyłem zrobić.

Teraz przy czyszczeniu kodu znowu szukałem narzędzia do generowania
dokumentacji z kodu. Tym razem znalazłem. Docutils wciąż nie
umieją wyciągać dokumentacji z kodu Pythona, ale mogą być wykorzystane
przez Epydoca, który to potrafi.
Ma on niby swój markup dla docstringów, ale potrafi, przy pomocy
docutils obsłużyć także reStructuredText (ale tylko tworząc
dokumentację w HTML). Więc to właśnie podpiąłem pod doc/Makefile.
Okazało się, że stare kawałki dokumentacji musiałem popoprawiać, żeby
Epydoc sobie z tym poradził. Nowe tworzyłem od razu pod
tandem Epydoc+docutils. I nawet są jakieś
efekty. Otrzymana dokumentacja wygląda nieźle, jest dość przejrzysta… tylko
ma olbrzymie braki. :-( Kiedy ja to wszystko opiszę?

Wieczorem sam w domu…

Przez moją sklerozę żona poszła się upić. )-; A ja zostałem w
domu dziecka (śpiącego na szczęście) pilnować.

Może ten czas spożytkuję na porządki w kodzie PyXMPP.
Do pomocy zatrudniłem pylinta, który mi
pokazuje wszelkie moje grzechy w kodowaniu. Teraz plik
TODO.pylint liczy 1158 linii (905 ostrzeżeń, 68 błędów) mimo,
że i tak pomocnika trochę uciszyłem. Ale lista się kurczy co oznacza,
że jest chyba coraz lepiej. Najczęstrzym moim grzechem jest brak
docstrings, a więc dokumentacji kodu. A w przypadku biblioteki to spore
przewinienie… Jak dobrze pójdzie, to dzisiaj przynajmniej ten największy z
modułów — pyxmpp.stream — uporządkuję.

Jakoś sobie radzę

Wczorajszym obiadkiem się nawet nie otrułem. Co ciekawsze nawet mi smakował,
a przecież tylko wrzuciłem na patelnię co mi w ręce wpadło: boczek, kiełbasę,
cebulę, czosnek, marchewkę, makaron i ser.

Wieczorem zabrałem się za nowy parser strumienia dla PyXMPP, bo z
libxml2-2.6.7 dotychczasowy nie działa i podobno to jest ficzer a nie bug.
Mam już gotowy analizator leksykalny – automat Mealy’ego na 35 stanach, który
bez problemu wyłuskuje konkretne tagi oraz dane pomiędzy nimi ze strumienia XML,
nie głupiejąc nawet na sekcjach CDATA, czy niewyeskejpowanych
> w wartościach atrybutów. Nie obsługuje DTD, ale to i
tak w strumieniach XMPP jest zabronione. Obsługuje za to (tzn. umie ignorować)
PI i komentarze, mimo że też nie musi. Najlepsze jest to, że automat zadziałał
poprawnie (na ile go przetestowałem) za pierwszym razem gdy go uruchomiłem i
udało mi się go jakimiś danymi nakarmić. Teraz jeszcze muszę dokończyć
wyłuskiwanie początku/końca strumienia i pełnych zwrotek oraz przekazywania tego
do parsowania przez libxml2 (mój preparser nawet nie do końca sprawdza
czy otrzymany XML jest well-formed).

Pracę zacząłem on restartowania serwera na Opteronach który zrobił Ooopsa.
Niektóre kernele na nim odpalane od razu wywalały się z machine check
exception
, więc wiem że coś jest skopane. Dzisiaj nawet próbowałem dojść do
tego co dokładnie i zacząłem analizować kody które mi któryś z tych kerneli
wyrzucił. Ale zanim się mniej-więcej w tym połapałem i znalazłem odpowiednie
tabelki w specyfikacji, to minęła 16-ta i czas było wracać do domu.

Po drodze do domu poszedłem na obiad do Sphinksa. Pierwszy raz zresztą.
Jedzenie może nie rewelacyjne, ale dobre, dużo i w miarę tanie. Zresztą w moim
przypadku to już sukces, że byłem w stanie to zjeść bez kombinowania.
Wielokrotnie już zamawiałem jedzenie, którego potem nie byłem w stanie zjeść i
zostawiałem nieruszone. Tym razem dla pewności nawet wypytałem najpierw kelnera
czy ta Shoarma na pewno nie ma żadnych pomidorów i czy przypadkiem nie jest
przyprawiona na słodko. Nic z tych rzeczy, więc zamówiłem. I rzeczywiście na
talerzu było wszystko jadalne – frytki, mięsko i normalna (bez
majonezu/śmietany/pomidorów/buraczków) surówka. Podali też trzy różne sosy w
miseczkach, ale tego nie musiałem ruszać (dwa spróbowałem na końcu frytki, ale
ten ostry był z pomidorami i wcale nie taki ostry, a czosnkowy chyba na
śmietanie – nic dla mnie). Jeszcze kiedyś się tam wybiorę, może z żonką.
A jutro Bar pod Pierożkiem :-) .

Do przemyślenia

Ciekawego linka ktoś wkleił dzisiaj na jdev@conference.jabber.org:
http://www.joelonsoftware.com/articles/fog0000000069.html

Nie wiem co o tym myśleć. Z jednej strony mądrze piszą i do tego bardzo pocieszająco (mój kod nie jest taki zły :-)), ale z drugiej… nie do końca jestem przekonany że pisanie od nowa nigdy nie ma sensu. A na tę konkretną sprawę można spojrzeć inaczej: może Netscape wyrzucił swój stary kod, ale ekipa Mozilli po prostu zrobiła swoją przeglądarkę od zera. A to już chyba takie naganne nie jest.

Co zrobić z idiotami…

… którzy do wyszukiwania bibliotek przez skrypt configure używają
testów na istnienie pliku …./lib/lib$name.so?????

Wieszać, wystrzelać, potopić, podusić?

Przecież skrypt configure powinien sprawdzać czy linker potrafi znaleźć
odpowiednią bibliotekę, a nie czy jakiś plik jest na dysku. I chyba
nawet w dokumentacji autoconf jest to jasno powiedziane… A taki np.
PHP pełen jest takich kwiatków 😦 . I portowanie PLD na AMD64 to głównie poprawianie takich idiotyzmów.

Ale uparłem się i przeniosę swoją ulubioną dystrybucję na tę platformę. A co się będzie mój serwerek z dwoma Opteronami marnował… 🙂

Kontrola wersji i „myśl techniczna”, ech…

Przedwczoraj szef do mnie dzwonił z pytaniem jak załatwić sprawę
uprawnień różnych programistów w naszej firmie do kodu źródłowego, żeby
każdy widział swoją część, nie miał dostępu do pozostałych, a wszystko
działało razem. Wytłumaczyłem, że jeśli ten kod jest w PHP i ma działać
razem na serwerze, to w 100% nie da się zabezpieczyć przed tym, aby ktoś
sobie cudze źródła np. wyświetlił na stronie WWW. Zaproponowałem
natomiast użycie jakiegoś systemu kontroli wersji, który zapewnił by
kontrolę dostępu podczas tworzenia kodu i dokumentował ew. próby
nadużyć w kodzie służących dostępowi do „zakazanych” części. Miałem tę
sprawę obadać.

Najpierw przyjrzałem się dostępnym narzędziom. Wstępnie ograniczyłem
się do CVS, arch i Subversion. CVS odpadł, bo przestarzały i ma różne
głupie ograniczenia. Arch, bo nie chodzi pod Windows, a nasi programiści
(nie wiedzieć czemu ;-)) używają Windows. Subversion
z dostępem przez WebDAV wydał się najodpowiedniejszy. Problemem było
wymaganie apache-2.0, ale zainstalowałem sobie wszystko co trzeba
w chroot i ładnie chodzi.

Sam przerzuciłem do Subversion z CVS swoje projekty, przez
głupotę/niedopatrzenie tracąc jeden z ostatnich – rozpoczęty server DHCP
korzystający z bazy SQL – dzisiaj musiałem to pisać od nowa. Ale
Subversion mi się podoba, dużo bardziej niż CVS. A podstawową obsługa
praktycznie się nie różni.

Dzisiaj szef mnie wezwał do siebie w sprawie tych praw dostępu. Był
tam już szef działu oprogramowania, dość pozytywnie (a przynajmniej
neutralnie) nastawiony do mojej propozycji. Okazało się, że „nie ma sensu
takiej kobyły do tego zaprzęgać” i wszystko zostanie załatwione prawami
dostępu do plików na serwerze i skryptami – całe szczęście że nie ja
będę tego pilnował. I w sumie przekonywanie kogokolwiek więcej do tego
subversion mi odpada. Tylko szkoda że wczoraj tyle się z tym męczyłem,
gdy miałem lepsze rzeczy do roboty.

Podczas tej dyskusji szef twierdził, że ten kod źródłowy powinien
być najbardziej chroniony ze wszystkiego w naszej firmie. Chciał kupić
jakiś moduł do szyfrowania kodu PHP (żeby nikt od nas nie podejrzał,
a jakby co to można by go sprzedawać), wspominał nawet o odłączaniu
stacji dysków i Internetu programistom. Powtarzał, że tu nie ma miejsca
na żadne zaufanie itd. Chyba nawet Microsoft tak nie boi się o swoje
kody źródłowe, bo w końcu udostępnia je na zewnątrz (oczywiście tylko
wybranym i na diabelskich zasadach) Gdy użył stwierdzenia „myśl
techniczna”, to we mnie się gotowało. Sam mam zupełnie inne spojrzenie
na to jak powinno być tworzone i udostępniane oprogramowanie,
szczególnie dla instytucji publicznych (a o takim była mowa).
Zastanawiałem się co ja właściwie robię w tej firmie. Nie próbowałem
wyjaśniać moich poglądów, bo wyszedł bym tylko na fanatyka, a z powodu
mojego słabego rozeznania z biznesem i prawem może także na głupka. Na
szczęście nie jestem programistą, ale administratorem i mogę uznać, że
sprawa mnie nie dotyczy. Ale fajnie by było pracować gdzieś gdzie Wolne
Oprogramowanie i Open Source to rzecz naturalna nie tylko w sensie brania ale
także dawania.

Przemogłem się…

… i zacząłem pisać manuala do CJC. Co prawda CJC jeszcze nie
skończone, ale przynajmniej teraz jest jeszcze mało do dokumentowania. Chyba
wszyscy programiści się ze mną zgodzą, że to najgorsza część roboty (chyba tylko
dokumentacja kodu jest gorsza, dlatego PyXMPP dłużej będzie się bez
dokumentacji). Dobrze, że przynajmniej DocBook jest taki fajny.

Piszę po angielskawemu i ktoś to kiedyś będzie musiał na angielski
przetłumaczyć. Polskie tłumaczenie też by się przydało, ale ja tego pisać nie
będę.

W sobotę jedziemy z rodzinką (żona, córka, teściowie) na wczasy. Zaszalałem
i już parę tygodni temu zarezerwowałem przedział sypialny w pociągu, bo
wielogodzinnej jazdy samochodem z dzidziusiem sobie nie wyobrażam.

Wczoraj spotkaliśmy znajomych żony na placu zabaw z dzieckiem. Mieli takie
fajne nosidło ze stelażem do noszenia dziecka. Wsadziłem w to Krysię, wsadziłem
na plecy – i nic – nie czuć tych 10kg. Zaraz pomyśleliśmy, że przydałoby nam się
to na wczasach, przecież wózkiem po plaży nie będziemy jeździć. Tylko czy to się
na pewno sprawdzi? I gdzie to kupić? Na Allegro mają nawet takie za 83zł, ale
żonie nie udało się ze sprzedawcą skontaktować, nie wiadomo czy do czwartku by
doszło no i za 83zł to może być badziewie. Ja na chwilę urwałem się z pracy,
żeby zobaczyć co w sklepie można kupić – jest tam nosidło Chicco za 240zł.
Trochę dużo jeśli miało by się nie sprawdzić, więc jeszcze się wahamy.

Zabcia – finał?

Dostałem kolejnego SMSa od Zabci. Wygląda na to, że ostatniego
:-( Wygląda też na to, że Zabcia nie przez pomyłkę wysyła do mnie
te SMSy i że ta prawdziwa żabcia czyta Joggera – dzisiejszy SMS zawiera
odwołania do mojego joga, a zarazem cechy charakterystyczne dla jej pierwszych
SMSów, których tu nie publikowałem.

Coraz bardziej jestem ciekawy kto jest tą żabcią. Więc Żabciu, proszę,
ujawnij się kimkolwiek jesteś :-) (żona w tym momencie
powiedziała „ekhm ekhm”, ale ja bym się tym nie przejmował)

Dzisiaj, Poza czytaniem SMSów, dalej pracowałem nad CJC. Postanowiłem zacząć
kończyć „partyzantkę” i od dzisiaj CJC plik konfiguracyjny trzyma
w ~/.cjc/ a nie w bieżącym katalogu i może być odpalony
skądkolwiek, a nie tylko z bieżącego katalogu. Zaimplementowałem także kilka
ficzerów o które poprosił najwierniejszy użytkownik – takich jak obsługa części
klawiszy tak jak to robi readline, czy obsługa skalowania okienka
terminala.

Dzisiaj też doczytałem do końca w autobusie i tramwaju kolejną książkę.
Ostatnio umilam sobie godzinną podróż do pracy autobusem i podobną z powrotem
tramwajem czytając książki. Czytam to co mi najłatwiej zdobyć – książki
Chmielewskiej, których żona ma chyba komplet. Może to i mało ambitna, babska
literatura, ale parę z nich mi się bardzo spodobało. Chyba najbardziej właśnie
„Lądowanie w Garwolinie”, które skończyłem czytać dzisiaj (żonie akurat ta się
nie podobała) – niezłe jaja w postaci inscenizowania lądowania kosmitów w PRL
lat 60-tych.