<?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 &#187; PHP</title>
	<atom:link href="http://adamczuk.net.pl/tag/php/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>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>
		<item>
		<title>Programista PHP &#8211; Kraków</title>
		<link>http://adamczuk.net.pl/2010/12/01/programista-php-krakow/</link>
		<comments>http://adamczuk.net.pl/2010/12/01/programista-php-krakow/#comments</comments>
		<pubDate>Wed, 01 Dec 2010 10:36:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Przemyślenia]]></category>
		<category><![CDATA[interia]]></category>
		<category><![CDATA[kei]]></category>
		<category><![CDATA[krakow]]></category>
		<category><![CDATA[lab2]]></category>
		<category><![CDATA[onet]]></category>
		<category><![CDATA[opcom]]></category>
		<category><![CDATA[praca]]></category>
		<category><![CDATA[programista]]></category>
		<category><![CDATA[veneo]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=437</guid>
		<description><![CDATA[Osobiste przemyślenia na temat pracy programisty PHP w Krakowie.]]></description>
			<content:encoded><![CDATA[<p>Praca programisty to najczęstsze, moim zdaniem, stanowisko ludzi związanych z branżą IT. Pomijam ludzi, którzy wymieniają dusze w drukarkach oraz instalują sterowniki, bo informatycy to inna grupa zawodowa. Są jeszcze konsultanci, kierownicy projektów, inżynierowie oprogramowania i dyrektorzy, a tych jest zdecydowanie mniej. Czym w takim razie zajmuje się programista? Najczęściej i najpewniej zajmuje się tworzeniem stron lub aplikacji internetowych jako programista PHP.<br />
<span id="more-437"></span><br />
Praca programisty to jeden z etapów ścieżki rozwoju ludzi branży IT. Wszystko zależy tylko jak długo ten etap będzie trwał. Jeśli programista jest ambitny, szybko się uczy i umiejętnie wykorzystuje swoje atuty to w ciągu kilku lat awansuje. Ale w jakich firmach najlepiej zdobyć doświadczenie i umiejętności?</p>
<p>Na podstawie regularnych ogłoszeń przesyłanych mi przez serwis <a href="http://www.infopraca.pl/">infopraca</a> wnioskuję, że krakowski rynek firm zatrudniających programistów PHP jest stabilny. Nie powstaje, ani nie upada wiele firm, a jeśli tak się dzieje to są to małe, kilku lub kilkunastoosobowe firmy. Dostępne ogłoszenia przeważnie, zawierają spore wymagania, przy zupełnie średnim wynagrodzeniu. Pracodawcy rzadko oferują umową o pracę lub inny rodzaj umowy, często szukając praktykantów lub stażystów. Gdzie w takim razie, najlepiej aplikować, aby w zdobyć cenne doświadczenie.</p>
<h3>Oferty pracy</h3>
<p>Krakowskie e-Centrum Informatyczne, bardziej znane jako <a href="http://kei.pl/">Kei</a> to firma, która jest jednym z wiodących rejestratorów domen oraz dostawców usług hostingowych w Polsce. Na podstawie osobistych doświadczeń stwierdzam, że praca w tej firmie dostarcza wiele satysfakcji. Oprócz podstawowych wymagań dotyczących XHTML, CSS oraz JavaScript, programiści PHP nieustannie zmagają się z problemami wydajności, optymalizacji i utrzymywania oprogramowania. Firma gwarantuje stosowanie nowoczesnych technologii i dostęp do testowania aplikacji w warunkach wysokiego obciążenia infrastruktury. Osobiście polecam.</p>
<p><a href="http://veneo.pl/">Veneo</a> to krakowska agencja interaktywna, która działa od 2004 roku. Firma specjalizuje się w tworzeniu serwisów internetowych. Na podstawie włąsnych doświadczeń, wiem, że Veneo stosuje zarówno, efektywne metody programowania, jak i nowoczesne technologie internetowe. Jako dowód polecam sprawdzenie projektów z portfolio firmy. Gdyby tworzyli słabe projekty, nie zatrudniały by ich wiodące firmy. Veneo z pewnością umożliwi rozwój programisty PHP, jeśli tylko znajdzie się wolny wakat.</p>
<p>Ostatnia firma godna polecenia to <a href="http://lab2.pl/">Lab2</a>. Jestem pewny, że ludzie, którzy pracują w tej firmie to prawdziwi profesjonaliści. Nowoczesne zarządzanie i innowacyjne podejście zapewnia firmie cennych klientów. Moje osobiste doświadczenia przekonują mnie, że osoba, która trafi do Lab2 szybko zyska praktyczne umiejętności i doświadczenie.</p>
<h3>Podsumowanie</h3>
<p>Wiele osób powie, że nie zna tych firm albo wcale nie uważa ich za rozwojowe i warte uwagi. Jednak jeszcze raz zaznaczam, że to moje osobiste, pewnie subiektywne zdanie. Dlaczego nie polecam gigantów pokroju <a href="http://onet.pl">Onetu</a>, <a href="http://interia.pl">Interii</a> lub chociaż agencji <a href="http://opcom.pl/">Opcom</a>. Najprościej mówiąc, rzadko otrzymuję ogłoszenia o poszukiwaniu pracowników przez wymienione firmy. Każdy pracownik Onetu czy Interii potwierdzi, że wiele się tam nauczył i jest usatysfakcjonowany. Jednak nie każdemu odpowiada korporacyjny moloch i biurokratyczne procedury.</p>
<p>Pozostałe firmy zbyt często zmieniają pracowników, bo nie wierzę w ciągu 2 lat kilku czy kilkunastoosobowa firma wymienia cały zespół programistów. Programista PHP, jak każdy inny pracownik pragnie jedynie stabilnej pracy i godnego wynagrodzenia. Jeśli dana firma często poszukuje nowych pracowników to albo rozwija się bardzo błyskawicznie albo, bardziej prawdopodobnie nie dba o swoich pracowników.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2010/12/01/programista-php-krakow/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Smarty 3.0</title>
		<link>http://adamczuk.net.pl/2010/11/15/smarty-3-0/</link>
		<comments>http://adamczuk.net.pl/2010/11/15/smarty-3-0/#comments</comments>
		<pubDate>Mon, 15 Nov 2010 07:40:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[smarty]]></category>
		<category><![CDATA[templates]]></category>
		<category><![CDATA[tpl]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=423</guid>
		<description><![CDATA[Informacja o wydaniu nowej wersji Smarty.]]></description>
			<content:encoded><![CDATA[<p><a href="http://adamczuk.net.pl/wp-content/uploads/2010/11/smarty.jpg"><img src="http://adamczuk.net.pl/wp-content/uploads/2010/11/smarty.jpg" alt="" title="smarty" width="200" height="100" class="align left size-full wp-image-424" /></a>Nareszcie po wielu miesiącach oczekiwań pojawiła się nowa wersja najpopularniejszego systemu szablonów dla PHP, a mianowicie <a href="http://www.smarty.net/">Smarty</a>. Minie trochę czasu zanim dokładnie przetestuję nowe możliwości i sprawdzę wydajność szablonów w praktycznych projektach. W przyszłości przygotuję porównanie znanych systemów szablonów dla PHP, jak choćby <a href="http://phptal.org/">PHPTal</a> czy <a href="http://www.twig-project.org/">Twig</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2010/11/15/smarty-3-0/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nie przepisuj aplikacji</title>
		<link>http://adamczuk.net.pl/2010/11/14/nie-przepisuj-aplikacji/</link>
		<comments>http://adamczuk.net.pl/2010/11/14/nie-przepisuj-aplikacji/#comments</comments>
		<pubDate>Sun, 14 Nov 2010 16:35:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Przemyślenia]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[apps]]></category>
		<category><![CDATA[niew]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[project]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=415</guid>
		<description><![CDATA[Osobiste przemyślenia na temat tworzenia i przepisywania aplikacji.]]></description>
			<content:encoded><![CDATA[<p>Podstawowa wada programistów to błędne przeświadczenie, że szybko i lepiej napiszą nową wersję działającej aplikacji. Jak mylne może być takie rozumowanie przeczytamy chociażby w <a href="http://www.devblogi.pl/2010/07/rzeczy-ktorych-nigdy-nie-powinienes.html">tłumaczeniu</a> zagranicznego artykułu, który napisał <a href="http://joelonsoftware.com/AboutMe.html">Joel Spolsky</a>. Dalsza część wpisu to moje własne przemyślenia na temat tworzenia oprogramowania.<br />
<span id="more-415"></span><br />
Z własnego doświadczenia wiem jak silna dla programisty jest motywacja do rozpoczęcia nowego projektu. Nowe plany stworzenia czegoś oryginalnego, lepszego, innowacyjnego, wydajniejszego, ładniejszego. Jak zwodnicze potrafi być nasze myślenie kiedy po krótkim czasie płomienny zapał wygasa, a miejsce podniecenia zajmuje stopniowe rozczarowanie i przygnębienie. Programista sądzi, że napisze dany kod w określonym czasie. Szybko przekonamy się, że tak nie będzie po czasie jaki przydziela kierownik projektu. Dlatego, praktycznie zawsze przepisanie aplikacji od zera kończy się porażką. Przewidywany czas pracy programisty mnożymy dwukrotnie, a ten czas kierownik projektu ponownie podwaja. Dopiero taki okres bywa rzeczywistym czasem tworzenia danego projektu. Twierdzę tak na podstawie własnych doświadczeń, choć w różnych firmach bywają inne przeliczniki. Oczywiście nie ma tutaj żadnych wyników ankiet, ani badań, ale każdy w głębie serca, może sam zadać sobie pytanie.</p>
<p><quote>Czy warto przepisać dany produkt od zera?</quote></p>
<p>Pytanie to jest bardzo skomplikowane, bo istnieje wiele powodów, które skłaniają programistów do próby przepisania oprogramowania. Jednak zmieniony interfejs użytkownika, funkcjonalności aplikacji czy poprawa wydajności nie zawsze są warte przepisywania oprogramowania. Czas i zasoby poświęcone na tworzenie nowej wersji, zwykle przerastają wstępnie zaplanowane, co jeszcze bardziej pogłębia frustrację zespołu. A odpowiedź jest bardzo prosta &#8211; jaki jest sens w przepisywaniu czegoś co działa. Może nie wygląda pięknie od strony wizualnej, może wewnątrz kodu kryją się absurdalne rozwiązania programistyczne, ale przecież to działa. Wielu ludzi poświęciło swój czas, testowało, pisało poprawki, aby to oprogramowanie działało, a próba przepisania wszystkiego od nowa to najprawdopodobniej, przekreślenie ich trudu i wpędzenie siebie w wielkie bagno. Ponownie napotkamy problemy, które rozwiązywali nasi poprzednicy.</p>
<p>Zupełnie podobnie wygląda sytuacja, w której rozpoczynamy prace nad istniejącym projektem. Nie możemy wyzerować konta, poprzez nowe plany, rozwiązania i koncepcje. Musimy wspierać przestarzały, nieaktualny kod, dźwigać na plecach ciężar poprzednich wersji oprogramowania, kompatybilności oraz błędów swoich poprzedników. Tutaj również pojawia się przytoczone wyżej pytanie.</p>
<p><quote>Czy warto przepisać dany produkt od zera?</quote></p>
<p>W wielu przypadkach to indywidualna decyzja, ale przeważnie odpowiedz jest jedna &#8211; nie warto. Może efekt będzie zadowalający, oprogramowanie wydajniejsze, a kod klarowny. Jednak czas i zasoby wykorzystane przy danym projekcie, można przenieść na zupełnie nowy, niezależny produkt.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2010/11/14/nie-przepisuj-aplikacji/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>myBlog &#8211; prosta platforma blogowa</title>
		<link>http://adamczuk.net.pl/2010/07/20/myblog-prosta-platforma-blogowa/</link>
		<comments>http://adamczuk.net.pl/2010/07/20/myblog-prosta-platforma-blogowa/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 16:21:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Java Script]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projekty]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[js]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=328</guid>
		<description><![CDATA[Nieoficjalne przedstawienie prostej, autorskiej platformy blogowej.]]></description>
			<content:encoded><![CDATA[<p>Istnieje wiele platform blogowych. Część z nich to niezależne silniki jak <a href="http://wordpress.org/">WordPress</a>, czy <a href="http://www.movabletype.org/">MovableType</a>, a inne to produkty zintegrowane z konkretnymi serwisami, jak <a href="http://www.blogger.com/">Blogger</a> czy <a href="http://www.tumblr.com/">Tumblr</a>. Istnieje również wiele polskich serwisów, które pozwalają na szybkie stworzenie dziennika internetowego i bezstresowe blogowanie. Najpopularniejsze to <a href="http://jogger.pl/">Jogger</a> i <a href="http://www.blox.pl/">Blox</a>. Zdarza się, że powyższe rozwiązania nie spełniają naszych oczekiwań, co wówczas prowadzi do wyważania otwartych drzwi.<br />
<span id="more-328"></span></p>
<p>Tworzenie aplikacji internetowych to skomplikowany, czasochłonny i nie zawsze opłacalny proces.</p>
<p><quote>Dlaczego wielu programistów pisze własne aplikacje, frameworki, biblioteki i inne rozwiązania?</quote></p>
<p>Po prostu wychodzą z przekonania, że sami zrobią to lepiej. Czasami zdarza się, że dzięki temu podejściu rodzą się prawdziwe perełki. Często wielkie molochy tracą klientów, użytkownicy znajdują produkty skrojone na miarę ich potrzeb i każdy może być zadowolony.</p>
<p>Pozostałe przypadki to zmarnowany potencjał, czas i zasoby, bo projekt umiera, zanim rozpoczął żywot. Dopóki nie rozpoczniesz tworzenia nowej jakości nie będziesz, miał pewności co do swojej wartości.</p>
<h3>Właściwy wpis</h3>
<p>Często zastanawia mnie kształt moich wypowiedzi formułowanych w stanie, jak najbardziej trzeźwym. Jestem przecież człowiek technicznych, któremu nie obce powinno być prasowanie, ale już bogaty język podczas wszelkich wypowiedzi, co najmniej zadziwia.</p>
<p>Człowiek uczy się przez lata, choć nie zawsze ma na to czas i chęci. Najlepszym przykładem moich osiągnięć jest <a href="http://squarezone.pl/">SquareZone</a>. Prosty, ale funkcjonalny serwis, który przystępnie oferuje informacje użytkownikom. Tym razem przyszedł czas na nowy przykład.</p>
<p><strong>MyBlog</strong> &#8211; nazwa kodowa powinna być bardziej tajemnicza, ale projekt jest w zbyt wczesnym stadium, mimo wielomiesięcznej pracy przy jego tworzeniu. Otóż wspomniana aplikacja oferuje lub będzie oferowała w przyszłości funkcjonalności znane z popularnych systemów blogowych.</p>
<p>Architektura systemu po części czerpała ze znanego WordPressa, jednak największym atutem omawianej aplikacji jest wydajność i zgodność ze standardami. Wszystkie testy i szczegóły zostaną przedstawione wkrótce. Niedługo postaram się przedstawić kolejne funkcjonalności oraz założenia rozwojowe.</p>
<p>Obecnie nie mam pewności czy kod źródłowy zostanie udostępniony publicznie, jednak wszelkie opinie na temat działania lub architektury są mile widziane.</p>
<p>Wersja demonstracyjna <a href="http://demo.ladamczuk.kei.pl">myBlog</a>dostępna jest w sieci.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2010/07/20/myblog-prosta-platforma-blogowa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LAMP i WAMP</title>
		<link>http://adamczuk.net.pl/2010/02/08/lamp-i-wamp/</link>
		<comments>http://adamczuk.net.pl/2010/02/08/lamp-i-wamp/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 20:01:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[lamp]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[wamp]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=268</guid>
		<description><![CDATA[Krótki przegląd pakietów LAMP i WAMP.]]></description>
			<content:encoded><![CDATA[<p>Od razu zaznaczam, że nie będę przekonywał nikogo o wyższości jednego rozwiązania na drugim. Osoby znające te skróty zapewne znają ich pochodzenie i wiedzą do czego służą. Dalsza część artykułu przedstawia najpopularniejsze pakiety wolnego oprogramowania do obsługi witryn internetowych, sposoby instalacji i konfiguracji.<span id="more-268"></span></p>
<p>Podstawowe składniki takich platform to serwer Apache, baza danych MySQL oraz interpreter PHP, które przydają się podczas programowania i testowania aplikacji internetowych na lokalnym komputerze. Poszczególne elementy powstały niezależnie, ale razem tworzą znakomity zestaw, którego koszt jest niski w porównaniu z komercyjnymi rozwiązaniami.</p>
<p>Istnieje jeszcze kilka zalet takiego rozwiązania. Serwer lokalny jest darmowy, możliwa jest zmiana jego ustawień i działa nawet przy braku połączenia z internetem. Konta hostingowe często są płatne, ale nie zawsze. Tak samo jest z ustawieniami, które ze względów bezpieczeństwa często są niedostępne dla użytkowników. Ostatnim minusem jest połączenie z internetem, niezbędne dla dostępu do strony.</p>
<h3>LAMP</h3>
<p>W przypadku GNU/Linux sprawa jest bardzo prosta, ponieważ wymienione komponenty są dostępne dla większości dystrybucji. Mimo, tego zawsze możliwe jest ściągnięcie aktualnej wersji z internetu lub repozytorium. Najpewniej będą to poniższe polecenia.</p>
<pre><code>sudo apt-get install apache2</code></pre>
<pre><code>sudo apt-get install php5</code></pre>
<pre><code>sudo apt-get install mysql</code></pre>
<h3>WAMP</h3>
<p>W przypadku Windowsa istnieją paczki, które po instalacji pozwalają na korzystanie ze wszystkich elementów. Cały proces sprowadza się często do wyboru miejsca instalacji oprogramowania. Większość elementów zostanie od razu poprawnie skonfugurowana.</p>
<h4>Krasnal Serv</h4>
<p><a href="http://www.olesno.pl/~pablo/krasnal/">Krasnal Serv</a> to darmowe oprogramowanie, które umożliwia uruchomienie własnego serwera typu WAMP. Możliwe jest uruchomienie serwera WWW bez potrzeby konfigurowania Apache&#8217;a i innych elementów w systemie Microsoft Windows. Najnowsza wersja (2.7) pozwala na przełączanie się w locie między PHP4 i PHP5. Serwer działa niestabilnie w przypadku systemów Windows 9.x/ME.</p>
<p>Skład serwera w wersji 2.7 stanowi:</p>
<ul>
<li>Apache 1.3.31</li>
<li>PHP 4.3.9 + SQLite</li>
<li>PHP 5.0.2</li>
<li>MySQL 3.23.58</li>
<li>ActivePerl 5.6.1.628</li>
<li>phpMyAdmin 2.6.2 pl2</li>
<li>Zend Optimizer 2.0.3</li>
<li>CesarFTP 0.99g</li>
<li>Webalizer 2.1</li>
<li>Free SMTP Server</li>
<li>SQLiteManager 1.0.1</li>
</ul>
<h4>VertrigoServ</h4>
<p><a href="http://vertrigo.sourceforge.net/">VertrigoServ</a> to serwer, którego używałem przez długi czas. Poprzednio stosowałem KrasnalServ, który jednak zbyt wolno się rozwija, jeśli w ogóle. Składniki tego serwera są o wiele aktualniejsze.</p>
<p>Serwer w wersji 2.21 zawiera:</p>
<ul>
<li>Apache 2.0.63</li>
<li>PHP 5.2.6</li>
<li>MySQL 5.0.51b</li>
<li>SQLite 3.5.9</li>
<li>Smarty 2.6.19</li>
<li>PhpMyAdmin 2.11.7</li>
<li>ZendOptimizer 3.3.3</li>
<li>SQLiteManager 1.2.0</li>
</ul>
<h4>WampServer</h4>
<p><a href="http://www.wampserver.com/">WampServer 2</a> to darmowy pakiet typu WAMP. Umożliwia instalację, uruchamianie oraz obsługę w systemie MS Windows serwera WWW opartego na serwerze Apache, interpretera skryptów PHP oraz serwera baz danych MySQL.</p>
<p>WampServer 2 nazywany wcześniej WAMP5 jest platformą opartą na licencji GPL. Jej głównym twórcą jest Francuz Romain Bourdon, którego wspiera społeczność portalu <a href="http://www.phpteam.net/">phpteam.net</a>.</p>
<p>WampServer w wersji 2.0 zawiera:</p>
<ul>
<li>Apache 2.2.11</li>
<li>PHP 5.3.0</li>
<li>MySQL 5.1.36</li>
<li>PhpMyAdmin 3.2.01</li>
</ul>
<h4>XAMPP</h4>
<p><a href="http://www.apachefriends.org/en/xampp.html">XAMPP</a> jest darmowym wieloplatformowym pakietem opartym na licencji GNU General Public License. Składa się głównie z serwera Apache, bazy danych MySQL i interpreterów dla skryptów napisanych w PHP i Perlu. XAMPP działa między innymi na systemach MS Windows, Linux, Solaris i MacOS X.</p>
<h3>Podsumowanie</h3>
<p>Większość platform WAMP zawiera dodatkowe oprogramowanie przydatne podczas tworzenia i testowania aplikacji internetowych. Sam proces instalacji takiego oprogramowania jest łatwy. Pewne trudności zdarzają się przy konfiguracji niestandardowych opcji. Poza tym jest to idealne rozwiązanie na początku przygody z tworzeniem aplikacji internetowych.</p>
<p>Często spotykany PhpMyAdmin jest stosowany do zarządzania bazami danych. Nierzadko udostępniane są inne silniki baz danych, np. SQLite. Warto włączyć niektóre przydatne moduły serwera Apache, które domyślnie bywają wyłączone, jak choćby mod_rewrite, czy mod_userdir.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2010/02/08/lamp-i-wamp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wzorzec projektowy Fabryka abstrakcyjna</title>
		<link>http://adamczuk.net.pl/2010/02/04/wzorzec-projektowy-fabryka-abstrakcyjna/</link>
		<comments>http://adamczuk.net.pl/2010/02/04/wzorzec-projektowy-fabryka-abstrakcyjna/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 23:00:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wzorce projektowe]]></category>
		<category><![CDATA[design patern]]></category>
		<category><![CDATA[factory]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=263</guid>
		<description><![CDATA[Poprzedni wpis dotyczył wzorca projektowego Singleton, który jest niezbędny w przypadku pojedynczych obiektów tego samego typu. Obecny tekst porusza problem tworzenia różnych obiektów jednego typu (tej samej rodziny) bez specyfikowania ich konkretnych klas. Fabryka abstrakcyjna Plusem wykorzystania wzorca fabryki abstrakcyjnej jest możliwość ukrycia szczegółów implementacyjnych klas reprezentujących dany produkt. W ten sposób klient widzi tylko [...]]]></description>
			<content:encoded><![CDATA[<p>Poprzedni wpis dotyczył wzorca projektowego Singleton, który jest niezbędny w przypadku pojedynczych obiektów tego samego typu. Obecny tekst porusza problem tworzenia różnych obiektów jednego typu (tej samej rodziny) bez specyfikowania ich konkretnych klas.<span id="more-263"></span></p>
<h3>Fabryka abstrakcyjna</h3>
<p>Plusem wykorzystania wzorca fabryki abstrakcyjnej jest możliwość ukrycia szczegółów implementacyjnych klas reprezentujących dany produkt. W ten sposób klient widzi tylko interfejs. Ukryte zostają również nazwy klas, co odizolowuje klienta od problemu określenia, do której klasy należy obiekt.</p>
<pre><code>&lt;?php
interface IUser {
	function getName();
}

class User implements IUser {
	public function __construct($id) { }

	public function getName() {
		return 'Jacek';
	}
}

class UserFactory {
	public static function create($id) {
		return new User($id);
	}
}
?&gt;</code></pre>
<p>Klasa <code>User</code> zaprezentowana powyżej implementuje interfejs <code>IUser</code>, który zawiera metodę <code>getName()</code>. Tworzenie nowego obiektu użytkownika odbywa się poprzez statyczną metodę <code>create()</code>. Szczegóły tworzenia użytkowników ukryte są w klasie <code>User</code> fabryki.</p>
<h3>Podsumowanie</h3>
<p>Istnieje prosta metoda sprawdzenia czy klasa działa poprawnie.</p>
<pre><code>&lt;?php
$oUser = UserFactory::create(1);
echo($oUser->getName());
?&gt;</code></pre>
<p>Poniższy wydruk pokazuje, że dokładnie tak się dzieje.</p>
<pre><code>Jacek</code></pre>
<p>Wzorzec projektowy fabryki abstrakcyjnej kładzie nacisk na tworzenie produktów z konkretnej rodziny. </p>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2010/02/04/wzorzec-projektowy-fabryka-abstrakcyjna/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wzorzec projektowy Singleton</title>
		<link>http://adamczuk.net.pl/2010/01/30/wzorzec-projektowy-singleton/</link>
		<comments>http://adamczuk.net.pl/2010/01/30/wzorzec-projektowy-singleton/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 23:21:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wzorce projektowe]]></category>
		<category><![CDATA[design patern]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=250</guid>
		<description><![CDATA[Wzorzec projektowy Singleton. Wyjaśnienie idei oraz implemntacja w PHP.]]></description>
			<content:encoded><![CDATA[<p>Wzorce projektowe to ogólne rozwiązania częstych informatycznych problemów. Programowanie obiektowe w PHP5 różni się nie tylko składnią, ale również pewnymi brakami w porównaniu z innymi językami, typu C++ czy Java. Pomimo tego wzorce projektowe idealnie sprawdzają się w aplikacjach internetowych.<span id="more-250"></span></p>
<p>Częsta sytuacja, z jaką spotykają się programiści to współdzielenie zasobów. Wszystkie zapytania do bazy danych wymagają połączenia. Taki uchwyt może być wykorzystany wielokrotnie przez różne zapytania przy tym samym żądaniu. Otwieranie i zamykanie połączeń jest najzwyczajniej, mało ekonomiczne.</p>
<h3>Singleton</h3>
<p>Istnieje proste rozwiązanie tego problemu. Singleton to wzorzec projektowy, który zwraca istniejącą instancję obiektu. Jeśli taka instancja nie istnieje wówczas jest tworzona. Idea rozwiązania jest bardzo prosta i idealnie pasuje do naszego problemu. Poniżej znajduje się kod klasy <code>DB</code>, która dziedziczy z klasy <code>Singleton</code> i tworzy takie połączenie do bazy.</p>
<p>Prawidłowa struktura klas, co zasugerował <a href="http://adamczuk.net.pl/2010/01/30/wzorzec-projektowy-singleton/comment-page-1/#comment-5526">Wasacz</a> w komentarzach, wymaga dziedziczenia klasy <code>DB</code> po ogólnej klasie wzorca <code>Singleton</code>. Niestety nie mam pomysłu zogranizowanie klasy wzorca poza pustymi metodami i jedną zmienną.</p>
<pre><code>&lt;?php
abstract class Singleton {
	protected static $_instance;

	protected function __construct() { }

	public static function instance() { }
}

class DB extends Singleton {
	private $_conn;

	private function __construct($conf) {
		$this->_conn = mysql_connect($conf['host'], $conf['user'], $conf['pass']) or die($this->error());
	}

	public static function instance($conf=null) {
		if (is_null(self::$_instance)) {
			self::$_instance = new DB($conf);
		}
		return self::$_instance;
	}
}
?&gt;</code></pre>
<p>Klasa <code>DB</code> zaprezentowana powyżej nie jest skomplikowana. Zawiera jednak tylko niezbędne metody, prezentujące działanie klasy. Niemożliwe jest stworzenie egzemplarza klasy <code>DB</code>, ponieważ konstruktor jest prywatny. Dostęp do obiektu możliwy jest poprzez publiczną, statyczną metodę <code>instance()</code>.</p>
<h3>Podsumowanie</h3>
<p>Istnieje prosta metoda sprawdzenia czy klasa działa poprawnie. Próba pobrania obiektu klasy <code>DB</code> powinna zwrócić ten sam zasób.</p>
<pre><code>&lt;?php
print_r(DB::instance());
print_r(DB::instance());
?&gt;</code></pre>
<p>Poniższy wydruk pokazuje, że dokładnie tak się dzieje.</p>
<pre><code>DB Object
(
    [_conn:private] => Resource id #11
)
DB Object
(
    [_conn:private] => Resource id #11
)</code></pre>
<p>Wzorzec projektowy Singleton stosuje się bez względu na stopień skomplikowania aplikacji. Rozwiązanie to jest wygodniejsze i elastyczniejsze niż przechowywanie uchwytu do bazy danych w zmiennej globalnej.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2010/01/30/wzorzec-projektowy-singleton/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>PHP5. Zaawansowane programowanie</title>
		<link>http://adamczuk.net.pl/2009/03/30/php5-zaawansowane-programowanie/</link>
		<comments>http://adamczuk.net.pl/2009/03/30/php5-zaawansowane-programowanie/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 10:41:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Książki]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[helion]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[wrox]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=180</guid>
		<description><![CDATA[Zaawansowane programowanie w PHP5. Ciekawe techniki tworzenia aplikacji internetowych.]]></description>
			<content:encoded><![CDATA[<p><img src="http://adamczuk.net.pl/wp-content/uploads/2009/03/php_zp.jpg" alt="php_zp" title="PHP5 Zaawansowane programowanie" width="140" height="200" class="left" />Do tworzenia aplikacji internetowych można wykorzystać kilka technologii. Wszystkie one mają swoich zwolenników i tym sposobem Microsoft proponuje nam <acronym title="Active Server Pages">ASP</acronym>, a Sun swoje <acronym title="Java Sever Pages">JSP</acronym>. Jest jeszcze ColdFusion od Macromedii (teraz chyba Adobe), a moim wyborem od początku było i pozostaje <acronym title="Hypertext Preprocessor">PHP</acronym>. Zgadzam się ze PHP nie jest wolne od wad, ale w połączeniu z serwerem Apache i praktycznie dowolną bazą danych, jest potężną technologią, która pozwala tworzyć zaawansowane aplikacje internetowe.<br />
<span id="more-180"></span><br />
<strong>PHP</strong> pozwala na tworzenie aplikacji sieciowych, które są uruchamiane po stronie serwera. Najnowsza wersja PHP5 została wzbogacona o nowe mechanizmy programowania obiektowego. Teraz możliwe jest korzystanie z plików XML i protokołu SOAP, a także wieloma silnikami baz danych.</p>
<p><em>&#8220;PHP5. Zaawansowane programowanie&#8221;</em> to książka, która przedstawia potężne możliwości i elastyczność najnowszej wersji tej popularnej platformy programistycznej. Dzięki niej poznamy zasady programowania obiektowego, a także tworzenia użytecznych klas i funkcji. W książce przeczytamy również o modelowaniu w języku UML, a także korzystaniu z wzorców projektowych. Przeczytanie książki pozwoli na tworzenie zestawów narzędzi obiektowych oraz stosowanie modelu MVC. Dodatkowo książka opisuje analizę oraz implementację prawdziwego przypadku, a mianowicie systemu automatyzującego pracę działu sprzedaży w przedsiębiorstwie handlowym.</p>
<p>Książka jest przeznaczona dla zaawansowanych programistów. Jeśli chcesz poznać podstawy PHP lub tworzenia stron internetowych poszukaj innej książki. Jeśli chcesz poznać zaawansowane możliwości PHP5, a także właściwie rozbudować swoje aplikacje to sięgnij po tę książkę.</p>
<p class="info">OSTATECZNA OCENA: 4/5</p>
<ul>
<li><strong>Autorzy: Edward Lecky-Thompson, Heow Eide-Goodman, Steven D. Nowicki, Alec Cove</strong></li>
<li>Tytuł oryginału: Professional PHP5</li>
<li>Tłumaczenie: Adam Byrtek, Jarosław Dobrzański, Paweł Gonera</li>
<li>ISBN: 83-7361-825-2</li>
<li>Format: B5, stron: 664</li>
<li>Data wydania: 06/2005 (<a href="http://helion.pl">Helion</a>)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2009/03/30/php5-zaawansowane-programowanie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX i PHP. Tworzenie interaktywnych aplikacji internetowych</title>
		<link>http://adamczuk.net.pl/2009/03/26/ajax-i-php-tworzenie-interaktywnych-aplikacji-internetowych/</link>
		<comments>http://adamczuk.net.pl/2009/03/26/ajax-i-php-tworzenie-interaktywnych-aplikacji-internetowych/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 08:13:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Książki]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://adamczuk.net.pl/?p=164</guid>
		<description><![CDATA[Recenzja książki. Podstawy AJAX i PHP w prostej formie i łatwej treści.]]></description>
			<content:encoded><![CDATA[<p><img src="http://adamczuk.net.pl/wp-content/uploads/2009/03/book-ajaphp.jpg" alt="book-ajaphp" title="AJAX i PHP.Tworzenie interaktywnych aplikacji internetowych" width="140" height="200" class="left" />Współczesne aplikacje internetowe stają się coraz bardziej interaktywne. Interfejsy użytkowników pozwalają na działanie stron bez przeładowywania. Nowoczesne technologie takie jak <acronym title="Asynchronous JavaScript And XML">AJAX</acronym> pozwalają osiągnąć efekty znane dotychczas tylko z aplikacji biurowych. Technologia ta jest szeroko wykorzystywana przez wiele serwisów (np. Google).<br />
<span id="more-164"></span></p>
<p><strong>AJAX</strong> jest technologią, która pozwala na asynchroniczne łączenie się z serwerem poprzez obiekt XMLHttpRequest.  W czasie takiego połączenia dane mogą być pobierane lub zapisywane na serwerze, a sama strona nie jest przeładowywana jak w tradycyjnym modelu żądania. Aplikacje oparte o powyższy schemat dokonują aktualizacji w interfejsie użytkownika o wiele szybciej. AJAX korzysta z obiektowego modelu dokumentu (DOM) i JavaScript.</p>
<p>Książka zawiera 10 projektów omawiających szczegółowo możliwości technologii AJAX. Dzięki niej możemy nauczyć się weryfikowania danych w formularzach lub tworzenia podpowiedzi podczas wyszukiwania. Inne ciekawe projekty zrealizowane w książce to chat, czytnik, tabela z sortowaniem wierszy oraz tworzenie grafiki SVG. Autorzy w sposób przejrzysty i rzeczowy objaśniają kolejne przykłady. Zarówno kod tworzony w JS, jak i w PHP czy CSS jest opisywany z dodatkowym naciskiem na problemowe kwestie. Na końcu przedstawione są propozycje rozszerzenia, omawianego przykładu o następne funkcjonalności.</p>
<p>Przedstawione projekty może nie porażają swoim rozmachem, ale pokazują główne zalety i wady AJAX. Tworzenie interaktywnych aplikacji internetowych może być naprawdę łatwe i przyjemne, jeśli tylko dokładnie prześledzimy omówione przykłady. Książka wydana przez <a href="http://helion.pl">Helion</a> jest przeznaczona dla programistów, rozpoczynających swoje kodowanie w AJAX.</p>
<p class="info">OSTATECZNA OCENA: 3/5</p>
<ul>
<li><strong>Autorzy: Cristian Darie, Bogdan Brinzarea, Filip Chereches-Tosa, Mihai Bucica</strong></li>
<li>Tytuł oryginału: Ajax and PHP: Building Responsive Web Applications</li>
<li>Tłumaczenie: Julia Malinowska</li>
<li>ISBN: 83-246-0644-0</li>
<li>Format: B5, stron: 328</li>
<li>Data wydania: 11/2006 (<a href="http://helion.pl">Helion</a>)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://adamczuk.net.pl/2009/03/26/ajax-i-php-tworzenie-interaktywnych-aplikacji-internetowych/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

