Jak buduje się strony internetowe w 2012 roku?

Webowy front-end rozwija się w zastraszającym tempie. Nie ma Cię w sieci tydzień i od razu mijasz się z premierą Yeomana. Jutro z kolei dowiesz się o tym, że gra Trigger Rally ma świetną grafikę i jest napisana, o tempora, o mores, w JavaScripcie! Jak odnaleźć się w konkurencji, w której zaczęto biec tempem Usaina Bolta, a na rekord świata codziennie nastawiają się miliony developerów?

Runners - Brighton Marathon 2011

Poznaj JavaScript i CSS3

Powiedzmy sobie wprost – przywołując jeszcze kilka analogii do biegu na 100 metrów – nie umiesz JavaScriptu i CSS3 – startujesz 10 sekund po innych. Weźmy JavaScript. To ten język, mimo pewnych braków, rozwija się dzisiaj najszybciej na świecie. I to nie na płaszczyźnie składni i tak dalej. Wokół JS-a powstał cały ekosystem. Zapomnij o tym, że 10 lat temu służył on tylko do prostych animacji. To już nieaktualne. Dziś buduje się modułowe aplikacje w jednym z wielu frameworków MVC. Używa się websocketów, dołącza Modernizr’a, a dane, w zależności od tego czy jesteśmy online czy offline, zapisujemy w localStorage lub w JSON-owej bazie np. MongoDB. Nie wypluwa się gotowego HTML-a parsowanego przez serwer – to JavaScript jest odpowiedzialny za system szablonów, który jest używany po stronie klienta. A propos, wiedziałeś, że LinkedIn zapisuje szablony swojej mobilnej wersji w localStorage, by jeszcze bardziej przyspieszyć czas ładowania?

Ostatnie 2-3 lata w developmencie to nieustanny, jeszcze bardziej intensywny niż kiedykolwiek indziej rozwój. W zasadzie te kilkadziesiąt miesięcy to całe lata świetlne, jeśli chodzi o to, jak diametralnie zmieniły się techniki i narzędzia. Wyliczankę nowości można zacząć dowolnie, bo na pierwsze miejsce w hierarchii ważności zasłużyło co najmniej kilkanaście projektów i idei.

Responsive design

Warto zauważyć przede wszystkim responsive design. W dobie urządzeń mobilnych zapewne wielokrotnie spotkałeś się z problemem dostosowania szerokości swojej strony do rozdzielczości ekranu. Responsive design to załatwia i sprawia, że nie musimy powiększać strony manualnie – obecnie da się dołączyć do HTML kilka plików CSS i podać reguły, kiedy mają być używane. Ekran o maksymalnej rozdzielczości 640px? No problem, max-width:640px i przeglądarka użyje stylów specjalnie dla urządzeń przenośnych do 640px. Wszystko dzięki media queries.

Node.js

Wracając na chwilę do JavaScriptu. Musisz koniecznie poznać node.js, platformę do tworzenia aplikacji sieciowych, która rewolucjonizuje myślenie o back-endzie. Zaufali już jej choćby Microsoft czy eBay. W node.js zrobisz back-end interaktywnej aplikacji opartej na web socketach, build system dla całego środowiska programistycznego, a po pracy… zaprogramujesz układ scalony lub mini helikopter. Dostęp do niskopoziomowych właściwości systemu okaże się zbawieniem, a w głowie od razu zaroi się od pomysłów.

Frameworki MV*

W JS dzieje się bardzo wiele, jeśli chodzi o nowe frameworki. Ponieważ przeglądarki w większości rozumieją querySelectorAll i addEventListener, świat nie kręci się już wokół jQuery i mootools. Nadszedł czas na poważną architekturę. Renesans przeżywają frameworki MV* (gwiazdka dlatego, że warstwa kontrolera jest w JS z reguły zbędna). W związku z tym koniecznie musisz poznać Backbone.js lub Spine.js. Zresztą… Jest tego więcej! Wejdź na todomvc.com i przyjrzyj się przykładowym aplikacjom TODO wykonanym w jednym z kilkudziesięciu frameworków MV* w JS. Na pewno znajdziesz coś dla siebie. Przy okazji, byłeś już na microjs.com?

AMD versus CommonJS

