Pierwsze prywatne dzieło na django

Aktualizacja: Niestety biznes nie do końca wypalił więc strona jest zdjęta, ale może kiedyś umieszczę kod

Dla salonu kosmetycznego mojej żony przygotowałem stronę opartą na frameworku django.

Użyłem kilka ciekawych technik i komponentów, które moim zdaniem warto znać i używać:

  1. Django – sam framework jest ciekawy no ale nie będę się rozpisywał na temat wszystkich funcjonalności. Zainteresowanych odsyłam do strony https://www.djangoproject.com/ oraz tutoriala https://docs.djangoproject.com/en/1.4/intro/tutorial01/
  2. South – świetny system do automatycznego generowania zmian w modelach i migracji tych zmian do bazy danych. Za pomocą prostych komend system automatycznie tworzy plik, który zawiera informacje na temat zmian bazy danych oraz informacją ze sposobem wycofania tych zmian. Samodzielnie także wersjonuje te zmiany z podziałem na poszczególne aplikacje
  3. Pipeline – rewelacyjne narzędzie, dzięki ktoremu można uzyskać niezłego kopa na wydajności. System zajmuje się między innymi zmniejszaniem oraz grupowaniem w jeden plik zestawów plików statycznych takich jak JS i CSS a także zadba o odświeżenie nowej wersji obrazków, które mają tę samą nazwę (dodaje hash do nazwy). Można także zastosować kompilację plików CoffeScript oraz Sass i Less.
  4. Media queries – Strona posiada 5 alternatywnych widoków w zależności od szerokości okna/urządzenia. Dzięki zastosowaniu natywnego media queries działą to sprawnie i szybko
  5. Geo Lokalizacja – Natywny system, który posiadają nowoczesne przeglądarki pozwalający na podanie współrzędnych położenia danego komputera. Dzięki połączeniu techniki z mapami google można wytyczyć trasę do pokonania między użytkownikiem a salonem
  6. Debug Toolbar – Wspomagacz dla developerów do django. Pojawia się w postaci dyskretnego bloczka do rozwinięcia, który zawiera wszystkie niezbędne informacje do debugowania aplikacji m.in. wykonanie zapytania, użyte sygnały, zmienne środowiskowe, zmienne żądania i odpowiedzi i wiele innych ciekawych danych
  7. Admin Tools – System, który rozbudowuje standardowego admina django o dodatkowe możliwości. Poprawia wygląd i interfejs oraz dodaje możliwość zarządzania panelami oraz tworzenia własnych paneli oraz menu
  8. UUslug – System slugowania dla tekstów oraz jako typ kolumny modelu z pełną obsługą utf-8
  9. TinyMCE – znany i popularny edytor wysiwyg. Oczywiście nie mogło zabraknąć aplikacji, która integruje go do django. Użyty jest w backendzie.


Istotne dla mnie było aby strona posiadała ładne i przyjazne adresy. Z django to nie problem bo i tak definiuje się adresy widoków samodzielnie. Ale zależało mi także aby wyeliminować z adresów rozpoznawanie stron z użyciem identyfikatora primary key itd. Zastosowałem więc technikę slugowania. Każda strona z kategorii ma swój własny slug który nie jest w konflikcie z innymi. Dzięki temu w łatwy i przyjemny sposób można prezentować adresy, np tak:

/kosmetyka/pielegnacja-twarzy

zamiast

/kosmetyka,4/pielegnacja-twarzy,16

Django posiada także wbudowany cache. Zastosowałem cache dla stron katalogowych dzięki czemu wyeliminowałem znaczną część zapytań.

Seria Mass Effect

No i stało się. Ukończyłem mass effect. Z uwagi na to, że spędziłem z grą kawałek swojego życia (jakieś 150 godzin) myślę, że warto podsumować nieco całą serię.

Uwaga. Jeśli gra nie została przez Ciebie ukończona i nie chcesz sobie psuć zabawy to nie czytaj dalej gdyż post zawiera odniesienia do fabuły

Zakończenie

Zacznę może od końca, tj od zakończenia, które wywołało tyle skrajnych emocji. Nie widziałem wersji rozszerzonej (dopiero potem na YT) i moim zdaniem to co zrobili twórcy jest naprawdę bardzo fajnym pomysłem na podsumowanie historii. Owszem zgadzam się, że można by więcej wyjaśnić ale może właśnie o to chodzi, żeby zostało coś do własnej interpretacji. Przecież gra cały czas daje nam możliwość dokonywania wyborów. Ja wybrałem zakończenie z syntezą, gdyż czułem, że jest to najbardziej zgodne z tym jak postępowałem w grze (poszanowanie dla gethów i edi). Uważam, że końcówka jest faktycznie epicka. Nie jest to epickość w rozumieniu takim w jakim chyba dużo osób sobie wyobrażało. “Zakończenie” tak naprawdę zaczyna się od Londynu. Tutaj dzieje się już to co najważniejsze. Rewelacyjna scena biegu do promienia i sheparda, który z pogruchotanym ciałem, z pistoletem w dłoni próbuje dojść do światła po drodze jeszcze eliminując zombie, które próbują go powstrzymać. Scena wewnątrz cytadeli wśród ciał, wreszcie shepard który dostaje się do panelu kontrolnego. Cała ta scena chwyta za serce bo to w końcu Shepard, właściwie w samotności musi podjąć najtrudnieszą decyzję, która będzie miała wpływ na dalsze losy całej galaktyki. Świetnie zrealizowana scena rozmowy z umierającym Andersonem, rozmowa z Hackettem, który stwierdza, że Tygiel nie działa i bezsilność Sheparda, który już resztkami sił próbuje doprowadzić to do końca, ale ciało odmawia posłuszeństwa. I moim zdaniem najlepsza część, gdy Shepard rzuca się w promień, wtedy w całej tej scenie leci utwór “An End Once and For All”, którą nagrali wspólnie Clint Mansell i Sam Hulick i jest to moim zdaniem najlepszy utwór w całej grze. W tym czasie pojawiają się twarze naszych najbliższych osób, które nam się kłaniają, salutują (tak jakby to co widzimy przed śmiercią). Uważam tę scenę za absolutny Majstersztyk.

Plusy gry

Po pierwsze każda z 3 części byłą zupełnie inna. Twórcy pewne elementy poprawiali, inne zmieniali a czasem dodawali nowe. Moim zdaniem najlepszą częścią jest dwójka. Świetne scena przemieszczania się w przestrzeni kosmicznej (po ataku na normandię) i misja lądowania na miejscu katastrofy. Także dostaliśmy nową normandię i musieliśmy na niej walczyć. Także dodatki w stylu “Lair of the shadow broker”, które były zrobione naprawdę przyzwoicie i nie żałowałem wydanych na nie punktów.

Ogółem Twórcom udało się stworzyć olbrzymie uniwersum z bardzo barwnymi postaciami. Każda postać miała swój charakter. Jedne wzbudzały sympatie inne antypatie. U mnie największą sympatię wzbudził Garrus i Tali. Świetnie przemyślane dialogi między postaciami, które wybraliśmy sobie do danej misji i miało to także znaczenie dla osiągania pewnych celów czy informacji. Bardzo podobało mi się, że część postaci wygląda (Miranda Lawson – Yvonne Strahovski) lub bardzo przypomina (Jeff “Joker” Moreau – Seth Green) tak jak osoby podkładające głos. Zwiększa to realizm przedstawionych charakterów i dodaje smaczku. Podoba mi się, że postaci, przechodziły w trakcie gry różne metamorfozy.. np tali z dziewczynki na dowódcę, Jack z babochłopa zaczęła łagodnieć i bardziej się upodabniać do kobiety. Fajnie utrzymana także była blizna Garrusa przez całą grę jak dostał w łeb – przypomniało mi się, że były takie wydarzenia i odbiły się na tej postaci.

Nie będę się tu rozpisywał bo zajęłoby to kilkaset stron. Uważam, że gra naprawdę jest warta aby poświęcić na nią trochę swojego życia. Bardzo serdecznie polecam ją każdemu, kto jeszcze nie grał. Koniecznie trzy części w odpowiedniej kolejności.

Minusy gry

