<?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>adamczuk.net.pl</title>
	<atom:link href="http://adamczuk.net.pl/feed/" rel="self" type="application/rss+xml" />
	<link>http://adamczuk.net.pl</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Fri, 03 Feb 2012 21:59:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Najbliższe plany, czyli konkretne wpisy</title>
		<link>http://adamczuk.net.pl/2012/02/03/najblizsze-plany-czyli-konkretne-wpisy/</link>
		<comments>http://adamczuk.net.pl/2012/02/03/najblizsze-plany-czyli-konkretne-wpisy/#comments</comments>
		<pubDate>Fri, 03 Feb 2012 21:58:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Przemyślenia]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[plans]]></category>
		<category><![CDATA[projects]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=568</guid>
		<description><![CDATA[Dalsze plany i wyzwania.]]></description>
			<content:encoded><![CDATA[<p>Ostanio napisałem o moich planach w 2012 roku. Co dokładnie zrobię to kwestia zaangażowania, ciepliwości i czasu, ale o samego początku systematyczności. Dlatego w ciągu najliższych tygodni i miesięcy na blogu pojawi się więcej wpisów o naprawdę zróżnicowanej tematyce.<span id="more-568"></span></p>
<p>Na początku roku moja domowa biblioteka wzbogaciła się o kilka książek, które z pewnością zrecenzuję. W najbliższym czasie dowiecie się dlatego warto kupić <a href="http://helion.pl/ksiazki/the-smashing-book-2-edycja-polska-matt-ward-alexander-charchar-francisco-inschauste-mike-rundle-janko-jovanovic-christian-heilmann-vivien-anaylan-christoph-kolb-susan-weinschenk-steven-bradley,smash2.htm">Smashing Book #2</a>, bo zdecydowanie warto. Ostanio czytam wiele na temat wzorców projektowych i kwestii projektowania aplikacji. Będzie do dobry czas do dyskusji na temat dziedziczania i architektury systemów klasy enterprise.</p>
<p>Git oraz <a href="http://github.com">GitHub</a>, tak mi się spodobaby, że zamięszcze tam kolejne pomysły i narzędzia, nad którymi pracowałem lub pracuję. W końcu pojawi się kilka wpisów na temat programowania, zarówno Python czy Django, ale także Xhtml i CSS. Tak czy inaczej sporo wyzwań i planów. Byle do przodu.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2012/02/03/najblizsze-plany-czyli-konkretne-wpisy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Podsumowanie, choć w zasadzie postanowienia</title>
		<link>http://adamczuk.net.pl/2012/01/28/podsumowanie-choc-w-zasadzie-postanowienia/</link>
		<comments>http://adamczuk.net.pl/2012/01/28/podsumowanie-choc-w-zasadzie-postanowienia/#comments</comments>
		<pubDate>Sat, 28 Jan 2012 10:35:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Przemyślenia]]></category>
		<category><![CDATA[2012]]></category>
		<category><![CDATA[life]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=562</guid>
		<description><![CDATA[Moje postanowienia na nowy rok, ambitne i realne]]></description>
			<content:encoded><![CDATA[<p>Kolejny rok za nami, zatem wiele osón zbiera się na opisywanie swoich dokonań i osiągnięć. Nie będę rozpisywał się na temat tego, co uczyniłem, bo generalnie nie było wcale tak wiele, a już nie tyle co planowałem w poprzednim roku. Każdy patrzy na swoje życie z własnej perspektywy. Ważne, abyśmy podczas tych obserwacji nie stracili naszych głównych celów z oczy.<span id="more-562"></span></p>
<p>Zobaczymy za rok, co poniższej listy zostanie zrealizowane. Oto moje postanowiena na trwający już 2012 rok.</p>
<p>TOP 10</p>
<ol>
<li>Python, nauka i rozwój</li>
<li>SPINNING STAR 2</li>
<li>Moja własna książka o XHTML i CSS3</li>
<li>Więcej deski niż rok wcześniej</li>
<li>Co najmniej 1 wpis tygodniowo na blogu</li>
<li>Chorwacja w wakacje</li>
<li>Nowe portfolio</li>
<li>Więcej czasu dla bliskich i znajomych</li>
<li>Przybranie 5 kilogramów</li>
<li>Kredyt hipoteczny</li>
</ol>
<p>Plany bardzo ambitne i jak najbardziej realne. Wykonanie przynajmniej pięciu z mojej listy, oznacza dobry rok, ośmiu &#8211; bardzo dobry, a wszystkie &#8211; REWELACYJNY!</p>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2012/01/28/podsumowanie-choc-w-zasadzie-postanowienia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress 3.3.1 &#8211; nowe funkcje i wygląd</title>
		<link>http://adamczuk.net.pl/2012/01/27/wordpress-3-3-1-nowe-funkcje-i-wyglad/</link>
		<comments>http://adamczuk.net.pl/2012/01/27/wordpress-3-3-1-nowe-funkcje-i-wyglad/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 22:13:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[wordpess]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=558</guid>
		<description><![CDATA[Krótkie i subiektywne spostrzeżenia na temat trzeciej wersji Wordpressa.]]></description>
			<content:encoded><![CDATA[<p>Nie pamiętam jak długo nie aktualizowałem mojego WordPressa, ale podczas ostatniej zmiany w panelu pojawiło się kilka nowych elementów. Pierwsze, co zobaczyłem to nowy wygląd samego panelu, choć może ta zmiana zaszła już nieco wcześniej. Ale to nie wszystko.<span id="more-558"></span></p>
<p>Główne zmiany w panelu wprowadza nawigacja, zarówno pozioma jak i pionowa. Górny pasek jest węższy, a do tego grupuje kilka funkcjonalności niższego poziomu, jak liczba dostępnych aktualizacji, komentarzy czy dodawanie nowych elementów. Dostęp do ustawień użytkownika, podgląd wpisu i przejście do naszego bloga pozostało bez zmian.</p>
<p>Pasek nawigacyjny z lewej strony zmienił jedynie wygląd. Dalej działa jak akordeon z rozwijanymi opcjami drugiego poziomu z prawej strony. Pozostało zwinięcie menu do szerokości kilkunastu pikseli oraz prezentowanie komuniktów w formie liczbowej.</p>
<p>Podczas dodwania i edycji wpisu, media dodajemy jednym przyciskiem. Nie pamiętam, czy skrypt <strong>Press This</strong> był obecny we wczesniejszej wersji, ale konwerter tagów i kategorii, prawdopodobnie tak. Większych zmian nie zauważyłem.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2012/01/27/wordpress-3-3-1-nowe-funkcje-i-wyglad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GitHub wspiera tworzenie aplikacji</title>
		<link>http://adamczuk.net.pl/2011/12/08/github-wspiera-tworzenie-aplikacji/</link>
		<comments>http://adamczuk.net.pl/2011/12/08/github-wspiera-tworzenie-aplikacji/#comments</comments>
		<pubDate>Thu, 08 Dec 2011 19:47:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[hub]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[manipulator]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=553</guid>
		<description><![CDATA[Wzmianka o utworzenie konta na GitHub i projekcie ImageManipulatora.]]></description>
			<content:encoded><![CDATA[<p>Git to popularny w ostatnim czasie system kontroli wersji. Koncepcja i przeznaczenie tego oprogramowania wyłoniła się z określonych potrzeb użytkowników. Przypuszczalnie znajdą się osoby o bardziej tradycyjnym podejściu, które wolą scentralizowane systemy kontroli wersji.</p>
<p>Jednak w moim przypadku, praca z CVS i SVN często powodowała ogromną frustrację. Kwestia wydajności i funkcjonalności jest pierwszorzędna. Nie mam również problemów z dzieleniem się swoim kodem, tak jak to robiłem do tej pory na swoim blogu. Faktycznie część starych projektów nadal używa starszych narzędzi, ale wszystkie nowe aplikacje korzystają już z Gita. Z tego też powodu udostępniam mój profil <a href="https://github.com/lukasz-jakub-adamczuk">GitHub</a>.</p>
<p>Aktualnie istnieje tylko jeden projekt z klasą do operacji na plikach graficznych. Startowa wersja wspiera tylko skalowanie do określonego rozmiaru, ale w przyszłości <strong>ImageManipulator</strong> wzbogaci się o kolejne funkcjonalności jak obracanie, odbijanie, filtry, itp.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2011/12/08/github-wspiera-tworzenie-aplikacji/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu 11.10 bardzo subiektywnie</title>
		<link>http://adamczuk.net.pl/2011/11/22/ubuntu-11-10-bardzo-subiektywnie/</link>
		<comments>http://adamczuk.net.pl/2011/11/22/ubuntu-11-10-bardzo-subiektywnie/#comments</comments>
		<pubDate>Tue, 22 Nov 2011 20:50:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Ocelot]]></category>
		<category><![CDATA[Oneiric]]></category>
		<category><![CDATA[opinion]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=549</guid>
		<description><![CDATA[Krótki wpis na temat pierwszych wrażeń dotyczących Ubuntu 11.10]]></description>
			<content:encoded><![CDATA[<p>Nie jestem doświadczonym użytkownikiem systemów uniksowych, ale z drugiej strony trudno określić mnie absolutnym nowicjuszem. Prawdą jest, że używam systemu <a href="http://www.ubuntu.com/">Ubuntu</a> od ponad 4 lat i to, że większość czasu spędzam w trybie graficznym. Faktycznie konsola nie jest moim największym przyjacielem, ale często ratowała mi życie i pomagała w codziennym życiu. Doceniam znaczenie skryptów, kompatybilności sprzętowej i wielu innych zagadnień programowych, ale system powinien być użyteczny. Moja opinia o nowym Ubuntu 11.10, czyli Oneiric Ocelot jest zupełnie inna.<span id="more-549"></span></p>
<p>Od początku mojej przygody z Ubuntu towarzyszy mi stary wysłużony HP Pavilion dv6376ea. Wiem, ładny, błyszczący, z zaokrąglonymi krawędziami, ale to moja kobieta wybierała, bo wtedy nie miałem do tego głowy. Blisko 4 lata system sprawował się idealnie, bez zbędnych re-instalacji i zmian sprzętowych. Nawet 1GB pamięci pozwalał na wydajną pracę z wieloma aplikacjami i włączonymi opcjami Compiza. Mimo tego rozszerzyłem pamięć fizyczną do 4GB i zainstalowałem Ubuntu 10.10, który był ostatnią wersją systemu bez rewolucyjnych zmian.</p>
<h3>Początek złego</h3>
<p>Po niepochlebnych opiniach znajomych, równie subiektywnych jak moje, zdecydowałem o pozostaniu przy starej wersji sprawdzonego systemu. Poczekałem 6 miesięcy i pomyślałem, że może warto. I to był chyba największy błąd dotyczący używanego systemu operacyjnego. O ile rezygnacja z Windows Vista była starzałem w dziesiątkę to już instalacja Ubuntu 11.10 wywróciła moje dotychczasowe życie do góry nogami.</p>
<p>Już wersja 11.04 sugerowała używanie Unity jako domyślnego środowiska graficznego. Szczerze, nie jestem zwolennikiem rewolucyjnych zmian i dotychczasowy, tradycyjny model okienkowy zupełnie mnie satysfakcjonował. Szczególnie jeśli działanie nowego środowiska graficznego nie było całkowicie stabilne i wydajne z poziomu użytkownika.</p>
<p>Przypuszczałem, że pół roku pozwoliło ludziom z Canonical na wyciągnięcie wniosków wprowadzenie koniecznych zmian. Jak się okazało moje nadzieje były płonne. Rewolucyjne zmiany wywołały u mnie tylko początkowy zachwyt, który szybko przerodził się w nieustanną frustrację. Czy możliwe jest, że tylko ja mam takie problemy?</p>
<h3>Złożona analiza</h3>
<p>Domyślny, boczny pasek przejął częściowo role dolnego i górnego paska, które informowały użytkownika o uruchomionych aplikacjach i prezentowały skróty aplikacji. I wszytko byłoby super, gdyby konfiguracja bocznego paska była łatwiejsza. Ikony ogromne, masa efektów rozwijania, migania i zbędnych animacji, które zupełnie zaburzają płynność działania to nie to czego oczekiwałem. Przypuszczalnie wszystko o czym napisałem zmienia się łatwo i bezboleśnie, ale ja tego jeszcze nie dokonałem.</p>
<p>Rhythmbox nawet przy skromnej kolekcji kilkunastu tysięcy piosenek dławi się podczas wyszukiwania na ponad 10 sekund. Jeśli już posłucham kilku utworów to dalej nie mam gwarancji, że aplikacja nie <a href="https://bugzilla.redhat.com/show_bug.cgi?id=702778">wysypie się</a> przed końcem piosenki. Podobnie Eclipse. Napisanie kilku znaków tekstu sprowadza się do odczekania kilkunastu sekund zanim wróci kontrola nad aplikacją. I tak co chwilę.</p>
<p>Praca z dwoma monitorami również bywa problematyczna. Podczas korzystania z drugiego ekranu poprzez kabel D-Sub zdarza się, że główny ekran zamiera, a wówczas pozostaje tylko restart systemu.</p>
<h3>Podsumowanie</h3>
<p>W tej chwili nie przychodzą mi do głowy inne braki systemu Ubuntu 11.10, ale pewnie takie istnieją. Przykro mi, ale mówię to z pełną świadomością. Nie podoba mi się nowy trend i kierunek rozwoju systemu, hipotetyczna innowacyjność, mizerna wydajność i brak stabilności. Niedopracowany produkt zostaje w laboratorium, a nie dostarcza się go klientom, ponieważ użytkownicy to nie darmowa baza testerów, co staje się ogromnie popularne w ostatnim czasie. Ostatecznie życzę powodzenia i cierpliwości wszystkim, którzy zdecydują się na aktualizację systemu.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2011/11/22/ubuntu-11-10-bardzo-subiektywnie/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Palety kolorów dla stron internetowych</title>
		<link>http://adamczuk.net.pl/2011/10/23/palety-kolorow-dla-stron-internetowych/</link>
		<comments>http://adamczuk.net.pl/2011/10/23/palety-kolorow-dla-stron-internetowych/#comments</comments>
		<pubDate>Sun, 23 Oct 2011 20:20:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Serwisy]]></category>
		<category><![CDATA[colors]]></category>
		<category><![CDATA[colorwizard]]></category>
		<category><![CDATA[hls]]></category>
		<category><![CDATA[palette]]></category>
		<category><![CDATA[rgb]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=546</guid>
		<description><![CDATA[Krótka notka na temat aplikacji przydatnej przy szukaniu kolorów dla stron internetowych]]></description>
			<content:encoded><![CDATA[<p><a href="http://adamczuk.net.pl/wp-content/uploads/2011/10/color-wizard.jpg"><img src="http://adamczuk.net.pl/wp-content/uploads/2011/10/color-wizard.jpg" alt="" title="color-wizard" width="300" height="100" class="align left size-full wp-image-547" /></a>Często w pracy projektanta zdarza się, że potrzebujemy podobnych kolorów lub wręcz całej palety. Klient żąda od projektanta utrzymania określonej tonacji strony lub aplikacji. Właściwy dobór barw na podstawie odcienia i nasycenia bywa trudny. Często jest to kwestia indywidualna i zależna od poczucia estetyki samego projektanta. Jeśli zastanawiasz się jakie kolory optymalnie pasują do Twojego projektu, pomocny okaże się <a href="http://colorsontheweb.com/colorwizard.asp">Color Wizard</a>.<span id="more-546"></span><br />
Dopóki nie nauczyłem się kontroli nad ostatecznym kolorem poprzez kody RGB, korzystałem właśnie z opisywanej aplikacji. Prosty wariant wybiera losowy kolor spośród dostępnych ponad 16 milionów, co daję szeroki wachlarz możliwości. Dalej oceniamy już kolory znalezione poprzez algorytm. Aplikacja dla konkretnego przykładu prezentuje 4 warianty barwy, nasycenia i odcienia danego koloru, po dwa mocniejsze i słabsze.</p>
<p>Czasami kolory nie mieszczą się w zakresach wykorzystanego algorytmu, ale często dobrane zestawy są lepsze niż określenie ich metodą chybił-trafił. Nawet osoby, które nie są ekspertami z teorii koloru powiedzą czy dane kolory odpowiadają ich wymaganiom i pasują do przygotowanego projektu, a to chyba najważniejsze.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2011/10/23/palety-kolorow-dla-stron-internetowych/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wyjustowane menu nawigacyjne</title>
		<link>http://adamczuk.net.pl/2011/10/05/wyjustowane-menu-nawigacyjne/</link>
		<comments>http://adamczuk.net.pl/2011/10/05/wyjustowane-menu-nawigacyjne/#comments</comments>
		<pubDate>Wed, 05 Oct 2011 22:03:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[inline]]></category>
		<category><![CDATA[justify]]></category>
		<category><![CDATA[menu]]></category>
		<category><![CDATA[navigation]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=535</guid>
		<description><![CDATA[Krótki opis stworzenia poziomego, wyjustowanego menu nawigacyjnego]]></description>
			<content:encoded><![CDATA[<p>Podczas wprowadzania zmian w menu nawigacyjnym jednej ze stron konieczne było dodanie nowych łącz. Niestety sama konstrukcja nawigacji nie była idealna. Dwie listy nieuporządkowane z właściwością <code>float: left;</code>, z czego druga zawierała dodatkowo wyrównanie tekstu do prawej. Menu takie nie wygląda profesjonalnie, do tego dodawanie kolejnych linków zaburza ustalony wcześniej wygląd menu. A gdyby wszystkie łączą równo i proporcjonalnie wypełniały dostępną przestrzeń, czyli były wyrównane do lewej i prawej krawędzi strony internetowej.<span id="more-535"></span></p>
<p>Przy zwykłym menu nawigacyjnym, kolejne elementy mają określoną szerokość przez co szerokości między nimi są różne. A co jeśli łącza naszej nawigacji mają różną długość, a chcemy, aby były wyświetlane równomiernie? Istnieje pewne tego problemu.</p>
<p><a href="http://adamczuk.net.pl/przyklady/justify-horizontal-menu/justify-horizontal-menu.zip">Download</a> &middot; <a href="http://adamczuk.net.pl/przyklady/justify-horizontal-menu/">Live Demo</a></p>
<p>Pomysł nie jest wcale nowy, bo spotkałem się z nim już kilka lat temu podczas pracy w Onecie. Idea rozwiązania jest bardzo prosta, jeśli wszystkie elementy nawigacyjne potraktujemy jak elementy liniowe. Takie elementy zachowują się jak tekst, czyli podlegają wyrównaniu. Poniżej znajduję się przykładowa struktura naszego menu nawigacyjnego.</p>
<pre><code>&lt;div id="navigation"&gt;
            &lt;a href="#"&gt;Home&lt;/a&gt; &bull;
            &lt;a href="#"&gt;Projects&lt;/a&gt; &bull;
            &lt;a href="#"&gt;Some Long Text&lt;/a&gt; &bull;
            &lt;a href="#"&gt;Test me&lt;/a&gt; &bull;
            &lt;a href="#"&gt;People&lt;/a&gt; &bull;
            &lt;a href="#"&gt;About&lt;/a&gt; &bull;
            &lt;a href="#"&gt;Contact&lt;/a&gt;&lt;span&gt;&lt;/span&gt;
        &lt;/div></code></pre>
<p>Znaczniki <code>&lt;a&gt;</code> domyślnie wyświetlane liniowo, układają się obok siebie, chyba że kolejny element nie mieści się już w podanej linii, więc przechodzi do nowej linii. Osiągniemy to poprzez dodanie do naszego menu dodatkowego elementu <code>&lt;span&gt;</code> i określeniu jego szerokości na 100%.</p>
<pre><code>#navigation {
    background: #eee;
    text-align: justify;
}
#navigation a {
    display: inline-block;
    white-space: nowrap;
}
#navigation span {
    display: inline-block;
    width: 100%;
}</code></pre>
<p>Oprócz szerokości dodatkowego elementu <code>&lt;span&gt;</code> konieczne jest ustawienie wyrównania dla pojemnika łącz, a także właściwości <code>white-space: nowrap;</code>, aby poszczególne wyrazy linków wielowyrazowe były naturalnie blisko siebie.</p>
<p>Problematyczny w tej sytuacji jest jak zwykle Internet Explorer. Wersje IE6 i IE7 nie wyświetlają prawidłowo elementów liniowo-blokowych dlatego rozwiązanie to nie jest idealne. Z kolei dodatkowy element <code>&lt;span&gt;</code> rozciąga w pionie pojemnik nawigacji, na co do tej pory również nie znalazłem rozwiązania.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2011/10/05/wyjustowane-menu-nawigacyjne/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web Designer Wall</title>
		<link>http://adamczuk.net.pl/2011/10/03/web-designer-wall/</link>
		<comments>http://adamczuk.net.pl/2011/10/03/web-designer-wall/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 20:45:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Blogi]]></category>
		<category><![CDATA[designer]]></category>
		<category><![CDATA[la]]></category>
		<category><![CDATA[nick]]></category>
		<category><![CDATA[wall]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=526</guid>
		<description><![CDATA[Krótka notka na temat Web Designer Wall - bloga, którego prowadzi Nick La.]]></description>
			<content:encoded><![CDATA[<p><a href="http://adamczuk.net.pl/wp-content/uploads/2011/10/web-designer-wall.jpg"><img src="http://adamczuk.net.pl/wp-content/uploads/2011/10/web-designer-wall.jpg" alt="" title="web-designer-wall" width="300" height="100" class="align left size-full wp-image-528" /></a>Często zapominam o ciekawych blogach jakie znalazłem dawno temu w sieci i zupełnie przypadkiem wracam do nich po kilku miesiącach czy nawet latach. O ile niektóre czytam regularnie i o każdej porze pamiętam ich adres o tyle z innymi jest już trochę gorzej. Często podczas poszukiwań w sieci przypadkiem trafiam na znajome źródło. Podobnie było z <a href="http://webdesignerwall.com">Web Designer Wall</a>, które znam już od kilku lat.<br />
<span id="more-526"></span><br />
<strong>Web Designer Wall</strong>, czy ściana projektanta od początku koncentrowała się na technologia internetowych, takich jak HTML i CSS. Nick La jest kanadyjskim projektantem stron internetowych. Tworzy ikony, tematy WordPressa i wiele innych elementów graficznych. W przeszłości przemawiał na różnych konferencjach dotyczących internetu i projektowania, zarówno w Ameryce Północnej (Web Design NYC, WordCamp) jak i Europie (Frontend, Mad). Tematyka bloga Nicka opisuje nie tylko konkretne rozwiązania znanych problemów, ale powoduje dyskusje projektantów na temat nowych trendów i pomysłów w internecie. Sama strona była często wyróżniana w wielu magazynach, co nadaje jej prawdziwie profesjonalny charakter.</p>
<p>Ostatnio modne i coraz lepiej wspierane HTML5 i CSS3, często pojawiają się we wpisach i znajdują kolejnych naśladowców. Sam byłem niejednokrotnie pod wrażeniem efektów osiąganych bez użycia grafiki, a jedynie arkuszy stylów czy wsparcia JS. Dlatego jeśli szukacie inspiracji, oryginalnych pomysłów i nowoczesnych rozwiązań to zapamiętaj ten adres. Web Designer Wall zaprowadzi Was w przyszłość stron internetowych.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2011/10/03/web-designer-wall/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Projektowanie serwisów WWW. Standardy sieciowe &#8211; wydanie III</title>
		<link>http://adamczuk.net.pl/2011/09/30/projektowanie-serwisow-www-standardy-sieciowe-wydanie-iii/</link>
		<comments>http://adamczuk.net.pl/2011/09/30/projektowanie-serwisow-www-standardy-sieciowe-wydanie-iii/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 17:36:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Książki]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[webstandards]]></category>
		<category><![CDATA[zeldman]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=518</guid>
		<description><![CDATA[Krótka recenzja nowego wydania popularnej książki Zeldmana]]></description>
			<content:encoded><![CDATA[<p><a href="http://adamczuk.net.pl/wp-content/uploads/2011/09/pswss3.jpg"><img src="http://adamczuk.net.pl/wp-content/uploads/2011/09/pswss3.jpg" alt="Okładka książki Projektowanie sewisów WWW. Standardy sieciowe. Wydanie III" title="Okładka książki Projektowanie sewisów WWW. Standardy sieciowe. Wydanie III" width="140" height="200" class="align left size-full wp-image-519" /></a>Kilka lat temu bardzo podekscytowany kwestiami standardów sieciowych i kierunkami rozwoju internetu natrafiłem na &#8220;Projektowanie serwisów WWW. Standardy sieciowe&#8221; Jeffreya Zeldmana, wtedy już wydanie drugie. Powiem szczerze, że ta książka znacznie ukształtowała moje poglądy odnoście stron internetowych, niektóre nawet bardzo radykalne. Zatem jeśli szukasz rzetelnych informacji ma temat standardów sieciowych jasno i klarownie przedstawionych na kilkuset stronach, zastanów się nad przeczytaniem tej książki. Jeśli nie masz wielkiego doświadczenia w tworzeniu nowoczesnych stron internetowych, zaufaj profesjonalistom.<span id="more-518"></span></p>
<p><strong>Projektowanie serwisów WWW. Standardy sieciowe &#8211; wydanie III</strong> zostało ponownie przeredagowane, tym razem już nie przez Zeldmana, a Ethana Marcotta. Współautor książki jest redaktorem znanej projektantom strony <em>A List Apart</em>. Współpracował również z <em>New York Magazine</em> i W3C. Również przy pracy nad omawianą książką wykazał się prawdziwym profesjonalizmem, jeśli chodzi o kwestie standardów sieciowych.</p>
<p>Kilkanaście rozdziałów dotyczących zasad tworzenia strukturalnego i semantycznego kodu, a także realizacji nowoczesnych układów, stworzonych w oparciu o arkusze stylów kaskadowych. Dodatkowo prezentacja języków hipertekstowych oraz metody pisania nieinwazyjnego kodu JavaScript. Kolejne rozdziały prezentują sposoby tworzenia i manipulacji elementami DOM, sekrety użyteczności interfejsów użytkownika oraz dostępności stron internetowych.</p>
<p>Dzięki tej książce nauczysz się prawidłowego stosowania standardów sieciowych. Tworzenie nowoczesnych i funkcjonalnych witryn staje się jeszcze łatwiejsze po przeczytaniu porad doświadczonych specjalistów. Optymalizacja kodu, zwiększenie zasięgu i niskie koszty utrzymania stron to kluczowe cele jakie pragnie osiągnąć klient. Nowe, aktualniejsze wydanie tej książki pozwoli na usprawnienie procesu projektowania i wdrożenia witryny internetowej w zależności o stawianych wymagań.</p>
<p>Autorzy przedstawili kilka projektów, w których pokazali przydatne sztuczki i gotowe rozwiązania. Podczas pracy projektanta istotne są konsekwentne poszukiwania inspiracji i umiejętność elastycznego realizowania projektów. Dodatkowo dowiesz się sporo na temat przyszłości standardów sieciowych, w tym HTML5 oraz CSS3. Osoby o małym doświadczeniu poznają zasady tworzenia właściwej struktury, prezentacji i zachowania stron internetowych. Dzięki tej książce poradzisz sobie z najczęstszymi problemami, jakie spotykają projektantów stron internetowych.</p>
<p class="info">OSTATECZNA OCENA: 5/5</p>
<ul>
<li><strong>Autorzy: Zeffrey Zeldman, Ethan Marcotte</strong></li>
<li>Tytuł oryginału: Designing with Web Standards (3rd Edition)</li>
<li>Tłumaczenie: Piotr Rajca</li>
<li>ISBN: 978-83-246-2658-8</li>
<li>Format: 158&#215;235, 448 stron</li>
<li>Data wydania: 12/2010 (<a href="http://helion.pl">Helion</a>)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2011/09/30/projektowanie-serwisow-www-standardy-sieciowe-wydanie-iii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP i Python &#8211; porównanie</title>
		<link>http://adamczuk.net.pl/2011/09/28/php-i-python-porownanie/</link>
		<comments>http://adamczuk.net.pl/2011/09/28/php-i-python-porownanie/#comments</comments>
		<pubDate>Wed, 28 Sep 2011 16:38:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[comparsion]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=507</guid>
		<description><![CDATA[Prywatne przemyślenia na temat PHP i Pythona, różnic i podobieństw]]></description>
			<content:encoded><![CDATA[<p>Poza moimi głównymi zainteresowaniami, czyli językami hipertekstowymi i stylami kaskadowymi to właśnie PHP jest ciągle najważniejszym elementem mojej pracy. Jednak widząc braki tego języka przez ostatnie kilka lat postanowiłem przejść pod skrzydła bardziej nowoczesnych technologii. Nie zamierzam wcale zmieniać utartej opinii PHP jako języka łatwego w nauczeniu, a zarazem ograniczonego w możliwościach, bo jest w tym sporo prawdy. Tak więc miałem wybór pomiędzy <a href="http://www.python.org/">Pythonem</a> a <a href="http://ruby-lang.org/">Ruby</a>. Co w tej chwili wybrałem, pewnie się domyślacie.<span id="more-507"></span></p>
<p>Kwestia wyboru była dość łatwa, w końcu P jest w alfabecie wcześniej niż R, ale poważnie mówiąc znałem kilka osób które używały już Pythona, a z Rubym nie było już tak kolorowo. Dodatkowo argument, że tego języka używa Google nie był wcale decydujący. W takim razie czemu podoba mi się Python, a w dalszej części samo <a href="http://www.djangoproject.com/">django</a>.</p>
<p>Python jest językiem wieloparadygmatowym. Pozwala jednocześnie na programowanie obiektowe, strukturalne i funkcyjne. Posiada dynamiczne sprawdzanie typów i wbudowane zarządzanie pamięcią poprzez <em>garbage collector</em>. Składnia Pythona, choć na początku oszczędna i może trudna w ogarnięciu, z czasem okazuje się czytelna i potężna.</p>
<p>Same typy są silnie powiązane z systemem klas, choć w Pythonie nie ma enkapsulacji. Możliwa jest instrospekcja obiektów, więc programista ma szeroki dostęp do atrybutów obiektu. Funkcje i klasy po opatrzeniu dokumentacją w kodzie źródłowym, mają do niej dostęp w czasie wykonywania programu.</p>
<h3>Wbudowane typy danych</h3>
<p>Python posiada szerszy wachlarz wbudowanych typów danych, chociaż gdy spojrzy się na niego tak bardzie dokładnie to nie jest ich, aż tak więcej niż w samym PHP. Poniższa tabela przedstawia istniejące typy danych dla PHP.</p>
<table cellpadding="0" cellspacing="0" width="100%">
<caption>Dostępne typy danych w PHP</caption>
<thead>
<tr>
<th scope="col">Typ</th>
<th scope="col">Opis</th>
<th scope="col">Przykład</th>
</tr>
</thead>
<tbody>
<tr>
<td>int</td>
<td>liczba całkowita</td>
<td>495, 123</td>
</tr>
<tr>
<td>double</td>
<td>liczba zmiennoprzecinkowa</td>
<td>3.1415, 123.0</td>
</tr>
<tr>
<td>bool</td>
<td>prawda lub fałsz</td>
<td>true, false</td>
</tr>
<tr>
<td>null</td>
<td>nic</td>
<td>null</td>
</tr>
<tr>
<td>string</td>
<td>ciąg znaków</td>
<td>&#8220;PHP jest fajne.&#8221;, &#8216;nie każdy to wie&#8217;</td>
</tr>
<tr>
<td>array</td>
<td>tablica</td>
<td>array(1, 2), array(&#8216;a&#8217; => 1)</td>
</tr>
<tr>
<td>object</td>
<td>obiekt</td>
<td>egzemplarz zdefiniowane klasy</td>
</tr>
<tr>
<td>resource</td>
<td>zasób</td>
<td>deskryptor, połączenie z bazą danych, itp.</td>
</tr>
</tr>
</tbody>
</table>
<p>PHP nie posiada odrębnego typu liczby zmiennoprzecinkowej, krótkiej i długiej jak to było choćby w C, czyli <code>float</code> i <code>double</code>. Nie przytaczam tu zakresu wartości jakie przyjmuje zmienna określonego typu. Z kolei tablica w PHP jest indeksowaną kolekcją wartości, indeksowaną numerycznie lub asocjacyjnie.</p>
<p>Poniżej znajdziesz odpowiednią tabelę dla Pythona.</p>
<table cellpadding="0" cellspacing="0" width="100%">
<caption>Wybrane typy danych w Pythonie</caption>
<thead>
<tr>
<th scope="col">Typ</th>
<th scope="col">Opis</th>
<th scope="col">Przykład</th>
</tr>
</thead>
<tbody>
<tr>
<td>int (oraz long w Python 2)</td>
<td>liczba całkowita</td>
<td>495, 123</td>
</tr>
<tr>
<td>float</td>
<td>liczba zmiennoprzecinkowa</td>
<td>3.1415, 123.0</td>
</tr>
<tr>
<td>complex</td>
<td>liczba zespolona</td>
<td>3+2.7j</td>
</tr>
<tr>
<td>bool</td>
<td>prawda lub fałsz</td>
<td>True, False</td>
</tr>
<tr>
<td>None</td>
<td>nic</td>
<td>None</td>
</tr>
<tr>
<td>Python 3: str<br />Python 2: unicode</td>
<td>tekst w Unicode (niezmienny)</td>
<td>Python 3: &#8216;Napis&#8217; lub &#8220;Napis&#8221;<br />Python 2: u&#8217;Napis&#8217; lub u&#8221;Napis&#8221;</td>
</tr>
<tr>
<tr>
<td>Python 3: bytes<br />Python 2: str</td>
<td>tekst w ASCII (niezmienny)</td>
<td>Python 3: b&#8217;Napis&#8217; lub b&#8221;Napis&#8221;<br />Python 2: &#8216;Napis&#8217; lub &#8220;Napis&#8221;</td>
</tr>
<tr>
<td>list</td>
<td>lista (zmienna zawartość i długość)</td>
<td>[4.0, 'tekst', True]</td>
</tr>
<tr>
<td>tuple</td>
<td>krotka (niezmienna)</td>
<td>(4.0, &#8216;tekst&#8217;, True)</td>
</tr>
<tr>
<td>set</td>
<td>zbiór (zmienny)</td>
<td>Python 3: {4.0, &#8216;tekst&#8217;, True}<br />Python 2: set([4.0, 'tekst', True])</td>
</tr>
</tr>
<tr>
<td>frozenset</td>
<td>zbiór (niezmienny)</td>
<td>Python 3: frozenset({4.0, &#8216;tekst&#8217;, True})<br />Python 2: frozenset([4.0, 'tekst', True])</td>
</tr>
</tr>
<tr>
<td>dict</td>
<td>słownik (zmienny)</td>
<td>{&#8216;key1&#8242;: 1.0, 3: False}</td>
</tr>
</tr>
</tbody>
</table>
<p>Kwestia typów danych w Pythonie wydaje się skomplikowana na pierwszy rzut oka. Chociażby obsługa ciągów znaków, które istnieją w kilku wersjach zależne od kodowania. Prawdziwą zaletą Pythona jest wsparcie dla Unikodu, czego niestety nie uświadczy się w PHP. Prawdą jest, że istnieją metody konwersji, również dla Unicode, ale to jeszcze nie to. Zobaczymy w PHP6.</p>
<p>Napisy w obu językach są niezmienne, czyli wywołanie funkcji (PHP) lub metody (Python) zmieniającej wielkość liter zwraca nowy ciąg znaków bez modyfikacji oryginalnego.</p>
<p>Kolekcje w Pythonie również wydają się trudne do zrozumienia, ale to tylko pierwsze wrażenie. Listy, krotki i ciągi znaków są sekwencjami. Wszystkie udostępniają iterowanie lub dostęp poprzez indeks. Lista to tablica o zmiennej liczbie elementów, które można dodawać, modyfikować i usuwać. Wspomniane operacje są niedostępne dla krotek o stałej liczbie elementów.</p>
<p>Kolekcje nieuporządkowane to słowniki i zbiory. Prościej mówiąc, słownik w Pythonie to tablica asocjacyjna w PHP. Kluczami słownika nie mogą być elementy zmienne, czyli listy lub zbiory zmienne. Mogą zaś krotki i zbiory niezmienne, o ile zawierają wyłącznie elementy niezmienne. Dzięki temu kolekcje są bardzo wydajne podczas operacji przeszukiwania, sortowania, itp.</p>
<p>Pozostałe standardowe typy nie budzą wątpliwości, nawet <code>None</code> zostanie prawdopodobnie właściwie zinterpretowany przez początkującego programistę.</p>
<h3>Rzutowanie</h3>
<p>Zarówno PHP jak i Python są językami o dynamicznym typowaniu zmiennych. Moim zdaniem PHP podchodzi do kwestii automatycznego rzutowania bardziej liberalnie i często udostępnia zadziwiające wyniki operacji dodawania lub konkatenacji dla zmiennych różnego typu. Na przykład łączenie ciągów znaków i liczby może dać <code>"0"</code>, w określonym przypadku. Przy dodawaniu tych samych zmiennych można otrzymać liczbę <code>0</code> lub inną.</p>
<pre><code>$liczba = 0;
$wyraz = "";

$laczenie = $liczba . $wyraz;
$dodawanie = $liczba + $wyraz;

var_dump($laczenie);
var_dump($dodawanie);</code></pre>
<p>Operator łączenia, czyli <code>.</code> próbuje uzyskać ze zmiennej innego typu ciąg znakowy i wykonuje określoną operację.</p>
<pre><code>string(1) "0"
int(0)</code></pre>
<p>Analogicznie wygląda sytuacja z dodawaniem liczb, gdzie dany ciąg znakowy jest konwertowany do liczby, a przynajmniej następuje próba. Przykładowo takie dwie zmienne dają zaskakujące dla nieświadomej tego osoby wyniki w środowisku PHP.</p>
<pre><code>$liczba = 12;
$wyraz = "8aaa";

string(6) "128aaa"
int(20)</code></pre>
<p>Właśnie o tę próbę chodzi, bo nie zawsze pożądana jest konwersja, jeśli w ogóle możliwa.</p>
<pre><code>$liczba = 12;
$wyraz = "aaa8";

string(6) "12aaa8"
int(12)</code></pre>
<p>Python zwyczajnie w świecie nie pozwala na operacje między zmiennymi różnego typu.</p>
<pre><code>liczba = 0
wyraz = ""
liczba + wyraz
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'</code></pre>
<p>Aby taka operacja powiodła się konieczne jest jawne rzutowanie jednego z typów, w tym przypadku ciągu znaków.</p>
<pre><code>liczba + int(wyraz)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: ''</code></pre>
<p>Co dalej nie musi dać pożądanego wyniku, bo jak niby dodać <code>0</code> i <code>""</code>? Wprawdzie zakładamy, że pusty ciąg znaków to liczbowe zero, ale Python takich założeń nie robi i to mi się właśnie w nim podoba.</p>
<pre><code>wyraz = "1"
liczba + int(wyraz)
1</code></pre>
<p>W Pythonie istnieje automatyczne rzutowanie dla typów numerycznych, co pozwala na operacje pomiędzy liczbą całkowitą i zmiennoprzecinkową, ale już sama liczba nie jest prawidłową wartością dla operacji łączenia ciągów znaków.</p>
<p>Kwestie niejawnego rzutowania zmiennych w PHP ujawniają się również w przypadku operacji warunkowych, gdzie takie zmienne mogą zupełnie nieoczekiwanie zwracają prawdę lub fałsz.</p>
<h3>Zmienna liczba argumentów funkcji</h3>
<p>Python pozwala na tworzenie funkcji ze zmienną liczbą argumentów. Dopuszcza także przekazywanie argumentów o wartościach domyślnych i argumentów nazwanych. Jeśli wydaje się to skomplikowane to najłatwiej przeanalizuj poniższy przykład.</p>
<pre><code>def moje_argumenty(x, y, *args, **kwargs):
    print "Argumenty:"
    print "x=%s, y=%s" % (x, y)
    print "Argumenty pozycyjne:"
    for a in args:
        print a,
    print
    print "Argumenty nazwane:"
    for k in kwargs:
        print "%s=%s" % (k, kwargs[k]),
    print</code></pre>
<p>Zdefiniowana funkcja drukuje na ekran argument jakie zostały przesłane podczas wywołania. Wywołanie funkcji <code>moje_argumenty('abc', 123, 456, 'def', k=789, m='ghi')</code> da następujący rezultat:</p>
<pre><code>Argumenty:
x=abc, y=123
Argumenty pozycyjne:
456 def
Argumenty nazwane:
k=789 m=ghi</code></pre>
<p>PHP mimo swoich wszystkich zalet jest w tej kwestii ograniczone. Prezentowana poniżej definicja umożliwia ustawienie wartości domyślnych argumentów.</p>
<pre><code>def moje_argumenty($x, $y, $z='xyz'):
    print "Argumenty:";
    print "x=$x, y=$y, z=$z";</code></pre>
<p>Podczas wywołania funkcji <code>moje_argumenty</code> istnieje kilka możliwości zachowania się PHP, w zależności od liczby argumentów.</p>
<pre><code>moje_argumenty('abc', 123);
moje_argumenty('abc', 123, 'aaa');
moje_argumenty('abc', 123, 456, 789);
moje_argumenty('abc');</code></pre>
<p>Na początku do funkcji trafia 2 argumenty, ale dostępny jest również trzeci o wartości <code>'xyz'</code>, domyślnie określony w definicji funkcji. W drugim przypadku trzeci argument został przekazany, zatem jego domyślna wartość z definicji funkcji nie obowiązuje. Trzeci przypadek jest podobny, mimo przekazania większe ilości argumentów niż określono w sygnaturze. Jedynym błędnym wariantem jest zbyt mała liczba argumentów, czyli wywołanie czwarte, choć z taką sytuacją nie poradzi sobie także Python.</p>
<pre><code>PHP Warning:  Missing argument 2 for moje_argumenty(), called in ...

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argumenty_funkcji() takes at least 2 arguments (1 given)</code></pre>
<p>Całkowicie zrozumiała jest sytuacja powodująca błąd, gdy jawnie określa się argument funkcji, a potem nie ustawia przy wywołaniu.</p>
<h3>Wcięcia</h3>
<p>Bloki instrukcji w PHP, podobnie jak w innych klasycznych językach oznacza się poprzez <code>{</code> i <code>}</code>, czyli nawiasy klamrowe. Dobrą praktyką programistyczną jest również używanie wcięć do zaznaczenia hierarchii kodu. Python nie używa ani nawiasów klamrowych, ani innych słów kluczowych do oznaczenia bloków, a jedynie wcięć.</p>
<p>Przykład funkcji w PHP, która oblicza silnię:</p>
<pre><code>function silnia($x) {
    if ($x == 0) {
        return 1;
    } else {
        return $x * silnia($x-1);
    }
}</code></pre>
<p>To samo w Pythonie:</p>
<pre><code>def silnia(x) {
    if x == 0:
        return 1;
    else:
        return x * silnia(x-1);</code></pre>
<p>Przykład kodu PHP zadziała nawet bez nawiasów w instrukcji warunkowej, bo wykonywana jest jedna instrukcja. Jednak w przypadku Pythona ilość instrukcji nie ma znaczenia bo samo wcięcie oznacza blok. Nie zaprzeczam, że bardzo mi się to podoba.</p>
<h3>Programowanie funkcyjne</h3>
<p>Bardzo częstymi operacjami podczas programowania są różne manipulacje dla tablic. Python wspiera programowanie funkcyjne, takie jak w Haskellu, co znacznie ułatwia obróbkę kolekcji. Przykładowo chcesz uzyskać kwadraty danych liczb, co w PHP wymaga pętli po zdefiniowane tablicy:</p>
<pre><code>$liczby = array(1, 2, 3, 4, 5);
foreach ($liczby as $n) {
    $kwadraty[] = $n*$n;
}</code></pre>
<p>Analogiczny problem w Pythonie rozwiąże jedna linijka, z definicją liczb to dwie:</p>
<pre><code>liczby = [1, 2, 3, 4, 5]
kwadraty = [n**2 for n in liczby]</code></pre>
<p>Gdyby konieczne było wykonanie dwóch przebiegów pętli po indeksach różnych tabel to powyższy zapis jest nieoceniony. Pomijam sam operator, bo <code>n**2</code> jest równoznaczne <code>n*n</code>.</p>
<h3>Generatory</h3>
<p>Wcześniejszy przykład z definiowaniem tablicy liczb jest jak najbardziej odpowiedni. Wprawdzie PHP ma dostępną funkcję <code>range()</code>, ale to nie wszystko, jeśli chodzi o generatory. Uzyskanie takiej tablicy w PHP jest proste:</p>
<pre><code>$liczby = range(1, 5);</>

print_r($liczby);</code></pre>
<pre><code>Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)</code></pre>
<p>Możliwe jest uzyskanie wartości z danego zakresu, z uwzględnieniem odpowiedniego kroku. Na przykład <code>range(1, 5, 2)</code>.</p>
<pre><code>Array
(
    [0] => 1
    [1] => 3
    [2] => 5
)</code></pre>
<p>Co więcej, PHP wygeneruje tablice liter i liczb (w tym ujemnych), w rosnącym lub malejącym porządku. Wydaje mi się w tej chwili, że ten aspekt w PHP jest lepiej przygotowany.</p>
<p>Python potrafi wprawdzie wygenerować taką samą tablicę poprzez rozwinięcia list lub samą funkcję <code>range()</code>, ale to chyba kwalifikuje się do punktu powyżej. </p>
<pre><code>[x + 1 for x in range(5)]
[1, 2, 3, 4, 5]

range(1,6)
[1, 2, 3, 4, 5]</code></pre>
<p>Dodatkowo od Pythona 2.4 pojawiły się wyrażenia generatorowe, które stosują mechanizm leniwej ewaluacji (ang. <em>lazy evaluation</em>). W przypadku generowania dużej struktury danych zawierającej od razu wszystkie obiekty, wyrażenie generatorowe działa na pojedynczym obiekcie, dzięki czemu oszczędza pamięć. Python 3 uznaje rozwinięcia list jako konstrukcje przestarzałe.</p>
<h3>Operatory logiczne</h3>
<p>W Pythonie kilkanaście elementów traktuje się jako fałsz. Między innymi liczby zero: <code>0</code>, <code>0.0</code>, <code>0</code>, <code>False</code>, <code>None</code>, puste napisy i kolekcje. Obiekty posiadające metodę <code>__nonzero__()</code> w Pythonie 2, jeśli zwraca <code>False</code> lub <code>0</code>, a także obiekty posiadające metodę <code>__bool__()</code>, jeśli zwraca <code>False</code> są logicznym fałszem. Wszystko inne jest prawdą.</p>
<p>Wartości zwracane przez operatory porównania, operator zawierania i negacji są reprezentowane przez <code>True</code> i <code>False</code>. Dodatkowo Python umożliwia łączenie operatorów porównania, które interpretuje się wówczas jak zapis matematyczny.</p>
<h3>Wyjątki</h3>
<p>Python bardzo intensywnie korzysta z wyjątków jako metody wykrywania błędów. Dodatkowo sugerowana jest metoda &#8220;osiągania celu&#8221; niż &#8220;zapobiegania błędu&#8221;. Według ten koncepcji najpierw następuje próba osiągnięcia celu, a jeśli zwróci błąd, obsłużenia tej sytuacji. Inaczej niż w PHP, które raczej sprawdza czy nie wystąpi błąd, zanim cokolwiek zrobi.</p>
<h3>Podsumowanie</h3>
<p>Podoba mi się <em>tryb interaktywny</em> Pythona, w którym od razu otrzymuje wynik mojego kodu. Kocham wykrojenia sekwencji, jak również metody dla określonych typów danych. Wiele efektów w Pythonie osiąga się bardzo łatwym sposobem i tanim kosztem, jak chociażby operacje na drzewie katalogów. Sposób dołączania kolejnych modułów czy całych pakietów jest intuicyjny. Praca z ciągami znaków, które są sekwencjami jest naprawdę przyjemna. Dodatkowo istnieje dobra dokumentacja i życzliwa społeczność tego języka.</p>
<p>Wiem, że Python wspiera jeszcze inne rzeczy, o których nie wspomniałem, między innymi testy jednostkowe, ale to temat na kolejny wpis. Jeśli myślisz o nowym języku programowania, a zajmujesz się aplikacjami internetowymi lub administrowaniem serwerami to może akurat Python.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2011/09/28/php-i-python-porownanie/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