Zabawa dla dorosłych zaczyna się na dobre, kiedy pomyślimy, jak obecnie dodaje się pliki JavaScript do dokumentu HTML i strukturyzuje je. O ręcznym dodawaniu <script></script> wewnątrz dokumentu pamięta już tylko Twoja babcia. Nadszedł czas takich rozwiązań jak RequireJS (z rodziny AMD – asynchronous module definition) czy webmake-modules (moduły CommonJS w przeglądarce). Dzięki temu pierwszemu nie tylko uporządkujesz swój kod w postaci modułów i zależności między nimi, ale także dynamicznie doładujesz je wtedy, kiedy będą potrzebne (a więc niekoniecznie musimy ładować cały kod aplikacji, skoro nie używamy pewnych ekranów). Webmake-modules to z kolei odpowiedź na sposób definiowania modułów przez RequireJS, który różni się od standardu CommonJS, a więc i node.js. Jestem jego ogromnym fanem, ponieważ dzięki niemu możemy pisać moduły tak, jak w node.js i każda przeglądarka je „zrozumie”. Koniecznie przyjrzyj się prezentacji Mariusza Nowaka!

Szablony Twoim przyjacielem

Coraz popularniejsze staje się też używanie systemu szablonów bezpośrednio po stronie JavaScriptu. Warto więc zainteresować się takimi projektami jak Mustache czy Handlebars.js. Kto by pomyślał te parę lat temu, że JS stanie się na tyle szybki, by parsować duże porcje template’ów?

Rewolucje w CSS3

W CSSie również cała gama zmian. Generuje się już w nim gradienty, a zaokrąglone rogi to kwestia jednej linijki (border-radius). Poza tym mamy animacje (do widzenia JSie!) czy transformacje 2D i 3D (zapewne widziałeś już polskiego impress.js?). Obramowanie elementów z kolei można złożyć wreszcie z samych obrazków, bez brudnych tricków. A to tylko wierzchołek góry nowych rozwiązań, które niesamowicie przyspieszyły development w ostatnich latach.

A co z grami?

Programiści gier ucieszą się z kolei z powodu rozwoju WebGL na przeglądarki, a także możliwościom jakie daje Canvas i SVG. Dodatkowo, w kuluarach powstaje dużo fajnych API, jak choćby GamepadAPI, pozwalające komunikować się przeglądarce z joystickiem (lub innym tego typu kontrolerem)!

Zmiany, zmiany, zmiany!

Jest tego więcej. Spójrz tylko na CanIUse.com. Znajdziesz tam całą masę nowych API, które czekają tylko, abyś ich użył. Bo dziś front-end developer to nie tylko człowiek od semantycznego HTML i dobrego oraz łatwego do utrzymania CSS-a. To także specjalista od wyłapywania i nauki developerskich nowości. On musi być na czasie, inaczej konkurencja ucieknie zbyt daleko.

Do biegu, gotowi, start!

PS A widziałeś już najnowszy, w pełni otwarty system operacyjny na urządzenia mobilne, napisany w JS, HTML5 i CSS? Tak, mowa o Firefox OS!

Komentarze

1

popraw link, nie RequireJS.com a RequireJS.org

devnul
2

done! thx

3

Dobry artykuł. Podoba mi się, jest bardzo aktualny i na temat :)

Świetna strona/magazyn jako przykład użycia Backbone.js, Reponse Design i innych: http://qz.com

4

świetny artykuł z przykładami! więcej takich w polskim internecie

damianm
5

Bardzo dobry tekst. Taki starter dla kogoś kto nie jest na bieżąco.
Z jednej strony miło jak to się wszytko tak ładnie rozwija, z drugiej przeraża tempo tego rozwoju i konieczność nadążania za tym.

6

impress.js.. otwiera listę projektów, które można sobie podsyłać żeby powiedzieć ‚patrzcie, jakie fajne rzeczy robią w css-ach’ i które jednocześnie w żadnym stopniu nie nadają się do rozwiązań rynkowych. Powód? IE rzecz jasna, jak również akcje pt. ‚działa na najnowszej wersji chrome / beta / dev’. Może chociaż podstawy, czyli tag video? Super, 3 wersje materiału na różne przeglądarki + fallback do flasha, żeby jednak działało. ‚Jak buduje się strony internetowe w 2012 roku’ dzielimy na dwa światy – jeden, gdzie pracujemy do szuflady / żeby się pokazać, i drugi, gdzie zarabiamy pieniądze – tu niestety mało kto pozwoli sobie na animacje w css-ach, bo okazuje się, że pan prezes ma u siebie ie8 na windowsie xp i mu nie działa..

