Jul 06 2006
Patterns For PHP
Filed under PHP,Wiadomości by Łukasz Dywicki
Przedruk z devzone – wiki z przykładowymi implementacjami wzorców projektowych w PHP.
http://patterns.quantum-star.com/index.php/Main_Page
Pragmatyzm kontrolowany
Some of posts from this blog has been moved to dywicki.pl. You will be automatically redirected to new blog if you would submit comment.
New posts are published on dywicki.pl, this blog contains old content and it is not continued.
Niektóre posty z tego bloga zostały przeniesione do dywicki.pl. Zostaniesz automatycznie przekierowany jeśli bedzięsz chciał dodać komentarz.
Nowe posty sa publikowane na dywicki.pl, ten blog zawiera stare treści i nie jest kontynuowany.
Jul 06 2006
Filed under PHP,Wiadomości by Łukasz Dywicki
Przedruk z devzone – wiki z przykładowymi implementacjami wzorców projektowych w PHP.
http://patterns.quantum-star.com/index.php/Main_Page
Jul 05 2006
Filed under PHP by Łukasz Dywicki
Bez żadnej pętli. :) Czy ktoś zna krótszy zapis nie korzystający z zewnętrznych funkcji?
< ?php $target = array_combine(array_map('strtolower', array_keys($target)), array_values($target)); ?>
Jul 03 2006
Filed under Wiadomości by Łukasz Dywicki
Zwykle, kiedy potrzebujemy zmienną ilość wartości, które są w tablicy używamy pętli. Da się jednak obejść. Dzisiejszego dnia trafiłem na zadanie, które polegało na pobraniu fragmentu tablicy. Tablica była wierszem z bazy danych, który był wynikiem złączenia kilku tabel a ja chciałem pobrać wartości tylko dla określonej tabeli. Informacje o tym, jakie klucze mnie interesują miałem zapisane w obiektach metadanych, potrzebowałem tylko odpowiednio okroić wiersz do potrzebnych mi rozmiarów.
Problem rozwiązałem przy użyciu 4 funkcji, w tym 3 funkcji wbudowanych w PHP. Potrzebne były array_uintersect_uassoc, array_flip, strcasecmp. Dodatkowo musiałem zdefiniować 1 funkcje, która dla 2 argumentów zawsze zwraca zero. Musi ona być zgodna z wymaganiami stawianymi przez “comparatory”. Zero musi być zwracane by nie porównywać wartości (wg porównywaczy zero oznacza, że obie wartości są sobie równe).
Linia, która pobiera określone klucze:
< ?php array_uintersect_uassoc($bigArray, array_flip($keysArray), 'alwaysReturnZero', 'strcasecmp'); ?>
Jun 29 2006
Filed under PHP,Wiadomości by Łukasz Dywicki
Oto wpis, wykopany przez kolegę z pracy, na blogu pewnego programisty. Autor piesze, że stworzył łatkę do PHP która pozwala korzystać z podpowiadania dla typów prostych. Więcej :
http://www.derickrethans.nl/typehints_for_scalar_types.php
Jun 28 2006
Filed under PHP by Łukasz Dywicki
Mały konkursik – jak pobrać stałą z klasy..? Kod jest, jedyny problem to to, że nazwa stałej może się zmienić…
< ?php class Foo { const TAK = 'prawda'; const NIE = 'fałsz'; const CHGW = 'a kto go tam wie'; } if($_GET['imie'] == 'Bolek') { // $constant = 'TAK'; } elseif(!empty($_GET)) { // $constant = 'NIE'; } else { // $constant = 'CHGW'; } echo '... wlasnie co ? ..'; ?>
Jun 27 2006
Filed under DB by Łukasz Dywicki
Witam, jakiś czas temu w pracy staneliśmy przed dylematem – którą bazę danych użyć? Dyskusja była długa, w końcu postanowiliśmy przetestować wydajność każdego rozwiązania. Niestety testy niejasności tylko jeszcze bardziej naświetliły.
Pierwszy test, jaki przeprowadziliśmy polegał na wstawieniu 3 milionów rekordów do tabeli, która składała się z 5 kolumn.
-- pgsql CREATE TABLE users ( user_id serial NOT NULL, user_name varchar(45), user_password varchar(32), user_first_name varchar(15), user_last_name varchar(15), CONSTRAINT users_pkey PRIMARY KEY (user_id) )
Identyfikator był numerem iteracji, nie wykorzystałem ani autoincrement w MySQL ani sekwencji w PgSQL. Niestety, troszkę się zagapiłem i nie mam czasów dla MySQL do 1.5 mln wstawień i dla PgSQL do 150 tys. Obrazek prezentujący wyniki po lewej. Czerwony – PgSQL, niebieski MySQL. Na dole powinna być ilość rekordów, które są już w bazie, ale ze względu, że zaczęły one na siebie zachodzić powstawiałem zera. W każdym razie im bliżej prawej tym mniej brakuje do 3 mln. Duże skoki w wykonywaniu insertów były spowodowane wykonaniem zapytania z SELECT COUNT(user_id) FROM users.
Jak widać MySQL wyraźnie wygrywa w tym teście z PgSQL. Średnio czas, który MySQL potrzebuje na wstawienie 10 tys rekordów to 12.2204 s. Gdybym dysponował czasami sprzed 1.5 mln rekordów czas ten mógłby ulce zmniejszeniu. PostgreSQL na wstawienie 10 tys rekordów potrzebuje średnio 14.7962 s.
To nie był koniec testów. Ciekawie zaczęło się robić, gdy trzeba było pobrać dane z tej tabeli. Oczywiście do tego celu napisałem algorytm, który losowo odpytuje tabelę z różnym limitem i offsetem oraz różnie sortuje wyniki. Ciekawi co się stało? Zarówno MySQL jak i PgSQL nie poradziły sobie z takim obciążeniem, Pg nie starczało 400 M wolnego miejsca na dysku, w przypadku MySQL nie było o czym gadać, serwer nawet nie zwrócił informacji o niepowodzeniu czy czymkolwiek tylko stanął. Tzn. pracował w dalszym ciągu stabilnie, ale zapytanie po prostu jakby pominął, nic nie zwrócił i dalej nic nie robił.
Jedynym lekarstwem na ten problem okazały się indeksy. Postanowiliśmy, że na początku zindeksujemy wszystkie kolumny (test bez indeksów w przygotowaniu). O ile dodanie indeksów w Pg to nie był problem, wystarczyło mu jakieś 40-60 minut na wszystkie kolumny o tyle w przypadku My problem już powstał. Serwer stworzył tabelę tymczasową i przez 2h nie dodał żadnego indeksu. Jedynym wyjściem było oczyszczenie tabeli. Niestety serwer po wycofaniu się z indeksów przestał odpowiadać. Po restarcie najpierw spróbowałem DELETE FROM users. Nie był to najlepszy pomysł. Restart. DELETE FROM users LIMIT 10000. Restart. DELETE FROM users LIMIT 1000. Restart. DROP TABLE users. Reset. Żadna z tych operacji nie dała skutku. Dopiero po kolejnym resecie udało mi się usunąć tabelę. Tabelę stworzyłem na nowo, dodałem indeksy i zacząłem dodawać dane na nowo. Tym razem czasy zmierzyłem od początku.
Wynik? Straszny. Czasy zaczęły lecieć na łeb, na szyję. O ile z początku jakoś to się trzymało, to później został przekroczony próg 30 s na 10 tys rekordów, następnie 50 aż doszliśmy do 85 s. Przy 1.5 mln rekordów przerwałem test.
Oprócz testów baz danych przetestowałem również na o wiele mniejszej tabeli (5 kolumn, 10 wierszy, pobranie wszystkich z losowym sortowaniem, 10 tys iteracji) AdoDB i Creole. AdoDB korzystało z PDO, Creole z natywnych funkcji. Nie bierzcie tego testu na poważnie.. Ciąg dalszy testów być może nastąpi. :) Dziękuję firmie Autoguard za pozwolenie na publikację testów.
Jun 26 2006
Filed under Inne,Ogólne by Łukasz Dywicki
Nie da się ukryć, że żyjemy w dziwnym kraju. Nie chcę już pić do tego kto nami rządzi bo to świadomy wybór tej większości, która przeważyła w wyborach, ale do tego jak wyglądają u nas zarobki.
Prawda jest taka, że jeśli chcesz pracować a masz pecha to pozostają 3 wyjścia:
– pracujesz na umowę o dzieło i pracodawca ewentualnie płaci Twoją zaliczkę na podatek dochodowy
– pracujesz po zaniżonych kosztach – to znaczy, masz umowę na 1/4 etatu, zarabiasz 700 zł a resztę otrzymujesz pod stołem.
– pracujesz na czarno i modlisz się o to by nic Ci się nie stało oraz by stosunki z pracodawcą były zawsze jak najlepsze
Czy nie jest to zastanawiające? Co zmusza ludzi do takiej pracy i pracodawców do wystawiania takich ofert?
Koszty. Koszty, które są po prostu horrendalne. Mocno wierzę, że sytuacja się kiedyś zmieni i koszty utrzymania etatu to nie będzie kwota 18,7% wypłaty netto (dla pracownika) i 19,8% tej samej kwoty dla pracodawcy, kiedy składki emerytalne będą faktycznie opłacalne a ubezpieczenie zdrowotne będzie jednakowe dla wszystkich.
O co mi się rozchodzi? A o to, że faktycznie przez te wszystkie opłaty każdy z nas zarabia o wiele mniej co znaczy o wiele za mało. Dla przykładu:
Pracując przez rok czasu na pełnym etacie i zarabiając miesięcznie 2 000 zł brutto – łącznie zarabiam 24 000 zł. Z tego 4 490 zł w ciągu roku zabierane jest mi na ZUS. W tej pokaźnej sumce jest 1 560 zł na składkę rentową, 2 340 zł na składkę emerytalną oraz 558 zł składki chorobowej.
Żeby nie było zbyt różowo, na koniec roku muszę oddać 1 428 zł urzędowi skarbowemu ponieważ w tym kraju zarabianie na siebie jest ciężkim i surowo karanym grzechem. Po tym wszystkim w skali roku zostaje mi 16 374 zł. Jak warto policzyć, po drodze uciekło 7600 zł. Obrazowo rzecz ujmując – przez prawie 4 miesiące pracowałem za darmo, bo wszystko to co zarobiłem poszło na opłaty!
Nie liczę tutaj jeszcze 4 759 zł, które pracodawca również opłaca w ramach ZUSu.
Pomijamy teraz wersję optymistyczną, ponieważ jeśli chcesz zarabiać więcej to masz dodatkowy problem – stawki podatku dochodowego, które są ruchome i gonią Cię byś nie miał za dużo.
Na czym to polega? Jeśli zarobisz ponad 37 024 zł netto (~3 100 zł netto miesięcznie) pracujesz w ciągu roku przez ponad 2 miesiące aby opłacić 6 500 zł samego podatku dochodowego.
Jeśli trafiła Ci się na prawdę dobra praca masz jeszcze gorzej, po przekroczeniu progu 74 048 zł netto (~6171 zł netto miesięcznie) płacisz 17 612 zł podatku dochodowego, co daje niemalże 3 miesiące (dokładnie 2,85 miesiąca) pracy na sam podatek dochodowy.
Po tych obliczeniach prawdę mówiąc nie dziwię się większości pracodawców, że tak sceptycznie podchodzą do zatrudniania ludzi, że tak walczą o każdy grosz szukając oszczędności gdzie tylko się da, ale powoli zaczynam się dziwić i to dziwić niepomiernie, dlaczego tutaj pracuję?
Po to by w ciągu 5 dni roboczych odrabiać 1.5 dnia pańszczyzny? (jak to policzyłem – 4 z 12 to 30% a 30% z 5 to 1.5).
Kiedy sobie pomyślę, że cały poniedziałek i pół wtorku pracuję po to by opłacić kiepską oraz niemiłą obsługę medyczną i na koniec dostać zaniżoną emeryturę to po prostu przestaje mnie dziwić masowa emigracja i to, że młodzi mają w głębokim mniemaniu to co tu się stanie.
Być może dla Ciebie też nastała pora by sprawdzić ile tracisz na pracy w Polsce?
Jun 25 2006
Filed under DB by Łukasz Dywicki
Niedawno postanowiłem zaryzykować i ściągnąć Oracle XE. Samo ściągnięcie nie trwało dość długo (w międzyczasie sobie jadłem kolację), w końcu to tylko 150 MB. Zapewne niektórym w tym miejscu trudno uwierzyć, że tylko tyle. Tak tylko tyle! ;) Fakt, w porównaniu z MySQL/PgSQL to naprawdę wiele, ale nie w porównaniu do pełnego pakietu Oracle, który waży znacznie więcej. Tak więc w mych rękach wylądowała wersja express Oracle 10, która była gotowa do instalacji. Procesu instalacji nie opisywałbym gdyby nie to, że minimalna ilość pamięci to ponad 256 MB. Zatem niestety, albo i stety nie mogłem zainstalować bazy na laptopie. Nie mniej, podczas pobytu w domu z powodzeniem instalację udało mi się zakończyć. Co mnie zaskoczyło – nie zmuliło mi od razu systemu, jak to ongi bywało. Pamiętam, że gdy pierwszy raz instalowałem Oracle (rozmiar ~500 MB) to system dosłownie stawał w miejscu. Dlaczego? Ponieważ przy normalnej instalacji Oracle używa kilku i więcej procesów pomocniczych, także nie jest to tak jak w przypadku MySQL jeden proces. Dzięki temu baza o wiele lepiej sprawuje się na maszynach wieloprocesorowych.
Podstawowe procesy pomocnicze to:
– dbw – proces zapisujący do plików danych – procesów tych może być do 9 (dbwr0.. dbwr9)
– pmon – monitor procesów
– smon – monitor systemu
– lgwr – proces zapisujący do plików dziennika powtórzeń
– ckpt – proces punktu kontrolnego
– reco – odtwarzacz
– arc0 – archiwizacja danych
W przypadku wersji express tych procesów nie ma, jest jeden główny, który sobie spokojnie radzi ze wszystkim. Nie mam pojęcia jak to jest realizowane, ale na systemie XP, który ma ponad pół roku, gdzie dysk naprawdę jest zawalony po brzegi i gdyby nie zakładki na tychże to by się z niego wylewało baza działała szybko a co najważniejsze nie destabilizowała systemu jak i pracy innych aplikacji. Dla mnie bomba, proces nie zżerał całej dostępnej pamięci, tak że spokojnie mogłem przy 768 MB pamięci pracować jeszcze na Eclipse. Nie do wiary? A jednak, dało radę. W tym przypadku śmiem twierdzić, że gadanie “Oracle zmula” są mocno nieaktualne. Nie zmula! Oczywiście wciąż mówimy cały czas o wersji express, która w sam raz nadaje się do testów a nie o instalacji w pełni funkcjonalnej.
Cóż takiego ciekawego jest w tym oprogramowaniu?
1. Po pierwsze, dlaczego powstają książki rozmiarowo przewyższające encyklopedie na jego temat.
2. Po drugie czy nie jest to wodolejstwo.
3. Po trzecie czy możliwości są adekwatne do ceny.
Ad. 1) Nie jestem w stanie tego jednoznacznie stwierdzić, ale odnośnie opasłych tomisk – pragnę przytoczyć tytuł “Oracle. Vademecum administratora” (jeśli dobrze pamiętam).
Obecnie w swej skromnej biblioteczce posiadam tytuł “Oracle 9i. Przewodnik początkujących”, który jest stosunkowo niewielki – około 420 stron. Jest to mniej niż choćby “PostgreSQL. Biblia problemów”. Nie ma jednak w niej przedruku z całą składnią SQL jaką baza obsługuje. Jest dużo teorii, sporo opisów. Rozszerzeniem lektury jednak może być Vademecum jak i “Oracle 9i i XML” (znowu, jeśli dobrze pamiętam). W sumie wychodzi o wiele więcej niż na temat innej bazy danych, chociaż może tutaj konkurować jeszcze Microsoft SQL Server.
Ad. 2) Myślę, że wodolejstwo to nie jest, ponieważ sama baza danych daje ogromne możliwości, które ciężko bez dobrych podstaw wykorzystać. Mówię tutaj o czymś takim jak partycjonowanie danych czy też hurtownie danych. Dla mnie jest to swoista nowość, nigdy wcześniej z tymi pojęciami się nie spotkałem.
Ad. 3) Czy warto? Zależy, najlepszą metodą na sprawdzenie tego są samodzielne testy, ponieważ w sieci brak porównań wydajnościowych (Oracle zabrania jakichkolwiek publikacji na ten temat) a nie ma dwóch takich samych sytuacji nie mówiąc już o potrzebach. Wiele osób chce tego samego, ale różnice tkwią w szczegółach. Sądzę, że funkcjonalnie jest to najlepsza baza danych, którą Microsoft dopiero goni i do której ma jeszcze kawał drogi. Są to różnice lat. Podczas gdy Bill rozwijał swój sztandarowy produkt Oracle wciąż pracowało nad bazą danych i aplikacjami mocno związanymi z jej działaniem.
Sam przyznam, że niedawno odpaliłem tą bazę pierwszy raz i nie mogę znać ogromu jej możliwości. Jestem na wierzchołku góry lodowej. Z ciekawszych możliwości – bawiłem się formularzami oraz arkuszami (chyba tak to się zwie). Przyznam, że fajne. To, do czego dążą chyba wszyscy programiści – “kliknij tutaj by stworzyć aplikację” – jest już w Oracle. Nie mam pojęcia jak wygląda to w przypadku specyficznych struktur i tak dalej, ale na tych tabelach, które są dostępne dla testowego użytkownika wszystko sprawowało się znakomicie. Można sobie edytować bądź dodawać przyciski, schematy, szablony i co tam sobie jeszcze kto wymyśli. Wszystko przez interfejs WWW, bez używania narzędzi ciężkiego kalibru. Myślę, że załączone zrzuty są wystarczającą referencją i w pełni zastąpią wszelkie opisy..
Zachęcam do zabawy z Oracle, ono nie gryzie! :)
Udało mi się uruchomić bez jakiegokolwiek wysiłku PDO i z poziomu PHP korzystać z zasobów bazy. Troszkę się namęczyłem z Creole ale udało mi się również je zmusić do pracy z bazą. Być może pora na stworzenie adaptera, który rozszerzy interfejs PDO do tego, który oferuje Creole?
Jun 16 2006
Filed under Inne by Łukasz Dywicki
Kilka listingów. W czym to jest napisane?
list = [1: "a", 2: "b", 3: "C", 6: "asdf"] list.each() { key, value | println "${key} = ${value}" }
add = { x -> { y -> x + y }} println add(2)(4)
def power(n) { { base -> base**n } } square = power(2) cube = power(3) a = square(4) println a // => 16
Jun 11 2006
Filed under Śmieci by Łukasz Dywicki
Nowe miasto.
Po 11 miesiącach w Bydgoszczy przeprowadzka. W Bydgoszczy bądź co bądź zostaje prawie rok mojego życia. Wiele nowych osób, wiele nowych rzeczy. Przyznam, że ciężko było rezygnować z wszystkiego by zaczynać znowu od zera. Same miasto nie było złe, poza niektórymi rejonami dało się w nim żyć. Owszem, nie było tam gromady studentów tak jak w Toruniu, nie było porządku jak w moim rodzimym mieście, ale byli mili ludzie. Nikt na ulicy nie oklepał mi twarzy, nie zostałem napadnięty ani okradziony, zatem, bilans jak najbardziej dodatni. Poznałem w Bydgoszczy wiele nowych osób, nie mówiąc już o nowych miejscach. Zanim przeprowadziłem się do Bydgoszczy słyszałem o tym mieście wiele złego, nigdy nie usłyszałem zdania pozytywnego. Tak, ktokolwiek mówił o nim, mówił: szare, brudne, niemiłe. Nie przeczę – takie jest każde większe miasto, ale nie wszędzie, nie całe.
Dzielnica w której mieszkałem a później i pracowałem była czysta i zadbana, nie spotykałem się tam z żadnymi problemami.
Dość nostalgii. Teraz pora na Warszawę.
Nowa praca.
W Bydgoszczy były dwie firmy z którymi współpracowałem – IRTI oraz Front Studios. Obie wspominam miło, chociaż zmiany żadnej nie żałuję, ponieważ w każdej zmianie jest coś dobrego. Obie firmy zajmowały się PHP. W pierwszej był to głównie hosting + wykonywanie zleceń w drugiej gry + erp + zlecenia.
Nowa praca, nowe możliwości. Cytat ze strony mojego obecnego pracodawcy:
System AutoControl© umożliwia ciągłą analizę i optymalizację wykorzystania taboru transportowego w dowolnym przedsiębiorstwie przewozowym. Użytkownik ma zapewniony dostęp do danych z dowolnego miejsca korzystając z internetowego systemu AutoControl©.
Inteligentna aplikacja dostarcza użytkownikowi zdefiniowane przez niego raporty o charakterystyce pracy poszczególnych pojazdów, pozwalając optymalizować wykorzystanie taboru. Zasięg działania systemu AutoControl© obejmuje całą Europę.
Życzcie mi powodzenia. W krótce więcej o PHP Unit 3. :)