Tag: I3
Migrating from i3wm to Sway
i3 will never support Wayland due to a difference between Xorg and Wayland architecture. Sway is a i3 compatible Wayland server implementation.
Long story short - Wayland is a just protocol, which must be implementend in a compositor/window manager, where Xorg is a X11 display server which can run different window managers top of it.
There is no single common Wayland server like Xorg
Motivation
X11 is being quite old and unsafe protocol, and Xorg is the implementation based on multiple extensions and hacks. Almost nobody wants to support it, and all major desktop environments are slowly switching to Wayland .
Tag: Linux
Migrating from i3wm to Sway
i3 will never support Wayland due to a difference between Xorg and Wayland architecture. Sway is a i3 compatible Wayland server implementation.
Long story short - Wayland is a just protocol, which must be implementend in a compositor/window manager, where Xorg is a X11 display server which can run different window managers top of it.
There is no single common Wayland server like Xorg
Motivation
X11 is being quite old and unsafe protocol, and Xorg is the implementation based on multiple extensions and hacks. Almost nobody wants to support it, and all major desktop environments are slowly switching to Wayland .
Tag: Sway
Migrating from i3wm to Sway
i3 will never support Wayland due to a difference between Xorg and Wayland architecture. Sway is a i3 compatible Wayland server implementation.
Long story short - Wayland is a just protocol, which must be implementend in a compositor/window manager, where Xorg is a X11 display server which can run different window managers top of it.
There is no single common Wayland server like Xorg
Motivation
X11 is being quite old and unsafe protocol, and Xorg is the implementation based on multiple extensions and hacks. Almost nobody wants to support it, and all major desktop environments are slowly switching to Wayland .
Tag: Wayland
Migrating from i3wm to Sway
i3 will never support Wayland due to a difference between Xorg and Wayland architecture. Sway is a i3 compatible Wayland server implementation.
Long story short - Wayland is a just protocol, which must be implementend in a compositor/window manager, where Xorg is a X11 display server which can run different window managers top of it.
There is no single common Wayland server like Xorg
Motivation
X11 is being quite old and unsafe protocol, and Xorg is the implementation based on multiple extensions and hacks. Almost nobody wants to support it, and all major desktop environments are slowly switching to Wayland .
Tag: Atari
Tajemnice Atari 5200
Ciekawa opowieść dr Grabarczyka na temat historii Atari, niekoniecznie dobrych pomysłow i odrobiny “marketing bullshitu” tamtych czasów. Polecam! 😊
Tag: Retro
Tajemnice Atari 5200
Ciekawa opowieść dr Grabarczyka na temat historii Atari, niekoniecznie dobrych pomysłow i odrobiny “marketing bullshitu” tamtych czasów. Polecam! 😊
Tag: Gamedev
Godot introduces Lightmap GI shadowmasking
Today (12 Dec 2024) a lightmap shadowmasking feature , created by BlueCube3310 , was merged to the Godot’s upstream. It means that Godot 4.4 release will bring this feature for everyone. Check Godot blog for upcoming annoucements!
Lightmap shadowmasking
Lightmap Shadowmasking is a technique used in real-time rendering engines (like Unity , Unreal Engine , and now Godot ) to combine baked lighting with real-time shadows for efficient lighting calculations. It helps balance performance and visual fidelity by minimizing the number of real-time light calculations required during gameplay.
Tag: Godot
Godot introduces Lightmap GI shadowmasking
Today (12 Dec 2024) a lightmap shadowmasking feature , created by BlueCube3310 , was merged to the Godot’s upstream. It means that Godot 4.4 release will bring this feature for everyone. Check Godot blog for upcoming annoucements!
Lightmap shadowmasking
Lightmap Shadowmasking is a technique used in real-time rendering engines (like Unity , Unreal Engine , and now Godot ) to combine baked lighting with real-time shadows for efficient lighting calculations. It helps balance performance and visual fidelity by minimizing the number of real-time light calculations required during gameplay.
Tag: Django
Queuing background tasks in Django
RQ and Django-RQ
RQ is a lightweight Python library for managing background tasks. It allows developers to offload time-consuming operations - such as sending emails, processing images, or performing heavy calculations - to background workers. These workers process the tasks asynchronously, improving the performance of your application by keeping the request-response cycle fast and responsive.
DjangoRQ is an integration package that simplifies using RQ with Django . It provides tools for managing task queues, workers, and even a built-in admin interface to monitor tasks.
Django - migracje bazy, które nie zawsze działają
O kiepskim podejściu do migracji schematów baz danych w Django pisałem już w 2014r. Co jakiś czas jednak temat do mnie wraca, gdyż w niektórych projektach używam (niestety) tego rozwiązania. Powody są różne, a główny to “oszczędność czasu”. No bo trudno zaprzeczyć, że automatyczne wygenerowanie plików z migracjami jest wolniejsze od klepania XML-i Liquibase lub plain SQL , prawda? Sam z tego przecież korzystam…
Jednak bywają takie momenty, gdzie zostaję z tymi migracjami w “czterech literach”, gdzie nawet nie dochodzi ani jeden promyk światła. I taką sytuacją jest m.in. usuwanie atrybutu z modelu, co generuje operację RemoveField
.
Kij w mrowisko: Django Sprint 2014, Kraków
15 i 16 lutego 2014 odbył się Django Sprint w Krakowie, na którym najlepsi programiści Python poprawiali błędy Django. A ja zapytuję - po co poprawiać coś, co jest w wielu miejscach źle zrealizowane “by design”?
Oczywiście przesadzam, ale nie mogę oprzeć się krytyce, skoro na prawdę istotne wady Django nie są korygowane a istotne feature requesty są odrzucane za “niezgodność z Django ethos”. Kilka najbardziej irytujących błędów i braków na mojej liście:
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.
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.
Tag: Python
Queuing background tasks in Django
RQ and Django-RQ
RQ is a lightweight Python library for managing background tasks. It allows developers to offload time-consuming operations - such as sending emails, processing images, or performing heavy calculations - to background workers. These workers process the tasks asynchronously, improving the performance of your application by keeping the request-response cycle fast and responsive.
DjangoRQ is an integration package that simplifies using RQ with Django . It provides tools for managing task queues, workers, and even a built-in admin interface to monitor tasks.
Build the API with FastAPI top of Django
Even though these two tools seem to be mutually exclusive, they are not. There is possibility to omit Django’s http server and relay all HTTP traffic to FastAPI’s ASGI application. These are the goals of the new package Django FastAPI Bridge
Wait, isn’t Django too old for FastAPI?
If you type “Django and fastapi” into Google you will get results that are simply misinformation. Speaking gently - they’re outdated or written by persons without an experience (a real plague these days):
Prosty automat skonczony w Python
Na GitHub i PyPI wrzuciłem implementację prostego automatu skończonego https://github.com/marcinn/dsm
Instalacja
pip install dsm
Przykład 1: Stany zamówienia w sklepie
Załóżmy, że mamy do oprogramowania automat stanów zamówienia w sklepie:
Deklaracja
Wystarczy zdefiniować przejścia za pomocą listy krotek ([stan], [wartość], [nowy stan])
, aby automat spełniał swoją rolę.
Deklaracja automatu z przykładu wygląda następująco:
import dsm
class OrderFSM(dsm.StateMachine):
class Meta:
transitions = (
('new', 'accept', 'accepted'),
('new', 'cancel', 'cancelled'),
('accepted', 'mark_ready', 'ready'),
('accepted', 'cancel', 'cancelled'),
('ready', 'send', 'sent'),
('ready', 'cancel', 'cancelled'),
('sent', 'finalize', 'finalized'),
)
initial = 'new'
Symulacja
Kod symulacji:
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?
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.
Tag: Rq
Queuing background tasks in Django
RQ and Django-RQ
RQ is a lightweight Python library for managing background tasks. It allows developers to offload time-consuming operations - such as sending emails, processing images, or performing heavy calculations - to background workers. These workers process the tasks asynchronously, improving the performance of your application by keeping the request-response cycle fast and responsive.
DjangoRQ is an integration package that simplifies using RQ with Django . It provides tools for managing task queues, workers, and even a built-in admin interface to monitor tasks.
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
.
Tag: Anti-Pattern
Tailwind is badly designed
I heard about Tailwind and looking at its documentation I thought there was something wrong with it. At the time I was surprised by the many fragmented classes that had to be set. Now that I look at it more closely, HTML semantics are basically not used, contextual styling is almost non-existent, and instead there are hundreds of CSS classes that have to be repeated with almost every tag. This results in a terribly large HTML source (“HTML bloating”), slows down development (you have to remember and constantly rewrite hundreds of classes), makes documents unreadable. And by having to repeat classes for elements of a certain type Tailwind violates DRY .
Tag: Css
Tailwind is badly designed
I heard about Tailwind and looking at its documentation I thought there was something wrong with it. At the time I was surprised by the many fragmented classes that had to be set. Now that I look at it more closely, HTML semantics are basically not used, contextual styling is almost non-existent, and instead there are hundreds of CSS classes that have to be repeated with almost every tag. This results in a terribly large HTML source (“HTML bloating”), slows down development (you have to remember and constantly rewrite hundreds of classes), makes documents unreadable. And by having to repeat classes for elements of a certain type Tailwind violates DRY .
Tag: Varia
Tailwind is badly designed
I heard about Tailwind and looking at its documentation I thought there was something wrong with it. At the time I was surprised by the many fragmented classes that had to be set. Now that I look at it more closely, HTML semantics are basically not used, contextual styling is almost non-existent, and instead there are hundreds of CSS classes that have to be repeated with almost every tag. This results in a terribly large HTML source (“HTML bloating”), slows down development (you have to remember and constantly rewrite hundreds of classes), makes documents unreadable. And by having to repeat classes for elements of a certain type Tailwind violates DRY .
Django - migracje bazy, które nie zawsze działają
O kiepskim podejściu do migracji schematów baz danych w Django pisałem już w 2014r. Co jakiś czas jednak temat do mnie wraca, gdyż w niektórych projektach używam (niestety) tego rozwiązania. Powody są różne, a główny to “oszczędność czasu”. No bo trudno zaprzeczyć, że automatyczne wygenerowanie plików z migracjami jest wolniejsze od klepania XML-i Liquibase lub plain SQL , prawda? Sam z tego przecież korzystam…
Jednak bywają takie momenty, gdzie zostaję z tymi migracjami w “czterech literach”, gdzie nawet nie dochodzi ani jeden promyk światła. I taką sytuacją jest m.in. usuwanie atrybutu z modelu, co generuje operację RemoveField
.
Kij w mrowisko: Django Sprint 2014, Kraków
15 i 16 lutego 2014 odbył się Django Sprint w Krakowie, na którym najlepsi programiści Python poprawiali błędy Django. A ja zapytuję - po co poprawiać coś, co jest w wielu miejscach źle zrealizowane “by design”?
Oczywiście przesadzam, ale nie mogę oprzeć się krytyce, skoro na prawdę istotne wady Django nie są korygowane a istotne feature requesty są odrzucane za “niezgodność z Django ethos”. Kilka najbardziej irytujących błędów i braków na mojej liście:
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.
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).
Tag: Architektura
Nowy silnik bloga po disasterze
Mój blog zdążył zniknąć z sieci, po tym jak OVH wskutek ich błędu usunęło mój serwer fizyczny. Powodem usunięcia serwera był brak powiadomienia o wyłączeniu usługi, które zawsze przychodzi, i od którego jest 7 dni na uregulowanie płatności i przywrócenie maszyny. Reklamacja została oczywiście odrzucona, a kopii danych nie było.
Ludzie dzielą się na tych, którzy robią backupy i na tych, którzy dopiero zaczną je robić
Robienie backupów nie jest procesem trywialnym. Jest kosztowny, wymaga infrastruktury, zaplanowania, i opracowania procedur odzyskiwania danych.
REST po ludzku
Znalazłem ostatnio dwa ciekawe wpisy traktujące o architekturze REST. Pierwszy z nich jest autorstwa niezastąpionego Martina Fowlera, który ciekawie przedstawił drogę od prostych usług typu RPC aż po podstawy RESTful (ale nie samego REST-a). Zdecydowanie ułatwia przejście od jednej do drugiej koncepcji:

