Upierdliwości OSX

Lista tego, co mnie wpienia w OSX (i nie wiem, dlaczego te barany z Apple zrobiły to w ten sposób):

  • ustawienie nazwy hosta nie działa w sieciach z DNS, moja wybrana nazwa (owca), jest nadpisywana za każdym razem, gdy DHCP przydzieli mi nowy adres; rozwiązanie: dopisać HOSTNAME w pliku /etc/hostconfig;
  • w Finderze (i w innych aplikacjach z tego co zauważyłem), zarówno katalogi jak i pliki są sortowane identycznie (nie da się ustawić sortowania katalogów przed plikami); rozwiązanie: jakiś hack z nazwą typu obiektu, nie wiem, czy działa;
  • nie wiedzieć czemu, jasność matrycy nie zmniejsza się automatycznie przy odłączeniu zasilania sieciowego; rozwiązanie: brak;
  • ikony w menu aplikacji albo są, albo ich nie ma, nie można mieć czegoś takiego, jak działa PowerManager w Gnome (ikona pojawia się tylko podczas ładowania baterii lub pracy na baterii, a znika podczas pracy na zasilaniu sieciowym); rozwiązanie: brak.

Ale ogólnie nie mogę powiedzieć, żeby było źle. TextMate ratuje Maca przed kompletnym pogrążeniem. ;)

Znikam

Dziś znikam z horyzontu internetu na 10-11 dni — wyjeżdżamy nad morze i nie zamierzam tam niczego kombinować z dostępem do internetu, po prostu nie ma.

Wracamy 11 lub 12 sierpnia i liczę na to, że internet będzie tu jeszcze. ;)

Ujarzmiam OSX

Mam już dobrego Pythona, mam działające Django, mam jakiś edytor, za jakiś czas przyzwyczaję się do klawisza japko i nieco innego ułożenia klawiszy... Zostało mi jeszcze przewalić trochę muzyki z mojego poprzedniego komputera i będzie można żyć.

Parę rzeczy zaczęło mi się nawet podobać: usypia i budzi się momentalnie (wifi przeżywa uśpienie), ładuje się szybko i bateria starcza na długo.

Pierwsze chwile z Mac OSX

Nie jestem zachwycony — tyle mogę powiedzieć po około godzinie z tym systemem. Działa, więc nie jest źle, ale nie rozumiem, czym się ludzie tak bardzo jarają.

Wizualnie całkiem ładny, ale nie powala na kolana (mój zwyczajowy ascetyczny desktop Gnome jest równie ładny, jeżeli nie ładniejszy). Efekty mogły wzbudzać emocje kilka lat temu, ale teraz takie rzeczy to ma nawet Vista, za przeproszeniem.

A na koniec to, co mnie doprowadza do białej gorączki — prawie wszystko trzeba kompilować ze źródeł, w efekcie zainstalowanie prostego Midnight Commandera trwało prawie 15 minut. Już się boję wpisać sudo port install subversion, bo do rana się nie doczekam.

Zamieszania trochę było

Było, było, głównie z wyglądem strony. Postanowiłem wykorzystać czas, jaki trafił mi się z okazji choroby i wymieniłem dziś szablon strony. Dwa razy... Po pierwszej zmianie dostrzegłem kilka mankamentów, których za nic nie umiałem poprawić (jakieś obrazki źle się umieszczały), więc w szybkim tempie wymieniłem szablon na jeszcze inny. Ten z kolei dostał raczej niską notę od mojej żony, więc po poprawieniu mankamentów, które gnębiły tego pierwszego, zdecydowałem się go przywrócić.

Teraz czeka mnie trochę dopieszczania wizualnego (tu i ówdzie czegoś jeszcze brakuje).

Miód, miód!

While comments are neither inherently good or bad, they are frequently used as a crutch. You should always write your code as if comments didn't exist. This forces you to write your code in the simplest, plainest, most self-documenting way you can humanly come up with. (#, podkr. oryg.)

