KomodoEdit i Pyflakes

Ponieważ PIDA zaczęła mnie wkurzać (co chwilę a to coś działa, a to nie działa), postanowiłem dać szansę KomodoEdit, mocno okrojonej, ale darmowej wersji niezłego Komodo IDE. Ponieważ mój nowy lapek ma 2GB RAM na pokładzie i mocny, dwurdzeniowy procesor, żerność Komodo nie była aż tak wielkim problemem jak dawniej. Obejrzałem dokładnie program i zacząłem zastanawiać się, jak do niego dołączyć to, do czego przyzwyczaiła mnie PIDA, to znaczy integrację z Pyflakes. Dla niezorientowanych: Pyflakes to program do statycznej analizy poprawności kodu Pythona, nieco mniej zaawansowany niż Pylint, jednak jednocześnie nie aż tak inwazyjny (oczywiście wiem, że Pylinta można tak skonfigurować, żeby nie sprawiał wrażenia faszystowskiego narzędzia).

Jak się szybko okazało, nie ma możliwości podpięcia Pyflakes tak, by uruchamiało się przy każdym zapisie bufora, jak dzieje się to w PIDA, jednak dla mnie ważniejsze było to, żeby działało, niż to, żeby działało identycznie. Postanowiłem przypiąć Pyflakes jako narzędzie zewnętrzne w Toolboksie Komodo. Oto skrócona recepta, jak to zrobić, żeby działało ładnie i produkowało fajne wyniki.

  1. Toolbox -> Add -> New Command
  2. Command (U): /usr/bin/pyflakes %F
  3. Run in: "Command Output Tab"
  4. [*] Parse output with: ^(?P<file>.+?):(?P<line>\d+): (?P<content>.*)$
  5. [*] Show parsed output as a list

A teraz opis słowno-muzyczny. Z menu Toolbox wybierz Add i następnie z podmenu New Command. Na zakładce Command w nowo otwartym okienku w pole Command wpisz polecenie uruchomienia Pyflakes ze ścieżką bieżącego bufora (u mnie: /usr/bin/pyflakes %F). Z listy Run in wybierz Command Output Tab. Zaznacz pole Parse output with i w pole polecenia parsującego wpisz wyrażenie regularne ^(?P<file>.+?):(?P<line>\d+): (?P<content>.*)$, które podzieli wyjście Pyflakes na 3 części. Zaznacz pole Show parsed output as a list, a Komodo wyświetli wyniki w postaci ładnej listy z 3 kolumnami — dwukrotne kliknięcie na każdej pozycji listy przeniesie kursor do odpowiedniej linii w edytorze.

Po tym wszystkim pozostaje jedynie przypisanie do tego jakiegoś wygodnego skrótu klawiszowego w tym samym okienku na zakładce Key Binding.

Nie ma ludzi niezastąpionych

Claudiu Pap, (obecnie już były) portal manager Commune.ro wpisał w komentarzu do mojego pożegnania z Sensisoftem, że spodziewa się w tej sytuacji rychłej śmierci projektu. Bardzo to miłe z jego strony, ale to nie działa w ten sposób.

Wiele razy już byłem ogłaszany człowiekiem, którego nie da się zastąpić i wiele razy okazywało się, że z perspektywy firmy lub projektu nie jest to prawdą. Faktycznie, z pewnej perspektywy jest to prawda, bo każdy człowiek jest unikalny na skalę światową i ma niepowtarzalny zestaw umiejętności, osobowości, charakteru, wiedzy i doświadczeń. Patrząc pod tym kątem to i owszem, próba zastąpienia mnie jest skazana na pewną porażkę. Ale przecież w projekcie nie chodzi o cały ten komplet cech, a jedynie o pewien zestaw cech, który powodował że coś się udawało. Patrząc z tej strony, niezastępowalność nie jest już tak oczywista. Prawdopodobnie będzie trudno znaleźć kogoś, kto będzie w stanie przejąć moje obowiązki w sposób niezauważony, ale nie chodzi nawet o to, żeby się to odbyło w sposób niezauważony. Mój sposób dowodzenia nie był jedynym, który mógł doprowadzić do sukcesu. Przypadek sprawił, że był dość charakterystyczny i ekstremalny, przez co łatwo zapadł w pamięć i szybko został skojarzony z owym sukcesem na zasadzie analogii. Trudno oczekiwać, żeby akurat w tym przypadku (w odróżnieniu od tego, jak reszta świata jest skonstruowana) istniała tylko jedna dobra recepta na powodzenie (abstrahując od stopnia dobrości różnych recept).

Nasze drogi z Sensisoftem rozeszły się i teraz każdy musi sobie poradzić sam. Jestem przekonany, że tak jak ja potrafię zadbać o siebie, Sensisoft będzie w stanie zadbać o przyszły sukces projektu Commune.