REST Overview
Z kolei drugą perełką jest wpis Ryana Tomayko , programisty GitHuba i Heroku, który wytłumaczył idee RESTful (wirtualnej?) żonie. Niestety środowisko zwolenników ideologii ponad rozsądkiem zaatakowało Ryana i autor usunął artykuł-wywiad (a obecnie cała jego strona nie działa), ale na szczęście (w tym wypadku) Internet zachował jego kopię. Znajdziecie takową wyrenderowaną do PDF oraz na archive.org .
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?
Tag: Cms
Nowy silnik bloga po disasterze
Mój blog zdążył zniknąć z sieci, po tym jak OVH wskutek ich błędu usunęło mój serwer fizyczny. Powodem usunięcia serwera był brak powiadomienia o wyłączeniu usługi, które zawsze przychodzi, i od którego jest 7 dni na uregulowanie płatności i przywrócenie maszyny. Reklamacja została oczywiście odrzucona, a kopii danych nie było.
Ludzie dzielą się na tych, którzy robią backupy i na tych, którzy dopiero zaczną je robić
Robienie backupów nie jest procesem trywialnym. Jest kosztowny, wymaga infrastruktury, zaplanowania, i opracowania procedur odzyskiwania danych.
Headless CMS explained
Jakie są podstawowe różnica między klasycznym CMS a headless CMS?
Tag: Disaster Recovery
Nowy silnik bloga po disasterze
Mój blog zdążył zniknąć z sieci, po tym jak OVH wskutek ich błędu usunęło mój serwer fizyczny. Powodem usunięcia serwera był brak powiadomienia o wyłączeniu usługi, które zawsze przychodzi, i od którego jest 7 dni na uregulowanie płatności i przywrócenie maszyny. Reklamacja została oczywiście odrzucona, a kopii danych nie było.
Ludzie dzielą się na tych, którzy robią backupy i na tych, którzy dopiero zaczną je robić
Robienie backupów nie jest procesem trywialnym. Jest kosztowny, wymaga infrastruktury, zaplanowania, i opracowania procedur odzyskiwania danych.
Tag: Hosting
Nowy silnik bloga po disasterze
Mój blog zdążył zniknąć z sieci, po tym jak OVH wskutek ich błędu usunęło mój serwer fizyczny. Powodem usunięcia serwera był brak powiadomienia o wyłączeniu usługi, które zawsze przychodzi, i od którego jest 7 dni na uregulowanie płatności i przywrócenie maszyny. Reklamacja została oczywiście odrzucona, a kopii danych nie było.
Ludzie dzielą się na tych, którzy robią backupy i na tych, którzy dopiero zaczną je robić
Robienie backupów nie jest procesem trywialnym. Jest kosztowny, wymaga infrastruktury, zaplanowania, i opracowania procedur odzyskiwania danych.
Tag: Ovh
Nowy silnik bloga po disasterze
Mój blog zdążył zniknąć z sieci, po tym jak OVH wskutek ich błędu usunęło mój serwer fizyczny. Powodem usunięcia serwera był brak powiadomienia o wyłączeniu usługi, które zawsze przychodzi, i od którego jest 7 dni na uregulowanie płatności i przywrócenie maszyny. Reklamacja została oczywiście odrzucona, a kopii danych nie było.
Ludzie dzielą się na tych, którzy robią backupy i na tych, którzy dopiero zaczną je robić
Robienie backupów nie jest procesem trywialnym. Jest kosztowny, wymaga infrastruktury, zaplanowania, i opracowania procedur odzyskiwania danych.
Tag: Server
Nowy silnik bloga po disasterze
Mój blog zdążył zniknąć z sieci, po tym jak OVH wskutek ich błędu usunęło mój serwer fizyczny. Powodem usunięcia serwera był brak powiadomienia o wyłączeniu usługi, które zawsze przychodzi, i od którego jest 7 dni na uregulowanie płatności i przywrócenie maszyny. Reklamacja została oczywiście odrzucona, a kopii danych nie było.
Ludzie dzielą się na tych, którzy robią backupy i na tych, którzy dopiero zaczną je robić
Robienie backupów nie jest procesem trywialnym. Jest kosztowny, wymaga infrastruktury, zaplanowania, i opracowania procedur odzyskiwania danych.
Tag: Headless
Headless CMS explained
Jakie są podstawowe różnica między klasycznym CMS a headless CMS?
Tag: Web
Headless CMS explained
Jakie są podstawowe różnica między klasycznym CMS a headless CMS?
Tag: Php
PHP - Fractal of bad design (2024)
W świecie PHP brak istotnych zmian. Hipotetyczne dokumenty księgowe wystawiane 30 lutego wpisują się (niestety) w smutny kanon.
Jest to ciekawy i dość poważny błąd standardowej biblioteki funkcji języka, ponieważ może pozostać niezauważony. Nieistniejąca (nieprawidłowa) data jest bowiem wewnętrznie korygowana bez przerwania przetwarzania błędem lub wyjątkiem. Język zgłasza błąd dopiero wtedy, gdy spróbujemy ustawić dzień powyżej 31.