Od zawsze staram się pisać kod tak, by nie trzeba było go komentować. Od zawsze staram się komentować kod tam, gdzie jego działanie jest nieoczywiste (tzn. nie jest jasne, dlaczego ten kod działa). To samo tyczy się testów — nie ma rzeczywistej potrzeby pisania testów do kodu, który:

  1. jest oczywisty
  2. jest kolejną (liczoną w tysiącach) implementacją algorytmu, o którym wiadomo, że działa

Potrzeba osiągnięcia coverage na poziomie 85% nie jest rzeczywistą potrzebą uzasadniającą pisanie testów. Podobnie jest z docstringami — to, że jakiś kod został wydzielony do funkcji/metody nie oznacza, że trzeba go dokumentować.

I na zakończenie jeszcze jeden cytat, odnoszący się do zwyczaju komentowania kodu (wyjątek z listy popularnych usprawiedliwień do dawania komentarzy w kodzie).

The code too complex to understand without comments. I used to think this case was a lot more common than it really is. But truthfully, it is extremely rare. Your code is probably just bad, and hard to understand. Re-write it so that's no longer the case. (#)

Brakujące ogniwo

W nowej pracy dostałem nowe zadanie do zrobienia — zdeployować gotową aplikację w Javie na kilka maszyn w kilku odmianach. Jako że do tej pory takimi rzeczami zajmował się dla mnie dział deploymentu (słodkie czasy), było to dla mnie coś zupełnie nowego. Do zrobienia była dość prosta rzecz:

  • skopiować kilka szablonów plików z jednego drzewa katalogów do drugiego,
  • podmienić odpowiednie ciągi znaków w plikach szablonów,
  • spakować wszystko do tar.gz,
  • wrzucić na zdalną maszynę przez scp,
  • rozpakować na zdalnej maszynie,
  • uruchomić aplikację pod screenem.

Zacząłem od poszukiwania narzędzia, które by mi to ułatwiło.

Skrypty w shellu odpadły na samym początku. Nie umiem ich pisać, poza paroma najbardziej podstawowymi zastosowaniami.

W pracy używamy Pavera, więc naturalną koleją rzeczy zasiadłem do klepania pliku pavement.py. Szybko okazało się, że to potwornie żmudna robota, gdy aplikacja nie jest napisana w Pythonie i wszystkie ułatwienia Pavera można sobie wsadzić głęboko.

Przypomniałem sobie wtedy, że parę lat temu robiłem podobne rzeczy przy użyciu anta, więc napisałem sobie odpowiedni plik build.xml. Było z tym trochę roboty, ale działa. Wreszcie. Ale niestety, to jest Java i XML, więc piętno zostało wybite.

Zacząłem się rozglądać za innym narzędziem i wtedy wpadł mi w oko Fabric. Z opisu wynika, że może być tym, co zastąpi mi anta... ale może też wcale tak nie być. Projekt jest w bardzo wczesnej fazie rozwoju, ale będę miał na niego oko, gdyby ant za bardzo mi dopiekł.

Pointless

Co jakiś czas zdarza mi się dostać od kogoś znajomego zaproszenie do jakiegoś serwisu społecznościowego (Plaxo, GoldenLine, Facebook, MySpace itd.). Z ciekawości zwykle się rejestruję, przeglądam co tam można dobrego znaleźć i w przytłaczającej większości przypadków rezygnuję z dalszego aktywnego uczestnictwa, bo niczego interesującego tam nie znajduję. W każdym z nich jest to samo: jakieś szorty w stylu Twittera, jakieś forum, jakieś klany czy grupy, jakieś powiązania między online identities (bo przecież nie ludźmi) i właściwie żadnej wartości dodanej. Klon klona klonem pogania, w dodatku zwykle klon serwisu dla półanalfabetycznych nastolatek.

