Prawa Murphy'ego jako narzędzie warsztatowe
Prawa Murphy’ego znane sią chyba każdemu, także osobom nietechnicznym, od dobrych dwóch dekad. W tym krótkim wpisie przytoczę kilka “praw”, które zazwyczaj traktowane z przymrużeniem oka, są podstawą rzemiosła profesjonalisty, a szczególnie administratora lub wdrożeniowca.
Stosując metodykę DevOps, a nawet ograniczając się tylko do samego continuous delivery lub continuous deployment, istotnym czynnikiem jest zapewnienie jakości. Przeprowadzając wszelakie operacje w środowiskach produkcyjnych istnieją dwie naczelne zasady: możliwie najkrótszy downtime (lub zero downtime) oraz niedopuszczanie do wprowadzania wadliwych wersji.
Migracje struktur baz danych w Django
Nie tak dawno temu wielu zarzucało Django , że w przeciwieństwie do Railsów nie posiada wbudowanego rozwiązania umożliwiającego wersjonowanie i modyfikowanie struktur bazodanowych. Niedługo po tym pojawił się South - dosyć obiecujące rozwiązanie, które oczywiście szybko przygarnąłem do projektów. Z czasem jednak okazało się, że architektura tego rozwiązania ma szereg wad.
Na południe
Podstawowym problemem a zarazem zaletą South jest związek migracji z aplikacjami Django . To poszczególne aplikacje są “dostawcami” migracji. Ma to na celu umożliwienie łatwiejszego utrzymania reusable apps, których upgrade w projektach był bez South bardzo trudny - wymagał poznania zmian struktury i własnoręcznego przygotowania skryptów SQL . O ile było to mozolne ale do zrobienia, to ustalenie migracji danych nie sposób było odtworzyć. Dzięki South sprawa się uprościła.
RQ - alternatywa dla Celery Task Queue?
Celery
Celery
był obiecującym pakietem umożliwiającym kolejkowanie i asynchroniczne wykonywanie zadań, oraz w pewnym stopniu rozproszenie systemu. Kiedyś udało mi się nawet pracować z w miarę stabilną wersją, lecz wskutek błędu związanego z task.retry
zostałem zmuszony poszukać rozwiązania w upgrade pakietu. Obecnie major release Celery
nosi numer 3 i niestety niewiele się zmieniło w kwestii stabilności.
Autor pakietu, Ask Solem, ma łeb na karku ale wziął sobie na niego za dużo projektów. Mam wrażenie, że facet już nad tym nie panuje. Celery opiera się na jego dwóch innych produktach: Kombu
i Billiard
. Kombu zastępuje kilka starszych pakietów (również jego autorstwa). Billiard zastępuje standardowy multiprocessing
(autor chciałby, aby kiedyś znalazł się w dystrybucji Pythona). Niestety Billiard
również jest delikatnie zmaszczony
.
Co boli MVC
Prowadziliśmy swego czasu dyskusje o logice biznesowej i szukaliśmy rozwiązania starając się znaleźć jej miejsce w MVC . Stosując bowiem ten paradygmat logika naturalnie “rozmywa się” po kontrolerach i modelach (ekstremiści wstawiają ją nawet do widoków). Typowy przykład złego podejścia to kiepskie implementacje ORM (Propel - PHP , DjangoORM - Python ):
class User(Model):
def save(*args, **kwargs):
pass
W tym przypadku Model
jest jednocześnie persistance managerem i wykonuje operacje, których nie powinien. Prawidłowe podejście to
class UserManager:
def save(self, user):
pass
Który kod łatwiej przetestować? Gdzie znajduje się logika zapisu stanu encji?
Jak postawic sklep
A dyć prosto:
- wybudować,
- wynająć stragan albo blaszak,
- zaopatrzyć się w sznur, dyktę i kilka pustaków; z dykty zrobić blat oparty na pustakach, na sznurze rozwiesić majtki.
Na czym postawić sklep?
- na ulicy,
- na chodniku,
- na głowie.
Sklepu internetowego nie da się postawić. Postawić można natomiast mi piwo.
System e-commerce wdraża się w cały biznes, łącznie ze szkoleniem pracowników. System musi być dostosowany do celów biznesowych pod względem funkcjonalnym a także wydajnościowym. Powinien współpracować z innymi systemami przedsiębiorstwa, powinien być user-friendly, powinien być dobrze napisany, aby go utrzymać. Oczywiście można to wszystko olać i postawić sklep (patrz początek).
Wordpress - schemat bazy danych
Zaiste nasi koledzy po fachu potrafią wycisnąć maksimum z teorii relacyjnych baz danych. Ba! To jest dzieło zasługujące na miano geniuszu!
Jest to fragment bazy danych popularnego bloga Wordpress 3.0. object_id
jest FK jednocześnie do wp_post.ID
oraz wp_link.link_id
(sic!). Całość jeszcze nie wybuchła tylko dlatego, że fizycznie ta relacja NIE ISTNIEJE (istnieje tylko w podświadomości autorów) oraz dlatego, iż selecty z wp_term_relationships
są robione zawsze z joinem do wp_term_taxonomy
.
Symfony 2: pierwsze wrażenia
Nowości w Symfony 2
- PHP 5.3 jako standard i korzystanie z przestrzeni nazw
- Zupełnie nowy kod, zdecydowane odchudzenie klas, czuć lekkość
- Dependency Injection (IoC)
- Events
- Modułowa architektura, nie tylko pod postacią katalogów o nazwie modules/plugin
- Rezygnacja z pluginów jako mikroaplikacji na rzecz Bundles
- Źródła hostowane na GitHub
Bundle 1: Marketing
Prezentacje, konferencje, świetny design stron przemawiają za rewolucyjnością nowego produktu SensioLabs .
Faktycznie, w świecie PHP może być to jakaś rewolucja, ale chyba głównie za sprawą samego PHP 5.3 i namespaces zaciągniętych z “szóstki”. A źrodła Symfony? Ano jak to PHP - trochę Javy trochę C, np. klasy Request/Response w których zaimplementowano tylko akcesory (powstają obiekty o niezmiennym stanie). W Django najważniejsze middleware opierają się na możliwości modyfikacji obiektu Request dodając np. właściwość user. Proste i dziala. W Symfony 2 to nie przejdzie, ubijany jest dynamizm języka programowania.
Vim jako IDE dla programisty Python
Tak kiedyś było
Używałem wielu edytorów programisty. Zaczynałem od dostarczanych wraz z językiem programowania (Amos, BlitzBasic), używałem intensywnie CED-a, później Notatnika, przez jakieś Notatniki+. Był też krótki romans z Pajączkiem ze względu na wsparcie HTML, później używałem Quanty i edytora z Midnight Commandera. Kilka lat temu zachwyciło mnie IDE Microsoft Visual Studio (programowałem nieco w .NET/C#, świetna technologia). Szukałem później pocieszenia instalując Eclipse.
Pewnego spokojnego dnia, gdzieś między zaznaczeniem obszaru tekstu myszą i wciśnięciem Ctrl+C i Ctrl+V zwróciłem uwagę, jak Onjin pisze kod. W zasadzie to nie wyglądało jakby pisał, tylko bezpośrednio przelewał myśli w źródła, wskazując jedynie miejsca docelowe opuszkami z prędkością chyba 200 uderzeń na sekundę.
Symfony forms vs Django forms
Mam okazję pracować z obydwoma frameworkami i mogę je porównać w praktyce. Django zacząłem używać jakieś dwa lata temu, a Symfony nieco wcześniej (od wydania stabilnej wersji 1.0).
Ostatnimi czasy, z braku możliwości upgrade Symfony w projekcie, przeportowałem mechanizm formularzy z wersji 1.1 do 1.0.20.
Piersze wrażenie
Mechanika formularzy w Symfony mocno przypomina newforms z Django . Powszechnie wiadomo, że Fabien jest fanem Django , więc nie zdziwiło mnie zbyt specjalnie, że wzorował się właśnie na nim.