Uwaga, blog przeniesiony

Posty na tym blogu już nie będą się pojawiać. Zapraszam gorąco pod nowy adres: blog.grzegorzpawlik.com



Subskrybuj ten blog...

środa, 15 października 2008

O współczesnej ekonomii

http://www.polityka.pl/rynek-w-cuglach/Lead33,1150,270751,18/

Pod tym linkiem znajdziecie wywiad pana Jacka Żakowskiego z Edmundem S. Phelpsem. Artykuł jest ciekawym głosem w ogólnej wrzawie wywołanym aktualnym kryzysem (wg niektórych finansowym, wg innych już gospodarczym, czy nawet globalnym).
Warto przeczytać nawet- a właściwie w szczególności- wtedy, gdy jedyna wiedza o ekonomii to ta czerpana z dzienników goniących za sensacją i polityków-ekonomów-hobbystów ;)

Gorąco polecam

poniedziałek, 6 października 2008

Nam obiektowo pisać (nie) kazano...

... czyli co się dzieje, kiedy ktoś kto nie wie dlaczego się używa kodu obiektowego, pisze takowy bo musi.
Jest sobie jedna, bardzo wazna metoda w bardzo ważnej klasie, w bardzo ważnym projekcie. Ciągnie się od linii 484 do majaczącej na horyzoncie (i zdecydowanie poza ekranem) linii 745.
Jest w niej o wiele za dużo. Sprawdza czy dane są poprwane, zlicza, podlicza, zapisuje do bazy - sprawdza czy dobrze zapisało, w razie czego robi rollback. Do tego na koniec wysyła maila.
No i bach! Okazało się, że w mailu trzeba wysłać jedną dodatkową informację i jak jej teraz szukać. Tak bardzo chciałbym mieć tą funkcję zrefaktorowaną. Nie mieć zagnieżdżeń, tylko ciąg wywołań prywatnych metod:
$this->zrobTo();
$this->zrobTamto();
$foo = $this->znajdzToITamto($bar);
...
$this->wyslijMaila($dane, $temat, $inneDane);

I tylko w trzech kropkach dodać $dane = array_merge($dane, $foo), albo coś równie banalnego. Ale nie. Najpierw 5 minut na znalezienie gdzie ten cholerny mail jest wysyłany. 10 na zlokalizowanie tablicy z której dane trzeba dołączyć do maila. Potem z 20 minut na poprawki + sprawdzanie czy wsztstko jest tak jak powinno.
No i to nieodparte poczucie. Ten szept na ramieniu mówiący "Możesz być pewien, że w kodzie od teraz masz jedną dziurę więcej (buahahahaha)".

Ale patrzę na motto tego bloga i myślę sobie - trzeba sobie radzić ze swoim kodem...

Co się dzieje, gdy dane są nie tylko w bazie?

Z tym problemem często spotykam się w pracy.

Standardowe zagadnienie - klient chce wrzucać obrazki na stronę, a my ze względu na bazę zapisujemy je jako pliki, a w bazie co najwyżej ścieżkę do niego.
No i niestety przeniesienie systemu na inny serwer (np. produkcyjny) to, oprócz kopiowania kodu i bazy, przenoszenie multimediów, które nie zawsze jest miłe i przyjemne.

Dlatego od jakiegoś czasu chodzi mi po głowie pewna koncepcja, która ten problem mogłaby rozwiązać.
Otóż pliki binarne, podczas uploadu należało by jednak zapisać w bazie. Do tego należałoby opracować komponent, który w przypadku żądania obrazka o id = 1 sprawdziłby odpowiedni katalog i po znalezieniu go - zwrócił jako odpowiedź. Z kolei przy jego braku w systemie plików - utworzył takowy na podstawie danych w bazie i w standardowy sposób zwrócił plik jako odpowiedź.

Świetnie by się do tego nadawały cake'owe behaviors. Do tego można by go sprząc z jeszcze jedną funkcjonalnością- plik mógłby być w bazie zapisywany (w razie podmiany zawartości) za każdym razem pod inną nazwą (np. id_kolejny_numer_wersji). Dzięki temu możnaby tym plikom ustawić nagłówki Expire z odległą przyszłością i korzystać z dobrodziejstw bufora przeglądarek...

czwartek, 2 października 2008

HP DeskJet 930c

W zasadzie nie piszę o sprzęcie jako takim, bo mnie on nie interesuje. Jednak muszę wyrazić mój zachwyt nad drukarką, którą niegdyś, za ciężkie pieniądze, kupił mój Tato (było to jakies 7 lat temu, gdzieś pod koniec liceum).
Nigdy na nią nie narzekałem (chyba, że napełniałem tusz samodzielnie), zawsze wydruki były świetnej jakości. Jednak to co przed chwilą zaszło totalnie mnie zaskoczyło.

Otóż nie uzywałem jej jakies 1,5 roku. Nic z nią nie robiłem oprócz przewożenia po różnych częściąch Krakowa przy okazji kolenych przeprowadzek i chowania jej w jakieś głębokie czeluście szafy.