Równie problematyczny jest brak wyjątków, czyli do tej pory w PHP został zachowany status quo, tj. niespójny error handling (parse error, recoverable error, fatal error, exceptions):
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.
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.
Tag: Api
Build the API with FastAPI top of Django
Even though these two tools seem to be mutually exclusive, they are not. There is possibility to omit Django’s http server and relay all HTTP traffic to FastAPI’s ASGI application. These are the goals of the new package Django FastAPI Bridge
Wait, isn’t Django too old for FastAPI?
If you type “Django and fastapi” into Google you will get results that are simply misinformation. Speaking gently - they’re outdated or written by persons without an experience (a real plague these days):
RESTful JavaScript client w kwadrans
Próbowałem restful.js, próbowałem jQuery REST client, aż ostatecznie dałem sobie spokój. Dla mnie były jakieś trudne/ciężkie w użyciu. A czym powinien być REST client? Cienkim wrapperem na dowolnego klienta HTTP, który gada z dowolnym url-em.
Na własne potrzeby założyłem, że:
- interfejs ma być banalnie prosty w użyciu
- wystarczy obsługa tylko content type application/json
- ma być obsługa nagłówków, także defaultowych (żeby się nie powtarzać)
- dozwolona jest zależność od jQuery (można się tego względnie łatwo wyzbyć)
Powstał prototyp:
REST po ludzku
Znalazłem ostatnio dwa ciekawe wpisy traktujące o architekturze REST. Pierwszy z nich jest autorstwa niezastąpionego Martina Fowlera, który ciekawie przedstawił drogę od prostych usług typu RPC aż po podstawy RESTful (ale nie samego REST-a). Zdecydowanie ułatwia przejście od jednej do drugiej koncepcji:

