Archiwalia dla 06.2007

Poliż węża

Jakbym bardzo nie szanował Pythona jako języka, tak nie sposób mi przejść obojętnie wobec tworu zwanego Polish Python Coders Group. Jak wyraźnie demonstruje serwis grupy, zrzeszać będzie ona amatorów-entuzjastów języka PHP.

W prawej kolumnie widzimy Django, obok reklamę Python od podstaw. Widać szacowne grono redaktorów i autorów serwisu w linki kliknąć jeszcze okazji nie miało, bo cały serwis właśnie na wspomnianym PHP stoi (pozwolę sobie nie brać pod uwagę możliwości, że komuś chciałoby się dopisywać ścieżki typu index2.php do urls.py).

Z lektur polecę jeszcze podstawy HTML, bo warstwa struktury aż prosi się o przepisanie (może tym razem bez wstawiania nagłówków w postaci plików graficznych).

Podsumowując, fani Pythona, łączmy się… w bólu.

Python: libchart 0.0.3

Dziś pojawiła się obiecana potrzeba i tak powstała trzecia wersja biblioteki do generowania wykresów. Tym razem nie wymaga PIL i oparta jest w całości o Cairo, a to oznacza śliczne wygładzanie krawędzi.

python-libchart 0.0.3

Jak poprzednio, do pobrania ze strony projektu.

Drodzy łebdeweloperzy…

Przychodzi do was klientka. Wdrażacie jej osCommerce. Robicie jej niedźwiedzią przysługę, ale to problem większości tak zwanych agencji interaktywnych. Teraz zaczyna się wasza praca przy dostosowaniu owego wynalazku z piekła rodem. Uwaga, czytajcie mi z ruchu klawiszy…

Waszym pieprzonym obowiązkiem jest wykonać pracę prawidłowo, zgodnie ze sztuką i w jak najlepszym interesie klientki, która wam za to płaci. Tak, to jest obowiązek, a nie opcja premium, za którą się dopłaca. Tak, jak zamawiając hydraulika nie dopłacacie 100% ekstra za uszczelnienie zaworu po wymianie, tak wy nie macie prawa oddać klientowi produktu, który już po chwili zaglądania za kulisy wygląda jak ledwie trójkowa praca zaliczeniowa na pierwszym semestrze studiów informatycznych.

Że kod brzydko sformatowany? Nie, nie. Co powiecie na zapytanie SQL, które wykonuje się — bagatela — piętnaście sekund? Nie mówię o raportach, mam na myśli zapytanie, które pobiera dane do wyświetlenia na stronie. A dlaczego potrzebuje na to ledwo ćwierć minuty? Bo jeden z drugim klepacz (to taka odmiana programisty, która przychodzi do biura o 8:01, a o 15:59 jest już w płaszczu i chwyta za klamkę) — jak to się marketingowo na stronach chwalą — potraktował klienta indywidualnie. Zapewne przez to rozumieć należy to tylko jeden klient, pewnie nikt się nie kapnie.

Całe pięć minut zajęło mi przeczytanie, mało popularnego w arystokratycznych kręgach agencyjkowych hakerów, loga slow queries. Całe dziesięć poświęciłem na dodanie prawdziwej nowinki w świecie RDBMSindeksów do tabel. Serwis działa ponad dwa razy szybciej (przetestowane też za pomocą dostępnego tylko elicie narzędzia ab).

Jako ciekawostkę podam, że — zapewne dla podwójnej pewności — któryś geniusz poświęcił sporo czasu na dodanie indeksu UNIQUE dla każdego klucza PRIMARY, który (widać niektórzy nie wiedzą) implikuje indeksowanie dla przeszukiwania i gwarantuje unikalność. Nie poświęcił za to ani sekundy na dodanie oczywistych indeksów dla kolumn, które służą za klucze zewnętrzne. Prawie zewnętrzne, bo serwis korzysta z tabel MyISAM.

Na koniec powiem, że jeśli ktoś poczuł się urażony powyższą notką, to bardzo, kurwa, dobrze i powinien się w końcu nauczyć wykonywać swój zawód. Jeśli agencji nie stać na zatrudnienie kompetentnego DBA, to niech się przebranżowi na robienie bannerków we Flashu, bo w programowaniu nie ma czego szukać. Cała reszta czytelników, mam nadzieję, bawiła się równie dobrze, co ja przy poprawianiu waszej fuszerki i pewnie z radością wysłałaby was na Worse Than Failure.

PHP, PCRE i nagłe zgony

Jest wpół do drugiej w nocy. Siedzę w biurze. Serwer Apache wygląda na stabilny. Dokładnie, wygląda.

Prawie wszystkie działające u nas aplikacje są zaimplementowane jako usługi FastCGI serwowane przez Lighttpd. Bazy danych działają w osobnych serwerach wirtualnych, podobnie odseparowany jest Apache, który dzierży brzemię mielenia PHP i przedzierania się przez gąszcze plików .htaccess.