Od jakiegoś czasu nosiłem się z zamiarem reanimowania jej. Odkładałem to co chwilę, gdyż spodziewałem się prawdziwej katorgi.
Po pierwsze nie miałem pojęcia czy pod Suse będą jakiekolwiek sterowniki.
Jeśli będą - pewnie dysze są tak saschnięte, że trzeba będzie je przeczyścić - jak włączę tą opcję pod Linuksem (muszę przyznać, że ten system, choć znam coraz lepiej - zawsze potrafił mnie zaskoczyć na przykład: http://webbricks.blogspot.com/2008/09/suse-11-subclipse-i-subversion-15.html)
I jeśli uda mi się ją odnaleźć- samoczyszczenie pewnie nie wystarczy i trzeba będzie zacząć zabawę z wilgotnymi husteczkami i czyszczeniem dysz.

Z takim nastawieniem wycieram warstewkę kurzu i szukam na stryszku kabli.
Podłączam...
Bang! System wykrył urządzenie, czy chcę skonfigurować?
Pytanie. Oczywiście!
Pierwszy test - druk maila z thunderbirda. Pierwszy zawód. Drukarka wypluwa kilka stron, a na każdej jedna linijka dziwnych znaków. Nie zrażam się jednak, przypomina mi się, ze w menu Suse widziałem jakiegoś managera hp. Odnajduję, włączam.
On mi mówi, że nie ma drukarek i że mam kliknąć "Konfiguruj". Robię to ochoczo! Konfiguracja jest kilkuetapowa, w każdym mam dokonać wyboru z pośród jednej opcji :D To lubię - nie obawiam się, że coś zchrzanię - po prostu nie mam wyboru.
Drukuję stronę testową i...
Moim oczom ukazuje się tekst ostry jak ŻYLETA! Serio. Jakbym kupił czarny kartridź wczoraj w sklepie. W prawdzie kolor coś nie chce wychodzić, ale co tam - jeszcze nie próbowałem uruchomić czyszczenia dysz, ani kalibracji!
Właśnie się za to zabieram... jestem dobrej myśli...

ps. Kilkukrotnie, gdy w przeszłości kupowałem, czy chociaż pytałem o kartridże do HP930C sprzedawcy mówili "dobra drukarka, niech pan się jej nie pozbywa". Mieli rację.

środa, 1 października 2008

Czego brakuje frameworkowi cakePHP?

Jakiś czas temu zetknąłem się z frameworkiem Django dla języka Python. Oprócz samego języka, który jest zdecydowanie bardziej nowoczesny w Django szczególnie urzekła mnie jedna rzecz.
Chodzi o sposób definiowania struktury dla bazy danych. Otóż w Django odbywa się to tylko w jednym miejscu - w plikach modeli.

Dlaczego jest to takie fajne? Posłużę się antyprzykładem z cakePHP.
Wyobraź sobie, że masz projekt i zarządzasz jego wersjami za pomocą popularnego SVN, czy CVS. Najczęściej pracujesz na lokalu i we wczesnych fazach projektu to dodasz pole w bazie danych w jakimś miejscu, do zmienisz indeks. Robisz commit kodu, który na nowej strukturze działa dobrze, ale struktura bazy danych nie podlega wersjonowaniu.
Zatem albo musisz zrobić eksport struktury do pliku który jest wersjonowany, albo (jak często odbywa się to w moich projektach) - robisz zmiany na pewnej głównej i ogólno dostępnej bazie (co by reszta mogła sobie ściągnąć nową wersję).

Pierwsze rozwiązanie sprawia, że przybywa Ci pracy. Wiem, że to nie dużo, ale zawsze jedna dodatkowa rzecz o której musisz pamiętać. A w przypadku gdy commit zrobiłeś po tygodniu pracy, bo wcześniej cały system się sypał - możesz zapomnieć o takich szczegółach jak dodanie pola na początku.
W przypadku jest jeszcze gorzej. Oprócz problemów opisanych powyżej dochodzi niebezpieczeństwo usunięcia całej bazy, brak możliwości powrotu z bazą do wcześniejszej wersji.

Z kolei w django możesz zapomnieć o phpMyAdminie i innych. Całą strukturę bazy danych masz zdefiniowaną w modelu i jednym poleceniem synchronizujesz jej wersję w silniku bazy z definicją w modelu.

Oczywiście do podejścia trzeba się przyzwyczaić.  W cake'u trzymając się konwencji wszystkie modele mogą wyglądać tak:
class TabelaWFormieLiczbyPojedynczej extends AppModel {};
W django - to co nie istnieje w modelu - nie istnieje w bazie.

Ciekaw tylko jestem jak to się sprawdza przy nietypowych sytuacjach, które nieraz wymagają nieco karkołomnych konstrukcji w projekcie bazy danych i specyficznych zapytań sql. Moja znajomość samego Django jest na ten moment za mała, żeby odpowiedzieć na to pytanie.

Uwaga! blog przeniesiony

Posty na tym blogu już nie będą się pojawiać. Zapraszam gorąco pod nowy adres: blog.grzegorzpawlik.com
Komentowanie artykułów możliwe jest pod nowym adresem.