<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ferrante.pl - simplicity of web programming &#187; jQuery</title>
	<atom:link href="http://ferrante.pl/category/tech/jquery/feed/" rel="self" type="application/rss+xml" />
	<link>http://ferrante.pl</link>
	<description>Technologie internetowe, PHP5, Python, Javascript. Publicystyka i kursy w najlepszym wydaniu.</description>
	<lastBuildDate>Tue, 27 Jul 2010 19:28:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Front-Trends 2010 &#8211; najtańsza konferencja w Europie?</title>
		<link>http://ferrante.pl/2010/07/27/front-trends-2010-najtansza-konferencja-w-europie/</link>
		<comments>http://ferrante.pl/2010/07/27/front-trends-2010-najtansza-konferencja-w-europie/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 19:28:32 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=799</guid>
		<description><![CDATA[A już na pewno, jeśli chodzi o tę tematykę i taki line-up. Uruchomiliśmy właśnie sprzedaż biletów na Front-Trends 2010, na której pojawią się w tym roku elektryzujące nazwiska, jak Douglas Crockford, Tantek Çelik i Peter-Paul Koch. Pierwsza tura biletów jest ekstremalnie tania, bo 98€ za sztukę! Biletów jest dwadzieścia, więc proszę się spieszyć! Ponadto bilety [...]]]></description>
			<content:encoded><![CDATA[<p>A już na pewno, jeśli chodzi o tę tematykę i <a href="http://front-trends.com/schedule">taki line-up</a>. Uruchomiliśmy właśnie <a href="http://front-trends.com/registration">sprzedaż biletów</a> na Front-Trends 2010, na której pojawią się w tym roku elektryzujące nazwiska, jak Douglas Crockford, Tantek Çelik i Peter-Paul Koch. Pierwsza tura biletów jest <strong>ekstremalnie tania</strong>, bo 98€ za sztukę! Biletów jest dwadzieścia, więc proszę się spieszyć! Ponadto bilety Early Birds są również bardzo tanie, bo 148€. Nie ma chyba innej konferencji z takimi nazwiskami za taką cenę! Zrobiliśmy chyba wszystko, by umożliwić Polakom i obywatelom krajów sąsiednich jak najlepszy dostęp do liderów branży front-end na świecie. Warto było czekać.</p>
<p>To jak, widzimy się na Front-Trends 2010?</p>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2010/07/27/front-trends-2010-najtansza-konferencja-w-europie/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Wygraj bilet na Front-Trends 2010</title>
		<link>http://ferrante.pl/2010/06/10/wygraj-bilet-na-front-trends-2010/</link>
		<comments>http://ferrante.pl/2010/06/10/wygraj-bilet-na-front-trends-2010/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 21:11:54 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=782</guid>
		<description><![CDATA[Przygotowaliśmy specjalny konkurs dla wszystkich, którzy chcieliby być na Front-Trends 2010 w Warszawie. Sprawa jest prosta &#8211; przygotuj ciekawy efekt, stronę, animację, cokolwiek, co jest zbudowane w HTML5, CSS3 lub JS, i udowodnij w swojej pracy, że warto przyjść na Front Trends 2010. Biorąc pod uwagę, że można zaoszczędzić dobrych kilkaset złotych (i przy okazji [...]]]></description>
			<content:encoded><![CDATA[<p style="font-weight: normal !important;">Przygotowaliśmy <a href="http://front-trends.com/konkurs.html">specjalny konkurs</a> dla wszystkich, którzy chcieliby być <a href="http://front-trends.com">na Front-Trends 2010 w Warszawie</a>. Sprawa jest prosta &#8211; przygotuj ciekawy efekt, stronę, animację, cokolwiek, co jest zbudowane w HTML5, CSS3 lub JS, i udowodnij w swojej pracy, że warto przyjść na Front Trends 2010. Biorąc pod uwagę, że można zaoszczędzić dobrych kilkaset złotych (i przy okazji czegoś się nauczyć) polecam gorąco!</p>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2010/06/10/wygraj-bilet-na-front-trends-2010/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Szkolenia dla firm</title>
		<link>http://ferrante.pl/2010/05/29/szkolenia-dla-firm/</link>
		<comments>http://ferrante.pl/2010/05/29/szkolenia-dla-firm/#comments</comments>
		<pubDate>Sat, 29 May 2010 18:15:01 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=770</guid>
		<description><![CDATA[Dostaję ostatnio wiele zapytań od firm, czy prowadzę też komercyjne szkolenia z JavaScript, HTML5 i jQuery. Odpowiedź jest prosta &#8211; oczywiście. Jeśli Twoja firma jest zainteresowana przeprowadzeniem profesjonalnego szkolenia z JavaScript, HTML5 lub jQuery (bądź wszystkich) przekieruj proszę kontakt na mojego maila, który dostępny jest w stopce strony. Cena jest zależna od indywidualnych wymagań, ponieważ [...]]]></description>
			<content:encoded><![CDATA[<p style="font-weight: normal !important;">Dostaję ostatnio wiele zapytań od firm, czy prowadzę też komercyjne szkolenia z JavaScript, HTML5 i jQuery. Odpowiedź jest prosta &#8211; oczywiście. Jeśli Twoja firma jest zainteresowana przeprowadzeniem profesjonalnego szkolenia z JavaScript, HTML5 lub jQuery (bądź wszystkich) przekieruj proszę kontakt na mojego maila, który dostępny jest w stopce strony. Cena jest zależna od indywidualnych wymagań, ponieważ każde ze szkoleń jest dostosowywane do poziomu uczestników i celów, jakie powinny zostać osiągnięte po ukończeniu danego kursu. Jeśli Twoja firma nie jest jeszcze pewna, czy JS to dobry pomysł, wyślij szefowi kilka linków: </p>
<ul>
<li><a href="http://ferrante.pl/2009/03/17/zostan-lepszym-programista-front-endu-fakty-i-mity/">Zostań lepszym programistą front-endu</a></li>
<li><a href="http://ferrante.pl/2008/06/21/frontend/">Front-end</a></li>
<li><a href="http://pawelstawicki.blogspot.com/2010/03/javascript-training.html">Szkolenie &#8211; recenzja</a></li>
<li><a href="http://ferrante.pl/2010/03/15/szkolenie-w-szczecinie/">Szkolenie w Szczecinie</a></li>
<li><a href="http://ferrante.pl/2010/03/23/szczecin-czesc-trzecia/">Szkolenie w Szczecinie &#8211; relacja</a></li>
<li><a href="http://ferrante.pl/2010/02/23/var-szawa-done/">Szkolenie w Warszawie &#8211; relacja</a></li>
<li><a href="http://ferrante.pl/2010/02/02/darmowe-szkolenie-javascript-we-wroclawiu">Szkolenie we Wrocławiu &#8211; relacja</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2010/05/29/szkolenia-dla-firm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Konferencyjna Polska</title>
		<link>http://ferrante.pl/2010/05/26/konferencyjna-polska/</link>
		<comments>http://ferrante.pl/2010/05/26/konferencyjna-polska/#comments</comments>
		<pubDate>Wed, 26 May 2010 21:01:24 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=766</guid>
		<description><![CDATA[We wtorek miałem przyjemność uczestniczyć w SparkUp, prawdopodobnie pierwszej w Polsce konferencji o webdev i ux, zrealizowanej z tak dużym rozmachem. Jestem pod wrażeniem atmosfery i ludzi, którzy pojawili się w Poznaniu. Biletów sprzedano masę i dobitnie świadczy to o tym, że w Polsce jest ogromny potencjał i świetny klimat dla takich inicjatyw.
Nie jeździsz na [...]]]></description>
			<content:encoded><![CDATA[<p>We wtorek miałem przyjemność uczestniczyć w <a href="http://sparkup.pl">SparkUp</a>, prawdopodobnie pierwszej w Polsce konferencji o webdev i ux, zrealizowanej z tak dużym rozmachem. Jestem pod wrażeniem atmosfery i ludzi, którzy pojawili się w Poznaniu. Biletów sprzedano masę i dobitnie świadczy to o tym, że w Polsce jest ogromny potencjał i świetny klimat dla takich inicjatyw.<span id="more-766"></span></p>
<h3>Nie jeździsz na konferencje &#8211; tracisz!</h3>
<p>Przede wszystkim, zastałem w stolicy Wielkopolski mnóstwo nieprzypadowych gości. Byli tam managerowie, programiści, designerzy, blogerzy, internetowi celebryci, Czytelnicy tego bloga, uczestnicy moich szkoleń i masa innych specjalistów, którzy na co dzień tworzą nasz polski internet. Motywowały zasłyszane przeze mnie kuluarowe rozmowy, zainspirowane zapewne obejrzanymi wcześniej wystąpieniami. <i>Wiesz, zamiast trzech buttonów dajemy jeden, a to to w ogóle porażka, nie wiem czemu tak zrobiliśmy&#8230;</i> &#8211; spierał się siedzący za mną zespół developerów. Tym ludziom po prostu zależało, a strzelam, że takich dyskusji było tego dnia więcej.</p>
<p>Powiedzmy sobie głośno, jeśli jeszcze tego nie wiesz &#8211; nie bywasz na konferencjach &#8211; przegrywasz. Przegrywasz wiedzę, kontakty biznesowe, potencjalnie wartościowych, nowych znajomych. A w ogólnym rozrachunku &#8211; pieniądze, które mógłbyś zdobyć dzięki powyższym. Na sali kręciły się osoby, związane z takimi markami jak Microsoft, Opera, Nokia, Roche, czy Allegro. Pytanie &#8220;szukasz pracy?&#8221; zdecydowanie nie było tematem tabu.</p>
<h3>Przeglądarka Twoim domem</h3>
<p>Następna dekada to czas nowoczesnego, zgodnego ze standardami front-endu. JavaScript jest już dostępny na większości zaawansowanych urządzeń mobilnych, świat podbija niesamowity HTML5 (i krążące wokół niego nowinki), a <a href="http://www.apple.com/hotnews/thoughts-on-flash/">Flash umiera</a>. W dużych korporacjach &#8220;J2ME&#8221; zaczyna być ustawiany w parze z takimi słowami jak skansen czy muzeum, a zaawansowane, webowe aplikacje sprawiają wrażenie software&#8217;u desktopowego &#8211; są szybkie, lekkie, wygodne i działają w przeglądarce. Jest rzeczą niezwykle ważną, abyśmy nie przegapili pewnego skoku jakościowo &#8211; technologicznego, który niedługo się dokona. Tym bardziej cieszy fakt, że na horyzoncie pojawiły się wydarzenia, dzięki którym możemy poczuć się jak np. Brytyjczycy, którzy mają u siebie co roku kilkanaście (o ile nie więcej) takich konferencji.</p>
<h3>SparkUp &#8211; jestem na tak</h3>
<p>Nie chciałbym oceniać poszczególnych elementów konferencji SparkUp. Jak na każdej, były rzeczy, które należałoby poprawić, jak i te, za które należą się oklaski. Ogólne wrażenie było bardzo dobre. Nie będzie więc tutaj szyderczej i bratobójczej krytyki, którą z pewnością wielu blogerów by podniosło. Zresztą, najlepiej konferencję ocenią/ocenili jej uczestnicy na <a href="http://blip.pl/tags/sparkup">Blipie</a> czy <a href="http://twitter.com/#search?q=sparkupconf">Twitterze</a>. Jest to wręcz idealny kanał komunikacji dla takich eventów, czego kiedyś nie doceniałem.</p>
<p>Miałem też okazję porozmawiać dłuższą chwilę z jednym z organizatorów &#8211; Piotrem Czekałą. Wielkie gratulacje za chęci i sprawienie, że konferencja się odbyła! Miejcie świadomość, że SparkUp organizują sympatyczni ludzie z głową na karku. Przy okazji dowiedzieliśmy się kilku ciekawych rzeczy, co z pewnością przemyślimy w kontekście <a href="http://front-trends.com">Front Trends</a>.</p>
<h3>Front Trends</h3>
<p>No właśnie, Front Trends. Pojawiło się ostatnio mnóstwo pytań, co do konferencji, która odbędzie się w Warszawie 21 i 22 października. Wiedzcie, że pracujemy bardzo ciężko nad pełną wersją strony internetowej, a także nad cenami i ścieżkami tematycznymi. Nie chcę składać żadnych obietnic czasowych, ponieważ mamy zamiar zaoferować Wam jak najlepszą konferencję i dbamy o dopracowanie każdego szczegółu. Zbliża się najwyższy moment na podanie wszystkich, wiążących informacji, więc proszę o odrobinę cierpliwości!</p>
<h3>Konferencji czas</h3>
<p>Muszę przyznać, że jestem wielkim optymistą, jeśli chodzi o przyszłość konferencyjną w Polsce. Po tym, co usłyszałem i zobaczyłem we wtorek, jestem pewien, że Polska pragnie takich wydarzeń. I będzie je miała, bo taki potencjał nie może zostać zmarnowany.</p>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2010/05/26/konferencyjna-polska/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Front-Trends 2010 &#8211; konferencja, jakiej w Polsce nie było</title>
		<link>http://ferrante.pl/2010/04/13/front-trends-2010-konferencja-jakiej-w-polsce-nie-bylo/</link>
		<comments>http://ferrante.pl/2010/04/13/front-trends-2010-konferencja-jakiej-w-polsce-nie-bylo/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 08:39:27 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[W sieci...]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=736</guid>
		<description><![CDATA[Wielkie wydarzenie w świecie polskiego i wschodnioeuropejskiego front-endu. Z inicjatywy Pawła Czerskiego i Damiana Wielgosika oraz firmy Frontend Force, 21-22 października br. w Warszawie odbędzie się konferencja Front-Trends 2010. Największe światowe gwiazdy JavaScript, CSS3 i HTML5 przyjadą do stolicy Polski podzielić się swoją wiedzą i doświadczeniem. Wśród nich między innymi Douglas Crockford, Peter-Paul Koch, Paul [...]]]></description>
			<content:encoded><![CDATA[<p>Wielkie wydarzenie w świecie polskiego i wschodnioeuropejskiego front-endu. Z inicjatywy Pawła Czerskiego i Damiana Wielgosika oraz firmy <a href="http://frontendforce.com">Frontend Force</a>, <strong>21-22 października br. w Warszawie</strong> odbędzie się konferencja <a href="http://front-trends.com">Front-Trends 2010</a>. Największe światowe gwiazdy JavaScript, CSS3 i HTML5 przyjadą do stolicy Polski podzielić się swoją wiedzą i doświadczeniem. Wśród nich między innymi <strong>Douglas Crockford, Peter-Paul Koch, Paul Bakaus,</strong> czy <strong>Dmitry Baranovskiy</strong>.</p>
<p>Można powiedzieć, że marzenia się spełniają. Długo zapowiadana niespodzianka stała się faktem. Szykuje się <strong>największe w tej części Europy</strong> święto dla wszystkich ludzi odpowiedzialnych za kształt Internetu.</p>
<p>Niniejszym zapraszam na stronę informacyjną konferencji &#8211; <a href="http://front-trends.com">Front-Trends.com</a>. Jak dotąd, udało się nam zebrać samą śmietankę w postaci <strong>naukowców</strong>, <strong>ewangelizatorów</strong> i <strong>twórców popularnych frameworków</strong>. Ludzi, którzy kreują światowy web. Już wkrótce kolejne, równie gorące nazwiska!</p>
<p>Oficjalna strona wydarzenia ma obecnie charakter wyłącznie informacyjny. Identyfikacja wizualna wraz logo i pełną wersją strony (w tym płatnościami) pojawią się <strong>już niedługo</strong>. Jednocześnie zapraszamy na <a href="http://twitter.com/fronttrends">Twittera</a> oraz <a href="http://fronttrends.blip.pl">Blip</a> po najnowsze wiadomości.</p>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2010/04/13/front-trends-2010-konferencja-jakiej-w-polsce-nie-bylo/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Wrocławski JavaScript, czyli pierwsze szkolenie za nami!</title>
		<link>http://ferrante.pl/2010/02/02/darmowe-szkolenie-javascript-we-wroclawiu/</link>
		<comments>http://ferrante.pl/2010/02/02/darmowe-szkolenie-javascript-we-wroclawiu/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 23:43:39 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=662</guid>
		<description><![CDATA[W ostatni weekend stycznia, zgodnie z zapowiedziami, odbyło się wrocławskie szkolenie z zaawansowanego JavaScriptu, które miałem przyjemność poprowadzić. Warto podsumować mój debiut w nowej roli, tym bardziej, że atmosfera i sam przebieg szkolenia były z mojej perspektywy bardzo dobre.
Można powiedzieć, że przed całym wydarzeniem większa była ciekawość niż obawy. W zasadzie wszystko układało się po [...]]]></description>
			<content:encoded><![CDATA[<p>W ostatni weekend stycznia, zgodnie z zapowiedziami, odbyło się wrocławskie szkolenie z zaawansowanego JavaScriptu, które miałem przyjemność poprowadzić. Warto podsumować mój debiut w nowej roli, tym bardziej, że atmosfera i sam przebieg szkolenia były z mojej perspektywy bardzo dobre.<span id="more-662"></span></p>
<p>Można powiedzieć, że przed całym wydarzeniem większa była ciekawość niż obawy. W zasadzie wszystko układało się po mojej myśli &#8211; świetną organizacją popisali się chłopaki z Frontend Force, a lista chętnych zapełniła się błyskawicznie i to z dość dużą rezerwą. Napiszę szczerze, że wyczekiwałem tego weekendu, ale i nie rozmyślałem zbytnio o tym, co będzie, gdy to czy tamto. Polecam to uczucie &#8211; swego rodzaju niezwykle pozytywna adrenalina! Fakt ten potęgowany był także tym, że wiedziałem, iż spotkam na żywo Czytelników tego bloga. Przyjemnie było przekonać się, że ktoś to jednak czyta i są to ludzie nie w ciemię bici. Szacun! Polecam przy okazji programik ZoomIt, który został mi z kolei zareklamowany przez jednego z Czytelników. Przetestowałem przez chwilę i jest naprawdę wygodny dla ludzi prowadzących prezentację. Można łatwo rysować po ekranie czy powiększać pewne jego obszary. Paweł &#8211; dzięki!</p>
<p>Na szkolenie przybyli wszyscy, czyli dziesięć osób. Programiści front-end, JAVA, PHP, Python, a niektórzy nawet z doświadczeniami w DTP. Zaczęliśmy punktualnie o 9.30. Muszę przyznać, że 8 godzin przeznaczonych na dzień szkolenia wydaje się być wystarczające. Jednak tylko na papierze. Jeśli chodzi o tak rozbudowany materiał to za mało. W efekcie robi się bardzo intensywnie i w okolicach 15-16 dało się wyczuć już nieco zmęczenia w powietrzu. Mam nadzieję, że coś pamiętacie z tego okresu ;-). Pomysły, jak temu zaradzić? Moim rozwiązaniem na kolejne szkolenia jest nieco więcej przerw i mniej materiału (choć chciałbym tego uniknąć). Postaram się też jeszcze bardziej wtrącać do wykładu różnego typu anegdoty i dialogi, co moim zdaniem nieźle sprawdzało się w niedzielę. A jak Wy myślicie?</p>
<p>Jeśli chodzi o warstwę merytoryczną, niestety nie udało się zrealizować w całości rozdziału o DOM. Obiecałem jednak chłopakom, że przygotuję drugie szkolenie tylko i wyłącznie o tym zagadnieniu, także kto wie, czy nie spotkamy się już wkrótce analizując <span class="f">getElementById</span> i pochodne. Pomimo to jestem zadowolony. Szczególnie miło było, kiedy robiliśmy powtórkę z pierwszego dnia. Wszystkie moje pytania znalazły dobre odpowiedzi. Przyznam szczerze, że bardzo mnie to podbudowało. Starałem się, aby jak najwięcej było rozwiązywania zadań czy kodowania na ekranie. Raczej udało się to zrealizować, choć jako człowiek, który nie zna umiaru, nie jestem pewien czy było tego wystarczająco. Ale jak zwykle opinia uczestników jest tutaj najważniejsza. Więc jak, jeszcze więcej kodowania, czy wyważyliśmy jakoś te elementy?</p>
<p>Podsumowując, jestem bardzo zadowolony. Dużą satysfakcją było usłyszeć, że szkolenie podobało się i pokazało, jak potężnym językiem <del datetime="2010-02-01T23:41:16+00:00">może być</del> jest JavaScript. Oczywiście wyciągnąłem też kilka innych wniosków &#8211; typowo wykładowych &#8211; jak zachowywać się w pewnych sytuacjach, o czym i kiedy mówić, i tak dalej&#8230; Z pewnością doświadczenia te zaprocentują w przyszłości!</p>
<p>Co do Wrocławia. To naprawdę ładne miasto, szkoda tylko, że widziane przeze mnie głównie wieczorem. Widać, że rozwija się dynamicznie, a niezła architektura i mnóstwo kanałów wodnych tworzą niesamowity klimat, jakby niedostępny dla innych miast Polski. Wybiorę się tam jeszcze latem, na bank! Słowa uznania również, po raz kolejny, dla miejscowych. Wiele ciekawych rozmów, żartów i śmiechu choćby z Helionu, IE (a jak!), blogerskich sław i wielu innych tematów, które trudno w szkoleniowym amoku spamiętać. Kelnerki też mają ładne. ;-)</p>
<p>Co dalej? Przede wszystkim opublikuję rozwiązanie jednego z zadań, które było, uznajmy, pracą domową. Następnie możecie spodziewać się informacji o kolejnych szkoleniach. Następne już lutym!</p>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2010/02/02/darmowe-szkolenie-javascript-we-wroclawiu/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Zmiany w jQuery 1.4</title>
		<link>http://ferrante.pl/2010/01/16/zmiany-w-jquery-1-4/</link>
		<comments>http://ferrante.pl/2010/01/16/zmiany-w-jquery-1-4/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 22:00:34 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=628</guid>
		<description><![CDATA[Zespół jQuery z Johnem Resigiem na czele wypuścił właśnie wersję 1.4 frameworka jQuery, który lubimy i cenimy (choć nie jest doskonały). W związku z tym powstała specjalna strona 14 dni jQuery, gdzie codziennie będzie pojawiać się jakaś niespodzianka związana z premierą nowego jQuery. Przyjrzyjmy się zmianom.
Lepsza dokumentacja API
Przede wszystkim warto zauważyć metamorfozę strony z dokumentacją. [...]]]></description>
			<content:encoded><![CDATA[<p>Zespół jQuery z Johnem Resigiem na czele wypuścił właśnie wersję <span class="f">1.4</span> frameworka jQuery, który lubimy i cenimy (choć nie jest doskonały). W związku z tym powstała specjalna strona <a href="http://jquery14.com">14 dni jQuery</a>, gdzie codziennie będzie pojawiać się jakaś niespodzianka związana z premierą nowego jQuery. Przyjrzyjmy się zmianom.<span id="more-628"></span></p>
<h3>Lepsza dokumentacja API</h3>
<p>Przede wszystkim warto zauważyć metamorfozę strony z dokumentacją. Starą <a href="http://docs.jquery.com">docs.jquery.com</a> (pozostanie online jeszcze przez jakiś tydzień) zastąpiła nowa <a href="http://api.jquery.com">api.jquery.com</a>. Od tej pory wszystkie funkcje jQuery są wylistowane na stronie głównej &#8211; nie trzeba szukać i domyślać się, do której kategorii należy to, czego szukamy. Całość działa na <a href="http://wordpress.org">Wordpressie</a> i co zauważyli twórcy &#8211; odbiło się to na szybkości działania. Z większych ciekawostek warto nadmienić, że od teraz każda funkcjonalność posiada informację, kiedy została wprowadzona do jQuery &#8211; licząc od wersji 1.0. Oprócz tego dostępny jest też <a href="http://api.jquery.com/api/">dump API w XML</a>.</p>
<h3>Co nowego?</h3>
<p>Wersja 1.4 wygląda teraz tak, jeśli chodzi o rozmiar:</p>
<ul>
<li><a href="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js">wersja zminifikowana i gzippowana</a> &#8211; <span class="f">23kb</span></li>
<li><a href="http://code.jquery.com/jquery-1.4.js">wersja developerska</a> &#8211; <span class="f">154kb</span></li>
</ul>
<p>Przyspieszyły funkcje <span class="f">empty()</span>, <span class="f">remove()</span>, <span class="f">html()</span>, <span class="f">css()</span>, <span class="f">attr()</span>, <span class="f">addClass()</span>, <span class="f">removeClass()</span>, <span class="f">hasClass()</span>,  <span class="f">append()</span>, <span class="f">prepend()</span>, <span class="f">before()</span> oraz <span class="f">after()</span>.</p>
<p>Mamy wreszcie settery w funkcjach takich jak .<a href="http://api.jquery.com/css">.css()</a>, <a href="http://api.jquery.com/attr">.attr()</a>, <a href="http://api.jquery.com/val">.val()</a>, <a href="http://api.jquery.com/html">.html()</a>, <a href="http://api.jquery.com/text">.text()</a>, <a href="http://api.jquery.com/append">.append()</a>, <a href="http://api.jquery.com/prepend">.prepend()</a>,  <a href="http://api.jquery.com/before">.before()</a>, <a href="http://api.jquery.com/after">.after()</a>, <a href="http://api.jquery.com/replaceWith">.replaceWith()</a>, <a href="http://api.jquery.com/wrap">.wrap()</a>, <a href="http://api.jquery.com/wrapInner">.wrapInner()</a>, <a href="http://api.jquery.com/offset">.offset()</a>, <a href="http://api.jquery.com/addClass">.addClass()</a>, <a href="http://api.jquery.com/removeClass">.removeClass()</a> oraz <a href="http://api.jquery.com/toggleClass">.toggleClass()</a>. Czym są settery? Otóż to funkcje, które możemy przekazać jako argument. Muszą one zwracać wartość, która zostanie bezpośrednio zaaplikowana do jednej z powyższych metod.</p>
<pre><code>$('.inner').wrap(function() {
	return '&lt;div class="' + $(this).text() + '" /&gt;';
});</code></pre>
<p>Powyższy kawałek kodu opakuje każdy element o klasie <span class="f">inner</span> w <span class="f">div</span> z klasą o nazwie zwróconej przez <em>text</em>, uruchomionej na każdym elemencie <span class="f">.inner</span>.</p>
<p>Ponadto wybrano funkcje, które oferują naszym setterom także aktualne wartości, w zależności od kontekstu. Są nimi <a href="http://api.jquery.com/css">.css()</a>, <a href="http://api.jquery.com/attr">.attr()</a>, <a href="http://api.jquery.com/val">.val()</a>, <a href="http://api.jquery.com/html">.html()</a>, <a href="http://api.jquery.com/text">.text()</a>, <a href="http://api.jquery.com/append">.append()</a>, <a href="http://api.jquery.com/prepend">.prepend()</a>, <a href="http://api.jquery.com/offset">.offset()</a>, <a href="http://api.jquery.com/addClass">.addClass()</a>, <a href="http://api.jquery.com/removeClass">.removeClass()</a> oraz <a href="http://api.jquery.com/toggleClass">.toggleClass()</a>. Działa to tak, że ta wartość jest dostępna jako drugi argument przekazywanej przez nas funkcji:</p>
<pre><code>$('a').html(function(i, html){
	return html.replace(/&amp;/gi,'<span class="amp">&amp;</span>');
});</code></pre>
<p>W tym wypadku pod zmienną <span class="f">html</span> będziemy mieli nic innego, jakby wynik funkcji <span class="f">$(this).html()</span> wywołanej na każdym znalezionym tagu <span class="f">a</span>.</p>
<p>Zmienił się trochę obiekt <span class="f">ajax</span>. Lepsze <a href="http://api.jquery.com/jQuery.param/">serializowanie</a> parametrów:</p>
<pre><code>{foo: ["bar", "baz"]}</code></pre>
<p> zamieni się w</p>
<pre><code>foo[]=bar&#038;foo[]=baz</code></pre>
<p>W poprzedniej wersji byłoby to tak:</p>
<pre><code>foo=bar&#038;foo=baz</code></pre>
<p>Jeśli jednak chcemy używać nadal starego sposóbu serializowania, można go uruchomić na trzy sposoby:</p>
<pre><code>// włącza tradycyjny sposób serializowania dla wszystkich operacji ajaxowych
<strong>jQuery.ajaxSettings.traditional = true;</strong>

// włącza tradycyjny sposób serializowania dla pojedynczej operacji
<strong>jQuery.param( stuff, true );</strong>

// włącza tradycyjny sposób serializowania dla pojedynczego requestu ajaxowego
<strong>$.ajax({ data: stuff, traditional: true });</strong></code></pre>
<p>Poza tym, kiedy request ajaxowy zwraca <span class="f">application/json</span>, parametr <span class="f">dataType</span> jest równy <em>JSON</em>. Jeśli jest to <span class="f">text/javascript</span> lub <span class="f">application/x-javascript</span> <em>dataType</em> przyjmuje <em>script</em> i kod jest automatycznie wykonywany.</p>
<p>Co więcej, jQuery ignoruje w zapytaniach ajaxowych flagę <em>Last-Modified</em> i za każdym razem dostarcza aktualną, zwróconą wartość żądania, nie sugerując się cache przeglądarki. Można zmienić to zachowanie, ustawiając <span class="f">ifModified: true</span>. jQuery wspiera także nagłówek <span class="f">If-None-Match</span>.</p>
<h3>JSON!</h3>
<p>jQuery używa teraz <a href="http://blog.mozilla.com/webdev/2009/02/12/native-json-in-firefox-31/">natywnego parsowania danych JSON</a>, jeśli tylko takie wspierane jest przez przeglądarkę. Nasze dane są też walidowane, więc coś takiego nie przejdzie:</p>
<pre><code>{foo: "bar"}</code></pre>
<h3>HTML5</h3>
<p>Co ciekawe, nowe typy formularzy z HTML5, jak np.:</p>
<pre><code>&lt;input type="datetime-local" /&gt;</code></pre>
<p>będą uwzględniane przy serializowaniu danych formularzy.</p>
<h3>Ajax context</h3>
<p>Oprócz tego, przy zapytaniach ajaxowych można teraz ustalić kontekst, w jakim mamy odpalić metodę <span class="f">success</span>:</p>
<pre><code>$.ajax({
	url: "test.html",
	context: document.body,
	success: function(){
		$(this).addClass("done");
	}
});</code></pre>
<p>W ten sposób, po wykonaniu się zapytania, tagowi <span class="f">body</span> ustawiona zostanie klasa <span class="f">done</span>.</p>
<pre><code>$.ajax({
	url: "test.html",
	context: $("#foobar"),
	success: function(data){
		$(this).html(data);
	}
});</code></pre>
<p>Analogicznie, po tej operacji, jeśli wszystko się powiedzie, elementowi <span class="f">#foobar</span> zostanie automatycznie wstawiony, powiedzmy, kawałek HTMLa, który pobraliśmy sobie z pliku <span class="f">test.html</span>, i który jest dostępny pod zmienną <span class="f">data</span>.</p>
<p>Co ważne, funkcja <em>success</em> przyjmuje teraz 3 argumenty:</p>
<pre><code>$.ajax({
	url: "test.html",
	context: $("#foobar"),
	success: function(data, status, xhr){
		$(this).html(data);
	}
});</code></pre>
<p>Pod pierwszym mamy zwróconą przez <em>request</em> wartość, pod drugim status operacji, a pod trzecim obiekt ajax (to co jest pod <em>$.ajax</em>).</p>
<p>Warto też zwrócić uwagę, że tym razem jQuery nie ignoruje <em>contentType</em> w zapytaniach ajaxowych. Jest on teraz zawsze wysyłany. Pojawiła się tez możliwość ustawienia <em>callback</em>&#8216;a dla JSONP &#8211; poprzez atrybut <span class="f">jsonpCallback </span>, natomiast zapytania <em>cross-domainowe</em> są teraz o wiele bardziej wydajne.</p>
<h3>Szybkość tworzenia nowych obiektów</h3>
<p>Zapomnij natychmiast o czymś podobnym:</p>
<pre><code>var obj = $("&lt;div /&gt;");
obj.css("background", "#ddd").html("something").click(function() { alert("foobar!"); }).appendTo("body");</code></pre>
<p>Można to teraz zrobić o wiele bardziej kompleksowo:</p>
<pre><code>var obj = $("&lt;div /&gt;", {
	css: {
		background: "#ddd"
	},
	html: "something",
	click: function() { alert("foobar!"); }
}).appendTo("body");</code></pre>
<h3>.eq(-N), .get(-N)</h3>
<p>Od teraz w funkcjach <span class="f">eq</span> i <span class="f">get</span> możemy użyć ujemnych wartości:</p>
<pre><code>$("div").eq(-2);
$("div").get(-2);</code></pre>
<p>W ten sposób wybierzemy elementy drugie od końca.</p>
<h3>first() i last()</h3>
<p>Jeśli mowa o końcu, developerzy dodali funkcję <span class="f">last</span>, która zwróci nam ostatni element oraz <span class="f">first</span>, analogicznie zwracającą pierwszy.</p>
<h3>toArray()</h3>
<p>Z nowych rzeczy pojawiła się także metoda <span class="f">toArray</span>, która zamienia wszystko&#8230; w tablicę:</p>
<pre><code>var arr = $('a').toArray();
typeof arr; // object
arr // [&lt;a id="foo"&gt;, &lt;a id="bar"&gt;]
arr[1].html("ustawiamy wartość html dla drugiego z kolei pobranego linka");</code></pre>
<h3>jQuery().ready() &#8211; nie działa!</h3>
<p>Kod <span class="f">$().ready()</span> przestał być wspierany. Zamiast tego użyj:</p>
<pre><code>$(document).ready()</code></pre>
<p>lub</p>
<pre><code>$(function(){})</code></pre>
<p>Wszystko dlatego, że <span class="f">$()</span> zwraca teraz pustą tablicę.</p>
<pre><code>typeof $() // object
$().length // 0</code></pre>
<h3>$(&#8220;tag&#8221;)</h3>
<p>Developerzy zarzekają się dumnie, że powyższa konstrukcja znacznie przyspieszyła. Przekonajcie się sami! Co więcej, warto dodać, że przyspieszył również selektor <span class="f">#id tag</span> np.:</p>
<pre><code>$("#foobar div");</code></pre>
<h3>toggleClass</h3>
<p><span class="f">toggleClass()</span> może ustawić teraz kilka klas naraz:</p>
<pre><code>$("div").toggleClass("current active");</code></pre>
<h3>Efekty</h3>
<p>Z fajnych rzeczy dodano także obsługę techniki <em>per-property easing</em>:</p>
<pre><code>$("#clickme").click(function() {
	$("div").animate({
	width: ["+=200px", "swing"],
	height: ["+=50px", "linear"],
	}, 2000, function() {
      		$(this).after("&lt;div&gt;Ukończono animację!&lt;/div&gt;");
  	});
});</code></pre>
<p>Co to znaczy? Ano to, że możemy użyć różnych stylów animacji (<em>swing</em>, <em>linear</em>) dla różnych właściwości CSS (powyżej, co jasne, są to: <em>width, height</em>) jednocześnie. </p>
<h3>$.proxy()</h3>
<p>Co robi nowa funkcja <span class="f">proxy()</span>? Otóż zmienia ona <em>scope</em> dla danej funkcji, co oznacza w gruncie rzeczy to, że łatwo możemy ustawić, co chcemy pod zmienną <span class="f">this</span>:</p>
<pre><code>var obj = {
	name: "John",
	test: function() {
		alert(this.name);
	}
};

$("#foobar").click($.proxy(obj, "test"));

// To także działa:
// $("#foobar").click($.proxy( obj.test, obj ));</code></pre>
<p>W ten sposób funkcja <span class="f">test</span> odwołuje się do obiektu <span class="f">obj</span> poprzez <em>this</em>, stąd tez dostępna własność <em>this.name</em>. Porównajcie sobie to z czymś takim:</p>
<pre><code>$("#foobar").click(function() {
	alert(typeof this.name);
});</code></pre>
<p>Wyświetlone zostanie <em>undefined</em>, ponieważ w tym wypadku skrypt będzie szukal <em>name</em> w obiekcie jQuery.</p>
<h3>bind i zdarzenia</h3>
<p>W wersji <span class="f">1.4</span> funkcja <span class="f">bind</span> przyjmuje wiele zdarzeń:</p>
<pre><code>$("#foobar").bind({
	click:  function() {},
	mouseover: function() {}
});</code></pre>
<p>Jeśli mowa o nich to wprowadzono także zdarzenia <span class="f">focusin</span> i <span class="f">focusout</span>. Czym różnią się one od <em>focus</em> i <em>blur</em>? Są to bowiem zdarzenia bąbelkowe i na tym polega cały myk. Zainteresowanym polecam przeczytać na temat różnic na temat <em>bubble oraz capture events</em>.</p>
<p>Usprawnień doznały także <em>live eventy</em>. Teraz każde tradycyjne zdarzenie może być użyte przez <span class="f">live()</span>. Wcześnie niektóre eventy były nieobsługiwane.</p>
<h3>detach()</h3>
<p>Nowa metoda <span class="f">detach</span> usuwa dany tag z drzewa DOM, ale jQuery nadal trzyma go w pamięci, dzięki czemu możemy szybko dodać go gdzie indziej, tym bardziej, że zachowane są zdarzenia, które zaaplikowaliśmy wcześniej:</p>
<pre><code>var foo = $("#foo").click(function() {});
foo.detach();
foo.appendTo("body");</code></pre>
<p>W powyższym przykładzie usuwamy <span class="f">#foo</span> z drzewa DOM w 2 linijce, ale nadal możemy go dodać gdzieś indziej, np. do <em>body</em>.</p>
<h3>unwrap()</h3>
<p>Co robi <span class="f">unwrap</span>? Usuwa opakowanie według danego taga:</p>
<p>Kod: </p>
<pre><code>&lt;body&gt;
    &lt;div&gt;
        &lt;p&gt;he&lt;/p&gt; &lt;p&gt;he&lt;/p&gt; &lt;p&gt;he&lt;/p&gt;
    &lt;/div&gt;
&lt;/body&gt;</code></pre>
<pre><code>$('div').unwrap();</code></pre>
<p>zwróci nam:</p>
<pre><code>&lt;body&gt;
   &lt;p&gt;he&lt;/p&gt; &lt;p&gt;he&lt;/p&gt; &lt;p&gt;he&lt;/p&gt;
&lt;/body&gt;</code></pre>
<h3>Inne</h3>
<p>Z ważniejszych rzeczy pojawiła się metoda, a w zasadzie setter <span class="f">offset</span>, który pozwala ustawić <em>offest</em> dla elementu. Wcześniej mogliśmy tylko takowy pobrać. Jest także <span class="f">delay()</span>, dzięki której możemy opóźniać animacje:</p>
<pre><code>$("div").fadeIn().delay(4000).fadeOut();</code></pre>
<p>W ten sposób animacja <em>fadeOut</em> wykona się dopiero po 4 sekundach po zakończeniu <em>fadeIn</em>.</p>
<p>Wprowadzono też <span class="f">clearQueue()</span>, która czyści zdefiniwaną kolejkę. Usuwa ona tylko funkcje, które nie zostały jeszcze wykonane. </p>
<p>Poza tym poprawiono zachowanie metody <span class="f">index</span>:</p>
<pre><code>$("div.current").index();</code></pre>
<p>Coś takiego zwróci <strong>1</strong> w podobnej sytuacji:</p>
<pre><code>&lt;p&gt;&lt;/p&gt;
&lt;div class="current"&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;</code></pre>
<p>Wprowadzono także metodę <span class="f">has()</span>. Dzięki niej z łatwością sprawdzimy, czy dany element zawiera w sobie inny:</p>
<pre><code>&lt;div id="foobar"&gt;
	&lt;p class="foo"&gt;&lt;/p&gt;
&lt;/div&gt;</code></pre>
<pre><code>$("#foobar").has("p.foo").length; // 1</code></pre>
<p>Zachowuje się tak samo jak:</p>
<pre><code>$("#foobar:has(p.foo)").length;</code></pre>
<p>Wprowadzono też: <span class="f">nextUntil()</span>, <span class="f">prevUntil()</span>, <span class="f">parentsUntil()</span>. Działają one podobnie do <span class="f">next</span> i analogicznych, z tym wyjątkiem, że wyszukujemy elementy aż do znalezienia tego, który podaliśmy jako argument. Np.:</p>
<pre><code>$("body").nextUntil("#foobar").css("display", "none");</code></pre>
<p>ukryje wszystkie elementy aż do wystąpienia tego o id <span class="f">foobar</span>.</p>
<p>Z innych zmian (oj, napracowali się chłopaki, napracowali&#8230;) mamy funkcje takie jak:</p>
<ul>
<li>$.isEmptyObject() &#8211; sprawdza, czy przekazany argument jest pustym obiektem tzn. czy nie ma żadnych składowych</li>
<li>$.isPlainObject() &#8211; sprawdza czy obiekt zawiera jakieś podobiekty. Np.:
<pre><code>var obj = {
	podObiekt: {}
};
$.isPlainObject(obj);</code></pre>
<p>Zwróci <span class="f">false</span>, ponieważ zdefiniowaliśmy inny obiekt (<em>podObiekt</em>) wewnątrz obiektu.</li>
<li>$.contains() &#8211; jeśli podamy jako parametry dwa obiekty DOM i drugi z nich mieści się w pierwszym, funkcja zwróci <span class="f">true</span></li>
<li>$.noop &#8211; zwraca pustą funkcję (analogicznie do składowej frameworku Prototype &#8211; Prototype.K)</li>
<li>$.unique() &#8211; szuka wśród podanej tablicy duplikatów i wyrzuca je z tablicy, zwracając nową, bez powtarzających się elementów</li>
</ul>
<p>Z innych ciekawostek <em>.clone(true)</em> kopiuje także dane z funkcji <em>data()</em>. Nie tylko zdarzenia!</p>
<p>To prawdopodobnie nie wszystkie zmiany w najnowszej wersji jQuery, lecz z pewnością wszystkie najważniejsze. Jak zawsze chłopaki z teamu Resiga odwalili kawał dobrej roboty. Warto więc przyjrzeć się nowemu jQuery oraz projektowi 14 dni z jQuery. Dawno nie działo się aż tyle pozytywnych rzeczy w tym projekcie.</p>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2010/01/16/zmiany-w-jquery-1-4/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Jak zrobić przypisy boczne w CSS i jQuery</title>
		<link>http://ferrante.pl/2009/04/19/jak-zrobic-przypisy-boczne-w-css-i-jquery/</link>
		<comments>http://ferrante.pl/2009/04/19/jak-zrobic-przypisy-boczne-w-css-i-jquery/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 17:04:13 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Publicystyka]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=428</guid>
		<description><![CDATA[Podczas kodowania nowego designu wpadłem w pewną pułapkę &#8212; umieszczałem przypisy boczne w kodzie po lub przed danym akapitem. W efekcie, czytając artykuł w czytniku RSS można było poczuć niemałą dezorientację, kiedy ni stąd ni zowąd pojawiała się niespójna logicznie treść. Postanowiłem rozwiązać ten problem, przy okazji publikując i omawiając zastosowane przeze mnie rozwiązanie.
Naszym celem [...]]]></description>
			<content:encoded><![CDATA[<p>Podczas kodowania nowego designu wpadłem w pewną pułapkę &mdash; umieszczałem przypisy boczne w kodzie po lub przed danym akapitem. W efekcie, czytając artykuł w czytniku RSS można było poczuć niemałą dezorientację, kiedy ni stąd ni zowąd pojawiała się niespójna logicznie treść. Postanowiłem rozwiązać ten problem, przy okazji publikując i omawiając zastosowane przeze mnie rozwiązanie.<span id="more-428"></span></p>
<p>Naszym celem jest stworzenie przypisów dolnych tak, aby wyglądały jako boczne, zupełnie jak na tym blogu. Jeśli w jakimś akapicie znajdzie się odnośnik do przypisu, jego treść powinnna pojawić się z prawej strony akapitu (tagu <span class="f">&lt;p /&gt;</span>). Zacznijmy od semantycznego szablonu:</p>
<pre><code>&lt;div class="article"&gt;
	&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus massa. Fusce sed erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse auctor neque id purus. Ut dignissim felis et velit suscipit fringilla. Aenean et est et lacus interdum rutrum.&lt;a href="#przypis-1" class="hint"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; Nam iaculis ipsum vel neque blandit placerat. Cras dui elit, varius at, gravida a, consectetur ut, elit. Donec turpis. Fusce quis sapien ac nisl lobortis eleifend. Morbi posuere, massa vel fermentum commodo, arcu quam fermentum turpis, vel tincidunt ante odio at arcu. Sed vitae purus.&lt;/p&gt;
	&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus massa. Fusce sed erat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse auctor neque id purus. Ut dignissim felis et velit suscipit fringilla. Aenean et est et lacus interdum rutrum. Nam iaculis ipsum vel neque blandit placerat. Cras dui elit, varius at, gravida a, consectetur ut, elit. Donec turpis. Fusce quis sapien ac nisl&lt;a href="#przypis-2" class="hint"&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;lobortis eleifend. Morbi posuere, massa vel fermentum commodo, arcu quam fermentum turpis, vel tincidunt ante odio at arcu. Sed vitae purus.&lt;/p&gt;
	&lt;hr /&gt;
	&lt;ol id="notes"&gt;
		&lt;li id="przypis-1"&gt;First note&lt;/li&gt;
		&lt;li id="przypis-2"&gt;Second note&lt;/li&gt;
	&lt;/ol&gt;
&lt;/div&gt;</code></pre>
<p>Jak widać, kontenerem dla artykułu jest <span class="f">.article</span>, odnośnikami do przypisów są linki <span class="f">.hint</span>. Domyślne przypisy dolne tworzy lista <span class="f">#notes</span>.</p>
<p>Pora na trochę podstawowych CSSów. Wypozycjonujmy treść, nadajmy odpowiednie typy fontów i tak dalej:</p>
<pre><code>* {
	padding: 0;
	margin: 0;
}
a {
	text-decoration:none;
	color: #7EBB1F;
	font-weight: bold;
}
a:hover {
	background-color: #7EBB1F;
	color: #fff;
}
.article {
	width: 960px;
	margin: auto;
	font: normal 14px 'Lucida Sans Unicode', Arial, Helvetica, sans-serif;
}
.article p {
	margin-bottom: 20px;
	line-height: 20px;
	width: 680px;
}</code></pre>
<p>Generalnie, cel jest następujący &#8211; jeśli mamy włączony JavaScript usuwamy listę numerowaną <span class="f">&lt;ol#notes /&gt;</span>, a jej elementy zmieniamy na <span class="f">&lt;p /&gt;</span> i umieszczamy pomiędzy stosownymi akapitami artykułu. To teoretyczny opis. W praktyce będzie to zrobione nieco inaczej.</p>
<p>Poszukamy akapitów, które linkują do określonych przypisów. Jeśli dany akapit zawiera link <span class="f">.hint</span> to dodajemy zaraz po nim stosowny przypis. Treść przypisu pobierzemy na podstawie identyfikatora, który znajduje się po hashu (#) w linku-odnośniku.</p>
<p>Najpierw jednak zajmijmy się sytuacją, kiedy mamy wyłączony JavaScript:</p>
<pre><code>.article hr {
	border: none;
	border-top: 1px solid #7EBB1F;
	width: 680px;
	float: left;
	margin-bottom: 10px;
}
.article #notes {
	clear: left;
}
#notes li {
	font-size: 11px;
	width: 680px;
	margin-bottom: 3px;
	line-height: 15px;
	font-style: italic;
}</code></pre>
<p><a href="http://ferrante.pl/examples/jquery/przypisy/przypis1.html">Powyższym ostylowaliśmy przypisy dolne</a> &#8211; w końcu jeśli JavaScript będzie wyłączony, to będzie trzeba jakoś je zaprezentować. Warto sprawdzić efekt.</p>
<p>Fajnie jednak byłoby, gdyby jakiś aktywny przypis (tzn. ten, w który kliknęliśmy) został nieco wyróżniony. Zrobić możemy to dzięki selektorowi <span class="f">:target</span>:</p>
<pre><code>#notes li:target {
	font-weight: bold;
}</code></pre>
<p>Oznacza to, że jeśli w linku pojawi się identyfikator jakiegoś tagu <span class="f">&lt;li /&gt;</span> np. <em>przypis1.html#przypis-2</em> to treść tego tagu (tutaj: <span class="f">&lt; li id=&#8221;przypis-2&#8243; /&gt;</span>) zostanie wyboldowana. Wynika na to, że <a href="http://ferrante.pl/examples/jquery/przypisy/przypis2.html">załatwiliśmy problem wyłączonego JavaScriptu</a>.</p>
<p>Zajmijmy się teraz odpowiednimi skryptami, które przeniosą elementy z listy <span class="f">#notes</span> pod stosowne akapity. Skorzystamy w tym celu z <a href="http://jquery.com">jQuery</a>.</p>
<p>Najpierw należy poszukać wszystkich linków <span class="f">.hint</span> w obrębie artykułu <span class="f">.article</span>:</p>
<pre><code>$().ready(function() {
	$('.article .hint').each(function(i, element) {</code></pre>
<p>Dzięki funkcji <span class="f">each</span> przeiterujemy się przez wszystkie znalezione odnośniki do przypisów. Pierwsze, co powinniśmy zrobić, to znaleźć akapit, który jest rodzicem danego linku:</p>
<pre><code>$().ready(function() {
	$('.article .hint').each(function(i, element) {

		var parent = $(element).parent('p');</code></pre>
<p>Następnie pobieramy adres linku, by uzyskać identyfikator przypisu, do którego się on odnosi:</p>
<pre><code>$().ready(function() {
	$('.article .hint').each(function(i, element) {

		var parent = $(element).parent('p');
		var id = $(element).attr('href');</pre>
<p></code></p>
<p>Tym sposobem pod zmienną <span class="f">id</span> będą następujące wartości:</p>
<ul>
<li>#przypis-1</li>
<li>#przypis-2</li>
<li>itd.</li>
</ul>
<p>Pora pobrać treść przypisu na podstawie jego <em>ID</em> i uformować nowy akapit z przypisem:</p>
<pre><code>$().ready(function() {
	$('.article .hint').each(function(i, element) {

		var parent = $(element).parent('p');
		var id = $(element).attr('href');

		var note = $(id).html();

		var newNote = $('&lt;p class="note"&gt;&lt;sup id="'+id.replace(/#/g, '')+'"&gt;'+(i+1)+'&lt;/sup&gt;'+note+'&lt;/p&gt;');</code></pre>
<p>Szczególnie istotna jest tutaj 8. linijka:</p>
<pre><code>var newNote = $('&lt;p class="note"&gt;&lt;sup id="'+id+'"&gt;'+(i+1)+'&lt;/sup&gt;'+note+'&lt;/p&gt;');</code></pre>
<p>Otóż dzięki niej tworzymy nowy tag drzewa DOM jakim jest <span class="f">&lt;p /&gt;</span>. Oczywiście ubieramy go w stosowne wdzianko - nadajmy <em>class="note"</em> - tak, by potem można było ostylować przypis boczny. W nowym przypisie umieszczamy również indeks w <span class="f">&lt;sup /&gt;</span>, korzystając ze zmiennej <span class="f">i</span> z pętli <em>each</em> - jej wartość zaczyna się standardowo od zera, więc należy dodać jeden, by otrzymać zwykłe odliczanie od 1. Znacznik sup musi mieć dobry identyfikator bez hasha na początku. Wyrzucamy więc "#" przez <em>id.replace(/#/g, '')</em>.</p>
<p>Trzeba jeszcze zająć się pozycjonowaniem przypisu tak, by był wertykalnie nieco bliżej jego odnośnika <span class="f">.hint</span>. Spróbujemy ustawić tak dobrany, <strong>ujemny</strong> <span class="f">margin-top</span>, by nie było zbytnich przerw pomiędzy wspomnianym linkiem i akapitem z przypisem.</p>
<pre><code>$().ready(function() {
	$('.article .hint').each(function(i, element) {

		var parent = $(element).parent('p');
		var id = $(element).attr('href');

		var note = $(id).html();

		var newNote = $('&lt;p class="note"&gt;&lt;sup id="'+id.replace(/#/g, '')+'"&gt;'+(i+1)+&lt;/sup&gt;'+note+'&lt;/p&gt;');

		newNote.css('margin-top', (parseInt($(parent).css('margin-bottom')) + ($(parent).height() + $(parent).offset().top) - $(element).offset().top) * -1);</code></pre>
<p>Stosowny <em>margines górny</em> ustawiamy na podstawie prostego wyliczenia. Sumujemy wysokość i odległość od początku strony całego akapitu, a następnie od tej sumy odejmujemy odległość linku od początku strony. Odległość od początku strony możemy pobrać przez jQuery'owe <span class="f">offset().top</span>, a wysokość przez <span class="f">height()</span>. Do wszystkiego dodajemy jeszcze margines dolny akapitu, w którym mieści się link. Wszystko mnożymy razy minus jeden, by uzyskać ujemny margines dla naszego przypisu. Oto rysunek poglądowy, jak wyliczamy margines:</p>
<p><img src="http://ferrante.pl/wp-content/uploads/2009/04/przypisy.jpg" alt="przypisy" title="przypisy" width="448" height="195" class="alignnone size-full wp-image-433" /></p>
<p>Pora dodać nowy przypis pod stosowny akapit i zakończyć pętlę <em>each</em>:</p>
<pre><code>$().ready(function() {
	$('.article .hint').each(function(i, element) {

		var parent = $(element).parent('p');
		var id = $(element).attr('href');

		var note = $(id).html();

		var newNote = $('&lt;p class="note"&gt;&lt;sup id="'+id.replace(/#/g, '')+'"&gt;'+(i+1)+'&lt;/sup&gt;'+note+'&lt;/p&gt;');

		newNote.css('margin-top', (parseInt($(parent).css('margin-bottom')) + ($(parent).height() + $(parent).offset().top) - $(element).offset().top) * -1);

		newNote.insertAfter(parent);

});</code></pre>
<p>Na koniec musimy jeszcze usunąć przypisy dolne, które nie są już nam potrzebne:</p>
<pre><code>$().ready(function() {
	$('.article .hint').each(function(i, element) {

		var parent = $(element).parent('p');
		var id = $(element).attr('href');

		var note = $(id).html();

		var newNote = $('&lt;p class="note"&gt;&lt;sup id="'+id.replace(/#/g, '')+'"&gt;'+(i+1)+&lt;/sup&gt;'+note+'&lt;/p&gt;');

		newNote.css('margin-top', (parseInt($(parent).css('margin-bottom')) + ($(parent).height() + $(parent).offset().top) - $(element).offset().top) * -1);

		newNote.insertAfter(parent);

	});

	$('#notes').prev('hr').remove();
	$('#notes').remove();
});</code></pre>
<p><a href="http://ferrante.pl/examples/jquery/przypisy/przypis3.html">Wynik naszej zabawy nie wygląda jednak zbyt atrakcyjnie</a>.</p>
<p>Pora dodać stosowne style dla <span class="f">.note</span>:</p>
<pre><code>.article .note {
	float: right;
	background-color: #FBF1AB;
	border: 1px solid #ECD42B;
	width: 162px;
	padding: 4px;
	overflow: hidden;
	font-size: 12px;
}
.article .note sup {
	float:left;
	font-size:20px;
	vertical-align: bottom;
	margin-right: 5px;
	text-align: center;
	width: 30px;
}
.article .note sup:target {
	background: #FBEA71;
}</code></pre>
<p>Jest całkiem nieźle!</p>
<p>Można by co prawda zwiększyć widoczność odnośników do przypisów:</p>
<pre><code>.article .hint {
	margin-right: 10px;
}
.article .hint sup {
	font-size: 14px;
}</code></pre>
<p><a href="http://ferrante.pl/examples/jquery/przypisy/przypisy.html">Działa wyśmienicie</a>!</p>
<p>Zastosowane tutaj rozwiązanie ma w zasadzie tylko jedną wadę - nie należy nadużywać przypisów w jednym akapicie, ponieważ mogą one na siebie nachodzić, tworząc dość nieprzyjemny efekt. Oczywiście możemy nie stosować pozycjonowania względem odnośnika, usuwając linijkę odpowiedzialną za ustawianie górnego marginesu. Wtedy możemy stawiać przypisy gdziekolwiek i w jakiej ilości chcemy.</p>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2009/04/19/jak-zrobic-przypisy-boczne-w-css-i-jquery/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Debug podpiętych zdarzeń w jQuery i Firebugu</title>
		<link>http://ferrante.pl/2009/03/30/debug-podpietych-zdarzen-w-jquery-i-firebugu/</link>
		<comments>http://ferrante.pl/2009/03/30/debug-podpietych-zdarzen-w-jquery-i-firebugu/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 20:38:39 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=335</guid>
		<description><![CDATA[Czasem zdarza się, że chcemy zobaczyć, jakie zdarzenia (events) jQuery są podpięte pod dany element drzewa DOM. Jak zrobić to najszybciej?
Z pomocą przychodzi funkcja data(). Jeśli użyjemy jej w kontekście obiektu jQuery w parze z argumentem events, możemy łatwo zdebugować interesujące nas zdarzenia. Przykładowe użycie:
$("a.news").data('events');
Dzięki Firebugowi proces ten jest o wiele bardziej użyteczny. Wystarczy coś [...]]]></description>
			<content:encoded><![CDATA[<p>Czasem zdarza się, że chcemy zobaczyć, jakie zdarzenia (events) jQuery są podpięte pod dany element drzewa DOM. Jak zrobić to najszybciej?<span id="more-335"></span></p>
<p>Z pomocą przychodzi funkcja <span class="f">data()</span>. Jeśli użyjemy jej w kontekście obiektu jQuery w parze z argumentem <em>events</em>, możemy łatwo zdebugować interesujące nas zdarzenia. Przykładowe użycie:</p>
<pre><code>$("a.news").data('events');</code></pre>
<p>Dzięki Firebugowi proces ten jest o wiele bardziej użyteczny. Wystarczy coś takiego, by wyświetlić w konsoli interesujące nas dane:</p>
<pre><code>$().ready(function() {

	$("#foobar").bind("click", function() { alert('a'); }).bind("click", function() { alert('b'); });

	var events = $("#foobar").data('events');
	$.each(events, function(i, value) {
		$.each(value, function(j, fn){
				console.log(i+": "+fn);
		});
	});
});</code></pre>
<p>Efekt?</p>
<p class="p"><img src="http://ferrante.pl/wp-content/uploads/2009/03/jquery-events.jpg" alt="jquery-events" title="jquery-events" width="410" height="183" class="alignnone size-full wp-image-336" /></p>
<p>Można również <a href="http://james.padolsey.com/javascript/debug-jquery-events-with-listhandlers/">skorzystać z pluginu James&#8217;a Padolsey&#8217;a</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2009/03/30/debug-podpietych-zdarzen-w-jquery-i-firebugu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zostań lepszym programistą front-endu &#8211; fakty i mity</title>
		<link>http://ferrante.pl/2009/03/17/zostan-lepszym-programista-front-endu-fakty-i-mity/</link>
		<comments>http://ferrante.pl/2009/03/17/zostan-lepszym-programista-front-endu-fakty-i-mity/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 19:52:46 +0000</pubDate>
		<dc:creator>ferrante</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Publicystyka]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[W sieci...]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://ferrante.pl/?p=215</guid>
		<description><![CDATA[Zastanawiałem się ostatnio, co tak naprawdę czyni nas dobrymi programistami front-endu. Abstrahując od tego, że cały czas uczę się i nigdy nie będę mógł powiedzieć o sobie, że jestem w czymś doskonały, postanowiłem zebrać do kupy kilka wskazówek, które wywarły ogromny wpływ na moją karierę.
Pokora to jedna z największych cnót
Szafowanie szeroką gamą branżowych terminów nie [...]]]></description>
			<content:encoded><![CDATA[<p>Zastanawiałem się ostatnio, co tak naprawdę czyni nas dobrymi programistami front-endu. Abstrahując od tego, że cały czas uczę się i nigdy nie będę mógł powiedzieć o sobie, że jestem w czymś doskonały, postanowiłem zebrać do kupy kilka wskazówek, które wywarły ogromny wpływ na moją karierę.<span id="more-215"></span></p>
<h3>Pokora to jedna z największych cnót</h3>
<p>Szafowanie szeroką gamą branżowych terminów nie czyni z Ciebie specjalisty. Spotykałem osoby, które twierdziły, że wiedzą, co to dostępność, użyteczność i inne takie&#8230; No, zresztą, sami dobrze wiecie&#8230; Większość z nich, zapytana o szczegóły, rzucała jednak podstawowymi określeniami, które można bez trudu znaleźć po 30 sekundach wyszukiwania w sieci.</p>
<p>Bardzo często ktoś, coś tam słyszał, jednak nie przypomina sobie szczegółów. <a href="http://www.useit.com/">Nielsen</a>, <a href="http://www.sensible.com/">Don&#8217;t let me think</a>. A! I o niepełnosprawnych coś było! Prawie jak na lekcji biologii&#8230; Problem w tym, że tak jak lekarz podczas operacji nie sięga po podręczniki, by dowiedzieć się, gdzie mieści się serce, tak programista front-end nie myśli dwie godziny nad tym, jak działa, dajmy na to, hierarchia nagłówków.</p>
<p>Dlatego też o wiele bardziej cenię ludzi pokornych, którzy owszem, w trakcie boomu na użyteczność słyszeli kilka podstawowych haseł, aczkolwiek otwarcie przyznają, że nie wiedzą zbyt wiele i chcieliby poszerzyć horyzonty.</p>
<p>Poza tym, gro osób spod znaku <span class="f">doskonała znajomość HTML, XHTML, CSS oraz standardów W3C, WAI</span> tak naprawdę, co komiczne, ma w swoim portfolio strony, które przeczą współczesnym standardom. Co więcej, pewnikiem wszyscy zrobiliśmy kiedyś jakiegoś potworka. W związku z tym, sto razy bardziej docenię osobę, która jest świadoma tego faktu, niż tę, która stwierdzi, że wszystko jest w porządku, a jej kwalifikacjami powinna zająć się najlepiej komisja złożona ze <a href="http://www.joelonsoftware.com/">Spolsky&#8217;ego</a>, <a href="http://meyerweb.com/">Meyer&#8217;a</a>, <a href="http://www.zeldman.com/">Zeldmana</a> i innych.</p>
<h3>To nadal jest programowanie!</h3>
<p>Jeśli chodzi o JavaScript, zważ, że to nie tylko <a href="http://jquery.com">jQuery</a>. Wielu programistów uważa czysty JavaScript za zupełnie zbędny, kiedy jest to podejście pozbawione sensu. Chciałbym wiedzieć, ile do powiedzenia na temat optymalizacji, closures czy programowania obiektowego mają osoby, które w swoim portfolio oceniają JavaScript na &#8220;doskonały&#8221;. Sam łapałem się na tym wielokrotnie &#8211; udało mi się napisać to i owo, dlatego myślałem, że jestem w danej dziedzinie ekspertem. Nic bardziej mylnego, języki programowania to żywy twór, który z każdym dniem odsłania nowe obszary.</p>
<p>Kiedyś o eventach w JavaScript wiedziałem tylko tyle, że trzeba pobrać odnośnik do <a href="https://developer.mozilla.org/en/DOM">DOM</a> i przypiąć stosowną funkcję. Dziś o ból głowy (z zachwytu nad rozwiązaniami) przyprawiają mnie problemy wycieków pamięci lub zdarzeń bąbelkowych. </p>
<p>A gdzie mi tu Panie do zaawansowanego użycia <a href="https://developer.mozilla.org/En/Drawing_Graphics_with_Canvas">Canvas</a>, w którym zrobiłem bardzo mało rzeczy, aczkolwiek mam świadomość, jak to działa i wiem, że gdybym poświęcił swój czas na konkretny projekt, na pewno bym go zrobił. O ile z czystym sumieniem mogę więc stwierdzić, że nie jestem specjalistą z tej dziedziny, tak wiele osób napisałoby na <a href="http://goldenline.pl">Goldenline</a> czy gdziekolwiek indziej, że Canvas wciąga uchem, kiedy tak naprawdę używała jedynie jakiegoś widgetu z <a href="http://ajaxian.com">Ajaxian.com</a>.</p>
<p>Poznawanie zagadnień od podstaw jest bardzo ważne. Prędzej czy później trafimy na problem, któremu nie będziemy mogli podołać przez nasze zaniedbania. Pierwszy przykład z brzegu &#8211; miałem swego czasu zoptymalizować system walidacji formularzy faktur. Pozycji było ponad 30, każda z nich miała po pięć sprawdzanych informacji. Pętli były dziesiątki (setki?) tysięcy, a czas wykonywania skryptu oscylował wokół 15 sekund. Wszystko oparte było o jQuery i <a href="http://docs.jquery.com/Plugins/Validation">jQuery Validation</a>. Dla każdego walidowanego pola frywolnie używano selektorów jak poniżej:</p>
<pre><code>$('input[name^=xxx][name$=xxx]');</code></pre>
<p>Przyjmując, że jQuery musi sprytnie przefiltrować wszystkie inputy, dopasowując je do podanych dwóch wyrażeń regularnych, mamy 30*5*2*600 iteracji (w dokumencie było około 600 inputów). Ciekaw jestem, co powiedziałaby osoba bez jakiejkolwiek wiedzy analityczno-algorytmicznej (choćby jak działają selektory w jQuery). Że o podstawach JavaScript nie wspomnę.</p>
<p>Pomyśl też, co stałoby się, gdybyś musiał napisać coś w <a href="http://mootools.net/">MooTools</a> lub <a href="http://www.prototypejs.org/">Prototype</a>?</p>
<h3>Staranność</h3>
<p>Nie rób w kodzie bałaganu, pod żadnym pozorem. Nieważne, czy zaczynasz duży czy mały projekt. Nazywaj klasy i identyfikatory zgodnie z przyjętą przez Ciebie konwencją. Żadnych <em>test3</em>, <em>somethingExampleHehe</em> i innych potworków. Nie pisz skryptów na szybko, bez dobrego formatowania i logicznego nazewnictwa zmiennych. Utrzymuj porządek w sekcji <em>head</em> dokumentów, jak i w folderach z plikami źródłowymi. Przyjmij konwencje nazw katalogów, w których trzymasz pliki css, js i obrazki.</p>
<p>Otaczaj skrypty JS anonimowymi funkcjami, tak, by nikt nie nadpisał Twojego kodu:</p>
<pre><code>(function() {
// Twoj kod...
})();</code></pre>
<p>Niestety, programowanie stron niesie ze sobą wiele pułapek, a jedną z nich jest skłonność do powstawania bałaganu. Wielokrotnie widziałem zdublowany kod, puste deklaracje w CSSach i wiele innych niedoróbek. Znając życie, większość pochodzi z czystego pośpiechu. Osobiście, często robiłem coś na szybko, dodawałem style inline, by sprawdzić, jak coś się zachowa, mimo że miałem do dyspozycji debugger. CSS i JS są bardzo czułe na fuszerkę, dlatego unikaj kompromitacji, nawet, gdyby praca miała potrwać 10 minut dłużej.</p>
<p>Zdarza się również, że mozolnie szukamy rozwiązania, dajmy na to pod IE, dopisując coś i skreślając w kodzie, a także pisząc na szybko różne nazwy zmiennych, typu <em>some</em>, <em>x</em>, <em>aaa</em> itd. Gdy dochodzimy do celu, zapominamy o sprawie, skoro &#8220;<em>jest zrobione</em>&#8220;. W efekcie w kodzie pozostaje bubel, który będzie nielogiczny dla programistów edytujących kod w przyszłości. Zmusi ich to prawdopodobnie do kontynuowania złej konwencji i dalszego brudzenia, bo <em>przecież nie będę się doczytywał, o co temu kolesiowi chodziło.</em>. Nie zostawiaj po sobie kodu, którego sam nie zrozumiesz za miesiąc.</p>
<p>Debugger i dobre narzędzia wspomagające to świętość! Dowiedz się, co to Firebug, WebDeveloper, Live Headers, Pixel Perfect, IE Tab, HTML Validator, czy Firecookie. Przeglądaj często <a href="https://addons.mozilla.org/en-US/firefox/browse/type:1/cat:4">stronę z rozszerzeniami do Firefoxa</a>. A nuż wyjdzie coś interesującego!</p>
<p>Frameworki CSS to nie do końca trafiony pomysł, jednak przydatny w pewnych okolicznościach. Przeanalizuj dokładnie wady i zalety takiego rozwiązania, zainteresuj się <a href="http://meyerweb.com/eric/tools/css/reset/">resetami CSS</a> czy też projektami typu <a href="http://960.gs">960 grid system</a>.</p>
<p>Typografia <a href="http://www.webtypography.net/">potrafi być ciekawa</a>, a <a href="http://ferrante.pl/2008/05/17/uzywanie-html4-a-profesjonalizm/">XHTML ma wady</a>, więc bądź ostrożny.</p>
<h3>Rozwój osobisty</h3>
<p>Nikt nie jest alfą i omegą. Nie zniechęcaj się tym, że wielokrotnie podczas pracy używasz Google. Zapamiętywanie hacków, czy też bugów przeglądarek jest pomocne, lecz nie jest to najważniejsze. Wystarczy, że znasz i kojarzysz problem. Rozwiązanie to tylko kwestia doboru środków.</p>
<p>Czytaj książki. O sieci pisze się tyle ciekawych rzeczy! Nie przeczytasz ich na żadnej stronie internetowej. Luke Wroblewski, Joel Spolsky, Eric Meyer, Jakob Nielsen, Louis Rosenfeld, Dean Clarke to tylko czubek góry lodowej nazwisk, które szanujący się developer powinien znać. Czytanie zagranicznych pozycji to nie moda, lans czy cokolwiek innego &#8211; to polepszanie swoich kwalifikacji. Biorąc pod uwagę, że w sieci są prawdopodobnie tysiące koderów z szablonu (CSS, HTML, JS), zatrudniłbym kogoś, kto po prostu wie więcej.</p>
<p>Jeśli nie znasz z kolei jakiejś pozycji, przyznaj to otwarcie, zamiast szukać okrężnej drogi w swoich tłumaczeniach. Nie znać &#8220;X&#8221; czy &#8220;Y&#8221; to nie wstyd, acz argument do dalszej nauki i sztuki poznania. Osobę, która próbuje podjąć dyskusję na temat, o którym nie ma żadnego pojęcia, z reguły można rozpoznać po kilku sekundach. Pamiętaj o tym.</p>
<p>Staraj się czytać blogi, choć zważ na to, że nie jest to żaden wyznacznik Twojej wiedzy, o czym nieliczni próbują przekonywać. Jeśli blogi, to nie tylko polskie (tym bardziej, że bardzo mało jest tych wartościowych). O JavaScript absolutnie fantastyczne rzeczy tworzy <a href="http://ejohn.org">John Resig</a> (twórca jQuery), jest genialny <a href="http://dean.edwards.name/weblog/">Dean Edwards</a>, <a href="http://paulbakaus.com/">Paul Bakaus</a>, <a href="http://mootools.net/blog/">Valerio Proietti</a>. To tylko kilka nazwisk, bo o JS i CSS piszą tysiące osób. Bardzo pomocne są też serwisy typu <a href="http://alistapart.com">A List Apart</a> czy też <a href="http://ajaxian.com">Ajaxian.com</a>, gdzie zgromadzone są najnowsze wiadomości i projekty z branży.</p>
<p>Zauważ, że posiadanie sprzętu Apple lub pisanie Twittera/Blipa nie czyni Cię specjalistą. Wiedz, że na Macu nie zobaczysz 64-bitowej palety kolorów, a to że Zeldman twitteruje nie robi Cię jego kumplem od wódki. Jeśli mimo wszystko stawiasz powyższy fakt za swoje ewidentne zalety, powinieneś zaznajomić się ze znaczeniami ekshibicjonizmu i jego pochodnymi.</p>
<p>Ucz się języka obcego, najlepiej angielskiego. Większość ważnych rzeczy mówi się tutaj w języku Szekspira. W prestiżowych firmach komunikacja z klientem bardzo często odbywa się po angielsku. Z kolei, jeśli Twoje aspiracje sięgają naprawdę wysoko, raczej nie dosięgniesz nieba w Polsce. Niestety, pierwsza liga front-endu gra za granicą. Sam fakt, jak mało mają tam do powiedzenia Polacy, świadczy o tym, że możemy traktować nasz kraj jako branżowy zaścianek.</p>
<p>Bądź krytyczny i szczery w swoich osądach, nie bój się wyrażać własnych opinii. Jeśli projekt dyskutowany jest pod kątem dziedziny, w której jesteś ekspertem, narzuć swoje zdanie i przede wszystkim przedstaw stosowne argumenty. Broń swojej wiedzy! Kto ma wiedzieć cokolwiek o dostępności, jak nie specjalista front-end? Oczywiście, sugestie innych osób są cenne, jednak ostateczne zdanie powinno należeć do Ciebie. </p>
<p>Fajne rzeczy o rozwoju osobistym <a href="http://alexba.eu/">pisze Alex Barszczewski</a>.</p>
<h3>Użyteczność</h3>
<p>Sądzę też przekornie, że <a href="http://pl.wikipedia.org/wiki/Użyteczność_(web-usability)">użyteczność</a> to jedna z największych pułapek, jakie wyprodukował webdevelopment w ostatnich latach. Podstawowe terminy użyteczności stron www są jak najbardziej zasadne, jednak im dalej w las, tym więcej drzew. Tak naprawdę, wiele aspektów użyteczności jest sprawą dyskusyjną i to, dlaczego, przyjmijmy umownie, link jest czerwony, a nie niebieski, w gruncie rzeczy determinuje kontekst, zamierzony cel i dziesięć innych czynników, których nie znajdziemy w szablonowych książkach o usability.</p>
<p>Jest to działka, w której najwięcej mają do powiedzenia krzykacze. Ubzdurało im się, że znają się na użyteczności, bo przeczytali kilka mądrych książek. Większość sporów o usability danego elementu na stronie można podważyć &#8220;pierwszą lepszą&#8221; publikacją książkową. Dlatego też najgorsze argumenty, jakie możesz użyć w dyskusji o usability, tyczą się fanatycznego powoływania na konkretnego autora i rzekomego specjalisty od użyteczności. Nikt jeszcze nie wymyślił złotego środka, a książki o usability wskazują jedynie na najpopularniejsze problemy!</p>
<p>Przede wszystkim radzę myśleć! Użyteczność to nie proste regułki. To nie wersety z książek, które często powielają banały lub które są po prostu słabe (vide publikacje Kasperskiego). Nie idź na łatwiznę. Dopatruj się kontekstu, przeprowadzaj testy z użytkownikami, dyskutuj z kolegami po fachu! Nie ma nic bardziej zbawiennego, niż solidna burza mózgów, poparta konkretnymi argumentami merytorycznymi. Wiele publikacji aspiruje do bycia tak uniwersalnym, jak tylko sie da. Nie daj się nabrać, tym bardziej, że jest to ostatnio niezwykle chwytliwy temat. Specjalistów od użyteczności przybywa niczym cinkciarzy pod Pewexem, dlatego powtórzę jeszcze raz &#8211; myśl!</p>
<h3>Prototypowanie</h3>
<p>Doceń prototypy i testy z użytkownikami. Muszę stwierdzić, że wcześniej rzadko korzystałem z papierowych bądź elektronicznych prototypów. Designy od początku do końca projektował dla mnie grafik, zgodnie ze słownymi wytycznymi. Jakież to amatorskie podejście! Profesjonalny projekt powstaje stopniowo. Najpierw pracuje się nad wymaganiami, potem wkracza front-endowiec, który ma za zadanie przedstawić prototyp funkcjonalności strony. Nie projektuje on designu, ale ustala layout, rozmieszczenie buttonów, warstw, menu i wszystkiego, co tyczy się www. Przy okazji projektuje on większość aspektów użyteczności strony. Prototyp ułatwia pracę wszystkim &#8211; klientowi, designerowi, back-endowi i Tobie oczywiście. To na etapie prototypu powinny być wyjaśniane wszystkie wątpliwości. Tutaj ustalany jest ostateczny, podkreślmy to, kształt aplikacji. Wszystko po to, by potem zająć się tylko i wyłącznie kodowaniem oraz testowaniem.</p>
<p>Profesjonalne prototypy można tworzyć np. w <a href="http://axure.com">Axure</a>.</p>
<p>Prawdopodobnie to nie wszystko, co można by napisać na ten temat. Uczymy się jednak na błędach, a kolejne akapity dopisze życie, z pewnością&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://ferrante.pl/2009/03/17/zostan-lepszym-programista-front-endu-fakty-i-mity/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
	</channel>
</rss>