Co sprawia, że gra nie jest perfekcyjna? Właściwie niewiele ale te elementy są tak denerwujące, że bardzo skutecznie potrafią zepsuć zabawę

  1. Bugi, bugi i jeszcze raz bugi. Niestety ja zdaje sobie sprawę, że przetestowanie tak wielkiej gry jest trudne, ale jest ich naprawdę sporo. Począwszy od sytuacji w których można wypaść z terenu gry, po miejsca w których rozmawiamy z kimś a nasza głowa śledzi co innego i lata jak u osoby nawiedzionej, obraca się o 180 itd, aż po miejsca w których wykonywana misja się urywa i nie można jej ukończyć, albo są w galaktykach miejsca na których nie można wylądować itd. Niestety w każdej z części był ten problem i mam wrażenie, że kolejnych częściach tych bugów było coraz więcej. Zdarzyło mi się, np w 3 części, że nagle wyczyściło mi się konto – nie wiem zupełnie czemu – i musiałem się w grze cofać do save w którym było ok.
  2. Idiotyczne misje. Mam wrażenie, że pół gry robił jeden zespół a drugie pól inny. Bo niestety ale wielokrotnie zdarza się sytuacja w których wydarzenia i postęp gry postępuje w ustalony, ograniczony sposób. Np misja w której miałem zabrać 3 czy 4 artefakty z jakiejś bazy. Idę po pierwszy artefakt i wystrzeliwuje wszystko co się rusza. No i ok nikogo nie ma. Biorę artefakt i nagle nie wiadomo skąd pojawiają się żołnierze Cerberusa. Walka, walka wszyscy zabici. Idę odłożyć artefakt i po następny. Biorę drugi… uwaga zaraz dotknę… i nagle bum znowu wszyscy wyskakują do do mnie strzelają. I wtedy mi się nasuwa pytanie: a czemu nie mogę wziąć od razu czterech? Nie są wcale duże, itd. I takie sztuczne misje zapychacze mnie strasznie denerwowały. Nie wiem po co to jest tak zrealizowane.
  3. Kompani niewidoczni dla wroga. Kolejna sprawa w której puszczam kompanów przed siebie żeby patrolowali co jest z przodu. Ustawiam ich gdzieś za murkami.. nic się nie dzieje, no to nikogo nie ma, prawda?. Zrobię krok do przodu i nagle się przeciwnicy respawnują. Czyli co? Tylko na mnie specjalnie czekają? Strasznie to nierealistyczne i irytujące.

Co dalej z Mass Effect?

Powiem szczerze, że nie chciałbym aby historia się zakończyła. Wiem, że ME miałbyć trylogią i póki co tak jest, ale czy wydawcy będzie opłacało się zarżnąć kurę, która znosi złote jajka? Wydaje mi się, że jeszcze coś powstanie, lecz prawdopodobnie jedynie oparte o uniwersum? Bo jak to teraz posklejać do kupy? Shepard w większości zakończeń ginie, przekaźniki zniszczone… sam nie wiem. Na pewno nie będzie to już ta sama gra jeśli nie będzie Sheparda. Twórcy na pewno będą chcieli dorobić jak najwięcej DLC, ale w końcu przestanie się to wszystkim kalkulować. Mam nadzieję, że będzie mi jeszcze dane spotkać Sheparda i jego kompanów w pełnowymiarowej opowieści.

Czekam z niecierpliwością.

Aktualizacja PunBB i polskie tłumaczenie

Jakiś czas temu wyszła nowa wersja PunBB oznaczona numerem 1.4.2. Konieczne było zaktualizowanie polskiego pliku językowego. Polski pakiet językowy do forum PunBB 1.4.2

Oprócz tego w dziale download umieściłem najnowsze wersje moich rozszerzeń do PunBB

Framework idealny? Controller

Zawsze irytowało mnie w ZF (i nie tylko w nim), że metody do uruchomienia są jak takie zwykłe pojemniki na kod. Dlaczego nie posiadają one żadnych argumentów. Wszystko się wyciąga z jakichś magicznie powstałych nagle obiektów, które znalazły się kontrolerze (np $this->_request) – skąd on się tu wziął? Inna sprawa to, że “parametry” wyciąga się z funkcji “getParam”. No dobrze, ale skąd ten param? Z adresu? Z posta? geta? cookies? sesji? Skąd to się wzięło. Jest oczywiście to brane z tablicy $_REQUEST o ile mnie pamięć nie myli a ona może być inaczej zbudowana na różnych maszynach i różnych konfiguracjach – np parametry z GET będą przez POST albo odwrotnie. To jest kolejna z rzeczy, która moim zdaniem ułatwia użytkownikowi źle napisać kod. Nie jest tajemnicą, że parametry przesyłane są do PHP za pomocą różnych metod… gdzie najpularniejsze to POST i GET. Parametr w GET i POST może istnieć i mieć taką samą nazwę a służyć do zupełnie innej rzeczy a dodatkowo można jeszcze sztucznie tworzyć parametry przekazywane z requestu. W ZF wygląda to tak:

public function editAction()
{
    $id = $this->_request->getParam('id'); // Ale skąd to Id?
    $title = $this->_request->getParam('title'); // To z geta, posta czy z adresu url?
    $this->view->title = $title;
    $this->view->id = $id;
}
Nowy tytuł to title ?> o id: id ?>

Nie wiadomo skąd się co bierze. Poza tym Zend zakłada, że ja jakiś szablon potrzebuje i musze mu zmienna przekazać, zeby coś odpowiedziec. Ani mi do tej funkcji nic nei “wchodzi” ani z niej nie wychodzi.

Moja idea również zainspirowana django wygląda tak:


// Adres routingu
'article/edit,(?\d+).html => Article.edit

public function edit($request, $id)
{
    // id mam jako argument funkcji z adresu
    $title = $request->getPost('title'); // Aha no to ktoś postem puścił
    return new Response('Nowy tytuł to ' . $title . ' o id: '. $id);
}

Tutaj parametrem wejściowym jest request oraz parametry adresu. Poza tym sam decyduje o tym co odpowiem. Czy skorzystam z szablonu czy chcę po prostu napisac sobie “Hello” i tyle.

Framework idealny? Routing

Pierwszy z cyklu już bardziej konkretnych przemyśleń i wizji dotyczących poszczególnych komponentów “idealnego frameworka”. Tym razem chciałbym omówić moją wizję routingu gdyż jakby od niego wszystko się zaczyna.

Routing w praktyce

Routing – to dzięki temu rozwiązaniu gdy użytkownik wywołuje konkretne żądanie (adres i typ) router przekazuje polecenie do odpowiedniej części systemu. To on rozpoznaje i wykonuje pracę listonosza – dostaje konkretny adres i przekazuje tam dany list. We wczesnych rozwiązaniach routing istniał w bardzo uproszczonej formie. Requesty w postaci:

?action=kontakt

oznaczał tylko tyle, że jest gdzieś wielki “switch” albo zestaw “else if” w których w zależności od wartości parametru “action” wykonywany był konkretny blok kodu. Oczywiście później zostało to usprawnione o bardziej zamknięte funkcje, dodano inne parametry akcji. W zasadzie można by nazwać takie rozwiązanie bardzo prostym routingiem.

We współczesnych rozwiązaniach możemy spotkać routing w bardziej zaawansowanej formie, gdyż wiele frameworków stara się implementować wzorzec MVC – chociaż osobiście nie znam żadnego, który by w pełni ten wzorzec implementował. MVC narzuca istnienie komponentów takich jak Model, Widok i Kontroler. Za kontroler przyjęta została klasa PHP która posiada różnorakie metody (akcje). W związku z tym aby nieco ułatwić dostęp do wykonywania poszczególnych akcji utworzono podstawowy wzór:

/controller/action

gdzie controller jest nazwą klasy kontrolera a action nazwą metody, która się w tej klasie ma uruchomić. Rozwiązanie proste i przyjemne. Podobne rozwiązanie funkcjonuje np w Zend Framework albo w Ruby on Rails. To rozwiązanie jest dobre do momentu gdy chcemy jednak zrobić coś bardziej skomplikowanego, np gdy:

  • Specjalista SEO stwierdził, że adres ma jednak wyglądać w postaci /nazwa_uzytkownika albo /kontroler,akcja.html
  • Trzeba podzielić funkcjonalności na bardziej logiczne części (np moduły)
  • Konkretne adresy maja funkcjonować w ramach konkretnej domeny (subdomeny) w wielomodułowym lub wieloaplikacyjnym systemie

Jak sobie poradził z tym np Zend Framework? Ano jak to ZF, czyli “Zbuduj sobie sam”. Efekt jest taki, że robiąc bardzo prosty adres, potrzebuję kilku linijek (przykład dla pliku INI)