Wszystko byłoby pięknie, gdyby Apache nie zaczął sobie chodzić na spacerek do krainy wiecznych łowów (jak to Indianie mają w zwyczaju czynić po SIGSEGV). Szybki (błyskawiczny rzekłbym, ale to nie prawda) strace i końcówka gdb pokazały, że ślad urywa się gdzieś w PHP.

Następny test — przestawienie PHP z mod_php (użytkownicy nie mają dostępu do kodu serwisów, więc nie bawiliśmy się w żadne separacje użytkowników) na CGI. Tym razem dzielny serwer przetrwał, w przeciwieństwie do skryptu. Kolejny strace i gdb na symulowanym środowisku CGI (w bardzo wysublimowany sposób — export QUERY_STRING=… i tak dalej) i okazuje się, że zdycha jednak biblioteka implementująca PCRE.

Dużo Google. Bardzo dużo. W końcu pomaga Qwiat. Miał to samo, pomógł downgrade pakietu pcre do wersji 6.7. Przebudowa wspomnianego pakietu we wspomnianej wersji, upgrade w vserwerze, restart usług. Działa. Nieźle się maskuje.

Kod serwisów zdaje się działać bez zarzutu. Chciałem zarzucić temat, ale obiecałem znaleźć syntetyczny testcase. Więcej Google. Na liście błędów pcre jest znana podatność na przepełnienie stosu. Autorzy zdają się mieć ją w dużym poważaniu. Wersja 7.x zdycha, wersja 6.x działa. A takiego.

<?php
print 'A teraz coś z zupełnie innej beczki: ';
preg_match('/(.(?!b))*/', str_repeat("a", 10000));
?>

Powyższy kod położył mi każdą kombinację PHP i PCRE. Bardzo ładny sposób, żeby komuś zrobić DOS na PHP działające w trybie FastCGI (po n-tym padzie usługi w krótkim czasie serwer słusznie uzna, że jest uszkodzona i przestanie ją wskrzeszać, przynajmniej na jakiś czas).

I tym optymistycznym akcentem zakończę swoje gadanie od rzeczy i udam się do domu spać.

123-reg

Serdecznie polecam usługi brytyjskiego serwisu 123-reg.co.uk. Kilka największych zalet poniżej:

  • zmiana delegacji DNS działa tylko dla niektórych naszych domen;
  • dla pozostałych nie ma nawet możliwości podania adresów IP, od razu dostajemy błąd;
  • nie odpisują na żadne zgłoszenie powyższego błędu przez e-mail;
  • ich wsparcie techniczne to specjalna infolinia, każda minuta połączenia kosztuje grube pieniądze, łącznie z czterdziestoma minutami oczekiwania na zgłoszenie się operatora;
  • kiedy już się poddaliśmy, zgubili ticket transferowy z GoDaddy

Na koniec jeszcze raz, serdecznie polecam.

Religijnie: 10 przykazań i władza nad demonami

Ostatnie dni stanowiły dla mnie nieprzerwane pasmo imprez… wróć! Nieprzerwane pasmo pracy z kodem. A właściwie to jedno i drugie, Python jest tak wygodny, że nawet przy kilku projektach pozostaje czas na imprezy.

O Pythonie za chwilę, najpierw jednak o PHP. Wróciło 10przykazan, po 9 dniach awarii. Długa przerwa, ale głównym problemem był dostęp do internetu. Trzeba wam bowiem wiedzieć, że 1. marca kwietnia (więcej kawy) przeprowadziłem się do nowego mieszkania i do dziś nie udało się nam podpisać umowy z żadnym dostawcą. Ale nie o tym chciałem pisać, okazało się, że przyczyną problemu jest PHP w wersji 5.2.2, które psuje biblioteki RPC.

W wolnym czasie zacząłem też eksperymentować z własną implementacją niesławnego pakietu daemontools. O działalności djb słyszeli chyba wszyscy, a niezorientowanych pozostawię na pastwę Google, bo i szukać nie trzeba długo.

W ITS Ltd. używamy daemontools do zarządzania usługami FCGI. Wszystko byłoby dobrze, gdyby nie fakt, że od czasu do czasu (po zmianie kodu na serwerze) trzeba taką usługę zrestartować, a czasem i zatrzymać na dłużej. Cóż, daemontools pozwala to zrobić tylko rootowi z poziomu konsoli.

Pakiet wygląda na martwy, za trzy tygodnie kończy się jego licencja redystrybucji. Mój nowy projekt poboczny to próba odtworzenia schematu działania oryginału za pomocą odrobiny Pythona. Przy okazji dodałem nieco interfejsów D-Bus. Zainteresowanych wczesnymi testami zapraszam na stronę daemontools-ng.

Python + libchart = ładne wykresy

Długo szukaliśmy sensownej biblioteki, która pozwoli nam narysować prosty wykres kołowy, nie zajmuje pół mega i w trakcie działania nie uruchamia zewnętrznego konwertera PostScriptu. Idealny kandydat powinien do tego mieć sensowne API.

W końcu znudziło mi się szukanie i siadłem do klawiatury. Przypomniałem sobie o świetnej bibliotece libchart, której używamy w Wego CMS i postanowiłem ją odtworzyć w Pythonie.