Na tym tle wyróżnia się chyba jedynie Last.fm, bo przynajmniej jest tam jakaś unikalna wartość dodana (rekomendacje). Do niedawna dość często zaglądałem również na LinkedIn żeby dowiedzieć się, co teraz porabiają moi znajomi z poprzedniej pracy, ale przestałem, gdy pożal-się-Boże rekruterzy zaczęli wykorzystywać go do masowego łowienia jeleni. Inaczej nie można nazwać procederu namiętnego proponowania mi pracy w Javie pomimo tego, że mam wyraźnie napisane w profilu, że nie interesuje mnie praca w tym środowisku i odrzucę każdą ofertę choćby wirtualnie związaną z taką pracą. Z tego wynika, że łowcy jeleni nie zaglądają do profili użytkowników przed wysłaniem im oferty pracy, co dyskwalifikuje zarówno łowców, jak i ich oferty, a użyteczność samego serwisu stawia pod wielkim znakiem zapytania.

Albo jestem za stary na taki interweb, albo ten interweb się zrobił mniej użyteczny (nawet pod kątem rozrywkowym).

Admin w oddzielnej subdomenie (post-NFA)

Zanim NFA zlądowało w trunku Django (określmy to umownie jako wersję 0.97-pre, w odróżnieniu od 1.0-alpha), aby mieć aplikację we własnej subdomenie trzeba było użyć specjalizowanego middleware, które podmieniało zawartość request.urlconf. W przypadku django.contrib.admin było to o tyle proste i oczywiste, że aplikacja administracyjna miała swój własny URLconf (w postaci django.contrib.admin.urls) i w najprostszym rozwiązaniu wystarczyło utrzymywać mapowanie subdomeny na URLconf. Wraz z nadejściem 1.0-alpha nie jest już tak łatwo, ponieważ tego URLconfa po prostu już nie ma. Aby to rozwiązanie działało nadal, musiałem trochę pokombinować.

Pierwsze podejście z wpisaniem na pałę django.contrib.admin.site.root jako wartości klucza admin w mapie domen oczywiście nie miało szans powodzenia (to jest funkcja, a nie moduł).

Podejście drugie: skoro jest to view, to trzeba zrobić taki URLconf, w którym będzie on wywoływany na / i wszystko, co dalej od tego URL-a. Powstał plik admin_urls.py z zawartością niemal identyczną, jak w dokumentacji Django, jedyna różnica polegała na tym, że obsługiwany URL nie zawierał admin:

urlpatterns = patterns('',
    (r'^(.*)', admin.site.root),
)

I działa.

Na głęboką wodę

Od 10 minut serwis działa na Django-1.0-alpha. Widzę parę rzeczy, które będą wymagały poprawienia, ale ogólnie jest lepiej (i mniej roboty) niż się spodziewałem. Największą zagwozdką była zmiana wprowadzająca zgodność z WSGI — wymagało to dopisania FORCE_SCRIPT_NAME do settings.py. Na szczęście (znowu!) jest to opisane w dokumentacji Django.

We're at ALPHA, man!

Django doszło z numerkiem do 1.0-alpha, co oznacza, że wszystko jest na dobrej drodze do dotrzymania obiecanego terminu wydania 1.0! Internet ma wreszcie szansę stać się cokolwiek przyjemniejszym miejscem (od strony programistycznej).

A ja siadam ponownie do sprzątania po rewolucji, jaką było dołączenie NFA do trunka...

Wszystko się rozpieprzyło, nic nie działa, aaaa!

W trunku Django zlądował właśnie branch newforms-admin, a niejako przy okazji django.newforms to już po prostu django.forms. Nic nie działa. Żadna aplikacja nie daje się uruchomić. Czeka mnie masa roboty.

I love this game!

Będzie się działo, będzie!

Dziś o 19:00 w Stodole, to jeden z tych koncertów, których bardzo nie chciałem ominąć.

Skaluj się, małpo!

