<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><title>Zapiski na Koszulce</title><link>http://blog.koszulinski.pl/</link><description>Wpisy z dziennika internetowego Jogger, wspomaganego przez Jabbera</description><lastBuildDate>Sat, 04 Feb 2012 20:43:56 +0100</lastBuildDate><generator>JoggerPL</generator><item><title>The end &amp;ndash; blog zamknięty</title><link>http://blog.koszulinski.pl/2011/08/31/the-end-blog-zamkniety/</link><description>&lt;p&gt;Myślałem, że dam radę prowadzić dwa blogi, jeden &lt;a href=&quot;http://code42.pl&quot;&gt;bardziej techniczny&lt;/a&gt;, drugi luźniejszy, czyli ten. Nic jednak z tego, dlatego &lt;strong&gt;zamykam tego bloga&lt;/strong&gt;. Od roku wszystkie moje artykuły (głównie JavaScript) lądują na &lt;strong&gt;&lt;a href=&quot;http://code42.pl&quot;&gt;Code42.pl&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Dziękuję &lt;a href=&quot;http://jogger.pl&quot;&gt;Joggerku&lt;/a&gt;, to były wspaniałe lata z Tobą :)&lt;/p&gt;
</description><pubDate>Wed, 31 Aug 2011 15:39:37 +0200</pubDate><guid>http://blog.koszulinski.pl/2011/08/31/the-end-blog-zamkniety/</guid><category>CSS</category><category>Frontend</category><category>HTML</category><category>Javascript</category><category>Ogólne</category><category>PHP</category></item><item><title>Delegacja i funkcje generyczne w JavaScript + mały offtopic</title><link>http://blog.koszulinski.pl/2011/01/09/delegacja-i-funkcje-generyczne-w-javascript-maly-offtopic/</link><description>&lt;p style=&quot;border: solid 5px #38C; padding: 2em; text-align: center; border-radius: 2px;&quot;&gt;&lt;strong&gt;Artykuł został przeniesiony na mój &lt;a href=&quot;http://code42.pl/2011/01/08/delegacja-i-funkcje-generyczne-w-javascript/&quot; title=&quot;Delegacja i funkcje generyczne w JavaScript&quot;&gt;nowy blog – code42.pl&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
</description><pubDate>Sun, 09 Jan 2011 17:28:33 +0100</pubDate><guid>http://blog.koszulinski.pl/2011/01/09/delegacja-i-funkcje-generyczne-w-javascript-maly-offtopic/</guid><category>Javascript</category><category>oop</category><category>delegacja</category><category>dziedziczenie</category></item><item><title>Darmowe szkolenie z programowania gier w JavaScript by DevMeetings</title><link>http://blog.koszulinski.pl/2011/01/01/darmowe-szkolenie-z-programowania-gier-w-javascript-by-devme/</link><description>&lt;p style=&quot;border: solid 5px #38C; padding: 2em; text-align: center; border-radius: 2px;&quot;&gt;&lt;strong&gt;Artykuł został przeniesiony na mój &lt;a href=&quot;http://code42.pl/2010/12/31/darmowe-szkolenie-z-programowania-gier-w-javascript-by-devmeetings/&quot; title=&quot;Darmowe szkolenie z programowania gier w JavaScript by DevMeetings&quot;&gt;nowy blog – code42.pl&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
</description><pubDate>Sat, 01 Jan 2011 15:33:30 +0100</pubDate><guid>http://blog.koszulinski.pl/2011/01/01/darmowe-szkolenie-z-programowania-gier-w-javascript-by-devme/</guid><category>CSS</category><category>Frontend</category><category>HTML</category><category>Javascript</category><category>Techblog</category><category>szkolenie</category><category>programowanie gier</category></item><item><title>Gdzie ta społeczność polskich frontendowców?</title><link>http://blog.koszulinski.pl/2010/12/26/gdzie-ta-spolecznosc-polskich-frontendowcow/</link><description>&lt;p&gt;Zastanawiałem się od dłuższego czasu (a przez ostatni tydzień nawet aktywnie) co się stało, że... no właśnie, nic się nie stało. Kiedy zaglądam po długiej przerwie do swojego czytnika RSS w poszukiwaniu ciekawych polskich treści z Wielkiej Trójcy (HTML, CSS, JS) nie znajduję najczęściej nic. W Zamierzchłych Czasach, kiedy to 5 lat temu byłem początkującym developerem, było przecież (chyba) inaczej. Takie przynajmniej odnoszę wrażenie, kiedy sięgam pamięcią wstecz. Jeśli nawet jednak nie było, to czemu dzisiaj jest tak jak jest?&lt;/p&gt;
&lt;p&gt;Winą za zastój w temacie obarczyłem brak społeczności zintegrowanej z jakimś miejscem w internecie. Tak mi się przynajmniej wydawało. Lubię należeć do społeczności i mieć podsunięte pod nos ciekawe tematy oraz móc się lansować samemu, więc postanowiłem poszukać odpowiedniego miejsca.&lt;/p&gt;
&lt;h3&gt;Fora&lt;/h3&gt;
&lt;p&gt;Zacząłem szukać takiego, na którym mógłbym się trochę powymądrzać na ciekawe tematy, bo wymądrzać się lubię. Moja wiedza dzisiaj jest też o wiele bogatsza niż kilka lat temu. W Zamierzchłych Czasach korzystałem w tym celu z &lt;a href=&quot;http://mozillapl.org/forum/&quot;&gt;Forum Mozilli&lt;/a&gt; gdzie dział standardów i technologii webowych kręcił się bardzo prężnie. Dzisiaj – w sumie pustki. Google też mi nie pomogło – trafiłem na &lt;a href=&quot;http://forumweb.pl&quot;&gt;forumweb&lt;/a&gt;, &lt;a href=&quot;http://webinside.pl/forum/index.php&quot;&gt;forum Webinside&lt;/a&gt;, &lt;a href=&quot;http://forum.webhelp.pl/&quot;&gt;forum Webhelp&lt;/a&gt; i ee... W sumie nigdzie więcej. &lt;a href=&quot;http://blip.pl&quot;&gt;Blipowicze&lt;/a&gt; też mi niczego więcej nie podsunęli. Po zagłębieniu się w treść tych forów stwierdzam, że średnio pojawiają się na nich 2 posty w interesujących mnie kategoriach dziennie bądź więcej, ale typu:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Chciałbym zrobić na stronie (wstaw dowolną frazę dla której Google pokazuje 100 wyników z rozwiązaniami), ale nie wiem jak to zrobić. Pomurzcie.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jednym słowem – kaplica.&lt;/p&gt;
&lt;h3&gt;Portale&lt;/h3&gt;
&lt;p&gt;No to może jakieś portale społecznościowe czy newsowe? Z wyjątkiem nowo otwartego &lt;a href=&quot;http://jsnews.pl&quot;&gt;JSNews.pl&lt;/a&gt;, któremu kibicuję, nie znalazłem żadnych w swoim czytniku RSS, więc byłem znów zmuszony skorzystać z Google'a. I... Nawet nie chce mi się linkować do miejsc, które odwiedziłem. Jedynym portalem na jaki wrócę jest &lt;a href=&quot;http://webhelp.pl/&quot;&gt;Webhelp&lt;/a&gt; gdzie znalazłem sporo ciekawej treści i aktywny blog newsowy. Nie potrafię jednak powiedzieć czy wokół tego miejsca &quot;coś się kręci&quot;. Na pewno jednak jakościowo odróżnia się ono od wszystkiego co udało mi się znaleźć.&lt;/p&gt;
&lt;h3&gt;Agregatory&lt;/h3&gt;
&lt;p&gt;Osobną grupą są agregatory. &lt;a href=&quot;http://blogbox.com.pl&quot;&gt;Blogbox&lt;/a&gt; odpada, bo w kategorii technologia królują tematy zbyt ogólne. Tak samo na &lt;a href=&quot;http://10przykazan.com&quot;&gt;10przykazań&lt;/a&gt;, o którym raz, że nie słyszałem nic od dwóch lat, dwa, że jest zbyt ogólny. Kiedyś coś ciekawego można było dorwać też na &lt;a href=&quot;http://wykop.pl&quot;&gt;Wykopie&lt;/a&gt; jednak w tej chwili jest to już niemożliwe. Poza tym tam chyba nigdy nie było społeczności. Znam jeszcze webdevowy klon Wykopu, którym jest &lt;a href=&quot;http://www.develway.pl/&quot;&gt;Develway&lt;/a&gt;, niestety po niezłym starcie portal umiera. Wciąż mu jednak kibicuję i zamierzam w przyszłości wrzucać tam nie tylko swoje wpisy, ale też wszystkie ciekawe, które znajdę. Was też do tego zachęcam.&lt;/p&gt;
&lt;p&gt;Swoją drogą zastanawia mnie jedno. Dlaczego tak mało osób promuje swoje własne wpisy? Bo choć społeczności żadnej znaleźć nie mogę, to zapewne dużo ciekawych treści jest tworzonych. Tylko jak do Was, moi Drodzy Koledzy, trafić skoro nie da się Was znaleźć? Wielu pewnie uważa, że to inni powinni próbować nas promować, bo samemu jest głupio. Ja wcale tak nie uważam. Jeśli tworzę coś co uważam za ciekawe, to staram się by dotarło to do jak największego grona odbiorców. Jeśli się komuś nie spodoba link, który wrzuciłem na Blipa, to po prostu go nie kliknie bądź ucieknie ze strony. Jeśli się spodoba, to tym samym dzięki mojemu działaniu osoba ta zaoszczędziła czas, a ja może zyskam kolejnego odbiorcę. Tak więc &lt;strong&gt;promujcie swoje własne wpisy&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ciekawym miejscem wciąż jest &lt;a href=&quot;http://techblog.pl&quot;&gt;Techblog&lt;/a&gt;, czyli agregator technicznych wpisów z &lt;a href=&quot;http://jogger.pl&quot;&gt;Joggera&lt;/a&gt;. Niestety, wraz z odejściem wielu osób z Joggera Techblog automatycznie też przymiera, a w związku z tym, że system blogowy jakim jest ten pierwszy raczej nie ma szans konkurować z WordPressami i innymi tej parze nie wróżę świetlanej przyszłości. W tej chwili jednak Techblog wciąż potrafi wygenerować kilkaset odwiedzin jednego wpisu, co jest wynikiem, jak na moje warunki, bardzo dobrym.&lt;/p&gt;
&lt;h3&gt;Mikroblogi&lt;/h3&gt;
&lt;p&gt;Idąc dalej należy wziąć pod lupę mikroblogi. Sam korzystam aktywnie z &lt;a href=&quot;http://blip.pl&quot;&gt;Blipa&lt;/a&gt; i jest to jedno z ciekawszych miejsc w naszym internecie. Dodatkowo zorientowanie serwisu na obserwowanie tagów oraz ograniczona ilość użytkowników powoduje, że łatwo tam z jednej strony trafić do odpowiednich odbiorców, z drugiej być tym odbiorcą. Mam też konto na &lt;a href=&quot;http://flaker.pl&quot;&gt;Flakerze&lt;/a&gt; jednak nie korzystam z niego, bo bardziej przypada mi do gustu prostota Blipa. Nie potrafię więc powiedzieć co się na nim dzieje.&lt;/p&gt;
&lt;p&gt;Oczywiście jest jeszcze &lt;a href=&quot;http://twitter.com&quot;&gt;Twitter&lt;/a&gt;, jednak to już jest społeczność międzynarodowa. Nie mogę się przekonać do jego aktywnego użytkowania, bo czuję się jakbym pisał w kosmos. Ludzi jest za dużo, a na dodatek ciężko trafić do nich tematycznie. No i ciężko trafić jedynie do polaków.&lt;/p&gt;
&lt;h3&gt;Blogi&lt;/h3&gt;
&lt;p&gt;Na koniec zostały same blogi, bo wokół niektórych również potrafi rozkręcić się niezła społeczność. Niestety w tej chwili nasi lokalni guru w większości poznikali. I nie chodzi nawet o to, że uciekli z blogami za granicę, tylko po prostu przestali pisać. Jednocześnie nowym ciężko się wypromować, bo i gdzie mieliby to zrobić? Nie istnieje w końcu żadna większa społeczność do której można dotrzeć.&lt;/p&gt;
&lt;p&gt;Swoją drogą zastanawiam się, czy mała ilość polskich blogów prowadzonych przez prawdziwych ekspertów nie wynika z tego, że frontend developer w Polsce to w znacznej mierze stanowisko dla tyracza i osoby, które naprawdę coś potrafią albo wyjechały za granicę (i piszą po angielsku), albo nie mają warunków finansowych i zawodowych, do poświęcania swojego czasu na pisanie. Nie znam zachodnich realiów (polskie w sumie też słabo) i jest to bardziej pytanie do Was niż stwierdzenie faktu.&lt;/p&gt;
&lt;p&gt;Można się też zastanowić, czy w Polsce wciąż jest dostatecznie liczna grupa odbiorców, w szczególności bardziej zaawansowanych, dla których opłaca się pisać. Może po prostu większość potencjalnych czytelników przerzuciło się na serwisy anglojęzyczne i nie zagląda już na nasze podwórko? Nie wiem. Sam jednak, mimo że czytanie po angielsku nie sprawia mi problemów, wciąż interesuję się równie mocno tym co dzieje się w kraju. Nie sądzę też bym był odosobniony w swoich preferencjach.&lt;/p&gt;
&lt;h3&gt;Podsumowanie&lt;/h3&gt;
&lt;p&gt;&lt;q&gt;Kiedyś było inaczej... lepiej&lt;/q&gt;. Kiedy słyszę takie stwierdzenie od osoby ze starszego pokolenia zawsze pojawia mi się na ustach uśmiech. Teraz jednak sam jestem zmuszony tak napisać. Może to tylko moje złudzenie bądź w dzisiejszych czasach już tak musi być. Jednak nie tylko ja uważam, że coś tu jest nie tak. Niedawno Damian Wielgosik napisał o &lt;a href=&quot;http://ferrante.pl/2010/10/30/wziac-sprawy-w-swoje-rece/&quot;&gt;braniu sprawy w swoje ręce&lt;/a&gt; i co prawda nie robi on porównań do Zamierzchłych Czasów, ale również zauważa, że jest źle.&lt;/p&gt;
&lt;p&gt;Jeśli już jesteśmy przy Damianie, to bardzo mu kibicuję. Jest, jak na nasze standardy, niezwykle aktywny (&lt;a href=&quot;http://ferrante.pl&quot;&gt;blog&lt;/a&gt;, &lt;a href=&quot;http://jsnews.pl&quot;&gt;newsy&lt;/a&gt;, &lt;a href=&quot;http://falsyvalues.com/&quot;&gt;kolejna konferencja&lt;/a&gt;, &lt;a href=&quot;http://varjs.com&quot;&gt;działalność szkoleniowa&lt;/a&gt;) i jest na pewno ekspertem w tym co robi.&lt;/p&gt;
&lt;p&gt;Może ktoś spytać dlaczego sam nie spróbuję stworzyć jakiejś społeczności. W końcu nie ma co gadać, trzeba brać się do roboty. Owszem, racja. Nie widzę jednak sensu robić czegoś co już zostało zrobione. Sam więc w żadnym wypadku nie zamierzam pisać żadnego portalu, czy innego serwisu. Uważam, że odpowiednie już istnieją – potrzebują tylko naszego zainteresowania. I dlatego w najbliższym czasie zamierzam skupić się na &lt;a href=&quot;http://develway.pl&quot;&gt;Develway'u&lt;/a&gt;, na którego zacznę wrzucać ciekawszy content. Przyjrzę się też jak działa &lt;a href=&quot;http://webhelp.pl&quot;&gt;Webhelp&lt;/a&gt; i w jaki sposób mogę mu pomóc.&lt;/p&gt;
&lt;p&gt;Ostatnia kwestia to czas i warunki. Sam studiuję, pracuję i... lubię pisać. Niestety to ostatnie robię zbyt rzadko, bo dwie pierwsze czynności i moje hobby zabierają mi za dużo czasu. Zauważyłem jednak ostatnio, że praca jaką obecnie wykonuję już nie rozwija mnie tak jak jeszcze rok temu (bo wciąż przerabiam te same tematy). Na dodatek mój pracodawca nie widzi sensu w prowadzeniu przez jego pracowników własnych projektów. Zredukowałem więc trochę ilość etatu na jakim pracuję i mam nadzieję mieć więcej czasu na pisanie. Czas pokaże.&lt;/p&gt;
</description><pubDate>Sun, 26 Dec 2010 23:29:00 +0100</pubDate><guid>http://blog.koszulinski.pl/2010/12/26/gdzie-ta-spolecznosc-polskich-frontendowcow/</guid><category>Ogólne</category><category>Techblog</category><category>blogosfera</category><category>frontend</category><category>blogi</category><category>społeczność</category></item><item><title>Zarezerwowane słowa kluczowe w JavaScript - gramatyka języka</title><link>http://blog.koszulinski.pl/2010/12/23/zarezerwowane-slowa-kluczowe-w-javascript-gramatyka-jezyka/</link><description>&lt;p style=&quot;border: solid 5px #38C; padding: 2em; text-align: center; border-radius: 2px;&quot;&gt;&lt;strong&gt;Artykuł został przeniesiony na mój &lt;a href=&quot;http://code42.pl/2010/12/22/zarezerwowane-slowa-kluczowe-w-javascript-gramatyka-jezyka/&quot; title=&quot;Zarezerwowane słowa kluczowe w JavaScript - gramatyka języka&quot;&gt;nowy blog – code42.pl&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
</description><pubDate>Thu, 23 Dec 2010 18:18:35 +0100</pubDate><guid>http://blog.koszulinski.pl/2010/12/23/zarezerwowane-slowa-kluczowe-w-javascript-gramatyka-jezyka/</guid><category>Frontend</category><category>Javascript</category></item><item><title>Obiektowy JavaScript i właściwości chronione – w poszukiwaniu Świętego Graala</title><link>http://blog.koszulinski.pl/2010/12/20/obiektowy-javascript-i-wlasciwosci-chronione-w-poszukiwaniu/</link><description>&lt;p style=&quot;border: solid 5px #38C; padding: 2em; text-align: center; border-radius: 2px;&quot;&gt;&lt;strong&gt;Artykuł został przeniesiony na mój &lt;a href=&quot;http://code42.pl/2010/12/19/obiektowy-javascript-i-wlasciwosci-chronione-w-poszukiwaniu-swietego-graala/&quot; title=&quot;Obiektowy JavaScript i właściwości chronione – w poszukiwaniu Świętego Graala&quot;&gt;nowy blog – code42.pl&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
</description><pubDate>Mon, 20 Dec 2010 00:05:51 +0100</pubDate><guid>http://blog.koszulinski.pl/2010/12/20/obiektowy-javascript-i-wlasciwosci-chronione-w-poszukiwaniu/</guid><category>Frontend</category><category>Javascript</category><category>oop</category><category>ecmascript</category></item><item><title>Java Centered Design</title><link>http://blog.koszulinski.pl/2010/12/11/java-centered-design/</link><description>&lt;h4&gt;Tło&lt;/h4&gt;
&lt;p&gt;Próbując zdobyć papierek inżyniera i tę odrobinę sensownej wiedzy, którą można znaleźć na studiach z informatyki (Politechnika Wrocławska) dotarłem do semestru piątego i kursu Projektowanie Oprogramowania. Jest to kurs z tych ciekawszych, bo w tym semestrze mam jeszcze np. Technologie Przetwarzania Mediów Cyfrowych (montowaliśmy reklamę radiową oraz słuchowisko, później robiliśmy retusz zdjęcia, a teraz fotomontaż - tak WTF?!), czy Informatyczne Systemy Sterowania (kurs dość zaawansowany, a więc zupełne przeciwieństwo TPMC, z tym, że wiedza przyda się może kilku(nastu) osobom).&lt;/p&gt;
&lt;p&gt;Dwa miesiące pisania sztucznej specyfikacji i rysowania diagramików UML utwierdziło mnie jeszcze bardziej w przekonaniu, że nigdy w przyszłości nie będę chciał tego robić. Nasza specyfikacja na tym etapie obejmuje jedynie malutki wycinek systemu, a poświęciliśmy na jej przygotowanie kilka dni roboczych. I nie – nie projektujemy systemu bankowego, a uproszczoną księgarnię internetową. I tak naprawdę skupiamy się tylko na procesie składania zamówienia.&lt;/p&gt;
&lt;p&gt;W tej chwili dotarliśmy do etapu kiedy już trzeba ogarnąć architekturę aplikacji. Co prawda większość studentów zaprojektuje zapewne jakiś tam sobie diagram komponentów, sekwencji i co tam jeszcze obejmuje ten etap kursu, kompletnie nie interesując się jak to będzie współgrało z frameworkiem/technologią którą później zastosują (narzucona z góry Java). Ja jednak tak nie potrafię. Zacząłem więc szukać Java'owego frameworka do aplikacji webowych, który później zastosujemy. I w tym momencie szczęka mi opadła.&lt;/p&gt;
&lt;h4&gt;Każda potwora...&lt;/h4&gt;
&lt;p&gt;Na początku semestru, kiedy dowiedziałem się, że będziemy projektować, a później w małej części kodować, aplikację webową poszedłem do prowadzącego spytać się czy jest z góry narzucony język. Dowiedziałem, się że prowadzący proponuje Javę, ale że nie – jeśli ktoś z nas chce coś innego, to może spróbować. Choć prowadzący nie polecał takich prób (szczególnie jak usłyszał o PHP :). Wtedy odpowiedziałem, że w trakcie semestru się zastanowię, bo dobrze znam &lt;a href=&quot;http://www.symfony-project.org/&quot;&gt;symfony&lt;/a&gt; i byłoby mi łatwiej, a nie słyszałem o żadnym sensownym i otwartym rozwiązaniu w Javie. Prowadzący odpowiedział, że jest sporo dobrych i otwartych frameworków. Zrobiło mi się wtedy głupio, bo moja wypowiedź nie była poparta żadnymi głębszymi doświadczeniami. Po prostu – taki stereotyp Javy.&lt;/p&gt;
&lt;p&gt;W trakcie semestru uświadomiłem sobie, że ten rodzaj betonowej specyfikacji nijak nie pasuje do symfony, ani Railsów, czy Django, które w większym/mniejszym stopniu znam. Że jestem zbyt słaby w UMLu, aby przenieść magię tego frameworka, do tych wszystkich diagramów, które musimy stworzyć. Postanowiłem więc się nie wyłamywać z tłumu i jak wszyscy pozostać przy Javie.&lt;/p&gt;
&lt;p&gt;Wczoraj zacząłem research w poszukiwaniu odpowiedniego frameworka. Przejrzałem wiele stron na &lt;a href=&quot;http://en.wikipedia.org/wiki/Comparison_of_web_application_frameworks#Java&quot;&gt;wiki&lt;/a&gt; i nieliczne &lt;a href=&quot;http://olex.openlogic.com/wazi/2010/choosing-the-right-java-web-development-framework/&quot;&gt;porównania&lt;/a&gt;. Stwierdziłem, że najlepiej prezentuje się &lt;a href=&quot;http://www.springsource.org/&quot;&gt;Spring 3&lt;/a&gt;. Został nieźle oceniony w porównaniu, a do tego w Google'ach potrafiłem znaleźć coś co przypominało stronę nowoczesnego projektu, a nie przedpotopowej, zapomnianej kobyły.&lt;/p&gt;
&lt;p&gt;Przyzwyczajony jestem do świetnej dokumentacji typu &quot;Get started&quot; (&lt;a href=&quot;http://www.symfony-project.org/gentle-introduction/1_4/en/&quot;&gt;sf&lt;/a&gt;, &lt;a href=&quot;http://guides.rubyonrails.org/&quot;&gt;railsy&lt;/a&gt;, &lt;a href=&quot;http://docs.djangoproject.com/en/1.2/intro/tutorial01/&quot;&gt;django&lt;/a&gt;), którą można zlokalizować na stronie domowej projektu w minutę, a która trzyma mnie za rączkę, aż do momentu kiedy jestem w stanie korzystać ze słabej (w przypadku symfony – bardzo słabej) dokumentacji API i tutorialów związanych z bardziej zaawansowanymi rozwiązaniami.&lt;/p&gt;
&lt;p&gt;Tego samego szukałem na stronie Springa. Po 5 minutach wiedziałem już, że tak &lt;a href=&quot;http://www.springsource.org/documentation&quot;&gt;prosto nie będzie&lt;/a&gt;. Autorzy frameworka stworzyli 800 stronicowy podręcznik, w którym jest pewnie opisane wszystko, o czym 100 jego twórców myślało przez ostatnie dwa lata. Stworzyli też dziesiątki stron, w których chwalą się jakie to fajne rozwiązania wprowadzili do swojego dziecka. Nie znalazłem na stronie domowej projektu jednak nic dotyczącego Springa 3 (ta wersja ma już ponad rok) co pomogłoby mi go uruchomić.&lt;/p&gt;
&lt;p&gt;Postanowiłem jednak się nie poddawać i rozpocząłem przeszukiwanie nie tylko strony domowej, ale całego internetu. W ciągu dwóch godzin trafiłem w kilka miejsc, jednak... sami popatrzcie – &lt;a href=&quot;http://forum.springsource.org/showthread.php?t=84684&quot;&gt;tu&lt;/a&gt;, &lt;a href=&quot;http://stackoverflow.com/questions/2260552/getting-started-with-spring-3-web-mvc-setting-everything-up&quot;&gt;tu&lt;/a&gt;, &lt;a href=&quot;http://blog.springsource.com/2009/12/21/mvc-simplifications-in-spring-3-0/?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+Interface21TeamBlog+%28SpringSource+Team+Blog%29&quot;&gt;tu&lt;/a&gt;, &lt;a href=&quot;http://www.theserverside.com/tutorial/Spring-30-Tutorial-Setting-Up-Configuring-The-Environment&quot;&gt;tu (nawet nieźle)&lt;/a&gt;, &lt;a href=&quot;http://www.skill-guru.com/blog/2010/01/13/asynchronous-method-invocation-in-spring-3-0/&quot;&gt;tu&lt;/a&gt;, czy &lt;a href=&quot;http://www.theserverside.com/discussions/thread.tss?thread_id=60238&quot;&gt;tu&lt;/a&gt;. Jednym słowem wielki śmietnik. Postanowiłem spróbować z innym frameworkiem.&lt;/p&gt;
&lt;p&gt;Kolejny, któremu chciałem się przyjrzeć, to JavaServer Faces. Tutaj było jeszcze gorzej. W Google'ach nie potrafiłem znaleźć nawet czegoś co można by było nazwać &quot;jednolitą stroną projektu&quot;. Nie wiem jaka jest geneza (i już mnie to nie interesuje) tego frameworka, ale moim zdaniem to wręcz niepoważne. Polecam obejrzeć przykładowe strony, które są w pierwszej 10tce w &lt;a href=&quot;http://www.google.pl/search?q=javaserver+faces&quot;&gt;Google'ach&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Po drodze był też JBoss. Strona na którą trafiłem wyglądała jak strona korporacji, więc po 5 minutach dałem sobie spokój. Żal coś pisać w tym temacie.&lt;/p&gt;
&lt;p&gt;Pod lupę wziąłem też &lt;a href=&quot;http://struts.apache.org/&quot;&gt;Strutsa&lt;/a&gt;. Najpierw się załamałem, bo strona projektu przypomina typową Apache'ową. Trzeba jednak być twardym. Documantation -&amp;gt; Get started -&amp;gt; Tutorials -&amp;gt; Getting Started i jest! &lt;a href=&quot;http://struts.apache.org/2.2.1/docs/getting-started.html&quot;&gt;Coś&lt;/a&gt; znalazłem. Nie jest to co prawda poziom znanych mi frameworków, ale daje radę. Jednak ścieżka jaką musiałem przejść żeby trafić do interesującej mnie strony bawi mnie dalej :).&lt;/p&gt;
&lt;p&gt;Na koniec wróciłem zrezygnowany jeszcze raz do Springa i znalazłem &lt;a href=&quot;http://viralpatel.net/blogs/2010/06/tutorial-spring-3-mvc-introduction-spring-mvc-framework.html&quot;&gt;cykl artykułów dla początkujących&lt;/a&gt; oraz &lt;a href=&quot;http://www.springsource.org/roo&quot;&gt;Spring Roo&lt;/a&gt;. I choć na początku Spring mnie załamał, to w tej chwili wraz ze Strutsem i jedną &lt;a href=&quot;http://books.google.pl/books?id=aNRq-8GlRYQC&amp;amp;printsec=frontcover#v=onepage&amp;amp;q&amp;amp;f=false&quot;&gt;sensowną książką do JSF&lt;/a&gt; jest moim ostatnim punktem zaczepienia w tym temacie.&lt;/p&gt;
&lt;h4&gt;... znajdzie swojego adoratora&lt;/h4&gt;
&lt;p&gt;Wspomniałem na początku, że zrobiło mi się głupio kiedy, nie mając podstaw, powiedziałem, że nie znam żadnego sensownego javowego frameworka. Zasiadając do poszukiwań szczerze wierzyłem w to, że skoro są miłośnicy Javy, wśród których są przecież świetni programiści, to musi istnieć jakaś sensowny projekt związany z sensownym frameworkiem.&lt;/p&gt;
&lt;p&gt;Teraz już wiem – ze spokojem mogę mówić, że nie znam sensownego projektu. Nie mogę za to nic powiedzieć o samych frameworkach, bo aby je ocenić należy ich użyć. Możliwe, że każdy z frameworków, któremu się przyglądałem jest świetny. Ich autorzy zapomnieli jednak, że nie na kodzie i technicznym manualu Świat się kończy.&lt;/p&gt;
&lt;p&gt;Zawsze drażnili mnie (a może bawili) programiści twierdzący, że taki stan projektów im odpowiada. To moja wina, że nie potrafię znaleźć interesujących mnie informacji. Moja wina, że nie zamierzam przeczytać 400 stron w książce aby choć w najprostszym zakresie potrafić użyć narzędzia. Moja wina, że za szybko się zniechęcam – generalnie jestem słabym programistą i nie umiem szukać oraz czytać ze zrozumieniem.&lt;/p&gt;
&lt;p&gt;Dlatego tak bardzo zainteresowała mnie idea &lt;abbr title=&quot;User Centered Design&quot;&gt;UCD&lt;/abbr&gt; – projektowania zorientowanego na użytkownika. Choć swoją popularność zdobyła głównie w związku z projektowaniem interfejsów, bądź ogólniej – interakcji człowieka z komputerem, to lubię ją aplikować do każdej sytuacji kiedy istnieje jakiś produkt i jego odbiorcy. Do nikomu niepotrzebnych usług, które według ich twórców są rewolucją, przedmiotów codziennego użytku, które przyprawiają nas o ataki szału, czy... no właśnie – nie przychodzi mi żaden produkt, przy opracowywaniu którego programiści nie mieliby swojego destruktywnego udziału.&lt;/p&gt;
&lt;p&gt;Programiści i innego rodzaju osobniki, które pojęły sposób działania komputera (sieciowcy, administratorzy) to najbardziej zakute łby na naszej planecie. Wyłączam tutaj polityków, których ciężko ocenić, bo nigdy nie wiadomo kiedy kłamią. To natura informatyki, ze wszystkich dziedzin, najdalej odbiegła od natury człowieka. Dlatego osoby trudniące się pojmowaniem tej nauki są najbardziej aspołeczne. Nie mam tu na myśli sposobu ubierania się (bądź nie), zachowywania, czy poruszanych tematów rozmów. Mam na myśli sposób myślenia i wnioskowania.&lt;/p&gt;
&lt;h4&gt;Java Centered Design&lt;/h4&gt;
&lt;p&gt;Wracając do Javy od której to zacząłem. Jest to najbardziej odczłowieczony język jaki dany mi było poznać. Jego społeczność nie wywołuje we mnie żadnych uczuć. Nawet nie wiem czy istnieje. Nie znam żadnego programisty Javy, który by ten język lubił. Odnoszę wrażenie, że w ogóle wszyscy z niego korzystający zamknęli się w swoich bankowych, księgowych i ubezpieczeniowych gettach. Zaraz, zaraz. Przecież to właśnie te najbardziej nieprzyjazne człowiekowi systemy...&lt;/p&gt;
&lt;p&gt;Oczywiście Java wpłynęła też na frameworki, które w niej powstały. Tak jak pisałem, znalazłem wiele artykułów napisanych przez autorów Springa ukazujących jakie wspaniałe wzorce projektowe zastosowali, jakimi dobrymi są programistami, jaki wspaniały techniczny podręcznik napisali. Zapomnieli jednak co jest wyznacznikiem jakości ich pracy.&lt;/p&gt;
&lt;p&gt;Jest takie powiedzenie w piłce nożnej, że za podanie odpowiada podający, a nie jego odbiorca. Tak samo jest w w przypadku dokumentacji frameworków. To nie ja jestem głupi jeśli nie potrafię znaleźć interesujących mnie informacji i nie rozumiem tego co napisaliście. To Wasza wina. Ja oczywiście mogę szybciej pobiec do piłki i może jakimś cudem zdążę, ale tak naprawdę to wyście skopali swoją robotę tak beznadziejnie podając.&lt;/p&gt;
&lt;p&gt;Dzisiejsza walka jeszcze głębiej utwierdziła mnie w przekonaniu, że Java jest smutna, zakuta i nieprzyjazna użytkownikowi końcowemu. Będę się dalej trzymał jak najbliżej frontendowych technologii webowych, aby mieć jak najbliżej do użytkownika końcowego. Dzięki temu mam nadzieję, że nigdy nie zapomnę dla kogo tak naprawdę co jest wyznacznikiem jakości mojej pracy. Zadowolenie użytkownika końcowego.&lt;/p&gt;
</description><pubDate>Sat, 11 Dec 2010 18:00:28 +0100</pubDate><guid>http://blog.koszulinski.pl/2010/12/11/java-centered-design/</guid><category>Offtopic</category><category>Ogólne</category><category>PWR</category><category>Techblog</category><category>Użyteczność</category><category>java</category><category>ucd</category></item><item><title>Google mnie zbanowało?</title><link>http://blog.koszulinski.pl/2010/11/27/google-mnie-zbanowalo/</link><description>&lt;p&gt;Kilka tygodniu temu zauważyłem, że drastycznie spadła mi liczba odwiedzin na blogu. Jako że nic nie pisałem przez ostatnie pół roku, przez długi czas utrzymywała mi się w miarę stała średnia liczba odwiedzających miesięcznie i były to w znacznej mierze wejścia z wyszukiwarek. W październiku zanotowałem spadek do 200 wejść w ciągu miesiąca. Zmartwiony tym faktem zacząłem się przyglądać o co chodzi. I trafiłem na taki wykres:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://img828.imageshack.us/img828/945/blogwyszukiwarki.png&quot;&gt;&lt;img src=&quot;http://img828.imageshack.us/img828/945/blogwyszukiwarki.png&quot; width=&quot;490&quot; alt=&quot;Spadek wejść z wyszukiwarek&quot;&gt;&lt;/a&gt; &lt;!-- http://pacman.mulabs.org/ts/blog-wyszukiwarki.png --&gt;&lt;/p&gt;
&lt;p&gt;Przy czym wszystkie wejścia w ostatnim okresie, jeśli się nie mylę, pochodzą z innych nich Google wyszukiwarek, albo z wyszukiwarki obrazków Google'a.&lt;/p&gt;
&lt;p&gt;Zacząłem więc przeszukiwać Google'a różnymi frazami, pod którymi zawsze dało się mnie znaleźć. Nie znalazłem nic pod na przykład: &lt;a href=&quot;http://www.google.pl/search?q=javascript+klasy&quot;&gt;&quot;javascript klasy&quot;&lt;/a&gt;, &lt;a href=&quot;http://www.google.pl/search?q=conky+ikony&quot;&gt;&quot;conky ikony&quot;&lt;/a&gt;, czy &lt;a href=&quot;http://www.google.pl/search?q=reinmar&quot;&gt;&quot;reinmar&quot;&lt;/a&gt;, a są to frazy z których miałem sporo wejść. Nie ma mnie nawet pod &lt;a href=&quot;http://www.google.pl/search?q=blog+koszulinski&quot;&gt;&quot;blog koszulinski&quot;&lt;/a&gt;. Jednym słowem pełny ban.&lt;/p&gt;
&lt;p&gt;Rozpocząłem więc edukację, ponieważ nigdy nie interesowałem się głębiej SEO (nie miałem nawet keywordsów ustawionych na blogu). Sprawdziłem swoją domenę narzędziami z cyklu &quot;Google Ban Checker&quot; i dowiedziałem się, że nie wygląda to na bana. Narzędzia te patrzą na wyniki dla frazy &lt;a href=&quot;http://www.google.pl/search?q=site:blog.koszulinski.pl&quot;&gt;&quot;site:blog.koszulinski.pl&quot;&lt;/a&gt;, dla której rzeczywiście coś się pokazuje. Pytanie tylko na ile można tym narzędziom ufać.&lt;/p&gt;
&lt;p&gt;Sprawdziłem też, czy nie linkuję w jakieś kiepskie miejsca. Znalazłem do tego narzędzie &lt;a href=&quot;http://www.bad-neighborhood.com/text-link-tool.htm&quot;&gt;Bad Neighborhood&lt;/a&gt;, które nie wykazało nic szczególnego. Podobne wyniki do mojego uzyskują inne strony.&lt;/p&gt;
&lt;p&gt;Uruchomiłem &lt;a href=&quot;https://www.google.com/webmasters/tools/&quot;&gt;Google Webmaster Tools&lt;/a&gt;. Dodałem sitemapę, sprawdziłem czy się indeksuję, czy są jakieś błędy, jakie słowa kluczowe mi znaleźli i kto do mnie linkuje. W sumie nie znalazłem nic szczególnego, poza tym, że mam ponad 1700 linków z domeny wroc.pl (drugi jest &lt;a href=&quot;http://jogger.pl&quot;&gt;jogger.pl&lt;/a&gt; z zaledwie 700 linkami) i nie mam pojęcia skąd one mogą pochodzić. Nie wiem też jak to sprawdzić. Gdyby ktoś znał jakieś narzędzie/sposób niech da znać.&lt;/p&gt;
&lt;p&gt;Na koniec spytałem się na &lt;a href=&quot;http://www.google.com/support/forum/p/Webmasters/thread?fid=0138cf2b83871cd0000495f1d62e1bff&quot;&gt;forum Google'a&lt;/a&gt;, a tam usłyszałem od pracownika Google'a, że: &lt;cite&gt;odniosłem wrażenie że masz dosyć sporo cytatów na różne tematy&lt;/cite&gt;. Nie wiem czy podpowiedziało to jakieś narzędzie (jeśli tak to kiepsko), czy to obserwacja z ręcznego przeklikania się po moim blogu. Tak, czy siak - cytatów u mnie kilka jest i jeśli za to bana dostałem, to mają tragiczny algorytm. Prewencyjnie jednak pokasuję wpisy gdzie sporo cytowałem (przy czym będą to głównie jakieś stare rzeczy).&lt;/p&gt;
&lt;h4&gt;Podsumowanie&lt;/h4&gt;
&lt;p&gt;Nie wiem do końca co mnie teraz czeka. Trochę jeszcze poczekam, ale jeśli się nic nie zmieni, to będę zmuszony się przenieść. Nie wiem tylko czy zmienić wtedy też domenę. Czy tylko serwer. Szkoda będzie odchodzić z &lt;a href=&quot;http://jogger.pl&quot;&gt;Joggera&lt;/a&gt; po tylu latach. A wygląda na to, że to już mój piąty rok tutaj :).&lt;/p&gt;
</description><pubDate>Sat, 27 Nov 2010 01:28:39 +0100</pubDate><guid>http://blog.koszulinski.pl/2010/11/27/google-mnie-zbanowalo/</guid><category>Offtopic</category><category>Ogólne</category><category>SEO</category><category>Techblog</category><category>google</category><category>ban</category><category>filtr</category></item><item><title>Drogowców jajo z Ronda</title><link>http://blog.koszulinski.pl/2010/11/25/drogowcow-jajo-z-ronda/</link><description>&lt;p&gt;Napisałem przed chwilą maila do &lt;a href=&quot;http://wroclaw.gazeta.pl&quot;&gt;wrocławskiej Gazety Wyborczej&lt;/a&gt;. Możliwe, że list opublikują (do tej pory za każdym razem kiedy pisałem tak było), jednak wyszło mi całkiem ładnie, więc zamieszczam też na blogu.&lt;/p&gt;
&lt;p&gt;&lt;ins&gt;Edit:&lt;/ins&gt; W związku z moim &lt;a href=&quot;http://blog.koszulinski.pl/2010/11/27/google-mnie-zbanowalo/&quot;&gt;filtrowaniem mnie przez Google'a&lt;/a&gt; postanowiłem nie cytować siebie samego, a zamieścić linki. Mój list pojawił się ostatecznie na:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://wroclaw.gazeta.pl/wroclaw/1,35751,8718660,Rondo_na_Powstancow_Slaskich_jest_jak_pole_minowe.html&quot;&gt;wroclaw.gazeta.pl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://wroclaw.naszemiasto.pl/artykul/673496,wroclaw-drogowcow-jaja-z-rondem,id,t.html&quot;&gt;wroclaw.naszemiasto.pl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Thu, 25 Nov 2010 00:19:42 +0100</pubDate><guid>http://blog.koszulinski.pl/2010/11/25/drogowcow-jajo-z-ronda/</guid><category>Offtopic</category><category>Ogólne</category><category>wrocław</category><category>rondo</category><category>miasto</category></item><item><title>Dwukolumnowa lista definicji (edit: w HTML5 lista opisów (?))</title><link>http://blog.koszulinski.pl/2010/04/04/dwukolumnowa-lista-definicji/</link><description>&lt;p style=&quot;border: solid 5px #38C; padding: 2em; text-align: center; border-radius: 2px;&quot;&gt;&lt;strong&gt;Artykuł został przeniesiony na mój &lt;a href=&quot;http://code42.pl/2010/04/04/dwukolumnowa-lista-definicji-edit-w-html5-lista-opisow/&quot; title=&quot;Dwukolumnowa lista definicji (edit: w HTML5 lista opisów (?))&quot;&gt;nowy blog – code42.pl&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
</description><pubDate>Sun, 04 Apr 2010 01:36:01 +0200</pubDate><guid>http://blog.koszulinski.pl/2010/04/04/dwukolumnowa-lista-definicji/</guid><category>CSS</category><category>Frontend</category><category>HTML</category><category>Ogólne</category><category>Techblog</category></item><item><title>WTFJS - rozjaśnienie umysłu</title><link>http://blog.koszulinski.pl/2010/03/06/wtfjs-rozjasnienie-umyslu/</link><description>&lt;p&gt;&lt;a href=&quot;http://wtfjs.com/&quot;&gt;Blog WTFJS o dziwactwach w JavaScriptcie&lt;/a&gt; widział już pewnie każdy. Niektóre przykłady są naprawdę fajne :) Co więcej — niektóre działają mi w sposób przedstawiony przez autorów tylko czasami, choć to pewnie nie problem JavaScriptu, a Firebuga :).&lt;/p&gt;
&lt;p&gt;Jako, że lubię wiedzieć dlaczego tak to działa, a nie inaczej, staram się wyjaśnić sobie o co chodzi w każdym przykładzie. Niektórych nadal nie rozumiem, część jest oczywista, część ma rozwiązania podane na stronie, a te ciekawsze postaram się wyjaśnić w tym (i może następnych) wpisach.&lt;/p&gt;
&lt;h3&gt;Jestem prawie obiektowy&lt;/h3&gt;
&lt;p&gt;{geshi lang=javascript}typeof &quot;abc&quot; == &quot;string&quot; // true typeof String(&quot;abc&quot;) == &quot;string&quot; // true String(&quot;abc&quot;) == &quot;abc&quot; // true -- same types get casted to equal each other String(&quot;abc&quot;) instanceof String // false -- hmmm... (new String(&quot;abc&quot;)) instanceof String // true String(&quot;abc&quot;) == (new String(&quot;abc&quot;)) // true -- wait, wtf?{/geshi}&lt;/p&gt;
&lt;p&gt;&lt;code&gt;new String()&lt;/code&gt; to nie &lt;code&gt;String()&lt;/code&gt;, a &lt;code&gt;&quot;string&quot;&lt;/code&gt; to nie &lt;code&gt;&quot;object&quot;&lt;/code&gt;. Proste? :) Trochę wolniej:&lt;/p&gt;
&lt;p&gt;Pierwsza linia jest oczywista, ale warta zapamiętania — typem literału stringa jest &lt;code&gt;&quot;string&quot;&lt;/code&gt;. W drugiej mogłoby się wydawać że tworzymy obiekt, ale nie — konstruktor &lt;code&gt;String&lt;/code&gt; wywołany bez &lt;code&gt;new&lt;/code&gt; po prostu rzutuje na stringa. Trzecia linia tylko to potwierdza.&lt;/p&gt;
&lt;p&gt;Czwarta linia to nawiązanie do tytułu jaki nadałem tej sekcji — &lt;q&gt;Jestem prawie obiektowy&lt;/q&gt;. Autor tego przykładu zdziwił się skąd takie zachowanie, ponieważ pewnie nie wiedział o &lt;a href=&quot;http://pl.wikibooks.org/wiki/JavaScript/Konwersje_typ%C3%B3w_prostych&quot;&gt;typach prostych w JavaScriptcie&lt;/a&gt;. Otóż wartości: &lt;code&gt;1, &quot;a&quot;, true&lt;/code&gt; nie są typu &lt;code&gt;&quot;object&quot;&lt;/code&gt; tylko odpowiednio &lt;code&gt;&quot;number&quot;, &quot;string&quot;, &quot;boolean&quot;&lt;/code&gt;. Nie są z tego powodu instancjami swoich podobnie brzmiących z nazwy klas (ale &lt;em&gt;uwaga&lt;/em&gt; — czerpią z ich prototypów). Jest to zachowanie całkiem uzasadnione (choć niefajne w działaniu), ponieważ w innym przypadku (gdyby typy proste nie istniały) nie działało by porównanie &lt;code&gt;===&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Wyobraźmy sobie sytuację, w której pisząc &lt;code&gt;&quot;a&quot;&lt;/code&gt; tworzymy nowy obiekt typu &lt;code&gt;&quot;string&quot;&lt;/code&gt;. Porównanie dwóch zmiennych, które są obiektami za pomocą operatora &lt;code&gt;===&lt;/code&gt; sprawdza, czy zmienne te odnoszą się do dokładnie tego samego obiektu w pamięci. Tak więc w naszej hipotetycznej sytuacji otrzymalibyśmy:&lt;/p&gt;
&lt;p&gt;{geshi lang=javascript}&quot;a&quot; === &quot;a&quot;; // -&amp;gt; false{/geshi}&lt;/p&gt;
&lt;p&gt;Uups. Po lewej obiekt, po prawej obiekt, ale to nie te same obiekty. Na szczęście teraz jest tak:&lt;/p&gt;
&lt;p&gt;{geshi lang=javascript}&quot;a&quot; === &quot;a&quot;; // -&amp;gt; true new String(&quot;a&quot;) === new String(&quot;a&quot;); // -&amp;gt; false true === true; // -&amp;gt; true new Boolean(true) === new Boolean(true); // -&amp;gt; false{/geshi}&lt;/p&gt;
&lt;p&gt;Nie twierdzę, że jestem fanem takiego rozwiązania. Nie jestem pewien, ale chyba w Javie jest podobnie, za to na przykład już w Rubym jest to rozwiązane lepiej (ktoś potwierdzi?). Cóż — nic nie jest idealne ;).&lt;/p&gt;
&lt;p&gt;Wróćmy jednak do przykładu. W piątej linii wreszcie tworzymy obiekt typu &lt;code&gt;String&lt;/code&gt;. Dla przypomnienia:&lt;/p&gt;
&lt;p&gt;{geshi lang=javascript}typeof new String(&quot;a&quot;); // -&amp;gt; &quot;object&quot; typeof String(&quot;a&quot;); // -&amp;gt; &quot;string&quot;{/geshi}&lt;/p&gt;
&lt;p&gt;Ostatnia linia powinna być już oczywista jeśli powiem, że operator &lt;code&gt;==&lt;/code&gt; przeprowadza konwersję zmiennych stojących po obu jego stronach do jednego typu (którego, tego nie wiem — pewnie zmiennej po lewej — kto ma ochotę niech sprawdzi w specyfikacji i napisze w komentarzu :). Tak więc z porównania &lt;code&gt;String(&quot;abc&quot;) == (new String(&quot;abc&quot;))&lt;/code&gt; otrzymujemy porównanie &lt;code&gt;&quot;a&quot; == &quot;a&quot;&lt;/code&gt;. Dla porównania:&lt;/p&gt;
&lt;p&gt;{geshi lang=javascript}String(&quot;abc&quot;) === (new String(&quot;abc&quot;)); // -&amp;gt; false{/geshi}&lt;/p&gt;
&lt;p&gt;Widać więc, że trzeba uważać na krótki operator porównania i stosować go z głową. Polecam przyzwyczajenie się do używania potrójnego operatora i tylko w szczególnych wypadkach, kiedy na przykład znamy typy zmiennych (&lt;code&gt;typeof x == &quot;string&quot;&lt;/code&gt;), używanie podwójnego.&lt;/p&gt;
&lt;h3&gt;Jestem prawie obiektowy, ale umiem porównywać&lt;/h3&gt;
&lt;p&gt;Kolejny przykład będzie tylko rozwinięciem poprzedniej części. Oto on:&lt;/p&gt;
&lt;p&gt;{geshi lang=javacript}(1) === 1; // true Number.prototype.isOne = function () { return this === 1; } (1).isOne(); // false! Number.prototype.reallyIsOne = function () { return this - 1 === 0; } (1).reallyIsOne(); // true{/geshi}&lt;/p&gt;
&lt;p&gt;Pierwsza linia powinna być oczywista — nawias nie ma znaczenia. Druga i trzecia to ścisłe nawiązanie do poprzedniej części. W &lt;code&gt;isOne&lt;/code&gt; &lt;code&gt;typeof this; // -&amp;gt; &quot;object&quot;&lt;/code&gt;. Mimo, że wywołujemy metodę na zmiennej typu &lt;code&gt;&quot;number&quot;&lt;/code&gt;, to jest ona po cichu rzutowana na &lt;code&gt;&quot;object&quot;&lt;/code&gt; — dziwne, ale do zrozumienia — ciężko żeby &lt;code&gt;this&lt;/code&gt; nie było obiektem.&lt;/p&gt;
&lt;p&gt;Dwie ostatnie linie, to dynamiczne rzutowanie. Operacja odejmowania stara się rzutować obie zmienne na typ liczbowy. &lt;code&gt;this&lt;/code&gt; jest rzutowane na &lt;code&gt;1&lt;/code&gt; i reszta jest jasna. Równie dobrze można byłoby zapisać &lt;code&gt;reallyIsOne&lt;/code&gt; w ten sposób:&lt;/p&gt;
&lt;p&gt;{geshi lang=javascript}Number.prototype.reallyIsOne = function () { return +this === 1; };{/geshi}&lt;/p&gt;
&lt;h4&gt;Używaj średników!&lt;/h4&gt;
&lt;p&gt;Poprzedni przykład przekleiłem na czysto z &lt;a href=&quot;http://wtfjs.com/post/409374681/rcanine-shows-us-this-interesting-this-coerce&quot;&gt;WTFJS&lt;/a&gt;. Jeśli będziecie go w tej postaci wklejać do Firebuga, to możecie się spotkać z latającymi wyjątkami. Skąd ten problem? Na końcu drugiej i czwartej linii brakuje średników i przynajmniej firefoksowy silnik wysiada. Rada na przyszłość — średniki dobre są.&lt;/p&gt;
&lt;h3&gt;Niezrozumiałe dla mnie&lt;/h3&gt;
&lt;p&gt;Tego już nie wytłumaczę :). Choć — obstawiałbym, że problem leży gdzieś w standardzie reprezentacji liczb zmiennoprzecinkowych, ale to tylko mój domysł.&lt;/p&gt;
&lt;p&gt;{geshi lang=javascript}Number.MAX_VALUE*1.0000000000000001 === (1/0) // false Number.MAX_VALUE*1.0000000000000002 === (1/0) // true{/geshi}&lt;/p&gt;
</description><pubDate>Sat, 06 Mar 2010 01:34:06 +0100</pubDate><guid>http://blog.koszulinski.pl/2010/03/06/wtfjs-rozjasnienie-umyslu/</guid><category>Frontend</category><category>Javascript</category><category>Techblog</category><category>wtf</category></item><item><title>Obiektowy JavaScript cz.2. - klasa sama w sobie</title><link>http://blog.koszulinski.pl/2010/02/28/obiektowy-javascript-cz-2-klasa-sama-w-sobie/</link><description>&lt;p style=&quot;border: solid 5px #38C; padding: 2em; text-align: center; border-radius: 2px;&quot;&gt;&lt;strong&gt;Artykuł został przeniesiony na mój &lt;a href=&quot;http://code42.pl/2010/03/02/obiektowy-javascript-cz-2-klasa-sama-w-sobie/&quot; title=&quot;Obiektowy JavaScript cz.2. - klasa sama w sobie&quot;&gt;nowy blog – code42.pl&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
</description><pubDate>Sun, 28 Feb 2010 03:10:25 +0100</pubDate><guid>http://blog.koszulinski.pl/2010/02/28/obiektowy-javascript-cz-2-klasa-sama-w-sobie/</guid><category>Frontend</category><category>Javascript</category><category>Ogólne</category><category>Techblog</category><category>programowanie</category><category>obiektowość</category><category>oop</category></item><item><title>Dlaczego iPhone też już ssie?</title><link>http://blog.koszulinski.pl/2010/02/09/dlaczego-iphone-tez-juz-ssie/</link><description>&lt;p class=&quot;top_img&quot;&gt;&lt;img src=&quot;http://pacman.mulabs.org/ts/iphone_1.jpg&quot; alt=&quot;Ślimak&quot;&gt; Opublikowane na licencji CC przez &lt;a href=&quot;http://www.flickr.com/photos/14degrees/&quot;&gt;Roberta Thomsona&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tytułem tym chciałem nawiązać do ubiegłotygodniowego wpisu &lt;a href=&quot;http://blog.koszulinski.pl/2010/01/29/dlaczego-frameworki-css-ssa/&quot;&gt;Dlaczego frameworki CSS ssą?&lt;/a&gt;. Niech tradycją się stanie, że kiedy używam słowa &quot;ssać&quot; to chcę coś nieobiektywnie pojechać. Piszę &quot;nieobiektywnie&quot;, żeby mnie ktoś znowu nie próbował przekonać, że wpis ten w mych oczach miał pretendować do bycia obiektywnym. Nie — to jest blog i publikuję tu moje odczucia, a nie badania naukowe (które notabene, po wpadce klimatologów, wiemy już jak są prowadzone).&lt;/p&gt;
&lt;p&gt;Wpis ten zacząłem pisać wczoraj wieczorem, jeszcze zanim miałem okazję przeżyć dzisiejsze przygody (które wymieniam na liście). Tak więc czara goryczy przelała się już wcześniej, a to co stało się dzisiaj tylko mnie przekonało, że bardzo chcę opublikować ten tekst.&lt;/p&gt;
&lt;p&gt;Żeby było jasne — iPhone (wersja 3G) jest oryginalny, zakupiony w Erze półtora roku temu, nigdy nie jailbrake'owany, nigdy nie przytrafiło mu się też nic strasznego. Windows do którego go podłączam włączany jest tylko w celu synchronizacji telefonu z iTunesem, bądź odpalenia kilku gier (kupionych w sklepie, nie ściąganych). Można więc przyjąć, że jest w miarę czysty.&lt;/p&gt;
&lt;p&gt;Co przydarzyło mi się dzisiaj:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dwukrotnie miałem już następującą sytuację — iPhone staje się trochę niestabilny (coś tam pada, coś tam laguje), postanawiam więc go wyłączyć i włączyć — wiadomo, że czasami dobrze jest odśmiecić pamięć. Wyłączam iPhone'a, włączam... nie — nie włączam — słodki ekran z jabłuszkiem zawisa na czas nieskończony (ostatnio jak zawisł mi przed seansem w kinie, to po seansie nadal się włączał). Wtedy trzeba pokombinować jakoś żeby go na twardo zresetować, ale &lt;strong&gt;stop&lt;/strong&gt; — nie da się do cholery wyciągnąć baterii. Wciskam więc wszystkie jego dwa klawisze i za którymś razem (żeby nie było zbyt prosto — kilka razy mogę dusić te przyciski po kilka minut i nie ma reakcji) udaje mi się go wyłączyć. Ponowna próba włączenia kończy się sukcesem, o ile sukcesem można nazwać stan, w którym przestają działać wszystkie doinstalowane aplikacje i wymagana jest synchronizacja z iTunesem,&lt;/li&gt;
&lt;li&gt;tak jak pisałem — sytuacja ta przytrafiła mi się dwukrotnie. Za pierwszym razem udało mi się przy pomocy iTunesa przywrócić słuchawkę do normalnego stanu. Dzisiaj jednak czterokrotnie już zawiesił mi się iTunes, wgrywanie nowego softu na telefon zostało przerwane, później synchronizacja, później nie udało mi się w 100% przywrócić iPhone'a z kopii zapasowej (to po kiego grzyba ta urocza, trwająca wieki synchronizacja przy każdym podłączeniu do komputera?). W skrócie — telefon po kilku godzinach działa, ale nie mogę wgrać na niego muzyki, bo po 3 minutach od podłączenia i rozpoczęcia synchronizacji iTunes nagle stwierdza, że jednak dzisiaj nie ma na nią siły i bez jakiegokolwiek komunikatu kończy (nie powiadamiając o tym iPhone'a) synchronizację,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To wszystko zabolało mnie jednak w głównej mierze dzisiaj. Poprzednia akcja ze zwiechą podczas włączania telefonu zakończyła się udaną synchronizacją i przywróceniem akceptowalnego stanu. Tak więc co natchnęło mnie wczoraj do rozpoczęcia pisania tego wpisu?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ten sprzęt jest niemożliwie, czasami aż do bólu groteskowo wolny&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;na początek, przez pierwszy rok (to tak jak w małżeństwie ;), było naprawdę spoko — nie miałem telefonowi nic do zarzucenia. Jednak po każdym upgradzie softu system staje się wolniejszy. Najgorzej było kiedy dziadek Dżobs postanowił wypuścić iPhone'a 3GS — wtedy odczułem bardzo duży spadek wydajności. Jeśli dziadunio myśli, że nakłoni mnie tym do kupienia jego młodszego dziecka, to grubo się myli — nie cierpię takiego cwaniactwa,&lt;/li&gt;
&lt;li&gt;wyciszenie iPhone'a czasami trwa ponad 4s — mam na myśli czas od zmiany ustawienia suwaka do jakiejkolwiek reakcji telefonu (wibracja, ekran),&lt;/li&gt;
&lt;li&gt;odblokowanie iPhone'a (takie codzienne — z trybu uśpienia) czasami trwa ponad 10s — najpierw trzeba poczekać aż pojawi się suwak, później aż zareaguje na ruch palca, później pojawia się klawiatura, która też potrzebuje czasu żeby sobie przypomnieć, że jest klikalna, a na koniec ikonki, które muszą sobie wyskoczyć z wszystkich rogów ekranu, zamiast po ludzku się pokazać,&lt;/li&gt;
&lt;li&gt;włączenie smsów, książki kontaktowej, ostatnich telefonów, czy listy alarmów... nawet nie chce mi się myśleć ile to potrafi zabrać czasu, ale i tak wielcy jabłkowi programiści &quot;zoptymalizowali&quot; te programy, bo było gorzej,&lt;/li&gt;
&lt;li&gt;iPhone lubi sobie co jakiś czas (tak raz na miesiąc) zgubić sieć — czasem podczas rozmowy, czasem podczas stanu uśpienia,&lt;/li&gt;
&lt;li&gt;czasem ten stan zgubienia sieci zamienia się w stan niemożliwości dodzwonienia się do mnie i zadzwonienia ode mnie (operator się buntuje) przez dłuższy czas,&lt;/li&gt;
&lt;li&gt;paczka z iTunesem ma 90MB. Co oni tam za przeproszeniem ładują? Zestaw animowanych emotek w formacie 128px na 128px na każdą porę dnia i nocy?,&lt;/li&gt;
&lt;li&gt;Synchronizacja trwa pół godziny (fakt faktem, że robię ją rzadko),&lt;/li&gt;
&lt;li&gt;iTunes jest niestabilny, nieużyteczny, &lt;strong&gt;ekstremalnie&lt;/strong&gt; powolny, zasobożerny (wolę słuchać muzyki z Youtube'a — mniej ciągnie z proca) i nie rozumie oggów. Na dodatek zamiast napisać, że coś mu się nie podoba, że czegoś nie może znaleźć, czy że ma zły dzień, to milczy,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wszystko to co mnie irytuje w tym telefonie nie zmienia jednak jednego — Apple ma niesamowitych projektantów interfejsów. Kiedy wreszcie pozbędę się tego bezużytecznego narzędzia, to nie sądzę żebym w jakimkolwiek innym systemie czuł się tak dobrze. Szkoda.&lt;/p&gt;
&lt;p&gt;Powstrzymałem się w tym tekście od użycia naprawdę wielu brzydkich wyrazów, więc na koniec tylko podsumuję całą sytuację — kurwa, nigdy więcej sprzętu, którego nazwa zaczyna się od &quot;ip&quot;.&lt;/p&gt;
&lt;p&gt;Ciekawy jestem czy tylko ja mam takie problemy z tym telefonem. Przeszło mi rzecz jasna przez myśl, że słuchawka może być uszkodzona. Wolę jednak wierzyć, że pozostali też mają problemy, ale boją się to przyznać, bo przecież tak kiedyś zachwalali iPhone'a ;). Szkoda tylko, że kiedyś to był naprawdę fajny sprzęt.&lt;/p&gt;
</description><pubDate>Tue, 09 Feb 2010 21:28:42 +0100</pubDate><guid>http://blog.koszulinski.pl/2010/02/09/dlaczego-iphone-tez-juz-ssie/</guid><category>Offtopic</category><category>Ogólne</category><category>Użyteczność</category><category>iphone</category><category>apple</category></item><item><title>Obiektowy JavaScript cz.1. - obiekt Twoim przyjacielem</title><link>http://blog.koszulinski.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/</link><description>&lt;p style=&quot;border: solid 5px #38C; padding: 2em; text-align: center; border-radius: 2px;&quot;&gt;&lt;strong&gt;Artykuł został przeniesiony na mój &lt;a href=&quot;http://code42.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/&quot; title=&quot;Obiektowy JavaScript cz.1. - obiekt Twoim przyjacielem&quot;&gt;nowy blog – code42.pl&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
</description><pubDate>Sat, 06 Feb 2010 13:16:09 +0100</pubDate><guid>http://blog.koszulinski.pl/2010/02/06/obiektowy-javascript-cz-1-obiekt-twoim-przyjacielem/</guid><category>Frontend</category><category>Javascript</category><category>Ogólne</category><category>Techblog</category><category>web</category><category>programowanie</category><category>obiektowość</category></item><item><title>Dlaczego frameworki CSS ssą?</title><link>http://blog.koszulinski.pl/2010/01/29/dlaczego-frameworki-css-ssa/</link><description>&lt;p&gt;Sesja się już dla mnie skończyła, można więc coś napisać. Dzisiaj będzie jednak krótko, bo i temat prosty.&lt;/p&gt;
&lt;h4&gt;Cóż to takiego framework CSS?&lt;/h4&gt;
&lt;p&gt;No właśnie. Każdy wie co to są frameworki programistyczne, ale CSSowy? Według &lt;a href=&quot;http://en.wikipedia.org/wiki/CSS_framework&quot;&gt;wiki&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A CSS framework, also known as a web design framework is a pre-prepared library that is meant to allow for easier, more standards-compliant styling of a webpage using the Cascading Style Sheets language. Just like programming and scripting language libraries, CSS frameworks (usually packaged as external .css sheets inserted into the header) package a number of ready-made options for designing and outlaying a webpage.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Czyli, tak jak w językach programowania, framework jest biblioteką (w tym wypadku grupą reguł CSS) która ułatwia implementowanie jakichś standardowych, często powtarzających się funkcjonalności (w tym wypadku pewnych schematów w layoutcie).&lt;/p&gt;
&lt;p&gt;Co, według mnie, frameworkiem CSS nie jest? Pisałem w listopadzie o &lt;a href=&quot;http://blog.koszulinski.pl/2009/11/26/write-less-do-more-czyli-pimp-my-css/&quot;&gt;parserze/kompilatorze/procesorze CSS - LESS&lt;/a&gt;, który rozszerza składnię CSS o kilka świetnych rzeczy. Między innymi - zmienne, zagnieżdżone reguły, obliczenia, wielokrotne wykorzystywanie reguł. Jakby nie było - nie podchodzi to pod definicję z &lt;a href=&quot;http://en.wikipedia.org/wiki/CSS_framework&quot;&gt;Wikipedii&lt;/a&gt;, ale niestety znajduje się w linkach do przykładowych frameworków. Dla ustalenia uwagi - &lt;a href=&quot;http://lesscss.org/&quot;&gt;LESS&lt;/a&gt; nie jest frameworkiem.&lt;/p&gt;
&lt;h4&gt;Czemuż ssie?&lt;/h4&gt;
&lt;p&gt;Pod mą lupę wziąłem pierwsze linki zwrócone przez Google. Przyjrzałem się chwilkę frameworkom: &lt;a href=&quot;http://www.blueprintcss.org/&quot;&gt;Blueprint&lt;/a&gt;, &lt;a href=&quot;http://elasticss.com/&quot;&gt;Elastic CSS&lt;/a&gt;, &lt;a href=&quot;http://developer.yahoo.com/yui/grids/&quot;&gt;YUI 2 Grids&lt;/a&gt;. Prawdopodobnie są lepsze rozwiązania od tych i z chęcią się im przyjrzę jeśli linki pojawią się w komciach :).&lt;/p&gt;
&lt;h5&gt;Słówko o nieudanym porodzie&lt;/h5&gt;
&lt;p&gt;Wypada jeszcze wtrącić, dla niezorientowanych, co to za poroniony pomysł ten &lt;a href=&quot;http://960.gs/&quot;&gt;Grid system&lt;/a&gt;. Otóż wpadł ktoś na pomysł, że wygodnie będzie wszystkim (grafikom, programistom) jak ustalimy sobie, że strona składa się z X kolumn po Ypx szerokości każda, między którymi są marginesy po Zpx. Przyznam, że obaj z grafikiem byliśmy zachwyceni, aż do... pierwszego projektu. Życzę np. sporo zabawy z cieniami wychodzącymi poza granice kolumn, w przypadku kiedy nie możemy użyć &lt;code&gt;box-shadow&lt;/code&gt;. Szlag trafia wszystkie piękne, okrągłe wartości.&lt;/p&gt;
&lt;h5&gt;Koniec wtrącenia&lt;/h5&gt;
&lt;p&gt;Najpierw kawałek kodu z &lt;a href=&quot;http://developer.yahoo.com/yui/examples/grids/grids-gg.html&quot;&gt;YUI 2 Grids&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;{geshi lang=xml}&lt;/p&gt;
&lt;div id=&quot;yui-main&quot;&gt;
&lt;div class=&quot;yui-b&quot;&gt;
&lt;div class=&quot;yui-g&quot;&gt;
&lt;div class=&quot;yui-g first&quot;&gt;
&lt;div class=&quot;yui-u first&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;yui-u&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;yui-g&quot;&gt;
&lt;div class=&quot;yui-u first&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;yui-u&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;{/geshi}&lt;/p&gt;
&lt;p&gt;Tyle się kiedyś mówiło o semantyce kodu i oddzieleniu wyglądu od treści. Ponad pięć lat temu, kiedy zaczynałem naukę HTMLa i CSSa, trwała walka o to aby programiści zaczęli pisać porządny kod. Wydawało mi się, że teraz już nie powinno być z tym problemów, a tu zonk. Patrzę na ten przykład i co widzę?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prezentacja zbita razem z HTMLem - żeby zmienić układ strony zmieniamy HTMLa, a nie CSS,&lt;/li&gt;
&lt;li&gt;Kompletnie bezznaczeniowe nazwy klas i identyfikatorów - jedno wielkie semantyczne szambo. Wybrałem akurat framework od YUI, bo jest w tym najgorszy (choć Blueprint mu nie ustępuje). Elastic CSS wygląda trochę lepiej,&lt;/li&gt;
&lt;li&gt;Divitis. W przypadku YUI można chyba akurat dowolnie zmieniać użyte tagi, bo framework resetuje marginesy i paddingi dla wszystkich elementów (co też, tak na marginesie, uważam za kiepską praktykę). Kiedy jednak używając Blueprinta postanowimy zawrzeć którąś kolumnę w listę, to wszystko szlag trafia, bo uwaga... niektóre selektory zawierają nazwę tagu :O&lt;/li&gt;
&lt;li&gt;Narzucona struktura i kolejność elementów w kodzie HTML. Ja akurat poświęcam sporo uwagi temu aby każdy element nawigacyjny był w sensownym miejscu, aby nie używać niepotrzebnych tagów, a wykorzystując framework nie mam tej elastyczności,&lt;/li&gt;
&lt;li&gt;I wreszcie - przecież to wszystko co oferuje framework można w czasie, który jest bez znaczenia w stosunku do całego projektu, napisać ręcznie. To jest kilka reguł, które doświadczona osoba pisze na raz i to od razu z ewentualnym hackiem dla IE6. Tak, wiem, że nie wszyscy mają taką wiedzę, ale wykorzystując framework nigdy jej nie pogłębią.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tak więc w żadnym wypadku nie widzę sensu w używaniu frameworków do budowy układu strony. Żeby jednak nie było, że w ogóle nie umiem wykorzystywać zewnętrznego kodu - uważam, że przydatne są frameworki poprawiające typografię, bądź też pod niektórymi względami formularze. Muszą jednak bazować na selektorach używających tagów, a nie klas, czy nie daj Boże identyfikatorów.&lt;/p&gt;
</description><pubDate>Fri, 29 Jan 2010 11:45:21 +0100</pubDate><guid>http://blog.koszulinski.pl/2010/01/29/dlaczego-frameworki-css-ssa/</guid><category>CSS</category><category>Frontend</category><category>HTML</category><category>Ogólne</category><category>Techblog</category><category>framework</category><category>grid</category></item><item><title>Wybiła 15stka</title><link>http://blog.koszulinski.pl/2010/01/24/wybila-15stka/</link><description>&lt;p&gt;Od teraz KK pozwala mi się żenić bez zgody rodziców, wpuszczą mnie wreszcie do niektórych pubów i w ogóle :P Teraz dopiero czuję się dorosły. No i w końcu to oczko — więc to musi być szczęśliwy rok.&lt;/p&gt;
</description><pubDate>Sun, 24 Jan 2010 12:48:30 +0100</pubDate><guid>http://blog.koszulinski.pl/2010/01/24/wybila-15stka/</guid><category>Offtopic</category><category>Ogólne</category><category>urodziny</category><category>21</category><category>oczko</category></item><item><title>O tym jak wydłużyłem sobie dobę (cz. 2)</title><link>http://blog.koszulinski.pl/2010/01/10/o-tym-jak-wydluzylem-sobie-dobe-cz-2/</link><description>&lt;p&gt;Minął już zdecydowanie ponad miesiąc od kiedy &lt;a href=&quot;http://blog.koszulinski.pl/2009/11/21/o-tym-jak-wydluzylem-sobie-dobe/&quot;&gt;&quot;wydłużyłem sobie dobę&quot;&lt;/a&gt;, pora więc na jakieś podsumowanie.&lt;/p&gt;
&lt;p&gt;Pierwsza rzecz o której wypada mi wspomnieć, to to, że udało mi się utrzymać zmianę w swoim dobowym grafiku. Poniedziałek, wtorek i czasami środa stawiam się w pracy na 7:00-7:15, co uważam za swój spory sukces. Szczególnie teraz, w tym burym okresie, daje mi to kopa, bo więcej czasu działam przy świetle dziennym. Muszę przyznać, że nie było dla mnie w święta nic gorszego, niż wstać o 14stej i do końca dnia nic nie robić, bo &quot;przecież już wieczór, ciemno i w ogóle&quot;. No ale właśnie - przechodzimy do porażki.&lt;/p&gt;
&lt;p&gt;Porażką jest absolutny brak zmian w pozostałych dniach tygodnia i dniach świątecznych. Ciągle wstaję pomiędzy 9tą - 12stą, ekstremalnie 14stą. Spowodowane jest to tym, że chodzę późno spać, bo godziny 0:00 - 2:00 to dla mnie wciąż najproduktywniejszy okres. Ucisza się komunikator, ucisza się dom, mam święty spokój i mogę spokojnie skończyć to co danego dnia zacząłem robić.&lt;/p&gt;
&lt;p&gt;Plan na najbliższy miesiąc, który akurat będzie miesiącem kolokwiów, jest taki aby trochę ograniczyć czas kiedy mam włączony komunikator. &lt;a href=&quot;http://blip.pl&quot;&gt;Blip&lt;/a&gt;, mimo swoich niewątpliwych zalet, ma jednak też poważną wadę - rozprasza. Zobaczymy jak zadziała metoda nie wprost :).&lt;/p&gt;
&lt;p&gt;PS. wziąłem się ostatnio na poważnie, za projekt, który wisiałem koledze. Oznacza to, że pisać będę raczej rzadko. Trzeba zakończyć kiedyś tę otwartą pętlę :)&lt;/p&gt;
</description><pubDate>Sun, 10 Jan 2010 19:04:39 +0100</pubDate><guid>http://blog.koszulinski.pl/2010/01/10/o-tym-jak-wydluzylem-sobie-dobe-cz-2/</guid><category>Offtopic</category><category>Ogólne</category></item><item><title>Słów kilka o projektowaniu</title><link>http://blog.koszulinski.pl/2009/12/23/slow-kilka-o-projektowaniu/</link><description>&lt;p&gt;Zadałem jakiś czas temu na blipie pytanie dotyczące artykułu &lt;a href=&quot;http://www.uxmatters.com/mt/archives/2006/07/label-placement-in-forms.php&quot;&gt;Label Placement in Forms&lt;/a&gt;. Interesowało mnie czy może jest jakiś powód dla którego niektórzy (np. Marek Kasperski w swojej książce &lt;a href=&quot;http://helion.pl/ksiazki/wwprot.htm&quot;&gt;Projektowanie stron WWW&lt;/a&gt;) piszą aby labele do pól formularzy umieszczać na lewo od samych pól i wyrównane do prawej, a dlaczego inni (choćby autor tego artykułu) uważają, że najlepiej opis pola umieścić ponad polem, zmniejszając tym samym liczbę fiksacji wzroku? Czy Ci pierwsi nie znają badań? Czy kierują nimi jakieś inne przesłanki (np. praktyczne), o których ja nie wiem? Rzecz jasna, nie udało mi się tak doprecyzować pytania (ciężko się było w 160 znakach zmieścić :D).&lt;/p&gt;
&lt;p&gt;Dostałem dwie odpowiedzi. Skopiowałem sobie kiedyś tylko ich treść, nie podam niestety linka, bo w blipowym archiwum nie mam szansy tego znaleźć. Tak wyglądała rozmowa:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;reinmar&lt;/b&gt;: #usability labele nad inputami, czy na lewo od nich (wyrównane do prawej)? Za każdym razem piszą inaczej (choć to pewnie bez znaczenia)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;PanA &amp;gt; reinmar&lt;/b&gt;: nie bez znaczenia, zależy co chcesz osiągnąć. U góry się szybciej czyta niż obok, mniej fiksacji&lt;/p&gt;
&lt;p&gt;&lt;b&gt;PanB &amp;gt; reinmar&lt;/b&gt;: [blip] tak jak mówi ^PanA, najlepiej nad ale pola muszą być udzielone, mogą też być po lewej ale z wyrównaniem do prawej&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Zaciekawiło mnie co miał PanA na myśli pisząc: &lt;q&gt;zależy co chcesz osiągnąć&lt;/q&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;reinmar &amp;gt; PanA&lt;/b&gt;: To co mogę osiągnąć umieszczając je po lewej? Więcej fiksacji, więc umieszczać je tam jak chcę zniechęcić użytkownika? ;P&lt;/p&gt;
&lt;p&gt;&lt;b&gt;PanA &amp;gt; reinmar&lt;/b&gt;: czasami użytkownikowi nie ma być łatwiej - możemy chcieć zmusić go do zastanowienia się nad tym co wpisuje, etc.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;reinmar &amp;gt; PanA&lt;/b&gt;: Dlatego odciągamy go od zastanawiania utrudniając ogarnięcie formularza? Czy dajemy mu więcej czasu na zastanowienie się&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Uhh... Urocze powtarzanie usłyszanych od branżowych guru i wyczytanych z książek zdań. Zresztą - już moje pytanie było zadane złośliwie, bo po &lt;q&gt;zależy co chcesz osiągnąć&lt;/q&gt; w miarę wiedziałem czego się mogę spodziewać.&lt;/p&gt;
&lt;p&gt;Jednak nie do samej rozmowy chciałem bić w tym wpisie (dlatego też ocenzurowałem rozmówców - nie chcę tu dyskusji :P), a do dwóch błędów, które moim zdaniem wiele osób popełnia podczas projektowania.&lt;/p&gt;
&lt;h4&gt;Jestem specjalistą - przeczytałem 20 książek&lt;/h4&gt;
&lt;p&gt;Generalnie sytuacja ta odnosi się do każdej branży. Młodzi adepci Czegoś siadają do książek, chłoną, chłoną i napuchli wiedzą stają się w ich mniemaniu pełnowartościowymi specjalistami od Czegoś. Znają dziesiątki strasznie brzmiących terminów, mogą toczyć poważne dyskusje z ważnymi osobami ze świadka Czegoś. Zabawa kończy się jednak kiedy &quot;specjalista&quot; wkracza w granice praktyki. I tutaj, w zależności od osobowości i życiowej mądrości, z pokorą zbiera doświadczenie i weryfikuje posiadaną już wiedzę, bądź też dalej wygłasza znaną sobie teorię, która zupełnie nie ma zastosowania w praktyce.&lt;/p&gt;
&lt;p&gt;Żeby była jasność - nie neguję wartości znajomości teorii i nie twierdzę, że ktoś kto poznał teorię może być dobrym praktykiem.&lt;/p&gt;
&lt;h4&gt;Tort, znaczek Nike i płyta DVD&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;PanB &amp;gt; reinmar&lt;/b&gt;: osobiście nad daje gdy jest mało pól, przy większej ilości daje z lewej&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;O. I to jest ciekawa odpowiedź. Rzeczywiście - ciężko przy 20 polowym formularzu dawać opisy ponad pola, ponieważ formularz ten rośnie nam do ogromnych rozmiarów. Przypomniała mi się jednak przenośnia (?), którą kiedyś wymyśliłem aby zobrazować w firmie jaki popełniamy błąd projektując funkcjonalności jednego serwisu. Wiele osób działa tak:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Weźmy tort, bo przecież każdy lubi tort. Tort jest fajny!&lt;/p&gt;
&lt;p&gt;Weźmy znaczek Nike. Przecież jest teraz trendy, na pewno każdemu się spodoba.&lt;/p&gt;
&lt;p&gt;Ja chcę jeszcze płytę DVD. Przecież jest taka funkcjonalna. Płyta DVD jest fajna!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I co dostajemy? &lt;em&gt;Tort z przyklejonym z boku znaczkiem Nike i wbitą na sztorc płytą DVD&lt;/em&gt;. Dzieło sztuki po prostu. Niestety tak działa wiele osób - dobierając funkcjonalności serwisu wybierają (np. z konkurencyjnych rozwiązań) te, które są fajne, nie myśląc o tym, czy razem będą tworzyły spójną całość. Projektując interfejs zagłebiąją się w statystyki, badania, wybierają atomowo najlepsze, najszybsze, najczytelniejsze rozwiązania i nie patrzą na ogół serwisu. Nagminne.&lt;/p&gt;
&lt;h3&gt;Nim mnie zjedziesz&lt;/h3&gt;
&lt;p&gt;Nie, nie uważam się za specjalistę od użyteczności, nie przeczytał nawet 5 książek. Co więcej - możliwe, że PanA ma rację, a ja jestem zbyt ograniczony by go zrozumieć.&lt;/p&gt;
&lt;p&gt;Tak samo - sam nie jestem wolny od wyśmiewanych przeze mnie błędów. Niestety ;)&lt;/p&gt;
&lt;p&gt;BTW. muszę wreszcie stworzyć sobie jakiś design do tego blogaska.&lt;/p&gt;
</description><pubDate>Wed, 23 Dec 2009 15:21:10 +0100</pubDate><guid>http://blog.koszulinski.pl/2009/12/23/slow-kilka-o-projektowaniu/</guid><category>Ogólne</category><category>Techblog</category><category>Użyteczność</category><category>usability</category><category>projektowanie</category></item><item><title>Przegląd prasy</title><link>http://blog.koszulinski.pl/2009/12/08/przeglad-prasy/</link><description>&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/41263047@N08/3888554427/&quot; title=&quot;Zdjęcie autorstwa Armitage77, opublikowane na licencji CC&quot;&gt;&lt;img src=&quot;http://blog.koszulinski.pl/files/hydraulic_press.jpg&quot; alt=&quot;Zdjęcie prasy hydraulicznej&quot; style=&quot;float:left; margin:0 0.5em 0.5em 0;&quot; width=&quot;200&quot; height=&quot;302&quot;&gt;&lt;/a&gt; Przez mój czytnik i mojego &lt;a href=&quot;http://reinmar.blip.pl&quot;&gt;blipa&lt;/a&gt; przewija się masa linków. Część ze znalezionych informacji dodaję do swojego &lt;a href=&quot;http://del.icio.us/reinevan&quot;&gt;del.icio.us&lt;/a&gt;, jednak mimo to o tych najważniejszych / wartych najwięcej uwagi czasem zapominam. Pomyślałem więc, że będę publikował co jakiś czas najciekawsze moim zdaniem znaleziska z zakresu web developowania i usability. Raz, że samemu będzie mi łatwiej do tych informacji wrócić, dwa, że może komuś zaoszczędzę trochę czasu i podsunę coś czego jeszcze nie czytał.&lt;/p&gt;
&lt;p&gt;Wiele z poniższych linków macie szansę znać, wiele to starsze informacje, ale to pierwszy wpis w tym cyklu (tak, jeśli będę miał o czym pisać, to może zacznę to robić regularnie :) - następne będą aktualniejsze i zgrabniejsze. Na dodatek aby znaleźć te linki niestety musiałem przeglądać historię i wiele ciekawych rzeczy mogłem pominąć.&lt;/p&gt;
&lt;h4&gt;Usability vel użyteczność&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.abtests.com/&quot;&gt;AB Tests&lt;/a&gt; – strona zbiera wyniki testów A/B podsyłane przez czytelników. Nie zawsze są to wiarygodne testy (ze względu na zbyt małe próbki), ale jest też wiele wartościowych badań, z których można nauczyć się czegoś na przyszłość.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.smashingmagazine.com/2009/09/24/10-useful-usability-findings-and-guidelines/&quot;&gt;10 przydatnych wskazówek związanych z użytecznością&lt;/a&gt; – jak to w &lt;a href=&quot;http://www.smashingmagazine.com/&quot;&gt;Smashing Magazine&lt;/a&gt; – krótko, treściwie, ładnie i z głową.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.webaudit.pl/blog/2009/jak-wyglada-raport-z-audytu-uzytecznosci-zobacz-przyklad/&quot;&gt;Jak wygląda raport z audytu użyteczności&lt;/a&gt; – by Robert Drózd.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://wireframes.linowski.ca/2009/09/ui-flow-shorthand-notation/&quot;&gt;UI Flow Shorthand Notation&lt;/a&gt; – prosty sposób na graficzne przedstawienie &quot;flow&quot; serwisu. Czyli podstrony, akcje użytkownika i ścieżki między nimi.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://paulbakaus.com/2009/10/06/why-i-would-hire-game-developers-for-my-startup/&quot;&gt;Dlaczego zatrudnię do mojego startupu programistę gier&lt;/a&gt; – trochę mniej związane z usability, ale nadal.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.webaudit.pl/blog/2009/prezentacja-o-analytics-z-world-usability-day-tour-2009/&quot;&gt;Google Analytics w kontekście użyteczności&lt;/a&gt; – prezentacja przeprowadzona przez Roberta Drózda na &lt;a href=&quot;http://www.worldusabilitydaytour.pl/&quot;&gt;WUD Tour&lt;/a&gt;. O tym, że nie wystarczy odpalenie statystyk - trzeba jeszcze umieć ich użyć.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://offline.pl/blog/lista-lektur.html&quot;&gt;Lista lektur o użyteczności&lt;/a&gt; – wrzucam ją chyba sam dla siebie, żeby się motywować do czytania :).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Łebowe i niełebowe programowanie&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://nwp.jogger.pl/2009/11/26/python-pomoce-kursy-cwiczenia/&quot;&gt;Python - pomoce, kursy, ćwiczenia&lt;/a&gt; – zacząłem się ostatnio uczyć Pythona i tu znalazłem sporo ciekawych materiałów. Polecam &lt;a href=&quot;http://www.pythonchallenge.com/&quot;&gt;Python Challenge&lt;/a&gt; – najbardziej praktyczna nauka języka :).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dostepny.net/2009/jak-to-schowac-i-dlaczego-nie-displaynone/&quot;&gt;O tym dlaczego chowanie elementów interfejsu przez &lt;code&gt;display:none&lt;/code&gt; jest złe&lt;/a&gt; – Sam odpowiedzi nie znałem. Artykuł o tym jak to zrobić lepiej.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://ferrante.pl/2009/09/05/falsy-values-i-operatory-porownania/&quot;&gt;Falsy values i operatory porównania w Javascriptcie&lt;/a&gt; – dla mnie same falsy values były oczywiste, gorzej jednak z operatorami porównania - warto zapamiętać.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mail.mozilla.org/pipermail/es-discuss/2009-December/010215.html&quot;&gt;ECMA zatwierdza ECMAScript 5 jako standard&lt;/a&gt; – &lt;a href=&quot;http://drawlogic.com/2009/04/09/javascript-standard-ecmascript-fifth-edition-es5-published/&quot;&gt;więcej informacji na ten temat&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://html5doctor.com/glossary/&quot;&gt;Słownik HTMLa 5&lt;/a&gt; – bardzo wygodny i przejrzysty spis tagów. Do każdego elementu mamy opis i przykładowy kod (brakuje mi listy atrybutów). Warto do niego zaglądać (jak i na całego &lt;a href=&quot;http://html5doctor.com/&quot;&gt;HTML5 Doctora&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.slideshare.net/s1emon/html5-wtf&quot;&gt;HTML5 WTF?&lt;/a&gt; – prezentacja w komiksowym stylu o HTMLu 5. W sam raz dla szefa :)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://css-tricks.com/what-beautiful-html-code-looks-like/&quot;&gt;Jak powinien wyglądać śliczny kod HTML&lt;/a&gt; – nie z każdym elementem się zgadzam, ale to temat na osobny wpis. W skrócie - HTML5 w praktyce.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pentester.jogger.pl/2009/10/29/js-ninja/&quot;&gt;JS Ninja&lt;/a&gt; – kilka przykładów ataków &lt;abbr title=&quot;Cross Site Scripting&quot;&gt;XSS&lt;/abbr&gt;. Przydatne do samokontroli podczas pisania Javascriptu.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Inne&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://bradcolbow.com/&quot;&gt;Komiksy o świecie twórców stron&lt;/a&gt; – z humorem o naszej pracy i środowisku :)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://clientsfromhell.tumblr.com/&quot;&gt;Klienci z piekła rodem&lt;/a&gt; – bez komentarza. Trzeba poczytać. W każdą z tych sytuacji jestem w stanie uwierzyć :P&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Póki co na tym koniec. Od teraz co ciekawszy znaleziony link będę sobie odkładał, więc następne wydanie przeglądu prasy będzie aktualniejsze.&lt;/p&gt;
</description><pubDate>Tue, 08 Dec 2009 00:47:43 +0100</pubDate><guid>http://blog.koszulinski.pl/2009/12/08/przeglad-prasy/</guid><category>CSS</category><category>HTML</category><category>Javascript</category><category>Ogólne</category><category>Techblog</category><category>Użyteczność</category></item><item><title>Write LESS, do more - czyli pimp my CSS</title><link>http://blog.koszulinski.pl/2009/11/26/write-less-do-more-czyli-pimp-my-css/</link><description>&lt;p&gt;Uwaga: wyszedł mi &quot;odrobinkę&quot; przydługi wstęp. Zabieganych zapraszam od razu do &lt;a href=&quot;http://blog.koszulinski.pl/2009/11/26/write-less-do-more-czyli-pimp-my-css/#write-less-do-more-main&quot;&gt;konkretów&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;CSS rady nie daje&lt;/h4&gt;
&lt;p&gt;Nie da się ukryć że frontend developerzy (czy inaczej &quot;ci od cięcia grafiki&quot; :) łatwego życia nie mają. Pierwsza sprawa to niedoskonałości samych języków (CSS, xHTML, Javascript+DOM), druga to różnice i bugi (zwane inaczej ficzerami) w obsłudze przez przeglądarki. Każdy z tych języków na szczęście się rozwija (CSS3, HTML5, ECMAScript 5), a implementacja standardów jest, nawet w Internet Explorerze, sukcesywnie polepszana. Trwa to jednak strasznie długo, dlatego warto pokombinować samemu.&lt;/p&gt;
&lt;p&gt;Ostatnio opisałem &lt;a href=&quot;http://blog.koszulinski.pl/2009/11/22/zen-coding-snippety-nie-maja-szans/&quot;&gt;plugin do edytorów tekstów dzięki któremu można przyspieszyć pisanie HTMLa&lt;/a&gt;. Dzisiaj pod lupę chciałbym wziąć CSS. Osobiście na tempo pisania listy właściwości nie narzekam - mam własny zestaw snippetów, który umila mi życie. Inaczej ma się sprawa w stosunku do selektorów. Już w niedużym projekcie potrafią się zrobić cuda typu:&lt;/p&gt;
&lt;p&gt;{geshi lang=css}#content .news_list .item .title {...} #content .news_list .item .date {...} #content .news_list .item .date .day {...}{/geshi}&lt;/p&gt;
&lt;p&gt;Albo:&lt;/p&gt;
&lt;p&gt;{geshi lang=css}.s1 { width:120px; float:left; font-size:1.1em; margin-left:10px; color:#FA0; } /*gdzieś kawałek dalej:*/ .s2 { width:120px; float:left; font-size:1.1em; margin-left:10px; color:#C14; }{/geshi}&lt;/p&gt;
&lt;p&gt;Gdzie wypada to połączyć do pary selektorów i dla każdego z osobna jeszcze kolor ustawić. Niestety to najprostszy przypadek z tej rodziny, czasami trzeba znaleźć części wspólne dla kilku reguł po kilkunaście właściwości, albo olać wszystko.&lt;/p&gt;
&lt;p&gt;Dalej można wymieniać:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Powtarzające się wartości kolorów, rozmiarów, marginesów, itd. Zmiana jednej wymaga zmiany pozostałych, bo np. tekst ma mieć ten sam kolor w nagłówkach newsów co gdzieś w sidebarze i górnym menu. I jak pozapamiętywać te wszystkie kluczowe wartości, żeby później nie szukać &lt;q&gt;co to był za kod tego pomarańczowego, który używam do podkreśleń&lt;/q&gt;?&lt;/li&gt;
&lt;li&gt;Obliczenia - dopełnianie się marginesów, paddingów i borderów, kolor lekko ciemniejszy, kolor lekko jaśniejszy. Ja zawsze do cięcia siadałem z kartką A4, która już po kilku godzinach była zapisana do pełna wartościami i obliczeniami.&lt;/li&gt;
&lt;li&gt;{geshi lang=css}-moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px;{/geshi}&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Co więcej - to są problemy które pojawiają się już na etapie stron o średniej wielkości i kodowania w pojedynkę. W przypadku sporych serwisów (długo i wieloetapowo rozwijanych) i większego zespołu potrafią urosnąć do &lt;q&gt;&amp;amp;*$#$%. To jest jak rzeźba w gównie. Trzeba przepisać cały ten bajzel&lt;/q&gt;. Sam ostatnio tak opisałem jeden commit do bazy.&lt;/p&gt;
&lt;h4 id=&quot;write-less-do-more-main&quot;&gt;Wysyp wspomagaczy&lt;/h4&gt;
&lt;p&gt;Jakiś czas temu dostałem od kogoś link do &lt;a href=&quot;http://lesscss.org/&quot;&gt;LESS CSS&lt;/a&gt; - parsera/kompilatora (nie wiem jak to nazwać) rozszerzającego możliwości CSSa o kilka interesujących rzeczy typu: zmienne, obliczenia, reguły zagnieżdżone, itd. O temacie jednak zapomniałem (mało ostatnio koduję) i przypomniał mi kilka dni temu o nim &lt;a href=&quot;http://occulkot.jogger.pl/&quot;&gt;Occulkot&lt;/a&gt;, który podrzucił mi &lt;a href=&quot;http://sass-lang.com/&quot;&gt;Sassa&lt;/a&gt;. Obydwa kompilatory napisane są w Rubym. Zrobiłem mały research i znalazłem jeszcze podobne cudo, tyle że w Pythonie - &lt;a href=&quot;http://sandbox.pocoo.org/clevercss/&quot;&gt;Clever CSS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Po krótkim wczytywaniu się w przykłady zdecydowałem się na LESSa. Dodaje do CSSa trochę mniej ficzerów, ale przynajmniej nie zmienia jego składni (plik CSS jest poprawnym plikiem LESS) i nie wymusza na mnie jedynego, właściwego formatowania kodu (Sass i Clever CSS mają składnię czerpiącą z języków w jakich zostały napisane - odpowiednio Ruby i Python - wymagają więc wcięć).&lt;/p&gt;
&lt;p&gt;Polecam przeczytać &lt;a href=&quot;http://sigma.inf.ug.edu.pl/~kbelau/rails3/2009/10/31/haml/&quot;&gt;Haml-sass, czyli tragedia w dwóch aktach&lt;/a&gt;. Przy okazji tej lektury ja również odradzam &lt;a href=&quot;http://haml-lang.com/&quot;&gt;Hamla&lt;/a&gt;, który jest w teorii cudownym (zen i te sprawy) systemem szablonów HTMLa. Tylko, że kompletnie to nieczytelne, brzydkie i bez sensu.&lt;/p&gt;
&lt;h4&gt;Instalacja&lt;/h4&gt;
&lt;p&gt;Po tym przydługim wstępie (chciałem usunąć, ale żal jak się już napisało) przejdźmy do konkretów.&lt;/p&gt;
&lt;p&gt;Instalacja, dla posiadających &lt;a href=&quot;http://docs.rubygems.org/read/book/1&quot;&gt;gema&lt;/a&gt; (ci nieposiadający najlepiej niech go zainstalują), jest banalna:&lt;/p&gt;
&lt;p&gt;{geshi lang=bash}$ sudo gem install less{/geshi}&lt;/p&gt;
&lt;p&gt;Ewentualnie jeśli ktoś koduje w Railsach, to może go zainteresować &lt;a href=&quot;http://github.com/cloudhead/more&quot;&gt;ten plugin&lt;/a&gt;.Najprostszym sposobem skorzystania z LESSa jest jednak przy pomocy konsoli:&lt;/p&gt;
&lt;p&gt;{geshi lang=bash}$ lessc style.less{/geshi}&lt;/p&gt;
&lt;p&gt;Wykonanie tego polecenia spowoduje utworzenie pliku &lt;code&gt;style.css&lt;/code&gt; zawierającego wynik działania kompilatora.&lt;/p&gt;
&lt;h4&gt;Ficzery&lt;/h4&gt;
&lt;dl&gt;
&lt;dt&gt;Zmienne&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Kompilując taki kod:&lt;/p&gt;
{geshi lang=css}@brand_color: #4D926F; #header { color: @brand_color; } h2 { color: @brand_color; }{/geshi}
&lt;p&gt;Otrzymamy:&lt;/p&gt;
{geshi lang=css}#header, h2 { color: #4d926f; }{/geshi}
&lt;p&gt;Jak widać, poza podstawieniem zmiennej, LESS połączył też reguły o tej samej liście właściwości. To informacja dla miłośników oszczędzania na bajtach transferu :).&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Wielokrotne wykorzystanie reguł&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;CSSowe &lt;acronym title=&quot;Don't repeat yourself&quot;&gt;DRY&lt;/acronym&gt; :).&lt;/p&gt;
{geshi lang=css}.rounded_corners (@radius: 5px) { -moz-border-radius: @radius; -webkit-border-radius: @radius; border-radius: @radius; } h1 .stronger { font-weight:bold; font-size:1.1em; } #header { .rounded_corners; h1 .stronger; } #footer { .rounded_corners(10px); }{/geshi}
&lt;p&gt;Po kompilacji:&lt;/p&gt;
{geshi lang=css}h1 .stronger { font-weight: bold; font-size: 1.1em; } #header { -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; font-weight: bold; font-size: 1.1em; } #footer { -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius: 10px; } {/geshi}
&lt;p&gt;Przy czym definicja reguły musi wystąpić przed jej użyciem. Przykład z wykorzystaniem &lt;code&gt;h1 .stronger&lt;/code&gt; nie ma uzasadnienia w praktyce (jest w zasadzie błędny), ale chciałem tylko pokazać, że można wykorzystywać ponownie dowolne reguły.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Zagnieżdżone reguły&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;To chyba mój ulubieniec. Dzięki temu rozszerzeniu unikniemy pisania co chwilę mega długich selektorów. Dziwię się w ogóle, że nie ma tego w oficjalnym CSSie.&lt;/p&gt;
{geshi lang=css}#header { color: red; a { font-weight: bold; text-decoration: none; } &amp;gt; p { color: blue; } }{/geshi}
&lt;p&gt;Po kompilacji:&lt;/p&gt;
{geshi lang=css}#header { color: red; } #header a { font-weight: bold; text-decoration: none; } #header &amp;gt; p { color: blue; }{/geshi}&lt;/dd&gt;
&lt;dt&gt;Obliczenia&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;Chyba nie muszę tłumaczyć.&lt;/p&gt;
{geshi lang=css}@the-border: 1px; @base-color: #111; #header { color: @base-color * 3; border-left: @the-border; border-right: @the-border * 2; } #footer { color: (@base-color + #111) * 2; }{/geshi}
&lt;p&gt;Po kompilacji:&lt;/p&gt;
{geshi lang=css}#header { color: #333333; border-left: 1px; border-right: 2px; } #footer { color: #444444; }{/geshi}&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;To by było na tyle. Jeśli kogoś temat zainteresował to zapraszam do &lt;a href=&quot;http://lesscss.org/docs.html&quot;&gt;specyfikacji&lt;/a&gt;, gdzie autor omawia jeszcze kilka dodatków.&lt;/p&gt;
&lt;p&gt;W każdym razie - cztery małe ficzery, a jak cieszą, prawda? :)&lt;/p&gt;
&lt;h4&gt;Praca z LESSem&lt;/h4&gt;
&lt;p&gt;Zastanawiałem się tylko jak usprawnić kompilację po wprowadzeniu zmian do pliku LESS. Najfajniej gdyby udało mi się w moim VIMie podłączyć wykonanie &lt;code&gt;$ lessc&lt;/code&gt; pod operację zapisania, ale to nie na moje umiejętności. &lt;a href=&quot;http://mcv.jogger.pl&quot;&gt;Mcv&lt;/a&gt; zaproponował mi takiego Makefile'a:&lt;/p&gt;
&lt;p&gt;{geshi lang=bash}%.css: %.less lessc $&amp;lt;{/geshi}&lt;/p&gt;
&lt;p&gt;Wykonujemy go uruchamiając: &lt;code&gt;$ make plik1.css plik2.css&lt;/code&gt;. To już powinno mi się udać podpiąć w VIMie pod zapis pliku. Ewentualnie można spróbować tak:&lt;/p&gt;
&lt;p&gt;{geshi lang=bash}all: *.css %.css: %.less lessc $&amp;lt;{/geshi}&lt;/p&gt;
&lt;p&gt;Co zadziała automatycznie dla wszystkich istniejących już plików CSS po wykonaniu prostego &lt;code&gt;$ make&lt;/code&gt;. Przy czym, jeśli się mylę, to proszę mnie poprawić, bo nigdy żadnego makefile'a sam nie napisałem.&lt;/p&gt;
&lt;p&gt;&lt;ins&gt;EDIT: w komentarzach pojawiły się rozwiązania mojego problemu.&lt;/ins&gt;&lt;/p&gt;
</description><pubDate>Thu, 26 Nov 2009 01:20:01 +0100</pubDate><guid>http://blog.koszulinski.pl/2009/11/26/write-less-do-more-czyli-pimp-my-css/</guid><category>CSS</category><category>Frontend</category><category>Ogólne</category><category>Techblog</category><category>VIM</category><category>css less sass</category></item></channel></rss>