routes.forum_topic_add.route = "nowy-temat"
routes.forum_topic_add.type = "Zend_Controller_Router_Route"
routes.forum_topic_add.defaults.controller = topic
routes.forum_topic_add.defaults.action = new

Whaaaat? Chciałem tylko podać adres i wskazać go na konkretną akcję do wykonania. O co tu chodzi? Poza tym to jest przecież jeszcze prosty adres. Nie ma tu żadnych wyrażeń regularnych. Gdybym chciał tak zrobić musiałbym dostawić jeszcze kilka dodatkowych linijek na każdy parametr. Dodatkowo, żeby nie było za prosto musiałbym zmieć router Zend_Controller_Router_Route na Zend_Controller_Router_Route_Regex – bo tamten już wyrażeń nie rozumie. Jeszcze, żeby było ciekawie poszczególne adresy można łączyć w łańcuchy a te łańcuchy w kolejne łańcuchy już z routerami i innym typie – np Static (tak jest jeszcze jeden typ). Tylko po co? Czy naprawdę programista musi mieć aż tak dokładną kontrolę nad tym?

Wydaje mi się, że programista powinien po prostu pomyśleć sobie adres i wskazać którą metodę/funkcję ma on uruchomić. Wyobrażam to sobie tak:

nowy-temat = topic.new

I co tu potrzeba więcej? Adres taki i taki, ma kierować na taką i taką funkcję. Po co mi takie dokładne pisanie gdzie jaki kontroler a jaka akcja a jaki to typ routingu. Tym powinien już się przejmować framework a nie programista.

No dobra dobra, ale przecież to jest taki prosty przykład. A co z parametrami? W zendzie można użyć kontrolera Route albo Static. Np tak:

routes.archive.route = "archive/:year/*"
routes.archive.defaults.controller = archive
routes.archive.defaults.action = show
routes.archive.defaults.year = 2000
routes.archive.reqs.year = "\d+"

Powyższe rozwiązanie mówi tyle, że: jest wzór archive/:year. Ma ono odpalić kontroler archive i metodę show. A parametr :year ma być liczbą a gdy a domyślnie ma przyjąć wartość 2000. W celach optymalizacji używa domyślnego routera, który uznaje za parametry wyrażenia po znaku “:” i separuje je po slashu. Tylko, że jest dodatkowa walidacja na to aby parametr year był liczbą. Moim zdaniem zupełnie niepotrzebna komplikacja. Przykład poniżej jest nieco inne podejście:

routes.archive.type = "Zend_Controller_Router_Route_Regex"
routes.archive.route = "archive/(\d+)"
routes.archive.defaults.controller = "archive"
routes.archive.defaults.action = "show"
routes.archive.map.1 = "year"

Wzór routingu już jest zapisany bezpośrednio w adresie ale z kolei teraz trzeba w osobnym miejscu ponazywać poszczególne parametry. Znowu jakimś nowym cudacznym sposobem, który wymaga uruchomienia jakiegoś specjalnie napisanego parsera, gdzie jedne robi tak, a inny tak. Moim zdaniem idealny framework powinien oferować kompleksowe. jednolite rozwiązanie problemu. Programiści Zend Framework chyba sami nie znają za bardzo możliwości języka w którym piszą, bo jak inaczej wytłumaczyć fakt nie skorzystania z podstawowej umiejętności wyrażeń regularnych jaką jest named subpattern. Widziałem multum przykładów z różnymi konfiguracjami routingu ale nigdy nie widziałem tego prostego zastosowania. Ze strony PHP

preg_match('/(?\w+): (?\d+)/', $str, $matches);

dzięki temu funkcja do wyrażeń regularnych automatycznie podstawia nam klucze sparsowanych parametrów jednocześnie dbając o poprawną walidację związaną z podanym typem wyrażenia. Sam nie jestem orłem jeśli chodzi o wyrażenia regularne ale to jest na tyle proste, że każdy to zrozumie. Dzięki temu można budować dowolnie skomplikowane adresy do routera. i bardzo proste i bardzo skomplikowane zachowując całkowitą spójność w sposobie ich tworzenia.


forum/(?\w+),(?<id>\d+).html = forum.show
forum/(?<title>\w+),(?<id>\d+),new-topic.html = forum.new_topic
user/(?<name>\w+)/profile.html = user.profile
kontakt.html = article.contact
show_teaser = entry.show_teaser
program,(?<channel>\d+),(?<date>\d{2,4}-\d{2}-\d{2}).html = tv.schedule
</pre>
<p>itd itd. Wystarczy tylko wskazywać te konkretne adresy na konkretne akcje. Dla mnie takie rozwiązanie jest o wiele bardziej sensowne, spójne i czytelne niż to które proponuje Zend Framework. To rozwiązanie i pomysł zaczerpnięte jest z Django – frameworka w jezyku Python.</p>
<p>No dobrze, ale ktoś powie: “W ten sposób wszystkie adresy z założenia przeszukuje się wyrażeniami regularnymi a w ZF można wskazać co jest proste a co nie, dzięki temu działa to szybciej.” Ja odpowiem tak: Co zadziała szybciej? Utworzenie 70 instancji klas typu routera i przetworzenie w nich adresu + sparsowanie parametrów i walidacji (każdy router jeszcze robi to inaczej) czy przeszukanie 70 wyrażeń regularnych? Poza tym funkcje do wyrażeń regularnych są dosyć dobrze zoptymalizowane i nie robią niepotrzebnej roboty z parsowaniem wyrażeń jeśli ich tam faktycznie nie ma.</p>
<p>Sposób realizacji routingu ma także odwzorowanie w nieco innym podejściu do wywoływania akcji ale to już w kolejnym poście traktującym o Akcji.</p>
    </div>
    
    
  </div>

  </div>
<!-- /post -->




<!-- post -->
<div id="post-895" class="clear-block post-895 post type-post status-publish format-standard hentry category-ogolne count-6 even alt thumb-left author-admin">

  <div class="post-details">
        <a class="post-thumb " id="thumb-895" href="http://quadric.goblix.pl/ogolne/framework-idealny/" title="Framework idealny? Wstęp">
      <img width="90" height="90" src="http://quadric.goblix.pl/wp-content/uploads/2012/02/1200x890_232_Attack_car_2d_fan_art_post_apocalyptic_car_truck_fallout_picture_image_digital_art-90x90.jpg" class="attachment-90x90 size-90x90 wp-post-image" alt="" />    </a>
   
        <h2 class="title">
      <a href="http://quadric.goblix.pl/ogolne/framework-idealny/" rel="bookmark" title="Permanent Link: Framework idealny? Wstęp">Framework idealny? Wstęp</a>
    </h2>
    
                         
        <div class="post-std clear-block">
            <div class="post-date"><span class="ext">6 years ago</span></div>
            <div class="post-info">

                <span class="a">by <a href="http://quadric.goblix.pl/author/admin/" title="Posts by Quadric ">Quadric</a></span>
        
                in <a href="http://quadric.goblix.pl/category/ogolne/" rel="tag" title="Ogólnie (10 topics)">Ogólnie</a>        
        
      </div>
    </div>
    
        <div class="post-content clear-block">
      <p>Chciałbym poruszyć dosyć głęboki a być może i kontrowersyjny temat dotyczący wizji frameworka, który byłby jak najbardziej idealny. Oczywiście moje przemyślenia są mocno subiektywne jednakże są one podparte doświadczeniem nad pracą z różnymi rozwiązaniami. Ten post to jedynie ogólny wstęp do cyklu artykułów w których pojedynczo będę traktował o różnych aspektach budowy frameworka – wybierając zawsze (moim zdaniem) najlepsze rozwiązanie.</p>