Mamy wózek

Kupiliśmy dziś nasz pierwszy samochód. Dobiegając 40-tki, po ponad 10 latach życia po ślubie staliśmy się wreszcie właścicielami własnego pojazdu. W wielkim stresie (pomimo dokładnego sprawdzenia przez osoby postronne) kupiliśmy dzisiaj przyzwoicie wyposażonego Forda Escorta 1.6 16v kombi z 2000 roku, ze 166 000 kilometrów. Do domu dojechał i nawet wszystko, co miało działać (klimatyzacja, yay!) działało. Teraz co paręnaście minut latamy do okna w kuchni, żeby sobie na niego popatrzeć. I w sumie pomimo tego, że nie jest mały, to na naszym parkingu przed blokiem wśród Fordów Mondeo, Opli Omega i Toyot Avensis wygląda bardzo pchełkowato. Ale zmieścimy się w nim, i jeszcze przez parę lat będzie nam w nim wygodnie.

Jutro mam sprawdzić w serwisie, kiedy było wymieniane coś, co się nazywa pasek rozrządu (brzmi poważnie, ale mam pewne wątpliwości) i jaki lano do niego do tej pory olej. A w sobotę wybywamy na wioskę.

Archiwum is back

Poprawiono najbardziej denerwujący mnie błąd w Django z ostatnich czasów i dzięki temu wróciło archiwum. Oh, my...

Sława, sława!

http://oebfare.com/blog/2008/jun/24/django-code_swarm/

Około drugiej minuty, w prawym górnym rogu...

Zmiana planów w ostatniej chwili

Dosłownie w ostatniej chwili zdecydowałem się na zmianę dostawcy hostingu na djangohosting.ch, pomimo że byłem zdecydowany na coś innego. Po sugestii Thomasa (dzięki!) przyjrzałem się usłudze dokładniej i postanowiłem dać szansę. Wykupiłem najtańszą opcję, wypróbowałem one-click-django-installer i oczywiście zameldowałem się po SSH. Już pierwsze pół godziny sesji przekonało mnie, że jest tam o wiele przyjemniej niż na Alwaysdata — nie ma żadnych myków z przestawianiem $HOME, no i zwiększanie opcji jest bardziej granularne (oddzielnie procesy, porty, pamięć i przestrzeń dyskowa), a cała infrastruktura w dużej mierze przypomina to, co jest na MegiTeam.pl, z paroma udogodnieniami:

  • można uruchomić serwer developerski django i w razie problemów mieć dostęp do pełnego tracebacka;
  • pełna kontrola nad uruchamianiem FastCGI;
  • łatwiejszy dostęp do logów Lighttpd (chociaż jest w nich równie mało, jak w logach nginxa na megiteam).

Ogólnie wygląda to bardzo dobrze, a przy tym jest trochę taniej.

Sztuczny tłok

Dużo się ostatnio dzieje w Django — co chwilę ktoś commituje zmiany do repozytorium i można odnieść wrażenie, że opublikowanie daty wydania wersji 1.0 obudziło w developerach nowy zapał i chęć do posprintowania na zakończenie wyścigu.

To mylne wrażenie. Przytłaczająca większość pojawiających się w repozytorium zmian to są poprawki w dokumentacji, w docstringach oraz style fixes. A kod poprawiający rzeczywiste problemy czeka sobie na lepsze czasy.

Ten wpis był tytułem ochłodzenia emocji, gdyby ktoś widząc tempo commitów wnioskował z tego, jak dużo i szybko kod w Django jest poprawiany... ;)

Zdecydowałem się na dostawcę

To był tydzień pełen przemyśleń, ale w końcu doszedłem do jakichś wniosków. Mój najbliższy projekt będę hostował na Alwaysdata. Co prawda całość serwisu jest po francusku, ale jakoś daję sobie z tym radę.

Ujęło mnie to, że jest:

  • tanio (€ 6 za miesiąc w najtańszej opcji);
  • dobry support na forum (po angielsku!);
  • dość duża wolność, jak na shared plan;
  • krótki ping, serwery stoją w OVH w Roubaix (Francja).

W związku z małą ilością dostępnego miejsca na dysku, będę musiał media i uploady na S3, ale nie powinno być to jakoś szczególnie uciążliwe.

Konkurent (djangohosting.ch) przegrał głównie przez zerowy wybór w dziedzinie bazy danych (tylko MySQL, bez PostgreSQL), ale nie była to przegrana autorytatywna. Dam mu szansę następnym razem. ;)

Done

Złożyłem szafę. Cały weekend szarpaniny ale półtorametrowa szafa wreszcie stoi. Bolą mnie ręce i nogi, ale cieszę się, że nie będę musiał tego już robić na urlopie. Będę za to musiał robić inne rzeczy, bo wraz z szafą przyjechała prawie 50 kilogramowa komoda...