Hehe... Widziałem już takie teksty, że niby żeby myśleć o skalowaniu, trzeba mieć po co się skalować, względnie żeby skalowanie zostawić na później, gdy już będzie potrzebne. Niejaki Ted Dziuba dał to po raz kolejny, tym razem dosadnie i z werwą.

Słyszysz? Przestań pieprzyć o skalowalności, i tak nikt nie będzie używał twojej aplikacji. No.

EuroPython 2009

Przyszłoroczna konferencja EuroPython odbędzie się w Birmingham. Sprawdziłem sobie dzisiaj, jak tam się dostać i nie jest tak źle, latają tam 2 tanie linie lotnicze (bmibaby i norwegian), więc podróż nie powinna być szczególnie kosztowna. O reszcie konferencji trudno mi się wypowiedzieć, ale ceny noclegów nie były szczególnie niskie (£35 za pokój to sporo więcej, niż 150Lt...).

EuroPython 2008, dzień 2

Wczoraj nie zrobiłem wielu zdjęć, bo byłem zajęty aspektem socjalnym konferencji. Tym niemniej, kilka jest. Z dziś (dzień 3 i ostatni) nie będzie, ponieważ rozładował mi się akumulator w aparacie i tyle tego było.

EuroPython 2008, dzień 2

Zdjęcia z wczoraj (EuroPython 2008, dzień 1)

Wczoraj nie natrzaskałem aż tyle, co w niedzielę, ale to głównie z powodu tego, że pół dnia spędziłem w hotelu na prelekcjach. Co nie przeszkodziło nam przewędrować prawie całą wileńską starówkę w poszukiwaniu Ostrej Bramy (nie znaleźliśmy jej, chociaż przez większość czasu kręciliśmy się w promieniu 200-300 metrów od niej).

EuroPython 2008, dzień 1

Kilka zdjęć

Kupiłem aparat Zorkę 5 i zrobiłem kilka zdjęć. Na początek zdjęcia z dnia 0 konferencji EuroPython 2008 w Wilnie, czyli z niedzieli. Przyjechaliśmy, zjedliśmy kolację, zameldowaliśmy się w hotelu i grzecznie poszliśmy spać.

EuroPython 2008, dzień 0

Jutro rano — kolejna porcja zdjęciówek, tym razem z dnia 1 (czyli z dziś).

Szok! Python wyszedł z ubikacji!

Tytuł i zdjęcie mówią same za siebie...

EuroPython 2008, dzień pierwszy się zaczyna

Jak nigdy, przyszedłem do hotelu z konferencją punktualnie. Wziąłem moją karteczkę rejestracyjną i podreptałem na prelekcję naszego kolegi z pokoju, Marcina Kaszyńskiego. Po odrobieniu obowiązku towarzyskiego, zaczyna się teraz samo mięcho konferencji, czyli część społeczna. ;)

Jedyne do czego mogę mieć uwagi to sieć, zarówno hotelowa (za darmo, wolna) jak i publiczna (płatna, zazwyczaj nie działająca) są marnej jakości. Nie wiem, czego się spodziewałem...

Minął tydzień

Minął pierwszy tydzień mojej pracy w re:define. Zaczęło się w poniedziałek leniwie, a zakończyło dziś sprintem, gdy w około 5 godzin zrobiliśmy aplikację. Klient do tego stopnia nie wierzył w to, że nam się uda, że przed planowanym wdrożeniem w niedzielę nawet nie przygotował szaty graficznej dla serwisu... :)

Dojazd do nowej pracy mam koszmarny, ale jakoś to przeżyję. Gorzej, że nie ma tam w pobliżu żadnej przemawiającej do mnie knajpy, w której moglibyśmy się spotykać.

W niedzielę obieram kierunek na północny wschód

Znaczy: do Wilna, tak jak rok temu na EuroPython. Tym razem wybieramy się w większym towarzystwie, a jak podejrzewam reprezentacja Polski też będzie liczniejsza, niż w ubiegłym roku.

Do zobaczenia w Wilnie!