<p>Moja idea/wzór będzie dotyczyła frameworka w języku PHP, gdyż uważam, że obecnie nie ma dobrego rozwiązania. Z czego to wynika? Moim zdaniem jest kilka powodów:</p>
<ol>
<li><span style="line-height: 18px;"><strong>PHP sam w sobie</strong>.  W porównaniu z innymi językami takimi jak Ruby czy Python można śmiało powiedzieć, że składniowo PHP nie jest zbyt elegancki. Ponadto jego bardzo duże możliwości nie są zbyt powszechnie wykorzystywane a z innych, istotnych dziedzinach niestety nie daje rady. Bardzo często trzeba się ratować rozwiązaniami zastępczymi, które niepotrzebnie wprowadzają dodatkowy nakład pracy, zabierają moc obliczeniową i zmuszają do nauki nowych, niekoniecznie potrzebnych rzeczy.</span></li>
<li><span style="line-height: 18px;"><strong>Mnogość frameworków do PHP</strong>. To wynika właściwie z tego, że istniejące rozwiązania nie są idealne i rożne osoby/grupy starają się zrobić coś swojego. Zend framework miał być odpowiedzią na ten problem, ale moim zdaniem jest on bardzo daleki od ideału. O tym za chwilę.</span></li>
<li><span style="line-height: 18px;"><strong>Przejrzałe rozwiązania</strong>. Im większe community danego frameworka tym trudniej wprowadzić w nim rewolucyjne zmiany, gdyż napotykają one na opór ze strony osób dla których refactoring ich systemu nie jest opłacalny podczas gdy chcieliby mieć poprawione błędy. W związku z tym powstają niekiety nowe “major” version danego frameworka na przykładzie których widać jak bardzo twórcy zmienili tok myślenia podczas pracy nad poprzednią wersją – niestety muszą oni także brać pod uwagę istniejące community aby wszyscy byli “zadowoleni” i niestety bardzo szybko taki framework znów zmienia się w “potworka”. Przykładem takiego postępowania jest Symfony Framework a i zaryzykuję stwierdzenie, że także nowy Zend Framework. Zupełne inne podejście reprezentuje grupa, która jest odpowiedzialna za Prado Framework. Zauważyli oni konieczność zrobienia czegoś zupełnie nowego – Yii Framework i jest to rzeczywiście zupełnie inne podejście – bardzie współczesne i odpowiadające obecnym czasom.</span></li>
</ol>
<p>PHP zyskał ostatnimi czasy kilka naprawdę bardzo fajnych możliwości</p>
<ol>
<li><span style="line-height: normal;">Przestrzenie nazw (namespace)</span></li>
<li><span style="line-height: normal;">Traits</span></li>
<li><span style="line-height: normal;">Mikroserwer</span></li>
<li><span style="line-height: normal;">Funkcje anonimowe</span></li>
<li><span style="line-height: normal;">Ładniejszy zapis tablic</span></li>
<li><span style="line-height: normal;">i parę innych ciekawych rzeczy.</span></li>
</ol>
<p>Biorąc pod uwagę powyższe fakty oraz mniej lub bardziej głębokie przemyślenia odnośnie idealnego frameworka doszedłem do tego co faktycznie musiałoby się w nim znaleźć aby uznać go za idealnym. Oczywiście idealnym z mojego punktu widzenia i przypominam, że dotyczy to PHP.</p>
<p>Cechy idealnego frameworka wg mnie:</p>
<h2><span>Przyjemność programowania.</span><span> </span></h2>
<p><span>Myślę, że programowanie jest wtedy przyjemne gdy nasza praca przekłada się bezpośrednio na to co chcemy zrobić a nie na godziny konfiguracji i rozwiązywania problemów próbując wykonać podstawowe zadania. Oczywiście z czasem można dojść do wprawy działając na zasadzie “kopiuj – wklej” ale po co w ogóle to robić? Framework powinien sobie siedzieć “w tle”, odzywać się wtedy kiedy powinien i nie kazać mi nauczyć się najpierw mówić w jego języku. Framework ma służyć mi a nie odwrotnie. Jak najbardziej pewne reguły powinny obowiązywać, które wynikają z oczywistej logiki i powinny być zautomatyzowane (w końcu to framework) ale nie wolno popadać w skrajności dotyczące całkowitej automatyzacji albo całkowitej elastyczności. Przykładem skrajności w całkowitej elastyczności jest Zend Framework. Zastosowałbym pewną analogię do złożenia samochodu:</span></p>
<p><span>Jeśli zastanawiałbym się nad skonstruowaniem nowego modelu samochodu a nie miałbym zaplecza inżynierów, chciałbym mieć podstawowe komponenty takie jak np rama czy silnik, to w normalnej sytuacji dostałbym kompletny silnik o konkretnych parametrach, do którego muszę powpinać kabelki i wmontowany jest on w prostą ramę. Mogę od tego zacząć i pozmieniać jeśli miałbym taką potrzebę. Natomiast programiści Zend Framework przysłaliby mi zestaw różnych kartonów z których musiałbym sobie wszystko złożyć. Rama nie byłaby skręcona odpowiednimi wkrętami bo może chciałbym ja zbić gwoździami, albo skleić kropelką. Silnik również byłby w częściach bo może życzyłbym sobie aby tłoki zamontować na dachu. Fajnie? Może i tak, ale wtedy to nie jest framework tylko zestaw różnych części z których sam sobie składam to co chcę. Na dodatek części te znajdują się na wytopionych matrycach, z ktorych interesuje mnie tylko po jednej części ale te części zależą od innych zestawów części. Problem tylko polega na tym, że ja tak ładnie nie złożę tej ramy ani nie spasuję dobrze elementów silnika – albo się jeszcze pomylę. Na dodatek zostanie mi mnóstwo dodatkowych części o które wcale nie prosiłem ale muszę je teraz odłożyć gdzieś w garażu bo nie wiem czy tak naprawdę są one mi potrzebne czy nie.</span></p>
<p>Zamiast skupić się na moim wyposażeniu wnętrza, elektronice, karoserii… siedzę nad problemami ze złożeniem podstawowych elementów. A to mi się coś zacina, a tu okazało się, że trzeba nasmarować, a to tak a to siak. Czy to powinno definiować framework? Moim zdaniem nie.</p>
<h2>Szybkość działania</h2>
<div><a href="http://quadric.goblix.pl/ogolne/framework-idealny/attachment/1200x890_232_attack_car_2d_fan_art_post_apocalyptic_car_truck_fallout_picture_image_digital_art/" rel="attachment wp-att-902"><img class="alignleft size-medium wp-image-902" title="1200x890_232_Attack_car_2d_fan_art_post_apocalyptic_car_truck_fallout_picture_image_digital_art" src="http://quadric.goblix.pl/wp-content/uploads/2012/02/1200x890_232_Attack_car_2d_fan_art_post_apocalyptic_car_truck_fallout_picture_image_digital_art-300x222.jpg" alt="" width="300" height="222" srcset="http://quadric.goblix.pl/wp-content/uploads/2012/02/1200x890_232_Attack_car_2d_fan_art_post_apocalyptic_car_truck_fallout_picture_image_digital_art-300x222.jpg 300w, http://quadric.goblix.pl/wp-content/uploads/2012/02/1200x890_232_Attack_car_2d_fan_art_post_apocalyptic_car_truck_fallout_picture_image_digital_art-150x111.jpg 150w, http://quadric.goblix.pl/wp-content/uploads/2012/02/1200x890_232_Attack_car_2d_fan_art_post_apocalyptic_car_truck_fallout_picture_image_digital_art-1024x759.jpg 1024w, http://quadric.goblix.pl/wp-content/uploads/2012/02/1200x890_232_Attack_car_2d_fan_art_post_apocalyptic_car_truck_fallout_picture_image_digital_art.jpg 1200w" sizes="(max-width: 300px) 100vw, 300px" /></a></div>
<p>Nikt mi nie powie, że Zend Framework czy Symfony Framework jest szybki. Są dużymi, bardzo złożonymi frameworkami i funkcjonuje to bardzo prosta zasada… im więcej kodu tym więcej czasu potrzeba na jego wykonanie. Poza tym zbyt duża elastyczność, luźno powiązane komponenty sprawiają, że łączenie ze sobą rzeczy, których nie powinno się łączyć jest dosyć proste to zrobienia. Efekt jest taki, że “działa” ale “jak działa” to jest już inna historia.</p>
<p>Tak sobie wyobrażam stronę zbudowaną np na Zend Framework. Można? Można. Czy o to chodzi? Moim zdaniem niekoniecznie. Nie chodzi wcale o to, że Zend Framework czy Symfony Framework ma bardzo dużo różnych fajnych gotowych komponentów. To świetnie, że tak jest, ale problem polega na tym, że sam framework od wielu z nich jest bardzo uzależniony i przy każdym rozruchu musi do nich zaglądać, podnosić i przetwarzać. Dobre rozwiązanie polegałoby na tym aby sam framework składał się z porządnego, ściśle i stabilnie działającego silnika i miał w pakiecie dodatkowe komponenty które są od niego niezależne. Czy framework powinien standardowo pozwalać na to aby przewrócić swój sposób działania do góry nogami? Czy nie prościej wtedy zrobić coś od nowa? Czy nie jest to wtedy dowód na to, że to co mamy nie spełnia naszych oczekiwań? Więc może warto wybrać jakieś alternatywne rozwiązanie, które okaże się prostsze, tańsze i lepiej dostosowane do konkretnych potrzeb.</p>
<p><a href="http://quadric.goblix.pl/ogolne/framework-idealny/attachment/tir1/" rel="attachment wp-att-911"><img class="alignleft size-medium wp-image-911" title="TIR[1]" src="http://quadric.goblix.pl/wp-content/uploads/2012/02/TIR1-300x240.jpg" alt="" width="300" height="240" srcset="http://quadric.goblix.pl/wp-content/uploads/2012/02/TIR1-300x240.jpg 300w, http://quadric.goblix.pl/wp-content/uploads/2012/02/TIR1-150x120.jpg 150w, http://quadric.goblix.pl/wp-content/uploads/2012/02/TIR1.jpg 570w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Każde z tych zadań może być zupełnie inne byleby było zgodne ze sposobem w jaki framework mógłby sobie z nim poradzić.</p>
<p>Gdy istnieje konkretna potrzeba framework może wziąć na “swoje barki” to zadanie jakie ma wykonać. Robi to po prostu, tak jak został stworzony. Wyobrażam sobie, że framework jest jak ciągnik ciężarówki. Wielka, potężna maszyna, w której wszystkie trybiki, idealnie spasowane i naoliwione pracują perfekcyjnie. Ktoś wcześniej tak złożony ciągnik przetestował i dopracował w najmniejszych szczegółach. Jedyne zadanie tego ciągnika to zabrać na “swój pokład” naczepę. Ta naczepa to może być dowolna rzecz, dowolny towar byleby jego łącze było zgodne z łączem ciągnika. Ten sam ciągnik może ciągnąć różne naczepy. Każda naczepa może być zrobiona przez inną firmę, która nie ma w ogóle pojęcia jaki ciągnik będzie używany do jej ciągnięcia. Dla mnie takie rozwiązanie jest idealne.</p>
<h2>Bezpieczeństwo</h2>
<p>Istotne jest bezpieczeństwo takiego rozwiązania. Ale jak wiadomo każdy z aspektów związanych z programowaniem stron ma inne niebezpieczne miejsca na które należy zwrócić uwagę.</p>
<ul>
<li><span style="line-height: 18px;">HTML. Trzeba zwrócić uwagę na escapowanie danych. Na zamykanie danych ze zmiennych attrybutów w cudzysłowiach. Na zamienianie encji</span></li>
<li><span style="line-height: 18px;">Javascript – Trzeba escapować dane w inny sposób</span></li>
<li><span style="line-height: 18px;">SQL – Trzeba zwrócić uwagę na zabezpieczenie przed SQL injcection oraz przed podaniem nieprawidłowego typu (np string w miejsce inta)</span></li>
<li><span style="line-height: 18px;">PHP – Trzeba zwrócić uwagę na typowanie zmiennych, przepełnienia bufora, zużycie pamięci i inne możliwe sposoby włamania się na serwer</span></li>
</ul>
<div><span style="line-height: 18px;">Pomijając fakt, że sam framework powinien być odporny na powyższe problemy to także powinien pomóc programiście w wyeliminowaniu takich problemów albo swoją specyfiką na całkowitym ich wykluczeniu. Nie chodzi o to, że programista ma być totalnie nieświadomy zagrożeń, ale nie powinien poświęcać zbyt dużo czasu na to aby to wszystko zabezpieczać. Znów analogia do ciągnika: To maszyna ma przecież odpowiedni punkt mocowania naczepy i nie pozwoli zamocować innego. Maszyna powinna mieć zabezpieczenie przed próbą ciągnięcia źle zamocowanej naczepy albo takiej która przekracza dopuszczalną masę. Kierowca nie powinien zastanawiać się czy przy próbie ruszenia przypadkiem nie urwie sobie całego tyłu. Kierowca skupia się na zadaniu jakie ma wykonać. Jakie wybrać drogi żeby było najszybciej i najtaniej. Gdzie w ogóle jechać czy brać nowe zlecenie i będzie miał czas itd. Nie ma obowiązku siedzieć i zastanawiać się czy z jego maszyną jest wszystko w porządku, czy przypadkiem zaraz nie odlecą koła w jakimś tam szczególnym przypadku. Idealny framework powinien zabezpieczać się i nakierowywać programistą na właściwy sposób tworzenia kodu (inaczej nie pozwolić działać).</span></div>
<div></div>
    </div>
    
    
  </div>

  </div>