br
7

@br: wszystko zależy co ustalasz z klientem. Ja zawsze uprzedzam, że graceful degradation to dodatkowe koszty i klient zaznacza sobie ptaszek do której przeglądarki wstecz chce mieć wsparcie i z jakimi kosztami się to wiąże (cena rośnie wykładniczo). Do takich celów mamy wspomniane wyżej Modenizry, Shimy, bootstrapy, boilerplate’y, fallbacki, ostrzeżenia o starej przeglądarce itp.

To my dostawcy oprogramowania jesteśmy odpowiedzialni za ewangelizację i uświadamianie klientów o konieczności bycia na bieżąco z przeglądarkami (argument bezpieczeństwa jest bardzo skuteczny). Jeżeli to my będziemy się podkładać, to nasze narzekanie na stare przeglądarki będzie trwać jeszcze dziesięciolecia.

@ferrante: Bardzo dobry artykuł podsumowujący aktualną sytuację. Ewentualnie jeszcze może info o konferencjach?

@DoctorLex
8

Panie Kolego, chcialem sie zapisac do newslettera bo dobry art a tu kicha. No to sobie mysle, ze pewnie chociaz kanal na FB a tu niet…

Sip
9

Jest tylko RSS. Ale masz racje, czas chyba postawic cos na FB…

Lech: na konferencje przyjdzie jeszcze pora, ten wpis mial byc bardziej o kodzie :)

10

Fajny tekst! Przyjemnie się czytało.

Łukasz
11

swietny artykul ale moze mi ktos rozjasnic nastepujacy temat … powiedzmy sobie ze jestem front end developerem w przecietnej firmie i chyba jak w 99% przypadkow, tutaj to znaczy, zajmowanie sie css/html, „ciecie” szablonow, przygotowywanie ich do implementacji przez programistow php, python, whateva, oni ogarniaja wszystkie sprawy zwiazane z komunikacja z serwerem, zapytania ajaxowe itd, ja pisze proste skrypty do animacji albo interakcji roznych elementow na stronie np. slidery,lightboxy itd. Nie jestem programista, ale chcialbym zeby ten moj „kod” byl dobrze zorganizowany, zamiast trzymac go w jednym wielkim pliku z jquerowa papka w srodku, niestety nie bardzo wiem jak mam to zrobic. Rozumiem ze zaden framework mv* nie jest dla mnie, skierowane one sa raczej wlasnie do tych backendowych programistow php ktorzy zechca tego uzywac w projekcie tak? Chcialbym pojsc dalej, byc bardziej na czasie, ale przy np. backbone spotykam sie na dzien dobry ze sciana ognia (potrojna :)). Podobnie z innymi rzeczami w tym artykule, defacto sa one kierowane dla tych obecnych programistow backendowych, ktorzy musza sie podszkolic z JS ? Chyba ze to ja juz nie jestem front end developerem, bo nie wymiatam w obiektowym JS … im confused …

imso2004
12

Nieskromnie przyznam, że artykuł (bardzo dobry, though) był dla mnie tylko (w większości) usystematyzowaniem wiedzy :>

pim
13

Jedna mała uwaga: „Weźmy JavaScript. To ten język, mimo pewnych braków, rozwija się dzisiaj najszybciej na świecie.” Po tym zdaniu myślałem, że dowiem się, jakież to nowości pojawią się w tym języku. I wykorzystanie zdania „I to nie na płaszczyźnie składni i tak dalej.” wcale nie zwalnia autora z obowiązku napisania, co w tym języku się zmienia. Bo cały artykuł jest o dynamicznie rozwijającym się ekosystemie i frameworkach / bibliotekach, a ani słowa nie ma o tym najszybszym na świecie rozwoju JS’a. Popularność RoR czy DJango nie oznacza, że Ruby czy Python są najpopularniejszymi językami na świecie. Język to język, a jego otoczenie to dwie różne sprawy.

14

Akapit, mimo udowodnionej przez Ciebie stylistycznej prowokacji, nadal jest valid: https://github.com/languages ;-)

15