Charting in python with libchart

Powyżej widać efekt 3 godzin mojej pracy. Kod do działania wymaga Python Imaging Library i jest objęty licencją LGPL.

Pobierz ze strony projektu i podziękuj firmie ITS Ltd. za jego sfinansowanie ;). Wersja 0.0.1 oferuje tylko wykresy kołowe, pozostałe typy pojawią się w miarę potrzeb naszych klientów.

Opera guys have the balls

Opera guys have the balls
Nowy produkt Opery — Opera Stress Reliever™ Limited Beta

Razem z Marvelem zostaliśmy zaproszeni na ekskluzywną konferencję Opera Software, gdzie zaprezentowano nam nowy produkt do walki ze stresem w biurze. Urządzenie, które było bohaterem prezentacji, jest reklamowane hasłem gdziekolwiek jesteś, walcz ze stresem, postanowiliśmy je więc poddać testom w warunkach typowo bojowych, w kwaterze ITS Ltd.

Zgodnie z obietnicą producenta, urządzenie — mimo wczesnej fazy beta — równie dobrze leży na komputerach typu desktop, co na urządzeniach mobilnych. Przebadaliśmy je za pomocą biurowych komputerów Dell OptiPlex 745, mojego prywatnego laptopa Asus A6Km oraz na telefonach Sony Ericsson K700i i K750. Jedyne trudności sprawiło nam umieszczenie go na obudowie obecnej w czasie prezentacji konsoli Wii firmy Nintendo. Obecni na miejscu deweloperzy z wrocławskiego biura Opera Software zapewnili nas jednak, że obsługa Wii jest dopiero w fazie rozwojowej i również ta platforma będzie w pełni obsługiwana nim produkt trafi do użytkowników domowych. Po powrocie do domu postaram się również przetestować zgodność z konsolą Sony PlayStation 2, choć ta nie znajdowała się na liście urządzeń oficjalnie wspieranych.

Pracownicy Opery zapewniali nas, że urządzenia cechuje wspólne zunifikowane jądro, dlatego postanowiliśmy przetestować jego odporność na mechaniczne uszkodzenia. Najpierw upuściliśmy urządzenie z wysokości jednego metra, co odpowiada zsunięciu z typowego biurka lub niskiej szafki.

1 meter above the ground

Następnie powtórzyliśmy próbę dla wysokości typowego regału biurowego, zwiększając wysokość do półtora metra.

1.5 meter above the ground

Oba testowane przez nas urządzenia nie wykazywały najmniejszych śladów zewnętrznych uszkodzeń. Co więcej, funkcjonowały przez cały czas przeprowadzania testu z fabryczną dokładnością.

After hitting ground

Takiej stabilności konkurencja może Operze tylko pozazdrościć. Trzeba również zauważyć, że produkt Opery wymagał do działania znacznie mniej miejsca i siły niż wiodące obecnie na rynku produkty konkurentów.

A tak poważnie, to byliśmy dzisiaj na konferencji prasowej związanej z oficjalnym ogłoszeniem działalności wrocławskiego biura Opery. Było bardzo kameralnie, w niedużej salce konferencyjnej znaczącą część widowni stanowili pracownicy biura.

Rozpoczął Jon von Tetzchner (przepraszam, jeśli przekręciłem nazwisko), prezes i założyciel firmy. Opowiadał o historii firmy, o tym jak z prowadzonej przez dwie osoby, jednoplatformowej konkurencji Mosaic zmienili się w czterystuosobową firmę, której produkt działa na niemal każdym systemie operacyjnym. Powiedział też, że wierzą w jedną Sieć, w której nie ma miejsca na WAP. I nie sposób się z nim nie zgodzić.

Wspomniane czerwone piłeczki znakomicie ułatwiały rozładowanie stresu związanego z koniecznością słuchania tłumaczki, która interpretacją wypowiadanych słów nie ustępowała swym telewizyjnym kolegom. Dowiedzieliśmy się więc, że ninety five per cent oznacza jedną czwartą a 1500 sign-ups to półtora tysiąca odwiedzin.

Dalej jeden z pracowników polskiego oddziału opowiadał o przyczynach wyboru Wrocławia na siedzibę. Współczuję mu nieco, bo o ile mówił sensownie, to ręcę mu się trzęsły tak, że pilotem od Wii ledwo trafiał w przyciski. Z Marvelem przez chwilę chcieliśmy go też wypromować na księdza, kiedy to zaczął mówić, jakby miał word-spacing: 2em. Wygląda na to, że jako mówca został wybrany spośród grona pracowników metodą najkrótszej słomki ;)

Było bardzo miło, na koniec ucięliśmy sobie pogawędkę z programistami z wrocławskiego biura. Pożartowaliśmy chwilę i przyszło nam wracać do pracy. Przez to ominął nas, niestety, poczęstunek. I o ile z bólem serca, ale zniosę niemożność kontynuacji rozmów kuluarowych, o tyle odżałować nie mogę kawy i ciastek. Wracam więc do pracy, głodny.