<!-- /post -->




<!-- post -->
<div id="post-876" class="clear-block post-876 post type-post status-publish format-standard has-post-thumbnail hentry category-php category-projekty tag-punbb count-7 odd thumb-left author-admin">

  <div class="post-details">
        <a class="post-thumb " id="thumb-876" href="http://quadric.goblix.pl/projekty/punbb-adsense-manager/" title="PunBB AdSense Manager">
      <img width="78" height="78" src="http://quadric.goblix.pl/wp-content/uploads/2012/01/punbb.gif" class="attachment-90x90 size-90x90 wp-post-image" alt="" />    </a>
   
        <h2 class="title">
      <a href="http://quadric.goblix.pl/projekty/punbb-adsense-manager/" rel="bookmark" title="Permanent Link: PunBB AdSense Manager">PunBB AdSense Manager</a>
    </h2>
    
                         
        <div class="post-std clear-block">
            <div class="post-date"><span class="ext">6 years ago</span></div>
            <div class="post-info">

                <span class="a">by <a href="http://quadric.goblix.pl/author/admin/" title="Posts by Quadric ">Quadric</a></span>
        
                in <a href="http://quadric.goblix.pl/category/programowanie/php/" rel="tag" title="PHP (24 topics)">PHP</a>, <a href="http://quadric.goblix.pl/category/projekty/" rel="tag" title="Projekty (23 topics)">Projekty</a>        
        
      </div>
    </div>
    
        <div class="post-content clear-block">
      <p>Rozszerzenie do PunBB, dzięki któremu można zarządzać reklamami na forum. Pozwala na dodanie reklamy w nagłówku oraz reklamy za pierwszym postem.</p>
<p><a href="http://quadric.goblix.pl/download/?did=98">http://quadric.goblix.pl/download/?did=98</a></p>
    </div>
    
        <div class="post-extra">
       <div class="post-tags"> <a href="http://quadric.goblix.pl/tag/punbb/" rel="tag" title="PunBB (5 topics)">PunBB</a> </div>
    </div>
    
  </div>

  </div>
<!-- /post -->




<!-- post -->
<div id="post-872" class="clear-block post-872 post type-post status-publish format-standard has-post-thumbnail hentry category-php category-projekty tag-punbb count-8 even alt thumb-left author-admin">

  <div class="post-details">
        <a class="post-thumb " id="thumb-872" href="http://quadric.goblix.pl/projekty/punbb-quadric-seo-optimizer/" title="PunBB SEO Optimizer">
      <img width="78" height="78" src="http://quadric.goblix.pl/wp-content/uploads/2012/01/punbb.gif" class="attachment-90x90 size-90x90 wp-post-image" alt="" />    </a>
   
        <h2 class="title">
      <a href="http://quadric.goblix.pl/projekty/punbb-quadric-seo-optimizer/" rel="bookmark" title="Permanent Link: PunBB SEO Optimizer">PunBB SEO Optimizer</a>
    </h2>
    
                         
        <div class="post-std clear-block">
            <div class="post-date"><span class="ext">6 years ago</span></div>
            <div class="post-info">

                <span class="a">by <a href="http://quadric.goblix.pl/author/admin/" title="Posts by Quadric ">Quadric</a></span>
        
                in <a href="http://quadric.goblix.pl/category/programowanie/php/" rel="tag" title="PHP (24 topics)">PHP</a>, <a href="http://quadric.goblix.pl/category/projekty/" rel="tag" title="Projekty (23 topics)">Projekty</a>        
        
      </div>
    </div>
    
        <div class="post-content clear-block">
      <p>Rozszerzenie, do PunBB 1.4 które dba o to aby właściwie przekierowywać schematy adresów między sobą na te, które powinny być docelowo. Dodatkowo wprowadza tytuł forum do treści linka tematu, dzięki czemu adres jest bardziej szczegółowy</p>