To nie żadna prowokacja. Po prostu lubię konkrety. A odnośnie linka który wkleiłeś – nie zgodzę się: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

Github nie może być wyznacznikiem popularności języka. Dużo ludzi korzysta na przykład z BitBucketa albo swoich lokalnych repozytoriów. To co potwierdziłeś, to to, że wśród użytkowników GitHuba JS jest najbardziej popularny – ma najwięcej commitów. Nie oznacza to jednak, że możemy generalizować.

16

„The index is updated once a month. The ratings are based on the number of skilled engineers world-wide, courses and third party vendors. The popular search engines Google, Bing, Yahoo!, Wikipedia, Amazon, YouTube and Baidu are used to calculate the ratings.”

Przepraszam, ale to, co podales jest dla mnie absurdalnym zrodlem, na ktory mozna sie powolywac. Szczegolnie biorac pod uwage aspekt wyszukiwarek (smieciowy content everywhere) i „skilled engineers world-wide, courses” – od razu smierdzi Javą i technologiami, które obwarowane są pseudokursami i certyfikatami, a takich dla JS nie znajdziesz, więc ciężko porównywać. Na GitHubie z kolei masz statystyki dotyczące realnego kodu, a popularność GitHuba wśród programistów pozwala mi z dużą większą pewnością powoływać się na nie.

W zasadzie dlaczego muszę się tłumaczyć? Napisałem, trochę przewrotnie, fakt (ale i tak bardzo w to wierzę). Podaj mi inny język, w którym codzienne wychodzi tyle projektów i który w kilka lat stał się obecny na serwerze i na mobile’ach? Z którego korzystają miliony/miliardy (bo jest w każdej przeglądarce!). Który jest otwarty? Sądzę, że skok jaki uczynił JS w ostatnich latach przez powiększenie swojego zasięgu i nowe projekty pozwala mi na użycie takiego sformuowania.

A jeśli chodzi Ci o samą składnię, to też dzieje się tutaj dużo, chociaż zmiany w niej nie świadczą według mnie tak bardzo o sile i rozwoju języka (można wydawać co miesiąc nowe wersje, ale co z tego, skoro nikt tego nie będzie używał?). W ciągu ostatnich kilku lat wyszły 3 nowe wersje ECMAScript (3.5, 5, 5.1), a pracuje się już od dawna nad Harmony, wprowadzającą o wiele większe rewolucje, jeśli chodzi o feature’y języka i składnię. Pod tym względem też dużo się dzieje, ale byłbym szaleńcem opierając na tym swoją tezę.

17

Proszę bardzo – inne źródło: http://langpop.com
Tutaj jest lepiej, ale nadal nie specjalnie dobrze. Jedynie na Del.icio.us coś lepiej się dzieje jeżeli chodzi o JS.
W kontekście GitHuba – od 11 lat siedzę w środowisku programistów. I chociaż sam rasowym programistom nie jestem, to jednak w kilku językach potrafię coś niecoś zakodować. Przez ten cały okres spotkałem naprawdę masę programistów. Ilu z nich korzysta z GitHuba? Dwóch. W takim razie w jakim środowisku GitHub jest popularny?

Tak samo z tym JS na na serwerach to ja bym się nie rozpędzał. Z własnego podwórka – ile znasz aplikacji serwerowych napisanych w JS? A ile w PHP / Rubym / Pythonie? Z PHP też korzystają miliony / miliardy. Też jest otwarty. Też jest dostępny praktycznie na każdym OSie. Nadal to nie świadczy o dynamicznym rozwoju tego języka.

Generalnie popularność języka jest bardzo ciężko określić, bo jest zbyt dużo zmiennych, które o tej popularności świadczą. Dodatkowo pomieszanie języka z ekosystemem wprowadza zamęt i powoduje, że nawet wartościowy artykuł ma wydzwięk pudelka… Później dochodzi do sytuacji w których mówiąc RoR myślimy o Rubym, co jest kompletną bzdurą, mówiąc django myślimy o Pythonie co również jest kompletną bzdurą.

Jeżeli dotykamy tematu technologii, to róbmy to dobrze, albo pomijamy takie wróżenie.

18

Nadal mam wrażenie, że odpieram ataki programisty Javy, bo chyba tym się zajmujesz, prawda? Czyli osoby, której ewidentnie JS nie leży/nie jest na rękę.