Na szczęście wpadłem wczoraj na szatański pomysł i kupiłem sobie jakąś wkrętarkę. Bez tego pewnie odpadłyby mi ręce od wkręcania śrub.

Tanie wino

Jak wiadomo, tanie wina są dobre, bo są tanie i dobre. Takim właśnie tanim i dobrym winkiem jest australijskie Jacob's Creek Shiraz Rosé 2007 (~20PLN w hipermarketach). Przyjemne, owocowe w aromacie (truskawki?), mocne.

Pożegnałem się z Sensisoftem

Wczoraj, w godzinach popołudniowo-wieczornych, dokonałem pożegnania z Sensisoftem, oficjalnie — to znaczy przy użyciu piwa. Wypiliśmy, pogadaliśmy, w nieco szerszym gronie wypowiedziałem to, co mówiłem już wiele razy przy nieco mniejszych spotkaniach towarzyskich: że sposób, w jaki ta firma produkuje oprogramowanie jest chory (co nie przekłada się wprost na jakość tego oprogramowania, a jedynie wtórnie, mam nadzieję). Porozmawialiśmy też trochę na temat zadań, jakie powinien wypełniać lider techniczny projektu, zakresu jego odpowiedzialności i związanego z nią zakresu władzy.

Tak, nie ma co się wstydzić tego słowa. Zgłaszanie się do roli technicznego lidera projektu z powodów ambicjonalnych czy prestiżowych mija się z celem, biorąc pod uwagę to, za co ten człowiek odpowiada — czyli za terminowe dostarczenie oprogramowania zgodnego ze specyfikacją. A niosąc taką odpowiedzialność, musi mieć też władzę zarządzania czasem członków swojego zespołu (władzę na szczeblu taktycznym), musi mieć też możliwość wpływania na decyzje operacyjne typu "co ma zostać zrobione wcześniej, a co później". Ja taką władzę miałem i nie pozwalałem jej sobie odebrać, co, jak zauważyłem, nie było szczególnie dobrze przyjmowane. Nie uzurpuję sobie większych zasług, niż mi się należą, ale wydaje mi się, że dzięki mojemu chłodzącemu wpływowi rozwój mojego projektu odbywał się w postaci kontrolowanego chaosu. Odszedłem z firmy, gdy przestałem panować nad tym chaosem.

Mam nadzieję, że w nowym miejscu będzie mi lepiej. Ale może po prostu wystarczy mi, że będę w stanie kontrolować chaos.

Zdrada? To się dopiero okaże...

No i będę miał w pracy MacBooka. Niby zwykłego, ale tak nie do końca, bo czarnego. Nigdy nie miałem Maca, nigdy też go nie używałem, więc zacząłem od czytania, co też mnie czeka po przesiadce z linuksa. Nie zapowiada się różowo, głównie z powodu problemów z bibliotekami. Ale może jakoś to przeżyję...

Wybierz sobie dostawcę

A tymczasem wybór dostawcy hostingu pod Django jest zaskakująco mały, o ile ktoś celuje w użytkowników z Polski, a przy tym nie dysponuje kwotą wystarczającą do wykupienia sobie dedyka w Hetznerze.

Jest za Atlantykiem kilka firm, które chętnie przytulą większą lub mniejszą aplikację w Django za bardzo skromną kwotę, ale te miejsca mnie nie interesują. Ping po 200ms to nie jest coś, na co chciałbym narażać moich klientów. Na Ukrainie też jest pewna firma, która chętnie pohostuje aplikację za niewielkie pieniądze, ale na Ukrainę pingi z Polski lecą wolniej, niż do Francji, bo pakiety muszą zahaczyć o Frankfurt. Mili Szwajcarzy hostują się w Hetznerze, więc pingi do nich są co najmniej znośne, podobnie jak do Francuzów (ci z kolei się hostują w OVH). W Polsce mamy chyba tylko MegiTeam i ITL, ale ich ceny są zupełnie nie na miarę moich możliwości (przynajmniej o ile chodzi o cokolwiek więcej niż ten blog). W efekcie wybór jest między Francuzami a Szwajcarami, a każda z tych ofert ma znaczące niedobory (choćby w porównaniu do WebFaction).

Mam jeszcze 2 tygodnie na podjęcie decyzji.

Przegrywam z maszyną

Od kilku tygodni (a dokładnie odkąd mam Ubuntu 8.04) zastanawia mnie zużycie prądu na poziomie 14W/h. Niby niewiele, ale zmniejsza mi to znacząco czas używania laptopa na baterii. Naczytałem się, że tu i ówdzie świeżo zainstalowany 8.04 zużywa 10.5-11W/h, a to przecież sporo mniej. Próbowałem dojść przyczyny, ale nie znalazłem niczego konkretnego.