<p><a href="http://quadric.goblix.pl/download/?did=93">http://quadric.goblix.pl/download/?did=93</a></p>
    </div>
    
        <div class="post-extra">
       <div class="post-tags"> <a href="http://quadric.goblix.pl/tag/punbb/" rel="tag" title="PunBB (5 topics)">PunBB</a> </div>
    </div>
    
  </div>

  </div>
<!-- /post -->




<!-- post -->
<div id="post-870" class="clear-block post-870 post type-post status-publish format-standard has-post-thumbnail hentry category-ogolne tag-punbb count-9 odd thumb-left author-admin">

  <div class="post-details">
        <a class="post-thumb " id="thumb-870" href="http://quadric.goblix.pl/ogolne/punbb-quadric-image-assistant/" title="PunBB Image Assistant">
      <img width="78" height="78" src="http://quadric.goblix.pl/wp-content/uploads/2012/01/punbb.gif" class="attachment-90x90 size-90x90 wp-post-image" alt="" />    </a>
   
        <h2 class="title">
      <a href="http://quadric.goblix.pl/ogolne/punbb-quadric-image-assistant/" rel="bookmark" title="Permanent Link: PunBB Image Assistant">PunBB Image Assistant</a>
    </h2>
    
                         
        <div class="post-std clear-block">
            <div class="post-date"><span class="ext">6 years ago</span></div>
            <div class="post-info">

                <span class="a">by <a href="http://quadric.goblix.pl/author/admin/" title="Posts by Quadric ">Quadric</a></span>
        
                in <a href="http://quadric.goblix.pl/category/ogolne/" rel="tag" title="Ogólnie (10 topics)">Ogólnie</a>        
        
      </div>
    </div>
    
        <div class="post-content clear-block">
      <p>Przygotowalem plugin do PunBB, dzięki któremu można w sposób łatwy i wygodny dodawać zdjęcia do postów a także używać już wcześniej wgranych.</p>
<p><a href="http://quadric.goblix.pl/download/?did=97">http://quadric.goblix.pl/download/?did=97</a></p>
    </div>
    
        <div class="post-extra">
       <div class="post-tags"> <a href="http://quadric.goblix.pl/tag/punbb/" rel="tag" title="PunBB (5 topics)">PunBB</a> </div>
    </div>
    
  </div>

  </div>
<!-- /post -->




<!-- post -->
<div id="post-828" class="clear-block post-828 post type-post status-publish format-standard has-post-thumbnail hentry category-php category-projekty tag-punbb count-10 even alt thumb-left author-admin last">

  <div class="post-details">
        <a class="post-thumb " id="thumb-828" href="http://quadric.goblix.pl/projekty/punbb-google-analytics-integration/" title="PunBB Google Analytics Integration">
      <img width="78" height="78" src="http://quadric.goblix.pl/wp-content/uploads/2012/01/punbb.gif" class="attachment-90x90 size-90x90 wp-post-image" alt="" />    </a>
   
        <h2 class="title">
      <a href="http://quadric.goblix.pl/projekty/punbb-google-analytics-integration/" rel="bookmark" title="Permanent Link: PunBB Google Analytics Integration">PunBB Google Analytics Integration</a>
    </h2>
    
                         
        <div class="post-std clear-block">
            <div class="post-date"><span class="ext">6 years ago</span></div>
            <div class="post-info">

                <span class="a">by <a href="http://quadric.goblix.pl/author/admin/" title="Posts by Quadric ">Quadric</a></span>
        
                in <a href="http://quadric.goblix.pl/category/programowanie/php/" rel="tag" title="PHP (24 topics)">PHP</a>, <a href="http://quadric.goblix.pl/category/projekty/" rel="tag" title="Projekty (23 topics)">Projekty</a>        
        
      </div>
    </div>
    
        <div class="post-content clear-block">
      <p>Jakoś mnie wzięło ostatnio na robienie rozszerzeń do forum PunBB.</p>
<p>Tym razem: <a href="http://quadric.goblix.pl/projekty/punbb-google-analytics-integration/attachment/punbb-quadric_google_analytics-1-0-0/" rel="attachment wp-att-827">PunBB Google Analytics Integration 1.0.0</a></p>
<p>Rozszerzenie pasuje do wersji 1.4 forum PunBB</p>
    </div>
    
        <div class="post-extra">
       <div class="post-tags"> <a href="http://quadric.goblix.pl/tag/punbb/" rel="tag" title="PunBB (5 topics)">PunBB</a> </div>
    </div>
    
  </div>

  </div>
<!-- /post -->

          </div>

          <!-- page navigation -->
<div class="page-navi pagination single  fadeThis clear-block">
<a class="next" href="http://quadric.goblix.pl/page/2/" title="Show More">Show More</a>
</div>
<!-- /page navigation -->
          
          
        </div>
      </div>
      <!-- /primary content -->

      

<!-- 1st sidebar -->
<div id="sidebar">
    <ul class="blocks count-4">
    <li class="block"><div class="block-content block-search clear-block" id="instance-atom-search-2">
<!-- search form -->
<div class="search-form" role="search">
  <form method="get" class="search-form clear-block" action="http://quadric.goblix.pl/">
    <input type="submit" class="submit" title="Search Website" value="" />
    <fieldset>
      <input type="text" name="s" data-default="Search Website" class="text alignleft clearField suggestTerms" value="" />
      <input type="hidden" value="submit" />
    </fieldset>
 </form>
</div>
<!-- /search form --></div></li><li class="block"><div class="block-content block-Advman_Widget clear-block" id="instance-advman-4"><div class="title"><h3>Reklama</h3><div class="bl"></div><div class="br"></div></div><div class="i"></div><script type="text/javascript"><!--
google_ad_client = "ca-pub-5440183811212122";
/* Quad - reklama BOX */
google_ad_slot = "6384812694";
google_ad_width = 250;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></li><li class="block"><div class="block-content block-tabs clear-block" id="instance-atom-tabs-2">    <div class="tabs widgets" id="tabs-atom-tabs-2" data-fx="fade" >
      <ul class="navi clear-block">
                  <li class="nav-recent-comments active" id="nav-atom-recent-comments-2"><a href="#tab-atom-recent-comments-2" title="Recent Comments"><span>Recent Comments</span></a></li>                  <li class="nav-tag-cloud" id="nav-atom-tag-cloud-2"><a href="#tab-atom-tag-cloud-2" title="Tags"><span>Tags</span></a></li>                  <li class="nav-calendar" id="nav-atom-calendar-2"><a href="#tab-atom-calendar-2" title="Calendar"><span>Calendar</span></a></li>              </ul>
      <div class="sections">
                  <div class="section " id="tab-atom-recent-comments-2"><div class="block"><div class="block-content block-recent-comments clear-block" id="instance-atom-recent-comments-2"><ul class="menu fadeThis full recent-comments"><li><a class="clear-block" href="http://quadric.goblix.pl/programowanie/tworzenie-vhosta-w-apache/comment-page-1/#comment-7654" title="on Tworzenie VHost’a w Apache">
  <img alt='jtomaszewski' src='http://2.gravatar.com/avatar/260d6bc4f6b1548e3c4fed0f538b753a?s=48&d=mm&r=g' srcset='http://2.gravatar.com/avatar/260d6bc4f6b1548e3c4fed0f538b753a?s=96&d=mm&r=g 2x' class='avatar avatar-48 photo' height='48' width='48' />
  <span class="base">
  <span class="tt">jtomaszewski</span>
  <span class="c1">Ja musiałem vhosts ustawić troszeczkę inaczej, mianowicie:
<code>NameVirtualHost *:80


    ServerName localhost
    ServerAlias dev
    </code> […]</span>
  <span class="c2">5 years ago</span>
</span>
</a></li><li><a class="clear-block" href="http://quadric.goblix.pl/autor/comment-page-1/#comment-1426" title="on Autor">
  <img alt='Quadric' src='http://1.gravatar.com/avatar/a9a22249b03f36821cad7d27385a3659?s=48&d=mm&r=g' srcset='http://1.gravatar.com/avatar/a9a22249b03f36821cad7d27385a3659?s=96&d=mm&r=g 2x' class='avatar avatar-48 photo' height='48' width='48' />
  <span class="base">
  <span class="tt">Quadric</span>
  <span class="c1">Witam, niestety w chwili obecnej jestem mocno zajęty innymi projektami, ale mogę Panu polecić to co zrobiłem dla wersji  […]</span>
  <span class="c2">6 years ago</span>