Napisałem o rozwoju JS. O rozwoju, w felietonie, luźnej formie. Mimo to nadal myślę, że mam rację,

Rozwój ma to do siebie, że porównujemy dwa okresy i je oceniamy. Ty zacząłeś z kolei punktować małą liczbę aplikacji JS na serwerze w chwili obecnej i porównywać to do o wiele bardziej zakorzenionych na rynku rozwiązań. Niefair.

Ja ten rozwój opieram na tym, co widzę, podpierając się:

a) statystykami z GitHuba i _rosnącym_ słupkiem oznaczonym „JavaScript”, który jest dla mnie wyrocznią, mało kto robiący dziś web nie ma konta na GitHubie, a największę projekty migrują właśnie tam (Linux, RoR, TextMate, Django, jQuery, PHP Symfony, Redis, Perl, CodeIgniter)
b) liczbie firm, które zaczynają stawiać na JS po stronie serwera (gołym okiem widzę to np. robiąc szkolenia z tego języka)
c) niesamowitej ekspansji JS: FirefoxOS, node.js, arduino, WebOS, MongoDB, CouchDB, PhoneGap, mnóstwie silników do gier HTML5, systemów prezentacji, pdf.js, cloud9 (edytor kodu w chmurze) – https://github.com/languages/JavaScript/most_watched

Tego jest mnóstwo! I właśnie porównując okres powiedzmy ostatnich kilku lat, ten rozwój jest dla mnie największy wśród webowych języków programowania, moze nawet nie tylko webowych. Jeszcze niedawno ten język służył do przesuwania divów na stronie. Czy to nie jest właśnie rozwój?!

Poza tym nie wiem dlaczego zarzucasz mi pomieszanie języka z ekosystemem, skoro właśnie o tym jest artykuł. Projektów nie buduje się korzystając z samego języka, a właśnie dostępnych w nim narzędzi.

W kazdym razie z jednym mozemy sie zgodzic – nie ma jednej wyroczni wskazujacej, jaki jezyk jest najpopularniejszy. To jest niemozliwe.

19

imso2004: W zadnym wypadku, wlasnie frameworki MV* powstaly, by podzielic aplikacje na logiczne czesci, aby pliki .js w projekcie nie byly zbiorem:

function bla() {}
function foo() {}

i tak dalej.

Jeśli robisz interaktywną aplikację, nie do końca statyczną stronę, to programiści back-end z reguły powinni Ci dostarczać jakieś dane (czy to wpisane na sztywno pomiedzy <script></script> czy to np. w postaci jakichs webservicow REST (wtedy pytasz o te dane AJAXem np. i cos z nimi robisz – np. inicjujesz widok w Backbone w oparciu o Backbone.Model z tymi danymi, ktore dostales).

20

To nie są ataki :) To jest żywa dyskusja z dwóch różnych punktów widzenia. Całość wynika z tego, że na samym początku artykułu napisałeś o dynamicznym rozwoju języka, a dalej opisujesz ekosystem. Czytając ten artykuł liczyłem na coś więcej niż lista bibliotek. Po prostu jako autor wzbudziłeś we mnie apetyt, a go nie zaspokoiłeś. Nie lubię tego zagrań i dlatego napisałem komentarz.
Chcesz dynamicznego rozwoju języka – weź Python 3, język D czy Scala. Tam się cały czas coś dzieje przy samym języku, a nie ekosystemie. I myślę, że nie powinniśmy tego mylić. I to jest cel całej dyskusji.
Wszytko o czym piszesz dzieje się też w innych językach, tylko nie jest o tym głośno, bo obecnie jest moda na front-end, a nie backend. Z przykładów, które podałeś:
– node.js powinien umrzeć – opiera się o własnościową wirtualną maszynę, która dodatkowo jest dziurawa jak ser szwajcarski do innych zastosowań niż przeglądarka z sandboxem.
– MongoDB ma jeszcze przed sobą baaaardzo długą drogę zanim dorośnie do czegoś rozsądnego ( poświeciłem prawie dwa tygodnie na wchłanianie wiedzy o Mongo i testowej migracji mojej 110GB bazy postgresowej – zostałem przy postgresie)
Resztę traktuję dość obojętnie – przyglądam im się i pewnie coś w najbliższym czasie wybiorę do przetestowania. Jak osiągną poziom odpowiednio dojrzały – będę jest stosował.
Jeżeli chodzi o GitHuba – wcale nie dziwne, że Linux tam jest, bo sam git został dosłownie nabazgrany przez Torvaldsa jak mu zamknęli Mercuriala. Ja wybrałem BitBucketa, bo wychodzę z założenia, że korzystam z tych narzędzi, które są dla mnie wygodne, a nie tych, które są modne. Pewnie dlatego do nie dawna siedziałem jeszcze na SVNie.
A jeżeli chodzi o mnie – nie jestem programistom Javy, chociaż ostatnio tym się zajmuje (jedna z wielu rzeczy). Po wielu latach z administratora / programisty zamieniłem się raczej w świadomego architekta i obserwatora, który wybiera technologie do rozwiązania problemów, a nie dlatego, że mu się to podoba, czy jest modne. Mogę pisać w C, C++, Perlu, PHP (właściwie w tych językach napisałem całkiem sporo, łącznie z łatkami na kernel linuksowy), Rubym, Pythonie, Grailsach, C#, VisualBasicu. Za JS nie przepadam, bo jest po prostu brzydki – LUA jest ładniejsza. Jest jednak potrzebny i trzeba w nim coś czasami naskrobać.
Nie rozumiem natomiast co masz przeciwko Javie? Bo wygląda na to, że znać Jave i w niej pisać to jakaś skaza na honorze. Ostatnio nawet słyszałem tekst, że powinienem pisać w RoR (?!?!), bo w Javie nie da się kodować agilowo (co jest oczywiście bzdurą).
No i pisząc „cloud9 (edytor kodu w chmurze)” miałeś na myśli „cloud9 (edytor kodu w internecie)”?