REST Overview
Z kolei drugą perełką jest wpis Ryana Tomayko , programisty GitHuba i Heroku, który wytłumaczył idee RESTful (wirtualnej?) żonie. Niestety środowisko zwolenników ideologii ponad rozsądkiem zaatakowało Ryana i autor usunął artykuł-wywiad (a obecnie cała jego strona nie działa), ale na szczęście (w tym wypadku) Internet zachował jego kopię. Znajdziecie takową wyrenderowaną do PDF oraz na archive.org .
Tag: Fastapi
Build the API with FastAPI top of Django
Even though these two tools seem to be mutually exclusive, they are not. There is possibility to omit Django’s http server and relay all HTTP traffic to FastAPI’s ASGI application. These are the goals of the new package Django FastAPI Bridge
Wait, isn’t Django too old for FastAPI?
If you type “Django and fastapi” into Google you will get results that are simply misinformation. Speaking gently - they’re outdated or written by persons without an experience (a real plague these days):
Tag: Rest
Build the API with FastAPI top of Django
Even though these two tools seem to be mutually exclusive, they are not. There is possibility to omit Django’s http server and relay all HTTP traffic to FastAPI’s ASGI application. These are the goals of the new package Django FastAPI Bridge
Wait, isn’t Django too old for FastAPI?
If you type “Django and fastapi” into Google you will get results that are simply misinformation. Speaking gently - they’re outdated or written by persons without an experience (a real plague these days):
RESTful JavaScript client w kwadrans
Próbowałem restful.js, próbowałem jQuery REST client, aż ostatecznie dałem sobie spokój. Dla mnie były jakieś trudne/ciężkie w użyciu. A czym powinien być REST client? Cienkim wrapperem na dowolnego klienta HTTP, który gada z dowolnym url-em.
Na własne potrzeby założyłem, że:
- interfejs ma być banalnie prosty w użyciu
- wystarczy obsługa tylko content type application/json
- ma być obsługa nagłówków, także defaultowych (żeby się nie powtarzać)
- dozwolona jest zależność od jQuery (można się tego względnie łatwo wyzbyć)
Powstał prototyp:
REST po ludzku
Znalazłem ostatnio dwa ciekawe wpisy traktujące o architekturze REST. Pierwszy z nich jest autorstwa niezastąpionego Martina Fowlera, który ciekawie przedstawił drogę od prostych usług typu RPC aż po podstawy RESTful (ale nie samego REST-a). Zdecydowanie ułatwia przejście od jednej do drugiej koncepcji:

REST Overview
Z kolei drugą perełką jest wpis Ryana Tomayko , programisty GitHuba i Heroku, który wytłumaczył idee RESTful (wirtualnej?) żonie. Niestety środowisko zwolenników ideologii ponad rozsądkiem zaatakowało Ryana i autor usunął artykuł-wywiad (a obecnie cała jego strona nie działa), ale na szczęście (w tym wypadku) Internet zachował jego kopię. Znajdziecie takową wyrenderowaną do PDF oraz na archive.org .
Tag: Ale
Reducing a mess generated by vim-ale
In case of mess in your editor window, just add this line to your .vimrc
:
let g:ale_virtualtext_cursor = 'disabled'
a mess in vim A mess in VIM (look at these red inline error messages)
The root cause of the issue
Some creative guys thought that mixing warning messages with code makes some sense and increases readability, and someone smart enough implemented it (to the misfortune of mankind).
Tag: Ide
Reducing a mess generated by vim-ale
In case of mess in your editor window, just add this line to your .vimrc
:
let g:ale_virtualtext_cursor = 'disabled'
a mess in vim A mess in VIM (look at these red inline error messages)
The root cause of the issue
Some creative guys thought that mixing warning messages with code makes some sense and increases readability, and someone smart enough implemented it (to the misfortune of mankind).
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ę.
Tag: Tips
Reducing a mess generated by vim-ale
In case of mess in your editor window, just add this line to your .vimrc
:
let g:ale_virtualtext_cursor = 'disabled'
a mess in vim A mess in VIM (look at these red inline error messages)
The root cause of the issue
Some creative guys thought that mixing warning messages with code makes some sense and increases readability, and someone smart enough implemented it (to the misfortune of mankind).
Tag: Vim
Reducing a mess generated by vim-ale
In case of mess in your editor window, just add this line to your .vimrc
:
let g:ale_virtualtext_cursor = 'disabled'
a mess in vim A mess in VIM (look at these red inline error messages)
The root cause of the issue
Some creative guys thought that mixing warning messages with code makes some sense and increases readability, and someone smart enough implemented it (to the misfortune of mankind).
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ę.
Tag: Elasticsearch
Elasticsearch na dobrej drodze
Wersja 6
Wersja 6.0 ElasticSearch jest dla mnie szczególna - twórcy wprowadzają zmiany ułatwiające zarządzanie, ale też rezygnują z dawnych błędów, które krytykowałem na łamach tego bloga.
Każdemu polecam migrację do wersji 6.x. Służę pomocą w migracji z wersji 2.x oraz 5.x.
Aktualizacje ElasticSearch - jak wykonać?
Nie można zaprzeczyć, że ElasticSearch jest rozwijany dynamicznie. Tak szybki rozwój produktu nie zawsze jest oczekiwany, bo albo wdrożenie zostaje (z przyczyn obiektywnych) oparte o zamrożoną (i nie wspieraną) wersję, albo konieczne staje się przeprowadzanie migracji do nowszych wersji. Takie operacje trzeba zaplanować, zabudżetować, a na dodatek nie obejdzie się bez downtime i sukcesem jest, gdy przerwa techniczna jest relatywnie krótka.
ElasticSearch nie taki elastyczny
Oryginalny tekst datowany jest na 4.11.2015, a uzupełniony w lipcu 2016
ElasticSearch jest takim samym systemem wyszukiwania, jak każdy inny powstały w przeciągu ostatnich kilkudziesięciu lat. Indeks ma sztywną strukturę i nic tego nie zmieni. Jedyna różnica polega na tym, że tenże indeks jest modyfikowany w locie / w tle, co niesie za sobą sporo, czasem przykrych konsekwencji, choć na początku może wydawać się to świetnym pomysłem.
Nie-typy, czyli “mappingi”
ElasticSearch posiada tzw. “mappingi” . Niektórzy mogą uważać, że są to typy indeksowanych dokumentów. Słowo “typ” z resztą pada w dokumentacji. Ale to nie są typy. Są to elementy grupujące kolumny indeksu w pewne logiczne klasy , które mogą posłużyć jako dodatkowy filtr lub zbiór definicji o analizerach i tokenizerach, oraz mogą mieć znaczenie wydajnościowe (operujemy na jakimś podzbiorze). Można je porównać do widoków znanych z [RDBMS].
Tag: Elk
Elasticsearch na dobrej drodze
Wersja 6
Wersja 6.0 ElasticSearch jest dla mnie szczególna - twórcy wprowadzają zmiany ułatwiające zarządzanie, ale też rezygnują z dawnych błędów, które krytykowałem na łamach tego bloga.
Każdemu polecam migrację do wersji 6.x. Służę pomocą w migracji z wersji 2.x oraz 5.x.
Aktualizacje ElasticSearch - jak wykonać?
Nie można zaprzeczyć, że ElasticSearch jest rozwijany dynamicznie. Tak szybki rozwój produktu nie zawsze jest oczekiwany, bo albo wdrożenie zostaje (z przyczyn obiektywnych) oparte o zamrożoną (i nie wspieraną) wersję, albo konieczne staje się przeprowadzanie migracji do nowszych wersji. Takie operacje trzeba zaplanować, zabudżetować, a na dodatek nie obejdzie się bez downtime i sukcesem jest, gdy przerwa techniczna jest relatywnie krótka.
Tag: Ethos
Django - migracje bazy, które nie zawsze działają
O kiepskim podejściu do migracji schematów baz danych w Django pisałem już w 2014r. Co jakiś czas jednak temat do mnie wraca, gdyż w niektórych projektach używam (niestety) tego rozwiązania. Powody są różne, a główny to “oszczędność czasu”. No bo trudno zaprzeczyć, że automatyczne wygenerowanie plików z migracjami jest wolniejsze od klepania XML-i Liquibase lub plain SQL , prawda? Sam z tego przecież korzystam…
Jednak bywają takie momenty, gdzie zostaję z tymi migracjami w “czterech literach”, gdzie nawet nie dochodzi ani jeden promyk światła. I taką sytuacją jest m.in. usuwanie atrybutu z modelu, co generuje operację RemoveField
.
Kij w mrowisko: Django Sprint 2014, Kraków
15 i 16 lutego 2014 odbył się Django Sprint w Krakowie, na którym najlepsi programiści Python poprawiali błędy Django. A ja zapytuję - po co poprawiać coś, co jest w wielu miejscach źle zrealizowane “by design”?
Oczywiście przesadzam, ale nie mogę oprzeć się krytyce, skoro na prawdę istotne wady Django nie są korygowane a istotne feature requesty są odrzucane za “niezgodność z Django ethos”. Kilka najbardziej irytujących błędów i braków na mojej liście:
Tag: Fsm
Prosty automat skonczony w Python
Na GitHub i PyPI wrzuciłem implementację prostego automatu skończonego https://github.com/marcinn/dsm
Instalacja
pip install dsm
Przykład 1: Stany zamówienia w sklepie
Załóżmy, że mamy do oprogramowania automat stanów zamówienia w sklepie:
Deklaracja
Wystarczy zdefiniować przejścia za pomocą listy krotek ([stan], [wartość], [nowy stan])
, aby automat spełniał swoją rolę.
Deklaracja automatu z przykładu wygląda następująco:
import dsm
class OrderFSM(dsm.StateMachine):
class Meta:
transitions = (
('new', 'accept', 'accepted'),
('new', 'cancel', 'cancelled'),
('accepted', 'mark_ready', 'ready'),
('accepted', 'cancel', 'cancelled'),
('ready', 'send', 'sent'),
('ready', 'cancel', 'cancelled'),
('sent', 'finalize', 'finalized'),
)
initial = 'new'
Symulacja
Kod symulacji:
Tag: Client
RESTful JavaScript client w kwadrans
Próbowałem restful.js, próbowałem jQuery REST client, aż ostatecznie dałem sobie spokój. Dla mnie były jakieś trudne/ciężkie w użyciu. A czym powinien być REST client? Cienkim wrapperem na dowolnego klienta HTTP, który gada z dowolnym url-em.
Na własne potrzeby założyłem, że:
- interfejs ma być banalnie prosty w użyciu
- wystarczy obsługa tylko content type application/json
- ma być obsługa nagłówków, także defaultowych (żeby się nie powtarzać)
- dozwolona jest zależność od jQuery (można się tego względnie łatwo wyzbyć)
Powstał prototyp:
Tag: Javascript
RESTful JavaScript client w kwadrans
Próbowałem restful.js, próbowałem jQuery REST client, aż ostatecznie dałem sobie spokój. Dla mnie były jakieś trudne/ciężkie w użyciu. A czym powinien być REST client? Cienkim wrapperem na dowolnego klienta HTTP, który gada z dowolnym url-em.
Na własne potrzeby założyłem, że:
- interfejs ma być banalnie prosty w użyciu
- wystarczy obsługa tylko content type application/json
- ma być obsługa nagłówków, także defaultowych (żeby się nie powtarzać)
- dozwolona jest zależność od jQuery (można się tego względnie łatwo wyzbyć)
Powstał prototyp:
Tag: Programowanie
REST po ludzku
Znalazłem ostatnio dwa ciekawe wpisy traktujące o architekturze REST. Pierwszy z nich jest autorstwa niezastąpionego Martina Fowlera, który ciekawie przedstawił drogę od prostych usług typu RPC aż po podstawy RESTful (ale nie samego REST-a). Zdecydowanie ułatwia przejście od jednej do drugiej koncepcji:

REST Overview
Z kolei drugą perełką jest wpis Ryana Tomayko , programisty GitHuba i Heroku, który wytłumaczył idee RESTful (wirtualnej?) żonie. Niestety środowisko zwolenników ideologii ponad rozsądkiem zaatakowało Ryana i autor usunął artykuł-wywiad (a obecnie cała jego strona nie działa), ale na szczęście (w tym wypadku) Internet zachował jego kopię. Znajdziecie takową wyrenderowaną do PDF oraz na archive.org .
Tag: Webservice
REST po ludzku
Znalazłem ostatnio dwa ciekawe wpisy traktujące o architekturze REST. Pierwszy z nich jest autorstwa niezastąpionego Martina Fowlera, który ciekawie przedstawił drogę od prostych usług typu RPC aż po podstawy RESTful (ale nie samego REST-a). Zdecydowanie ułatwia przejście od jednej do drugiej koncepcji:

REST Overview
Z kolei drugą perełką jest wpis Ryana Tomayko , programisty GitHuba i Heroku, który wytłumaczył idee RESTful (wirtualnej?) żonie. Niestety środowisko zwolenników ideologii ponad rozsądkiem zaatakowało Ryana i autor usunął artykuł-wywiad (a obecnie cała jego strona nie działa), ale na szczęście (w tym wypadku) Internet zachował jego kopię. Znajdziecie takową wyrenderowaną do PDF oraz na archive.org .
Tag: Devops
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.
Tag: Databases
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.
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!

WordPress ERD
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
.
Tag: Liquibase
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.
Tag: Sql
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.
Tag: Background Tasks
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
.
Tag: Celery
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
.
Tag: Logika Biznesowa
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?
Tag: Mvc
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?
Tag: E-Commerce
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).
Tag: Joke
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).
Tag: Sklep
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).
Tag: Wordpress
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!

WordPress ERD
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
.
Tag: Symfony
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.
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.
Tag: Plugin
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ę.