</span>
</a></li><li><a class="clear-block" href="http://quadric.goblix.pl/autor/comment-page-1/#comment-1425" title="on Autor">
  <img alt='Artur' src='http://2.gravatar.com/avatar/e0a14faa4fa11b6826453a3a4d5c8872?s=48&d=mm&r=g' srcset='http://2.gravatar.com/avatar/e0a14faa4fa11b6826453a3a4d5c8872?s=96&d=mm&r=g 2x' class='avatar avatar-48 photo' height='48' width='48' />
  <span class="base">
  <span class="tt">Artur</span>
  <span class="c1">Witam,
poszukuję informatyka, który napisze dla mnie skrypt do reklam (docelowo adsense+własne) po pierwszym poście a następnie co 4 post.  […]</span>
  <span class="c2">6 years ago</span>
</span>
</a></li><li><a class="clear-block" href="http://quadric.goblix.pl/programowanie/tworzenie-vhosta-w-apache/comment-page-1/#comment-1420" title="on Tworzenie VHost’a w Apache">
  <img alt='Sten' src='http://0.gravatar.com/avatar/9e6ec18520fda195eac25c185579e7c1?s=48&d=mm&r=g' srcset='http://0.gravatar.com/avatar/9e6ec18520fda195eac25c185579e7c1?s=96&d=mm&r=g 2x' class='avatar avatar-48 photo' height='48' width='48' />
  <span class="base">
  <span class="tt">Sten</span>
  <span class="c1">Świetnie stary. Bardzo mi to pomogło. Dobra robota. Możesz być z siebie dumny!</span>
  <span class="c2">6 years ago</span>
</span>
</a></li><li><a class="clear-block" href="http://quadric.goblix.pl/projekty/aktualizacja-punbb-i-polskie-tlumaczenie/comment-page-1/#comment-1408" title="on Aktualizacja PunBB i polskie tłumaczenie">
  <img alt='Cobra' src='http://0.gravatar.com/avatar/3dcc50e46e90e84661ccca2ee2ee0481?s=48&d=mm&r=g' srcset='http://0.gravatar.com/avatar/3dcc50e46e90e84661ccca2ee2ee0481?s=96&d=mm&r=g 2x' class='avatar avatar-48 photo' height='48' width='48' />
  <span class="base">
  <span class="tt">Cobra</span>
  <span class="c1">Dzięki, przydało się - wersja ze strony oficjalnej rozkraczała forum 😉</span>
  <span class="c2">6 years ago</span>
</span>
</a></li></ul><div class="fadeThis clear-block">
<a class="more" href="#" title="Show next 5 entries" data-instance="2" data-cmd="get_recent_comments" data-offset="5">Show More</a>
</div></div></div></div>                  <div class="section hidden" id="tab-atom-tag-cloud-2"><div class="block"><div class="block-content block-tag-cloud clear-block" id="instance-atom-tag-cloud-2"><div class="box tagcloud"><a href="http://quadric.goblix.pl/tag/ajax/" class="tag-ajax" title="1" style="font-size:10.0pt;color:#cacaca;">Ajax</a>
<a href="http://quadric.goblix.pl/tag/apache/" class="tag-apache" title="3" style="font-size:15.1pt;color:#8a8a8a;"><strong>Apache</strong></a>
<a href="http://quadric.goblix.pl/tag/c/" class="tag-c" title="1" style="font-size:10.0pt;color:#cacaca;">C</a>
<a href="http://quadric.goblix.pl/tag/code-igniter/" class="tag-code-igniter" title="1" style="font-size:10.0pt;color:#cacaca;">Code Igniter</a>
<a href="http://quadric.goblix.pl/tag/emotors/" class="tag-emotors" title="1" style="font-size:10.0pt;color:#cacaca;">Emotors</a>
<a href="http://quadric.goblix.pl/tag/framework/" class="tag-framework" title="7" style="font-size:20.3pt;color:#484848;"><strong>Framework</strong></a>
<a href="http://quadric.goblix.pl/tag/grad/" class="tag-grad" title="9" style="font-size:22.0pt;color:#333333;"><strong>GRAD</strong></a>
<a href="http://quadric.goblix.pl/tag/gry/" class="tag-gry" title="1" style="font-size:10.0pt;color:#cacaca;">Gry</a>
<a href="http://quadric.goblix.pl/tag/hack/" class="tag-hack" title="2" style="font-size:13.1pt;color:#a4a4a4;">Hack</a>
<a href="http://quadric.goblix.pl/tag/html/" class="tag-html" title="2" style="font-size:13.1pt;color:#a4a4a4;">HTML</a>
<a href="http://quadric.goblix.pl/tag/ie/" class="tag-ie" title="2" style="font-size:13.1pt;color:#a4a4a4;">IE</a>
<a href="http://quadric.goblix.pl/tag/internet/" class="tag-internet" title="2" style="font-size:13.1pt;color:#a4a4a4;">Internet</a>
<a href="http://quadric.goblix.pl/tag/jquery/" class="tag-jquery" title="2" style="font-size:13.1pt;color:#a4a4a4;">jQuery</a>
<a href="http://quadric.goblix.pl/tag/kohana/" class="tag-kohana" title="1" style="font-size:10.0pt;color:#cacaca;">Kohana</a>
<a href="http://quadric.goblix.pl/tag/luna/" class="tag-luna" title="1" style="font-size:10.0pt;color:#cacaca;">Luna</a>
<a href="http://quadric.goblix.pl/tag/model/" class="tag-model" title="1" style="font-size:10.0pt;color:#cacaca;">Model</a>
<a href="http://quadric.goblix.pl/tag/monitor/" class="tag-monitor" title="1" style="font-size:10.0pt;color:#cacaca;">Monitor</a>
<a href="http://quadric.goblix.pl/tag/pdo/" class="tag-pdo" title="1" style="font-size:10.0pt;color:#cacaca;">PDO</a>
<a href="http://quadric.goblix.pl/tag/php/" class="tag-php" title="5" style="font-size:18.2pt;color:#626262;"><strong>PHP</strong></a>
<a href="http://quadric.goblix.pl/tag/prado/" class="tag-prado" title="1" style="font-size:10.0pt;color:#cacaca;">Prado</a>
<a href="http://quadric.goblix.pl/tag/prime/" class="tag-prime" title="5" style="font-size:18.2pt;color:#626262;"><strong>Prime</strong></a>
<a href="http://quadric.goblix.pl/tag/programowanie/" class="tag-programowanie" title="4" style="font-size:16.9pt;color:#737373;"><strong>Programowanie</strong></a>
<a href="http://quadric.goblix.pl/tag/punbb/" class="tag-punbb" title="5" style="font-size:18.2pt;color:#626262;"><strong>PunBB</strong></a>
<a href="http://quadric.goblix.pl/tag/request/" class="tag-request" title="1" style="font-size:10.0pt;color:#cacaca;">Request</a>
<a href="http://quadric.goblix.pl/tag/router/" class="tag-router" title="5" style="font-size:18.2pt;color:#626262;"><strong>Router</strong></a>
<a href="http://quadric.goblix.pl/tag/rozrywka/" class="tag-rozrywka" title="1" style="font-size:10.0pt;color:#cacaca;">Rozrywka</a>
<a href="http://quadric.goblix.pl/tag/serwer/" class="tag-serwer" title="2" style="font-size:13.1pt;color:#a4a4a4;">Serwer</a>
<a href="http://quadric.goblix.pl/tag/symfony/" class="tag-symfony" title="1" style="font-size:10.0pt;color:#cacaca;">Symfony</a>
<a href="http://quadric.goblix.pl/tag/technologia/" class="tag-technologia" title="3" style="font-size:15.1pt;color:#8a8a8a;"><strong>technologia</strong></a>
<a href="http://quadric.goblix.pl/tag/vhost/" class="tag-vhost" title="2" style="font-size:13.1pt;color:#a4a4a4;">Vhost</a>
<a href="http://quadric.goblix.pl/tag/wzorce-projektowe/" class="tag-wzorce-projektowe" title="5" style="font-size:18.2pt;color:#626262;"><strong>Wzorce projektowe</strong></a>
<a href="http://quadric.goblix.pl/tag/xampp/" class="tag-xampp" title="1" style="font-size:10.0pt;color:#cacaca;">XAMPP</a>
<a href="http://quadric.goblix.pl/tag/xbox-360/" class="tag-xbox-360" title="1" style="font-size:10.0pt;color:#cacaca;">Xbox 360</a>
<a href="http://quadric.goblix.pl/tag/zend/" class="tag-zend" title="2" style="font-size:13.1pt;color:#a4a4a4;">Zend</a></div>
</div></div></div>                  <div class="section hidden" id="tab-atom-calendar-2"><div class="block"><div class="block-content block-calendar clear-block" id="instance-atom-calendar-2">    <div class="calendar-block">
      <div class="top clear-block">
		<a class="prev control" rel="9-2012" href="http://quadric.goblix.pl/2012/09/" title="View posts for September 2012">« Sep</a><h4>August 2018</h4></div><table class="calendar" summary="Calendar"><thead><tr>
		<th scope="col" title="Monday">Mon</th>
		<th scope="col" title="Tuesday">Tue</th>
		<th scope="col" title="Wednesday">Wed</th>
		<th scope="col" title="Thursday">Thu</th>
		<th scope="col" title="Friday">Fri</th>
		<th scope="col" title="Saturday">Sat</th>
		<th scope="col" title="Sunday">Sun</th></tr></thead> <tbody><tr><td colspan="2" class="pad"> </td><td><span>1</span></td><td><span>2</span></td><td><span>3</span></td><td><span>4</span></td><td><span>5</span></td>
	</tr>
	<tr>
		<td><span>6</span></td><td><span>7</span></td><td><span>8</span></td><td><span>9</span></td><td><span>10</span></td><td><span>11</span></td><td><span>12</span></td>
	</tr>
	<tr>
		<td><span>13</span></td><td><span>14</span></td><td><span>15</span></td><td><span>16</span></td><td><span>17</span></td><td><span>18</span></td><td><span>19</span></td>
	</tr>
	<tr>
		<td><span>20</span></td><td class="today"><span>21</span></td><td><span>22</span></td><td><span>23</span></td><td><span>24</span></td><td><span>25</span></td><td><span>26</span></td>
	</tr>
	<tr>
		<td><span>27</span></td><td><span>28</span></td><td><span>29</span></td><td><span>30</span></td><td><span>31</span></td>
		<td class="pad" colspan="2"> </td>
	</tr>
	</tbody>
	</table>    </div>

        <script>
      /* <![CDATA[ */
      jQuery(document).ready(function($){
        $('#instance-atom-calendar-2').delegate('a.control', 'click', function(){
          var reqdate = $(this).attr('rel').split(/-/g);
          $.ajax({
            type: 'GET',
            url: $(this).attr('href'),
            context: this,
            data: { id: 'instance-atom-calendar-2',
                    initial: 0,
                    reqmonth: reqdate[0],
                    reqyear: reqdate[1],
                    atom: 'get_calendar' },
            dataType: 'json',
            beforeSend: function() { $(this).addClass('loading'); },
            complete: function() { $(this).removeClass('loading'); },
            success: function(response){
              if(response.output != '') $('#instance-atom-calendar-2 .calendar-block').html(response.output);
            }
          });
          return false;

        });
      });
      /* ]]> */
    </script>
    
    </div></div></div>              </div>
    </div>
    </div></li><li class="block"><div class="block-content block-links clear-block" id="instance-atom-links-2"><div class="title"><h3>Blogroll</h3><div class="bl"></div><div class="br"></div></div><div class="i"></div><ul class="menu fadeThis blogroll"><li><a href="http://www.goblix.pl" rel="me"><span class="base">Goblix Services Host<span class="c1">goblixite yourself</span></span></a></li><li><a href="http://www.yourheaven.pl" target="_blank" rel="spouse sweetheart"><span class="base">Instytut urody Your Heaven<span class="c1">Salon kosmetyczny - Gdynia Wielki Kack</span></span></a></li><li><a href="http://rct.goblix.pl" target="_blank" rel="me"><span class="base">Radiocontrol Tuning<span class="c1">Hobbystyczne forum modeli składanych i pojazdów zdalnie sterowanych z gazetek</span></span></a></li><li><a href="http://vipserv.org/p.php?goblix" rel="contact"><span class="base">Rewelacyjny hosting!<span class="c1">Rewelacyjny hosting zawierający wszystko czego programista. Tanio, dostęp do mysql, postgres, svn, poczty, crontab, kopie bezpieczeńtwa, prosta obsługa</span></span></a></li><li><a href="http://www.gajcom.cba.pl" target="_blank" rel="acquaintance met"><span class="base">Serwis komputerowy G@JCOM<span class="c1">Serwis komputerowy</span></span></a></li><li><a href="http://www.you-ebook.pl" target="_blank"><span class="base">You-ebook - wydawnictwo internetowe<span class="c1">Wydawnictwo internetowe pdf</span></span></a></li></ul></div></li>  </ul>
  </div>
