...kiedy muszę pojechać do pracy komunikacją publiczną przekonuje mnie o tym, że przesiadka do samochodu (i nieużywanie komunikacji publicznej) jest najlepszą rzeczą, jaką zrobiłem w tym roku. A bardzo możliwe, że ogóle w moim prywatnym (pozarodzinnym i pozazawodowym) życiu. Syf, ścisk, brak punktualności i rzadkie kursowanie. Z każdą z tych rzeczy można coś zrobić żeby poprawić stan publicznej komunikacji w Warszawie, ale najwyraźniej decydenci mają to w dupie — lepiej jest utrudnić kierowcom prywatnych samochodów życie do tego stopnia, by przesiadka do śmierdzących, zatłoczonych i wiecznie spóźnionych autobusów okazała się mniejszym złem (od: stania w korkach, braku miejsca do zaparkowania auta, wysokim opłatom parkingowym, itd.).
To jest szantaż. I ja mu nie ulegnę.
No, byłem. Co do konferencji jako takiej to wolę się nie wypowiadać, ale wnioskuję, że nie byłem jej targetem — był może jeden wykład, na którym dowiedziałem się czegoś nowego i jeden, który obejrzałem dla przyjemności. Aspekt społeczny w pewnym stopniu został zaspokojony przez bratanie się z kolegami z Allegro.pl. Infrastrukturę (dostęp do sieci, wyżywienie, zakwaterowanie, napoje, przekąski) pominę milczeniem. W końcu też w niedzielę dałem spicz i odniosłem wrażenie, że pomimo pewnych problemów technicznych się podobał. Czyli: pod względem merytorycznym niejaki sukces.
Dla uzupełnienia:
-
prezentacja do obejrzenia/ściągnięcia jest na SlideShare
-
kod w takiej wersji, jaka była prezentowana, jest na BitBucket
Jeżeli czas pozwoli, to skrobnę też jakiś artykuł na podstawie tego, co zostało powiedziane.
Megiteam.pl w swoich dokumentach pomocy proponuje jeden sposób na oddzielenie swojego środowiska Pythona od systemowego, a także na ustalenie wersji Pythona, z jaką ma być uruchamiana aplikacja. Metodą prób i błędów doszedłem do innego, jak mi się wydaje także lepszego, sposobu na osiągnięcie tego celu.
Virtualenv na pomoc
Virtualenv to obecnie najpopularniejszy sposób na wirtualizację środowiska uruchomieniowego aplikacji. Mocno korciło mnie, by go wykorzystać do oddzielenia środowiska aplikacji od Pythona dostarczanego przez Megiteam.pl i w końcu się udało. Potrzebny będzie do tego plik virtualenv.py z dystrybucji źródłowej virtualenv. Kopiujemy go sobie w jakieś poręczne miejsce, np. do ~/.. Potem już idzie normalnie:
~$ mkdir v
~$ python2.5 virtualenv.py v/chrzczone
New python executable in v/chrzczone/bin/python2.5
Also creating executable in v/chrzczone/bin/python
Installing setuptools................done.
~$ cd v/chrzczone/
~/v/chrzczone$ bin/easy_install -U -Z psycopg2 \
Django pytz Babel BabelDjango \
django-registration django-tagging-ng \
django-pagination
Po kilku minutach mamy już swoje środowisko w katalogu $HOME/v/chrzczone. Pozostaje tylko ustawić aplikację tak, żeby wiedziała kto tu rządzi. Do tego służy plik .environment w katalogu aplikacji. Oto jak on wygląda w mojej przykładowej aplikacji o nazwie "chrzczone":
PATH=$HOME/v/chrzczone/bin:/usr/local/python2.5/bin:$PATH
PYTHONPATH=$HOME/v/chrzczone/lib/python2.5/site-packages:/usr/local/python2.5/lib/python2.5/site-packages
Wszystko w tym momencie powinno działać, ponieważ pliki .environment są dołączane kaskadowo i zmienne zdefiniowane w nich nadpisują zdefiniowane wcześniej. Ale jest również lepsza (mniej podatna na błędy) metoda osiągnięcia tego samego — żeby wszystko zagrało wystarczy, że plik .environment będzie zawierał tylko jedną linijkę:
source $HOME/v/chrzczone/bin/activate
(dzięki, Eluś, masz u mnie piwo w Ustroniu).
Ale po co to wszystko?!
A choćby po to, żeby łatwiej można było tym zarządzać, np. przy robieniu deploymentu przy użyciu Pavera. Virtualenv obecnie staje się standardową metodą zapewniania rozdzielności środowisk uruchomieniowych Pythona, dającym tyle izolacji, ile się chce. Jest wygodne i bardzo upraszcza obsługę takiego zwirtualizowanego środowiska, zwalniając z konieczności ręcznego ustawiania zmiennych środowiskowych — wystarczy zaimportować w powłoce skrypt aktywujący środowisko i wszystko jest na swoim miejscu. A jeżeli używa się virtualenvwrapper to rzeczy proste stają się jeszcze prostsze (workon, mmm...).
Zamierzam trochę pozmieniać konfigurację uruchamiania tego serwisu (a przy okazji może dorobię się ciut wygodniejszego deploymentu, do ponownego wykorzystania), więc w ciągu kilku najbliższych dni można się spodziewać niespodziewanych przerw w działaniu.
Expect unexpected, but prepare for better.
Po raz kolejny BitBucket poszedł w pioch. I kolejne tłumaczenia, że to nie ich wina, że to Amazon skrewił. Symptomatyczne i typowe dla Web2.0 — na codzień będziemy się puszyć, jacy to my fajni jesteśmy i nowocześni, ale jak coś się sypie, to słychać tylko skamlenie.
Again, this is not our fault, and we have to wait for Amazon to fix this. They've been alarmed, and we've forked out for a "Gold plan" support subscription, so they can act as quickly as possible.
Skoro już wiadomo, że to Amazon skrewił (a nie jest to pierwszy raz), to jaki jest plan B? Jak się okazuje, planu B nie ma, oprócz pomiaukiwania na Twitterze i mglistych obietnic, że przeniosą się do innej chmury (co samo w sobie nie jest rozwiązaniem, bo problem leży gdzie indziej). Gdy kilka miesięcy temu BitBucket zniknął z sieci na kilkanaście godzin także za sprawą jakiegoś padu usług AWS, można się było spodziewać, że właściciele BB podejmą jakieś kroki, żeby mieć wyjście awaryjne na wypadek powtórzenia się scenariusza. Z częstotliwości komunikatów o różnych awariach chmur można wywnioskować, że jest to zjawisko immanentne, więc wypadałoby na wypadek awarii mieć jakieś rozwiązanie zastępcze. Tak zrobiłby każdy, kto poważnie traktuje swoje źródło dochodów, ale jak widać panowie od BitBucket nie traktują poważnie swoich klientów, którzy płacą na ich rachunki za prąd, wodę i mieszkanie. Cieszę się, że nie jestem jednym z tych pechowców. Czy też może, mając na względzie historię awarii BB, frajerów.
Już nawet nie chodzi o to, że ktoś nie może się dobrać do swojego kodu na BB. Nie chodzi też o to, że spora część kodu F/OSS nie jest dostępna, to w końcu nie koniec świata. Chodzi o to, że ludzie nie biorą odpowiedzialności za to, co oferują innym za pieniądze. W razie problemów kryją się za gówniarskim "to nie my, to oni!" i nie są w stanie powiedzieć otwarcie, że nie umieją się uczyć nawet na swoich własnych błędach (o cudzych nie wspominając).
Każda awaria jest kosztowna. Mam nadzieję, że właściciele BB poczują to wreszcie na własnej skórze.
Pozwolę sobie trochę ponarzekać. Nie będzie to takie narzekanie, jak mojego sąsiada, osiadłego w Polsce Bułgara, chociaż temat ten sam — polskie drogi.
Przejechałem się dzisiaj w te i nazad do Warki. Droga do tej pięknej położonej malowniczo nad Pilicą miejscowości jest zasadniczo dobra: najpierw kawałek dwójką, potem siedemnastką, potem pięćdziesiątką i pod koniec kawałek jakąś drogą wojewódzką. Wiadomo, jak się jeździ — tak, żeby było szybko i bezpiecznie. Akurat tę trasę pokonuje się bardzo przyjemnie, ale tylko do momentu... skrzyżowania! Nie wiadomo jaka mądra głowa wpadła na pomysł, żeby np. skrzyżowanie dróg nr 17 i 50 zrobić w postaci ronda (i pozostałe z rozpędu też). Jak wiadomo, rondo służy poprawie bezpieczeństwa i płynności ruchu, ale nie wtedy, gdy na krzyżujących się drogach natężenie jest takie samo, a ruch odbywa się głównie na wprost. Wpływ na bezpieczeństwo jest taki, że objeżdżając wyspę trzeba odpowiednio zredukować prędkość, przez co ewentualne kolizje są mniej groźne w skutkach.
A jak to wygląda na tych kilku rondach na tej trasie? Dla ustalenia uwagi weźmiemy sobie wspomniane wcześniej rondo w miejscowości Kołbiel, na skrzyżowaniu dróg krajowych 17 i 50, ale pozostałe na tej trasie (czyli w sumie wszystkie skrzyżowania dróg krajowych i wojewódzkich!) prezentują się tak samo. Droga krajowa nr 17 to główna trasa z Warszawy na Ukrainę przez przejście w Hrebennem, a DK 50 to trochę dziwna droga łącząca m.in. wschodni odcinek DK 8/S8 (czyli szlaku na Litwę i Białoruś) z południową częścią DK 7/S7 (szlaku północ–południe). Ruch na tych obu trasach jest bardzo duży, a ciężarówki ciągną się tam długimi kolumnami. Przed tym rondem we wszystkich kierunkach korek zaczyna się 1.5-2km wcześniej. Tempo jest ślimacze, ponieważ ruszenie wielką, kilkudziesięciotonową ciężarówką wymaga nieco więcej czasu, niż ważącym niecałe 1.2t samochodem osobowym — zanim kierowca takiego wielkiego camiona wepchnie go na to rondo, mija ze 20 sekund (w tym czasie ze 2 samochody osobowe zdążyłyby wjechać i zjechać). I dlatego stoją wszyscy po równo. I nie ma litości dla tych, którzy tylko skręcają w prawo.
O ile ronda sprawdzają się doskonale na drogach o mniejszym natężeniu ruchu (jak np. doskonale wymyślone i zrobione rondo w Zielonce na skrzyżowaniu DW 637 i 634), to przy takim ruchu jak w Kołbieli są po prostu wąskimi gardłami. No, ale ronda są w modzie i przecież podnoszą bezpieczeństwo.