Wciąż najważniejszym źródłem przebudzeń procesora jest przełączanie zadań między rdzeniami. Nie pomogła na to ani aktualizacja biosu, ani wyładowywanie kolejnych modułów (po co mi parport, skoro nie używam drukarek, ani nie mam portu równoległego?), zużycie prądu uparcie nie chce zejść poniżej 13.5W/h. gnome-power-manager też nie był tym głównym winowajcą, bo po przełączeniu się na KDE 3.5 minimalny poziom zużycia prądu nawet wzrósł do 14.5W/h — cały zysk z wyłączenia tego potwora został przejedzony gdzie indziej.

Ostatecznością (po którą nie chciałbym jednakowoż sięgać) jest próba z nowszym kernelem. A że jestem wyjątkowo leniwy i nie chcę się babrać z budowaniem kernela debiany-way, oznacza to próbne zainstalowanie Fedory Core 9... O, jak mi się nie chce tego robić.

Halo, czy ktoś mi naprawi komputer? ;)

Co programista robi na urlopie

Ogórki

I właśnie to chciałem na urlopie robić! :)

Cierpię

Po raz kolejny cierpię, jak za każdym razem, gdy muszę zmontować jakiś layout dla serwisu. W tej dziedzinie mam dwie lewe ręce i zezowate oko, więc staram się (przynajmniej na początku) znaleźć coś gotowego. I ciągle mam ten sam problem — szablony które udaje mi się znaleźć mają w większości ustaloną szerokość circa about 800px, czasem pomijalnie większą. To jest rzecz, która dyga mnie za każdym razem, jak potrzebuję wygrzebać jakiś gotowy szablon: przytłaczająca większość szablonów jest robiona na fixed width, przez co masa przestrzeni się marnuje. Nie wspominając o tym, że wszystkie wyglądają jak odbite z jednej matrycy z niewielkimi zmianami.

Nie chce mi się już robić we webie.

Przede mną tydzień urlopu

Po miesięcznym zapieprzu związanym z zakończeniem kontraktu na aplikację, wziąłem tydzień wolnego od firmy. Zamierzam nie myśleć o pracy i zajmować się swoimi sprawami, w swoim tempie. Nie wiem jeszcze, co będę robił, niczego nie planuję. Jest wiele rzeczy, które mam ochotę zrobić — chcę sobie trochę poczytać, przećwiczyć parę sztuczek z javascriptem, może napisać trochę kodu na własne potrzeby.

Patch applied

W pracy używamy kilku różnych bibliotek third-party. W ogniu walki często okazuje się, że mają one jakieś mankamenty, albo brakujące funkcjonalności, od których zależy działanie naszej aplikacji. Czasem kończy się to zgłoszeniem błędu, ale częściej razem ze zgłoszeniem dostarczamy poprawkę. Czuję się szczególnie doceniony, gdy moja poprawka trafia do upstream — mam wtedy megalomańskie uczucie, że dzięki mnie świat staje się lepszy. Chociaż w niewielkim zakresie... ;)

jQuery mi się podoba

Po raz kolejny zastrzegam: to nie jest miłość (bo miłość może być tylko jedna). Ale jQuery mi się podoba.

Dzisiaj miałem zrobić taki pokręcony formularz z trzema select-ami, gdzie środkowy przyjmuje elementy z dwóch naokoło niego na kliknięcie. Biorąc pod uwagę moją niechęć (i co tu dużo ukrywać, nieznajomość też) do JavaScriptu, planowałem sobie to na co najmniej dzień roboty, a najprawdopodobniej półtora. Tymczasem usiadłem do roboty około 10, a o 12 miałem już to zrobione. 35 linijek kodu i żadnego znużenia. Więcej takich ułatwiaczy poproszę.

To dziwne czasy

Gdy kilkanaście lat temu zaczynałem pisać programy o nieco większym stopniu skomplikowania, obowiązującą mantrą było: przerzuć obliczenia na serwer bazy danych, on ma więcej mocy niż aplikacja. Stąd wzięły się wszystkie moje umiejętności optymalizacyjne, które dobrze robiły przez wiele lat. A teraz dowiedziałem się od naszego bazodanowca, że muszę chronić serwer przed przegrzaniem i jak najwięcej robić na serwerze aplikacyjnym, bo... serwer z bazą nie wyrabia.

Mam dysonans poznawczy. Wolałbym, żeby okazało się, że z powodów oszczędnościowych firma postawiła bazę na jakimś Celeronie 1.7GHz z 256MB RAM, niż że moje umiejętności optymalizacyjne nadają się do lamusa... ;)