<!-- /1st sidebar -->



    </div>
  </div>

</div>
<!-- /main content -->


         </div>
       </div>
       <!-- /main -->

       
       
       <!-- footer -->
       <div class="shadow-left page-content">
         <div class="shadow-right">

           <div id="footer">

             
             <div id="copyright">
               <span id="site-generator">Powered by <a class="wp" href="http://wordpress.org/">WordPress</a> and Mystique theme by <a class="digitalnature" href="http://digitalnature.eu/">digitalnature</a></span> <br /> [rss]  [top]               		<!-- Advertising Manager v3.5.3 (0.461 seconds.) -->
<script type='text/javascript' src='http://quadric.goblix.pl/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/scripts/shCore.js?ver=3.0.9b'></script>
<script type='text/javascript' src='http://quadric.goblix.pl/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/scripts/shBrushPhp.js?ver=3.0.9b'></script>
<script type='text/javascript' src='http://quadric.goblix.pl/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/scripts/shBrushXml.js?ver=3.0.9b'></script>
<script type='text/javascript'>
	(function(){
		var corecss = document.createElement('link');
		var themecss = document.createElement('link');
		var corecssurl = "http://quadric.goblix.pl/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shCore.css?ver=3.0.9b";
		if ( corecss.setAttribute ) {
				corecss.setAttribute( "rel", "stylesheet" );
				corecss.setAttribute( "type", "text/css" );
				corecss.setAttribute( "href", corecssurl );
		} else {
				corecss.rel = "stylesheet";
				corecss.href = corecssurl;
		}
		document.getElementsByTagName("head")[0].insertBefore( corecss, document.getElementById("syntaxhighlighteranchor") );
		var themecssurl = "http://quadric.goblix.pl/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shThemeDefault.css?ver=3.0.9b";
		if ( themecss.setAttribute ) {
				themecss.setAttribute( "rel", "stylesheet" );
				themecss.setAttribute( "type", "text/css" );
				themecss.setAttribute( "href", themecssurl );
		} else {
				themecss.rel = "stylesheet";
				themecss.href = themecssurl;
		}
		//document.getElementById("syntaxhighlighteranchor").appendChild(themecss);
		document.getElementsByTagName("head")[0].insertBefore( themecss, document.getElementById("syntaxhighlighteranchor") );
	})();
	SyntaxHighlighter.config.strings.expandSource = '+ expand source';
	SyntaxHighlighter.config.strings.help = '?';
	SyntaxHighlighter.config.strings.alert = 'SyntaxHighlighter\n\n';
	SyntaxHighlighter.config.strings.noBrush = 'Can\'t find brush for: ';
	SyntaxHighlighter.config.strings.brushNotHtmlScript = 'Brush wasn\'t configured for html-script option: ';
	SyntaxHighlighter.defaults['pad-line-numbers'] = false;
	SyntaxHighlighter.all();
</script>
<script type='text/javascript'>
/* <![CDATA[ */
var atom_config = {"id":"mystique","blog_url":"http:\/\/quadric.goblix.pl\/","theme_url":"http:\/\/quadric.goblix.pl\/wp-content\/themes\/mystique","context":"home","preview_mode":"","search_query":"","options":"effects|lightbox|generate_thumbs"};
/* ]]> */
</script>
<script type='text/javascript' src='http://quadric.goblix.pl/wp-content/themes/mystique/js/jquery.atom.min.js?ver=3.3.2'></script>
<script type='text/javascript' src='http://quadric.goblix.pl/wp-includes/js/wp-embed.min.js?ver=4.7.11'></script>
             </div>
           </div>

         </div>
       </div>
       <!-- /footer -->

       <a class="go-top" href="#page">Go to Top</a>

     </div>
    <!-- /page-ext -->


    <!-- 89 queries in 0.46 seconds (39.90M) -->

  </div>
  <!-- page -->

  
</body>
</html>