21

lwalkowski: przecież napisał wprost że nie chodzi o rozwój języka jako takiego – „To ten język, mimo pewnych braków, rozwija się dzisiaj najszybciej na świecie. I to nie na płaszczyźnie składni i tak dalej. Wokół JS-a powstał cały ekosystem”. Więc skoro mowa o ekosystemie to źródło z githuba jest raczej trafione. Pod względem składni JS niemal stoi w miejscu, nie biorę pod uwagę nowych wersji bo to jeszcze nie ten czas żeby z nich korzystać.

Ktoś wyżej napisał że zna tylko 2 na 10 programistów korzystających z githuba – pamiętajmy że żyjemy w PL, tutaj nie ma czasu rozwijać własnych pomysłów i wrzucać je na githuba (za darmo? hańba!), bo trzeba zarobić na chleb. Inna sprawa: spróbuj zatrudnić rasowego programistę Javascript, u nas tego typu ludzi prawie nie ma.

Mnie też na początku JS wydawał się brzydki, myślę że trzeba w nim trochę pokodować żeby odnaleźć to coś :)

22

Świetny przegląd.

Wielkie dzięki Damian.

gajdaw
23

Dynamiczny rozwój języka można rozumieć jako wypadkową tego, co dzieje się w środowisku i tego, co dzieje się za kulisami, od strony specyfikacji samego języka i tego, co potrafią hosty (w naszym przypadku przeglądarki). Faktycznie ekosystem pęcznieje w tempie niemal wykładniczym, jest też draft ES.next itd., z drugiej strony, i to chyba najważniejsze, ludzie bardziej wnikają w niuanse języka i adaptują pojęcia, techniki, praktyki etc. powszechne do tej pory wśród developerów działających w innych technologiach. Jest shift w fajnym kierunku, można wykazać się intelektualnie, kreatywnie czy nawet, jak pokazują życiorysy niektórych, zostać branżowym celebrytą (swoją drogą, ciekawe kiedy zaczną pojawiać się pierwsze JSgroopies ;)). Faktycznie trzeba więcej się uczyć, więcej ogarniać i być na bieżąco, ale warto. Najważniejsze, że nie ma nudy i duża w tym zasługa ludzi takich jak Damian.

Wojciech Fornal
24

Świetny Blog i jeszcze lepsze artykuły .
Będe stałym bywalcem .
Pozdrawiam .

rondstill
25

Bardzo podobają mi się Twoje wpisy. Konkretne i na temat. Bardzo miło się czyta. Z pewnością będę tu często zaglądał.

Dodaj komentarz

Dozwolone tagi: <blockquote>, <code>, <strong>